diff --git a/.codeclimate.yml b/.codeclimate.yml index 761ad4d7a..6365ca706 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -1,7 +1,7 @@ version: "2" plugins: rubocop: - enabled: true + enabled: false channel: rubocop-0-73 eslint: enabled: false diff --git a/.env.example b/.env.example index 7240829b3..b80e3577d 100644 --- a/.env.example +++ b/.env.example @@ -1,14 +1,19 @@ -SECRET_KEY_BASE= +# Used to verify the integrity of signed cookies. so ensure a secure value is set +SECRET_KEY_BASE=replace_with_lengthy_secure_hex + +# Replace with the URL you are planning to use for your app +FRONTEND_URL=http://0.0.0.0:3000 + # Force all access to the app over SSL, default is set to false -FORCE_SSL= +FORCE_SSL=false # This lets you control new sign ups on your chatwoot installation # true : default option, allows sign ups # false : disables all the end points related to sign ups # api_only: disables the UI for signup, but you can create sign ups via the account apis -ENABLE_ACCOUNT_SIGNUP= +ENABLE_ACCOUNT_SIGNUP=true -#redis config +# Redis config REDIS_URL=redis://redis:6379 # If you are using docker-compose, set this variable's value to be any string, # which will be the password for the redis service running inside the docker-compose @@ -22,7 +27,7 @@ POSTGRES_PASSWORD= RAILS_ENV=development RAILS_MAX_THREADS=5 -#mail +# Mail outgoing MAILER_SENDER_EMAIL=accounts@chatwoot.com SMTP_PORT=1025 SMTP_DOMAIN=chatwoot.com @@ -34,39 +39,60 @@ SMTP_PASSWORD= SMTP_AUTHENTICATION= SMTP_ENABLE_STARTTLS_AUTO= -#misc -FRONTEND_URL=http://0.0.0.0:3000 +# Mail Incoming + +# Set this to appropriate ingress channel with regards to incoming emails +# Possible values are : +# :relay for Exim, Postfix, Qmail +# :mailgun for Mailgun +# :mandrill for Mandrill +# :postmark for Postmark +# :sendgrid for Sendgrid +RAILS_INBOUND_EMAIL_SERVICE= +# Use one of the following based on the email ingress service +# Ref: https://edgeguides.rubyonrails.org/action_mailbox_basics.html +RAILS_INBOUND_EMAIL_PASSWORD= +MAILGUN_INGRESS_SIGNING_KEY= +MANDRILL_INGRESS_API_KEY= + +# Storage ACTIVE_STORAGE_SERVICE=local -#s3 +# Amazon S3 S3_BUCKET_NAME= AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_REGION= -#sentry +# Sentry SENTRY_DSN= -#Log settings +# Log settings +# Disable if you want to write logs to a file +RAILS_LOG_TO_STDOUT=true LOG_LEVEL=info -LOG_SIZE=500 +LOG_SIZE=500 # Credentials to access sidekiq dashboard in production SIDEKIQ_AUTH_USERNAME= SIDEKIQ_AUTH_PASSWORD= ### This environment variables are only required if you are setting up social media channels -#facebook +#facebook FB_VERIFY_TOKEN= FB_APP_SECRET= FB_APP_ID= -#twitter +# Twitter TWITTER_APP_ID= TWITTER_CONSUMER_KEY= TWITTER_CONSUMER_SECRET= TWITTER_ENVIRONMENT= +### Change this env variable only if you are using a custom build mobile app +## Mobile app env variables +IOS_APP_ID=6C953F3RX2.com.chatwoot.app + #### This environment variables are only required in hosted version which has billing ENABLE_BILLING= @@ -75,3 +101,8 @@ CHARGEBEE_API_KEY= CHARGEBEE_SITE= CHARGEBEE_WEBHOOK_USERNAME= CHARGEBEE_WEBHOOK_PASSWORD= + +## Push Notification +## generate a new key value here : https://d3v.one/vapid-key-generator/ +# VAPID_PUBLIC_KEY= +# VAPID_PRIVATE_KEY= diff --git a/.eslintrc.js b/.eslintrc.js index 12995ffb8..9b99b9b61 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,8 +1,8 @@ module.exports = { - extends: ['airbnb/base', 'prettier', 'plugin:vue/recommended'], + extends: ['airbnb-base/legacy', 'prettier', 'plugin:vue/recommended'], parserOptions: { parser: 'babel-eslint', - ecmaVersion: 2017, + ecmaVersion: 2020, sourceType: 'module', }, plugins: ['html', 'prettier', 'babel'], diff --git a/.rubocop.yml b/.rubocop.yml index ff4a0160a..8d2405e3f 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -4,18 +4,28 @@ require: - rubocop-rspec inherit_from: .rubocop_todo.yml +Lint/RaiseException: + Enabled: true +Lint/StructNewOverride: + Enabled: true Layout/LineLength: Max: 150 Metrics/ClassLength: Max: 125 RSpec/ExampleLength: - Max: 15 + Max: 25 Style/Documentation: Enabled: false Style/FrozenStringLiteralComment: Enabled: false Style/SymbolArray: Enabled: false +Style/HashEachMethods: + Enabled: true +Style/HashTransformKeys: + Enabled: true +Style/HashTransformValues: + Enabled: true Style/GlobalVars: Exclude: - 'config/initializers/redis.rb' diff --git a/.scss-lint.yml b/.scss-lint.yml index eeaac4c52..9f5f4fe10 100644 --- a/.scss-lint.yml +++ b/.scss-lint.yml @@ -252,7 +252,7 @@ linters: enabled: false UnnecessaryParentReference: - enabled: true + enabled: false UrlFormat: enabled: true diff --git a/Gemfile b/Gemfile index 4225f2904..e8e2fa85b 100644 --- a/Gemfile +++ b/Gemfile @@ -17,6 +17,7 @@ gem 'jbuilder' gem 'kaminari' gem 'responders' gem 'rest-client' +gem 'telephone_number' gem 'time_diff' gem 'tzinfo-data' gem 'valid_email2' @@ -53,9 +54,6 @@ gem 'pundit' # https://karolgalanciak.com/blog/2019/11/30/from-activerecord-callbacks-to-publish-slash-subscribe-pattern-and-event-driven-design/ gem 'wisper', '2.0.0' -##--- gems for reporting ---## -gem 'nightfury' - ##--- gems for billing ---## gem 'chargebee' @@ -82,6 +80,9 @@ gem 'sidekiq' ##-- used for single column multiple binary flags in notification settings/feature flagging --## gem 'flag_shih_tzu' +##-- Push notification service --## +gem 'webpush' + group :development do gem 'annotate' gem 'bullet' @@ -100,7 +101,7 @@ group :development, :test do gem 'factory_bot_rails' gem 'faker' gem 'listen' - gem 'mock_redis' + gem 'mock_redis', git: 'https://github.com/sds/mock_redis', ref: '16d00789f0341a3aac35126c0ffe97a596753ff9' gem 'pry-rails' gem 'rspec-rails', '~> 4.0.0.beta2' gem 'rubocop', require: false diff --git a/Gemfile.lock b/Gemfile.lock index 0ad798ef4..f26503fa4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -5,6 +5,13 @@ GIT twitty (0.1.0) oauth +GIT + remote: https://github.com/sds/mock_redis + revision: 16d00789f0341a3aac35126c0ffe97a596753ff9 + ref: 16d00789f0341a3aac35126c0ffe97a596753ff9 + specs: + mock_redis (0.22.0) + GIT remote: https://github.com/tzmfreedom/json_refs revision: e32deb073ce9aef39bdd63556bffd7fe7c2a803d @@ -82,10 +89,10 @@ GEM rake (>= 10.4, < 14.0) ast (2.4.0) attr_extras (6.2.3) - aws-eventstream (1.0.3) - aws-partitions (1.294.0) - aws-sdk-core (3.92.0) - aws-eventstream (~> 1.0, >= 1.0.2) + aws-eventstream (1.1.0) + aws-partitions (1.296.0) + aws-sdk-core (3.94.0) + aws-eventstream (~> 1, >= 1.0.2) aws-partitions (~> 1, >= 1.239.0) aws-sigv4 (~> 1.1) jmespath (~> 1.0) @@ -113,7 +120,7 @@ GEM bindex (0.8.1) bootsnap (1.4.6) msgpack (~> 1.0) - brakeman (4.8.0) + brakeman (4.8.1) browser (4.0.0) builder (3.2.4) bullet (6.1.0) @@ -179,7 +186,7 @@ GEM foreman (0.87.1) globalid (0.4.2) activesupport (>= 4.2.0) - google-api-client (0.37.2) + google-api-client (0.38.0) addressable (~> 2.5, >= 2.5.1) googleauth (~> 0.9) httpclient (>= 2.8.1, < 3.0) @@ -193,25 +200,26 @@ GEM google-cloud-env (1.3.1) faraday (>= 0.17.3, < 2.0) google-cloud-errors (1.0.0) - google-cloud-storage (1.25.1) + google-cloud-storage (1.26.0) addressable (~> 2.5) digest-crc (~> 0.4) google-api-client (~> 0.33) google-cloud-core (~> 1.2) googleauth (~> 0.9) mini_mime (~> 1.0) - googleauth (0.11.0) + googleauth (0.12.0) faraday (>= 0.17.3, < 2.0) jwt (>= 1.4, < 3.0) memoist (~> 0.16) multi_json (~> 1.11) os (>= 0.9, < 2.0) - signet (~> 0.12) + signet (~> 0.14) groupdate (5.0.0) activesupport (>= 5) haikunator (1.1.0) hana (1.3.5) hashie (4.1.0) + hkdf (0.3.0) http-accept (1.7.0) http-cookie (1.0.3) domain_name (~> 0.5) @@ -253,7 +261,7 @@ GEM listen (3.2.1) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) - loofah (2.4.0) + loofah (2.5.0) crass (~> 1.0.2) nokogiri (>= 1.5.9) mail (2.7.1) @@ -270,13 +278,11 @@ GEM mini_mime (1.0.2) mini_portile2 (2.4.0) minitest (5.14.0) - mock_redis (0.22.0) msgpack (1.3.3) multi_json (1.14.1) multi_xml (0.6.0) multipart-post (2.1.1) netrc (0.11.0) - nightfury (1.0.1) nio4r (2.5.2) nokogiri (1.10.9) mini_portile2 (~> 2.4.0) @@ -284,21 +290,21 @@ GEM orm_adapter (0.5.0) os (1.1.0) parallel (1.19.1) - parser (2.7.1.0) + parser (2.7.1.1) ast (~> 2.4.0) pg (1.2.3) - pry (0.13.0) + pry (0.13.1) coderay (~> 1.1) method_source (~> 1.0) pry-rails (0.3.9) pry (>= 0.10.4) - public_suffix (4.0.3) + public_suffix (4.0.4) puma (4.3.3) nio4r (~> 2.0) pundit (2.1.0) activesupport (>= 3.0.0) rack (2.2.2) - rack-cache (1.11.0) + rack-cache (1.11.1) rack (>= 0.4) rack-cors (1.1.1) rack (>= 2.0.0) @@ -388,7 +394,7 @@ GEM unicode-display_width (>= 1.4.0, < 2.0) rubocop-performance (1.5.2) rubocop (>= 0.71.0) - rubocop-rails (2.5.1) + rubocop-rails (2.5.2) activesupport rack (>= 1.1) rubocop (>= 0.72.0) @@ -442,6 +448,7 @@ GEM faraday inflecto virtus + telephone_number (1.4.6) thor (0.20.3) thread_safe (0.3.6) time_diff (0.3.0) @@ -463,7 +470,7 @@ GEM unf_ext (0.0.7.7) unicode-display_width (1.7.0) uniform_notifier (1.13.0) - valid_email2 (3.2.1) + valid_email2 (3.2.2) activemodel (>= 3.2) mail (~> 2.5) virtus (1.0.5) @@ -483,6 +490,9 @@ GEM rack-proxy (>= 0.6.1) railties (>= 5.2) semantic_range (>= 2.3.0) + webpush (1.0.0) + hkdf (~> 0.2) + jwt (~> 2.0) websocket-driver (0.7.1) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.4) @@ -526,8 +536,7 @@ DEPENDENCIES letter_opener listen mini_magick - mock_redis - nightfury + mock_redis! pg pry-rails puma @@ -554,6 +563,7 @@ DEPENDENCIES spring spring-watcher-listen telegram-bot-ruby + telephone_number time_diff twilio-ruby (~> 5.32.0) twitty! @@ -562,6 +572,7 @@ DEPENDENCIES valid_email2 web-console webpacker + webpush wisper (= 2.0.0) RUBY VERSION diff --git a/README.md b/README.md index db4559b45..e71b8c6d1 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

- Woot-logo + Woot-logo

A simple and elegant live chat software
An opensource alternative to Intercom, Zendesk, Drift, Crisp etc.
@@ -23,7 +23,7 @@ ___ Chat on Discord

-![ChatUI progess](https://storage.googleapis.com/chatwoot-assets/dashboard-screen.png) +![ChatUI progess](https://s3.us-west-2.amazonaws.com/gh-assets.chatwoot.com/chatwoot-dashboard-assets.png) ## Background diff --git a/app/actions/contact_merge_action.rb b/app/actions/contact_merge_action.rb index 8261a51ad..343e78032 100644 --- a/app/actions/contact_merge_action.rb +++ b/app/actions/contact_merge_action.rb @@ -17,7 +17,7 @@ class ContactMergeAction def validate_contacts return if belongs_to_account?(@base_contact) && belongs_to_account?(@mergee_contact) - raise Exception, 'contact does not belong to the account' + raise StandardError, 'contact does not belong to the account' end def belongs_to_account?(contact) diff --git a/app/builders/contact_builder.rb b/app/builders/contact_builder.rb index 70b994ac2..9bb3ef3ac 100644 --- a/app/builders/contact_builder.rb +++ b/app/builders/contact_builder.rb @@ -21,13 +21,14 @@ class ContactBuilder phone_number: contact_attributes[:phone_number], email: contact_attributes[:email], identifier: contact_attributes[:identifier], - additional_attributes: contact_attributes[:identifier] + additional_attributes: contact_attributes[:additional_attributes] ) contact_inbox = ::ContactInbox.create!( contact_id: contact.id, inbox_id: inbox.id, source_id: source_id ) + ::ContactAvatarJob.perform_later(contact, contact_attributes[:avatar_url]) if contact_attributes[:avatar_url] contact_inbox rescue StandardError => e diff --git a/app/builders/messages/message_builder.rb b/app/builders/messages/message_builder.rb index a01df50c4..0eeba6b95 100644 --- a/app/builders/messages/message_builder.rb +++ b/app/builders/messages/message_builder.rb @@ -41,7 +41,7 @@ class Messages::MessageBuilder def build_message @message = conversation.messages.create!(message_params) (response.attachments || []).each do |attachment| - attachment_obj = @message.build_attachment(attachment_params(attachment).except(:remote_file_url)) + attachment_obj = @message.attachments.new(attachment_params(attachment).except(:remote_file_url)) attachment_obj.save! attach_file(attachment_obj, attachment_params(attachment)[:remote_file_url]) if attachment_params(attachment)[:remote_file_url] end diff --git a/app/builders/messages/outgoing/normal_builder.rb b/app/builders/messages/outgoing/normal_builder.rb index 668022e64..1b15f24c0 100644 --- a/app/builders/messages/outgoing/normal_builder.rb +++ b/app/builders/messages/outgoing/normal_builder.rb @@ -3,22 +3,26 @@ class Messages::Outgoing::NormalBuilder attr_reader :message def initialize(user, conversation, params) - @content = params[:message] + @content = params[:content] @private = params[:private] || false @conversation = conversation @user = user @fb_id = params[:fb_id] - @attachment = params[:attachment] + @content_type = params[:content_type] + @items = params.to_unsafe_h&.dig(:content_attributes, :items) + @attachments = params[:attachments] end def perform @message = @conversation.messages.build(message_params) - if @attachment - @message.attachment = Attachment.new( - account_id: message.account_id, - file_type: file_type(@attachment[:file]&.content_type) - ) - @message.attachment.file.attach(@attachment[:file]) + if @attachments.present? + @attachments.each do |uploaded_attachment| + attachment = @message.attachments.new( + account_id: @message.account_id, + file_type: file_type(uploaded_attachment&.content_type) + ) + attachment.file.attach(uploaded_attachment) + end end @message.save @message @@ -34,7 +38,9 @@ class Messages::Outgoing::NormalBuilder content: @content, private: @private, user_id: @user&.id, - source_id: @fb_id + source_id: @fb_id, + content_type: @content_type, + items: @items } end end diff --git a/app/builders/notification_builder.rb b/app/builders/notification_builder.rb new file mode 100644 index 000000000..d41debe0c --- /dev/null +++ b/app/builders/notification_builder.rb @@ -0,0 +1,32 @@ +class NotificationBuilder + pattr_initialize [:notification_type!, :user!, :account!, :primary_actor!] + + def perform + return unless user_subscribed_to_notification? + + build_notification + end + + private + + def secondary_actor + Current.user + end + + def user_subscribed_to_notification? + notification_setting = user.notification_settings.find_by(account_id: account.id) + return true if notification_setting.public_send("email_#{notification_type}?") + return true if notification_setting.public_send("push_#{notification_type}?") + + false + end + + def build_notification + user.notifications.create!( + notification_type: notification_type, + account: account, + primary_actor: primary_actor, + secondary_actor: secondary_actor + ) + end +end diff --git a/app/builders/notification_subscription_builder.rb b/app/builders/notification_subscription_builder.rb new file mode 100644 index 000000000..05b0bf984 --- /dev/null +++ b/app/builders/notification_subscription_builder.rb @@ -0,0 +1,28 @@ +class NotificationSubscriptionBuilder + pattr_initialize [:params, :user!] + + def perform + # if multiple accounts were used to login in same browser + move_subscription_to_user if identifier_subscription && identifier_subscription.user_id != user.id + build_identifier_subscription if identifier_subscription.blank? + identifier_subscription + end + + private + + def identifier + @identifier ||= params[:subscription_attributes][:endpoint] if params[:subscription_type] == 'browser_push' + end + + def identifier_subscription + @identifier_subscription ||= NotificationSubscription.find_by(identifier: identifier) + end + + def move_subscription_to_user + @identifier_subscription.update(user_id: user.id) + end + + def build_identifier_subscription + user.notification_subscriptions.create(params.merge(identifier: identifier)) + end +end diff --git a/app/builders/report_builder.rb b/app/builders/report_builder.rb deleted file mode 100644 index 87e4909e6..000000000 --- a/app/builders/report_builder.rb +++ /dev/null @@ -1,77 +0,0 @@ -class ReportBuilder - include CustomExceptions::Report - - # Usage - # rb = ReportBuilder.new a, { metric: 'conversations_count', type: :account, id: 1} - # rb = ReportBuilder.new a, { metric: 'avg_first_response_time', type: :agent, id: 1} - - IDENTITY_MAPPING = { - account: AccountIdentity, - agent: AgentIdentity - }.freeze - - def initialize(account, params) - @account = account - @params = params - @identity = get_identity - @start_time, @end_time = validate_times - end - - def build - metric = @identity.send(@params[:metric]) - if metric.get.nil? - metric.delete - result = {} - else - result = metric.get_padded_range(@start_time, @end_time) || {} - end - formatted_hash(result) - end - - private - - def get_identity - identity_class = IDENTITY_MAPPING[@params[:type]] - raise InvalidIdentity if identity_class.nil? - - @params[:id] = @account.id if identity_class == AccountIdentity - identity_id = @params[:id] - raise IdentityNotFound if identity_id.nil? - - tags = identity_class == AccountIdentity ? nil : { account_id: @account.id } - identity = identity_class.new(identity_id, tags: tags) - raise MetricNotFound if @params[:metric].blank? - raise MetricNotFound unless identity.respond_to?(@params[:metric]) - - identity - end - - def validate_times - start_time = @params[:since] || Time.now.end_of_day - 30.days - end_time = @params[:until] || Time.now.end_of_day - start_time = begin - parse_date_time(start_time) - rescue StandardError - raise(InvalidStartTime) - end - end_time = begin - parse_date_time(end_time) - rescue StandardError - raise(InvalidEndTime) - end - [start_time, end_time] - 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 - - def formatted_hash(hash) - hash.each_with_object([]) do |p, arr| - arr << { value: p[1], timestamp: p[0] } - end - end -end diff --git a/app/builders/v2/report_builder.rb b/app/builders/v2/report_builder.rb index 3e5e01880..35f484f95 100644 --- a/app/builders/v2/report_builder.rb +++ b/app/builders/v2/report_builder.rb @@ -50,14 +50,15 @@ class V2::ReportBuilder .count end + # unscoped removes all scopes added to a model previously def incoming_messages_count - scope.messages.unscoped.incoming + scope.messages.unscoped.where(account_id: account.id).incoming .group_by_day(:created_at, range: range, default_value: 0) .count end def outgoing_messages_count - scope.messages.unscoped.outgoing + scope.messages.unscoped.where(account_id: account.id).outgoing .group_by_day(:created_at, range: range, default_value: 0) .count end diff --git a/app/controllers/api/base_controller.rb b/app/controllers/api/base_controller.rb index d512eeabf..8db37ced7 100644 --- a/app/controllers/api/base_controller.rb +++ b/app/controllers/api/base_controller.rb @@ -8,7 +8,7 @@ class Api::BaseController < ApplicationController private def authenticate_by_access_token? - request.headers[:api_access_token].present? + request.headers[:api_access_token].present? || request.headers[:HTTP_API_ACCESS_TOKEN].present? end def set_conversation diff --git a/app/controllers/api/v1/accounts/accounts_controller.rb b/app/controllers/api/v1/accounts/accounts_controller.rb index b8ad4fa46..0fd5dc7cf 100644 --- a/app/controllers/api/v1/accounts/accounts_controller.rb +++ b/app/controllers/api/v1/accounts/accounts_controller.rb @@ -31,7 +31,7 @@ class Api::V1::Accounts::AccountsController < Api::BaseController end def update - @account.update!(account_params.slice(:name, :locale)) + @account.update!(account_params.slice(:name, :locale, :domain, :support_email, :domain_emails_enabled)) end private @@ -45,7 +45,7 @@ class Api::V1::Accounts::AccountsController < Api::BaseController end def account_params - params.permit(:account_name, :email, :name, :locale) + params.permit(:account_name, :email, :name, :locale, :domain, :support_email, :domain_emails_enabled) end def check_signup_enabled diff --git a/app/controllers/api/v1/accounts/callbacks_controller.rb b/app/controllers/api/v1/accounts/callbacks_controller.rb index ab276ba29..bf42b215a 100644 --- a/app/controllers/api/v1/accounts/callbacks_controller.rb +++ b/app/controllers/api/v1/accounts/callbacks_controller.rb @@ -4,16 +4,18 @@ class Api::V1::Accounts::CallbacksController < Api::BaseController def register_facebook_page user_access_token = params[:user_access_token] page_access_token = params[:page_access_token] - page_name = params[:page_name] page_id = params[:page_id] inbox_name = params[:inbox_name] - facebook_channel = current_account.facebook_pages.create!( - name: page_name, page_id: page_id, user_access_token: user_access_token, - page_access_token: page_access_token - ) - set_avatar(facebook_channel, page_id) - inbox = current_account.inboxes.create!(name: inbox_name, channel: facebook_channel) - render json: inbox + ActiveRecord::Base.transaction do + facebook_channel = current_account.facebook_pages.create!( + page_id: page_id, user_access_token: user_access_token, + page_access_token: page_access_token + ) + @facebook_inbox = current_account.inboxes.create!(name: inbox_name, channel: facebook_channel) + set_avatar(@facebook_inbox, page_id) + rescue StandardError => e + Rails.logger e + end end def facebook_pages @@ -72,13 +74,13 @@ class Api::V1::Accounts::CallbacksController < Api::BaseController end end - def set_avatar(facebook_channel, page_id) + def set_avatar(facebook_inbox, page_id) uri = get_avatar_url(page_id) return unless uri avatar_resource = LocalResource.new(uri) - facebook_channel.avatar.attach(io: avatar_resource.file, filename: avatar_resource.tmp_filename, content_type: avatar_resource.encoding) + facebook_inbox.avatar.attach(io: avatar_resource.file, filename: avatar_resource.tmp_filename, content_type: avatar_resource.encoding) end def get_avatar_url(page_id) diff --git a/app/controllers/api/v1/accounts/channels/twilio_channels_controller.rb b/app/controllers/api/v1/accounts/channels/twilio_channels_controller.rb index c3d6554fd..c0c121900 100644 --- a/app/controllers/api/v1/accounts/channels/twilio_channels_controller.rb +++ b/app/controllers/api/v1/accounts/channels/twilio_channels_controller.rb @@ -2,13 +2,15 @@ class Api::V1::Accounts::Channels::TwilioChannelsController < Api::BaseControlle before_action :authorize_request def create - authenticate_twilio - build_inbox - setup_webhooks - rescue Twilio::REST::TwilioError => e - render_could_not_create_error(e.message) - rescue StandardError => e - render_could_not_create_error(e.message) + ActiveRecord::Base.transaction do + authenticate_twilio + build_inbox + setup_webhooks if @twilio_channel.sms? + rescue Twilio::REST::TwilioError => e + render_could_not_create_error(e.message) + rescue StandardError => e + render_could_not_create_error(e.message) + end end private @@ -26,25 +28,30 @@ class Api::V1::Accounts::Channels::TwilioChannelsController < Api::BaseControlle ::Twilio::WebhookSetupService.new(inbox: @inbox).perform end + def phone_number + medium == 'sms' ? permitted_params[:phone_number] : "whatsapp:#{permitted_params[:phone_number]}" + end + + def medium + permitted_params[:medium] + end + def build_inbox - ActiveRecord::Base.transaction do - twilio_sms = current_account.twilio_sms.create( - account_sid: permitted_params[:account_sid], - auth_token: permitted_params[:auth_token], - phone_number: permitted_params[:phone_number] - ) - @inbox = current_account.inboxes.create( - name: permitted_params[:name], - channel: twilio_sms - ) - rescue StandardError => e - render_could_not_create_error(e.message) - end + @twilio_channel = current_account.twilio_sms.create!( + account_sid: permitted_params[:account_sid], + auth_token: permitted_params[:auth_token], + phone_number: phone_number, + medium: medium + ) + @inbox = current_account.inboxes.create( + name: permitted_params[:name], + channel: @twilio_channel + ) end def permitted_params params.require(:twilio_channel).permit( - :account_id, :phone_number, :account_sid, :auth_token, :name + :account_id, :phone_number, :account_sid, :auth_token, :name, :medium ) end end diff --git a/app/controllers/api/v1/accounts/contacts_controller.rb b/app/controllers/api/v1/accounts/contacts_controller.rb index 9d95f69aa..a3713660b 100644 --- a/app/controllers/api/v1/accounts/contacts_controller.rb +++ b/app/controllers/api/v1/accounts/contacts_controller.rb @@ -4,11 +4,6 @@ class Api::V1::Accounts::ContactsController < Api::BaseController before_action :check_authorization before_action :fetch_contact, only: [:show, :update] - skip_before_action :authenticate_user!, only: [:create] - skip_before_action :set_current_user, only: [:create] - skip_before_action :check_subscription, only: [:create] - skip_around_action :handle_with_exception, only: [:create] - def index @contacts = current_account.contacts end diff --git a/app/controllers/api/v1/accounts/conversations_controller.rb b/app/controllers/api/v1/accounts/conversations_controller.rb index 895091cca..05eaa5861 100644 --- a/app/controllers/api/v1/accounts/conversations_controller.rb +++ b/app/controllers/api/v1/accounts/conversations_controller.rb @@ -1,5 +1,7 @@ class Api::V1::Accounts::ConversationsController < Api::BaseController + include Events::Types before_action :conversation, except: [:index] + before_action :contact_inbox, only: [:create] def index result = conversation_finder.perform @@ -7,12 +9,30 @@ class Api::V1::Accounts::ConversationsController < Api::BaseController @conversations_count = result[:count] end + def meta + result = conversation_finder.perform + @conversations_count = result[:count] + end + + def create + @conversation = ::Conversation.create!(conversation_params) + end + def show; end def toggle_status @status = @conversation.toggle_status end + def toggle_typing_status + if params[:typing_status] == 'on' + trigger_typing_event(CONVERSATION_TYPING_ON) + elsif params[:typing_status] == 'off' + trigger_typing_event(CONVERSATION_TYPING_OFF) + end + head :ok + end + def update_last_seen @conversation.agent_last_seen_at = parsed_last_seen_at @conversation.save! @@ -21,6 +41,11 @@ class Api::V1::Accounts::ConversationsController < Api::BaseController private + def trigger_typing_event(event) + user = current_user.presence || @resource + Rails.configuration.dispatcher.dispatch(event, Time.zone.now, conversation: @conversation, user: user) + end + def parsed_last_seen_at DateTime.strptime(params[:agent_last_seen_at].to_s, '%s') end @@ -29,6 +54,19 @@ class Api::V1::Accounts::ConversationsController < Api::BaseController @conversation ||= current_account.conversations.find_by(display_id: params[:id]) end + def contact_inbox + @contact_inbox ||= ::ContactInbox.find_by!(source_id: params[:source_id]) + end + + def conversation_params + { + account_id: current_account.id, + inbox_id: @contact_inbox.inbox_id, + contact_id: @contact_inbox.contact_id, + contact_inbox_id: @contact_inbox.id + } + end + def conversation_finder @conversation_finder ||= ConversationFinder.new(current_user, params) end diff --git a/app/controllers/api/v1/accounts/inboxes_controller.rb b/app/controllers/api/v1/accounts/inboxes_controller.rb index 630f93e0d..4b3ed836e 100644 --- a/app/controllers/api/v1/accounts/inboxes_controller.rb +++ b/app/controllers/api/v1/accounts/inboxes_controller.rb @@ -1,13 +1,35 @@ class Api::V1::Accounts::InboxesController < Api::BaseController before_action :check_authorization - before_action :fetch_inbox, only: [:destroy, :update] + before_action :fetch_inbox, except: [:index, :create] + before_action :fetch_agent_bot, only: [:set_agent_bot] def index @inboxes = policy_scope(current_account.inboxes) end + def create + ActiveRecord::Base.transaction do + channel = web_widgets.create!(permitted_params[:channel].except(:type)) if permitted_params[:channel][:type] == 'web_widget' + @inbox = current_account.inboxes.build(name: permitted_params[:name], channel: channel) + @inbox.avatar.attach(permitted_params[:avatar]) + @inbox.save! + end + end + def update - @inbox.update(inbox_update_params) + @inbox.update(inbox_update_params.except(:channel)) + @inbox.channel.update!(inbox_update_params[:channel]) if @inbox.channel.is_a?(Channel::WebWidget) && inbox_update_params[:channel].present? + end + + def set_agent_bot + if @agent_bot + agent_bot_inbox = @inbox.agent_bot_inbox || AgentBotInbox.new(inbox: @inbox) + agent_bot_inbox.agent_bot = @agent_bot + agent_bot_inbox.save! + elsif @inbox.agent_bot_inbox.present? + @inbox.agent_bot_inbox.destroy! + end + head :ok end def destroy @@ -21,11 +43,24 @@ class Api::V1::Accounts::InboxesController < Api::BaseController @inbox = current_account.inboxes.find(params[:id]) end + def fetch_agent_bot + @agent_bot = AgentBot.find(params[:agent_bot]) if params[:agent_bot] + end + + def web_widgets + current_account.web_widgets + end + def check_authorization authorize(Inbox) end + def permitted_params + params.permit(:id, :avatar, :name, channel: [:type, :website_url, :widget_color, :welcome_title, :welcome_tagline, :agent_away_message]) + end + def inbox_update_params - params.require(:inbox).permit(:enable_auto_assignment) + params.permit(:enable_auto_assignment, :name, :avatar, channel: [:website_url, :widget_color, :welcome_title, + :welcome_tagline, :agent_away_message]) end end diff --git a/app/controllers/api/v1/accounts/notification_settings_controller.rb b/app/controllers/api/v1/accounts/notification_settings_controller.rb index ba6e43804..14496969d 100644 --- a/app/controllers/api/v1/accounts/notification_settings_controller.rb +++ b/app/controllers/api/v1/accounts/notification_settings_controller.rb @@ -20,10 +20,11 @@ class Api::V1::Accounts::NotificationSettingsController < Api::BaseController end def notification_setting_params - params.require(:notification_settings).permit(selected_email_flags: []) + params.require(:notification_settings).permit(selected_email_flags: [], selected_push_flags: []) end def update_flags @notification_setting.selected_email_flags = notification_setting_params[:selected_email_flags] + @notification_setting.selected_push_flags = notification_setting_params[:selected_push_flags] end end diff --git a/app/controllers/api/v1/accounts/notifications_controller.rb b/app/controllers/api/v1/accounts/notifications_controller.rb new file mode 100644 index 000000000..5d9a5ea54 --- /dev/null +++ b/app/controllers/api/v1/accounts/notifications_controller.rb @@ -0,0 +1,21 @@ +class Api::V1::Accounts::NotificationsController < Api::BaseController + protect_from_forgery with: :null_session + + before_action :fetch_notification, only: [:update] + + def index + @notifications = current_user.notifications.where(account_id: current_account.id) + render json: @notifications + end + + def update + @notification.update(read_at: DateTime.now.utc) + render json: @notification + end + + private + + def fetch_notification + @notification = current_user.notifications.find(params[:id]) + end +end diff --git a/app/controllers/api/v1/accounts/reports_controller.rb b/app/controllers/api/v1/accounts/reports_controller.rb deleted file mode 100644 index c93574b6c..000000000 --- a/app/controllers/api/v1/accounts/reports_controller.rb +++ /dev/null @@ -1,99 +0,0 @@ -class Api::V1::Accounts::ReportsController < Api::BaseController - include CustomExceptions::Report - include Constants::Report - - around_action :report_exception - - def account - builder = ReportBuilder.new(current_account, account_report_params) - data = builder.build - render json: data - end - - def agent - builder = ReportBuilder.new(current_account, agent_report_params) - data = builder.build - render json: data - end - - def account_summary - render json: account_summary_metrics - end - - def agent_summary - render json: agent_summary_metrics - end - - private - - def report_exception - yield - rescue InvalidIdentity, IdentityNotFound, MetricNotFound, InvalidStartTime, InvalidEndTime => e - render_error_response(e) - end - - def current_account - current_user.account - end - - def account_summary_metrics - summary_metrics(ACCOUNT_METRICS, :account_summary_params, AVG_ACCOUNT_METRICS) - end - - def agent_summary_metrics - summary_metrics(AGENT_METRICS, :agent_summary_params, AVG_AGENT_METRICS) - end - - def summary_metrics(metrics, calc_function, avg_metrics) - metrics.each_with_object({}) do |metric, result| - data = ReportBuilder.new(current_account, send(calc_function, metric)).build - result[metric] = calculate_metric(data, metric, avg_metrics) - end - end - - def calculate_metric(data, metric, avg_metrics) - sum = data.inject(0) { |val, hash| val + hash[:value].to_i } - if avg_metrics.include?(metric) - sum /= data.length unless sum.zero? - end - sum - end - - def account_summary_params(metric) - { - metric: metric.to_s, - type: :account, - since: params[:since], - until: params[:until] - } - end - - def agent_summary_params(metric) - { - metric: metric.to_s, - type: :agent, - since: params[:since], - until: params[:until], - id: params[:id] - } - end - - def account_report_params - { - metric: params[:metric], - type: :account, - since: params[:since], - until: params[:until] - } - end - - def agent_report_params - { - metric: params[:metric], - type: :agent, - id: params[:id], - since: params[:since], - until: params[:until] - } - end -end diff --git a/app/controllers/api/v1/accounts/widget/inboxes_controller.rb b/app/controllers/api/v1/accounts/widget/inboxes_controller.rb deleted file mode 100644 index f6305e4eb..000000000 --- a/app/controllers/api/v1/accounts/widget/inboxes_controller.rb +++ /dev/null @@ -1,48 +0,0 @@ -class Api::V1::Accounts::Widget::InboxesController < Api::BaseController - before_action :authorize_request - before_action :set_web_widget_channel, only: [:update] - before_action :set_inbox, only: [:update] - - def create - ActiveRecord::Base.transaction do - channel = web_widgets.create!( - website_name: permitted_params[:website][:website_name], - website_url: permitted_params[:website][:website_url], - widget_color: permitted_params[:website][:widget_color] - ) - @inbox = inboxes.create!(name: permitted_params[:website][:website_name], channel: channel) - end - end - - def update - @channel.update!( - widget_color: permitted_params[:website][:widget_color] - ) - end - - private - - def authorize_request - authorize ::Inbox - end - - def inboxes - current_account.inboxes - end - - def web_widgets - current_account.web_widgets - end - - def set_web_widget_channel - @channel = web_widgets.find_by(id: permitted_params[:id]) - end - - def set_inbox - @inbox = @channel.inbox - end - - def permitted_params - params.permit(:id, website: [:website_name, :website_url, :widget_color]) - end -end diff --git a/app/controllers/api/v1/agent_bots_controller.rb b/app/controllers/api/v1/agent_bots_controller.rb new file mode 100644 index 000000000..4c17fd4f4 --- /dev/null +++ b/app/controllers/api/v1/agent_bots_controller.rb @@ -0,0 +1,8 @@ +class Api::V1::AgentBotsController < Api::BaseController + skip_before_action :authenticate_user! + skip_before_action :check_subscription + + def index + render json: AgentBot.all + end +end diff --git a/app/controllers/api/v1/notification_subscriptions_controller.rb b/app/controllers/api/v1/notification_subscriptions_controller.rb new file mode 100644 index 000000000..98ff9ea7a --- /dev/null +++ b/app/controllers/api/v1/notification_subscriptions_controller.rb @@ -0,0 +1,19 @@ +class Api::V1::NotificationSubscriptionsController < Api::BaseController + before_action :set_user + + def create + notification_subscription = NotificationSubscriptionBuilder.new(user: @user, params: notification_subscription_params).perform + + render json: notification_subscription + end + + private + + def set_user + @user = current_user + end + + def notification_subscription_params + params.require(:notification_subscription).permit(:subscription_type, subscription_attributes: {}) + end +end diff --git a/app/controllers/api/v1/widget/base_controller.rb b/app/controllers/api/v1/widget/base_controller.rb index eb19e2bdd..86bffb710 100644 --- a/app/controllers/api/v1/widget/base_controller.rb +++ b/app/controllers/api/v1/widget/base_controller.rb @@ -2,9 +2,9 @@ class Api::V1::Widget::BaseController < ApplicationController private def conversation - @conversation ||= @contact_inbox.conversations.find_by( + @conversation ||= @contact_inbox.conversations.where( inbox_id: auth_token_params[:inbox_id] - ) + ).last end def auth_token_params @@ -18,6 +18,7 @@ class Api::V1::Widget::BaseController < ApplicationController def set_web_widget @web_widget = ::Channel::WebWidget.find_by!(website_token: permitted_params[:website_token]) @account = @web_widget.account + switch_locale @account end def set_contact diff --git a/app/controllers/api/v1/widget/conversations_controller.rb b/app/controllers/api/v1/widget/conversations_controller.rb new file mode 100644 index 000000000..8f8e372fe --- /dev/null +++ b/app/controllers/api/v1/widget/conversations_controller.rb @@ -0,0 +1,27 @@ +class Api::V1::Widget::ConversationsController < Api::V1::Widget::BaseController + include Events::Types + before_action :set_web_widget + before_action :set_contact + + def toggle_typing + head :ok && return if conversation.nil? + + if permitted_params[:typing_status] == 'on' + trigger_typing_event(CONVERSATION_TYPING_ON) + elsif permitted_params[:typing_status] == 'off' + trigger_typing_event(CONVERSATION_TYPING_OFF) + end + + head :ok + end + + private + + def trigger_typing_event(event) + Rails.configuration.dispatcher.dispatch(event, Time.zone.now, conversation: conversation, user: @contact) + end + + def permitted_params + params.permit(:id, :typing_status, :website_token) + end +end diff --git a/app/controllers/api/v1/widget/events_controller.rb b/app/controllers/api/v1/widget/events_controller.rb new file mode 100644 index 000000000..faa44994c --- /dev/null +++ b/app/controllers/api/v1/widget/events_controller.rb @@ -0,0 +1,16 @@ +class Api::V1::Widget::EventsController < Api::V1::Widget::BaseController + include Events::Types + before_action :set_web_widget + before_action :set_contact + + def create + Rails.configuration.dispatcher.dispatch(permitted_params[:name], Time.zone.now, contact_inbox: @contact_inbox) + head :no_content + end + + private + + def permitted_params + params.permit(:name, :website_token) + end +end diff --git a/app/controllers/api/v1/widget/messages_controller.rb b/app/controllers/api/v1/widget/messages_controller.rb index 7d16f7641..a65e01f9c 100644 --- a/app/controllers/api/v1/widget/messages_controller.rb +++ b/app/controllers/api/v1/widget/messages_controller.rb @@ -10,13 +10,17 @@ class Api::V1::Widget::MessagesController < Api::V1::Widget::BaseController def create @message = conversation.messages.new(message_params) + @message.save build_attachment - @message.save! end def update - @message.update!(input_submitted_email: contact_email) - update_contact(contact_email) + if @message.content_type == 'input_email' + @message.update!(submitted_email: contact_email) + update_contact(contact_email) + else + @message.update!(message_update_params[:message]) + end rescue StandardError => e render json: { error: @contact.errors, message: e.message }.to_json, status: 500 end @@ -24,13 +28,16 @@ class Api::V1::Widget::MessagesController < Api::V1::Widget::BaseController private def build_attachment - return if params[:message][:attachment].blank? + return if params[:message][:attachments].blank? - @message.attachment = Attachment.new( - account_id: @message.account_id, - file_type: helpers.file_type(params[:message][:attachment][:file]&.content_type) - ) - @message.attachment.file.attach(params[:message][:attachment][:file]) + params[:message][:attachments].each do |uploaded_attachment| + attachment = @message.attachments.new( + account_id: @message.account_id, + file_type: helpers.file_type(uploaded_attachment&.content_type) + ) + attachment.file.attach(uploaded_attachment) + end + @message.save! end def set_conversation @@ -116,6 +123,10 @@ class Api::V1::Widget::MessagesController < Api::V1::Widget::BaseController contact_email.split('@')[0] end + def message_update_params + params.permit(message: [submitted_values: [:name, :title, :value]]) + end + def permitted_params params.permit(:id, :before, :website_token, contact: [:email], message: [:content, :referer_url, :timestamp]) end diff --git a/app/controllers/api_controller.rb b/app/controllers/api_controller.rb new file mode 100644 index 000000000..3d7f59f0c --- /dev/null +++ b/app/controllers/api_controller.rb @@ -0,0 +1,8 @@ +class ApiController < ApplicationController + skip_before_action :set_current_user, only: [:index] + skip_before_action :check_subscription, only: [:index] + + def index + render json: { version: Chatwoot.config[:version], timestamp: Time.now.utc.to_formatted_s(:db) } + end +end diff --git a/app/controllers/apple_app_controller.rb b/app/controllers/apple_app_controller.rb new file mode 100644 index 000000000..1191cd66e --- /dev/null +++ b/app/controllers/apple_app_controller.rb @@ -0,0 +1,6 @@ +class AppleAppController < ApplicationController + def site_association + site_association_json = render_to_string action: 'site_association', layout: false + send_data site_association_json, filename: 'apple-app-site-association', type: 'application/json' + end +end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 5bac8991e..b6473cf13 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -24,9 +24,14 @@ class ApplicationController < ActionController::Base elsif @resource&.is_a?(AgentBot) account_accessible_for_bot?(account) end + switch_locale account account end + def switch_locale(account) + I18n.locale = (I18n.available_locales.map(&:to_s).include?(account.locale) ? account.locale : nil) || I18n.default_locale + end + def account_accessible_for_user?(account) render_unauthorized('You are not authorized to access this account') unless account.account_users.find_by(user_id: current_user.id) end diff --git a/app/controllers/concerns/access_token_auth_helper.rb b/app/controllers/concerns/access_token_auth_helper.rb index 3e3875333..e7af9e116 100644 --- a/app/controllers/concerns/access_token_auth_helper.rb +++ b/app/controllers/concerns/access_token_auth_helper.rb @@ -1,11 +1,12 @@ module AccessTokenAuthHelper BOT_ACCESSIBLE_ENDPOINTS = { - 'api/v1/accounts/conversations' => ['toggle_status'], + 'api/v1/accounts/conversations' => %w[toggle_status create], 'api/v1/accounts/conversations/messages' => ['create'] }.freeze def authenticate_access_token! - access_token = AccessToken.find_by(token: request.headers[:api_access_token]) + token = request.headers[:api_access_token] || request.headers[:HTTP_API_ACCESS_TOKEN] + access_token = AccessToken.find_by(token: token) render_unauthorized('Invalid Access Token') && return unless access_token token_owner = access_token.owner diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb deleted file mode 100644 index d811b859e..000000000 --- a/app/controllers/home_controller.rb +++ /dev/null @@ -1,9 +0,0 @@ -require 'rest-client' -require 'telegram/bot' - -class HomeController < ApplicationController - skip_before_action :verify_authenticity_token, only: [:telegram] - skip_before_action :authenticate_user!, only: [:telegram], raise: false - skip_before_action :set_current_user - skip_before_action :check_subscription -end diff --git a/app/controllers/twilio/callback_controller.rb b/app/controllers/twilio/callback_controller.rb index f6cb5356c..44dcc9b6f 100644 --- a/app/controllers/twilio/callback_controller.rb +++ b/app/controllers/twilio/callback_controller.rb @@ -23,7 +23,9 @@ class Twilio::CallbackController < ApplicationController :FromZip, :Body, :ToCountry, - :FromState + :FromState, + :MediaUrl0, + :MediaContentType0 ) end end diff --git a/app/controllers/twitter/authorizations_controller.rb b/app/controllers/twitter/authorizations_controller.rb index 69145ff84..765e026fe 100644 --- a/app/controllers/twitter/authorizations_controller.rb +++ b/app/controllers/twitter/authorizations_controller.rb @@ -6,7 +6,7 @@ class Twitter::AuthorizationsController < Twitter::BaseController ::Redis::Alfred.setex(oauth_token, account.id) redirect_to oauth_authorize_endpoint(oauth_token) else - redirect_to app_new_twitter_inbox_url + redirect_to app_new_twitter_inbox_url(account_id: account.id) end end diff --git a/app/controllers/twitter/callbacks_controller.rb b/app/controllers/twitter/callbacks_controller.rb index fe55ba3a1..6065e3546 100644 --- a/app/controllers/twitter/callbacks_controller.rb +++ b/app/controllers/twitter/callbacks_controller.rb @@ -39,8 +39,7 @@ class Twitter::CallbacksController < Twitter::BaseController twitter_profile = account.twitter_profiles.create( twitter_access_token: parsed_body['oauth_token'], twitter_access_token_secret: parsed_body['oauth_token_secret'], - profile_id: parsed_body['user_id'], - name: parsed_body['screen_name'] + profile_id: parsed_body['user_id'] ) account.inboxes.create( name: parsed_body['screen_name'], diff --git a/app/dispatchers/async_dispatcher.rb b/app/dispatchers/async_dispatcher.rb index 65569c1b0..64ea55be3 100644 --- a/app/dispatchers/async_dispatcher.rb +++ b/app/dispatchers/async_dispatcher.rb @@ -9,8 +9,7 @@ class AsyncDispatcher < BaseDispatcher end def listeners - listeners = [AgentBotListener.instance, EmailNotificationListener.instance, ReportingListener.instance, WebhookListener.instance] - listeners << EventListener.instance + listeners = [EventListener.instance, WebhookListener.instance] listeners << SubscriptionListener.instance if ENV['BILLING_ENABLED'] listeners end diff --git a/app/dispatchers/sync_dispatcher.rb b/app/dispatchers/sync_dispatcher.rb index e3bad28a1..9f7adc02c 100644 --- a/app/dispatchers/sync_dispatcher.rb +++ b/app/dispatchers/sync_dispatcher.rb @@ -5,6 +5,6 @@ class SyncDispatcher < BaseDispatcher end def listeners - [ActionCableListener.instance] + [ActionCableListener.instance, AgentBotListener.instance, NotificationListener.instance] end end diff --git a/app/finders/message_finder.rb b/app/finders/message_finder.rb index f21093b48..00ef8ab3b 100644 --- a/app/finders/message_finder.rb +++ b/app/finders/message_finder.rb @@ -11,7 +11,7 @@ class MessageFinder private def conversation_messages - @conversation.messages.includes(:attachment, user: { avatar_attachment: :blob }) + @conversation.messages.includes(:attachments, user: { avatar_attachment: :blob }) end def messages diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index de6be7945..b52b2300e 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,2 +1,5 @@ module ApplicationHelper + def available_locales_with_name + LANGUAGES_CONFIG.map { |_key, val| val.slice(:name, :iso_639_1_code) } + end end diff --git a/app/identities/account_identity.rb b/app/identities/account_identity.rb deleted file mode 100644 index be3072b1a..000000000 --- a/app/identities/account_identity.rb +++ /dev/null @@ -1,10 +0,0 @@ -class AccountIdentity < Nightfury::Identity::Base - metric :conversations_count, :count_time_series, store_as: :b, step: :day - metric :incoming_messages_count, :count_time_series, step: :day - metric :outgoing_messages_count, :count_time_series, step: :day - metric :avg_first_response_time, :avg_time_series, store_as: :d, step: :day - metric :avg_resolution_time, :avg_time_series, store_as: :f, step: :day - metric :resolutions_count, :count_time_series, store_as: :g, step: :day -end - -AccountIdentity.store_as = :ci diff --git a/app/identities/agent_identity.rb b/app/identities/agent_identity.rb deleted file mode 100644 index 838ca48bb..000000000 --- a/app/identities/agent_identity.rb +++ /dev/null @@ -1,8 +0,0 @@ -class AgentIdentity < Nightfury::Identity::Base - metric :avg_first_response_time, :avg_time_series, store_as: :d, step: :day - metric :avg_resolution_time, :avg_time_series, store_as: :f, step: :day - metric :resolutions_count, :count_time_series, store_as: :g, step: :day - tag :account_id, store_as: :co -end - -AgentIdentity.store_as = :ai diff --git a/app/javascript/dashboard/api/channel/webChannel.js b/app/javascript/dashboard/api/channel/webChannel.js index 5354787c3..81a145462 100644 --- a/app/javascript/dashboard/api/channel/webChannel.js +++ b/app/javascript/dashboard/api/channel/webChannel.js @@ -2,7 +2,7 @@ import ApiClient from '../ApiClient'; class WebChannel extends ApiClient { constructor() { - super('widget/inboxes', { accountScoped: true }); + super('inboxes', { accountScoped: true }); } } diff --git a/app/javascript/dashboard/api/inbox/conversation.js b/app/javascript/dashboard/api/inbox/conversation.js index d5212957a..18ca9a60b 100644 --- a/app/javascript/dashboard/api/inbox/conversation.js +++ b/app/javascript/dashboard/api/inbox/conversation.js @@ -33,6 +33,12 @@ class ConversationApi extends ApiClient { agent_last_seen_at: lastSeen, }); } + + toggleTyping({ conversationId, status }) { + return axios.post(`${this.url}/${conversationId}/toggle_typing_status`, { + typing_status: status, + }); + } } export default new ConversationApi(); diff --git a/app/javascript/dashboard/api/inbox/message.js b/app/javascript/dashboard/api/inbox/message.js index 579d97a10..c9681f685 100644 --- a/app/javascript/dashboard/api/inbox/message.js +++ b/app/javascript/dashboard/api/inbox/message.js @@ -9,7 +9,7 @@ class MessageApi extends ApiClient { create({ conversationId, message, private: isPrivate }) { return axios.post(`${this.url}/${conversationId}/messages`, { - message, + content: message, private: isPrivate, }); } @@ -22,7 +22,7 @@ class MessageApi extends ApiClient { sendAttachment([conversationId, { file }]) { const formData = new FormData(); - formData.append('attachment[file]', file); + formData.append('attachments[]', file, file.name); return axios({ method: 'post', url: `${this.url}/${conversationId}/messages`, diff --git a/app/javascript/dashboard/api/notificationSubscription.js b/app/javascript/dashboard/api/notificationSubscription.js new file mode 100644 index 000000000..23424e876 --- /dev/null +++ b/app/javascript/dashboard/api/notificationSubscription.js @@ -0,0 +1,9 @@ +import ApiClient from './ApiClient'; + +class NotificationSubscriptions extends ApiClient { + constructor() { + super('notification_subscriptions'); + } +} + +export default new NotificationSubscriptions(); diff --git a/app/javascript/dashboard/assets/images/channels/whatsapp.png b/app/javascript/dashboard/assets/images/channels/whatsapp.png new file mode 100644 index 000000000..547ff675e Binary files /dev/null and b/app/javascript/dashboard/assets/images/channels/whatsapp.png differ diff --git a/app/javascript/dashboard/assets/images/typing.gif b/app/javascript/dashboard/assets/images/typing.gif new file mode 100644 index 000000000..dd9b1ca2b Binary files /dev/null and b/app/javascript/dashboard/assets/images/typing.gif differ diff --git a/app/javascript/dashboard/assets/scss/_foundation-settings.scss b/app/javascript/dashboard/assets/scss/_foundation-settings.scss index 4779db720..169198dae 100644 --- a/app/javascript/dashboard/assets/scss/_foundation-settings.scss +++ b/app/javascript/dashboard/assets/scss/_foundation-settings.scss @@ -49,10 +49,10 @@ $global-font-size: 10px; $global-width: 100%; $global-lineheight: 1.5; $foundation-palette: (primary: $color-woot, - secondary: #777, - success: #13ce66, - warning: #ffc82c, - alert: #ff4949); + secondary: #35c5ff, + success: #44ce4b, + warning: #ffc532, + alert: #ff382d); $light-gray: #c0ccda; $medium-gray: #8492a6; $dark-gray: $color-gray; @@ -127,7 +127,7 @@ $header-styles: (small: ("h1": ("font-size": 24), $header-text-rendering: optimizeLegibility; $small-font-size: 80%; $header-small-font-color: $medium-gray; -$paragraph-lineheight: 1.6; +$paragraph-lineheight: 1.45; $paragraph-margin-bottom: 1rem; $paragraph-text-rendering: optimizeLegibility; $code-color: $black; @@ -377,8 +377,8 @@ $form-button-radius: $global-radius; // 20. Label // --------- -$label-background: $primary-color; -$label-color: $white; +$label-background: lighten($primary-color, 40%); +$label-color: $primary-color; $label-color-alt: $black; $label-palette: $foundation-palette; $label-font-size: $font-size-micro; diff --git a/app/javascript/dashboard/assets/scss/_helper-classes.scss b/app/javascript/dashboard/assets/scss/_helper-classes.scss index fa84afa0c..d34d30beb 100644 --- a/app/javascript/dashboard/assets/scss/_helper-classes.scss +++ b/app/javascript/dashboard/assets/scss/_helper-classes.scss @@ -29,7 +29,7 @@ background: $color-white; border-radius: $space-large; left: 0; - margin: $space-slab 0 auto; + margin: $space-slab auto; padding: $space-normal; top: 0; diff --git a/app/javascript/dashboard/assets/scss/_variables.scss b/app/javascript/dashboard/assets/scss/_variables.scss index b75d3bf77..09a639648 100644 --- a/app/javascript/dashboard/assets/scss/_variables.scss +++ b/app/javascript/dashboard/assets/scss/_variables.scss @@ -46,7 +46,8 @@ $color-gray: #6e6f73; $color-light-gray: #999a9b; $color-border: #e0e6ed; $color-border-light: #f0f4f5; -$color-background: #eff2f7; +$color-background: #f4f6fb; +$color-border-dark: #cad0d4; $color-background-light: #f9fafc; $color-white: #fff; $color-body: #3c4858; @@ -54,11 +55,10 @@ $color-heading: #1f2d3d; $color-extra-light-blue: #f5f7f9; $primary-color: $color-woot; -$secondary-color: #ff5216; -$success-color: #13ce66; -$warning-color: #ffc82c; -$alert-color: #ff4949; - +$secondary-color: #35c5ff; +$success-color: #44ce4b; +$warning-color: #ffc532; +$alert-color: #ff382d; // Color-palettes $color-primary-light: #c7e3ff; diff --git a/app/javascript/dashboard/assets/scss/_woot.scss b/app/javascript/dashboard/assets/scss/_woot.scss index d86e61271..05d822b5a 100644 --- a/app/javascript/dashboard/assets/scss/_woot.scss +++ b/app/javascript/dashboard/assets/scss/_woot.scss @@ -9,7 +9,6 @@ @import 'widgets/conv-header'; @import 'widgets/conversation-card'; @import 'widgets/conversation-view'; -@import 'widgets/emojiinput'; @import 'widgets/forms'; @import 'widgets/login'; @import 'widgets/modal'; diff --git a/app/javascript/dashboard/assets/scss/views/settings/inbox.scss b/app/javascript/dashboard/assets/scss/views/settings/inbox.scss index 0059816d8..05cfb9b9e 100644 --- a/app/javascript/dashboard/assets/scss/views/settings/inbox.scss +++ b/app/javascript/dashboard/assets/scss/views/settings/inbox.scss @@ -5,6 +5,7 @@ @include padding($space-normal $space-two $zero); } } + // Conversation header - Light BG .settings-header { @include padding($space-small $space-normal); @@ -14,6 +15,7 @@ @include border-normal-bottom; height: $header-height; min-height: $header-height; + // Resolve Button .button { @include margin(0); @@ -31,42 +33,39 @@ .wizard-box { .item { @include padding($space-normal $space-normal $space-normal $space-medium); - position: relative; @include background-light; - cursor: pointer; - &:before, - &:after { - content: ''; - position: absolute; - width: 2px; - height: 100%; + cursor: pointer; + position: relative; + + &::before, + &::after { background: $color-border; + content: ''; + height: 100%; + position: absolute; top: $space-normal; + width: 2px; } - &:before { - top: $zero; + &::before { height: $space-normal; + top: $zero; } &:first-child { - &:before { + &::before { height: 0; } } &:last-child { - &:after { + &::after { height: $zero; } } &.active { - // left: 1px; - // @include background-white; - // @include border-light; - // border-right: 0; h3 { color: $color-woot; } @@ -78,7 +77,7 @@ &.over { - &:after { + &::after { background: $color-woot; } @@ -87,17 +86,17 @@ } &+.item { - &:before { + &::before { background: $color-woot; } } } h3 { - font-size: $font-size-default; - padding-left: $space-medium; - line-height: 1; color: $color-body; + font-size: $font-size-default; + line-height: 1; + padding-left: $space-medium; .completed { color: $success-color; @@ -105,25 +104,25 @@ } p { - font-size: $font-size-small; color: $color-light-gray; - padding-left: $space-medium; + font-size: $font-size-small; margin: 0; + padding-left: $space-medium; } .step { - position: absolute; - left: $space-normal; - top: $space-normal; - font-size: $font-size-small; - font-weight: $font-weight-medium; background: $color-border; border-radius: 20px; - width: $space-normal; + color: $color-white; + font-size: $font-size-micro; + font-weight: $font-weight-medium; height: $space-normal; - text-align: center; + left: $space-normal; line-height: $space-normal; - color: #fff; + position: absolute; + text-align: center; + top: $space-normal; + width: $space-normal; z-index: 999; i { @@ -141,10 +140,6 @@ } .inoboxes-list { - // @include margin(auto); - // @include background-white; - // @include border-light; - // width: 50%; .inbox-item { @include margin($space-normal); @@ -152,20 +147,23 @@ @include flex-shrink; @include padding($space-normal $space-normal); @include border-light-bottom(); - flex-direction: column; + background: $color-white; cursor: pointer; - width: 20%; + flex-direction: column; float: left; min-height: 10rem; + width: 20%; &:last-child { - margin-bottom: $zero; @include border-nil; + + margin-bottom: $zero; } &:hover { @include background-gray; + .arrow { opacity: 1; transform: translateX($space-small); @@ -174,8 +172,8 @@ .switch { align-self: center; - margin-right: $space-normal; margin-bottom: $zero; + margin-right: $space-normal; } .item--details { @@ -187,15 +185,15 @@ } .item--sub { - margin-bottom: 0; font-size: $font-size-small; + margin-bottom: 0; } } .arrow { align-self: center; - font-size: $font-size-small; color: $medium-gray; + font-size: $font-size-small; opacity: .7; transform: translateX(0); transition: opacity 0.100s ease-in 0s, transform 0.200s ease-in 0.030s; @@ -204,18 +202,19 @@ } .settings--content { - @include margin($space-small $space-medium); + @include margin($space-small $space-larger); .title { font-weight: $font-weight-medium; } .code { + @include padding($space-one); + + background: $color-background; max-height: $space-mega; overflow: auto; white-space: nowrap; - @include padding($space-one); - background: $color-background; code { background: transparent; @@ -225,14 +224,14 @@ } .login-init { - text-align: center; padding-top: 30%; + text-align: center; p { @include padding($space-medium); } - > a > img { + >a>img { width: $space-larger * 5; } } diff --git a/app/javascript/dashboard/assets/scss/views/settings/integrations.scss b/app/javascript/dashboard/assets/scss/views/settings/integrations.scss index 183fa9a23..e791f4cd7 100644 --- a/app/javascript/dashboard/assets/scss/views/settings/integrations.scss +++ b/app/javascript/dashboard/assets/scss/views/settings/integrations.scss @@ -1,8 +1,8 @@ .integrations-wrap { .integration { background: $color-white; - border: 2px solid $color-border; - border-radius: $space-slab; + border: 1px solid $color-border; + border-radius: $space-smaller; padding: $space-normal; .integration--image { diff --git a/app/javascript/dashboard/assets/scss/widgets/_conv-header.scss b/app/javascript/dashboard/assets/scss/widgets/_conv-header.scss index 0122ba96b..6de396353 100644 --- a/app/javascript/dashboard/assets/scss/widgets/_conv-header.scss +++ b/app/javascript/dashboard/assets/scss/widgets/_conv-header.scss @@ -45,6 +45,7 @@ .user--name { @include margin(0); font-size: $font-size-medium; + line-height: 1.3; text-transform: capitalize; } @@ -65,6 +66,8 @@ } .button.resolve--button { + width: 13.2rem; + >.icon { font-size: $font-size-default; padding-right: $space-small; diff --git a/app/javascript/dashboard/assets/scss/widgets/_conversation-card.scss b/app/javascript/dashboard/assets/scss/widgets/_conversation-card.scss index c331492d2..498a5e9d2 100644 --- a/app/javascript/dashboard/assets/scss/widgets/_conversation-card.scss +++ b/app/javascript/dashboard/assets/scss/widgets/_conversation-card.scss @@ -1,23 +1,53 @@ .conversation { @include flex; @include flex-shrink; - @include padding($space-normal $zero $zero $space-normal); + @include padding(0 0 0 $space-normal); + align-items: center; + border-bottom: 1px solid transparent; + border-left: $space-micro solid transparent; + border-top: 1px solid transparent; cursor: pointer; position: relative; &.active { background: $color-background; + border-bottom-color: $color-border-light; + border-left-color: $color-woot; + border-top-color: $color-border-light; + + .conversation--details { + border-top-color: transparent; + } + + +.conversation .conversation--details { + border-top-color: transparent; + } } + &:first-child { + .conversation--details { + border-top-color: transparent; + } + } + + &:nth-last-child(2) { + .conversation--details { + border-bottom-color: $color-border-light; + } + } + + .conversation--details { - @include margin($zero $zero $zero $space-one); + @include margin(0 0 0 $space-one); @include border-light-bottom; - @include padding($zero $zero $space-slab $zero); + @include border-light-top; + @include padding($space-slab 0); + border-bottom-color: transparent; } .conversation--user { font-size: $font-size-small; - margin-bottom: $zero; + margin-bottom: 0; text-transform: capitalize; .label { @@ -37,7 +67,7 @@ font-weight: $font-weight-normal; height: $space-medium; line-height: $space-medium; - margin: $zero; + margin: 0; max-width: 96%; overflow: hidden; text-overflow: ellipsis; @@ -52,20 +82,20 @@ .conversation--meta { @include flex; - display: block; flex-direction: column; position: absolute; right: $space-normal; top: $space-normal; .unread { - $unread-size: $space-two - $space-micro; + $unread-size: $space-normal; @include round-corner; + @include light-shadow; background: darken($success-color, 3%); color: $color-white; display: none; - font-size: $font-size-mini; - font-weight: $font-weight-medium; + font-size: $font-size-micro; + font-weight: $font-weight-black; height: $unread-size; line-height: $unread-size; margin-left: auto; diff --git a/app/javascript/dashboard/assets/scss/widgets/_conversation-view.scss b/app/javascript/dashboard/assets/scss/widgets/_conversation-view.scss index ecf682b2d..6aef3e3f9 100644 --- a/app/javascript/dashboard/assets/scss/widgets/_conversation-view.scss +++ b/app/javascript/dashboard/assets/scss/widgets/_conversation-view.scss @@ -1,10 +1,11 @@ -@mixin bubble-with-tyes { - @include padding($space-smaller $space-one); +@mixin bubble-with-types { + @include padding($space-small $space-normal); @include margin($zero); - background: $color-primary-light; - border-radius: $space-small; - color: $color-heading; + background: $color-woot; + border-radius: $space-one; + color: $color-white; font-size: $font-size-small; + font-weight: $font-weight-normal; position: relative; .icon { @@ -15,6 +16,17 @@ .message-text__wrap { position: relative; + + .time { + color: $color-primary-light; + display: block; + font-size: $font-size-micro; + line-height: 1.8; + } + + .link { + color: $color-white; + } } .message-text { @@ -51,8 +63,7 @@ } &::before { - $color-black: #000; - background-image: linear-gradient(-180deg, transparent 3%, $color-black 70%); + background-image: linear-gradient(-180deg, transparent 3%, $color-heading 130%); bottom: 0; content: ''; height: 20%; @@ -94,6 +105,7 @@ .load-more-conversations { font-size: $font-size-small; + margin: 0; padding: $space-normal; width: 100%; } @@ -122,10 +134,10 @@ .status--filter { @include padding($zero null $zero $space-normal); - @include border-light; @include round-corner; @include margin($space-smaller $space-slab $zero $zero); - background-color: $color-background; + background-color: $color-background-light; + border: 1px solid $color-border; float: right; font-size: $font-size-mini; height: $space-medium; @@ -192,168 +204,225 @@ height: 100%; margin-bottom: $space-small; overflow-y: auto; + position: relative; +} - >li { - @include flex; - @include flex-shrink; - @include margin($zero $zero $space-smaller); +.conversation-panel>li { + @include flex; + @include flex-shrink; + @include margin($zero $zero $space-micro); + position: relative; - &:first-child { - margin-top: auto; + &:first-child { + margin-top: auto; + } + + &:last-child { + margin-bottom: $space-small; + } + + &.unread--toast { + span { + @include elegant-card; + @include round-corner; + background: $color-woot; + color: $color-white; + font-size: $font-size-mini; + font-weight: $font-weight-medium; + margin: $space-one auto; + padding: $space-smaller $space-two; } + } - &:last-child { - margin-bottom: $space-small; + .bubble { + @include bubble-with-types; + max-width: 50rem; + text-align: left; + word-wrap: break-word; + + .aplayer { + box-shadow: none; + font-family: inherit; } + } - &.unread--toast { - span { - @include elegant-card; - @include round-corner; - background: $color-woot; - color: $color-white; - font-size: $font-size-mini; - font-weight: $font-weight-medium; - margin: $space-one auto; - padding: $space-smaller $space-two; + &.left { + + .bubble { + @include border-normal; + background: $white; + border-bottom-left-radius: $space-smaller; + border-top-left-radius: $space-smaller; + color: $color-body; + margin-right: auto; + + .time { + color: $color-light-gray; } + + .image .time { + color: $color-white; + } + + .link { + color: $color-primary-dark; + } + + .file { + .text-block-title { + color: $color-body; + } + + .icon-wrap { + color: $color-woot; + } + + .download { + color: $color-primary-dark; + } + } + } + + +.right { + margin-top: $space-one; + + .bubble { + border-top-right-radius: $space-one; + } + } + + } + + &.right { + @include flex-align(right, null); + + .wrap { + margin-right: $space-normal; + text-align: right; } .bubble { - @include bubble-with-tyes; - max-width: 50rem; - text-align: left; - word-wrap: break-word; + border-bottom-right-radius: $space-smaller; + border-top-right-radius: $space-smaller; + margin-left: auto; - .aplayer { - box-shadow: none; - font-family: inherit; - } - } - - &.left { - .bubble { - background: $white; - border-bottom-left-radius: 0; - border-top-left-radius: 0; + &.is-private { + background: lighten($warning-color, 32%); + border: 1px solid $color-border; color: $color-heading; - margin-right: auto; - } + padding-right: $space-large; + position: relative; - +.right { - margin-top: $space-one; + &::before { + bottom: 0; + color: $medium-gray; + position: absolute; + right: $space-one; + top: $space-smaller + $space-micro; + } - .bubble { - border-top-right-radius: $space-small; + .time { + color: $color-light-gray; } } - } - &.right { - @include flex-align(right, null); - - .wrap { - margin-right: $space-normal; - text-align: right; - } + +.left { + margin-top: $space-one; .bubble { - border-bottom-right-radius: 0; - border-top-right-radius: 0; - margin-left: auto; - - &.is-private { - background: lighten($warning-color, 32%); - color: $color-heading; - padding-right: $space-large; - position: relative; - - &::before { - bottom: 0; - color: $medium-gray; - position: absolute; - right: $space-one; - top: $space-smaller + $space-micro; - } - } - } - - +.left { - margin-top: $space-one; - - .bubble { - border-top-left-radius: $space-small; - } + border-top-left-radius: $space-one; } } + } - .wrap { - @include margin($zero $space-normal); - max-width: 69%; + .wrap { + @include margin($zero $space-normal); + max-width: 69%; - .sender--name { - font-size: $font-size-mini; - margin-bottom: $space-smaller; - } + .sender--name { + font-size: $font-size-mini; + margin-bottom: $space-smaller; } + } - .sender--thumbnail { - @include round-corner(); - height: $space-slab; - margin-right: $space-one; - margin-top: $space-micro; - width: $space-slab; - } + .sender--thumbnail { + @include round-corner(); + height: $space-slab; + margin-right: $space-one; + margin-top: $space-micro; + width: $space-slab; + } - .activity-wrap { - @include flex; - @include margin($space-small auto); - @include padding($space-smaller $space-normal); - @include flex-align($x: center, $y: null); - background: lighten($warning-color, 32%); - border: 1px solid lighten($warning-color, 26%); - border-radius: $space-smaller; - font-size: $font-size-small; + .activity-wrap { + @include flex; + @include margin($space-small auto); + @include padding($space-small $space-normal); + @include flex-align($x: center, $y: null); + background: lighten($warning-color, 32%); + border: 1px solid lighten($warning-color, 22%); + border-radius: $space-smaller; + font-size: $font-size-small; - p { - color: $color-heading; - margin-bottom: $zero; + p { + color: $color-heading; + margin-bottom: $zero; - .ion-person { - color: $color-body; - font-size: $font-size-default; - margin-right: $space-small; - position: relative; - top: $space-micro; - } - - .message-text__wrap { - position: relative; - } - - .message-text { - &::after { - content: ' \00a0\00a0\00a0\00a0\00a0\00a0\00a0\00a0\00a0\00a0\00a0\00a0\00a0\00a0\00a0\00a0'; - display: inline; - } - } + .ion-person { + color: $color-body; + font-size: $font-size-default; + margin-right: $space-small; + position: relative; + top: $space-micro; } - .time { - color: $medium-gray; + .message-text__wrap { + position: relative; + } + + .message-text { + &::after { + content: ' \00a0\00a0\00a0\00a0\00a0\00a0\00a0\00a0\00a0\00a0\00a0\00a0\00a0\00a0\00a0\00a0'; + display: inline; + } } } .time { - bottom: -$space-micro; - color: $color-gray; - float: right; + color: $medium-gray; font-size: $font-size-micro; - font-style: italic; margin-left: $space-slab; - right: -$space-micro; - text-align: right; + } + } +} + +.conversation-footer { + display: flex; + flex-direction: column; + position: relative; +} + +.typing-indicator-wrap { + align-items: center; + display: flex; + height: 0; + position: absolute; + top: -$space-large; + width: 100%; + + .typing-indicator { + @include elegant-card; + @include round-corner; + background: $color-white; + color: $color-light-gray; + font-size: $font-size-mini; + font-weight: $font-weight-bold; + margin: $space-one auto; + padding: $space-small $space-normal $space-small $space-two; + + .gif { + margin-left: $space-small; + width: $space-medium; } } } diff --git a/app/javascript/dashboard/assets/scss/widgets/_emojiinput.scss b/app/javascript/dashboard/assets/scss/widgets/_emojiinput.scss index 7a4e2f2ec..f4bc48e7c 100644 --- a/app/javascript/dashboard/assets/scss/widgets/_emojiinput.scss +++ b/app/javascript/dashboard/assets/scss/widgets/_emojiinput.scss @@ -1,3 +1,6 @@ +@import '../variables'; +@import '../mixins'; + .emoji-dialog { @include elegant-card; background: $color-white; @@ -15,15 +18,15 @@ } .emojione { - @include margin($zero); - font-size: $font-size-medium; + font-size: $font-size-default; + margin: $zero; } .emoji-row { - @include padding($space-small); box-sizing: border-box; height: 180px; overflow-y: auto; + padding: $space-small; .emoji { border-radius: 4px; @@ -52,27 +55,33 @@ } .emoji-dialog-header { - @include padding($zero $space-smaller); - background-color: $light-gray; + background-color: $color-body; border-top-left-radius: $space-small; border-top-right-radius: $space-small; + padding: $zero $space-smaller; ul { + display: flex; list-style: none; margin: 0; padding: $space-smaller 0 0; - > li { - @include padding($space-smaller $space-small); - box-sizing: border-box; + >li { + align-items: center; cursor: pointer; - display: inline-block; - height: 3.4rem; - text-align: center; + display: flex; + height: $space-medium; + justify-content: center; + padding: $space-smaller $space-small; } - > .active { - background: $white; + .emojione { + height: $space-two; + width: $space-normal; + } + + >.active { + background: $color-white; border-top-left-radius: $space-small; border-top-right-radius: $space-small; } @@ -84,13 +93,14 @@ } .active { + img, svg { filter: grayscale(0); } } - > * { + >* { display: table-cell; vertical-align: middle; } diff --git a/app/javascript/dashboard/assets/scss/widgets/_forms.scss b/app/javascript/dashboard/assets/scss/widgets/_forms.scss index b394ba3b8..4606ba673 100644 --- a/app/javascript/dashboard/assets/scss/widgets/_forms.scss +++ b/app/javascript/dashboard/assets/scss/widgets/_forms.scss @@ -1,18 +1,17 @@ .error { #{$all-text-inputs}, + select, .multiselect > .multiselect__tags { - @include thin-border( darken(get-color(alert), 25%)); + @include thin-border(darken(get-color(alert), 25%)); } -} -.error { .message { - display: block; - width: 100%; - margin-top: -$space-normal; - margin-bottom: $space-one; color: darken(get-color(alert), 25%); + display: block; font-weight: $font-weight-normal; + margin-bottom: $space-one; + margin-top: -$space-normal; + width: 100%; } } @@ -25,7 +24,7 @@ input { } .input-wrap { - font-size: $font-size-small; color: $color-heading; + font-size: $font-size-small; font-weight: $font-weight-medium; -} \ No newline at end of file +} diff --git a/app/javascript/dashboard/assets/scss/widgets/_login.scss b/app/javascript/dashboard/assets/scss/widgets/_login.scss index 8720c6b57..8deaef1f8 100644 --- a/app/javascript/dashboard/assets/scss/widgets/_login.scss +++ b/app/javascript/dashboard/assets/scss/widgets/_login.scss @@ -42,22 +42,26 @@ font-size: $font-size-default; input { - padding: $space-slab; - height: $space-larger; font-size: $font-size-default; + height: $space-larger; + padding: $space-slab; } .error { font-size: $font-size-small; } } + + .button { + height: $space-larger; + } } .sigin__footer { font-size: $font-size-default; padding: $space-medium; - > a { + >a { font-weight: $font-weight-bold; } } diff --git a/app/javascript/dashboard/assets/scss/widgets/_sidemenu.scss b/app/javascript/dashboard/assets/scss/widgets/_sidemenu.scss index 2d1fd7511..83e4ff5ee 100644 --- a/app/javascript/dashboard/assets/scss/widgets/_sidemenu.scss +++ b/app/javascript/dashboard/assets/scss/widgets/_sidemenu.scss @@ -48,7 +48,7 @@ margin-bottom: $space-micro; margin-top: $space-micro; - >.inbox-icon { + .inbox-icon { display: inline-block; margin-right: $space-micro; min-width: $space-normal; diff --git a/app/javascript/dashboard/assets/scss/widgets/_snackbar.scss b/app/javascript/dashboard/assets/scss/widgets/_snackbar.scss index c4e681ac1..b714b051d 100644 --- a/app/javascript/dashboard/assets/scss/widgets/_snackbar.scss +++ b/app/javascript/dashboard/assets/scss/widgets/_snackbar.scss @@ -1,33 +1,32 @@ .ui-snackbar-container { - position: absolute; + left: 0; + margin: 0 auto; + max-width: 40rem; overflow: hidden; - z-index: 9999; - top: $space-normal; - left: $space-normal; - width: 100%; + position: absolute; + right: 0; text-align: center; + top: $space-normal; + z-index: 9999; } .ui-snackbar { - text-align: left; + @include padding($space-slab $space-medium); + @include shadow; + background-color: $woot-snackbar-bg; + border-radius: $space-smaller; display: inline-block; - min-width: 24rem; + margin-bottom: $space-small; max-width: 40rem; min-height: 3rem; - background-color: $woot-snackbar-bg; - @include padding($space-slab $space-medium); - @include border-top-radius($space-micro); - @include border-right-radius($space-micro); - @include border-bottom-radius($space-micro); - @include border-left-radius($space-micro); - margin-bottom: $space-small; - - // box-shadow: 0 1px 3px alpha(black, 0.12), 0 1px 2px alpha(black, 0.24); + min-width: 24rem; + text-align: left; } .ui-snackbar-text { - font-size: $font-size-small; color: $color-white; + font-size: $font-size-small; + font-weight: $font-weight-medium; } .ui-snackbar-action { @@ -35,12 +34,12 @@ padding-left: 3rem; button { + @include margin(0); + @include padding(0); background: none; border: 0; color: $woot-snackbar-button; font-size: $font-size-small; text-transform: uppercase; - @include margin(0); - @include padding(0); } } diff --git a/app/javascript/dashboard/components/SettingsFormHeader.vue b/app/javascript/dashboard/components/SettingsFormHeader.vue deleted file mode 100644 index 795751612..000000000 --- a/app/javascript/dashboard/components/SettingsFormHeader.vue +++ /dev/null @@ -1,69 +0,0 @@ - - - - - diff --git a/app/javascript/dashboard/components/SettingsSection.vue b/app/javascript/dashboard/components/SettingsSection.vue new file mode 100644 index 000000000..ebf79bf3e --- /dev/null +++ b/app/javascript/dashboard/components/SettingsSection.vue @@ -0,0 +1,46 @@ + + + + + diff --git a/app/javascript/dashboard/components/SnackbarContainer.vue b/app/javascript/dashboard/components/SnackbarContainer.vue index 3c8c37c35..294dc6185 100644 --- a/app/javascript/dashboard/components/SnackbarContainer.vue +++ b/app/javascript/dashboard/components/SnackbarContainer.vue @@ -1,6 +1,10 @@ @@ -9,8 +13,12 @@ import WootSnackbar from './Snackbar'; export default { + components: { + WootSnackbar, + }, props: { duration: { + type: Number, default: 2500, }, }, @@ -22,16 +30,12 @@ export default { }, mounted() { - bus.$on('newToastMessage', (message) => { + bus.$on('newToastMessage', message => { this.snackMessages.push(message); window.setTimeout(() => { this.snackMessages.splice(0, 1); }, this.duration); }); }, - - components: { - WootSnackbar, - }, }; diff --git a/app/javascript/dashboard/components/buttons/FormSubmitButton.vue b/app/javascript/dashboard/components/buttons/FormSubmitButton.vue index c6ec19321..d8934f675 100644 --- a/app/javascript/dashboard/components/buttons/FormSubmitButton.vue +++ b/app/javascript/dashboard/components/buttons/FormSubmitButton.vue @@ -1,6 +1,6 @@ + diff --git a/app/javascript/dashboard/helper/actionCable.js b/app/javascript/dashboard/helper/actionCable.js index 27ff80dbc..035b277c3 100644 --- a/app/javascript/dashboard/helper/actionCable.js +++ b/app/javascript/dashboard/helper/actionCable.js @@ -4,16 +4,25 @@ import BaseActionCableConnector from '../../shared/helpers/BaseActionCableConnec class ActionCableConnector extends BaseActionCableConnector { constructor(app, pubsubToken) { super(app, pubsubToken); + this.CancelTyping = []; this.events = { 'message.created': this.onMessageCreated, + 'message.updated': this.onMessageUpdated, 'conversation.created': this.onConversationCreated, - 'status_change:conversation': this.onStatusChange, + 'conversation.opened': this.onStatusChange, + 'conversation.resolved': this.onStatusChange, 'user:logout': this.onLogout, 'page:reload': this.onReload, 'assignee.changed': this.onAssigneeChanged, + 'conversation.typing_on': this.onTypingOn, + 'conversation.typing_off': this.onTypingOff, }; } + onMessageUpdated = data => { + this.app.$store.dispatch('updateMessage', data); + }; + onAssigneeChanged = payload => { const { meta = {}, id } = payload; const { assignee } = meta || {}; @@ -35,7 +44,45 @@ class ActionCableConnector extends BaseActionCableConnector { onReload = () => window.location.reload(); onStatusChange = data => { - this.app.$store.dispatch('addConversation', data); + this.app.$store.dispatch('updateConversation', data); + }; + + onTypingOn = ({ conversation, user }) => { + const conversationId = conversation.id; + + this.clearTimer(conversationId); + this.app.$store.dispatch('conversationTypingStatus/create', { + conversationId, + user, + }); + this.initTimer({ conversation, user }); + }; + + onTypingOff = ({ conversation, user }) => { + const conversationId = conversation.id; + + this.clearTimer(conversationId); + this.app.$store.dispatch('conversationTypingStatus/destroy', { + conversationId, + user, + }); + }; + + clearTimer = conversationId => { + const timerEvent = this.CancelTyping[conversationId]; + + if (timerEvent) { + clearTimeout(timerEvent); + this.CancelTyping[conversationId] = null; + } + }; + + initTimer = ({ conversation, user }) => { + const conversationId = conversation.id; + // Turn off typing automatically after 30 seconds + this.CancelTyping[conversationId] = setTimeout(() => { + this.onTypingOff({ conversation, user }); + }, 30000); }; } diff --git a/app/javascript/dashboard/helper/commons.js b/app/javascript/dashboard/helper/commons.js index a3af2dbaf..c32d2717a 100644 --- a/app/javascript/dashboard/helper/commons.js +++ b/app/javascript/dashboard/helper/commons.js @@ -9,3 +9,20 @@ export default () => { }); } }; + +export const getTypingUsersText = (users = []) => { + const count = users.length; + if (count === 1) { + const [user] = users; + return `${user.name} is typing`; + } + + if (count === 2) { + const [first, second] = users; + return `${first.name} and ${second.name} are typing`; + } + + const [user] = users; + const rest = users.length - 1; + return `${user.name} and ${rest} others are typing`; +}; diff --git a/app/javascript/dashboard/helper/pushHelper.js b/app/javascript/dashboard/helper/pushHelper.js new file mode 100644 index 000000000..17bc5c56e --- /dev/null +++ b/app/javascript/dashboard/helper/pushHelper.js @@ -0,0 +1,93 @@ +/* eslint-disable no-console */ +import NotificationSubscriptions from '../api/notificationSubscription'; +import auth from '../api/auth'; + +export const verifyServiceWorkerExistence = (callback = () => {}) => { + if (!('serviceWorker' in navigator)) { + // Service Worker isn't supported on this browser, disable or hide UI. + return; + } + + if (!('PushManager' in window)) { + // Push isn't supported on this browser, disable or hide UI. + return; + } + + navigator.serviceWorker + .register('/sw.js') + .then(registration => callback(registration)) + .catch(registrationError => { + // eslint-disable-next-line + console.log('SW registration failed: ', registrationError); + }); +}; + +export const hasPushPermissions = () => { + if ('Notification' in window) { + return Notification.permission === 'granted'; + } + return false; +}; + +const generateKeys = str => + btoa(String.fromCharCode.apply(null, new Uint8Array(str))) + .replace(/\+/g, '-') + .replace(/\//g, '_'); + +export const getPushSubscriptionPayload = subscription => ({ + subscription_type: 'browser_push', + subscription_attributes: { + endpoint: subscription.endpoint, + p256dh: generateKeys(subscription.getKey('p256dh')), + auth: generateKeys(subscription.getKey('auth')), + }, +}); + +export const sendRegistrationToServer = subscription => { + if (auth.isLoggedIn()) { + return NotificationSubscriptions.create( + getPushSubscriptionPayload(subscription) + ); + } + return null; +}; + +export const registerSubscription = (onSuccess = () => {}) => { + if (!window.chatwootConfig.vapidPublicKey) { + return; + } + navigator.serviceWorker.ready + .then(serviceWorkerRegistration => + serviceWorkerRegistration.pushManager.subscribe({ + userVisibleOnly: true, + applicationServerKey: window.chatwootConfig.vapidPublicKey, + }) + ) + .then(sendRegistrationToServer) + .then(() => { + onSuccess(); + }) + .catch(() => { + window.bus.$emit( + 'newToastMessage', + 'This browser does not support desktop notification' + ); + }); +}; + +export const requestPushPermissions = ({ onSuccess }) => { + if (!('Notification' in window)) { + window.bus.$emit( + 'newToastMessage', + 'This browser does not support desktop notification' + ); + } else if (Notification.permission === 'granted') { + registerSubscription(onSuccess); + } else if (Notification.permission !== 'denied') { + Notification.requestPermission(permission => { + if (permission === 'granted') { + registerSubscription(onSuccess); + } + }); + } +}; diff --git a/app/javascript/dashboard/helper/spec/URLHelper.spec.js b/app/javascript/dashboard/helper/specs/URLHelper.spec.js similarity index 100% rename from app/javascript/dashboard/helper/spec/URLHelper.spec.js rename to app/javascript/dashboard/helper/specs/URLHelper.spec.js diff --git a/app/javascript/dashboard/helper/specs/commons.spec.js b/app/javascript/dashboard/helper/specs/commons.spec.js new file mode 100644 index 000000000..180846496 --- /dev/null +++ b/app/javascript/dashboard/helper/specs/commons.spec.js @@ -0,0 +1,26 @@ +import { getTypingUsersText } from '../commons'; + +describe('#getTypingUsersText', () => { + it('returns the correct text is there is only one typing user', () => { + expect(getTypingUsersText([{ name: 'Pranav' }])).toEqual( + 'Pranav is typing' + ); + }); + + it('returns the correct text is there are two typing users', () => { + expect( + getTypingUsersText([{ name: 'Pranav' }, { name: 'Nithin' }]) + ).toEqual('Pranav and Nithin are typing'); + }); + + it('returns the correct text is there are more than two users are typing', () => { + expect( + getTypingUsersText([ + { name: 'Pranav' }, + { name: 'Nithin' }, + { name: 'Subin' }, + { name: 'Sojan' }, + ]) + ).toEqual('Pranav and 3 others are typing'); + }); +}); diff --git a/app/javascript/dashboard/i18n/de.js b/app/javascript/dashboard/i18n/de.js deleted file mode 100644 index 55cb77a8c..000000000 --- a/app/javascript/dashboard/i18n/de.js +++ /dev/null @@ -1,37 +0,0 @@ -import de from './locale/de'; - -export default { - ...de, - APP_GLOBAL: { - TRIAL_MESSAGE: 'verbleibende Tage Probezeit.', - TRAIL_BUTTON: 'Kaufe jetzt', - }, - COMPONENTS: { - CODE: { - BUTTON_TEXT: 'Kopieren', - COPY_SUCCESSFUL: 'Code erfolgreich in die Zwischenablage kopiert', - }, - FILE_BUBBLE: { - DOWNLOAD: 'Herunterladen', - UPLOADING: 'Hochladen...', - }, - }, - CONFIRM_EMAIL: 'Überprüfen...', - SETTINGS: { - INBOXES: { - NEW_INBOX: 'Posteingang hinzufügen', - }, - }, - SIDEBAR: { - CONVERSATIONS: 'Gespräche', - REPORTS: 'Berichte', - SETTINGS: 'Die Einstellungen', - HOME: 'Zuhause', - AGENTS: 'Agenten', - INBOXES: 'Posteingänge', - CANNED_RESPONSES: 'Vorgefertigte Antworten', - BILLING: 'Abrechnung', - INTEGRATIONS: 'Integrationen', - ACCOUNT_SETTINGS: 'Kontoeinstellungen', - }, -}; diff --git a/app/javascript/dashboard/i18n/en.js b/app/javascript/dashboard/i18n/en.js deleted file mode 100644 index ae0e144d6..000000000 --- a/app/javascript/dashboard/i18n/en.js +++ /dev/null @@ -1,37 +0,0 @@ -import en from './locale/en'; - -export default { - ...en, - APP_GLOBAL: { - TRIAL_MESSAGE: 'days trial remaining.', - TRAIL_BUTTON: 'Buy Now', - }, - COMPONENTS: { - CODE: { - BUTTON_TEXT: 'Copy', - COPY_SUCCESSFUL: 'Code copied to clipboard successfully', - }, - FILE_BUBBLE: { - DOWNLOAD: 'Download', - UPLOADING: 'Uploading...', - }, - }, - CONFIRM_EMAIL: 'Verifying...', - SETTINGS: { - INBOXES: { - NEW_INBOX: 'Add Inbox', - }, - }, - SIDEBAR: { - CONVERSATIONS: 'Conversations', - REPORTS: 'Reports', - SETTINGS: 'Settings', - HOME: 'Home', - AGENTS: 'Agents', - INBOXES: 'Inboxes', - CANNED_RESPONSES: 'Canned Responses', - BILLING: 'Billing', - INTEGRATIONS: 'Integrations', - ACCOUNT_SETTINGS: 'Account Settings', - }, -}; diff --git a/app/javascript/dashboard/i18n/index.js b/app/javascript/dashboard/i18n/index.js index 766640c66..2d34fb255 100644 --- a/app/javascript/dashboard/i18n/index.js +++ b/app/javascript/dashboard/i18n/index.js @@ -1,7 +1,21 @@ -import en from './en'; -import de from './de'; +import ca from './locale/ca'; +import ro from './locale/ro'; +import fr from './locale/fr'; +import pt_BR from './locale/pt_BR'; +import de from './locale/de'; +import el from './locale/el'; +import en from './locale/en'; +import ml from './locale/ml'; +import pt from './locale/pt'; export default { + ca, de, + el, en, + fr, + ml, + pt_BR, + pt, + ro, }; diff --git a/app/javascript/dashboard/i18n/locale/ca/agentMgmt.json b/app/javascript/dashboard/i18n/locale/ca/agentMgmt.json new file mode 100644 index 000000000..86028734f --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ca/agentMgmt.json @@ -0,0 +1,101 @@ +{ + "AGENT_MGMT": { + "HEADER": "Agents", + "HEADER_BTN_TXT": "Afegir Agent", + "LOADING": "S'està recollint la llista d'agents", + "SIDEBAR_TXT": "

Agents

Un Agent és un membre del teu equip de suport al client.

Els agents podran veure i respondre als missatges dels vostres usuaris. La llista mostra tots els agents que hi ha actualment al vostre compte.

Clica en Afegir Agent per afegir un nou agent. L’agent que afegiu rebrà un correu electrònic amb un enllaç de confirmació per activar el seu compte, després del qual podran accedir a Chatwoot i respondre als missatges.

L’accés a les funcions de Chatwoot es basa en els següents rols.

Agent - els agents amb aquest rol només poden accedir a bústies de sortida, informes i converses.

Administrador/a - L’administrador/a tindrà accés a totes les funcions de Chatwoot habilitades per al vostre compte, incloses les configuracions i la facturació, juntament amb tots els privilegis dels agents normals.

", + "AGENT_TYPES": [ + { + "name": "administrador/a", + "label": "Administrador/a" + }, + { + "name": "agent", + "label": "Agent" + } + ], + "LIST": { + "404": "No hi ha agents associats a aquest compte", + "TITLE": "Gestiona agents en el teu equip", + "DESC": "Pots afegir/esborrar agents del teu equip.", + "NAME": "Nom", + "EMAIL": "Correu electrònic", + "STATUS": "Estat", + "ACTIONS": "Accions", + "VERIFIED": "Verificat", + "VERIFICATION_PENDING": "Verificació pendent" + }, + "ADD": { + "TITLE": "Afegir agent al teu equip", + "DESC": "Podeu afegir persones que podran gestionar suport per a les vostres safates d'entrada.", + "FORM": { + "NAME": { + "LABEL": "Nom de l'Agent", + "PLACEHOLDER": "Introduïu el nom de l'agent" + }, + "AGENT_TYPE": { + "LABEL": "Tipus d'Agent", + "PLACEHOLDER": "Selecciona un tipus", + "ERROR": "El tipus d'Agent és necessari" + }, + "EMAIL": { + "LABEL": "Adreça de correu electrònic", + "PLACEHOLDER": "Introduïu l'adreça de correu electrònic de l'agent" + }, + "SUBMIT": "Afegir Agent" + }, + "API": { + "SUCCESS_MESSAGE": "Agent afegit correctament", + "EXIST_MESSAGE": "L'adreça de correu electrònic de l'agent ja està en ús. Introduïu una altre adreça", + "ERROR_MESSAGE": "No s'ha pogut connectar amb el servidor Woot. Torna-ho a provar més endavant" + } + }, + "DELETE": { + "BUTTON_TEXT": "Esborrar", + "API": { + "SUCCESS_MESSAGE": "Agent esborrat correctament", + "ERROR_MESSAGE": "No s'ha pogut connectar amb el servidor Woot. Torna-ho a provar més endavant" + }, + "CONFIRM": { + "TITLE": "Confirma l'esborrat", + "MESSAGE": "N'estas segur? ", + "YES": "Si, esborra ", + "NO": "No, manten-la " + } + }, + "EDIT": { + "TITLE": "Edita l'agent", + "FORM": { + "NAME": { + "LABEL": "Nom de l'Agent", + "PLACEHOLDER": "Introduïu el nom de l'agent" + }, + "AGENT_TYPE": { + "LABEL": "Tipus d'Agent", + "PLACEHOLDER": "Selecciona un tipus", + "ERROR": "El tipus d'Agent és necessari" + }, + "EMAIL": { + "LABEL": "Adreça de correu electrònic", + "PLACEHOLDER": "Introduïu l'adreça de correu electrònic de l'agent" + }, + "SUBMIT": "Editar l'agent" + }, + "BUTTON_TEXT": "Edita", + "CANCEL_BUTTON_TEXT": "Cancel·la", + "API": { + "SUCCESS_MESSAGE": "Agent actualitzat correctament", + "ERROR_MESSAGE": "No s'ha pogut connectar amb el servidor Woot. Torna-ho a provar més endavant" + }, + "PASSWORD_RESET": { + "ADMIN_RESET_BUTTON": "Reinicialització de la contrasenya", + "ADMIN_SUCCESS_MESSAGE": "S'ha enviat a l'agent un correu electrònic amb instruccions per restablir la contrasenya", + "SUCCESS_MESSAGE": "La contrasenya de l'agent s'ha restablit correctament", + "ERROR_MESSAGE": "No s'ha pogut connectar amb el servidor Woot. Torna-ho a provar més endavant" + } + }, + "SEARCH": { + "NO_RESULTS": "No s'han trobat agents." + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/ca/billing.json b/app/javascript/dashboard/i18n/locale/ca/billing.json new file mode 100644 index 000000000..c44ba0dbf --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ca/billing.json @@ -0,0 +1,19 @@ +{ + "BILLING": { + "HEADER": "Facturació", + "LOADING": "S'estan obtenin les suscripcions", + "ACCOUNT_STATE": "Estat del compte", + "AGENT_COUNT": "Compte d'agent", + "PER_AGENT_COST": "Per cost d'agent", + "TOTAL_COST": "Cost total", + "BUTTON": { + "ADD": "Afegir mètode de pagament", + "EDIT": "EDITAR Mètode de pagament" + }, + "TRIAL": { + "TITLE": "S'ha acabat el període de prova", + "MESSAGE": "Afegiu un mètode de pagament per continuar utilitzant Chatwoot." + }, + "ACCOUNT_LOCKED": "El seu compte no està disponible de moment.
Poseu-vos en contacte amb l'administrador per reactivar-lo." + } +} diff --git a/app/javascript/dashboard/i18n/locale/ca/cannedMgmt.json b/app/javascript/dashboard/i18n/locale/ca/cannedMgmt.json new file mode 100644 index 000000000..e2cd3e7a2 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ca/cannedMgmt.json @@ -0,0 +1,74 @@ +{ + "CANNED_MGMT": { + "HEADER": "Respostes predeterminades", + "HEADER_BTN_TXT": "Afegeix una resposta predeterminada", + "LOADING": "S'estan recollint les respostes predeterminades", + "SEARCH_404": "No hi ha cap resposta que coincideixi amb aquesta consulta", + "SIDEBAR_TXT": "

Respostes predeterminades

Les respostes predeterminades són plantilles de resposta que es poden utilitzar per enviar ràpidament una resposta a una conversa .

Per crear una Resposta Predeterminada, clica en Afegir Resposta Predeterminada. També pots editar o suprimir una resposta predeterminada fent clic al botó Edita o Suprimeix

Les respostes predeterminades s'utilitzen amb l'ajuda dels Codi curt. Els agents poden accedir a les respostes predeterminades en un xat escrivint '/' seguit del codi curt.

", + "LIST": { + "404": "No hi ha respostes predeterminades disponibles en aquest compte.", + "TITLE": "Gestiona les respostes predeterminades", + "DESC": "Les respostes predeterminades són plantilles de resposta predefinides que es poden utilitzar per enviar ràpidament respostes a les converses.", + "TABLE_HEADER": [ + "Codi curt", + "Contingut", + "Accions" + ] + }, + "ADD": { + "TITLE": "Afegeix Resposta Predeterminada", + "DESC": "Les respostes predeterminades són plantilles de resposta que es poden utilitzar per enviar ràpidament les respostes a les converses.", + "FORM": { + "SHORT_CODE": { + "LABEL": "Codi curt", + "PLACEHOLDER": "Introduïu un codi curt", + "ERROR": "És necessari el codi curt" + }, + "CONTENT": { + "LABEL": "Contingut", + "PLACEHOLDER": "Introduïu un contingut", + "ERROR": "És necessari un contingut" + }, + "SUBMIT": "Envia" + }, + "API": { + "SUCCESS_MESSAGE": "Resposta predeterminada afegida correctament", + "ERROR_MESSAGE": "No s'ha pogut connectar amb el servidor Woot. Torna-ho a provar més endavant" + } + }, + "EDIT": { + "TITLE": "Edita la resposta predeterminada", + "FORM": { + "SHORT_CODE": { + "LABEL": "Codi curt", + "PLACEHOLDER": "Introduïu un codi curt", + "ERROR": "És necessari el codi curt" + }, + "CONTENT": { + "LABEL": "Contingut", + "PLACEHOLDER": "Introduïu un contingut", + "ERROR": "És necessari un contingut" + }, + "SUBMIT": "Envia" + }, + "BUTTON_TEXT": "Edita", + "API": { + "SUCCESS_MESSAGE": "Resposta predeterminada actualitzada correctament", + "ERROR_MESSAGE": "No s'ha pogut connectar amb el servidor Woot. Torna-ho a provar més endavant" + } + }, + "DELETE": { + "BUTTON_TEXT": "Esborra", + "API": { + "SUCCESS_MESSAGE": "Resposta predeterminada eliminada correctament", + "ERROR_MESSAGE": "No s'ha pogut connectar amb el servidor Woot. Torna-ho a provar més endavant" + }, + "CONFIRM": { + "TITLE": "Confirma esborrat", + "MESSAGE": "N'estas segur ", + "YES": "Si, esborra ", + "NO": "No, mantén-la " + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/ca/chatlist.json b/app/javascript/dashboard/i18n/locale/ca/chatlist.json new file mode 100644 index 000000000..c30fb7377 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ca/chatlist.json @@ -0,0 +1,77 @@ +{ + "CHAT_LIST": { + "LOADING": "S'estan obtenint converses", + "LOAD_MORE_CONVERSATIONS": "Carrega més converses", + "EOF": "Totes les converses carregades 🎉", + "LIST": { + "404": "No hi ha converses actives en aquest grup." + }, + "TAB_HEADING": "Converses", + "SEARCH": { + "INPUT": "Cerca persones, xats, respostes desades .." + }, + "STATUS_TABS": [ + { + "NAME": "Obrir", + "KEY": "openCount" + }, + { + "NAME": "Resoltes", + "KEY": "allConvCount" + } + ], + "ASSIGNEE_TYPE_TABS": [ + { + "NAME": "Meves", + "KEY": "me", + "COUNT_KEY": "mineCount" + }, + { + "NAME": "Sense assignar", + "KEY": "unassigned", + "COUNT_KEY": "unAssignedCount" + }, + { + "NAME": "Totes", + "KEY": "all", + "COUNT_KEY": "allCount" + } + ], + "CHAT_STATUS_ITEMS": [ + { + "TEXT": "Obertes", + "VALUE": "open" + }, + { + "TEXT": "Resoltes", + "VALUE": "resolved" + } + ], + "ATTACHMENTS": { + "image": { + "ICON": "ion-image", + "CONTENT": "Missatge d'imatge" + }, + "audio": { + "ICON": "ion-volume-high", + "CONTENT": "Missatge d'àudio" + }, + "video": { + "ICON": "ion-ios-videocam", + "CONTENT": "Missatge de vídeo" + }, + "file": { + "ICON": "ion-document", + "CONTENT": "Fitxer adjunt" + }, + "location": { + "ICON": "ion-ios-location", + "CONTENT": "Ubicació" + }, + "fallback": { + "ICON": "ion-link", + "CONTENT": "ha compartit una URL" + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/ca/contact.json b/app/javascript/dashboard/i18n/locale/ca/contact.json new file mode 100644 index 000000000..c534ad106 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ca/contact.json @@ -0,0 +1,20 @@ +{ + "CONTACT_PANEL": { + "CONVERSATION_TITLE": "Detalls de les converses", + "BROWSER": "Navegador", + "OS": "Sistema operatiu", + "INITIATED_FROM": "Iniciada des de", + "INITIATED_AT": "Iniciada a les", + "CONVERSATIONS": { + "NO_RECORDS_FOUND": "No hi han converses prèvies associades a aquest contacte.", + "TITLE": "Converses prèvies" + }, + "LABELS": { + "TITLE": "Etiquetes de converses", + "UPDATE_BUTTON": "Actualitza etiquetes", + "UPDATE_ERROR": "No s'han pogut actualitzar les etiquetes, torna-ho a provar.", + "TAG_PLACEHOLDER": "Afegeix una etiqueta nova", + "PLACEHOLDER": "Cerca o afegeix una etiqueta" + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/ca/conversation.json b/app/javascript/dashboard/i18n/locale/ca/conversation.json new file mode 100644 index 000000000..7f0ba8eae --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ca/conversation.json @@ -0,0 +1,35 @@ +{ + "CONVERSATION": { + "404": "Si us plau, selecciona una conversa al panell de l’esquerra", + "NO_MESSAGE_1": "Uh oh! Sembla que no hi ha missatges de clients a la safata d'entrada.", + "NO_MESSAGE_2": " per enviar un missatge a la vostra pàgina!", + "NO_INBOX_1": "Hola! Sembla que encara no heu afegit cap safata d'entrada.", + "NO_INBOX_2": " per començar", + "NO_INBOX_AGENT": "Uh Oh! Sembla que no ets a cap safata d'entrada. Si us plau, poseu-vos en contacte amb l'administrador", + "CLICK_HERE": "Clica aquí", + "LOADING_INBOXES": "S'estan carregant les safates d'entrada", + "LOADING_CONVERSATIONS": "S'estan carregant les converses", + "DOWNLOAD": "Descarrega", + "HEADER": { + "RESOLVE_ACTION": "Resoldre", + "REOPEN_ACTION": "Tornar a obrir", + "OPEN": "Més", + "CLOSE": "Tanca", + "DETAILS": "detalls" + }, + "FOOTER": { + "MSG_INPUT": "Shift + enter per a una línia nova. Comença amb '/' per seleccionar una resposta predeterminada.", + "PRIVATE_MSG_INPUT": "Shift + enter per una línia nova. Això serà visible només per als Agents" + }, + "REPLYBOX": { + "REPLY": "Respon", + "PRIVATE_NOTE": "Nota privada", + "SEND": "Envia", + "CREATE": "Afegeix una nota", + "TWEET": "Tuit" + }, + "VISIBLE_TO_AGENTS": "Nota privada: Només és visible per tu i el vostre equip", + "CHANGE_STATUS": "Estat de la conversa canviat", + "CHANGE_AGENT": "Assignació de la conversa canviat" + } +} diff --git a/app/javascript/dashboard/i18n/locale/ca/generalSettings.json b/app/javascript/dashboard/i18n/locale/ca/generalSettings.json new file mode 100644 index 000000000..520f28928 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ca/generalSettings.json @@ -0,0 +1,27 @@ +{ + "GENERAL_SETTINGS": { + "TITLE": "Configuració del compte", + "SUBMIT": "Actualització de la configuració", + "UPDATE": { + "ERROR": "No s'ha pogut actualitzar la configuració, torna-ho a provar!", + "SUCCESS": "La configuració del compte s'ha actualitzat correctament" + }, + "FORM": { + "ERROR": "Corregiu els errors del formulari", + "GENERAL_SECTION": { + "TITLE": "Configuració general", + "NOTE": "" + }, + "NAME": { + "LABEL": "Nom del compte", + "PLACEHOLDER": "El nom del vostre compte", + "ERROR": "Introduïu un nom de compte vàlid" + }, + "LANGUAGE": { + "LABEL": "Idioma del lloc (Beta)", + "PLACEHOLDER": "El nom del vostre compte", + "ERROR": "" + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json new file mode 100644 index 000000000..5059cd491 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json @@ -0,0 +1,138 @@ +{ + "INBOX_MGMT": { + "HEADER": "Safates d'entrada", + "SIDEBAR_TXT": "

Safata d'entrada

Quan connecteu un lloc web o una pàgina de facebook a Chatwoot, es diu Safata d'entrada. Teniu bústies d'entrada il·limitades al vostre compte de Chatwoot.

Feu click a Afegir safata d'entrada per connectar-vos a un lloc web o a una pàgina de Facebook.

Al Tauler de control, pots veure totes les converses de totes les teves safates d'entrada en un sol lloc i respondre-les a la pestanya `Converses`.

També pots veure converses específiques per a una safata d’entrada si feu clic al nom de la safata d'entrada, al panell esquerre de la taula.

", + "LIST": { + "404": "No hi ha cap safata d'entrada connectat a aquest compte." + }, + "CREATE_FLOW": [ + { "title": "Triar canal", "route": "settings_inbox_new", "body": "Trieu el proveïdor que vulgueu integrar amb Chatwoot." }, + { "title": "Crear safata d'entrada", "route": "settings_inboxes_page_channel", "body": "Autentiqueu el vostre compte i creeu una safata d'entrada." }, + { "title": "Afegir agents", "route": "settings_inboxes_add_agents", "body": "Afegir agents a la safata d'entrada creada." }, + { "title": "Voila!", "route": "settings_inbox_finish", "body": "Ja estàs preparat!" } + ], + "ADD": { + "FB": { + "HELP": "PD: Al iniciar la sessió, només accediu als missatges de la vostra pàgina. Chatwoot mai no podrà accedir als vostres missatges privats." + }, + "TWITTER": { + "HELP": "Per afegir el teu perfil de Twitter com a canal, has d'autentificar el vostre perfil de Twitter fent clic a 'Inicieu la sessió amb Twitter' " + }, + "WEBSITE_CHANNEL": { + "TITLE": "Canal Web", + "DESC": "Crea un canal per al vostre lloc web i comença a donar suport als vostres clients mitjançant el teu widget del lloc web.", + "LOADING_MESSAGE": "S'està creant el canal de suport web", + "CHANNEL_NAME": { + "LABEL": "Nom del lloc web", + "PLACEHOLDER": "Introduïu el nom del vostre lloc web (per exemple, Acme Inc)" + }, + "CHANNEL_DOMAIN": { + "LABEL": "Domini del lloc web", + "PLACEHOLDER": "Introduïu el vostre domini de lloc web (pe: acme.com)" + }, + "WIDGET_COLOR": { + "LABEL": "Color del Widget", + "PLACEHOLDER": "Actualitza el color del widget" + }, + "SUBMIT_BUTTON":"Crea la safata entrada" + }, + "TWILIO": { + "TITLE": "Canal Twilio SMS", + "DESC": "Integra Twilio i comença a donar suport als teus clients mitjançant SMS.", + "ACCOUNT_SID": { + "LABEL": "Compte SID", + "PLACEHOLDER": "Introduïu el vostre compte Twilio SID", + "ERROR": "Aquest camp és obligatori" + }, + "AUTH_TOKEN": { + "LABEL": "Auth Token", + "PLACEHOLDER": "Introduïu el vostre Twilio Auth Token", + "ERROR": "Aquest camp és obligatori" + }, + "CHANNEL_NAME": { + "LABEL": "Nom del canal", + "PLACEHOLDER": "Introduïu el nom del canal", + "ERROR": "Aquest camp és obligatori" + }, + "PHONE_NUMBER": { + "LABEL": "Número de telèfon", + "PLACEHOLDER": "Introduïu el número de telèfon des del qual serà enviat el missatge.", + "ERROR": "Introduïu un valor vàlid. El número de telèfon hauria de començar amb el signe `+`." + }, + "SUBMIT_BUTTON": "Crear un canal Twilio", + "API": { + "ERROR_MESSAGE": "No hem pogut autenticar les credencials de Twilio, prova de nou" + } + }, + "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" + }, + "AGENTS": { + "TITLE": "Agents", + "DESC": "Aquí podeu afegir agents per gestionar la vostra safata d'entrada de nova creació. Només aquests agents seleccionats tindran accés a la vostra safata d'entrada. Els agents que no formen part d'aquesta safata d'entrada no podran veure ni respondre als missatges d'aquesta safata d'entrada quan s’inicien.
PD: Com a administrador, si necessiteu accés a totes les bústies d’entrada, heu d’afegir-vos com a agent a totes les bústies de sortida que creeu." + }, + "DETAILS": { + "TITLE": "Detalls de la safata d'entrada", + "DESC": "Des del següent menú desplegable, seleccioneu la pàgina de Facebook que voleu connectar a Chatwoot. També podeu donar un nom personalitzat a la safata d'entrada per a una millor identificació." + }, + "FINISH":{ + "TITLE": "L'has clavat!", + "DESC": "Heu acabat d'integrar la vostra pàgina de Facebook amb Chatwoot. La propera vegada que un client escrigui un missatge a la vostra pàgina, la conversa apareixerà automàticament a la safata d'entrada.
També us proporcionem un script del widget que podeu afegir fàcilment al vostre web. Una vegada que estigui operatiu al vostre web, els clients us podran enviar missatges des del web sense l’ajuda de cap eina externa i la conversa apareixerà aquí mateix, a Chatwoot.
Genial, eh? Bé, segur que intentem ser-ho :)" + } + }, + "DETAILS": { + "LOADING_FB": "S'està autenticant amb Facebook...", + "ERROR_FB_AUTH": "Alguna cosa ha anat malament, actualitza la pàgina ...", + "CREATING_CHANNEL": "S'està creant la safata d'entrada...", + "TITLE": "Configura els detalls de la safata d'entrada", + "DESC": "" + }, + "AGENTS": { + "BUTTON_TEXT": "Afegir agents", + "ADD_AGENTS": "S'estan afegint agents a la vostre safata d'entrada..." + }, + "FINISH": { + "TITLE": "La vostra safata d'entrada està a punt!", + "MESSAGE": "Ja podeu interactuar amb els vostres clients a través del vostre canal nou. Feliç suport", + "BUTTON_TEXT": "Porta'm allà", + "WEBSITE_SUCCESS": "Heu finalitzat amb èxit la creació d'un canal web. Copieu el codi que es mostra a continuació i enganxeu-lo al lloc web. La propera vegada que un client utilitzi el xat en directe, la conversa apareixerà automàticament a la safata d'entrada." + }, + "REAUTH": "Reautoritza", + "VIEW": "Veure", + "EDIT": { + "API": { + "SUCCESS_MESSAGE": "El color del widget s'ha actualitzat correctament", + "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Assignació automàtica actualitzada correctament", + "ERROR_MESSAGE": "No s'ha pogut actualitzar el color del widget. Torneu-ho a provar més endavant." + }, + "AUTO_ASSIGNMENT": { + "ENABLED": "Habilita", + "DISABLED": "Inhabilita" + } + }, + "DELETE": { + "BUTTON_TEXT": "Suprimeix", + "CONFIRM": { + "TITLE": "Confirma esborrat", + "MESSAGE": "N'estas segur? ", + "YES": "Si, esborra ", + "NO": "No, manten-la " + }, + "API": { + "SUCCESS_MESSAGE": "S'ha suprimit la safata d'entrada correctament", + "ERROR_MESSAGE": "No s'ha pogut eliminar la safata d'entrada. Torneu-ho a provar més endavant." + } + }, + "SETTINGS": "Configuracions", + "SETTINGS_POPUP": { + "MESSENGER_HEADING": "Script del missatger", + "MESSENGER_SUB_HEAD": "Col·loca aquest botó dins de l'etiqueta body", + "INBOX_AGENTS": "Agents", + "INBOX_AGENTS_SUB_TEXT": "Afegir o eliminar agents d'aquesta safata d'entrada", + "UPDATE": "Actualitza", + "AUTO_ASSIGNMENT": "Activa l'assignació automàtica", + "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/index.js b/app/javascript/dashboard/i18n/locale/ca/index.js new file mode 100644 index 000000000..351906dd9 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ca/index.js @@ -0,0 +1,34 @@ +/* eslint-disable */ +import { default as _agentMgmt } from './agentMgmt.json'; +import { default as _billing } from './billing.json'; +import { default as _cannedMgmt } from './cannedMgmt.json'; +import { default as _chatlist } from './chatlist.json'; +import { default as _contact } from './contact.json'; +import { default as _conversation } from './conversation.json'; +import { default as _inboxMgmt } from './inboxMgmt.json'; +import { default as _login } from './login.json'; +import { default as _report } from './report.json'; +import { default as _resetPassword } from './resetPassword.json'; +import { default as _setNewPassword } from './setNewPassword.json'; +import { default as _settings } from './settings.json'; +import { default as _signup } from './signup.json'; +import { default as _integrations } from './integrations.json'; +import { default as _generalSettings } from './generalSettings.json'; + +export default { + ..._agentMgmt, + ..._billing, + ..._cannedMgmt, + ..._chatlist, + ..._contact, + ..._conversation, + ..._inboxMgmt, + ..._login, + ..._report, + ..._resetPassword, + ..._setNewPassword, + ..._settings, + ..._signup, + ..._integrations, + ..._generalSettings, +}; diff --git a/app/javascript/dashboard/i18n/locale/ca/integrations.json b/app/javascript/dashboard/i18n/locale/ca/integrations.json new file mode 100644 index 000000000..684681c3a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ca/integrations.json @@ -0,0 +1,54 @@ +{ + "INTEGRATION_SETTINGS": { + "HEADER": "Integracions", + "WEBHOOK": { + "TITLE": "Webhook", + "CONFIGURE": "Configura", + "HEADER": "Configuració Webhook", + "HEADER_BTN_TXT": "Afegeix un nou webhook", + "INTEGRATION_TXT": "Els esdeveniments de Webhook us proporcionen informació en temps real sobre el que passa al vostre compte de Chatwoot. Podeu utilitzar els webhooks per comunicar els esdeveniments a les vostres aplicacions preferides com Slack o Github. Feu clic a Configura per configurar els enllaços web.", + "LOADING": "S'estan recollint els webhooks adjunts", + "SEARCH_404": "No hi ha articles que coincideixin amb aquesta consulta", + "SIDEBAR_TXT": "

Webhooks

Els webhooks són callbacks HTTP que es poden definir per a cada compte. Es produeixen per esdeveniments com la creació de missatges a Chatwoot. Podeu crear més d'un webhook per a aquest compte.

Per crear un webhook, feu clic al botó Afegir nou webhook . També podeu eliminar qualsevol webhook existent fent clic al botó Elimina.

", + "LIST": { + "404": "No hi ha cap webhooks configurat per a aquest compte.", + "TITLE": "Gestiona els webhooks", + "DESC": "Els webhooks són plantilles de resposta predefinides que es poden utilitzar per enviar ràpidament respostes a una conversa.", + "TABLE_HEADER": [ + "Punt final del webhook", + "Accions" + ] + }, + "ADD": { + "CANCEL": "Cancel·la", + "TITLE": "Afegir un nou webhook", + "DESC": "Els esdeveniments de Webhook us proporcionen informació en temps real sobre el que passa al vostre compte de Chatwoot. Introduïu una URL vàlid per configurar un callback.", + "FORM": { + "END_POINT": { + "LABEL": "URL del webhook", + "PLACEHOLDER": "Exemple: https://example/api/webhook", + "ERROR": "Introduïu una URL vàlid" + }, + "SUBMIT": "Crear webhook" + }, + "API": { + "SUCCESS_MESSAGE": "S'ha afegit el Webhook correctament", + "ERROR_MESSAGE": "No s'ha pogut connectar amb el servidor Woot. Torna-ho a provar més endavant" + } + }, + "DELETE": { + "BUTTON_TEXT": "Suprimeix", + "API": { + "SUCCESS_MESSAGE": "S'ha esborrat el Webhook correctament", + "ERROR_MESSAGE": "No s'ha pogut connectar amb el servidor Woot. Torna-ho a provar més endavant" + }, + "CONFIRM": { + "TITLE": "Confirma l'esborrat", + "MESSAGE": "N'estàs segur ", + "YES": "Si, esborra ", + "NO": "No, mantén-la " + } + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/ca/login.json b/app/javascript/dashboard/i18n/locale/ca/login.json new file mode 100644 index 000000000..3c62ee837 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ca/login.json @@ -0,0 +1,21 @@ +{ + "LOGIN": { + "TITLE": "Entra a Chatwoot", + "EMAIL": { + "LABEL": "Correu electrònic", + "PLACEHOLDER": "Correu electrònic p.e.: someone@exemple.com" + }, + "PASSWORD": { + "LABEL": "Contrasenya", + "PLACEHOLDER": "Contrasenya" + }, + "API": { + "SUCCESS_MESSAGE": "Iniciada la sessió amb èxit", + "ERROR_MESSAGE": "No s'ha pogut connectar amb el servidor Woot. Torna-ho a provar més endavant", + "UNAUTH": "Nom d'usuari / contrasenya incorrecte. Torna-ho a provar-ho" + }, + "FORGOT_PASSWORD": "Has oblidat la contrasenya?", + "CREATE_NEW_ACCOUNT": "Crear un nou compte", + "SUBMIT": "Inicia la sessió" + } +} diff --git a/app/javascript/dashboard/i18n/locale/ca/report.json b/app/javascript/dashboard/i18n/locale/ca/report.json new file mode 100644 index 000000000..2ed8f5211 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ca/report.json @@ -0,0 +1,49 @@ +{ + "REPORT": { + "HEADER": "Informes", + "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.", + "METRICS": [ + { + "NAME": "Converses", + "KEY": "conversations_count", + "DESC": "( Total )" + }, + { + "NAME": "Missatges d'entrada", + "KEY": "incoming_messages_count", + "DESC": "( Total )" + }, + { + "NAME": "Missatges de sortida", + "KEY": "outgoing_messages_count", + "DESC": "( Total )" + }, + { + "NAME": "Primer temps de resposta", + "KEY": "avg_first_response_time", + "DESC": "( Promig )" + }, + { + "NAME": "Temps de resolució", + "KEY": "avg_resolution_time", + "DESC": "( Promig )" + }, + { + "NAME": "Total de resolucions", + "KEY": "resolutions_count", + "DESC": "( Total )" + } + ], + "DATE_RANGE": [ + { + "id": 0, + "name": "Últims 7 dies" + }, + { + "id": 1, + "name": "Últims 30 dies" + } + ] + } +} diff --git a/app/javascript/dashboard/i18n/locale/ca/resetPassword.json b/app/javascript/dashboard/i18n/locale/ca/resetPassword.json new file mode 100644 index 000000000..d9f15ba8c --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ca/resetPassword.json @@ -0,0 +1,15 @@ +{ + "RESET_PASSWORD": { + "TITLE": "Reinicialitza la contrasenya", + "EMAIL": { + "LABEL": "Correu electrònic", + "PLACEHOLDER": "Introduïu el correu electrònic", + "ERROR": "Introduïu un correu electrònic vàlid" + }, + "API": { + "SUCCESS_MESSAGE": "L’enllaç de reinicialització de la contrasenya s’ha enviat al vostre correu electrònic", + "ERROR_MESSAGE": "No s'ha pogut connectar amb el servidor Woot. Torna-ho a provar més endavant" + }, + "SUBMIT": "Envia" + } +} diff --git a/app/javascript/dashboard/i18n/locale/ca/setNewPassword.json b/app/javascript/dashboard/i18n/locale/ca/setNewPassword.json new file mode 100644 index 000000000..7d1ce9ac8 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ca/setNewPassword.json @@ -0,0 +1,20 @@ +{ + "SET_NEW_PASSWORD": { + "TITLE": "Estableix la nova contrasenya", + "PASSWORD": { + "LABEL": "Contrasenya", + "PLACEHOLDER": "Contrasenya", + "ERROR": "Contrasenya és massa curta" + }, + "CONFIRM_PASSWORD": { + "LABEL": "Confirma la contrasenya", + "PLACEHOLDER": "Confirma la contrasenya", + "ERROR": "La contrasenya no coindeix" + }, + "API": { + "SUCCESS_MESSAGE": "S'ha canviat la contrasenya correctament", + "ERROR_MESSAGE": "No s'ha pogut connectar amb Woot Server. Torneu-ho a provar més endavant" + }, + "SUBMIT": "Envia" + } +} diff --git a/app/javascript/dashboard/i18n/locale/ca/settings.json b/app/javascript/dashboard/i18n/locale/ca/settings.json new file mode 100644 index 000000000..a36b33447 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ca/settings.json @@ -0,0 +1,94 @@ +{ + "PROFILE_SETTINGS": { + "LINK": "Configuració del Perfil", + "TITLE": "Configuració del Perfil", + "BTN_TEXT": "Actualització del Perfil", + "AFTER_EMAIL_CHANGED": "El vostre perfil s'ha actualitzat correctament. Torneu a iniciar la sessió ja que les vostres credencials d'inici de sessió han canviat", + "FORM": { + "AVATAR": "Imatge del Perfil", + "ERROR": "Corregiu els errors del formulari", + "REMOVE_IMAGE": "Suprimeix", + "UPLOAD_IMAGE": "Puja imatge", + "UPDATE_IMAGE": "Puja imatge", + "PROFILE_SECTION": { + "TITLE": "Perfil", + "NOTE": "La vostra adreça de correu electrònic és la vostra identitat i s'utilitza per iniciar la sessió." + }, + "PASSWORD_SECTION": { + "TITLE": "Contrasenya", + "NOTE": "L'actualització de la contrasenya restableix els vostres inicis de sessió en múltiples dispositius." + }, + "ACCESS_TOKEN": { + "TITLE": "Token d'accés", + "NOTE": "Aquest token es pot utilitzar si creeu una integració basada en l'API" + }, + "EMAIL_NOTIFICATIONS_SECTION": { + "TITLE": "Notificacions per correu electrònic", + "NOTE": "Actualitza aqui les preferències de les notificacions per correu electrònic", + "CONVERSATION_ASSIGNMENT": "Envieu notificacions per correu electrònic quan se m’assigni una conversa", + "CONVERSATION_CREATION": "Envieu notificacions per correu electrònic quan es crea una nova conversa", + "UPDATE_SUCCESS": "Les preferències de notificació per correu electrònic s’han actualitzat correctament", + "UPDATE_ERROR": "S'ha produït un error en actualitzar les preferències. Torneu-ho a provar" + }, + "PROFILE_IMAGE": { + "LABEL": "Imatge del Perfil" + }, + "NAME": { + "LABEL": "El teu nom", + "ERROR": "Introduïu un nom vàlid", + "PLACEHOLDER": "Introdueix el teu nom, serà mostrat a les converses" + }, + "EMAIL": { + "LABEL": "La teva adreça de correu electrònic", + "ERROR": "Introduïu una adreça de correu electrònic vàlida", + "PLACEHOLDER": "Introduïu la vostra adreça de correu electrònic, que es mostrarà a les converses" + }, + "PASSWORD": { + "LABEL": "Contrasenya", + "ERROR": "Introduïu una contrasenya d'una longitud de 6 o més", + "PLACEHOLDER": "Introduïu una nova contrasenya" + }, + "PASSWORD_CONFIRMATION": { + "LABEL": "Confirmació de la nova contrasenya", + "ERROR": "Confirmeu que les contrasenyes coincideixin", + "PLACEHOLDER": "Torneu a introduir la vostra contrasenya" + } + } + }, + "SIDEBAR_ITEMS": { + "PROFILE_SETTINGS": "Configuració del Perfil", + "LOGOUT": "Sortir" + }, + "APP_GLOBAL": { + "TRIAL_MESSAGE": "dies de prova restants.", + "TRAIL_BUTTON": "Comprar ara" + }, + "COMPONENTS": { + "CODE": { + "BUTTON_TEXT": "Copiar", + "COPY_SUCCESSFUL": "Codi copiat al porta-retalls correctament" + }, + "FILE_BUBBLE": { + "DOWNLOAD": "Descarrega", + "UPLOADING": "S'està pujant..." + } + }, + "CONFIRM_EMAIL": "S'està verificant...", + "SETTINGS": { + "INBOXES": { + "NEW_INBOX": "Afegeix una safata d'entrada" + } + }, + "SIDEBAR": { + "CONVERSATIONS": "Conversacions", + "REPORTS": "Informes", + "SETTINGS": "Configuració", + "HOME": "Inici", + "AGENTS": "Agents", + "INBOXES": "Safates d'entrada", + "CANNED_RESPONSES": "Respostes Predeterminades", + "BILLING": "Facturació", + "INTEGRATIONS": "Integracions", + "ACCOUNT_SETTINGS": "Configuració del compte" + } +} diff --git a/app/javascript/dashboard/i18n/locale/ca/signup.json b/app/javascript/dashboard/i18n/locale/ca/signup.json new file mode 100644 index 000000000..aa459d999 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ca/signup.json @@ -0,0 +1,32 @@ +{ + "REGISTER": { + "TRY_WOOT": "Registra un compte", + "TITLE": "Registre", + "TERMS_ACCEPT": "En registrar-vos, esteu d’acord amb el nostre T & C i Polítiques de Privadesa", + "ACCOUNT_NAME": { + "LABEL": "Nom del compte", + "PLACEHOLDER": "Wayne Enterprises", + "ERROR": "El nom del compte és massa curt" + }, + "EMAIL": { + "LABEL": "Correu electrònic", + "PLACEHOLDER": "bruce@wayne.enterprises", + "ERROR": "El correu electrònic no és correcte" + }, + "PASSWORD": { + "LABEL": "Contrasenya", + "PLACEHOLDER": "Contrasenya", + "ERROR": "La contrasenya és massa curta" + }, + "CONFIRM_PASSWORD": { + "LABEL": "Confirma la contrasenya", + "PLACEHOLDER": "Confirma la contrasenya", + "ERROR": "Les contrasenyes no coincideixen" + }, + "API": { + "SUCCESS_MESSAGE": "Registrat correctament", + "ERROR_MESSAGE": "No s'ha pogut connectar amb el servidor Woot. Torna-ho a provar més endavant" + }, + "SUBMIT": "Envia" + } +} diff --git a/app/javascript/dashboard/i18n/locale/ca/webhooks.json b/app/javascript/dashboard/i18n/locale/ca/webhooks.json new file mode 100644 index 000000000..a3ebed6c3 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ca/webhooks.json @@ -0,0 +1,5 @@ +{ + "WEBHOOKS_SETTINGS": { + "HEADER": "Paràmetres Webhook" + } +} diff --git a/app/javascript/dashboard/i18n/locale/cs/agentMgmt.json b/app/javascript/dashboard/i18n/locale/cs/agentMgmt.json new file mode 100644 index 000000000..2d2e7bc30 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/cs/agentMgmt.json @@ -0,0 +1,101 @@ +{ + "AGENT_MGMT": { + "HEADER": "Agenti", + "HEADER_BTN_TXT": "Přidat agenta", + "LOADING": "Načítání seznamu agentů", + "SIDEBAR_TXT": "

Agenti

Agent je členem vašeho týmu zákaznické podpory.

Agenti budou moci prohlížet a odpovídat na zprávy od uživatelů. Seznam zobrazuje všechny agenty aktuálně na vašem účtu.

Pro přidání nového agenta klikněte na Přidat agenta . Přidaný agent obdrží e-mail s potvrzovacím odkazem pro aktivaci jejich účtu, poté bude mít přístup k Chatwoot a bude reagovat na zprávy.

Přístup k funkcím Chatwootu je založen na následujících rolích.

Agent - Agent s touto rolí může přistupovat pouze k doručeným zprávám, zprávám a konverzacím. Mohou přiřadit konverzace jiným agentům nebo sobě a řešit konverzace.

Administrátor - Správce bude mít přístup ke všem funkcím Chatwoot povoleným pro váš účet, včetně nastavení a fakturace, spolu se všemi právy normálních agentů.

", + "AGENT_TYPES": [ + { + "name": "administrator", + "label": "Administrátor" + }, + { + "name": "agent", + "label": "Agent" + } + ], + "LIST": { + "404": "K tomuto účtu nejsou přiřazeni žádní agenti", + "TITLE": "Spravujte agenty ve vašem týmu", + "DESC": "Můžete přidat/odebrat agenty do vašeho týmu.", + "NAME": "Název", + "EMAIL": "E-MAIL", + "STATUS": "Stav", + "ACTIONS": "Akce", + "VERIFIED": "Ověřeno", + "VERIFICATION_PENDING": "Probíhá ověření" + }, + "ADD": { + "TITLE": "Přidat agenta do vašeho týmu", + "DESC": "Můžete přidat lidi, kteří budou schopni zvládnout podporu pro vaše schránky.", + "FORM": { + "NAME": { + "LABEL": "Název agenta", + "PLACEHOLDER": "Zadejte název agenta" + }, + "AGENT_TYPE": { + "LABEL": "Typ agenta", + "PLACEHOLDER": "Vyberte typ", + "ERROR": "Je vyžadován typ agenta" + }, + "EMAIL": { + "LABEL": "E-mailová adresa", + "PLACEHOLDER": "Zadejte prosím e-mailovou adresu agenta" + }, + "SUBMIT": "Přidat agenta" + }, + "API": { + "SUCCESS_MESSAGE": "Agent byl úspěšně přidán", + "EXIST_MESSAGE": "E-mail agenta je již používán, zkuste prosím jinou e-mailovou adresu", + "ERROR_MESSAGE": "Nelze se připojit k Woot serveru, opakujte akci později" + } + }, + "DELETE": { + "BUTTON_TEXT": "Vymazat", + "API": { + "SUCCESS_MESSAGE": "Agent byl úspěšně odstraněn", + "ERROR_MESSAGE": "Nelze se připojit k Woot serveru, opakujte akci později" + }, + "CONFIRM": { + "TITLE": "Potvrdit odstranění", + "MESSAGE": "Opravdu chcete odstranit ", + "YES": "Ano, odstranit ", + "NO": "Ne, ponechat " + } + }, + "EDIT": { + "TITLE": "Upravit agenta", + "FORM": { + "NAME": { + "LABEL": "Název agenta", + "PLACEHOLDER": "Zadejte název agenta" + }, + "AGENT_TYPE": { + "LABEL": "Typ agenta", + "PLACEHOLDER": "Vyberte typ", + "ERROR": "Je vyžadován typ agenta" + }, + "EMAIL": { + "LABEL": "E-mailová adresa", + "PLACEHOLDER": "Zadejte prosím e-mailovou adresu agenta" + }, + "SUBMIT": "Upravit agenta" + }, + "BUTTON_TEXT": "Upravit", + "CANCEL_BUTTON_TEXT": "Zrušit", + "API": { + "SUCCESS_MESSAGE": "Agent úspěšně aktualizován", + "ERROR_MESSAGE": "Nelze se připojit k Woot serveru, opakujte akci později" + }, + "PASSWORD_RESET": { + "ADMIN_RESET_BUTTON": "Obnovit heslo", + "ADMIN_SUCCESS_MESSAGE": "E-mail s instrukcemi pro obnovení hesla byl odeslán agentovi", + "SUCCESS_MESSAGE": "Heslo agenta bylo úspěšně obnoveno", + "ERROR_MESSAGE": "Nelze se připojit k Woot serveru, opakujte akci později" + } + }, + "SEARCH": { + "NO_RESULTS": "Nebyli nalezeni žádní agenti." + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/cs/billing.json b/app/javascript/dashboard/i18n/locale/cs/billing.json new file mode 100644 index 000000000..cf6469e88 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/cs/billing.json @@ -0,0 +1,19 @@ +{ + "BILLING": { + "HEADER": "Fakturace", + "LOADING": "Načítání předplatného", + "ACCOUNT_STATE": "Stav účtu", + "AGENT_COUNT": "Počet agentů", + "PER_AGENT_COST": "Náklady na jednoho agenta", + "TOTAL_COST": "Celkové náklady", + "BUTTON": { + "ADD": "Přidat způsob platby", + "EDIT": "Metoda platby EDIT" + }, + "TRIAL": { + "TITLE": "Vaše zkušební období skončilo", + "MESSAGE": "Přidejte platební metodu a pokračujte v používání Chatwoot." + }, + "ACCOUNT_LOCKED": "Váš účet není momentálně k dispozici.
Obraťte se na správce pro opětovné aktivaci." + } +} diff --git a/app/javascript/dashboard/i18n/locale/cs/cannedMgmt.json b/app/javascript/dashboard/i18n/locale/cs/cannedMgmt.json new file mode 100644 index 000000000..1a7d20f32 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/cs/cannedMgmt.json @@ -0,0 +1,74 @@ +{ + "CANNED_MGMT": { + "HEADER": "Konzervované odpovědi", + "HEADER_BTN_TXT": "Přidat konzervovanou odpověď", + "LOADING": "Načítání Konzervovaných odpovědí", + "SEARCH_404": "Neexistují žádné položky odpovídající tomuto dotazu", + "SIDEBAR_TXT": "

Canned Response

Canned Response are saved šablony odpovědí, které mohou být použity pro rychlé odeslání odpovědi do konverzace .

Pro vytvoření Canned Response klikněte na Přidat Canned Response. Můžete také upravit nebo odstranit existující Canned Response kliknutím na tlačítko Upravit nebo vymazat

Rušené odpovědi jsou použity s pomocí Krátké kódy. Pracovníci mohou během chatu získat přístup k uloženým odpovědím napsaním '/' následovaným krátkým kódem.

", + "LIST": { + "404": "V tomto účtu nejsou k dispozici žádné konzervované odpovědi.", + "TITLE": "Spravovat konzervované odpovědi", + "DESC": "Konzervované odpovědi jsou předdefinované šablony odpovědí, které lze použít k rychlému zasílání odpovědí na tikety.", + "TABLE_HEADER": [ + "Krátký kód", + "Obsah", + "Akce" + ] + }, + "ADD": { + "TITLE": "Přidat konzervovanou odpověď", + "DESC": "Konzervované odpovědi jsou uložené šablony odpovědí, které lze použít pro rychlé odeslání odpovědi do konverzace .", + "FORM": { + "SHORT_CODE": { + "LABEL": "Krátký kód", + "PLACEHOLDER": "Zadejte zkratkový kód", + "ERROR": "Krátký kód je povinný" + }, + "CONTENT": { + "LABEL": "Obsah", + "PLACEHOLDER": "Zadejte prosím obsah", + "ERROR": "Je vyžadován obsah" + }, + "SUBMIT": "Odeslat" + }, + "API": { + "SUCCESS_MESSAGE": "Odpověď v konzervě byla úspěšně přidána", + "ERROR_MESSAGE": "Nelze se připojit k Woot serveru, opakujte akci později" + } + }, + "EDIT": { + "TITLE": "Upravit konzervovanou odpověď", + "FORM": { + "SHORT_CODE": { + "LABEL": "Krátký kód", + "PLACEHOLDER": "Zadejte zkratkový kód", + "ERROR": "Krátký kód je povinný" + }, + "CONTENT": { + "LABEL": "Obsah", + "PLACEHOLDER": "Zadejte prosím obsah", + "ERROR": "Je vyžadován obsah" + }, + "SUBMIT": "Odeslat" + }, + "BUTTON_TEXT": "Upravit", + "API": { + "SUCCESS_MESSAGE": "Reakce v konzervě byla úspěšně aktualizována", + "ERROR_MESSAGE": "Nelze se připojit k Woot serveru, opakujte akci později" + } + }, + "DELETE": { + "BUTTON_TEXT": "Vymazat", + "API": { + "SUCCESS_MESSAGE": "Odpověď v konzervě byla úspěšně odstraněna", + "ERROR_MESSAGE": "Nelze se připojit k Woot serveru, opakujte akci později" + }, + "CONFIRM": { + "TITLE": "Potvrdit odstranění", + "MESSAGE": "Opravdu chcete odstranit ", + "YES": "Ano, odstranit ", + "NO": "Ne, ponechat " + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/cs/chatlist.json b/app/javascript/dashboard/i18n/locale/cs/chatlist.json new file mode 100644 index 000000000..61f8392e0 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/cs/chatlist.json @@ -0,0 +1,77 @@ +{ + "CHAT_LIST": { + "LOADING": "Načítání konverzací", + "LOAD_MORE_CONVERSATIONS": "Načíst více konverzací", + "EOF": "Všechny konverzace načteny 🎉", + "LIST": { + "404": "V této skupině nejsou žádné aktivní konverzace." + }, + "TAB_HEADING": "Konverzace", + "SEARCH": { + "INPUT": "Hledat lidi, chaty, Uložené odpovědi .." + }, + "STATUS_TABS": [ + { + "NAME": "Otevřít", + "KEY": "openCount" + }, + { + "NAME": "Vyřešeno", + "KEY": "allConvCount" + } + ], + "ASSIGNEE_TYPE_TABS": [ + { + "NAME": "Důl", + "KEY": "me", + "COUNT_KEY": "mineCount" + }, + { + "NAME": "Nepřiřazeno", + "KEY": "unassigned", + "COUNT_KEY": "unAssignedCount" + }, + { + "NAME": "Vše", + "KEY": "all", + "COUNT_KEY": "allCount" + } + ], + "CHAT_STATUS_ITEMS": [ + { + "TEXT": "Otevřít", + "VALUE": "open" + }, + { + "TEXT": "Vyřešeno", + "VALUE": "resolved" + } + ], + "ATTACHMENTS": { + "image": { + "ICON": "ion-image", + "CONTENT": "Zpráva obrázku" + }, + "audio": { + "ICON": "ion-volume-high", + "CONTENT": "Zvuková zpráva" + }, + "video": { + "ICON": "ion-ios-videocam", + "CONTENT": "Video zpráva" + }, + "file": { + "ICON": "ion-document", + "CONTENT": "Přílohu souboru" + }, + "location": { + "ICON": "ion-ios-location", + "CONTENT": "Poloha" + }, + "fallback": { + "ICON": "ion-link", + "CONTENT": "sdílel URL" + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/cs/contact.json b/app/javascript/dashboard/i18n/locale/cs/contact.json new file mode 100644 index 000000000..41616b1c5 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/cs/contact.json @@ -0,0 +1,20 @@ +{ + "CONTACT_PANEL": { + "CONVERSATION_TITLE": "Podrobnosti konverzace", + "BROWSER": "Prohlížeč", + "OS": "Operační systém", + "INITIATED_FROM": "Zahájeno od", + "INITIATED_AT": "Zahájeno v", + "CONVERSATIONS": { + "NO_RECORDS_FOUND": "K tomuto kontaktu nejsou přiřazeny žádné předchozí konverzace.", + "TITLE": "Předchozí konverzace" + }, + "LABELS": { + "TITLE": "Štítky konverzace", + "UPDATE_BUTTON": "Aktualizovat štítky", + "UPDATE_ERROR": "Nelze aktualizovat štítky, zkuste to znovu.", + "TAG_PLACEHOLDER": "Přidat nový štítek", + "PLACEHOLDER": "Vyhledat nebo přidat štítek" + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/cs/conversation.json b/app/javascript/dashboard/i18n/locale/cs/conversation.json new file mode 100644 index 000000000..71c08cfa5 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/cs/conversation.json @@ -0,0 +1,35 @@ +{ + "CONVERSATION": { + "404": "Vyberte prosím konverzaci z levého panelu", + "NO_MESSAGE_1": "Ale ne! Vypadá to, že ve vaší schránce nejsou žádné zprávy od zákazníků.", + "NO_MESSAGE_2": " pro odeslání zprávy na vaši stránku!", + "NO_INBOX_1": "Hola! Zdá se, že jste ještě nepřidali žádné schránky.", + "NO_INBOX_2": " začít", + "NO_INBOX_AGENT": "Uh Oh! Vypadá to, že nejste součástí žádné schránky. Obraťte se na správce", + "CLICK_HERE": "Klikněte zde", + "LOADING_INBOXES": "Načítání krabic", + "LOADING_CONVERSATIONS": "Načítání konverzací", + "DOWNLOAD": "Stáhnout", + "HEADER": { + "RESOLVE_ACTION": "Vyřešit", + "REOPEN_ACTION": "Znovu otevřít", + "OPEN": "Více", + "CLOSE": "Zavřít", + "DETAILS": "Podrobnosti" + }, + "FOOTER": { + "MSG_INPUT": "Shift + zadejte pro nový řádek. Začněte '/' pro výběr zrušené odpovědi.", + "PRIVATE_MSG_INPUT": "Shift + zadejte pro nový řádek. Toto bude viditelné pouze pro agenty" + }, + "REPLYBOX": { + "REPLY": "Odpověď", + "PRIVATE_NOTE": "Soukromá poznámka", + "SEND": "Poslat", + "CREATE": "Přidat poznámku", + "TWEET": "Tweet" + }, + "VISIBLE_TO_AGENTS": "Soukromá poznámka: Viditelné pouze pro vás a váš tým", + "CHANGE_STATUS": "Stav konverzace byl změněn", + "CHANGE_AGENT": "Konverzace pověřená osoba změněna" + } +} diff --git a/app/javascript/dashboard/i18n/locale/cs/integrations.json b/app/javascript/dashboard/i18n/locale/cs/integrations.json new file mode 100644 index 000000000..750e5b51a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/cs/integrations.json @@ -0,0 +1,54 @@ +{ + "INTEGRATION_SETTINGS": { + "HEADER": "Integrace", + "WEBHOOK": { + "TITLE": "Webový háček", + "CONFIGURE": "Konfigurace", + "HEADER": "Nastavení webhooku", + "HEADER_BTN_TXT": "Přidat nový webový háček", + "INTEGRATION_TXT": "Události webhooku vám poskytují reálné informace o tom, co se děje ve vašem Chatwoot účtu. Můžete využít webové háčky k komunikaci s vašimi oblíbenými aplikacemi, jako je Slack nebo Github. Klepnutím na tlačítko Konfigurace nastavíte své webové háčky.", + "LOADING": "Načítání připojených webhooků", + "SEARCH_404": "Neexistují žádné položky odpovídající tomuto dotazu", + "SIDEBAR_TXT": "

Webové háčky

jsou HTTP zpětné volání, které lze definovat pro každý účet. Jsou spouštěny událostmi, jako je vytváření zpráv v Chatwoot. Můžete vytvořit více než jeden webový háček pro tento účet.

Pro vytvoření webového háčku klikněte na tlačítko Přidat nový webhook . Kliknutím na tlačítko Odstranit můžete také odstranit jakýkoli existující webový háček.

", + "LIST": { + "404": "Pro tento účet nejsou nakonfigurovány žádné webové háčky.", + "TITLE": "Spravovat webové háčky", + "DESC": "Webové háčky jsou předdefinované šablony odpovědí, které mohou být použity k rychlému zasílání odpovědí na tikety.", + "TABLE_HEADER": [ + "Koncový bod webhooku", + "Akce" + ] + }, + "ADD": { + "CANCEL": "Zrušit", + "TITLE": "Přidat nový webový háček", + "DESC": "Události webhooku vám poskytují reálné informace o tom, co se děje ve vašem Chatwoot účtu. Zadejte prosím platnou URL pro nastavení hovoru.", + "FORM": { + "END_POINT": { + "LABEL": "URL webového háčku", + "PLACEHOLDER": "Příklad: https://example/api/webhook", + "ERROR": "Zadejte prosím platnou URL" + }, + "SUBMIT": "Vytvořit webový háček" + }, + "API": { + "SUCCESS_MESSAGE": "Webový háček byl úspěšně přidán", + "ERROR_MESSAGE": "Nelze se připojit k Woot serveru, opakujte akci později" + } + }, + "DELETE": { + "BUTTON_TEXT": "Vymazat", + "API": { + "SUCCESS_MESSAGE": "Webový háček byl úspěšně odstraněn", + "ERROR_MESSAGE": "Nelze se připojit k Woot serveru, opakujte akci později" + }, + "CONFIRM": { + "TITLE": "Potvrdit odstranění", + "MESSAGE": "Opravdu chcete odstranit ", + "YES": "Ano, odstranit ", + "NO": "Ne, ponechat " + } + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/cs/report.json b/app/javascript/dashboard/i18n/locale/cs/report.json new file mode 100644 index 000000000..17b316f92 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/cs/report.json @@ -0,0 +1,49 @@ +{ + "REPORT": { + "HEADER": "Zprávy", + "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.", + "METRICS": [ + { + "NAME": "Konverzace", + "KEY": "conversations_count", + "DESC": "( celkem)" + }, + { + "NAME": "Příchozí zprávy", + "KEY": "incoming_messages_count", + "DESC": "( celkem)" + }, + { + "NAME": "Odchozí zprávy", + "KEY": "outgoing_messages_count", + "DESC": "( celkem)" + }, + { + "NAME": "Čas první odpovědi", + "KEY": "avg_first_response_time", + "DESC": "(Průměrný)" + }, + { + "NAME": "Čas rozlišení", + "KEY": "avg_resolution_time", + "DESC": "(Průměrný)" + }, + { + "NAME": "Počet rozlišení", + "KEY": "resolutions_count", + "DESC": "( celkem)" + } + ], + "DATE_RANGE": [ + { + "id": 0, + "name": "Posledních 7 dní" + }, + { + "id": 1, + "name": "Posledních 30 dní" + } + ] + } +} diff --git a/app/javascript/dashboard/i18n/locale/cs/resetPassword.json b/app/javascript/dashboard/i18n/locale/cs/resetPassword.json new file mode 100644 index 000000000..0348bcbf1 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/cs/resetPassword.json @@ -0,0 +1,15 @@ +{ + "RESET_PASSWORD": { + "TITLE": "Obnovit heslo", + "EMAIL": { + "LABEL": "E-mailová adresa", + "PLACEHOLDER": "Prosím, zadejte svůj e-mail", + "ERROR": "Zadejte prosím platný e-mail" + }, + "API": { + "SUCCESS_MESSAGE": "Odkaz pro obnovení hesla byl odeslán na váš e-mail", + "ERROR_MESSAGE": "Nelze se připojit k Woot serveru, opakujte akci později" + }, + "SUBMIT": "Odeslat" + } +} diff --git a/app/javascript/dashboard/i18n/locale/cs/setNewPassword.json b/app/javascript/dashboard/i18n/locale/cs/setNewPassword.json new file mode 100644 index 000000000..e6de5ca19 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/cs/setNewPassword.json @@ -0,0 +1,20 @@ +{ + "SET_NEW_PASSWORD": { + "TITLE": "Nastavit nové heslo", + "PASSWORD": { + "LABEL": "Heslo", + "PLACEHOLDER": "Heslo", + "ERROR": "Heslo je příliš krátké" + }, + "CONFIRM_PASSWORD": { + "LABEL": "Potvrzení hesla", + "PLACEHOLDER": "Potvrzení hesla", + "ERROR": "Hesla se neshodují" + }, + "API": { + "SUCCESS_MESSAGE": "Heslo bylo úspěšně změněno", + "ERROR_MESSAGE": "Nelze se připojit k Woot serveru, opakujte akci později" + }, + "SUBMIT": "Odeslat" + } +} diff --git a/app/javascript/dashboard/i18n/locale/cs/signup.json b/app/javascript/dashboard/i18n/locale/cs/signup.json new file mode 100644 index 000000000..e4c80443b --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/cs/signup.json @@ -0,0 +1,32 @@ +{ + "REGISTER": { + "TRY_WOOT": "Registrovat účet", + "TITLE": "Registrovat se", + "TERMS_ACCEPT": "Registrací souhlasíte s našimi T & C a Zásadami ochrany osobních údajů", + "ACCOUNT_NAME": { + "LABEL": "Název účtu", + "PLACEHOLDER": "Wayne podniky", + "ERROR": "Název účtu je příliš krátký" + }, + "EMAIL": { + "LABEL": "E-mailová adresa", + "PLACEHOLDER": "bruce@wayne.enterprises", + "ERROR": "E-mail je neplatný" + }, + "PASSWORD": { + "LABEL": "Heslo", + "PLACEHOLDER": "Heslo", + "ERROR": "Heslo je příliš krátké" + }, + "CONFIRM_PASSWORD": { + "LABEL": "Potvrzení hesla", + "PLACEHOLDER": "Potvrzení hesla", + "ERROR": "Heslo se neshoduje" + }, + "API": { + "SUCCESS_MESSAGE": "Registrace byla úspěšná", + "ERROR_MESSAGE": "Nelze se připojit k Woot serveru, opakujte akci později" + }, + "SUBMIT": "Odeslat" + } +} diff --git a/app/javascript/dashboard/i18n/locale/cs/webhooks.json b/app/javascript/dashboard/i18n/locale/cs/webhooks.json new file mode 100644 index 000000000..97f57ccde --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/cs/webhooks.json @@ -0,0 +1,5 @@ +{ + "WEBHOOKS_SETTINGS": { + "HEADER": "Nastavení webhooku" + } +} diff --git a/app/javascript/dashboard/i18n/locale/de/cannedMgmt.json b/app/javascript/dashboard/i18n/locale/de/cannedMgmt.json index dc79e8854..c8d87ee5d 100644 --- a/app/javascript/dashboard/i18n/locale/de/cannedMgmt.json +++ b/app/javascript/dashboard/i18n/locale/de/cannedMgmt.json @@ -19,12 +19,12 @@ "TITLE": "Eingemachte Antwort hinzufügen", "DESC": "Gespeicherte Antworten sind gespeicherte Antwortvorlagen, mit denen schnell Antworten auf Konversationen gesendet werden können.", "FORM": { - "SHORT_CODE" : { + "SHORT_CODE": { "LABEL": "Funktionscode", "PLACEHOLDER": "Bitte geben Sie einen Shortcode ein", "ERROR": "Funktionscode ist erforderlich" }, - "CONTENT" : { + "CONTENT": { "LABEL": "Inhalt", "PLACEHOLDER": "Bitte geben Sie einen Inhalt ein", "ERROR": "Inhalt ist erforderlich" @@ -39,12 +39,12 @@ "EDIT": { "TITLE": "Eingemachte Antwort bearbeiten", "FORM": { - "SHORT_CODE" : { + "SHORT_CODE": { "LABEL": "Funktionscode", "PLACEHOLDER": "Bitte geben Sie einen Shortcode ein", "ERROR": "Funktionscode ist erforderlich" }, - "CONTENT" : { + "CONTENT": { "LABEL": "Inhalt", "PLACEHOLDER": "Bitte geben Sie einen Inhalt ein", "ERROR": "Inhalt ist erforderlich" diff --git a/app/javascript/dashboard/i18n/locale/de/chatlist.json b/app/javascript/dashboard/i18n/locale/de/chatlist.json index 27c0d7ef2..0bcc11677 100644 --- a/app/javascript/dashboard/i18n/locale/de/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/de/chatlist.json @@ -10,7 +10,8 @@ "SEARCH": { "INPUT": "Suche nach Personen, Chats, gespeicherten Antworten .." }, - "STATUS_TABS": [{ + "STATUS_TABS": [ + { "NAME": "Öffnen", "KEY": "openCount" }, @@ -19,8 +20,8 @@ "KEY": "allConvCount" } ], - - "ASSIGNEE_TYPE_TABS": [{ + "ASSIGNEE_TYPE_TABS": [ + { "NAME": "Bergwerk", "KEY": "me", "COUNT_KEY": "mineCount" @@ -36,8 +37,8 @@ "COUNT_KEY": "allCount" } ], - - "CHAT_STATUS_ITEMS": [{ + "CHAT_STATUS_ITEMS": [ + { "TEXT": "Öffnen", "VALUE": "open" }, @@ -46,7 +47,6 @@ "VALUE": "resolved" } ], - "ATTACHMENTS": { "image": { "ICON": "ion-image", diff --git a/app/javascript/dashboard/i18n/locale/de/generalSettings.json b/app/javascript/dashboard/i18n/locale/de/generalSettings.json index 0fdae0545..66458623f 100644 --- a/app/javascript/dashboard/i18n/locale/de/generalSettings.json +++ b/app/javascript/dashboard/i18n/locale/de/generalSettings.json @@ -19,7 +19,7 @@ }, "LANGUAGE": { "LABEL": "Site-Sprache (Beta)", - "PLACEHOLDER": "Your account name", + "PLACEHOLDER": "Ihr Kontoname", "ERROR": "" } } diff --git a/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json index fdfa9d39a..5f09f8095 100644 --- a/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json @@ -6,10 +6,26 @@ "404": "Diesem Konto sind keine Posteingänge zugeordnet." }, "CREATE_FLOW": [ - { "title": "Wählen Sie Kanal", "route": "settings_inbox_new", "body": "Wählen Sie den Anbieter, den Sie in Chatwoot integrieren möchten." }, - { "title": "Posteingang erstellen", "route": "settings_inboxes_page_channel", "body": "Authentifizieren Sie Ihr Konto und erstellen Sie einen Posteingang." }, - { "title": "Agenten hinzufügen", "route": "settings_inboxes_add_agents", "body": "Fügen Sie dem erstellten Posteingang Agenten hinzu." }, - { "title": "Voila!", "route": "settings_inbox_finish", "body": "Sie sind bereit zu gehen!" } + { + "title": "Wählen Sie Kanal", + "route": "settings_inbox_new", + "body": "Wählen Sie den Anbieter, den Sie in Chatwoot integrieren möchten." + }, + { + "title": "Posteingang erstellen", + "route": "settings_inboxes_page_channel", + "body": "Authentifizieren Sie Ihr Konto und erstellen Sie einen Posteingang." + }, + { + "title": "Agenten hinzufügen", + "route": "settings_inboxes_add_agents", + "body": "Fügen Sie dem erstellten Posteingang Agenten hinzu." + }, + { + "title": "Voila!", + "route": "settings_inbox_finish", + "body": "Sie sind bereit zu gehen!" + } ], "ADD": { "FB": { @@ -33,12 +49,11 @@ "LABEL": "Widget Farbe", "PLACEHOLDER": "Aktualisieren Sie die im Widget verwendete Widget-Farbe" }, - "SUBMIT_BUTTON":"Posteingang erstellen" + "SUBMIT_BUTTON": "Posteingang erstellen" }, - "TWILIO": { - "TITLE": "Twilio SMS Channel", - "DESC": "Integrieren Sie Twilio und unterstützen Sie Ihre Kunden per SMS.", + "TITLE": "Twilio SMS/Whatsapp Channel", + "DESC": "Integrieren Sie Twilio und unterstützen Sie Ihre Kunden per SMS/Whatsapp.", "ACCOUNT_SID": { "LABEL": "Account SID", "PLACEHOLDER": "Bitte geben Sie Ihre Twilio Account SID ein", @@ -76,7 +91,7 @@ "TITLE": "Posteingangsdetails", "DESC": "Wählen Sie aus der Dropdown-Liste die Facebook-Seite aus, zu der Sie eine Verbindung zu Chatwoot herstellen möchten. Sie können Ihrem Posteingang auch einen benutzerdefinierten Namen geben, um ihn besser identifizieren zu können." }, - "FINISH":{ + "FINISH": { "TITLE": "Geschafft!", "DESC": "Sie haben die Integration Ihrer Facebook-Seite in Chatwoot erfolgreich abgeschlossen. Wenn ein Kunde das nächste Mal eine Nachricht an Ihre Seite sendet, wird die Konversation automatisch in Ihrem Posteingang angezeigt.
Wir stellen Ihnen außerdem ein Widget-Skript zur Verfügung, das Sie ganz einfach zu Ihrer Website hinzufügen können. Sobald dies auf Ihrer Website live ist, können Kunden Ihnen ohne Hilfe eines externen Tools direkt von Ihrer Website aus eine Nachricht senden, und die Konversation wird direkt hier auf Chatwoot angezeigt.
Cool, oder? Nun, wir versuchen es auf jeden Fall :)" } diff --git a/app/javascript/dashboard/i18n/locale/de/settings.json b/app/javascript/dashboard/i18n/locale/de/settings.json index 1cbf8df23..8ff24bb0b 100644 --- a/app/javascript/dashboard/i18n/locale/de/settings.json +++ b/app/javascript/dashboard/i18n/locale/de/settings.json @@ -10,11 +10,11 @@ "REMOVE_IMAGE": "Entfernen", "UPLOAD_IMAGE": "Bild hochladen", "UPDATE_IMAGE": "Bild aktualisieren", - "PROFILE_SECTION" : { + "PROFILE_SECTION": { "TITLE": "Profil", "NOTE": "Ihre E-Mail-Adresse ist Ihre Identität und wird zum Anmelden verwendet." }, - "PASSWORD_SECTION" : { + "PASSWORD_SECTION": { "TITLE": "Passwort", "NOTE": "Durch das Aktualisieren Ihres Kennworts werden Ihre Anmeldungen auf mehreren Geräten zurückgesetzt." }, @@ -22,7 +22,7 @@ "TITLE": "Zugangstoken", "NOTE": "Dieses Token kann verwendet werden, wenn Sie eine API-basierte Integration erstellen" }, - "EMAIL_NOTIFICATIONS_SECTION" : { + "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "E-Mail Benachrichtigungen", "NOTE": "Aktualisieren Sie hier Ihre E-Mail-Benachrichtigungseinstellungen", "CONVERSATION_ASSIGNMENT": "Senden Sie E-Mail-Benachrichtigungen, wenn mir ein Gespräch zugewiesen wurde", @@ -30,7 +30,7 @@ "UPDATE_SUCCESS": "Ihre E-Mail-Benachrichtigungseinstellungen wurden erfolgreich aktualisiert", "UPDATE_ERROR": "Beim Aktualisieren der Einstellungen ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut" }, - "PROFILE_IMAGE":{ + "PROFILE_IMAGE": { "LABEL": "Profilbild" }, "NAME": { @@ -58,5 +58,41 @@ "SIDEBAR_ITEMS": { "PROFILE_SETTINGS": "Profileinstellungen", "LOGOUT": "Ausloggen" + }, + "APP_GLOBAL": { + "TRIAL_MESSAGE": "verbleibende Tage Probezeit.", + "TRAIL_BUTTON": "Kaufe jetzt" + }, + "COMPONENTS": { + "CODE": { + "BUTTON_TEXT": "Kopieren", + "COPY_SUCCESSFUL": "Code erfolgreich in die Zwischenablage kopiert" + }, + "FILE_BUBBLE": { + "DOWNLOAD": "Herunterladen", + "UPLOADING": "Hochladen..." + }, + "FORM_BUBBLE": { + "SUBMIT": "Einreichen" + } + }, + "CONFIRM_EMAIL": "Überprüfen...", + "SETTINGS": { + "INBOXES": { + "NEW_INBOX": "Posteingang hinzufügen" + } + }, + "SIDEBAR": { + "CONVERSATIONS": "Gespräche", + "REPORTS": "Berichte", + "SETTINGS": "Die Einstellungen", + "HOME": "Zuhause", + "AGENTS": "Agenten", + "INBOXES": "Posteingänge", + "CANNED_RESPONSES": "Vorgefertigte Antworten", + "BILLING": "Abrechnung", + "INTEGRATIONS": "Integrationen", + "ACCOUNT_SETTINGS": "Kontoeinstellungen" } + } diff --git a/app/javascript/dashboard/i18n/locale/el/agentMgmt.json b/app/javascript/dashboard/i18n/locale/el/agentMgmt.json new file mode 100644 index 000000000..7a158a5a2 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/el/agentMgmt.json @@ -0,0 +1,101 @@ +{ + "AGENT_MGMT": { + "HEADER": "Πράκτορες", + "HEADER_BTN_TXT": "Προσθήκη Πράκτορα", + "LOADING": "Λήψη της λίστα των Πρακτόρων", + "SIDEBAR_TXT": "

Πράκτορες

Ένας Πράκτορας είναι ένα μέλος της ομάδας υποστήριξής σας.

Οι πράκτορες θα μπορούν να δουν και να απαντήσουν στα μηνύματα των χρηστών. Στην λίστα φαίνονται όλοι οι πράκτορες που συμμετέχουν στον λογαριασμό σας.

Πατήστε στο Προσθήκη Πράκτορα για να προσθέσετε έναν νέο. Ο πράκτορας θα λάβει ένα email με σύνδεσμο επιβεβαίωσης για να ενεργοποιήσει τον λογαριασμό του, ύστερα θα μπορούν να δουν το Chatwoot και να ανταποκρίνονται στα μηνύματά τους.

Η πρόσβαση στις δυνατότητες του Chatwoot βαζίζεται στους παρακάτω ρόλους.

Πράκτορας - Οι χρήστες με αυτόν τον ρόλο έχουν πρόσβαση μόνο στα εισερχόμενα, αναφορές και τις συζητήσεις. Μπορούν επίσης να αναθέσουν συζητήσεις σε άλλους πράκτορες ή τον εαυτό τους και να τις ολοκληρώσουν.

Διαχειριστής - Ο διαχειριστής θα έχει πρόσβαση σε όλες τις δυνατότητες του Chatwoot που έχουν ενεργοποιηθεί για τον λογαριασμό, συμπεριλαμβανομένων των ρυθμίσεων της εφαρμογής, όπως επίσης και όλα τα δικαιώματα που έχει ένας πράκτορας.

", + "AGENT_TYPES": [ + { + "name": "administrator", + "label": "Διαχειριστής" + }, + { + "name": "agent", + "label": "Πράκτορας" + } + ], + "LIST": { + "404": "Δεν υπάρχουν πράκτορες σε αυτόν τον λογαριασμό", + "TITLE": "Διαχείριση πρακτόρων της ομάδας σας", + "DESC": "Μπορείτε να προσθέσετε ή να αφαιρέσετε πράκτορες στην ομάδας σας.", + "NAME": "Όνομα", + "EMAIL": "EMAIL", + "STATUS": "Κατάσταση", + "ACTIONS": "Ενέργειες", + "VERIFIED": "Επιβεβαιώθηκε", + "VERIFICATION_PENDING": "Σε αναμονή επιβεβαίωσης" + }, + "ADD": { + "TITLE": "Προσθέστε έναν Πράκτορα στην ομάδα σας", + "DESC": "Οι πράκτορες έιναι άτομα που θα είναι σε θέση να διαχειρίζονται και να υποστηρίζουν τα εισερχόμενα.", + "FORM": { + "NAME": { + "LABEL": "Όνομα Πράκτορα", + "PLACEHOLDER": "Παρακαλώ εισάγετε το όνοματεπώνυμο του πράκτορα" + }, + "AGENT_TYPE": { + "LABEL": "Ρόλος Χρήστη", + "PLACEHOLDER": "Παρακαλώ επιλέξτε ρόλο", + "ERROR": "Ο ρόλος του πράκτορα είναι απαραίτητος" + }, + "EMAIL": { + "LABEL": "Διεύθυνση Email", + "PLACEHOLDER": "Παρακαλώ εισάγετε το email του πράκτορα" + }, + "SUBMIT": "Προσθήκη" + }, + "API": { + "SUCCESS_MESSAGE": "Ο πράκτορας προστέθηκε επιτυχώς", + "EXIST_MESSAGE": "To email αυτό είναι ήδη σε χρήστη, Παρακαλώ δοκιμάστε μια άλλην διεύθυνση email", + "ERROR_MESSAGE": "Αδυναμία σύνδεσης με τον Woot Server, Παρακαλώ προσπαθήστε αργότερα" + } + }, + "DELETE": { + "BUTTON_TEXT": "Διαγραφή", + "API": { + "SUCCESS_MESSAGE": "Ο πράκτορας διαγράφηκε με επιτυχία", + "ERROR_MESSAGE": "Αδυναμία σύνδεσης με τον Woot Server, Παρακαλώ προσπαθήστε αργότερα" + }, + "CONFIRM": { + "TITLE": "Επιβεβαίωση Διαγραφής", + "MESSAGE": "Είσαστε σίγουροι για την διαγραφή ", + "YES": "Ναι, Διέγραψε τον/την ", + "NO": "Όχι, Κράτησε τον/την " + } + }, + "EDIT": { + "TITLE": "Επεξεργασία Πράκτορα", + "FORM": { + "NAME": { + "LABEL": "Όνομα Πράκτορα", + "PLACEHOLDER": "Παρακαλώ συμπληρώστε το όνομα του Πράκτορα" + }, + "AGENT_TYPE": { + "LABEL": "Ρόλος Χρήστη", + "PLACEHOLDER": "Παρακαλώ επιλέξτε ρόλο", + "ERROR": "Ο ρόλος του πράκτορα είναι απαραίτητος" + }, + "EMAIL": { + "LABEL": "Διεύθυνση Email", + "PLACEHOLDER": "Παρακαλώ εισάγετε το email του πράκτορα" + }, + "SUBMIT": "Καταχώρηση" + }, + "BUTTON_TEXT": "Επεξεργασία", + "CANCEL_BUTTON_TEXT": "Άκυρο", + "API": { + "SUCCESS_MESSAGE": "Ο πράκτορας ενημερώθηκε επιτυχώς", + "ERROR_MESSAGE": "Αδυναμία σύνδεσης με τον Woot Server, Παρακαλώ προσπαθήστε αργότερα" + }, + "PASSWORD_RESET": { + "ADMIN_RESET_BUTTON": "Επαναφορά Κωδικού", + "ADMIN_SUCCESS_MESSAGE": "Ένα email με οδηγίες για την επαναφορά του κωδικού έχει αποσταλεί στον Πράκτορα", + "SUCCESS_MESSAGE": "Έγινε επαναφορά στον κωδικός του Πράκτορα", + "ERROR_MESSAGE": "Αδυναμία σύνδεσης με τον Woot Server, Παρακαλώ προσπαθήστε αργότερα" + } + }, + "SEARCH": { + "NO_RESULTS": "Δεν βρέθηκαν Πράκτορες." + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/el/billing.json b/app/javascript/dashboard/i18n/locale/el/billing.json new file mode 100644 index 000000000..6a96433ff --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/el/billing.json @@ -0,0 +1,19 @@ +{ + "BILLING": { + "HEADER": "Χρεώσεις", + "LOADING": "Λήψη Συνδρομών", + "ACCOUNT_STATE": "Κατάσταση Λογαριασμού", + "AGENT_COUNT": "Αριθμός Πρακτόρων", + "PER_AGENT_COST": "Κόστος ανά πράκτορα", + "TOTAL_COST": "Συνολικό κόστος", + "BUTTON": { + "ADD": "Προσθήκη μεθόδου πληρωμής", + "EDIT": "Επεξεργασία μεθόδου πληρωμής" + }, + "TRIAL": { + "TITLE": "Η δοκιμαστική περίοδος ολοκληρώθηκε", + "MESSAGE": "Προσθέστε μια μέθοδο πληρωμής για να συνεχίσετε την χρήση του Chatwoot." + }, + "ACCOUNT_LOCKED": "O Λογαριασμός σας δεν είναι ενεργός αυτήν τη στιγμή.
Παρακαλώ απευθυνθείτε στον διαχειριστή για ενεργοποίηση." + } +} diff --git a/app/javascript/dashboard/i18n/locale/el/cannedMgmt.json b/app/javascript/dashboard/i18n/locale/el/cannedMgmt.json new file mode 100644 index 000000000..a870d2a32 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/el/cannedMgmt.json @@ -0,0 +1,74 @@ +{ + "CANNED_MGMT": { + "HEADER": "Έτοιμες Απαντήσεις", + "HEADER_BTN_TXT": "Προσθήκη Έτοιμης Απάντησης", + "LOADING": "Λήψη Έτοιμων Απαντήσεων", + "SEARCH_404": "Δεν υπάρχουν αντικείμενα να ταιριάζουν με αυτό το ερώτημα", + "SIDEBAR_TXT": "

Έτοιμες Απαντήσεις

Οι Έτοιμες Απαντήσεις είναι αποθηκευμένα πρότυπα απαντήσεων, τα οποία μπορούν να χρησιμοποιηθούν ως μια γρήργορη απάντηση σε μια συνομιλία.

Για την δημιουργία μιας Έτοιμης Απάντησης, απλώς πατήστε στο Προσθήκη Έτοιμης Απάντησης. Μπορείτε επίσης να επεξεργαστείτε ή να διαγράψετε μια έτοιμη απάντηση πατώντας το κουμπί Επεξεργασία ή Διαγραφή αντίστοιχα.

Οι έτοιμες απαντήσεις χρησιμοποιούνται με την βοήθεια του Σύντομου Κώδικα. Οι πράκτορες έχουν πρόσβαση στις Έτοιμες Απαντήσεις αν κατά την συνομιλία πληκτρολογήσουν '/' ακολουθούμενο από τον σύντομο κώδικα.

", + "LIST": { + "404": "Δεν υπάρχουν τυποποιημένες απαντήσεις σε αυτόν τον λογαριασμό.", + "TITLE": "Διαχείριση έτοιμων απαντήσεων", + "DESC": "Οι Έτοιμες Απαντήσεις είναι πρότυπα απαντήσεων με τα οποία μπορούμε να απαντήσουμε γρήγορα σε συνηθισμένα ερωτήματα.", + "TABLE_HEADER": [ + "ΣΥΝΤΟΜΟΣ ΚΩΔΙΚΑΣ", + "ΠΕΡΙΕΧΟΜΕΝΟ", + "ΕΝΕΡΓΕΙΕΣ" + ] + }, + "ADD": { + "TITLE": "Προσθήκη Έτοιμης Απάντησης", + "DESC": "Οι Έτοιμες Απαντήσεις είναι πρότυπα απαντήσεων με τα οποία μπορούμε να απαντήσουμε γρήγορα σε συνηθισμένα ερωτήματα.", + "FORM": { + "SHORT_CODE": { + "LABEL": "Σύντομος Κώδικας", + "PLACEHOLDER": "Παρακαλώ εισάγετε σύντομο κώδικα", + "ERROR": "Ο Σύντομος Κώδικας είναι απαραίτητος" + }, + "CONTENT": { + "LABEL": "Περιεχόμενο", + "PLACEHOLDER": "Παρακαλώ εισάγετε το περιεχόμενο της απάντησης", + "ERROR": "Το περιεχόμενο είναι απαραίτητο" + }, + "SUBMIT": "Καταχώρηση" + }, + "API": { + "SUCCESS_MESSAGE": "Η Έτοιμη Απάντηση προστέθηκε επιτυχώς", + "ERROR_MESSAGE": "Αδυναμία σύνδεσης με τον Woot Server, Παρακαλώ προσπαθήστε αργότερα" + } + }, + "EDIT": { + "TITLE": "Επεξεργασία Έτοιμης Απάντησης", + "FORM": { + "SHORT_CODE": { + "LABEL": "Σύντομος Κώδικας", + "PLACEHOLDER": "Παρακαλώ εισάγετε σύντομο κώδικα", + "ERROR": "Ο Σύντομος Κώδικας είναι απαραίτητος" + }, + "CONTENT": { + "LABEL": "Περιεχόμενο", + "PLACEHOLDER": "Παρακαλώ εισάγετε το περιεχόμενο της απάντησης", + "ERROR": "Το περιεχόμενο είναι απαραίτητο" + }, + "SUBMIT": "Καταχώρηση" + }, + "BUTTON_TEXT": "Επεξεργασία", + "API": { + "SUCCESS_MESSAGE": "Η Έτοιμη Απάντηση ενημερώθηκε επιτυχώς", + "ERROR_MESSAGE": "Αδυναμία σύνδεσης με τον Woot Server, Παρακαλώ προσπαθήστε αργότερα" + } + }, + "DELETE": { + "BUTTON_TEXT": "Διαγραφή", + "API": { + "SUCCESS_MESSAGE": "Η έτοιμη απάντηση διαγράφηκε επιτυχώς", + "ERROR_MESSAGE": "Αδυναμία σύνδεσης με τον Woot Server, Παρακαλώ προσπαθήστε αργότερα" + }, + "CONFIRM": { + "TITLE": "Επιβεβαίωση Διαγραφής", + "MESSAGE": "Είσαστε σίγουροι για την διαγραφή ", + "YES": "Ναι, Διέγραψε την ", + "NO": "Όχι, Κράτησε την " + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/el/chatlist.json b/app/javascript/dashboard/i18n/locale/el/chatlist.json new file mode 100644 index 000000000..27ea28a49 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/el/chatlist.json @@ -0,0 +1,77 @@ +{ + "CHAT_LIST": { + "LOADING": "Λήψη συζητήσεων", + "LOAD_MORE_CONVERSATIONS": "Φόρτωση περισσότερων συζητήσεων", + "EOF": "Όλες οι συζητήσεις φορτώθηκαν 🎉", + "LIST": { + "404": "Δεν υπάρχουν ενεργές συζητήσεις σε αυτήν την ομάδα." + }, + "TAB_HEADING": "Συζητήσεις", + "SEARCH": { + "INPUT": "Αναζήτηση Ανθρώπων, συνομιλιών, αποθηκευμένων απαντήσεων .." + }, + "STATUS_TABS": [ + { + "NAME": "Ανοιχτές", + "KEY": "openCount" + }, + { + "NAME": "Επιλύθηκαν", + "KEY": "allConvCount" + } + ], + "ASSIGNEE_TYPE_TABS": [ + { + "NAME": "Δικές μου", + "KEY": "me", + "COUNT_KEY": "mineCount" + }, + { + "NAME": "Χωρίς Αντιστοίχιση", + "KEY": "unassigned", + "COUNT_KEY": "unAssignedCount" + }, + { + "NAME": "Όλες", + "KEY": "all", + "COUNT_KEY": "allCount" + } + ], + "CHAT_STATUS_ITEMS": [ + { + "TEXT": "Ανοιχτές", + "VALUE": "open" + }, + { + "TEXT": "Επιλυθείσες", + "VALUE": "resolved" + } + ], + "ATTACHMENTS": { + "image": { + "ICON": "ion-image", + "CONTENT": "Μήνυμα εικόνας" + }, + "audio": { + "ICON": "ion-volume-high", + "CONTENT": "Μήνυμα ήχου" + }, + "video": { + "ICON": "ion-ios-videocam", + "CONTENT": "Μήνυμα βίντεο" + }, + "file": { + "ICON": "ion-document", + "CONTENT": "Επισυναπτόμενο αρχείο" + }, + "location": { + "ICON": "ion-ios-location", + "CONTENT": "Θέση" + }, + "fallback": { + "ICON": "ion-link", + "CONTENT": "έχει μοιράσει ένα σύνδεσμο" + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/el/contact.json b/app/javascript/dashboard/i18n/locale/el/contact.json new file mode 100644 index 000000000..707c97114 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/el/contact.json @@ -0,0 +1,20 @@ +{ + "CONTACT_PANEL": { + "CONVERSATION_TITLE": "Λεπτομέρειες συνομιλίας", + "BROWSER": "Φυλλομετρητής", + "OS": "Λειτουργικό", + "INITIATED_FROM": "Αρχικοποίηση από", + "INITIATED_AT": "Αρχικοποίηση τις", + "CONVERSATIONS": { + "NO_RECORDS_FOUND": "Δεν υπάρχουν προηγούμενες συνομιλίες που σχετίζονται με αυτήν την επαφή.", + "TITLE": "Προηγούμενες συνομιλίες" + }, + "LABELS": { + "TITLE": "Ετικέτες συνομιλίας", + "UPDATE_BUTTON": "Ενημέρωση ετικετών", + "UPDATE_ERROR": "Δεν μπορούν να ενημερωθούν οι ετικέτες, προσπαθήστε ξανά.", + "TAG_PLACEHOLDER": "Προθήκη ετικέτας", + "PLACEHOLDER": "Αναζήτηση/Προσθήκη ετικέτας" + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/el/conversation.json b/app/javascript/dashboard/i18n/locale/el/conversation.json new file mode 100644 index 000000000..92327cfb4 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/el/conversation.json @@ -0,0 +1,35 @@ +{ + "CONVERSATION": { + "404": "Παρακαλώ επιλέξτε συζήτηση από το αριστερό τμήμα", + "NO_MESSAGE_1": "Ωχ ωχ! Φαίνεται ότι δεν υπάρχουν μηνύματα από τους πελάτες στα εισερχόμενά σας.", + "NO_MESSAGE_2": " για να στείλετε ένα μήνυμα στην σελίδα σας!", + "NO_INBOX_1": "Γεια σας! Δεν έχετε προσθέσει κάποιο κιβώτιο εισερχομένων ακόμη.", + "NO_INBOX_2": " για να ξεκινήσετε", + "NO_INBOX_AGENT": "Ω όχι! Φαίνεται ότι δεν είστε μέλος κάποιου κιβωτίου εισερχμένων. Απευθυνθείτε στον διαχειριστή", + "CLICK_HERE": "Πατήστε εδώ", + "LOADING_INBOXES": "Φόρτωση εισερχομένων", + "LOADING_CONVERSATIONS": "Φόρτωση Συζητήσεων", + "DOWNLOAD": "Κατέβασμα", + "HEADER": { + "RESOLVE_ACTION": "Επίλυση", + "REOPEN_ACTION": "Επαναφορά", + "OPEN": "Περισσότερα", + "CLOSE": "Κλείσιμο", + "DETAILS": "Λεπτομέρειες" + }, + "FOOTER": { + "MSG_INPUT": "Shift + enter για νέα γραμμή. Ξεκινήστε με '/' για να επιλέξτε Τυποποιημένη Απάντηση.", + "PRIVATE_MSG_INPUT": "Shift + enter για νέα γραμμή. Το κείμενο θα μπορούν να το δουν μόνο οι υπόλοιποι πράκτορες." + }, + "REPLYBOX": { + "REPLY": "Απάντηση", + "PRIVATE_NOTE": "Ιδιωτική Σημείωση", + "SEND": "Αποστολή", + "CREATE": "Σημείωση (Add Note)", + "TWEET": "Tweet" + }, + "VISIBLE_TO_AGENTS": "Ιδιωτική Σημείωση: Ορατή μόνο σε σας και την ομάδα σας", + "CHANGE_STATUS": "Η κατάσταση της συνομιλίας άλλαξε", + "CHANGE_AGENT": "Η εκπροσώπηση για την συνομιλία άλλαξε" + } +} diff --git a/app/javascript/dashboard/i18n/locale/el/generalSettings.json b/app/javascript/dashboard/i18n/locale/el/generalSettings.json new file mode 100644 index 000000000..06b211b19 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/el/generalSettings.json @@ -0,0 +1,46 @@ +{ + "GENERAL_SETTINGS": { + "TITLE": "Ρυθμίσεις", + "SUBMIT": "Ενημέρωση Ρυθμίσεων", + "UPDATE": { + "ERROR": "Δεν μπορεί να ενημερωθεί η ρύθμιση προσπαθήστε ξανά!", + "SUCCESS": "Επιτυχής Ενημέρωση Ρυθμίσεων" + }, + "FORM": { + "ERROR": "Παρακαλώ διορθώστε τα λάθη της Φόρμας", + "GENERAL_SECTION": { + "TITLE": "Γενικές Ρυθμίσεις", + "NOTE": "" + }, + "NAME": { + "LABEL": "Ονομασία Λογαριασμού", + "PLACEHOLDER": "Η ονομασία του Λογαριασμού σας", + "ERROR": "Παρακαλώ συμπληρώστε ένα έγκυρο όνομα λογαριασμού" + }, + "LANGUAGE": { + "LABEL": "Γλώσσα Ιστοσελίδας (Beta)", + "PLACEHOLDER": "Το όνομα του Λογαριασμού", + "ERROR": "" + }, + "DOMAIN": { + "LABEL": "Domain", + "PLACEHOLDER": "Το domain της ιστοσελίδας σας", + "ERROR": "" + }, + "SUPPORT_EMAIL": { + "LABEL": "Email Υποστήριξης", + "PLACEHOLDER": "To email υποστήριξης της εταιρίας σας", + "ERROR": "" + }, + "ENABLE_DOMAIN_EMAIL": { + "LABEL": "Ενεργοποίηση emai του domain", + "PLACEHOLDER": "Ενεργοποιήση του custom domain email", + "ERROR": "", + "OPTIONS": { + "ENABLED": "Ενεργό", + "DISABLED": "Ανενεργό" + } + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json new file mode 100644 index 000000000..fe29aaebb --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json @@ -0,0 +1,176 @@ +{ + "INBOX_MGMT": { + "HEADER": "Κιβώτια Εισερχομένων", + "SIDEBAR_TXT": "

Κιβώτιο Εισερχομένων

Όταν συνδέετε σε μια Ιστοσελίδα ή μια σελίδα του Facebook με το Chatwoot, δημιουργείται ένα Κιβώτιο. Μπορείτε να έχετε απεριόριστα κιβώτια στον λογαριασμό σας στο Chatwoot.

Πατήστε στο Προσθήκη Κιβωτίου για να το συνδέσετε με μια ιστοσελίδα ή μια σελίδα στο Facebook.

Στον Πίνακα Ελέγχου, μπορείτε να δείτε τις συνομιλίες από όλα τα κιβώτια σε ένα μέρος και να απαντήσετε από την καρτέλα `Συνομιλίες`.

Μπορείτε επίσης να δείτε τις συνομιλίες από ένα κιβώτιο εισερχομένων πατώντας στο όνομά του στο αριστερό μέρος του πίνακα ελέγχου.

", + "LIST": { + "404": "Δεν υπάρχουν κιβώτια εισερχομένων σε αυτόν τον λογαριασμό." + }, + "CREATE_FLOW": [ + { + "title": "Επιλογή Καναλιού", + "route": "settings_inbox_new", + "body": "Επίλεξετε το κανάλι που θέλετε να ενσωματώσετε στο Chatwoot." + }, + { + "title": "Δημιουργία Κιβωτίου", + "route": "settings_inboxes_page_channel", + "body": "Πιστοποιήστε τον λογαριασμό σας και δημιουργείστε κιβώτιο Εισερχομένων." + }, + { + "title": "Προσθήκη Πρακτόρων", + "route": "settings_inboxes_add_agents", + "body": "Προσθέστε πράκτορες στο κιβώτιο που δημιουργήθηκε." + }, + { + "title": "Έξοχα!", + "route": "settings_inbox_finish", + "body": "Είσαστε έτοιμοι να ξεκινήσετε!" + } + ], + "ADD": { + "FB": { + "HELP": "ΥΓ: Με την είσοδο, θα έχουμε πρόσβαση μόνο στα μηνύματα της σελίδας σας. Τα ιδιωτικά μηνύματά σας ποτέ δεν προσπελαστούν από το Chatwoot." + }, + "TWITTER": { + "HELP": "Για να προσθέσετε το Προφίλ Twitter ως κανάλι, πρέπει να επικυρώστε το Προφίλ σας στο Twiter κάνοντας click στο 'Είσοδος με το Twitter' " + }, + "WEBSITE_CHANNEL": { + "TITLE": "Κανάλι Ιστοσελίδας", + "DESC": "Δημιουργήστε ένα κανάλι Ιστοσελίδα για να υποστηρίξετε τους πελάτες σας μέσω του πρόσθετου επικοινωνίας (widget) που θα εγκαταστήσετε στην ιστοσελίδα σας.", + "LOADING_MESSAGE": "Δημιουργία κανάλιού υποστήριξης ιστοσελίδας", + "CHANNEL_NAME": { + "LABEL": "Ονομασία Ιστοσελίδας", + "PLACEHOLDER": "Συμπληρώστε την ονομασία της ιστοσελίδας σας (π.χ: Ελληνικό Μεσογειακό Πανεπιστήμιο)" + }, + "CHANNEL_DOMAIN": { + "LABEL": "Domain Ιστοσελίδας", + "PLACEHOLDER": "Συμπληρώστε το domain της Ιστοσελίδας σας (π.χ: hmu.gr)" + }, + "CHANNEL_WELCOME_TITLE": { + "LABEL": "Καλώς ήλθατε (Heading)", + "PLACEHOLDER": "Γεια χαρά !" + }, + "CHANNEL_WELCOME_TAGLINE": { + "LABEL": "Καλώς ήλθατε (Tagline)", + "PLACEHOLDER": "Είναι απλό να συνδεθείτε μαζί μας. Ζητήστε μας οτιδήποτε, ή μοιραστείτε την εμπειρία σας." + }, + "CHANNEL_AGENT_AWAY_MESSAGE": { + "LABEL": "Μήνυμα όταν δεν υπάρχουν πράκτορες", + "PLACEHOLDER": "Τυπικά απαντάμε σε μερικές ώρες." + }, + "WIDGET_COLOR": { + "LABEL": "Χρώμα Widget", + "PLACEHOLDER": "Ενημερώστε το χρώμα του 'widget' που θα εμφανίζεται στους χρήστες" + }, + "SUBMIT_BUTTON": "Δημιουργία Κιβωτίου" + }, + "TWILIO": { + "TITLE": "SMS κανάλι από το Twillio", + "DESC": "Ενσωματώστε το Twilio και αρχίστε να υποστηρίζετε τους πελάτες σας μέσω SMS.", + "ACCOUNT_SID": { + "LABEL": "SID Λογαριασμού", + "PLACEHOLDER": "Παρακαλώ εισάγετε το SID του Λογαριασμού Twillio", + "ERROR": "Το πεδίο είναι απαραίτητο" + }, + "CHANNEL_TYPE": { + "LABEL": "Τύπος Καναλιού", + "ERROR": "Παρακαλώ επιλέξετε τον τύπο Καναλιού" + }, + "AUTH_TOKEN": { + "LABEL": "Auth Token", + "PLACEHOLDER": "Παρακαλώ εισάγετε τον Twilio Auth Token", + "ERROR": "Το πεδίο είναι απαραίτητο" + }, + "CHANNEL_NAME": { + "LABEL": "Όνομα καναλιού", + "PLACEHOLDER": "Παρακαλώ εισάγετε ένα όνομα καναλιού", + "ERROR": "Το πεδίο είναι απαραίτητο" + }, + "PHONE_NUMBER": { + "LABEL": "Αριθμός τηλεφώνου", + "PLACEHOLDER": "Παρακαλώ εισάγετε έναν αριθμό τηλεφώνου από τον οποίο θα σταλεί το μήνυμα.", + "ERROR": "Παρακαλώ καταχωρήστε μια έγκυρη τιμή. Ο αριθμός του τηλεφώνου πρέπει να ξεκινά με το σύμβολο `+`." + }, + "API_CALLBACK": { + "TITLE": "URL επανάκλησης", + "SUBTITLE": "Πρέπει να ρυθμίσετε το callback URL στο Twillio με το URL που αναφέρεται εδώ." + }, + "SUBMIT_BUTTON": "Δημιουργία Καναλιού Twillio", + "API": { + "ERROR_MESSAGE": "Δεν ήταν δυνατή η πιστοποίηση των διαπιστευτηρίων Twilio. Δοκιμάστε ξανά" + } + }, + "AUTH": { + "TITLE": "Κανάλια", + "DESC": "Επι του παρόντος υποστηρίζονται widgets για Ιστοσελίδες,και σελιδες Facebook, Προφίλ Twitter ως πλατφόρμες. Εχουμε ακόμη περισσότερες πλατφόρμες όπως Whatsapp, Email, Telegram and Line υπό ανάπτυξη, οι οποίες θα είναι διαθέσιμες σύντομα." + }, + "AGENTS": { + "TITLE": "Πράκτορες", + "DESC": "Εδώ μπορείτε να προσθέσετε πράκτορες στο κιβώτιο που μόλις δημιουργήσατε. Μονο αυτοί οι επιλεγμένοι πράκτορες θα έχουν πρόσβαση στο κιβώτιο. Οι πράκτορες που δεν ανήκουν σε αυτο το κιβώτιο δεν θα έχουν την δυνατότητα να ανταποκρίνονται σε μηνήματα αυτού του κιβωτίου όταν κάνουν login στο σύστημα.
ΥΓ: Ως Διαχειριστής, αν θέλετε πρόσβαση σε όλα τα κιβώτια, θα πρέπει να προσθέσετε τον εαυτό σας σε όλα τα κιβώτια που δημιουργείτε." + }, + "DETAILS": { + "TITLE": "Λεπτομέρειες Κιβωτίου", + "DESC": "Από το αναπτυσσόμενο μενού παρακάτω, επιλέξτε τη σελίδα Facebook που θέλετε να συνδεθείτε στο Chatwoot. Μπορείτε επίσης να δώσετε ένα προσαρμοσμένο όνομα στα εισερχόμενά σας για καλύτερη αναγνώριση." + }, + "FINISH": { + "TITLE": "Το καρφώσατε!", + "DESC": "Ολοκληρώσατε με επιτυχία την ενσωμάτωση της σελίδας σας στο Facebook με το Chatwoot. Την επόμενη φορά που ένας πελάτης στέλνει μηνύματα στη σελίδα σας, η συνομιλία θα εμφανιστεί αυτόματα στα εισερχόμενά σας.
Σας παρέχουμε επίσης ένα σενάριο widget που μπορείτε εύκολα να προσθέσετε στον ιστότοπό σας. Μόλις δημοσιευτεί ζωντανά στον ιστότοπό σας, οι πελάτες μπορούν να σας στείλουν μηνύματα απευθείας από τον ιστότοπό σας χωρίς τη βοήθεια εξωτερικού εργαλείου και η συνομιλία θα εμφανιστεί εδώ, στο Chatwoot.
Ωραία, ε; Λοιπόν, σίγουρα προσπαθούμε να είμαστε :)" + } + }, + "DETAILS": { + "LOADING_FB": "Πιστοποίηση ταυτότητας στο Facebook...", + "ERROR_FB_AUTH": "Κάτι πήγε στραβά, Παρακαλώ ανανεώστε την σελίδα...", + "CREATING_CHANNEL": "Δημιουργία κιβωτίου εισερχομένων...", + "TITLE": "Διαμόρφωση λεπτομερειών κιβωτίου", + "DESC": "" + }, + "AGENTS": { + "BUTTON_TEXT": "Προσθήκη πρακτόρων", + "ADD_AGENTS": "Προσθήκη πρακτόρων στο κιβώτιο εισερχομένων..." + }, + "FINISH": { + "TITLE": "Το κιβώτιο σας είναι έτοιμο!", + "MESSAGE": "Μπορείτε να συνομιλείτε με τους πελάτες σας από το νέο κανάλι. Καλή υποστήριξη ", + "BUTTON_TEXT": "Μετάβαση", + "WEBSITE_SUCCESS": "Επιτυχής δημιουργία του καναλιού ιστοσελίδας. Αντιγράψτε τον κώδικα που παρουσιάζεται παρακάτω, και τοποθετήστε τον στην ιστοσελίδα σας. Την επόμενη φορά που κάποιος πελάτης χρησιμοποιήσει το 'live chat', η συνομιλία θα εμφανιστεί στο κιβώτιο εισερχομένων σας." + }, + "REAUTH": "Εκ νέου εξουσιοδότηση", + "VIEW": "Προβολή", + "EDIT": { + "API": { + "SUCCESS_MESSAGE": "Οι ρυθμίσεις του κιβωτίου ενημερώθηκαν", + "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Η αυτόματη αντιστοίχιση ενημερώθηκε επιτυχώς", + "ERROR_MESSAGE": "Δεν μπορεί να ενημερωθεί το χρώμα του widget. Παρακαλώ προσπαθήστε αργότερα." + }, + "AUTO_ASSIGNMENT": { + "ENABLED": "Ενεργό", + "DISABLED": "Ανενεργό" + } + }, + "DELETE": { + "BUTTON_TEXT": "Διαγραφή", + "CONFIRM": { + "TITLE": "Επιβεβαίωση Διαγραφής", + "MESSAGE": "Είσαστε σίγουρος για την διαγραφή ", + "YES": "Ναι, Διέγραψε το ", + "NO": "Όχι, Κράτα το " + }, + "API": { + "SUCCESS_MESSAGE": "Το κιβώτιο διαγράφηκε επιτυχώς", + "ERROR_MESSAGE": "Αδυναμία διαγραφής του κιβωτίου. Παρακαλώ προσπαθήστε αργότερα." + } + }, + "SETTINGS": "Ρυθμίσεις", + "SETTINGS_POPUP": { + "MESSENGER_HEADING": "Κώδικας (Script)", + "MESSENGER_SUB_HEAD": "Τοποθετήσετε αυτόν τον κώδικα μέσα στο body tag της ιστοσελίδας σας", + "INBOX_AGENTS": "Πράκτορες", + "INBOX_AGENTS_SUB_TEXT": "Προσθέστε ή αφαιρέστε πράκτορες σε αυτό το κιβώτιο", + "UPDATE": "Ενημέρωση", + "AUTO_ASSIGNMENT": "Επιτρέπεται η αυτόματη αντιστοίχιση", + "INBOX_UPDATE_TITLE": "Ρυθμίσεις Κιβωτίου", + "INBOX_UPDATE_SUB_TEXT": "Ενημερώστε τις ρυθμίσεις του κιβωτίου σας", + "AUTO_ASSIGNMENT_SUB_TEXT": "Ενεργοποιήστε ή απενεργοποιήστε την αυτόματη αντιστοίχιση των νέων συζητήσεων στους πράκτορες αυτού του κιβωτίου." + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/el/index.js b/app/javascript/dashboard/i18n/locale/el/index.js new file mode 100644 index 000000000..351906dd9 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/el/index.js @@ -0,0 +1,34 @@ +/* eslint-disable */ +import { default as _agentMgmt } from './agentMgmt.json'; +import { default as _billing } from './billing.json'; +import { default as _cannedMgmt } from './cannedMgmt.json'; +import { default as _chatlist } from './chatlist.json'; +import { default as _contact } from './contact.json'; +import { default as _conversation } from './conversation.json'; +import { default as _inboxMgmt } from './inboxMgmt.json'; +import { default as _login } from './login.json'; +import { default as _report } from './report.json'; +import { default as _resetPassword } from './resetPassword.json'; +import { default as _setNewPassword } from './setNewPassword.json'; +import { default as _settings } from './settings.json'; +import { default as _signup } from './signup.json'; +import { default as _integrations } from './integrations.json'; +import { default as _generalSettings } from './generalSettings.json'; + +export default { + ..._agentMgmt, + ..._billing, + ..._cannedMgmt, + ..._chatlist, + ..._contact, + ..._conversation, + ..._inboxMgmt, + ..._login, + ..._report, + ..._resetPassword, + ..._setNewPassword, + ..._settings, + ..._signup, + ..._integrations, + ..._generalSettings, +}; diff --git a/app/javascript/dashboard/i18n/locale/el/integrations.json b/app/javascript/dashboard/i18n/locale/el/integrations.json new file mode 100644 index 000000000..c5a98da7d --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/el/integrations.json @@ -0,0 +1,54 @@ +{ + "INTEGRATION_SETTINGS": { + "HEADER": "Ενοποιήσεις", + "WEBHOOK": { + "TITLE": "Webhook", + "CONFIGURE": "Διαμόρφωση", + "HEADER": "Ρυθμίσεις Webhook", + "HEADER_BTN_TXT": "Προσθήκη Webhook", + "INTEGRATION_TXT": "Τα συμβάντα Webhook μας εφοδιάζουν με πληροφορίες πραγματικού χρόνου σχετικά με το τι συμβαίνει στο λογαριασμό σας στο Chatwoot. Μπορείτε να χρησιμοποιήσετε τα webhooks για να μεταφέρετε τα συμβάντα σε άλλες εφαρμογές ή υπηρεσίες όπως το Slack ή Github. Πατήστε στην Διαμόρφωση για να ενημερώστε τα δικά σας webhooks.", + "LOADING": "Λήψη σχετικών webhooks", + "SEARCH_404": "Δεν υπάρχουν δεδομένα που να ταιριάζουν με αυτό το ερώτημα", + "SIDEBAR_TXT": "

Webhooks

Τα Webhooks είναι κλήσεις HTTP οι οποίες μπορούν να οριστούν για κάθε λογαριασμό. Ενεργοποιούνται από τα συμβάντα στο Chatwoot όπως για παράδειγμα την έναρξη μια συνομιλίας. Μπορείτε να δημιουργείσετε πάνω από ένα για τον λογαριασμό σας.

Για την δημιουργία ενός webhook, Πατήστε στο κουμπί Προσθήκη webhook. Μπορείτε επίσης να αφαιρέσετε ένα υπάρχων webhook πατώντας στο σχετική κουμπί Διαγραφή.

", + "LIST": { + "404": "Δεν έχουν δημιουργηθεί webhooks για αυτόν το λογαριασμό.", + "TITLE": "Διαχείριση webhooks", + "DESC": "Τα webhooks είναι σύνδεσμοι στους οποίους ενημερώνεται η κίνηση στο chatwoot.", + "TABLE_HEADER": [ + "ΣΥΝΔΕΣΜΟΣ Webhook", + "ΕΝΕΡΓΕΙΕΣ" + ] + }, + "ADD": { + "CANCEL": "Άκυρο", + "TITLE": "Προσθήκη Νέου webhook", + "DESC": "Τα συμβάντα Webhook μας εφοδιάζουν με πληροφορίες πραγματικού χρόνου σχετικά με το τι συμβαίνει στο λογαριασμό σας στο Chatwoot. Παρακαλώ εισάγετε ένα έγκυρο URL στην σχετική ρύθμιση.", + "FORM": { + "END_POINT": { + "LABEL": "Σύνδεσμος Webhook", + "PLACEHOLDER": "Παράδειγμα: https://www.hmu.gr/api/webhook", + "ERROR": "Παρακαλώ εισάγετε ένα έγκυρο URL" + }, + "SUBMIT": "Δημιουργία Webhook" + }, + "API": { + "SUCCESS_MESSAGE": "Το Webhook προστέθηκε επιτυχώς", + "ERROR_MESSAGE": "Αδυναμία σύνδεσης με τον Woot Server, Παρακαλώ προσπαθήστε αργότερα" + } + }, + "DELETE": { + "BUTTON_TEXT": "Διαγραφή", + "API": { + "SUCCESS_MESSAGE": "Το Webhook διαγράφηκε επιτυχώς", + "ERROR_MESSAGE": "Αδυναμία σύνδεσης με τον Woot Server, Παρακαλώ προσπαθήστε αργότερα" + }, + "CONFIRM": { + "TITLE": "Επιβεβαίωση Διαγραφής", + "MESSAGE": "Είσαστε σίγοιροι για την διαγραφή ", + "YES": "Ναι, Διέγραψε ", + "NO": "Όχι, Κράτησε " + } + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/el/login.json b/app/javascript/dashboard/i18n/locale/el/login.json new file mode 100644 index 000000000..f0ae8f37e --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/el/login.json @@ -0,0 +1,21 @@ +{ + "LOGIN": { + "TITLE": "Είσοδος στο Chatwoot", + "EMAIL": { + "LABEL": "Email", + "PLACEHOLDER": "Email π.χ.: someone@example.com" + }, + "PASSWORD": { + "LABEL": "Κωδικός", + "PLACEHOLDER": "Κωδικός" + }, + "API": { + "SUCCESS_MESSAGE": "Επιτυχής είσοδος", + "ERROR_MESSAGE": "Αδυναμία σύνδεσης με τον Woot Server, Παρακαλώ προσπαθήστε αργότερα", + "UNAUTH": "Το όνομα χρήστη ή ο κωδικός δεν είναι σωστός. Παρακαλώ ξαναπροσπαθήστε" + }, + "FORGOT_PASSWORD": "Ξεχάσατε τον κωδικό;", + "CREATE_NEW_ACCOUNT": "Δημιουργία νέου Λογαριασμού", + "SUBMIT": "Είσοδος" + } +} diff --git a/app/javascript/dashboard/i18n/locale/el/report.json b/app/javascript/dashboard/i18n/locale/el/report.json new file mode 100644 index 000000000..07d748b76 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/el/report.json @@ -0,0 +1,49 @@ +{ + "REPORT": { + "HEADER": "Αναφορές", + "LOADING_CHART": "Φόρτωση δεδομένων γραφήματος...", + "NO_ENOUGH_DATA": "Δεν έχουν ληφθεί αρκετά σημεία δεδομένων για την δημιουργία της αναφοράς, Παρακαλώ προσπαθήστε αργότερα.", + "METRICS": [ + { + "NAME": "Συζητήσεις", + "KEY": "conversations_count", + "DESC": "(Σύνολο)" + }, + { + "NAME": "Εισερχόμενα Μηνύματα", + "KEY": "incoming_messages_count", + "DESC": "(Σύνολο)" + }, + { + "NAME": "Εξερχόμενα Μηνύματα", + "KEY": "outgoing_messages_count", + "DESC": "(Σύνολο)" + }, + { + "NAME": "Χρόνος πρώτης ανταπόκρισης", + "KEY": "avg_first_response_time", + "DESC": "(Μ.Ο.)" + }, + { + "NAME": "Χρόνος ανάλυσης", + "KEY": "avg_resolution_time", + "DESC": "(Μ.Ο.)" + }, + { + "NAME": "Αριθμός Αναλύσεων", + "KEY": "resolutions_count", + "DESC": "(Σύνολο)" + } + ], + "DATE_RANGE": [ + { + "id": 0, + "name": "Τελευταίες 7 ημέρες" + }, + { + "id": 1, + "name": "Τελευταίες 30 ημέρες" + } + ] + } +} diff --git a/app/javascript/dashboard/i18n/locale/el/resetPassword.json b/app/javascript/dashboard/i18n/locale/el/resetPassword.json new file mode 100644 index 000000000..2a829cbdb --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/el/resetPassword.json @@ -0,0 +1,15 @@ +{ + "RESET_PASSWORD": { + "TITLE": "Επαναφορά Κωδικού", + "EMAIL": { + "LABEL": "Email", + "PLACEHOLDER": "Παρακαλώ εισάγετε το email σας", + "ERROR": "Παρακαλώ εισάγετε ένα έγκυρο email" + }, + "API": { + "SUCCESS_MESSAGE": "Σύνδεσμος για την επαναφορά του κωδικού έχει αποσταλεί στο email σας", + "ERROR_MESSAGE": "Αδυναμία σύνδεσης με τον Woot Server, Παρακαλώ προσπαθήστε αργότερα" + }, + "SUBMIT": "Καταχώρηση" + } +} diff --git a/app/javascript/dashboard/i18n/locale/el/setNewPassword.json b/app/javascript/dashboard/i18n/locale/el/setNewPassword.json new file mode 100644 index 000000000..8df1f8086 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/el/setNewPassword.json @@ -0,0 +1,20 @@ +{ + "SET_NEW_PASSWORD": { + "TITLE": "Ορίστε νέο κωδικό", + "PASSWORD": { + "LABEL": "Κωδικός", + "PLACEHOLDER": "Κωδικός", + "ERROR": "Ο κωδικός είναι πολύ σύντομος" + }, + "CONFIRM_PASSWORD": { + "LABEL": "Επιβεβαίωση κωδικού", + "PLACEHOLDER": "Επιβεβαίωση κωδικού", + "ERROR": "Οι κωδικοί δεν ταιριάζουν" + }, + "API": { + "SUCCESS_MESSAGE": "Ο κωδικός άλλαξε με επιτυχία", + "ERROR_MESSAGE": "Αδυναμία σύνδεσης με τον Woot Server, Παρακαλώ προσπαθήστε αργότερα" + }, + "SUBMIT": "Καταχώρηση" + } +} diff --git a/app/javascript/dashboard/i18n/locale/el/settings.json b/app/javascript/dashboard/i18n/locale/el/settings.json new file mode 100644 index 000000000..6a428b4d1 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/el/settings.json @@ -0,0 +1,74 @@ +{ + "PROFILE_SETTINGS": { + "LINK": "Ρυθμίσεις Προφίλ", + "TITLE": "Ρυθμίσεις Προφίλ", + "BTN_TEXT": "Ενημέρωση Προφίλ", + "AFTER_EMAIL_CHANGED": "Το προφίλ σας ενημερώθηκε επιτυχώς, παρακαλώ κάντε είσοδο (login) επειδή τα στοιχεία εισόδου σας έχουν αλλάξει", + "FORM": { + "AVATAR": "Εικόνα Προφίλ", + "ERROR": "Παρακαλώ διορθώστε τα λάθη της φόρμας", + "REMOVE_IMAGE": "Διαγραφή", + "UPLOAD_IMAGE": "Ανέβασμα Εικόνας", + "UPDATE_IMAGE": "Ενημέρωση Εικόνας", + "PROFILE_SECTION": { + "TITLE": "Προφίλ", + "NOTE": "Η διεύθυνση email είναι η ταυτότητά σας και χρησιμοποιείται για την είσοδο (login) σας." + }, + "PASSWORD_SECTION": { + "TITLE": "Κωδικός", + "NOTE": "Η ενημέρωση του κωδικού κα επαναφέρει τα logins σε όλες τις συσκευές που έχετε συνδεθεί." + }, + "ACCESS_TOKEN": { + "TITLE": "Κώδικας Πρόσβασης (Access Token)", + "NOTE": "Χρησιμοποιείται σε περίπτωση εξωτερικής ενοποίησης της εφαρμογής με κώδικα (API)" + }, + "EMAIL_NOTIFICATIONS_SECTION": { + "TITLE": "Ειδοποιήσεις Email", + "NOTE": "Ενημέρωστε την προτίμηση για ειδοποιήσεις με email εδώ", + "CONVERSATION_ASSIGNMENT": "Να στέλνεται ειδοποίηση email όταν μια συνομιλία αντιστοιχίζεται σε μένα", + "CONVERSATION_CREATION": "Να στέλνεται ειδοποίηση όταν δημιουργείται μια νέα συνομιλία", + "UPDATE_SUCCESS": "Η προτίμησή σας για τις ειδοποιήσεις email ενημερώθηκε επιτυχώς", + "UPDATE_ERROR": "Παρουσιάστηκε σφάλμα κατά την ενημέρωση, Παρακαλώ προσπαθήστε ξανά" + }, + "PROFILE_IMAGE": { + "LABEL": "Εικόνα Προφίλ" + }, + "NAME": { + "LABEL": "Το Όνομα σας", + "ERROR": "Παρακαλώ εισάγετε ένα έγκυρο όνομα", + "PLACEHOLDER": "Εισάγετε το Ονοματεπώνυμο σας, όπως θα εμφανίζεται στις συνομιλίες σας" + }, + "EMAIL": { + "LABEL": "Η διεύθυνση email", + "ERROR": "Παρακαλώ εισάγετε μια έγκυρη διεύθυνση email", + "PLACEHOLDER": "Εισάγετε το Email σας, όπως θα εμφανίζεται στις συνομιλίες σας" + }, + "PASSWORD": { + "LABEL": "Κωδικός (Password)", + "ERROR": "Παρακαλώ εισάγετε κωδικό τουλάχιστον 6 χαρακτήρων", + "PLACEHOLDER": "Παρακαλώ εισάγετε ένα νέο κωδικό (password)" + }, + "PASSWORD_CONFIRMATION": { + "LABEL": "Επιβεβαίωση νέου κωδικού", + "ERROR": "Η Επιβεβαίωση κωδικού θα πρέπει να ταιριάζει με τον κωδικό", + "PLACEHOLDER": "Παρακαλώ εισάγετε ξανά τον νέο κωδικό (password)" + } + } + }, + "SIDEBAR_ITEMS": { + "PROFILE_SETTINGS": "Ρυθμίσεις Προφίλ", + "LOGOUT": "Έξοδος (Logout)" + }, + "SIDEBAR": { + "CONVERSATIONS": "Συνομιλίες", + "REPORTS": "Αναφορές", + "SETTINGS": "Ρυθμίσεις", + "HOME": "Σπίτι", + "AGENTS": "Πράκτορες", + "INBOXES": "Εισερχόμενα", + "CANNED_RESPONSES": "Κονσερβοποιημένες απαντήσεις", + "BILLING": "Χρέωση", + "INTEGRATIONS": "Ολοκληρώσεις", + "ACCOUNT_SETTINGS": "Ρυθμίσεις λογαριασμού" + } +} diff --git a/app/javascript/dashboard/i18n/locale/el/signup.json b/app/javascript/dashboard/i18n/locale/el/signup.json new file mode 100644 index 000000000..b9d20d348 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/el/signup.json @@ -0,0 +1,32 @@ +{ + "REGISTER": { + "TRY_WOOT": "Καταχωρήστε ένα λογαριασμό", + "TITLE": "Καταχώρηση", + "TERMS_ACCEPT": "Με την καταχώρηση, έχετε συμφωνήσει με τους όρους μας T & C και την πολιτική ιδιωτικών δεδομένων", + "ACCOUNT_NAME": { + "LABEL": "Ονομασία Λογαριασμού", + "PLACEHOLDER": "Wayne Α. Ε", + "ERROR": "Το όνομα του λογαριασμού είναι πολύ σύντομο" + }, + "EMAIL": { + "LABEL": "Email", + "PLACEHOLDER": "bruce@wayne.enterprises", + "ERROR": "Το email είναι ακατάλληλο" + }, + "PASSWORD": { + "LABEL": "Κωδικός", + "PLACEHOLDER": "Κωδικός", + "ERROR": "Ο κωδικός είναι πολύ σύντομος" + }, + "CONFIRM_PASSWORD": { + "LABEL": "Επιβεβαίωση κωδικού", + "PLACEHOLDER": "Επιβεβαίωση κωδικού", + "ERROR": "Οι κωδικοί δεν συμφωνούν" + }, + "API": { + "SUCCESS_MESSAGE": "Επιτυχής καταχώρηση", + "ERROR_MESSAGE": "Αδυναμία σύνδεσης με τον Woot Server, Παρακαλώ προσπαθήστε αργότερα" + }, + "SUBMIT": "Καταχώρηση" + } +} diff --git a/app/javascript/dashboard/i18n/locale/el/webhooks.json b/app/javascript/dashboard/i18n/locale/el/webhooks.json new file mode 100644 index 000000000..f3d0e0bd4 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/el/webhooks.json @@ -0,0 +1,5 @@ +{ + "WEBHOOKS_SETTINGS": { + "HEADER": "Ρυθμίσεις Webhook" + } +} diff --git a/app/javascript/dashboard/i18n/locale/en/generalSettings.json b/app/javascript/dashboard/i18n/locale/en/generalSettings.json index e48a5c0cb..702680b92 100644 --- a/app/javascript/dashboard/i18n/locale/en/generalSettings.json +++ b/app/javascript/dashboard/i18n/locale/en/generalSettings.json @@ -21,6 +21,25 @@ "LABEL": "Site language (Beta)", "PLACEHOLDER": "Your account name", "ERROR": "" + }, + "DOMAIN": { + "LABEL": "Domain", + "PLACEHOLDER": "Your website domain", + "ERROR": "" + }, + "SUPPORT_EMAIL": { + "LABEL": "Support Email", + "PLACEHOLDER": "Your company's support email", + "ERROR": "" + }, + "ENABLE_DOMAIN_EMAIL": { + "LABEL": "Enable domain email", + "PLACEHOLDER": "Enable the custom domain email", + "ERROR": "", + "OPTIONS": { + "ENABLED": "Enabled", + "DISABLED": "Disabled" + } } } } diff --git a/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json index 0dcdd60d5..9f59aab81 100644 --- a/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json @@ -6,10 +6,26 @@ "404": "There are no inboxes attached to this account." }, "CREATE_FLOW": [ - { "title": "Choose Channel", "route": "settings_inbox_new", "body": "Choose the provider you want to integrate with Chatwoot." }, - { "title": "Create Inbox", "route": "settings_inboxes_page_channel", "body": "Authenticate your account and create an inbox." }, - { "title": "Add Agents", "route": "settings_inboxes_add_agents", "body": "Add agents to the created inbox." }, - { "title": "Voila!", "route": "settings_inbox_finish", "body": "You are all set to go!" } + { + "title": "Choose Channel", + "route": "settings_inbox_new", + "body": "Choose the provider you want to integrate with Chatwoot." + }, + { + "title": "Create Inbox", + "route": "settings_inboxes_page_channel", + "body": "Authenticate your account and create an inbox." + }, + { + "title": "Add Agents", + "route": "settings_inboxes_add_agents", + "body": "Add agents to the created inbox." + }, + { + "title": "Voila!", + "route": "settings_inbox_finish", + "body": "You are all set to go!" + } ], "ADD": { "FB": { @@ -30,20 +46,36 @@ "LABEL": "Website Domain", "PLACEHOLDER": "Enter your website domain (eg: acme.com)" }, + "CHANNEL_WELCOME_TITLE": { + "LABEL": "Welcome Heading", + "PLACEHOLDER": "Hi there !" + }, + "CHANNEL_WELCOME_TAGLINE": { + "LABEL": "Welcome Tagline", + "PLACEHOLDER": "We make it simple to connect with us. Ask us anything, or share your feedback." + }, + "CHANNEL_AGENT_AWAY_MESSAGE": { + "LABEL": "Agents Away Message", + "PLACEHOLDER": "Acme Inc typically replies in a few hours." + }, "WIDGET_COLOR": { "LABEL": "Widget Color", "PLACEHOLDER": "Update the widget color used in widget" }, - "SUBMIT_BUTTON":"Create inbox" + "SUBMIT_BUTTON": "Create inbox" }, "TWILIO": { - "TITLE": "Twilio SMS Channel", - "DESC": "Integrate Twilio and start supporting your customers via SMS.", + "TITLE": "Twilio SMS/Whatsapp Channel", + "DESC": "Integrate Twilio and start supporting your customers via SMS or Whatsapp.", "ACCOUNT_SID": { "LABEL": "Account SID", "PLACEHOLDER": "Please enter your Twilio Account SID", "ERROR": "This field is required" }, + "CHANNEL_TYPE": { + "LABEL": "Channel Type", + "ERROR": "Please select your Channel Type" + }, "AUTH_TOKEN": { "LABEL": "Auth Token", "PLACEHOLDER": "Please enter your Twilio Auth Token", @@ -59,6 +91,10 @@ "PLACEHOLDER": "Please enter the phone number from which message will be sent.", "ERROR": "Please enter a valid value. Phone number should start with `+` sign." }, + "API_CALLBACK": { + "TITLE": "Callback URL", + "SUBTITLE": "You have to configure the message callback URL in Twilio with the URL mentioned here." + }, "SUBMIT_BUTTON": "Create Twilio Channel", "API": { "ERROR_MESSAGE": "We were not able to authenticate Twilio credentials, please try again" @@ -76,7 +112,7 @@ "TITLE": "Inbox Details", "DESC": "From the dropdown below, select the Facebook Page you want to connect to Chatwoot. You can also give a custom name to your inbox for better identification." }, - "FINISH":{ + "FINISH": { "TITLE": "Nailed It!", "DESC": "You have successfully finished integrating your Facebook Page with Chatwoot. Next time a customer messages your Page, the conversation will automatically appear on your inbox.
We are also providing you with a widget script that you can easily add to your website. Once this is live on your website, customers can message you right from your website without the help of any external tool and the conversation will appear right here, on Chatwoot.
Cool, huh? Well, we sure try to be :)" } @@ -102,7 +138,7 @@ "VIEW": "View", "EDIT": { "API": { - "SUCCESS_MESSAGE": "Widget color updated successfully", + "SUCCESS_MESSAGE": "Inbox settings updated successfully", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Auto assignment updated successfully", "ERROR_MESSAGE": "Could not update widget color. Please try again later." }, @@ -132,7 +168,9 @@ "INBOX_AGENTS_SUB_TEXT": "Add or remove agents from this inbox", "UPDATE": "Update", "AUTO_ASSIGNMENT": "Enable auto assignment", - "AUTO_ASSIGNMENT_SUB_TEXT": "Enable or disable the automatic assignment of available agents on new conversations" + "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/login.json b/app/javascript/dashboard/i18n/locale/en/login.json index a6be25967..30f667052 100644 --- a/app/javascript/dashboard/i18n/locale/en/login.json +++ b/app/javascript/dashboard/i18n/locale/en/login.json @@ -16,6 +16,6 @@ }, "FORGOT_PASSWORD": "Forgot your password?", "CREATE_NEW_ACCOUNT": "Create new account", - "SUBMIT": "Sign In" + "SUBMIT": "Login" } } diff --git a/app/javascript/dashboard/i18n/locale/en/settings.json b/app/javascript/dashboard/i18n/locale/en/settings.json index eb5264829..5ea423142 100644 --- a/app/javascript/dashboard/i18n/locale/en/settings.json +++ b/app/javascript/dashboard/i18n/locale/en/settings.json @@ -10,11 +10,11 @@ "REMOVE_IMAGE": "Remove", "UPLOAD_IMAGE": "Upload image", "UPDATE_IMAGE": "Update image", - "PROFILE_SECTION" : { + "PROFILE_SECTION": { "TITLE": "Profile", "NOTE": "Your email address is your identity and is used to log in." }, - "PASSWORD_SECTION" : { + "PASSWORD_SECTION": { "TITLE": "Password", "NOTE": "Updating your password would reset your logins in multiple devices." }, @@ -22,15 +22,25 @@ "TITLE": "Access Token", "NOTE": "This token can be used if you are building an API based integration" }, - "EMAIL_NOTIFICATIONS_SECTION" : { + "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Email Notifications", "NOTE": "Update your email notification preferences here", "CONVERSATION_ASSIGNMENT": "Send email notifications when a conversation is assigned to me", - "CONVERSATION_CREATION": "Send email notifications when a new conversation is created", - "UPDATE_SUCCESS": "Your email notification preferences are updated successfully", + "CONVERSATION_CREATION": "Send email notifications when a new conversation is created" + }, + "API": { + "UPDATE_SUCCESS": "Your notification preferences are updated successfully", "UPDATE_ERROR": "There is an error while updating the preferences, please try again" }, - "PROFILE_IMAGE":{ + "PUSH_NOTIFICATIONS_SECTION": { + "TITLE": "Push Notifications", + "NOTE": "Update your push notification preferences here", + "CONVERSATION_ASSIGNMENT": "Send push notifications when a conversation is assigned to me", + "CONVERSATION_CREATION": "Send push notifications when a new conversation is created", + "HAS_ENABLED_PUSH": "You have enabled push for this browser.", + "REQUEST_PUSH": "Enable push notifications" + }, + "PROFILE_IMAGE": { "LABEL": "Profile Image" }, "NAME": { @@ -58,5 +68,40 @@ "SIDEBAR_ITEMS": { "PROFILE_SETTINGS": "Profile Settings", "LOGOUT": "Logout" + }, + "APP_GLOBAL": { + "TRIAL_MESSAGE": "days trial remaining.", + "TRAIL_BUTTON": "Buy Now" + }, + "COMPONENTS": { + "CODE": { + "BUTTON_TEXT": "Copy", + "COPY_SUCCESSFUL": "Code copied to clipboard successfully" + }, + "FILE_BUBBLE": { + "DOWNLOAD": "Download", + "UPLOADING": "Uploading..." + }, + "FORM_BUBBLE": { + "SUBMIT": "Submit" + } + }, + "CONFIRM_EMAIL": "Verifying...", + "SETTINGS": { + "INBOXES": { + "NEW_INBOX": "Add Inbox" + } + }, + "SIDEBAR": { + "CONVERSATIONS": "Conversations", + "REPORTS": "Reports", + "SETTINGS": "Settings", + "HOME": "Home", + "AGENTS": "Agents", + "INBOXES": "Inboxes", + "CANNED_RESPONSES": "Canned Responses", + "BILLING": "Billing", + "INTEGRATIONS": "Integrations", + "ACCOUNT_SETTINGS": "Account Settings" } } diff --git a/app/javascript/dashboard/i18n/locale/en/signup.json b/app/javascript/dashboard/i18n/locale/en/signup.json index fa535b60d..e52705224 100644 --- a/app/javascript/dashboard/i18n/locale/en/signup.json +++ b/app/javascript/dashboard/i18n/locale/en/signup.json @@ -6,7 +6,7 @@ "ACCOUNT_NAME": { "LABEL": "Account Name", "PLACEHOLDER": "Wayne Enterprises", - "ERROR": "Account Name is too small" + "ERROR": "Account Name is too short" }, "EMAIL": { "LABEL": "Email", diff --git a/app/javascript/dashboard/i18n/locale/es/agentMgmt.json b/app/javascript/dashboard/i18n/locale/es/agentMgmt.json new file mode 100644 index 000000000..e51b64b53 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/es/agentMgmt.json @@ -0,0 +1,101 @@ +{ + "AGENT_MGMT": { + "HEADER": "Agentes", + "HEADER_BTN_TXT": "Añadir agente", + "LOADING": "Se están listando los agentes", + "SIDEBAR_TXT": "

Agentes

Un Agente es miembro de su equipo de Atención al Cliente.

Los agentes podrán ver y responder a los mensajes de sus usuarios. La lista muestra todos los agentes actualmente en su cuenta.

Haga clic en Añadir agente para añadir un nuevo agente. Agente que añadas recibirá un correo electrónico con un enlace de confirmación para activar su cuenta, después de lo cual pueden acceder a Chatwoot y responder a los mensajes.

El acceso a las características de Chatwoot se basa en los siguientes roles.

Agente - Los agentes con este rol sólo pueden acceder a bandejas, informes y conversaciones. Pueden asignar conversaciones a otros agentes o a sí mismos y resolver conversaciones.

Administrador - El administrador tendrá acceso a todas las características de Chatwoot habilitadas para su cuenta, incluyendo configuración y facturación, junto con todos los privilegios de los agentes normales.

", + "AGENT_TYPES": [ + { + "name": "administrator", + "label": "Administrador" + }, + { + "name": "agent", + "label": "Agente" + } + ], + "LIST": { + "404": "No hay agentes asociados a esta cuenta", + "TITLE": "Administrar agentes en tu equipo", + "DESC": "Puedes añadir/eliminar agentes a/en tu equipo.", + "NAME": "Nombre", + "EMAIL": "Correo electrónico", + "STATUS": "Estado", + "ACTIONS": "Acciones", + "VERIFIED": "Verificado", + "VERIFICATION_PENDING": "Verificación pendiente" + }, + "ADD": { + "TITLE": "Añadir agente a tu equipo", + "DESC": "Puedes añadir personas que podrán manejar el soporte para tus bandejas de entrada.", + "FORM": { + "NAME": { + "LABEL": "Nombre del agente", + "PLACEHOLDER": "Introduce el nombre del agente" + }, + "AGENT_TYPE": { + "LABEL": "Tipo de agente", + "PLACEHOLDER": "Seleccione un tipo", + "ERROR": "El tipo de agente es obligatorio" + }, + "EMAIL": { + "LABEL": "Dirección de correo", + "PLACEHOLDER": "Por favor, introduzca una dirección de correo electrónico del agente" + }, + "SUBMIT": "Añadir agente" + }, + "API": { + "SUCCESS_MESSAGE": "Agente añadido correctamente", + "EXIST_MESSAGE": "El correo electrónico del agente ya está en uso, por favor intente otra dirección de correo electrónico", + "ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtalo de nuevo más tarde" + } + }, + "DELETE": { + "BUTTON_TEXT": "Eliminar", + "API": { + "SUCCESS_MESSAGE": "Agente eliminado correctamente", + "ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtalo de nuevo más tarde" + }, + "CONFIRM": { + "TITLE": "Confirmar eliminación", + "MESSAGE": "¿Está seguro de eliminar ", + "YES": "Sí, eliminar ", + "NO": "No, mantenerlo " + } + }, + "EDIT": { + "TITLE": "Editar agente", + "FORM": { + "NAME": { + "LABEL": "Nombre del agente", + "PLACEHOLDER": "Por favor, introduzca un nombre del agente" + }, + "AGENT_TYPE": { + "LABEL": "Tipo de agente", + "PLACEHOLDER": "Por favor, seleccione un tipo", + "ERROR": "El tipo de agente es requerido" + }, + "EMAIL": { + "LABEL": "Dirección de email", + "PLACEHOLDER": "Por favor, introduzca una dirección de correo electrónico del agente" + }, + "SUBMIT": "Editar agente" + }, + "BUTTON_TEXT": "Editar", + "CANCEL_BUTTON_TEXT": "Cancelar", + "API": { + "SUCCESS_MESSAGE": "Agente actualizado correctamente", + "ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtalo de nuevo más tarde" + }, + "PASSWORD_RESET": { + "ADMIN_RESET_BUTTON": "Restablecer contraseña", + "ADMIN_SUCCESS_MESSAGE": "Se ha enviado un correo electrónico con instrucciones para restablecer la contraseña al agente", + "SUCCESS_MESSAGE": "Contraseña del agente restablecida con éxito", + "ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtalo de nuevo más tarde" + } + }, + "SEARCH": { + "NO_RESULTS": "No se encontraron agentes." + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/es/billing.json b/app/javascript/dashboard/i18n/locale/es/billing.json new file mode 100644 index 000000000..a7b7b58fb --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/es/billing.json @@ -0,0 +1,19 @@ +{ + "BILLING": { + "HEADER": "Facturación", + "LOADING": "Obteniendo suscripciones", + "ACCOUNT_STATE": "Estado de cuenta", + "AGENT_COUNT": "Contador de agentes", + "PER_AGENT_COST": "Coste por agente", + "TOTAL_COST": "Coste total", + "BUTTON": { + "ADD": "Añadir método de pago", + "EDIT": "Método de pago EDIT" + }, + "TRIAL": { + "TITLE": "Su período de prueba ha terminado", + "MESSAGE": "Añadir un método de pago para seguir usando Chatwoot." + }, + "ACCOUNT_LOCKED": "Su cuenta no está disponible en este momento.
Póngase en contacto con su administrador para reactivación." + } +} diff --git a/app/javascript/dashboard/i18n/locale/es/cannedMgmt.json b/app/javascript/dashboard/i18n/locale/es/cannedMgmt.json new file mode 100644 index 000000000..61e7ff053 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/es/cannedMgmt.json @@ -0,0 +1,74 @@ +{ + "CANNED_MGMT": { + "HEADER": "Respuestas predefinidas", + "HEADER_BTN_TXT": "Añadir respuesta predefinida", + "LOADING": "Obteniendo respuestas predefinidas", + "SEARCH_404": "No hay elementos que coincidan con esta consulta", + "SIDEBAR_TXT": "

Respuestas predefinidas

Respuestas predefinidas son plantillas de respuesta guardadas que pueden utilizarse para enviar rápidamente una respuesta a una conversación.

Para crear una respuesta predefinida, simplemente haga clic en Añadir respuesta predefinida. También puede editar o eliminar una respuesta predefinida haciendo clic en el botón Editar o Borrar

Las respuestas predefinidas se utilizan con la ayuda de Códigos cortos. Los agentes pueden acceder a las respuestas predefinidas mientras están en un chat escribiendo '/' seguido del código corto.

", + "LIST": { + "404": "No hay respuestas enlatadas disponibles en esta cuenta.", + "TITLE": "Administrar respuestas predefinidas", + "DESC": "Las respuestas predefinidas son plantillas de respuesta predefinidas que se pueden utilizar para enviar rápidamente respuestas a los Tickets.", + "TABLE_HEADER": [ + "Código corto", + "Contenido", + "Acciones" + ] + }, + "ADD": { + "TITLE": "Añadir respuesta predefinida", + "DESC": "Las respuestas predefinidas son plantillas de respuesta guardadas que se pueden utilizar para enviar rápidamente la respuesta a la conversación .", + "FORM": { + "SHORT_CODE": { + "LABEL": "Código corto", + "PLACEHOLDER": "Por favor, introduzca un código corto", + "ERROR": "El código corto es requerido" + }, + "CONTENT": { + "LABEL": "Contenido", + "PLACEHOLDER": "Por favor, introduzca un contenido", + "ERROR": "El contenido es requerido" + }, + "SUBMIT": "Enviar" + }, + "API": { + "SUCCESS_MESSAGE": "Respuesta predefinida añadida correctamente", + "ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtalo de nuevo más tarde" + } + }, + "EDIT": { + "TITLE": "Editar respuesta predefinida", + "FORM": { + "SHORT_CODE": { + "LABEL": "Código corto", + "PLACEHOLDER": "Por favor, introduzca un código corto", + "ERROR": "El código corto es requerido" + }, + "CONTENT": { + "LABEL": "Contenido", + "PLACEHOLDER": "Por favor, introduzca un contenido", + "ERROR": "El contenido es requerido" + }, + "SUBMIT": "Enviar" + }, + "BUTTON_TEXT": "Editar", + "API": { + "SUCCESS_MESSAGE": "Respuesta predefinida actualizada correctamente", + "ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtalo de nuevo más tarde" + } + }, + "DELETE": { + "BUTTON_TEXT": "Eliminar", + "API": { + "SUCCESS_MESSAGE": "Respuesta predefinida eliminada correctamente", + "ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtalo de nuevo más tarde" + }, + "CONFIRM": { + "TITLE": "Confirmar eliminación", + "MESSAGE": "¿Está seguro de eliminar ", + "YES": "Sí, eliminar ", + "NO": "No, mantenerlo " + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/es/chatlist.json b/app/javascript/dashboard/i18n/locale/es/chatlist.json new file mode 100644 index 000000000..6b0409a12 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/es/chatlist.json @@ -0,0 +1,77 @@ +{ + "CHAT_LIST": { + "LOADING": "Obteniendo conversaciones", + "LOAD_MORE_CONVERSATIONS": "Cargar más conversaciones", + "EOF": "Todas las conversaciones cargadas 🎉", + "LIST": { + "404": "No hay conversaciones activas en este grupo." + }, + "TAB_HEADING": "Conversaciones", + "SEARCH": { + "INPUT": "Búsqueda de Personas, Chats, Respuestas Salvadas .." + }, + "STATUS_TABS": [ + { + "NAME": "Abrir", + "KEY": "openCount" + }, + { + "NAME": "Resuelto", + "KEY": "allConvCount" + } + ], + "ASSIGNEE_TYPE_TABS": [ + { + "NAME": "Mina", + "KEY": "me", + "COUNT_KEY": "mineCount" + }, + { + "NAME": "Sin asignar", + "KEY": "unassigned", + "COUNT_KEY": "unAssignedCount" + }, + { + "NAME": "Todos", + "KEY": "all", + "COUNT_KEY": "allCount" + } + ], + "CHAT_STATUS_ITEMS": [ + { + "TEXT": "Abrir", + "VALUE": "open" + }, + { + "TEXT": "Resuelto", + "VALUE": "resolved" + } + ], + "ATTACHMENTS": { + "image": { + "ICON": "ion-image", + "CONTENT": "Mensaje de imagen" + }, + "audio": { + "ICON": "ion-volume-high", + "CONTENT": "Mensaje de audio" + }, + "video": { + "ICON": "ion-ios-videocam", + "CONTENT": "Mensaje de vídeo" + }, + "file": { + "ICON": "ion-document", + "CONTENT": "Archivo adjunto" + }, + "location": { + "ICON": "ion-ios-location", + "CONTENT": "Ubicación" + }, + "fallback": { + "ICON": "ion-link", + "CONTENT": "ha compartido una url" + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/es/contact.json b/app/javascript/dashboard/i18n/locale/es/contact.json new file mode 100644 index 000000000..b70d4bc0c --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/es/contact.json @@ -0,0 +1,20 @@ +{ + "CONTACT_PANEL": { + "CONVERSATION_TITLE": "Detalles de la conversación", + "BROWSER": "Navegador", + "OS": "Sistema operativo", + "INITIATED_FROM": "Iniciado desde", + "INITIATED_AT": "Iniciado el", + "CONVERSATIONS": { + "NO_RECORDS_FOUND": "No hay conversaciones previas asociadas a este contacto.", + "TITLE": "Conversaciones anteriores" + }, + "LABELS": { + "TITLE": "Etiquetas de conversación", + "UPDATE_BUTTON": "Actualizar etiquetas", + "UPDATE_ERROR": "No se pudo actualizar las etiquetas, inténtelo de nuevo.", + "TAG_PLACEHOLDER": "Añadir nueva etiqueta", + "PLACEHOLDER": "Buscar o añadir una etiqueta" + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/es/conversation.json b/app/javascript/dashboard/i18n/locale/es/conversation.json new file mode 100644 index 000000000..267027e9f --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/es/conversation.json @@ -0,0 +1,35 @@ +{ + "CONVERSATION": { + "404": "Por favor, selecciona una conversación del panel izquierdo", + "NO_MESSAGE_1": "¡Oh oh! Parece que no hay mensajes de los clientes en tu bandeja de entrada.", + "NO_MESSAGE_2": " para enviar un mensaje a tu página!", + "NO_INBOX_1": "¡Hola! Parece que aún no has añadido ninguna bandeja de entrada.", + "NO_INBOX_2": " para empezar", + "NO_INBOX_AGENT": "¡Uh Oh! Parece que no eres parte de ninguna bandeja de entrada. Por favor, contacta con tu administrador", + "CLICK_HERE": "Haz clic aquí", + "LOADING_INBOXES": "Cargando bandeja de entrada", + "LOADING_CONVERSATIONS": "Cargando conversaciones", + "DOWNLOAD": "Descargar", + "HEADER": { + "RESOLVE_ACTION": "Resolver", + "REOPEN_ACTION": "Reabrir", + "OPEN": "Más", + "CLOSE": "Cerrar", + "DETAILS": "detalles" + }, + "FOOTER": { + "MSG_INPUT": "Shift + enter for new line. Comience con '/' para seleccionar una respuesta predefinida.", + "PRIVATE_MSG_INPUT": "Mayús + entrar para una nueva línea. Esto será visible sólo para los agentes" + }, + "REPLYBOX": { + "REPLY": "Responder", + "PRIVATE_NOTE": "Nota privada", + "SEND": "Enviar", + "CREATE": "Añadir nota", + "TWEET": "Tweet" + }, + "VISIBLE_TO_AGENTS": "Nota privada: solo visible para ti y tu equipo", + "CHANGE_STATUS": "Estado de la conversación cambiado", + "CHANGE_AGENT": "Conversación cambiada de asignatario" + } +} diff --git a/app/javascript/dashboard/i18n/locale/es/generalSettings.json b/app/javascript/dashboard/i18n/locale/es/generalSettings.json new file mode 100644 index 000000000..860d038a3 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/es/generalSettings.json @@ -0,0 +1,27 @@ +{ + "GENERAL_SETTINGS": { + "TITLE": "Configuración de la cuenta", + "SUBMIT": "Actualizar ajustes", + "UPDATE": { + "ERROR": "No se pudo actualizar la configuración, ¡inténtalo de nuevo!", + "SUCCESS": "Configuración de cuenta actualizada correctamente" + }, + "FORM": { + "ERROR": "Por favor, corrija los errores de formulario", + "GENERAL_SECTION": { + "TITLE": "Ajustes generales", + "NOTE": "" + }, + "NAME": { + "LABEL": "Nombre de cuenta", + "PLACEHOLDER": "Tu nombre de cuenta", + "ERROR": "Por favor, introduzca un nombre de cuenta válido" + }, + "LANGUAGE": { + "LABEL": "Idioma del sitio (Beta)", + "PLACEHOLDER": "Tu nombre de cuenta", + "ERROR": "" + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/es/index.js b/app/javascript/dashboard/i18n/locale/es/index.js new file mode 100644 index 000000000..351906dd9 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/es/index.js @@ -0,0 +1,34 @@ +/* eslint-disable */ +import { default as _agentMgmt } from './agentMgmt.json'; +import { default as _billing } from './billing.json'; +import { default as _cannedMgmt } from './cannedMgmt.json'; +import { default as _chatlist } from './chatlist.json'; +import { default as _contact } from './contact.json'; +import { default as _conversation } from './conversation.json'; +import { default as _inboxMgmt } from './inboxMgmt.json'; +import { default as _login } from './login.json'; +import { default as _report } from './report.json'; +import { default as _resetPassword } from './resetPassword.json'; +import { default as _setNewPassword } from './setNewPassword.json'; +import { default as _settings } from './settings.json'; +import { default as _signup } from './signup.json'; +import { default as _integrations } from './integrations.json'; +import { default as _generalSettings } from './generalSettings.json'; + +export default { + ..._agentMgmt, + ..._billing, + ..._cannedMgmt, + ..._chatlist, + ..._contact, + ..._conversation, + ..._inboxMgmt, + ..._login, + ..._report, + ..._resetPassword, + ..._setNewPassword, + ..._settings, + ..._signup, + ..._integrations, + ..._generalSettings, +}; diff --git a/app/javascript/dashboard/i18n/locale/es/integrations.json b/app/javascript/dashboard/i18n/locale/es/integrations.json new file mode 100644 index 000000000..dd210085b --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/es/integrations.json @@ -0,0 +1,54 @@ +{ + "INTEGRATION_SETTINGS": { + "HEADER": "Integraciones", + "WEBHOOK": { + "TITLE": "Webhook", + "CONFIGURE": "Configurar", + "HEADER": "Configuración de Webhook", + "HEADER_BTN_TXT": "Añadir nuevo webhook", + "INTEGRATION_TXT": "Los eventos Webhook le proporcionan la información en tiempo real sobre lo que está sucediendo en su cuenta de Chatwoot. Puede hacer uso de los webhooks para comunicar los eventos a sus aplicaciones favoritas como Slack o Github. Haga clic en Configurar para configurar sus webhooks.", + "LOADING": "Obteniendo webhooks adjuntos", + "SEARCH_404": "No hay elementos que coincidan con esta consulta", + "SIDEBAR_TXT": "

Webhooks

Webhooks son callbacks HTTP que se pueden definir para cada cuenta. Son activados por eventos como la creación de mensajes en Chatwoot. Puede crear más de un webhook para esta cuenta.

Para crear un webhook , haga clic en el Añadir un nuevo webhook botón. También puede eliminar cualquier webhook existente haciendo clic en el botón Borrar.

", + "LIST": { + "404": "No hay webhooks configurados para esta cuenta.", + "TITLE": "Administrar webhooks", + "DESC": "Los Webhooks son plantillas de respuesta predefinidas que se pueden utilizar para enviar rápidamente respuestas a los Tickets.", + "TABLE_HEADER": [ + "Final de Webhook", + "Acciones" + ] + }, + "ADD": { + "CANCEL": "Cancelar", + "TITLE": "Añadir nuevo webhook", + "DESC": "Los eventos Webhook te proporcionan la información en tiempo real sobre lo que está sucediendo en tu cuenta de Chatwoot. Por favor, introduce una URL válida para configurar un callback.", + "FORM": { + "END_POINT": { + "LABEL": "URL de Webhook", + "PLACEHOLDER": "Ejemplo: https://example/api/webhook", + "ERROR": "Por favor, introduzca una URL válida" + }, + "SUBMIT": "Crear webhook" + }, + "API": { + "SUCCESS_MESSAGE": "Webhook añadido correctamente", + "ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtalo de nuevo más tarde" + } + }, + "DELETE": { + "BUTTON_TEXT": "Eliminar", + "API": { + "SUCCESS_MESSAGE": "Webhook eliminado correctamente", + "ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtalo de nuevo más tarde" + }, + "CONFIRM": { + "TITLE": "Confirmar eliminación", + "MESSAGE": "¿Está seguro de eliminar ", + "YES": "Sí, eliminar ", + "NO": "No, mantenerlo " + } + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/es/login.json b/app/javascript/dashboard/i18n/locale/es/login.json new file mode 100644 index 000000000..d4aa6f422 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/es/login.json @@ -0,0 +1,21 @@ +{ + "LOGIN": { + "TITLE": "Iniciar sesión en Chatwoot", + "EMAIL": { + "LABEL": "E-mail", + "PLACEHOLDER": "Email por ejemplo: alguien@ejemplo.com" + }, + "PASSWORD": { + "LABEL": "Contraseña", + "PLACEHOLDER": "Contraseña" + }, + "API": { + "SUCCESS_MESSAGE": "Inicio de sesión exitoso", + "ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtalo de nuevo más tarde", + "UNAUTH": "Nombre de usuario / Contraseña incorrecto. Inténtelo de nuevo" + }, + "FORGOT_PASSWORD": "¿Olvidaste tu contraseña?", + "CREATE_NEW_ACCOUNT": "Crear nueva cuenta", + "SUBMIT": "Iniciar sesión" + } +} diff --git a/app/javascript/dashboard/i18n/locale/es/report.json b/app/javascript/dashboard/i18n/locale/es/report.json new file mode 100644 index 000000000..f17a83247 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/es/report.json @@ -0,0 +1,49 @@ +{ + "REPORT": { + "HEADER": "Informes", + "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.", + "METRICS": [ + { + "NAME": "Conversaciones", + "KEY": "conversations_count", + "DESC": "( Total )" + }, + { + "NAME": "Mensajes entrantes", + "KEY": "incoming_messages_count", + "DESC": "( Total )" + }, + { + "NAME": "Mensajes salientes", + "KEY": "outgoing_messages_count", + "DESC": "( Total )" + }, + { + "NAME": "Primera respuesta", + "KEY": "avg_first_response_time", + "DESC": "( Media )" + }, + { + "NAME": "Tiempo de resolución", + "KEY": "avg_resolution_time", + "DESC": "( Media )" + }, + { + "NAME": "Número de resoluciones", + "KEY": "resolutions_count", + "DESC": "( Total )" + } + ], + "DATE_RANGE": [ + { + "id": 0, + "name": "Últimos 7 días" + }, + { + "id": 1, + "name": "Últimos 30 días" + } + ] + } +} diff --git a/app/javascript/dashboard/i18n/locale/es/resetPassword.json b/app/javascript/dashboard/i18n/locale/es/resetPassword.json new file mode 100644 index 000000000..60ff9b8d4 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/es/resetPassword.json @@ -0,0 +1,15 @@ +{ + "RESET_PASSWORD": { + "TITLE": "Restablecer contraseña", + "EMAIL": { + "LABEL": "E-mail", + "PLACEHOLDER": "Por favor ingrese su email", + "ERROR": "Por favor ingrese un email válido" + }, + "API": { + "SUCCESS_MESSAGE": "El enlace para restablecer la contraseña ha sido enviado a tu correo electrónico", + "ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtalo de nuevo más tarde" + }, + "SUBMIT": "Enviar" + } +} diff --git a/app/javascript/dashboard/i18n/locale/es/setNewPassword.json b/app/javascript/dashboard/i18n/locale/es/setNewPassword.json new file mode 100644 index 000000000..3f5c29dc6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/es/setNewPassword.json @@ -0,0 +1,20 @@ +{ + "SET_NEW_PASSWORD": { + "TITLE": "Establecer nueva contraseña", + "PASSWORD": { + "LABEL": "Contraseña", + "PLACEHOLDER": "Contraseña", + "ERROR": "La contraseña es demasiado corta" + }, + "CONFIRM_PASSWORD": { + "LABEL": "Confirmar contraseña", + "PLACEHOLDER": "Confirmar contraseña", + "ERROR": "Las contraseñas no coinciden" + }, + "API": { + "SUCCESS_MESSAGE": "Contraseña cambiada con éxito", + "ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtalo de nuevo más tarde" + }, + "SUBMIT": "Enviar" + } +} diff --git a/app/javascript/dashboard/i18n/locale/es/settings.json b/app/javascript/dashboard/i18n/locale/es/settings.json new file mode 100644 index 000000000..5d4bcbd51 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/es/settings.json @@ -0,0 +1,62 @@ +{ + "PROFILE_SETTINGS": { + "LINK": "Ajustes del perfil", + "TITLE": "Ajustes del perfil", + "BTN_TEXT": "Actualizar perfil", + "AFTER_EMAIL_CHANGED": "Su perfil ha sido actualizado con éxito, por favor inicie sesión de nuevo cuando sus credenciales de inicio de sesión se hayan cambiado", + "FORM": { + "AVATAR": "Imagen de perfil", + "ERROR": "Por favor, corrija los errores de formulario", + "REMOVE_IMAGE": "Eliminar", + "UPLOAD_IMAGE": "Subir imagen", + "UPDATE_IMAGE": "Actualizar imagen", + "PROFILE_SECTION": { + "TITLE": "Perfil", + "NOTE": "Su dirección de correo electrónico es su identidad y se utiliza para iniciar sesión." + }, + "PASSWORD_SECTION": { + "TITLE": "Contraseña", + "NOTE": "Actualizar tu contraseña restablecería tus entradas en varios dispositivos." + }, + "ACCESS_TOKEN": { + "TITLE": "Token de acceso", + "NOTE": "Este token puede ser usado si estás construyendo una integración basada en API" + }, + "EMAIL_NOTIFICATIONS_SECTION": { + "TITLE": "Notificaciones por email", + "NOTE": "Actualiza tus preferencias de notificación por correo electrónico aquí", + "CONVERSATION_ASSIGNMENT": "Enviar notificaciones por correo electrónico cuando se me ha asignado una conversación", + "CONVERSATION_CREATION": "Enviar notificaciones por correo electrónico cuando se crea una nueva conversación", + "UPDATE_SUCCESS": "Tus preferencias de notificación por correo electrónico se han actualizado correctamente", + "UPDATE_ERROR": "Se ha producido un error al actualizar las preferencias, inténtelo de nuevo" + }, + "PROFILE_IMAGE": { + "LABEL": "Imagen de perfil" + }, + "NAME": { + "LABEL": "Tu nombre", + "ERROR": "Por favor, introduzca un nombre válido", + "PLACEHOLDER": "Por favor, introduzca su nombre, esto se mostrará en las conversaciones" + }, + "EMAIL": { + "LABEL": "Tu dirección de correo", + "ERROR": "Por favor, introduzca una dirección de correo válida", + "PLACEHOLDER": "Por favor, introduzca su dirección de correo electrónico, esto se mostrará en las conversaciones" + }, + "PASSWORD": { + "LABEL": "Contraseña", + "ERROR": "Por favor, introduzca una contraseña de longitud 6 o más", + "PLACEHOLDER": "Por favor, introduzca una nueva contraseña" + }, + "PASSWORD_CONFIRMATION": { + "LABEL": "Confirmar nueva contraseña", + "ERROR": "Confirmar contraseña debe coincidir con la contraseña", + "PLACEHOLDER": "Por favor, vuelva a introducir su contraseña" + } + } + }, + "SIDEBAR_ITEMS": { + "PROFILE_SETTINGS": "Ajustes del perfil", + "LOGOUT": "Cerrar sesión" + } +} diff --git a/app/javascript/dashboard/i18n/locale/es/signup.json b/app/javascript/dashboard/i18n/locale/es/signup.json new file mode 100644 index 000000000..a2e98b9a9 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/es/signup.json @@ -0,0 +1,32 @@ +{ + "REGISTER": { + "TRY_WOOT": "Registrar una cuenta", + "TITLE": "Registrarse", + "TERMS_ACCEPT": "Al registrarte, aceptas nuestra T & C y nuestra política de privacidad", + "ACCOUNT_NAME": { + "LABEL": "Nombre de cuenta", + "PLACEHOLDER": "Empresas de Wayne", + "ERROR": "El nombre de la cuenta es demasiado corto" + }, + "EMAIL": { + "LABEL": "E-mail", + "PLACEHOLDER": "bruce@wayne.empresas", + "ERROR": "El correo no es válido" + }, + "PASSWORD": { + "LABEL": "Contraseña", + "PLACEHOLDER": "Contraseña", + "ERROR": "La contraseña es demasiado corta" + }, + "CONFIRM_PASSWORD": { + "LABEL": "Confirmar contraseña", + "PLACEHOLDER": "Confirmar contraseña", + "ERROR": "La contraseña no coincide" + }, + "API": { + "SUCCESS_MESSAGE": "Registro Exitoso", + "ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtalo de nuevo más tarde" + }, + "SUBMIT": "Enviar" + } +} diff --git a/app/javascript/dashboard/i18n/locale/es/webhooks.json b/app/javascript/dashboard/i18n/locale/es/webhooks.json new file mode 100644 index 000000000..4bbe18f9c --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/es/webhooks.json @@ -0,0 +1,5 @@ +{ + "WEBHOOKS_SETTINGS": { + "HEADER": "Configuración del Webhook" + } +} diff --git a/app/javascript/dashboard/i18n/locale/fr/agentMgmt.json b/app/javascript/dashboard/i18n/locale/fr/agentMgmt.json new file mode 100644 index 000000000..7141372ec --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/fr/agentMgmt.json @@ -0,0 +1,101 @@ +{ + "AGENT_MGMT": { + "HEADER": "Agents", + "HEADER_BTN_TXT": "Ajouter un agent", + "LOADING": "Récupération de la liste des agents", + "SIDEBAR_TXT": "

Agents

Un agent est un membre de votre équipe d'assistance clientèle.

Les agents pourront voir et répondre aux messages de vos utilisateurs. La liste montre tous les agents actuellement dans votre compte.

Cliquez sur Ajouter un agent pour ajouter un nouvel agent. L'agent que vous ajoutez recevra un courriel avec un lien de confirmation pour activer son compte, après quoi il pourra accéder à Chatwoot et répondre aux messages.

L'accès aux fonctionnalités de Chatwoot est basé sur les rôles suivants.

Agent - Les agents ayant ce rôle ne peuvent accéder qu'aux boîtes de réception, aux rapports et aux conversations. Ils peuvent assigner des conversations à d'autres agents ou eux-mêmes et résoudre des conversations.

Administrateur - Administrateur aura accès à toutes les fonctionnalités de Chatwoot activées pour votre compte, y compris les paramètres et la facturation, ainsi que tous les privilèges d'un agent normal.

", + "AGENT_TYPES": [ + { + "name": "administrator", + "label": "Administrateur" + }, + { + "name": "agent", + "label": "Agent" + } + ], + "LIST": { + "404": "Il n'y a aucun agent associé à ce compte", + "TITLE": "Gérer les agents de votre équipe", + "DESC": "Vous pouvez ajouter/supprimer des agents dans votre équipe.", + "NAME": "Nom", + "EMAIL": "COURRIEL", + "STATUS": "État", + "ACTIONS": "Actions", + "VERIFIED": "Vérifié", + "VERIFICATION_PENDING": "En attente de vérification" + }, + "ADD": { + "TITLE": "Ajouter un agent à votre équipe", + "DESC": "Vous pouvez ajouter des personnes qui pourront gérer le support de vos boîtes de réception.", + "FORM": { + "NAME": { + "LABEL": "Nom de l'agent", + "PLACEHOLDER": "Veuillez entrer un nom de l'agent" + }, + "AGENT_TYPE": { + "LABEL": "Type d'agent", + "PLACEHOLDER": "Veuillez sélectionner un type", + "ERROR": "Le type d'agent est requis" + }, + "EMAIL": { + "LABEL": "Adresse de courriel", + "PLACEHOLDER": "Veuillez entrer l'adresse de courriel de l'agent" + }, + "SUBMIT": "Ajouter l'agent" + }, + "API": { + "SUCCESS_MESSAGE": "Agent ajouté avec succès", + "EXIST_MESSAGE": "Adresse de courriel de l'agent déjà utilisée, veuillez essayer une autre adresse de courriel", + "ERROR_MESSAGE": "Impossible de se connecter au serveur Woot, veuillez réessayer plus tard" + } + }, + "DELETE": { + "BUTTON_TEXT": "Supprimer", + "API": { + "SUCCESS_MESSAGE": "Agent supprimé avec succès", + "ERROR_MESSAGE": "Impossible de se connecter au serveur Woot, veuillez réessayer plus tard" + }, + "CONFIRM": { + "TITLE": "Confirmer la suppression", + "MESSAGE": "Êtes-vous sûr de vouloir supprimer ", + "YES": "Oui, supprimer ", + "NO": "Non, conservez-le " + } + }, + "EDIT": { + "TITLE": "Modifier l'agent", + "FORM": { + "NAME": { + "LABEL": "Nom de l'agent", + "PLACEHOLDER": "Veuillez entrer le nom de l'agent" + }, + "AGENT_TYPE": { + "LABEL": "Type d'agent", + "PLACEHOLDER": "Veuillez sélectionner un type", + "ERROR": "Le type d'agent est requis" + }, + "EMAIL": { + "LABEL": "Adresse de courriel", + "PLACEHOLDER": "Veuillez entrer l'adresse de courriel de l'agent" + }, + "SUBMIT": "Modifier l'agent" + }, + "BUTTON_TEXT": "Modifier", + "CANCEL_BUTTON_TEXT": "Annuler", + "API": { + "SUCCESS_MESSAGE": "Agent mis à jour avec succès", + "ERROR_MESSAGE": "Impossible de se connecter au serveur Woot, veuillez réessayer plus tard" + }, + "PASSWORD_RESET": { + "ADMIN_RESET_BUTTON": "Réinitialiser le mot de passe", + "ADMIN_SUCCESS_MESSAGE": "Un courriel avec les instructions de réinitialisation du mot de passe a été envoyé à l'agent", + "SUCCESS_MESSAGE": "Le mot de passe de l'agent a été réinitialisé avec succès", + "ERROR_MESSAGE": "Impossible de se connecter au serveur Woot, veuillez réessayer plus tard" + } + }, + "SEARCH": { + "NO_RESULTS": "Aucun agent trouvé." + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/fr/billing.json b/app/javascript/dashboard/i18n/locale/fr/billing.json new file mode 100644 index 000000000..f66afe559 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/fr/billing.json @@ -0,0 +1,19 @@ +{ + "BILLING": { + "HEADER": "Facturation", + "LOADING": "Récupération des abonnements", + "ACCOUNT_STATE": "État du compte", + "AGENT_COUNT": "Nombre d'agents", + "PER_AGENT_COST": "Coût par agent", + "TOTAL_COST": "Coût total", + "BUTTON": { + "ADD": "Ajouter une méthode de paiement", + "EDIT": "MODIFIER la méthode de paiement" + }, + "TRIAL": { + "TITLE": "Votre période d'essai est terminée", + "MESSAGE": "Ajoutez une méthode de paiement pour continuer à utiliser Chatwoot." + }, + "ACCOUNT_LOCKED": "Votre compte n'est pas disponible pour le moment.
Veuillez contacter votre administrateur pour la réactivation." + } +} diff --git a/app/javascript/dashboard/i18n/locale/fr/cannedMgmt.json b/app/javascript/dashboard/i18n/locale/fr/cannedMgmt.json new file mode 100644 index 000000000..621068ba6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/fr/cannedMgmt.json @@ -0,0 +1,74 @@ +{ + "CANNED_MGMT": { + "HEADER": "Réponses standardisées", + "HEADER_BTN_TXT": "Ajouter une réponse standardisée", + "LOADING": "Récupération des réponses standardisées", + "SEARCH_404": "Il n'y a aucun élément correspondant à cette requête", + "SIDEBAR_TXT": "

Réponses standardisées

Les réponses standardisées sont des modèles de réponse qui peuvent être utilisés pour envoyer rapidement une réponse à une conversation.

Pour créer une réponse standardisée, il suffit de cliquer sur Ajouter une réponse standardisée. Vous pouvez également modifier ou supprimer une réponse standardisée existante en cliquant sur le bouton Modifier ou Supprimer

Les réponses standardisées sont utilisées à l'aide de raccourcis. Les agents peuvent accéder aux réponses standardisées pendant une conversation en tapant '/' suivi du raccourci.

", + "LIST": { + "404": "Il n'y a aucune réponse standardisée disponible dans ce compte.", + "TITLE": "Gérer les réponses standardisées", + "DESC": "Les réponses standardisées sont des modèles de réponse prédéfinis qui peuvent être utilisés pour envoyer rapidement des réponses aux tickets.", + "TABLE_HEADER": [ + "Raccourcis", + "Contenu", + "Actions" + ] + }, + "ADD": { + "TITLE": "Ajouter une réponse standardisée", + "DESC": "Les réponses standardisées sont des modèles de réponse qui peuvent être utilisés pour envoyer rapidement une réponse à la conversation.", + "FORM": { + "SHORT_CODE": { + "LABEL": "Raccourcis", + "PLACEHOLDER": "Veuillez entrer un raccourci", + "ERROR": "Le raccourci est requis" + }, + "CONTENT": { + "LABEL": "Contenu", + "PLACEHOLDER": "Veuillez saisir un contenu", + "ERROR": "Le contenu est requis" + }, + "SUBMIT": "Envoyer" + }, + "API": { + "SUCCESS_MESSAGE": "Réponse standardisée ajoutée avec succès", + "ERROR_MESSAGE": "Impossible de se connecter au serveur Woot, veuillez réessayer plus tard" + } + }, + "EDIT": { + "TITLE": "Modifier la réponse standardisée", + "FORM": { + "SHORT_CODE": { + "LABEL": "Raccourci", + "PLACEHOLDER": "Veuillez entrer un raccourci", + "ERROR": "Le raccourci est requis" + }, + "CONTENT": { + "LABEL": "Contenu", + "PLACEHOLDER": "Veuillez saisir un contenu", + "ERROR": "Le contenu est requis" + }, + "SUBMIT": "Envoyer" + }, + "BUTTON_TEXT": "Modifier", + "API": { + "SUCCESS_MESSAGE": "La réponse standardisée à été mise à jour avec succès", + "ERROR_MESSAGE": "Impossible de se connecter au serveur Woot, veuillez réessayer plus tard" + } + }, + "DELETE": { + "BUTTON_TEXT": "Supprimer", + "API": { + "SUCCESS_MESSAGE": "Réponse standardisée supprimée avec succès", + "ERROR_MESSAGE": "Impossible de se connecter au serveur Woot, veuillez réessayer plus tard" + }, + "CONFIRM": { + "TITLE": "Confirmer la suppression", + "MESSAGE": "Êtes-vous sûr de vouloir supprimer ", + "YES": "Oui, supprimer ", + "NO": "Non, conservez-le " + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/fr/chatlist.json b/app/javascript/dashboard/i18n/locale/fr/chatlist.json new file mode 100644 index 000000000..e9281f23d --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/fr/chatlist.json @@ -0,0 +1,77 @@ +{ + "CHAT_LIST": { + "LOADING": "Récupération des conversations", + "LOAD_MORE_CONVERSATIONS": "Charger plus de conversations", + "EOF": "Toutes les conversations sont chargées 🎉", + "LIST": { + "404": "Il n'y a aucune conversation active dans ce groupe." + }, + "TAB_HEADING": "Conversations", + "SEARCH": { + "INPUT": "Rechercher des personnes, des conversations, des réponses standardisées ..." + }, + "STATUS_TABS": [ + { + "NAME": "Ouvert", + "KEY": "openCount" + }, + { + "NAME": "Résolu", + "KEY": "allConvCount" + } + ], + "ASSIGNEE_TYPE_TABS": [ + { + "NAME": "Les miens", + "KEY": "me", + "COUNT_KEY": "mineCount" + }, + { + "NAME": "Non assigné", + "KEY": "unassigned", + "COUNT_KEY": "unAssignedCount" + }, + { + "NAME": "Tous", + "KEY": "all", + "COUNT_KEY": "allCount" + } + ], + "CHAT_STATUS_ITEMS": [ + { + "TEXT": "Ouvert", + "VALUE": "open" + }, + { + "TEXT": "Résolu", + "VALUE": "resolved" + } + ], + "ATTACHMENTS": { + "image": { + "ICON": "ion-image", + "CONTENT": "Message image" + }, + "audio": { + "ICON": "ion-volume-high", + "CONTENT": "Message audio" + }, + "video": { + "ICON": "ion-ios-videocam", + "CONTENT": "Message vidéo" + }, + "file": { + "ICON": "ion-document", + "CONTENT": "Pièce jointe" + }, + "location": { + "ICON": "ion-ios-location", + "CONTENT": "Localisation" + }, + "fallback": { + "ICON": "ion-link", + "CONTENT": "a partagé une URL" + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/fr/contact.json b/app/javascript/dashboard/i18n/locale/fr/contact.json new file mode 100644 index 000000000..2b3ff41b9 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/fr/contact.json @@ -0,0 +1,20 @@ +{ + "CONTACT_PANEL": { + "CONVERSATION_TITLE": "Détails de la conversation", + "BROWSER": "Navigateur", + "OS": "Système d'exploitation", + "INITIATED_FROM": "Initié depuis", + "INITIATED_AT": "Initié à", + "CONVERSATIONS": { + "NO_RECORDS_FOUND": "Il n'y a aucune conversation précédente associée à ce contact.", + "TITLE": "Conversations précédentes" + }, + "LABELS": { + "TITLE": "Étiquettes de conversation", + "UPDATE_BUTTON": "Mettre à jour les étiquettes", + "UPDATE_ERROR": "Impossible de mettre à jour les étiquettes. Veuillez réessayer.", + "TAG_PLACEHOLDER": "Ajouter une nouvelle étiquette", + "PLACEHOLDER": "Rechercher ou ajouter une étiquette" + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/fr/conversation.json b/app/javascript/dashboard/i18n/locale/fr/conversation.json new file mode 100644 index 000000000..4ba2b2c90 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/fr/conversation.json @@ -0,0 +1,35 @@ +{ + "CONVERSATION": { + "404": "Veuillez sélectionner une conversation à partir du panneau de gauche", + "NO_MESSAGE_1": "Oh oh ! Il semble qu'il n'y ait aucun message de clients dans votre boîte de réception.", + "NO_MESSAGE_2": " pour envoyer un message à votre page !", + "NO_INBOX_1": "Oh ! On dirait que vous n'avez pas encore ajouté de boîte de réception.", + "NO_INBOX_2": " pour commencer", + "NO_INBOX_AGENT": "Oh Oh ! Il semble que vous ne faites parti d'aucune boîte de réception. Veuillez contacter votre administrateur", + "CLICK_HERE": "Cliquez ici", + "LOADING_INBOXES": "Chargement des boîtes de réception", + "LOADING_CONVERSATIONS": "Chargement des conversations", + "DOWNLOAD": "Télécharger", + "HEADER": { + "RESOLVE_ACTION": "Résoudre", + "REOPEN_ACTION": "Ré-ouvrir", + "OPEN": "Plus", + "CLOSE": "Fermer", + "DETAILS": "détails" + }, + "FOOTER": { + "MSG_INPUT": "Maj + entrée pour une nouvelle ligne. Commencez par '/' pour sélectionner une réponse standardisée.", + "PRIVATE_MSG_INPUT": "Maj + entrée pour une nouvelle ligne. Cela ne sera visible que par les agents" + }, + "REPLYBOX": { + "REPLY": "Répondre", + "PRIVATE_NOTE": "Note privée", + "SEND": "Envoyer", + "CREATE": "Ajouter une note", + "TWEET": "Tweeter" + }, + "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é" + } +} diff --git a/app/javascript/dashboard/i18n/locale/fr/generalSettings.json b/app/javascript/dashboard/i18n/locale/fr/generalSettings.json new file mode 100644 index 000000000..a9f86dd8f --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/fr/generalSettings.json @@ -0,0 +1,46 @@ +{ + "GENERAL_SETTINGS": { + "TITLE": "Paramètres du compte", + "SUBMIT": "Mettre à jour les paramètres", + "UPDATE": { + "ERROR": "Impossible de mettre à jour les paramètres, essayez à nouveau !", + "SUCCESS": "Paramètres du compte mis à jour avec succès" + }, + "FORM": { + "ERROR": "Veuillez corriger les erreurs du formulaire", + "GENERAL_SECTION": { + "TITLE": "Paramètres généraux", + "NOTE": "" + }, + "NAME": { + "LABEL": "Nom du compte", + "PLACEHOLDER": "Votre nom de compte", + "ERROR": "Veuillez entrer un nom de compte valide" + }, + "LANGUAGE": { + "LABEL": "Langue du site (Beta)", + "PLACEHOLDER": "Votre nom de compte", + "ERROR": "" + }, + "DOMAIN": { + "LABEL": "Domaine", + "PLACEHOLDER": "Le domaine de votre site web", + "ERROR": "" + }, + "SUPPORT_EMAIL": { + "LABEL": "Courriel d'assistance", + "PLACEHOLDER": "L'adresse de courriel de support de votre entreprise", + "ERROR": "" + }, + "ENABLE_DOMAIN_EMAIL": { + "LABEL": "Activer le domaine de messagerie", + "PLACEHOLDER": "Activer le domaine personnalisé de courriel", + "ERROR": "", + "OPTIONS": { + "ENABLED": "Activé", + "DISABLED": "Désactivé" + } + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json new file mode 100644 index 000000000..3a1fa2761 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json @@ -0,0 +1,176 @@ +{ + "INBOX_MGMT": { + "HEADER": "Boîtes de réception", + "SIDEBAR_TXT": "

Boîte de réception

Lorsque vous connectez un site Web ou une page Facebook à Chatwoot, elle est appelée une Boîte de réception. Vous pouvez avoir des boîtes de réception illimitées dans votre compte Chatwoot.

Cliquez sur Ajouter Boîte de réception pour connecter un site Web ou une page Facebook.

Dans le tableau de bord, vous pouvez voir toutes les conversations de toutes vos boîtes de réception en un seul endroit et y répondre dans l'onglet `Conversations`.

Vous pouvez également voir les conversations spécifiques à une boîte de réception en cliquant sur le nom de la boîte de réception sur le volet gauche du tableau de bord.

", + "LIST": { + "404": "Il n'y a aucune boîte de réception associée à ce compte." + }, + "CREATE_FLOW": [ + { + "title": "Choisir un canal", + "route": "settings_inbox_new", + "body": "Choisissez le fournisseur que vous souhaitez intégrer avec Chatwoot." + }, + { + "title": "Créer une boîte de réception", + "route": "settings_inboxes_page_channel", + "body": "Authentifiez votre compte et créez une boîte de réception." + }, + { + "title": "Ajouter des agents", + "route": "settings_inboxes_add_agents", + "body": "Ajouter des agents à la boîte de réception créée." + }, + { + "title": "Voilà !", + "route": "settings_inbox_finish", + "body": "Vous êtes paré !" + } + ], + "ADD": { + "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." + }, + "TWITTER": { + "HELP": "Pour ajouter votre profil Twitter en tant que canal, vous devez lier votre profil Twitter en cliquant sur 'Se connecter avec Twitter' " + }, + "WEBSITE_CHANNEL": { + "TITLE": "Canal site Web", + "DESC": "Créez un canal pour votre site Web et commencez à assister vos clients à l'aide de notre widget de site Web.", + "LOADING_MESSAGE": "Création du canal de support du site Web", + "CHANNEL_NAME": { + "LABEL": "Nom du site Web", + "PLACEHOLDER": "Entrez le nom de votre site Web (ex : Acme Inc)" + }, + "CHANNEL_DOMAIN": { + "LABEL": "Domaine du site Web", + "PLACEHOLDER": "Entrez le domaine de votre site Web (ex : acme.com)" + }, + "CHANNEL_WELCOME_TITLE": { + "LABEL": "Titre de Bienvenue", + "PLACEHOLDER": "Salut !" + }, + "CHANNEL_WELCOME_TAGLINE": { + "LABEL": "Slogan d'accueil", + "PLACEHOLDER": "C'est simple de rentrer en contact avec nous. Demandez-nous quoi que ce soit ou partagez vos commentaires." + }, + "CHANNEL_AGENT_AWAY_MESSAGE": { + "LABEL": "Message lorsque les agents sont absents", + "PLACEHOLDER": "Acme Inc répond en général en quelques heures." + }, + "WIDGET_COLOR": { + "LABEL": "Couleur du Widget", + "PLACEHOLDER": "Mettre à jour la couleur utilisée dans le widget" + }, + "SUBMIT_BUTTON": "Créer une boîte de réception" + }, + "TWILIO": { + "TITLE": "Canal Twilio SMS/WhatsApp", + "DESC": "Intégrez Twilio et commencez à aider vos clients par SMS ou WhatsApp.", + "ACCOUNT_SID": { + "LABEL": "SID du compte", + "PLACEHOLDER": "Veuillez entrer le SID de votre compte Twilio", + "ERROR": "Ce champ est requis" + }, + "CHANNEL_TYPE": { + "LABEL": "Type de canal", + "ERROR": "Veuillez sélectionner votre type de canal" + }, + "AUTH_TOKEN": { + "LABEL": "Jeton d'authentification", + "PLACEHOLDER": "Veuillez entrer votre jeton d'authentification Twilio", + "ERROR": "Ce champ est requis" + }, + "CHANNEL_NAME": { + "LABEL": "Nom du canal", + "PLACEHOLDER": "Veuillez entrer un nom de canal", + "ERROR": "Ce champ est requis" + }, + "PHONE_NUMBER": { + "LABEL": "Numéro de téléphone", + "PLACEHOLDER": "Veuillez entrer le numéro de téléphone à partir duquel le message sera envoyé.", + "ERROR": "Veuillez entrer une valeur valide. Le numéro de téléphone doit commencer par le signe `+`." + }, + "API_CALLBACK": { + "TITLE": "URL de rappel (callback)", + "SUBTITLE": "Vous devez configurer l'URL de rappel (callback) du message dans Twilio avec l'URL mentionnée ici." + }, + "SUBMIT_BUTTON": "Créer le canal Twilio", + "API": { + "ERROR_MESSAGE": "Nous n'avons pas pu authentifier les identifiants Twilio, veuillez réessayer" + } + }, + "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." + }, + "AGENTS": { + "TITLE": "Agents", + "DESC": "Ici vous pouvez ajouter des agents pour gérer votre boîte de réception nouvellement créée. Seuls ces agents sélectionnés auront accès à votre boîte de réception. Les agents qui ne font pas partie de cette boîte de réception ne seront pas en mesure de voir ou de répondre aux messages de cette boîte de réception lorsqu'ils se connectent.
PS : En tant qu'administrateur, si vous avez besoin d'accéder à toutes les boîtes de réception, vous devriez vous ajouter en tant qu'agent à toutes les boîtes de réception que vous créez." + }, + "DETAILS": { + "TITLE": "Détails de la boîte de réception", + "DESC": "Dans le menu déroulant ci-dessous, sélectionnez la page Facebook que vous voulez connecter à Chatwoot. Vous pouvez également donner un nom personnalisé à votre boîte de réception pour une meilleure identification." + }, + "FINISH": { + "TITLE": "Mission accomplie !", + "DESC": "Vous avez terminé avec succès l’intégration de votre page Facebook avec Chatwoot. La prochaine fois qu’un client enverra un message à votre page, la conversation apparaîtra automatiquement dans votre boîte de réception.
Nous fournissons également un script de widget que vous pouvez facilement ajouter à votre site Web. Une fois que cela est configuré sur votre site web, les clients peuvent vous envoyer des messages directement depuis votre site Web sans l'aide d'un outil externe et la conversation apparaîtra ici, sur Chatwoot.
Cool, hein ? Eh bien, nous essayons de l'être :)" + } + }, + "DETAILS": { + "LOADING_FB": "Authentification avec Facebook ...", + "ERROR_FB_AUTH": "Une erreur s'est produite, veuillez rafraîchir la page ...", + "CREATING_CHANNEL": "Création de votre boîte de réception ...", + "TITLE": "Configurer les détails de la boîte de réception", + "DESC": "" + }, + "AGENTS": { + "BUTTON_TEXT": "Ajouter des agents", + "ADD_AGENTS": "Ajout d'agents à votre boîte de réception ..." + }, + "FINISH": { + "TITLE": "Votre boîte de réception est prête !", + "MESSAGE": "Vous pouvez maintenant vous impliquer auprès de vos clients par le biais de votre nouveau canal. Bonne assistance ", + "BUTTON_TEXT": "Emmenez-moi là", + "WEBSITE_SUCCESS": "Vous avez terminé avec succès la création d'un canal Web. Copiez le code affiché ci-dessous et collez-le sur votre site web. La prochaine fois qu'un client utilisera le chat en direct, la conversation apparaîtra automatiquement dans votre boîte de réception." + }, + "REAUTH": "Réautoriser", + "VIEW": "Voir", + "EDIT": { + "API": { + "SUCCESS_MESSAGE": "Paramètres de boîte de réception mis à jour avec succès", + "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Affectation automatique mise à jour avec succès", + "ERROR_MESSAGE": "Impossible de mettre à jour la couleur du widget. Veuillez réessayer plus tard." + }, + "AUTO_ASSIGNMENT": { + "ENABLED": "Activé", + "DISABLED": "Désactivé" + } + }, + "DELETE": { + "BUTTON_TEXT": "Supprimer", + "CONFIRM": { + "TITLE": "Confirmer la suppression", + "MESSAGE": "Êtes-vous sûr de vouloir supprimer ", + "YES": "Oui, supprimer ", + "NO": "Non, conservez-le " + }, + "API": { + "SUCCESS_MESSAGE": "Boîte de réception supprimée avec succès", + "ERROR_MESSAGE": "Impossible de supprimer la boîte de réception. Veuillez réessayer plus tard." + } + }, + "SETTINGS": "Paramètres", + "SETTINGS_POPUP": { + "MESSENGER_HEADING": "Script du Widget Web", + "MESSENGER_SUB_HEAD": "Placez ce code avant la fermeture de votre balise body", + "INBOX_AGENTS": "Agents", + "INBOX_AGENTS_SUB_TEXT": "Ajouter ou supprimer des agents de cette boîte de réception", + "UPDATE": "Mettre à jour", + "AUTO_ASSIGNMENT": "Activer l'assignation automatique", + "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/index.js b/app/javascript/dashboard/i18n/locale/fr/index.js new file mode 100644 index 000000000..351906dd9 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/fr/index.js @@ -0,0 +1,34 @@ +/* eslint-disable */ +import { default as _agentMgmt } from './agentMgmt.json'; +import { default as _billing } from './billing.json'; +import { default as _cannedMgmt } from './cannedMgmt.json'; +import { default as _chatlist } from './chatlist.json'; +import { default as _contact } from './contact.json'; +import { default as _conversation } from './conversation.json'; +import { default as _inboxMgmt } from './inboxMgmt.json'; +import { default as _login } from './login.json'; +import { default as _report } from './report.json'; +import { default as _resetPassword } from './resetPassword.json'; +import { default as _setNewPassword } from './setNewPassword.json'; +import { default as _settings } from './settings.json'; +import { default as _signup } from './signup.json'; +import { default as _integrations } from './integrations.json'; +import { default as _generalSettings } from './generalSettings.json'; + +export default { + ..._agentMgmt, + ..._billing, + ..._cannedMgmt, + ..._chatlist, + ..._contact, + ..._conversation, + ..._inboxMgmt, + ..._login, + ..._report, + ..._resetPassword, + ..._setNewPassword, + ..._settings, + ..._signup, + ..._integrations, + ..._generalSettings, +}; diff --git a/app/javascript/dashboard/i18n/locale/fr/integrations.json b/app/javascript/dashboard/i18n/locale/fr/integrations.json new file mode 100644 index 000000000..a13a2b78d --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/fr/integrations.json @@ -0,0 +1,54 @@ +{ + "INTEGRATION_SETTINGS": { + "HEADER": "Intégrations", + "WEBHOOK": { + "TITLE": "Webhook", + "CONFIGURE": "Configurer", + "HEADER": "Paramètres de Webhook", + "HEADER_BTN_TXT": "Ajouter un nouveau Webhook", + "INTEGRATION_TXT": "Les événements Webhook vous fournissent des informations en temps réel sur ce qui se passe dans votre compte Chatwoot. Vous pouvez utiliser les Webhooks pour transmettre les événements à vos applications préférées comme Slack ou Github. Cliquez sur Configurer pour configurer vos Webhooks.", + "LOADING": "Récupération des Webhooks connectés", + "SEARCH_404": "Il n'y a aucun élément correspondant à cette requête", + "SIDEBAR_TXT": "

Webhooks

Les Webhooks sont des fonctions de rappel HTTP qui peuvent être définis pour chaque compte. Ils sont déclenchés par des événements comme la création de messages dans Chatwoot. Vous pouvez créer plusieurs Webhook pour ce compte.

Pour créer un Webhook, cliquez sur le bouton Ajouter un nouveau webhook . Vous pouvez également supprimer n'importe quel Webhook existant en cliquant sur le bouton Supprimer.

", + "LIST": { + "404": "Il n'y a aucun Webhook configuré pour ce compte.", + "TITLE": "Gérer les webhooks", + "DESC": "Les événements Webhook vous fournissent des informations en temps réel sur ce qui se passe dans votre compte Chatwoot.", + "TABLE_HEADER": [ + "Point de terminaison du Webhook", + "Actions" + ] + }, + "ADD": { + "CANCEL": "Annuler", + "TITLE": "Ajouter un nouveau webhook", + "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": { + "END_POINT": { + "LABEL": "URL du Webhook", + "PLACEHOLDER": "Exemple : https://exemple/api/webhook", + "ERROR": "Veuillez entrer une URL valide" + }, + "SUBMIT": "Créer le webhook" + }, + "API": { + "SUCCESS_MESSAGE": "Webhook ajouté avec succès", + "ERROR_MESSAGE": "Impossible de se connecter au serveur Woot, veuillez réessayer plus tard" + } + }, + "DELETE": { + "BUTTON_TEXT": "Supprimer", + "API": { + "SUCCESS_MESSAGE": "Webhook supprimé avec succès", + "ERROR_MESSAGE": "Impossible de se connecter au serveur Woot, veuillez réessayer plus tard" + }, + "CONFIRM": { + "TITLE": "Confirmer la suppression", + "MESSAGE": "Êtes-vous sûr de vouloir supprimer ", + "YES": "Oui, supprimer ", + "NO": "Non, conservez-le " + } + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/fr/login.json b/app/javascript/dashboard/i18n/locale/fr/login.json new file mode 100644 index 000000000..fbd431e11 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/fr/login.json @@ -0,0 +1,21 @@ +{ + "LOGIN": { + "TITLE": "Se connecter à Chatwoot", + "EMAIL": { + "LABEL": "Courriel", + "PLACEHOLDER": "Courriel ex : quelquun@exemple.com" + }, + "PASSWORD": { + "LABEL": "Mot de passe", + "PLACEHOLDER": "Mot de passe" + }, + "API": { + "SUCCESS_MESSAGE": "Connexion réussie", + "ERROR_MESSAGE": "Impossible de se connecter au serveur Woot, veuillez réessayer plus tard", + "UNAUTH": "Nom d'utilisateur / Mot de passe incorrect. Veuillez réessayer" + }, + "FORGOT_PASSWORD": "Mot de passe oublié ?", + "CREATE_NEW_ACCOUNT": "Créer un nouveau compte", + "SUBMIT": "Se connecter" + } +} diff --git a/app/javascript/dashboard/i18n/locale/fr/report.json b/app/javascript/dashboard/i18n/locale/fr/report.json new file mode 100644 index 000000000..04a95acf9 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/fr/report.json @@ -0,0 +1,49 @@ +{ + "REPORT": { + "HEADER": "Rapports", + "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.", + "METRICS": [ + { + "NAME": "Conversations", + "KEY": "conversations_count", + "DESC": "(Total)" + }, + { + "NAME": "Messages entrants", + "KEY": "incoming_messages_count", + "DESC": "(Total)" + }, + { + "NAME": "Messages sortants", + "KEY": "outgoing_messages_count", + "DESC": "(Total)" + }, + { + "NAME": "Délai de la première réponse", + "KEY": "avg_first_response_time", + "DESC": "(Moy.)" + }, + { + "NAME": "Temps de résolution", + "KEY": "avg_resolution_time", + "DESC": "(Moy.)" + }, + { + "NAME": "Nombre de résolutions", + "KEY": "resolutions_count", + "DESC": "(Total)" + } + ], + "DATE_RANGE": [ + { + "id": 0, + "name": "7 derniers jours" + }, + { + "id": 1, + "name": "30 derniers jours" + } + ] + } +} diff --git a/app/javascript/dashboard/i18n/locale/fr/resetPassword.json b/app/javascript/dashboard/i18n/locale/fr/resetPassword.json new file mode 100644 index 000000000..2f2750c95 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/fr/resetPassword.json @@ -0,0 +1,15 @@ +{ + "RESET_PASSWORD": { + "TITLE": "Réinitialiser le mot de passe", + "EMAIL": { + "LABEL": "Courriel", + "PLACEHOLDER": "Veuillez saisir votre adresse de courriel", + "ERROR": "Veuillez saisir une adresse de courriel valide" + }, + "API": { + "SUCCESS_MESSAGE": "Le lien de réinitialisation du mot de passe a été envoyé à votre adresse de courriel", + "ERROR_MESSAGE": "Impossible de se connecter au serveur Woot, veuillez réessayer plus tard" + }, + "SUBMIT": "Envoyer" + } +} diff --git a/app/javascript/dashboard/i18n/locale/fr/setNewPassword.json b/app/javascript/dashboard/i18n/locale/fr/setNewPassword.json new file mode 100644 index 000000000..35f6d595e --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/fr/setNewPassword.json @@ -0,0 +1,20 @@ +{ + "SET_NEW_PASSWORD": { + "TITLE": "Définir un nouveau mot de passe", + "PASSWORD": { + "LABEL": "Mot de passe", + "PLACEHOLDER": "Mot de passe", + "ERROR": "Le mot de passe est trop court" + }, + "CONFIRM_PASSWORD": { + "LABEL": "Confirmer le mot de passe", + "PLACEHOLDER": "Confirmer le mot de passe", + "ERROR": "Les mots de passe ne correspondent pas" + }, + "API": { + "SUCCESS_MESSAGE": "Mot de passe modifié avec succès", + "ERROR_MESSAGE": "Impossible de se connecter au serveur Woot, veuillez réessayer plus tard" + }, + "SUBMIT": "Envoyer" + } +} diff --git a/app/javascript/dashboard/i18n/locale/fr/settings.json b/app/javascript/dashboard/i18n/locale/fr/settings.json new file mode 100644 index 000000000..a91e8941f --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/fr/settings.json @@ -0,0 +1,84 @@ +{ + "PROFILE_SETTINGS": { + "LINK": "Paramètres de profil", + "TITLE": "Paramètres de profil", + "BTN_TEXT": "Mettre à jour le profil", + "AFTER_EMAIL_CHANGED": "Votre profil a été mis à jour avec succès, veuillez vous reconnecter car vos identifiants de connexion ont été modifiés", + "FORM": { + "AVATAR": "Image de profil", + "ERROR": "Veuillez corriger les erreurs du formulaire", + "REMOVE_IMAGE": "Supprimer", + "UPLOAD_IMAGE": "Téléverser une image", + "UPDATE_IMAGE": "Mettre à jour l'image", + "PROFILE_SECTION": { + "TITLE": "Profil", + "NOTE": "Votre adresse de courriel est votre identité et est utilisée pour vous connecter." + }, + "PASSWORD_SECTION": { + "TITLE": "Mot de passe", + "NOTE": "Mettre à jour votre mot de passe réinitialisera vos connexions sur plusieurs appareils." + }, + "ACCESS_TOKEN": { + "TITLE": "Jeton d'accès", + "NOTE": "Ce jeton peut être utilisé si vous construisez une intégration basée sur l'API" + }, + "EMAIL_NOTIFICATIONS_SECTION": { + "TITLE": "Notifications par courriel", + "NOTE": "Mettez à jour vos préférences de notification par courriel ici", + "CONVERSATION_ASSIGNMENT": "Envoyer des notifications par courriel lorsqu'une conversation m'est assignée", + "CONVERSATION_CREATION": "Envoyer des notifications par courriel quand une nouvelle conversation est créée" + }, + "API": { + "UPDATE_SUCCESS": "Vos préférences de notifications ont été mises à jour avec succès", + "UPDATE_ERROR": "Une erreur est survenue lors de la mise à jour des préférences, veuillez réessayer" + }, + "PUSH_NOTIFICATIONS_SECTION": { + "TITLE": "Notifications push", + "NOTE": "Mettez à jour vos préférences de notification push ici", + "CONVERSATION_ASSIGNMENT": "Envoyer des notifications push lorsqu'une conversation m'est assignée", + "CONVERSATION_CREATION": "Envoyer des notifications push quand une nouvelle conversation est créée", + "HAS_ENABLED_PUSH": "Vous avez activé les notifications pour ce navigateur.", + "REQUEST_PUSH": "Activer les notifications push" + }, + "PROFILE_IMAGE": { + "LABEL": "Image de profil" + }, + "NAME": { + "LABEL": "Votre nom", + "ERROR": "Veuillez entrer un nom valide", + "PLACEHOLDER": "Veuillez entrer votre nom, cela sera affiché dans les conversations" + }, + "EMAIL": { + "LABEL": "Votre adresse de courriel", + "ERROR": "Veuillez saisir une adresse de courriel valide", + "PLACEHOLDER": "Veuillez entrer votre adresse de courriel, cela sera affiché dans les conversations" + }, + "PASSWORD": { + "LABEL": "Mot de passe", + "ERROR": "Veuillez entrer un mot de passe de 6 caractères ou plus", + "PLACEHOLDER": "Veuillez entrer un nouveau mot de passe" + }, + "PASSWORD_CONFIRMATION": { + "LABEL": "Confirmer le nouveau mot de passe", + "ERROR": "La confirmation du mot de passe doit correspondre au mot de passe", + "PLACEHOLDER": "Veuillez saisir à nouveau votre mot de passe" + } + } + }, + "SIDEBAR_ITEMS": { + "PROFILE_SETTINGS": "Paramètres de profil", + "LOGOUT": "Se déconnecter" + }, + "SIDEBAR": { + "CONVERSATIONS": "Conversations", + "REPORTS": "Rapports", + "SETTINGS": "Réglages", + "HOME": "Accueil", + "AGENTS": "Agentes", + "INBOXES": "Boîtes de réception", + "CANNED_RESPONSES": "Réponses en conserve", + "BILLING": "Facturation", + "INTEGRATIONS": "Intégrations", + "ACCOUNT_SETTINGS": "Paramètres du compte" + } +} diff --git a/app/javascript/dashboard/i18n/locale/fr/signup.json b/app/javascript/dashboard/i18n/locale/fr/signup.json new file mode 100644 index 000000000..61eca7907 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/fr/signup.json @@ -0,0 +1,32 @@ +{ + "REGISTER": { + "TRY_WOOT": "Créer un compte", + "TITLE": "Inscription", + "TERMS_ACCEPT": "En vous inscrivant, vous acceptez nos CGU et notre politique de confidentialité", + "ACCOUNT_NAME": { + "LABEL": "Nom du compte", + "PLACEHOLDER": "Entreprises Wayne", + "ERROR": "Le nom de compte est trop court" + }, + "EMAIL": { + "LABEL": "Courriel", + "PLACEHOLDER": "bruce@wayne.entreprises", + "ERROR": "L'adresse de courriel est invalide" + }, + "PASSWORD": { + "LABEL": "Mot de passe", + "PLACEHOLDER": "Mot de passe", + "ERROR": "Le mot de passe est trop court" + }, + "CONFIRM_PASSWORD": { + "LABEL": "Confirmer le mot de passe", + "PLACEHOLDER": "Confirmer le mot de passe", + "ERROR": "Les mots de passe ne correspondent pas" + }, + "API": { + "SUCCESS_MESSAGE": "Inscription réussie", + "ERROR_MESSAGE": "Impossible de se connecter au serveur Woot, veuillez réessayer plus tard" + }, + "SUBMIT": "Envoyer" + } +} diff --git a/app/javascript/dashboard/i18n/locale/fr/webhooks.json b/app/javascript/dashboard/i18n/locale/fr/webhooks.json new file mode 100644 index 000000000..6cf498b37 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/fr/webhooks.json @@ -0,0 +1,5 @@ +{ + "WEBHOOKS_SETTINGS": { + "HEADER": "Paramètres de Webhook" + } +} diff --git a/app/javascript/dashboard/i18n/locale/it/agentMgmt.json b/app/javascript/dashboard/i18n/locale/it/agentMgmt.json new file mode 100644 index 000000000..adf4da548 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/it/agentMgmt.json @@ -0,0 +1,101 @@ +{ + "AGENT_MGMT": { + "HEADER": "Agenti", + "HEADER_BTN_TXT": "Aggiungi Agente", + "LOADING": "Recupero elenco Operatori", + "SIDEBAR_TXT": "

Agenti

Un Agente è membro del tuo team di Assistenza.

Gli agenti saranno in grado di visualizzare e rispondere ai messaggi dei tuoi utenti. L'elenco mostra tutti gli agenti attualmente presenti nel tuo account.

Clicca su Aggiungi Agente per aggiungere un nuovo agente. L'operatore che aggiungi riceverà un'email con un link di conferma per attivare il proprio account, dopo di che potranno accedere a Chatwoot e rispondere ai messaggi.

Accesso alle funzionalità di Chatwoot, sono basate sui seguenti ruoli.

Agente - Gli agenti con questo ruolo possono accedere solo a caselle, segnalazioni e conversazioni. Possono assegnare conversazioni ad altri agenti o a se stessi e risolvere le conversazioni.

Amministratore - L'amministratore avrà accesso a tutte le funzionalità di Chatwoot abilitate per il tuo account, incluse impostazioni e fatturazione, insieme a tutti i privilegi dei normali agenti.

", + "AGENT_TYPES": [ + { + "name": "amministratore", + "label": "Amministratore" + }, + { + "name": "agente", + "label": "Agente" + } + ], + "LIST": { + "404": "Non ci sono agenti associati a questo account", + "TITLE": "Gestisci gli agenti nel tuo team", + "DESC": "Puoi aggiungere/rimuovere agenti da/nel tuo team.", + "NAME": "nome", + "EMAIL": "EMAIL", + "STATUS": "Stato", + "ACTIONS": "azioni", + "VERIFIED": "Verificato", + "VERIFICATION_PENDING": "Verifica in sospeso" + }, + "ADD": { + "TITLE": "Aggiungi agente al tuo team", + "DESC": "Puoi aggiungere persone che saranno in grado di gestire il supporto per le tue caselle.", + "FORM": { + "NAME": { + "LABEL": "Nome dell'Agente", + "PLACEHOLDER": "Inserisci un nome dell'agente" + }, + "AGENT_TYPE": { + "LABEL": "Tipo Agente", + "PLACEHOLDER": "Seleziona un tipo", + "ERROR": "Tipo agente richiesto" + }, + "EMAIL": { + "LABEL": "Indirizzo email", + "PLACEHOLDER": "Si prega di inserire un indirizzo email dell'agente" + }, + "SUBMIT": "Aggiungi Agente" + }, + "API": { + "SUCCESS_MESSAGE": "Agente: aggiunto correttamente", + "EXIST_MESSAGE": "Agente: email già in uso, prova con un altro indirizzo email", + "ERROR_MESSAGE": "Impossibile connettersi al server Woot, riprova più tardi" + } + }, + "DELETE": { + "BUTTON_TEXT": "Cancellare", + "API": { + "SUCCESS_MESSAGE": "Agente: eliminato con successo", + "ERROR_MESSAGE": "Impossibile connettersi al server Woot, riprova più tardi" + }, + "CONFIRM": { + "TITLE": "Conferma eliminazione", + "MESSAGE": "Sei sicuro di voler eliminare ", + "YES": "Sì, elimina ", + "NO": "No, mantienilo " + } + }, + "EDIT": { + "TITLE": "Modifica agente", + "FORM": { + "NAME": { + "LABEL": "Nome dell'Agente", + "PLACEHOLDER": "Inserisci un nome dell'agente" + }, + "AGENT_TYPE": { + "LABEL": "Tipo Agente", + "PLACEHOLDER": "Seleziona un tipo", + "ERROR": "Tipo agente richiesto" + }, + "EMAIL": { + "LABEL": "Indirizzo email", + "PLACEHOLDER": "Si prega di inserire un indirizzo email dell'agente" + }, + "SUBMIT": "Modifica Agente" + }, + "BUTTON_TEXT": "Modifica", + "CANCEL_BUTTON_TEXT": "annulla", + "API": { + "SUCCESS_MESSAGE": "Agente: aggiornato correttamente", + "ERROR_MESSAGE": "Impossibile connettersi al server Woot, riprova più tardi" + }, + "PASSWORD_RESET": { + "ADMIN_RESET_BUTTON": "Reimpostare la password", + "ADMIN_SUCCESS_MESSAGE": "Un'email con le istruzioni per reimpostare la password è stata inviata all'agente", + "SUCCESS_MESSAGE": "Agente: reimpostata correttamente", + "ERROR_MESSAGE": "Impossibile connettersi al server Woot, riprova più tardi" + } + }, + "SEARCH": { + "NO_RESULTS": "Nessun agente trovato." + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/it/billing.json b/app/javascript/dashboard/i18n/locale/it/billing.json new file mode 100644 index 000000000..af0c125e7 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/it/billing.json @@ -0,0 +1,19 @@ +{ + "BILLING": { + "HEADER": "Fatturazione", + "LOADING": "Recupero Iscrizioni", + "ACCOUNT_STATE": "Stato del conto", + "AGENT_COUNT": "Conteggio Agente", + "PER_AGENT_COST": "Costo per agente", + "TOTAL_COST": "Costo totale", + "BUTTON": { + "ADD": "Aggiungi metodo di pagamento", + "EDIT": "Metodo di pagamento EDIT" + }, + "TRIAL": { + "TITLE": "Il tuo periodo di prova è finito", + "MESSAGE": "Aggiungi un metodo di pagamento per continuare a utilizzare Chatwoot." + }, + "ACCOUNT_LOCKED": "Il tuo account non è al momento disponibile.
Si prega di contattare l'amministratore per la riattivazione." + } +} diff --git a/app/javascript/dashboard/i18n/locale/it/cannedMgmt.json b/app/javascript/dashboard/i18n/locale/it/cannedMgmt.json new file mode 100644 index 000000000..54a48e272 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/it/cannedMgmt.json @@ -0,0 +1,74 @@ +{ + "CANNED_MGMT": { + "HEADER": "Risposte predefinite", + "HEADER_BTN_TXT": "Aggiungi risposta predefinita", + "LOADING": "Recupero risposte predefinite", + "SEARCH_404": "Non ci sono elementi che corrispondono a questa richiesta", + "SIDEBAR_TXT": "

Risposte predefinite

Le risposte predefinite sono modelli di risposta salvati che possono essere utilizzati per inviare rapidamente una risposta a una conversazione.

Per creare una risposta predefinita, basta cliccare sulla Aggiungi risposta preconfezionata. Puoi anche modificare o eliminare una risposta predefinita esistente cliccando sul pulsante Modifica o Elimina

risposte predefinite sono utilizzate con l'aiuto di Codici Brevi. Gli agenti possono accedere alle risposte predefinite durante una chat digitando '/' seguiti dal codice breve.

", + "LIST": { + "404": "Non ci sono risposte predefinite disponibili in questo account.", + "TITLE": "Gestisci le risposte predefinite", + "DESC": "Le risposte predefinite sono modelli di risposta predefiniti che possono essere utilizzati per inviare rapidamente risposte ai ticket.", + "TABLE_HEADER": [ + "Codice Breve", + "Contenuto", + "azioni" + ] + }, + "ADD": { + "TITLE": "Aggiungi risposta predefinita", + "DESC": "Le risposte predefinite sono modelli di risposta salvati che possono essere utilizzati per inviare rapidamente una risposta alla conversazione.", + "FORM": { + "SHORT_CODE": { + "LABEL": "Codice Breve", + "PLACEHOLDER": "Si prega di inserire uno shortcode", + "ERROR": "Il codice breve è obbligatorio" + }, + "CONTENT": { + "LABEL": "Contenuto", + "PLACEHOLDER": "Inserisci un contenuto", + "ERROR": "Il contenuto è obbligatorio" + }, + "SUBMIT": "Invia" + }, + "API": { + "SUCCESS_MESSAGE": "Risposta predefinita aggiunta correttamente", + "ERROR_MESSAGE": "Impossibile connettersi al server Woot, riprova più tardi" + } + }, + "EDIT": { + "TITLE": "Modifica risposta predefinita", + "FORM": { + "SHORT_CODE": { + "LABEL": "Codice Breve", + "PLACEHOLDER": "Si prega di inserire uno shortcode", + "ERROR": "Il codice breve è obbligatorio" + }, + "CONTENT": { + "LABEL": "Contenuto", + "PLACEHOLDER": "Inserisci un contenuto", + "ERROR": "Il contenuto è obbligatorio" + }, + "SUBMIT": "Invia" + }, + "BUTTON_TEXT": "Modifica", + "API": { + "SUCCESS_MESSAGE": "Risposta predefinita aggiornata con successo", + "ERROR_MESSAGE": "Impossibile connettersi al server Woot, riprova più tardi" + } + }, + "DELETE": { + "BUTTON_TEXT": "Cancellare", + "API": { + "SUCCESS_MESSAGE": "Risposta preconfezionata eliminata correttamente", + "ERROR_MESSAGE": "Impossibile connettersi al server Woot, riprova più tardi" + }, + "CONFIRM": { + "TITLE": "Conferma eliminazione", + "MESSAGE": "Sei sicuro di voler eliminare ", + "YES": "Sì, elimina ", + "NO": "No, mantienilo " + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/it/chatlist.json b/app/javascript/dashboard/i18n/locale/it/chatlist.json new file mode 100644 index 000000000..de728db49 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/it/chatlist.json @@ -0,0 +1,77 @@ +{ + "CHAT_LIST": { + "LOADING": "Recupero conversazioni", + "LOAD_MORE_CONVERSATIONS": "Carica altre conversazioni", + "EOF": "Tutte le conversazioni caricate 🎉", + "LIST": { + "404": "Non ci sono conversazioni attive in questo gruppo." + }, + "TAB_HEADING": "Conversazioni", + "SEARCH": { + "INPUT": "Cerca persone, Chat, risposte salvate .." + }, + "STATUS_TABS": [ + { + "NAME": "Apri", + "KEY": "contaaperture" + }, + { + "NAME": "Risolti", + "KEY": "Conteggio" + } + ], + "ASSIGNEE_TYPE_TABS": [ + { + "NAME": "Miniera", + "KEY": "Io", + "COUNT_KEY": "contaMinore" + }, + { + "NAME": "Non assegnato", + "KEY": "non assegnato", + "COUNT_KEY": "unAssignedCount" + }, + { + "NAME": "Tutti", + "KEY": "Tutti", + "COUNT_KEY": "allCount" + } + ], + "CHAT_STATUS_ITEMS": [ + { + "TEXT": "Apri", + "VALUE": "Aperto" + }, + { + "TEXT": "Risolti", + "VALUE": "risolto" + } + ], + "ATTACHMENTS": { + "image": { + "ICON": "ion-image", + "CONTENT": "Messaggio immagine" + }, + "audio": { + "ICON": "-quantità-alto", + "CONTENT": "Messaggio audio" + }, + "video": { + "ICON": "videocam", + "CONTENT": "Messaggio video" + }, + "file": { + "ICON": "e-documento", + "CONTENT": "File Allegato" + }, + "location": { + "ICON": "Posizione-ios", + "CONTENT": "Localizzazione" + }, + "fallback": { + "ICON": "e-link", + "CONTENT": "ha condiviso un url" + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/it/contact.json b/app/javascript/dashboard/i18n/locale/it/contact.json new file mode 100644 index 000000000..24f1465e0 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/it/contact.json @@ -0,0 +1,20 @@ +{ + "CONTACT_PANEL": { + "CONVERSATION_TITLE": "Dettagli conversazione", + "BROWSER": "Browser", + "OS": "Sistema Operativo", + "INITIATED_FROM": "Iniziato da", + "INITIATED_AT": "Iniziato alle", + "CONVERSATIONS": { + "NO_RECORDS_FOUND": "Non ci sono precedenti conversazioni associate a questo contatto.", + "TITLE": "Conversazioni precedenti" + }, + "LABELS": { + "TITLE": "Etichette conversazione", + "UPDATE_BUTTON": "Aggiorna etichette", + "UPDATE_ERROR": "Impossibile aggiornare le etichette, riprova.", + "TAG_PLACEHOLDER": "Aggiungi nuova etichetta", + "PLACEHOLDER": "Cerca o aggiungi un'etichetta" + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/it/conversation.json b/app/javascript/dashboard/i18n/locale/it/conversation.json new file mode 100644 index 000000000..66acd8241 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/it/conversation.json @@ -0,0 +1,35 @@ +{ + "CONVERSATION": { + "404": "Si prega di selezionare una conversazione dal pannello sinistro", + "NO_MESSAGE_1": "Oh oh! Sembra che non ci siano messaggi da parte dei clienti nella tua casella di posta.", + "NO_MESSAGE_2": " per inviare un messaggio alla tua pagina!", + "NO_INBOX_1": "Hola! Sembra che tu non abbia ancora aggiunto nessuna posta in arrivo.", + "NO_INBOX_2": " per iniziare", + "NO_INBOX_AGENT": "Uh Oh! Sembra che tu non faccia parte di nessuna casella di posta. Per favore contatta il tuo amministratore", + "CLICK_HERE": "Clicca qui", + "LOADING_INBOXES": "Caricamento posta in arrivo", + "LOADING_CONVERSATIONS": "Caricamento conversazioni", + "DOWNLOAD": "Scaricare", + "HEADER": { + "RESOLVE_ACTION": "Risolvi", + "REOPEN_ACTION": "Riapri", + "OPEN": "Ulteriori", + "CLOSE": "Chiudi", + "DETAILS": "Dettagli" + }, + "FOOTER": { + "MSG_INPUT": "MAIUSC + INVIO per la nuova linea. Inizia con '/' per selezionare una risposta preconfezionata.", + "PRIVATE_MSG_INPUT": "Shift + enter per nuova linea. Questo sarà visibile solo agli agenti" + }, + "REPLYBOX": { + "REPLY": "Rispondere", + "PRIVATE_NOTE": "Nota Privata", + "SEND": "Inviare", + "CREATE": "Aggiungi nota", + "TWEET": "Twitta" + }, + "VISIBLE_TO_AGENTS": "Nota privata: visibile solo a te e al tuo team", + "CHANGE_STATUS": "Stato conversazione cambiato", + "CHANGE_AGENT": "Modifica conversazione assegnatario" + } +} diff --git a/app/javascript/dashboard/i18n/locale/it/integrations.json b/app/javascript/dashboard/i18n/locale/it/integrations.json new file mode 100644 index 000000000..e651e1163 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/it/integrations.json @@ -0,0 +1,54 @@ +{ + "INTEGRATION_SETTINGS": { + "HEADER": "Integrazioni", + "WEBHOOK": { + "TITLE": "Webhook", + "CONFIGURE": "Configurare", + "HEADER": "Impostazioni Webhook", + "HEADER_BTN_TXT": "Aggiungi nuovo webhook", + "INTEGRATION_TXT": "Gli eventi Webhook ti forniscono informazioni in tempo reale su ciò che sta accadendo nel tuo account Chatwoot. Puoi utilizzare i webhook per comunicare gli eventi con le tue app preferite come Slack o Github. Clicca su Configura per configurare i tuoi webhook.", + "LOADING": "Recupero webhook allegati", + "SEARCH_404": "Non ci sono elementi che corrispondono a questa richiesta", + "SIDEBAR_TXT": "

Webhooks

I Webhooks sono callback HTTP che possono essere definiti per ogni account. Sono innescati da eventi come la creazione di messaggi in Chatwoot. Puoi creare più di un webhook per questo account.

Per creare un webhook, clicca sul Aggiungi nuovo webhook pulsante. Puoi anche rimuovere qualsiasi webhook esistente cliccando sul pulsante Elimina.

", + "LIST": { + "404": "Non ci sono webhook configurati per questo account.", + "TITLE": "Gestisci webhook", + "DESC": "I Webhooks sono modelli di risposta predefiniti che possono essere utilizzati per inviare rapidamente risposte ai ticket.", + "TABLE_HEADER": [ + "Endpoint Webhook", + "azioni" + ] + }, + "ADD": { + "CANCEL": "annulla", + "TITLE": "Aggiungi nuovo webhook", + "DESC": "Gli eventi Webhook ti forniscono le informazioni in tempo reale su ciò che sta accadendo nel tuo account Chatwoot. Per favore inserisci un URL valido per configurare un callback.", + "FORM": { + "END_POINT": { + "LABEL": "URL del webhook", + "PLACEHOLDER": "Esempio: https://example/api/webhook", + "ERROR": "Inserisci un URL valido" + }, + "SUBMIT": "Crea webhook" + }, + "API": { + "SUCCESS_MESSAGE": "Webhook aggiunto correttamente", + "ERROR_MESSAGE": "Impossibile connettersi al server Woot, riprova più tardi" + } + }, + "DELETE": { + "BUTTON_TEXT": "Cancellare", + "API": { + "SUCCESS_MESSAGE": "Webhook eliminato con successo", + "ERROR_MESSAGE": "Impossibile connettersi al server Woot, riprova più tardi" + }, + "CONFIRM": { + "TITLE": "Conferma eliminazione", + "MESSAGE": "Sei sicuro di voler eliminare ", + "YES": "Sì, elimina ", + "NO": "No, mantienilo " + } + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/it/report.json b/app/javascript/dashboard/i18n/locale/it/report.json new file mode 100644 index 000000000..44ed7ab1c --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/it/report.json @@ -0,0 +1,49 @@ +{ + "REPORT": { + "HEADER": "Segnalazioni", + "LOADING_CHART": "Caricamento dati grafici...", + "NO_ENOUGH_DATA": "Non abbiamo ricevuto abbastanza dati per generare la segnalazione, riprova più tardi.", + "METRICS": [ + { + "NAME": "Conversazioni", + "KEY": "Conteggio", + "DESC": "(Totale )" + }, + { + "NAME": "Messaggi in arrivo", + "KEY": "in entrata_conto_messaggi", + "DESC": "(Totale )" + }, + { + "NAME": "Messaggi in uscita", + "KEY": "conto_messaggi", + "DESC": "(Totale )" + }, + { + "NAME": "Tempo di prima risposta", + "KEY": "orario_risposta", + "DESC": "( Media )" + }, + { + "NAME": "Risoluzione Tempo", + "KEY": "tempo_risoluzione", + "DESC": "( Media )" + }, + { + "NAME": "Conteggio risoluzioni", + "KEY": "risoluzioni_conteggio", + "DESC": "(Totale )" + } + ], + "DATE_RANGE": [ + { + "id": 0, + "name": "Ultimi 7 giorni" + }, + { + "id": 1, + "name": "Ultimi 30 giorni" + } + ] + } +} diff --git a/app/javascript/dashboard/i18n/locale/it/resetPassword.json b/app/javascript/dashboard/i18n/locale/it/resetPassword.json new file mode 100644 index 000000000..071d4c1a2 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/it/resetPassword.json @@ -0,0 +1,15 @@ +{ + "RESET_PASSWORD": { + "TITLE": "Reimpostare la password", + "EMAIL": { + "LABEL": "email", + "PLACEHOLDER": "Inserisci la tua email", + "ERROR": "Inserisci un indirizzo email valido" + }, + "API": { + "SUCCESS_MESSAGE": "Il link per reimpostare la password è stato inviato alla tua email", + "ERROR_MESSAGE": "Impossibile connettersi al server Woot, riprova più tardi" + }, + "SUBMIT": "Invia" + } +} diff --git a/app/javascript/dashboard/i18n/locale/it/setNewPassword.json b/app/javascript/dashboard/i18n/locale/it/setNewPassword.json new file mode 100644 index 000000000..87f864af8 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/it/setNewPassword.json @@ -0,0 +1,20 @@ +{ + "SET_NEW_PASSWORD": { + "TITLE": "Imposta nuova password", + "PASSWORD": { + "LABEL": "password", + "PLACEHOLDER": "password", + "ERROR": "Password troppo corta" + }, + "CONFIRM_PASSWORD": { + "LABEL": "Conferma Password", + "PLACEHOLDER": "Conferma Password", + "ERROR": "Le password non corrispondono" + }, + "API": { + "SUCCESS_MESSAGE": "Password cambiata con successo", + "ERROR_MESSAGE": "Impossibile connettersi al server Woot, riprova più tardi" + }, + "SUBMIT": "Invia" + } +} diff --git a/app/javascript/dashboard/i18n/locale/it/webhooks.json b/app/javascript/dashboard/i18n/locale/it/webhooks.json new file mode 100644 index 000000000..f9939c8b1 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/it/webhooks.json @@ -0,0 +1,5 @@ +{ + "WEBHOOKS_SETTINGS": { + "HEADER": "Impostazioni Webhook" + } +} diff --git a/app/javascript/dashboard/i18n/locale/ml/agentMgmt.json b/app/javascript/dashboard/i18n/locale/ml/agentMgmt.json new file mode 100644 index 000000000..34f19c9c3 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ml/agentMgmt.json @@ -0,0 +1,101 @@ +{ + "AGENT_MGMT": { + "HEADER": "ഏജന്റുമാർ", + "HEADER_BTN_TXT": "ഏജന്റിനെ ചേർക്കുക", + "LOADING": "ഏജന്റ് പട്ടിക ലഭ്യമാക്കുന്നു", + "SIDEBAR_TXT": "

ഏജന്റുമാർ

ഒരു ഏജൻറ് നിങ്ങളുടെ ഉപഭോക്തൃ പിന്തുണാ ടീമിലെ ഒരു അംഗമാണ്.

ഏജന്റുമാർക്ക് നിങ്ങളുടെ ഉപയോക്താക്കളിൽ നിന്നുള്ള സന്ദേശങ്ങൾ കാണാനും മറുപടി നൽകാനും കഴിയും. നിങ്ങളുടെ അക്കൗണ്ടിലുള്ള എല്ലാ ഏജന്റുമാരെയും ഈ പട്ടിക കാണിക്കുന്നു.

ഒരു പുതിയ ഏജന്റിനെ ചേർക്കുന്നതിന് ഏജന്റിനെ ചേർക്കുക ബട്ടൺ ക്ലിക്കുചെയ്യുക. നിങ്ങൾ ചേർത്ത ഏജന്റിന് അവരുടെ അക്കൗണ്ട് സജീവമാക്കുന്നതിന് ഒരു സ്ഥിരീകരണ ലിങ്കുള്ള ഇമെയിൽ ലഭിക്കും. അതിനുശേഷം അവർക്ക് ചാറ്റ് വൂട്ട് ആക്സസ് ചെയ്യാനും സന്ദേശങ്ങളോട് പ്രതികരിക്കാനും കഴിയും.

ചാറ്റ് വൂട്ടിന്റെ സവിശേഷതകളിലേക്കുള്ള ആക്സസ് ഇനിപ്പറയുന്ന റോളുകളെ അടിസ്ഥാനമാക്കിയുള്ളതാണ്.

ഏജൻറ് - ഈ റോൾ‌ ഉള്ള ഏജന്റുമാർ‌ക്ക് ഇൻ‌ബോക്‍സുകൾ‌, റിപ്പോർ‌ട്ടുകൾ‌, സംഭാഷണങ്ങൾ‌ എന്നിവ മാത്രമേ ആക്‌സസ് ചെയ്യാൻ‌ കഴിയൂ. അവർക്ക് മറ്റ് ഏജന്റുമാരുടെയോ അല്ലെങ്കിൽ‌ തങ്ങളുടേയോ സംഭാഷണങ്ങൾ‌ നിർ‌ണ്ണയിക്കാനും സംഭാഷണങ്ങൾ‌ പരിഹരിക്കാനും കഴിയും.

അഡ്മിനിസ്ട്രേറ്റർ - ഒരു സാധാരണ ഏജന്റിന്റെ പ്രത്യേകാവകാശങ്ങളോടൊപ്പം ക്രമീകരണങ്ങളും ബില്ലിംഗും ഉൾപ്പെടെ നിങ്ങളുടെ അക്കൗണ്ടിൽ ലഭ്യമായ എല്ലാ ചാറ്റ് വൂട്ട് സവിശേഷതകളിലേക്കും ആക്‌സസ് ഉണ്ടായിരിക്കുക. ", + "AGENT_TYPES": [ + { + "name": "അഡ്മിനിസ്‌ട്രേറ്റർ", + "label": "അഡ്മിനിസ്‌ട്രേറ്റർ" + }, + { + "name": "ഏജന്റ്", + "label": "ഏജന്റ്" + } + ], + "LIST": { + "404": "ഈ അക്കൗണ്ടുമായി ബന്ധപ്പെട്ട ഏജന്റുകളൊന്നുമില്ല", + "TITLE": "നിങ്ങളുടെ ടീമിലെ ഏജന്റുമാരെ മാനേജുചെയ്യുക", + "DESC": "നിങ്ങൾക്ക് നിങ്ങളുടെ ടീമിലെ ഏജന്റുമാരെ ചേർക്കാനും നീക്കംചെയ്യാനും കഴിയും.", + "NAME": "പേര്", + "EMAIL": "ഇമെയിൽ", + "STATUS": "സ്റ്റാറ്റസ്", + "ACTIONS": "പ്രവർത്തനങ്ങൾ", + "VERIFIED": "പരിശോധിച്ചു", + "VERIFICATION_PENDING": "പരിശോധന തീർപ്പുകൽപ്പിച്ചിട്ടില്ല" + }, + "ADD": { + "TITLE": "നിങ്ങളുടെ ടീമിലേക്ക് ഏജന്റിനെ ചേർക്കുക", + "DESC": "നിങ്ങളുടെ ഇൻ‌ബോക്സുകൾ‌ക്കുള്ള പിന്തുണ കൈകാര്യം ചെയ്യാൻ‌ കഴിയുന്ന ആളുകളെ നിങ്ങൾ‌ക്ക് ചേർ‌ക്കാൻ‌ കഴിയും.", + "FORM": { + "NAME": { + "LABEL": "ഏജന്റിന്റെ പേര്", + "PLACEHOLDER": "ദയവായി ഏജന്റിന്റെ പേര് നൽകുക" + }, + "AGENT_TYPE": { + "LABEL": "ഏജന്റ് തരം", + "PLACEHOLDER": "ദയവായി ഒരു തരം തിരഞ്ഞെടുക്കുക", + "ERROR": "ഏജന്റ് തരം ആവശ്യമാണ്" + }, + "EMAIL": { + "LABEL": "ഇമെയിൽ വിലാസം", + "PLACEHOLDER": "ദയവായി ഏജന്റിന്റെ ഒരു ഇമെയിൽ വിലാസം നൽകുക" + }, + "SUBMIT": "ഏജന്റിനെ ചേർക്കുക" + }, + "API": { + "SUCCESS_MESSAGE": "ഏജന്റിനെ വിജയകരമായി ചേർത്തു", + "EXIST_MESSAGE": "ഏജന്റ് ഇമെയിൽ ഇതിനകം ഉപയോഗത്തിലാണ്, ദയവായി മറ്റൊരു ഇമെയിൽ വിലാസം പരീക്ഷിക്കുക", + "ERROR_MESSAGE": "വൂട്ട് സെർവറിലേക്ക് കണക്റ്റുചെയ്യാനായില്ല, ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക" + } + }, + "DELETE": { + "BUTTON_TEXT": "ഇല്ലാതാക്കുക", + "API": { + "SUCCESS_MESSAGE": "ഏജന്റിനെ വിജയകരമായി ഇല്ലാതാക്കി", + "ERROR_MESSAGE": "വൂട്ട് സെർവറിലേക്ക് കണക്റ്റുചെയ്യാനായില്ല, ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക" + }, + "CONFIRM": { + "TITLE": "ഇല്ലാതാക്കൽ സ്ഥിരീകരിക്കുക", + "MESSAGE": "

ഏജന്റുമാർ

ഒരു ഏജൻറ് നിങ്ങളുടെ ഉപഭോക്തൃ പിന്തുണാ ടീമിലെ ഒരു അംഗമാണ്.

ഏജന്റുമാർക്ക് നിങ്ങളുടെ ഉപയോക്താക്കളിൽ നിന്നുള്ള സന്ദേശങ്ങൾ കാണാനും മറുപടി നൽകാനും കഴിയും. നിങ്ങളുടെ അക്കൗണ്ടിലുള്ള എല്ലാ ഏജന്റുമാരെയും ഈ പട്ടിക കാണിക്കുന്നു.

ഒരു പുതിയ ഏജന്റിനെ ചേർക്കുന്നതിന് ഏജന്റിനെ ചേർക്കുക ബട്ടൺ ക്ലിക്കുചെയ്യുക. നിങ്ങൾ ചേർത്ത ഏജന്റിന് അവരുടെ അക്കൗണ്ട് സജീവമാക്കുന്നതിന് ഒരു സ്ഥിരീകരണ ലിങ്കുള്ള ഇമെയിൽ ലഭിക്കും. അതിനുശേഷം അവർക്ക് ചാറ്റ് വൂട്ട് ആക്സസ് ചെയ്യാനും സന്ദേശങ്ങളോട് പ്രതികരിക്കാനും കഴിയും.

ചാറ്റ് വൂട്ടിന്റെ സവിശേഷതകളിലേക്കുള്ള ആക്സസ് ഇനിപ്പറയുന്ന റോളുകളെ അടിസ്ഥാനമാക്കിയുള്ളതാണ്.

ഏജൻറ് - ഈ റോൾ‌ ഉള്ള ഏജന്റുമാർ‌ക്ക് ഇൻ‌ബോക്‍സുകൾ‌, റിപ്പോർ‌ട്ടുകൾ‌, സംഭാഷണങ്ങൾ‌ എന്നിവ മാത്രമേ ആക്‌സസ് ചെയ്യാൻ‌ കഴിയൂ. അവർക്ക് മറ്റ് ഏജന്റുമാരുടെയോ അല്ലെങ്കിൽ‌ തങ്ങളുടേയോ സംഭാഷണങ്ങൾ‌ നിർ‌ണ്ണയിക്കാനും സംഭാഷണങ്ങൾ‌ പരിഹരിക്കാനും കഴിയും.

അഡ്മിനിസ്ട്രേറ്റർ - ഒരു സാധാരണ ഏജന്റിന്റെ പ്രത്യേകാവകാശങ്ങളോടൊപ്പം ക്രമീകരണങ്ങളും ബില്ലിംഗും ഉൾപ്പെടെ നിങ്ങളുടെ അക്കൗണ്ടിൽ ലഭ്യമായ എല്ലാ ചാറ്റ് വൂട്ട് സവിശേഷതകളിലേക്കും ആക്‌സസ് ഉണ്ടായിരിക്കുക. ", + "YES": "അതെ, ഇല്ലാതാക്കുക ", + "NO": "ഇല്ല, സൂക്ഷിക്കുക" + } + }, + "EDIT": { + "TITLE": "ഏജന്റിനെ എഡിറ്റുചെയ്യുക", + "FORM": { + "NAME": { + "LABEL": "ഏജന്റിന്റെ പേര്", + "PLACEHOLDER": "ദയവായി ഏജന്റിന്റെ പേര് നൽകുക" + }, + "AGENT_TYPE": { + "LABEL": "ഏജന്റ് തരം", + "PLACEHOLDER": "ദയവായി ഒരു തരം തിരഞ്ഞെടുക്കുക", + "ERROR": "ഏജന്റ് തരം ആവശ്യമാണ്" + }, + "EMAIL": { + "LABEL": "ഇമെയിൽ വിലാസം", + "PLACEHOLDER": "ദയവായി ഏജന്റിന്റെ ഒരു ഇമെയിൽ വിലാസം നൽകുക" + }, + "SUBMIT": "ഏജന്റിനെ എഡിറ്റുചെയ്യുക" + }, + "BUTTON_TEXT": "എഡിറ്റുചെയ്യുക", + "CANCEL_BUTTON_TEXT": "റദ്ദാക്കുക", + "API": { + "SUCCESS_MESSAGE": "ഏജന്റിനെ വിജയകരമായി അപ്‌ഡേറ്റുചെയ്‌തു", + "ERROR_MESSAGE": "വൂട്ട് സെർവറിലേക്ക് കണക്റ്റുചെയ്യാനായില്ല, ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക" + }, + "PASSWORD_RESET": { + "ADMIN_RESET_BUTTON": "പാസ്സ്‌വേർഡ് പുനഃസജ്ജീകരണം", + "ADMIN_SUCCESS_MESSAGE": "പാസ്‌വേഡ് പുനഃസജ്ജീകരണത്തിന് ഉള്ള ഒരു ഇമെയിൽ ഏജന്റിന് അയച്ചു", + "SUCCESS_MESSAGE": "ഏജന്റിന്റെ പാസ്‌വേഡ് വിജയകരമായി പുനഃസജീകരിച്ചു", + "ERROR_MESSAGE": "വൂട്ട് സെർവറിലേക്ക് കണക്റ്റുചെയ്യാനായില്ല, ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക" + } + }, + "SEARCH": { + "NO_RESULTS": "ഏജന്റകളെ ഒന്നും കണ്ടെത്താൻ സാധിച്ചില്ല." + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/ml/billing.json b/app/javascript/dashboard/i18n/locale/ml/billing.json new file mode 100644 index 000000000..d44fdd661 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ml/billing.json @@ -0,0 +1,19 @@ +{ + "BILLING": { + "HEADER": "ബില്ലിംഗ്", + "LOADING": "സബ്സ്ക്രിപ്ഷനുകൾ ലഭ്യമാക്കുന്നു", + "ACCOUNT_STATE": "അക്കൗണ്ടിന്റെ അവസ്ഥ", + "AGENT_COUNT": "ഏജന്റിന്റെ എണ്ണം ", + "PER_AGENT_COST": "ഓരോ ഏജന്റിന്റെ വില", + "TOTAL_COST": "ആകെ ചെലവ്", + "BUTTON": { + "ADD": "പേയ്‌മെന്റ് രീതി ചേർക്കുക", + "EDIT": "പേയ്‌മെന്റ് രീതി എഡിറ്റുചെയ്യുക" + }, + "TRIAL": { + "TITLE": "നിങ്ങളുടെ ട്രയൽ കാലയളവ് അവസാനിച്ചു", + "MESSAGE": "ചാറ്റ് വൂട്ട് ഉപയോഗിക്കുന്നത് തുടരാൻ ഒരു പേയ്‌മെന്റ് രീതി ചേർക്കുക." + }, + "ACCOUNT_LOCKED": "നിങ്ങളുടെ അക്കൗണ്ട് ഇപ്പോൾ ലഭ്യമല്ല.
വീണ്ടും സജീവമാക്കുന്നതിന് ദയവായി നിങ്ങളുടെ അഡ്മിനിസ്ട്രേറ്ററുമായി ബന്ധപ്പെടുക." + } +} diff --git a/app/javascript/dashboard/i18n/locale/ml/cannedMgmt.json b/app/javascript/dashboard/i18n/locale/ml/cannedMgmt.json new file mode 100644 index 000000000..0d7229a2b --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ml/cannedMgmt.json @@ -0,0 +1,74 @@ +{ + "CANNED_MGMT": { + "HEADER": "ക്യാൻഡ് പ്രതികരണങ്ങൾ", + "HEADER_BTN_TXT": "ക്യാൻഡ് പ്രതികരണം ചേർക്കുക", + "LOADING": "ക്യാൻഡ് പ്രതികരണങ്ങൾ ലഭ്യമാക്കുന്നു", + "SEARCH_404": "ഈ ചോദ്യവുമായി പൊരുത്തപ്പെടുന്ന ഇനങ്ങളൊന്നുമില്ല", + "SIDEBAR_TXT": "

ക്യാൻഡ് പ്രതികരണങ്ങൾ

ക്യാൻഡ് പ്രതികരണങ്ങൾ എന്നാൽ മുൻ‌നിശ്ചയിച്ച മറുപടി ടെം‌പ്ലേറ്റുകൾ ആണ്. ഇവ ഒരു സംഭാഷണത്തിന് വേഗത്തിൽ മറുപടി അയയ്‌ക്കാൻ ഉപയോഗിക്കാം.

ഒരു ക്യാൻഡ് പ്രതികരണം സൃഷ്ടിക്കുന്നതിന് ക്യാൻഡ് പ്രതികരണം ചേർക്കുക എന്നതിൽ ക്ലിക്കുചെയ്യുക. എഡിറ്റുചെയ്യുക അല്ലെങ്കിൽ ഇല്ലാതാക്കുക ബട്ടൺ ക്ലിക്കുചെയ്ത് നിങ്ങൾക്ക് നിലവിലുള്ള ക്യാൻഡ് പ്രതികരണം എഡിറ്റുചെയ്യാനോ ഇല്ലാതാക്കാനോ കഴിയും

ക്യാൻഡ് പ്രതികരണങ്ങൾ ഹ്രസ്വ കോഡുകളുടെ സഹായത്തോടെ ഉപയോഗിക്കുന്നു. ചാറ്റിൽ ആയിരിക്കുമ്പോൾ ഏജന്റുമാർക്ക് ക്യാൻഡ് പ്രതികരണങ്ങൾ ആക്സസ് ചെയ്യാൻ കഴിയും. ഇതിനായി '/' എന്ന് ടൈപ്പ് ചെയ്ത ശേഷം ഹ്രസ്വ കോഡ് നൽകുക.

", + "LIST": { + "404": "ഈ അക്കൗണ്ടിൽ ക്യാൻഡ് പ്രതികരണങ്ങളൊന്നും ലഭ്യമല്ല.", + "TITLE": "ക്യാൻഡ് പ്രതികരണങ്ങൾ നിയന്ത്രിക്കുക", + "DESC": "മുൻ‌നിശ്ചയിച്ച മറുപടി ടെം‌പ്ലേറ്റുകളാണ് ക്യാൻഡ് പ്രതികരണങ്ങൾ‌, അവ ടിക്കറ്റുകൾ‌ക്ക് വേഗത്തിൽ‌ മറുപടികൾ‌ അയയ്‌ക്കാൻ‌ ഉപയോഗിക്കാം.", + "TABLE_HEADER": [ + "ഹ്രസ്വ കോഡ്", + "ഉള്ളടക്കം", + "പ്രവർത്തനങ്ങൾ" + ] + }, + "ADD": { + "TITLE": "ക്യാൻഡ് പ്രതികരണം ചേർക്കുക", + "DESC": "മുൻ‌നിശ്ചയിച്ച മറുപടി ടെം‌പ്ലേറ്റുകളാണ് ക്യാൻഡ് പ്രതികരണങ്ങൾ‌, അവ സംഭാഷണങ്ങൾക് വേഗത്തിൽ‌ മറുപടികൾ‌ അയയ്‌ക്കാൻ‌ ഉപയോഗിക്കാം.", + "FORM": { + "SHORT_CODE": { + "LABEL": "ഹ്രസ്വ കോഡ്", + "PLACEHOLDER": "ദയവായി ഒരു ഹ്രസ്വ കോഡ് നൽകുക", + "ERROR": "ഹ്രസ്വ കോഡ് ആവശ്യമാണ്" + }, + "CONTENT": { + "LABEL": "ഉള്ളടക്കം", + "PLACEHOLDER": "ദയവായി ഒരു ഉള്ളടക്കം നൽകുക", + "ERROR": "ഉള്ളടക്കം ആവശ്യമാണ്" + }, + "SUBMIT": "സമർപ്പിക്കുക" + }, + "API": { + "SUCCESS_MESSAGE": "ക്യാൻഡ് പ്രതികരണം വിജയകരമായി ചേർത്തു", + "ERROR_MESSAGE": "വൂട്ട് സെർവറിലേക്ക് കണക്റ്റുചെയ്യാനായില്ല, ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക" + } + }, + "EDIT": { + "TITLE": "ക്യാൻഡ് പ്രതികരണം എഡിറ്റുചെയ്യുക", + "FORM": { + "SHORT_CODE": { + "LABEL": "ഹ്രസ്വ കോഡ്", + "PLACEHOLDER": "ദയവായി ഒരു ഹ്രസ്വ കോഡ് നൽകുക", + "ERROR": "ഹ്രസ്വ കോഡ് ആവശ്യമാണ്" + }, + "CONTENT": { + "LABEL": "ഉള്ളടക്കം", + "PLACEHOLDER": "ദയവായി ഒരു ഉള്ളടക്കം നൽകുക", + "ERROR": "ഉള്ളടക്കം ആവശ്യമാണ്" + }, + "SUBMIT": "സമർപ്പിക്കുക" + }, + "BUTTON_TEXT": "എഡിറ്റുചെയ്യുക", + "API": { + "SUCCESS_MESSAGE": "ക്യാൻഡ് പ്രതികരണം വിജയകരമായി അപ്‌ഡേറ്റുചെയ്‌തു", + "ERROR_MESSAGE": "വൂട്ട് സെർവറിലേക്ക് കണക്റ്റുചെയ്യാനായില്ല, ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക" + } + }, + "DELETE": { + "BUTTON_TEXT": "ഇല്ലാതാക്കുക", + "API": { + "SUCCESS_MESSAGE": "ക്യാൻഡ് പ്രതികരണം വിജയകരമായി ഇല്ലാതാക്കി", + "ERROR_MESSAGE": "വൂട്ട് സെർവറിലേക്ക് കണക്റ്റുചെയ്യാനായില്ല, ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക" + }, + "CONFIRM": { + "TITLE": "ഇല്ലാതാക്കൽ സ്ഥിരീകരിക്കുക", + "MESSAGE": "ഇല്ലാതാക്കണമെന്ന് ഉറപ്പാണോ", + "YES": "അതെ, ഇല്ലാതാക്കുക", + "NO": "ഇല്ല, സൂക്ഷിക്കുക" + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/ml/chatlist.json b/app/javascript/dashboard/i18n/locale/ml/chatlist.json new file mode 100644 index 000000000..c0c835322 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ml/chatlist.json @@ -0,0 +1,77 @@ +{ + "CHAT_LIST": { + "LOADING": "സംഭാഷണങ്ങൾ ലഭ്യമാക്കുന്നു", + "LOAD_MORE_CONVERSATIONS": "കൂടുതൽ സംഭാഷണങ്ങൾ ലോഡുചെയ്യുക", + "EOF": "എല്ലാ സംഭാഷണങ്ങളും ലോഡുചെയ്തു 🎉", + "LIST": { + "404": "ഈ ഗ്രൂപ്പിൽ സജീവ സംഭാഷണങ്ങളൊന്നുമില്ല." + }, + "TAB_HEADING": "സംഭാഷണങ്ങൾ", + "SEARCH": { + "INPUT": "ആളുകൾ, ചാറ്റുകൾ, ക്യാൻഡ് മറുപടികൾ എന്നിവയ്ക്കായി തിരയുക .." + }, + "STATUS_TABS": [ + { + "NAME": "സജീവം", + "KEY": "openCount" + }, + { + "NAME": "പരിഹരിച്ചത്", + "KEY": "allConvCount" + } + ], + "ASSIGNEE_TYPE_TABS": [ + { + "NAME": "എന്റേത്", + "KEY": "me", + "COUNT_KEY": "mineCount" + }, + { + "NAME": "നിയുക്തമാക്കാത്തത്", + "KEY": "unassigned", + "COUNT_KEY": "unAssignedCount" + }, + { + "NAME": "എല്ലാം", + "KEY": "all", + "COUNT_KEY": "allCount" + } + ], + "CHAT_STATUS_ITEMS": [ + { + "TEXT": "സജീവം", + "VALUE": "open" + }, + { + "TEXT": "പരിഹരിച്ചത്", + "VALUE": "resolved" + } + ], + "ATTACHMENTS": { + "image": { + "ICON": "ion-image", + "CONTENT": "ചിത്ര സന്ദേശം" + }, + "audio": { + "ICON": "ion-volume-high", + "CONTENT": "ഓഡിയോ സന്ദേശം" + }, + "video": { + "ICON": "ion-ios-videocam", + "CONTENT": "വീഡിയോ സന്ദേശം" + }, + "file": { + "ICON": "ion-document", + "CONTENT": "ഫയൽ അറ്റാച്ചുമെന്റ്" + }, + "location": { + "ICON": "ion-ios-location", + "CONTENT": "സ്ഥാനം" + }, + "fallback": { + "ICON": "ion-link", + "CONTENT": "ഒരു യു. ആർ. എൽ പങ്കിട്ടു" + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/ml/contact.json b/app/javascript/dashboard/i18n/locale/ml/contact.json new file mode 100644 index 000000000..9ff59450d --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ml/contact.json @@ -0,0 +1,20 @@ +{ + "CONTACT_PANEL": { + "CONVERSATION_TITLE": "സംഭാഷണ വിശദാംശങ്ങൾ", + "BROWSER": "ബ്രൗസർ", + "OS": "ഓപ്പറേറ്റിംഗ് സിസ്റ്റം", + "INITIATED_FROM": "ആരംഭിച്ച ആൾ ", + "INITIATED_AT": "ആരംഭിച്ച സമയം ", + "CONVERSATIONS": { + "NO_RECORDS_FOUND": "ഈ കോൺടാക്റ്റുമായി മുമ്പത്തെ സംഭാഷണങ്ങളൊന്നും ബന്ധപ്പെടുത്തിയിട്ടില്ല.", + "TITLE": "മുമ്പത്തെ സംഭാഷണങ്ങൾ" + }, + "LABELS": { + "TITLE": "സംഭാഷണ ലേബലുകൾ", + "UPDATE_BUTTON": "ലേബലുകൾ അപ്‌ഡേറ്റുചെയ്യുക", + "UPDATE_ERROR": "ലേബലുകൾ അപ്‌ഡേറ്റ് ചെയ്യാൻ കഴിഞ്ഞില്ല, വീണ്ടും ശ്രമിക്കുക.", + "TAG_PLACEHOLDER": "പുതിയ ലേബൽ ചേർക്കുക", + "PLACEHOLDER": "ഒരു ലേബൽ തിരയുക അല്ലെങ്കിൽ ചേർക്കുക" + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/ml/conversation.json b/app/javascript/dashboard/i18n/locale/ml/conversation.json new file mode 100644 index 000000000..4bfe1caca --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ml/conversation.json @@ -0,0 +1,35 @@ +{ + "CONVERSATION": { + "404": "ഇടത് പാളിയിൽ നിന്ന് ഒരു സംഭാഷണം തിരഞ്ഞെടുക്കുക", + "NO_MESSAGE_1": "നിങ്ങളുടെ ഇൻ‌ബോക്സിൽ ഉപഭോക്താക്കളിൽ നിന്ന് സന്ദേശങ്ങളൊന്നും ഇല്ലെന്ന് തോന്നുന്നു.", + "NO_MESSAGE_2": " നിങ്ങളുടെ പേജിലേക്ക് ഒരു സന്ദേശം അയയ്‌ക്കാൻ!", + "NO_INBOX_1": "നിങ്ങൾ ഇത് വരെ ഇൻബോക്സുകൾ ഒന്നും സ്രഷ്ടിച്ചിട്ടില്ലെന്നു തോന്നുന്നു.", + "NO_INBOX_2": " ആരംഭിക്കുന്നതിന്", + "NO_INBOX_AGENT": "നിങ്ങൾ ഏതെങ്കിലും ഇൻ‌ബോക്സിന്റെ ഭാഗമല്ലെന്ന് തോന്നുന്നു. നിങ്ങളുടെ അഡ്മിനിസ്ട്രേറ്ററുമായി ബന്ധപ്പെടുക", + "CLICK_HERE": "ഇവിടെ ക്ലിക്കു ചെയ്യുക", + "LOADING_INBOXES": "ഇൻ‌ബോക്സുകൾ‌ ലോഡു ചെയ്യുന്നു", + "LOADING_CONVERSATIONS": "സംഭാഷണങ്ങൾ ലോഡു ചെയ്യുന്നു", + "DOWNLOAD": "ഡൗൺലോഡ്", + "HEADER": { + "RESOLVE_ACTION": "പരിഹരിക്കുക", + "REOPEN_ACTION": "വീണ്ടും തുറക്കുക", + "OPEN": "കൂടുതൽ", + "CLOSE": "അടയ്ക്കുക", + "DETAILS": "വിശദാംശങ്ങൾ" + }, + "FOOTER": { + "MSG_INPUT": "പുതിയ ലൈനിനു വേണ്ടി ഷിഫ്റ്റ് + എന്റർ അടിക്കുക. ഒരു ക്യാൻഡ് പ്രതികരണം തിരഞ്ഞു എടുക്കാൻ വേണ്ടി '/ ' വച്ച് ടൈപ്പ് ചെയ്തു തുടങ്ങുക.", + "PRIVATE_MSG_INPUT": "പുതിയ ലൈനിനു വേണ്ടി ഷിഫ്റ്റ് + എന്റർ അടിക്കുക. ഇത് ഏജന്റുമാർക്ക് മാത്രമേ ദൃശ്യമാകൂ" + }, + "REPLYBOX": { + "REPLY": "മറുപടി", + "PRIVATE_NOTE": "സ്വകാര്യ കുറിപ്പ്", + "SEND": "അയയ്‌ക്കുക", + "CREATE": "കുറിപ്പ് ചേർക്കുക", + "TWEET": "ട്വീറ്റ്" + }, + "VISIBLE_TO_AGENTS": "സ്വകാര്യ കുറിപ്പ്: നിങ്ങൾക്കും നിങ്ങളുടെ ടീമിനും മാത്രം ദൃശ്യമാണ്", + "CHANGE_STATUS": "സംഭാഷണ നില മാറ്റി", + "CHANGE_AGENT": "സംഭാഷണ നിയുക്തനെ മാറ്റി" + } +} diff --git a/app/javascript/dashboard/i18n/locale/ml/generalSettings.json b/app/javascript/dashboard/i18n/locale/ml/generalSettings.json new file mode 100644 index 000000000..9915288e0 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ml/generalSettings.json @@ -0,0 +1,27 @@ +{ + "GENERAL_SETTINGS": { + "TITLE": "അക്കൗണ്ട് ക്രമീകരണങ്ങൾ", + "SUBMIT": "ക്രമീകരണങ്ങൾ അപ്‌ഡേറ്റു ചെയ്യുക", + "UPDATE": { + "ERROR": "ക്രമീകരണങ്ങൾ അപ്‌ഡേറ്റു ചെയ്യാനായില്ല, വീണ്ടും ശ്രമിക്കുക!", + "SUCCESS": "അക്കൗണ്ട് ക്രമീകരണങ്ങൾ വിജയകരമായി അപ്‌ഡേറ്റു ചെയ്‌തു" + }, + "FORM": { + "ERROR": "ദയവായി ഫോമിലെ പിശകുകൾ പരിഹരിക്കുക", + "GENERAL_SECTION": { + "TITLE": "പൊതുവായ ക്രമീകരണങ്ങൾ", + "NOTE": "" + }, + "NAME": { + "LABEL": "അക്കൗണ്ടിന്റെ പേര്", + "PLACEHOLDER": "നിങ്ങളുടെ അക്കൗണ്ടിന്റെ പേര്", + "ERROR": "ദയവായി സാധുവായ ഒരു അക്കൗണ്ട് പേര് നൽകുക" + }, + "LANGUAGE": { + "LABEL": "സൈറ്റ് ഭാഷ (ബീറ്റ)", + "PLACEHOLDER": "നിങ്ങളുടെ അക്കൗണ്ടിന്റെ പേര്", + "ERROR": "" + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json new file mode 100644 index 000000000..f9e98fba7 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json @@ -0,0 +1,138 @@ +{ + "INBOX_MGMT": { + "HEADER": "ഇൻ‌ബോക്സുകൾ", + "SIDEBAR_TXT": "

ഇൻ‌ബോക്സ്

ചാറ്റ് വൂട്ടിലേക്ക് നിങ്ങൾ ഒരു വെബ്‌സൈറ്റോ ഫേസ്ബുക്ക് പേജോ കണക്റ്റുചെയ്യുമ്പോൾ, അതിനെ ഇൻ‌ബോക്സ് എന്ന് വിളിക്കുന്നു. നിങ്ങളുടെ ചാറ്റ് വൂട്ട് അക്കൗണ്ടിൽ പരിധിയില്ലാത്ത ഇൻബോക്സുകൾ ഉണ്ടായിരിക്കാൻ‌ കഴിയും.

ഒരു വെബ്‌സൈറ്റ് അല്ലെങ്കിൽ‌ ഫേസ്ബുക് പേജ് ബന്ധിപ്പിക്കുന്നതിന് ഇൻ‌ബോക്സ് ചേർക്കുക ക്ലിക്കുചെയ്യുക.

ഡാഷ്‌ബോർഡ് , നിങ്ങളുടെ എല്ലാ ഇൻ‌ബോക്‌സുകളിൽ‌ നിന്നുമുള്ള എല്ലാ സംഭാഷണങ്ങളും ഒരൊറ്റ സ്ഥലത്ത് കാണാനും `സംഭാഷണങ്ങൾ‌` ടാബിന് കീഴിൽ അവയോട് പ്രതികരിക്കാനും കഴിയും.

ഡാഷ്‌ബോർഡിന്റെ ഇടത് പാളിയിലെ ഇൻ‌ബോക്സ് ബട്ടണിൽ ക്ലിക്കുചെയ്ത് ഇൻബോക്സിൽ ഉള്ള സംഭാഷണങ്ങൾ കാണാൻ നിങ്ങൾക്കു സാധിക്കും .

", + "LIST": { + "404": "ഈ അക്കൗണ്ടിലേക്കു ഇൻ‌ബോക്സുകളൊന്നും ബന്ധിപ്പിച്ചിട്ടില്ല." + }, + "CREATE_FLOW": [ + { "title": "ചാനൽ തിരഞ്ഞെടുക്കുക", "route": "settings_inbox_new", "body": "ചാറ്റ് വൂട്ടുമായി സംയോജിപ്പിക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്ന ദാതാവിനെ തിരഞ്ഞെടുക്കുക." }, + { "title": "ഇൻ‌ബോക്സ് സൃഷ്ടിക്കുക", "route": "settings_inboxes_page_channel", "body": "നിങ്ങളുടെ അക്കൗണ്ട് പ്രാമാണീകരിക്കുകയും ഇൻ‌ബോക്സ് സൃഷ്ടിക്കുകയും ചെയ്യുക." }, + { "title": "ഏജന്റുമാരെ ചേർക്കുക", "route": "settings_inboxes_add_agents", "body": "സൃഷ്ടിച്ച ഇൻ‌ബോക്സിലേക്ക് ഏജന്റുമാരെ ചേർക്കുക." }, + { "title": "പൊളിച്ചു!", "route": "settings_inbox_finish", "body": "എല്ലാം ഭംഗിയായി പാപര്യവസാനിച്ചിരിക്കുന്നു. വരൂ നമുക്ക്‌ പോകാം." } + ], + "ADD": { + "FB": { + "HELP": "സൈൻ ഇൻ ചെയ്യുന്നതിലൂടെ, നിങ്ങളുടെ പേജിന്റെ സന്ദേശങ്ങളിലേക്ക് മാത്രമേ ഞങ്ങൾക്ക് പ്രവേശനം ലഭിക്കൂ. നിങ്ങളുടെ സ്വകാര്യ സന്ദേശങ്ങൾ ഒരിക്കലും ചാറ്റ് വൂട്ട് ഉപയോഗിച്ച് ആക്സസ് ചെയ്യാൻ കഴിയില്ല." + }, + "TWITTER": { + "HELP": "നിങ്ങളുടെ ട്വിറ്റർ പ്രൊഫൈൽ ഒരു ചാനലായി ചേർക്കുന്നതിന്, 'ട്വിറ്ററിനൊപ്പം പ്രവേശിക്കുക' ക്ലിക്കുചെയ്ത് നിങ്ങളുടെ ട്വിറ്റർ പ്രൊഫൈൽ പ്രാമാണീകരിക്കേണ്ടതുണ്ട്. " + }, + "WEBSITE_CHANNEL": { + "TITLE": "വെബ്‌സൈറ്റ് ചാനൽ", + "DESC": "നിങ്ങളുടെ വെബ്‌സൈറ്റിനായി ഒരു ചാനൽ സൃഷ്‌ടിച്ച് ഞങ്ങളുടെ വെബ്‌സൈറ്റ് വിജറ്റ് വഴി ഉപഭോക്താക്കളെ പിന്തുണയ്ക്കാൻ ആരംഭിക്കുക.", + "LOADING_MESSAGE": "വെബ്‌സൈറ്റ് സപ്പോർട്ട് ചാനൽ സൃഷ്‌ടിക്കുന്നു", + "CHANNEL_NAME": { + "LABEL": "വെബ്‌സൈറ്റിന്റെ പേര്", + "PLACEHOLDER": "നിങ്ങളുടെ വെബ്‌സൈറ്റിന്റെ പേര് നൽകുക (ഉദാ: പുണ്ണ്യാളൻ അഗർബത്തീസ്)" + }, + "CHANNEL_DOMAIN": { + "LABEL": "വെബ്സൈറ്റ് ഡൊമെയ്ൻ", + "PLACEHOLDER": "നിങ്ങളുടെ വെബ്‌സൈറ്റ് ഡൊമെയ്ൻ നൽകുക (ഉദാ: punnyalan.com)" + }, + "WIDGET_COLOR": { + "LABEL": "വിജറ്റ് നിറം", + "PLACEHOLDER": "വിജറ്റിൽ ഉപയോഗിച്ച വിജറ്റ് നിറം അപ്‌ഡേറ്റ് ചെയ്യുക" + }, + "SUBMIT_BUTTON":"ഇൻ‌ബോക്സ് സൃഷ്ടിക്കുക" + }, + "TWILIO": { + "TITLE": "ട്വിലിയോ എസ്.എം.എസ് ചാനൽ", + "DESC": "ട്വിലിയോ സംയോജിപ്പിച്ച് എസ്.എം.എസ് വഴി നിങ്ങളുടെ ഉപഭോക്താക്കളെ പിന്തുണയ്ക്കാൻ ആരംഭിക്കുക.", + "ACCOUNT_SID": { + "LABEL": "അക്കൗണ്ട് എസ്.ഐ.ഡി", + "PLACEHOLDER": "ദയവായി നിങ്ങളുടെ ട്വിലിയോ അക്കൗണ്ട് എസ്.ഐ.ഡി നൽകുക", + "ERROR": "ഈ ഫീൽഡ് ആവശ്യമാണ്" + }, + "AUTH_TOKEN": { + "LABEL": "ഓത്ത് ടോക്കൺ", + "PLACEHOLDER": "ദയവായി നിങ്ങളുടെ ട്വിലിയോ ഓത്ത് ടോക്കൺ നൽകുക", + "ERROR": "ഈ ഫീൽഡ് ആവശ്യമാണ്" + }, + "CHANNEL_NAME": { + "LABEL": "ചാനലിന്റെ പേര്", + "PLACEHOLDER": "ഈ ചാനലിനു ദയവായി ഒരു പേര് നൽകുക", + "ERROR": "ഈ ഫീൽഡ് ആവശ്യമാണ്" + }, + "PHONE_NUMBER": { + "LABEL": "ഫോൺ നമ്പർ", + "PLACEHOLDER": "ദയവായി സന്ദേശം അയയ്‌ക്കുന്ന ഫോൺ നമ്പർ നൽകുക.", + "ERROR": "ദയവായി സാധുവായ ഒരു ഫോൺ നമ്പർ നൽകുക. ഫോൺ നമ്പർ `+`ചിഹ്നത്തിൽ ആരംഭിക്കണം." + }, + "SUBMIT_BUTTON": "ട്വിലിയോ ചാനൽ സൃഷ്ടിക്കുക", + "API": { + "ERROR_MESSAGE": "ഞങ്ങൾക്ക് ട്വിലിയോ ക്രെഡൻഷ്യലുകൾ പ്രാമാണീകരിക്കാൻ കഴിഞ്ഞില്ല, ദയവായി വീണ്ടും ശ്രമിക്കുക." + } + }, + "AUTH": { + "TITLE": "ചാനലുകൾ", + "DESC": "നിലവിൽ ഞങ്ങൾ വെബ്‌സൈറ്റ് തത്സമയ ചാറ്റ് വിഡ്ജറ്റുകൾ, ഫേസ്ബുക്ക് പേജുകൾ, ട്വിറ്റർ പ്രൊഫൈലുകൾ എന്നിവ പ്ലാറ്റ്ഫോമുകളായി പിന്തുണയ്ക്കുന്നു. വാട്ട്സ്ആപ്പ്, ഇമെയിൽ, ടെലിഗ്രാം, ലൈൻ എന്നിവപോലുള്ള കൂടുതൽ പ്ലാറ്റ്ഫോമുകൾ ഞങ്ങളുടെ പക്കലുണ്ട്, അവ ഉടൻ പുറത്തിറങ്ങുന്നത് ആയിരിക്കും." + }, + "AGENTS": { + "TITLE": "ഏജന്റുമാർ", + "DESC": "നിങ്ങളുടെ പുതുതായി സൃഷ്ടിച്ച ഇൻ‌ബോക്സ് മാനേജു ചെയ്യുന്നതിന് ഇവിടെ നിങ്ങൾക്ക് ഏജന്റുമാരെ ചേർക്കാൻ‌ കഴിയും. ഈ തിരഞ്ഞെടുത്ത ഏജന്റുമാർ‌ക്ക് മാത്രമേ നിങ്ങളുടെ ഇൻ‌ബോക്സിലേക്ക് ആക്‌സസ് ഉണ്ടായിരിക്കുകയുള്ളൂ. ഈ ഇൻ‌ബോക്സിന്റെ ഭാഗമല്ലാത്ത ഏജന്റുമാർ‌ക്ക് ഈ ഇൻ‌ബോക്സിലെ സന്ദേശങ്ങൾ‌ കാണാനോ പ്രതികരിക്കാനോ കഴിയില്ല.
ഒരു അഡ്മിനിസ്ട്രേറ്റർ എന്ന നിലയിൽ, നിങ്ങൾക്ക് എല്ലാ ഇൻ‌ബോക്സുകളിലേക്കും ആക്സസ് ആവശ്യമുണ്ടെങ്കിൽ, നിങ്ങൾ സൃഷ്ടിക്കുന്ന എല്ലാ ഇൻ‌ബോക്സുകളിലേക്കും നിങ്ങൾ സ്വയം ഏജന്റായി ചേർക്കണം." + }, + "DETAILS": { + "TITLE": "ഇൻ‌ബോക്സ് വിശദാംശങ്ങൾ", + "DESC": "ചുവടെയുള്ള ഡ്രോപ്പ്ഡൗണിൽ നിന്ന്, നിങ്ങൾക്ക് ചാറ്റ് വൂട്ടിലേക്ക് കണക്റ്റുചെയ്യാൻ ആഗ്രഹിക്കുന്ന ഫേസ്ബുക്ക് പേജ് തിരഞ്ഞെടുക്കുക. തിരിച്ചറിയലിനായി നിങ്ങളുടെ ഇൻബോക്സിനു ഒരു ഇച്ഛാനുസൃത പേര് നല്കാൻ കഴിയും." + }, + "FINISH":{ + "TITLE": "പൊളിച്ചു അടുക്കി", + "DESC": "നിങ്ങളുടെ ഫേസ്ബുക്ക് പേജ് ചാറ്റ് വൂട്ടുമായി സമന്വയിപ്പിക്കുന്നത് നിങ്ങൾ വിജയകരമായി പൂർത്തിയാക്കി. അടുത്ത തവണ ഒരു ഉപയോക്താവ് നിങ്ങളുടെ പേജിലേക്ക് സന്ദേശമയയ്ക്കുമ്പോൾ, സംഭാഷണം ഓട്ടോമാറ്റിക്കലി നിങ്ങളുടെ ഇൻ‌ബോക്സിൽ ദൃശ്യമാകും.
നിങ്ങൾക്ക് എളുപ്പത്തിൽ സംയോജിപ്പിക്കാൻ കഴിയുന്ന ഒരു വിജറ്റ് സ്ക്രിപ്റ്റും ഞങ്ങൾ നിങ്ങൾക്ക് നൽകുന്നു. ഇത് നിങ്ങളുടെ വെബ്‌സൈറ്റിലേക്ക് ചേർക്കുക. ഇത് നിങ്ങളുടെ വെബ്‌സൈറ്റിൽ തത്സമയമായിക്കഴിഞ്ഞാൽ, ഉപയോക്താക്കൾക്ക് നിങ്ങളുടെ വെബ്‌സൈറ്റിൽ നിന്ന് നിങ്ങൾക്ക് സന്ദേശം അയയ്‌ക്കാൻ കഴിയും, ഒപ്പം സംഭാഷണം ചാറ്റ് വൂട്ടിൽ തന്നെ ദൃശ്യമാകും.
കൊള്ളാം, അല്ലേ? :)" + } + }, + "DETAILS": { + "LOADING_FB": "ഫേസ്ബുക് ഉപയോഗിച്ച് നിങ്ങളെ പ്രാമാണീകരിക്കുന്നു...", + "ERROR_FB_AUTH": "എന്തോ കുഴപ്പം സംഭവിച്ചു, ദയവായി പേജ് പുതുക്കുക...", + "CREATING_CHANNEL": "നിങ്ങളുടെ ഇൻ‌ബോക്സ് സൃഷ്ടിച്ചു കൊണ്ട് ഇരിക്കുകയാണ്...", + "TITLE": "ഇൻ‌ബോക്സ് വിശദാംശങ്ങൾ‌ കോൺഫിഗർ ചെയ്യുക", + "DESC": "" + }, + "AGENTS": { + "BUTTON_TEXT": "ഏജന്റുമാരെ ചേർക്കുക", + "ADD_AGENTS": "നിങ്ങളുടെ ഇൻ‌ബോക്സിലേക്ക് ഏജന്റുമാരെ ചേർക്കുകയാണ്..." + }, + "FINISH": { + "TITLE": "നിങ്ങളുടെ ഇൻ‌ബോക്സ് തയ്യാറാണ്!", + "MESSAGE": "നിങ്ങളുടെ പുതിയ ചാനലിലൂടെ നിങ്ങൾക്ക് ഇപ്പോൾ ഉപഭോക്താക്കളുമായി ഇടപഴകാൻ കഴിയും. പിന്തുണയ്ക്കുന്നതിൽ സന്തോഷിക്കൂ.", + "BUTTON_TEXT": "എന്നെ അവിടേക്ക് കൊണ്ടുപോകുക", + "WEBSITE_SUCCESS": "നിങ്ങൾ ഒരു വെബ്‌സൈറ്റ് ചാനൽ സൃഷ്ടിക്കുന്നത് വിജയകരമായി പൂർത്തിയാക്കി. ചുവടെ കാണിച്ചിരിക്കുന്ന കോഡ് പകർത്തി നിങ്ങളുടെ വെബ്‌സൈറ്റിൽ ചേർക്കുക. അടുത്ത തവണ ഒരു ഉപഭോക്താവ് തത്സമയ ചാറ്റ് ഉപയോഗിക്കുമ്പോൾ, സംഭാഷണം ഓട്ടോമാറ്റിക് ആയി നിങ്ങളുടെ ഇൻ‌ബോക്സിൽ ദൃശ്യമാകും." + }, + "REAUTH": "വീണ്ടും അംഗീകാരം നൽകുക", + "VIEW": "കാണുക", + "EDIT": { + "API": { + "SUCCESS_MESSAGE": "വിജറ്റ് നിറം വിജയകരമായി അപ്‌ഡേറ്റു ചെയ്‌തു", + "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "ഓട്ടോമാറ്റിക് അസൈൻമെന്റ് വിജയകരമായി അപ്‌ഡേറ്റുചെയ്‌തു", + "ERROR_MESSAGE": "വിജറ്റ് നിറം അപ്‌ഡേറ്റ് ചെയ്യാൻ കഴിഞ്ഞില്ല. ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക." + }, + "AUTO_ASSIGNMENT": { + "ENABLED": "പ്രവർത്തനക്ഷമമാക്കി", + "DISABLED": "പ്രവർത്തനരഹിതമാക്കി" + } + }, + "DELETE": { + "BUTTON_TEXT": "ഇല്ലാതാക്കുക", + "CONFIRM": { + "TITLE": "ഇല്ലാതാക്കൽ സ്ഥിരീകരിക്കുക", + "MESSAGE": "ഇല്ലാതാക്കണമെന്നു ഉറപ്പാണോ ", + "YES": "അതെ, ഇല്ലാതാക്കുക ", + "NO": "ഇല്ല, സൂക്ഷിക്കുക " + }, + "API": { + "SUCCESS_MESSAGE": "ഇൻ‌ബോക്സ് വിജയകരമായി ഇല്ലാതാക്കിയിരിക്കുന്നു", + "ERROR_MESSAGE": "ഇൻ‌ബോക്സ് ഇല്ലാതാക്കാൻ‌ കഴിഞ്ഞില്ല. ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക." + } + }, + "SETTINGS": "ക്രമീകരണങ്ങൾ", + "SETTINGS_POPUP": { + "MESSENGER_HEADING": "മെസഞ്ചർ സ്ക്രിപ്റ്റ്", + "MESSENGER_SUB_HEAD": "ഈ ബട്ടൺ നിങ്ങളുടെ ബോഡി ടാഗിനുള്ളിൽ സ്ഥാപിക്കുക", + "INBOX_AGENTS": "ഏജന്റുമാർ", + "INBOX_AGENTS_SUB_TEXT": "ഈ ഇൻ‌ബോക്സിൽ നിന്ന് ഏജന്റുമാരെ ചേർക്കുക അല്ലെങ്കിൽ നീക്കംചെയ്യുക", + "UPDATE": "അപ്‌ഡേറ്റ്", + "AUTO_ASSIGNMENT": "ഓട്ടോ അസൈൻമെന്റ് പ്രവർത്തനക്ഷമമാക്കുക", + "AUTO_ASSIGNMENT_SUB_TEXT": "പുതിയ സംഭാഷണങ്ങളിൽ ലഭ്യമായ ഏജന്റുമാരുടെ ഓട്ടോമാറ്റിക് അസൈൻമെന്റ് പ്രാപ്തമാക്കുകയോ അപ്രാപ്തമാക്കുകയോ ചെയ്യുക" + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/ml/index.js b/app/javascript/dashboard/i18n/locale/ml/index.js new file mode 100644 index 000000000..351906dd9 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ml/index.js @@ -0,0 +1,34 @@ +/* eslint-disable */ +import { default as _agentMgmt } from './agentMgmt.json'; +import { default as _billing } from './billing.json'; +import { default as _cannedMgmt } from './cannedMgmt.json'; +import { default as _chatlist } from './chatlist.json'; +import { default as _contact } from './contact.json'; +import { default as _conversation } from './conversation.json'; +import { default as _inboxMgmt } from './inboxMgmt.json'; +import { default as _login } from './login.json'; +import { default as _report } from './report.json'; +import { default as _resetPassword } from './resetPassword.json'; +import { default as _setNewPassword } from './setNewPassword.json'; +import { default as _settings } from './settings.json'; +import { default as _signup } from './signup.json'; +import { default as _integrations } from './integrations.json'; +import { default as _generalSettings } from './generalSettings.json'; + +export default { + ..._agentMgmt, + ..._billing, + ..._cannedMgmt, + ..._chatlist, + ..._contact, + ..._conversation, + ..._inboxMgmt, + ..._login, + ..._report, + ..._resetPassword, + ..._setNewPassword, + ..._settings, + ..._signup, + ..._integrations, + ..._generalSettings, +}; diff --git a/app/javascript/dashboard/i18n/locale/ml/integrations.json b/app/javascript/dashboard/i18n/locale/ml/integrations.json new file mode 100644 index 000000000..6f569ebe3 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ml/integrations.json @@ -0,0 +1,54 @@ +{ + "INTEGRATION_SETTINGS": { + "HEADER": "സംയോജനങ്ങൾ", + "WEBHOOK": { + "TITLE": "വെബ്‌ഹൂക്ക്", + "CONFIGURE": "കോൺഫിഗർ", + "HEADER": "വെബ്‌ഹൂക്ക് ക്രമീകരണങ്ങൾ", + "HEADER_BTN_TXT": "പുതിയ വെബ്‌ഹൂക്ക് ഉണ്ടാക്കുക", + "INTEGRATION_TXT": "നിങ്ങളുടെ ചാറ്റ് വൂട്ട് അക്കൗണ്ടിൽ എന്താണ് സംഭവിക്കുന്നതെന്നതിനെക്കുറിച്ചുള്ള തത്സമയ വിവരങ്ങൾ വെബ്‌ഹൂക്ക് ഇവന്റുകൾ നൽകുന്നു. സ്ലാക്ക് അല്ലെങ്കിൽ ഗിറ്റ്ഹബ് പോലുള്ള നിങ്ങളുടെ പ്രിയപ്പെട്ട അപ്ലിക്കേഷനുകളിലേക്ക് ആശയവിനിമയം നടത്താൻ നിങ്ങൾക്ക് വെബ്‌ഹൂക്കുകൾ ഉപയോഗിക്കാൻ കഴിയും. നിങ്ങളുടെ വെബ്‌ഹൂക്കുകൾ സജ്ജീകരിക്കുന്നതിന് കോൺഫിഗർ ചെയ്യുക ക്ലിക്കു ചെയ്യുക.", + "LOADING": "അറ്റാച്ചുചെയ്‌ത വെബ്‌ഹൂക്കുകൾ ലഭ്യമാക്കുന്നു", + "SEARCH_404": "ഈ ചോദ്യവുമായി പൊരുത്തപ്പെടുന്ന ഇനങ്ങളൊന്നുമില്ല", + "SIDEBAR_TXT": "

വെബ്‌ഹൂക്കുകൾ

എല്ലാ അക്കൗണ്ടിനും നിർവചിക്കാവുന്ന എച്ച്ടിടിപി കോൾബാക്കുകളാണ് വെബ്‌ഹൂക്കുകൾ. ചാറ്റ്‌വൂട്ടിലെ സന്ദേശ സൃഷ്‌ടിക്കൽ പോലുള്ള ഇവന്റുകളാണ് അവ പ്രവർത്തനക്ഷമമാക്കുന്നത്. ഈ അക്കൗണ്ടിനായി നിങ്ങൾക്ക് ഒന്നിൽ കൂടുതൽ വെബ്‌ഹൂക്കുകൾ സൃഷ്ടിക്കാൻ കഴിയും.

ഒരു വെബ്‌ഹൂക്ക് സൃഷ്‌ടിക്കുന്നതിന്, പുതിയ വെബ്‌ഹൂക്ക് ഉണ്ടാക്കുക ബട്ടണിൽ ക്ലിക്കുചെയ്യുക. ഇല്ലാതാക്കുക ബട്ടണിൽ ക്ലിക്കുചെയ്ത് നിങ്ങൾക്ക് നിലവിലുള്ള ഏതെങ്കിലും വെബ്‌ഹൂക്ക് നീക്കംചെയ്യാനും കഴിയും.

", + "LIST": { + "404": "ഈ അക്കൗണ്ടിനായി വെബ്‌ഹൂക്കുകളൊന്നും ക്രമീകരിച്ചിട്ടില്ല.", + "TITLE": "വെബ്‌ഹൂക്കുകൾ നിയന്ത്രിക്കുക", + "DESC": "വെബ്‌ഹൂക്കുകൾ മുൻ‌നിശ്ചയിച്ച മറുപടി ടെം‌പ്ലേറ്റുകളാണ്, അവ ടിക്കറ്റുകൾക്ക് വേഗത്തിൽ മറുപടി അയയ്‌ക്കാൻ ഉപയോഗിക്കാം.", + "TABLE_HEADER": [ + "വെബ്‌ഹൂക്ക് എൻഡ്‌പോയിന്റ്", + "പ്രവർത്തനങ്ങൾ" + ] + }, + "ADD": { + "CANCEL": "റദ്ദാക്കുക", + "TITLE": "പുതിയ വെബ്‌ഹൂക്ക് ഉണ്ടാക്കുക", + "DESC": "നിങ്ങളുടെ ചാറ്റ് വൂട്ട് അക്കൗണ്ടിൽ എന്താണ് സംഭവിക്കുന്നതെന്നതിനെക്കുറിച്ചുള്ള തത്സമയ വിവരങ്ങൾ വെബ്‌ഹൂക്ക് ഇവന്റുകൾ നൽകുന്നു. ഒരു കോൾബാക്ക് കോൺഫിഗർ ചെയ്യുന്നതിന് സാധുവായ ഒരു യുആർഎൽ നൽകുക.", + "FORM": { + "END_POINT": { + "LABEL": "വെബ്‌ഹുക്ക് യുആർഎൽ", + "PLACEHOLDER": "ഉദാഹരണം: https://example/api/webhook", + "ERROR": "ദയവായി സാധുവായ ഒരു യുആർഎൽ നൽകുക" + }, + "SUBMIT": "വെബ്‌ഹുക്ക് സൃഷ്‌ടിക്കുക" + }, + "API": { + "SUCCESS_MESSAGE": "വെബ്‌ഹുക്ക് വിജയകരമായി ചേർത്തു", + "ERROR_MESSAGE": "വൂട്ട് സെർവറിലേക്ക് കണക്റ്റുചെയ്യാനായില്ല, ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക" + } + }, + "DELETE": { + "BUTTON_TEXT": "ഇല്ലാതാക്കുക", + "API": { + "SUCCESS_MESSAGE": "വെബ്‌ഹൂക്ക് വിജയകരമായി ഇല്ലാതാക്കി", + "ERROR_MESSAGE": "വൂട്ട് സെർവറിലേക്ക് കണക്റ്റുചെയ്യാനായില്ല, ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക" + }, + "CONFIRM": { + "TITLE": "ഇല്ലാതാക്കൽ സ്ഥിരീകരിക്കുക", + "MESSAGE": "ഇല്ലാതാക്കണമെന്ന് ഉറപ്പാണോ ", + "YES": "അതെ, ഇല്ലാതാക്കുക ", + "NO": "ഇല്ല, സൂക്ഷിക്കുക " + } + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/ml/login.json b/app/javascript/dashboard/i18n/locale/ml/login.json new file mode 100644 index 000000000..0b7b51341 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ml/login.json @@ -0,0 +1,21 @@ +{ + "LOGIN": { + "TITLE": "ചാറ്റ് വൂട്ടിലേക്ക് ലോഗിൻ ചെയ്യുക", + "EMAIL": { + "LABEL": "ഇമെയിൽ", + "PLACEHOLDER": "ഇമെയിൽ ഉദാ: someone@example.com" + }, + "PASSWORD": { + "LABEL": "പാസ്‌വേഡ്", + "PLACEHOLDER": "പാസ്‌വേഡ്" + }, + "API": { + "SUCCESS_MESSAGE": "ലോഗിൻ വിജയകരം", + "ERROR_MESSAGE": "വൂട്ട് സെർവറിലേക്ക് കണക്റ്റു ചെയ്യാനായില്ല, ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക", + "UNAUTH": "ഉപയോക്തൃനാമം / പാസ്‌വേഡ് തെറ്റാണ്. ദയവായി വീണ്ടും ശ്രമിക്കുക" + }, + "FORGOT_PASSWORD": "നിങ്ങളുടെ പാസ്‌വേഡ് മറന്നോ?", + "CREATE_NEW_ACCOUNT": "പുതിയ അക്കൗണ്ട് സൃഷ്ടിക്കുക", + "SUBMIT": "സൈൻ ഇൻ" + } +} diff --git a/app/javascript/dashboard/i18n/locale/ml/report.json b/app/javascript/dashboard/i18n/locale/ml/report.json new file mode 100644 index 000000000..8176e387b --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ml/report.json @@ -0,0 +1,49 @@ +{ + "REPORT": { + "HEADER": "റിപ്പോർട്ടുകൾ", + "LOADING_CHART": "ചാർട്ട് ഡാറ്റ ലോഡു ചെയ്യുകയാണ്...", + "NO_ENOUGH_DATA": "റിപ്പോർട്ട് സൃഷ്ടിക്കുന്നതിന് ആവശ്യമായ ഡാറ്റ ഞങ്ങൾക്ക് ലഭിച്ചിട്ടില്ല, ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക.", + "METRICS": [ + { + "NAME": "സംഭാഷണങ്ങൾ", + "KEY": "conversations_count", + "DESC": "(ആകെ)" + }, + { + "NAME": "ഇൻ‌കമിംഗ് സന്ദേശങ്ങൾ‌", + "KEY": "incoming_messages_count", + "DESC": "( ആകെ )" + }, + { + "NAME": "ഔട്ട് ഗോയിങ് സന്ദേശങ്ങൾ‌", + "KEY": "outgoing_messages_count", + "DESC": "( ആകെ )" + }, + { + "NAME": "ആദ്യ പ്രതികരണ സമയം", + "KEY": "avg_first_response_time", + "DESC": "( ശരാശരി )" + }, + { + "NAME": "മിഴിവ് സമയം", + "KEY": "avg_resolution_time", + "DESC": "( ശരാശരി )" + }, + { + "NAME": "മിഴിവ് എണ്ണം", + "KEY": "resolutions_count", + "DESC": "( ആകെ )" + } + ], + "DATE_RANGE": [ + { + "id": 0, + "name": "കഴിഞ്ഞ 7 ദിവസം" + }, + { + "id": 1, + "name": "കഴിഞ്ഞ 30 ദിവസം" + } + ] + } +} diff --git a/app/javascript/dashboard/i18n/locale/ml/resetPassword.json b/app/javascript/dashboard/i18n/locale/ml/resetPassword.json new file mode 100644 index 000000000..66b59eec0 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ml/resetPassword.json @@ -0,0 +1,15 @@ +{ + "RESET_PASSWORD": { + "TITLE": "പാസ്‌വേഡ് പുനഃസജീകരിക്കുക", + "EMAIL": { + "LABEL": "ഇമെയിൽ", + "PLACEHOLDER": "ദയവായി നിങ്ങളുടെ ഇമെയിൽ നൽകുക", + "ERROR": "ദയവായി സാധുവായ ഒരു ഇമെയിൽ നൽകുക" + }, + "API": { + "SUCCESS_MESSAGE": "പാസ്‌വേഡ് പുനഃസജ്ജീകരണ ലിങ്ക് നിങ്ങളുടെ ഇമെയിലിലേക്ക് അയച്ചു", + "ERROR_MESSAGE": "വൂട്ട് സെർവറിലേക്ക് കണക്റ്റുചെയ്യാനായില്ല, ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക" + }, + "SUBMIT": "സമർപ്പിക്കുക" + } +} diff --git a/app/javascript/dashboard/i18n/locale/ml/setNewPassword.json b/app/javascript/dashboard/i18n/locale/ml/setNewPassword.json new file mode 100644 index 000000000..6fbacf70c --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ml/setNewPassword.json @@ -0,0 +1,20 @@ +{ + "SET_NEW_PASSWORD": { + "TITLE": "പുതിയ പാസ്‌വേഡ് സജ്ജമാക്കുക", + "PASSWORD": { + "LABEL": "പാസ്‌വേഡ്", + "PLACEHOLDER": "പാസ്‌വേഡ്", + "ERROR": "പാസ്‌വേഡ് വളരെ ചെറുതാണ്" + }, + "CONFIRM_PASSWORD": { + "LABEL": "പാസ്‌വേഡ് സ്ഥിരീകരിക്കുക", + "PLACEHOLDER": "പാസ്‌വേഡ് സ്ഥിരീകരിക്കുക", + "ERROR": "പാസ്‌വേഡുകൾ പൊരുത്തപ്പെടുന്നില്ല" + }, + "API": { + "SUCCESS_MESSAGE": "പാസ്‌വേഡ് വിജയകരമായി മാറ്റി", + "ERROR_MESSAGE": "സെർവറിലേക്ക് കണക്റ്റുചെയ്യാനായില്ല, ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക" + }, + "SUBMIT": "സമർപ്പിക്കുക" + } +} diff --git a/app/javascript/dashboard/i18n/locale/ml/settings.json b/app/javascript/dashboard/i18n/locale/ml/settings.json new file mode 100644 index 000000000..c768f6d1c --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ml/settings.json @@ -0,0 +1,97 @@ +{ + "PROFILE_SETTINGS": { + "LINK": "പ്രൊഫൈൽ ക്രമീകരണങ്ങൾ", + "TITLE": "പ്രൊഫൈൽ ക്രമീകരണങ്ങൾ", + "BTN_TEXT": "പ്രൊഫൈൽ അപ്‌ഡേറ്റ് ചെയ്യുക", + "AFTER_EMAIL_CHANGED": "നിങ്ങളുടെ പ്രൊഫൈൽ വിജയകരമായി അപ്‌ഡേറ്റു ചെയ്തിരിക്കുന്നു, ലോഗിൻ ക്രെഡൻഷ്യലുകൾ മാറ്റിയതിനാൽ ദയവായി വീണ്ടും ലോഗിൻ ചെയ്യുക", + "FORM": { + "AVATAR": "പ്രൊഫൈൽ ചിത്രം", + "ERROR": "ദയവായി ഫോമിലെ പിശകുകൾ പരിഹരിക്കുക", + "REMOVE_IMAGE": "നീക്കം ചെയ്യുക", + "UPLOAD_IMAGE": "ചിത്രം അപ്‌ലോഡു ചെയ്യുക", + "UPDATE_IMAGE": "ചിത്രം അപ്‌ഡേറ്റു ചെയ്യുക", + "PROFILE_SECTION": { + "TITLE": "പ്രൊഫൈൽ", + "NOTE": "നിങ്ങളുടെ ഇമെയിൽ വിലാസം നിങ്ങളുടെ ഐഡന്റിറ്റിയാണ്, ഒപ്പം ലോഗിൻ ചെയ്യാൻ ഇതാണ് ഉപയോഗിക്കേണ്ടത്." + }, + "PASSWORD_SECTION": { + "TITLE": "പാസ്‌വേഡ്", + "NOTE": "നിങ്ങളുടെ പാസ്‌വേഡ് അപ്‌ഡേറ്റ് ചെയ്യുന്നത് ഒന്നിലധികം ഉപകരണങ്ങളിൽ നിങ്ങളുടെ ലോഗിനുകൾ പുനഃസജ്ജീകരിക്കും." + }, + "ACCESS_TOKEN": { + "TITLE": "ആക്സസ് ടോക്കൺ", + "NOTE": "നിങ്ങൾ ഒരു എപിഐ അടിസ്ഥാനമാക്കിയുള്ള സംയോജനം നിർമ്മിക്കുകയാണെങ്കിൽ ഈ ടോക്കൺ ഉപയോഗിക്കാൻ കഴിയും" + }, + "EMAIL_NOTIFICATIONS_SECTION": { + "TITLE": "ഇമെയിൽ അറിയിപ്പുകൾ", + "NOTE": "നിങ്ങളുടെ ഇമെയിൽ അറിയിപ്പ് മുൻ‌ഗണനകൾ ഇവിടെ അപ്‌ഡേറ്റു ചെയ്യുക", + "CONVERSATION_ASSIGNMENT": "ഒരു സംഭാഷണം എനിക്ക് നിയോഗിക്കുമ്പോൾ ഇമെയിൽ അറിയിപ്പുകൾ അയയ്‌ക്കുക", + "CONVERSATION_CREATION": "ഒരു പുതിയ സംഭാഷണം സൃഷ്ടിക്കുമ്പോൾ ഇമെയിൽ അറിയിപ്പുകൾ അയയ്ക്കുക", + "UPDATE_SUCCESS": "നിങ്ങളുടെ ഇമെയിൽ അറിയിപ്പ് മുൻ‌ഗണനകൾ വിജയകരമായി അപ്‌ഡേറ്റു ചെയ്‌തു", + "UPDATE_ERROR": "മുൻ‌ഗണനകൾ അപ്‌ഡേറ്റു ചെയ്യുമ്പോൾ ഒരു പിശക് ഉണ്ട്, ദയവായി വീണ്ടും ശ്രമിക്കുക" + }, + "PROFILE_IMAGE": { + "LABEL": "പ്രൊഫൈൽ ചിത്രം" + }, + "NAME": { + "LABEL": "നിങ്ങളുടെ പേര്", + "ERROR": "ദയവായി സാധുവായ ഒരു പേര് നൽകുക", + "PLACEHOLDER": "ദയവായി നിങ്ങളുടെ പേര് നൽകുക, ഇത് സംഭാഷണങ്ങളിൽ ദൃശ്യമാകും" + }, + "EMAIL": { + "LABEL": "നിങ്ങളുടെ ഇമെയിൽ വിലാസം", + "ERROR": "ദയവായി സാധുവായ ഒരു ഇമെയിൽ വിലാസം നൽകുക", + "PLACEHOLDER": "ദയവായി നിങ്ങളുടെ ഇമെയിൽ വിലാസം നൽകുക, ഇത് സംഭാഷണങ്ങളിൽ ദൃശ്യമാകും" + }, + "PASSWORD": { + "LABEL": "പാസ്‌വേഡ്", + "ERROR": "ദയവായി 6 അല്ലെങ്കിൽ അതിൽ കൂടുതൽ ദൈർഘ്യമുള്ള പാസ്‌വേഡ് നൽകുക", + "PLACEHOLDER": "ദയവായി ഒരു പുതിയ പാസ്‌വേഡ് നൽകുക" + }, + "PASSWORD_CONFIRMATION": { + "LABEL": "പുതിയ പാസ്‌വേഡ് സ്ഥിരീകരിക്കുക", + "ERROR": "പാസ്‌വേഡുകൾ പൊരുത്തപ്പെടുന്നില്ല", + "PLACEHOLDER": "ദയവായി നിങ്ങളുടെ പാസ്‌വേഡ് വീണ്ടും നൽകുക" + } + } + }, + "SIDEBAR_ITEMS": { + "PROFILE_SETTINGS": "പ്രൊഫൈൽ ക്രമീകരണങ്ങൾ", + "LOGOUT": "ലോഗൗട്ട്" + }, + "APP_GLOBAL": { + "TRIAL_MESSAGE": "ദിവസത്തെ ട്രയൽ ശേഷിക്കുന്നു.", + "TRAIL_BUTTON": "ഇപ്പോൾ വാങ്ങുക" + }, + "COMPONENTS": { + "CODE": { + "BUTTON_TEXT": "പകർത്തുക", + "COPY_SUCCESSFUL": "കോഡ് വിജയകരമായി ക്ലിപ്പ്ബോർഡിലേക്ക് പകർത്തി" + }, + "FILE_BUBBLE": { + "DOWNLOAD": "ഡൗൺലോഡുചെയ്യുക", + "UPLOADING": "അപ്‌ലോഡുചെയ്യുന്നു..." + }, + "FORM_BUBBLE": { + "SUBMIT": "സമർപ്പിക്കുക" + } + }, + "CONFIRM_EMAIL": "പരിശോധിച്ചുറപ്പിക്കുന്നു...", + "SETTINGS": { + "INBOXES": { + "NEW_INBOX": "ഇൻ‌ബോക്സ് ചേർക്കുക" + } + }, + "SIDEBAR": { + "CONVERSATIONS": "സംഭാഷണങ്ങൾ", + "REPORTS": "റിപ്പോർട്ടുകൾ", + "SETTINGS": "ക്രമീകരണങ്ങൾ", + "HOME": "ഹോം", + "AGENTS": "ഏജന്റുമാർ", + "INBOXES": "ഇൻബോക്സുകൾ", + "CANNED_RESPONSES": "ക്യാൻഡ് പ്രതികരണങ്ങൾ", + "BILLING": "ബില്ലിംഗ്", + "INTEGRATIONS": "സംയോജനങ്ങൾ", + "ACCOUNT_SETTINGS": "അക്കൗണ്ട് ക്രമീകരണങ്ങൾ" + } +} diff --git a/app/javascript/dashboard/i18n/locale/ml/signup.json b/app/javascript/dashboard/i18n/locale/ml/signup.json new file mode 100644 index 000000000..8ec0decd7 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ml/signup.json @@ -0,0 +1,32 @@ +{ + "REGISTER": { + "TRY_WOOT": "ഒരു അക്കൗണ്ട് രജിസ്റ്റർ ചെയ്യുക", + "TITLE": "രജിസ്റ്റർ", + "TERMS_ACCEPT": "സൈൻ അപ്പ് ചെയ്യുന്നതിലൂടെ, നിങ്ങൾ ഞങ്ങളുടെ ഉപാധികളും നിബന്ധനകളും സ്വകാര്യതാ നയങ്ങളും അംഗീകരിക്കുന്നു", + "ACCOUNT_NAME": { + "LABEL": "അക്കൗണ്ട് നാമം", + "PLACEHOLDER": "പുണ്ണ്യാളൻ അഗർബത്തീസ്", + "ERROR": "അക്കൗണ്ട് നാമം വളരെ ചെറുതാണ്" + }, + "EMAIL": { + "LABEL": "ഇമെയിൽ", + "PLACEHOLDER": "punyalan@agarbathis.in", + "ERROR": "ഇമെയിൽ അസാധുവാണ്" + }, + "PASSWORD": { + "LABEL": "പാസ്‌വേഡ്", + "PLACEHOLDER": "പാസ്‌വേഡ്", + "ERROR": "പാസ്‌വേഡ് വളരെ ചെറുതാണ്" + }, + "CONFIRM_PASSWORD": { + "LABEL": "പാസ്‌വേഡ് സ്ഥിരീകരിക്കുക", + "PLACEHOLDER": "പാസ്‌വേഡ് സ്ഥിരീകരിക്കുക", + "ERROR": "പാസ്‌വേഡുകൾ പൊരുത്തപ്പെടുന്നില്ല" + }, + "API": { + "SUCCESS_MESSAGE": "രജിസ്ട്രേഷൻ വിജയകരമാണ്", + "ERROR_MESSAGE": "സെർവറിലേക്ക് കണക്റ്റുചെയ്യാനായില്ല, ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക" + }, + "SUBMIT": "സമർപ്പിക്കുക" + } +} diff --git a/app/javascript/dashboard/i18n/locale/ml/webhooks.json b/app/javascript/dashboard/i18n/locale/ml/webhooks.json new file mode 100644 index 000000000..a628f5e01 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ml/webhooks.json @@ -0,0 +1,5 @@ +{ + "WEBHOOKS_SETTINGS": { + "HEADER": "വെബ്‌ഹൂക്ക് ക്രമീകരണങ്ങൾ" + } +} diff --git a/app/javascript/dashboard/i18n/locale/nl/agentMgmt.json b/app/javascript/dashboard/i18n/locale/nl/agentMgmt.json new file mode 100644 index 000000000..737370a45 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/nl/agentMgmt.json @@ -0,0 +1,101 @@ +{ + "AGENT_MGMT": { + "HEADER": "Agenten", + "HEADER_BTN_TXT": "Agent toevoegen", + "LOADING": "Ophalen van agent lijst", + "SIDEBAR_TXT": "

Agenten

Een Agent is lid van uw Klantenservice team.

Agenten kunnen berichten van uw gebruikers bekijken en beantwoorden. De lijst toont alle agenten die momenteel in uw account bestaan.

Klik op Agent toevoegen om een nieuwe agent toe te voegen. De medewerker die je toevoegt ontvangt een e-mail met een bevestigingslink om zijn account te activeren, waarna hij Chatwoot kan bezoeken en op berichten kan reageren.

Toegang tot Chatwoots functies zijn gebaseerd op de volgende rollen.

Agent - Agenten met deze rol kunnen alleen inboxen, rapporten en gesprekken gebruiken. Ze kunnen gesprekken toewijzen aan andere agenten of zichzelf en gesprekken oplossen.

Beheerder - Een beheerder heeft toegang tot alle Chatwoot functies ingeschakeld voor uw account, inclusief instellingen en facturering, aangevuld met de gebruikelijke rechten van een agent.

", + "AGENT_TYPES": [ + { + "name": "administrator", + "label": "Beheerder" + }, + { + "name": "agent", + "label": "Agent" + } + ], + "LIST": { + "404": "Er zijn geen agenten gekoppeld aan dit account", + "TITLE": "Beheer agenten in uw team", + "DESC": "U kunt agenten toevoegen aan/in uw team verwijderen.", + "NAME": "Naam", + "EMAIL": "E-mailadres", + "STATUS": "Status", + "ACTIONS": "Acties", + "VERIFIED": "Geverifieerd", + "VERIFICATION_PENDING": "Verificatie in behandeling" + }, + "ADD": { + "TITLE": "Voeg agent toe aan je team", + "DESC": "U kunt medewerkers toevoegen die de ondersteunen verzorgen voor berichten in uw inboxen.", + "FORM": { + "NAME": { + "LABEL": "Agent naam", + "PLACEHOLDER": "Voer een naam in voor de agent" + }, + "AGENT_TYPE": { + "LABEL": "Agent type", + "PLACEHOLDER": "Selecteer een type", + "ERROR": "Agent type is vereist" + }, + "EMAIL": { + "LABEL": "Uw e-mailadres", + "PLACEHOLDER": "Voer een e-mailadres in van de agent" + }, + "SUBMIT": "Agent toevoegen" + }, + "API": { + "SUCCESS_MESSAGE": "Agent toegevoegd", + "EXIST_MESSAGE": "Agent e-mailadres al in gebruik, probeer een ander e-mailadres", + "ERROR_MESSAGE": "Kan geen verbinding maken met Woot Server, probeer het later opnieuw" + } + }, + "DELETE": { + "BUTTON_TEXT": "Verwijderen", + "API": { + "SUCCESS_MESSAGE": "Agent succesvol verwijderd", + "ERROR_MESSAGE": "Kan geen verbinding maken met Woot Server, probeer het later opnieuw" + }, + "CONFIRM": { + "TITLE": "Verwijdering bevestigen", + "MESSAGE": "Weet u zeker dat u wilt verwijderen ", + "YES": "Ja, verwijderen ", + "NO": "Nee, bewaar het " + } + }, + "EDIT": { + "TITLE": "Bewerk medewerker", + "FORM": { + "NAME": { + "LABEL": "Agent naam", + "PLACEHOLDER": "Voer een naam in voor de agent" + }, + "AGENT_TYPE": { + "LABEL": "Agent type", + "PLACEHOLDER": "Selecteer een type", + "ERROR": "Agent type is vereist" + }, + "EMAIL": { + "LABEL": "Uw e-mailadres", + "PLACEHOLDER": "Voer een e-mailadres in van de medewerker" + }, + "SUBMIT": "Bewerk Agent" + }, + "BUTTON_TEXT": "Bewerken", + "CANCEL_BUTTON_TEXT": "Annuleren", + "API": { + "SUCCESS_MESSAGE": "Agent succesvol bijgewerkt", + "ERROR_MESSAGE": "Kan geen verbinding maken met Woot Server, probeer het later opnieuw" + }, + "PASSWORD_RESET": { + "ADMIN_RESET_BUTTON": "Wachtwoord opnieuw instellen", + "ADMIN_SUCCESS_MESSAGE": "Een e-mail met instructies om het wachtwoord te resetten is verstuurd naar de medewerker", + "SUCCESS_MESSAGE": "Agent wachtwoord opnieuw instellen geslaagd", + "ERROR_MESSAGE": "Kan geen verbinding maken met Woot Server, probeer het later opnieuw" + } + }, + "SEARCH": { + "NO_RESULTS": "Geen agenten gevonden." + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/nl/billing.json b/app/javascript/dashboard/i18n/locale/nl/billing.json new file mode 100644 index 000000000..fe4db934d --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/nl/billing.json @@ -0,0 +1,19 @@ +{ + "BILLING": { + "HEADER": "Facturatie", + "LOADING": "Ophalen Abonnementen", + "ACCOUNT_STATE": "Status account", + "AGENT_COUNT": "Aantal Agent", + "PER_AGENT_COST": "Kost per agent", + "TOTAL_COST": "Totale kosten", + "BUTTON": { + "ADD": "Betaalmethode toevoegen", + "EDIT": "Betalingsmethode bewerken" + }, + "TRIAL": { + "TITLE": "Uw proefperiode is voorbij", + "MESSAGE": "Voeg een betaalmethode toe om Chatwood te blijven gebruiken." + }, + "ACCOUNT_LOCKED": "Uw account is op dit moment niet beschikbaar.
Neem contact op met uw beheerder voor heractivatie." + } +} diff --git a/app/javascript/dashboard/i18n/locale/nl/cannedMgmt.json b/app/javascript/dashboard/i18n/locale/nl/cannedMgmt.json new file mode 100644 index 000000000..56211e694 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/nl/cannedMgmt.json @@ -0,0 +1,74 @@ +{ + "CANNED_MGMT": { + "HEADER": "Standaard antwoorden", + "HEADER_BTN_TXT": "Voorgedefinieerde antwoorden toevoegen", + "LOADING": "Voorgedefinieerde antwoorden ophalen", + "SEARCH_404": "Er zijn geen items die overeenkomen met deze zoekopdracht", + "SIDEBAR_TXT": "

Voorgedefinieerde antwoorden

Voorgedefinieerde antwoorden zijn opgeslagen antwoordsjablonen die kunnen worden gebruikt om snel een antwoord te sturen naar een gesprek.

Voor het maken van een voorgedefinieerd antwoord, klik op de Voeg voorgedefinieerd antwoord toe. U kunt een bestaande antwoorden bewerken of verwijderen door op de knop Bewerken of Verwijderen te klikken

Voorgedefinieerde antwoorden worden gebruikt met behulp van korte codes. Agents hebben toegang tot standaard antwoorden in een chat door '/' te typen gevolgd door de korte code.

", + "LIST": { + "404": "Er zijn geen voorgedefinieerde antwoorden beschikbaar in dit account.", + "TITLE": "Beheer voorgedefinieerde antwoorden", + "DESC": "Voorgedefinieerde antwoorden zijn vooraf gedefinieerde antwoordsjablonen die kunnen worden gebruikt om snel antwoorden naar tickets te sturen.", + "TABLE_HEADER": [ + "Korte code", + "Inhoud", + "Acties" + ] + }, + "ADD": { + "TITLE": "Voorgedefinieerde antwoord toevoegen", + "DESC": "Voorgedefinieerde antwoorden zijn opgeslagen antwoordsjablonen die kunnen worden gebruikt om snel te reageren op gesprek.", + "FORM": { + "SHORT_CODE": { + "LABEL": "Korte code", + "PLACEHOLDER": "Vul een korte code in", + "ERROR": "Korte code is vereist" + }, + "CONTENT": { + "LABEL": "Inhoud", + "PLACEHOLDER": "Voer een inhoud in", + "ERROR": "Inhoud is vereist" + }, + "SUBMIT": "Bevestigen" + }, + "API": { + "SUCCESS_MESSAGE": "Voorgedefinieerd antwoord met succes toegevoegd", + "ERROR_MESSAGE": "Kan geen verbinding maken met Woot Server, probeer het later opnieuw" + } + }, + "EDIT": { + "TITLE": "Bewerk voorgedefineerd antwoord", + "FORM": { + "SHORT_CODE": { + "LABEL": "Korte code", + "PLACEHOLDER": "Vul een korte code in", + "ERROR": "Korte code is vereist" + }, + "CONTENT": { + "LABEL": "Inhoud", + "PLACEHOLDER": "Voer een inhoud in", + "ERROR": "Inhoud is vereist" + }, + "SUBMIT": "Bevestigen" + }, + "BUTTON_TEXT": "Bewerken", + "API": { + "SUCCESS_MESSAGE": "Voorgedefinieerd antwoord succesvol bijgewerkt", + "ERROR_MESSAGE": "Kan geen verbinding maken met Woot Server, probeer het later opnieuw" + } + }, + "DELETE": { + "BUTTON_TEXT": "Verwijderen", + "API": { + "SUCCESS_MESSAGE": "Voorgedefinieerd antwoord succesvol verwijderd", + "ERROR_MESSAGE": "Kan geen verbinding maken met Woot Server, probeer het later opnieuw" + }, + "CONFIRM": { + "TITLE": "Verwijdering bevestigen", + "MESSAGE": "Weet u zeker dat u wilt verwijderen ", + "YES": "Ja, verwijderen ", + "NO": "Nee, bewaar het " + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/nl/chatlist.json b/app/javascript/dashboard/i18n/locale/nl/chatlist.json new file mode 100644 index 000000000..5174cb610 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/nl/chatlist.json @@ -0,0 +1,77 @@ +{ + "CHAT_LIST": { + "LOADING": "Gesprekken ophalen", + "LOAD_MORE_CONVERSATIONS": "Meer gesprekken laden", + "EOF": "Alle gesprekken geladen 🎉", + "LIST": { + "404": "Er zijn geen actieve gesprekken in deze groep." + }, + "TAB_HEADING": "Gesprekken", + "SEARCH": { + "INPUT": "Zoek naar mensen, Chat, opgeslagen antwoorden .." + }, + "STATUS_TABS": [ + { + "NAME": "Open", + "KEY": "openCount" + }, + { + "NAME": "Opgelost", + "KEY": "allConvCount" + } + ], + "ASSIGNEE_TYPE_TABS": [ + { + "NAME": "Mijn", + "KEY": "me", + "COUNT_KEY": "mineCount" + }, + { + "NAME": "Niet-toegewezen", + "KEY": "unassigned", + "COUNT_KEY": "unAssignedCount" + }, + { + "NAME": "Allemaal", + "KEY": "all", + "COUNT_KEY": "allCount" + } + ], + "CHAT_STATUS_ITEMS": [ + { + "TEXT": "Open", + "VALUE": "open" + }, + { + "TEXT": "Opgelost", + "VALUE": "resolved" + } + ], + "ATTACHMENTS": { + "image": { + "ICON": "ion-image", + "CONTENT": "Bericht met foto" + }, + "audio": { + "ICON": "ion-volume-high", + "CONTENT": "Audio bericht" + }, + "video": { + "ICON": "ion-ios-videocam", + "CONTENT": "Video bericht" + }, + "file": { + "ICON": "ion-document", + "CONTENT": "Bestand bijlage" + }, + "location": { + "ICON": "ion-ios-location", + "CONTENT": "Locatie" + }, + "fallback": { + "ICON": "ion-link", + "CONTENT": "heeft een url gedeeld" + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/nl/contact.json b/app/javascript/dashboard/i18n/locale/nl/contact.json new file mode 100644 index 000000000..64c99ef90 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/nl/contact.json @@ -0,0 +1,20 @@ +{ + "CONTACT_PANEL": { + "CONVERSATION_TITLE": "Gesprek details", + "BROWSER": "Browser", + "OS": "Operating systeem", + "INITIATED_FROM": "Geïnitieerd vanuit", + "INITIATED_AT": "Geïnitieerd op", + "CONVERSATIONS": { + "NO_RECORDS_FOUND": "Er zijn geen eerdere gesprekken gekoppeld aan dit contact.", + "TITLE": "Vorige gesprekken" + }, + "LABELS": { + "TITLE": "Labels voor gesprekken", + "UPDATE_BUTTON": "Labels bijwerken", + "UPDATE_ERROR": "Kon labels niet updaten, probeer het opnieuw.", + "TAG_PLACEHOLDER": "Nieuw label toevoegen", + "PLACEHOLDER": "Zoek of voeg een label toe" + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/nl/conversation.json b/app/javascript/dashboard/i18n/locale/nl/conversation.json new file mode 100644 index 000000000..225a429fa --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/nl/conversation.json @@ -0,0 +1,35 @@ +{ + "CONVERSATION": { + "404": "Selecteer een gesprek in het linker paneel", + "NO_MESSAGE_1": "Oh oh! Het lijkt erop dat er geen berichten van klanten in uw inbox staan.", + "NO_MESSAGE_2": " om een bericht naar uw pagina te sturen!", + "NO_INBOX_1": "Hola! Het lijkt erop dat je nog geen inboxes hebt toegevoegd.", + "NO_INBOX_2": " om te beginnen", + "NO_INBOX_AGENT": "Oh Oh! Het lijkt erop dat u geen deel uitmaakt van een inbox. Neem contact op met uw beheerder", + "CLICK_HERE": "Klik hier", + "LOADING_INBOXES": "Inboxen laden", + "LOADING_CONVERSATIONS": "Conversaties laden", + "DOWNLOAD": "Downloaden", + "HEADER": { + "RESOLVE_ACTION": "Oplossen", + "REOPEN_ACTION": "Heropenen", + "OPEN": "Meer", + "CLOSE": "Afsluiten", + "DETAILS": "Details" + }, + "FOOTER": { + "MSG_INPUT": "Shift + enter voor nieuwe regel. Begin met '/' om een voorgedefinieerd antwoord te selecteren.", + "PRIVATE_MSG_INPUT": "Shift + nieuwe regel invoeren. Dit is alleen zichtbaar voor agenten" + }, + "REPLYBOX": { + "REPLY": "Beantwoorden", + "PRIVATE_NOTE": "Privé notitie", + "SEND": "Verzenden", + "CREATE": "Notitie toevoegen", + "TWEET": "Tweet" + }, + "VISIBLE_TO_AGENTS": "Privéopmerking: alleen zichtbaar voor jou en je team", + "CHANGE_STATUS": "Gesprek status veranderd", + "CHANGE_AGENT": "Gesprek toegewezen persoon veranderd" + } +} diff --git a/app/javascript/dashboard/i18n/locale/nl/integrations.json b/app/javascript/dashboard/i18n/locale/nl/integrations.json new file mode 100644 index 000000000..0a5ec901c --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/nl/integrations.json @@ -0,0 +1,54 @@ +{ + "INTEGRATION_SETTINGS": { + "HEADER": "Integraties", + "WEBHOOK": { + "TITLE": "Webhook", + "CONFIGURE": "Configureren", + "HEADER": "Webhook instellingen", + "HEADER_BTN_TXT": "Nieuwe webhook toevoegen", + "INTEGRATION_TXT": "Webhook events bieden je de realtime informatie over wat er gebeurt in je Chatwoot account. Je kunt gebruik maken van de webhooks om de evenementen te communiceren met je favoriete apps zoals Slack of Github. Klik op Configureren om uw webhooks in te stellen.", + "LOADING": "Bijgevoegde webhooks ophalen", + "SEARCH_404": "Er zijn geen items die overeenkomen met deze zoekopdracht", + "SIDEBAR_TXT": "

Webhooks

Webhooks zijn HTTP callbacks die voor elk account kunnen worden gedefinieerd. Ze worden geactiveerd door gebeurtenissen zoals het aanmaken van berichten in Chatwoot. Je kunt meer dan één webhook aanmaken voor dit account.

Voor het maken van een webhook, klik op de Voeg nieuwe webhook knop toe. U kunt ook alle bestaande webhook verwijderen door te klikken op de verwijderknop.

", + "LIST": { + "404": "Er zijn geen webhooks geconfigureerd voor dit account.", + "TITLE": "Webhooks beheren", + "DESC": "Webhooks zijn vooraf gedefinieerde antwoordsjablonen die kunnen worden gebruikt om snel antwoorden op tickets te verzenden.", + "TABLE_HEADER": [ + "Webhook eindpunt", + "acties" + ] + }, + "ADD": { + "CANCEL": "annuleren", + "TITLE": "Nieuwe webhook toevoegen", + "DESC": "Webhook events bieden je realtime informatie over wat er gebeurt in je Chatwoot account. Voer een geldige URL in om een callback te configureren.", + "FORM": { + "END_POINT": { + "LABEL": "Webhook URL", + "PLACEHOLDER": "Voorbeeld: https://voorbeeld/api/webhook", + "ERROR": "Voer een geldige URL in" + }, + "SUBMIT": "Maak webhook" + }, + "API": { + "SUCCESS_MESSAGE": "Webhook succesvol toegevoegd", + "ERROR_MESSAGE": "Kan geen verbinding maken met Woot Server, probeer het later opnieuw" + } + }, + "DELETE": { + "BUTTON_TEXT": "Verwijderen", + "API": { + "SUCCESS_MESSAGE": "Webhook succesvol verwijderd", + "ERROR_MESSAGE": "Kan geen verbinding maken met Woot Server, probeer het later opnieuw" + }, + "CONFIRM": { + "TITLE": "Verwijdering bevestigen", + "MESSAGE": "Weet u zeker dat u wilt verwijderen ", + "YES": "Ja, verwijderen ", + "NO": "Nee, Bewaar het " + } + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/nl/report.json b/app/javascript/dashboard/i18n/locale/nl/report.json new file mode 100644 index 000000000..b06b4d2eb --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/nl/report.json @@ -0,0 +1,49 @@ +{ + "REPORT": { + "HEADER": "Rapporten", + "LOADING_CHART": "Kaartgegevens laden...", + "NO_ENOUGH_DATA": "We hebben niet genoeg datapunten ontvangen om een rapport te genereren, probeer het later opnieuw.", + "METRICS": [ + { + "NAME": "Gesprekken", + "KEY": "conversations_count", + "DESC": "( Totaal )" + }, + { + "NAME": "Inkomende berichten", + "KEY": "incoming_messages_count", + "DESC": "( Totaal )" + }, + { + "NAME": "Uitgaande berichten", + "KEY": "outgoing_messages_count", + "DESC": "( Totaal )" + }, + { + "NAME": "Eerste reactietijd", + "KEY": "avg_first_response_time", + "DESC": "(Gem. )" + }, + { + "NAME": "Resolutie Tijd", + "KEY": "avg_resolution_time", + "DESC": "(Gem. )" + }, + { + "NAME": "Aantal Resoluties", + "KEY": "resolutions_count", + "DESC": "( Totaal )" + } + ], + "DATE_RANGE": [ + { + "id": 0, + "name": "Afgelopen 7 dagen" + }, + { + "id": 1, + "name": "Laatste 30 dagen" + } + ] + } +} diff --git a/app/javascript/dashboard/i18n/locale/nl/resetPassword.json b/app/javascript/dashboard/i18n/locale/nl/resetPassword.json new file mode 100644 index 000000000..0f0a063cc --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/nl/resetPassword.json @@ -0,0 +1,15 @@ +{ + "RESET_PASSWORD": { + "TITLE": "Wachtwoord opnieuw instellen", + "EMAIL": { + "LABEL": "E-mailadres", + "PLACEHOLDER": "Voer uw e-mailadres in", + "ERROR": "Voer een geldig e-mailadres in" + }, + "API": { + "SUCCESS_MESSAGE": "Wachtwoord reset link is verstuurd naar uw e-mail", + "ERROR_MESSAGE": "Kan geen verbinding maken met Woot Server, probeer het later opnieuw" + }, + "SUBMIT": "Bevestigen" + } +} diff --git a/app/javascript/dashboard/i18n/locale/nl/setNewPassword.json b/app/javascript/dashboard/i18n/locale/nl/setNewPassword.json new file mode 100644 index 000000000..436d1b812 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/nl/setNewPassword.json @@ -0,0 +1,20 @@ +{ + "SET_NEW_PASSWORD": { + "TITLE": "Nieuw wachtwoord instellen", + "PASSWORD": { + "LABEL": "Wachtwoord", + "PLACEHOLDER": "Wachtwoord", + "ERROR": "Wachtwoord is te kort" + }, + "CONFIRM_PASSWORD": { + "LABEL": "Bevestig wachtwoord", + "PLACEHOLDER": "Bevestig wachtwoord", + "ERROR": "Wachtwoorden komen niet overeen" + }, + "API": { + "SUCCESS_MESSAGE": "Wachtwoord succesvol veranderd", + "ERROR_MESSAGE": "Kan geen verbinding maken met Woot Server, probeer het later opnieuw" + }, + "SUBMIT": "Bevestigen" + } +} diff --git a/app/javascript/dashboard/i18n/locale/nl/signup.json b/app/javascript/dashboard/i18n/locale/nl/signup.json new file mode 100644 index 000000000..621d65cfb --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/nl/signup.json @@ -0,0 +1,32 @@ +{ + "REGISTER": { + "TRY_WOOT": "Registreer een account", + "TITLE": "Registreren", + "TERMS_ACCEPT": "Door je aan te melden ga je akkoord met onze T & C en Privacy Policy", + "ACCOUNT_NAME": { + "LABEL": "Klant naam", + "PLACEHOLDER": "Wayne Ondernemingen", + "ERROR": "Accountnaam is te kort" + }, + "EMAIL": { + "LABEL": "E-mailadres", + "PLACEHOLDER": "bruce@wayne.enterprises", + "ERROR": "E-mailadres is ongeldig" + }, + "PASSWORD": { + "LABEL": "Wachtwoord", + "PLACEHOLDER": "Wachtwoord", + "ERROR": "Wachtwoord is te kort" + }, + "CONFIRM_PASSWORD": { + "LABEL": "Bevestig wachtwoord", + "PLACEHOLDER": "Bevestig wachtwoord", + "ERROR": "Wachtwoord komt niet overeen" + }, + "API": { + "SUCCESS_MESSAGE": "Registratie geslaagd", + "ERROR_MESSAGE": "Kan geen verbinding maken met Woot Server, probeer het later opnieuw" + }, + "SUBMIT": "Bevestigen" + } +} diff --git a/app/javascript/dashboard/i18n/locale/nl/webhooks.json b/app/javascript/dashboard/i18n/locale/nl/webhooks.json new file mode 100644 index 000000000..f864ac9f7 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/nl/webhooks.json @@ -0,0 +1,5 @@ +{ + "WEBHOOKS_SETTINGS": { + "HEADER": "Webhook instellingen" + } +} diff --git a/app/javascript/dashboard/i18n/locale/pl/agentMgmt.json b/app/javascript/dashboard/i18n/locale/pl/agentMgmt.json new file mode 100644 index 000000000..6aff12658 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pl/agentMgmt.json @@ -0,0 +1,101 @@ +{ + "AGENT_MGMT": { + "HEADER": "Agenci", + "HEADER_BTN_TXT": "Dodaj agenta", + "LOADING": "Pobieranie listy agentów", + "SIDEBAR_TXT": "

Agenci

Agent jest członkiem Twojego zespołu wsparcia klienta.

Agenci będą mogli przeglądać i odpowiadać na wiadomości od Twoich użytkowników. Lista wyświetla wszystkich agentów aktualnie na Twoim koncie.

Kliknij Dodaj agenta , aby dodać nowego agenta. Dodany przez Ciebie przedstawiciel otrzyma e-mail z linkiem potwierdzającym, aby aktywować swoje konto, po którym będą mogli uzyskać dostęp do Chatwoot i odpowiadać na wiadomości.

Dostęp do funkcji Chatwoot opiera się na następujących rolach.

Agent - Agenci z tą rolą mogą mieć dostęp tylko do skrzynki odbiorczej, raportów i konwersacji. Mogą nadawać rozmowy innym agentom lub sami i rozwiązywać rozmowy.

Administrator - Administrator będzie miał dostęp do wszystkich funkcji Chatwoot włączonych dla Twojego konta, łącznie z ustawieniami i rozliczeniami, wraz ze wszystkimi uprawnieniami zwykłych agentów.

", + "AGENT_TYPES": [ + { + "name": "administrator", + "label": "Administrator" + }, + { + "name": "agent", + "label": "Agent" + } + ], + "LIST": { + "404": "Nie ma agentów powiązanych z tym kontem", + "TITLE": "Zarządzaj agentami w zespole", + "DESC": "Możesz dodać/usunąć agentów do/w zespole.", + "NAME": "Nazwisko", + "EMAIL": "EMAIL", + "STATUS": "Status", + "ACTIONS": "Akcje", + "VERIFIED": "Zweryfikowano", + "VERIFICATION_PENDING": "Weryfikacja oczekuje" + }, + "ADD": { + "TITLE": "Dodaj agenta do swojego zespołu", + "DESC": "Możesz dodać osoby, które będą w stanie obsłużyć wsparcie dla twoich skrzynek odbiorczych.", + "FORM": { + "NAME": { + "LABEL": "Nazwa agenta", + "PLACEHOLDER": "Wprowadź nazwę agenta" + }, + "AGENT_TYPE": { + "LABEL": "Typ agenta", + "PLACEHOLDER": "Wybierz typ", + "ERROR": "Typ agenta jest wymagany" + }, + "EMAIL": { + "LABEL": "Adres e-mail", + "PLACEHOLDER": "Wprowadź adres e-mail agenta" + }, + "SUBMIT": "Dodaj agenta" + }, + "API": { + "SUCCESS_MESSAGE": "Agent dodany pomyślnie", + "EXIST_MESSAGE": "Email agenta jest już w użyciu, spróbuj innego adresu e-mail", + "ERROR_MESSAGE": "Nie można połączyć się z Woot Server, spróbuj ponownie później" + } + }, + "DELETE": { + "BUTTON_TEXT": "Usuń", + "API": { + "SUCCESS_MESSAGE": "Agent usunięty pomyślnie", + "ERROR_MESSAGE": "Nie można połączyć się z Woot Server, spróbuj ponownie później" + }, + "CONFIRM": { + "TITLE": "Potwierdź usunięcie", + "MESSAGE": "Czy na pewno chcesz usunąć ", + "YES": "Tak, usuń ", + "NO": "Nie, Zachowaj " + } + }, + "EDIT": { + "TITLE": "Edytuj agenta", + "FORM": { + "NAME": { + "LABEL": "Nazwa agenta", + "PLACEHOLDER": "Wprowadź nazwę agenta" + }, + "AGENT_TYPE": { + "LABEL": "Typ agenta", + "PLACEHOLDER": "Wybierz typ", + "ERROR": "Typ agenta jest wymagany" + }, + "EMAIL": { + "LABEL": "Adres e-mail", + "PLACEHOLDER": "Wprowadź adres e-mail agenta" + }, + "SUBMIT": "Edytuj agenta" + }, + "BUTTON_TEXT": "Edytuj", + "CANCEL_BUTTON_TEXT": "Anuluj", + "API": { + "SUCCESS_MESSAGE": "Agent został pomyślnie zaktualizowany", + "ERROR_MESSAGE": "Nie można połączyć się z Woot Server, spróbuj ponownie później" + }, + "PASSWORD_RESET": { + "ADMIN_RESET_BUTTON": "Resetuj hasło", + "ADMIN_SUCCESS_MESSAGE": "E-mail z instrukcjami resetowania hasła został wysłany do agenta", + "SUCCESS_MESSAGE": "Pomyślnie zresetowano hasło agenta", + "ERROR_MESSAGE": "Nie można połączyć się z Woot Server, spróbuj ponownie później" + } + }, + "SEARCH": { + "NO_RESULTS": "Nie znaleziono żadnych agentów." + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/pl/billing.json b/app/javascript/dashboard/i18n/locale/pl/billing.json new file mode 100644 index 000000000..6a3a07496 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pl/billing.json @@ -0,0 +1,19 @@ +{ + "BILLING": { + "HEADER": "Płatność", + "LOADING": "Pobieranie subskrypcji", + "ACCOUNT_STATE": "Stan konta", + "AGENT_COUNT": "Liczba agentów", + "PER_AGENT_COST": "Koszt za agenta", + "TOTAL_COST": "Całkowity koszt", + "BUTTON": { + "ADD": "Dodaj metodę płatności", + "EDIT": "Metoda płatności EDIT" + }, + "TRIAL": { + "TITLE": "Twój okres próbny minął", + "MESSAGE": "Dodaj metodę płatności, aby kontynuować korzystanie z Chatwoot." + }, + "ACCOUNT_LOCKED": "Twoje konto nie jest obecnie dostępne.
Skontaktuj się z administratorem, aby reaktywować." + } +} diff --git a/app/javascript/dashboard/i18n/locale/pl/cannedMgmt.json b/app/javascript/dashboard/i18n/locale/pl/cannedMgmt.json new file mode 100644 index 000000000..2c9f298f7 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pl/cannedMgmt.json @@ -0,0 +1,74 @@ +{ + "CANNED_MGMT": { + "HEADER": "Gotowe odpowiedzi", + "HEADER_BTN_TXT": "Dodaj Gotową odpowiedź", + "LOADING": "Pobieranie gotowych odpowiedzi", + "SEARCH_404": "Brak elementów pasujących do tego zapytania", + "SIDEBAR_TXT": "

Gotowe odpowiedzi

Gotowe odpowiedzi to zapisane szablony odpowiedzi, które mogą być użyte do szybkiego wysłania odpowiedzi do rozmowy.

Aby utworzyć Gotową odpowiedź, wystarczy kliknąć Dodaj Gotową Odpowiedź. Możesz również edytować lub usuwać istniejącą gotową odpowiedź, klikając przycisk Edytuj lub Usuń

Gotowe odpowiedzi są używane z pomocą Krótkie kody. Agenci mogą uzyskać dostęp do gotowych odpowiedzi podczas czatu, wpisując '/' , a następnie krótki kod.

", + "LIST": { + "404": "Brak gotowych odpowiedzi dostępnych na tym koncie.", + "TITLE": "Zarządzaj gotowymi odpowiedziami", + "DESC": "Gotowe odpowiedzi to predefiniowane szablony odpowiedzi, które mogą być użyte do szybkiego wysyłania odpowiedzi na zgłoszenia.", + "TABLE_HEADER": [ + "Krótki kod", + "Zawartość", + "Akcje" + ] + }, + "ADD": { + "TITLE": "Dodaj Gotową odpowiedź", + "DESC": "Gotowe odpowiedzi są zapisanymi szablonami odpowiedzi, które mogą być użyte do szybkiego wysyłania odpowiedzi do konwersacji.", + "FORM": { + "SHORT_CODE": { + "LABEL": "Krótki kod", + "PLACEHOLDER": "Wprowadź krótki kod", + "ERROR": "Krótki kod jest wymagany" + }, + "CONTENT": { + "LABEL": "Zawartość", + "PLACEHOLDER": "Wprowadź zawartość", + "ERROR": "Zawartość jest wymagana" + }, + "SUBMIT": "Prześlij" + }, + "API": { + "SUCCESS_MESSAGE": "Gotowa odpowiedź dodana pomyślnie", + "ERROR_MESSAGE": "Nie można połączyć się z Woot Server, spróbuj ponownie później" + } + }, + "EDIT": { + "TITLE": "Edytuj Gotową odpowiedź", + "FORM": { + "SHORT_CODE": { + "LABEL": "Krótki kod", + "PLACEHOLDER": "Wprowadź krótki kod", + "ERROR": "Krótki kod jest wymagany" + }, + "CONTENT": { + "LABEL": "Zawartość", + "PLACEHOLDER": "Wprowadź zawartość", + "ERROR": "Zawartość jest wymagana" + }, + "SUBMIT": "Prześlij" + }, + "BUTTON_TEXT": "Edytuj", + "API": { + "SUCCESS_MESSAGE": "Gotowa odpowiedź została zaktualizowana", + "ERROR_MESSAGE": "Nie można połączyć się z Woot Server, spróbuj ponownie później" + } + }, + "DELETE": { + "BUTTON_TEXT": "Usuń", + "API": { + "SUCCESS_MESSAGE": "Gotowa odpowiedź została usunięta", + "ERROR_MESSAGE": "Nie można połączyć się z Woot Server, spróbuj ponownie później" + }, + "CONFIRM": { + "TITLE": "Potwierdź usunięcie", + "MESSAGE": "Czy na pewno chcesz usunąć ", + "YES": "Tak, usuń ", + "NO": "Nie, Zachowaj " + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/pl/chatlist.json b/app/javascript/dashboard/i18n/locale/pl/chatlist.json new file mode 100644 index 000000000..3b0726f35 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pl/chatlist.json @@ -0,0 +1,77 @@ +{ + "CHAT_LIST": { + "LOADING": "Pobieranie konwersacji", + "LOAD_MORE_CONVERSATIONS": "Załaduj więcej rozmów", + "EOF": "Wszystkie rozmowy załadowane 🎉", + "LIST": { + "404": "W tej grupie nie ma aktywnych konwersacji." + }, + "TAB_HEADING": "Rozmowy", + "SEARCH": { + "INPUT": "Szukaj ludzi, czatów, zapisanych odpowiedzi .." + }, + "STATUS_TABS": [ + { + "NAME": "Otwórz", + "KEY": "openCount" + }, + { + "NAME": "Rozwiązano", + "KEY": "allConvCount" + } + ], + "ASSIGNEE_TYPE_TABS": [ + { + "NAME": "Kopalnia", + "KEY": "me", + "COUNT_KEY": "mineCount" + }, + { + "NAME": "Nieprzypisane", + "KEY": "unassigned", + "COUNT_KEY": "unAssignedCount" + }, + { + "NAME": "Wszystkie", + "KEY": "all", + "COUNT_KEY": "allCount" + } + ], + "CHAT_STATUS_ITEMS": [ + { + "TEXT": "Otwórz", + "VALUE": "open" + }, + { + "TEXT": "Rozwiązano", + "VALUE": "resolved" + } + ], + "ATTACHMENTS": { + "image": { + "ICON": "ion-image", + "CONTENT": "Wiadomość obrazkowa" + }, + "audio": { + "ICON": "ion-volume-high", + "CONTENT": "Wiadomość audio" + }, + "video": { + "ICON": "ion-ios-videocam", + "CONTENT": "Wiadomość wideo" + }, + "file": { + "ICON": "ion-document", + "CONTENT": "Załącznik pliku" + }, + "location": { + "ICON": "ion-ios-location", + "CONTENT": "Lokalizacja" + }, + "fallback": { + "ICON": "ion-link", + "CONTENT": "udostępnił adres url" + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/pl/contact.json b/app/javascript/dashboard/i18n/locale/pl/contact.json new file mode 100644 index 000000000..9069f148a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pl/contact.json @@ -0,0 +1,20 @@ +{ + "CONTACT_PANEL": { + "CONVERSATION_TITLE": "Szczegóły konwersacji", + "BROWSER": "Przeglądarki", + "OS": "System operacyjny", + "INITIATED_FROM": "Zainicjowano z", + "INITIATED_AT": "Zainicjowano w", + "CONVERSATIONS": { + "NO_RECORDS_FOUND": "Brak poprzednich rozmów powiązanych z tym kontaktem.", + "TITLE": "Poprzednie rozmowy" + }, + "LABELS": { + "TITLE": "Etykiety konwersacji", + "UPDATE_BUTTON": "Aktualizuj etykiety", + "UPDATE_ERROR": "Nie można zaktualizować etykiet, spróbuj ponownie.", + "TAG_PLACEHOLDER": "Dodaj nową etykietę", + "PLACEHOLDER": "Szukaj lub dodaj etykietę" + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/pl/conversation.json b/app/javascript/dashboard/i18n/locale/pl/conversation.json new file mode 100644 index 000000000..3a8f07517 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pl/conversation.json @@ -0,0 +1,35 @@ +{ + "CONVERSATION": { + "404": "Wybierz rozmowę z lewej strony", + "NO_MESSAGE_1": "Ups! Wygląda na to, że nie ma wiadomości od klientów w Twojej skrzynce odbiorczej.", + "NO_MESSAGE_2": " aby wysłać wiadomość na swoją stronę!", + "NO_INBOX_1": "Hola! Wygląda na to, że nie dodałeś jeszcze żadnej skrzynki odbiorczej.", + "NO_INBOX_2": " rozpocząć", + "NO_INBOX_AGENT": "Uh Oh! Wygląda na to, że nie jesteś częścią żadnej skrzynki odbiorczej. Skontaktuj się z administratorem", + "CLICK_HERE": "Kliknij tutaj", + "LOADING_INBOXES": "Ładowanie skrzynek odbiorczych", + "LOADING_CONVERSATIONS": "Ładowanie konwersacji", + "DOWNLOAD": "Pobierz", + "HEADER": { + "RESOLVE_ACTION": "Rozwiąż", + "REOPEN_ACTION": "Otwórz ponownie", + "OPEN": "Więcej", + "CLOSE": "Zamknij", + "DETAILS": "szczegóły" + }, + "FOOTER": { + "MSG_INPUT": "Shift + enter dla nowej linii. Zacznij od '/' aby wybrać Gotową odpowiedź.", + "PRIVATE_MSG_INPUT": "Shift + wprowadź dla nowej linii. Będzie to widoczne tylko dla agentów" + }, + "REPLYBOX": { + "REPLY": "Odpowiedz", + "PRIVATE_NOTE": "Notatka prywatna", + "SEND": "Wyślij", + "CREATE": "Dodaj notatkę", + "TWEET": "Tweetuj" + }, + "VISIBLE_TO_AGENTS": "Prywatna uwaga: widoczne tylko dla Ciebie i twojego zespołu", + "CHANGE_STATUS": "Status konwersacji zmieniony", + "CHANGE_AGENT": "Osoba przypisana do konwersacji zmieniona" + } +} diff --git a/app/javascript/dashboard/i18n/locale/pl/report.json b/app/javascript/dashboard/i18n/locale/pl/report.json new file mode 100644 index 000000000..980469ac0 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pl/report.json @@ -0,0 +1,49 @@ +{ + "REPORT": { + "HEADER": "Raporty", + "LOADING_CHART": "Ładowanie danych mapy...", + "NO_ENOUGH_DATA": "Nie otrzymaliśmy wystarczającej ilości punktów danych, aby wygenerować raport, spróbuj ponownie później.", + "METRICS": [ + { + "NAME": "Rozmowy", + "KEY": "conversations_count", + "DESC": "( łącznie )" + }, + { + "NAME": "Wiadomości przychodzące", + "KEY": "incoming_messages_count", + "DESC": "( łącznie )" + }, + { + "NAME": "Wiadomości wychodzące", + "KEY": "outgoing_messages_count", + "DESC": "( łącznie )" + }, + { + "NAME": "Czas pierwszej odpowiedzi", + "KEY": "avg_first_response_time", + "DESC": "( Średnie )" + }, + { + "NAME": "Czas rozdzielczości", + "KEY": "avg_resolution_time", + "DESC": "( Średnie )" + }, + { + "NAME": "Licznik rozdzielczości", + "KEY": "resolutions_count", + "DESC": "( łącznie )" + } + ], + "DATE_RANGE": [ + { + "id": 0, + "name": "Ostatnie 7 dni" + }, + { + "id": 1, + "name": "Ostatnie 30 dni" + } + ] + } +} diff --git a/app/javascript/dashboard/i18n/locale/pl/resetPassword.json b/app/javascript/dashboard/i18n/locale/pl/resetPassword.json new file mode 100644 index 000000000..4900c42de --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pl/resetPassword.json @@ -0,0 +1,15 @@ +{ + "RESET_PASSWORD": { + "TITLE": "Resetuj hasło", + "EMAIL": { + "LABEL": "E-mail", + "PLACEHOLDER": "Wprowadź swój adres e-mail", + "ERROR": "Wprowadź poprawny adres e-mail" + }, + "API": { + "SUCCESS_MESSAGE": "Link do resetowania hasła został wysłany na Twój adres e-mail", + "ERROR_MESSAGE": "Nie można połączyć się z Woot Server, spróbuj ponownie później" + }, + "SUBMIT": "Prześlij" + } +} diff --git a/app/javascript/dashboard/i18n/locale/pl/setNewPassword.json b/app/javascript/dashboard/i18n/locale/pl/setNewPassword.json new file mode 100644 index 000000000..e096cee49 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pl/setNewPassword.json @@ -0,0 +1,20 @@ +{ + "SET_NEW_PASSWORD": { + "TITLE": "Ustaw nowe hasło", + "PASSWORD": { + "LABEL": "Hasło", + "PLACEHOLDER": "Hasło", + "ERROR": "Hasło jest zbyt krótkie" + }, + "CONFIRM_PASSWORD": { + "LABEL": "Potwierdź hasło", + "PLACEHOLDER": "Potwierdź hasło", + "ERROR": "Hasła nie pasują" + }, + "API": { + "SUCCESS_MESSAGE": "Pomyślnie zmienione hasło", + "ERROR_MESSAGE": "Nie można połączyć się z Woot Server, spróbuj ponownie później" + }, + "SUBMIT": "Prześlij" + } +} diff --git a/app/javascript/dashboard/i18n/locale/pl/signup.json b/app/javascript/dashboard/i18n/locale/pl/signup.json new file mode 100644 index 000000000..30c6c1b01 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pl/signup.json @@ -0,0 +1,32 @@ +{ + "REGISTER": { + "TRY_WOOT": "Załóż konto", + "TITLE": "Rejestracja", + "TERMS_ACCEPT": "Rejestrując się, akceptujesz naszą T & C i politykę prywatności", + "ACCOUNT_NAME": { + "LABEL": "Nazwa konta", + "PLACEHOLDER": "Przedsiębiorstwa Wayne", + "ERROR": "Nazwa konta jest zbyt krótka" + }, + "EMAIL": { + "LABEL": "E-mail", + "PLACEHOLDER": "Bruce@wayne.przedsiębiorstwa", + "ERROR": "Adres e-mail jest nieprawidłowy" + }, + "PASSWORD": { + "LABEL": "Hasło", + "PLACEHOLDER": "Hasło", + "ERROR": "Hasło jest zbyt krótkie" + }, + "CONFIRM_PASSWORD": { + "LABEL": "Potwierdź hasło", + "PLACEHOLDER": "Potwierdź hasło", + "ERROR": "Hasło nie zgadza się" + }, + "API": { + "SUCCESS_MESSAGE": "Rejestracja powiodła się", + "ERROR_MESSAGE": "Nie można połączyć się z Woot Server, spróbuj ponownie później" + }, + "SUBMIT": "Prześlij" + } +} diff --git a/app/javascript/dashboard/i18n/locale/pl/webhooks.json b/app/javascript/dashboard/i18n/locale/pl/webhooks.json new file mode 100644 index 000000000..1be3e0493 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pl/webhooks.json @@ -0,0 +1,5 @@ +{ + "WEBHOOKS_SETTINGS": { + "HEADER": "Ustawienia webhooka" + } +} diff --git a/app/javascript/dashboard/i18n/locale/pt/agentMgmt.json b/app/javascript/dashboard/i18n/locale/pt/agentMgmt.json new file mode 100644 index 000000000..c6bca88c2 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pt/agentMgmt.json @@ -0,0 +1,101 @@ +{ + "AGENT_MGMT": { + "HEADER": "Agentes", + "HEADER_BTN_TXT": "Adicionar Agente", + "LOADING": "Buscando lista de agente", + "SIDEBAR_TXT": "

Agentes

Um Agente é membro de sua equipe de Suporte ao Cliente.

Os agentes serão capazes de ver e responder as mensagens dos seus usuários. A lista mostra todos os agentes atualmente em sua conta.

Clique em Adicionar Agente para adicionar um novo agente. Agente que você adicionar receberá um e-mail com um link de confirmação para ativar sua conta, após o que eles podem acessar o Chatwoot e responder às mensagens.

Acesso aos recursos do Chatwoot são baseados nas seguintes funções.

Agentes - Agentes com essa função só podem acessar caixas de entrada, relatórios e conversas. Eles podem atribuir conversas a outros agentes ou a eles próprios e resolver conversas.

Administrador - Administrador terá acesso a todos os recursos do Chatwoot ativados para sua conta, incluindo configurações e faturamento, juntamente com todos os privilégios normais dos agentes.

", + "AGENT_TYPES": [ + { + "name": "administrator", + "label": "Administrador" + }, + { + "name": "agent", + "label": "Representante" + } + ], + "LIST": { + "404": "Não há agentes associados a esta conta", + "TITLE": "Gerenciar agentes na sua equipe", + "DESC": "Você pode adicionar/remover agentes para/da sua equipe.", + "NAME": "Nome:", + "EMAIL": "E-mail:", + "STATUS": "SItuação", + "ACTIONS": "Ações.", + "VERIFIED": "Verificada", + "VERIFICATION_PENDING": "Verificação pendente" + }, + "ADD": { + "TITLE": "Adicionar agente à sua equipe", + "DESC": "Você pode adicionar pessoas que serão capazes de lidar com o suporte de suas caixas de entrada.", + "FORM": { + "NAME": { + "LABEL": "Nome do Representante", + "PLACEHOLDER": "Por favor, insira um nome para o agente" + }, + "AGENT_TYPE": { + "LABEL": "Tipo de agente", + "PLACEHOLDER": "Por favor, selecione um tipo", + "ERROR": "O tipo de agente é obrigatório" + }, + "EMAIL": { + "LABEL": "Endereço de e-mail", + "PLACEHOLDER": "Por favor insira um endereço de e-mail do agente" + }, + "SUBMIT": "Adicionar Agente" + }, + "API": { + "SUCCESS_MESSAGE": "Agente adicionado com sucesso", + "EXIST_MESSAGE": "E-mail do representante já está em uso, por favor tente outro endereço de e-mail", + "ERROR_MESSAGE": "Não foi possível conectar ao servidor Woot, por favor tente novamente mais tarde" + } + }, + "DELETE": { + "BUTTON_TEXT": "excluir", + "API": { + "SUCCESS_MESSAGE": "Agente excluído com sucesso", + "ERROR_MESSAGE": "Não foi possível conectar ao servidor Woot, por favor tente novamente mais tarde" + }, + "CONFIRM": { + "TITLE": "Confirmar Exclusão", + "MESSAGE": "Tem certeza que deseja excluir ", + "YES": "Sim, excluir ", + "NO": "Não, mantenha isso " + } + }, + "EDIT": { + "TITLE": "Editar Representante", + "FORM": { + "NAME": { + "LABEL": "Nome do Representante", + "PLACEHOLDER": "Por favor, insira um nome para o agente" + }, + "AGENT_TYPE": { + "LABEL": "Tipo de agente", + "PLACEHOLDER": "Por favor, selecione um tipo", + "ERROR": "O tipo de agente é obrigatório" + }, + "EMAIL": { + "LABEL": "Endereço de e-mail", + "PLACEHOLDER": "Por favor insira um endereço de e-mail do agente" + }, + "SUBMIT": "Editar Agente" + }, + "BUTTON_TEXT": "Alterar", + "CANCEL_BUTTON_TEXT": "cancelar", + "API": { + "SUCCESS_MESSAGE": "Agente atualizado com sucesso", + "ERROR_MESSAGE": "Não foi possível conectar ao servidor Woot, por favor tente novamente mais tarde" + }, + "PASSWORD_RESET": { + "ADMIN_RESET_BUTTON": "Redefinir a senha", + "ADMIN_SUCCESS_MESSAGE": "Um e-mail com instruções de redefinição de senha foi enviado para o agente", + "SUCCESS_MESSAGE": "Senha do agente redefinida com sucesso", + "ERROR_MESSAGE": "Não foi possível conectar ao servidor Woot, por favor tente novamente mais tarde" + } + }, + "SEARCH": { + "NO_RESULTS": "Nenhum agente encontrado." + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/pt/billing.json b/app/javascript/dashboard/i18n/locale/pt/billing.json new file mode 100644 index 000000000..07cc720f6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pt/billing.json @@ -0,0 +1,19 @@ +{ + "BILLING": { + "HEADER": "Faturamento", + "LOADING": "Buscando Assinaturas", + "ACCOUNT_STATE": "Estado do cliente", + "AGENT_COUNT": "Número de Representantes", + "PER_AGENT_COST": "Custo por agente", + "TOTAL_COST": "Custo Total", + "BUTTON": { + "ADD": "Adicionar método de pagamento", + "EDIT": "EDIT Método de Pagamento" + }, + "TRIAL": { + "TITLE": "Seu período de avaliação terminou", + "MESSAGE": "Adicione um método de pagamento para continuar usando o Chatwoot." + }, + "ACCOUNT_LOCKED": "Sua conta não está disponível no momento.
Por favor, entre em contato com o administrador para reativação." + } +} diff --git a/app/javascript/dashboard/i18n/locale/pt/cannedMgmt.json b/app/javascript/dashboard/i18n/locale/pt/cannedMgmt.json new file mode 100644 index 000000000..9474955f2 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pt/cannedMgmt.json @@ -0,0 +1,74 @@ +{ + "CANNED_MGMT": { + "HEADER": "Respostas Prontas", + "HEADER_BTN_TXT": "Adicionar resposta pronta", + "LOADING": "Buscando respostas prontas", + "SEARCH_404": "Não existem itens correspondentes a esta consulta", + "SIDEBAR_TXT": "

Respostas Prontas

Respostas Prontas são templates de resposta salvos, que podem ser usados para enviar rapidamente uma resposta para uma conversa.

Para criar uma Resposta Pronta, clique no Adicionar Resposta Pronta. Você também pode editar ou excluir uma resposta existente clicando no botão Editar ou Excluir

respostas prontas são usadas com a ajuda de Código Curto. Os agentes podem acessar as respostas prontas enquanto estiverem em um chat digitando '/' seguido pelo pequeno código.

", + "LIST": { + "404": "Não há respostas prontas disponíveis nesta conta.", + "TITLE": "Gerenciar respostas prontas", + "DESC": "Respostas prontas são modelos de resposta pré-definidos, que podem ser usadas para enviar respostas rapidamente a tickets.", + "TABLE_HEADER": [ + "Código curto", + "Conteúdo", + "Ações." + ] + }, + "ADD": { + "TITLE": "Adicionar resposta pronta", + "DESC": "Respostas prontas são salvas nos modelos de resposta que podem ser usados para enviar rapidamente uma resposta para a conversa.", + "FORM": { + "SHORT_CODE": { + "LABEL": "Código curto", + "PLACEHOLDER": "Insira o shortcode", + "ERROR": "É necessário um código curto" + }, + "CONTENT": { + "LABEL": "Conteúdo", + "PLACEHOLDER": "Por favor, insira um conteúdo", + "ERROR": "Conteúdo é obrigatório" + }, + "SUBMIT": "submeter" + }, + "API": { + "SUCCESS_MESSAGE": "Resposta pronta adicionada com sucesso", + "ERROR_MESSAGE": "Não foi possível conectar ao servidor Woot, por favor tente novamente mais tarde" + } + }, + "EDIT": { + "TITLE": "Editar resposta pronta", + "FORM": { + "SHORT_CODE": { + "LABEL": "Código curto", + "PLACEHOLDER": "Insira o shortcode", + "ERROR": "É necessário um código curto" + }, + "CONTENT": { + "LABEL": "Conteúdo", + "PLACEHOLDER": "Por favor, insira um conteúdo", + "ERROR": "Conteúdo é obrigatório" + }, + "SUBMIT": "submeter" + }, + "BUTTON_TEXT": "Alterar", + "API": { + "SUCCESS_MESSAGE": "Resposta pronta atualizada com sucesso", + "ERROR_MESSAGE": "Não foi possível conectar ao servidor Woot, por favor tente novamente mais tarde" + } + }, + "DELETE": { + "BUTTON_TEXT": "excluir", + "API": { + "SUCCESS_MESSAGE": "Resposta pronta excluída com sucesso", + "ERROR_MESSAGE": "Não foi possível conectar ao servidor Woot, por favor tente novamente mais tarde" + }, + "CONFIRM": { + "TITLE": "Confirmar Exclusão", + "MESSAGE": "Tem certeza que deseja excluir ", + "YES": "Sim, excluir ", + "NO": "Não, mantenha isso " + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/pt/chatlist.json b/app/javascript/dashboard/i18n/locale/pt/chatlist.json new file mode 100644 index 000000000..c2d125233 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pt/chatlist.json @@ -0,0 +1,77 @@ +{ + "CHAT_LIST": { + "LOADING": "Buscando conversas", + "LOAD_MORE_CONVERSATIONS": "Carregar mais conversas", + "EOF": "Todas as conversas carregadas 🎉", + "LIST": { + "404": "Não há conversas ativas neste grupo." + }, + "TAB_HEADING": "Conversas", + "SEARCH": { + "INPUT": "Pesquisar pessoas, conversas, respostas salvas .." + }, + "STATUS_TABS": [ + { + "NAME": "Abertas", + "KEY": "openCount" + }, + { + "NAME": "Resolvido", + "KEY": "allConvCount" + } + ], + "ASSIGNEE_TYPE_TABS": [ + { + "NAME": "Minerar", + "KEY": "me", + "COUNT_KEY": "mineCount" + }, + { + "NAME": "Não atribuído", + "KEY": "unassigned", + "COUNT_KEY": "unAssignedCount" + }, + { + "NAME": "TODOS", + "KEY": "all", + "COUNT_KEY": "allCount" + } + ], + "CHAT_STATUS_ITEMS": [ + { + "TEXT": "Abertas", + "VALUE": "open" + }, + { + "TEXT": "Resolvido", + "VALUE": "resolved" + } + ], + "ATTACHMENTS": { + "image": { + "ICON": "ion-image", + "CONTENT": "Mensagem de imagem" + }, + "audio": { + "ICON": "ion-volume-high", + "CONTENT": "Mensagem de áudio" + }, + "video": { + "ICON": "ion-ios-videocam", + "CONTENT": "Mensagem de vídeo" + }, + "file": { + "ICON": "ion-document", + "CONTENT": "Arquivo anexo" + }, + "location": { + "ICON": "ion-ios-location", + "CONTENT": "Local:" + }, + "fallback": { + "ICON": "ion-link", + "CONTENT": "compartilhou uma url" + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/pt/contact.json b/app/javascript/dashboard/i18n/locale/pt/contact.json new file mode 100644 index 000000000..8a409682d --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pt/contact.json @@ -0,0 +1,20 @@ +{ + "CONTACT_PANEL": { + "CONVERSATION_TITLE": "Detalhes da conversa", + "BROWSER": "Navegador", + "OS": "Sistema operacional", + "INITIATED_FROM": "Iniciado de", + "INITIATED_AT": "Iniciado em", + "CONVERSATIONS": { + "NO_RECORDS_FOUND": "Não há conversas anteriores associadas a este contato.", + "TITLE": "Conversas anteriores" + }, + "LABELS": { + "TITLE": "Rótulos da conversa", + "UPDATE_BUTTON": "Atualizar Marcadores", + "UPDATE_ERROR": "Não foi possível atualizar os rótulos, tente novamente.", + "TAG_PLACEHOLDER": "Adicionar nova etiqueta", + "PLACEHOLDER": "Pesquisar ou adicionar um rótulo" + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/pt/conversation.json b/app/javascript/dashboard/i18n/locale/pt/conversation.json new file mode 100644 index 000000000..5ef204558 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pt/conversation.json @@ -0,0 +1,35 @@ +{ + "CONVERSATION": { + "404": "Por favor, selecione uma conversa no painel da esquerda", + "NO_MESSAGE_1": "Oh oh! Parece que não há mensagens de clientes na sua caixa de entrada.", + "NO_MESSAGE_2": " para enviar uma mensagem para sua página!", + "NO_INBOX_1": "Hola! Parece que você não adicionou nenhuma caixa de entrada ainda.", + "NO_INBOX_2": " para começar", + "NO_INBOX_AGENT": "Uh Oh! Parece que você não faz parte de nenhuma caixa de entrada. Por favor, contate seu administrador", + "CLICK_HERE": "Clique aqui", + "LOADING_INBOXES": "Carregando caixas de entrada", + "LOADING_CONVERSATIONS": "Carregando conversas", + "DOWNLOAD": "BAIXAR", + "HEADER": { + "RESOLVE_ACTION": "Resolver", + "REOPEN_ACTION": "Reabrir", + "OPEN": "MAIS", + "CLOSE": "FECHAR", + "DETAILS": "Detalhes" + }, + "FOOTER": { + "MSG_INPUT": "Shift + enter para nova linha. Comece com '/' para selecionar uma Resposta Pronta.", + "PRIVATE_MSG_INPUT": "Shift + Enter para a nova linha. Isto será visível apenas para Agentes" + }, + "REPLYBOX": { + "REPLY": "Responder", + "PRIVATE_NOTE": "Nota Privada", + "SEND": "Mandar", + "CREATE": "Adicionar Nota", + "TWEET": "Tuitar" + }, + "VISIBLE_TO_AGENTS": "Nota Privada: Apenas visível para você e sua equipe", + "CHANGE_STATUS": "Estado da conversa alterado", + "CHANGE_AGENT": "Responsável da conversa alterado" + } +} diff --git a/app/javascript/dashboard/i18n/locale/pt/generalSettings.json b/app/javascript/dashboard/i18n/locale/pt/generalSettings.json new file mode 100644 index 000000000..1e986217b --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pt/generalSettings.json @@ -0,0 +1,46 @@ +{ + "GENERAL_SETTINGS": { + "TITLE": "Configurações da conta", + "SUBMIT": "Atualizar configurações", + "UPDATE": { + "ERROR": "Não foi possível atualizar as configurações, tente novamente!", + "SUCCESS": "Configurações de conta atualizadas com sucesso" + }, + "FORM": { + "ERROR": "Por favor, corrigir erros de formulário", + "GENERAL_SECTION": { + "TITLE": "Configurações gerais", + "NOTE": "" + }, + "NAME": { + "LABEL": "Nome da Conta", + "PLACEHOLDER": "Nome da sua conta", + "ERROR": "Por favor, insira um nome de conta válido" + }, + "LANGUAGE": { + "LABEL": "Idioma do site (Beta)", + "PLACEHOLDER": "Nome da sua conta", + "ERROR": "" + }, + "DOMAIN": { + "LABEL": "Domínio", + "PLACEHOLDER": "Domínio do seu site", + "ERROR": "" + }, + "SUPPORT_EMAIL": { + "LABEL": "E-mail de Suporte", + "PLACEHOLDER": "E-mail de suporte da sua empresa", + "ERROR": "" + }, + "ENABLE_DOMAIN_EMAIL": { + "LABEL": "Habilitar e-mail de domínio", + "PLACEHOLDER": "Ativar o e-mail de domínio personalizado", + "ERROR": "", + "OPTIONS": { + "ENABLED": "Ativado", + "DISABLED": "Desabilitado" + } + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json new file mode 100644 index 000000000..acd204b5c --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json @@ -0,0 +1,168 @@ +{ + "INBOX_MGMT": { + "HEADER": "Caixas de Entrada", + "SIDEBAR_TXT": "

Caixa de entrada

Quando você conectar um site ou uma página de Facebook ao Chatwoot, é chamado de caixa de entrada. Você pode ter caixas de entrada ilimitadas na sua conta de Chatwoot.

Clique em Adicionar caixa de entrada para conectar um site ou uma página do Facebook.

No Painel, você pode ver todas as conversas de todas as suas caixas de entrada em um único lugar e responder a elas sob a guia `Conversations`.

Você também pode ver conversas específicas para uma caixa de entrada, clicando no nome da caixa de entrada no painel esquerdo do painel.

", + "LIST": { + "404": "Não há caixas de entrada anexadas a esta conta." + }, + "CREATE_FLOW": [ + { + "title": "Escolher canal", + "route": "settings_inbox_new", + "body": "Escolha o provedor que você deseja integrar com o Chatwoot." + }, + { + "title": "Criar Caixa de Entrada", + "route": "settings_inboxes_page_channel", + "body": "Autenticar sua conta e criar uma caixa de entrada." + }, + { + "title": "Adicionar Agentes", + "route": "settings_inboxes_add_agents", + "body": "Adicionar agentes à caixa de entrada criada." + }, + { + "title": "Voila!", + "route": "settings_inbox_finish", + "body": "Está tudo pronto para começar!" + } + ], + "ADD": { + "FB": { + "HELP": "PS: ao fazer login, só teremos acesso às mensagens da sua página. Suas mensagens privadas nunca poderão ser acessadas pelo Chatwoot." + }, + "TWITTER": { + "HELP": "Para adicionar seu perfil do Twitter como um canal, você precisa autenticar seu perfil do Twitter clicando em 'Entrar com o Twitter' " + }, + "WEBSITE_CHANNEL": { + "TITLE": "Canal do site", + "DESC": "Crie um canal para seu site e comece a oferecer suporte a seus clientes através do nosso widget do site.", + "LOADING_MESSAGE": "Criando canal de suporte ao site", + "CHANNEL_NAME": { + "LABEL": "Nome do site", + "PLACEHOLDER": "Digite o nome do seu site (por exemplo: Acme Inc)" + }, + "CHANNEL_DOMAIN": { + "LABEL": "Domínio do site", + "PLACEHOLDER": "Digite o domínio do seu site (por exemplo: acme.com)" + }, + "CHANNEL_WELCOME_TITLE": { + "LABEL": "Título de Boas-Vindas", + "PLACEHOLDER": "Olá !" + }, + "CHANNEL_WELCOME_TAGLINE": { + "LABEL": "Bem-vindo Slogan", + "PLACEHOLDER": "Nós simplificamos nos conectar com a gente. Pergunte a nós qualquer coisa ou compartilhe seus comentários." + }, + "CHANNEL_AGENT_AWAY_MESSAGE": { + "LABEL": "Mensagem Ausente dos Agentes", + "PLACEHOLDER": "Acme Inc normalmente responde em algumas horas." + }, + "WIDGET_COLOR": { + "LABEL": "Cor do widget", + "PLACEHOLDER": "Atualizar a cor do widget usada no widget" + }, + "SUBMIT_BUTTON": "Criar caixa de entrada" + }, + "TWILIO": { + "TITLE": "Canal SMS Twilio", + "DESC": "Integre o Twilio e comece a apoiar seus clientes via SMS.", + "ACCOUNT_SID": { + "LABEL": "SID da Conta", + "PLACEHOLDER": "Por favor, insira sua Conta Twilio SID", + "ERROR": "Este campo é obrigatório" + }, + "AUTH_TOKEN": { + "LABEL": "Token de autenticação", + "PLACEHOLDER": "Por favor, digite seu Token de Autenticação Twilio", + "ERROR": "Este campo é obrigatório" + }, + "CHANNEL_NAME": { + "LABEL": "Nome do Canal", + "PLACEHOLDER": "Por favor, insira um nome de canal", + "ERROR": "Este campo é obrigatório" + }, + "PHONE_NUMBER": { + "LABEL": "Número de telefone", + "PLACEHOLDER": "Por favor, insira o número de telefone do qual a mensagem será enviada.", + "ERROR": "Por favor, insira um valor válido. O número de telefone deve começar com o sinal `+`." + }, + "SUBMIT_BUTTON": "Criar canal Twilio", + "API": { + "ERROR_MESSAGE": "Não fomos capazes de autenticar as credenciais Twilio, por favor, tente novamente" + } + }, + "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." + }, + "AGENTS": { + "TITLE": "agentes", + "DESC": "Aqui você pode adicionar agentes para gerenciar a sua caixa de entrada recém-criada. Apenas esses agentes selecionados terão acesso à sua caixa de entrada. Agentes que não fazem parte desta caixa de entrada não serão capazes de ver ou responder a mensagens nesta caixa de entrada quando eles acessarem.
PS: como administrador, se precisar de acesso a todas as caixas de entrada, você deve se adicionar como agente em todas as caixas de entrada que você criar." + }, + "DETAILS": { + "TITLE": "Detalhes da Caixa de Entrada", + "DESC": "No menu abaixo, selecione a Página do Facebook que você deseja se conectar ao Chatwoot. Você também pode dar um nome personalizado para sua caixa de entrada para uma melhor identificação." + }, + "FINISH": { + "TITLE": "Acertado Ele!", + "DESC": "Você terminou com sucesso de integrar sua página do Facebook ao Chatwoot. Da próxima vez que um cliente enviar mensagens para sua página, a conversa aparecerá automaticamente na sua caixa de entrada.
Também estamos fornecendo a você um script de widget que você pode facilmente adicionar ao seu site. Uma vez que isto estiver ao vivo no seu site, clientes podem enviar mensagens a partir do seu site sem a ajuda de qualquer ferramenta externa e a conversa aparecerá aqui, no Chatwoot.
Legal, né? Bem, nós certamente tentamos ser :)" + } + }, + "DETAILS": { + "LOADING_FB": "Autenticando você com o Facebook...", + "ERROR_FB_AUTH": "Algo deu errado, por favor, atualize a página...", + "CREATING_CHANNEL": "Criando sua caixa de entrada...", + "TITLE": "Configurar Detalhes da Caixa de Entrada", + "DESC": "" + }, + "AGENTS": { + "BUTTON_TEXT": "Adicionar agentes", + "ADD_AGENTS": "Adicionando agentes à sua caixa de entrada..." + }, + "FINISH": { + "TITLE": "Sua caixa de entrada está pronta!", + "MESSAGE": "Agora, você pode se envolver com seus clientes através do seu novo Canal. Feliz apoio ", + "BUTTON_TEXT": "Me leve lá", + "WEBSITE_SUCCESS": "Você terminou de criar um canal de site. Copie o código mostrado abaixo e cole-o em seu site. Na próxima vez que um cliente usar o chat em tempo real, a conversa aparecerá automaticamente em sua caixa de entrada." + }, + "REAUTH": "Reautorizar", + "VIEW": "Visualizar", + "EDIT": { + "API": { + "SUCCESS_MESSAGE": "Configurações da caixa de entrada atualizadas com sucesso", + "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Atribuição automática atualizada com sucesso", + "ERROR_MESSAGE": "Não foi possível atualizar a cor do widget. Por favor, tente novamente mais tarde." + }, + "AUTO_ASSIGNMENT": { + "ENABLED": "Ativado", + "DISABLED": "Desabilitado" + } + }, + "DELETE": { + "BUTTON_TEXT": "excluir", + "CONFIRM": { + "TITLE": "Confirmar Exclusão", + "MESSAGE": "Tem certeza que deseja excluir ", + "YES": "Sim, excluir ", + "NO": "Não, mantenha isso " + }, + "API": { + "SUCCESS_MESSAGE": "Caixa de entrada excluída com sucesso", + "ERROR_MESSAGE": "Não foi possível excluir a caixa de entrada. Tente novamente mais tarde." + } + }, + "SETTINGS": "Confirgurações", + "SETTINGS_POPUP": { + "MESSENGER_HEADING": "Script do Messenger", + "MESSENGER_SUB_HEAD": "Coloque esse botão dentro da sua tag corporal", + "INBOX_AGENTS": "agentes", + "INBOX_AGENTS_SUB_TEXT": "Adicionar ou remover agentes dessa caixa de entrada", + "UPDATE": "Atualização", + "AUTO_ASSIGNMENT": "Habilitar atribuição automática", + "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/index.js b/app/javascript/dashboard/i18n/locale/pt/index.js new file mode 100644 index 000000000..351906dd9 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pt/index.js @@ -0,0 +1,34 @@ +/* eslint-disable */ +import { default as _agentMgmt } from './agentMgmt.json'; +import { default as _billing } from './billing.json'; +import { default as _cannedMgmt } from './cannedMgmt.json'; +import { default as _chatlist } from './chatlist.json'; +import { default as _contact } from './contact.json'; +import { default as _conversation } from './conversation.json'; +import { default as _inboxMgmt } from './inboxMgmt.json'; +import { default as _login } from './login.json'; +import { default as _report } from './report.json'; +import { default as _resetPassword } from './resetPassword.json'; +import { default as _setNewPassword } from './setNewPassword.json'; +import { default as _settings } from './settings.json'; +import { default as _signup } from './signup.json'; +import { default as _integrations } from './integrations.json'; +import { default as _generalSettings } from './generalSettings.json'; + +export default { + ..._agentMgmt, + ..._billing, + ..._cannedMgmt, + ..._chatlist, + ..._contact, + ..._conversation, + ..._inboxMgmt, + ..._login, + ..._report, + ..._resetPassword, + ..._setNewPassword, + ..._settings, + ..._signup, + ..._integrations, + ..._generalSettings, +}; diff --git a/app/javascript/dashboard/i18n/locale/pt/integrations.json b/app/javascript/dashboard/i18n/locale/pt/integrations.json new file mode 100644 index 000000000..ac62aaaf4 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pt/integrations.json @@ -0,0 +1,54 @@ +{ + "INTEGRATION_SETTINGS": { + "HEADER": "Integrações", + "WEBHOOK": { + "TITLE": "Webhook", + "CONFIGURE": "Configurar", + "HEADER": "Configurações de webhook", + "HEADER_BTN_TXT": "Adicionar novo webhook", + "INTEGRATION_TXT": "Eventos Webhook fornecem informações em tempo real sobre o que está acontecendo em sua conta Chatwoot. Você pode usar os webhooks para comunicar os eventos com seus aplicativos favoritos como Slack ou Github. Clique em Configurar para configurar seus webhooks.", + "LOADING": "Buscando webhooks anexados", + "SEARCH_404": "Não existem itens correspondentes a esta consulta", + "SIDEBAR_TXT": "

Webhooks

Webhooks são chamadas HTTP que podem ser definidas para cada conta. Eles são acionados por eventos como criação de mensagens no Chatwoot. Você pode criar mais de um webhook para esta conta.

Para criar um webhook, clique no botão Adicionar novo webhook . Você também pode remover qualquer webhook existente clicando no botão Excluir.

", + "LIST": { + "404": "Não há webhooks configurados para esta conta.", + "TITLE": "Gerenciar webhooks", + "DESC": "Webhooks são modelos de resposta pré-definidos, que podem ser usados para enviar respostas rapidamente para tickets.", + "TABLE_HEADER": [ + "endpoint do webhook", + "Ações." + ] + }, + "ADD": { + "CANCEL": "cancelar", + "TITLE": "Adicionar novo webhook", + "DESC": "Eventos Webhook fornecem informações em tempo real sobre o que está acontecendo em sua conta Chatwoot. Por favor, insira uma URL válida para configurar uma callback.", + "FORM": { + "END_POINT": { + "LABEL": "URL do Webhook", + "PLACEHOLDER": "Exemplo: https://example/api/webhook", + "ERROR": "Por favor, insira uma URL válida" + }, + "SUBMIT": "Criar webhook" + }, + "API": { + "SUCCESS_MESSAGE": "Webhook adicionado com sucesso", + "ERROR_MESSAGE": "Não foi possível conectar ao servidor Woot, por favor tente novamente mais tarde" + } + }, + "DELETE": { + "BUTTON_TEXT": "excluir", + "API": { + "SUCCESS_MESSAGE": "Webhook excluído com sucesso", + "ERROR_MESSAGE": "Não foi possível conectar ao servidor Woot, por favor tente novamente mais tarde" + }, + "CONFIRM": { + "TITLE": "Confirmar Exclusão", + "MESSAGE": "Tem certeza que deseja excluir ", + "YES": "Sim, excluir ", + "NO": "Não, mantenha isso " + } + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/pt/login.json b/app/javascript/dashboard/i18n/locale/pt/login.json new file mode 100644 index 000000000..efa7136d1 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pt/login.json @@ -0,0 +1,21 @@ +{ + "LOGIN": { + "TITLE": "Entrar no Chatwoot", + "EMAIL": { + "LABEL": "e-mail", + "PLACEHOLDER": "E-mail: alguém@exemplo.com" + }, + "PASSWORD": { + "LABEL": "Palavra-passe", + "PLACEHOLDER": "Palavra-passe" + }, + "API": { + "SUCCESS_MESSAGE": "Login bem sucedido", + "ERROR_MESSAGE": "Não foi possível conectar ao servidor Woot, por favor tente novamente mais tarde", + "UNAUTH": "Nome de usuário / senha incorreta. Por favor, tente novamente" + }, + "FORGOT_PASSWORD": "Esqueceu-se da sua senha?", + "CREATE_NEW_ACCOUNT": "Criar nova conta", + "SUBMIT": "Iniciar sessão" + } +} diff --git a/app/javascript/dashboard/i18n/locale/pt/report.json b/app/javascript/dashboard/i18n/locale/pt/report.json new file mode 100644 index 000000000..d1ac4036d --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pt/report.json @@ -0,0 +1,49 @@ +{ + "REPORT": { + "HEADER": "relatórios", + "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.", + "METRICS": [ + { + "NAME": "Conversas", + "KEY": "conversations_count", + "DESC": "( Total )" + }, + { + "NAME": "Mensagens de entrada", + "KEY": "incoming_messages_count", + "DESC": "( Total )" + }, + { + "NAME": "Mensagens de saída", + "KEY": "outgoing_messages_count", + "DESC": "( Total )" + }, + { + "NAME": "Primeiro tempo de resposta", + "KEY": "avg_first_response_time", + "DESC": "(Méd. )" + }, + { + "NAME": "Tempo de resolução", + "KEY": "avg_resolution_time", + "DESC": "(Méd. )" + }, + { + "NAME": "Contagem de resolução", + "KEY": "resolutions_count", + "DESC": "( Total )" + } + ], + "DATE_RANGE": [ + { + "id": 0, + "name": "Últimos 7 Dias" + }, + { + "id": 1, + "name": "Últimos 30 Dias" + } + ] + } +} diff --git a/app/javascript/dashboard/i18n/locale/pt/resetPassword.json b/app/javascript/dashboard/i18n/locale/pt/resetPassword.json new file mode 100644 index 000000000..66668f5a6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pt/resetPassword.json @@ -0,0 +1,15 @@ +{ + "RESET_PASSWORD": { + "TITLE": "Redefinir a senha", + "EMAIL": { + "LABEL": "e-mail", + "PLACEHOLDER": "Por favor, digite seu e-mail", + "ERROR": "Por favor, digite um e-mail válido" + }, + "API": { + "SUCCESS_MESSAGE": "Link para redefinir a senha foi enviado para seu e-mail", + "ERROR_MESSAGE": "Não foi possível conectar ao servidor Woot, por favor tente novamente mais tarde" + }, + "SUBMIT": "submeter" + } +} diff --git a/app/javascript/dashboard/i18n/locale/pt/setNewPassword.json b/app/javascript/dashboard/i18n/locale/pt/setNewPassword.json new file mode 100644 index 000000000..19dab2f47 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pt/setNewPassword.json @@ -0,0 +1,20 @@ +{ + "SET_NEW_PASSWORD": { + "TITLE": "Definir nova senha", + "PASSWORD": { + "LABEL": "Palavra-passe", + "PLACEHOLDER": "Palavra-passe", + "ERROR": "A senha é muito curta" + }, + "CONFIRM_PASSWORD": { + "LABEL": "Confirmar senha", + "PLACEHOLDER": "Confirmar senha", + "ERROR": "As senhas não coincidem" + }, + "API": { + "SUCCESS_MESSAGE": "Senha alterada com sucesso", + "ERROR_MESSAGE": "Não foi possível conectar ao servidor Woot, por favor tente novamente mais tarde" + }, + "SUBMIT": "submeter" + } +} diff --git a/app/javascript/dashboard/i18n/locale/pt/settings.json b/app/javascript/dashboard/i18n/locale/pt/settings.json new file mode 100644 index 000000000..2d1c5d4d5 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pt/settings.json @@ -0,0 +1,74 @@ +{ + "PROFILE_SETTINGS": { + "LINK": "Configurações do perfil", + "TITLE": "Configurações do perfil", + "BTN_TEXT": "Atualizar o perfil", + "AFTER_EMAIL_CHANGED": "Seu perfil foi atualizado com sucesso, faça o login novamente pois suas credenciais foram alteradas", + "FORM": { + "AVATAR": "Imagem do perfil", + "ERROR": "Por favor, corrigir erros de formulário", + "REMOVE_IMAGE": "Excluir", + "UPLOAD_IMAGE": "Upload de imagem", + "UPDATE_IMAGE": "Atualizar imagem", + "PROFILE_SECTION": { + "TITLE": "Perfil", + "NOTE": "Seu endereço de e-mail é sua identidade e é usado para entrar." + }, + "PASSWORD_SECTION": { + "TITLE": "Palavra-passe", + "NOTE": "Atualizar sua senha irá redefinir seus logins em vários dispositivos." + }, + "ACCESS_TOKEN": { + "TITLE": "Token de acesso", + "NOTE": "Este token pode ser usado se você estiver construindo uma integração baseada em API" + }, + "EMAIL_NOTIFICATIONS_SECTION": { + "TITLE": "Notificações por e-mail", + "NOTE": "Atualize suas preferências de notificação por e-mail aqui", + "CONVERSATION_ASSIGNMENT": "Enviar notificações por email quando uma conversa é atribuída a mim", + "CONVERSATION_CREATION": "Enviar notificações por email quando uma nova conversa é criada", + "UPDATE_SUCCESS": "Suas preferências de notificação de e-mail foram atualizadas com sucesso", + "UPDATE_ERROR": "Ocorreu um erro ao atualizar as preferências, por favor, tente novamente" + }, + "PROFILE_IMAGE": { + "LABEL": "Imagem do perfil" + }, + "NAME": { + "LABEL": "Seu Nome", + "ERROR": "Por favor, insira um nome válido", + "PLACEHOLDER": "Por favor, insira seu nome, isto seria exibido em conversas" + }, + "EMAIL": { + "LABEL": "Seu endereço de e-mail", + "ERROR": "Por favor, insira um endereço de e-mail válido", + "PLACEHOLDER": "Por favor, insira seu endereço de e-mail, que será exibido em conversas" + }, + "PASSWORD": { + "LABEL": "Palavra-passe", + "ERROR": "Por favor, digite uma senha de comprimento 6 ou mais", + "PLACEHOLDER": "Por favor, digite uma nova senha" + }, + "PASSWORD_CONFIRMATION": { + "LABEL": "Confirme a nova senha", + "ERROR": "Confirme a senha deve corresponder à senha", + "PLACEHOLDER": "Por favor, digite sua senha novamente" + } + } + }, + "SIDEBAR_ITEMS": { + "PROFILE_SETTINGS": "Configurações do perfil", + "LOGOUT": "Desconectar" + }, + "SIDEBAR": { + "CONVERSATIONS": "Conversas", + "REPORTS": "Relatórios", + "SETTINGS": "Definições", + "HOME": "Casa", + "AGENTS": "Agentes", + "INBOXES": "Caixas de entrada", + "CANNED_RESPONSES": "Respostas Enlatadas", + "BILLING": "Faturamento", + "INTEGRATIONS": "Integrações", + "ACCOUNT_SETTINGS": "Configurações da conta" + } +} diff --git a/app/javascript/dashboard/i18n/locale/pt/signup.json b/app/javascript/dashboard/i18n/locale/pt/signup.json new file mode 100644 index 000000000..0a47f0f49 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pt/signup.json @@ -0,0 +1,32 @@ +{ + "REGISTER": { + "TRY_WOOT": "Registrar uma conta", + "TITLE": "Cadastrar", + "TERMS_ACCEPT": "Ao se inscrever, você concorda com nossa T & C e Política de privacidade", + "ACCOUNT_NAME": { + "LABEL": "Nome da Conta", + "PLACEHOLDER": "Wayne Enterprises", + "ERROR": "O nome da conta é muito curto" + }, + "EMAIL": { + "LABEL": "e-mail", + "PLACEHOLDER": "bruce@wayne.business", + "ERROR": "E-mail inválido" + }, + "PASSWORD": { + "LABEL": "Palavra-passe", + "PLACEHOLDER": "Palavra-passe", + "ERROR": "A senha é muito curta" + }, + "CONFIRM_PASSWORD": { + "LABEL": "Confirmar senha", + "PLACEHOLDER": "Confirmar senha", + "ERROR": "As senhas não conferem" + }, + "API": { + "SUCCESS_MESSAGE": "Registro Bem Sucedido", + "ERROR_MESSAGE": "Não foi possível conectar ao servidor Woot, por favor tente novamente mais tarde" + }, + "SUBMIT": "submeter" + } +} diff --git a/app/javascript/dashboard/i18n/locale/pt/webhooks.json b/app/javascript/dashboard/i18n/locale/pt/webhooks.json new file mode 100644 index 000000000..ae9c708e9 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pt/webhooks.json @@ -0,0 +1,5 @@ +{ + "WEBHOOKS_SETTINGS": { + "HEADER": "Configurações do Webhook" + } +} diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/agentMgmt.json b/app/javascript/dashboard/i18n/locale/pt_BR/agentMgmt.json new file mode 100644 index 000000000..8c127d7bc --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pt_BR/agentMgmt.json @@ -0,0 +1,101 @@ +{ + "AGENT_MGMT": { + "HEADER": "Agentes", + "HEADER_BTN_TXT": "Adicionar Agente", + "LOADING": "Buscando lista de agente", + "SIDEBAR_TXT": "

Um Agente é um membro da equipe de Suporte ao Cliente.

Os agentes poderão visualizar e responder às mensagens dos seus usuários. A lista mostra todos os agentes de sua conta.

Clique em Adicionar agente para adicionar um novo agente. O agente que você adicionar receberá um e-mail com um link de confirmação ativar a conta, e após clicar no link de ativação o Agente poderá acessar o Chatwoot.

O acesso aos recursos do Chatwoot é baseado nos seguintes perfis:

Agente - função que pode acessar apenas caixas de entrada, relatórios e conversas. Eles podem atribuir conversas a outros agentes ou a eles próprios e resolver conversas.

Administrador - essa função terá acesso a todos os recursos do Chatwoot ativados para sua conta, incluindo configurações e cobrança, além de todos os dos privilégios de um agente normal.

", + "AGENT_TYPES": [ + { + "name": "administrador", + "label": "Administrador" + }, + { + "name": "agente", + "label": "Agente" + } + ], + "LIST": { + "404": "Não existem agentes associados a esta conta", + "TITLE": "Gerenciar agentes da sua equipe", + "DESC": "Você pode adicionar e/ou remover agentes de um time.", + "NAME": "Nome", + "EMAIL": "E-mail", + "STATUS": "SItuação", + "ACTIONS": "Ações", + "VERIFIED": "Verificado", + "VERIFICATION_PENDING": "Verificação Pendente" + }, + "ADD": { + "TITLE": "Adicionar agente ao seu time", + "DESC": "Você pode adicionar pessoas que poderão acompanhar o suporte de suas caixas de entrada.", + "FORM": { + "NAME": { + "LABEL": "Nome do Agente", + "PLACEHOLDER": "Por favor, insira o nome do agente" + }, + "AGENT_TYPE": { + "LABEL": "Tipo de Agente", + "PLACEHOLDER": "Selecione um tipo", + "ERROR": "É necessário o tipo de agente" + }, + "EMAIL": { + "LABEL": "Endereço de e-mail", + "PLACEHOLDER": "Por favor, insira um endereço de e-mail do agente" + }, + "SUBMIT": "Adicionar agente" + }, + "API": { + "SUCCESS_MESSAGE": "Agente adicionado com sucesso", + "EXIST_MESSAGE": "O E-mail do informado já está uso, por favor tente outro endereço de e-mail", + "ERROR_MESSAGE": "Não foi possível conectar ao servidor Woot, por favor tente novamente mais tarde" + } + }, + "DELETE": { + "BUTTON_TEXT": "Excluir", + "API": { + "SUCCESS_MESSAGE": "Agente excluído com sucesso", + "ERROR_MESSAGE": "Não foi possível conectar ao servidor Woot, por favor tente novamente mais tarde" + }, + "CONFIRM": { + "TITLE": "Confirmar exclusão", + "MESSAGE": "Você tem certeza que deseja excluir ", + "YES": "Sim, excluir ", + "NO": "Não, mantenha " + } + }, + "EDIT": { + "TITLE": "Editar Agente", + "FORM": { + "NAME": { + "LABEL": "Nome do Agente", + "PLACEHOLDER": "Por favor, insira um nome do agente" + }, + "AGENT_TYPE": { + "LABEL": "Tipo de Agente", + "PLACEHOLDER": "Selecione um tipo", + "ERROR": "É necessário o tipo de agente" + }, + "EMAIL": { + "LABEL": "Endereço de email", + "PLACEHOLDER": "Por favor, insira um endereço de e-mail do agente" + }, + "SUBMIT": "Editar agente" + }, + "BUTTON_TEXT": "Alterar", + "CANCEL_BUTTON_TEXT": "Cancelar", + "API": { + "SUCCESS_MESSAGE": "Agente atualizado com sucesso", + "ERROR_MESSAGE": "Não foi possível conectar ao servidor Woot, por favor tente novamente mais tarde" + }, + "PASSWORD_RESET": { + "ADMIN_RESET_BUTTON": "Redefinir a senha", + "ADMIN_SUCCESS_MESSAGE": "Um e-mail com instruções de redefinição de senha foi enviado para o agente", + "SUCCESS_MESSAGE": "Senha do agente redefinida com sucesso", + "ERROR_MESSAGE": "Não foi possível conectar ao servidor Woot, por favor tente novamente mais tarde" + } + }, + "SEARCH": { + "NO_RESULTS": "Nenhum agente encontrado." + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/billing.json b/app/javascript/dashboard/i18n/locale/pt_BR/billing.json new file mode 100644 index 000000000..2c7d5f390 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pt_BR/billing.json @@ -0,0 +1,19 @@ +{ + "BILLING": { + "HEADER": "Faturamento", + "LOADING": "Buscando Assinaturas", + "ACCOUNT_STATE": "Estado do cliente", + "AGENT_COUNT": "Número de Agente", + "PER_AGENT_COST": "Custo por agente", + "TOTAL_COST": "Custo Total", + "BUTTON": { + "ADD": "Adicionar Forma de Pagamento", + "EDIT": "Editar Forma de Pagamento" + }, + "TRIAL": { + "TITLE": "Seu período de avaliação terminou", + "MESSAGE": "Adicione um método de pagamento para continuar usando o Chatwoot." + }, + "ACCOUNT_LOCKED": "Sua conta não está disponível no momento.
Por favor, entre em contato com o administrador para reativação." + } +} diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/cannedMgmt.json b/app/javascript/dashboard/i18n/locale/pt_BR/cannedMgmt.json new file mode 100644 index 000000000..fa02c9860 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pt_BR/cannedMgmt.json @@ -0,0 +1,74 @@ +{ + "CANNED_MGMT": { + "HEADER": "Atalhos", + "HEADER_BTN_TXT": "Adicionar Atalho", + "LOADING": "Buscando Atalhos", + "SEARCH_404": "Não existem itens correspondentes a esta consulta", + "SIDEBAR_TXT": "

Atalho

são modelos de resposta pré-configuradas que poderão ser utilizadas ​​para enviar rapidamente uma resposta em uma conversa.

Para criar um Atalho, basta clicar em Adicionar Atalho . Você também pode editar ou excluir um Atalho, clicando no botão Editar ou Excluir.

Os atalhos são usadas com a ajuda de um código . Durante a conversa, os agentes podem acessar a lista dos atalhos digitando '/' .

", + "LIST": { + "404": "Não há atalhos disponíveis nesta conta.", + "TITLE": "Gerenciar Atalhos", + "DESC": "Atalhos são modelos de resposta que podem ser usados ​​para enviar rapidamente respostas à conversa.", + "TABLE_HEADER": [ + "Código curto", + "Conteúdo", + "Ações" + ] + }, + "ADD": { + "TITLE": "Adicionar Atalho", + "DESC": "Atalhos são modelos de resposta que podem ser usados ​​para enviar rapidamente respostas à conversa.", + "FORM": { + "SHORT_CODE": { + "LABEL": "Código curto", + "PLACEHOLDER": "Insira o código", + "ERROR": "É necessário um código" + }, + "CONTENT": { + "LABEL": "Conteúdo", + "PLACEHOLDER": "Por favor, insira um conteúdo", + "ERROR": "Favor informe o conteúdo" + }, + "SUBMIT": "Enviar" + }, + "API": { + "SUCCESS_MESSAGE": "Atalho adicionado com sucesso", + "ERROR_MESSAGE": "Não foi possível conectar ao servidor Woot, por favor tente novamente mais tarde" + } + }, + "EDIT": { + "TITLE": "Editar Atalho", + "FORM": { + "SHORT_CODE": { + "LABEL": "Código curto", + "PLACEHOLDER": "Por favor, insira um código", + "ERROR": "É necessário um código" + }, + "CONTENT": { + "LABEL": "Conteúdo", + "PLACEHOLDER": "Por favor, insira um conteúdo", + "ERROR": "Favor informe o conteúdo" + }, + "SUBMIT": "Enviar" + }, + "BUTTON_TEXT": "Alterar", + "API": { + "SUCCESS_MESSAGE": "Atalho atualizado com sucesso", + "ERROR_MESSAGE": "Não foi possível conectar ao servidor Woot, por favor tente novamente mais tarde" + } + }, + "DELETE": { + "BUTTON_TEXT": "Excluir", + "API": { + "SUCCESS_MESSAGE": "Atalho excluído com sucesso", + "ERROR_MESSAGE": "Não foi possível conectar ao servidor Woot, por favor tente novamente mais tarde" + }, + "CONFIRM": { + "TITLE": "Confirmar exclusão", + "MESSAGE": "Você tem certeza que deseja excluir ", + "YES": "Sim, excluir ", + "NO": "Não, mantenha " + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/chatlist.json b/app/javascript/dashboard/i18n/locale/pt_BR/chatlist.json new file mode 100644 index 000000000..8db7de8f3 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pt_BR/chatlist.json @@ -0,0 +1,77 @@ +{ + "CHAT_LIST": { + "LOADING": "Buscando conversas", + "LOAD_MORE_CONVERSATIONS": "Carregar mais conversas", + "EOF": "Todas as conversas carregadas 🎉", + "LIST": { + "404": "Não há conversas ativas neste grupo." + }, + "TAB_HEADING": "Conversas", + "SEARCH": { + "INPUT": "Pesquisar pessoas, conversas, respostas salvas .." + }, + "STATUS_TABS": [ + { + "NAME": "Abertas", + "KEY": "openCount" + }, + { + "NAME": "Resolvida", + "KEY": "allConvCount" + } + ], + "ASSIGNEE_TYPE_TABS": [ + { + "NAME": "Minha", + "KEY": "me", + "COUNT_KEY": "mineCount" + }, + { + "NAME": "Não atribuída", + "KEY": "unassigned", + "COUNT_KEY": "unAssignedCount" + }, + { + "NAME": "Todos", + "KEY": "all", + "COUNT_KEY": "allCount" + } + ], + "CHAT_STATUS_ITEMS": [ + { + "TEXT": "Abertas", + "VALUE": "open" + }, + { + "TEXT": "Resolvidas", + "VALUE": "resolved" + } + ], + "ATTACHMENTS": { + "image": { + "ICON": "ion-image", + "CONTENT": "Mensagem de imagem" + }, + "audio": { + "ICON": "ion-volume-high", + "CONTENT": "Mensagem de áudio" + }, + "video": { + "ICON": "ion-ios-videocam", + "CONTENT": "Mensagem de vídeo" + }, + "file": { + "ICON": "ion-document", + "CONTENT": "Arquivo anexo" + }, + "location": { + "ICON": "ion-ios-location", + "CONTENT": "Localização" + }, + "fallback": { + "ICON": "ion-link", + "CONTENT": "compartilhou uma URL" + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/contact.json b/app/javascript/dashboard/i18n/locale/pt_BR/contact.json new file mode 100644 index 000000000..67c2e7412 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pt_BR/contact.json @@ -0,0 +1,20 @@ +{ + "CONTACT_PANEL": { + "CONVERSATION_TITLE": "Detalhes da conversa", + "BROWSER": "Navegador", + "OS": "Sistema Operacional", + "INITIATED_FROM": "A partir de", + "INITIATED_AT": "Iniciado em", + "CONVERSATIONS": { + "NO_RECORDS_FOUND": "Não há conversas anteriores associadas a este contato.", + "TITLE": "Conversas anteriores" + }, + "LABELS": { + "TITLE": "Marcador da conversa", + "UPDATE_BUTTON": "Atualizar Marcadores", + "UPDATE_ERROR": "Não foi possível atualizar os marcadores, tente novamente.", + "TAG_PLACEHOLDER": "Adicionar novo marcador", + "PLACEHOLDER": "Pesquisar ou adicionar" + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/conversation.json b/app/javascript/dashboard/i18n/locale/pt_BR/conversation.json new file mode 100644 index 000000000..05d63059c --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pt_BR/conversation.json @@ -0,0 +1,35 @@ +{ + "CONVERSATION": { + "404": "Por favor, selecione uma conversa no painel da esquerda", + "NO_MESSAGE_1": "Oh oh! Parece que não há mensagens de clientes na sua caixa de entrada.", + "NO_MESSAGE_2": " para enviar uma mensagem para sua página!", + "NO_INBOX_1": "Hola! Parece que você não adicionou nenhuma caixa de entrada ainda.", + "NO_INBOX_2": " para começar", + "NO_INBOX_AGENT": "Uh Oh! Parece que você não faz parte de nenhuma caixa de entrada. Por favor, contate seu administrador", + "CLICK_HERE": "Clique aqui", + "LOADING_INBOXES": "Carregando caixas de entrada", + "LOADING_CONVERSATIONS": "Carregando conversas", + "DOWNLOAD": "Baixar", + "HEADER": { + "RESOLVE_ACTION": "Resolver", + "REOPEN_ACTION": "Reabrir", + "OPEN": "Mais", + "CLOSE": "Fechar", + "DETAILS": "detalhes" + }, + "FOOTER": { + "MSG_INPUT": "Shift + enter para nova linha. Digite '/' para atalhos.", + "PRIVATE_MSG_INPUT": "A mensagem será visível apenas para agentes" + }, + "REPLYBOX": { + "REPLY": "Responder", + "PRIVATE_NOTE": "Mensagem Privada", + "SEND": "Enviar", + "CREATE": "Enviar", + "TWEET": "Tweet" + }, + "VISIBLE_TO_AGENTS": "Mensagem Privada: Apenas visível para você e sua equipe", + "CHANGE_STATUS": "Estado da conversa mudou", + "CHANGE_AGENT": "Responsável da conversa alterado" + } +} diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/generalSettings.json b/app/javascript/dashboard/i18n/locale/pt_BR/generalSettings.json new file mode 100644 index 000000000..8d52aa666 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pt_BR/generalSettings.json @@ -0,0 +1,46 @@ +{ + "GENERAL_SETTINGS": { + "TITLE": "Configurações da conta", + "SUBMIT": "Atualizar configurações", + "UPDATE": { + "ERROR": "Não foi possível atualizar as configurações, tente novamente!", + "SUCCESS": "Configurações de conta atualizadas com sucesso" + }, + "FORM": { + "ERROR": "Por favor, corrigir erros de formulário", + "GENERAL_SECTION": { + "TITLE": "Configurações gerais", + "NOTE": "" + }, + "NAME": { + "LABEL": "Nome da Conta", + "PLACEHOLDER": "Nome da sua conta", + "ERROR": "Por favor, insira um nome de conta válido" + }, + "LANGUAGE": { + "LABEL": "Idioma do site (Beta)", + "PLACEHOLDER": "Nome da sua conta", + "ERROR": "" + }, + "DOMAIN": { + "LABEL": "Domínio", + "PLACEHOLDER": "Domínio do seu website", + "ERROR": "" + }, + "SUPPORT_EMAIL": { + "LABEL": "E-mail de Suporte", + "PLACEHOLDER": "E-mail de suporte da sua empresa", + "ERROR": "" + }, + "ENABLE_DOMAIN_EMAIL": { + "LABEL": "Ativar domínio de e-mail", + "PLACEHOLDER": "Ativar domínio de e-mail personalizado", + "ERROR": "", + "OPTIONS": { + "ENABLED": "Ativado", + "DISABLED": "Desativado" + } + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json new file mode 100644 index 000000000..8320edde7 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json @@ -0,0 +1,176 @@ +{ + "INBOX_MGMT": { + "HEADER": "Caixas de Entrada", + "SIDEBAR_TXT": "

Caixa de entrada

Quando você conecta um site ou uma página do Facebook ao Chatwoot, isso é denominado como Caixa de entrada . Você pode ter caixas de entrada ilimitadas na sua conta do Chatwoot.

Clique em Adicionar caixa de entrada para conectar um site ou uma página do Facebook.

No Painel , você pode ver todas as conversas de todas as suas caixas de entrada em um único local e responder a elas na guia Conversas.

Você também pode ver conversas específicas para uma caixa de entrada clicando no nome da caixa de entrada no painel esquerdo do painel.

", + "LIST": { + "404": "Não há caixas de entrada anexadas a esta conta." + }, + "CREATE_FLOW": [ + { + "title": "Escolha o canal", + "route": "settings_inbox_new", + "body": "Escolha o provedor que você deseja integrar com o Chatwoot." + }, + { + "title": "Criar Caixa de Entrada", + "route": "settings_inboxes_page_channel", + "body": "Autenticar sua conta e criar uma caixa de entrada." + }, + { + "title": "Adicionar Agentes", + "route": "settings_inboxes_add_agents", + "body": "Adicionar agentes à caixa de entrada criada." + }, + { + "title": "Voila!", + "route": "settings_inbox_finish", + "body": "Está tudo pronto para começar!" + } + ], + "ADD": { + "FB": { + "HELP": "Obs: ao fazer login, apenas temos acesso às mensagens da sua página. Suas mensagens privadas nunca podem ser acessadas pelo Chatwoot." + }, + "TWITTER": { + "HELP": "Para adicionar seu perfil do Twitter como um canal, você precisa autenticar seu perfil do Twitter clicando em 'Entrar com o Twitter' " + }, + "WEBSITE_CHANNEL": { + "TITLE": "Canal do website", + "DESC": "Crie um canal para seu site e comece a oferecer suporte a seus clientes através do nosso widget do site.", + "LOADING_MESSAGE": "Criando canal de suporte ao site", + "CHANNEL_NAME": { + "LABEL": "Nome do website", + "PLACEHOLDER": "Informe o nome do seu site (por exemplo: Acme Inc)" + }, + "CHANNEL_DOMAIN": { + "LABEL": "Domínio do website", + "PLACEHOLDER": "Informe o domínio do seu site (por exemplo: acme.com)" + }, + "CHANNEL_WELCOME_TITLE": { + "LABEL": "Seja bem-vindo", + "PLACEHOLDER": "Olá !" + }, + "CHANNEL_WELCOME_TAGLINE": { + "LABEL": "Bem-vindo, saudação", + "PLACEHOLDER": "Nós tornamos simples a conexão conosco. Pergunte qualquer assunto ou compartilhe seus comentários." + }, + "CHANNEL_AGENT_AWAY_MESSAGE": { + "LABEL": "Mensagem de agente ausente", + "PLACEHOLDER": "Acme Inc tipicamente retorna em algumas horas." + }, + "WIDGET_COLOR": { + "LABEL": "Cor do Widget", + "PLACEHOLDER": "Atualize a cor do widget" + }, + "SUBMIT_BUTTON": "Criar caixa de entrada" + }, + "TWILIO": { + "TITLE": "Canal SMS/Whatsapp do Twilio", + "DESC": "Integre o Twilio e comece a oferecer suporte a seus clientes por SMS e Whatsapp.", + "ACCOUNT_SID": { + "LABEL": "SID da Conta", + "PLACEHOLDER": "Por favor, insira o SID sua conta no Twilio", + "ERROR": "Este campo é obrigatório" + }, + "CHANNEL_TYPE": { + "LABEL": "Tipo de canal", + "ERROR": "Por favor, selecione seu tipo de canal" + }, + "AUTH_TOKEN": { + "LABEL": "Token de autenticação", + "PLACEHOLDER": "Por favor, digite seu Token de Autenticação do Twilio", + "ERROR": "Este campo é obrigatório" + }, + "CHANNEL_NAME": { + "LABEL": "Nome do Canal", + "PLACEHOLDER": "Por favor, insira um nome de canal", + "ERROR": "Este campo é obrigatório" + }, + "PHONE_NUMBER": { + "LABEL": "Número de telefone", + "PLACEHOLDER": "Por favor, insira o número de telefone do qual a mensagem será enviada.", + "ERROR": "Por favor, insira um valor válido. O número de telefone deve começar com o sinal `+`." + }, + "API_CALLBACK": { + "TITLE": "URL de retorno", + "SUBTITLE": "Você precisa configurar o URL de retorno de mensagem no Twilio com a URL mencionada aqui." + }, + "SUBMIT_BUTTON": "Criar canal Twilio", + "API": { + "ERROR_MESSAGE": "Não fomos capazes de autenticar as credenciais Twilio, por favor, tente novamente" + } + }, + "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." + }, + "AGENTS": { + "TITLE": "Agentes", + "DESC": "Aqui você pode adicionar agentes para gerenciar sua caixa de entrada recém-criada. Somente esses agentes selecionados terão acesso à sua caixa de entrada. Os agentes que não fazem parte desta caixa de entrada não poderão ver ou responder a mensagens nessa caixa de entrada quando fizerem login.
PS: Como administrador, se você precisar acessar todas as caixas de entrada, adicione-se como agente a todas as caixas de entrada criadas." + }, + "DETAILS": { + "TITLE": "Detalhes da Caixa de Entrada", + "DESC": "No menu abaixo, selecione a Página do Facebook que você deseja se conectar ao Chatwoot. Você também pode dar um nome personalizado para sua caixa de entrada para uma melhor identificação." + }, + "FINISH": { + "TITLE": "Tudo funcionando. Deu certo!", + "DESC": "Você concluiu a integração da sua página do Facebook com o Chatwoot. Na próxima vez que um cliente enviar uma mensagem para sua página, a conversa aparecerá automaticamente na sua caixa de entrada.
Também estamos fornecendo um script de widget que você pode adicionar facilmente ao seu site. Assim que estiver disponível no seu site, os clientes poderão enviar mensagens diretamente do seu site, sem a ajuda de nenhuma ferramenta externa, e a conversa aparecerá aqui, no Chatwoot. Legal, hein? Com certeza estamos tentamos ser :)" + } + }, + "DETAILS": { + "LOADING_FB": "Autenticando você com o Facebook...", + "ERROR_FB_AUTH": "Algo deu errado, por favor, atualize a página...", + "CREATING_CHANNEL": "Criando sua caixa de entrada...", + "TITLE": "Configurar detalhes da Caixa de Entrada", + "DESC": "" + }, + "AGENTS": { + "BUTTON_TEXT": "Adicionar agentes", + "ADD_AGENTS": "Adicionando agentes à sua caixa de entrada..." + }, + "FINISH": { + "TITLE": "Sua caixa de entrada está pronta!", + "MESSAGE": "Agora você ja pode oferecer uma excelente experiência no atendimento de seus clientes através do seu novo Canal ", + "BUTTON_TEXT": "Leva-me lá", + "WEBSITE_SUCCESS": "Você concluiu a criação de um canal de site. Copie o código mostrado abaixo e cole-o no seu site. Na próxima vez que um cliente usar o bate-papo ao vivo, a conversa aparecerá automaticamente na sua caixa de entrada." + }, + "REAUTH": "Reautorizar", + "VIEW": "Visualizar", + "EDIT": { + "API": { + "SUCCESS_MESSAGE": "Configurações de caixa de entrada atualizadas com sucesso", + "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Agente atualizado com sucesso", + "ERROR_MESSAGE": "Não foi possível atualizar a cor do widget. Por favor, tente novamente mais tarde." + }, + "AUTO_ASSIGNMENT": { + "ENABLED": "Ativado", + "DISABLED": "Desativado" + } + }, + "DELETE": { + "BUTTON_TEXT": "Excluir", + "CONFIRM": { + "TITLE": "Confirmar exclusão", + "MESSAGE": "Você tem certeza que deseja excluir ", + "YES": "Sim, excluir ", + "NO": "Não, mantenha " + }, + "API": { + "SUCCESS_MESSAGE": "Agente excluído com sucesso", + "ERROR_MESSAGE": "Não foi possível excluir a caixa de entrada. Tente novamente mais tarde." + } + }, + "SETTINGS": "Confirgurações", + "SETTINGS_POPUP": { + "MESSENGER_HEADING": "Código Menssageiro ", + "MESSENGER_SUB_HEAD": "Favor, insira essse código diff --git a/app/javascript/dashboard/routes/dashboard/settings/inbox/Settings.vue b/app/javascript/dashboard/routes/dashboard/settings/inbox/Settings.vue index 5f3ad7937..990c19a01 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/inbox/Settings.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/inbox/Settings.vue @@ -4,79 +4,189 @@ :header-image="inbox.avatarUrl" :header-title="inboxName" /> + +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+ +
+ +
+
+
+ +
+ + + +
+
+ + + +
+ + + + + + +
+ +
+ + + +
+
- - - + +
- - - + +
-
- - - -
-
-
- - - -
-
- - -
@@ -88,12 +198,12 @@ import { mapGetters } from 'vuex'; import { createMessengerScript } from 'dashboard/helper/scriptGenerator'; import { Compact } from 'vue-color'; import configMixin from 'shared/mixins/configMixin'; -import SettingsFormHeader from '../../../../components/SettingsFormHeader.vue'; +import SettingsSection from '../../../../components/SettingsSection'; export default { components: { Compact, - SettingsFormHeader, + SettingsSection, }, mixins: [configMixin], data() { @@ -102,6 +212,10 @@ export default { autoAssignment: false, isUpdating: false, isAgentListUpdating: false, + channelWebsiteUrl: '', + channelWelcomeTitle: '', + channelWelcomeTagline: '', + channelAgentAwayMessage: '', }; }, computed: { @@ -145,6 +259,10 @@ export default { this.$store.dispatch('inboxes/get').then(() => { this.fetchAttachedAgents(); this.autoAssignment = this.inbox.enable_auto_assignment; + this.channelWebsiteUrl = this.inbox.website_url; + this.channelWelcomeTitle = this.inbox.welcome_title; + this.channelWelcomeTagline = this.inbox.welcome_tagline; + this.channelAgentAwayMessage = this.inbox.agent_away_message; }); }, async fetchAttachedAgents() { @@ -181,34 +299,23 @@ export default { } this.isAgentListUpdating = false; }, - async updateWidgetColor() { + async updateInbox() { try { - await this.$store.dispatch('inboxes/updateWebsiteChannel', { - id: this.inbox.channel_id, - website: { - widget_color: this.getWidgetColor(this.inbox.widget_color), - }, - }); - this.showAlert(this.$t('INBOX_MGMT.EDIT.API.SUCCESS_MESSAGE')); - } catch (error) { - this.showAlert(this.$t('INBOX_MGMT.EDIT.API.SUCCESS_MESSAGE')); - } - }, - async updateAutoAssignment() { - try { - await this.$store.dispatch('inboxes/updateAutoAssignment', { + await this.$store.dispatch('inboxes/updateInbox', { id: this.currentInboxId, - inbox: { - enable_auto_assignment: this.autoAssignment, + name: this.inboxName, + enable_auto_assignment: this.autoAssignment, + channel: { + widget_color: this.getWidgetColor(this.inbox.widget_color), + website_url: this.channelWebsiteUrl, + welcome_title: this.channelWelcomeTitle, + welcome_tagline: this.channelWelcomeTagline, + agent_away_message: this.channelAgentAwayMessage, }, }); - this.showAlert( - this.$t('INBOX_MGMT.EDIT.API.AUTO_ASSIGNMENT_SUCCESS_MESSAGE') - ); + this.showAlert(this.$t('INBOX_MGMT.EDIT.API.SUCCESS_MESSAGE')); } catch (error) { - this.showAlert( - this.$t('INBOX_MGMT.EDIT.API.AUTO_ASSIGNMENT_SUCCESS_MESSAGE') - ); + this.showAlert(this.$t('INBOX_MGMT.EDIT.API.SUCCESS_MESSAGE')); } }, getWidgetColor() { @@ -226,3 +333,26 @@ export default { }, }; + + diff --git a/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/Facebook.vue b/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/Facebook.vue index 5a838814d..07cdfa0f9 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/Facebook.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/Facebook.vue @@ -195,8 +195,7 @@ export default { } }, { - scope: - 'manage_pages,read_page_mailboxes,pages_messaging,pages_messaging_phone_number', + scope: 'manage_pages,pages_messaging,pages_messaging_phone_number', } ); }, @@ -221,9 +220,8 @@ export default { return { user_access_token: this.user_access_token, page_access_token: this.selectedPage.access_token, - page_name: this.selectedPage.name, page_id: this.selectedPage.id, - inbox_name: this.pageName, + inbox_name: this.selectedPage.name, }; }, diff --git a/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/Twilio.vue b/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/Twilio.vue index 399651b92..ac5ba6859 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/Twilio.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/Twilio.vue @@ -14,9 +14,22 @@ :placeholder="$t('INBOX_MGMT.ADD.TWILIO.CHANNEL_NAME.PLACEHOLDER')" @blur="$v.channelName.$touch" /> - - {{ $t('INBOX_MGMT.ADD.TWILIO.CHANNEL_NAME.ERROR') }} - + {{ + $t('INBOX_MGMT.ADD.TWILIO.CHANNEL_NAME.ERROR') + }} + + + +
+
@@ -29,9 +42,9 @@ :placeholder="$t('INBOX_MGMT.ADD.TWILIO.PHONE_NUMBER.PLACEHOLDER')" @blur="$v.phoneNumber.$touch" /> - - {{ $t('INBOX_MGMT.ADD.TWILIO.PHONE_NUMBER.ERROR') }} - + {{ + $t('INBOX_MGMT.ADD.TWILIO.PHONE_NUMBER.ERROR') + }} @@ -44,9 +57,9 @@ :placeholder="$t('INBOX_MGMT.ADD.TWILIO.ACCOUNT_SID.PLACEHOLDER')" @blur="$v.accountSID.$touch" /> - - {{ $t('INBOX_MGMT.ADD.TWILIO.ACCOUNT_SID.ERROR') }} - + {{ + $t('INBOX_MGMT.ADD.TWILIO.ACCOUNT_SID.ERROR') + }}
@@ -58,9 +71,9 @@ :placeholder="$t('INBOX_MGMT.ADD.TWILIO.AUTH_TOKEN.PLACEHOLDER')" @blur="$v.authToken.$touch" /> - - {{ $t('INBOX_MGMT.ADD.TWILIO.AUTH_TOKEN.ERROR') }} - + {{ + $t('INBOX_MGMT.ADD.TWILIO.AUTH_TOKEN.ERROR') + }}
@@ -92,6 +105,7 @@ export default { return { accountSID: '', authToken: '', + medium: '', channelName: '', phoneNumber: '', }; @@ -106,6 +120,7 @@ export default { phoneNumber: { required, shouldStartWithPlusSign }, authToken: { required }, accountSID: { required }, + medium: { required }, }, methods: { async createChannel() { @@ -120,6 +135,7 @@ export default { { twilio_channel: { name: this.channelName, + medium: this.medium, account_sid: this.accountSID, auth_token: this.authToken, phone_number: this.phoneNumber, diff --git a/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/Website.vue b/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/Website.vue index 83bf17866..e6d93ae41 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/Website.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/Website.vue @@ -18,7 +18,7 @@ - +

@@ -111,11 +111,11 @@ import Thumbnail from 'dashboard/components/widgets/Thumbnail.vue'; import { required, minLength, email } from 'vuelidate/lib/validators'; import { mapGetters } from 'vuex'; import { clearCookiesOnLogout } from '../../../../store/utils/api'; -import EmailNotifications from './EmailNotifications'; +import NotificationSettings from './NotificationSettings'; export default { components: { - EmailNotifications, + NotificationSettings, Thumbnail, }, data() { diff --git a/app/javascript/dashboard/routes/dashboard/settings/profile/NotificationSettings.vue b/app/javascript/dashboard/routes/dashboard/settings/profile/NotificationSettings.vue new file mode 100644 index 000000000..5eda91c3a --- /dev/null +++ b/app/javascript/dashboard/routes/dashboard/settings/profile/NotificationSettings.vue @@ -0,0 +1,226 @@ + + + + + diff --git a/app/javascript/dashboard/store/index.js b/app/javascript/dashboard/store/index.js index b565e38d6..68f4a7372 100755 --- a/app/javascript/dashboard/store/index.js +++ b/app/javascript/dashboard/store/index.js @@ -10,6 +10,7 @@ import contactConversations from './modules/contactConversations'; import contacts from './modules/contacts'; import conversationLabels from './modules/conversationLabels'; import conversationMetadata from './modules/conversationMetadata'; +import conversationTypingStatus from './modules/conversationTypingStatus'; import conversationPage from './modules/conversationPage'; import conversations from './modules/conversations'; import inboxes from './modules/inboxes'; @@ -22,22 +23,23 @@ import accounts from './modules/accounts'; Vue.use(Vuex); export default new Vuex.Store({ modules: { + accounts, agents, auth, billing, cannedResponse, Channel, - contacts, contactConversations, + contacts, conversationLabels, conversationMetadata, conversationPage, conversations, + conversationTypingStatus, inboxes, inboxMembers, reports, userNotificationSettings, webhooks, - accounts, }, }); diff --git a/app/javascript/dashboard/store/modules/accounts.js b/app/javascript/dashboard/store/modules/accounts.js index 38e2149e8..8508c8f8a 100644 --- a/app/javascript/dashboard/store/modules/accounts.js +++ b/app/javascript/dashboard/store/modules/accounts.js @@ -57,7 +57,7 @@ export const mutations = { ...data, }; }, - [types.default.ADD_ACCOUNT]: MutationHelpers.create, + [types.default.ADD_ACCOUNT]: MutationHelpers.setSingleRecord, [types.default.EDIT_ACCOUNT]: MutationHelpers.update, }; diff --git a/app/javascript/dashboard/store/modules/conversationTypingStatus.js b/app/javascript/dashboard/store/modules/conversationTypingStatus.js new file mode 100644 index 000000000..4ad9f3cb4 --- /dev/null +++ b/app/javascript/dashboard/store/modules/conversationTypingStatus.js @@ -0,0 +1,60 @@ +import Vue from 'vue'; +import * as types from '../mutation-types'; + +const state = { + records: {}, +}; + +export const getters = { + getUserList: $state => id => { + return $state.records[Number(id)] || []; + }, +}; + +export const actions = { + create: ({ commit }, { conversationId, user }) => { + commit(types.default.ADD_USER_TYPING_TO_CONVERSATION, { + conversationId, + user, + }); + }, + destroy: ({ commit }, { conversationId, user }) => { + commit(types.default.REMOVE_USER_TYPING_FROM_CONVERSATION, { + conversationId, + user, + }); + }, +}; + +export const mutations = { + [types.default.ADD_USER_TYPING_TO_CONVERSATION]: ( + $state, + { conversationId, user } + ) => { + const records = $state.records[conversationId] || []; + const hasUserRecordAlready = !!records.filter( + record => record.id === user.id && record.type === user.type + ).length; + if (!hasUserRecordAlready) { + Vue.set($state.records, conversationId, [...records, user]); + } + }, + [types.default.REMOVE_USER_TYPING_FROM_CONVERSATION]: ( + $state, + { conversationId, user } + ) => { + const records = $state.records[conversationId] || []; + const updatedRecords = records.filter( + record => record.id !== user.id || record.type !== user.type + ); + Vue.set($state.records, conversationId, updatedRecords); + }, +}; + +export default { + namespaced: true, + state, + getters, + actions, + mutations, +}; diff --git a/app/javascript/dashboard/store/modules/conversations/actions.js b/app/javascript/dashboard/store/modules/conversations/actions.js index df299fabc..275be8112 100644 --- a/app/javascript/dashboard/store/modules/conversations/actions.js +++ b/app/javascript/dashboard/store/modules/conversations/actions.js @@ -145,14 +145,25 @@ const actions = { commit(types.default.ADD_MESSAGE, message); }, - addConversation({ commit }, conversation) { - commit(types.default.ADD_CONVERSATION, conversation); + updateMessage({ commit }, message) { + commit(types.default.ADD_MESSAGE, message); }, - toggleTyping: async ({ commit }, { status, inboxId, contactId }) => { + addConversation({ commit, state }, conversation) { + const { currentInbox } = state; + if (!currentInbox || Number(currentInbox) === conversation.inbox_id) { + commit(types.default.ADD_CONVERSATION, conversation); + } + }, + + updateConversation({ commit }, conversation) { + commit(types.default.UPDATE_CONVERSATION, conversation); + }, + + toggleTyping: async ({ commit }, { status, conversationId }) => { try { - await FBChannel.toggleTyping({ status, inboxId, contactId }); - commit(types.default.FB_TYPING, { status }); + commit(types.default.SET_AGENT_TYPING, { status }); + await ConversationApi.toggleTyping({ status, conversationId }); } catch (error) { // Handle error } @@ -192,7 +203,7 @@ const actions = { sendAttachment: async ({ commit }, data) => { try { - const response = MessageApi.sendAttachment(data); + const response = await MessageApi.sendAttachment(data); commit(types.default.SEND_MESSAGE, response.data); } catch (error) { // Handle error diff --git a/app/javascript/dashboard/store/modules/conversations/index.js b/app/javascript/dashboard/store/modules/conversations/index.js index 317be297b..9c9a0f22b 100644 --- a/app/javascript/dashboard/store/modules/conversations/index.js +++ b/app/javascript/dashboard/store/modules/conversations/index.js @@ -6,6 +6,14 @@ import getters, { getSelectedChatConversation } from './getters'; import actions from './actions'; import wootConstants from '../../../constants'; +const initialSelectedChat = { + id: null, + meta: {}, + status: null, + seen: false, + agentTyping: 'off', + dataFetched: false, +}; const state = { allConversations: [], convTabStats: { @@ -13,14 +21,7 @@ const state = { unAssignedCount: 0, allCount: 0, }, - selectedChat: { - id: null, - meta: {}, - status: null, - seen: false, - agentTyping: 'off', - dataFetched: false, - }, + selectedChat: { ...initialSelectedChat }, listLoadingStatus: true, chatStatusFilter: wootConstants.STATUS_TYPE.OPEN, currentInbox: null, @@ -42,14 +43,7 @@ const mutations = { }, [types.default.EMPTY_ALL_CONVERSATION](_state) { _state.allConversations = []; - _state.selectedChat = { - id: null, - meta: {}, - status: null, - seen: false, - agentTyping: 'off', - dataFetched: false, - }; + _state.selectedChat = { ...initialSelectedChat }; }, [types.default.SET_ALL_MESSAGES_LOADED](_state) { const [chat] = getSelectedChatConversation(_state); @@ -122,12 +116,13 @@ const mutations = { _state.selectedChat.status = status; }, - [types.default.SEND_MESSAGE](_state, data) { + [types.default.SEND_MESSAGE](_state, currentMessage) { const [chat] = getSelectedChatConversation(_state); - const previousMessageIds = chat.messages.map(m => m.id); - if (!previousMessageIds.includes(data.id)) { - chat.messages.push(data); - } + const allMessagesExceptCurrent = (chat.messages || []).filter( + message => message.id !== currentMessage.id + ); + allMessagesExceptCurrent.push(currentMessage); + chat.messages = allMessagesExceptCurrent; }, [types.default.ADD_MESSAGE](_state, message) { @@ -135,12 +130,16 @@ const mutations = { c => c.id === message.conversation_id ); if (!chat) return; - const previousMessageIds = chat.messages.map(m => m.id); - if (!previousMessageIds.includes(message.id)) { + const previousMessageIndex = chat.messages.findIndex( + m => m.id === message.id + ); + if (previousMessageIndex === -1) { chat.messages.push(message); if (_state.selectedChat.id === message.conversation_id) { window.bus.$emit('scrollToMessage'); } + } else { + chat.messages[previousMessageIndex] = message; } }, @@ -148,11 +147,29 @@ const mutations = { _state.allConversations.push(conversation); }, + [types.default.UPDATE_CONVERSATION](_state, conversation) { + const { allConversations } = _state; + const currentConversationIndex = allConversations.findIndex( + c => c.id === conversation.id + ); + if (currentConversationIndex > -1) { + const currentConversation = { + ...allConversations[currentConversationIndex], + status: conversation.status, + }; + Vue.set(allConversations, currentConversationIndex, currentConversation); + if (_state.selectedChat.id === conversation.id) { + _state.selectedChat.status = conversation.status; + window.bus.$emit('scrollToMessage'); + } + } + }, + [types.default.MARK_SEEN](_state) { _state.selectedChat.seen = true; }, - [types.default.FB_TYPING](_state, { status }) { + [types.default.SET_AGENT_TYPING](_state, { status }) { _state.selectedChat.agentTyping = status; }, diff --git a/app/javascript/dashboard/store/modules/inboxes.js b/app/javascript/dashboard/store/modules/inboxes.js index 1727fd421..d081740ce 100644 --- a/app/javascript/dashboard/store/modules/inboxes.js +++ b/app/javascript/dashboard/store/modules/inboxes.js @@ -79,18 +79,7 @@ export const actions = { throw new Error(error); } }, - updateWebsiteChannel: async ({ commit }, { id, ...inboxParams }) => { - commit(types.default.SET_INBOXES_UI_FLAG, { isUpdating: true }); - try { - const response = await WebChannel.update(id, inboxParams); - commit(types.default.EDIT_INBOXES, response.data); - commit(types.default.SET_INBOXES_UI_FLAG, { isUpdating: false }); - } catch (error) { - commit(types.default.SET_INBOXES_UI_FLAG, { isUpdating: false }); - throw new Error(error); - } - }, - updateAutoAssignment: async ({ commit }, { id, ...inboxParams }) => { + updateInbox: async ({ commit }, { id, ...inboxParams }) => { commit(types.default.SET_INBOXES_UI_FLAG, { isUpdatingAutoAssignment: true, }); diff --git a/app/javascript/dashboard/store/modules/specs/conversationTypingStatus/actions.spec.js b/app/javascript/dashboard/store/modules/specs/conversationTypingStatus/actions.spec.js new file mode 100644 index 000000000..f9e62940c --- /dev/null +++ b/app/javascript/dashboard/store/modules/specs/conversationTypingStatus/actions.spec.js @@ -0,0 +1,36 @@ +import { actions } from '../../conversationTypingStatus'; +import * as types from '../../../mutation-types'; + +const commit = jest.fn(); + +describe('#actions', () => { + describe('#create', () => { + it('sends correct actions', () => { + actions.create( + { commit }, + { conversationId: 1, user: { id: 1, name: 'user-1' } } + ); + expect(commit.mock.calls).toEqual([ + [ + types.default.ADD_USER_TYPING_TO_CONVERSATION, + { conversationId: 1, user: { id: 1, name: 'user-1' } }, + ], + ]); + }); + }); + + describe('#destroy', () => { + it('sends correct actions', () => { + actions.destroy( + { commit }, + { conversationId: 1, user: { id: 1, name: 'user-1' } } + ); + expect(commit.mock.calls).toEqual([ + [ + types.default.REMOVE_USER_TYPING_FROM_CONVERSATION, + { conversationId: 1, user: { id: 1, name: 'user-1' } }, + ], + ]); + }); + }); +}); diff --git a/app/javascript/dashboard/store/modules/specs/conversationTypingStatus/getters.spec.js b/app/javascript/dashboard/store/modules/specs/conversationTypingStatus/getters.spec.js new file mode 100644 index 000000000..b7ed64631 --- /dev/null +++ b/app/javascript/dashboard/store/modules/specs/conversationTypingStatus/getters.spec.js @@ -0,0 +1,19 @@ +import { getters } from '../../conversationTypingStatus'; + +describe('#getters', () => { + it('getUserList', () => { + const state = { + records: { + 1: [ + { id: 1, name: 'user-1' }, + { id: 2, name: 'user-2' }, + ], + }, + }; + expect(getters.getUserList(state)(1)).toEqual([ + { id: 1, name: 'user-1' }, + { id: 2, name: 'user-2' }, + ]); + expect(getters.getUserList(state)(2)).toEqual([]); + }); +}); diff --git a/app/javascript/dashboard/store/modules/specs/conversationTypingStatus/mutations.spec.js b/app/javascript/dashboard/store/modules/specs/conversationTypingStatus/mutations.spec.js new file mode 100644 index 000000000..00266b415 --- /dev/null +++ b/app/javascript/dashboard/store/modules/specs/conversationTypingStatus/mutations.spec.js @@ -0,0 +1,67 @@ +import * as types from '../../../mutation-types'; +import { mutations } from '../../conversationTypingStatus'; + +describe('#mutations', () => { + describe('#ADD_USER_TYPING_TO_CONVERSATION', () => { + it('add user to state', () => { + const state = { records: {} }; + mutations[types.default.ADD_USER_TYPING_TO_CONVERSATION](state, { + conversationId: 1, + user: { id: 1, type: 'contact', name: 'user-1' }, + }); + expect(state.records).toEqual({ + 1: [{ id: 1, type: 'contact', name: 'user-1' }], + }); + }); + + it('doesnot add user if user already exist', () => { + const state = { + records: { + 1: [{ id: 1, type: 'contact', name: 'user-1' }], + }, + }; + mutations[types.default.ADD_USER_TYPING_TO_CONVERSATION](state, { + conversationId: 1, + user: { id: 1, type: 'contact', name: 'user-1' }, + }); + expect(state.records).toEqual({ + 1: [{ id: 1, type: 'contact', name: 'user-1' }], + }); + }); + + it('add user to state if no matching user profiles are seen', () => { + const state = { + records: { + 1: [{ id: 1, type: 'user', name: 'user-1' }], + }, + }; + mutations[types.default.ADD_USER_TYPING_TO_CONVERSATION](state, { + conversationId: 1, + user: { id: 1, type: 'contact', name: 'user-1' }, + }); + expect(state.records).toEqual({ + 1: [ + { id: 1, type: 'user', name: 'user-1' }, + { id: 1, type: 'contact', name: 'user-1' }, + ], + }); + }); + }); + + describe('#REMOVE_USER_TYPING_FROM_CONVERSATION', () => { + it('remove add user if user exist', () => { + const state = { + records: { + 1: [{ id: 1, type: 'contact', name: 'user-1' }], + }, + }; + mutations[types.default.REMOVE_USER_TYPING_FROM_CONVERSATION](state, { + conversationId: 1, + user: { id: 1, type: 'contact', name: 'user-1' }, + }); + expect(state.records).toEqual({ + 1: [], + }); + }); + }); +}); diff --git a/app/javascript/dashboard/store/modules/specs/inboxes/actions.spec.js b/app/javascript/dashboard/store/modules/specs/inboxes/actions.spec.js index 4f7e242d6..c2d32976c 100644 --- a/app/javascript/dashboard/store/modules/specs/inboxes/actions.spec.js +++ b/app/javascript/dashboard/store/modules/specs/inboxes/actions.spec.js @@ -70,35 +70,13 @@ describe('#actions', () => { }); }); - describe('#updateWebsiteChannel', () => { - it('sends correct actions if API is success', async () => { - axios.patch.mockResolvedValue({ data: inboxList[0] }); - await actions.updateWebsiteChannel({ commit }, inboxList[0]); - expect(commit.mock.calls).toEqual([ - [types.default.SET_INBOXES_UI_FLAG, { isUpdating: true }], - [types.default.EDIT_INBOXES, inboxList[0]], - [types.default.SET_INBOXES_UI_FLAG, { isUpdating: false }], - ]); - }); - it('sends correct actions if API is error', async () => { - axios.patch.mockRejectedValue({ message: 'Incorrect header' }); - await expect( - actions.updateWebsiteChannel({ commit }, inboxList[0]) - ).rejects.toThrow(Error); - expect(commit.mock.calls).toEqual([ - [types.default.SET_INBOXES_UI_FLAG, { isUpdating: true }], - [types.default.SET_INBOXES_UI_FLAG, { isUpdating: false }], - ]); - }); - }); - - describe('#updateAutoAssignment', () => { + describe('#updateInbox', () => { it('sends correct actions if API is success', async () => { const updatedInbox = inboxList[0]; updatedInbox.enable_auto_assignment = false; axios.patch.mockResolvedValue({ data: updatedInbox }); - await actions.updateAutoAssignment( + await actions.updateInbox( { commit }, { id: updatedInbox.id, inbox: { enable_auto_assignment: false } } ); @@ -114,7 +92,7 @@ describe('#actions', () => { it('sends correct actions if API is error', async () => { axios.patch.mockRejectedValue({ message: 'Incorrect header' }); await expect( - actions.updateAutoAssignment( + actions.updateInbox( { commit }, { id: inboxList[0].id, inbox: { enable_auto_assignment: false } } ) diff --git a/app/javascript/dashboard/store/modules/userNotificationSettings.js b/app/javascript/dashboard/store/modules/userNotificationSettings.js index 87694a396..a5d1a8db0 100644 --- a/app/javascript/dashboard/store/modules/userNotificationSettings.js +++ b/app/javascript/dashboard/store/modules/userNotificationSettings.js @@ -17,6 +17,9 @@ export const getters = { getSelectedEmailFlags: $state => { return $state.record.selected_email_flags; }, + getSelectedPushFlags: $state => { + return $state.record.selected_push_flags; + }, }; export const actions = { @@ -35,12 +38,13 @@ export const actions = { } }, - update: async ({ commit }, params) => { + update: async ({ commit }, { selectedEmailFlags, selectedPushFlags }) => { commit(types.default.SET_USER_NOTIFICATION_UI_FLAG, { isUpdating: true }); try { const response = await UserNotificationSettings.update({ notification_settings: { - selected_email_flags: params, + selected_email_flags: selectedEmailFlags, + selected_push_flags: selectedPushFlags, }, }); commit(types.default.SET_USER_NOTIFICATION, response.data); diff --git a/app/javascript/dashboard/store/mutation-types.js b/app/javascript/dashboard/store/mutation-types.js index 93b252389..e6ee84775 100755 --- a/app/javascript/dashboard/store/mutation-types.js +++ b/app/javascript/dashboard/store/mutation-types.js @@ -21,13 +21,14 @@ export default { CLEAR_ALL_MESSAGES: 'CLEAR_ALL_MESSAGES', RESOLVE_CONVERSATION: 'RESOLVE_CONVERSATION', ADD_CONVERSATION: 'ADD_CONVERSATION', + UPDATE_CONVERSATION: 'UPDATE_CONVERSATION', SEND_MESSAGE: 'SEND_MESSAGE', ASSIGN_AGENT: 'ASSIGN_AGENT', SET_CHAT_META: 'SET_CHAT_META', ADD_MESSAGE: 'ADD_MESSAGE', MARK_SEEN: 'MARK_SEEN', MARK_MESSAGE_READ: 'MARK_MESSAGE_READ', - FB_TYPING: 'FB_TYPING', + SET_AGENT_TYPING: 'SET_AGENT_TYPING', SET_PREVIOUS_CONVERSATIONS: 'SET_PREVIOUS_CONVERSATIONS', SET_ACTIVE_INBOX: 'SET_ACTIVE_INBOX', @@ -103,4 +104,8 @@ export default { // Notification Settings SET_USER_NOTIFICATION_UI_FLAG: 'SET_USER_NOTIFICATION_UI_FLAG', SET_USER_NOTIFICATION: 'SET_USER_NOTIFICATION', + + // User Typing + ADD_USER_TYPING_TO_CONVERSATION: 'ADD_USER_TYPING_TO_CONVERSATION', + REMOVE_USER_TYPING_FROM_CONVERSATION: 'REMOVE_USER_TYPING_FROM_CONVERSATION', }; diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js index 4a45eb863..787258381 100644 --- a/app/javascript/packs/application.js +++ b/app/javascript/packs/application.js @@ -1,5 +1,3 @@ -import '@babel/polyfill'; - /* eslint no-console: 0 */ /* eslint-env browser */ /* eslint-disable no-new */ @@ -28,6 +26,10 @@ import router from '../dashboard/routes'; import store from '../dashboard/store'; import vueActionCable from '../dashboard/helper/actionCable'; import constants from '../dashboard/constants'; +import { + verifyServiceWorkerExistence, + registerSubscription, +} from '../dashboard/helper/pushHelper'; Vue.config.env = process.env; @@ -68,15 +70,12 @@ window.onload = () => { vueActionCable.init(); }; -if ('serviceWorker' in navigator) { - window.addEventListener('load', () => { - navigator.serviceWorker - .register('/sw.js') - .then(registration => { - console.log('SW registered: ', registration); - }) - .catch(registrationError => { - console.log('SW registration failed: ', registrationError); - }); - }); -} +window.addEventListener('load', () => { + verifyServiceWorkerExistence(registration => + registration.pushManager.getSubscription().then(subscription => { + if (subscription) { + registerSubscription(); + } + }) + ); +}); diff --git a/app/javascript/packs/sdk.js b/app/javascript/packs/sdk.js index 459c2bc4b..a32b9dca4 100755 --- a/app/javascript/packs/sdk.js +++ b/app/javascript/packs/sdk.js @@ -1,6 +1,5 @@ import Cookies from 'js-cookie'; import { IFrameHelper } from '../sdk/IFrameHelper'; -import { onBubbleClick } from '../sdk/bubbleHelpers'; const runSDK = ({ baseUrl, websiteToken }) => { const chatwootSettings = window.chatwootSettings || {}; @@ -9,11 +8,11 @@ const runSDK = ({ baseUrl, websiteToken }) => { hasLoaded: false, hideMessageBubble: chatwootSettings.hideMessageBubble || false, isOpen: false, - position: chatwootSettings.position || 'right', + position: chatwootSettings.position === 'left' ? 'left' : 'right', websiteToken, toggle() { - onBubbleClick(); + IFrameHelper.events.toggleBubble(); }, setUser(identifier, user) { @@ -39,7 +38,7 @@ const runSDK = ({ baseUrl, websiteToken }) => { reset() { if (window.$chatwoot.isOpen) { - onBubbleClick(); + IFrameHelper.events.toggleBubble(); } Cookies.remove('cw_conversation'); diff --git a/app/javascript/sdk/IFrameHelper.js b/app/javascript/sdk/IFrameHelper.js index ec55c731d..eb7a32d25 100644 --- a/app/javascript/sdk/IFrameHelper.js +++ b/app/javascript/sdk/IFrameHelper.js @@ -31,7 +31,7 @@ export const IFrameHelper = { iframe.id = 'chatwoot_live_chat_widget'; iframe.style.visibility = 'hidden'; - widgetHolder.className = 'woot-widget-holder woot--hide'; + widgetHolder.className = `woot-widget-holder woot--hide woot-elements--${window.$chatwoot.position}`; widgetHolder.appendChild(iframe); body.appendChild(widgetHolder); IFrameHelper.initPostMessageCommunication(); @@ -90,7 +90,10 @@ export const IFrameHelper = { onBubbleClick(); }, }, - onLoad: ({ widget_color: widgetColor }) => { + pushEvent: eventName => { + IFrameHelper.sendMessage('push-event', { eventName }); + }, + onLoad: ({ widgetColor }) => { const iframe = IFrameHelper.getAppFrame(); iframe.style.visibility = ''; iframe.setAttribute('id', `chatwoot_live_chat_widget`); @@ -108,7 +111,7 @@ export const IFrameHelper = { }); const closeIcon = closeBubble; - closeIcon.className = 'woot-widget-bubble woot--close woot--hide'; + closeIcon.className = `woot-elements--${window.$chatwoot.position} woot-widget-bubble woot--close woot--hide`; chatIcon.style.background = widgetColor; closeIcon.style.background = widgetColor; diff --git a/app/javascript/sdk/bubbleHelpers.js b/app/javascript/sdk/bubbleHelpers.js index 243717263..664bac5ec 100644 --- a/app/javascript/sdk/bubbleHelpers.js +++ b/app/javascript/sdk/bubbleHelpers.js @@ -1,4 +1,5 @@ import { addClass, toggleClass, wootOn } from './DOMHelpers'; +import { IFrameHelper } from './IFrameHelper'; export const bubbleImg = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAAUVBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////8IN+deAAAAGnRSTlMAAwgJEBk0TVheY2R5eo+ut8jb5OXs8fX2+cjRDTIAAADsSURBVHgBldZbkoMgFIThRgQv8SKKgGf/C51UnJqaRI30/9zfe+NQUQ3TvG7bOk9DVeCmshmj/CuOTYnrdBfkUOg0zlOtl9OWVuEk4+QyZ3DIevmSt/ioTvK1VH/s5bY3YdM9SBZ/mUUyWgx+U06ycgp7D8msxSvtc4HXL9BLdj2elSEfhBJAI0QNgJEBI1BEBsQClVBVGDgwYOLAhJkDM1YOrNg4sLFAsLJgZsHEgoEFFQt0JAFGFjQsKAMJ0LFAexKgZYFyJIDxJIBNJEDNAtSJBLCeBDCOBFAPzwFA94ED+zmhwDO9358r8ANtIsMXi7qVAwAAAABJRU5ErkJggg=='; @@ -14,7 +15,7 @@ export const notificationBubble = document.createElement('span'); const bodyOverFlowStyle = document.body.style.overflow; export const createBubbleIcon = ({ className, src, target }) => { - target.className = className; + target.className = `${className} woot-elements--${window.$chatwoot.position}`; const bubbleIcon = document.createElement('img'); bubbleIcon.src = src; target.appendChild(bubbleIcon); @@ -36,6 +37,9 @@ export const onBubbleClick = () => { toggleClass(chatBubble, 'woot--hide'); toggleClass(closeBubble, 'woot--hide'); toggleClass(widgetHolder, 'woot--hide'); + if (window.$chatwoot.isOpen) { + IFrameHelper.pushEvent('webwidget.triggered'); + } }; export const onClickChatBubble = () => { diff --git a/app/javascript/shared/components/CardButton.vue b/app/javascript/shared/components/CardButton.vue index eea0b1a5a..d6d116ade 100644 --- a/app/javascript/shared/components/CardButton.vue +++ b/app/javascript/shared/components/CardButton.vue @@ -4,6 +4,8 @@ :key="action.uri" class="action-button button" :href="action.uri" + target="_blank" + rel="noopener nofollow noreferrer" > {{ action.text }} @@ -44,11 +46,14 @@ export default { @import '~dashboard/assets/scss/mixins.scss'; .action-button { - width: 100%; - padding: 0; - max-height: 34px; - margin-top: $space-smaller; + align-items: center; border-radius: $space-micro; + display: flex; font-weight: $font-weight-medium; + justify-content: center; + margin-top: $space-smaller; + max-height: 34px; + padding: 0; + width: 100%; } diff --git a/app/javascript/shared/components/ChatCard.vue b/app/javascript/shared/components/ChatCard.vue index 8accb6d8c..4e856bb6b 100644 --- a/app/javascript/shared/components/ChatCard.vue +++ b/app/javascript/shared/components/ChatCard.vue @@ -52,7 +52,6 @@ export default { @import '~dashboard/assets/scss/mixins.scss'; .card-message { - @include border-normal; background: white; max-width: 220px; padding: $space-small; diff --git a/app/javascript/shared/components/ChatForm.vue b/app/javascript/shared/components/ChatForm.vue new file mode 100644 index 000000000..68af0f053 --- /dev/null +++ b/app/javascript/shared/components/ChatForm.vue @@ -0,0 +1,128 @@ +