diff --git a/.circleci/config.yml b/.circleci/config.yml index 635f60c90441..0e3153a7a8ed 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -7,7 +7,7 @@ defaults: &defaults working_directory: ~/build docker: # specify the version you desire here - - image: circleci/ruby:2.7.2-node-browsers + - image: circleci/ruby:2.7.3-node-browsers # Specify service dependencies here if necessary # CircleCI maintains a library of pre-built images diff --git a/.codeclimate.yml b/.codeclimate.yml index bc58a4029a44..ac38c27bb622 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -30,6 +30,5 @@ exclude_patterns: - "**/*.md" - "**/*.yml" - "app/javascript/dashboard/i18n/locale" - - "stories/**/*" - "**/*.stories.js" - - "**/stories/" + - "stories/" diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index b1bef7b28055..e3eb2fd01206 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,51 +1,8 @@ -# pre-build stage -ARG VARIANT=2.7 -FROM mcr.microsoft.com/vscode/devcontainers/ruby:${VARIANT} - -# Update args in docker-compose.yaml to set the UID/GID of the "vscode" user. -ARG USER_UID=1000 -ARG USER_GID=$USER_UID -RUN if [ "$USER_GID" != "1000" ] || [ "$USER_UID" != "1000" ]; then \ - groupmod --gid $USER_GID vscode \ - && usermod --uid $USER_UID --gid $USER_GID vscode \ - && chmod -R $USER_UID:$USER_GID /home/vscode; \ - fi - -# [Option] Install Node.js -ARG INSTALL_NODE="true" -ARG NODE_VERSION="lts/*" -RUN if [ "${INSTALL_NODE}" = "true" ]; then su vscode -c "source /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"; fi - - -# tmux is for overmind -# TODO : install foreman in future -# packages: postgresql-server-dev-all -# may be postgres in same machine - -RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ - && apt-get -y install --no-install-recommends \ - libssl-dev \ - tar \ - tzdata \ - postgresql-client \ - yarn \ - git \ - imagemagick \ - tmux \ - zsh - -# [Optional] Uncomment this line to install global node packages. -# RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && npm install -g " 2>&1 - +# The below image is created out of the Dockerfile.base +# It has the dependencies already installed so that codespace will boot up fast +FROM ghcr.io/chatwoot/chatwoot_codespace:latest # Do the set up required for chatwoot app WORKDIR /workspace COPY . /workspace - -# TODO: figure out installing rvm -# RUN rvm install -COPY Gemfile Gemfile.lock ./ -RUN gem install bundler -RUN bundle install -COPY package.json yarn.lock ./ -RUN yarn install +RUN yarn && gem install bundler && bundle install diff --git a/.devcontainer/Dockerfile.base b/.devcontainer/Dockerfile.base new file mode 100644 index 000000000000..dcbbd27ca75d --- /dev/null +++ b/.devcontainer/Dockerfile.base @@ -0,0 +1,45 @@ +# pre-build stage +ARG VARIANT=2.7 +FROM mcr.microsoft.com/vscode/devcontainers/ruby:${VARIANT} + +# Update args in docker-compose.yaml to set the UID/GID of the "vscode" user. +ARG USER_UID=1000 +ARG USER_GID=$USER_UID +RUN if [ "$USER_GID" != "1000" ] || [ "$USER_UID" != "1000" ]; then \ + groupmod --gid $USER_GID vscode \ + && usermod --uid $USER_UID --gid $USER_GID vscode \ + && chmod -R $USER_UID:$USER_GID /home/vscode; \ + fi + +# [Option] Install Node.js +ARG INSTALL_NODE="true" +ARG NODE_VERSION="lts/*" +RUN if [ "${INSTALL_NODE}" = "true" ]; then su vscode -c "source /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"; fi + +RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ + && apt-get -y install --no-install-recommends \ + libssl-dev \ + tar \ + tzdata \ + postgresql-client \ + yarn \ + git \ + imagemagick \ + tmux \ + zsh + + +# Install overmind +RUN curl -L https://github.com/DarthSim/overmind/releases/download/v2.1.0/overmind-v2.1.0-linux-amd64.gz > overmind.gz \ + && gunzip overmind.gz \ + && sudo mv overmind /usr/local/bin \ + && chmod +x /usr/local/bin/overmind + +# Do the set up required for chatwoot app +WORKDIR /workspace +COPY . /workspace +RUN yarn + +COPY Gemfile Gemfile.lock ./ +RUN gem install bundler && bundle install + diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 5f878e5e0677..c0301d87b2ac 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -12,22 +12,28 @@ "extensions": [ "rebornix.Ruby", "misogi.ruby-rubocop", - "wingrunr21.vscode-ruby" + "wingrunr21.vscode-ruby", + "davidpallinder.rails-test-runner", + "eamodio.gitlens", + "github.copilot", + "mrmlnc.vscode-duplicate" ], - // TODO: figure whether we can get all this ports work properly - - // 3000 rails - // 3035 webpacker // 5432 postgres // 6379 redis // 1025,8025 mailhog - "forwardPorts": [5432, 6379, 1025, 8025], + "forwardPorts": [8025], //your application may need to listen on all interfaces (0.0.0.0) not just localhost for it to be available externally. Defaults to [] "appPort": [3000, 3035], - // Use 'postCreateCommand' to run commands after the container is created. - // #TODO: can we move logic of copy env file into dockerfile ? - "postCreateCommand": "cp .env.example .env", + "postCreateCommand": ".devcontainer/scripts/setup.sh && bundle exec rake db:chatwoot_prepare && yarn", + "portsAttributes": { + "3000": { + "label": "Rails Server" + }, + "8025": { + "label": "Mailhog UI" + } + }, } diff --git a/.devcontainer/scripts/setup.sh b/.devcontainer/scripts/setup.sh new file mode 100755 index 000000000000..1b5842603fdd --- /dev/null +++ b/.devcontainer/scripts/setup.sh @@ -0,0 +1,8 @@ +cp .env.example .env +sed -i -e '/REDIS_URL/ s/=.*/=redis:\/\/localhost:6379/' .env +sed -i -e '/POSTGRES_HOST/ s/=.*/=localhost/' .env +sed -i -e '/SMTP_ADDRESS/ s/=.*/=localhost/' .env +sed -i -e "/FRONTEND_URL/ s/=.*/=https:\/\/$CODESPACE_NAME-3000.githubpreview.dev/" .env +sed -i -e "/WEBPACKER_DEV_SERVER_PUBLIC/ s/=.*/=https:\/\/$CODESPACE_NAME-3035.githubpreview.dev/" .env +# uncomment the webpacker env variable +sed -i -e '/WEBPACKER_DEV_SERVER_PUBLIC/s/^# //' .env diff --git a/.env.example b/.env.example index 08e72816e02e..6dffe6b38560 100644 --- a/.env.example +++ b/.env.example @@ -155,3 +155,5 @@ USE_INBOX_AVATAR_FOR_BOT=true ## Development Only Config # if you want to use letter_opener for local emails # LETTER_OPENER=true +# meant to be used in github codespaces +# WEBPACKER_DEV_SERVER_PUBLIC= diff --git a/.github/workflows/publish_codespace_image.yml b/.github/workflows/publish_codespace_image.yml new file mode 100644 index 000000000000..d71787eb15ca --- /dev/null +++ b/.github/workflows/publish_codespace_image.yml @@ -0,0 +1,23 @@ +name: Publish Codespace Base Image + +on: + workflow_dispatch: + +jobs: + publish-code-space-image: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v1 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build the Codespace Base Image + run: | + docker build . -t ghcr.io/chatwoot/chatwoot_codespace:latest -f .devcontainer/Dockerfile.base + docker push ghcr.io/chatwoot/chatwoot_codespace:latest diff --git a/.ruby-version b/.ruby-version index 37c2961c2430..2c9b4ef42ecb 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.7.2 +2.7.3 diff --git a/.storybook/preview.js b/.storybook/preview.js index c62c3ef000bc..e0c27a1acf96 100644 --- a/.storybook/preview.js +++ b/.storybook/preview.js @@ -3,6 +3,7 @@ import Vue from 'vue'; import Vuex from 'vuex'; import VueI18n from 'vue-i18n'; import Vuelidate from 'vuelidate'; +import Multiselect from 'vue-multiselect'; import WootUiKit from '../app/javascript/dashboard/components'; import i18n from '../app/javascript/dashboard/i18n'; @@ -13,6 +14,7 @@ Vue.use(VueI18n); Vue.use(Vuelidate); Vue.use(WootUiKit); Vue.use(Vuex); +Vue.component('multiselect', Multiselect); const store = new Vuex.Store({}); const i18nConfig = new VueI18n({ diff --git a/Gemfile b/Gemfile index ae0938676d08..0f285c6fd8cc 100644 --- a/Gemfile +++ b/Gemfile @@ -1,6 +1,6 @@ source 'https://rubygems.org' -ruby '2.7.2' +ruby '2.7.3' ##-- base gems for rails --## gem 'rack-cors', require: 'rack/cors' @@ -53,6 +53,7 @@ gem 'activerecord-import' gem 'dotenv-rails' gem 'foreman' gem 'puma' +gem 'rack-timeout' gem 'webpacker', '~> 5.x' # metrics on heroku gem 'barnes' diff --git a/Gemfile.lock b/Gemfile.lock index 55d3dbd294b0..86d421fa75c8 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -75,7 +75,7 @@ GEM zeitwerk (~> 2.2, >= 2.2.2) acts-as-taggable-on (6.5.0) activerecord (>= 5.0, < 6.1) - addressable (2.7.0) + addressable (2.8.0) public_suffix (>= 2.0.2, < 5.0) administrate (0.16.0) actionpack (>= 5.0) @@ -384,6 +384,7 @@ GEM rack rack-test (1.1.0) rack (>= 1.0, < 3) + rack-timeout (0.6.0) rails (6.0.3.7) actioncable (= 6.0.3.7) actionmailbox (= 6.0.3.7) @@ -666,6 +667,7 @@ DEPENDENCIES puma pundit rack-cors + rack-timeout rails redis redis-namespace @@ -704,7 +706,7 @@ DEPENDENCIES wisper (= 2.0.0) RUBY VERSION - ruby 2.7.2p137 + ruby 2.7.3p183 BUNDLED WITH 2.1.4 diff --git a/app/actions/contact_merge_action.rb b/app/actions/contact_merge_action.rb index f2d9b6d06792..3a3ef11ed40a 100644 --- a/app/actions/contact_merge_action.rb +++ b/app/actions/contact_merge_action.rb @@ -2,6 +2,10 @@ class ContactMergeAction pattr_initialize [:account!, :base_contact!, :mergee_contact!] def perform + # This case happens when an agent updates a contact email in dashboard, + # while the contact also update his email via email collect box + return @base_contact if base_contact.id == mergee_contact.id + ActiveRecord::Base.transaction do validate_contacts merge_conversations diff --git a/app/builders/csat_surveys/response_builder.rb b/app/builders/csat_surveys/response_builder.rb new file mode 100644 index 000000000000..7c120ddb225c --- /dev/null +++ b/app/builders/csat_surveys/response_builder.rb @@ -0,0 +1,28 @@ +class CsatSurveys::ResponseBuilder + pattr_initialize [:message] + + def perform + raise 'Invalid Message' unless message.input_csat? + + conversation = message.conversation + rating = message.content_attributes.dig('submitted_values', 'csat_survey_response', 'rating') + feedback_message = message.content_attributes.dig('submitted_values', 'csat_survey_response', 'feedback_message') + + return if rating.blank? + + process_csat_response(conversation, rating, feedback_message) + end + + private + + def process_csat_response(conversation, rating, feedback_message) + csat_survey_response = message.csat_survey_response || CsatSurveyResponse.new( + message_id: message.id, account_id: message.account_id, conversation_id: message.conversation_id, + contact_id: conversation.contact_id, assigned_agent: conversation.assignee + ) + csat_survey_response.rating = rating + csat_survey_response.feedback_message = feedback_message + csat_survey_response.save! + csat_survey_response + end +end diff --git a/app/builders/v2/report_builder.rb b/app/builders/v2/report_builder.rb index 35f484f9586f..2a7a55a8a55d 100644 --- a/app/builders/v2/report_builder.rb +++ b/app/builders/v2/report_builder.rb @@ -1,4 +1,5 @@ class V2::ReportBuilder + include DateRangeHelper attr_reader :account, :params def initialize(account, params) @@ -83,10 +84,6 @@ def avg_resolution_time .average(:value) end - def range - parse_date_time(params[:since])..parse_date_time(params[:until]) - end - # Taking average of average is not too accurate # https://en.wikipedia.org/wiki/Simpson's_paradox # TODO: Will optimize this later @@ -101,11 +98,4 @@ def avg_first_response_time_summary (avg_first_response_time.values.sum / avg_first_response_time.values.length) end - - def parse_date_time(datetime) - return datetime if datetime.is_a?(DateTime) - return datetime.to_datetime if datetime.is_a?(Time) || datetime.is_a?(Date) - - DateTime.strptime(datetime, '%s') - end end diff --git a/app/controllers/api/v1/accounts/campaigns_controller.rb b/app/controllers/api/v1/accounts/campaigns_controller.rb index 5c58d3f51cf4..229127df68e5 100644 --- a/app/controllers/api/v1/accounts/campaigns_controller.rb +++ b/app/controllers/api/v1/accounts/campaigns_controller.rb @@ -28,6 +28,7 @@ def campaign end def campaign_params - params.require(:campaign).permit(:title, :description, :message, :enabled, :inbox_id, :sender_id, trigger_rules: {}) + params.require(:campaign).permit(:title, :description, :message, :enabled, :inbox_id, :sender_id, + :scheduled_at, audience: [:type, :id], trigger_rules: {}) end end diff --git a/app/controllers/api/v1/accounts/contacts_controller.rb b/app/controllers/api/v1/accounts/contacts_controller.rb index 46f6b83c78f2..6ffa15172f4a 100644 --- a/app/controllers/api/v1/accounts/contacts_controller.rb +++ b/app/controllers/api/v1/accounts/contacts_controller.rb @@ -7,7 +7,6 @@ class Api::V1::Accounts::ContactsController < Api::V1::Accounts::BaseController sort_on :last_activity_at, type: :datetime RESULTS_PER_PAGE = 15 - protect_from_forgery with: :null_session before_action :check_authorization before_action :set_current_page, only: [:index, :active, :search] @@ -15,7 +14,7 @@ class Api::V1::Accounts::ContactsController < Api::V1::Accounts::BaseController def index @contacts_count = resolved_contacts.count - @contacts = fetch_contact_last_seen_at(resolved_contacts) + @contacts = fetch_contacts_with_conversation_count(resolved_contacts) end def search @@ -26,7 +25,7 @@ def search search: "%#{params[:q]}%" ) @contacts_count = contacts.count - @contacts = fetch_contact_last_seen_at(contacts) + @contacts = fetch_contacts_with_conversation_count(contacts) end def import @@ -72,17 +71,22 @@ def update private + # TODO: Move this to a finder class def resolved_contacts - @resolved_contacts ||= Current.account.contacts - .where.not(email: [nil, '']) - .or(Current.account.contacts.where.not(phone_number: [nil, ''])) + return @resolved_contacts if @resolved_contacts + + @resolved_contacts = Current.account.contacts + .where.not(email: [nil, '']) + .or(Current.account.contacts.where.not(phone_number: [nil, ''])) + @resolved_contacts = @resolved_contacts.tagged_with(params[:labels], any: true) if params[:labels].present? + @resolved_contacts end def set_current_page @current_page = params[:page] || 1 end - def fetch_contact_last_seen_at(contacts) + def fetch_contacts_with_conversation_count(contacts) filtrate(contacts).left_outer_joins(:conversations) .select('contacts.*, COUNT(conversations.id) as conversations_count') .group('contacts.id') diff --git a/app/controllers/api/v1/accounts/csat_survey_responses_controller.rb b/app/controllers/api/v1/accounts/csat_survey_responses_controller.rb new file mode 100644 index 000000000000..26de6d406b36 --- /dev/null +++ b/app/controllers/api/v1/accounts/csat_survey_responses_controller.rb @@ -0,0 +1,44 @@ +class Api::V1::Accounts::CsatSurveyResponsesController < Api::V1::Accounts::BaseController + include Sift + include DateRangeHelper + + RESULTS_PER_PAGE = 25 + + before_action :check_authorization + before_action :set_csat_survey_responses, only: [:index, :metrics] + before_action :set_current_page, only: [:index] + before_action :set_current_page_surveys, only: [:index] + before_action :set_total_sent_messages_count, only: [:metrics] + + sort_on :created_at, type: :datetime + + def index; end + + def metrics + @total_count = @csat_survey_responses.count + @ratings_count = @csat_survey_responses.group(:rating).count + end + + private + + def set_total_sent_messages_count + @csat_messages = Current.account.messages.input_csat + @csat_messages = @csat_messages.where(created_at: range) if range.present? + @total_sent_messages_count = @csat_messages.count + end + + def set_csat_survey_responses + @csat_survey_responses = filtrate( + Current.account.csat_survey_responses.includes([:conversation, :assigned_agent, :contact]) + ) + @csat_survey_responses = @csat_survey_responses.where(created_at: range) if range.present? + end + + def set_current_page_surveys + @csat_survey_responses = @csat_survey_responses.page(@current_page).per(RESULTS_PER_PAGE) + end + + def set_current_page + @current_page = params[:page] || 1 + end +end diff --git a/app/controllers/api/v1/accounts/custom_filters_controller.rb b/app/controllers/api/v1/accounts/custom_filters_controller.rb new file mode 100644 index 000000000000..e6c7b6857593 --- /dev/null +++ b/app/controllers/api/v1/accounts/custom_filters_controller.rb @@ -0,0 +1,49 @@ +class Api::V1::Accounts::CustomFiltersController < Api::V1::Accounts::BaseController + before_action :fetch_custom_filters, except: [:create] + before_action :fetch_custom_filter, only: [:show, :update, :destroy] + DEFAULT_FILTER_TYPE = 'conversation'.freeze + + def index; end + + def show; end + + def create + @custom_filter = current_user.custom_filters.create!( + permitted_payload.merge(account_id: Current.account.id) + ) + end + + def update + @custom_filter.update!(permitted_payload) + end + + def destroy + @custom_filter.destroy + head :no_content + end + + private + + def fetch_custom_filters + @custom_filters = current_user.custom_filters.where( + account_id: Current.account.id, + filter_type: permitted_params[:filter_type] || DEFAULT_FILTER_TYPE + ) + end + + def fetch_custom_filter + @custom_filter = @custom_filters.find(permitted_params[:id]) + end + + def permitted_payload + params.require(:custom_filter).permit( + :name, + :filter_type, + query: {} + ) + end + + def permitted_params + params.permit(:id, :filter_type) + end +end diff --git a/app/controllers/api/v1/accounts/inboxes_controller.rb b/app/controllers/api/v1/accounts/inboxes_controller.rb index a51681617dd3..2621a4a338ce 100644 --- a/app/controllers/api/v1/accounts/inboxes_controller.rb +++ b/app/controllers/api/v1/accounts/inboxes_controller.rb @@ -88,12 +88,12 @@ def update_channel_feature_flags end def permitted_params - params.permit(:id, :avatar, :name, :greeting_message, :greeting_enabled, :enable_email_collect, channel: + params.permit(:id, :avatar, :name, :greeting_message, :greeting_enabled, :enable_email_collect, :csat_survey_enabled, channel: [:type, :website_url, :widget_color, :welcome_title, :welcome_tagline, :webhook_url, :email, :reply_time]) end def inbox_update_params - params.permit(:enable_auto_assignment, :enable_email_collect, :name, :avatar, :greeting_message, :greeting_enabled, + params.permit(:enable_auto_assignment, :enable_email_collect, :name, :avatar, :greeting_message, :greeting_enabled, :csat_survey_enabled, :working_hours_enabled, :out_of_office_message, :timezone, channel: [ :website_url, diff --git a/app/controllers/api/v1/accounts/notifications_controller.rb b/app/controllers/api/v1/accounts/notifications_controller.rb index 8f63d79f5518..ef08be6d9061 100644 --- a/app/controllers/api/v1/accounts/notifications_controller.rb +++ b/app/controllers/api/v1/accounts/notifications_controller.rb @@ -1,7 +1,6 @@ class Api::V1::Accounts::NotificationsController < Api::V1::Accounts::BaseController RESULTS_PER_PAGE = 15 - protect_from_forgery with: :null_session before_action :fetch_notification, only: [:update] before_action :set_primary_actor, only: [:read_all] before_action :set_current_page, only: [:index] diff --git a/app/controllers/api/v1/accounts_controller.rb b/app/controllers/api/v1/accounts_controller.rb index f67972486a0d..0cfc124451a2 100644 --- a/app/controllers/api/v1/accounts_controller.rb +++ b/app/controllers/api/v1/accounts_controller.rb @@ -1,7 +1,6 @@ class Api::V1::AccountsController < Api::BaseController include AuthHelper - skip_before_action :verify_authenticity_token, only: [:create] skip_before_action :authenticate_user!, :set_current_user, :handle_with_exception, only: [:create], raise: false before_action :check_signup_enabled, only: [:create] diff --git a/app/controllers/api/v1/widget/messages_controller.rb b/app/controllers/api/v1/widget/messages_controller.rb index 991b2f428d3d..9e6f770ad86b 100644 --- a/app/controllers/api/v1/widget/messages_controller.rb +++ b/app/controllers/api/v1/widget/messages_controller.rb @@ -54,7 +54,7 @@ def message_finder end def message_update_params - params.permit(message: [{ submitted_values: [:name, :title, :value] }]) + params.permit(message: [{ submitted_values: [:name, :title, :value, { csat_survey_response: [:feedback_message, :rating] }] }]) end def permitted_params diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 4fe48998da45..9399771c3681 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -3,13 +3,12 @@ class ApplicationController < ActionController::Base include Pundit include SwitchLocale - protect_from_forgery with: :null_session + skip_before_action :verify_authenticity_token before_action :set_current_user, unless: :devise_controller? around_action :switch_locale around_action :handle_with_exception, unless: :devise_controller? - # after_action :verify_authorized rescue_from ActiveRecord::RecordInvalid, with: :render_record_invalid private diff --git a/app/controllers/installation/onboarding_controller.rb b/app/controllers/installation/onboarding_controller.rb index a6f04238b7dc..130938fd839f 100644 --- a/app/controllers/installation/onboarding_controller.rb +++ b/app/controllers/installation/onboarding_controller.rb @@ -27,7 +27,13 @@ def onboarding_params def finish_onboarding ::Redis::Alfred.delete(::Redis::Alfred::CHATWOOT_INSTALLATION_ONBOARDING) - ChatwootHub.register_instance(onboarding_params) if onboarding_params[:subscribe_to_updates] + return if onboarding_params[:subscribe_to_updates].blank? + + ChatwootHub.register_instance( + onboarding_params.dig(:user, :company), + onboarding_params.dig(:user, :name), + onboarding_params.dig(:user, :email) + ) end def ensure_installation_onboarding diff --git a/app/controllers/platform_controller.rb b/app/controllers/platform_controller.rb index 612f86d27d13..c1ecfc50053c 100644 --- a/app/controllers/platform_controller.rb +++ b/app/controllers/platform_controller.rb @@ -1,6 +1,4 @@ -class PlatformController < ActionController::Base - protect_from_forgery with: :null_session - +class PlatformController < ActionController::API before_action :ensure_access_token before_action :set_platform_app before_action :set_resource, only: [:update, :show, :destroy] diff --git a/app/controllers/public_controller.rb b/app/controllers/public_controller.rb index 615a5d610bdd..9e5a7e6baa66 100644 --- a/app/controllers/public_controller.rb +++ b/app/controllers/public_controller.rb @@ -1,3 +1,5 @@ +# TODO: we should switch to ActionController::API for the base classes +# One of the specs is failing when I tried doing that, lets revisit in future class PublicController < ActionController::Base skip_before_action :verify_authenticity_token end diff --git a/app/dispatchers/async_dispatcher.rb b/app/dispatchers/async_dispatcher.rb index 0e238e3a0e67..1cbb5674761c 100644 --- a/app/dispatchers/async_dispatcher.rb +++ b/app/dispatchers/async_dispatcher.rb @@ -10,10 +10,12 @@ def publish_event(event_name, timestamp, data) def listeners [ + CampaignListener.instance, + CsatSurveyListener.instance, EventListener.instance, - WebhookListener.instance, - InstallationWebhookListener.instance, HookListener.instance, - CampaignListener.instance + HookListener.instance, + InstallationWebhookListener.instance, + WebhookListener.instance ] end end diff --git a/app/finders/conversation_finder.rb b/app/finders/conversation_finder.rb index 8791da5b95f5..06f219e270cd 100644 --- a/app/finders/conversation_finder.rb +++ b/app/finders/conversation_finder.rb @@ -73,6 +73,8 @@ def filter_by_assignee_type @conversations = @conversations.assigned_to(current_user) when 'unassigned' @conversations = @conversations.unassigned + when 'assigned' + @conversations = @conversations.where.not(assignee_id: nil) end @conversations end diff --git a/app/helpers/date_range_helper.rb b/app/helpers/date_range_helper.rb new file mode 100644 index 000000000000..175d6c72b921 --- /dev/null +++ b/app/helpers/date_range_helper.rb @@ -0,0 +1,19 @@ +############################################## +# Helpers to implement date range filtering to APIs +# Include in your controller or service class where params is available +############################################## + +module DateRangeHelper + def range + return if params[:since].blank? || params[:until].blank? + + parse_date_time(params[:since])..parse_date_time(params[:until]) + end + + def parse_date_time(datetime) + return datetime if datetime.is_a?(DateTime) + return datetime.to_datetime if datetime.is_a?(Time) || datetime.is_a?(Date) + + DateTime.strptime(datetime, '%s') + end +end diff --git a/app/helpers/message_format_helper.rb b/app/helpers/message_format_helper.rb new file mode 100644 index 000000000000..e27e61fceb58 --- /dev/null +++ b/app/helpers/message_format_helper.rb @@ -0,0 +1,6 @@ +module MessageFormatHelper + include RegexHelper + def transform_user_mention_content(message_content) + message_content.gsub(MENTION_REGEX, '\1') + end +end diff --git a/app/javascript/dashboard/api/contacts.js b/app/javascript/dashboard/api/contacts.js index cc8448873e5d..443a5b8dda48 100644 --- a/app/javascript/dashboard/api/contacts.js +++ b/app/javascript/dashboard/api/contacts.js @@ -1,13 +1,30 @@ /* global axios */ import ApiClient from './ApiClient'; +export const buildContactParams = (page, sortAttr, label, search) => { + let params = `page=${page}&sort=${sortAttr}`; + if (search) { + params = `${params}&q=${search}`; + } + if (label) { + params = `${params}&labels[]=${label}`; + } + return params; +}; + class ContactAPI extends ApiClient { constructor() { super('contacts', { accountScoped: true }); } - get(page, sortAttr = 'name') { - return axios.get(`${this.url}?page=${page}&sort=${sortAttr}`); + get(page, sortAttr = 'name', label = '') { + let requestURL = `${this.url}?${buildContactParams( + page, + sortAttr, + label, + '' + )}`; + return axios.get(requestURL); } getConversations(contactId) { @@ -26,10 +43,14 @@ class ContactAPI extends ApiClient { return axios.post(`${this.url}/${contactId}/labels`, { labels }); } - search(search = '', page = 1, sortAttr = 'name') { - return axios.get( - `${this.url}/search?q=${search}&page=${page}&sort=${sortAttr}` - ); + search(search = '', page = 1, sortAttr = 'name', label = '') { + let requestURL = `${this.url}/search?${buildContactParams( + page, + sortAttr, + label, + search + )}`; + return axios.get(requestURL); } } diff --git a/app/javascript/dashboard/api/csatReports.js b/app/javascript/dashboard/api/csatReports.js new file mode 100644 index 000000000000..a8b8308bc94b --- /dev/null +++ b/app/javascript/dashboard/api/csatReports.js @@ -0,0 +1,22 @@ +/* global axios */ +import ApiClient from './ApiClient'; + +class CSATReportsAPI extends ApiClient { + constructor() { + super('csat_survey_responses', { accountScoped: true }); + } + + get({ page, from, to } = {}) { + return axios.get(this.url, { + params: { page, since: from, until: to, sort: '-created_at' }, + }); + } + + getMetrics({ from, to } = {}) { + return axios.get(`${this.url}/metrics`, { + params: { since: from, until: to }, + }); + } +} + +export default new CSATReportsAPI(); diff --git a/app/javascript/dashboard/api/inbox/message.js b/app/javascript/dashboard/api/inbox/message.js index 0020a41385f6..84e77fb8b010 100644 --- a/app/javascript/dashboard/api/inbox/message.js +++ b/app/javascript/dashboard/api/inbox/message.js @@ -30,6 +30,10 @@ class MessageApi extends ApiClient { }); } + delete(conversationID, messageId) { + return axios.delete(`${this.url}/${conversationID}/messages/${messageId}`); + } + getPreviousMessages({ conversationId, before }) { return axios.get(`${this.url}/${conversationId}/messages`, { params: { before }, diff --git a/app/javascript/dashboard/api/specs/contacts.spec.js b/app/javascript/dashboard/api/specs/contacts.spec.js index a7080a634221..08f6ace031ba 100644 --- a/app/javascript/dashboard/api/specs/contacts.spec.js +++ b/app/javascript/dashboard/api/specs/contacts.spec.js @@ -1,4 +1,4 @@ -import contactAPI from '../contacts'; +import contactAPI, { buildContactParams } from '../contacts'; import ApiClient from '../ApiClient'; import describeWithAPIMock from './apiSpecHelper'; @@ -15,9 +15,9 @@ describe('#ContactsAPI', () => { describeWithAPIMock('API calls', context => { it('#get', () => { - contactAPI.get(1, 'name'); + contactAPI.get(1, 'name', 'customer-support'); expect(context.axiosMock.get).toHaveBeenCalledWith( - '/api/v1/contacts?page=1&sort=name' + '/api/v1/contacts?page=1&sort=name&labels[]=customer-support' ); }); @@ -54,10 +54,22 @@ describe('#ContactsAPI', () => { }); it('#search', () => { - contactAPI.search('leads', 1, 'date'); + contactAPI.search('leads', 1, 'date', 'customer-support'); expect(context.axiosMock.get).toHaveBeenCalledWith( - '/api/v1/contacts/search?q=leads&page=1&sort=date' + '/api/v1/contacts/search?page=1&sort=date&q=leads&labels[]=customer-support' ); }); }); }); + +describe('#buildContactParams', () => { + it('returns correct string', () => { + expect(buildContactParams(1, 'name', '', '')).toBe('page=1&sort=name'); + expect(buildContactParams(1, 'name', 'customer-support', '')).toBe( + 'page=1&sort=name&labels[]=customer-support' + ); + expect( + buildContactParams(1, 'name', 'customer-support', 'message-content') + ).toBe('page=1&sort=name&q=message-content&labels[]=customer-support'); + }); +}); diff --git a/app/javascript/dashboard/api/specs/csatReports.spec.js b/app/javascript/dashboard/api/specs/csatReports.spec.js new file mode 100644 index 000000000000..0022a91ad6a6 --- /dev/null +++ b/app/javascript/dashboard/api/specs/csatReports.spec.js @@ -0,0 +1,37 @@ +import csatReportsAPI from '../csatReports'; +import ApiClient from '../ApiClient'; +import describeWithAPIMock from './apiSpecHelper'; + +describe('#Reports API', () => { + it('creates correct instance', () => { + expect(csatReportsAPI).toBeInstanceOf(ApiClient); + expect(csatReportsAPI.apiVersion).toBe('/api/v1'); + expect(csatReportsAPI).toHaveProperty('get'); + expect(csatReportsAPI).toHaveProperty('getMetrics'); + }); + describeWithAPIMock('API calls', context => { + it('#get', () => { + csatReportsAPI.get({ page: 1, from: 1622485800, to: 1623695400 }); + expect(context.axiosMock.get).toHaveBeenCalledWith( + '/api/v1/csat_survey_responses', + { + params: { + page: 1, + since: 1622485800, + until: 1623695400, + sort: '-created_at', + }, + } + ); + }); + it('#getMetrics', () => { + csatReportsAPI.getMetrics({ from: 1622485800, to: 1623695400 }); + expect(context.axiosMock.get).toHaveBeenCalledWith( + '/api/v1/csat_survey_responses/metrics', + { + params: { since: 1622485800, until: 1623695400 }, + } + ); + }); + }); +}); diff --git a/app/javascript/dashboard/assets/images/channels/sms.png b/app/javascript/dashboard/assets/images/channels/sms.png new file mode 100644 index 000000000000..a8cfa6428a27 Binary files /dev/null and b/app/javascript/dashboard/assets/images/channels/sms.png differ diff --git a/app/javascript/dashboard/assets/scss/_date-picker.scss b/app/javascript/dashboard/assets/scss/_date-picker.scss new file mode 100644 index 000000000000..c9b4b7b12abf --- /dev/null +++ b/app/javascript/dashboard/assets/scss/_date-picker.scss @@ -0,0 +1,29 @@ +@import '~vue2-datepicker/scss/index'; + +.mx-datepicker-popup { + z-index: 99999; +} + +.date-picker { + .mx-datepicker { + width: 100%; + } + + .mx-datepicker-range { + width: 320px; + } + + .mx-input { + border: 1px solid var(--color-border); + border-radius: var(--border-radius-normal); + box-shadow: none; + display: flex; + height: 4.6rem; + } + + .mx-input:disabled, + .mx-input[readonly] { + background-color: var(--white); + cursor: pointer; + } +} diff --git a/app/javascript/dashboard/assets/scss/_foundation-custom.scss b/app/javascript/dashboard/assets/scss/_foundation-custom.scss index 6fc3961fc54f..0e2329b661fa 100644 --- a/app/javascript/dashboard/assets/scss/_foundation-custom.scss +++ b/app/javascript/dashboard/assets/scss/_foundation-custom.scss @@ -42,6 +42,14 @@ code { white-space: nowrap; } +.text-capitalize { + text-transform: capitalize; +} + .cursor-pointer { cursor: pointer; } +// remove when grid gutters are fixed +.columns.with-right-space { + padding-right: var(--space-normal); +} diff --git a/app/javascript/dashboard/assets/scss/_woot.scss b/app/javascript/dashboard/assets/scss/_woot.scss index d156f77b9771..e3ad32e2ecc1 100644 --- a/app/javascript/dashboard/assets/scss/_woot.scss +++ b/app/javascript/dashboard/assets/scss/_woot.scss @@ -12,6 +12,7 @@ @import 'foundation-settings'; @import 'helper-classes'; @import 'formulate'; +@import 'date-picker'; @import 'foundation-sites/scss/foundation'; @import '~bourbon/core/bourbon'; diff --git a/app/javascript/dashboard/assets/scss/plugins/_multiselect.scss b/app/javascript/dashboard/assets/scss/plugins/_multiselect.scss index 1e4d9c733dde..51309625ae8c 100644 --- a/app/javascript/dashboard/assets/scss/plugins/_multiselect.scss +++ b/app/javascript/dashboard/assets/scss/plugins/_multiselect.scss @@ -137,6 +137,7 @@ } .sidebar-labels-wrap { + &.has-edited, &:hover { .multiselect { @@ -162,6 +163,12 @@ .multiselect-wrap--small { $multiselect-height: 3.8rem; + .multiselect__tags, + .multiselect__input { + align-items: center; + display: flex; + } + .multiselect__tags, .multiselect__input, .multiselect { @@ -177,15 +184,24 @@ } .multiselect__single { + align-items: center; + display: flex; font-size: var(--font-size-small); - padding: var(--space-small) 0; + margin: 0; + padding: var(--space-smaller) var(--space-micro); } .multiselect__placeholder { - padding: var(--space-small) 0; + margin: 0; + padding: var(--space-smaller) var(--space-micro); } .multiselect__select { min-height: $multiselect-height; } + + .multiselect--disabled .multiselect__current, + .multiselect--disabled .multiselect__select { + background: transparent; + } } diff --git a/app/javascript/dashboard/assets/scss/storybook.scss b/app/javascript/dashboard/assets/scss/storybook.scss index f6a9d5eb33f8..2364c3d5b5f9 100644 --- a/app/javascript/dashboard/assets/scss/storybook.scss +++ b/app/javascript/dashboard/assets/scss/storybook.scss @@ -8,6 +8,7 @@ @import 'variables'; @import '~spinkit/scss/spinners/7-three-bounce'; +@import '~vue-multiselect/dist/vue-multiselect.min.css'; @import '~shared/assets/stylesheets/ionicons'; @import 'mixins'; @@ -27,3 +28,5 @@ @import 'foundation-custom'; @import 'widgets/buttons'; @import 'widgets/forms'; + +@import 'plugins/multiselect'; diff --git a/app/javascript/dashboard/assets/scss/views/settings/channel.scss b/app/javascript/dashboard/assets/scss/views/settings/channel.scss index 80400bb71187..c22888ba55eb 100644 --- a/app/javascript/dashboard/assets/scss/views/settings/channel.scss +++ b/app/javascript/dashboard/assets/scss/views/settings/channel.scss @@ -8,12 +8,12 @@ .channel { @include flex; @include padding($space-normal $zero); - @include margin($zero); @include background-white; @include border-light; - flex-direction: column; + cursor: pointer; - border-right-color: $color-white; + flex-direction: column; + margin: -1px; transition: all 0.200s ease-in; &:last-child { @@ -32,14 +32,13 @@ img { @include margin($space-normal auto); - flex: 1; width: 50%; } - .channel__title{ - font-size: $font-size-large; - text-align: center; + .channel__title { color: $color-body; + font-size: var(--font-size-default); + text-align: center; text-transform: capitalize; } diff --git a/app/javascript/dashboard/assets/scss/widgets/_buttons.scss b/app/javascript/dashboard/assets/scss/widgets/_buttons.scss index edbef16bb628..1a72d51df32e 100644 --- a/app/javascript/dashboard/assets/scss/widgets/_buttons.scss +++ b/app/javascript/dashboard/assets/scss/widgets/_buttons.scss @@ -6,6 +6,10 @@ $default-button-height: 4.0rem; height: $default-button-height; margin-bottom: 0; + .button__content { + width: 100%; + } + .spinner { padding: 0 var(--space-small); } diff --git a/app/javascript/dashboard/assets/scss/widgets/_report.scss b/app/javascript/dashboard/assets/scss/widgets/_report.scss index 3e3c3039002a..ca013a39d1ec 100644 --- a/app/javascript/dashboard/assets/scss/widgets/_report.scss +++ b/app/javascript/dashboard/assets/scss/widgets/_report.scss @@ -1,7 +1,6 @@ .report-card { @include padding($space-normal $space-small $space-normal $space-two); @include margin($zero); - @include background-light; cursor: pointer; @include custom-border-top(3px, transparent); diff --git a/app/javascript/dashboard/components/index.js b/app/javascript/dashboard/components/index.js index e5ec89da034b..f737bd3131c0 100644 --- a/app/javascript/dashboard/components/index.js +++ b/app/javascript/dashboard/components/index.js @@ -1,14 +1,14 @@ /* eslint no-plusplus: 0 */ -/* eslint-env browser */ import AvatarUploader from './widgets/forms/AvatarUploader.vue'; import Bar from './widgets/chart/BarChart'; import Button from './ui/WootButton'; import Code from './Code'; import ColorPicker from './widgets/ColorPicker'; -import DeleteModal from './widgets/modal/DeleteModal.vue'; import ConfirmDeleteModal from './widgets/modal/ConfirmDeleteModal.vue'; +import DeleteModal from './widgets/modal/DeleteModal.vue'; import DropdownItem from 'shared/components/ui/dropdown/DropdownItem'; import DropdownMenu from 'shared/components/ui/dropdown/DropdownMenu'; +import HorizontalBar from './widgets/chart/HorizontalBarChart'; import Input from './widgets/forms/Input.vue'; import Label from './ui/Label'; import LoadingState from './widgets/LoadingState'; @@ -28,12 +28,14 @@ const WootUIKit = { Button, Code, ColorPicker, + ConfirmDeleteModal, DeleteModal, DropdownItem, DropdownMenu, + HorizontalBar, Input, - LoadingState, Label, + LoadingState, Modal, ModalHeader, ReportStatsCard, @@ -43,7 +45,6 @@ const WootUIKit = { Tabs, TabsItem, Thumbnail, - ConfirmDeleteModal, install(Vue) { const keys = Object.keys(this); keys.pop(); // remove 'install' from keys diff --git a/app/javascript/dashboard/components/layout/Sidebar.vue b/app/javascript/dashboard/components/layout/Sidebar.vue index 9964947897a0..61405f6cd519 100644 --- a/app/javascript/dashboard/components/layout/Sidebar.vue +++ b/app/javascript/dashboard/components/layout/Sidebar.vue @@ -27,6 +27,13 @@ v-if="shouldShowSidebarItem" :key="labelSection.toState" :menu-item="labelSection" + @add-label="showAddLabelPopup" + /> + @@ -57,6 +64,10 @@ :show="showCreateAccountModal" @close-account-create-modal="closeCreateAccountModal" /> + + + + @@ -74,6 +85,7 @@ import AgentDetails from './sidebarComponents/AgentDetails.vue'; import OptionsMenu from './sidebarComponents/OptionsMenu.vue'; import AccountSelector from './sidebarComponents/AccountSelector.vue'; import AddAccountModal from './sidebarComponents/AddAccountModal.vue'; +import AddLabelModal from '../../routes/dashboard/settings/labels/AddLabel'; export default { components: { @@ -84,6 +96,7 @@ export default { OptionsMenu, AccountSelector, AddAccountModal, + AddLabelModal, }, mixins: [adminMixin, alertMixin], data() { @@ -91,6 +104,7 @@ export default { showOptionsMenu: false, showAccountModal: false, showCreateAccountModal: false, + showAddLabelModal: false, }; }, @@ -131,6 +145,9 @@ export default { shouldShowSidebarItem() { return this.sidemenuItems.common.routes.includes(this.currentRoute); }, + showShowContactSideMenu() { + return this.sidemenuItems.contacts.routes.includes(this.currentRoute); + }, shouldShowTeams() { return this.shouldShowSidebarItem && this.teams.length; }, @@ -177,6 +194,29 @@ export default { })), }; }, + contactLabelSection() { + return { + icon: 'ion-pound', + label: 'TAGGED_WITH', + hasSubMenu: true, + key: 'label', + newLink: false, + cssClass: 'menu-title align-justify', + toState: frontendURL(`accounts/${this.accountId}/settings/labels`), + toStateName: 'labels_list', + showModalForNewItem: true, + modalName: 'AddLabel', + children: this.accountLabels.map(label => ({ + id: label.id, + label: label.title, + color: label.color, + truncateLabel: true, + toState: frontendURL( + `accounts/${this.accountId}/labels/${label.title}/contacts` + ), + })), + }; + }, teamSection() { return { icon: 'ion-ios-people', @@ -253,6 +293,12 @@ export default { closeCreateAccountModal() { this.showCreateAccountModal = false; }, + showAddLabelPopup() { + this.showAddLabelModal = true; + }, + hideAddLabelPopup() { + this.showAddLabelModal = false; + }, }, }; diff --git a/app/javascript/dashboard/components/layout/SidebarItem.vue b/app/javascript/dashboard/components/layout/SidebarItem.vue index 810155bef810..bd4a00487d8f 100644 --- a/app/javascript/dashboard/components/layout/SidebarItem.vue +++ b/app/javascript/dashboard/components/layout/SidebarItem.vue @@ -52,11 +52,6 @@ - @@ -66,17 +61,8 @@ import { mapGetters } from 'vuex'; import router from '../../routes'; import adminMixin from '../../mixins/isAdmin'; import { getInboxClassByType } from 'dashboard/helper/inbox'; -import AddLabelModal from '../../routes/dashboard/settings/labels/AddLabel'; export default { - components: { - AddLabelModal, - }, mixins: [adminMixin], - data() { - return { - showAddLabel: false, - }; - }, props: { menuItem: { type: Object, @@ -127,19 +113,13 @@ export default { router.push({ name: item.newLinkRouteName, params: { page: 'new' } }); } else if (item.showModalForNewItem) { if (item.modalName === 'AddLabel') { - this.showAddLabelPopup(); + this.$emit('add-label'); } } }, showItem(item) { return this.isAdmin && item.newLink !== undefined; }, - showAddLabelPopup() { - this.showAddLabel = true; - }, - hideAddLabelPopup() { - this.showAddLabel = false; - }, }, }; diff --git a/app/javascript/dashboard/components/ui/DateRangePicker.vue b/app/javascript/dashboard/components/ui/DateRangePicker.vue new file mode 100644 index 000000000000..08ce0e0c148a --- /dev/null +++ b/app/javascript/dashboard/components/ui/DateRangePicker.vue @@ -0,0 +1,40 @@ + + + diff --git a/app/javascript/dashboard/components/ui/DateTimePicker.vue b/app/javascript/dashboard/components/ui/DateTimePicker.vue new file mode 100644 index 000000000000..4507edf789d5 --- /dev/null +++ b/app/javascript/dashboard/components/ui/DateTimePicker.vue @@ -0,0 +1,47 @@ + + + diff --git a/app/javascript/dashboard/components/ui/stories/DateRangePicker.stories.js b/app/javascript/dashboard/components/ui/stories/DateRangePicker.stories.js new file mode 100644 index 000000000000..8cdaa2461453 --- /dev/null +++ b/app/javascript/dashboard/components/ui/stories/DateRangePicker.stories.js @@ -0,0 +1,38 @@ +import { action } from '@storybook/addon-actions'; +import WootDateRangePicker from '../DateRangePicker.vue'; + +export default { + title: 'Components/Date Picker/Date Range Picker', + argTypes: { + confirmText: { + defaultValue: 'Apply', + control: { + type: 'text', + }, + }, + placeholder: { + defaultValue: 'Select date range', + control: { + type: 'text', + }, + }, + value: { + control: { + type: 'text', + }, + }, + }, +}; + +const Template = (args, { argTypes }) => ({ + props: Object.keys(argTypes), + components: { WootDateRangePicker }, + template: + '', +}); + +export const DateRangePicker = Template.bind({}); +DateRangePicker.args = { + onChange: action('applied'), + value: new Date(), +}; diff --git a/app/javascript/dashboard/components/ui/stories/DateTimePicker.stories.js b/app/javascript/dashboard/components/ui/stories/DateTimePicker.stories.js new file mode 100644 index 000000000000..a636fabed4e3 --- /dev/null +++ b/app/javascript/dashboard/components/ui/stories/DateTimePicker.stories.js @@ -0,0 +1,38 @@ +import { action } from '@storybook/addon-actions'; +import WootDateTimePicker from '../DateTimePicker.vue'; + +export default { + title: 'Components/Date Picker/Date Time Picker', + argTypes: { + confirmText: { + defaultValue: 'Apply', + control: { + type: 'text', + }, + }, + placeholder: { + defaultValue: 'Select date time', + control: { + type: 'text', + }, + }, + value: { + control: { + type: 'text', + }, + }, + }, +}; + +const Template = (args, { argTypes }) => ({ + props: Object.keys(argTypes), + components: { WootDateTimePicker }, + template: + '', +}); + +export const DateTimePicker = Template.bind({}); +DateTimePicker.args = { + onChange: action('applied'), + value: new Date(), +}; diff --git a/app/javascript/dashboard/components/widgets/AttachmentsPreview.vue b/app/javascript/dashboard/components/widgets/AttachmentsPreview.vue index 2d5ded5152a6..2c4f48895d28 100644 --- a/app/javascript/dashboard/components/widgets/AttachmentsPreview.vue +++ b/app/javascript/dashboard/components/widgets/AttachmentsPreview.vue @@ -65,7 +65,11 @@ export default { display: flex; padding: var(--space-slab) 0 0; background: var(--color-background-light); - background: transparent; + background: var(--b-50); + border-radius: var(--border-radius-normal); + width: fit-content; + padding: var(--space-smaller); + margin-top: var(--space-normal); } .thumb-wrap { @@ -114,6 +118,8 @@ export default { max-width: 50%; overflow: hidden; text-overflow: ellipsis; + margin-left: var(--space-small); + .item { height: var(--space-normal); overflow: hidden; @@ -123,7 +129,7 @@ export default { } .file-size-wrap { - width: 20%; + width: 30%; justify-content: center; } diff --git a/app/javascript/dashboard/components/widgets/ChannelItem.vue b/app/javascript/dashboard/components/widgets/ChannelItem.vue index 37b82436ea9c..e612fa14b2e2 100644 --- a/app/javascript/dashboard/components/widgets/ChannelItem.vue +++ b/app/javascript/dashboard/components/widgets/ChannelItem.vue @@ -1,6 +1,6 @@ @@ -294,4 +356,42 @@ export default { margin-left: var(--space-smaller); } } + +.button--delete-message { + visibility: hidden; +} + +li.left, +li.right { + display: flex; + align-items: flex-end; + + &:hover .button--delete-message { + visibility: visible; + } +} + +li.left.has-tweet-menu .context-menu { + margin-bottom: var(--space-medium); +} + +li.right .context-menu-wrap { + margin-left: auto; +} + +li.right { + flex-direction: row-reverse; + justify-content: flex-end; +} + +.has-context-menu { + background: var(--color-background); + .button--delete-message { + visibility: visible; + } +} + +.context-menu { + position: relative; +} diff --git a/app/javascript/dashboard/components/widgets/conversation/MessagesView.vue b/app/javascript/dashboard/components/widgets/conversation/MessagesView.vue index d825e4634de7..9b4de3651b52 100644 --- a/app/javascript/dashboard/components/widgets/conversation/MessagesView.vue +++ b/app/javascript/dashboard/components/widgets/conversation/MessagesView.vue @@ -56,6 +56,7 @@ @@ -72,6 +73,7 @@ @@ -106,6 +108,7 @@ import { getTypingUsersText } from '../../../helper/commons'; import { BUS_EVENTS } from 'shared/constants/busEvents'; import { REPLY_POLICY } from 'shared/constants/links'; import inboxMixin from 'shared/mixins/inboxMixin'; +import { calculateScrollTop } from './helpers/scrollTopCalculationHelper'; export default { components: { @@ -259,7 +262,23 @@ export default { this.conversationPanel.removeEventListener('scroll', this.handleScroll); }, scrollToBottom() { - this.conversationPanel.scrollTop = this.conversationPanel.scrollHeight; + let relevantMessages = []; + if (this.getUnreadCount > 0) { + // capturing only the unread messages + relevantMessages = this.conversationPanel.querySelectorAll( + '.message--unread' + ); + } else { + // capturing last message from the messages list + relevantMessages = Array.from( + this.conversationPanel.querySelectorAll('.message--read') + ).slice(-1); + } + this.conversationPanel.scrollTop = calculateScrollTop( + this.conversationPanel.scrollHeight, + this.$el.scrollHeight, + relevantMessages + ); }, onToggleContactPanel() { this.$emit('contact-panel-toggle'); diff --git a/app/javascript/dashboard/components/widgets/conversation/helpers/botMessageContentHelper.js b/app/javascript/dashboard/components/widgets/conversation/helpers/botMessageContentHelper.js index 42e59a161531..2f4521f72ac1 100644 --- a/app/javascript/dashboard/components/widgets/conversation/helpers/botMessageContentHelper.js +++ b/app/javascript/dashboard/components/widgets/conversation/helpers/botMessageContentHelper.js @@ -1,4 +1,6 @@ -const generateInputSelectContent = (contentType, contentAttributes) => { +import { CSAT_RATINGS } from '../../../../../shared/constants/messages'; + +const generateInputSelectContent = contentAttributes => { const { submitted_values: submittedValues = [] } = contentAttributes; const [selectedOption] = submittedValues; @@ -8,7 +10,7 @@ const generateInputSelectContent = (contentType, contentAttributes) => { return ''; }; -const generateInputEmailContent = (contentType, contentAttributes) => { +const generateInputEmailContent = contentAttributes => { const { submitted_email: submittedEmail = '' } = contentAttributes; if (submittedEmail) { return `${submittedEmail}`; @@ -16,11 +18,7 @@ const generateInputEmailContent = (contentType, contentAttributes) => { return ''; }; -const generateFormContent = ( - contentType, - contentAttributes, - noResponseText -) => { +const generateFormContent = (contentAttributes, { noResponseText }) => { const { items, submitted_values: submittedValues = [] } = contentAttributes; if (submittedValues.length) { const submittedObject = submittedValues.reduce((acc, keyValuePair) => { @@ -38,20 +36,52 @@ const generateFormContent = ( return ''; }; +const generateCSATContent = ( + contentAttributes, + { ratingTitle, feedbackTitle } +) => { + const { + submitted_values: { csat_survey_response: surveyResponse = {} } = {}, + } = contentAttributes; + const { rating, feedback_message } = surveyResponse || {}; + + let messageContent = ''; + if (rating) { + const [ratingObject = {}] = CSAT_RATINGS.filter( + csatRating => csatRating.value === rating + ); + messageContent += `
${ratingTitle}
`; + messageContent += `

${ratingObject.emoji}

`; + } + if (feedback_message) { + messageContent += `
${feedbackTitle}
`; + messageContent += `

${feedback_message}

`; + } + return messageContent; +}; + export const generateBotMessageContent = ( contentType, contentAttributes, - noResponseText = 'No response' + { + noResponseText = 'No response', + csat: { ratingTitle = 'Rating', feedbackTitle = 'Feedback' } = {}, + } = {} ) => { const contentTypeMethods = { input_select: generateInputSelectContent, input_email: generateInputEmailContent, form: generateFormContent, + input_csat: generateCSATContent, }; const contentTypeMethod = contentTypeMethods[contentType]; if (contentTypeMethod && typeof contentTypeMethod === 'function') { - return contentTypeMethod(contentType, contentAttributes, noResponseText); + return contentTypeMethod(contentAttributes, { + noResponseText, + ratingTitle, + feedbackTitle, + }); } return ''; }; diff --git a/app/javascript/dashboard/components/widgets/conversation/helpers/scrollTopCalculationHelper.js b/app/javascript/dashboard/components/widgets/conversation/helpers/scrollTopCalculationHelper.js new file mode 100644 index 000000000000..f588089c3d36 --- /dev/null +++ b/app/javascript/dashboard/components/widgets/conversation/helpers/scrollTopCalculationHelper.js @@ -0,0 +1,18 @@ +const totalMessageHeight = (total, element) => { + return total + element.scrollHeight; +}; + +export const calculateScrollTop = ( + conversationPanelHeight, + parentHeight, + relevantMessages +) => { + // add up scrollHeight of a `relevantMessages` + let combinedMessageScrollHeight = [...relevantMessages].reduce( + totalMessageHeight, + 0 + ); + return ( + conversationPanelHeight - combinedMessageScrollHeight - parentHeight / 2 + ); +}; diff --git a/app/javascript/dashboard/components/widgets/conversation/helpers/specs/botMessageContentHelper.spec.js b/app/javascript/dashboard/components/widgets/conversation/helpers/specs/botMessageContentHelper.spec.js index 716fdd65b5e6..a0901aa1ac82 100644 --- a/app/javascript/dashboard/components/widgets/conversation/helpers/specs/botMessageContentHelper.spec.js +++ b/app/javascript/dashboard/components/widgets/conversation/helpers/specs/botMessageContentHelper.spec.js @@ -17,6 +17,33 @@ describe('#generateBotMessageContent', () => { ).toEqual('hello@chatwoot.com'); }); + it('return correct input_csat content', () => { + expect( + generateBotMessageContent('input_csat', { + submitted_values: { + csat_survey_response: { + rating: 5, + feedback_message: 'Great Service', + }, + }, + }) + ).toEqual( + '
Rating

😍

Feedback

Great Service

' + ); + + expect( + generateBotMessageContent( + 'input_csat', + { + submitted_values: { + csat_survey_response: { rating: 1, feedback_message: '' }, + }, + }, + { csat: { ratingTitle: 'റേറ്റിംഗ്', feedbackTitle: 'പ്രതികരണം' } } + ) + ).toEqual('
റേറ്റിംഗ്

😞

'); + }); + it('return correct form content', () => { expect( generateBotMessageContent('form', { diff --git a/app/javascript/dashboard/components/widgets/conversation/helpers/specs/scrollTopCalculationHelper.spec.js b/app/javascript/dashboard/components/widgets/conversation/helpers/specs/scrollTopCalculationHelper.spec.js new file mode 100644 index 000000000000..03caf756088a --- /dev/null +++ b/app/javascript/dashboard/components/widgets/conversation/helpers/specs/scrollTopCalculationHelper.spec.js @@ -0,0 +1,18 @@ +import { calculateScrollTop } from '../scrollTopCalculationHelper'; + +describe('#calculateScrollTop', () => { + it('returns calculated value of the scrollTop property', () => { + class DOMElement { + constructor(scrollHeight) { + this.scrollHeight = scrollHeight; + } + } + let count = 3; + let relevantMessages = []; + while (count > 0) { + relevantMessages.push(new DOMElement(100)); + count -= 1; + } + expect(calculateScrollTop(1000, 300, relevantMessages)).toEqual(550); + }); +}); diff --git a/app/javascript/dashboard/i18n/default-sidebar.js b/app/javascript/dashboard/i18n/default-sidebar.js index 8bb78f61bf52..03d93b491a2d 100644 --- a/app/javascript/dashboard/i18n/default-sidebar.js +++ b/app/javascript/dashboard/i18n/default-sidebar.js @@ -7,10 +7,7 @@ export const getSidebarItems = accountId => ({ 'inbox_dashboard', 'inbox_conversation', 'conversation_through_inbox', - 'contacts_dashboard', - 'contacts_dashboard_manage', 'notifications_dashboard', - 'settings_account_reports', 'profile_settings', 'profile_settings_index', 'label_conversations', @@ -59,6 +56,55 @@ export const getSidebarItems = accountId => ({ }, }, }, + contacts: { + routes: [ + 'contacts_dashboard', + 'contacts_dashboard_manage', + 'contacts_labels_dashboard', + ], + menuItems: { + back: { + icon: 'ion-ios-arrow-back', + label: 'HOME', + hasSubMenu: false, + toStateName: 'home', + toState: frontendURL(`accounts/${accountId}/dashboard`), + }, + contacts: { + icon: 'ion-person', + label: 'ALL_CONTACTS', + hasSubMenu: false, + toState: frontendURL(`accounts/${accountId}/contacts`), + toStateName: 'contacts_dashboard', + }, + }, + }, + reports: { + routes: ['settings_account_reports', 'csat_reports'], + menuItems: { + back: { + icon: 'ion-ios-arrow-back', + label: 'HOME', + hasSubMenu: false, + toStateName: 'home', + toState: frontendURL(`accounts/${accountId}/dashboard`), + }, + reportOverview: { + icon: 'ion-arrow-graph-up-right', + label: 'REPORTS_OVERVIEW', + hasSubMenu: false, + toState: frontendURL(`accounts/${accountId}/reports/overview`), + toStateName: 'settings_account_reports', + }, + csatReports: { + icon: 'ion-happy', + label: 'CSAT', + hasSubMenu: false, + toState: frontendURL(`accounts/${accountId}/reports/csat`), + toStateName: 'csat_reports', + }, + }, + }, settings: { routes: [ 'agent_list', diff --git a/app/javascript/dashboard/i18n/locale/ar/agentMgmt.json b/app/javascript/dashboard/i18n/locale/ar/agentMgmt.json index a8cd894748e0..3a82adb0a9ec 100644 --- a/app/javascript/dashboard/i18n/locale/ar/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ar/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "لم يتم العثور على موظفين." + "NO_RESULTS": "لم يتم العثور على النتائج." } } } diff --git a/app/javascript/dashboard/i18n/locale/ar/campaign.json b/app/javascript/dashboard/i18n/locale/ar/campaign.json index 6b0aa1efd576..532b4bd705eb 100644 --- a/app/javascript/dashboard/i18n/locale/ar/campaign.json +++ b/app/javascript/dashboard/i18n/locale/ar/campaign.json @@ -14,6 +14,17 @@ "PLACEHOLDER": "Please enter the title of campaign", "ERROR": "Title is required" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { "LABEL": "رسالة", "PLACEHOLDER": "Please enter the message of campaign", @@ -72,6 +83,7 @@ "STATUS": "الحالة", "SENDER": "Sender", "URL": "URL", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "Time(Seconds)", "CREATED_AT": "Created at" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "مفعل", - "DISABLED": "معطّل" + "DISABLED": "معطّل", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "رد آلي" diff --git a/app/javascript/dashboard/i18n/locale/ar/contact.json b/app/javascript/dashboard/i18n/locale/ar/contact.json index b4b4d394af68..bbd9a6fa0b14 100644 --- a/app/javascript/dashboard/i18n/locale/ar/contact.json +++ b/app/javascript/dashboard/i18n/locale/ar/contact.json @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "جهات الاتصال", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "بحث", "SEARCH_INPUT_PLACEHOLDER": "بحث عن جهات الاتصال", "LIST": { "LOADING_MESSAGE": "جاري تحميل جهات الاتصال...", "404": "لا توجد جهات اتصال تطابق بحثك 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "الاسم", "PHONE_NUMBER": "رقم الهاتف", @@ -203,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "إلغاء", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/ar/conversation.json b/app/javascript/dashboard/i18n/locale/ar/conversation.json index 99c38282cf5c..63394c504168 100644 --- a/app/javascript/dashboard/i18n/locale/ar/conversation.json +++ b/app/javascript/dashboard/i18n/locale/ar/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "إزالة التحديد", "DOWNLOAD": "تنزيل", "UPLOADING_ATTACHMENTS": "جاري تحميل المرفقات...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "لا توجد استجابة", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "إغلاق المحادثة", "REOPEN_ACTION": "إعادة فتح", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "عرض محرر النصوص", "TIP_EMOJI_ICON": "إظهار قائمة الرموز التعبيرية", "TIP_ATTACH_ICON": "إرفاق الملفات", - "ENTER_TO_SEND": "زر الإدخل للإرسال" + "ENTER_TO_SEND": "زر الإدخل للإرسال", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "ملاحظة خاصة: مرئية فقط لأعضاء فريق العمل والموظفين", "CHANGE_STATUS": "تم تغيير حالة المحادثة", @@ -64,6 +69,10 @@ "SELECT_AGENT": "اختر وكيل", "REMOVE": "حذف", "ASSIGN": "تكليف" + }, + "CONTEXT_MENU": { + "COPY": "نسخ", + "DELETE": "حذف" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/ar/csatMgmt.json b/app/javascript/dashboard/i18n/locale/ar/csatMgmt.json new file mode 100644 index 000000000000..d7d2efc2ada6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ar/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json index 087f6cd0b4da..d6fd9f086595 100644 --- a/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "تعذر تكوين المصادقة بواسطة بيانات الاعتماد الخاصة بحسابك على Twilio، يرجى المحاولة مرة أخرى" } }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." + }, "API_CHANNEL": { "TITLE": "قناة API", "DESC": "اربط مع قناة API وابدأ في دعم عملائك.", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "بدء إعادة توجيه رسائل البريد الإلكتروني الخاصة بك إلى عنوان البريد الإلكتروني التالي." }, "AUTH": { - "TITLE": "القنوات", - "DESC": "ندعم حالياً تثبيت برنامج الدردشة المباشرة على موقعك وربط صفحات الفيس بوك وحسابات تويتر. جار العمل على دعم المزيد من المنصات الأخرى مثل واتساب، و البريد الإلكتروني، و تلغرام و لاين، والتي ستكون متاحة قريباً." + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "موظف الدعم", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "مفعل", "DISABLED": "معطّل" + }, + "ENABLE_CSAT": { + "ENABLED": "مفعل", + "DISABLED": "معطّل" } }, "DELETE": { @@ -255,6 +267,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "تفعيل الإسناد التلقائي", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "إعدادات قناة التواصل", "INBOX_UPDATE_SUB_TEXT": "تحديث إعدادات قناة التواصل", "AUTO_ASSIGNMENT_SUB_TEXT": "تمكين أو تعطيل الإسناد التلقائي للمحادثات الجديدة إلى الموظفين المضافين إلى قناة التواصل هذه.", diff --git a/app/javascript/dashboard/i18n/locale/ar/integrations.json b/app/javascript/dashboard/i18n/locale/ar/integrations.json index a0805e5f7d0b..812ef93912ff 100644 --- a/app/javascript/dashboard/i18n/locale/ar/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ar/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

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

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

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

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

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

" + } + }, "DELETE": { "BUTTON_TEXT": "حذف", "API": { diff --git a/app/javascript/dashboard/i18n/locale/ar/report.json b/app/javascript/dashboard/i18n/locale/ar/report.json index 4f153ec110de..f107cdcb47d7 100644 --- a/app/javascript/dashboard/i18n/locale/ar/report.json +++ b/app/javascript/dashboard/i18n/locale/ar/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "التقارير", + "HEADER": "Overview", "LOADING_CHART": "تحميل بيانات الرسم البياني...", "NO_ENOUGH_DATA": "لم يتم جمع بيانات بقدر كافي لإنشاء التقرير، الرجاء المحاولة مرة أخرى لاحقاً.", "DOWNLOAD_AGENT_REPORTS": "تنزيل تقارير الوكيل", @@ -50,7 +50,41 @@ { "id": 4, "name": "Last year" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "HEADER": "CSAT Reports", + "NO_RECORDS": "There are no CSAT survey responses available.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Assigned agent", + "RATING": "Rating", + "FEEDBACK_TEXT": "Feedback comment" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/ar/settings.json b/app/javascript/dashboard/i18n/locale/ar/settings.json index 48f45bcdf359..d032bd51f248 100644 --- a/app/javascript/dashboard/i18n/locale/ar/settings.json +++ b/app/javascript/dashboard/i18n/locale/ar/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "الإشعارات الصوتية", "NOTE": "تمكين التنبيهات الصوتية في لوحة التحكم للرسائل والمحادثات الجديدة.", - "ENABLE_AUDIO": "تشغيل إشعار صوتي عند إنشاء محادثة جديدة أو وصول رسائل جديدة" + "NONE": "لا شيء", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "إشعارات البريد الإلكتروني", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "إعدادات الحساب", "APPLICATIONS": "Applications", "LABELS": "الوسوم", - "TEAMS": "الفرق" + "TEAMS": "الفرق", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with", + "REPORTS_OVERVIEW": "Overview", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "حساب جديد", diff --git a/app/javascript/dashboard/i18n/locale/ca/agentMgmt.json b/app/javascript/dashboard/i18n/locale/ca/agentMgmt.json index 9fb6b933b5ac..efb044f94a1f 100644 --- a/app/javascript/dashboard/i18n/locale/ca/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ca/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "No s'han trobat agents." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/ca/campaign.json b/app/javascript/dashboard/i18n/locale/ca/campaign.json index 9fd2390c3a2d..55124b9d86bf 100644 --- a/app/javascript/dashboard/i18n/locale/ca/campaign.json +++ b/app/javascript/dashboard/i18n/locale/ca/campaign.json @@ -14,6 +14,17 @@ "PLACEHOLDER": "Please enter the title of campaign", "ERROR": "Title is required" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { "LABEL": "Missatge", "PLACEHOLDER": "Please enter the message of campaign", @@ -72,6 +83,7 @@ "STATUS": "Estat", "SENDER": "Sender", "URL": "URL", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "Time(Seconds)", "CREATED_AT": "Created at" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "Habilita", - "DISABLED": "Inhabilita" + "DISABLED": "Inhabilita", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "Bot" diff --git a/app/javascript/dashboard/i18n/locale/ca/contact.json b/app/javascript/dashboard/i18n/locale/ca/contact.json index c39462d784da..680fcf59f971 100644 --- a/app/javascript/dashboard/i18n/locale/ca/contact.json +++ b/app/javascript/dashboard/i18n/locale/ca/contact.json @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "Contactes", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Cercar", "SEARCH_INPUT_PLACEHOLDER": "Cerca de contactes", "LIST": { "LOADING_MESSAGE": "Carregant contactes...", "404": "No hi ha cap contacte que coincideixi amb la vostra cerca 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Nom", "PHONE_NUMBER": "Número de telèfon", @@ -203,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Cancel·la", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/ca/conversation.json b/app/javascript/dashboard/i18n/locale/ca/conversation.json index bd4ecd3e4917..c85be15b542e 100644 --- a/app/javascript/dashboard/i18n/locale/ca/conversation.json +++ b/app/javascript/dashboard/i18n/locale/ca/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "Elimina la selecció", "DOWNLOAD": "Descarrega", "UPLOADING_ATTACHMENTS": "Pujant fitxers adjunts...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "Sense resposta", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Resoldre", "REOPEN_ACTION": "Tornar a obrir", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "Mostra l'editor de text enriquit", "TIP_EMOJI_ICON": "Mostra la selecció d'emoticones", "TIP_ATTACH_ICON": "Ajuntar fitxers", - "ENTER_TO_SEND": "Intro per enviar" + "ENTER_TO_SEND": "Intro per enviar", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Nota privada: Només és visible per tu i el vostre equip", "CHANGE_STATUS": "Estat de la conversa canviat", @@ -64,6 +69,10 @@ "SELECT_AGENT": "Seleccionar Agent", "REMOVE": "Suprimeix", "ASSIGN": "Assignar" + }, + "CONTEXT_MENU": { + "COPY": "Copia", + "DELETE": "Esborrar" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/ca/csatMgmt.json b/app/javascript/dashboard/i18n/locale/ca/csatMgmt.json new file mode 100644 index 000000000000..d7d2efc2ada6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ca/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json index 5b3ca8b2c320..2dc3d12f57da 100644 --- a/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "No hem pogut autenticar les credencials de Twilio, prova de nou" } }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." + }, "API_CHANNEL": { "TITLE": "Canal de l'API", "DESC": "Integra’t amb el canal API i comença a donar suport als teus clients.", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "Comença a reenviar els teus correus electrònics a la següent adreça electrònica." }, "AUTH": { - "TITLE": "Canals", - "DESC": "Actualment estan suportats widgets de xat en directe per a llocs web, pàgines de Facebook i perfils de Twitter. Estem treballant en més plataformes com Whatsapp, correu electrònic, Telegram i Line, que estaran disponibles en breu." + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "Agents", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Habilita", "DISABLED": "Inhabilita" + }, + "ENABLE_CSAT": { + "ENABLED": "Habilita", + "DISABLED": "Inhabilita" } }, "DELETE": { @@ -255,6 +267,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Activa l'assignació automàtica", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Configuració de la safata d'entrada", "INBOX_UPDATE_SUB_TEXT": "Actualitza la configuració de la safata d'entrada", "AUTO_ASSIGNMENT_SUB_TEXT": "Activa o desactiva l'assignació automàtica d'agents disponibles a les noves converses", diff --git a/app/javascript/dashboard/i18n/locale/ca/integrations.json b/app/javascript/dashboard/i18n/locale/ca/integrations.json index 6a155d0c2da3..af8cd6b5920b 100644 --- a/app/javascript/dashboard/i18n/locale/ca/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ca/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

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

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

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

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

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

" + } + }, "DELETE": { "BUTTON_TEXT": "Suprimeix", "API": { diff --git a/app/javascript/dashboard/i18n/locale/ca/report.json b/app/javascript/dashboard/i18n/locale/ca/report.json index b4cdbb96bf0e..6e0014f356c1 100644 --- a/app/javascript/dashboard/i18n/locale/ca/report.json +++ b/app/javascript/dashboard/i18n/locale/ca/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "Informes", + "HEADER": "Overview", "LOADING_CHART": "S'estan carregant dades del gràfic...", "NO_ENOUGH_DATA": "No hem rebut suficients punts de dades per generar l'informe. Torneu-ho a provar més endavant.", "DOWNLOAD_AGENT_REPORTS": "Descarregar Informes d'Agent", @@ -50,7 +50,41 @@ { "id": 4, "name": "Last year" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "HEADER": "CSAT Reports", + "NO_RECORDS": "There are no CSAT survey responses available.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Assigned agent", + "RATING": "Rating", + "FEEDBACK_TEXT": "Feedback comment" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/ca/settings.json b/app/javascript/dashboard/i18n/locale/ca/settings.json index 2a136cfb4914..239ff7ae123a 100644 --- a/app/javascript/dashboard/i18n/locale/ca/settings.json +++ b/app/javascript/dashboard/i18n/locale/ca/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Notificacions per correu electrònic", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "Configuració del compte", "APPLICATIONS": "Applications", "LABELS": "Etiquetes", - "TEAMS": "Equips" + "TEAMS": "Equips", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with", + "REPORTS_OVERVIEW": "Overview", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Compte nou", diff --git a/app/javascript/dashboard/i18n/locale/cs/agentMgmt.json b/app/javascript/dashboard/i18n/locale/cs/agentMgmt.json index 27a254d853d5..c9e245c09bf9 100644 --- a/app/javascript/dashboard/i18n/locale/cs/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/cs/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Nebyli nalezeni žádní agenti." + "NO_RESULTS": "Žádné výsledky." } } } diff --git a/app/javascript/dashboard/i18n/locale/cs/campaign.json b/app/javascript/dashboard/i18n/locale/cs/campaign.json index ea653d2c3e43..30aca33755fc 100644 --- a/app/javascript/dashboard/i18n/locale/cs/campaign.json +++ b/app/javascript/dashboard/i18n/locale/cs/campaign.json @@ -14,6 +14,17 @@ "PLACEHOLDER": "Please enter the title of campaign", "ERROR": "Title is required" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { "LABEL": "Zpráva", "PLACEHOLDER": "Please enter the message of campaign", @@ -72,6 +83,7 @@ "STATUS": "Stav", "SENDER": "Sender", "URL": "URL", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "Time(Seconds)", "CREATED_AT": "Created at" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "Povoleno", - "DISABLED": "Zakázáno" + "DISABLED": "Zakázáno", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "Bot" diff --git a/app/javascript/dashboard/i18n/locale/cs/contact.json b/app/javascript/dashboard/i18n/locale/cs/contact.json index 5c105ad8cc0a..abe276041f52 100644 --- a/app/javascript/dashboard/i18n/locale/cs/contact.json +++ b/app/javascript/dashboard/i18n/locale/cs/contact.json @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "Kontakty", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Hledat", "SEARCH_INPUT_PLACEHOLDER": "Hledat kontakty", "LIST": { "LOADING_MESSAGE": "Načítání kontaktů...", "404": "Vašemu hledání neodpovídají žádné kontakty 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Název", "PHONE_NUMBER": "Telefonní číslo", @@ -203,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Zrušit", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/cs/conversation.json b/app/javascript/dashboard/i18n/locale/cs/conversation.json index 14b17cf7e597..06d4ceaf2f1f 100644 --- a/app/javascript/dashboard/i18n/locale/cs/conversation.json +++ b/app/javascript/dashboard/i18n/locale/cs/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "Odstranit výběr", "DOWNLOAD": "Stáhnout", "UPLOADING_ATTACHMENTS": "Nahrávání příloh...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "Bez odpovědi", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Vyřešit", "REOPEN_ACTION": "Znovu otevřít", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "Zobrazit formátovaný textový editor", "TIP_EMOJI_ICON": "Zobrazit výběr emoji", "TIP_ATTACH_ICON": "Přiložit soubory", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Soukromá poznámka: Viditelné pouze pro vás a váš tým", "CHANGE_STATUS": "Stav konverzace byl změněn", @@ -64,6 +69,10 @@ "SELECT_AGENT": "Vybrat agenta", "REMOVE": "Odebrat", "ASSIGN": "Přiřadit" + }, + "CONTEXT_MENU": { + "COPY": "Kopírovat", + "DELETE": "Vymazat" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/cs/csatMgmt.json b/app/javascript/dashboard/i18n/locale/cs/csatMgmt.json new file mode 100644 index 000000000000..d7d2efc2ada6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/cs/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/cs/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/cs/inboxMgmt.json index 559352bcc24d..a65d5d056d7d 100644 --- a/app/javascript/dashboard/i18n/locale/cs/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/cs/inboxMgmt.json @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "Nebyli jsme schopni ověřit přihlašovací údaje Twilia, zkuste to prosím znovu" } }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." + }, "API_CHANNEL": { "TITLE": "API Channel", "DESC": "Integrate with API channel and start supporting your customers.", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "Start forwarding your emails to the following email address." }, "AUTH": { - "TITLE": "Kanály", - "DESC": "V současné době podporujeme jako platformu widgety živého chatu, Facebook stránky a Twitter profily. Máme více platforem jako Whatsapp, Email, Telegram a Line v dílech, což bude brzy ven." + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "Agenti", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Povoleno", "DISABLED": "Zakázáno" + }, + "ENABLE_CSAT": { + "ENABLED": "Povoleno", + "DISABLED": "Zakázáno" } }, "DELETE": { @@ -255,6 +267,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Povolit automatické přiřazení", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Nastavení doručené pošty", "INBOX_UPDATE_SUB_TEXT": "Aktualizujte nastavení doručené pošty", "AUTO_ASSIGNMENT_SUB_TEXT": "Povolit nebo zakázat automatické přiřazování nových konverzací agentům přidaným do této schránky.", diff --git a/app/javascript/dashboard/i18n/locale/cs/integrations.json b/app/javascript/dashboard/i18n/locale/cs/integrations.json index 86fa337b79e1..7cf53accb1a9 100644 --- a/app/javascript/dashboard/i18n/locale/cs/integrations.json +++ b/app/javascript/dashboard/i18n/locale/cs/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

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

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

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

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

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

" + } + }, "DELETE": { "BUTTON_TEXT": "Vymazat", "API": { diff --git a/app/javascript/dashboard/i18n/locale/cs/report.json b/app/javascript/dashboard/i18n/locale/cs/report.json index fb8d544c54f9..7339aaebf428 100644 --- a/app/javascript/dashboard/i18n/locale/cs/report.json +++ b/app/javascript/dashboard/i18n/locale/cs/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "Zprávy", + "HEADER": "Overview", "LOADING_CHART": "Načítání dat mapy...", "NO_ENOUGH_DATA": "Pro vytvoření hlášení jsme neobdrželi dostatek dat, zkuste to prosím později.", "DOWNLOAD_AGENT_REPORTS": "Stáhnout reporty agentů", @@ -50,7 +50,41 @@ { "id": 4, "name": "Last year" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "HEADER": "CSAT Reports", + "NO_RECORDS": "There are no CSAT survey responses available.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Assigned agent", + "RATING": "Rating", + "FEEDBACK_TEXT": "Feedback comment" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/cs/settings.json b/app/javascript/dashboard/i18n/locale/cs/settings.json index 059c2fd1dd06..15aa82d5add8 100644 --- a/app/javascript/dashboard/i18n/locale/cs/settings.json +++ b/app/javascript/dashboard/i18n/locale/cs/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "Nic", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "E-mailová oznámení", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "Nastavení účtu", "APPLICATIONS": "Applications", "LABELS": "Štítky", - "TEAMS": "Týmy" + "TEAMS": "Týmy", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with", + "REPORTS_OVERVIEW": "Overview", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Nový účet", diff --git a/app/javascript/dashboard/i18n/locale/da/agentMgmt.json b/app/javascript/dashboard/i18n/locale/da/agentMgmt.json index 323d54a2a660..ccc198e168b3 100644 --- a/app/javascript/dashboard/i18n/locale/da/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/da/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Ingen agenter fundet." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/da/campaign.json b/app/javascript/dashboard/i18n/locale/da/campaign.json index 11560f1e6895..d9178eb31241 100644 --- a/app/javascript/dashboard/i18n/locale/da/campaign.json +++ b/app/javascript/dashboard/i18n/locale/da/campaign.json @@ -14,6 +14,17 @@ "PLACEHOLDER": "Please enter the title of campaign", "ERROR": "Title is required" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { "LABEL": "Message", "PLACEHOLDER": "Please enter the message of campaign", @@ -72,6 +83,7 @@ "STATUS": "Status", "SENDER": "Sender", "URL": "URL", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "Time(Seconds)", "CREATED_AT": "Created at" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "Aktiveret", - "DISABLED": "Deaktiveret" + "DISABLED": "Deaktiveret", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "Bot" diff --git a/app/javascript/dashboard/i18n/locale/da/contact.json b/app/javascript/dashboard/i18n/locale/da/contact.json index a678d9a6e4af..e93030c61fd7 100644 --- a/app/javascript/dashboard/i18n/locale/da/contact.json +++ b/app/javascript/dashboard/i18n/locale/da/contact.json @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "Kontakter", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Søg", "SEARCH_INPUT_PLACEHOLDER": "Søg efter kontakter", "LIST": { "LOADING_MESSAGE": "Indlæser kontakter...", "404": "Ingen kontakter matcher din søgning 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Navn", "PHONE_NUMBER": "Telefonnummer", @@ -203,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Annuller", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/da/conversation.json b/app/javascript/dashboard/i18n/locale/da/conversation.json index b6e38aa30390..7b2765263b7d 100644 --- a/app/javascript/dashboard/i18n/locale/da/conversation.json +++ b/app/javascript/dashboard/i18n/locale/da/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "Fjern Markering", "DOWNLOAD": "Download", "UPLOADING_ATTACHMENTS": "Uploading attachments...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Løs", "REOPEN_ACTION": "Genåben", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Privat Note: Kun synlig for dig og dit team", "CHANGE_STATUS": "Samtalestatus ændret", @@ -64,6 +69,10 @@ "SELECT_AGENT": "Select Agent", "REMOVE": "Fjern", "ASSIGN": "Assign" + }, + "CONTEXT_MENU": { + "COPY": "Kopiér", + "DELETE": "Slet" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/da/csatMgmt.json b/app/javascript/dashboard/i18n/locale/da/csatMgmt.json new file mode 100644 index 000000000000..d7d2efc2ada6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/da/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/da/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/da/inboxMgmt.json index d8178b2097c9..2a0f782970e7 100644 --- a/app/javascript/dashboard/i18n/locale/da/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/da/inboxMgmt.json @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "Vi var ikke i stand til at godkende Twilio legitimationsoplysninger, prøv igen" } }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." + }, "API_CHANNEL": { "TITLE": "API Kanal", "DESC": "Integrer med API-kanal og begynd at supportere dine kunder.", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "Begynd at videresende dine e-mails til følgende e-mailadresse." }, "AUTH": { - "TITLE": "Kanaler", - "DESC": "Currently we support Website live chat widgets, Facebook Pages and Twitter profiles as platforms. We have more platforms like Whatsapp, Email, Telegram and Line in the works, which will be out soon." + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "Agenter", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Aktiveret", "DISABLED": "Deaktiveret" + }, + "ENABLE_CSAT": { + "ENABLED": "Aktiveret", + "DISABLED": "Deaktiveret" } }, "DELETE": { @@ -255,6 +267,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Aktiver automatisk tildeling", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Indbakke Indstillinger", "INBOX_UPDATE_SUB_TEXT": "Opdater dine indbakkeindstillinger", "AUTO_ASSIGNMENT_SUB_TEXT": "Aktiver eller deaktiver automatisk tildeling af nye samtaler til agenter tilføjet til denne indbakke.", diff --git a/app/javascript/dashboard/i18n/locale/da/integrations.json b/app/javascript/dashboard/i18n/locale/da/integrations.json index 42d160f93d13..3d8b0629cb5c 100644 --- a/app/javascript/dashboard/i18n/locale/da/integrations.json +++ b/app/javascript/dashboard/i18n/locale/da/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

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

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

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

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

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

" + } + }, "DELETE": { "BUTTON_TEXT": "Slet", "API": { diff --git a/app/javascript/dashboard/i18n/locale/da/report.json b/app/javascript/dashboard/i18n/locale/da/report.json index 3eeb40f7f6ae..32705efaeee6 100644 --- a/app/javascript/dashboard/i18n/locale/da/report.json +++ b/app/javascript/dashboard/i18n/locale/da/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "Rapporter", + "HEADER": "Overview", "LOADING_CHART": "Indlæser diagramdata...", "NO_ENOUGH_DATA": "Vi har ikke modtaget nok datapunkter til at generere rapport. Prøv igen senere.", "DOWNLOAD_AGENT_REPORTS": "Download agent reports", @@ -50,7 +50,41 @@ { "id": 4, "name": "Last year" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "HEADER": "CSAT Reports", + "NO_RECORDS": "There are no CSAT survey responses available.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Assigned agent", + "RATING": "Rating", + "FEEDBACK_TEXT": "Feedback comment" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/da/settings.json b/app/javascript/dashboard/i18n/locale/da/settings.json index fd2aecb8a4cc..3d062cd7186c 100644 --- a/app/javascript/dashboard/i18n/locale/da/settings.json +++ b/app/javascript/dashboard/i18n/locale/da/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "E-Mail Notifikationer", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "Kontoindstillinger", "APPLICATIONS": "Applications", "LABELS": "Etiketter", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with", + "REPORTS_OVERVIEW": "Overview", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Ny Konto", diff --git a/app/javascript/dashboard/i18n/locale/de/agentMgmt.json b/app/javascript/dashboard/i18n/locale/de/agentMgmt.json index dd996a20e8c6..3e3cbd234ec6 100644 --- a/app/javascript/dashboard/i18n/locale/de/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/de/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Keine Agenten gefunden." + "NO_RESULTS": "Keine Ergebnisse gefunden." } } } diff --git a/app/javascript/dashboard/i18n/locale/de/campaign.json b/app/javascript/dashboard/i18n/locale/de/campaign.json index b990f8ca49f1..ffa54f4c7153 100644 --- a/app/javascript/dashboard/i18n/locale/de/campaign.json +++ b/app/javascript/dashboard/i18n/locale/de/campaign.json @@ -14,6 +14,17 @@ "PLACEHOLDER": "Bitte geben Sie den Titel der Kampagne ein", "ERROR": "Titel ist erforderlich" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { "LABEL": "Nachricht", "PLACEHOLDER": "Bitte geben Sie die Nachricht der Kampagne ein", @@ -72,6 +83,7 @@ "STATUS": "Status", "SENDER": "Absender", "URL": "URL", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "Zeit (Sekunden)", "CREATED_AT": "Erstellt am" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "Aktiviert", - "DISABLED": "Behindert" + "DISABLED": "Behindert", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "Bot" diff --git a/app/javascript/dashboard/i18n/locale/de/contact.json b/app/javascript/dashboard/i18n/locale/de/contact.json index b81a85a2da85..d2bba01bb83e 100644 --- a/app/javascript/dashboard/i18n/locale/de/contact.json +++ b/app/javascript/dashboard/i18n/locale/de/contact.json @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "Kontakte", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Suchen", "SEARCH_INPUT_PLACEHOLDER": "Suche nach Kontakten", "LIST": { "LOADING_MESSAGE": "Kontakte werden geladen...", "404": "Keine Kontakte entsprechend Deiner Suche gefunden 🔍", + "NO_CONTACTS": "Keine Kontakte verfügbar", "TABLE_HEADER": { "NAME": "Name", "PHONE_NUMBER": "Telefonnummer", @@ -203,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Stornieren", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/de/conversation.json b/app/javascript/dashboard/i18n/locale/de/conversation.json index 757798fa9ebd..0290d66a1a05 100644 --- a/app/javascript/dashboard/i18n/locale/de/conversation.json +++ b/app/javascript/dashboard/i18n/locale/de/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "Auswahl entfernen", "DOWNLOAD": "Herunterladen", "UPLOADING_ATTACHMENTS": "Anhänge werden hochgeladen...", + "SUCCESS_DELETE_MESSAGE": "Nachricht erfolgreich gelöscht", + "FAIL_DELETE_MESSSAGE": "Nachricht konnte nicht gelöscht werden! Versuche es erneut", "NO_RESPONSE": "Keine Antwort", + "RATING_TITLE": "Bewertung", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Fall schließen", "REOPEN_ACTION": "Wieder öffnen", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "Rich Text Editor anzeigen", "TIP_EMOJI_ICON": "Emoji-Auswahl anzeigen", "TIP_ATTACH_ICON": "Dateien anhängen", - "ENTER_TO_SEND": "Zum senden ENTER drücken" + "ENTER_TO_SEND": "Zum senden ENTER drücken", + "DRAG_DROP": "Ziehen und Ablegen hierher, um anzuhängen" }, "VISIBLE_TO_AGENTS": "Privater Hinweis: Nur für Sie und Ihr Team sichtbar", "CHANGE_STATUS": "Gesprächsstatus geändert", @@ -64,6 +69,10 @@ "SELECT_AGENT": "Agent auswählen", "REMOVE": "Entfernen", "ASSIGN": "Zuordnen" + }, + "CONTEXT_MENU": { + "COPY": "Kopieren", + "DELETE": "Löschen" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/de/csatMgmt.json b/app/javascript/dashboard/i18n/locale/de/csatMgmt.json new file mode 100644 index 000000000000..d7d2efc2ada6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/de/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json index fb842b085141..63d603b08459 100644 --- a/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json @@ -34,7 +34,7 @@ }, "WEBSITE_NAME": { "LABEL": "Webseiten-Name", - "PLACEHOLDER": "Geben Sie den Namen Ihrer Website ein (eg: Acme Inc)" + "PLACEHOLDER": "Geben Sie den Namen Ihrer Website ein (zum Beispiel: Acme Inc)" }, "FB": { "HELP": "PS: Durch die Anmeldung erhalten wir nur Zugriff auf die Nachrichten Ihrer Seite. Auf Ihre privaten Nachrichten kann Chatwoot niemals zugreifen.", @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "Wir konnten die Twilio-Anmeldeinformationen nicht authentifizieren. Bitte versuchen Sie es erneut" } }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." + }, "API_CHANNEL": { "TITLE": "API-Kanal", "DESC": "Integrieren Sie einen API-Kanal und starten Sie mit der Unterstützung Ihrer Kunden.", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "Starten Sie die Weiterleitung Ihrer E-Mails an die folgende E-Mail-Adresse." }, "AUTH": { - "TITLE": "Kanäle", - "DESC": "Derzeit unterstützen wir Website-Live-Chat-Widgets, Facebook-Seiten und Twitter-Profile als Plattformen. Wir haben weitere Plattformen wie WhatsApp, Email, Telegram und Line in Arbeit, die bald veröffentlicht werden." + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "Agenten", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Aktiviert", "DISABLED": "Behindert" + }, + "ENABLE_CSAT": { + "ENABLED": "Aktiviert", + "DISABLED": "Behindert" } }, "DELETE": { @@ -255,6 +267,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "E-Mail-Sammelbox aktivieren", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Aktiviere oder deaktiviere die E-Mail-Sammelbox bei einer neuen Unterhaltung", "AUTO_ASSIGNMENT": "Aktivieren Sie die automatische Zuweisung", + "ENABLE_CSAT": "CSAT aktivieren", + "ENABLE_CSAT_SUB_TEXT": "CSAT(Kundenzufriedenheit) Umfrage aktivieren/deaktivieren nach Abschluss eines Gesprächs", "INBOX_UPDATE_TITLE": "Posteingangseinstellungen", "INBOX_UPDATE_SUB_TEXT": "Posteingangseinstellungen aktualisieren", "AUTO_ASSIGNMENT_SUB_TEXT": "Aktivieren oder deaktivieren Sie die automatische Zuweisung verfügbarer Agenten für neue Konversationen", diff --git a/app/javascript/dashboard/i18n/locale/de/integrations.json b/app/javascript/dashboard/i18n/locale/de/integrations.json index a330bd22168b..2de48e7fc8b1 100644 --- a/app/javascript/dashboard/i18n/locale/de/integrations.json +++ b/app/javascript/dashboard/i18n/locale/de/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Nutzung von Slack Integration", + "BODY": "

Chatwoot wird nun alle eingehenden Unterhaltungen in den Kundengespräche Channel innerhalb Ihres Slack Arbeitsplatzes synchronisieren.

Wenn Sie in Kunden-Konversationen antworten, wird der Slack Kanal eine Antwort an den Kunden durch Chat erzeugen.

Starten Sie die Antworten mit Notiz: um private Notizen anstatt Antworten zu erstellen.

Wenn der Replier auf Slack ein Agentenprofil im Chatwoot unter der gleichen E-Mail hat, werden die Antworten entsprechend assoziiert.

Wenn der Replier kein Agentenprofil hat, werden die Antworten aus dem Bot-Profil getätigt.

" + } + }, "DELETE": { "BUTTON_TEXT": "Löschen", "API": { diff --git a/app/javascript/dashboard/i18n/locale/de/report.json b/app/javascript/dashboard/i18n/locale/de/report.json index 6dadebd7cef4..e226469e6785 100644 --- a/app/javascript/dashboard/i18n/locale/de/report.json +++ b/app/javascript/dashboard/i18n/locale/de/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "Berichte", + "HEADER": "Overview", "LOADING_CHART": "Diagrammdaten laden ...", "NO_ENOUGH_DATA": "Wir haben nicht genügend Datenpunkte erhalten, um einen Bericht zu erstellen. Bitte versuchen Sie es später erneut.", "DOWNLOAD_AGENT_REPORTS": "Agenten-Berichte herunterladen", @@ -50,7 +50,41 @@ { "id": 4, "name": "Letztes Jahr" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "HEADER": "CSAT Reports", + "NO_RECORDS": "There are no CSAT survey responses available.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Assigned agent", + "RATING": "Bewertung", + "FEEDBACK_TEXT": "Feedback comment" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/de/settings.json b/app/javascript/dashboard/i18n/locale/de/settings.json index 02480427b377..032769a45cdb 100644 --- a/app/javascript/dashboard/i18n/locale/de/settings.json +++ b/app/javascript/dashboard/i18n/locale/de/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio-Benachrichtigungen", "NOTE": "Audio-Benachrichtigungen im Dashboard für neue Nachrichten und Unterhaltungen aktivieren.", - "ENABLE_AUDIO": "Audio-Benachrichtigung abspielen, wenn eine neue Unterhaltung erstellt wurde oder neue Nachrichten eintreffen" + "NONE": "Keine", + "ASSIGNED": "Zugewiesene Unterhaltungen", + "ALL_CONVERSATIONS": "Alle Unterhaltungen" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "E-Mail Benachrichtigungen", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "Kontoeinstellungen", "APPLICATIONS": "Anwendungen", "LABELS": "Labels", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with", + "REPORTS_OVERVIEW": "Overview", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Neuer Account", diff --git a/app/javascript/dashboard/i18n/locale/el/agentMgmt.json b/app/javascript/dashboard/i18n/locale/el/agentMgmt.json index 80c935285997..c580772d336e 100644 --- a/app/javascript/dashboard/i18n/locale/el/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/el/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Δεν βρέθηκαν Πράκτορες." + "NO_RESULTS": "Δεν βρέθηκαν αποτελέσματα." } } } diff --git a/app/javascript/dashboard/i18n/locale/el/campaign.json b/app/javascript/dashboard/i18n/locale/el/campaign.json index e74e217e45ff..f48c52be47fe 100644 --- a/app/javascript/dashboard/i18n/locale/el/campaign.json +++ b/app/javascript/dashboard/i18n/locale/el/campaign.json @@ -14,6 +14,17 @@ "PLACEHOLDER": "Παρακαλώ εισάγετε τον τίτλο της καμπάνιας", "ERROR": "Ο τίτλος είναι απαραίτητος" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { "LABEL": "Μήνυμα", "PLACEHOLDER": "Παρακαλώ εισάγετε το μήνυμα της καμπάνιας", @@ -72,6 +83,7 @@ "STATUS": "Κατάσταση", "SENDER": "Αποστολέας", "URL": "URL", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "Χρόνος (δευτερόλεπτα)", "CREATED_AT": "Δημιουργήθηκε στις" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "Ενεργό", - "DISABLED": "Ανενεργό" + "DISABLED": "Ανενεργό", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "Bot" diff --git a/app/javascript/dashboard/i18n/locale/el/contact.json b/app/javascript/dashboard/i18n/locale/el/contact.json index 1e50c3f9f1d7..8d81e021268f 100644 --- a/app/javascript/dashboard/i18n/locale/el/contact.json +++ b/app/javascript/dashboard/i18n/locale/el/contact.json @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "Επαφές", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Αναζήτηση", "SEARCH_INPUT_PLACEHOLDER": "Αναζήτηση Επαφών", "LIST": { "LOADING_MESSAGE": "Φόρτωση επαφών...", "404": "Δεν υπάρχουν επαφές που να αντιστοιχούν με την αναζήτησή σας 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Όνομα", "PHONE_NUMBER": "Αριθμός Τηλεφώνου", @@ -203,5 +205,33 @@ "PLACEHOLDER": "π.χ.: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Άκυρο", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/el/conversation.json b/app/javascript/dashboard/i18n/locale/el/conversation.json index 0b8925564bcc..fab77400ddff 100644 --- a/app/javascript/dashboard/i18n/locale/el/conversation.json +++ b/app/javascript/dashboard/i18n/locale/el/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "Διαγραφή Επιλογής", "DOWNLOAD": "Κατέβασμα", "UPLOADING_ATTACHMENTS": "Ανέβασμα επισυναπτόμενων...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "Καμία ανταπόκριση", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Επίλυση", "REOPEN_ACTION": "Επαναφορά", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "Προβολή επεξεργαστή εμπλουτισμένου κειμένου", "TIP_EMOJI_ICON": "Προβολή επιλογέα emoji", "TIP_ATTACH_ICON": "Επισύναψη αρχείων", - "ENTER_TO_SEND": "Εισαγωγή για αποστολή" + "ENTER_TO_SEND": "Εισαγωγή για αποστολή", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Ιδιωτική Σημείωση: Ορατή μόνο σε σας και την ομάδα σας", "CHANGE_STATUS": "Η κατάσταση της συνομιλίας άλλαξε", @@ -64,6 +69,10 @@ "SELECT_AGENT": "Επιλογή πράκτορα", "REMOVE": "Διαγραφή", "ASSIGN": "Αντιστοίχιση" + }, + "CONTEXT_MENU": { + "COPY": "Αντιγραφή", + "DELETE": "Διαγραφή" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/el/csatMgmt.json b/app/javascript/dashboard/i18n/locale/el/csatMgmt.json new file mode 100644 index 000000000000..d7d2efc2ada6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/el/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json index 30812408f0b9..5e0e38abda0a 100644 --- a/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "Δεν ήταν δυνατή η πιστοποίηση των διαπιστευτηρίων Twilio. Δοκιμάστε ξανά" } }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." + }, "API_CHANNEL": { "TITLE": "Κανάλι API", "DESC": "Ενσωματώστε ένα κανάλι APΙ και ξεκινήσετε την υποστήριξη των πελατών σας.", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "Προώθηση των email σας στην ακόλουθη διεύθυνση email." }, "AUTH": { - "TITLE": "Κανάλια", - "DESC": "Επί του παρόντος υποστηρίζονται widgets για Ιστοσελίδες, και σελίδες Facebook, Προφίλ Twitter ως πλατφόρμες. Έχουμε ακόμη περισσότερες πλατφόρμες όπως Whatsapp, Email, Telegram and Line υπό ανάπτυξη, οι οποίες θα είναι διαθέσιμες σύντομα." + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "Πράκτορες", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Ενεργό", "DISABLED": "Ανενεργό" + }, + "ENABLE_CSAT": { + "ENABLED": "Ενεργό", + "DISABLED": "Ανενεργό" } }, "DELETE": { @@ -255,6 +267,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Ενεργοποιήσετε το πλαίσιο συλλογής email", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Ενεργοποίηση ή απενεργοποίηση του πλαισίου συλλογής μηνυμάτων ηλεκτρονικού ταχυδρομείου στη νέα συνομιλία", "AUTO_ASSIGNMENT": "Επιτρέπεται η αυτόματη αντιστοίχιση", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Ρυθμίσεις Κιβωτίου", "INBOX_UPDATE_SUB_TEXT": "Ενημερώστε τις ρυθμίσεις του κιβωτίου σας", "AUTO_ASSIGNMENT_SUB_TEXT": "Ενεργοποιήστε ή απενεργοποιήστε την αυτόματη αντιστοίχιση των νέων συζητήσεων στους πράκτορες αυτού του κιβωτίου.", diff --git a/app/javascript/dashboard/i18n/locale/el/integrations.json b/app/javascript/dashboard/i18n/locale/el/integrations.json index 7f5f7b6f2e3a..c8fdee29f865 100644 --- a/app/javascript/dashboard/i18n/locale/el/integrations.json +++ b/app/javascript/dashboard/i18n/locale/el/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

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

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

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

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

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

" + } + }, "DELETE": { "BUTTON_TEXT": "Διαγραφή", "API": { diff --git a/app/javascript/dashboard/i18n/locale/el/report.json b/app/javascript/dashboard/i18n/locale/el/report.json index 62cf653bbbb4..d5b87e4d60fe 100644 --- a/app/javascript/dashboard/i18n/locale/el/report.json +++ b/app/javascript/dashboard/i18n/locale/el/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "Αναφορές", + "HEADER": "Overview", "LOADING_CHART": "Φόρτωση δεδομένων γραφήματος...", "NO_ENOUGH_DATA": "Δεν έχουν ληφθεί αρκετά σημεία δεδομένων για την δημιουργία της αναφοράς, Παρακαλώ προσπαθήστε αργότερα.", "DOWNLOAD_AGENT_REPORTS": "Κατέβασμα αναφορών πράκτορα", @@ -50,7 +50,41 @@ { "id": 4, "name": "Τελευταίο έτος" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "HEADER": "CSAT Reports", + "NO_RECORDS": "There are no CSAT survey responses available.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Assigned agent", + "RATING": "Rating", + "FEEDBACK_TEXT": "Feedback comment" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/el/settings.json b/app/javascript/dashboard/i18n/locale/el/settings.json index d6875e198580..46e650abb78d 100644 --- a/app/javascript/dashboard/i18n/locale/el/settings.json +++ b/app/javascript/dashboard/i18n/locale/el/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Ειδοποιήσεις Ήχου", "NOTE": "Ενεργοποίηση ηχητικών ειδοποιήσεων για νέα μηνύματα και συνομιλίες.", - "ENABLE_AUDIO": "Αναπαραγωγή ηχητικής ειδοποίησης όταν δημιουργείται μια νέα συνομιλία ή φτάνουν νέα μηνύματα" + "NONE": "Κανένα", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Ειδοποιήσεις Email", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "Ρυθμίσεις Λογαριασμού", "APPLICATIONS": "Εφαρμογές", "LABELS": "Ετικέτες", - "TEAMS": "Ομάδες" + "TEAMS": "Ομάδες", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with", + "REPORTS_OVERVIEW": "Overview", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Νέος Λογαριασμός", diff --git a/app/javascript/dashboard/i18n/locale/en/agentMgmt.json b/app/javascript/dashboard/i18n/locale/en/agentMgmt.json index ac4a62127e6e..dcc8c9fdaafa 100644 --- a/app/javascript/dashboard/i18n/locale/en/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/en/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "No agents found." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/en/campaign.json b/app/javascript/dashboard/i18n/locale/en/campaign.json index f1c2496691fd..95ed4d199d86 100644 --- a/app/javascript/dashboard/i18n/locale/en/campaign.json +++ b/app/javascript/dashboard/i18n/locale/en/campaign.json @@ -14,6 +14,17 @@ "PLACEHOLDER": "Please enter the title of campaign", "ERROR": "Title is required" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { "LABEL": "Message", "PLACEHOLDER": "Please enter the message of campaign", @@ -72,6 +83,7 @@ "STATUS": "Status", "SENDER": "Sender", "URL": "URL", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "Time(Seconds)", "CREATED_AT": "Created at" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "Enabled", - "DISABLED": "Disabled" + "DISABLED": "Disabled", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "Bot" diff --git a/app/javascript/dashboard/i18n/locale/en/contact.json b/app/javascript/dashboard/i18n/locale/en/contact.json index 84e6303fc46a..051aad27ee02 100644 --- a/app/javascript/dashboard/i18n/locale/en/contact.json +++ b/app/javascript/dashboard/i18n/locale/en/contact.json @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "Contacts", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Search", "SEARCH_INPUT_PLACEHOLDER": "Search for contacts", "LIST": { "LOADING_MESSAGE": "Loading contacts...", "404": "No contacts matches your search 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Name", "PHONE_NUMBER": "Phone Number", @@ -203,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Cancel", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/en/conversation.json b/app/javascript/dashboard/i18n/locale/en/conversation.json index 976d1395a231..81c023aa5460 100644 --- a/app/javascript/dashboard/i18n/locale/en/conversation.json +++ b/app/javascript/dashboard/i18n/locale/en/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "Remove Selection", "DOWNLOAD": "Download", "UPLOADING_ATTACHMENTS": "Uploading attachments...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Resolve", "REOPEN_ACTION": "Reopen", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team", "CHANGE_STATUS": "Conversation status changed", @@ -64,6 +69,10 @@ "SELECT_AGENT": "Select Agent", "REMOVE": "Remove", "ASSIGN": "Assign" + }, + "CONTEXT_MENU": { + "COPY": "Copy", + "DELETE": "Delete" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/en/csatMgmt.json b/app/javascript/dashboard/i18n/locale/en/csatMgmt.json new file mode 100644 index 000000000000..d7d2efc2ada6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/en/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json index 8948adfc4865..aef8d130992e 100644 --- a/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json @@ -126,6 +126,14 @@ "API": { "ERROR_MESSAGE": "We were not able to authenticate Twilio credentials, please try again" } + }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." }, "API_CHANNEL": { "TITLE": "API Channel", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "Start forwarding your emails to the following email address." }, "AUTH": { - "TITLE": "Channels", - "DESC": "Currently, we support Website live chat widgets, Facebook Pages, Twitter profiles and Whatsapp as platforms. We have more platforms like Email, Telegram and Line in the works, which will be out soon." + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "Agents", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Enabled", "DISABLED": "Disabled" + }, + "ENABLE_CSAT": { + "ENABLED": "Enabled", + "DISABLED": "Disabled" } }, "DELETE": { @@ -255,6 +267,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Enable auto assignment", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Inbox Settings", "INBOX_UPDATE_SUB_TEXT": "Update your inbox settings", "AUTO_ASSIGNMENT_SUB_TEXT": "Enable or disable the automatic assignment of new conversations to the agents added to this inbox.", diff --git a/app/javascript/dashboard/i18n/locale/en/index.js b/app/javascript/dashboard/i18n/locale/en/index.js index 4afba79aa73d..4203b60ff4dd 100644 --- a/app/javascript/dashboard/i18n/locale/en/index.js +++ b/app/javascript/dashboard/i18n/locale/en/index.js @@ -16,6 +16,7 @@ import { default as _settings } from './settings.json'; import { default as _signup } from './signup.json'; import { default as _teamsSettings } from './teamsSettings.json'; import { default as _integrationApps } from './integrationApps.json'; +import { default as _csatMgmtMgmt } from './csatMgmt.json'; export default { ..._agentMgmt, @@ -36,4 +37,5 @@ export default { ..._signup, ..._teamsSettings, ..._integrationApps, + ..._csatMgmtMgmt, }; diff --git a/app/javascript/dashboard/i18n/locale/en/integrations.json b/app/javascript/dashboard/i18n/locale/en/integrations.json index cbbe0ebbfc61..4562183c77aa 100644 --- a/app/javascript/dashboard/i18n/locale/en/integrations.json +++ b/app/javascript/dashboard/i18n/locale/en/integrations.json @@ -63,6 +63,12 @@ } } }, + "SLACK": { + "HELP_TEXT" : { + "TITLE": "Using Slack Integration", + "BODY": "

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

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

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

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

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

" + } + }, "DELETE": { "BUTTON_TEXT": "Delete", "API": { diff --git a/app/javascript/dashboard/i18n/locale/en/report.json b/app/javascript/dashboard/i18n/locale/en/report.json index cf2c14a57f91..b4c205477a76 100644 --- a/app/javascript/dashboard/i18n/locale/en/report.json +++ b/app/javascript/dashboard/i18n/locale/en/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "Reports", + "HEADER": "Overview", "LOADING_CHART": "Loading chart data...", "NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.", "DOWNLOAD_AGENT_REPORTS": "Download agent reports", @@ -50,7 +50,41 @@ { "id": 4, "name": "Last year" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "HEADER": "CSAT Reports", + "NO_RECORDS": "There are no CSAT survey responses available.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Assigned agent", + "RATING": "Rating", + "FEEDBACK_TEXT": "Feedback comment" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/en/settings.json b/app/javascript/dashboard/i18n/locale/en/settings.json index c7bb0cb6debf..988f2792329b 100644 --- a/app/javascript/dashboard/i18n/locale/en/settings.json +++ b/app/javascript/dashboard/i18n/locale/en/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Email Notifications", @@ -135,7 +137,11 @@ "ACCOUNT_SETTINGS": "Account Settings", "APPLICATIONS": "Applications", "LABELS": "Labels", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with", + "REPORTS_OVERVIEW": "Overview", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "New Account", diff --git a/app/javascript/dashboard/i18n/locale/es/agentMgmt.json b/app/javascript/dashboard/i18n/locale/es/agentMgmt.json index 4c8fc3226e08..d089308c6d00 100644 --- a/app/javascript/dashboard/i18n/locale/es/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/es/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "No se encontraron agentes." + "NO_RESULTS": "No se encontraron resultados." } } } diff --git a/app/javascript/dashboard/i18n/locale/es/campaign.json b/app/javascript/dashboard/i18n/locale/es/campaign.json index 90a461be569f..8ff4a9fa3ee6 100644 --- a/app/javascript/dashboard/i18n/locale/es/campaign.json +++ b/app/javascript/dashboard/i18n/locale/es/campaign.json @@ -14,6 +14,17 @@ "PLACEHOLDER": "Por favor escriba un título para la campaña", "ERROR": "El título es obligatorio" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { "LABEL": "Mensaje", "PLACEHOLDER": "Por favor escriba el mensaje para la campaña", @@ -72,6 +83,7 @@ "STATUS": "Estado", "SENDER": "Remitente", "URL": "URL", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "Tiempo (segundos)", "CREATED_AT": "Creado el" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "Activado", - "DISABLED": "Deshabilitado" + "DISABLED": "Deshabilitado", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "Bot" diff --git a/app/javascript/dashboard/i18n/locale/es/contact.json b/app/javascript/dashboard/i18n/locale/es/contact.json index 6bf649381ded..ce03e674f94b 100644 --- a/app/javascript/dashboard/i18n/locale/es/contact.json +++ b/app/javascript/dashboard/i18n/locale/es/contact.json @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "Contactos", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Buscar", "SEARCH_INPUT_PLACEHOLDER": "Buscar contactos", "LIST": { "LOADING_MESSAGE": "Cargando contactos...", "404": "No hay contactos que coincidan con tu búsqueda 🔍", + "NO_CONTACTS": "No hay contactos disponibles", "TABLE_HEADER": { "NAME": "Nombre", "PHONE_NUMBER": "Número telefónico", @@ -203,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Cancelar", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/es/conversation.json b/app/javascript/dashboard/i18n/locale/es/conversation.json index 0b7318d67e50..23a79a373fd6 100644 --- a/app/javascript/dashboard/i18n/locale/es/conversation.json +++ b/app/javascript/dashboard/i18n/locale/es/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "Eliminar selección", "DOWNLOAD": "Descargar", "UPLOADING_ATTACHMENTS": "Subiendo archivos adjuntos...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No hay respuesta", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Resolver", "REOPEN_ACTION": "Reabrir", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "Mostrar editor de textos", "TIP_EMOJI_ICON": "Mostrar selector de emoji", "TIP_ATTACH_ICON": "Adjuntar archivos", - "ENTER_TO_SEND": "Ingresar para enviar" + "ENTER_TO_SEND": "Ingresar para enviar", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Nota privada: solo visible para ti y tu equipo", "CHANGE_STATUS": "Estado de la conversación cambiado", @@ -64,6 +69,10 @@ "SELECT_AGENT": "Seleccionar agente", "REMOVE": "Eliminar", "ASSIGN": "Asignar" + }, + "CONTEXT_MENU": { + "COPY": "Copiar", + "DELETE": "Eliminar" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/es/csatMgmt.json b/app/javascript/dashboard/i18n/locale/es/csatMgmt.json new file mode 100644 index 000000000000..d7d2efc2ada6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/es/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/es/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/es/inboxMgmt.json index c9dc764f4f13..9b7154c8c811 100644 --- a/app/javascript/dashboard/i18n/locale/es/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/es/inboxMgmt.json @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "No pudimos autenticar credenciales de Twilio, por favor inténtalo de nuevo" } }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." + }, "API_CHANNEL": { "TITLE": "Canal API", "DESC": "Integre con API channel y comienze a dar soporte a sus clientes.", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "Empieze a reenviar su emails a la siguiente dirección de email." }, "AUTH": { - "TITLE": "Canales", - "DESC": "Actualmente soportamos widgets de chat en vivo, páginas de Facebook y perfiles de Twitter como plataformas. Tenemos más plataformas como Whatsapp, Email, Telegram y Línea en las obras, que estarán en breve." + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "Agentes", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Activado", "DISABLED": "Deshabilitado" + }, + "ENABLE_CSAT": { + "ENABLED": "Activado", + "DISABLED": "Deshabilitado" } }, "DELETE": { @@ -255,6 +267,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Activar 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", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Ajustes de la Bandeja de Entrada", "INBOX_UPDATE_SUB_TEXT": "Actualizar la configuración de tu bandeja de entrada", "AUTO_ASSIGNMENT_SUB_TEXT": "Activar o desactivar la asignación automática de nuevas conversaciones a los agentes añadidos a esta bandeja de entrada.", diff --git a/app/javascript/dashboard/i18n/locale/es/integrations.json b/app/javascript/dashboard/i18n/locale/es/integrations.json index c22a1582d738..4646f140f10a 100644 --- a/app/javascript/dashboard/i18n/locale/es/integrations.json +++ b/app/javascript/dashboard/i18n/locale/es/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

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

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

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

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

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

" + } + }, "DELETE": { "BUTTON_TEXT": "Eliminar", "API": { diff --git a/app/javascript/dashboard/i18n/locale/es/report.json b/app/javascript/dashboard/i18n/locale/es/report.json index ec9cdacbd34f..312346187349 100644 --- a/app/javascript/dashboard/i18n/locale/es/report.json +++ b/app/javascript/dashboard/i18n/locale/es/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "Informes", + "HEADER": "Overview", "LOADING_CHART": "Cargando datos del gráfico...", "NO_ENOUGH_DATA": "No hemos recibido suficientes puntos de datos para generar el informe. Inténtalo de nuevo más tarde.", "DOWNLOAD_AGENT_REPORTS": "Descargar reportes de agente", @@ -50,7 +50,41 @@ { "id": 4, "name": "Último año" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "HEADER": "CSAT Reports", + "NO_RECORDS": "There are no CSAT survey responses available.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Assigned agent", + "RATING": "Rating", + "FEEDBACK_TEXT": "Feedback comment" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/es/settings.json b/app/javascript/dashboard/i18n/locale/es/settings.json index 7ca0181b8a22..4be25347a866 100644 --- a/app/javascript/dashboard/i18n/locale/es/settings.json +++ b/app/javascript/dashboard/i18n/locale/es/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Notificaciones con sonido", "NOTE": "Active las notificaciones de sonido en el tablero para los mensajes nuevos y conversaciones.", - "ENABLE_AUDIO": "Realizar un sonido cuando una nueva conversación ha sido creada o un nuevo mensaje llegue" + "NONE": "Ninguna", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Notificaciones por email", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "Configuración de la cuenta", "APPLICATIONS": "Aplicaciones", "LABELS": "Etiquetas", - "TEAMS": "Equipos" + "TEAMS": "Equipos", + "ALL_CONTACTS": "Todos los contactos", + "TAGGED_WITH": "Etiquetado con", + "REPORTS_OVERVIEW": "Overview", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Nueva cuenta", diff --git a/app/javascript/dashboard/i18n/locale/fa/agentMgmt.json b/app/javascript/dashboard/i18n/locale/fa/agentMgmt.json index b20a80a24c86..35f7dfb1b25b 100644 --- a/app/javascript/dashboard/i18n/locale/fa/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/fa/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "اپراتوری یافت نشد." + "NO_RESULTS": "نتیجه‌ای یافت نشد." } } } diff --git a/app/javascript/dashboard/i18n/locale/fa/campaign.json b/app/javascript/dashboard/i18n/locale/fa/campaign.json index c2646e422132..e37fbf4795af 100644 --- a/app/javascript/dashboard/i18n/locale/fa/campaign.json +++ b/app/javascript/dashboard/i18n/locale/fa/campaign.json @@ -14,6 +14,17 @@ "PLACEHOLDER": "Please enter the title of campaign", "ERROR": "Title is required" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { "LABEL": "پیام", "PLACEHOLDER": "Please enter the message of campaign", @@ -72,6 +83,7 @@ "STATUS": "وضعیت", "SENDER": "Sender", "URL": "URL", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "Time(Seconds)", "CREATED_AT": "Created at" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "فعال", - "DISABLED": "غیرفعال" + "DISABLED": "غیرفعال", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "ربات" diff --git a/app/javascript/dashboard/i18n/locale/fa/contact.json b/app/javascript/dashboard/i18n/locale/fa/contact.json index 67130d3f4da8..4d03d9feba35 100644 --- a/app/javascript/dashboard/i18n/locale/fa/contact.json +++ b/app/javascript/dashboard/i18n/locale/fa/contact.json @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "مخاطبین", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "جستجو", "SEARCH_INPUT_PLACEHOLDER": "جستجوی مخاطبین", "LIST": { "LOADING_MESSAGE": "در حال بارگذاری مخاطبین...", "404": "هیچ مخاطبی با جستجوی شما مطابقت ندارد 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "نام", "PHONE_NUMBER": "شماره تلفن", @@ -203,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "انصراف", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/fa/conversation.json b/app/javascript/dashboard/i18n/locale/fa/conversation.json index 090d258fd15c..cc8e261f54b5 100644 --- a/app/javascript/dashboard/i18n/locale/fa/conversation.json +++ b/app/javascript/dashboard/i18n/locale/fa/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "حذف انتخاب‌شده‌ها", "DOWNLOAD": "دانلود", "UPLOADING_ATTACHMENTS": "در حال بارگذاری پیوست‌ها...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "بدون پاسخ", + "RATING_TITLE": "رتبه", + "FEEDBACK_TITLE": "بازخورد", "HEADER": { "RESOLVE_ACTION": "حل شد", "REOPEN_ACTION": "دوباره باز کنید", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "نمایش ویرایشگر متنی پیشرفته", "TIP_EMOJI_ICON": "انتخاب ایموجی", "TIP_ATTACH_ICON": "ضمیمه فایل", - "ENTER_TO_SEND": "برای ارسال Enter را بزنید" + "ENTER_TO_SEND": "برای ارسال Enter را بزنید", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "یادداشت خصوصی: فقط برای شما و تیم شما قابل مشاهده است", "CHANGE_STATUS": "وضعیت گفتگو تغییر کرد", @@ -64,6 +69,10 @@ "SELECT_AGENT": "انتخاب ایجنت", "REMOVE": "حذف", "ASSIGN": "اختصاص دادن" + }, + "CONTEXT_MENU": { + "COPY": "کپی", + "DELETE": "حذف" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/fa/csatMgmt.json b/app/javascript/dashboard/i18n/locale/fa/csatMgmt.json new file mode 100644 index 000000000000..d7d2efc2ada6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/fa/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json index 7ce451254d36..30c7a438c996 100644 --- a/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "متاسفانه Twilio اطلاعات ارائه شده را تایید نمی کند، لطفا اصلاح و مجددا تلاش کنید" } }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." + }, "API_CHANNEL": { "TITLE": "کانال API", "DESC": "با کانال API ادغام شده و از مشتریان خود پشتیبانی کنید.", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "ایمیل های خود را به این آدرس ها فوروارد کنید." }, "AUTH": { - "TITLE": "کانال‌ها", - "DESC": "در حال حاضر ما ابزارک‌های پشتیبانی آنلاین سایت‌ها، صفحات فیس‌بوک و پروفایل‌های توییتر را پشتیبانی می‌کنیم. پلتفرم‌های دیگری مثل واتس‌اپ، ایمیل، تلگرام و لاین در برنامه کاری ما قرار دارد و به زودی آماده خواهند شد." + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "اپراتورها", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "فعال", "DISABLED": "غیرفعال" + }, + "ENABLE_CSAT": { + "ENABLED": "فعال", + "DISABLED": "غیرفعال" } }, "DELETE": { @@ -255,6 +267,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "فعال کردن واگذاری خودکار گفتگو به اپراتورها", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "تنظیمات صندوق ورودی", "INBOX_UPDATE_SUB_TEXT": "تغییر پارامترهای صندوق ورودی", "AUTO_ASSIGNMENT_SUB_TEXT": "فعال کردن یا غیرفعال کردن واگذاری خودکار گفتگوها به اپراتورهای عضو این صندوق ورودی.", diff --git a/app/javascript/dashboard/i18n/locale/fa/integrations.json b/app/javascript/dashboard/i18n/locale/fa/integrations.json index 0c6c388405fe..06ba49b3cbd2 100644 --- a/app/javascript/dashboard/i18n/locale/fa/integrations.json +++ b/app/javascript/dashboard/i18n/locale/fa/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

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

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

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

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

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

" + } + }, "DELETE": { "BUTTON_TEXT": "حذف", "API": { diff --git a/app/javascript/dashboard/i18n/locale/fa/report.json b/app/javascript/dashboard/i18n/locale/fa/report.json index 208dc152bb7b..d73aa32162f2 100644 --- a/app/javascript/dashboard/i18n/locale/fa/report.json +++ b/app/javascript/dashboard/i18n/locale/fa/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "گزارشات", + "HEADER": "Overview", "LOADING_CHART": "در حال دریافت اطلاعات...", "NO_ENOUGH_DATA": "متاسفانه اطلاعات کافی دریافت نشد، لطفا بعدا دوباره امتحان کنید", "DOWNLOAD_AGENT_REPORTS": "دانلود گزارش ایجنت", @@ -50,7 +50,41 @@ { "id": 0, "name": "پارسال" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "HEADER": "CSAT Reports", + "NO_RECORDS": "There are no CSAT survey responses available.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Assigned agent", + "RATING": "رتبه", + "FEEDBACK_TEXT": "Feedback comment" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/fa/settings.json b/app/javascript/dashboard/i18n/locale/fa/settings.json index b67274d99caa..a6e078a7dc72 100644 --- a/app/javascript/dashboard/i18n/locale/fa/settings.json +++ b/app/javascript/dashboard/i18n/locale/fa/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "اعلامیه‌ به ایمیل", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "تنظیمات حساب", "APPLICATIONS": "Applications", "LABELS": "برچسب‌ها", - "TEAMS": "تیم‌ها" + "TEAMS": "تیم‌ها", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with", + "REPORTS_OVERVIEW": "Overview", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "حساب‌کاربری جدید", diff --git a/app/javascript/dashboard/i18n/locale/fi/agentMgmt.json b/app/javascript/dashboard/i18n/locale/fi/agentMgmt.json index 06f3156e8b91..bec05d7e9f94 100644 --- a/app/javascript/dashboard/i18n/locale/fi/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/fi/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Edustajia ei löytynyt." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/fi/campaign.json b/app/javascript/dashboard/i18n/locale/fi/campaign.json index e97f38b245ab..92df74be9f3c 100644 --- a/app/javascript/dashboard/i18n/locale/fi/campaign.json +++ b/app/javascript/dashboard/i18n/locale/fi/campaign.json @@ -14,6 +14,17 @@ "PLACEHOLDER": "Please enter the title of campaign", "ERROR": "Title is required" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { "LABEL": "Message", "PLACEHOLDER": "Please enter the message of campaign", @@ -72,6 +83,7 @@ "STATUS": "Tila", "SENDER": "Sender", "URL": "URL", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "Time(Seconds)", "CREATED_AT": "Created at" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "Käytössä", - "DISABLED": "Pois käytöstä" + "DISABLED": "Pois käytöstä", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "Botti" diff --git a/app/javascript/dashboard/i18n/locale/fi/contact.json b/app/javascript/dashboard/i18n/locale/fi/contact.json index 044d8e78e55e..9f4f0fcfb121 100644 --- a/app/javascript/dashboard/i18n/locale/fi/contact.json +++ b/app/javascript/dashboard/i18n/locale/fi/contact.json @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "Yhteystiedot", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Etsi", "SEARCH_INPUT_PLACEHOLDER": "Etsi yhteystietoja", "LIST": { "LOADING_MESSAGE": "Ladataan yhteystietoja...", "404": "Ei hakua vastaavia yhteystietoja 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Nimi", "PHONE_NUMBER": "Puhelinnumero", @@ -203,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Peruuta", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/fi/conversation.json b/app/javascript/dashboard/i18n/locale/fi/conversation.json index 6c02b3b3c7d9..74a060e2904e 100644 --- a/app/javascript/dashboard/i18n/locale/fi/conversation.json +++ b/app/javascript/dashboard/i18n/locale/fi/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "Poista valinnat", "DOWNLOAD": "Lataa", "UPLOADING_ATTACHMENTS": "Ladataan liitteitä...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Ratkaise", "REOPEN_ACTION": "Uudelleenavaa", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Yksityinen huomautus: Näkyy vain sinulle ja tiimillesi", "CHANGE_STATUS": "Keskustelun tila muutettu", @@ -64,6 +69,10 @@ "SELECT_AGENT": "Valitse edustaja", "REMOVE": "Poista", "ASSIGN": "Delegoi" + }, + "CONTEXT_MENU": { + "COPY": "Kopioi", + "DELETE": "Poista" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/fi/csatMgmt.json b/app/javascript/dashboard/i18n/locale/fi/csatMgmt.json new file mode 100644 index 000000000000..d7d2efc2ada6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/fi/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/fi/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/fi/inboxMgmt.json index 7b63acfbf364..fdce45c5bc9e 100644 --- a/app/javascript/dashboard/i18n/locale/fi/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/fi/inboxMgmt.json @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "Emme pystyneet todentamaan Twilio tunnuksia, yritä uudelleen" } }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." + }, "API_CHANNEL": { "TITLE": "API-rajapinta", "DESC": "Integroi API-rajapintaan ja aloita tukemaan asiakkaitasi.", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "Aloita välittämällä sähköpostit seuraavaan osoitteeseen." }, "AUTH": { - "TITLE": "Kanavat", - "DESC": "Tällä hetkellä tuemme sivuston chat widgettejä, Facebook-sivuja, Twitter profiileja ja Whatsappia alustoina. Meillä on enemmän alustoja kuten sähköposti, Telegram ja Line kehityksen alla, jotka tulevat pian käyttöösi." + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "Edustajat", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Käytössä", "DISABLED": "Pois käytöstä" + }, + "ENABLE_CSAT": { + "ENABLED": "Käytössä", + "DISABLED": "Pois käytöstä" } }, "DELETE": { @@ -255,6 +267,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Ota automaattinen delegointi käyttöön", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Postilaatikon tiedot", "INBOX_UPDATE_SUB_TEXT": "Päivitä postilaatikon asetukset", "AUTO_ASSIGNMENT_SUB_TEXT": "Ota käyttöön tai poista käytöstä automaattinen keskusteluiden delegointi edustajille.", diff --git a/app/javascript/dashboard/i18n/locale/fi/integrations.json b/app/javascript/dashboard/i18n/locale/fi/integrations.json index 386ee11a8feb..f5b7ef0a8aec 100644 --- a/app/javascript/dashboard/i18n/locale/fi/integrations.json +++ b/app/javascript/dashboard/i18n/locale/fi/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

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

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

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

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

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

" + } + }, "DELETE": { "BUTTON_TEXT": "Poista", "API": { diff --git a/app/javascript/dashboard/i18n/locale/fi/report.json b/app/javascript/dashboard/i18n/locale/fi/report.json index 268c8c8908f7..ee1930e89802 100644 --- a/app/javascript/dashboard/i18n/locale/fi/report.json +++ b/app/javascript/dashboard/i18n/locale/fi/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "Raportit", + "HEADER": "Overview", "LOADING_CHART": "Ladataan kaaviotietoja...", "NO_ENOUGH_DATA": "Emme ole saaneet tarpeeksi dataa raportin luomiseen, yritä myöhemmin uudelleen.", "DOWNLOAD_AGENT_REPORTS": "Lataa edustajaraportit", @@ -50,7 +50,41 @@ { "id": 4, "name": "Last year" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "HEADER": "CSAT Reports", + "NO_RECORDS": "There are no CSAT survey responses available.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Assigned agent", + "RATING": "Rating", + "FEEDBACK_TEXT": "Feedback comment" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/fi/settings.json b/app/javascript/dashboard/i18n/locale/fi/settings.json index 302d2e035246..3f731b29e713 100644 --- a/app/javascript/dashboard/i18n/locale/fi/settings.json +++ b/app/javascript/dashboard/i18n/locale/fi/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Sähköposti-ilmoitukset", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "Tilin asetukset", "APPLICATIONS": "Applications", "LABELS": "Tunnisteet", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with", + "REPORTS_OVERVIEW": "Overview", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Uusi tili", diff --git a/app/javascript/dashboard/i18n/locale/fr/agentMgmt.json b/app/javascript/dashboard/i18n/locale/fr/agentMgmt.json index 08ca5fd66ffe..27d4619f1b93 100644 --- a/app/javascript/dashboard/i18n/locale/fr/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/fr/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Aucun agent trouvé." + "NO_RESULTS": "Aucun résultat trouvé." } } } diff --git a/app/javascript/dashboard/i18n/locale/fr/campaign.json b/app/javascript/dashboard/i18n/locale/fr/campaign.json index cabd2ce49480..128f746df163 100644 --- a/app/javascript/dashboard/i18n/locale/fr/campaign.json +++ b/app/javascript/dashboard/i18n/locale/fr/campaign.json @@ -1,45 +1,56 @@ { "CAMPAIGN": { - "HEADER": "Campaigns", - "SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on Add Campaign 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": "Create a campaign", + "HEADER": "Campagnes", + "SIDEBAR_TXT": "Les messages proactifs permettent au client d'envoyer des messages sortants à ses contacts, qui déclenchent plus de conversations. Cliquer sur Ajouter une campagne pour créer une nouvelle campagne. Vous pouvez également modifier ou supprimer une campagne existante en cliquant sur le bouton Éditer ou Supprimer.", + "HEADER_BTN_TXT": "Créer une campagne", "ADD": { - "TITLE": "Create a campaign", - "DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.", + "TITLE": "Créer une campagne", + "DESC": "Les messages proactifs permettent au client d'envoyer des messages sortants à ses contacts, ce qui déclencherait plus de conversations.", "CANCEL_BUTTON_TEXT": "Annuler", "CREATE_BUTTON_TEXT": "Créer", "FORM": { "TITLE": { - "LABEL": "Title", - "PLACEHOLDER": "Please enter the title of campaign", - "ERROR": "Title is required" + "LABEL": "Titre", + "PLACEHOLDER": "Veuillez entrer le titre de la campagne", + "ERROR": "Le titre est requis" + }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" }, "MESSAGE": { "LABEL": "Message", - "PLACEHOLDER": "Please enter the message of campaign", - "ERROR": "Message is required" + "PLACEHOLDER": "Veuillez entrer le titre de la campagne", + "ERROR": "Le message est obligatoire" }, "SENT_BY": { "LABEL": "Envoyé par", - "PLACEHOLDER": "Please select the the content of campaign", - "ERROR": "Sender is required" + "PLACEHOLDER": "Veuillez sélectionner le contenu de la campagne", + "ERROR": "L'expéditeur est requis" }, "END_POINT": { "LABEL": "URL", - "PLACEHOLDER": "Please enter the URL", + "PLACEHOLDER": "Veuillez saisir l'URL", "ERROR": "Veuillez entrer une URL valide" }, "TIME_ON_PAGE": { - "LABEL": "Time on page(Seconds)", - "PLACEHOLDER": "Please enter the time", - "ERROR": "Time on page is required" + "LABEL": "Temps sur la page (secondes)", + "PLACEHOLDER": "Veuillez indiquer le temps", + "ERROR": "Le temps sur la page est requis" }, - "ENABLED": "Enable campaign", - "SUBMIT": "Add Campaign" + "ENABLED": "Activer la campagne", + "SUBMIT": "Ajouter une campagne" }, "API": { - "SUCCESS_MESSAGE": "Campaign created successfully", - "ERROR_MESSAGE": "There was an error. Please try again." + "SUCCESS_MESSAGE": "Compte créé avec succès", + "ERROR_MESSAGE": "Une erreur est survenue, veuillez réessayer." } }, "DELETE": { @@ -51,38 +62,41 @@ "NO": "Non, Conserver " }, "API": { - "SUCCESS_MESSAGE": "Campaign deleted successfully", - "ERROR_MESSAGE": "Could not delete the campaign. Please try again later." + "SUCCESS_MESSAGE": "La campagne a bien été supprimée", + "ERROR_MESSAGE": "Impossible de supprimer la campagne. Veuillez réessayer plus tard." } }, "EDIT": { - "TITLE": "Edit campaign", + "TITLE": "Modifier la campagne", "UPDATE_BUTTON_TEXT": "Mettre à jour", "API": { - "SUCCESS_MESSAGE": "Campaign updated successfully", + "SUCCESS_MESSAGE": "Campagne mise à jour avec succès", "ERROR_MESSAGE": "Une erreur est survenue, veuillez réessayer" } }, "LIST": { - "LOADING_MESSAGE": "Loading campaigns...", - "404": "There are no campaigns created for this inbox.", + "LOADING_MESSAGE": "Chargement des campagnes...", + "404": "Il n'y a aucune campagne pour cette boîte de réception.", "TABLE_HEADER": { - "TITLE": "Title", + "TITLE": "Titre", "MESSAGE": "Message", "STATUS": "État", - "SENDER": "Sender", + "SENDER": "Expéditeur", "URL": "URL", - "TIME_ON_PAGE": "Time(Seconds)", - "CREATED_AT": "Created at" + "SCHEDULED_AT": "Scheduled time", + "TIME_ON_PAGE": "Temps(secondes)", + "CREATED_AT": "Créé le" }, "BUTTONS": { - "ADD": "Add", + "ADD": "Ajouter", "EDIT": "Modifier", "DELETE": "Supprimer" }, "STATUS": { "ENABLED": "Activé", - "DISABLED": "Désactivé" + "DISABLED": "Désactivé", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "Bot" diff --git a/app/javascript/dashboard/i18n/locale/fr/chatlist.json b/app/javascript/dashboard/i18n/locale/fr/chatlist.json index 4319d6466525..3eb7840f5d37 100644 --- a/app/javascript/dashboard/i18n/locale/fr/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/fr/chatlist.json @@ -81,6 +81,6 @@ "VIEW_TWEET_IN_TWITTER": "Voir le tweet sur Twitter", "REPLY_TO_TWEET": "Répondre à ce tweet", "NO_MESSAGES": "Pas de messages", - "NO_CONTENT": "No content available" + "NO_CONTENT": "Aucun contenu disponible" } } diff --git a/app/javascript/dashboard/i18n/locale/fr/contact.json b/app/javascript/dashboard/i18n/locale/fr/contact.json index 918b292b0ff4..de54b6caefa8 100644 --- a/app/javascript/dashboard/i18n/locale/fr/contact.json +++ b/app/javascript/dashboard/i18n/locale/fr/contact.json @@ -12,24 +12,24 @@ "INITIATED_FROM": "Initié depuis", "INITIATED_AT": "Initié à", "IP_ADDRESS": "Adresse IP", - "NEW_MESSAGE": "New message", + "NEW_MESSAGE": "Nouveau message", "CONVERSATIONS": { "NO_RECORDS_FOUND": "Il n'y a aucune conversation précédente associée à ce contact.", "TITLE": "Conversations précédentes" }, "LABELS": { "CONTACT": { - "TITLE": "Contact Labels", - "ERROR": "Couldn't update labels" + "TITLE": "Libellés des contacts", + "ERROR": "Impossible de mettre à jour les étiquettes" }, "CONVERSATION": { "TITLE": "Étiquettes de conversation", - "ADD_BUTTON": "Add Labels" + "ADD_BUTTON": "Ajouter des étiquettes" }, "LABEL_SELECT": { - "TITLE": "Add Labels", - "PLACEHOLDER": "Search labels", - "NO_RESULT": "No labels found" + "TITLE": "Ajouter une étiquette", + "PLACEHOLDER": "Rechercher des étiquettes", + "NO_RESULT": "Aucune étiquette trouvée" } }, "MUTE_CONTACT": "Mettre la conversation en sourdine", @@ -71,8 +71,8 @@ "PHONE_NUMBER": { "PLACEHOLDER": "Entrez le numéro de téléphone du contact", "LABEL": "Numéro de téléphone", - "HELP": "Phone number should be of E.164 format eg: +1415555555 [+][country code][area code][local phone number]", - "ERROR": "Phone number should be either empty or of E.164 format" + "HELP": "Le numéro de téléphone doit être au format E.164. Ex. : +1415555555 [+][code pays][code régional][numéro de téléphone local]", + "ERROR": "Le numéro de téléphone doit être soit vide soit au format E.164" }, "LOCATION": { "PLACEHOLDER": "Entrez l'emplacement du contact", @@ -106,36 +106,38 @@ "ERROR_MESSAGE": "Une erreur est survenue, veuillez réessayer" }, "NEW_CONVERSATION": { - "BUTTON_LABEL": "Start conversation", + "BUTTON_LABEL": "Nouvelle conversation", "TITLE": "Nouvelle conversation", - "DESC": "Start a new conversation by sending a new message.", - "NO_INBOX": "Couldn't find an inbox to initiate a new conversation with this contact.", + "DESC": "Commencez une nouvelle conversation en envoyant un nouveau message.", + "NO_INBOX": "Impossible de trouver une boîte de réception pour lancer une nouvelle conversation avec ce contact.", "FORM": { "TO": { - "LABEL": "To" + "LABEL": "À" }, "INBOX": { - "LABEL": "Inbox", - "ERROR": "Select an inbox" + "LABEL": "Boîte de réception", + "ERROR": "Sélectionner une boîte de réception" }, "MESSAGE": { "LABEL": "Message", - "PLACEHOLDER": "Write your message here", - "ERROR": "Message can't be empty" + "PLACEHOLDER": "Ecrivez votre message ici", + "ERROR": "Le message ne peut être vide" }, - "SUBMIT": "Send message", + "SUBMIT": "Envoyer un message", "CANCEL": "Annuler", - "SUCCESS_MESSAGE": "Message sent!", - "ERROR_MESSAGE": "Couldn't send! try again" + "SUCCESS_MESSAGE": "Message envoyé !", + "ERROR_MESSAGE": "Impossible d'envoyer ! Veuillez réessayer" } }, "CONTACTS_PAGE": { "HEADER": "Contacts", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Rechercher", "SEARCH_INPUT_PLACEHOLDER": "Rechercher des contacts", "LIST": { "LOADING_MESSAGE": "Chargement des contacts...", "404": "Aucun contact ne correspond à votre recherche 🔍", + "NO_CONTACTS": "Il n'y a aucun contact disponible", "TABLE_HEADER": { "NAME": "Nom", "PHONE_NUMBER": "Numéro de téléphone", @@ -152,12 +154,12 @@ }, "REMINDER": { "ADD_BUTTON": { - "BUTTON": "Add", - "TITLE": "Shift + Enter to create a task" + "BUTTON": "Ajouter", + "TITLE": "Shift + Entrée pour créer une tâche" }, "FOOTER": { - "DUE_DATE": "Due date", - "LABEL_TITLE": "Set type" + "DUE_DATE": "Date d'échéance", + "LABEL_TITLE": "Définir le type" } }, "NOTES": { @@ -165,43 +167,71 @@ "TITLE": "Notes" }, "ADD": { - "BUTTON": "Add", - "PLACEHOLDER": "Add a note", - "TITLE": "Shift + Enter to create a note" + "BUTTON": "Ajouter", + "PLACEHOLDER": "Ajouter une note", + "TITLE": "Shift + Entrée pour créer une note" }, "FOOTER": { - "BUTTON": "View all notes" + "BUTTON": "Voir toutes les notes" } }, "EVENTS": { "HEADER": { - "TITLE": "Activities" + "TITLE": "Activités" }, "BUTTON": { - "PILL_BUTTON_NOTES": "notes", - "PILL_BUTTON_EVENTS": "events", + "PILL_BUTTON_NOTES": "Notes", + "PILL_BUTTON_EVENTS": "Evénements", "PILL_BUTTON_CONVO": "conversations" } }, "CUSTOM_ATTRIBUTES": { "TITLE": "Attributs personnalisés", - "BUTTON": "Add custom attribute", + "BUTTON": "Ajouter un attribut personnalisé", "ADD": { - "TITLE": "Create custom attribute", - "DESC": "Add custom information to this contact." + "TITLE": "Créer un attribut personnalisé", + "DESC": "Ajouter des informations personnalisées à ce contact." }, "FORM": { - "CREATE": "Add attribute", + "CREATE": "Ajouter un attribut", "CANCEL": "Annuler", "NAME": { - "LABEL": "Custom attribute name", - "PLACEHOLDER": "Eg: shopify id", - "ERROR": "Invalid custom attribute name" + "LABEL": "Nom de l'attribut personnalisé", + "PLACEHOLDER": "Ex. : id shopify", + "ERROR": "Nom de l'attribut personnalisé invalide" }, "VALUE": { - "LABEL": "Attribute value", - "PLACEHOLDER": "Eg: 11901 " + "LABEL": "Valeur de l'attribut", + "PLACEHOLDER": "Ex.: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Annuler", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/fr/conversation.json b/app/javascript/dashboard/i18n/locale/fr/conversation.json index 3f269b8367b5..fa3001f7083e 100644 --- a/app/javascript/dashboard/i18n/locale/fr/conversation.json +++ b/app/javascript/dashboard/i18n/locale/fr/conversation.json @@ -20,14 +20,18 @@ "LOADING_CONVERSATIONS": "Chargement des conversations", "CANNOT_REPLY": "Vous ne pouvez pas répondre en raison de", "24_HOURS_WINDOW": "Restriction de fenêtre de message de 24 heures", - "TWILIO_WHATSAPP_CAN_REPLY": "You can only reply to this conversation using a template message due to", + "TWILIO_WHATSAPP_CAN_REPLY": "Vous pouvez seulement répondre à cette conversation en utilisant un modèle de message en raison de", "TWILIO_WHATSAPP_24_HOURS_WINDOW": "Restriction de fenêtre de message de 24 heures", "LAST_INCOMING_TWEET": "Vous répondez au dernier tweet entrant", "REPLYING_TO": "Vous répondez à :", "REMOVE_SELECTION": "Supprimer la sélection", "DOWNLOAD": "Télécharger", "UPLOADING_ATTACHMENTS": "Envoi des pièces jointes...", + "SUCCESS_DELETE_MESSAGE": "Le message a bien été supprimé", + "FAIL_DELETE_MESSSAGE": "Impossible de supprimer le message ! Veuillez réessayez", "NO_RESPONSE": "Pas de réponse", + "RATING_TITLE": "Note", + "FEEDBACK_TITLE": "Commentaires", "HEADER": { "RESOLVE_ACTION": "Résoudre", "REOPEN_ACTION": "Ré-ouvrir", @@ -52,18 +56,23 @@ "TIP_FORMAT_ICON": "Afficher l'éditeur de texte enrichi", "TIP_EMOJI_ICON": "Montrer le sélecteur d'émoji", "TIP_ATTACH_ICON": "Joindre des fichiers", - "ENTER_TO_SEND": "Entrer pour envoyer" + "ENTER_TO_SEND": "Entrer pour envoyer", + "DRAG_DROP": "Glissez et déposez ici pour lier" }, "VISIBLE_TO_AGENTS": "Note privée : uniquement visible par vous et votre équipe", "CHANGE_STATUS": "Statut de la conversation modifié", "CHANGE_AGENT": "Responsable de la conversation modifié", "CHANGE_TEAM": "L'équipe de conversation a été modifiée", - "FILE_SIZE_LIMIT": "File exceeds the {MAXIMUM_FILE_UPLOAD_SIZE} attachment limit", + "FILE_SIZE_LIMIT": "Le fichier dépasse la limite de {MAXIMUM_FILE_UPLOAD_SIZE} pour les pièces jointes", "SENT_BY": "Envoyé par:", "ASSIGNMENT": { "SELECT_AGENT": "Sélectionner un agent", "REMOVE": "Supprimer", "ASSIGN": "Assigner" + }, + "CONTEXT_MENU": { + "COPY": "Copier", + "DELETE": "Supprimer" } }, "EMAIL_TRANSCRIPT": { @@ -109,7 +118,7 @@ }, "CONVERSATION_SIDEBAR": { "ASSIGNEE_LABEL": "Agent Assigné", - "SELF_ASSIGN": "Assign to me", + "SELF_ASSIGN": "M’assigner la conversation", "TEAM_LABEL": "Équipe assignée", "SELECT": { "PLACEHOLDER": "Aucun" diff --git a/app/javascript/dashboard/i18n/locale/fr/csatMgmt.json b/app/javascript/dashboard/i18n/locale/fr/csatMgmt.json new file mode 100644 index 000000000000..90a27f6af9e4 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/fr/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Évaluer votre conversation", + "PLACEHOLDER": "Dites-nous en plus..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json index 3a37cdcadc47..73c888d5d52b 100644 --- a/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json @@ -30,11 +30,11 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "Nom de la boîte de réception", - "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)" + "PLACEHOLDER": "Entrez le nom de votre boîte de réception (ex: Acme Inc)" }, "WEBSITE_NAME": { - "LABEL": "Nom du site Web", - "PLACEHOLDER": "Entrez le nom de votre site Web (ex : Acme Inc)" + "LABEL": "Nom du site web", + "PLACEHOLDER": "Entrez le nom de votre boîte de réception (ex: Acme Inc)" }, "FB": { "HELP": "PS : En vous connectant, nous avons seulement accès aux messages de votre page. Vos messages privés ne peuvent jamais être consultés par Chatwoot.", @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "Nous n'avons pas pu authentifier les identifiants Twilio, veuillez réessayer" } }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." + }, "API_CHANNEL": { "TITLE": "Canal API", "DESC": "Intégrez le canal API et commencez à aider vos clients.", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "Commencez à transférer vos courriels à l'adresse suivante." }, "AUTH": { - "TITLE": "Canaux", - "DESC": "Actuellement, nous prenons en charge les widgets de chat en direct, les pages Facebook et les profils Twitter en tant que plateformes. Plus de plateformes telles que Whatsapp, Courriels, Telegram et Line sont en cours de développement et seront prochainement disponibles." + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "Agents", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Activé", "DISABLED": "Désactivé" + }, + "ENABLE_CSAT": { + "ENABLED": "Activé", + "DISABLED": "Désactivé" } }, "DELETE": { @@ -223,7 +235,7 @@ "CONFIRM": { "TITLE": "Confirmer la suppression", "MESSAGE": "Êtes-vous sûr de vouloir supprimer ", - "PLACE_HOLDER": "Please type {inboxName} to confirm", + "PLACE_HOLDER": "Veuillez taper {inboxName} pour confirmer", "YES": "Oui, supprimer ", "NO": "Non, Conserver " }, @@ -236,7 +248,7 @@ "SETTINGS": "Paramètres", "COLLABORATORS": "Collaborateurs", "CONFIGURATION": "Configuration", - "CAMPAIGN": "Campaigns", + "CAMPAIGN": "Campagnes", "PRE_CHAT_FORM": "Formulaire avant chat", "BUSINESS_HOURS": "Heures de bureau" }, @@ -252,9 +264,11 @@ "INBOX_AGENTS": "Agents", "INBOX_AGENTS_SUB_TEXT": "Ajouter ou supprimer des agents de cette boîte de réception", "UPDATE": "Mettre à jour", - "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", - "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", + "ENABLE_EMAIL_COLLECT_BOX": "Activer la boîte de collecte des courriels", + "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Activer ou désactiver la boîte de collecte des courriels pour les nouvelles conversations", "AUTO_ASSIGNMENT": "Activer l'assignation automatique", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Paramètres de boîtes de réception", "INBOX_UPDATE_SUB_TEXT": "Mettre à jour les paramètres de votre boîte de réception", "AUTO_ASSIGNMENT_SUB_TEXT": "Activer ou désactiver l'affectation automatique de nouvelles conversations aux agents ajoutés à cette boîte de réception.", diff --git a/app/javascript/dashboard/i18n/locale/fr/integrationApps.json b/app/javascript/dashboard/i18n/locale/fr/integrationApps.json index ec047a23f254..60bbb5ac89b8 100644 --- a/app/javascript/dashboard/i18n/locale/fr/integrationApps.json +++ b/app/javascript/dashboard/i18n/locale/fr/integrationApps.json @@ -1,36 +1,36 @@ { "INTEGRATION_APPS": { - "FETCHING": "Fetching Integrations", - "NO_HOOK_CONFIGURED": "There are no %{integrationId} integrations configured in this account.", + "FETCHING": "Récupération des intégrations", + "NO_HOOK_CONFIGURED": "Aucune intégration %{integrationId} n'est configurée dans ce compte.", "HEADER": "Applications", "STATUS": { "ENABLED": "Activé", "DISABLED": "Désactivé" }, "CONFIGURE": "Configurer", - "ADD_BUTTON": "Add a new hook", + "ADD_BUTTON": "Ajouter un nouveau hook", "DELETE": { "TITLE": { - "INBOX": "Confirm deletion", - "ACCOUNT": "Disconnect" + "INBOX": "Confirmer la suppression", + "ACCOUNT": "Déconnecter" }, "MESSAGE": { "INBOX": "Êtes-vous sûr de vouloir supprimer?", - "ACCOUNT": "Are you sure to disconnect?" + "ACCOUNT": "Êtes-vous sûr de vouloir déconnecter?" }, "CONFIRM_BUTTON_TEXT": { "INBOX": "Oui, supprimer", - "ACCOUNT": "Yes, Disconnect" + "ACCOUNT": "Oui, déconnecter" }, "CANCEL_BUTTON_TEXT": "Annuler", "API": { - "SUCCESS_MESSAGE": "Hook deleted successfully", + "SUCCESS_MESSAGE": "Webhook supprimé avec succès", "ERROR_MESSAGE": "Impossible de se connecter au serveur Woot, veuillez réessayer plus tard" } }, "LIST": { - "FETCHING": "Fetching integration hooks", - "INBOX": "Inbox", + "FETCHING": "Récupération des webhooks de l'intégration", + "INBOX": "Boîte de réception", "DELETE": { "BUTTON_TEXT": "Supprimer" } @@ -38,14 +38,14 @@ "ADD": { "FORM": { "INBOX": { - "LABEL": "Select Inbox", - "PLACEHOLDER": "Select Inbox" + "LABEL": "Sélectionner la boîte de réception", + "PLACEHOLDER": "Sélectionner la boîte de réception" }, "SUBMIT": "Créer", "CANCEL": "Annuler" }, "API": { - "SUCCESS_MESSAGE": "Integration hook added successfully", + "SUCCESS_MESSAGE": "Hook d'intégration ajouté avec succès", "ERROR_MESSAGE": "Impossible de se connecter au serveur Woot, veuillez réessayer plus tard" } }, @@ -53,10 +53,10 @@ "BUTTON_TEXT": "Connecter" }, "DISCONNECT": { - "BUTTON_TEXT": "Disconnect" + "BUTTON_TEXT": "Déconnecter" }, "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.

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.

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 est une plateforme de compréhension du langage naturel qui facilite la conception et l'intégration d'une interface utilisateur dans votre application mobile, application web, périphérique, bot, système de réponse vocale interactive, et ainsi de suite.

L'intégration de Dialogflow avec %{installationName} vous permet de configurer un bot Dialogflow avec vos boîtes de réception qui permet au bot de gérer les requêtes initialement et de les remettre à un agent si nécessaire. Le Dialogflow peut être utilisé pour qualifier les plombs, réduire la charge de travail des agents en fournissant des questions fréquentes, etc.

Pour ajouter Dialogflow, vous devez créer un compte de service dans votre console de projet Google et partager les identifiants. Reportez-vous à la documentation Dialogflow pour plus d'informations." } } } diff --git a/app/javascript/dashboard/i18n/locale/fr/integrations.json b/app/javascript/dashboard/i18n/locale/fr/integrations.json index 32c860922328..ea9a35c32de2 100644 --- a/app/javascript/dashboard/i18n/locale/fr/integrations.json +++ b/app/javascript/dashboard/i18n/locale/fr/integrations.json @@ -19,7 +19,7 @@ }, "EDIT": { "BUTTON_TEXT": "Modifier", - "TITLE": "Edit webhook", + "TITLE": "Modifier le webhook", "CANCEL": "Annuler", "DESC": "Les événements Webhook vous fournissent des informations en temps réel sur ce qui se passe dans votre compte Chatwoot. Veuillez entrer une URL valide pour configurer un callback.", "FORM": { @@ -28,10 +28,10 @@ "PLACEHOLDER": "Exemple : https://exemple/api/webhook", "ERROR": "Veuillez entrer une URL valide" }, - "SUBMIT": "Edit webhook" + "SUBMIT": "Modifier le webhook" }, "API": { - "SUCCESS_MESSAGE": "Webhook URL updated successfully", + "SUCCESS_MESSAGE": "URL du webhook mise à jour avec succès", "ERROR_MESSAGE": "Impossible de se connecter au serveur Woot, veuillez réessayer plus tard" } }, @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Utilisation de l'intégration Slack", + "BODY": "

Chatwoot va maintenant synchroniser toutes les conversations entrantes dans le canal customer-conversations à l'intérieur de Workspace Sack.

Répondre à un fil de conversation dans le canal Slack customer-conversations créera une réponse au client via chatwoot.

Commencez les réponses avec note : pour créer des notes privées au lieu de réponses.

Si le répondant sur Slack a un profil d'agent dans le chat avec la même adresse email, les réponses seront associées en conséquence.

Lorsque le répondant n'a pas de profil d'agent associé, les réponses seront faites avec le profil du bot.

" + } + }, "DELETE": { "BUTTON_TEXT": "Supprimer", "API": { diff --git a/app/javascript/dashboard/i18n/locale/fr/labelsMgmt.json b/app/javascript/dashboard/i18n/locale/fr/labelsMgmt.json index cd25a727a648..8500cff6a918 100644 --- a/app/javascript/dashboard/i18n/locale/fr/labelsMgmt.json +++ b/app/javascript/dashboard/i18n/locale/fr/labelsMgmt.json @@ -19,9 +19,9 @@ "NAME": { "LABEL": "Nom de l'étiquette", "PLACEHOLDER": "Nom de l'étiquette", - "REQUIRED_ERROR": "Label name is required", - "MINIMUM_LENGTH_ERROR": "Minimum length 2 is required", - "VALID_ERROR": "Only Alphabets, Numbers, Hyphen and Underscore are allowed" + "REQUIRED_ERROR": "Le nom de l'étiquette est requis", + "MINIMUM_LENGTH_ERROR": "Longueur minimale de 2 requise", + "VALID_ERROR": "Seuls les caractères alphabétiques, les chiffres, les traits d'union et les tirets bas sont autorisés" }, "DESCRIPTION": { "LABEL": "Description", diff --git a/app/javascript/dashboard/i18n/locale/fr/report.json b/app/javascript/dashboard/i18n/locale/fr/report.json index 82d3dd07048a..777bbc10a328 100644 --- a/app/javascript/dashboard/i18n/locale/fr/report.json +++ b/app/javascript/dashboard/i18n/locale/fr/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "Rapports", + "HEADER": "Overview", "LOADING_CHART": "Chargement des données du graphique ...", "NO_ENOUGH_DATA": "Nous n'avons pas reçu assez de points de données pour générer un rapport. Veuillez réessayer plus tard.", "DOWNLOAD_AGENT_REPORTS": "Télécharger les rapports de l'agent", @@ -41,16 +41,50 @@ }, { "id": 2, - "name": "Last 3 months" + "name": "3 derniers mois" }, { "id": 3, - "name": "Last 6 months" + "name": "6 derniers mois" }, { "id": 4, - "name": "Last year" + "name": "Année dernière" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "HEADER": "CSAT Reports", + "NO_RECORDS": "There are no CSAT survey responses available.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Assigned agent", + "RATING": "Note", + "FEEDBACK_TEXT": "Feedback comment" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/fr/settings.json b/app/javascript/dashboard/i18n/locale/fr/settings.json index 326e0dad3d5d..14c98c6a8dfa 100644 --- a/app/javascript/dashboard/i18n/locale/fr/settings.json +++ b/app/javascript/dashboard/i18n/locale/fr/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Notifications audio", "NOTE": "Activer les notifications audio dans le tableau de bord pour les nouveaux messages et conversations.", - "ENABLE_AUDIO": "Jouer une notification audio lorsqu'une nouvelle conversation est créée ou que de nouveaux messages arrivent" + "NONE": "Aucun", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Notifications par courriel", @@ -79,9 +81,9 @@ "PLACEHOLDER": "Veuillez entrer votre adresse de courriel, cela sera affiché dans les conversations" }, "CURRENT_PASSWORD": { - "LABEL": "Current password", - "ERROR": "Please enter the current password", - "PLACEHOLDER": "Please enter the current password" + "LABEL": "Mot de passe actuel", + "ERROR": "Veuillez entrer le mot de passe actuel", + "PLACEHOLDER": "Veuillez entrer le mot de passe actuel" }, "PASSWORD": { "LABEL": "Mot de passe", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "Paramètres du compte", "APPLICATIONS": "Applications", "LABELS": "Étiquettes", - "TEAMS": "Équipes" + "TEAMS": "Équipes", + "ALL_CONTACTS": "Tous les contacts", + "TAGGED_WITH": "Tagué avec", + "REPORTS_OVERVIEW": "Overview", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Nouveau compte", diff --git a/app/javascript/dashboard/i18n/locale/fr/teamsSettings.json b/app/javascript/dashboard/i18n/locale/fr/teamsSettings.json index 122371db346d..79b7d5678e9b 100644 --- a/app/javascript/dashboard/i18n/locale/fr/teamsSettings.json +++ b/app/javascript/dashboard/i18n/locale/fr/teamsSettings.json @@ -15,21 +15,21 @@ "AGENTS": { "BUTTON_TEXT": "Ajouter un agent à votre équipe", "TITLE": "Ajouter des agents à l'équipe - %{teamName}", - "DESC": "Add Agents to your newly created team. This lets you collaborate as a team on conversations, get notified on new events in the same conversation." + "DESC": "Ajouter des agents à votre équipe nouvellement créée. Cela vous permet de collaborer en équipe sur les conversations, d'être informé des nouveaux événements dans la même conversation." }, "WIZARD": [ { "title": "Créer", "route": "settings_teams_new", - "body": "Create a new team of agents." + "body": "Créer une nouvelle équipe d'agents." }, { "title": "Ajouter des agents", "route": "settings_teams_add_agents", - "body": "Add agents to the team." + "body": "Ajouter des agents à l'équipe." }, { - "title": "Finish", + "title": "Terminer", "route": "settings_teams_finish", "body": "Vous êtes paré !" } @@ -37,89 +37,89 @@ }, "EDIT_FLOW": { "CREATE": { - "TITLE": "Edit your team details", - "DESC": "Edit title and description to your team.", - "BUTTON_TEXT": "Update team" + "TITLE": "Modifier les détails de votre équipe", + "DESC": "Modifier le titre et la description de votre équipe.", + "BUTTON_TEXT": "Mettre à jour l'équipe" }, "AGENTS": { - "BUTTON_TEXT": "Update agents in team", + "BUTTON_TEXT": "Mettre à jour les agents dans l'équipe", "TITLE": "Ajouter des agents à l'équipe - %{teamName}", - "DESC": "Add Agents to your newly created team. All the added agents will be notified when a conversation is assigned to this team." + "DESC": "Ajouter des agents à votre équipe nouvellement créée. Tous les agents ajoutés seront notifiés lorsqu'une conversation est assignée à cette équipe." }, "WIZARD": [ { - "title": "Team details", + "title": "Détails de l'équipe", "route": "settings_teams_edit", - "body": "Change name, description and other details." + "body": "Changer le nom, la description et d'autres détails." }, { - "title": "Edit Agents", + "title": "Modifier les agents", "route": "settings_teams_edit_members", - "body": "Edit agents in your team." + "body": "Modifier les agents dans votre équipe." }, { - "title": "Finish", + "title": "Terminer", "route": "settings_teams_edit_finish", "body": "Vous êtes paré !" } ] }, "TEAM_FORM": { - "ERROR_MESSAGE": "Couldn't save the team details. Try again." + "ERROR_MESSAGE": "Impossible d'enregistrer les détails de l'équipe. Veuillez réessayer." }, "AGENTS": { "AGENT": "AGENT", "EMAIL": "COURRIEL", "BUTTON_TEXT": "Ajouter des agents", - "ADD_AGENTS": "Adding Agents to your Team...", - "SELECT": "select", - "SELECT_ALL": "select all agents", - "SELECTED_COUNT": "%{selected} out of %{total} agents selected." + "ADD_AGENTS": "Ajout d'agents à votre équipe...", + "SELECT": "sélectionner", + "SELECT_ALL": "sélectionner tous les agents", + "SELECTED_COUNT": "%{selected} agents sur %{total} sélectionnés." }, "ADD": { "TITLE": "Ajouter des agents à l'équipe - %{teamName}", - "DESC": "Add Agents to your newly created team. This lets you collaborate as a team on conversations, get notified on new events in the same conversation.", - "SELECT": "select", - "SELECT_ALL": "select all agents", - "SELECTED_COUNT": "%{selected} out of %{total} agents selected.", + "DESC": "Ajouter des agents à votre équipe nouvellement créée. Cela vous permet de collaborer en équipe sur les conversations, d'être informé des nouveaux événements dans la même conversation.", + "SELECT": "sélectionner", + "SELECT_ALL": "sélectionner tous les agents", + "SELECTED_COUNT": "%{selected} agents sur %{total} sélectionnés.", "BUTTON_TEXT": "Ajouter des agents", - "AGENT_VALIDATION_ERROR": "Select atleaset one agent." + "AGENT_VALIDATION_ERROR": "Veuillez sélectionner au moins un agent." }, "FINISH": { - "TITLE": "Your team is ready!", - "MESSAGE": "You can now collaborate as a team on conversations. Happy supporting ", - "BUTTON_TEXT": "Finish" + "TITLE": "Votre équipe est prête !", + "MESSAGE": "Vous pouvez maintenant collaborer en tant qu'équipe dans les conversations. Bonne assistance ", + "BUTTON_TEXT": "Terminer" }, "DELETE": { "BUTTON_TEXT": "Supprimer", "API": { - "SUCCESS_MESSAGE": "Team deleted successfully.", - "ERROR_MESSAGE": "Couldn't delete the team. Try again." + "SUCCESS_MESSAGE": "Équipe supprimée avec succès.", + "ERROR_MESSAGE": "Impossible de supprimer l'équipe. Veuillez réessayer." }, "CONFIRM": { - "TITLE": "Are you sure want to delete - %{teamName}", - "PLACE_HOLDER": "Please type {teamName} to confirm", - "MESSAGE": "Deleting the team will remove the team assignment from the conversations assigned to this team.", + "TITLE": "Voulez-vous vraiment supprimer - %{teamName}", + "PLACE_HOLDER": "Veuillez entrer {teamName} pour confirmer", + "MESSAGE": "La suppression de l'équipe supprimera les affectations liées aux conversations de cette équipe.", "YES": "Supprimer ", "NO": "Annuler" } }, "SETTINGS": "Paramètres", "FORM": { - "UPDATE": "Update team", - "CREATE": "Create team", + "UPDATE": "Mettre à jour l'équipe", + "CREATE": "Créer une équipe", "NAME": { - "LABEL": "Team name", - "PLACEHOLDER": "Example: Sales, Customer Support" + "LABEL": "Nom de l'équipe", + "PLACEHOLDER": "Exemple : Ventes, Support Client" }, "DESCRIPTION": { - "LABEL": "Team Description", - "PLACEHOLDER": "Short description about this team." + "LABEL": "Description de l'équipe", + "PLACEHOLDER": "Brève description de cette équipe." }, "AUTO_ASSIGN": { - "LABEL": "Allow auto assign for this team." + "LABEL": "Autoriser l'affectation automatique pour cette équipe." }, - "SUBMIT_CREATE": "Create team" + "SUBMIT_CREATE": "Créer une équipe" } } } diff --git a/app/javascript/dashboard/i18n/locale/he/agentMgmt.json b/app/javascript/dashboard/i18n/locale/he/agentMgmt.json index ef673c7a5f5d..f36486efdd78 100644 --- a/app/javascript/dashboard/i18n/locale/he/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/he/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "לא נמצא סוכן." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/he/campaign.json b/app/javascript/dashboard/i18n/locale/he/campaign.json index b9b2447df650..55ad45210f71 100644 --- a/app/javascript/dashboard/i18n/locale/he/campaign.json +++ b/app/javascript/dashboard/i18n/locale/he/campaign.json @@ -14,6 +14,17 @@ "PLACEHOLDER": "אנא הכנס כותרת לקמפיין", "ERROR": "כותרת שדה חובה" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { "LABEL": "הודעה", "PLACEHOLDER": "אנא הכנס הודעה לקמפיין", @@ -72,6 +83,7 @@ "STATUS": "מצב", "SENDER": "שולח", "URL": "URL", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "זמן(שניות)", "CREATED_AT": "נוצר בזמן" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "מופעל", - "DISABLED": "כבוי" + "DISABLED": "כבוי", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "בוט" diff --git a/app/javascript/dashboard/i18n/locale/he/contact.json b/app/javascript/dashboard/i18n/locale/he/contact.json index 9e518119816f..daaa7eac8893 100644 --- a/app/javascript/dashboard/i18n/locale/he/contact.json +++ b/app/javascript/dashboard/i18n/locale/he/contact.json @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "Contacts", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Search", "SEARCH_INPUT_PLACEHOLDER": "Search for contacts", "LIST": { "LOADING_MESSAGE": "Loading contacts...", "404": "No contacts matches your search 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "שם", "PHONE_NUMBER": "Phone Number", @@ -203,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "ביטול", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/he/conversation.json b/app/javascript/dashboard/i18n/locale/he/conversation.json index 2cc9a49a51f4..307bf6d7f5c1 100644 --- a/app/javascript/dashboard/i18n/locale/he/conversation.json +++ b/app/javascript/dashboard/i18n/locale/he/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "Remove Selection", "DOWNLOAD": "הורד", "UPLOADING_ATTACHMENTS": "Uploading attachments...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Resolve", "REOPEN_ACTION": "Reopen", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team", "CHANGE_STATUS": "Conversation status changed", @@ -64,6 +69,10 @@ "SELECT_AGENT": "בחר סוכן", "REMOVE": "Remove", "ASSIGN": "Assign" + }, + "CONTEXT_MENU": { + "COPY": "Copy", + "DELETE": "מחק" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/he/csatMgmt.json b/app/javascript/dashboard/i18n/locale/he/csatMgmt.json new file mode 100644 index 000000000000..d7d2efc2ada6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/he/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/he/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/he/inboxMgmt.json index f0ff404de0e5..e962f1c9cf76 100644 --- a/app/javascript/dashboard/i18n/locale/he/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/he/inboxMgmt.json @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "We were not able to authenticate Twilio credentials, please try again" } }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." + }, "API_CHANNEL": { "TITLE": "API Channel", "DESC": "Integrate with API channel and start supporting your customers.", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "Start forwarding your emails to the following email address." }, "AUTH": { - "TITLE": "Channels", - "DESC": "Currently, we support Website live chat widgets, Facebook Pages, Twitter profiles and Whatsapp as platforms. We have more platforms like Email, Telegram and Line in the works, which will be out soon." + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "סוכנים", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "מופעל", "DISABLED": "כבוי" + }, + "ENABLE_CSAT": { + "ENABLED": "מופעל", + "DISABLED": "כבוי" } }, "DELETE": { @@ -255,6 +267,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Enable auto assignment", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Inbox Settings", "INBOX_UPDATE_SUB_TEXT": "Update your inbox settings", "AUTO_ASSIGNMENT_SUB_TEXT": "Enable or disable the automatic assignment of new conversations to the agents added to this inbox.", diff --git a/app/javascript/dashboard/i18n/locale/he/integrations.json b/app/javascript/dashboard/i18n/locale/he/integrations.json index d01e57955f83..4217bb205ae2 100644 --- a/app/javascript/dashboard/i18n/locale/he/integrations.json +++ b/app/javascript/dashboard/i18n/locale/he/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

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

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

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

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

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

" + } + }, "DELETE": { "BUTTON_TEXT": "מחק", "API": { diff --git a/app/javascript/dashboard/i18n/locale/he/report.json b/app/javascript/dashboard/i18n/locale/he/report.json index b3788bda3590..58f12ae0176b 100644 --- a/app/javascript/dashboard/i18n/locale/he/report.json +++ b/app/javascript/dashboard/i18n/locale/he/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "Reports", + "HEADER": "Overview", "LOADING_CHART": "Loading chart data...", "NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.", "DOWNLOAD_AGENT_REPORTS": "Download agent reports", @@ -50,7 +50,41 @@ { "id": 4, "name": "Last year" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "HEADER": "CSAT Reports", + "NO_RECORDS": "There are no CSAT survey responses available.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Assigned agent", + "RATING": "Rating", + "FEEDBACK_TEXT": "Feedback comment" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/he/settings.json b/app/javascript/dashboard/i18n/locale/he/settings.json index 102a1867153b..09e0e17935fb 100644 --- a/app/javascript/dashboard/i18n/locale/he/settings.json +++ b/app/javascript/dashboard/i18n/locale/he/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Email Notifications", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "Account Settings", "APPLICATIONS": "Applications", "LABELS": "Labels", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with", + "REPORTS_OVERVIEW": "Overview", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "New Account", diff --git a/app/javascript/dashboard/i18n/locale/hi/agentMgmt.json b/app/javascript/dashboard/i18n/locale/hi/agentMgmt.json index 2b2358c9a71f..de999a260e18 100644 --- a/app/javascript/dashboard/i18n/locale/hi/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/hi/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "No agents found." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/hi/campaign.json b/app/javascript/dashboard/i18n/locale/hi/campaign.json index f1c2496691fd..95ed4d199d86 100644 --- a/app/javascript/dashboard/i18n/locale/hi/campaign.json +++ b/app/javascript/dashboard/i18n/locale/hi/campaign.json @@ -14,6 +14,17 @@ "PLACEHOLDER": "Please enter the title of campaign", "ERROR": "Title is required" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { "LABEL": "Message", "PLACEHOLDER": "Please enter the message of campaign", @@ -72,6 +83,7 @@ "STATUS": "Status", "SENDER": "Sender", "URL": "URL", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "Time(Seconds)", "CREATED_AT": "Created at" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "Enabled", - "DISABLED": "Disabled" + "DISABLED": "Disabled", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "Bot" diff --git a/app/javascript/dashboard/i18n/locale/hi/contact.json b/app/javascript/dashboard/i18n/locale/hi/contact.json index 84e6303fc46a..051aad27ee02 100644 --- a/app/javascript/dashboard/i18n/locale/hi/contact.json +++ b/app/javascript/dashboard/i18n/locale/hi/contact.json @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "Contacts", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Search", "SEARCH_INPUT_PLACEHOLDER": "Search for contacts", "LIST": { "LOADING_MESSAGE": "Loading contacts...", "404": "No contacts matches your search 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Name", "PHONE_NUMBER": "Phone Number", @@ -203,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Cancel", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/hi/conversation.json b/app/javascript/dashboard/i18n/locale/hi/conversation.json index 976d1395a231..81c023aa5460 100644 --- a/app/javascript/dashboard/i18n/locale/hi/conversation.json +++ b/app/javascript/dashboard/i18n/locale/hi/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "Remove Selection", "DOWNLOAD": "Download", "UPLOADING_ATTACHMENTS": "Uploading attachments...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Resolve", "REOPEN_ACTION": "Reopen", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team", "CHANGE_STATUS": "Conversation status changed", @@ -64,6 +69,10 @@ "SELECT_AGENT": "Select Agent", "REMOVE": "Remove", "ASSIGN": "Assign" + }, + "CONTEXT_MENU": { + "COPY": "Copy", + "DELETE": "Delete" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/hi/csatMgmt.json b/app/javascript/dashboard/i18n/locale/hi/csatMgmt.json new file mode 100644 index 000000000000..d7d2efc2ada6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/hi/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/hi/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/hi/inboxMgmt.json index 06eeb3d5d432..7bb14a833896 100644 --- a/app/javascript/dashboard/i18n/locale/hi/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/hi/inboxMgmt.json @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "We were not able to authenticate Twilio credentials, please try again" } }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." + }, "API_CHANNEL": { "TITLE": "API Channel", "DESC": "Integrate with API channel and start supporting your customers.", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "Start forwarding your emails to the following email address." }, "AUTH": { - "TITLE": "Channels", - "DESC": "Currently we support Website live chat widgets, Facebook Pages and Twitter profiles as platforms. We have more platforms like Whatsapp, Email, Telegram and Line in the works, which will be out soon." + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "Agents", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Enabled", "DISABLED": "Disabled" + }, + "ENABLE_CSAT": { + "ENABLED": "Enabled", + "DISABLED": "Disabled" } }, "DELETE": { @@ -255,6 +267,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Enable auto assignment", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Inbox Settings", "INBOX_UPDATE_SUB_TEXT": "Update your inbox settings", "AUTO_ASSIGNMENT_SUB_TEXT": "Enable or disable the automatic assignment of new conversations to the agents added to this inbox.", diff --git a/app/javascript/dashboard/i18n/locale/hi/integrations.json b/app/javascript/dashboard/i18n/locale/hi/integrations.json index c75454f9e992..a54d8e9e000a 100644 --- a/app/javascript/dashboard/i18n/locale/hi/integrations.json +++ b/app/javascript/dashboard/i18n/locale/hi/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

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

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

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

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

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

" + } + }, "DELETE": { "BUTTON_TEXT": "Delete", "API": { diff --git a/app/javascript/dashboard/i18n/locale/hi/report.json b/app/javascript/dashboard/i18n/locale/hi/report.json index cf2c14a57f91..a7df12839494 100644 --- a/app/javascript/dashboard/i18n/locale/hi/report.json +++ b/app/javascript/dashboard/i18n/locale/hi/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "Reports", + "HEADER": "Overview", "LOADING_CHART": "Loading chart data...", "NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.", "DOWNLOAD_AGENT_REPORTS": "Download agent reports", @@ -50,7 +50,41 @@ { "id": 4, "name": "Last year" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "HEADER": "CSAT Reports", + "NO_RECORDS": "There are no CSAT survey responses available.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Assigned agent", + "RATING": "Rating", + "FEEDBACK_TEXT": "Feedback comment" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/hi/settings.json b/app/javascript/dashboard/i18n/locale/hi/settings.json index f2d2852918fc..4881fbf89d87 100644 --- a/app/javascript/dashboard/i18n/locale/hi/settings.json +++ b/app/javascript/dashboard/i18n/locale/hi/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Email Notifications", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "Account Settings", "APPLICATIONS": "Applications", "LABELS": "Labels", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with", + "REPORTS_OVERVIEW": "Overview", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "New Account", diff --git a/app/javascript/dashboard/i18n/locale/hu/agentMgmt.json b/app/javascript/dashboard/i18n/locale/hu/agentMgmt.json index e5a65c807a4e..6e8e8053aa9f 100644 --- a/app/javascript/dashboard/i18n/locale/hu/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/hu/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Nem találunk ügynököt." + "NO_RESULTS": "Nincs találat." } } } diff --git a/app/javascript/dashboard/i18n/locale/hu/campaign.json b/app/javascript/dashboard/i18n/locale/hu/campaign.json index 565758c36ebb..51d507ad0551 100644 --- a/app/javascript/dashboard/i18n/locale/hu/campaign.json +++ b/app/javascript/dashboard/i18n/locale/hu/campaign.json @@ -14,6 +14,17 @@ "PLACEHOLDER": "Please enter the title of campaign", "ERROR": "Title is required" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { "LABEL": "Üzenet", "PLACEHOLDER": "Please enter the message of campaign", @@ -72,6 +83,7 @@ "STATUS": "Státusz", "SENDER": "Sender", "URL": "URL", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "Time(Seconds)", "CREATED_AT": "Created at" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "Engedélyezve", - "DISABLED": "Letiltva" + "DISABLED": "Letiltva", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "Bot" diff --git a/app/javascript/dashboard/i18n/locale/hu/contact.json b/app/javascript/dashboard/i18n/locale/hu/contact.json index 36fb7a632484..2671721c7e18 100644 --- a/app/javascript/dashboard/i18n/locale/hu/contact.json +++ b/app/javascript/dashboard/i18n/locale/hu/contact.json @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "Kontaktok", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Keresés", "SEARCH_INPUT_PLACEHOLDER": "Kontaktok keresése", "LIST": { "LOADING_MESSAGE": "Kontaktok betöltése...", "404": "Nincs a keresésnek megfelelő kontakt 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Név", "PHONE_NUMBER": "Telefonszám", @@ -203,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Mégse", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/hu/conversation.json b/app/javascript/dashboard/i18n/locale/hu/conversation.json index e85c1e88974c..3bc0ee6812c1 100644 --- a/app/javascript/dashboard/i18n/locale/hu/conversation.json +++ b/app/javascript/dashboard/i18n/locale/hu/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "Kijelölés törlése", "DOWNLOAD": "Letöltés", "UPLOADING_ATTACHMENTS": "Csatolt fileok feltöltése...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "Nincs válasz", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Megoldva", "REOPEN_ACTION": "Újranyitás", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "Rich szövegszerkesztő mutatása", "TIP_EMOJI_ICON": "Emoji választó mutatása", "TIP_ATTACH_ICON": "Fileok csatolása", - "ENTER_TO_SEND": "Enter-rel elküld" + "ENTER_TO_SEND": "Enter-rel elküld", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Privát megjegyzés: csak Neked és a csapat tagjainak látható", "CHANGE_STATUS": "A beszélgetés státusza megváltozott", @@ -64,6 +69,10 @@ "SELECT_AGENT": "Ügynök kiválasztása", "REMOVE": "Eltávolítás", "ASSIGN": "Hozzárendelés" + }, + "CONTEXT_MENU": { + "COPY": "Másolás", + "DELETE": "Törlés" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/hu/csatMgmt.json b/app/javascript/dashboard/i18n/locale/hu/csatMgmt.json new file mode 100644 index 000000000000..d7d2efc2ada6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/hu/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/hu/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/hu/inboxMgmt.json index 6ef55fd8970a..ce82a6607a4a 100644 --- a/app/javascript/dashboard/i18n/locale/hu/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/hu/inboxMgmt.json @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "Nem tudtuk hitelesíteni a Twilio fiókodat, kérjük próbáld később" } }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." + }, "API_CHANNEL": { "TITLE": "API csatorna", "DESC": "API-val integrálj és láss neki az ügyfeleid támogatásának.", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "Kezdd el továbbítani az e-maileket a következő e-mail címekre." }, "AUTH": { - "TITLE": "Csatornák", - "DESC": "Currently we support Website live chat widgets, Facebook Pages and Twitter profiles as platforms. We have more platforms like Whatsapp, Email, Telegram and Line in the works, which will be out soon." + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "Ügynökök", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Engedélyezve", "DISABLED": "Letiltva" + }, + "ENABLE_CSAT": { + "ENABLED": "Engedélyezve", + "DISABLED": "Letiltva" } }, "DELETE": { @@ -255,6 +267,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Automata hozzárendelés engedélyezése", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Fiókbeállítások", "INBOX_UPDATE_SUB_TEXT": "Frissítsd az inbox beállításaidat", "AUTO_ASSIGNMENT_SUB_TEXT": "Bekapcsolása vagy kikapcsolása az inboxhoz kapcsolódó automatikus ügynökhozzárendelésnek új beszélgetések esetén.", diff --git a/app/javascript/dashboard/i18n/locale/hu/integrations.json b/app/javascript/dashboard/i18n/locale/hu/integrations.json index d302cb0565b1..313bf8063826 100644 --- a/app/javascript/dashboard/i18n/locale/hu/integrations.json +++ b/app/javascript/dashboard/i18n/locale/hu/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

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

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

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

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

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

" + } + }, "DELETE": { "BUTTON_TEXT": "Törlés", "API": { diff --git a/app/javascript/dashboard/i18n/locale/hu/report.json b/app/javascript/dashboard/i18n/locale/hu/report.json index 1a537be2006c..77b66db53c9d 100644 --- a/app/javascript/dashboard/i18n/locale/hu/report.json +++ b/app/javascript/dashboard/i18n/locale/hu/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "Jelentések", + "HEADER": "Overview", "LOADING_CHART": "Táblázat adatok betöltése...", "NO_ENOUGH_DATA": "Nem érkezett elég adat hogy jelentést generáljunk, kérjük próbáld később.", "DOWNLOAD_AGENT_REPORTS": "Ügynök jelentések letöltése", @@ -50,7 +50,41 @@ { "id": 4, "name": "Last year" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "HEADER": "CSAT Reports", + "NO_RECORDS": "There are no CSAT survey responses available.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Assigned agent", + "RATING": "Rating", + "FEEDBACK_TEXT": "Feedback comment" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/hu/settings.json b/app/javascript/dashboard/i18n/locale/hu/settings.json index 8579e726c14d..14102b1f2801 100644 --- a/app/javascript/dashboard/i18n/locale/hu/settings.json +++ b/app/javascript/dashboard/i18n/locale/hu/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Hangüzenetek", "NOTE": "Hangüzenetek engedélyezése a vezérlőpulton új üzenetek és beszélgetések esetén.", - "ENABLE_AUDIO": "Kapj hangüzenetet ha új beszélgetés vagy üzenet érkezik" + "NONE": "Nincs", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "E-mail értesítések", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "Fiókbeállítások", "APPLICATIONS": "Applications", "LABELS": "Cimkék", - "TEAMS": "Csapatok" + "TEAMS": "Csapatok", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with", + "REPORTS_OVERVIEW": "Overview", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Új fiók", diff --git a/app/javascript/dashboard/i18n/locale/id/agentMgmt.json b/app/javascript/dashboard/i18n/locale/id/agentMgmt.json index d8fb676cc923..d5d59f3122bb 100644 --- a/app/javascript/dashboard/i18n/locale/id/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/id/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Tidak ada agen." + "NO_RESULTS": "Tidak ada hasil ditemukan." } } } diff --git a/app/javascript/dashboard/i18n/locale/id/campaign.json b/app/javascript/dashboard/i18n/locale/id/campaign.json index f6dcf4386fac..6797eb043a22 100644 --- a/app/javascript/dashboard/i18n/locale/id/campaign.json +++ b/app/javascript/dashboard/i18n/locale/id/campaign.json @@ -14,6 +14,17 @@ "PLACEHOLDER": "Please enter the title of campaign", "ERROR": "Title is required" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { "LABEL": "Pesan", "PLACEHOLDER": "Please enter the message of campaign", @@ -72,6 +83,7 @@ "STATUS": "Status", "SENDER": "Sender", "URL": "URL", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "Time(Seconds)", "CREATED_AT": "Created at" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "Diaktifkan", - "DISABLED": "Nonaktif" + "DISABLED": "Nonaktif", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "Bot" diff --git a/app/javascript/dashboard/i18n/locale/id/contact.json b/app/javascript/dashboard/i18n/locale/id/contact.json index 07129ad7f003..9c63b42de22a 100644 --- a/app/javascript/dashboard/i18n/locale/id/contact.json +++ b/app/javascript/dashboard/i18n/locale/id/contact.json @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "Kontak", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Cari", "SEARCH_INPUT_PLACEHOLDER": "Cari Kontak", "LIST": { "LOADING_MESSAGE": "Memuat kontak...", "404": "Tidak ada kontak yang cocok dengan pencarian Anda 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Nama", "PHONE_NUMBER": "Nomor Telpon", @@ -203,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Batalkan", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/id/conversation.json b/app/javascript/dashboard/i18n/locale/id/conversation.json index 32428267e5f7..6c19b4eea7cc 100644 --- a/app/javascript/dashboard/i18n/locale/id/conversation.json +++ b/app/javascript/dashboard/i18n/locale/id/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "Hapus Pilihan", "DOWNLOAD": "Unduh", "UPLOADING_ATTACHMENTS": "Unggah lampiran...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "Tidak ada respon", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Menyelesaikan", "REOPEN_ACTION": "Buka Kembali", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "Tampilkan editor teks", "TIP_EMOJI_ICON": "Tampilkan pemilih emoji", "TIP_ATTACH_ICON": "Lampirkan file", - "ENTER_TO_SEND": "Enter untuk mengirim" + "ENTER_TO_SEND": "Enter untuk mengirim", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Catatan Pribadi: Hanya terlihat oleh Anda dan tim Anda", "CHANGE_STATUS": "Status percakapan berubah", @@ -64,6 +69,10 @@ "SELECT_AGENT": "Pilih Agen", "REMOVE": "Hapus", "ASSIGN": "Tugaskan" + }, + "CONTEXT_MENU": { + "COPY": "Salin", + "DELETE": "Hapus" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/id/csatMgmt.json b/app/javascript/dashboard/i18n/locale/id/csatMgmt.json new file mode 100644 index 000000000000..d7d2efc2ada6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/id/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/id/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/id/inboxMgmt.json index 7b624d13ac1b..12b5570162b5 100644 --- a/app/javascript/dashboard/i18n/locale/id/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/id/inboxMgmt.json @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "Kami tidak dapat mengautentikasi kredensial Twilio, harap coba lagi" } }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." + }, "API_CHANNEL": { "TITLE": "API Channel", "DESC": "Integrasikan dengan saluran API dan mulai dukung pelanggan Anda.", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "Mulailah meneruskan email Anda ke alamat email berikut." }, "AUTH": { - "TITLE": "Channel", - "DESC": "Saat ini, kami mendukung widget obrolan langsung Website, Halaman Facebook, Profil Twitter, dan Whatsapp sebagai platform. Kami memiliki lebih banyak platform seperti Email, Telegram dan Line dalam pengembangan, yang akan segera tersedia." + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "Agen", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Diaktifkan", "DISABLED": "Nonaktif" + }, + "ENABLE_CSAT": { + "ENABLED": "Diaktifkan", + "DISABLED": "Nonaktif" } }, "DELETE": { @@ -255,6 +267,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Aktifkan penugasan otomatis", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Pengaturan Kotak Masuk", "INBOX_UPDATE_SUB_TEXT": "Perbarui pengaturan kotak masuk Anda", "AUTO_ASSIGNMENT_SUB_TEXT": "Mengaktifkan atau menonaktifkan penugasan otomatis percakapan baru ke agen yang ditambahkan ke kotak masuk ini.", diff --git a/app/javascript/dashboard/i18n/locale/id/integrations.json b/app/javascript/dashboard/i18n/locale/id/integrations.json index a088bac90174..27f11f168a6e 100644 --- a/app/javascript/dashboard/i18n/locale/id/integrations.json +++ b/app/javascript/dashboard/i18n/locale/id/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

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

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

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

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

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

" + } + }, "DELETE": { "BUTTON_TEXT": "Hapus", "API": { diff --git a/app/javascript/dashboard/i18n/locale/id/report.json b/app/javascript/dashboard/i18n/locale/id/report.json index 55e60d0265a3..c4ea9b752b6a 100644 --- a/app/javascript/dashboard/i18n/locale/id/report.json +++ b/app/javascript/dashboard/i18n/locale/id/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "Laporan", + "HEADER": "Overview", "LOADING_CHART": "Memuat data grafik...", "NO_ENOUGH_DATA": "Kami belum menerima cukup data untuk membuat laporan, Silakan coba lagi nanti.", "DOWNLOAD_AGENT_REPORTS": "Unduh laporan agen", @@ -50,7 +50,41 @@ { "id": 4, "name": "Tahun terakhir" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "HEADER": "CSAT Reports", + "NO_RECORDS": "There are no CSAT survey responses available.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Assigned agent", + "RATING": "Rating", + "FEEDBACK_TEXT": "Feedback comment" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/id/settings.json b/app/javascript/dashboard/i18n/locale/id/settings.json index bd206b161aa1..50005e692be3 100644 --- a/app/javascript/dashboard/i18n/locale/id/settings.json +++ b/app/javascript/dashboard/i18n/locale/id/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Pemberitahuan Audio", "NOTE": "Aktifkan notifikasi audio di dasbor untuk pesan dan percakapan baru.", - "ENABLE_AUDIO": "Putar pemberitahuan audio ketika percakapan baru dibuat atau pesan baru masuk" + "NONE": "Tidak ada", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Notifikasi Email", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "Pengaturan Akun", "APPLICATIONS": "Applications", "LABELS": "Label", - "TEAMS": "Tim" + "TEAMS": "Tim", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with", + "REPORTS_OVERVIEW": "Overview", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Akun Baru", diff --git a/app/javascript/dashboard/i18n/locale/it/agentMgmt.json b/app/javascript/dashboard/i18n/locale/it/agentMgmt.json index 59dfa55fd793..38cf201360db 100644 --- a/app/javascript/dashboard/i18n/locale/it/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/it/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Nessun agente trovato." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/it/campaign.json b/app/javascript/dashboard/i18n/locale/it/campaign.json index b81407e06aba..e03bf8edd48b 100644 --- a/app/javascript/dashboard/i18n/locale/it/campaign.json +++ b/app/javascript/dashboard/i18n/locale/it/campaign.json @@ -14,6 +14,17 @@ "PLACEHOLDER": "Please enter the title of campaign", "ERROR": "Title is required" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { "LABEL": "Messaggio", "PLACEHOLDER": "Please enter the message of campaign", @@ -72,6 +83,7 @@ "STATUS": "Stato", "SENDER": "Sender", "URL": "URL", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "Time(Seconds)", "CREATED_AT": "Created at" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "Abilitato", - "DISABLED": "Disabilitato" + "DISABLED": "Disabilitato", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "Bot" diff --git a/app/javascript/dashboard/i18n/locale/it/contact.json b/app/javascript/dashboard/i18n/locale/it/contact.json index f21ec859dfc7..b7610853bc68 100644 --- a/app/javascript/dashboard/i18n/locale/it/contact.json +++ b/app/javascript/dashboard/i18n/locale/it/contact.json @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "Contacts", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Search", "SEARCH_INPUT_PLACEHOLDER": "Search for contacts", "LIST": { "LOADING_MESSAGE": "Loading contacts...", "404": "No contacts matches your search 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "nome", "PHONE_NUMBER": "Phone Number", @@ -203,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "annulla", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/it/conversation.json b/app/javascript/dashboard/i18n/locale/it/conversation.json index 390c54117f8a..fe10fc000968 100644 --- a/app/javascript/dashboard/i18n/locale/it/conversation.json +++ b/app/javascript/dashboard/i18n/locale/it/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "Remove Selection", "DOWNLOAD": "Scaricare", "UPLOADING_ATTACHMENTS": "Uploading attachments...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Risolvi", "REOPEN_ACTION": "Riapri", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Nota privata: visibile solo a te e al tuo team", "CHANGE_STATUS": "Stato conversazione cambiato", @@ -64,6 +69,10 @@ "SELECT_AGENT": "Select Agent", "REMOVE": "Rimuovi", "ASSIGN": "Assign" + }, + "CONTEXT_MENU": { + "COPY": "Copia", + "DELETE": "Cancellare" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/it/csatMgmt.json b/app/javascript/dashboard/i18n/locale/it/csatMgmt.json new file mode 100644 index 000000000000..d7d2efc2ada6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/it/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json index 6a852df62138..dada13d1cd88 100644 --- a/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "Non siamo stati in grado di autenticare le credenziali di Twilio, riprova" } }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." + }, "API_CHANNEL": { "TITLE": "API Channel", "DESC": "Integrate with API channel and start supporting your customers.", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "Start forwarding your emails to the following email address." }, "AUTH": { - "TITLE": "Canali", - "DESC": "Attualmente supportiamo come piattaforme i widget della chat dal vivo del sito, le pagine Facebook e Twitter. Abbiamo più piattaforme come Whatsapp, Email, Telegram e Line nei lavori, che saranno disponibili a breve." + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "Agenti", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Abilitato", "DISABLED": "Disabilitato" + }, + "ENABLE_CSAT": { + "ENABLED": "Abilitato", + "DISABLED": "Disabilitato" } }, "DELETE": { @@ -255,6 +267,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Abilita assegnazione automatica", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Impostazioni della Posta In Arrivo", "INBOX_UPDATE_SUB_TEXT": "Aggiorna le impostazioni della posta in arrivo", "AUTO_ASSIGNMENT_SUB_TEXT": "Abilita o disabilita l'assegnazione automatica di nuove conversazioni agli agenti aggiunti a questa casella di posta.", diff --git a/app/javascript/dashboard/i18n/locale/it/integrations.json b/app/javascript/dashboard/i18n/locale/it/integrations.json index c761143adf35..2cc391d77b69 100644 --- a/app/javascript/dashboard/i18n/locale/it/integrations.json +++ b/app/javascript/dashboard/i18n/locale/it/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

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

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

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

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

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

" + } + }, "DELETE": { "BUTTON_TEXT": "Cancellare", "API": { diff --git a/app/javascript/dashboard/i18n/locale/it/report.json b/app/javascript/dashboard/i18n/locale/it/report.json index e8dc548a3a9d..b048da5599ed 100644 --- a/app/javascript/dashboard/i18n/locale/it/report.json +++ b/app/javascript/dashboard/i18n/locale/it/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "Segnalazioni", + "HEADER": "Overview", "LOADING_CHART": "Caricamento dati grafici...", "NO_ENOUGH_DATA": "Non abbiamo ricevuto abbastanza dati per generare la segnalazione, riprova più tardi.", "DOWNLOAD_AGENT_REPORTS": "Download agent reports", @@ -50,7 +50,41 @@ { "id": 4, "name": "Last year" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "HEADER": "CSAT Reports", + "NO_RECORDS": "There are no CSAT survey responses available.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Assigned agent", + "RATING": "Rating", + "FEEDBACK_TEXT": "Feedback comment" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/it/settings.json b/app/javascript/dashboard/i18n/locale/it/settings.json index 97129ac1d768..3f678bd3ff7c 100644 --- a/app/javascript/dashboard/i18n/locale/it/settings.json +++ b/app/javascript/dashboard/i18n/locale/it/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Notifiche email", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "Impostazioni Account", "APPLICATIONS": "Applications", "LABELS": "Labels", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with", + "REPORTS_OVERVIEW": "Overview", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "New Account", diff --git a/app/javascript/dashboard/i18n/locale/ja/agentMgmt.json b/app/javascript/dashboard/i18n/locale/ja/agentMgmt.json index 48dfaa581f13..68fd4a109a85 100644 --- a/app/javascript/dashboard/i18n/locale/ja/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ja/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "担当者が見つかりません" + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/ja/campaign.json b/app/javascript/dashboard/i18n/locale/ja/campaign.json index c4fb4eacd3f1..d09311e47d07 100644 --- a/app/javascript/dashboard/i18n/locale/ja/campaign.json +++ b/app/javascript/dashboard/i18n/locale/ja/campaign.json @@ -14,6 +14,17 @@ "PLACEHOLDER": "Please enter the title of campaign", "ERROR": "Title is required" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { "LABEL": "メッセージ", "PLACEHOLDER": "Please enter the message of campaign", @@ -72,6 +83,7 @@ "STATUS": "状況", "SENDER": "Sender", "URL": "URL", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "Time(Seconds)", "CREATED_AT": "Created at" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "有効です", - "DISABLED": "無効です" + "DISABLED": "無効です", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "Bot" diff --git a/app/javascript/dashboard/i18n/locale/ja/contact.json b/app/javascript/dashboard/i18n/locale/ja/contact.json index 95a276840cc1..da1ff34a201b 100644 --- a/app/javascript/dashboard/i18n/locale/ja/contact.json +++ b/app/javascript/dashboard/i18n/locale/ja/contact.json @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "Contacts", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Search", "SEARCH_INPUT_PLACEHOLDER": "Search for contacts", "LIST": { "LOADING_MESSAGE": "Loading contacts...", "404": "No contacts matches your search 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "名前", "PHONE_NUMBER": "電話番号", @@ -203,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "キャンセル", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/ja/conversation.json b/app/javascript/dashboard/i18n/locale/ja/conversation.json index ee3e35d21fb1..4ec66f9f3a11 100644 --- a/app/javascript/dashboard/i18n/locale/ja/conversation.json +++ b/app/javascript/dashboard/i18n/locale/ja/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "選択項目を削除", "DOWNLOAD": "ダウンロード", "UPLOADING_ATTACHMENTS": "Uploading attachments...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "解決する", "REOPEN_ACTION": "再開する", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "非公開設定の注意:あなたとあなたのチームのみに表示されます", "CHANGE_STATUS": "会話の状態が変更されました", @@ -64,6 +69,10 @@ "SELECT_AGENT": "Select Agent", "REMOVE": "削除", "ASSIGN": "Assign" + }, + "CONTEXT_MENU": { + "COPY": "コピー", + "DELETE": "削除" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/ja/csatMgmt.json b/app/javascript/dashboard/i18n/locale/ja/csatMgmt.json new file mode 100644 index 000000000000..d7d2efc2ada6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ja/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/ja/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ja/inboxMgmt.json index 223c3e8ef21a..13e568a7c084 100644 --- a/app/javascript/dashboard/i18n/locale/ja/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ja/inboxMgmt.json @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "Twilio の認証ができませんでした。もう一度やり直してください。" } }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." + }, "API_CHANNEL": { "TITLE": "APIチャンネル", "DESC": "APIチャンネルと連携し、顧客のサポートを開始します。", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "以下のメールアドレスにメールを転送します。" }, "AUTH": { - "TITLE": "チャンネル", - "DESC": "Currently we support Website live chat widgets, Facebook Pages and Twitter profiles as platforms. We have more platforms like Whatsapp, Email, Telegram and Line in the works, which will be out soon." + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "担当者", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "有効です", "DISABLED": "無効です" + }, + "ENABLE_CSAT": { + "ENABLED": "有効です", + "DISABLED": "無効です" } }, "DELETE": { @@ -255,6 +267,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "自動割り当てを有効にする", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "受信トレイの設定", "INBOX_UPDATE_SUB_TEXT": "受信トレイの設定を更新する", "AUTO_ASSIGNMENT_SUB_TEXT": "この受信トレイに追加された担当者への新しい会話の自動割り当てを有効または無効にします。", diff --git a/app/javascript/dashboard/i18n/locale/ja/integrations.json b/app/javascript/dashboard/i18n/locale/ja/integrations.json index b4cbac8edbbb..144fcb5dc005 100644 --- a/app/javascript/dashboard/i18n/locale/ja/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ja/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

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

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

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

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

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

" + } + }, "DELETE": { "BUTTON_TEXT": "削除", "API": { diff --git a/app/javascript/dashboard/i18n/locale/ja/report.json b/app/javascript/dashboard/i18n/locale/ja/report.json index e2dd96880420..0924776afa54 100644 --- a/app/javascript/dashboard/i18n/locale/ja/report.json +++ b/app/javascript/dashboard/i18n/locale/ja/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "レポート", + "HEADER": "Overview", "LOADING_CHART": "グラフデータを読み込んでいます...", "NO_ENOUGH_DATA": "レポートを生成するための十分なデータポイントを受信していません。後でもう一度お試しください。", "DOWNLOAD_AGENT_REPORTS": "Download agent reports", @@ -50,7 +50,41 @@ { "id": 4, "name": "Last year" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "HEADER": "CSAT Reports", + "NO_RECORDS": "There are no CSAT survey responses available.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Assigned agent", + "RATING": "Rating", + "FEEDBACK_TEXT": "Feedback comment" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/ja/settings.json b/app/javascript/dashboard/i18n/locale/ja/settings.json index dcf87f61b257..e2195e6f1e1f 100644 --- a/app/javascript/dashboard/i18n/locale/ja/settings.json +++ b/app/javascript/dashboard/i18n/locale/ja/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Eメール通知", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "アカウント設定", "APPLICATIONS": "Applications", "LABELS": "ラベル", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with", + "REPORTS_OVERVIEW": "Overview", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "新規アカウント", diff --git a/app/javascript/dashboard/i18n/locale/ko/agentMgmt.json b/app/javascript/dashboard/i18n/locale/ko/agentMgmt.json index aea59be193fc..a1baad94ccf8 100644 --- a/app/javascript/dashboard/i18n/locale/ko/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ko/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "에이전트를 찾을 수 없음." + "NO_RESULTS": "검색 결과가 없습니다." } } } diff --git a/app/javascript/dashboard/i18n/locale/ko/campaign.json b/app/javascript/dashboard/i18n/locale/ko/campaign.json index f3774be19464..d0e65e03cb3f 100644 --- a/app/javascript/dashboard/i18n/locale/ko/campaign.json +++ b/app/javascript/dashboard/i18n/locale/ko/campaign.json @@ -14,6 +14,17 @@ "PLACEHOLDER": "Please enter the title of campaign", "ERROR": "Title is required" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { "LABEL": "메시지", "PLACEHOLDER": "Please enter the message of campaign", @@ -72,6 +83,7 @@ "STATUS": "상태", "SENDER": "Sender", "URL": "URL", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "Time(Seconds)", "CREATED_AT": "Created at" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "사용함", - "DISABLED": "사용 안 함" + "DISABLED": "사용 안 함", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "봇" diff --git a/app/javascript/dashboard/i18n/locale/ko/contact.json b/app/javascript/dashboard/i18n/locale/ko/contact.json index b63eb581a235..07f3851dce55 100644 --- a/app/javascript/dashboard/i18n/locale/ko/contact.json +++ b/app/javascript/dashboard/i18n/locale/ko/contact.json @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "연락처", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "검색", "SEARCH_INPUT_PLACEHOLDER": "연락처 검색", "LIST": { "LOADING_MESSAGE": "연락처를 불러오는 중...", "404": "검색과 일치하는 연락처 없음 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "이름", "PHONE_NUMBER": "전화 번호", @@ -203,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "취소", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/ko/conversation.json b/app/javascript/dashboard/i18n/locale/ko/conversation.json index 91f4bf887729..d0d635b06561 100644 --- a/app/javascript/dashboard/i18n/locale/ko/conversation.json +++ b/app/javascript/dashboard/i18n/locale/ko/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "선택 항목 제거", "DOWNLOAD": "다운로드", "UPLOADING_ATTACHMENTS": "첨부 업로드 중...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "응답없음", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "해결함", "REOPEN_ACTION": "다시 열기", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "웹 편집기 보기", "TIP_EMOJI_ICON": "이모티콘 보기", "TIP_ATTACH_ICON": "파일 첨부", - "ENTER_TO_SEND": "엔터를 눌러 전송하기" + "ENTER_TO_SEND": "엔터를 눌러 전송하기", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "개인 노트: 귀하와 귀하의 팀만 볼 수 있음", "CHANGE_STATUS": "대화 상태가 변경됨", @@ -64,6 +69,10 @@ "SELECT_AGENT": "에이전트 선택", "REMOVE": "제거", "ASSIGN": "할당하다" + }, + "CONTEXT_MENU": { + "COPY": "복사", + "DELETE": "삭제" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/ko/csatMgmt.json b/app/javascript/dashboard/i18n/locale/ko/csatMgmt.json new file mode 100644 index 000000000000..d7d2efc2ada6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ko/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/ko/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ko/inboxMgmt.json index 97561d33deee..f382091aad32 100644 --- a/app/javascript/dashboard/i18n/locale/ko/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ko/inboxMgmt.json @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "Twilio 자격 증명을 인증할 수 없습니다. 다시 시도하십시오." } }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." + }, "API_CHANNEL": { "TITLE": "API 채널", "DESC": "API 채널과 통합하여 고객 지원을 시작하십시오.", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "당신의 이메일 주소로 이메일 전달을 시작하십시오." }, "AUTH": { - "TITLE": "채널", - "DESC": "현재 우리는 웹사이트 라이브 채팅 위젯, 페이스북 페이지 및 트위터 프로필을 플랫폼으로 지원한다. 우리는 곧 왓츠앱, 이메일, 텔레그램, 라인 같은 플랫폼이 출시될 예정입니다." + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "에이전트", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "사용함", "DISABLED": "사용 안 함" + }, + "ENABLE_CSAT": { + "ENABLED": "사용함", + "DISABLED": "사용 안 함" } }, "DELETE": { @@ -255,6 +267,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "자동 할당 사용", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "받은 메시지함 설정", "INBOX_UPDATE_SUB_TEXT": "받은 메시지함 설정 업데이트", "AUTO_ASSIGNMENT_SUB_TEXT": "받은 메시지에 추가된 에이전트에 새 대화를 자동으로 할당하거나 할당하지 않도록 설정하십시오.", diff --git a/app/javascript/dashboard/i18n/locale/ko/integrations.json b/app/javascript/dashboard/i18n/locale/ko/integrations.json index 907df1cac7e8..572084d5ff63 100644 --- a/app/javascript/dashboard/i18n/locale/ko/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ko/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

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

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

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

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

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

" + } + }, "DELETE": { "BUTTON_TEXT": "삭제", "API": { diff --git a/app/javascript/dashboard/i18n/locale/ko/report.json b/app/javascript/dashboard/i18n/locale/ko/report.json index 57f0786af1ab..c9709535219f 100644 --- a/app/javascript/dashboard/i18n/locale/ko/report.json +++ b/app/javascript/dashboard/i18n/locale/ko/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "보고서", + "HEADER": "Overview", "LOADING_CHART": "차트 데이터 불러오는 중...", "NO_ENOUGH_DATA": "보고서를 생성할 수 있는 데이터 포인트가 부족합니다. 나중에 다시 시도하십시오.", "DOWNLOAD_AGENT_REPORTS": "다운로드 에이전트 보고서", @@ -50,7 +50,41 @@ { "id": 4, "name": "Last year" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "HEADER": "CSAT Reports", + "NO_RECORDS": "There are no CSAT survey responses available.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Assigned agent", + "RATING": "Rating", + "FEEDBACK_TEXT": "Feedback comment" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/ko/settings.json b/app/javascript/dashboard/i18n/locale/ko/settings.json index 81f208e6d607..d82315891dfe 100644 --- a/app/javascript/dashboard/i18n/locale/ko/settings.json +++ b/app/javascript/dashboard/i18n/locale/ko/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "음성 알림", "NOTE": "대시보드에서 새 메시지 및 대화에 대한 오디오 알림을 활성화합니다.", - "ENABLE_AUDIO": "새 대화가 생성되거나 새 메시지가 도착할 때 오디오 알림 재생" + "NONE": "없음", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "이메일 알림", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "계정 설정", "APPLICATIONS": "Applications", "LABELS": "라벨", - "TEAMS": "팀" + "TEAMS": "팀", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with", + "REPORTS_OVERVIEW": "Overview", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "새 계정", diff --git a/app/javascript/dashboard/i18n/locale/ml/agentMgmt.json b/app/javascript/dashboard/i18n/locale/ml/agentMgmt.json index fff303be219f..8b3242c32c3c 100644 --- a/app/javascript/dashboard/i18n/locale/ml/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ml/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "ഏജന്റകളെ ഒന്നും കണ്ടെത്താൻ സാധിച്ചില്ല." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/ml/campaign.json b/app/javascript/dashboard/i18n/locale/ml/campaign.json index e631dade2483..02dcfabd5484 100644 --- a/app/javascript/dashboard/i18n/locale/ml/campaign.json +++ b/app/javascript/dashboard/i18n/locale/ml/campaign.json @@ -14,6 +14,17 @@ "PLACEHOLDER": "Please enter the title of campaign", "ERROR": "Title is required" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { "LABEL": "Message", "PLACEHOLDER": "Please enter the message of campaign", @@ -72,6 +83,7 @@ "STATUS": "സ്റ്റാറ്റസ്", "SENDER": "Sender", "URL": "URL", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "Time(Seconds)", "CREATED_AT": "Created at" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "പ്രവർത്തനക്ഷമമാക്കി", - "DISABLED": "പ്രവർത്തനരഹിതമാക്കി" + "DISABLED": "പ്രവർത്തനരഹിതമാക്കി", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "ബോട്ട്" diff --git a/app/javascript/dashboard/i18n/locale/ml/contact.json b/app/javascript/dashboard/i18n/locale/ml/contact.json index 15bcf3595457..af1c1ea56f89 100644 --- a/app/javascript/dashboard/i18n/locale/ml/contact.json +++ b/app/javascript/dashboard/i18n/locale/ml/contact.json @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "കോൺ‌ടാക്റ്റുകൾ", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "തിരയുക", "SEARCH_INPUT_PLACEHOLDER": "കോൺ‌ടാക്റ്റുകൾക്കായി തിരയുക", "LIST": { "LOADING_MESSAGE": "കോൺ‌ടാക്റ്റുകൾ‌ ലോഡുചെയ്യുന്നു...", "404": "കോൺ‌ടാക്റ്റുകളൊന്നും നിങ്ങളുടെ തിരയലുമായി പൊരുത്തപ്പെടുന്നില്ല", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "പേര്", "PHONE_NUMBER": "ഫോൺ നമ്പർ", @@ -203,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "റദ്ദാക്കുക", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/ml/conversation.json b/app/javascript/dashboard/i18n/locale/ml/conversation.json index 4a8d30d5a52a..fa65ff98d7ab 100644 --- a/app/javascript/dashboard/i18n/locale/ml/conversation.json +++ b/app/javascript/dashboard/i18n/locale/ml/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "തിരഞ്ഞെടുക്കൽ നീക്കംചെയ്യുക", "DOWNLOAD": "ഡൗൺലോഡ്", "UPLOADING_ATTACHMENTS": "Uploading attachments...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "പരിഹരിക്കുക", "REOPEN_ACTION": "വീണ്ടും തുറക്കുക", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "സ്വകാര്യ കുറിപ്പ്: നിങ്ങൾക്കും നിങ്ങളുടെ ടീമിനും മാത്രം ദൃശ്യമാണ്", "CHANGE_STATUS": "സംഭാഷണ നില മാറ്റി", @@ -64,6 +69,10 @@ "SELECT_AGENT": "ഏജന്റ് തിരഞ്ഞെടുക്കുക", "REMOVE": "നീക്കം ചെയ്യുക", "ASSIGN": "നിയോഗിക്കുക" + }, + "CONTEXT_MENU": { + "COPY": "പകർത്തുക", + "DELETE": "ഇല്ലാതാക്കുക" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/ml/csatMgmt.json b/app/javascript/dashboard/i18n/locale/ml/csatMgmt.json new file mode 100644 index 000000000000..d7d2efc2ada6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ml/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json index 34f310ae4e2e..82aa51356c9f 100644 --- a/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "ഞങ്ങൾക്ക് ട്വിലിയോ ക്രെഡൻഷ്യലുകൾ പ്രാമാണീകരിക്കാൻ കഴിഞ്ഞില്ല, ദയവായി വീണ്ടും ശ്രമിക്കുക" } }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." + }, "API_CHANNEL": { "TITLE": "API Channel", "DESC": "Integrate with API channel and start supporting your customers.", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "Start forwarding your emails to the following email address." }, "AUTH": { - "TITLE": "ചാനലുകൾ", - "DESC": "നിലവിൽ ഞങ്ങൾ വെബ്‌സൈറ്റ് തത്സമയ ചാറ്റ് വിഡ്ജറ്റുകൾ, ഫേസ്ബുക്ക് പേജുകൾ, ട്വിറ്റർ പ്രൊഫൈലുകൾ എന്നിവ പ്ലാറ്റ്ഫോമുകളായി പിന്തുണയ്ക്കുന്നു. വാട്ട്സ്ആപ്പ്, ഇമെയിൽ, ടെലിഗ്രാം, ലൈൻ എന്നിവപോലുള്ള കൂടുതൽ പ്ലാറ്റ്ഫോമുകൾ ഞങ്ങളുടെ പക്കലുണ്ട്, അവ ഉടൻ പുറത്തിറങ്ങുന്നത് ആയിരിക്കും." + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "ഏജന്റുമാർ", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "പ്രവർത്തനക്ഷമമാക്കി", "DISABLED": "പ്രവർത്തനരഹിതമാക്കി" + }, + "ENABLE_CSAT": { + "ENABLED": "പ്രവർത്തനക്ഷമമാക്കി", + "DISABLED": "പ്രവർത്തനരഹിതമാക്കി" } }, "DELETE": { @@ -255,6 +267,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "ഓട്ടോ അസൈൻമെന്റ് പ്രവർത്തനക്ഷമമാക്കുക", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Inbox Settings", "INBOX_UPDATE_SUB_TEXT": "Update your inbox settings", "AUTO_ASSIGNMENT_SUB_TEXT": "പുതിയ സംഭാഷണങ്ങളിൽ ലഭ്യമായ ഏജന്റുമാരുടെ ഓട്ടോമാറ്റിക് അസൈൻമെന്റ് പ്രാപ്തമാക്കുകയോ അപ്രാപ്തമാക്കുകയോ ചെയ്യുക", diff --git a/app/javascript/dashboard/i18n/locale/ml/integrations.json b/app/javascript/dashboard/i18n/locale/ml/integrations.json index e0b2f82f51c6..a9a81c11a612 100644 --- a/app/javascript/dashboard/i18n/locale/ml/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ml/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

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

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

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

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

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

" + } + }, "DELETE": { "BUTTON_TEXT": "ഇല്ലാതാക്കുക", "API": { diff --git a/app/javascript/dashboard/i18n/locale/ml/report.json b/app/javascript/dashboard/i18n/locale/ml/report.json index 41080ccd0543..c7edd079a2a1 100644 --- a/app/javascript/dashboard/i18n/locale/ml/report.json +++ b/app/javascript/dashboard/i18n/locale/ml/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "റിപ്പോർട്ടുകൾ", + "HEADER": "Overview", "LOADING_CHART": "ചാർട്ട് ഡാറ്റ ലോഡു ചെയ്യുകയാണ്...", "NO_ENOUGH_DATA": "റിപ്പോർട്ട് സൃഷ്ടിക്കുന്നതിന് ആവശ്യമായ ഡാറ്റ ഞങ്ങൾക്ക് ലഭിച്ചിട്ടില്ല, ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക.", "DOWNLOAD_AGENT_REPORTS": "Download agent reports", @@ -50,7 +50,41 @@ { "id": 4, "name": "Last year" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "HEADER": "CSAT Reports", + "NO_RECORDS": "There are no CSAT survey responses available.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Assigned agent", + "RATING": "Rating", + "FEEDBACK_TEXT": "Feedback comment" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/ml/settings.json b/app/javascript/dashboard/i18n/locale/ml/settings.json index 5e31e694ef06..73ee3a9924b8 100644 --- a/app/javascript/dashboard/i18n/locale/ml/settings.json +++ b/app/javascript/dashboard/i18n/locale/ml/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "ഇമെയിൽ അറിയിപ്പുകൾ", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "അക്കൗണ്ട് ക്രമീകരണങ്ങൾ", "APPLICATIONS": "Applications", "LABELS": "ലേബലുകൾ", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with", + "REPORTS_OVERVIEW": "Overview", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "പുതിയ അക്കൗണ്ട്", diff --git a/app/javascript/dashboard/i18n/locale/ne/agentMgmt.json b/app/javascript/dashboard/i18n/locale/ne/agentMgmt.json index ac4a62127e6e..dcc8c9fdaafa 100644 --- a/app/javascript/dashboard/i18n/locale/ne/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ne/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "No agents found." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/ne/campaign.json b/app/javascript/dashboard/i18n/locale/ne/campaign.json index f1c2496691fd..95ed4d199d86 100644 --- a/app/javascript/dashboard/i18n/locale/ne/campaign.json +++ b/app/javascript/dashboard/i18n/locale/ne/campaign.json @@ -14,6 +14,17 @@ "PLACEHOLDER": "Please enter the title of campaign", "ERROR": "Title is required" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { "LABEL": "Message", "PLACEHOLDER": "Please enter the message of campaign", @@ -72,6 +83,7 @@ "STATUS": "Status", "SENDER": "Sender", "URL": "URL", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "Time(Seconds)", "CREATED_AT": "Created at" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "Enabled", - "DISABLED": "Disabled" + "DISABLED": "Disabled", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "Bot" diff --git a/app/javascript/dashboard/i18n/locale/ne/contact.json b/app/javascript/dashboard/i18n/locale/ne/contact.json index c523b75a663f..cf9824b908c2 100644 --- a/app/javascript/dashboard/i18n/locale/ne/contact.json +++ b/app/javascript/dashboard/i18n/locale/ne/contact.json @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "Contacts", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Search", "SEARCH_INPUT_PLACEHOLDER": "Search for contacts", "LIST": { "LOADING_MESSAGE": "Loading contacts...", "404": "No contacts matches your search 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Name", "PHONE_NUMBER": "Phone Number", @@ -203,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Cancel", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/ne/conversation.json b/app/javascript/dashboard/i18n/locale/ne/conversation.json index 976d1395a231..81c023aa5460 100644 --- a/app/javascript/dashboard/i18n/locale/ne/conversation.json +++ b/app/javascript/dashboard/i18n/locale/ne/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "Remove Selection", "DOWNLOAD": "Download", "UPLOADING_ATTACHMENTS": "Uploading attachments...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Resolve", "REOPEN_ACTION": "Reopen", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team", "CHANGE_STATUS": "Conversation status changed", @@ -64,6 +69,10 @@ "SELECT_AGENT": "Select Agent", "REMOVE": "Remove", "ASSIGN": "Assign" + }, + "CONTEXT_MENU": { + "COPY": "Copy", + "DELETE": "Delete" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/ne/csatMgmt.json b/app/javascript/dashboard/i18n/locale/ne/csatMgmt.json new file mode 100644 index 000000000000..d7d2efc2ada6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ne/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/ne/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ne/inboxMgmt.json index 8948adfc4865..7bb14a833896 100644 --- a/app/javascript/dashboard/i18n/locale/ne/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ne/inboxMgmt.json @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "We were not able to authenticate Twilio credentials, please try again" } }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." + }, "API_CHANNEL": { "TITLE": "API Channel", "DESC": "Integrate with API channel and start supporting your customers.", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "Start forwarding your emails to the following email address." }, "AUTH": { - "TITLE": "Channels", - "DESC": "Currently, we support Website live chat widgets, Facebook Pages, Twitter profiles and Whatsapp as platforms. We have more platforms like Email, Telegram and Line in the works, which will be out soon." + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "Agents", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Enabled", "DISABLED": "Disabled" + }, + "ENABLE_CSAT": { + "ENABLED": "Enabled", + "DISABLED": "Disabled" } }, "DELETE": { @@ -255,6 +267,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Enable auto assignment", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Inbox Settings", "INBOX_UPDATE_SUB_TEXT": "Update your inbox settings", "AUTO_ASSIGNMENT_SUB_TEXT": "Enable or disable the automatic assignment of new conversations to the agents added to this inbox.", diff --git a/app/javascript/dashboard/i18n/locale/ne/integrations.json b/app/javascript/dashboard/i18n/locale/ne/integrations.json index c75454f9e992..a54d8e9e000a 100644 --- a/app/javascript/dashboard/i18n/locale/ne/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ne/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

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

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

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

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

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

" + } + }, "DELETE": { "BUTTON_TEXT": "Delete", "API": { diff --git a/app/javascript/dashboard/i18n/locale/ne/report.json b/app/javascript/dashboard/i18n/locale/ne/report.json index cf2c14a57f91..a7df12839494 100644 --- a/app/javascript/dashboard/i18n/locale/ne/report.json +++ b/app/javascript/dashboard/i18n/locale/ne/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "Reports", + "HEADER": "Overview", "LOADING_CHART": "Loading chart data...", "NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.", "DOWNLOAD_AGENT_REPORTS": "Download agent reports", @@ -50,7 +50,41 @@ { "id": 4, "name": "Last year" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "HEADER": "CSAT Reports", + "NO_RECORDS": "There are no CSAT survey responses available.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Assigned agent", + "RATING": "Rating", + "FEEDBACK_TEXT": "Feedback comment" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/ne/settings.json b/app/javascript/dashboard/i18n/locale/ne/settings.json index ec0278f27199..71bf40055f1e 100644 --- a/app/javascript/dashboard/i18n/locale/ne/settings.json +++ b/app/javascript/dashboard/i18n/locale/ne/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Email Notifications", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "Account Settings", "APPLICATIONS": "Applications", "LABELS": "Labels", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with", + "REPORTS_OVERVIEW": "Overview", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "New Account", diff --git a/app/javascript/dashboard/i18n/locale/nl/agentMgmt.json b/app/javascript/dashboard/i18n/locale/nl/agentMgmt.json index 2ff181b33af3..42f20084db7b 100644 --- a/app/javascript/dashboard/i18n/locale/nl/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/nl/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Geen medewerkers gevonden." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/nl/campaign.json b/app/javascript/dashboard/i18n/locale/nl/campaign.json index c1e700514527..04d3f57956d7 100644 --- a/app/javascript/dashboard/i18n/locale/nl/campaign.json +++ b/app/javascript/dashboard/i18n/locale/nl/campaign.json @@ -14,6 +14,17 @@ "PLACEHOLDER": "Please enter the title of campaign", "ERROR": "Title is required" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { "LABEL": "Message", "PLACEHOLDER": "Please enter the message of campaign", @@ -72,6 +83,7 @@ "STATUS": "Status", "SENDER": "Sender", "URL": "URL", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "Time(Seconds)", "CREATED_AT": "Created at" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "Ingeschakeld", - "DISABLED": "Uitgeschakeld" + "DISABLED": "Uitgeschakeld", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "Bot" diff --git a/app/javascript/dashboard/i18n/locale/nl/contact.json b/app/javascript/dashboard/i18n/locale/nl/contact.json index f0966fbcddf4..5de7c233825f 100644 --- a/app/javascript/dashboard/i18n/locale/nl/contact.json +++ b/app/javascript/dashboard/i18n/locale/nl/contact.json @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "Contacts", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Search", "SEARCH_INPUT_PLACEHOLDER": "Search for contacts", "LIST": { "LOADING_MESSAGE": "Loading contacts...", "404": "No contacts matches your search 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Naam", "PHONE_NUMBER": "Phone Number", @@ -203,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Annuleren", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/nl/conversation.json b/app/javascript/dashboard/i18n/locale/nl/conversation.json index f665e94581ec..6336f74e722c 100644 --- a/app/javascript/dashboard/i18n/locale/nl/conversation.json +++ b/app/javascript/dashboard/i18n/locale/nl/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "Remove Selection", "DOWNLOAD": "Download", "UPLOADING_ATTACHMENTS": "Uploading attachments...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Oplossen", "REOPEN_ACTION": "Heropenen", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Privéopmerking: alleen zichtbaar voor jou en je team", "CHANGE_STATUS": "Gespreksstatus veranderd", @@ -64,6 +69,10 @@ "SELECT_AGENT": "Select Agent", "REMOVE": "Verwijderen", "ASSIGN": "Assign" + }, + "CONTEXT_MENU": { + "COPY": "Kopiëren", + "DELETE": "Verwijderen" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/nl/csatMgmt.json b/app/javascript/dashboard/i18n/locale/nl/csatMgmt.json new file mode 100644 index 000000000000..d7d2efc2ada6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/nl/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/nl/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/nl/inboxMgmt.json index 1f0ddeab5f4e..ac5f15108d1d 100644 --- a/app/javascript/dashboard/i18n/locale/nl/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/nl/inboxMgmt.json @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "Het is niet gelukt om Twilio referenties te verifiëren, probeer het opnieuw" } }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." + }, "API_CHANNEL": { "TITLE": "API Channel", "DESC": "Integrate with API channel and start supporting your customers.", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "Start forwarding your emails to the following email address." }, "AUTH": { - "TITLE": "Kanalen", - "DESC": "Momenteel ondersteunen we website live chat widgets, Facebook pagina's en Twitter-profielen als platformen. We hebben meer platforms zoals Whatsapp, E-mail, Telegram en Lijn in de werken, die binnenkort zullen verschijnen." + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "Agenten", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Ingeschakeld", "DISABLED": "Uitgeschakeld" + }, + "ENABLE_CSAT": { + "ENABLED": "Ingeschakeld", + "DISABLED": "Uitgeschakeld" } }, "DELETE": { @@ -255,6 +267,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Automatische toewijzing inschakelen", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Instellingen Postvak In", "INBOX_UPDATE_SUB_TEXT": "Update uw inbox instellingen", "AUTO_ASSIGNMENT_SUB_TEXT": "In- of uitschakelen van de automatische toewijzing van nieuwe gesprekken aan de agenten die aan deze inbox zijn toegevoegd.", diff --git a/app/javascript/dashboard/i18n/locale/nl/integrations.json b/app/javascript/dashboard/i18n/locale/nl/integrations.json index 2adad48f2dcc..b3fdff191c28 100644 --- a/app/javascript/dashboard/i18n/locale/nl/integrations.json +++ b/app/javascript/dashboard/i18n/locale/nl/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

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

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

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

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

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

" + } + }, "DELETE": { "BUTTON_TEXT": "Verwijderen", "API": { diff --git a/app/javascript/dashboard/i18n/locale/nl/report.json b/app/javascript/dashboard/i18n/locale/nl/report.json index 96d77ba49edc..022294e96660 100644 --- a/app/javascript/dashboard/i18n/locale/nl/report.json +++ b/app/javascript/dashboard/i18n/locale/nl/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "Rapporten", + "HEADER": "Overview", "LOADING_CHART": "Kaartgegevens laden...", "NO_ENOUGH_DATA": "We hebben niet genoeg datapunten ontvangen om een rapport te genereren, probeer het later opnieuw.", "DOWNLOAD_AGENT_REPORTS": "Download agent reports", @@ -50,7 +50,41 @@ { "id": 4, "name": "Last year" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "HEADER": "CSAT Reports", + "NO_RECORDS": "There are no CSAT survey responses available.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Assigned agent", + "RATING": "Rating", + "FEEDBACK_TEXT": "Feedback comment" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/nl/settings.json b/app/javascript/dashboard/i18n/locale/nl/settings.json index 6c550266eb30..127192e387dd 100644 --- a/app/javascript/dashboard/i18n/locale/nl/settings.json +++ b/app/javascript/dashboard/i18n/locale/nl/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "E-mail notificaties", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "Accountinstellingen", "APPLICATIONS": "Applications", "LABELS": "Labelen", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with", + "REPORTS_OVERVIEW": "Overview", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "New Account", diff --git a/app/javascript/dashboard/i18n/locale/no/agentMgmt.json b/app/javascript/dashboard/i18n/locale/no/agentMgmt.json index a02049e06d8b..36b494b355ec 100644 --- a/app/javascript/dashboard/i18n/locale/no/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/no/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Ingen agenter funnet." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/no/campaign.json b/app/javascript/dashboard/i18n/locale/no/campaign.json index e0d8ffd3d1dc..da4898dc5a90 100644 --- a/app/javascript/dashboard/i18n/locale/no/campaign.json +++ b/app/javascript/dashboard/i18n/locale/no/campaign.json @@ -14,6 +14,17 @@ "PLACEHOLDER": "Please enter the title of campaign", "ERROR": "Title is required" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { "LABEL": "Message", "PLACEHOLDER": "Please enter the message of campaign", @@ -72,6 +83,7 @@ "STATUS": "Satus", "SENDER": "Sender", "URL": "URL", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "Time(Seconds)", "CREATED_AT": "Created at" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "Aktivert", - "DISABLED": "Deaktivert" + "DISABLED": "Deaktivert", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "Bot" diff --git a/app/javascript/dashboard/i18n/locale/no/contact.json b/app/javascript/dashboard/i18n/locale/no/contact.json index d629c6888439..6c2d11a0ea5d 100644 --- a/app/javascript/dashboard/i18n/locale/no/contact.json +++ b/app/javascript/dashboard/i18n/locale/no/contact.json @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "Kontakter", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Søk", "SEARCH_INPUT_PLACEHOLDER": "Søk etter kontakter", "LIST": { "LOADING_MESSAGE": "Laster inn kontakter...", "404": "Ingen kontakter samsvarer med søket ditt 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Navn", "PHONE_NUMBER": "Telefonnummer", @@ -203,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Avbryt", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/no/conversation.json b/app/javascript/dashboard/i18n/locale/no/conversation.json index 3e487acf0d90..8dd3c2ae6bb3 100644 --- a/app/javascript/dashboard/i18n/locale/no/conversation.json +++ b/app/javascript/dashboard/i18n/locale/no/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "Fjern utvalget", "DOWNLOAD": "Last ned", "UPLOADING_ATTACHMENTS": "Laster opp vedlegg...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Løs", "REOPEN_ACTION": "Gjenåpne", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "Vis rik tekstredigering", "TIP_EMOJI_ICON": "Vis emoji-velger", "TIP_ATTACH_ICON": "Legg ved filer", - "ENTER_TO_SEND": "Trykk enter for å sende" + "ENTER_TO_SEND": "Trykk enter for å sende", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Privat notat: bare synlig for deg og ditt team", "CHANGE_STATUS": "Samtalestatus er endret", @@ -64,6 +69,10 @@ "SELECT_AGENT": "Velg agent", "REMOVE": "Fjern", "ASSIGN": "Tildel" + }, + "CONTEXT_MENU": { + "COPY": "Kopier", + "DELETE": "Slett" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/no/csatMgmt.json b/app/javascript/dashboard/i18n/locale/no/csatMgmt.json new file mode 100644 index 000000000000..d7d2efc2ada6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/no/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/no/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/no/inboxMgmt.json index 10e71176b7af..ca35636e13a8 100644 --- a/app/javascript/dashboard/i18n/locale/no/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/no/inboxMgmt.json @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "Vi kunne ikke godkjenne Twilio legitimasjonsopplysningene, vennligst prøv igjen" } }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." + }, "API_CHANNEL": { "TITLE": "API Kanal", "DESC": "Integrer med en API-kanal for å støtte dine kunder.", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "Begynn å videresende e-post til følgende e-postadresse." }, "AUTH": { - "TITLE": "Kanaler", - "DESC": "Vi støtter for tiden live chat widgets, Facebook sider, Twitter profiler og Whatsapp. Vi har flere plattformer er på vei som e-post, Telegram og Line. Disse vil lanseres snart." + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "Agenter", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Aktivert", "DISABLED": "Deaktivert" + }, + "ENABLE_CSAT": { + "ENABLED": "Aktivert", + "DISABLED": "Deaktivert" } }, "DELETE": { @@ -255,6 +267,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Aktiver autotilordning", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Innboksinnstillinger", "INBOX_UPDATE_SUB_TEXT": "Oppdater innboksinnstillinger", "AUTO_ASSIGNMENT_SUB_TEXT": "Aktiver eller deaktiver automatisk tildeling av nye samtaler til agenter som er lagt til i denne innboksen.", diff --git a/app/javascript/dashboard/i18n/locale/no/integrations.json b/app/javascript/dashboard/i18n/locale/no/integrations.json index 355551955ac4..9de34483f1ca 100644 --- a/app/javascript/dashboard/i18n/locale/no/integrations.json +++ b/app/javascript/dashboard/i18n/locale/no/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

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

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

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

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

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

" + } + }, "DELETE": { "BUTTON_TEXT": "Slett", "API": { diff --git a/app/javascript/dashboard/i18n/locale/no/report.json b/app/javascript/dashboard/i18n/locale/no/report.json index 578a2012f2b8..f583b30df3ec 100644 --- a/app/javascript/dashboard/i18n/locale/no/report.json +++ b/app/javascript/dashboard/i18n/locale/no/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "Rapporter", + "HEADER": "Overview", "LOADING_CHART": "Laster inn diagramdata...", "NO_ENOUGH_DATA": "Vi har ikke mottatt nok data for å generere rapporten, vennligst prøv igjen senere.", "DOWNLOAD_AGENT_REPORTS": "Last ned agentrapporter", @@ -50,7 +50,41 @@ { "id": 4, "name": "Last year" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "HEADER": "CSAT Reports", + "NO_RECORDS": "There are no CSAT survey responses available.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Assigned agent", + "RATING": "Rating", + "FEEDBACK_TEXT": "Feedback comment" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/no/settings.json b/app/javascript/dashboard/i18n/locale/no/settings.json index a0c16d647371..fc30dfd71085 100644 --- a/app/javascript/dashboard/i18n/locale/no/settings.json +++ b/app/javascript/dashboard/i18n/locale/no/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "E-postvarsler", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "Kontoinnstillinger", "APPLICATIONS": "Applications", "LABELS": "Etiketter", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with", + "REPORTS_OVERVIEW": "Overview", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Ny konto", diff --git a/app/javascript/dashboard/i18n/locale/pl/agentMgmt.json b/app/javascript/dashboard/i18n/locale/pl/agentMgmt.json index 74c869da5257..37a2ea9ba2e5 100644 --- a/app/javascript/dashboard/i18n/locale/pl/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/pl/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Nie znaleziono żadnych agentów." + "NO_RESULTS": "Brak wyników." } } } diff --git a/app/javascript/dashboard/i18n/locale/pl/campaign.json b/app/javascript/dashboard/i18n/locale/pl/campaign.json index 8e38d40311f6..4c58d10a69a9 100644 --- a/app/javascript/dashboard/i18n/locale/pl/campaign.json +++ b/app/javascript/dashboard/i18n/locale/pl/campaign.json @@ -14,6 +14,17 @@ "PLACEHOLDER": "Wprowadź tytuł kampanii", "ERROR": "Tytuł jest wymagany" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { "LABEL": "Wiadomość", "PLACEHOLDER": "Wprowadź wiadomość dla kampanii", @@ -72,6 +83,7 @@ "STATUS": "Status", "SENDER": "Nadawca", "URL": "Adres URL", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "Czas (sekundy)", "CREATED_AT": "Utworzono" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "Włączone", - "DISABLED": "Wyłączone" + "DISABLED": "Wyłączone", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "Bot" diff --git a/app/javascript/dashboard/i18n/locale/pl/contact.json b/app/javascript/dashboard/i18n/locale/pl/contact.json index e4d9753ba2a0..000f78dd0376 100644 --- a/app/javascript/dashboard/i18n/locale/pl/contact.json +++ b/app/javascript/dashboard/i18n/locale/pl/contact.json @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "Kontakty", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Szukaj", "SEARCH_INPUT_PLACEHOLDER": "Szukaj kontaktów", "LIST": { "LOADING_MESSAGE": "Ładowanie kontaktów...", "404": "Brak kontaktów pasujących do Twojego wyszukiwania 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Nazwisko", "PHONE_NUMBER": "Numer telefonu", @@ -203,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Anuluj", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/pl/conversation.json b/app/javascript/dashboard/i18n/locale/pl/conversation.json index d3b5f6eab327..9f6190e4797c 100644 --- a/app/javascript/dashboard/i18n/locale/pl/conversation.json +++ b/app/javascript/dashboard/i18n/locale/pl/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "Usuń zaznaczenie", "DOWNLOAD": "Pobierz", "UPLOADING_ATTACHMENTS": "Przesyłanie załączników...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "Brak odpowiedzi", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Rozwiąż", "REOPEN_ACTION": "Otwórz ponownie", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "Pokaż zaawansowany edytor", "TIP_EMOJI_ICON": "Pokaż selektor emotikonek", "TIP_ATTACH_ICON": "Dołącz pliki", - "ENTER_TO_SEND": "Naciśnij \"enter\" aby wysłać" + "ENTER_TO_SEND": "Naciśnij \"enter\" aby wysłać", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Prywatna uwaga: widoczne tylko dla Ciebie i twojego zespołu", "CHANGE_STATUS": "Status konwersacji zmieniony", @@ -64,6 +69,10 @@ "SELECT_AGENT": "Wybierz Agenta", "REMOVE": "Usuń", "ASSIGN": "Przypisz" + }, + "CONTEXT_MENU": { + "COPY": "Copy", + "DELETE": "Usuń" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/pl/csatMgmt.json b/app/javascript/dashboard/i18n/locale/pl/csatMgmt.json new file mode 100644 index 000000000000..d7d2efc2ada6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pl/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/pl/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/pl/inboxMgmt.json index 46fb7cc92a85..5ac39610b92e 100644 --- a/app/javascript/dashboard/i18n/locale/pl/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/pl/inboxMgmt.json @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "Nie byliśmy w stanie uwierzytelnić danych logowania Twilio, spróbuj ponownie" } }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." + }, "API_CHANNEL": { "TITLE": "Kanał API", "DESC": "Integrate with API channel and start supporting your customers.", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "Zacznij przekierowywać swoje wiadomości na następujący adres e-mail." }, "AUTH": { - "TITLE": "Kanały", - "DESC": "Obecnie obsługujemy widżety czatu na żywo, strony na Facebooku i profile Twittera jako platformy. Mamy więcej platform takich jak Whatsapp, E-mail, Telegram i Line w pracach, które wkrótce się zakończą." + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "Agenci", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Włączone", "DISABLED": "Wyłączone" + }, + "ENABLE_CSAT": { + "ENABLED": "Włączone", + "DISABLED": "Wyłączone" } }, "DELETE": { @@ -255,6 +267,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Włącz automatyczne przypisanie", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Ustawienia skrzynki odbiorczej", "INBOX_UPDATE_SUB_TEXT": "Zaktualizuj ustawienia skrzynki odbiorczej", "AUTO_ASSIGNMENT_SUB_TEXT": "Włącz lub wyłącz automatyczne przypisywanie nowych rozmów do agentów dodanych do tej skrzynki odbiorczej.", diff --git a/app/javascript/dashboard/i18n/locale/pl/integrations.json b/app/javascript/dashboard/i18n/locale/pl/integrations.json index 73bd899c7e80..9a3d9cc25b02 100644 --- a/app/javascript/dashboard/i18n/locale/pl/integrations.json +++ b/app/javascript/dashboard/i18n/locale/pl/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

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

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

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

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

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

" + } + }, "DELETE": { "BUTTON_TEXT": "Usuń", "API": { diff --git a/app/javascript/dashboard/i18n/locale/pl/report.json b/app/javascript/dashboard/i18n/locale/pl/report.json index ef88c0251f0d..b428e7fc7139 100644 --- a/app/javascript/dashboard/i18n/locale/pl/report.json +++ b/app/javascript/dashboard/i18n/locale/pl/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "Raporty", + "HEADER": "Overview", "LOADING_CHART": "Ładowanie danych wykresów...", "NO_ENOUGH_DATA": "Nie otrzymaliśmy wystarczającej ilości punktów danych, aby wygenerować raport, spróbuj ponownie później.", "DOWNLOAD_AGENT_REPORTS": "Pobierz raporty agenta", @@ -50,7 +50,41 @@ { "id": 4, "name": "Last year" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "HEADER": "CSAT Reports", + "NO_RECORDS": "There are no CSAT survey responses available.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Assigned agent", + "RATING": "Rating", + "FEEDBACK_TEXT": "Feedback comment" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/pl/settings.json b/app/javascript/dashboard/i18n/locale/pl/settings.json index 634b58819436..6c461b574d57 100644 --- a/app/javascript/dashboard/i18n/locale/pl/settings.json +++ b/app/javascript/dashboard/i18n/locale/pl/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Powiadomienia dźwiękowe", "NOTE": "Włącz powiadomienia audio na pulpicie dla nowych wiadomości i konwersacji.", - "ENABLE_AUDIO": "Odtwarzaj powiadomienie dźwiękowe po utworzeniu nowej rozmowy lub pojawieniu się nowych wiadomości" + "NONE": "Brak", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Powiadomienia e-mail", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "Account Settings", "APPLICATIONS": "Applications", "LABELS": "Labels", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with", + "REPORTS_OVERVIEW": "Overview", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "New Account", diff --git a/app/javascript/dashboard/i18n/locale/pt/agentMgmt.json b/app/javascript/dashboard/i18n/locale/pt/agentMgmt.json index a3acf9de6023..5035ce402dc3 100644 --- a/app/javascript/dashboard/i18n/locale/pt/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/pt/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Nenhum agente encontrado." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/pt/campaign.json b/app/javascript/dashboard/i18n/locale/pt/campaign.json index 7d38f9519824..f86645fad839 100644 --- a/app/javascript/dashboard/i18n/locale/pt/campaign.json +++ b/app/javascript/dashboard/i18n/locale/pt/campaign.json @@ -14,6 +14,17 @@ "PLACEHOLDER": "Please enter the title of campaign", "ERROR": "Title is required" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { "LABEL": "Message", "PLACEHOLDER": "Please enter the message of campaign", @@ -72,6 +83,7 @@ "STATUS": "SItuação", "SENDER": "Sender", "URL": "URL", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "Time(Seconds)", "CREATED_AT": "Created at" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "Ativado", - "DISABLED": "Desabilitado" + "DISABLED": "Desabilitado", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "Bot" diff --git a/app/javascript/dashboard/i18n/locale/pt/contact.json b/app/javascript/dashboard/i18n/locale/pt/contact.json index 4b85c36cbb2a..fa707f8fc033 100644 --- a/app/javascript/dashboard/i18n/locale/pt/contact.json +++ b/app/javascript/dashboard/i18n/locale/pt/contact.json @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "Contacts", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Search", "SEARCH_INPUT_PLACEHOLDER": "Search for contacts", "LIST": { "LOADING_MESSAGE": "Loading contacts...", "404": "No contacts matches your search 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Nome:", "PHONE_NUMBER": "Phone Number", @@ -203,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "cancelar", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/pt/conversation.json b/app/javascript/dashboard/i18n/locale/pt/conversation.json index 31ee92b4eb3a..dc42ae608346 100644 --- a/app/javascript/dashboard/i18n/locale/pt/conversation.json +++ b/app/javascript/dashboard/i18n/locale/pt/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "Remove Selection", "DOWNLOAD": "BAIXAR", "UPLOADING_ATTACHMENTS": "Uploading attachments...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Resolver", "REOPEN_ACTION": "Reabrir", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Nota Privada: Apenas visível para você e sua equipe", "CHANGE_STATUS": "Estado da conversa alterado", @@ -64,6 +69,10 @@ "SELECT_AGENT": "Select Agent", "REMOVE": "Excluir", "ASSIGN": "Assign" + }, + "CONTEXT_MENU": { + "COPY": "Copy", + "DELETE": "excluir" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/pt/csatMgmt.json b/app/javascript/dashboard/i18n/locale/pt/csatMgmt.json new file mode 100644 index 000000000000..d7d2efc2ada6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pt/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json index 6e6a4aba0ea7..ff0f343e220e 100644 --- a/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "Não fomos capazes de autenticar as credenciais Twilio, por favor, tente novamente" } }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." + }, "API_CHANNEL": { "TITLE": "API Channel", "DESC": "Integrate with API channel and start supporting your customers.", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "Start forwarding your emails to the following email address." }, "AUTH": { - "TITLE": "Canais", - "DESC": "Atualmente oferecemos suporte a widgets de chat ao vivo do site, Facebook Pages e perfis do Twitter como plataformas. Temos mais plataformas como Whatsapp, E-mail, Telegrama e Linha no trabalho, que em breve." + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "agentes", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Ativado", "DISABLED": "Desabilitado" + }, + "ENABLE_CSAT": { + "ENABLED": "Ativado", + "DISABLED": "Desabilitado" } }, "DELETE": { @@ -255,6 +267,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Habilitar atribuição automática", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Configurações da Caixa de Entrada", "INBOX_UPDATE_SUB_TEXT": "Atualize suas configurações da caixa de entrada", "AUTO_ASSIGNMENT_SUB_TEXT": "Ativar ou desativar a atribuição automática de novas conversas aos agentes adicionados a essa caixa de entrada.", diff --git a/app/javascript/dashboard/i18n/locale/pt/integrations.json b/app/javascript/dashboard/i18n/locale/pt/integrations.json index 5b0b121484ed..37cfcf4e6c9e 100644 --- a/app/javascript/dashboard/i18n/locale/pt/integrations.json +++ b/app/javascript/dashboard/i18n/locale/pt/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

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

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

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

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

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

" + } + }, "DELETE": { "BUTTON_TEXT": "excluir", "API": { diff --git a/app/javascript/dashboard/i18n/locale/pt/report.json b/app/javascript/dashboard/i18n/locale/pt/report.json index 94cf1019d19b..5b5834d67af7 100644 --- a/app/javascript/dashboard/i18n/locale/pt/report.json +++ b/app/javascript/dashboard/i18n/locale/pt/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "relatórios", + "HEADER": "Overview", "LOADING_CHART": "Carregando dados da carta...", "NO_ENOUGH_DATA": "Não recebemos pontos de dados suficientes para gerar o relatório. Por favor, tente novamente mais tarde.", "DOWNLOAD_AGENT_REPORTS": "Download agent reports", @@ -50,7 +50,41 @@ { "id": 4, "name": "Last year" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "HEADER": "CSAT Reports", + "NO_RECORDS": "There are no CSAT survey responses available.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Assigned agent", + "RATING": "Rating", + "FEEDBACK_TEXT": "Feedback comment" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/pt/settings.json b/app/javascript/dashboard/i18n/locale/pt/settings.json index aed6f633b9fb..6f414e8f84d7 100644 --- a/app/javascript/dashboard/i18n/locale/pt/settings.json +++ b/app/javascript/dashboard/i18n/locale/pt/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Notificações por e-mail", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "Account Settings", "APPLICATIONS": "Applications", "LABELS": "Etiquetas", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with", + "REPORTS_OVERVIEW": "Overview", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "New Account", diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/agentMgmt.json b/app/javascript/dashboard/i18n/locale/pt_BR/agentMgmt.json index d8be4a31a72b..8aa83ffca0a5 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Nenhum agente encontrado." + "NO_RESULTS": "Nenhum resultado encontrado." } } } diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/campaign.json b/app/javascript/dashboard/i18n/locale/pt_BR/campaign.json index c57e63bbf542..810decadf823 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/campaign.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/campaign.json @@ -14,6 +14,17 @@ "PLACEHOLDER": "Por favor, digite o título da campanha", "ERROR": "Título é obrigatório" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { "LABEL": "Messagem", "PLACEHOLDER": "Por favor, insira a mensagem da campanha", @@ -72,6 +83,7 @@ "STATUS": "SItuação", "SENDER": "Remetente", "URL": "URL:", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "Horário(segundos)", "CREATED_AT": "Criado em" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "Ativado", - "DISABLED": "Desativado" + "DISABLED": "Desativado", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "Bot" diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/contact.json b/app/javascript/dashboard/i18n/locale/pt_BR/contact.json index 124b70b8dde5..bc84c884f396 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/contact.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/contact.json @@ -19,8 +19,8 @@ }, "LABELS": { "CONTACT": { - "TITLE": "Contact Labels", - "ERROR": "Couldn't update labels" + "TITLE": "Etiquetas de contato", + "ERROR": "Falha ao atualizar etiquetas" }, "CONVERSATION": { "TITLE": "Marcador da conversa", @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "Contato", + "FIELDS": "Campos de contatos", "SEARCH_BUTTON": "Pesquisar", "SEARCH_INPUT_PLACEHOLDER": "Procurar contatos", "LIST": { "LOADING_MESSAGE": "Carregando contatos...", "404": "Nenhum contato corresponde à sua pesquisa 🔍", + "NO_CONTACTS": "Não há contatos disponíveis", "TABLE_HEADER": { "NAME": "Nome", "PHONE_NUMBER": "Número de Telefone", @@ -153,11 +155,11 @@ "REMINDER": { "ADD_BUTTON": { "BUTTON": "Adicionar", - "TITLE": "Shift + Enter to create a task" + "TITLE": "Shift + Enter para criar uma nota" }, "FOOTER": { - "DUE_DATE": "Due date", - "LABEL_TITLE": "Set type" + "DUE_DATE": "Data de vencimento", + "LABEL_TITLE": "Definir tipo" } }, "NOTES": { @@ -175,11 +177,11 @@ }, "EVENTS": { "HEADER": { - "TITLE": "Activities" + "TITLE": "Atividades" }, "BUTTON": { "PILL_BUTTON_NOTES": "observações", - "PILL_BUTTON_EVENTS": "events", + "PILL_BUTTON_EVENTS": "Eventos", "PILL_BUTTON_CONVO": "conversas" } }, @@ -203,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Mesclar contatos", + "DESCRIPTION": "Mesclar contatos é útil quando se tem entradas duplicadas de um mesmo contato. Essa ação trata um contato como primário e outro como derivado/secundário/filho. Após mesclar, todos os detalhes do contato primário serão preservados. Se o contato primário não tiver um dos campo listados, será utilizado o valor do campo do contato derivado. Se ocorrem conflitos, os campos do contato primário serão mantidos, e a as diferenças serão copiadas para campos personalizados.", + "PRIMARY": { + "TITLE": "Contato principal" + }, + "CHILD": { + "TITLE": "Contato para mesclar", + "PLACEHOLDER": "Selecione um contato" + }, + "SUMMARY": { + "TITLE": "Sumário", + "DELETE_WARNING": "Contato de %{childContactName}será excluído.", + "ATTRIBUTE_WARNING": "Detalhes de contato de %{childContactName} serão copiados para %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "Mensagem de erro" + }, + "FORM": { + "SUBMIT": " Mesclar contatos", + "CANCEL": "Cancelar", + "CHILD_CONTACT": { + "ERROR": "Selecione um contato filho para mesclar" + }, + "SUCCESS_MESSAGE": "Contato mesclado com sucesso", + "ERROR_MESSAGE": "Não foi possível mesclar contatos, tente novamente!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/conversation.json b/app/javascript/dashboard/i18n/locale/pt_BR/conversation.json index f2b0c1018d8f..d96468182933 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/conversation.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "Remover Seleção", "DOWNLOAD": "Baixar", "UPLOADING_ATTACHMENTS": "Enviando anexos...", + "SUCCESS_DELETE_MESSAGE": "Mensagem excluída com sucesso", + "FAIL_DELETE_MESSSAGE": "Não foi possível excluir a mensagem! Tente novamente", "NO_RESPONSE": "Sem resposta", + "RATING_TITLE": "Classificação", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Resolver", "REOPEN_ACTION": "Reabrir", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "Mostrar editor de texto completo", "TIP_EMOJI_ICON": "Mostrar seletor de emoji", "TIP_ATTACH_ICON": "Anexar arquivos", - "ENTER_TO_SEND": "Enter para enviar" + "ENTER_TO_SEND": "Enter para enviar", + "DRAG_DROP": "Arraste e solte aqui para anexar" }, "VISIBLE_TO_AGENTS": "Mensagem Privada: Apenas visível para você e sua equipe", "CHANGE_STATUS": "Estado da conversa mudou", @@ -64,6 +69,10 @@ "SELECT_AGENT": "Selecione Agente", "REMOVE": "Excluir", "ASSIGN": "Atribua" + }, + "CONTEXT_MENU": { + "COPY": "Copiar", + "DELETE": "Excluir" } }, "EMAIL_TRANSCRIPT": { @@ -109,7 +118,7 @@ }, "CONVERSATION_SIDEBAR": { "ASSIGNEE_LABEL": "Agente atribuído", - "SELF_ASSIGN": "Assign to me", + "SELF_ASSIGN": "Atribuir a mim", "TEAM_LABEL": "Equipe Atribuída", "SELECT": { "PLACEHOLDER": "Nenhuma" diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/csatMgmt.json b/app/javascript/dashboard/i18n/locale/pt_BR/csatMgmt.json new file mode 100644 index 000000000000..08bd95d2b96f --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pt_BR/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Avalie sua conversa", + "PLACEHOLDER": "Conte-nos mais..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json index dedb80e72ba2..fe98bd507769 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json @@ -30,10 +30,10 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "Nome da Caixa de Entrada", - "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)" + "PLACEHOLDER": "Digite o nome da caixa de entrada (ex: Acme Inc)" }, "WEBSITE_NAME": { - "LABEL": "Website Name", + "LABEL": "Nome do site", "PLACEHOLDER": "Informe o nome do seu site (por exemplo: Acme Inc)" }, "FB": { @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "Não fomos capazes de autenticar as credenciais Twilio, por favor, tente novamente" } }, + "SMS": { + "TITLE": "Canal SMS via Twilio", + "DESC": "Comece a apoiar seus clientes através de SMS com integração Twilio." + }, + "WHATSAPP": { + "TITLE": "Canal do Whatsapp via Twilio", + "DESC": "Comece a apoiar seus clientes através do Whatsapp com integração com Twilio." + }, "API_CHANNEL": { "TITLE": "Canal da API", "DESC": "Integre com canal API e comece a ajudar seus clientes.", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "Comece a encaminhar seus e-mails para o seguinte endereço de e-mail." }, "AUTH": { - "TITLE": "Canais", - "DESC": "Atualmente, suportamos widgets de bate-papo ao vivo do site, páginas do Facebook e perfis do Twitter como plataformas. Temos mais plataformas como WhatsApp, Email, Telegram e Line em andamento, que serão lançadas em breve." + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "Agentes", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Ativado", "DISABLED": "Desativado" + }, + "ENABLE_CSAT": { + "ENABLED": "Ativado", + "DISABLED": "Desativado" } }, "DELETE": { @@ -223,7 +235,7 @@ "CONFIRM": { "TITLE": "Confirmar exclusão", "MESSAGE": "Você tem certeza que deseja excluir ", - "PLACE_HOLDER": "Please type {inboxName} to confirm", + "PLACE_HOLDER": "Digite {inboxName} para confirmar", "YES": "Sim, excluir ", "NO": "Não, Mantenha " }, @@ -252,9 +264,11 @@ "INBOX_AGENTS": "Agentes", "INBOX_AGENTS_SUB_TEXT": "Adicionar ou remover agentes dessa caixa de entrada", "UPDATE": "Atualizar", - "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", - "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", + "ENABLE_EMAIL_COLLECT_BOX": "Ativar caixa de coleta de e-mail", + "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Ativar ou desativar caixa de coleta de e-mails em novas conversas", "AUTO_ASSIGNMENT": "Habilitar atribuição automática", + "ENABLE_CSAT": "Habilitar CSAT", + "ENABLE_CSAT_SUB_TEXT": "Ativar/Desativar pesquisa CSAT(satisfação do cliente) após resolver uma conversa", "INBOX_UPDATE_TITLE": "Configurações da Caixa de entrada", "INBOX_UPDATE_SUB_TEXT": "Atualize suas configurações de caixa de entrada", "AUTO_ASSIGNMENT_SUB_TEXT": "Ativar ou desativar a atribuição automática de novas conversas aos agentes adicionados a essa caixa de entrada.", diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/integrationApps.json b/app/javascript/dashboard/i18n/locale/pt_BR/integrationApps.json index bbfd20da6950..759019ae2319 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/integrationApps.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/integrationApps.json @@ -1,35 +1,35 @@ { "INTEGRATION_APPS": { - "FETCHING": "Fetching Integrations", - "NO_HOOK_CONFIGURED": "There are no %{integrationId} integrations configured in this account.", - "HEADER": "Applications", + "FETCHING": "Buscando integrações", + "NO_HOOK_CONFIGURED": "Não há integrações %{integrationId} configuradas nesta conta.", + "HEADER": "Aplicações", "STATUS": { "ENABLED": "Ativado", "DISABLED": "Desativado" }, "CONFIGURE": "Configurar", - "ADD_BUTTON": "Add a new hook", + "ADD_BUTTON": "Adicionar um novo hook", "DELETE": { "TITLE": { - "INBOX": "Confirm deletion", - "ACCOUNT": "Disconnect" + "INBOX": "Confirmar exclusão", + "ACCOUNT": "Desconectado" }, "MESSAGE": { "INBOX": "Você tem certeza que deseja excluir?", - "ACCOUNT": "Are you sure to disconnect?" + "ACCOUNT": "Tem certeza que deseja desconectar?" }, "CONFIRM_BUTTON_TEXT": { "INBOX": "Sim, excluir", - "ACCOUNT": "Yes, Disconnect" + "ACCOUNT": "Sim, Desconectar" }, "CANCEL_BUTTON_TEXT": "Cancelar", "API": { - "SUCCESS_MESSAGE": "Hook deleted successfully", + "SUCCESS_MESSAGE": "Webhook excluído com sucesso", "ERROR_MESSAGE": "Não foi possível conectar ao servidor Woot, por favor tente novamente mais tarde" } }, "LIST": { - "FETCHING": "Fetching integration hooks", + "FETCHING": "Buscando integrações", "INBOX": "Caixa de Entrada", "DELETE": { "BUTTON_TEXT": "Excluir" @@ -38,14 +38,14 @@ "ADD": { "FORM": { "INBOX": { - "LABEL": "Select Inbox", - "PLACEHOLDER": "Select Inbox" + "LABEL": "Selecionar caixa de entrada", + "PLACEHOLDER": "Selecionar caixa de entrada" }, "SUBMIT": "Criar", "CANCEL": "Cancelar" }, "API": { - "SUCCESS_MESSAGE": "Integration hook added successfully", + "SUCCESS_MESSAGE": "Integração adicionada com sucesso", "ERROR_MESSAGE": "Não foi possível conectar ao servidor Woot, por favor tente novamente mais tarde" } }, @@ -53,10 +53,10 @@ "BUTTON_TEXT": "Conectar" }, "DISCONNECT": { - "BUTTON_TEXT": "Disconnect" + "BUTTON_TEXT": "Desconectado" }, "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.

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.

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 é uma plataforma natural de entendimento em linguagem que torna fácil projetar e integrar uma interface de usuário conversacional em seu aplicativo móvel, aplicativo web, dispositivo, bot, sistema de resposta de voz interativo, etc.

A integração do fluxo de diálogo com o %{installationName} permite que você configure um bot de Dialogflow com suas caixas de entrada, o que permite que o bot lide inicialmente as consultas e entregue-as a um agente quando necessário. O fluxo de diálogo pode ser usado para qualificar as chumbas, reduzir a carga de trabalho dos agentes, fornecendo perguntas frequentes, etc.

Para adicionar um fluxo de diálogo, você precisa criar uma Conta de Serviço no seu console do projeto Google e compartilhar as credenciais. Por favor, consulte a documentação do fluxo de diálogo para obter mais informações." } } } diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/integrations.json b/app/javascript/dashboard/i18n/locale/pt_BR/integrations.json index 498dbf8c7a1b..034ec1e31185 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/integrations.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/integrations.json @@ -19,7 +19,7 @@ }, "EDIT": { "BUTTON_TEXT": "Alterar", - "TITLE": "Edit webhook", + "TITLE": "Editar webhook", "CANCEL": "Cancelar", "DESC": "Webhook Os eventos fornecem informações em tempo real sobre o que está acontecendo na sua conta do Chatwoot. Digite um URL válido para configurar um retorno de chamada.", "FORM": { @@ -28,10 +28,10 @@ "PLACEHOLDER": "Exemplo: https://example/api/webhook", "ERROR": "Por favor, insira uma URL válida" }, - "SUBMIT": "Edit webhook" + "SUBMIT": "Editar webhook" }, "API": { - "SUCCESS_MESSAGE": "Webhook URL updated successfully", + "SUCCESS_MESSAGE": "URL do Webhook atualizado com sucesso", "ERROR_MESSAGE": "Não foi possível conectar ao servidor Woot, por favor tente novamente mais tarde" } }, @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Usando a integração com Slack", + "BODY": "

Chatwoot irá agora sincronizar todas as conversas recebidas no canal de conversas com clientes dentro de seu local de trabalho de slack.

A resposta para uma conversa em conversas ao cliente canal de slack irá criar uma resposta para o cliente através do chatwoot.

Inicie as respostas com nota: para criar notas privadas em vez de respostas.

Se o remetente do slack tiver um perfil de agente no chatwoot sob o mesmo e-mail, as respostas serão associadas de acordo.

Quando o respondente não tiver um perfil de agente associado, as respostas serão dadas a partir do perfil do bot.

" + } + }, "DELETE": { "BUTTON_TEXT": "Excluir", "API": { diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/report.json b/app/javascript/dashboard/i18n/locale/pt_BR/report.json index 069b8713901b..5fc060537004 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/report.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "Relatórios", + "HEADER": "Visão geral", "LOADING_CHART": "Carregando dados do gráfico...", "NO_ENOUGH_DATA": "Não existem dados suficientes para gerar o relatório. Tente novamente mais tarde.", "DOWNLOAD_AGENT_REPORTS": "Baixar relatórios de agentes", @@ -50,7 +50,41 @@ { "id": 4, "name": "Ano passado" + }, + { + "id": 5, + "name": "Intervalo de datas personalizado" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Aplicar", + "PLACEHOLDER": "Selecionar intervalo de datas" + } + }, + "CSAT_REPORTS": { + "HEADER": "Relatórios CSAT", + "NO_RECORDS": "Não há respostas de pesquisa em CSAT disponíveis.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contato", + "AGENT_NAME": "Agente atribuído", + "RATING": "Classificação", + "FEEDBACK_TEXT": "Comentário do feedback" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total de respostas", + "TOOLTIP": "Número total de respostas coletadas" + }, + "SATISFACTION_SCORE": { + "LABEL": "Pontuação de satisfação", + "TOOLTIP": "Número total de respostas positivas / Número total de respostas * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Taxa de resposta", + "TOOLTIP": "Número total de respostas / Número total de mensagens CSAT de pesquisa enviadas * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/settings.json b/app/javascript/dashboard/i18n/locale/pt_BR/settings.json index 28c2ee8fae8e..4331301230c7 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/settings.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Notificações de Áudio", "NOTE": "Habilitar notificações de áudio no painel para novas mensagens e conversas.", - "ENABLE_AUDIO": "Reproduzir notificação de áudio quando uma nova conversa é criada ou novas mensagens chegam" + "NONE": "Nenhuma", + "ASSIGNED": "Conversas atribuídas", + "ALL_CONVERSATIONS": "Todas as conversas" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Notificações por e-mail", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "Configurações da conta", "APPLICATIONS": "Aplicações", "LABELS": "Marcadores", - "TEAMS": "Times" + "TEAMS": "Times", + "ALL_CONTACTS": "Todos os Contatos", + "TAGGED_WITH": "Marcado com", + "REPORTS_OVERVIEW": "Visão geral", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Nova conta", diff --git a/app/javascript/dashboard/i18n/locale/ro/agentMgmt.json b/app/javascript/dashboard/i18n/locale/ro/agentMgmt.json index bc582e4edd71..a76fa06fb490 100644 --- a/app/javascript/dashboard/i18n/locale/ro/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ro/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Niciun agent găsit." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/ro/campaign.json b/app/javascript/dashboard/i18n/locale/ro/campaign.json index 2cc4673f6be4..22e4c83715ac 100644 --- a/app/javascript/dashboard/i18n/locale/ro/campaign.json +++ b/app/javascript/dashboard/i18n/locale/ro/campaign.json @@ -14,6 +14,17 @@ "PLACEHOLDER": "Please enter the title of campaign", "ERROR": "Title is required" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { "LABEL": "Message", "PLACEHOLDER": "Please enter the message of campaign", @@ -72,6 +83,7 @@ "STATUS": "Status", "SENDER": "Sender", "URL": "URL", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "Time(Seconds)", "CREATED_AT": "Created at" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "Activat", - "DISABLED": "Dezactivat" + "DISABLED": "Dezactivat", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "Bot" diff --git a/app/javascript/dashboard/i18n/locale/ro/contact.json b/app/javascript/dashboard/i18n/locale/ro/contact.json index b34cd2bf34c3..dc5859b8f3af 100644 --- a/app/javascript/dashboard/i18n/locale/ro/contact.json +++ b/app/javascript/dashboard/i18n/locale/ro/contact.json @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "Contacts", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Search", "SEARCH_INPUT_PLACEHOLDER": "Search for contacts", "LIST": { "LOADING_MESSAGE": "Loading contacts...", "404": "No contacts matches your search 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Nume", "PHONE_NUMBER": "Phone Number", @@ -203,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Renunță", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/ro/conversation.json b/app/javascript/dashboard/i18n/locale/ro/conversation.json index 85782d5f2260..225beda2eb04 100644 --- a/app/javascript/dashboard/i18n/locale/ro/conversation.json +++ b/app/javascript/dashboard/i18n/locale/ro/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "Remove Selection", "DOWNLOAD": "Descărcare", "UPLOADING_ATTACHMENTS": "Uploading attachments...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Rezolvă", "REOPEN_ACTION": "Redeschide", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Notă privată: vizibilă doar pentru tine și echipa ta", "CHANGE_STATUS": "Stare conversație schimbată", @@ -64,6 +69,10 @@ "SELECT_AGENT": "Select Agent", "REMOVE": "Elimină", "ASSIGN": "Assign" + }, + "CONTEXT_MENU": { + "COPY": "Copiază", + "DELETE": "Şterge" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/ro/csatMgmt.json b/app/javascript/dashboard/i18n/locale/ro/csatMgmt.json new file mode 100644 index 000000000000..d7d2efc2ada6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ro/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/ro/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ro/inboxMgmt.json index 3176536d0a3f..636b5e4bf3cb 100644 --- a/app/javascript/dashboard/i18n/locale/ro/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ro/inboxMgmt.json @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "Nu am putut autentifica credentialele Twilio, încercați din nou" } }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." + }, "API_CHANNEL": { "TITLE": "Canal API", "DESC": "Integrate with API channel and start supporting your customers.", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "Începeți să vă trimiteți e-mailuri la următoarea adresă de e-mail." }, "AUTH": { - "TITLE": "Canale", - "DESC": "În prezent suportăm widget-uri live chat pe site, pagini Facebook și profiluri Twitter ca platforme. Avem mai multe platforme precum Whatsapp, Email, Telegram şi Line în lucrări, care vor fi în curând." + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "Agenți", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Activat", "DISABLED": "Dezactivat" + }, + "ENABLE_CSAT": { + "ENABLED": "Activat", + "DISABLED": "Dezactivat" } }, "DELETE": { @@ -255,6 +267,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Activare atribuire automată", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Setări Inbox", "INBOX_UPDATE_SUB_TEXT": "Actualizează setările de inbox", "AUTO_ASSIGNMENT_SUB_TEXT": "Activează sau dezactivează atribuirea automată a conversațiilor noi la agenții adăugați la această căsuță poștală.", diff --git a/app/javascript/dashboard/i18n/locale/ro/integrations.json b/app/javascript/dashboard/i18n/locale/ro/integrations.json index fb16f804a6fd..ab3cf0bd5c22 100644 --- a/app/javascript/dashboard/i18n/locale/ro/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ro/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

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

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

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

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

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

" + } + }, "DELETE": { "BUTTON_TEXT": "Şterge", "API": { diff --git a/app/javascript/dashboard/i18n/locale/ro/report.json b/app/javascript/dashboard/i18n/locale/ro/report.json index e28b44fbdef1..25a4a8a68d18 100644 --- a/app/javascript/dashboard/i18n/locale/ro/report.json +++ b/app/javascript/dashboard/i18n/locale/ro/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "Rapoarte", + "HEADER": "Overview", "LOADING_CHART": "Încărcare date grafic...", "NO_ENOUGH_DATA": "Nu am primit suficiente date pentru a genera raportul. Vă rugăm să încercați din nou mai târziu.", "DOWNLOAD_AGENT_REPORTS": "Download agent reports", @@ -50,7 +50,41 @@ { "id": 4, "name": "Last year" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "HEADER": "CSAT Reports", + "NO_RECORDS": "There are no CSAT survey responses available.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Assigned agent", + "RATING": "Rating", + "FEEDBACK_TEXT": "Feedback comment" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/ro/settings.json b/app/javascript/dashboard/i18n/locale/ro/settings.json index ee28e40f2b5d..5169c78e56ce 100644 --- a/app/javascript/dashboard/i18n/locale/ro/settings.json +++ b/app/javascript/dashboard/i18n/locale/ro/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Notificări prin e-mail", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "Setările contului", "APPLICATIONS": "Applications", "LABELS": "Etichete", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with", + "REPORTS_OVERVIEW": "Overview", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Cont Nou", diff --git a/app/javascript/dashboard/i18n/locale/ru/agentMgmt.json b/app/javascript/dashboard/i18n/locale/ru/agentMgmt.json index 3f1582d65222..77ebbdd8bb06 100644 --- a/app/javascript/dashboard/i18n/locale/ru/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ru/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Операторы не найдены." + "NO_RESULTS": "Результаты не найдены." } } } diff --git a/app/javascript/dashboard/i18n/locale/ru/campaign.json b/app/javascript/dashboard/i18n/locale/ru/campaign.json index 42089230a4e9..13dd3efaf522 100644 --- a/app/javascript/dashboard/i18n/locale/ru/campaign.json +++ b/app/javascript/dashboard/i18n/locale/ru/campaign.json @@ -14,6 +14,17 @@ "PLACEHOLDER": "Пожалуйста, введите название кампании", "ERROR": "Необходимо указать название" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { "LABEL": "Сообщение", "PLACEHOLDER": "Пожалуйста, введите сообщение кампании", @@ -72,6 +83,7 @@ "STATUS": "Статус", "SENDER": "Отправитель", "URL": "URL", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "Время (секунды)", "CREATED_AT": "Дата создания" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "Включено", - "DISABLED": "Выключено" + "DISABLED": "Выключено", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "Бот" diff --git a/app/javascript/dashboard/i18n/locale/ru/contact.json b/app/javascript/dashboard/i18n/locale/ru/contact.json index ae36dff4cb7f..e1ca4c4c8eb7 100644 --- a/app/javascript/dashboard/i18n/locale/ru/contact.json +++ b/app/javascript/dashboard/i18n/locale/ru/contact.json @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "Контакты", + "FIELDS": "Поля контакта", "SEARCH_BUTTON": "Поиск", "SEARCH_INPUT_PLACEHOLDER": "Поиск по контактам", "LIST": { "LOADING_MESSAGE": "Загрузка контактов...", "404": "Нет контактов по вашему запросу 🔍", + "NO_CONTACTS": "Нет доступных контактов", "TABLE_HEADER": { "NAME": "Имя", "PHONE_NUMBER": "Номер телефона", @@ -203,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Объединить контакты", + "DESCRIPTION": "Объединение контактов полезно, когда у вас есть несколько похожих записей контактов. Объединение связывает первичный контакт и похожие контакты. После слияния все детали основного контакта останутся прежними. Если первичный контакт не имеет поля, то значение из похожих контактов будут использованы после слияния. Если произойдет конфликт, поля в первичном контакте не будут затронуты, но поля похожего контакта будут скопированы в дополнительные поля основного.", + "PRIMARY": { + "TITLE": "Основной контакт" + }, + "CHILD": { + "TITLE": "Контакт для слияния", + "PLACEHOLDER": "Выберите контакт" + }, + "SUMMARY": { + "TITLE": "Краткая информация", + "DELETE_WARNING": "Контакт %{childContactName} будет удален.", + "ATTRIBUTE_WARNING": "Контактная информация %{childContactName} будет скопирована в %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Объединить контакты", + "CANCEL": "Отменить", + "CHILD_CONTACT": { + "ERROR": "Выберите контакт, для объединения" + }, + "SUCCESS_MESSAGE": "Контакт успешно объединён", + "ERROR_MESSAGE": "Невозможно объединить контакты, попробуйте еще раз!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/ru/conversation.json b/app/javascript/dashboard/i18n/locale/ru/conversation.json index ac858123745d..34e3531e5fdf 100644 --- a/app/javascript/dashboard/i18n/locale/ru/conversation.json +++ b/app/javascript/dashboard/i18n/locale/ru/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "Удалить выделенное", "DOWNLOAD": "Скачать", "UPLOADING_ATTACHMENTS": "Загрузка вложений...", + "SUCCESS_DELETE_MESSAGE": "Сообщение успешно удалено", + "FAIL_DELETE_MESSSAGE": "Не удалось удалить сообщение! Попробуйте еще раз", "NO_RESPONSE": "Нет ответа", + "RATING_TITLE": "Оценка", + "FEEDBACK_TITLE": "Обратная связь", "HEADER": { "RESOLVE_ACTION": "Завершить", "REOPEN_ACTION": "Открыть заново", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "Показать редактор текста", "TIP_EMOJI_ICON": "Показать emoji панель", "TIP_ATTACH_ICON": "Прикрепить файлы", - "ENTER_TO_SEND": "Введите чтобы отправить" + "ENTER_TO_SEND": "Введите чтобы отправить", + "DRAG_DROP": "Перетащите сюда, чтобы прикрепить" }, "VISIBLE_TO_AGENTS": "Приватная заметка: видна только вам и вашей команде", "CHANGE_STATUS": "Статус разговора изменен", @@ -64,6 +69,10 @@ "SELECT_AGENT": "Выбрать Агента", "REMOVE": "Удалить", "ASSIGN": "Назначить" + }, + "CONTEXT_MENU": { + "COPY": "Копировать", + "DELETE": "Удалить" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/ru/csatMgmt.json b/app/javascript/dashboard/i18n/locale/ru/csatMgmt.json new file mode 100644 index 000000000000..e7fff705a3d7 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ru/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Оцените разговор", + "PLACEHOLDER": "Расскажите подробнее..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/ru/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ru/inboxMgmt.json index 3d8902b8bf80..0590682c6174 100644 --- a/app/javascript/dashboard/i18n/locale/ru/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ru/inboxMgmt.json @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "Мы не смогли авторизоваться в Twilio. Пожалуйста, попробуйте еще раз" } }, + "SMS": { + "TITLE": "SMS канал через Twilio", + "DESC": "Начните поддерживать своих клиентов через SMS с Twilio интеграцией." + }, + "WHATSAPP": { + "TITLE": "Whatsapp канал через Twilio", + "DESC": "Начните поддерживать ваших клиентов через Whatsapp с помощью интеграции в Twilio." + }, "API_CHANNEL": { "TITLE": "Источник API", "DESC": "Интегрируйте с API каналом и начните поддерживать ваших клиентов.", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "Начните пересылать свои письма на этот email." }, "AUTH": { - "TITLE": "Источники", - "DESC": "На текущий момент мы поддерживаем следующие источники: виджеты онлайн чата на сайте, страницы Facebook и Twitter. Whatsapp, Email, Telegram и Line в разработке и будут добавлены в ближайшее время." + "TITLE": "Выберите источник", + "DESC": "Chatwoot поддерживает виджет живого-чата, страницу Facebook, профиль Twitter, Whatsapp, Email и т. д., как канал связи с пользователями. Если вы хотите настроить пользовательский канал, вы можете создать его с помощью канала API. Выберите один канал из списка ниже, чтобы продолжить." }, "AGENTS": { "TITLE": "Операторы", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Включено", "DISABLED": "Выключено" + }, + "ENABLE_CSAT": { + "ENABLED": "Включено", + "DISABLED": "Выключено" } }, "DELETE": { @@ -255,6 +267,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Включить ящик сбора почты", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Включение или отключение ящик для сбора почты в новой беседе", "AUTO_ASSIGNMENT": "Включить автоназначение", + "ENABLE_CSAT": "Включить CSAT", + "ENABLE_CSAT_SUB_TEXT": "Включить/выключить опрос CSAT(степень удовлетворенности пользователя) после завершения беседы", "INBOX_UPDATE_TITLE": "Настройки источника", "INBOX_UPDATE_SUB_TEXT": "Изменить настройки источника", "AUTO_ASSIGNMENT_SUB_TEXT": "Включить или отключить автоматическое назначение новых разговоров к агентам, добавленным к этому источнику.", diff --git a/app/javascript/dashboard/i18n/locale/ru/integrations.json b/app/javascript/dashboard/i18n/locale/ru/integrations.json index 2e279b181752..d249a2231684 100644 --- a/app/javascript/dashboard/i18n/locale/ru/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ru/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Использование интеграции Slack", + "BODY": "

Chatwoot теперь будет синхронизировать все входящие разговоры с каналом разговоров с клиентами внутри вашего рабочего места.

Ответ на цепочку разговоров в канале slack для разговоров с клиентом создаст ответ клиенту через chatwoot.

Начните ответы с примечания: для создания приватных сообщений. примечания вместо ответов.

Если отвечающий в Slack имеет профиль агента в chatwoot под тем же адресом электронной почты, ответы будут связаны соответственно.

Если отвечающий не имеет связанного профиля агента, ответы будут отправляться из профиля бота.

" + } + }, "DELETE": { "BUTTON_TEXT": "Удалить", "API": { diff --git a/app/javascript/dashboard/i18n/locale/ru/report.json b/app/javascript/dashboard/i18n/locale/ru/report.json index 6851601c0262..933cb5b5074f 100644 --- a/app/javascript/dashboard/i18n/locale/ru/report.json +++ b/app/javascript/dashboard/i18n/locale/ru/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "Отчёты", + "HEADER": "Обзор", "LOADING_CHART": "Загрузка данных графика...", "NO_ENOUGH_DATA": "Недостаточно данных для создания отчета, пожалуйста, повторите попытку позже.", "DOWNLOAD_AGENT_REPORTS": "Сказать отчёт по агентам", @@ -50,7 +50,41 @@ { "id": 4, "name": "За прошлый год" + }, + { + "id": 5, + "name": "Настраиваемый диапазон даты" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Применить", + "PLACEHOLDER": "Выберите диапазон дат" + } + }, + "CSAT_REPORTS": { + "HEADER": "Отчёты CSAT", + "NO_RECORDS": "Нет ответов на опрос CSAT.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Контакт", + "AGENT_NAME": "Назначенный сотрудник", + "RATING": "Оценка", + "FEEDBACK_TEXT": "Комментарий отзыва" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Всего ответов", + "TOOLTIP": "Общее количество собранных ответов" + }, + "SATISFACTION_SCORE": { + "LABEL": "Оценка удовлетворенности", + "TOOLTIP": "Общее количество положительных ответов / Общее количество ответов * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Доля откликов", + "TOOLTIP": "Общее количество ответов / Общее количество отправленных сообщений CSAT опросов * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/ru/settings.json b/app/javascript/dashboard/i18n/locale/ru/settings.json index 450e310c0e91..07dcbde7499d 100644 --- a/app/javascript/dashboard/i18n/locale/ru/settings.json +++ b/app/javascript/dashboard/i18n/locale/ru/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Звуковые уведомления", "NOTE": "Включить звуковые уведомления в панели управления для новых сообщений и разговоров.", - "ENABLE_AUDIO": "Воспроизводить звуковое уведомление при создании новой беседы или получении новых сообщений" + "NONE": "Ничего", + "ASSIGNED": "Назначенные беседы", + "ALL_CONVERSATIONS": "Диалоги" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Email Уведомления", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "Настройки аккаунта", "APPLICATIONS": "Приложения", "LABELS": "Категории", - "TEAMS": "Команды" + "TEAMS": "Команды", + "ALL_CONTACTS": "Все контакты", + "TAGGED_WITH": "С метками", + "REPORTS_OVERVIEW": "Обзор", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Новый аккаунт", diff --git a/app/javascript/dashboard/i18n/locale/sk/agentMgmt.json b/app/javascript/dashboard/i18n/locale/sk/agentMgmt.json index 2b2358c9a71f..de999a260e18 100644 --- a/app/javascript/dashboard/i18n/locale/sk/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/sk/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "No agents found." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/sk/campaign.json b/app/javascript/dashboard/i18n/locale/sk/campaign.json index f1c2496691fd..95ed4d199d86 100644 --- a/app/javascript/dashboard/i18n/locale/sk/campaign.json +++ b/app/javascript/dashboard/i18n/locale/sk/campaign.json @@ -14,6 +14,17 @@ "PLACEHOLDER": "Please enter the title of campaign", "ERROR": "Title is required" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { "LABEL": "Message", "PLACEHOLDER": "Please enter the message of campaign", @@ -72,6 +83,7 @@ "STATUS": "Status", "SENDER": "Sender", "URL": "URL", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "Time(Seconds)", "CREATED_AT": "Created at" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "Enabled", - "DISABLED": "Disabled" + "DISABLED": "Disabled", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "Bot" diff --git a/app/javascript/dashboard/i18n/locale/sk/contact.json b/app/javascript/dashboard/i18n/locale/sk/contact.json index 84e6303fc46a..051aad27ee02 100644 --- a/app/javascript/dashboard/i18n/locale/sk/contact.json +++ b/app/javascript/dashboard/i18n/locale/sk/contact.json @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "Contacts", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Search", "SEARCH_INPUT_PLACEHOLDER": "Search for contacts", "LIST": { "LOADING_MESSAGE": "Loading contacts...", "404": "No contacts matches your search 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Name", "PHONE_NUMBER": "Phone Number", @@ -203,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Cancel", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/sk/conversation.json b/app/javascript/dashboard/i18n/locale/sk/conversation.json index 976d1395a231..81c023aa5460 100644 --- a/app/javascript/dashboard/i18n/locale/sk/conversation.json +++ b/app/javascript/dashboard/i18n/locale/sk/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "Remove Selection", "DOWNLOAD": "Download", "UPLOADING_ATTACHMENTS": "Uploading attachments...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Resolve", "REOPEN_ACTION": "Reopen", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team", "CHANGE_STATUS": "Conversation status changed", @@ -64,6 +69,10 @@ "SELECT_AGENT": "Select Agent", "REMOVE": "Remove", "ASSIGN": "Assign" + }, + "CONTEXT_MENU": { + "COPY": "Copy", + "DELETE": "Delete" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/sk/csatMgmt.json b/app/javascript/dashboard/i18n/locale/sk/csatMgmt.json new file mode 100644 index 000000000000..d7d2efc2ada6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/sk/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/sk/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/sk/inboxMgmt.json index 06eeb3d5d432..7bb14a833896 100644 --- a/app/javascript/dashboard/i18n/locale/sk/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/sk/inboxMgmt.json @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "We were not able to authenticate Twilio credentials, please try again" } }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." + }, "API_CHANNEL": { "TITLE": "API Channel", "DESC": "Integrate with API channel and start supporting your customers.", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "Start forwarding your emails to the following email address." }, "AUTH": { - "TITLE": "Channels", - "DESC": "Currently we support Website live chat widgets, Facebook Pages and Twitter profiles as platforms. We have more platforms like Whatsapp, Email, Telegram and Line in the works, which will be out soon." + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "Agents", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Enabled", "DISABLED": "Disabled" + }, + "ENABLE_CSAT": { + "ENABLED": "Enabled", + "DISABLED": "Disabled" } }, "DELETE": { @@ -255,6 +267,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Enable auto assignment", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Inbox Settings", "INBOX_UPDATE_SUB_TEXT": "Update your inbox settings", "AUTO_ASSIGNMENT_SUB_TEXT": "Enable or disable the automatic assignment of new conversations to the agents added to this inbox.", diff --git a/app/javascript/dashboard/i18n/locale/sk/integrations.json b/app/javascript/dashboard/i18n/locale/sk/integrations.json index c75454f9e992..a54d8e9e000a 100644 --- a/app/javascript/dashboard/i18n/locale/sk/integrations.json +++ b/app/javascript/dashboard/i18n/locale/sk/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

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

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

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

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

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

" + } + }, "DELETE": { "BUTTON_TEXT": "Delete", "API": { diff --git a/app/javascript/dashboard/i18n/locale/sk/report.json b/app/javascript/dashboard/i18n/locale/sk/report.json index cf2c14a57f91..a7df12839494 100644 --- a/app/javascript/dashboard/i18n/locale/sk/report.json +++ b/app/javascript/dashboard/i18n/locale/sk/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "Reports", + "HEADER": "Overview", "LOADING_CHART": "Loading chart data...", "NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.", "DOWNLOAD_AGENT_REPORTS": "Download agent reports", @@ -50,7 +50,41 @@ { "id": 4, "name": "Last year" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "HEADER": "CSAT Reports", + "NO_RECORDS": "There are no CSAT survey responses available.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Assigned agent", + "RATING": "Rating", + "FEEDBACK_TEXT": "Feedback comment" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/sk/settings.json b/app/javascript/dashboard/i18n/locale/sk/settings.json index f2d2852918fc..4881fbf89d87 100644 --- a/app/javascript/dashboard/i18n/locale/sk/settings.json +++ b/app/javascript/dashboard/i18n/locale/sk/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Email Notifications", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "Account Settings", "APPLICATIONS": "Applications", "LABELS": "Labels", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with", + "REPORTS_OVERVIEW": "Overview", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "New Account", diff --git a/app/javascript/dashboard/i18n/locale/sv/agentMgmt.json b/app/javascript/dashboard/i18n/locale/sv/agentMgmt.json index 3a24ba227665..308b32300b9a 100644 --- a/app/javascript/dashboard/i18n/locale/sv/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/sv/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Inga agenter hittades." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/sv/campaign.json b/app/javascript/dashboard/i18n/locale/sv/campaign.json index e3542b16f61b..a8b4efba2bed 100644 --- a/app/javascript/dashboard/i18n/locale/sv/campaign.json +++ b/app/javascript/dashboard/i18n/locale/sv/campaign.json @@ -14,6 +14,17 @@ "PLACEHOLDER": "Please enter the title of campaign", "ERROR": "Title is required" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { "LABEL": "Message", "PLACEHOLDER": "Please enter the message of campaign", @@ -72,6 +83,7 @@ "STATUS": "Status", "SENDER": "Sender", "URL": "URL", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "Time(Seconds)", "CREATED_AT": "Created at" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "Aktiverad", - "DISABLED": "Inaktiverad" + "DISABLED": "Inaktiverad", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "Bot" diff --git a/app/javascript/dashboard/i18n/locale/sv/contact.json b/app/javascript/dashboard/i18n/locale/sv/contact.json index 05d42258c070..8ae78f0a0e8e 100644 --- a/app/javascript/dashboard/i18n/locale/sv/contact.json +++ b/app/javascript/dashboard/i18n/locale/sv/contact.json @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "Kontakter", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Sök", "SEARCH_INPUT_PLACEHOLDER": "Sök kontakter", "LIST": { "LOADING_MESSAGE": "Laddar kontakter...", "404": "Inga kontakter matchar din sökning 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Namn", "PHONE_NUMBER": "Telefonnummer", @@ -203,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Avbryt", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/sv/conversation.json b/app/javascript/dashboard/i18n/locale/sv/conversation.json index 3990678cb035..10ad11cd606f 100644 --- a/app/javascript/dashboard/i18n/locale/sv/conversation.json +++ b/app/javascript/dashboard/i18n/locale/sv/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "Ta bort urval", "DOWNLOAD": "Hämta", "UPLOADING_ATTACHMENTS": "Laddar upp bilagor...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "Inget svar", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Lös", "REOPEN_ACTION": "Återöppna", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "Visa textformaterare", "TIP_EMOJI_ICON": "Visa emoji-väljare", "TIP_ATTACH_ICON": "Bifoga filer", - "ENTER_TO_SEND": "Enter för att skicka" + "ENTER_TO_SEND": "Enter för att skicka", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Privat anteckning: Endast synlig för dig och ditt team", "CHANGE_STATUS": "Konversationsstatus ändrad", @@ -64,6 +69,10 @@ "SELECT_AGENT": "Välj agent", "REMOVE": "Radera", "ASSIGN": "Tilldela" + }, + "CONTEXT_MENU": { + "COPY": "Kopiera", + "DELETE": "Radera" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/sv/csatMgmt.json b/app/javascript/dashboard/i18n/locale/sv/csatMgmt.json new file mode 100644 index 000000000000..d7d2efc2ada6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/sv/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/sv/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/sv/inboxMgmt.json index d185d0bc3fb1..63d7f5ff933d 100644 --- a/app/javascript/dashboard/i18n/locale/sv/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/sv/inboxMgmt.json @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "Vi kunde inte autentisera Twilio-uppgifterna, försök igen" } }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." + }, "API_CHANNEL": { "TITLE": "API-kanal", "DESC": "Integrera med API-kanalen och börja supporta dina kunder.", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "Börja vidarebefordra dina e-postmeddelanden till följande e-postadress." }, "AUTH": { - "TITLE": "Kanaler", - "DESC": "För närvarande stöder vi live chat widgets på en webbplats, Facebook-sidor, Twitter-profiler och Whatsapp som plattformar. Vi har fler plattformar som e-post, Telegram och Line på gång som kommer ut snart." + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "Agenter", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Aktiverad", "DISABLED": "Inaktiverad" + }, + "ENABLE_CSAT": { + "ENABLED": "Aktiverad", + "DISABLED": "Inaktiverad" } }, "DELETE": { @@ -255,6 +267,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Aktivera automatisk tilldelning", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Inkorgsinställningar", "INBOX_UPDATE_SUB_TEXT": "Uppdatera inställningarna för din inkorg", "AUTO_ASSIGNMENT_SUB_TEXT": "Aktivera eller inaktivera automatisk tilldelning av nya konversationer till de agenter som lagts till den här inkorgen.", diff --git a/app/javascript/dashboard/i18n/locale/sv/integrations.json b/app/javascript/dashboard/i18n/locale/sv/integrations.json index 166f9d527c03..29cd7965077b 100644 --- a/app/javascript/dashboard/i18n/locale/sv/integrations.json +++ b/app/javascript/dashboard/i18n/locale/sv/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

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

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

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

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

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

" + } + }, "DELETE": { "BUTTON_TEXT": "Radera", "API": { diff --git a/app/javascript/dashboard/i18n/locale/sv/report.json b/app/javascript/dashboard/i18n/locale/sv/report.json index b402521b67da..c7ba9a1c84ad 100644 --- a/app/javascript/dashboard/i18n/locale/sv/report.json +++ b/app/javascript/dashboard/i18n/locale/sv/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "Rapporter", + "HEADER": "Overview", "LOADING_CHART": "Laddar diagramdata...", "NO_ENOUGH_DATA": "Vi har inte fått tillräckligt många datapunkter för att generera en rapport, försök igen senare.", "DOWNLOAD_AGENT_REPORTS": "Ladda ner agentrapporter", @@ -50,7 +50,41 @@ { "id": 4, "name": "Last year" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "HEADER": "CSAT Reports", + "NO_RECORDS": "There are no CSAT survey responses available.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Assigned agent", + "RATING": "Rating", + "FEEDBACK_TEXT": "Feedback comment" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/sv/settings.json b/app/javascript/dashboard/i18n/locale/sv/settings.json index d8a5c1dc3b67..6cac67a5d487 100644 --- a/app/javascript/dashboard/i18n/locale/sv/settings.json +++ b/app/javascript/dashboard/i18n/locale/sv/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "E-postaviseringar", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "Kontoinställningar", "APPLICATIONS": "Applications", "LABELS": "Etiketter", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with", + "REPORTS_OVERVIEW": "Overview", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Nytt konto", diff --git a/app/javascript/dashboard/i18n/locale/ta/agentMgmt.json b/app/javascript/dashboard/i18n/locale/ta/agentMgmt.json index 0d46a23cc986..e98d91a626bb 100644 --- a/app/javascript/dashboard/i18n/locale/ta/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ta/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "ஏஜென்ட்கள் யாரும் இல்லை." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/ta/campaign.json b/app/javascript/dashboard/i18n/locale/ta/campaign.json index 3a74320cbb94..ed1f079cf3a6 100644 --- a/app/javascript/dashboard/i18n/locale/ta/campaign.json +++ b/app/javascript/dashboard/i18n/locale/ta/campaign.json @@ -14,6 +14,17 @@ "PLACEHOLDER": "Please enter the title of campaign", "ERROR": "Title is required" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { "LABEL": "Message", "PLACEHOLDER": "Please enter the message of campaign", @@ -72,6 +83,7 @@ "STATUS": "நிலை", "SENDER": "Sender", "URL": "URL", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "Time(Seconds)", "CREATED_AT": "Created at" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "இயக்கப்பட்டது", - "DISABLED": "முடக்கப்பட்டது" + "DISABLED": "முடக்கப்பட்டது", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "Bot" diff --git a/app/javascript/dashboard/i18n/locale/ta/contact.json b/app/javascript/dashboard/i18n/locale/ta/contact.json index 4b290a106d72..f4c9b2e9aae7 100644 --- a/app/javascript/dashboard/i18n/locale/ta/contact.json +++ b/app/javascript/dashboard/i18n/locale/ta/contact.json @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "Contacts", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Search", "SEARCH_INPUT_PLACEHOLDER": "Search for contacts", "LIST": { "LOADING_MESSAGE": "Loading contacts...", "404": "No contacts matches your search 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "பெயர்", "PHONE_NUMBER": "Phone Number", @@ -203,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "ரத்துசெய்", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/ta/conversation.json b/app/javascript/dashboard/i18n/locale/ta/conversation.json index aee6efaa6f79..e8a7d5e49b38 100644 --- a/app/javascript/dashboard/i18n/locale/ta/conversation.json +++ b/app/javascript/dashboard/i18n/locale/ta/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "Remove Selection", "DOWNLOAD": "பதிவிறக்கம்", "UPLOADING_ATTACHMENTS": "Uploading attachments...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "தீர்", "REOPEN_ACTION": "மீண்டும் திற", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "தனிப்பட்ட குறிப்பு: உங்களுக்கும் உங்கள் குழுவினருக்கும் மட்டுமே தெரியும்", "CHANGE_STATUS": "உரையாடலின் நிலை மாற்றப்பட்டது", @@ -64,6 +69,10 @@ "SELECT_AGENT": "Select Agent", "REMOVE": "நீக்கு", "ASSIGN": "Assign" + }, + "CONTEXT_MENU": { + "COPY": "நகல்", + "DELETE": "Delete" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/ta/csatMgmt.json b/app/javascript/dashboard/i18n/locale/ta/csatMgmt.json new file mode 100644 index 000000000000..d7d2efc2ada6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ta/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/ta/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ta/inboxMgmt.json index 93e04b3146e0..043b4d6a050b 100644 --- a/app/javascript/dashboard/i18n/locale/ta/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ta/inboxMgmt.json @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "ட்விலியோ கிரேடின்டியல்செய் எங்களால் அங்கீகரிக்க முடியவில்லை, தயவுசெய்து மீண்டும் முயற்சிக்கவும்" } }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." + }, "API_CHANNEL": { "TITLE": "API Channel", "DESC": "Integrate with API channel and start supporting your customers.", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "Start forwarding your emails to the following email address." }, "AUTH": { - "TITLE": "சேனல்கள்", - "DESC": "தற்போது வலைத்தள நேரடி சாட் விட்ஜெட்டுகள், பேஸ்புக் பக்கங்கள் மற்றும் ட்விட்டர் சுயவிவரங்களை தளங்களாக ஆதரிக்கிறோம். விரைவில் வாட்ஸ்அப், ஈ-மெயில், டெலிகிராம் மற்றும் லைன் போன்ற பல தளங்களிலும் வர இருக்கிறது." + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "ஏஜென்ட்கள்", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "இயக்கப்பட்டது", "DISABLED": "முடக்கப்பட்டது" + }, + "ENABLE_CSAT": { + "ENABLED": "இயக்கப்பட்டது", + "DISABLED": "முடக்கப்பட்டது" } }, "DELETE": { @@ -255,6 +267,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "தானாக ஒதுக்கீட்டை இயக்கு", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "இன்பாக்ஸ் அமைப்புகள்", "INBOX_UPDATE_SUB_TEXT": "உங்கள் இன்பாக்ஸ் அமைப்புகளைப் புதுப்பிக்கவும்", "AUTO_ASSIGNMENT_SUB_TEXT": "இந்த இன்பாக்ஸில் சேர்க்கப்பட்ட ஏஜென்ட்களுக்கு புதிய உரையாடல்களின் தானியங்கி ஒதுக்கீட்டை இயக்கவும் அல்லது முடக்கவும்.", diff --git a/app/javascript/dashboard/i18n/locale/ta/integrations.json b/app/javascript/dashboard/i18n/locale/ta/integrations.json index 4425aa5ae772..53c24813971e 100644 --- a/app/javascript/dashboard/i18n/locale/ta/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ta/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

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

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

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

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

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

" + } + }, "DELETE": { "BUTTON_TEXT": "Delete", "API": { diff --git a/app/javascript/dashboard/i18n/locale/ta/report.json b/app/javascript/dashboard/i18n/locale/ta/report.json index c36ed1f9a40f..a46a9b8edf15 100644 --- a/app/javascript/dashboard/i18n/locale/ta/report.json +++ b/app/javascript/dashboard/i18n/locale/ta/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "அறிக்கைகள்", + "HEADER": "Overview", "LOADING_CHART": "சார்ட்டுக்கான டேட்டாவை பெறுகிறது...", "NO_ENOUGH_DATA": "அறிக்கையை உருவாக்க போதுமான தரவுகளை பெறவில்லை, தயவுசெய்து மீண்டும் முயற்சிக்கவும்.", "DOWNLOAD_AGENT_REPORTS": "Download agent reports", @@ -50,7 +50,41 @@ { "id": 4, "name": "Last year" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "HEADER": "CSAT Reports", + "NO_RECORDS": "There are no CSAT survey responses available.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Assigned agent", + "RATING": "Rating", + "FEEDBACK_TEXT": "Feedback comment" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/ta/settings.json b/app/javascript/dashboard/i18n/locale/ta/settings.json index 49020c1b7674..2271c9b180eb 100644 --- a/app/javascript/dashboard/i18n/locale/ta/settings.json +++ b/app/javascript/dashboard/i18n/locale/ta/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "ஈமெயில் வழியான அறிவிப்புகள்", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "கணக்கின் அமைப்புகள்", "APPLICATIONS": "Applications", "LABELS": "Labels", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with", + "REPORTS_OVERVIEW": "Overview", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "New Account", diff --git a/app/javascript/dashboard/i18n/locale/th/agentMgmt.json b/app/javascript/dashboard/i18n/locale/th/agentMgmt.json index bf1d2f43c889..1f26bdf1007a 100644 --- a/app/javascript/dashboard/i18n/locale/th/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/th/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "ไม่พบพนักงาน" + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/th/campaign.json b/app/javascript/dashboard/i18n/locale/th/campaign.json index 9c985360c87c..eb208c87d758 100644 --- a/app/javascript/dashboard/i18n/locale/th/campaign.json +++ b/app/javascript/dashboard/i18n/locale/th/campaign.json @@ -14,6 +14,17 @@ "PLACEHOLDER": "กรุณาใส่หัวข้อแคมเปญ", "ERROR": "โปรดระบุหัวข้อด้วย" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { "LABEL": "ข้อความ", "PLACEHOLDER": "โปรดระบุข้อความของแคมเปญด้วย", @@ -72,6 +83,7 @@ "STATUS": "สถานะ", "SENDER": "ผู้ส่ง", "URL": "ลิ้ง", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "เวลา (วินาที)", "CREATED_AT": "สร้างเมื่อ" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "เปิด", - "DISABLED": "ปิด" + "DISABLED": "ปิด", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "บอท" diff --git a/app/javascript/dashboard/i18n/locale/th/contact.json b/app/javascript/dashboard/i18n/locale/th/contact.json index 49a4a20ab942..9cbfb6cfe3d0 100644 --- a/app/javascript/dashboard/i18n/locale/th/contact.json +++ b/app/javascript/dashboard/i18n/locale/th/contact.json @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "ผู้ติดต่อ", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "ค้นหา", "SEARCH_INPUT_PLACEHOLDER": "ค้อนหาผู้ติดต่อ", "LIST": { "LOADING_MESSAGE": "กำลังโหลดรายชื่อผู้ติดต่อ", "404": "ไม่มีผู้ติดต่อที่ตรงกัน 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "ชื่อ", "PHONE_NUMBER": "หมายเลขโทรศัพท์", @@ -203,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "ยกเลิก", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/th/conversation.json b/app/javascript/dashboard/i18n/locale/th/conversation.json index b0afb783c470..54d7a26d1b64 100644 --- a/app/javascript/dashboard/i18n/locale/th/conversation.json +++ b/app/javascript/dashboard/i18n/locale/th/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "ลบตัวเลือก", "DOWNLOAD": "ดาวโหลด", "UPLOADING_ATTACHMENTS": "Uploading attachments...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "เสร็จสิ้น", "REOPEN_ACTION": "เปิดใหม่อีกครั้ง", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "โน้ตส่วนตัว: มีเพียงคุณและทีมเท่านั้นที่มองเห็นได้", "CHANGE_STATUS": "สถานะการสนทนามีการเปลี่ยนเเปลง", @@ -64,6 +69,10 @@ "SELECT_AGENT": "Select Agent", "REMOVE": "Remove", "ASSIGN": "Assign" + }, + "CONTEXT_MENU": { + "COPY": "Copy", + "DELETE": "ลบ" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/th/csatMgmt.json b/app/javascript/dashboard/i18n/locale/th/csatMgmt.json new file mode 100644 index 000000000000..d7d2efc2ada6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/th/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/th/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/th/inboxMgmt.json index f5e65fca820a..06d6bd7de7e0 100644 --- a/app/javascript/dashboard/i18n/locale/th/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/th/inboxMgmt.json @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "เราไม่สามารถยืนยันใบรับลองของ Twilio ได้กรุณาลองใหม่อีกครั้ง" } }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." + }, "API_CHANNEL": { "TITLE": "ช่อง API", "DESC": "สร้างช่องด้วย API เเละเริ่มช่วยเหลือลูกค้าของคุณ", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "เริ่มนำเข้าอีเมล์ของคุณไปที่อยู่อีเมล์" }, "AUTH": { - "TITLE": "ช่อง", - "DESC": "ขณะนี้เราสนับสนุนวิดเจ็ตแชทสดของเว็บไซต์เพจ Facebook และโปรไฟล์ Twitter เป็นแพลตฟอร์ม เรามีแพลตฟอร์มอื่น ๆ เช่น Whatsapp, Email, Telegram และ Line ในผลงานซึ่งจะออกเร็ว ๆ นี้" + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "พนักงาน", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "เปิด", "DISABLED": "ปิด" + }, + "ENABLE_CSAT": { + "ENABLED": "เปิด", + "DISABLED": "ปิด" } }, "DELETE": { @@ -255,6 +267,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Enable auto assignment", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Inbox Settings", "INBOX_UPDATE_SUB_TEXT": "Update your inbox settings", "AUTO_ASSIGNMENT_SUB_TEXT": "Enable or disable the automatic assignment of new conversations to the agents added to this inbox.", diff --git a/app/javascript/dashboard/i18n/locale/th/integrations.json b/app/javascript/dashboard/i18n/locale/th/integrations.json index f13cb47ddf76..5a2e0ac7f7ff 100644 --- a/app/javascript/dashboard/i18n/locale/th/integrations.json +++ b/app/javascript/dashboard/i18n/locale/th/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

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

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

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

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

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

" + } + }, "DELETE": { "BUTTON_TEXT": "ลบ", "API": { diff --git a/app/javascript/dashboard/i18n/locale/th/report.json b/app/javascript/dashboard/i18n/locale/th/report.json index 0018a50dacf5..4b8fc5318f2f 100644 --- a/app/javascript/dashboard/i18n/locale/th/report.json +++ b/app/javascript/dashboard/i18n/locale/th/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "Reports", + "HEADER": "Overview", "LOADING_CHART": "Loading chart data...", "NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.", "DOWNLOAD_AGENT_REPORTS": "Download agent reports", @@ -50,7 +50,41 @@ { "id": 4, "name": "Last year" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "HEADER": "CSAT Reports", + "NO_RECORDS": "There are no CSAT survey responses available.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Assigned agent", + "RATING": "Rating", + "FEEDBACK_TEXT": "Feedback comment" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/th/settings.json b/app/javascript/dashboard/i18n/locale/th/settings.json index c4ab1c02a453..e7335fbe6906 100644 --- a/app/javascript/dashboard/i18n/locale/th/settings.json +++ b/app/javascript/dashboard/i18n/locale/th/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Email Notifications", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "Account Settings", "APPLICATIONS": "Applications", "LABELS": "Labels", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with", + "REPORTS_OVERVIEW": "Overview", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "New Account", diff --git a/app/javascript/dashboard/i18n/locale/tr/agentMgmt.json b/app/javascript/dashboard/i18n/locale/tr/agentMgmt.json index 971a7f79646a..a9e167411a19 100644 --- a/app/javascript/dashboard/i18n/locale/tr/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/tr/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Kullanıcı bulunamadı." + "NO_RESULTS": "Sonuç bulunamadı." } } } diff --git a/app/javascript/dashboard/i18n/locale/tr/campaign.json b/app/javascript/dashboard/i18n/locale/tr/campaign.json index 955e6c431560..4416db6362dd 100644 --- a/app/javascript/dashboard/i18n/locale/tr/campaign.json +++ b/app/javascript/dashboard/i18n/locale/tr/campaign.json @@ -14,6 +14,17 @@ "PLACEHOLDER": "Please enter the title of campaign", "ERROR": "Title is required" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { "LABEL": "Message", "PLACEHOLDER": "Please enter the message of campaign", @@ -72,6 +83,7 @@ "STATUS": "Durum", "SENDER": "Sender", "URL": "URL", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "Time(Seconds)", "CREATED_AT": "Created at" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "Etkin", - "DISABLED": "Devre dışı" + "DISABLED": "Devre dışı", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "Bot" diff --git a/app/javascript/dashboard/i18n/locale/tr/contact.json b/app/javascript/dashboard/i18n/locale/tr/contact.json index 05eb5131e382..b8912a9a2040 100644 --- a/app/javascript/dashboard/i18n/locale/tr/contact.json +++ b/app/javascript/dashboard/i18n/locale/tr/contact.json @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "Kişiler", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Arama", "SEARCH_INPUT_PLACEHOLDER": "Kişileri arayın", "LIST": { "LOADING_MESSAGE": "Kişiler yükleniyor ...", "404": "Aramanızla eşleşen kişi yok 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "İsim", "PHONE_NUMBER": "Telefon numarası", @@ -203,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "İptal Et", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/tr/conversation.json b/app/javascript/dashboard/i18n/locale/tr/conversation.json index f2ec9c24bb78..2422f79a2c81 100644 --- a/app/javascript/dashboard/i18n/locale/tr/conversation.json +++ b/app/javascript/dashboard/i18n/locale/tr/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "Seçimi Kaldır", "DOWNLOAD": "İndir", "UPLOADING_ATTACHMENTS": "Dosyalar gönderiliyor...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "Cevap Yok", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Çözüldü", "REOPEN_ACTION": "Yeniden aç", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "Metin Düzenlemeyi Göster", "TIP_EMOJI_ICON": "Emojileri göster", "TIP_ATTACH_ICON": "Dosya ekle", - "ENTER_TO_SEND": "Göndermek için Enter tuşuna basın" + "ENTER_TO_SEND": "Göndermek için Enter tuşuna basın", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Özel Not: Yalnızca siz ve ekibiniz tarafından görülebilir", "CHANGE_STATUS": "Görüşme durumu değişti", @@ -64,6 +69,10 @@ "SELECT_AGENT": "Temsilci Seçin", "REMOVE": "Kaldır", "ASSIGN": "Atama yap" + }, + "CONTEXT_MENU": { + "COPY": "Kopyala", + "DELETE": "Sil" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/tr/csatMgmt.json b/app/javascript/dashboard/i18n/locale/tr/csatMgmt.json new file mode 100644 index 000000000000..d7d2efc2ada6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/tr/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json index 0d2144d6ed51..d73f0bc8cd55 100644 --- a/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "Twilio kimlik bilgilerini doğrulayamadık, lütfen tekrar deneyin" } }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." + }, "API_CHANNEL": { "TITLE": "API Kanalı", "DESC": "API kanalı ile entegre edin ve müşterilerinizi desteklemeye başlayın.", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "E-postalarınızı aşağıdaki e-posta adresine iletmeye başlayın." }, "AUTH": { - "TITLE": "Kanallar", - "DESC": "Currently we support Website live chat widgets, Facebook Pages and Twitter profiles as platforms. We have more platforms like Whatsapp, Email, Telegram and Line in the works, which will be out soon." + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "Kullanıcılar", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Etkin", "DISABLED": "Devre dışı" + }, + "ENABLE_CSAT": { + "ENABLED": "Etkin", + "DISABLED": "Devre dışı" } }, "DELETE": { @@ -255,6 +267,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Otomatik atamayı etkinleştir", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Gelen Kutusu Ayarları", "INBOX_UPDATE_SUB_TEXT": "Gelen kutusu ayarlarınızı güncelleyin", "AUTO_ASSIGNMENT_SUB_TEXT": "Bu gelen kutusuna eklenen aracılara yeni görüşmelerin otomatik olarak atanmasını etkinleştirin veya devre dışı bırakın.", diff --git a/app/javascript/dashboard/i18n/locale/tr/integrations.json b/app/javascript/dashboard/i18n/locale/tr/integrations.json index 577c5f2aadbf..dbbd8a6cbdfc 100644 --- a/app/javascript/dashboard/i18n/locale/tr/integrations.json +++ b/app/javascript/dashboard/i18n/locale/tr/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

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

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

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

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

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

" + } + }, "DELETE": { "BUTTON_TEXT": "Sil", "API": { diff --git a/app/javascript/dashboard/i18n/locale/tr/report.json b/app/javascript/dashboard/i18n/locale/tr/report.json index 01392b0dbc05..b91f0c70c90b 100644 --- a/app/javascript/dashboard/i18n/locale/tr/report.json +++ b/app/javascript/dashboard/i18n/locale/tr/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "Raporlar", + "HEADER": "Overview", "LOADING_CHART": "Grafik verileri yükleniyor...", "NO_ENOUGH_DATA": "Rapor oluşturmak için yeterli veri yok, Lütfen daha sonra tekrar deneyin.", "DOWNLOAD_AGENT_REPORTS": "Etken raporları indir", @@ -50,7 +50,41 @@ { "id": 4, "name": "Last year" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "HEADER": "CSAT Reports", + "NO_RECORDS": "There are no CSAT survey responses available.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Assigned agent", + "RATING": "Rating", + "FEEDBACK_TEXT": "Feedback comment" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/tr/settings.json b/app/javascript/dashboard/i18n/locale/tr/settings.json index 88c03d3f873b..960ac10d9d18 100644 --- a/app/javascript/dashboard/i18n/locale/tr/settings.json +++ b/app/javascript/dashboard/i18n/locale/tr/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Sesli Bildirimler", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "E-posta Bildirimleri", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "Hesap ayarları", "APPLICATIONS": "Applications", "LABELS": "Etiketler", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with", + "REPORTS_OVERVIEW": "Overview", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Yeni hesap", diff --git a/app/javascript/dashboard/i18n/locale/uk/agentMgmt.json b/app/javascript/dashboard/i18n/locale/uk/agentMgmt.json index 2578e4cb3a0b..e525fbf0d93d 100644 --- a/app/javascript/dashboard/i18n/locale/uk/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/uk/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Агентів не знайдено." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/uk/campaign.json b/app/javascript/dashboard/i18n/locale/uk/campaign.json index 6065777a53ba..9d4ff2c86030 100644 --- a/app/javascript/dashboard/i18n/locale/uk/campaign.json +++ b/app/javascript/dashboard/i18n/locale/uk/campaign.json @@ -14,6 +14,17 @@ "PLACEHOLDER": "Please enter the title of campaign", "ERROR": "Title is required" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { "LABEL": "Message", "PLACEHOLDER": "Please enter the message of campaign", @@ -72,6 +83,7 @@ "STATUS": "Статус", "SENDER": "Sender", "URL": "URL", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "Time(Seconds)", "CREATED_AT": "Created at" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "Увімкнено", - "DISABLED": "Вимкнено" + "DISABLED": "Вимкнено", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "Bot" diff --git a/app/javascript/dashboard/i18n/locale/uk/contact.json b/app/javascript/dashboard/i18n/locale/uk/contact.json index daf7fdb44aaa..712167c677cf 100644 --- a/app/javascript/dashboard/i18n/locale/uk/contact.json +++ b/app/javascript/dashboard/i18n/locale/uk/contact.json @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "Contacts", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Search", "SEARCH_INPUT_PLACEHOLDER": "Search for contacts", "LIST": { "LOADING_MESSAGE": "Loading contacts...", "404": "No contacts matches your search 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Ім'я", "PHONE_NUMBER": "Phone Number", @@ -203,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Скасувати", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/uk/conversation.json b/app/javascript/dashboard/i18n/locale/uk/conversation.json index ba23ac6746cb..760027e65502 100644 --- a/app/javascript/dashboard/i18n/locale/uk/conversation.json +++ b/app/javascript/dashboard/i18n/locale/uk/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "Remove Selection", "DOWNLOAD": "Звантажити", "UPLOADING_ATTACHMENTS": "Uploading attachments...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Вирішити", "REOPEN_ACTION": "Відкрити знову", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Приватна нотатка: видима тільки вам та вашій команді", "CHANGE_STATUS": "Статус бесіди змінено", @@ -64,6 +69,10 @@ "SELECT_AGENT": "Select Agent", "REMOVE": "Видалити", "ASSIGN": "Assign" + }, + "CONTEXT_MENU": { + "COPY": "Копіювати", + "DELETE": "Видалити" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/uk/csatMgmt.json b/app/javascript/dashboard/i18n/locale/uk/csatMgmt.json new file mode 100644 index 000000000000..d7d2efc2ada6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uk/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/uk/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/uk/inboxMgmt.json index a87184bbb654..6f4217c12e2d 100644 --- a/app/javascript/dashboard/i18n/locale/uk/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/uk/inboxMgmt.json @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "Автентифікація у Twilio не вдалася, будь ласка, спробуйте знову" } }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." + }, "API_CHANNEL": { "TITLE": "API Channel", "DESC": "Integrate with API channel and start supporting your customers.", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "Start forwarding your emails to the following email address." }, "AUTH": { - "TITLE": "Канали", - "DESC": "Currently we support Website live chat widgets, Facebook Pages and Twitter profiles as platforms. We have more platforms like Whatsapp, Email, Telegram and Line in the works, which will be out soon." + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "Агенти", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Увімкнено", "DISABLED": "Вимкнено" + }, + "ENABLE_CSAT": { + "ENABLED": "Увімкнено", + "DISABLED": "Вимкнено" } }, "DELETE": { @@ -255,6 +267,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Увімкнути автопризначення", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Inbox Settings", "INBOX_UPDATE_SUB_TEXT": "Update your inbox settings", "AUTO_ASSIGNMENT_SUB_TEXT": "Enable or disable the automatic assignment of new conversations to the agents added to this inbox.", diff --git a/app/javascript/dashboard/i18n/locale/uk/integrations.json b/app/javascript/dashboard/i18n/locale/uk/integrations.json index 9231c6cf7658..f3b65a7d81f4 100644 --- a/app/javascript/dashboard/i18n/locale/uk/integrations.json +++ b/app/javascript/dashboard/i18n/locale/uk/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

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

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

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

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

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

" + } + }, "DELETE": { "BUTTON_TEXT": "Видалити", "API": { diff --git a/app/javascript/dashboard/i18n/locale/uk/report.json b/app/javascript/dashboard/i18n/locale/uk/report.json index 5ff21f034fd8..5c745a56a45c 100644 --- a/app/javascript/dashboard/i18n/locale/uk/report.json +++ b/app/javascript/dashboard/i18n/locale/uk/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "Звіти", + "HEADER": "Overview", "LOADING_CHART": "Завантаження даних діаграми...", "NO_ENOUGH_DATA": "Ми не отримали достатньо даних для генерації звіту. Будь ласка, спробуйте ще раз пізніше.", "DOWNLOAD_AGENT_REPORTS": "Download agent reports", @@ -50,7 +50,41 @@ { "id": 4, "name": "Last year" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "HEADER": "CSAT Reports", + "NO_RECORDS": "There are no CSAT survey responses available.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Assigned agent", + "RATING": "Rating", + "FEEDBACK_TEXT": "Feedback comment" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/uk/settings.json b/app/javascript/dashboard/i18n/locale/uk/settings.json index 933bb460888d..5ec74db864b8 100644 --- a/app/javascript/dashboard/i18n/locale/uk/settings.json +++ b/app/javascript/dashboard/i18n/locale/uk/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Сповіщення електронною поштою", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "Налаштування акаунту", "APPLICATIONS": "Applications", "LABELS": "Labels", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with", + "REPORTS_OVERVIEW": "Overview", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "New Account", diff --git a/app/javascript/dashboard/i18n/locale/vi/agentMgmt.json b/app/javascript/dashboard/i18n/locale/vi/agentMgmt.json index 375d317c49a1..eed729b82f9c 100644 --- a/app/javascript/dashboard/i18n/locale/vi/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/vi/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "No agents found." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/vi/campaign.json b/app/javascript/dashboard/i18n/locale/vi/campaign.json index 83cd8fe1dac2..5ea7cc764cf7 100644 --- a/app/javascript/dashboard/i18n/locale/vi/campaign.json +++ b/app/javascript/dashboard/i18n/locale/vi/campaign.json @@ -14,6 +14,17 @@ "PLACEHOLDER": "Please enter the title of campaign", "ERROR": "Title is required" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { "LABEL": "Message", "PLACEHOLDER": "Please enter the message of campaign", @@ -72,6 +83,7 @@ "STATUS": "Trạng thái", "SENDER": "Sender", "URL": "URL", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "Time(Seconds)", "CREATED_AT": "Created at" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "Bật", - "DISABLED": "Không bật" + "DISABLED": "Tắt", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "Bot" diff --git a/app/javascript/dashboard/i18n/locale/vi/chatlist.json b/app/javascript/dashboard/i18n/locale/vi/chatlist.json index 34a0779909ae..806e2cb63668 100644 --- a/app/javascript/dashboard/i18n/locale/vi/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/vi/chatlist.json @@ -80,7 +80,7 @@ "RECEIVED_VIA_EMAIL": "Nhận được từ email", "VIEW_TWEET_IN_TWITTER": "Xem tweet trên Twitter", "REPLY_TO_TWEET": "Trả lời cho tweet này", - "NO_MESSAGES": "No Messages", - "NO_CONTENT": "No content available" + "NO_MESSAGES": "Không có tin nhắn", + "NO_CONTENT": "Không có nội dung" } } diff --git a/app/javascript/dashboard/i18n/locale/vi/contact.json b/app/javascript/dashboard/i18n/locale/vi/contact.json index f97e327553a7..67f353cb9e14 100644 --- a/app/javascript/dashboard/i18n/locale/vi/contact.json +++ b/app/javascript/dashboard/i18n/locale/vi/contact.json @@ -3,7 +3,7 @@ "NOT_AVAILABLE": "Không có sẵn", "EMAIL_ADDRESS": "Địa chỉ email", "PHONE_NUMBER": "Số điện thoại", - "COPY_SUCCESSFUL": "Copied to clipboard successfully", + "COPY_SUCCESSFUL": "Đã sao chép mã thành công", "COMPANY": "Công ty", "LOCATION": "Vị trí", "CONVERSATION_TITLE": "Chi tiết của cuộc trò chuyện", @@ -12,7 +12,7 @@ "INITIATED_FROM": "Bắt đầu từ", "INITIATED_AT": "Bắt đầu lúc", "IP_ADDRESS": "Địa chỉ IP", - "NEW_MESSAGE": "New message", + "NEW_MESSAGE": "Tin nhắn mới", "CONVERSATIONS": { "NO_RECORDS_FOUND": "Không có cuộc trò chuyện trước đó được liên kết với liên hệ này.", "TITLE": "Cuộc trò chuyện trước đó" @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "Contacts", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Search", "SEARCH_INPUT_PLACEHOLDER": "Search for contacts", "LIST": { "LOADING_MESSAGE": "Loading contacts...", "404": "No contacts matches your search 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Tên", "PHONE_NUMBER": "Số điện thoại", @@ -203,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Huỷ", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/vi/conversation.json b/app/javascript/dashboard/i18n/locale/vi/conversation.json index 511a057a7625..303b07e27b5e 100644 --- a/app/javascript/dashboard/i18n/locale/vi/conversation.json +++ b/app/javascript/dashboard/i18n/locale/vi/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "Xóa lựa chọn", "DOWNLOAD": "Tải xuống", "UPLOADING_ATTACHMENTS": "Uploading attachments...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Giải quyết", "REOPEN_ACTION": "Mở lại", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Lưu ý riêng: Chỉ hiển thị với bạn và nhóm của bạn", "CHANGE_STATUS": "Trạng thái cuộc trò chuyện đã thay đổi", @@ -64,6 +69,10 @@ "SELECT_AGENT": "Select Agent", "REMOVE": "Xoá", "ASSIGN": "Assign" + }, + "CONTEXT_MENU": { + "COPY": "Sao Chép", + "DELETE": "Xoá" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/vi/csatMgmt.json b/app/javascript/dashboard/i18n/locale/vi/csatMgmt.json new file mode 100644 index 000000000000..d7d2efc2ada6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/vi/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/vi/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/vi/inboxMgmt.json index 8f9c081be82e..89916bd3e4c6 100644 --- a/app/javascript/dashboard/i18n/locale/vi/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/vi/inboxMgmt.json @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "Chúng tôi không thể xác thực thông tin đăng nhập Twilio, vui lòng thử lại" } }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." + }, "API_CHANNEL": { "TITLE": "Kênh API", "DESC": "Tích hợp với kênh API và bắt đầu hỗ trợ khách hàng của bạn.", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "Bắt đầu chuyển tiếp email của bạn tới địa chỉ email sau." }, "AUTH": { - "TITLE": "Kênh", - "DESC": "Hiện tại, chúng tôi hỗ trợ các tiện ích trò chuyện trực tiếp trên Trang web, Trang Facebook và hồ sơ Twitter làm nền tảng. Chúng tôi có nhiều nền tảng hơn như Whatsapp, Email, Telegram và Line đang hoạt động, sẽ sớm ra mắt." + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "Nhà Cung Cấp", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Bật", "DISABLED": "Không bật" + }, + "ENABLE_CSAT": { + "ENABLED": "Bật", + "DISABLED": "Không bật" } }, "DELETE": { @@ -255,6 +267,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Bật tự động chuyển nhượng", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Cài đặt Hộp thư đến", "INBOX_UPDATE_SUB_TEXT": "Cập nhật cài đặt hộp thư đến của bạn", "AUTO_ASSIGNMENT_SUB_TEXT": "Bật hoặc tắt tính năng tự động gán các cuộc hội thoại mới cho các tác nhân được thêm vào hộp thư đến này.", diff --git a/app/javascript/dashboard/i18n/locale/vi/integrations.json b/app/javascript/dashboard/i18n/locale/vi/integrations.json index 6ffbe12887fb..a6237565e9b2 100644 --- a/app/javascript/dashboard/i18n/locale/vi/integrations.json +++ b/app/javascript/dashboard/i18n/locale/vi/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

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

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

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

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

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

" + } + }, "DELETE": { "BUTTON_TEXT": "Xoá", "API": { diff --git a/app/javascript/dashboard/i18n/locale/vi/report.json b/app/javascript/dashboard/i18n/locale/vi/report.json index e8b7924edadb..4aaad9fbe5c2 100644 --- a/app/javascript/dashboard/i18n/locale/vi/report.json +++ b/app/javascript/dashboard/i18n/locale/vi/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "Báo cáo", + "HEADER": "Overview", "LOADING_CHART": "Đang tải các biểu đồ dữ liệu...", "NO_ENOUGH_DATA": "Chúng tôi không nhận được đủ điểm dữ liệu để tạo báo cáo, Vui lòng thử lại sau.", "DOWNLOAD_AGENT_REPORTS": "Download agent reports", @@ -50,7 +50,41 @@ { "id": 4, "name": "Last year" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "HEADER": "CSAT Reports", + "NO_RECORDS": "There are no CSAT survey responses available.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Assigned agent", + "RATING": "Rating", + "FEEDBACK_TEXT": "Feedback comment" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/vi/settings.json b/app/javascript/dashboard/i18n/locale/vi/settings.json index 264f77dd92bc..0b7242edb318 100644 --- a/app/javascript/dashboard/i18n/locale/vi/settings.json +++ b/app/javascript/dashboard/i18n/locale/vi/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Thông Báo Email", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "Cài Đặt Tài Khoản", "APPLICATIONS": "Applications", "LABELS": "Nhãn", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with", + "REPORTS_OVERVIEW": "Overview", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Tạo mới tài khoản", diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/agentMgmt.json b/app/javascript/dashboard/i18n/locale/zh_CN/agentMgmt.json index d39695127ea5..785681a02493 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "没有找到代理人。" + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/campaign.json b/app/javascript/dashboard/i18n/locale/zh_CN/campaign.json index 16ad60a97162..42c5ff118d07 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/campaign.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/campaign.json @@ -14,8 +14,19 @@ "PLACEHOLDER": "Please enter the title of campaign", "ERROR": "Title is required" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { - "LABEL": "Message", + "LABEL": "消息", "PLACEHOLDER": "Please enter the message of campaign", "ERROR": "Message is required" }, @@ -68,10 +79,11 @@ "404": "There are no campaigns created for this inbox.", "TABLE_HEADER": { "TITLE": "Title", - "MESSAGE": "Message", + "MESSAGE": "消息", "STATUS": "状态", "SENDER": "Sender", "URL": "URL", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "Time(Seconds)", "CREATED_AT": "Created at" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "已启用", - "DISABLED": "已禁用" + "DISABLED": "已禁用", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "机器人" diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/contact.json b/app/javascript/dashboard/i18n/locale/zh_CN/contact.json index f7a504beacc1..367f5b1c6613 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/contact.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/contact.json @@ -12,52 +12,52 @@ "INITIATED_FROM": "启动自:", "INITIATED_AT": "发起于", "IP_ADDRESS": "IP 地址", - "NEW_MESSAGE": "New message", + "NEW_MESSAGE": "新消息", "CONVERSATIONS": { "NO_RECORDS_FOUND": "此联系人没有关联到以前的会话。", "TITLE": "上一次对话" }, "LABELS": { "CONTACT": { - "TITLE": "Contact Labels", - "ERROR": "Couldn't update labels" + "TITLE": "联系人标签", + "ERROR": "无法更新标签" }, "CONVERSATION": { "TITLE": "对话标记", - "ADD_BUTTON": "Add Labels" + "ADD_BUTTON": "添加标签" }, "LABEL_SELECT": { - "TITLE": "Add Labels", - "PLACEHOLDER": "Search labels", - "NO_RESULT": "No labels found" + "TITLE": "添加标签", + "PLACEHOLDER": "搜索标签", + "NO_RESULT": "未找到标签" } }, - "MUTE_CONTACT": "Mute Conversation", - "UNMUTE_CONTACT": "Unmute Conversation", - "MUTED_SUCCESS": "This conversation is muted for 6 hours", - "UNMUTED_SUCCESS": "This conversation is unmuted", + "MUTE_CONTACT": "开始会话", + "UNMUTE_CONTACT": "取消静音", + "MUTED_SUCCESS": "此对话被静音6小时", + "UNMUTED_SUCCESS": "此对话已取消静音", "SEND_TRANSCRIPT": "Send Transcript", "EDIT_LABEL": "编辑" }, "EDIT_CONTACT": { "BUTTON_LABEL": "编辑联系人", - "TITLE": "Edit contact", - "DESC": "Edit contact details" + "TITLE": "编辑联系人", + "DESC": "编辑联系人详情" }, "CREATE_CONTACT": { - "BUTTON_LABEL": "New Contact", - "TITLE": "Create new contact", - "DESC": "Add basic information details about the contact." + "BUTTON_LABEL": "新建联系人", + "TITLE": "创建新联系人", + "DESC": "添加联系人的基本信息。" }, "CONTACT_FORM": { "FORM": { "SUBMIT": "提交", "CANCEL": "取消", "AVATAR": { - "LABEL": "Contact Avatar" + "LABEL": "联系人头像" }, "NAME": { - "PLACEHOLDER": "Enter the full name of the contact", + "PLACEHOLDER": "输入联系人的名字", "LABEL": "名字" }, "BIO": { @@ -65,14 +65,14 @@ "LABEL": "Bio" }, "EMAIL_ADDRESS": { - "PLACEHOLDER": "Enter the email address of the contact", + "PLACEHOLDER": "输入联系人的电子邮件地址", "LABEL": "电子邮件地址" }, "PHONE_NUMBER": { - "PLACEHOLDER": "Enter the phone number of the contact", + "PLACEHOLDER": "输入联系人的电话号码", "LABEL": "电话号码", - "HELP": "Phone number should be of E.164 format eg: +1415555555 [+][country code][area code][local phone number]", - "ERROR": "Phone number should be either empty or of E.164 format" + "HELP": "电话号码应为E.164格式,例如:+14155555 [+] [国家代码][地区代码][本地电话号码]", + "ERROR": "电话号码应为空或E.164格式" }, "LOCATION": { "PLACEHOLDER": "Enter the location of the contact", @@ -119,7 +119,7 @@ "ERROR": "Select an inbox" }, "MESSAGE": { - "LABEL": "Message", + "LABEL": "消息", "PLACEHOLDER": "Write your message here", "ERROR": "Message can't be empty" }, @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "Contacts", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "搜索", "SEARCH_INPUT_PLACEHOLDER": "搜索联系人", "LIST": { "LOADING_MESSAGE": "正在加载联系人列表...", "404": "没有搜索到联系人🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "姓名:", "PHONE_NUMBER": "电话号码", @@ -203,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "取消", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/conversation.json b/app/javascript/dashboard/i18n/locale/zh_CN/conversation.json index 796426431fef..e9d337815d83 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/conversation.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "Remove Selection", "DOWNLOAD": "下载", "UPLOADING_ATTACHMENTS": "Uploading attachments...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "已解决", "REOPEN_ACTION": "重新打开", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "私人便签:仅对您和您的团队可见", "CHANGE_STATUS": "对话状态已更改", @@ -64,6 +69,10 @@ "SELECT_AGENT": "Select Agent", "REMOVE": "删除", "ASSIGN": "Assign" + }, + "CONTEXT_MENU": { + "COPY": "复制", + "DELETE": "删除" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/csatMgmt.json b/app/javascript/dashboard/i18n/locale/zh_CN/csatMgmt.json new file mode 100644 index 000000000000..d7d2efc2ada6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/zh_CN/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/zh_CN/inboxMgmt.json index e88155d80e8d..0a798b4ae203 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/inboxMgmt.json @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "我们无法验证 Twilio 凭据,请重试" } }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." + }, "API_CHANNEL": { "TITLE": "API 频道", "DESC": "Integrate with API channel and start supporting your customers.", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "开始将您的电子邮件转发到以下电子邮件地址。" }, "AUTH": { - "TITLE": "频道", - "DESC": "目前我们支持网站在线聊天小部件、Facebook页面和Twitter配置文件作为平台。 我们在工作中拥有更多平台,如Whatsapp、Email、Telegram 和 Line,这些平台将很快出台。" + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "客服代理们", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "已启用", "DISABLED": "已禁用" + }, + "ENABLE_CSAT": { + "ENABLED": "已启用", + "DISABLED": "已禁用" } }, "DELETE": { @@ -255,6 +267,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "启用自动分配", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "收件箱设置", "INBOX_UPDATE_SUB_TEXT": "更新收件箱设置", "AUTO_ASSIGNMENT_SUB_TEXT": "启用或禁用添加到此收件箱的代理人自动分配新的会话。", diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/integrations.json b/app/javascript/dashboard/i18n/locale/zh_CN/integrations.json index 5cb319e636e1..b3779e431756 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/integrations.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

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

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

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

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

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

" + } + }, "DELETE": { "BUTTON_TEXT": "删除", "API": { diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/report.json b/app/javascript/dashboard/i18n/locale/zh_CN/report.json index 0fd7d92c025f..b10a95ac9d36 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/report.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "报告", + "HEADER": "Overview", "LOADING_CHART": "正在载入图表数据...", "NO_ENOUGH_DATA": "我们没有收到足够的数据点来生成报告,请稍后再试。", "DOWNLOAD_AGENT_REPORTS": "下载客服报表", @@ -50,7 +50,41 @@ { "id": 4, "name": "Last year" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "HEADER": "CSAT Reports", + "NO_RECORDS": "There are no CSAT survey responses available.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Assigned agent", + "RATING": "Rating", + "FEEDBACK_TEXT": "Feedback comment" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/settings.json b/app/javascript/dashboard/i18n/locale/zh_CN/settings.json index 6bcf28024113..76c56666c048 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/settings.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "电子邮件通知", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "帐户设置", "APPLICATIONS": "Applications", "LABELS": "标签", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with", + "REPORTS_OVERVIEW": "Overview", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "New Account", diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/agentMgmt.json b/app/javascript/dashboard/i18n/locale/zh_TW/agentMgmt.json index 90337cc93722..d3de7163b58d 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "查無客服。" + "NO_RESULTS": "查無結果。" } } } diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/campaign.json b/app/javascript/dashboard/i18n/locale/zh_TW/campaign.json index a89e934639f3..ac4274570c42 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/campaign.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/campaign.json @@ -14,6 +14,17 @@ "PLACEHOLDER": "Please enter the title of campaign", "ERROR": "標題為必填" }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "CONFIRM": "Confirm", + "ERROR": "Scheduled time is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, "MESSAGE": { "LABEL": "訊息", "PLACEHOLDER": "Please enter the message of campaign", @@ -72,6 +83,7 @@ "STATUS": "狀態", "SENDER": "發送者", "URL": "URL", + "SCHEDULED_AT": "Scheduled time", "TIME_ON_PAGE": "時間(秒)", "CREATED_AT": "建立於" }, @@ -82,7 +94,9 @@ }, "STATUS": { "ENABLED": "已啟用", - "DISABLED": "已停用" + "DISABLED": "已停用", + "COMPLETED": "Completed", + "ACTIVE": "Active" }, "SENDER": { "BOT": "機器人" diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/contact.json b/app/javascript/dashboard/i18n/locale/zh_TW/contact.json index f134d8b36b6a..2fe4a37821eb 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/contact.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/contact.json @@ -131,11 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "聯絡人", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "搜尋", "SEARCH_INPUT_PLACEHOLDER": "搜尋聯絡人", "LIST": { "LOADING_MESSAGE": "聯絡人載入中...", "404": "找不到符合條件的聯絡人 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "姓名", "PHONE_NUMBER": "聯絡人電話", @@ -203,5 +205,33 @@ "PLACEHOLDER": "例如:11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "取消", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json b/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json index a959195714b6..fd705efe0d8c 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json @@ -27,7 +27,11 @@ "REMOVE_SELECTION": "移除選擇項目", "DOWNLOAD": "下載", "UPLOADING_ATTACHMENTS": "正在上傳附件...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "無回應", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "已解決", "REOPEN_ACTION": "重新打開", @@ -52,7 +56,8 @@ "TIP_FORMAT_ICON": "顯示文字編輯器", "TIP_EMOJI_ICON": "顯示 emoji 選擇器", "TIP_ATTACH_ICON": "附件", - "ENTER_TO_SEND": "按下 Enter 傳送" + "ENTER_TO_SEND": "按下 Enter 傳送", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "私人筆記:僅對您和您的團隊可以看見", "CHANGE_STATUS": "對話狀態已更改", @@ -64,6 +69,10 @@ "SELECT_AGENT": "選擇客服", "REMOVE": "刪除", "ASSIGN": "指派" + }, + "CONTEXT_MENU": { + "COPY": "複製", + "DELETE": "刪除" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/csatMgmt.json b/app/javascript/dashboard/i18n/locale/zh_TW/csatMgmt.json new file mode 100644 index 000000000000..d7d2efc2ada6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/zh_TW/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json index c5c22354a2de..cf9dda7eb0ff 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json @@ -127,6 +127,14 @@ "ERROR_MESSAGE": "我們無法驗證 Twilio 憑證,請重試" } }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." + }, "API_CHANNEL": { "TITLE": "API 頻道", "DESC": "與 API 頻道互動,開始服務客戶。", @@ -165,8 +173,8 @@ "FINISH_MESSAGE": "開始將您的電子信箱轉發到以下電子信箱地址。" }, "AUTH": { - "TITLE": "頻道", - "DESC": "目前我們支持網站線上聊天小元件、Facebook 頁面和 Twitter 配置文件作為平台。 我們在工作中擁有更多平台,如 Whatsapp、Email、Telegram 和 Line,這些平台將很快支援。" + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, Whatsapp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." }, "AGENTS": { "TITLE": "客服", @@ -216,6 +224,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "已啟用", "DISABLED": "已停用" + }, + "ENABLE_CSAT": { + "ENABLED": "已啟用", + "DISABLED": "已停用" } }, "DELETE": { @@ -255,6 +267,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "啟用自動分配", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "收件匣設定", "INBOX_UPDATE_SUB_TEXT": "更新收件匣設定", "AUTO_ASSIGNMENT_SUB_TEXT": "啟用或停用此收件匣客服的對話自動分配。", diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json b/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json index 517d35d46cae..197670a7e3f3 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

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

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

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

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

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

" + } + }, "DELETE": { "BUTTON_TEXT": "刪除", "API": { diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/report.json b/app/javascript/dashboard/i18n/locale/zh_TW/report.json index 2e0555c4b397..39296903632e 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/report.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/report.json @@ -1,6 +1,6 @@ { "REPORT": { - "HEADER": "報表", + "HEADER": "Overview", "LOADING_CHART": "正在載入图表數據...", "NO_ENOUGH_DATA": "我們没有收到足夠的數據來生成報表,請稍後再試。", "DOWNLOAD_AGENT_REPORTS": "下載客服報告", @@ -50,7 +50,41 @@ { "id": 4, "name": "去年" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "HEADER": "CSAT Reports", + "NO_RECORDS": "There are no CSAT survey responses available.", + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Assigned agent", + "RATING": "Rating", + "FEEDBACK_TEXT": "Feedback comment" + } + }, + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" } - ] + } } } diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/settings.json b/app/javascript/dashboard/i18n/locale/zh_TW/settings.json index c877cc359066..29c8872dff74 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/settings.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "音效通知", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "當新的對話被建立或收到新訊息時播放音效通知" + "NONE": "無", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "電子信箱通知", @@ -139,7 +141,11 @@ "ACCOUNT_SETTINGS": "帳戶設定", "APPLICATIONS": "Applications", "LABELS": "標籤", - "TEAMS": "團隊" + "TEAMS": "團隊", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with", + "REPORTS_OVERVIEW": "Overview", + "CSAT": "CSAT" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "新帳戶", diff --git a/app/javascript/dashboard/mixins/agentMixin.js b/app/javascript/dashboard/mixins/agentMixin.js new file mode 100644 index 000000000000..33539008923e --- /dev/null +++ b/app/javascript/dashboard/mixins/agentMixin.js @@ -0,0 +1,35 @@ +import { mapGetters } from 'vuex'; + +export default { + computed: { + assignableAgents() { + return this.$store.getters['inboxAssignableAgents/getAssignableAgents']( + this.inboxId + ); + }, + ...mapGetters({ + currentUser: 'getCurrentUser', + }), + agentsList() { + const agents = this.assignableAgents || []; + return [ + { + confirmed: true, + name: 'None', + id: 0, + role: 'agent', + account_id: 0, + email: 'None', + }, + ...agents, + ].map(item => + item.id === this.currentUser.id + ? { + ...item, + availability_status: this.currentUser.availability_status, + } + : item + ); + }, + }, +}; diff --git a/app/javascript/dashboard/mixins/specs/agentFixtures.js b/app/javascript/dashboard/mixins/specs/agentFixtures.js new file mode 100644 index 000000000000..1c45b60346cc --- /dev/null +++ b/app/javascript/dashboard/mixins/specs/agentFixtures.js @@ -0,0 +1,54 @@ +export default { + allAgents: [ + { + account_id: 1, + availability_status: 'online', + available_name: 'John K', + confirmed: true, + email: 'john@chatwoot.com', + id: 1, + name: 'John Kennady', + role: 'administrator', + }, + { + account_id: 1, + availability_status: 'busy', + available_name: 'Samuel K', + confirmed: true, + email: 'samuel@chatwoot.com', + id: 2, + name: 'Samuel Keta', + role: 'agent', + }, + ], + formattedAgents: [ + { + account_id: 0, + confirmed: true, + email: 'None', + id: 0, + name: 'None', + role: 'agent', + }, + { + account_id: 1, + availability_status: 'busy', + available_name: 'John K', + confirmed: true, + email: 'john@chatwoot.com', + id: 1, + name: 'John Kennady', + role: 'administrator', + }, + { + account_id: 1, + availability_status: 'busy', + available_name: 'Samuel K', + confirmed: true, + email: 'samuel@chatwoot.com', + id: 2, + name: 'Samuel Keta', + role: 'agent', + }, + ], +}; diff --git a/app/javascript/dashboard/mixins/specs/agentMixin.spec.js b/app/javascript/dashboard/mixins/specs/agentMixin.spec.js new file mode 100644 index 000000000000..41d94e114122 --- /dev/null +++ b/app/javascript/dashboard/mixins/specs/agentMixin.spec.js @@ -0,0 +1,38 @@ +import { shallowMount, createLocalVue } from '@vue/test-utils'; +import agentMixin from '../agentMixin'; +import agentFixtures from './agentFixtures'; +import Vuex from 'vuex'; +const localVue = createLocalVue(); +localVue.use(Vuex); + +describe('agentMixin', () => { + let getters; + let store; + beforeEach(() => { + getters = { + getCurrentUser: () => ({ + id: 1, + availability_status: 'busy', + }), + }; + store = new Vuex.Store({ getters }); + }); + + it('return formatted agents', () => { + const Component = { + render() {}, + title: 'TestComponent', + mixins: [agentMixin], + data() { + return { inboxId: 1 }; + }, + computed: { + assignableAgents() { + return agentFixtures.allAgents; + }, + }, + }; + const wrapper = shallowMount(Component, { store, localVue }); + expect(wrapper.vm.agentsList).toEqual(agentFixtures.formattedAgents); + }); +}); diff --git a/app/javascript/dashboard/modules/contact/components/ContactDropdownItem.vue b/app/javascript/dashboard/modules/contact/components/ContactDropdownItem.vue new file mode 100644 index 000000000000..3263f57b6907 --- /dev/null +++ b/app/javascript/dashboard/modules/contact/components/ContactDropdownItem.vue @@ -0,0 +1,34 @@ + + + + + diff --git a/app/javascript/dashboard/modules/contact/components/MergeContact.vue b/app/javascript/dashboard/modules/contact/components/MergeContact.vue new file mode 100644 index 000000000000..432d00cdec62 --- /dev/null +++ b/app/javascript/dashboard/modules/contact/components/MergeContact.vue @@ -0,0 +1,209 @@ + + + + + diff --git a/app/javascript/dashboard/modules/contact/components/MergeContactSummary.vue b/app/javascript/dashboard/modules/contact/components/MergeContactSummary.vue new file mode 100644 index 000000000000..5d028bd6a7aa --- /dev/null +++ b/app/javascript/dashboard/modules/contact/components/MergeContactSummary.vue @@ -0,0 +1,62 @@ + + + + + diff --git a/app/javascript/dashboard/modules/contact/stories/ContactIntro.stories.js b/app/javascript/dashboard/modules/contact/stories/ContactIntro.stories.js index ddaeb22e8d49..8c860ebd0476 100644 --- a/app/javascript/dashboard/modules/contact/stories/ContactIntro.stories.js +++ b/app/javascript/dashboard/modules/contact/stories/ContactIntro.stories.js @@ -10,7 +10,7 @@ const Template = (args, { argTypes }) => ({ props: Object.keys(argTypes), components: { ContactIntro }, template: - '', + '', }); export const DefaultContactIntro = Template.bind({}); diff --git a/app/javascript/dashboard/modules/contact/stories/MergeContact.stories.js b/app/javascript/dashboard/modules/contact/stories/MergeContact.stories.js new file mode 100644 index 000000000000..3700ba0f16a6 --- /dev/null +++ b/app/javascript/dashboard/modules/contact/stories/MergeContact.stories.js @@ -0,0 +1,32 @@ +import { action } from '@storybook/addon-actions'; +import MergeContact from 'dashboard/modules/contact/components/MergeContact'; + +export default { + title: 'Components/Contact/MergeContacts', + component: MergeContact, + argTypes: { + 'primary-contact': { + defaultValue: '{}', + control: { + type: 'object', + }, + }, + }, +}; + +const Template = (args, { argTypes }) => ({ + props: Object.keys(argTypes), + components: { MergeContact }, + template: + '', +}); + +export const List = Template.bind({}); +List.args = { + primaryContact: { + id: 12, + name: 'Mason Mount', + }, + onSearch: action('Search'), + onSubmit: action('Submit'), +}; diff --git a/app/javascript/dashboard/modules/conversations/components/MessageContextMenu.vue b/app/javascript/dashboard/modules/conversations/components/MessageContextMenu.vue new file mode 100644 index 000000000000..d887ecf7cf66 --- /dev/null +++ b/app/javascript/dashboard/modules/conversations/components/MessageContextMenu.vue @@ -0,0 +1,93 @@ + + + diff --git a/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsTable.vue b/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsTable.vue index 67faaac22002..6f83cf0bdd6b 100644 --- a/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsTable.vue +++ b/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsTable.vue @@ -14,6 +14,10 @@ v-if="showSearchEmptyState" :title="$t('CONTACTS_PAGE.LIST.404')" /> +
{{ $t('CONTACTS_PAGE.LIST.LOADING_MESSAGE') }} diff --git a/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsView.vue b/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsView.vue index 7874302aeaeb..ada19502ee93 100644 --- a/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsView.vue +++ b/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsView.vue @@ -7,6 +7,7 @@ this-selected-contact-id="" :on-input-search="onInputSearch" :on-toggle-create="onToggleCreate" + :header-title="label" />

- {{ $t('CONTACTS_PAGE.HEADER') }} + {{ headerTitle ? `#${headerTitle}` : $t('CONTACTS_PAGE.HEADER') }}

@@ -42,6 +42,10 @@ export default { components: {}, props: { + headerTitle: { + type: String, + default: '', + }, searchQuery: { type: String, default: '', diff --git a/app/javascript/dashboard/routes/dashboard/contacts/routes.js b/app/javascript/dashboard/routes/dashboard/contacts/routes.js index f5ef5ad14e48..b8b129435260 100644 --- a/app/javascript/dashboard/routes/dashboard/contacts/routes.js +++ b/app/javascript/dashboard/routes/dashboard/contacts/routes.js @@ -10,6 +10,15 @@ export const routes = [ roles: ['administrator', 'agent'], component: ContactsView, }, + { + path: frontendURL('accounts/:accountId/labels/:label/contacts'), + name: 'contacts_labels_dashboard', + roles: ['administrator', 'agent'], + component: ContactsView, + props: route => { + return { label: route.params.label }; + }, + }, { path: frontendURL('accounts/:accountId/contacts/:contactId'), name: 'contacts_dashboard_manage', diff --git a/app/javascript/dashboard/routes/dashboard/conversation/ContactConversations.vue b/app/javascript/dashboard/routes/dashboard/conversation/ContactConversations.vue index 54cef736245c..b2b257ca3f8e 100644 --- a/app/javascript/dashboard/routes/dashboard/conversation/ContactConversations.vue +++ b/app/javascript/dashboard/routes/dashboard/conversation/ContactConversations.vue @@ -16,7 +16,7 @@ v-for="conversation in previousConversations" :key="conversation.id" :chat="conversation" - :hide-inbox-name="true" + :hide-inbox-name="false" :hide-thumbnail="true" class="compact" /> diff --git a/app/javascript/dashboard/routes/dashboard/conversation/ContactPanel.vue b/app/javascript/dashboard/routes/dashboard/conversation/ContactPanel.vue index a8642fa15984..e6cddb5840a2 100644 --- a/app/javascript/dashboard/routes/dashboard/conversation/ContactPanel.vue +++ b/app/javascript/dashboard/routes/dashboard/conversation/ContactPanel.vue @@ -131,6 +131,7 @@ + diff --git a/app/javascript/dashboard/routes/dashboard/settings/inbox/InboxChannels.vue b/app/javascript/dashboard/routes/dashboard/settings/inbox/InboxChannels.vue index ddc6f6e2011c..18bd8a6afd1d 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/inbox/InboxChannels.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/inbox/InboxChannels.vue @@ -1,7 +1,7 @@