Merge branch 'develop' into fix/articles
This commit is contained in:
commit
95159cbb2f
399 changed files with 4042 additions and 1160 deletions
|
@ -54,3 +54,5 @@ exclude_patterns:
|
||||||
- 'app/javascript/widget/i18n/index.js'
|
- 'app/javascript/widget/i18n/index.js'
|
||||||
- 'app/javascript/survey/i18n/index.js'
|
- 'app/javascript/survey/i18n/index.js'
|
||||||
- 'app/javascript/shared/constants/locales.js'
|
- 'app/javascript/shared/constants/locales.js'
|
||||||
|
- 'app/javascript/dashboard/helper/specs/macrosFixtures.js'
|
||||||
|
- 'app/javascript/dashboard/routes/dashboard/settings/macros/constants.js'
|
||||||
|
|
|
@ -34,6 +34,11 @@ REDIS_SENTINELS=
|
||||||
# You can find list of master using "SENTINEL masters" command
|
# You can find list of master using "SENTINEL masters" command
|
||||||
REDIS_SENTINEL_MASTER_NAME=
|
REDIS_SENTINEL_MASTER_NAME=
|
||||||
|
|
||||||
|
# By default Chatwoot will pass REDIS_PASSWORD as the password value for sentinels
|
||||||
|
# Use the following environment variable to customize passwords for sentinels.
|
||||||
|
# Use empty string if sentinels are configured with out passwords
|
||||||
|
# REDIS_SENTINEL_PASSWORD=
|
||||||
|
|
||||||
# Redis premium breakage in heroku fix
|
# Redis premium breakage in heroku fix
|
||||||
# enable the following configuration
|
# enable the following configuration
|
||||||
# ref: https://github.com/chatwoot/chatwoot/issues/2420
|
# ref: https://github.com/chatwoot/chatwoot/issues/2420
|
||||||
|
|
46
.github/ISSUE_TEMPLATE/bug_report.md
vendored
46
.github/ISSUE_TEMPLATE/bug_report.md
vendored
|
@ -6,6 +6,7 @@ labels: 'Bug'
|
||||||
assignees: ''
|
assignees: ''
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
**Describe the bug**
|
**Describe the bug**
|
||||||
|
|
||||||
A clear and concise description of what the bug is.
|
A clear and concise description of what the bug is.
|
||||||
|
@ -16,11 +17,11 @@ Steps to reproduce the behavior:
|
||||||
1. Go to '...'
|
1. Go to '...'
|
||||||
2. Click on '....'
|
2. Click on '....'
|
||||||
3. Scroll down to '....'
|
3. Scroll down to '....'
|
||||||
4. See error
|
4. See the error
|
||||||
|
|
||||||
**Expected behavior**
|
**Expected behavior**
|
||||||
|
|
||||||
A clear and concise description of what you expected to happen.
|
Share a clear and concise description of what you expected to happen.
|
||||||
|
|
||||||
**Screenshots**
|
**Screenshots**
|
||||||
|
|
||||||
|
@ -28,27 +29,50 @@ If applicable, add screenshots to help explain your problem.
|
||||||
|
|
||||||
**Browser logs**
|
**Browser logs**
|
||||||
|
|
||||||
Share the browser logs to debug the issue further
|
Share the browser logs to debug the issue further.
|
||||||
|
|
||||||
**Server logs**
|
**Server logs**
|
||||||
|
|
||||||
Share the server logs to debug the issue further
|
Share the server logs to debug the issue further.
|
||||||
|
|
||||||
**Environment**
|
**Environment**
|
||||||
|
|
||||||
Describe whether you are using Chatwoot Cloud (app.chatwoot.com) or a self hosted installation of Chatwoot. If you are using a self hosted installation of Chatwoot describe the type of deployment (Docker/Linux VM installation/Heroku)
|
Describe whether you are using Chatwoot Cloud (app.chatwoot.com) or a self-hosted installation of Chatwoot. If you are using a self-hosted installation of Chatwoot, describe the type of deployment (Docker/Linux VM installation/Heroku/Kubernetes/Other).
|
||||||
|
|
||||||
**Desktop (please complete the following information):**
|
- [ ] app.chatwoot.com (Chatwoot Cloud)
|
||||||
- OS: [e.g. iOS]
|
- [ ] Self-hosted
|
||||||
- Browser [e.g. chrome, safari]
|
- - [ ] Linux VM
|
||||||
|
- - [ ] Docker
|
||||||
|
- - [ ] Kubernetes
|
||||||
|
- - [ ] Heroku
|
||||||
|
- - [ ] Other (Please specify)
|
||||||
|
|
||||||
|
|
||||||
|
**Desktop (please complete the following information)** (If applicable)
|
||||||
|
- OS: [e.g. Linux, Windows, MacOS]
|
||||||
|
- Browser [e.g. chrome, firefox, safari]
|
||||||
- Version [e.g. 22]
|
- Version [e.g. 22]
|
||||||
|
|
||||||
**Smartphone (please complete the following information):**
|
**Smartphone (please complete the following information)** (If applicable)
|
||||||
- Device: [e.g. iPhone6]
|
- Device: [e.g. iPhone6, Pixel7]
|
||||||
- OS: [e.g. iOS8.1]
|
- OS: [e.g. iOS8.1]
|
||||||
- Browser [e.g. stock browser, safari]
|
- Browser [e.g. stock browser, firefox, safari]
|
||||||
- Version [e.g. 22]
|
- Version [e.g. 22]
|
||||||
|
|
||||||
|
**Docker** (If applicable)
|
||||||
|
|
||||||
|
Please share the output of the following.
|
||||||
|
- `docker version`
|
||||||
|
- `docker info`
|
||||||
|
- `docker-compose version`
|
||||||
|
|
||||||
|
**Cloud Provider** (If applicable)
|
||||||
|
- [ ] AWS
|
||||||
|
- [ ] GCP
|
||||||
|
- [ ] Azure
|
||||||
|
- [ ] DigitalOcean
|
||||||
|
- [ ] Others
|
||||||
|
|
||||||
**Additional context**
|
**Additional context**
|
||||||
|
|
||||||
Add any other context about the problem here.
|
Add any other context about the problem here.
|
||||||
|
|
9
.github/PULL_REQUEST_TEMPLATE.md
vendored
9
.github/PULL_REQUEST_TEMPLATE.md
vendored
|
@ -2,8 +2,7 @@
|
||||||
|
|
||||||
## Description
|
## Description
|
||||||
|
|
||||||
Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change.
|
Please include a summary of the change and issue(s) fixed. Also, mention relevant motivation, context, and any dependencies that this change requires.
|
||||||
|
|
||||||
Fixes # (issue)
|
Fixes # (issue)
|
||||||
|
|
||||||
## Type of change
|
## Type of change
|
||||||
|
@ -12,18 +11,18 @@ Please delete options that are not relevant.
|
||||||
|
|
||||||
- [ ] Bug fix (non-breaking change which fixes an issue)
|
- [ ] Bug fix (non-breaking change which fixes an issue)
|
||||||
- [ ] New feature (non-breaking change which adds functionality)
|
- [ ] New feature (non-breaking change which adds functionality)
|
||||||
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
|
- [ ] Breaking change (fix or feature that would cause existing functionality not to work as expected)
|
||||||
- [ ] This change requires a documentation update
|
- [ ] This change requires a documentation update
|
||||||
|
|
||||||
## How Has This Been Tested?
|
## How Has This Been Tested?
|
||||||
|
|
||||||
Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration
|
Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration.
|
||||||
|
|
||||||
|
|
||||||
## Checklist:
|
## Checklist:
|
||||||
|
|
||||||
- [ ] My code follows the style guidelines of this project
|
- [ ] My code follows the style guidelines of this project
|
||||||
- [ ] I have performed a self-review of my own code
|
- [ ] I have performed a self-review of my code
|
||||||
- [ ] I have commented on my code, particularly in hard-to-understand areas
|
- [ ] I have commented on my code, particularly in hard-to-understand areas
|
||||||
- [ ] I have made corresponding changes to the documentation
|
- [ ] I have made corresponding changes to the documentation
|
||||||
- [ ] My changes generate no new warnings
|
- [ ] My changes generate no new warnings
|
||||||
|
|
2
.github/workflows/publish_foss_docker.yml
vendored
2
.github/workflows/publish_foss_docker.yml
vendored
|
@ -58,6 +58,6 @@ jobs:
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
file: docker/Dockerfile
|
file: docker/Dockerfile
|
||||||
platforms: linux/amd64,linux/arm64
|
platforms: linux/amd64
|
||||||
push: true
|
push: true
|
||||||
tags: ${{ env.DOCKER_TAG }}
|
tags: ${{ env.DOCKER_TAG }}
|
||||||
|
|
|
@ -16,6 +16,7 @@ Metrics/ClassLength:
|
||||||
- 'app/models/message.rb'
|
- 'app/models/message.rb'
|
||||||
- 'app/builders/messages/facebook/message_builder.rb'
|
- 'app/builders/messages/facebook/message_builder.rb'
|
||||||
- 'app/controllers/api/v1/accounts/contacts_controller.rb'
|
- 'app/controllers/api/v1/accounts/contacts_controller.rb'
|
||||||
|
- 'app/controllers/api/v1/accounts/conversations_controller.rb'
|
||||||
- 'app/listeners/action_cable_listener.rb'
|
- 'app/listeners/action_cable_listener.rb'
|
||||||
- 'app/models/conversation.rb'
|
- 'app/models/conversation.rb'
|
||||||
RSpec/ExampleLength:
|
RSpec/ExampleLength:
|
||||||
|
|
10
Gemfile.lock
10
Gemfile.lock
|
@ -427,14 +427,14 @@ GEM
|
||||||
netrc (0.11.0)
|
netrc (0.11.0)
|
||||||
newrelic_rpm (8.9.0)
|
newrelic_rpm (8.9.0)
|
||||||
nio4r (2.5.8)
|
nio4r (2.5.8)
|
||||||
nokogiri (1.13.7)
|
nokogiri (1.13.9)
|
||||||
mini_portile2 (~> 2.8.0)
|
mini_portile2 (~> 2.8.0)
|
||||||
racc (~> 1.4)
|
racc (~> 1.4)
|
||||||
nokogiri (1.13.7-arm64-darwin)
|
nokogiri (1.13.9-arm64-darwin)
|
||||||
racc (~> 1.4)
|
racc (~> 1.4)
|
||||||
nokogiri (1.13.7-x86_64-darwin)
|
nokogiri (1.13.9-x86_64-darwin)
|
||||||
racc (~> 1.4)
|
racc (~> 1.4)
|
||||||
nokogiri (1.13.7-x86_64-linux)
|
nokogiri (1.13.9-x86_64-linux)
|
||||||
racc (~> 1.4)
|
racc (~> 1.4)
|
||||||
oauth (0.5.10)
|
oauth (0.5.10)
|
||||||
orm_adapter (0.5.0)
|
orm_adapter (0.5.0)
|
||||||
|
@ -808,4 +808,4 @@ RUBY VERSION
|
||||||
ruby 3.0.4p208
|
ruby 3.0.4p208
|
||||||
|
|
||||||
BUNDLED WITH
|
BUNDLED WITH
|
||||||
2.3.18
|
2.3.16
|
||||||
|
|
|
@ -1,13 +1,12 @@
|
||||||
|
# This Builder will create a contact inbox with specified attributes. If the contact inbox already exists, it will be returned.
|
||||||
|
# For Specific Channels like whatsapp, email etc . it smartly generated appropriate the source id when none is provided.
|
||||||
|
|
||||||
class ContactInboxBuilder
|
class ContactInboxBuilder
|
||||||
pattr_initialize [:contact_id!, :inbox_id!, :source_id]
|
pattr_initialize [:contact, :inbox, :source_id, { hmac_verified: false }]
|
||||||
|
|
||||||
def perform
|
def perform
|
||||||
@contact = Contact.find(contact_id)
|
@source_id ||= generate_source_id
|
||||||
@inbox = @contact.account.inboxes.find(inbox_id)
|
create_contact_inbox if source_id.present?
|
||||||
return unless ['Channel::TwilioSms', 'Channel::Sms', 'Channel::Email', 'Channel::Api', 'Channel::Whatsapp'].include? @inbox.channel_type
|
|
||||||
|
|
||||||
source_id = @source_id || generate_source_id
|
|
||||||
create_contact_inbox(source_id) if source_id.present?
|
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
@ -19,23 +18,37 @@ class ContactInboxBuilder
|
||||||
when 'Channel::Whatsapp'
|
when 'Channel::Whatsapp'
|
||||||
wa_source_id
|
wa_source_id
|
||||||
when 'Channel::Email'
|
when 'Channel::Email'
|
||||||
@contact.email
|
email_source_id
|
||||||
when 'Channel::Sms'
|
when 'Channel::Sms'
|
||||||
@contact.phone_number
|
phone_source_id
|
||||||
when 'Channel::Api'
|
when 'Channel::Api', 'Channel::WebWidget'
|
||||||
SecureRandom.uuid
|
SecureRandom.uuid
|
||||||
|
else
|
||||||
|
raise "Unsupported operation for this channel: #{@inbox.channel_type}"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def email_source_id
|
||||||
|
raise ActionController::ParameterMissing, 'contact email' unless @contact.email
|
||||||
|
|
||||||
|
@contact.email
|
||||||
|
end
|
||||||
|
|
||||||
|
def phone_source_id
|
||||||
|
raise ActionController::ParameterMissing, 'contact phone number' unless @contact.phone_number
|
||||||
|
|
||||||
|
@contact.phone_number
|
||||||
|
end
|
||||||
|
|
||||||
def wa_source_id
|
def wa_source_id
|
||||||
return unless @contact.phone_number
|
raise ActionController::ParameterMissing, 'contact phone number' unless @contact.phone_number
|
||||||
|
|
||||||
# whatsapp doesn't want the + in e164 format
|
# whatsapp doesn't want the + in e164 format
|
||||||
@contact.phone_number.delete('+').to_s
|
@contact.phone_number.delete('+').to_s
|
||||||
end
|
end
|
||||||
|
|
||||||
def twilio_source_id
|
def twilio_source_id
|
||||||
return unless @contact.phone_number
|
raise ActionController::ParameterMissing, 'contact phone number' unless @contact.phone_number
|
||||||
|
|
||||||
case @inbox.channel.medium
|
case @inbox.channel.medium
|
||||||
when 'sms'
|
when 'sms'
|
||||||
|
@ -45,11 +58,11 @@ class ContactInboxBuilder
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_contact_inbox(source_id)
|
def create_contact_inbox
|
||||||
::ContactInbox.find_or_create_by!(
|
::ContactInbox.create_with(hmac_verified: hmac_verified || false).find_or_create_by!(
|
||||||
contact_id: @contact.id,
|
contact_id: @contact.id,
|
||||||
inbox_id: @inbox.id,
|
inbox_id: @inbox.id,
|
||||||
source_id: source_id
|
source_id: @source_id
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,25 +1,47 @@
|
||||||
class ContactBuilder
|
# This Builder will create a contact and contact inbox with specified attributes.
|
||||||
pattr_initialize [:source_id!, :inbox!, :contact_attributes!, :hmac_verified]
|
# If an existing identified contact exisits, it will be returned.
|
||||||
|
# for contact inbox logic it uses the contact inbox builder
|
||||||
|
|
||||||
|
class ContactInboxWithContactBuilder
|
||||||
|
pattr_initialize [:inbox!, :contact_attributes!, :source_id, :hmac_verified]
|
||||||
|
|
||||||
def perform
|
def perform
|
||||||
contact_inbox = inbox.contact_inboxes.find_by(source_id: source_id)
|
find_or_create_contact_and_contact_inbox
|
||||||
return contact_inbox if contact_inbox
|
# in case of race conditions where contact is created by another thread
|
||||||
|
# we will try to find the contact and create a contact inbox
|
||||||
|
rescue ActiveRecord::RecordNotUnique
|
||||||
|
find_or_create_contact_and_contact_inbox
|
||||||
|
end
|
||||||
|
|
||||||
build_contact_inbox
|
def find_or_create_contact_and_contact_inbox
|
||||||
|
@contact_inbox = inbox.contact_inboxes.find_by(source_id: source_id) if source_id.present?
|
||||||
|
return @contact_inbox if @contact_inbox
|
||||||
|
|
||||||
|
ActiveRecord::Base.transaction(requires_new: true) do
|
||||||
|
build_contact_with_contact_inbox
|
||||||
|
update_contact_avatar(@contact) unless @contact.avatar.attached?
|
||||||
|
@contact_inbox
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def build_contact_with_contact_inbox
|
||||||
|
@contact = find_contact || create_contact
|
||||||
|
@contact_inbox = create_contact_inbox
|
||||||
|
end
|
||||||
|
|
||||||
def account
|
def account
|
||||||
@account ||= inbox.account
|
@account ||= inbox.account
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_contact_inbox(contact)
|
def create_contact_inbox
|
||||||
::ContactInbox.create_with(hmac_verified: hmac_verified || false).find_or_create_by!(
|
ContactInboxBuilder.new(
|
||||||
contact_id: contact.id,
|
contact: @contact,
|
||||||
inbox_id: inbox.id,
|
inbox: @inbox,
|
||||||
source_id: source_id
|
source_id: @source_id,
|
||||||
)
|
hmac_verified: hmac_verified
|
||||||
|
).perform
|
||||||
end
|
end
|
||||||
|
|
||||||
def update_contact_avatar(contact)
|
def update_contact_avatar(contact)
|
||||||
|
@ -61,16 +83,4 @@ class ContactBuilder
|
||||||
|
|
||||||
account.contacts.find_by(phone_number: phone_number)
|
account.contacts.find_by(phone_number: phone_number)
|
||||||
end
|
end
|
||||||
|
|
||||||
def build_contact_inbox
|
|
||||||
ActiveRecord::Base.transaction do
|
|
||||||
contact = find_contact || create_contact
|
|
||||||
contact_inbox = create_contact_inbox(contact)
|
|
||||||
update_contact_avatar(contact)
|
|
||||||
contact_inbox
|
|
||||||
rescue StandardError => e
|
|
||||||
Rails.logger.error e
|
|
||||||
raise e
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
|
@ -22,10 +22,9 @@ class Messages::Facebook::MessageBuilder < Messages::Messenger::MessageBuilder
|
||||||
return if @inbox.channel.reauthorization_required?
|
return if @inbox.channel.reauthorization_required?
|
||||||
|
|
||||||
ActiveRecord::Base.transaction do
|
ActiveRecord::Base.transaction do
|
||||||
build_contact
|
build_contact_inbox
|
||||||
build_message
|
build_message
|
||||||
end
|
end
|
||||||
ensure_contact_avatar
|
|
||||||
rescue Koala::Facebook::AuthenticationError
|
rescue Koala::Facebook::AuthenticationError
|
||||||
@inbox.channel.authorization_error!
|
@inbox.channel.authorization_error!
|
||||||
rescue StandardError => e
|
rescue StandardError => e
|
||||||
|
@ -35,15 +34,12 @@ class Messages::Facebook::MessageBuilder < Messages::Messenger::MessageBuilder
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def contact
|
def build_contact_inbox
|
||||||
@contact ||= @inbox.contact_inboxes.find_by(source_id: @sender_id)&.contact
|
@contact_inbox = ::ContactInboxWithContactBuilder.new(
|
||||||
end
|
source_id: @sender_id,
|
||||||
|
inbox: @inbox,
|
||||||
def build_contact
|
contact_attributes: contact_params
|
||||||
return if contact.present?
|
).perform
|
||||||
|
|
||||||
@contact = Contact.create!(contact_params.except(:remote_avatar_url))
|
|
||||||
@contact_inbox = ContactInbox.find_or_create_by!(contact: contact, inbox: @inbox, source_id: @sender_id)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def build_message
|
def build_message
|
||||||
|
@ -54,19 +50,11 @@ class Messages::Facebook::MessageBuilder < Messages::Messenger::MessageBuilder
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def ensure_contact_avatar
|
|
||||||
return if contact_params[:remote_avatar_url].blank?
|
|
||||||
return if @contact.avatar.attached?
|
|
||||||
|
|
||||||
Avatar::AvatarFromUrlJob.perform_later(@contact, contact_params[:remote_avatar_url])
|
|
||||||
end
|
|
||||||
|
|
||||||
def conversation
|
def conversation
|
||||||
@conversation ||= Conversation.find_by(conversation_params) || build_conversation
|
@conversation ||= Conversation.find_by(conversation_params) || build_conversation
|
||||||
end
|
end
|
||||||
|
|
||||||
def build_conversation
|
def build_conversation
|
||||||
@contact_inbox ||= contact.contact_inboxes.find_by!(source_id: @sender_id)
|
|
||||||
Conversation.create!(conversation_params.merge(
|
Conversation.create!(conversation_params.merge(
|
||||||
contact_inbox_id: @contact_inbox.id
|
contact_inbox_id: @contact_inbox.id
|
||||||
))
|
))
|
||||||
|
@ -94,7 +82,7 @@ class Messages::Facebook::MessageBuilder < Messages::Messenger::MessageBuilder
|
||||||
{
|
{
|
||||||
account_id: @inbox.account_id,
|
account_id: @inbox.account_id,
|
||||||
inbox_id: @inbox.id,
|
inbox_id: @inbox.id,
|
||||||
contact_id: contact.id
|
contact_id: @contact_inbox.contact_id
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -105,7 +93,7 @@ class Messages::Facebook::MessageBuilder < Messages::Messenger::MessageBuilder
|
||||||
message_type: @message_type,
|
message_type: @message_type,
|
||||||
content: response.content,
|
content: response.content,
|
||||||
source_id: response.identifier,
|
source_id: response.identifier,
|
||||||
sender: @outgoing_echo ? nil : contact
|
sender: @outgoing_echo ? nil : @contact_inbox.contact
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -113,7 +101,7 @@ class Messages::Facebook::MessageBuilder < Messages::Messenger::MessageBuilder
|
||||||
{
|
{
|
||||||
name: "#{result['first_name'] || 'John'} #{result['last_name'] || 'Doe'}",
|
name: "#{result['first_name'] || 'John'} #{result['last_name'] || 'Doe'}",
|
||||||
account_id: @inbox.account_id,
|
account_id: @inbox.account_id,
|
||||||
remote_avatar_url: result['profile_pic'] || ''
|
avatar_url: result['profile_pic']
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -72,6 +72,7 @@ class Messages::Instagram::MessageBuilder < Messages::Messenger::MessageBuilder
|
||||||
|
|
||||||
def build_message
|
def build_message
|
||||||
return if @outgoing_echo && already_sent_from_chatwoot?
|
return if @outgoing_echo && already_sent_from_chatwoot?
|
||||||
|
return if message_content.blank? && all_unsupported_files?
|
||||||
|
|
||||||
@message = conversation.messages.create!(message_params)
|
@message = conversation.messages.create!(message_params)
|
||||||
|
|
||||||
|
@ -117,6 +118,13 @@ class Messages::Instagram::MessageBuilder < Messages::Messenger::MessageBuilder
|
||||||
cw_message.present?
|
cw_message.present?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def all_unsupported_files?
|
||||||
|
return if attachments.empty?
|
||||||
|
|
||||||
|
attachments_type = attachments.pluck(:type).uniq.first
|
||||||
|
unsupported_file_type?(attachments_type)
|
||||||
|
end
|
||||||
|
|
||||||
### Sample response
|
### Sample response
|
||||||
# {
|
# {
|
||||||
# "object": "instagram",
|
# "object": "instagram",
|
||||||
|
|
|
@ -2,7 +2,8 @@ class Messages::Messenger::MessageBuilder
|
||||||
include ::FileTypeHelper
|
include ::FileTypeHelper
|
||||||
|
|
||||||
def process_attachment(attachment)
|
def process_attachment(attachment)
|
||||||
return if attachment['type'].to_sym == :template
|
# This check handles very rare case if there are multiple files to attach with only one usupported file
|
||||||
|
return if unsupported_file_type?(attachment['type'])
|
||||||
|
|
||||||
attachment_obj = @message.attachments.new(attachment_params(attachment).except(:remote_file_url))
|
attachment_obj = @message.attachments.new(attachment_params(attachment).except(:remote_file_url))
|
||||||
attachment_obj.save!
|
attachment_obj.save!
|
||||||
|
@ -80,4 +81,10 @@ class Messages::Messenger::MessageBuilder
|
||||||
ChatwootExceptionTracker.new(e, account: @inbox.account).capture_exception
|
ChatwootExceptionTracker.new(e, account: @inbox.account).capture_exception
|
||||||
{}
|
{}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def unsupported_file_type?(attachment_type)
|
||||||
|
[:template, :unsupported_type].include? attachment_type.to_sym
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -2,8 +2,11 @@ class Api::V1::Accounts::Contacts::ContactInboxesController < Api::V1::Accounts:
|
||||||
before_action :ensure_inbox, only: [:create]
|
before_action :ensure_inbox, only: [:create]
|
||||||
|
|
||||||
def create
|
def create
|
||||||
source_id = params[:source_id] || SecureRandom.uuid
|
@contact_inbox = ContactInboxBuilder.new(
|
||||||
@contact_inbox = ContactInbox.create!(contact: @contact, inbox: @inbox, source_id: source_id)
|
contact: @contact,
|
||||||
|
inbox: @inbox,
|
||||||
|
source_id: params[:source_id]
|
||||||
|
).perform
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
|
@ -134,8 +134,11 @@ class Api::V1::Accounts::ContactsController < Api::V1::Accounts::BaseController
|
||||||
return if params[:inbox_id].blank?
|
return if params[:inbox_id].blank?
|
||||||
|
|
||||||
inbox = Current.account.inboxes.find(params[:inbox_id])
|
inbox = Current.account.inboxes.find(params[:inbox_id])
|
||||||
source_id = params[:source_id] || SecureRandom.uuid
|
ContactInboxBuilder.new(
|
||||||
ContactInbox.create!(contact: @contact, inbox: inbox, source_id: source_id)
|
contact: @contact,
|
||||||
|
inbox: inbox,
|
||||||
|
source_id: params[:source_id]
|
||||||
|
).perform
|
||||||
end
|
end
|
||||||
|
|
||||||
def permitted_params
|
def permitted_params
|
||||||
|
|
|
@ -3,7 +3,7 @@ class Api::V1::Accounts::ConversationsController < Api::V1::Accounts::BaseContro
|
||||||
include DateRangeHelper
|
include DateRangeHelper
|
||||||
|
|
||||||
before_action :conversation, except: [:index, :meta, :search, :create, :filter]
|
before_action :conversation, except: [:index, :meta, :search, :create, :filter]
|
||||||
before_action :contact_inbox, only: [:create]
|
before_action :inbox, :contact, :contact_inbox, only: [:create]
|
||||||
|
|
||||||
def index
|
def index
|
||||||
result = conversation_finder.perform
|
result = conversation_finder.perform
|
||||||
|
@ -109,22 +109,35 @@ class Api::V1::Accounts::ConversationsController < Api::V1::Accounts::BaseContro
|
||||||
authorize @conversation.inbox, :show?
|
authorize @conversation.inbox, :show?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def inbox
|
||||||
|
return if params[:inbox_id].blank?
|
||||||
|
|
||||||
|
@inbox = Current.account.inboxes.find(params[:inbox_id])
|
||||||
|
authorize @inbox, :show?
|
||||||
|
end
|
||||||
|
|
||||||
|
def contact
|
||||||
|
return if params[:contact_id].blank?
|
||||||
|
|
||||||
|
@contact = Current.account.contacts.find(params[:contact_id])
|
||||||
|
end
|
||||||
|
|
||||||
def contact_inbox
|
def contact_inbox
|
||||||
@contact_inbox = build_contact_inbox
|
@contact_inbox = build_contact_inbox
|
||||||
|
|
||||||
|
# fallback for the old case where we do look up only using source id
|
||||||
|
# In future we need to change this and make sure we do look up on combination of inbox_id and source_id
|
||||||
|
# and deprecate the support of passing only source_id as the param
|
||||||
@contact_inbox ||= ::ContactInbox.find_by!(source_id: params[:source_id])
|
@contact_inbox ||= ::ContactInbox.find_by!(source_id: params[:source_id])
|
||||||
authorize @contact_inbox.inbox, :show?
|
authorize @contact_inbox.inbox, :show?
|
||||||
end
|
end
|
||||||
|
|
||||||
def build_contact_inbox
|
def build_contact_inbox
|
||||||
return if params[:contact_id].blank? || params[:inbox_id].blank?
|
return if @inbox.blank? || @contact.blank?
|
||||||
|
|
||||||
inbox = Current.account.inboxes.find(params[:inbox_id])
|
|
||||||
authorize inbox, :show?
|
|
||||||
|
|
||||||
ContactInboxBuilder.new(
|
ContactInboxBuilder.new(
|
||||||
contact_id: params[:contact_id],
|
contact: @contact,
|
||||||
inbox_id: inbox.id,
|
inbox: @inbox,
|
||||||
source_id: params[:source_id]
|
source_id: params[:source_id]
|
||||||
).perform
|
).perform
|
||||||
end
|
end
|
||||||
|
|
|
@ -17,7 +17,8 @@ class Api::V1::Widget::ConversationsController < Api::V1::Widget::BaseController
|
||||||
@contact = ContactIdentifyAction.new(
|
@contact = ContactIdentifyAction.new(
|
||||||
contact: @contact,
|
contact: @contact,
|
||||||
params: { email: contact_email, phone_number: contact_phone_number, name: contact_name },
|
params: { email: contact_email, phone_number: contact_phone_number, name: contact_name },
|
||||||
retain_original_contact_name: true
|
retain_original_contact_name: true,
|
||||||
|
discard_invalid_attrs: true
|
||||||
).perform
|
).perform
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,8 @@ module RequestExceptionHandler
|
||||||
render_not_found_error('Resource could not be found')
|
render_not_found_error('Resource could not be found')
|
||||||
rescue Pundit::NotAuthorizedError
|
rescue Pundit::NotAuthorizedError
|
||||||
render_unauthorized('You are not authorized to do this action')
|
render_unauthorized('You are not authorized to do this action')
|
||||||
|
rescue ActionController::ParameterMissing => e
|
||||||
|
render_could_not_create_error(e.message)
|
||||||
ensure
|
ensure
|
||||||
# to address the thread variable leak issues in Puma/Thin webserver
|
# to address the thread variable leak issues in Puma/Thin webserver
|
||||||
Current.reset
|
Current.reset
|
||||||
|
|
|
@ -3,16 +3,12 @@ class Platform::Api::V1::AccountsController < PlatformController
|
||||||
@resource = Account.new(account_params)
|
@resource = Account.new(account_params)
|
||||||
@resource.save!
|
@resource.save!
|
||||||
@platform_app.platform_app_permissibles.find_or_create_by(permissible: @resource)
|
@platform_app.platform_app_permissibles.find_or_create_by(permissible: @resource)
|
||||||
render json: @resource
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def show
|
def show; end
|
||||||
render json: @resource
|
|
||||||
end
|
|
||||||
|
|
||||||
def update
|
def update
|
||||||
@resource.update!(account_params)
|
@resource.update!(account_params)
|
||||||
render json: @resource
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def destroy
|
def destroy
|
||||||
|
@ -27,6 +23,14 @@ class Platform::Api::V1::AccountsController < PlatformController
|
||||||
end
|
end
|
||||||
|
|
||||||
def account_params
|
def account_params
|
||||||
params.permit(:name, :locale)
|
if permitted_params[:enabled_features]
|
||||||
|
return permitted_params.except(:enabled_features).merge(selected_feature_flags: permitted_params[:enabled_features].map(&:to_sym))
|
||||||
|
end
|
||||||
|
|
||||||
|
permitted_params
|
||||||
|
end
|
||||||
|
|
||||||
|
def permitted_params
|
||||||
|
params.permit(:name, :locale, enabled_features: [], limits: {})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -4,7 +4,7 @@ class Public::Api::V1::Inboxes::ContactsController < Public::Api::V1::InboxesCon
|
||||||
|
|
||||||
def create
|
def create
|
||||||
source_id = params[:source_id] || SecureRandom.uuid
|
source_id = params[:source_id] || SecureRandom.uuid
|
||||||
@contact_inbox = ::ContactBuilder.new(
|
@contact_inbox = ::ContactInboxWithContactBuilder.new(
|
||||||
source_id: source_id,
|
source_id: source_id,
|
||||||
inbox: @inbox_channel.inbox,
|
inbox: @inbox_channel.inbox,
|
||||||
contact_attributes: permitted_params.except(:identifier, :identifier_hash)
|
contact_attributes: permitted_params.except(:identifier, :identifier_hash)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
class Public::Api::V1::Portals::ArticlesController < PublicController
|
class Public::Api::V1::Portals::ArticlesController < PublicController
|
||||||
before_action :ensure_custom_domain_request, only: [:show, :index]
|
before_action :ensure_custom_domain_request, only: [:show, :index]
|
||||||
before_action :portal
|
before_action :portal
|
||||||
before_action :set_category
|
before_action :set_category, except: [:index]
|
||||||
before_action :set_article, only: [:show]
|
before_action :set_article, only: [:show]
|
||||||
layout 'portal'
|
layout 'portal'
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ class Public::Api::V1::Portals::ArticlesController < PublicController
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_category
|
def set_category
|
||||||
@category = @portal.categories.find_by!(slug: params[:category_slug])
|
@category = @portal.categories.find_by!(slug: params[:category_slug]) if params[:category_slug].present?
|
||||||
end
|
end
|
||||||
|
|
||||||
def portal
|
def portal
|
||||||
|
|
|
@ -113,9 +113,22 @@ $default-button-height: 4.0rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.clear {
|
&.clear {
|
||||||
|
color: var(--w-700);
|
||||||
|
|
||||||
|
&.secondary {
|
||||||
|
color: var(--s-700)
|
||||||
|
}
|
||||||
|
|
||||||
|
&.success {
|
||||||
|
color: var(--g-700)
|
||||||
|
}
|
||||||
|
|
||||||
|
&.alert {
|
||||||
|
color: var(--r-700)
|
||||||
|
}
|
||||||
|
|
||||||
&.warning {
|
&.warning {
|
||||||
color: var(--y-600);
|
color: var(--y-700)
|
||||||
}
|
}
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
|
@ -146,6 +159,8 @@ $default-button-height: 4.0rem;
|
||||||
|
|
||||||
&.small {
|
&.small {
|
||||||
height: var(--space-large);
|
height: var(--space-large);
|
||||||
|
padding-bottom: var(--space-smaller);
|
||||||
|
padding-top: var(--space-smaller);
|
||||||
}
|
}
|
||||||
|
|
||||||
&.large {
|
&.large {
|
||||||
|
|
|
@ -14,15 +14,9 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.modal--close {
|
.modal--close {
|
||||||
border-radius: 50%;
|
|
||||||
color: $color-heading;
|
|
||||||
cursor: pointer;
|
|
||||||
font-size: $font-size-big;
|
|
||||||
line-height: $space-normal;
|
|
||||||
padding: $space-normal;
|
|
||||||
position: absolute;
|
position: absolute;
|
||||||
right: $space-micro;
|
right: $space-small;
|
||||||
top: $space-micro;
|
top: $space-small;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background: $color-background;
|
background: $color-background;
|
||||||
|
|
|
@ -7,9 +7,13 @@
|
||||||
@click="onBackDropClick"
|
@click="onBackDropClick"
|
||||||
>
|
>
|
||||||
<div :class="modalContainerClassName" @click.stop>
|
<div :class="modalContainerClassName" @click.stop>
|
||||||
<button class="modal--close" @click="close">
|
<woot-button
|
||||||
<fluent-icon icon="dismiss" />
|
color-scheme="secondary"
|
||||||
</button>
|
icon="dismiss"
|
||||||
|
variant="clear"
|
||||||
|
class="modal--close"
|
||||||
|
@click="close"
|
||||||
|
/>
|
||||||
<slot />
|
<slot />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -73,14 +73,14 @@ export default {
|
||||||
|
|
||||||
computed: {
|
computed: {
|
||||||
...mapGetters({
|
...mapGetters({
|
||||||
currentUser: 'getCurrentUser',
|
|
||||||
globalConfig: 'globalConfig/get',
|
|
||||||
isACustomBrandedInstance: 'globalConfig/isACustomBrandedInstance',
|
|
||||||
isOnChatwootCloud: 'globalConfig/isOnChatwootCloud',
|
|
||||||
inboxes: 'inboxes/getInboxes',
|
|
||||||
accountId: 'getCurrentAccountId',
|
accountId: 'getCurrentAccountId',
|
||||||
currentRole: 'getCurrentRole',
|
currentRole: 'getCurrentRole',
|
||||||
|
currentUser: 'getCurrentUser',
|
||||||
|
globalConfig: 'globalConfig/get',
|
||||||
|
inboxes: 'inboxes/getInboxes',
|
||||||
|
isACustomBrandedInstance: 'globalConfig/isACustomBrandedInstance',
|
||||||
isFeatureEnabledonAccount: 'accounts/isFeatureEnabledonAccount',
|
isFeatureEnabledonAccount: 'accounts/isFeatureEnabledonAccount',
|
||||||
|
isOnChatwootCloud: 'globalConfig/isOnChatwootCloud',
|
||||||
labels: 'labels/getLabelsOnSidebar',
|
labels: 'labels/getLabelsOnSidebar',
|
||||||
teams: 'teams/getMyTeams',
|
teams: 'teams/getMyTeams',
|
||||||
}),
|
}),
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import { FEATURE_FLAGS } from '../../../../featureFlags';
|
||||||
import { frontendURL } from '../../../../helper/URLHelper';
|
import { frontendURL } from '../../../../helper/URLHelper';
|
||||||
|
|
||||||
const settings = accountId => ({
|
const settings = accountId => ({
|
||||||
|
@ -38,12 +39,20 @@ const settings = accountId => ({
|
||||||
'settings_teams_new',
|
'settings_teams_new',
|
||||||
],
|
],
|
||||||
menuItems: [
|
menuItems: [
|
||||||
|
{
|
||||||
|
icon: 'briefcase',
|
||||||
|
label: 'ACCOUNT_SETTINGS',
|
||||||
|
hasSubMenu: false,
|
||||||
|
toState: frontendURL(`accounts/${accountId}/settings/general`),
|
||||||
|
toStateName: 'general_settings_index',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
icon: 'people',
|
icon: 'people',
|
||||||
label: 'AGENTS',
|
label: 'AGENTS',
|
||||||
hasSubMenu: false,
|
hasSubMenu: false,
|
||||||
toState: frontendURL(`accounts/${accountId}/settings/agents/list`),
|
toState: frontendURL(`accounts/${accountId}/settings/agents/list`),
|
||||||
toStateName: 'agent_list',
|
toStateName: 'agent_list',
|
||||||
|
featureFlag: FEATURE_FLAGS.AGENT_MANAGEMENT,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: 'people-team',
|
icon: 'people-team',
|
||||||
|
@ -51,6 +60,7 @@ const settings = accountId => ({
|
||||||
hasSubMenu: false,
|
hasSubMenu: false,
|
||||||
toState: frontendURL(`accounts/${accountId}/settings/teams/list`),
|
toState: frontendURL(`accounts/${accountId}/settings/teams/list`),
|
||||||
toStateName: 'settings_teams_list',
|
toStateName: 'settings_teams_list',
|
||||||
|
featureFlag: FEATURE_FLAGS.TEAM_MANAGEMENT,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: 'mail-inbox-all',
|
icon: 'mail-inbox-all',
|
||||||
|
@ -58,6 +68,7 @@ const settings = accountId => ({
|
||||||
hasSubMenu: false,
|
hasSubMenu: false,
|
||||||
toState: frontendURL(`accounts/${accountId}/settings/inboxes/list`),
|
toState: frontendURL(`accounts/${accountId}/settings/inboxes/list`),
|
||||||
toStateName: 'settings_inbox_list',
|
toStateName: 'settings_inbox_list',
|
||||||
|
featureFlag: FEATURE_FLAGS.INBOX_MANAGEMENT,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: 'tag',
|
icon: 'tag',
|
||||||
|
@ -65,6 +76,7 @@ const settings = accountId => ({
|
||||||
hasSubMenu: false,
|
hasSubMenu: false,
|
||||||
toState: frontendURL(`accounts/${accountId}/settings/labels/list`),
|
toState: frontendURL(`accounts/${accountId}/settings/labels/list`),
|
||||||
toStateName: 'labels_list',
|
toStateName: 'labels_list',
|
||||||
|
featureFlag: FEATURE_FLAGS.LABELS,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: 'code',
|
icon: 'code',
|
||||||
|
@ -74,6 +86,7 @@ const settings = accountId => ({
|
||||||
`accounts/${accountId}/settings/custom-attributes/list`
|
`accounts/${accountId}/settings/custom-attributes/list`
|
||||||
),
|
),
|
||||||
toStateName: 'attributes_list',
|
toStateName: 'attributes_list',
|
||||||
|
featureFlag: FEATURE_FLAGS.CUSTOM_ATTRIBUTES,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: 'automation',
|
icon: 'automation',
|
||||||
|
@ -82,6 +95,7 @@ const settings = accountId => ({
|
||||||
hasSubMenu: false,
|
hasSubMenu: false,
|
||||||
toState: frontendURL(`accounts/${accountId}/settings/automation/list`),
|
toState: frontendURL(`accounts/${accountId}/settings/automation/list`),
|
||||||
toStateName: 'automation_list',
|
toStateName: 'automation_list',
|
||||||
|
featureFlag: FEATURE_FLAGS.AUTOMATIONS,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: 'bot',
|
icon: 'bot',
|
||||||
|
@ -90,7 +104,7 @@ const settings = accountId => ({
|
||||||
hasSubMenu: false,
|
hasSubMenu: false,
|
||||||
toState: frontendURL(`accounts/${accountId}/settings/agent-bots`),
|
toState: frontendURL(`accounts/${accountId}/settings/agent-bots`),
|
||||||
toStateName: 'agent_bots',
|
toStateName: 'agent_bots',
|
||||||
featureFlagKey: 'agent_bots',
|
featureFlag: FEATURE_FLAGS.AGENT_BOTS,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: 'flash-settings',
|
icon: 'flash-settings',
|
||||||
|
@ -99,7 +113,7 @@ const settings = accountId => ({
|
||||||
toState: frontendURL(`accounts/${accountId}/settings/macros`),
|
toState: frontendURL(`accounts/${accountId}/settings/macros`),
|
||||||
toStateName: 'macros_wrapper',
|
toStateName: 'macros_wrapper',
|
||||||
beta: true,
|
beta: true,
|
||||||
featureFlagKey: 'macros',
|
featureFlag: FEATURE_FLAGS.MACROS,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: 'chat-multiple',
|
icon: 'chat-multiple',
|
||||||
|
@ -109,6 +123,7 @@ const settings = accountId => ({
|
||||||
`accounts/${accountId}/settings/canned-response/list`
|
`accounts/${accountId}/settings/canned-response/list`
|
||||||
),
|
),
|
||||||
toStateName: 'canned_list',
|
toStateName: 'canned_list',
|
||||||
|
featureFlag: FEATURE_FLAGS.CANNED_RESPONSES,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: 'flash-on',
|
icon: 'flash-on',
|
||||||
|
@ -116,6 +131,7 @@ const settings = accountId => ({
|
||||||
hasSubMenu: false,
|
hasSubMenu: false,
|
||||||
toState: frontendURL(`accounts/${accountId}/settings/integrations`),
|
toState: frontendURL(`accounts/${accountId}/settings/integrations`),
|
||||||
toStateName: 'settings_integrations',
|
toStateName: 'settings_integrations',
|
||||||
|
featureFlag: FEATURE_FLAGS.INTEGRATIONS,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: 'star-emphasis',
|
icon: 'star-emphasis',
|
||||||
|
@ -123,6 +139,7 @@ const settings = accountId => ({
|
||||||
hasSubMenu: false,
|
hasSubMenu: false,
|
||||||
toState: frontendURL(`accounts/${accountId}/settings/applications`),
|
toState: frontendURL(`accounts/${accountId}/settings/applications`),
|
||||||
toStateName: 'settings_applications',
|
toStateName: 'settings_applications',
|
||||||
|
featureFlag: FEATURE_FLAGS.INTEGRATIONS,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: 'credit-card-person',
|
icon: 'credit-card-person',
|
||||||
|
@ -132,13 +149,6 @@ const settings = accountId => ({
|
||||||
toStateName: 'billing_settings_index',
|
toStateName: 'billing_settings_index',
|
||||||
showOnlyOnCloud: true,
|
showOnlyOnCloud: true,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
icon: 'settings',
|
|
||||||
label: 'ACCOUNT_SETTINGS',
|
|
||||||
hasSubMenu: false,
|
|
||||||
toState: frontendURL(`accounts/${accountId}/settings/general`),
|
|
||||||
toStateName: 'general_settings_index',
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,8 @@
|
||||||
import { frontendURL } from '../../../helper/URLHelper';
|
import { frontendURL } from '../../../helper/URLHelper';
|
||||||
import SecondaryNavItem from './SecondaryNavItem.vue';
|
import SecondaryNavItem from './SecondaryNavItem.vue';
|
||||||
import AccountContext from './AccountContext.vue';
|
import AccountContext from './AccountContext.vue';
|
||||||
|
import { mapGetters } from 'vuex';
|
||||||
|
import { FEATURE_FLAGS } from '../../../featureFlags';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
|
@ -61,6 +63,9 @@ export default {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
...mapGetters({
|
||||||
|
isFeatureEnabledonAccount: 'accounts/isFeatureEnabledonAccount',
|
||||||
|
}),
|
||||||
hasSecondaryMenu() {
|
hasSecondaryMenu() {
|
||||||
return this.menuConfig.menuItems && this.menuConfig.menuItems.length;
|
return this.menuConfig.menuItems && this.menuConfig.menuItems.length;
|
||||||
},
|
},
|
||||||
|
@ -89,7 +94,7 @@ export default {
|
||||||
icon: 'folder',
|
icon: 'folder',
|
||||||
label: 'INBOXES',
|
label: 'INBOXES',
|
||||||
hasSubMenu: true,
|
hasSubMenu: true,
|
||||||
newLink: true,
|
newLink: this.showNewLink(FEATURE_FLAGS.INBOX_MANAGEMENT),
|
||||||
newLinkTag: 'NEW_INBOX',
|
newLinkTag: 'NEW_INBOX',
|
||||||
key: 'inbox',
|
key: 'inbox',
|
||||||
toState: frontendURL(`accounts/${this.accountId}/settings/inboxes/new`),
|
toState: frontendURL(`accounts/${this.accountId}/settings/inboxes/new`),
|
||||||
|
@ -117,7 +122,7 @@ export default {
|
||||||
icon: 'number-symbol',
|
icon: 'number-symbol',
|
||||||
label: 'LABELS',
|
label: 'LABELS',
|
||||||
hasSubMenu: true,
|
hasSubMenu: true,
|
||||||
newLink: true,
|
newLink: this.showNewLink(FEATURE_FLAGS.TEAM_MANAGEMENT),
|
||||||
newLinkTag: 'NEW_LABEL',
|
newLinkTag: 'NEW_LABEL',
|
||||||
key: 'label',
|
key: 'label',
|
||||||
toState: frontendURL(`accounts/${this.accountId}/settings/labels`),
|
toState: frontendURL(`accounts/${this.accountId}/settings/labels`),
|
||||||
|
@ -141,7 +146,7 @@ export default {
|
||||||
label: 'TAGGED_WITH',
|
label: 'TAGGED_WITH',
|
||||||
hasSubMenu: true,
|
hasSubMenu: true,
|
||||||
key: 'label',
|
key: 'label',
|
||||||
newLink: true,
|
newLink: this.showNewLink(FEATURE_FLAGS.TEAM_MANAGEMENT),
|
||||||
newLinkTag: 'NEW_LABEL',
|
newLinkTag: 'NEW_LABEL',
|
||||||
toState: frontendURL(`accounts/${this.accountId}/settings/labels`),
|
toState: frontendURL(`accounts/${this.accountId}/settings/labels`),
|
||||||
toStateName: 'labels_list',
|
toStateName: 'labels_list',
|
||||||
|
@ -163,7 +168,7 @@ export default {
|
||||||
icon: 'people-team',
|
icon: 'people-team',
|
||||||
label: 'TEAMS',
|
label: 'TEAMS',
|
||||||
hasSubMenu: true,
|
hasSubMenu: true,
|
||||||
newLink: true,
|
newLink: this.showNewLink(FEATURE_FLAGS.TEAM_MANAGEMENT),
|
||||||
newLinkTag: 'NEW_TEAM',
|
newLinkTag: 'NEW_TEAM',
|
||||||
key: 'team',
|
key: 'team',
|
||||||
toState: frontendURL(`accounts/${this.accountId}/settings/teams/new`),
|
toState: frontendURL(`accounts/${this.accountId}/settings/teams/new`),
|
||||||
|
@ -238,6 +243,9 @@ export default {
|
||||||
toggleAccountModal() {
|
toggleAccountModal() {
|
||||||
this.$emit('toggle-accounts');
|
this.$emit('toggle-accounts');
|
||||||
},
|
},
|
||||||
|
showNewLink(featureFlag) {
|
||||||
|
return this.isFeatureEnabledonAccount(this.accountId, featureFlag);
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -123,12 +123,12 @@ export default {
|
||||||
return !!this.menuItem.children;
|
return !!this.menuItem.children;
|
||||||
},
|
},
|
||||||
isMenuItemVisible() {
|
isMenuItemVisible() {
|
||||||
if (!this.menuItem.featureFlagKey) {
|
if (!this.menuItem.featureFlag) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return this.isFeatureEnabledonAccount(
|
return this.isFeatureEnabledonAccount(
|
||||||
this.accountId,
|
this.accountId,
|
||||||
this.menuItem.featureFlagKey
|
this.menuItem.featureFlag
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
isInboxConversation() {
|
isInboxConversation() {
|
||||||
|
@ -217,7 +217,7 @@ export default {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
showItem(item) {
|
showItem(item) {
|
||||||
return this.isAdmin && item.newLink !== undefined;
|
return this.isAdmin && !!item.newLink;
|
||||||
},
|
},
|
||||||
onClickOpen() {
|
onClickOpen() {
|
||||||
this.$emit('open');
|
this.$emit('open');
|
||||||
|
@ -321,7 +321,7 @@ export default {
|
||||||
.beta {
|
.beta {
|
||||||
padding-right: var(--space-smaller) !important;
|
padding-right: var(--space-smaller) !important;
|
||||||
padding-left: var(--space-smaller) !important;
|
padding-left: var(--space-smaller) !important;
|
||||||
margin-left: var(--space-half) !important;
|
margin-left: var(--space-smaller) !important;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
font-size: var(--font-size-micro);
|
font-size: var(--font-size-micro);
|
||||||
font-weight: var(--font-weight-medium);
|
font-weight: var(--font-weight-medium);
|
||||||
|
|
|
@ -1,8 +1,5 @@
|
||||||
<template>
|
<template>
|
||||||
<div
|
<div class="filter" :class="actionInputStyles">
|
||||||
class="filter"
|
|
||||||
:class="{ error: v.action_params.$dirty && v.action_params.$error }"
|
|
||||||
>
|
|
||||||
<div class="filter-inputs">
|
<div class="filter-inputs">
|
||||||
<select
|
<select
|
||||||
v-model="action_name"
|
v-model="action_name"
|
||||||
|
@ -60,6 +57,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<woot-button
|
<woot-button
|
||||||
|
v-if="!isMacro"
|
||||||
icon="dismiss"
|
icon="dismiss"
|
||||||
variant="clear"
|
variant="clear"
|
||||||
color-scheme="secondary"
|
color-scheme="secondary"
|
||||||
|
@ -120,6 +118,10 @@ export default {
|
||||||
type: String,
|
type: String,
|
||||||
default: '',
|
default: '',
|
||||||
},
|
},
|
||||||
|
isMacro: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
action_name: {
|
action_name: {
|
||||||
|
@ -146,6 +148,12 @@ export default {
|
||||||
return this.actionTypes.find(action => action.key === this.action_name)
|
return this.actionTypes.find(action => action.key === this.action_name)
|
||||||
.inputType;
|
.inputType;
|
||||||
},
|
},
|
||||||
|
actionInputStyles() {
|
||||||
|
return {
|
||||||
|
error: this.v.action_params.$dirty && this.v.action_params.$error,
|
||||||
|
'is-a-macro': this.isMacro,
|
||||||
|
};
|
||||||
|
},
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
removeAction() {
|
removeAction() {
|
||||||
|
@ -165,6 +173,18 @@ export default {
|
||||||
border: 1px solid var(--color-border);
|
border: 1px solid var(--color-border);
|
||||||
border-radius: var(--border-radius-medium);
|
border-radius: var(--border-radius-medium);
|
||||||
margin-bottom: var(--space-small);
|
margin-bottom: var(--space-small);
|
||||||
|
|
||||||
|
&.is-a-macro {
|
||||||
|
margin-bottom: 0;
|
||||||
|
background: var(--white);
|
||||||
|
padding: var(--space-zero);
|
||||||
|
border: unset;
|
||||||
|
border-radius: unset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.no-margin-bottom {
|
||||||
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.filter.error {
|
.filter.error {
|
||||||
|
|
|
@ -11,7 +11,6 @@
|
||||||
size="small"
|
size="small"
|
||||||
@click="toggleEmojiPicker"
|
@click="toggleEmojiPicker"
|
||||||
/>
|
/>
|
||||||
<!-- ensure the same validations for attachment types are implemented in backend models as well -->
|
|
||||||
<file-upload
|
<file-upload
|
||||||
ref="upload"
|
ref="upload"
|
||||||
v-tooltip.top-end="$t('CONVERSATION.REPLYBOX.TIP_ATTACH_ICON')"
|
v-tooltip.top-end="$t('CONVERSATION.REPLYBOX.TIP_ATTACH_ICON')"
|
||||||
|
@ -47,6 +46,16 @@
|
||||||
:title="$t('CONVERSATION.REPLYBOX.TIP_AUDIORECORDER_ICON')"
|
:title="$t('CONVERSATION.REPLYBOX.TIP_AUDIORECORDER_ICON')"
|
||||||
@click="toggleAudioRecorder"
|
@click="toggleAudioRecorder"
|
||||||
/>
|
/>
|
||||||
|
<woot-button
|
||||||
|
v-if="showEditorToggle"
|
||||||
|
v-tooltip.top-end="$t('CONVERSATION.REPLYBOX.TIP_FORMAT_ICON')"
|
||||||
|
icon="quote"
|
||||||
|
emoji="🖊️"
|
||||||
|
color-scheme="secondary"
|
||||||
|
variant="smooth"
|
||||||
|
size="small"
|
||||||
|
@click="$emit('toggle-editor')"
|
||||||
|
/>
|
||||||
<woot-button
|
<woot-button
|
||||||
v-if="showAudioPlayStopButton"
|
v-if="showAudioPlayStopButton"
|
||||||
:icon="audioRecorderPlayStopIcon"
|
:icon="audioRecorderPlayStopIcon"
|
||||||
|
@ -110,13 +119,15 @@ import { hasPressedAltAndAKey } from 'shared/helpers/KeyboardHelpers';
|
||||||
import eventListenerMixins from 'shared/mixins/eventListenerMixins';
|
import eventListenerMixins from 'shared/mixins/eventListenerMixins';
|
||||||
import uiSettingsMixin from 'dashboard/mixins/uiSettings';
|
import uiSettingsMixin from 'dashboard/mixins/uiSettings';
|
||||||
import inboxMixin from 'shared/mixins/inboxMixin';
|
import inboxMixin from 'shared/mixins/inboxMixin';
|
||||||
|
import { FEATURE_FLAGS } from 'dashboard/featureFlags';
|
||||||
import {
|
import {
|
||||||
ALLOWED_FILE_TYPES,
|
ALLOWED_FILE_TYPES,
|
||||||
ALLOWED_FILE_TYPES_FOR_TWILIO_WHATSAPP,
|
ALLOWED_FILE_TYPES_FOR_TWILIO_WHATSAPP,
|
||||||
} from 'shared/constants/messages';
|
} from 'shared/constants/messages';
|
||||||
|
|
||||||
import { REPLY_EDITOR_MODES } from './constants';
|
import { REPLY_EDITOR_MODES } from './constants';
|
||||||
|
import { mapGetters } from 'vuex';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'ReplyBottomPanel',
|
name: 'ReplyBottomPanel',
|
||||||
components: { FileUpload },
|
components: { FileUpload },
|
||||||
|
@ -182,7 +193,7 @@ export default {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
isFormatMode: {
|
showEditorToggle: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
|
@ -200,6 +211,10 @@ export default {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
...mapGetters({
|
||||||
|
accountId: 'getCurrentAccountId',
|
||||||
|
isFeatureEnabledonAccount: 'accounts/isFeatureEnabledonAccount',
|
||||||
|
}),
|
||||||
isNote() {
|
isNote() {
|
||||||
return this.mode === REPLY_EDITOR_MODES.NOTE;
|
return this.mode === REPLY_EDITOR_MODES.NOTE;
|
||||||
},
|
},
|
||||||
|
@ -217,7 +232,12 @@ export default {
|
||||||
return this.showFileUpload || this.isNote;
|
return this.showFileUpload || this.isNote;
|
||||||
},
|
},
|
||||||
showAudioRecorderButton() {
|
showAudioRecorderButton() {
|
||||||
return this.showAudioRecorder;
|
return (
|
||||||
|
this.isFeatureEnabledonAccount(
|
||||||
|
this.accountId,
|
||||||
|
FEATURE_FLAGS.VOICE_RECORDER
|
||||||
|
) && this.showAudioRecorder
|
||||||
|
);
|
||||||
},
|
},
|
||||||
showAudioPlayStopButton() {
|
showAudioPlayStopButton() {
|
||||||
return this.showAudioRecorder && this.isRecordingAudio;
|
return this.showAudioRecorder && this.isRecordingAudio;
|
||||||
|
|
|
@ -420,6 +420,8 @@ export default {
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
.wrap {
|
.wrap {
|
||||||
> .bubble {
|
> .bubble {
|
||||||
|
min-width: 128px;
|
||||||
|
|
||||||
&.is-image,
|
&.is-image,
|
||||||
&.is-video {
|
&.is-video {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
|
|
@ -434,7 +434,7 @@ export default {
|
||||||
|
|
||||||
&::before {
|
&::before {
|
||||||
transform: rotate(0deg);
|
transform: rotate(0deg);
|
||||||
left: var(--space-half);
|
left: var(--space-smaller);
|
||||||
bottom: var(--space-minus-slab);
|
bottom: var(--space-minus-slab);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -109,10 +109,11 @@
|
||||||
:recording-audio-state="recordingAudioState"
|
:recording-audio-state="recordingAudioState"
|
||||||
:is-recording-audio="isRecordingAudio"
|
:is-recording-audio="isRecordingAudio"
|
||||||
:is-on-private-note="isOnPrivateNote"
|
:is-on-private-note="isOnPrivateNote"
|
||||||
:is-format-mode="showRichContentEditor"
|
:show-editor-toggle="isAPIInbox && !isOnPrivateNote"
|
||||||
:enable-multiple-file-upload="enableMultipleFileUpload"
|
:enable-multiple-file-upload="enableMultipleFileUpload"
|
||||||
:has-whatsapp-templates="hasWhatsappTemplates"
|
:has-whatsapp-templates="hasWhatsappTemplates"
|
||||||
@selectWhatsappTemplate="openWhatsappTemplateModal"
|
@selectWhatsappTemplate="openWhatsappTemplateModal"
|
||||||
|
@toggle-editor="toggleRichContentEditor"
|
||||||
/>
|
/>
|
||||||
<whatsapp-templates
|
<whatsapp-templates
|
||||||
:inbox-id="inbox.id"
|
:inbox-id="inbox.id"
|
||||||
|
@ -230,6 +231,13 @@ export default {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.isAPIInbox) {
|
||||||
|
const {
|
||||||
|
display_rich_content_editor: displayRichContentEditor = false,
|
||||||
|
} = this.uiSettings;
|
||||||
|
return displayRichContentEditor;
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
assignedAgent: {
|
assignedAgent: {
|
||||||
|
@ -365,7 +373,7 @@ export default {
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
isRichEditorEnabled() {
|
isRichEditorEnabled() {
|
||||||
return this.isAWebWidgetInbox || this.isAnEmailChannel || this.isAPIInbox;
|
return this.isAWebWidgetInbox || this.isAnEmailChannel;
|
||||||
},
|
},
|
||||||
showAudioRecorder() {
|
showAudioRecorder() {
|
||||||
return !this.isOnPrivateNote && this.showFileUpload;
|
return !this.isOnPrivateNote && this.showFileUpload;
|
||||||
|
@ -511,6 +519,11 @@ export default {
|
||||||
document.removeEventListener('keydown', this.handleKeyEvents);
|
document.removeEventListener('keydown', this.handleKeyEvents);
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
toggleRichContentEditor() {
|
||||||
|
this.updateUISettings({
|
||||||
|
display_rich_content_editor: !this.showRichContentEditor,
|
||||||
|
});
|
||||||
|
},
|
||||||
getSavedDraftMessages() {
|
getSavedDraftMessages() {
|
||||||
return LocalStorage.get(LOCAL_STORAGE_KEYS.DRAFT_MESSAGES) || {};
|
return LocalStorage.get(LOCAL_STORAGE_KEYS.DRAFT_MESSAGES) || {};
|
||||||
},
|
},
|
||||||
|
@ -970,7 +983,7 @@ export default {
|
||||||
|
|
||||||
&::before {
|
&::before {
|
||||||
transform: rotate(0deg);
|
transform: rotate(0deg);
|
||||||
left: var(--space-half);
|
left: var(--space-smaller);
|
||||||
bottom: var(--space-minus-slab);
|
bottom: var(--space-minus-slab);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,10 @@
|
||||||
@click="snoozeConversation(option.snoozedUntil)"
|
@click="snoozeConversation(option.snoozedUntil)"
|
||||||
/>
|
/>
|
||||||
</menu-item-with-submenu>
|
</menu-item-with-submenu>
|
||||||
<menu-item-with-submenu :option="labelMenuConfig">
|
<menu-item-with-submenu
|
||||||
|
:option="labelMenuConfig"
|
||||||
|
:sub-menu-available="!!labels.length"
|
||||||
|
>
|
||||||
<template>
|
<template>
|
||||||
<menu-item
|
<menu-item
|
||||||
v-for="label in labels"
|
v-for="label in labels"
|
||||||
|
@ -28,7 +31,10 @@
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
</menu-item-with-submenu>
|
</menu-item-with-submenu>
|
||||||
<menu-item-with-submenu :option="agentMenuConfig">
|
<menu-item-with-submenu
|
||||||
|
:option="agentMenuConfig"
|
||||||
|
:sub-menu-available="!!assignableAgents.length"
|
||||||
|
>
|
||||||
<agent-loading-placeholder v-if="assignableAgentsUiFlags.isFetching" />
|
<agent-loading-placeholder v-if="assignableAgentsUiFlags.isFetching" />
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<menu-item
|
<menu-item
|
||||||
|
@ -40,7 +46,10 @@
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
</menu-item-with-submenu>
|
</menu-item-with-submenu>
|
||||||
<menu-item-with-submenu :option="teamMenuConfig">
|
<menu-item-with-submenu
|
||||||
|
:option="teamMenuConfig"
|
||||||
|
:sub-menu-available="!!teams.length"
|
||||||
|
>
|
||||||
<menu-item
|
<menu-item
|
||||||
v-for="team in teams"
|
v-for="team in teams"
|
||||||
:key="team.id"
|
:key="team.id"
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
size="20px"
|
size="20px"
|
||||||
class="agent-thumbnail"
|
class="agent-thumbnail"
|
||||||
/>
|
/>
|
||||||
<p class="menu-label truncate-text">{{ option.label }}</p>
|
<p class="menu-label text-truncate">{{ option.label }}</p>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -50,7 +50,6 @@ export default {
|
||||||
padding: var(--space-smaller);
|
padding: var(--space-smaller);
|
||||||
border-radius: var(--border-radius-small);
|
border-radius: var(--border-radius-small);
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|
||||||
.menu-label {
|
.menu-label {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
font-size: var(--font-size-mini);
|
font-size: var(--font-size-mini);
|
||||||
|
|
|
@ -1,11 +1,14 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="menu-with-submenu flex-between">
|
<div
|
||||||
|
class="menu-with-submenu flex-between"
|
||||||
|
:class="{ disabled: !subMenuAvailable }"
|
||||||
|
>
|
||||||
<div class="menu-left">
|
<div class="menu-left">
|
||||||
<fluent-icon :icon="option.icon" size="14" class="menu-icon" />
|
<fluent-icon :icon="option.icon" size="14" class="menu-icon" />
|
||||||
<p class="menu-label">{{ option.label }}</p>
|
<p class="menu-label">{{ option.label }}</p>
|
||||||
</div>
|
</div>
|
||||||
<fluent-icon icon="chevron-right" size="12" />
|
<fluent-icon icon="chevron-right" size="12" />
|
||||||
<div class="submenu">
|
<div v-if="subMenuAvailable" class="submenu">
|
||||||
<slot />
|
<slot />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -18,6 +21,10 @@ export default {
|
||||||
type: Object,
|
type: Object,
|
||||||
default: () => {},
|
default: () => {},
|
||||||
},
|
},
|
||||||
|
subMenuAvailable: {
|
||||||
|
type: Boolean,
|
||||||
|
default: true,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
@ -55,6 +62,11 @@ export default {
|
||||||
left: 100%;
|
left: 100%;
|
||||||
top: 0;
|
top: 0;
|
||||||
display: none;
|
display: none;
|
||||||
|
min-height: min-content;
|
||||||
|
max-height: var(--space-giga);
|
||||||
|
overflow-y: auto;
|
||||||
|
// Need this because Firefox adds a horizontal scrollbar, if a text is truncated inside.
|
||||||
|
overflow-x: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
|
@ -73,5 +85,10 @@ export default {
|
||||||
clip-path: polygon(100% 0, 0% 0%, 100% 100%);
|
clip-path: polygon(100% 0, 0% 0%, 100% 100%);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.disabled {
|
||||||
|
opacity: 50%;
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -181,7 +181,7 @@ export default {
|
||||||
color: var(--y-700);
|
color: var(--y-700);
|
||||||
font-size: var(--font-size-mini);
|
font-size: var(--font-size-mini);
|
||||||
margin-top: var(--space-small);
|
margin-top: var(--space-small);
|
||||||
padding: var(--space-half) var(--space-one);
|
padding: var(--space-smaller) var(--space-small);
|
||||||
}
|
}
|
||||||
|
|
||||||
.popover-animation-enter-active,
|
.popover-animation-enter-active,
|
||||||
|
|
13
app/javascript/dashboard/featureFlags.js
Normal file
13
app/javascript/dashboard/featureFlags.js
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
export const FEATURE_FLAGS = {
|
||||||
|
AGENT_BOTS: 'agent_bots',
|
||||||
|
AGENT_MANAGEMENT: 'agent_management',
|
||||||
|
AUTOMATIONS: 'automations',
|
||||||
|
CANNED_RESPONSES: 'canned_responses',
|
||||||
|
CUSTOM_ATTRIBUTES: 'custom_attributes',
|
||||||
|
INBOX_MANAGEMENT: 'inbox_management',
|
||||||
|
INTEGRATIONS: 'integrations',
|
||||||
|
LABELS: 'labels',
|
||||||
|
MACROS: 'macros',
|
||||||
|
TEAM_MANAGEMENT: 'team_management',
|
||||||
|
VOICE_RECORDER: 'voice_recorder',
|
||||||
|
};
|
|
@ -25,6 +25,7 @@ class ActionCableConnector extends BaseActionCableConnector {
|
||||||
'notification.created': this.onNotificationCreated,
|
'notification.created': this.onNotificationCreated,
|
||||||
'first.reply.created': this.onFirstReplyCreated,
|
'first.reply.created': this.onFirstReplyCreated,
|
||||||
'conversation.read': this.onConversationRead,
|
'conversation.read': this.onConversationRead,
|
||||||
|
'conversation.updated': this.onConversationUpdated,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,6 +86,11 @@ class ActionCableConnector extends BaseActionCableConnector {
|
||||||
this.fetchConversationStats();
|
this.fetchConversationStats();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
onConversationUpdated = data => {
|
||||||
|
this.app.$store.dispatch('updateConversation', data);
|
||||||
|
this.fetchConversationStats();
|
||||||
|
};
|
||||||
|
|
||||||
onTypingOn = ({ conversation, user }) => {
|
onTypingOn = ({ conversation, user }) => {
|
||||||
const conversationId = conversation.id;
|
const conversationId = conversation.id;
|
||||||
|
|
||||||
|
|
71
app/javascript/dashboard/helper/specs/macrosFixtures.js
Normal file
71
app/javascript/dashboard/helper/specs/macrosFixtures.js
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
export const teams = [
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
name: '⚙️ sales team',
|
||||||
|
description: 'This is our internal sales team',
|
||||||
|
allow_auto_assign: true,
|
||||||
|
account_id: 1,
|
||||||
|
is_member: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 2,
|
||||||
|
name: '🤷♂️ fayaz',
|
||||||
|
description: 'Test',
|
||||||
|
allow_auto_assign: true,
|
||||||
|
account_id: 1,
|
||||||
|
is_member: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 3,
|
||||||
|
name: '🇮🇳 apac sales',
|
||||||
|
description: 'Sales team for France Territory',
|
||||||
|
allow_auto_assign: true,
|
||||||
|
account_id: 1,
|
||||||
|
is_member: true,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
export const labels = [
|
||||||
|
{
|
||||||
|
id: 6,
|
||||||
|
title: 'sales',
|
||||||
|
description: 'sales team',
|
||||||
|
color: '#8EA20F',
|
||||||
|
show_on_sidebar: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 2,
|
||||||
|
title: 'billing',
|
||||||
|
description: 'billing',
|
||||||
|
color: '#4077DA',
|
||||||
|
show_on_sidebar: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
title: 'snoozed',
|
||||||
|
description: 'Items marked for later',
|
||||||
|
color: '#D12F42',
|
||||||
|
show_on_sidebar: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 5,
|
||||||
|
title: 'mobile-app',
|
||||||
|
description: 'tech team',
|
||||||
|
color: '#2DB1CC',
|
||||||
|
show_on_sidebar: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 14,
|
||||||
|
title: 'human-resources-department-with-long-title',
|
||||||
|
description: 'Test',
|
||||||
|
color: '#FF6E09',
|
||||||
|
show_on_sidebar: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 22,
|
||||||
|
title: 'priority',
|
||||||
|
description: 'For important sales leads',
|
||||||
|
color: '#7E7CED',
|
||||||
|
show_on_sidebar: true,
|
||||||
|
},
|
||||||
|
];
|
17
app/javascript/dashboard/helper/specs/macrosHelper.spec.js
Normal file
17
app/javascript/dashboard/helper/specs/macrosHelper.spec.js
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
import { emptyMacro } from '../../routes/dashboard/settings/macros/macroHelper';
|
||||||
|
|
||||||
|
describe('#emptyMacro', () => {
|
||||||
|
const defaultMacro = {
|
||||||
|
name: '',
|
||||||
|
actions: [
|
||||||
|
{
|
||||||
|
action_name: 'assign_team',
|
||||||
|
action_params: [],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
visibility: 'global',
|
||||||
|
};
|
||||||
|
it('returns the default macro', () => {
|
||||||
|
expect(emptyMacro).toEqual(defaultMacro);
|
||||||
|
});
|
||||||
|
});
|
5
app/javascript/dashboard/i18n/locale/ar/agentBots.json
Normal file
5
app/javascript/dashboard/i18n/locale/ar/agentBots.json
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"AGENT_BOTS": {
|
||||||
|
"HEADER": "Bots"
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,9 +2,11 @@
|
||||||
"BULK_ACTION": {
|
"BULK_ACTION": {
|
||||||
"CONVERSATIONS_SELECTED": "%{conversationCount} المحادثات المحددة",
|
"CONVERSATIONS_SELECTED": "%{conversationCount} المحادثات المحددة",
|
||||||
"AGENT_SELECT_LABEL": "اختر وكيل",
|
"AGENT_SELECT_LABEL": "اختر وكيل",
|
||||||
"ASSIGN_CONFIRMATION_LABEL": "هل أنت متأكد من أنك تريد تعيين %{conversationCount} %{conversationLabel} إلى",
|
"ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign %{conversationCount} %{conversationLabel} to",
|
||||||
|
"UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign %{conversationCount} %{conversationLabel}?",
|
||||||
"GO_BACK_LABEL": "العودة للخلف",
|
"GO_BACK_LABEL": "العودة للخلف",
|
||||||
"ASSIGN_LABEL": "تكليف",
|
"ASSIGN_LABEL": "تكليف",
|
||||||
|
"YES": "نعم",
|
||||||
"ASSIGN_AGENT_TOOLTIP": "إسناد وكيل",
|
"ASSIGN_AGENT_TOOLTIP": "إسناد وكيل",
|
||||||
"ASSIGN_SUCCESFUL": "تم تعيين المحادثات بنجاح",
|
"ASSIGN_SUCCESFUL": "تم تعيين المحادثات بنجاح",
|
||||||
"ASSIGN_FAILED": "فشل في تعيين المحادثات، الرجاء المحاولة مرة أخرى",
|
"ASSIGN_FAILED": "فشل في تعيين المحادثات، الرجاء المحاولة مرة أخرى",
|
||||||
|
|
|
@ -306,7 +306,7 @@
|
||||||
"PUBLISH_ARTICLE": {
|
"PUBLISH_ARTICLE": {
|
||||||
"API": {
|
"API": {
|
||||||
"ERROR": "حدث خطأ أثناء نشر المقالة",
|
"ERROR": "حدث خطأ أثناء نشر المقالة",
|
||||||
"SUCCESS": "تم نشر المقالة بنجاح"
|
"SUCCESS": "Article published successfully"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ARCHIVE_ARTICLE": {
|
"ARCHIVE_ARTICLE": {
|
||||||
|
|
|
@ -239,7 +239,9 @@
|
||||||
},
|
},
|
||||||
"API_CALLBACK": {
|
"API_CALLBACK": {
|
||||||
"TITLE": "عنوان Callback URL",
|
"TITLE": "عنوان Callback URL",
|
||||||
"SUBTITLE": "يجب عليك تكوين URL webhook في بوابة مطور فيسبوك مع عنوان URL المذكور هنا."
|
"SUBTITLE": "You have to configure the webhook URL and the verification token in the Facebook Developer portal with the values shown below.",
|
||||||
|
"WEBHOOK_URL": "رابط Webhook",
|
||||||
|
"WEBHOOK_VERIFICATION_TOKEN": "Webhook Verification Token"
|
||||||
},
|
},
|
||||||
"SUBMIT_BUTTON": "إنشاء قناة واتساب",
|
"SUBMIT_BUTTON": "إنشاء قناة واتساب",
|
||||||
"API": {
|
"API": {
|
||||||
|
@ -357,7 +359,7 @@
|
||||||
},
|
},
|
||||||
"FINISH": {
|
"FINISH": {
|
||||||
"TITLE": "أصبحت قناة التواصل جاهزة الآن!",
|
"TITLE": "أصبحت قناة التواصل جاهزة الآن!",
|
||||||
"MESSAGE": "يمكنك الآن التواصل مع عملائك من خلال قناتك الجديدة ",
|
"MESSAGE": "يمكنك الآن التواصل مع عملائك من خلال قناتك الجديدة",
|
||||||
"BUTTON_TEXT": "خذني إلى هناك",
|
"BUTTON_TEXT": "خذني إلى هناك",
|
||||||
"MORE_SETTINGS": "المزيد من الإعدادات",
|
"MORE_SETTINGS": "المزيد من الإعدادات",
|
||||||
"WEBSITE_SUCCESS": "لقد انتهيت بنجاح من إنشاء قناة دردشة مباشرة لموقعك. انسخ الرمز الموضح أدناه وقم بإضافته إلى موقع الويب الخاص بك. في المرة القادمة التي يستخدم فيها العميل الدردشة المباشرة، ستظهر المحادثة تلقائياً على صندوق الوارد الخاص بك."
|
"WEBSITE_SUCCESS": "لقد انتهيت بنجاح من إنشاء قناة دردشة مباشرة لموقعك. انسخ الرمز الموضح أدناه وقم بإضافته إلى موقع الويب الخاص بك. في المرة القادمة التي يستخدم فيها العميل الدردشة المباشرة، ستظهر المحادثة تلقائياً على صندوق الوارد الخاص بك."
|
||||||
|
|
5
app/javascript/dashboard/i18n/locale/ar/macros.json
Normal file
5
app/javascript/dashboard/i18n/locale/ar/macros.json
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"MACROS": {
|
||||||
|
"HEADER": "Macros"
|
||||||
|
}
|
||||||
|
}
|
|
@ -179,6 +179,7 @@
|
||||||
"CONTACTS": "جهات الاتصال",
|
"CONTACTS": "جهات الاتصال",
|
||||||
"HOME": "الرئيسية",
|
"HOME": "الرئيسية",
|
||||||
"AGENTS": "موظف الدعم",
|
"AGENTS": "موظف الدعم",
|
||||||
|
"AGENT_BOTS": "Bots",
|
||||||
"INBOXES": "قنوات التواصل",
|
"INBOXES": "قنوات التواصل",
|
||||||
"NOTIFICATIONS": "الإشعارات",
|
"NOTIFICATIONS": "الإشعارات",
|
||||||
"CANNED_RESPONSES": "الردود السريعة",
|
"CANNED_RESPONSES": "الردود السريعة",
|
||||||
|
@ -189,6 +190,7 @@
|
||||||
"LABELS": "الوسوم",
|
"LABELS": "الوسوم",
|
||||||
"CUSTOM_ATTRIBUTES": "سمات مخصصة",
|
"CUSTOM_ATTRIBUTES": "سمات مخصصة",
|
||||||
"AUTOMATION": "الأتمتة",
|
"AUTOMATION": "الأتمتة",
|
||||||
|
"MACROS": "Macros",
|
||||||
"TEAMS": "الفرق",
|
"TEAMS": "الفرق",
|
||||||
"BILLING": "الفواتير",
|
"BILLING": "الفواتير",
|
||||||
"CUSTOM_VIEWS_FOLDER": "المجلدات",
|
"CUSTOM_VIEWS_FOLDER": "المجلدات",
|
||||||
|
|
5
app/javascript/dashboard/i18n/locale/bg/agentBots.json
Normal file
5
app/javascript/dashboard/i18n/locale/bg/agentBots.json
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"AGENT_BOTS": {
|
||||||
|
"HEADER": "Bots"
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,9 +2,11 @@
|
||||||
"BULK_ACTION": {
|
"BULK_ACTION": {
|
||||||
"CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected",
|
"CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected",
|
||||||
"AGENT_SELECT_LABEL": "Select Agent",
|
"AGENT_SELECT_LABEL": "Select Agent",
|
||||||
"ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to",
|
"ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign %{conversationCount} %{conversationLabel} to",
|
||||||
|
"UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign %{conversationCount} %{conversationLabel}?",
|
||||||
"GO_BACK_LABEL": "Go back",
|
"GO_BACK_LABEL": "Go back",
|
||||||
"ASSIGN_LABEL": "Assign",
|
"ASSIGN_LABEL": "Assign",
|
||||||
|
"YES": "Yes",
|
||||||
"ASSIGN_AGENT_TOOLTIP": "Assign Agent",
|
"ASSIGN_AGENT_TOOLTIP": "Assign Agent",
|
||||||
"ASSIGN_SUCCESFUL": "Conversations assigned successfully",
|
"ASSIGN_SUCCESFUL": "Conversations assigned successfully",
|
||||||
"ASSIGN_FAILED": "Failed to assign conversations, please try again",
|
"ASSIGN_FAILED": "Failed to assign conversations, please try again",
|
||||||
|
|
|
@ -239,7 +239,9 @@
|
||||||
},
|
},
|
||||||
"API_CALLBACK": {
|
"API_CALLBACK": {
|
||||||
"TITLE": "Callback URL",
|
"TITLE": "Callback URL",
|
||||||
"SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here."
|
"SUBTITLE": "You have to configure the webhook URL and the verification token in the Facebook Developer portal with the values shown below.",
|
||||||
|
"WEBHOOK_URL": "Webhook URL",
|
||||||
|
"WEBHOOK_VERIFICATION_TOKEN": "Webhook Verification Token"
|
||||||
},
|
},
|
||||||
"SUBMIT_BUTTON": "Create WhatsApp Channel",
|
"SUBMIT_BUTTON": "Create WhatsApp Channel",
|
||||||
"API": {
|
"API": {
|
||||||
|
@ -357,7 +359,7 @@
|
||||||
},
|
},
|
||||||
"FINISH": {
|
"FINISH": {
|
||||||
"TITLE": "Your Inbox is ready!",
|
"TITLE": "Your Inbox is ready!",
|
||||||
"MESSAGE": "You can now engage with your customers through your new Channel. Happy supporting ",
|
"MESSAGE": "You can now engage with your customers through your new Channel. Happy supporting",
|
||||||
"BUTTON_TEXT": "Take me there",
|
"BUTTON_TEXT": "Take me there",
|
||||||
"MORE_SETTINGS": "More settings",
|
"MORE_SETTINGS": "More settings",
|
||||||
"WEBSITE_SUCCESS": "You have successfully finished creating a website channel. Copy the code shown below and paste it on your website. Next time a customer use the live chat, the conversation will automatically appear on your inbox."
|
"WEBSITE_SUCCESS": "You have successfully finished creating a website channel. Copy the code shown below and paste it on your website. Next time a customer use the live chat, the conversation will automatically appear on your inbox."
|
||||||
|
|
5
app/javascript/dashboard/i18n/locale/bg/macros.json
Normal file
5
app/javascript/dashboard/i18n/locale/bg/macros.json
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"MACROS": {
|
||||||
|
"HEADER": "Macros"
|
||||||
|
}
|
||||||
|
}
|
|
@ -179,6 +179,7 @@
|
||||||
"CONTACTS": "Контакти",
|
"CONTACTS": "Контакти",
|
||||||
"HOME": "Home",
|
"HOME": "Home",
|
||||||
"AGENTS": "Агенти",
|
"AGENTS": "Агенти",
|
||||||
|
"AGENT_BOTS": "Bots",
|
||||||
"INBOXES": "Inboxes",
|
"INBOXES": "Inboxes",
|
||||||
"NOTIFICATIONS": "Notifications",
|
"NOTIFICATIONS": "Notifications",
|
||||||
"CANNED_RESPONSES": "Готови отговори",
|
"CANNED_RESPONSES": "Готови отговори",
|
||||||
|
@ -189,6 +190,7 @@
|
||||||
"LABELS": "Labels",
|
"LABELS": "Labels",
|
||||||
"CUSTOM_ATTRIBUTES": "Персонализирани атрибути",
|
"CUSTOM_ATTRIBUTES": "Персонализирани атрибути",
|
||||||
"AUTOMATION": "Автоматизация",
|
"AUTOMATION": "Автоматизация",
|
||||||
|
"MACROS": "Macros",
|
||||||
"TEAMS": "Teams",
|
"TEAMS": "Teams",
|
||||||
"BILLING": "Billing",
|
"BILLING": "Billing",
|
||||||
"CUSTOM_VIEWS_FOLDER": "Folders",
|
"CUSTOM_VIEWS_FOLDER": "Folders",
|
||||||
|
|
5
app/javascript/dashboard/i18n/locale/ca/agentBots.json
Normal file
5
app/javascript/dashboard/i18n/locale/ca/agentBots.json
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"AGENT_BOTS": {
|
||||||
|
"HEADER": "Bots"
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,9 +2,11 @@
|
||||||
"BULK_ACTION": {
|
"BULK_ACTION": {
|
||||||
"CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected",
|
"CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected",
|
||||||
"AGENT_SELECT_LABEL": "Seleccionar Agent",
|
"AGENT_SELECT_LABEL": "Seleccionar Agent",
|
||||||
"ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to",
|
"ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign %{conversationCount} %{conversationLabel} to",
|
||||||
|
"UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign %{conversationCount} %{conversationLabel}?",
|
||||||
"GO_BACK_LABEL": "Go back",
|
"GO_BACK_LABEL": "Go back",
|
||||||
"ASSIGN_LABEL": "Assignar",
|
"ASSIGN_LABEL": "Assignar",
|
||||||
|
"YES": "Si",
|
||||||
"ASSIGN_AGENT_TOOLTIP": "Assign Agent",
|
"ASSIGN_AGENT_TOOLTIP": "Assign Agent",
|
||||||
"ASSIGN_SUCCESFUL": "Conversations assigned successfully",
|
"ASSIGN_SUCCESFUL": "Conversations assigned successfully",
|
||||||
"ASSIGN_FAILED": "Failed to assign conversations, please try again",
|
"ASSIGN_FAILED": "Failed to assign conversations, please try again",
|
||||||
|
|
|
@ -239,7 +239,9 @@
|
||||||
},
|
},
|
||||||
"API_CALLBACK": {
|
"API_CALLBACK": {
|
||||||
"TITLE": "Callback URL",
|
"TITLE": "Callback URL",
|
||||||
"SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here."
|
"SUBTITLE": "You have to configure the webhook URL and the verification token in the Facebook Developer portal with the values shown below.",
|
||||||
|
"WEBHOOK_URL": "URL del webhook",
|
||||||
|
"WEBHOOK_VERIFICATION_TOKEN": "Webhook Verification Token"
|
||||||
},
|
},
|
||||||
"SUBMIT_BUTTON": "Create WhatsApp Channel",
|
"SUBMIT_BUTTON": "Create WhatsApp Channel",
|
||||||
"API": {
|
"API": {
|
||||||
|
@ -357,7 +359,7 @@
|
||||||
},
|
},
|
||||||
"FINISH": {
|
"FINISH": {
|
||||||
"TITLE": "La vostra safata d'entrada està a punt!",
|
"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 ",
|
"MESSAGE": "Ja podeu interactuar amb els vostres clients a través del vostre canal nou. Feliç suport",
|
||||||
"BUTTON_TEXT": "Porta'm allà",
|
"BUTTON_TEXT": "Porta'm allà",
|
||||||
"MORE_SETTINGS": "More settings",
|
"MORE_SETTINGS": "More settings",
|
||||||
"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."
|
"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."
|
||||||
|
|
5
app/javascript/dashboard/i18n/locale/ca/macros.json
Normal file
5
app/javascript/dashboard/i18n/locale/ca/macros.json
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"MACROS": {
|
||||||
|
"HEADER": "Macros"
|
||||||
|
}
|
||||||
|
}
|
|
@ -179,6 +179,7 @@
|
||||||
"CONTACTS": "Contactes",
|
"CONTACTS": "Contactes",
|
||||||
"HOME": "Inici",
|
"HOME": "Inici",
|
||||||
"AGENTS": "Agents",
|
"AGENTS": "Agents",
|
||||||
|
"AGENT_BOTS": "Bots",
|
||||||
"INBOXES": "Safates d'entrada",
|
"INBOXES": "Safates d'entrada",
|
||||||
"NOTIFICATIONS": "Notificacions",
|
"NOTIFICATIONS": "Notificacions",
|
||||||
"CANNED_RESPONSES": "Respostes predeterminades",
|
"CANNED_RESPONSES": "Respostes predeterminades",
|
||||||
|
@ -189,6 +190,7 @@
|
||||||
"LABELS": "Etiquetes",
|
"LABELS": "Etiquetes",
|
||||||
"CUSTOM_ATTRIBUTES": "Atributs personalitzats",
|
"CUSTOM_ATTRIBUTES": "Atributs personalitzats",
|
||||||
"AUTOMATION": "Automation",
|
"AUTOMATION": "Automation",
|
||||||
|
"MACROS": "Macros",
|
||||||
"TEAMS": "Equips",
|
"TEAMS": "Equips",
|
||||||
"BILLING": "Billing",
|
"BILLING": "Billing",
|
||||||
"CUSTOM_VIEWS_FOLDER": "Folders",
|
"CUSTOM_VIEWS_FOLDER": "Folders",
|
||||||
|
|
5
app/javascript/dashboard/i18n/locale/cs/agentBots.json
Normal file
5
app/javascript/dashboard/i18n/locale/cs/agentBots.json
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"AGENT_BOTS": {
|
||||||
|
"HEADER": "Bots"
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,9 +2,11 @@
|
||||||
"BULK_ACTION": {
|
"BULK_ACTION": {
|
||||||
"CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected",
|
"CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected",
|
||||||
"AGENT_SELECT_LABEL": "Vybrat agenta",
|
"AGENT_SELECT_LABEL": "Vybrat agenta",
|
||||||
"ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to",
|
"ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign %{conversationCount} %{conversationLabel} to",
|
||||||
|
"UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign %{conversationCount} %{conversationLabel}?",
|
||||||
"GO_BACK_LABEL": "Go back",
|
"GO_BACK_LABEL": "Go back",
|
||||||
"ASSIGN_LABEL": "Přiřadit",
|
"ASSIGN_LABEL": "Přiřadit",
|
||||||
|
"YES": "Ano",
|
||||||
"ASSIGN_AGENT_TOOLTIP": "Assign Agent",
|
"ASSIGN_AGENT_TOOLTIP": "Assign Agent",
|
||||||
"ASSIGN_SUCCESFUL": "Conversations assigned successfully",
|
"ASSIGN_SUCCESFUL": "Conversations assigned successfully",
|
||||||
"ASSIGN_FAILED": "Failed to assign conversations, please try again",
|
"ASSIGN_FAILED": "Failed to assign conversations, please try again",
|
||||||
|
|
|
@ -239,7 +239,9 @@
|
||||||
},
|
},
|
||||||
"API_CALLBACK": {
|
"API_CALLBACK": {
|
||||||
"TITLE": "Callback URL",
|
"TITLE": "Callback URL",
|
||||||
"SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here."
|
"SUBTITLE": "You have to configure the webhook URL and the verification token in the Facebook Developer portal with the values shown below.",
|
||||||
|
"WEBHOOK_URL": "URL webového háčku",
|
||||||
|
"WEBHOOK_VERIFICATION_TOKEN": "Webhook Verification Token"
|
||||||
},
|
},
|
||||||
"SUBMIT_BUTTON": "Create WhatsApp Channel",
|
"SUBMIT_BUTTON": "Create WhatsApp Channel",
|
||||||
"API": {
|
"API": {
|
||||||
|
@ -357,7 +359,7 @@
|
||||||
},
|
},
|
||||||
"FINISH": {
|
"FINISH": {
|
||||||
"TITLE": "Vaše doručená pošta je připravena!",
|
"TITLE": "Vaše doručená pošta je připravena!",
|
||||||
"MESSAGE": "Nyní se můžete spojit se svými zákazníky prostřednictvím nového kanálu. Šťastná podpora ",
|
"MESSAGE": "You can now engage with your customers through your new Channel. Happy supporting",
|
||||||
"BUTTON_TEXT": "Vezmi mě tam",
|
"BUTTON_TEXT": "Vezmi mě tam",
|
||||||
"MORE_SETTINGS": "More settings",
|
"MORE_SETTINGS": "More settings",
|
||||||
"WEBSITE_SUCCESS": "Úspěšně jste dokončili vytvoření webového kanálu. Zkopírujte kód zobrazený níže a vložte jej na vaše webové stránky. Když zákazník příště použije živý chat, konverzace se automaticky objeví ve vaší doručené poště."
|
"WEBSITE_SUCCESS": "Úspěšně jste dokončili vytvoření webového kanálu. Zkopírujte kód zobrazený níže a vložte jej na vaše webové stránky. Když zákazník příště použije živý chat, konverzace se automaticky objeví ve vaší doručené poště."
|
||||||
|
|
5
app/javascript/dashboard/i18n/locale/cs/macros.json
Normal file
5
app/javascript/dashboard/i18n/locale/cs/macros.json
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"MACROS": {
|
||||||
|
"HEADER": "Macros"
|
||||||
|
}
|
||||||
|
}
|
|
@ -179,6 +179,7 @@
|
||||||
"CONTACTS": "Kontakty",
|
"CONTACTS": "Kontakty",
|
||||||
"HOME": "Domů",
|
"HOME": "Domů",
|
||||||
"AGENTS": "Agenti",
|
"AGENTS": "Agenti",
|
||||||
|
"AGENT_BOTS": "Bots",
|
||||||
"INBOXES": "Schránky",
|
"INBOXES": "Schránky",
|
||||||
"NOTIFICATIONS": "Oznámení",
|
"NOTIFICATIONS": "Oznámení",
|
||||||
"CANNED_RESPONSES": "Konzervované odpovědi",
|
"CANNED_RESPONSES": "Konzervované odpovědi",
|
||||||
|
@ -189,6 +190,7 @@
|
||||||
"LABELS": "Štítky",
|
"LABELS": "Štítky",
|
||||||
"CUSTOM_ATTRIBUTES": "Vlastní atributy",
|
"CUSTOM_ATTRIBUTES": "Vlastní atributy",
|
||||||
"AUTOMATION": "Automation",
|
"AUTOMATION": "Automation",
|
||||||
|
"MACROS": "Macros",
|
||||||
"TEAMS": "Týmy",
|
"TEAMS": "Týmy",
|
||||||
"BILLING": "Billing",
|
"BILLING": "Billing",
|
||||||
"CUSTOM_VIEWS_FOLDER": "Folders",
|
"CUSTOM_VIEWS_FOLDER": "Folders",
|
||||||
|
|
5
app/javascript/dashboard/i18n/locale/da/agentBots.json
Normal file
5
app/javascript/dashboard/i18n/locale/da/agentBots.json
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"AGENT_BOTS": {
|
||||||
|
"HEADER": "Bots"
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,9 +2,11 @@
|
||||||
"BULK_ACTION": {
|
"BULK_ACTION": {
|
||||||
"CONVERSATIONS_SELECTED": "%{conversationCount} samtaler valgt",
|
"CONVERSATIONS_SELECTED": "%{conversationCount} samtaler valgt",
|
||||||
"AGENT_SELECT_LABEL": "Vælg Agent",
|
"AGENT_SELECT_LABEL": "Vælg Agent",
|
||||||
"ASSIGN_CONFIRMATION_LABEL": "Er du sikker på, at du vil tildele %{conversationCount} %{conversationLabel} til",
|
"ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign %{conversationCount} %{conversationLabel} to",
|
||||||
|
"UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign %{conversationCount} %{conversationLabel}?",
|
||||||
"GO_BACK_LABEL": "Gå tilbage",
|
"GO_BACK_LABEL": "Gå tilbage",
|
||||||
"ASSIGN_LABEL": "Tildel",
|
"ASSIGN_LABEL": "Tildel",
|
||||||
|
"YES": "Ja",
|
||||||
"ASSIGN_AGENT_TOOLTIP": "Tildel Agent",
|
"ASSIGN_AGENT_TOOLTIP": "Tildel Agent",
|
||||||
"ASSIGN_SUCCESFUL": "Samtaler tildelt",
|
"ASSIGN_SUCCESFUL": "Samtaler tildelt",
|
||||||
"ASSIGN_FAILED": "Mislykkedes at tildele samtaler, prøv igen",
|
"ASSIGN_FAILED": "Mislykkedes at tildele samtaler, prøv igen",
|
||||||
|
|
|
@ -306,7 +306,7 @@
|
||||||
"PUBLISH_ARTICLE": {
|
"PUBLISH_ARTICLE": {
|
||||||
"API": {
|
"API": {
|
||||||
"ERROR": "Fejl under publicering af artikel",
|
"ERROR": "Fejl under publicering af artikel",
|
||||||
"SUCCESS": "Artikel publiceret med succes"
|
"SUCCESS": "Article published successfully"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ARCHIVE_ARTICLE": {
|
"ARCHIVE_ARTICLE": {
|
||||||
|
|
|
@ -239,7 +239,9 @@
|
||||||
},
|
},
|
||||||
"API_CALLBACK": {
|
"API_CALLBACK": {
|
||||||
"TITLE": "Callback URL",
|
"TITLE": "Callback URL",
|
||||||
"SUBTITLE": "Du skal konfigurere webhook URL i facebook udvikler portal med den URL, der er nævnt her."
|
"SUBTITLE": "You have to configure the webhook URL and the verification token in the Facebook Developer portal with the values shown below.",
|
||||||
|
"WEBHOOK_URL": "Webhook URL",
|
||||||
|
"WEBHOOK_VERIFICATION_TOKEN": "Webhook Verification Token"
|
||||||
},
|
},
|
||||||
"SUBMIT_BUTTON": "Opret WhatsApp Kanal",
|
"SUBMIT_BUTTON": "Opret WhatsApp Kanal",
|
||||||
"API": {
|
"API": {
|
||||||
|
@ -357,7 +359,7 @@
|
||||||
},
|
},
|
||||||
"FINISH": {
|
"FINISH": {
|
||||||
"TITLE": "Din indbakke er klar!",
|
"TITLE": "Din indbakke er klar!",
|
||||||
"MESSAGE": "Du kan nu engagere dig med dine kunder gennem din nye kanal. Glædelig supportering ",
|
"MESSAGE": "Du kan nu engagere dig med dine kunder gennem din nye kanal. Glædelig supportering",
|
||||||
"BUTTON_TEXT": "Tag mig med dertil",
|
"BUTTON_TEXT": "Tag mig med dertil",
|
||||||
"MORE_SETTINGS": "Flere indstillinger",
|
"MORE_SETTINGS": "Flere indstillinger",
|
||||||
"WEBSITE_SUCCESS": "Du er færdig med at oprette en hjemmeside kanal. Kopier koden vist nedenfor og indsæt den på din hjemmeside. Næste gang en kunde bruger live chat, vil samtalen automatisk vises i din indbakke."
|
"WEBSITE_SUCCESS": "Du er færdig med at oprette en hjemmeside kanal. Kopier koden vist nedenfor og indsæt den på din hjemmeside. Næste gang en kunde bruger live chat, vil samtalen automatisk vises i din indbakke."
|
||||||
|
|
5
app/javascript/dashboard/i18n/locale/da/macros.json
Normal file
5
app/javascript/dashboard/i18n/locale/da/macros.json
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"MACROS": {
|
||||||
|
"HEADER": "Macros"
|
||||||
|
}
|
||||||
|
}
|
|
@ -179,6 +179,7 @@
|
||||||
"CONTACTS": "Kontakter",
|
"CONTACTS": "Kontakter",
|
||||||
"HOME": "Hjem",
|
"HOME": "Hjem",
|
||||||
"AGENTS": "Agenter",
|
"AGENTS": "Agenter",
|
||||||
|
"AGENT_BOTS": "Bots",
|
||||||
"INBOXES": "Indbakker",
|
"INBOXES": "Indbakker",
|
||||||
"NOTIFICATIONS": "Notifikationer",
|
"NOTIFICATIONS": "Notifikationer",
|
||||||
"CANNED_RESPONSES": "Standardsvar Svar",
|
"CANNED_RESPONSES": "Standardsvar Svar",
|
||||||
|
@ -189,6 +190,7 @@
|
||||||
"LABELS": "Etiketter",
|
"LABELS": "Etiketter",
|
||||||
"CUSTOM_ATTRIBUTES": "Brugerdefinerede Egenskaber",
|
"CUSTOM_ATTRIBUTES": "Brugerdefinerede Egenskaber",
|
||||||
"AUTOMATION": "Automatisering",
|
"AUTOMATION": "Automatisering",
|
||||||
|
"MACROS": "Macros",
|
||||||
"TEAMS": "Teams",
|
"TEAMS": "Teams",
|
||||||
"BILLING": "Fakturering",
|
"BILLING": "Fakturering",
|
||||||
"CUSTOM_VIEWS_FOLDER": "Mapper",
|
"CUSTOM_VIEWS_FOLDER": "Mapper",
|
||||||
|
|
5
app/javascript/dashboard/i18n/locale/de/agentBots.json
Normal file
5
app/javascript/dashboard/i18n/locale/de/agentBots.json
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"AGENT_BOTS": {
|
||||||
|
"HEADER": "Bots"
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,9 +2,11 @@
|
||||||
"BULK_ACTION": {
|
"BULK_ACTION": {
|
||||||
"CONVERSATIONS_SELECTED": "%{conversationCount} Konversationen ausgewählt",
|
"CONVERSATIONS_SELECTED": "%{conversationCount} Konversationen ausgewählt",
|
||||||
"AGENT_SELECT_LABEL": "Agent auswählen",
|
"AGENT_SELECT_LABEL": "Agent auswählen",
|
||||||
"ASSIGN_CONFIRMATION_LABEL": "Sind Sie sicher, dass Sie %{conversationCount} %{conversationLabel} zuweisen möchten",
|
"ASSIGN_CONFIRMATION_LABEL": "Sind Sie sicher, %{conversationCount} %{conversationLabel} zuzuweisen",
|
||||||
|
"UNASSIGN_CONFIRMATION_LABEL": "Möchten Sie die Zuweisung von %{conversationCount} %{conversationLabel} wirklich aufheben?",
|
||||||
"GO_BACK_LABEL": "Zurück",
|
"GO_BACK_LABEL": "Zurück",
|
||||||
"ASSIGN_LABEL": "Zuordnen",
|
"ASSIGN_LABEL": "Zuordnen",
|
||||||
|
"YES": "Ja",
|
||||||
"ASSIGN_AGENT_TOOLTIP": "Agent zuweisen",
|
"ASSIGN_AGENT_TOOLTIP": "Agent zuweisen",
|
||||||
"ASSIGN_SUCCESFUL": "Konversationen erfolgreich zugewiesen",
|
"ASSIGN_SUCCESFUL": "Konversationen erfolgreich zugewiesen",
|
||||||
"ASSIGN_FAILED": "Konversationen konnten nicht zugewiesen werden. Bitte versuchen Sie es erneut",
|
"ASSIGN_FAILED": "Konversationen konnten nicht zugewiesen werden. Bitte versuchen Sie es erneut",
|
||||||
|
|
|
@ -239,7 +239,9 @@
|
||||||
},
|
},
|
||||||
"API_CALLBACK": {
|
"API_CALLBACK": {
|
||||||
"TITLE": "Callback URL",
|
"TITLE": "Callback URL",
|
||||||
"SUBTITLE": "Sie müssen die Webhook-URL im Facebook-Entwicklerportal mit der hier genannten URL konfigurieren."
|
"SUBTITLE": "Sie müssen die Webhook-URL und das Verifizierungstoken im Facebook-Entwicklerportal mit den unten gezeigten Werten konfigurieren.",
|
||||||
|
"WEBHOOK_URL": "Webhook-URL",
|
||||||
|
"WEBHOOK_VERIFICATION_TOKEN": "Webhook-Verifizierungstoken"
|
||||||
},
|
},
|
||||||
"SUBMIT_BUTTON": "WhatsApp-Kanal erstellen",
|
"SUBMIT_BUTTON": "WhatsApp-Kanal erstellen",
|
||||||
"API": {
|
"API": {
|
||||||
|
@ -357,7 +359,7 @@
|
||||||
},
|
},
|
||||||
"FINISH": {
|
"FINISH": {
|
||||||
"TITLE": "Ihr Posteingang ist fertig!",
|
"TITLE": "Ihr Posteingang ist fertig!",
|
||||||
"MESSAGE": "Sie können jetzt über Ihren neuen Kanal mit Ihren Kunden in Kontakt treten. Viel Spaß beim Unterstützen",
|
"MESSAGE": "Sie können jetzt über Ihren neuen Kanal mit Ihren Kunden in Kontakt treten. Fröhliches Unterstützen",
|
||||||
"BUTTON_TEXT": "Bring mich dahin",
|
"BUTTON_TEXT": "Bring mich dahin",
|
||||||
"MORE_SETTINGS": "Weitere Einstellungen",
|
"MORE_SETTINGS": "Weitere Einstellungen",
|
||||||
"WEBSITE_SUCCESS": "Sie haben die Erstellung eines Website-Kanals erfolgreich abgeschlossen. Kopieren Sie den unten gezeigten Code und fügen Sie ihn in Ihre Website ein. Wenn ein Kunde das nächste Mal den Live-Chat verwendet, wird die Konversation automatisch in Ihrem Posteingang angezeigt."
|
"WEBSITE_SUCCESS": "Sie haben die Erstellung eines Website-Kanals erfolgreich abgeschlossen. Kopieren Sie den unten gezeigten Code und fügen Sie ihn in Ihre Website ein. Wenn ein Kunde das nächste Mal den Live-Chat verwendet, wird die Konversation automatisch in Ihrem Posteingang angezeigt."
|
||||||
|
|
5
app/javascript/dashboard/i18n/locale/de/macros.json
Normal file
5
app/javascript/dashboard/i18n/locale/de/macros.json
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"MACROS": {
|
||||||
|
"HEADER": "Makros"
|
||||||
|
}
|
||||||
|
}
|
|
@ -179,6 +179,7 @@
|
||||||
"CONTACTS": "Kontakte",
|
"CONTACTS": "Kontakte",
|
||||||
"HOME": "Hauptseite",
|
"HOME": "Hauptseite",
|
||||||
"AGENTS": "Agenten",
|
"AGENTS": "Agenten",
|
||||||
|
"AGENT_BOTS": "Bots",
|
||||||
"INBOXES": "Posteingänge",
|
"INBOXES": "Posteingänge",
|
||||||
"NOTIFICATIONS": "Push-Benachrichtigungen",
|
"NOTIFICATIONS": "Push-Benachrichtigungen",
|
||||||
"CANNED_RESPONSES": "Vorgefertigte Antworten",
|
"CANNED_RESPONSES": "Vorgefertigte Antworten",
|
||||||
|
@ -189,6 +190,7 @@
|
||||||
"LABELS": "Labels",
|
"LABELS": "Labels",
|
||||||
"CUSTOM_ATTRIBUTES": "Benutzerdefinierte Attribute",
|
"CUSTOM_ATTRIBUTES": "Benutzerdefinierte Attribute",
|
||||||
"AUTOMATION": "Automatisierung",
|
"AUTOMATION": "Automatisierung",
|
||||||
|
"MACROS": "Makros",
|
||||||
"TEAMS": "Teams",
|
"TEAMS": "Teams",
|
||||||
"BILLING": "Rechnungen",
|
"BILLING": "Rechnungen",
|
||||||
"CUSTOM_VIEWS_FOLDER": "Ordner",
|
"CUSTOM_VIEWS_FOLDER": "Ordner",
|
||||||
|
|
5
app/javascript/dashboard/i18n/locale/el/agentBots.json
Normal file
5
app/javascript/dashboard/i18n/locale/el/agentBots.json
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"AGENT_BOTS": {
|
||||||
|
"HEADER": "Bots"
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,8 +3,10 @@
|
||||||
"CONVERSATIONS_SELECTED": "%{conversationCount} σινομιλίες επιλέχθηκαν",
|
"CONVERSATIONS_SELECTED": "%{conversationCount} σινομιλίες επιλέχθηκαν",
|
||||||
"AGENT_SELECT_LABEL": "Επιλογή πράκτορα",
|
"AGENT_SELECT_LABEL": "Επιλογή πράκτορα",
|
||||||
"ASSIGN_CONFIRMATION_LABEL": "Είσαστε σίγουροι ότι θέλετε να αντιστοιχίσετε %{conversationCount} %{conversationLabel} στον",
|
"ASSIGN_CONFIRMATION_LABEL": "Είσαστε σίγουροι ότι θέλετε να αντιστοιχίσετε %{conversationCount} %{conversationLabel} στον",
|
||||||
|
"UNASSIGN_CONFIRMATION_LABEL": "Είσαστε σίγουροι ότι θέλετε να αφαιρέσετε την αντιστοίχιση %{conversationCount} %{conversationLabel} στον;",
|
||||||
"GO_BACK_LABEL": "Πίσω",
|
"GO_BACK_LABEL": "Πίσω",
|
||||||
"ASSIGN_LABEL": "Αντιστοίχιση",
|
"ASSIGN_LABEL": "Αντιστοίχιση",
|
||||||
|
"YES": "Ναι",
|
||||||
"ASSIGN_AGENT_TOOLTIP": "Ανάθεση σε πράκτορα",
|
"ASSIGN_AGENT_TOOLTIP": "Ανάθεση σε πράκτορα",
|
||||||
"ASSIGN_SUCCESFUL": "Οι σινομιλίες αντιστοιχήθηκαν επιτυχώς",
|
"ASSIGN_SUCCESFUL": "Οι σινομιλίες αντιστοιχήθηκαν επιτυχώς",
|
||||||
"ASSIGN_FAILED": "Αποτυχία στην αντιστοίχιση σινομιλιών, παρακαλώ δοκιμάστε αργότερα",
|
"ASSIGN_FAILED": "Αποτυχία στην αντιστοίχιση σινομιλιών, παρακαλώ δοκιμάστε αργότερα",
|
||||||
|
|
|
@ -152,8 +152,8 @@
|
||||||
},
|
},
|
||||||
"DELETE_AVATAR": {
|
"DELETE_AVATAR": {
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Contact avatar deleted successfully",
|
"SUCCESS_MESSAGE": "Το avatar της επαφής διαγράφηκε επιτυχώς",
|
||||||
"ERROR_MESSAGE": "Could not delete the contact avatar. Please try again later."
|
"ERROR_MESSAGE": "Δεν ήταν δυνατή η διαγραφή του avatar της επαφής. Παρακαλώ προσπαθήστε ξανά αργότερα."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"SUCCESS_MESSAGE": "Η επαφή αποθηκεύτηκε με επιτυχία",
|
"SUCCESS_MESSAGE": "Η επαφή αποθηκεύτηκε με επιτυχία",
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
"CUSTOM_ATTRIBUTE_CHECKBOX": "Checkbox",
|
"CUSTOM_ATTRIBUTE_CHECKBOX": "Checkbox",
|
||||||
"CREATED_AT": "Δημιουργήθηκε στις",
|
"CREATED_AT": "Δημιουργήθηκε στις",
|
||||||
"LAST_ACTIVITY": "Τελευταία Δραστηριότητα",
|
"LAST_ACTIVITY": "Τελευταία Δραστηριότητα",
|
||||||
"REFERER_LINK": "Referrer link"
|
"REFERER_LINK": "Σύνδεσμος αναφοράς"
|
||||||
},
|
},
|
||||||
"GROUPS": {
|
"GROUPS": {
|
||||||
"STANDARD_FILTERS": "Τυπικά Φίλτρα",
|
"STANDARD_FILTERS": "Τυπικά Φίλτρα",
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
"CONVERSATION": {
|
"CONVERSATION": {
|
||||||
"SELECT_A_CONVERSATION": "Παρακαλώ επιλέξτε συζήτηση από το αριστερό τμήμα",
|
"SELECT_A_CONVERSATION": "Παρακαλώ επιλέξτε συζήτηση από το αριστερό τμήμα",
|
||||||
"CSAT_REPLY_MESSAGE": "Παρακαλώ αξιολογήστε τη συνομιλία",
|
"CSAT_REPLY_MESSAGE": "Παρακαλώ αξιολογήστε τη συνομιλία",
|
||||||
"404": "Sorry, we cannot find the conversation. Please try again",
|
"404": "Λυπούμαστε, δεν μπορούμε να βρούμε την συνομιλία. Παρακαλώ προσπαθήστε ξανά",
|
||||||
"SWITCH_VIEW_LAYOUT": "Switch the layout",
|
"SWITCH_VIEW_LAYOUT": "Εναλλαγή διάταξης",
|
||||||
"DASHBOARD_APP_TAB_MESSAGES": "Μηνύματα",
|
"DASHBOARD_APP_TAB_MESSAGES": "Μηνύματα",
|
||||||
"UNVERIFIED_SESSION": "Η ταυτότητα αυτού του χρήστη δεν επαληθεύεται",
|
"UNVERIFIED_SESSION": "Η ταυτότητα αυτού του χρήστη δεν επαληθεύεται",
|
||||||
"NO_MESSAGE_1": "Ωχ ωχ! Φαίνεται ότι δεν υπάρχουν μηνύματα από τους πελάτες στα εισερχόμενά σας.",
|
"NO_MESSAGE_1": "Ωχ ωχ! Φαίνεται ότι δεν υπάρχουν μηνύματα από τους πελάτες στα εισερχόμενά σας.",
|
||||||
|
@ -63,30 +63,30 @@
|
||||||
},
|
},
|
||||||
"CARD_CONTEXT_MENU": {
|
"CARD_CONTEXT_MENU": {
|
||||||
"PENDING": "Σήμανση ως εκκρεμής",
|
"PENDING": "Σήμανση ως εκκρεμής",
|
||||||
"RESOLVED": "Mark as resolved",
|
"RESOLVED": "Σήμανση ως επιλυμένου",
|
||||||
"REOPEN": "Άνοιγμα συνομιλίας",
|
"REOPEN": "Άνοιγμα συνομιλίας",
|
||||||
"SNOOZE": {
|
"SNOOZE": {
|
||||||
"TITLE": "Snooze",
|
"TITLE": "Αναβολή",
|
||||||
"NEXT_REPLY": "Μέχρι την επόμενη απάντηση",
|
"NEXT_REPLY": "Μέχρι την επόμενη απάντηση",
|
||||||
"TOMORROW": "Μέχρι αύριο",
|
"TOMORROW": "Μέχρι αύριο",
|
||||||
"NEXT_WEEK": "Έως την επόμενη εβδομάδα"
|
"NEXT_WEEK": "Έως την επόμενη εβδομάδα"
|
||||||
},
|
},
|
||||||
"ASSIGN_AGENT": "Assign agent",
|
"ASSIGN_AGENT": "Ανάθεση σε πράκτορα",
|
||||||
"ASSIGN_LABEL": "Assign label",
|
"ASSIGN_LABEL": "Εκχώρηση ετικέτας",
|
||||||
"AGENTS_LOADING": "Loading agents...",
|
"AGENTS_LOADING": "Φόρτωση πρακτόρων...",
|
||||||
"ASSIGN_TEAM": "Assign team",
|
"ASSIGN_TEAM": "Ανάθεση ομάδας",
|
||||||
"API": {
|
"API": {
|
||||||
"AGENT_ASSIGNMENT": {
|
"AGENT_ASSIGNMENT": {
|
||||||
"SUCCESFUL": "Conversation id %{conversationId} assigned to \"%{agentName}\"",
|
"SUCCESFUL": "Η συνομιλία με αριθμό %{conversationId} ανατέθηκε στον \"%{agentName}\"",
|
||||||
"FAILED": "Couldn't assign agent. Please try again."
|
"FAILED": "Αδυναμία αντιστοίχισης σε πράκτορα. Παρακαλώ δοκιμάστε ξανά."
|
||||||
},
|
},
|
||||||
"LABEL_ASSIGNMENT": {
|
"LABEL_ASSIGNMENT": {
|
||||||
"SUCCESFUL": "Assigned label #%{labelName} to conversation id %{conversationId}",
|
"SUCCESFUL": "Εκχώρηση ετικέτας #%{labelName} στην συνομιλία με αριθμό %{conversationId}",
|
||||||
"FAILED": "Couldn't assign label. Please try again."
|
"FAILED": "Αποτυχία στην εκχώρηση ετικέτας, παρακαλώ δοκιμάστε αργότερα."
|
||||||
},
|
},
|
||||||
"TEAM_ASSIGNMENT": {
|
"TEAM_ASSIGNMENT": {
|
||||||
"SUCCESFUL": "Assigned team \"%{team}\" to conversation id %{conversationId}",
|
"SUCCESFUL": "Η συνομιλία με αριθμό %{conversationId} ανατέθηκε στην ομάδα \"%{team}\"",
|
||||||
"FAILED": "Couldn't assign team. Please try again."
|
"FAILED": "Αδυναμία αντιστοίχισης ομάδας. Παρακαλώ δοκιμάστε ξανά."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -131,13 +131,13 @@
|
||||||
},
|
},
|
||||||
"VISIBLE_TO_AGENTS": "Ιδιωτική Σημείωση: Ορατή μόνο σε σας και την ομάδα σας",
|
"VISIBLE_TO_AGENTS": "Ιδιωτική Σημείωση: Ορατή μόνο σε σας και την ομάδα σας",
|
||||||
"CHANGE_STATUS": "Η κατάσταση της συνομιλίας άλλαξε",
|
"CHANGE_STATUS": "Η κατάσταση της συνομιλίας άλλαξε",
|
||||||
"CHANGE_STATUS_FAILED": "Conversation status change failed",
|
"CHANGE_STATUS_FAILED": "Η αλλαγή κατάστασης συνομιλίας απέτυχε",
|
||||||
"CHANGE_AGENT": "Η εκπροσώπηση για την συνομιλία άλλαξε",
|
"CHANGE_AGENT": "Η εκπροσώπηση για την συνομιλία άλλαξε",
|
||||||
"CHANGE_AGENT_FAILED": "Assignee change failed",
|
"CHANGE_AGENT_FAILED": "Η αλλαγή της ανάθεσης απέτυχε",
|
||||||
"ASSIGN_LABEL_SUCCESFUL": "Label assigned successfully",
|
"ASSIGN_LABEL_SUCCESFUL": "Επιτυχής εκχώρηση ετικέτας",
|
||||||
"ASSIGN_LABEL_FAILED": "Label assignment failed",
|
"ASSIGN_LABEL_FAILED": "Η εκχώρηση ετικέτας απέτυχε",
|
||||||
"CHANGE_TEAM": "Η ομάδα συνομιλίας άλλαξε",
|
"CHANGE_TEAM": "Η ομάδα συνομιλίας άλλαξε",
|
||||||
"FILE_SIZE_LIMIT": "File exceeds the {MAXIMUM_SUPPORTED_FILE_UPLOAD_SIZE} MB attachment limit",
|
"FILE_SIZE_LIMIT": "Το αρχείο υπερβαίνει το όριο συνημμένου {MAXIMUM_SUPPORTED_FILE_UPLOAD_SIZE}",
|
||||||
"MESSAGE_ERROR": "Δεν είναι δυνατή η αποστολή του μηνύματος, παρακαλώ προσπαθήστε ξανά αργότερα",
|
"MESSAGE_ERROR": "Δεν είναι δυνατή η αποστολή του μηνύματος, παρακαλώ προσπαθήστε ξανά αργότερα",
|
||||||
"SENT_BY": "Αποστολή από:",
|
"SENT_BY": "Αποστολή από:",
|
||||||
"BOT": "Bot",
|
"BOT": "Bot",
|
||||||
|
@ -151,7 +151,7 @@
|
||||||
"CONTEXT_MENU": {
|
"CONTEXT_MENU": {
|
||||||
"COPY": "Αντιγραφή",
|
"COPY": "Αντιγραφή",
|
||||||
"DELETE": "Διαγραφή",
|
"DELETE": "Διαγραφή",
|
||||||
"CREATE_A_CANNED_RESPONSE": "Add to canned responses"
|
"CREATE_A_CANNED_RESPONSE": "Προσθήκη στις έτοιμες απαντήσεις"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"EMAIL_TRANSCRIPT": {
|
"EMAIL_TRANSCRIPT": {
|
||||||
|
|
|
@ -1,409 +1,409 @@
|
||||||
{
|
{
|
||||||
"HELP_CENTER": {
|
"HELP_CENTER": {
|
||||||
"HEADER": {
|
"HEADER": {
|
||||||
"FILTER": "Filter by",
|
"FILTER": "Φιλτράρισμα κατά",
|
||||||
"SORT": "Sort by",
|
"SORT": "Ταξινόμηση κατά",
|
||||||
"SETTINGS_BUTTON": "Ρυθμίσεις",
|
"SETTINGS_BUTTON": "Ρυθμίσεις",
|
||||||
"NEW_BUTTON": "New Article",
|
"NEW_BUTTON": "Νέο Άρθρο",
|
||||||
"DROPDOWN_OPTIONS": {
|
"DROPDOWN_OPTIONS": {
|
||||||
"PUBLISHED": "Published",
|
"PUBLISHED": "Δημοσιευμένο",
|
||||||
"DRAFT": "Draft",
|
"DRAFT": "Πρόχειρο",
|
||||||
"ARCHIVED": "Archived"
|
"ARCHIVED": "Αρχειοθετημένο"
|
||||||
},
|
},
|
||||||
"TITLES": {
|
"TITLES": {
|
||||||
"ALL_ARTICLES": "All Articles",
|
"ALL_ARTICLES": "Όλα Τα Άρθρα",
|
||||||
"MINE": "My Articles",
|
"MINE": "Τα Άρθρα Μου",
|
||||||
"DRAFT": "Draft Articles",
|
"DRAFT": "Πρόχειρα Άρθρα",
|
||||||
"ARCHIVED": "Archived Articles"
|
"ARCHIVED": "Αρχειοθετημένα Άρθρα"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"EDIT_HEADER": {
|
"EDIT_HEADER": {
|
||||||
"ALL_ARTICLES": "All Articles",
|
"ALL_ARTICLES": "Όλα Τα Άρθρα",
|
||||||
"PUBLISH_BUTTON": "Publish",
|
"PUBLISH_BUTTON": "Δημοσιευμένο",
|
||||||
"MOVE_TO_ARCHIVE_BUTTON": "Move to archived",
|
"MOVE_TO_ARCHIVE_BUTTON": "Μετακίνηση στα αρχειοθετημένα",
|
||||||
"PREVIEW": "Preview",
|
"PREVIEW": "Προεπισκόπηση",
|
||||||
"ADD_TRANSLATION": "Add translation",
|
"ADD_TRANSLATION": "Προσθήκη μετάφρασης",
|
||||||
"OPEN_SIDEBAR": "Open sidebar",
|
"OPEN_SIDEBAR": "Άνοιγμα πλευρικής μπάρας",
|
||||||
"CLOSE_SIDEBAR": "Close sidebar",
|
"CLOSE_SIDEBAR": "Κλείσιμο πλευρικής μπάρας",
|
||||||
"SAVING": "Saving...",
|
"SAVING": "Αποθηκεύεται...",
|
||||||
"SAVED": "Saved"
|
"SAVED": "Αποθηκεύτηκε"
|
||||||
},
|
},
|
||||||
"ARTICLE_SETTINGS": {
|
"ARTICLE_SETTINGS": {
|
||||||
"TITLE": "Article Settings",
|
"TITLE": "Ρυθμίσεις Άρθρου",
|
||||||
"FORM": {
|
"FORM": {
|
||||||
"CATEGORY": {
|
"CATEGORY": {
|
||||||
"LABEL": "Κατηγορία",
|
"LABEL": "Κατηγορία",
|
||||||
"TITLE": "Select category",
|
"TITLE": "Επιλογή κατηγορίας",
|
||||||
"PLACEHOLDER": "Select category",
|
"PLACEHOLDER": "Επιλογή κατηγορίας",
|
||||||
"NO_RESULT": "No category found",
|
"NO_RESULT": "Δεν βρέθηκε καμία κατηγορία",
|
||||||
"SEARCH_PLACEHOLDER": "Search category"
|
"SEARCH_PLACEHOLDER": "Αναζήτηση κατηγορίας"
|
||||||
},
|
},
|
||||||
"AUTHOR": {
|
"AUTHOR": {
|
||||||
"LABEL": "Author",
|
"LABEL": "Συγγραφέας",
|
||||||
"TITLE": "Select author",
|
"TITLE": "Επιλογή συγγραφέα",
|
||||||
"PLACEHOLDER": "Select author",
|
"PLACEHOLDER": "Επιλογή συγγραφέα",
|
||||||
"NO_RESULT": "No authors found",
|
"NO_RESULT": "Δεν βρέθηκαν συγγραφείς",
|
||||||
"SEARCH_PLACEHOLDER": "Search author"
|
"SEARCH_PLACEHOLDER": "Αναζήτηση συγγραφέα"
|
||||||
},
|
},
|
||||||
"META_TITLE": {
|
"META_TITLE": {
|
||||||
"LABEL": "Meta title",
|
"LABEL": "Μετα-τίτλος",
|
||||||
"PLACEHOLDER": "Add a meta title"
|
"PLACEHOLDER": "Προσθήκη meta Τίτλου"
|
||||||
},
|
},
|
||||||
"META_DESCRIPTION": {
|
"META_DESCRIPTION": {
|
||||||
"LABEL": "Meta description",
|
"LABEL": "Meta περιγραφή",
|
||||||
"PLACEHOLDER": "Add your meta description for better SEO results..."
|
"PLACEHOLDER": "Προσθέστε τη meta περιγραφή σας για καλύτερα αποτελέσματα SEO..."
|
||||||
},
|
},
|
||||||
"META_TAGS": {
|
"META_TAGS": {
|
||||||
"LABEL": "Meta tags",
|
"LABEL": "Meta tags",
|
||||||
"PLACEHOLDER": "Add meta tags separated by comma..."
|
"PLACEHOLDER": "Προσθήκη μετα-ετικετών διαχωρισμένων με κόμμα..."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"BUTTONS": {
|
"BUTTONS": {
|
||||||
"ARCHIVE": "Archive article",
|
"ARCHIVE": "Αρχειοθέτηση άρθρου",
|
||||||
"DELETE": "Delete article"
|
"DELETE": "Διαγραφή άρθρου"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"PORTAL": {
|
"PORTAL": {
|
||||||
"HEADER": "Portals",
|
"HEADER": "Πύλες",
|
||||||
"DEFAULT": "Default",
|
"DEFAULT": "Προεπιλογή",
|
||||||
"NEW_BUTTON": "New Portal",
|
"NEW_BUTTON": "Νέα Πύλη",
|
||||||
"ACTIVE_BADGE": "ενεργή",
|
"ACTIVE_BADGE": "ενεργή",
|
||||||
"CHOOSE_LOCALE_LABEL": "Choose a locale",
|
"CHOOSE_LOCALE_LABEL": "Επιλέξτε μια γλώσσα",
|
||||||
"LOADING_MESSAGE": "Loading portals...",
|
"LOADING_MESSAGE": "Φόρτωση πυλών...",
|
||||||
"ARTICLES_LABEL": "articles",
|
"ARTICLES_LABEL": "άρθρα",
|
||||||
"NO_PORTALS_MESSAGE": "There are no available portals",
|
"NO_PORTALS_MESSAGE": "Δεν υπάρχουν διαθέσιμες πύλες",
|
||||||
"ADD_NEW_LOCALE": "Add a new locale",
|
"ADD_NEW_LOCALE": "Προσθέστε μια νέα γλώσσα",
|
||||||
"POPOVER": {
|
"POPOVER": {
|
||||||
"TITLE": "Portals",
|
"TITLE": "Πύλες",
|
||||||
"PORTAL_SETTINGS": "Portal settings",
|
"PORTAL_SETTINGS": "Ρυθμίσεις πύλης",
|
||||||
"SUBTITLE": "You have multiple portals and can have different locales for each portal.",
|
"SUBTITLE": "Έχετε πολλαπλές πύλες με διαφορετικές γλώσσες για κάθε πύλη.",
|
||||||
"CANCEL_BUTTON_LABEL": "Άκυρο",
|
"CANCEL_BUTTON_LABEL": "Άκυρο",
|
||||||
"CHOOSE_LOCALE_BUTTON": "Choose Locale"
|
"CHOOSE_LOCALE_BUTTON": "Επιλέξτε γλώσσα"
|
||||||
},
|
},
|
||||||
"PORTAL_SETTINGS": {
|
"PORTAL_SETTINGS": {
|
||||||
"LIST_ITEM": {
|
"LIST_ITEM": {
|
||||||
"HEADER": {
|
"HEADER": {
|
||||||
"COUNT_LABEL": "articles",
|
"COUNT_LABEL": "άρθρα",
|
||||||
"ADD": "Add locale",
|
"ADD": "Προσθήκη γλώσσας",
|
||||||
"VISIT": "Visit site",
|
"VISIT": "Επίσκεψη site",
|
||||||
"SETTINGS": "Ρυθμίσεις",
|
"SETTINGS": "Ρυθμίσεις",
|
||||||
"DELETE": "Διαγραφή"
|
"DELETE": "Διαγραφή"
|
||||||
},
|
},
|
||||||
"PORTAL_CONFIG": {
|
"PORTAL_CONFIG": {
|
||||||
"TITLE": "Portal Configurations",
|
"TITLE": "Ρυθμίσεις Πύλης",
|
||||||
"ITEMS": {
|
"ITEMS": {
|
||||||
"NAME": "Όνομα",
|
"NAME": "Όνομα",
|
||||||
"DOMAIN": "Custom domain",
|
"DOMAIN": "Προσαρμοσμένο Domain",
|
||||||
"SLUG": "Slug",
|
"SLUG": "Slug",
|
||||||
"TITLE": "Portal title",
|
"TITLE": "Τίτλος πύλης",
|
||||||
"THEME": "Theme color",
|
"THEME": "Χρώμα θέματος",
|
||||||
"SUB_TEXT": "Portal sub text"
|
"SUB_TEXT": "Υποκείμενο πύλης"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"AVAILABLE_LOCALES": {
|
"AVAILABLE_LOCALES": {
|
||||||
"TITLE": "Available locales",
|
"TITLE": "Διαθέσιμες γλώσσες",
|
||||||
"TABLE": {
|
"TABLE": {
|
||||||
"NAME": "Locale name",
|
"NAME": "Όνομα γλώσσας",
|
||||||
"CODE": "Locale code",
|
"CODE": "Κωδικός γλώσσας",
|
||||||
"ARTICLE_COUNT": "No. of articles",
|
"ARTICLE_COUNT": "Αριθμός άρθρων",
|
||||||
"CATEGORIES": "No. of categories",
|
"CATEGORIES": "Αριθμός κατηγοριών",
|
||||||
"SWAP": "Swap",
|
"SWAP": "Εναλλαγή",
|
||||||
"DELETE": "Διαγραφή",
|
"DELETE": "Διαγραφή",
|
||||||
"DEFAULT_LOCALE": "Default"
|
"DEFAULT_LOCALE": "Προεπιλογή"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"DELETE_PORTAL": {
|
"DELETE_PORTAL": {
|
||||||
"TITLE": "Delete portal",
|
"TITLE": "Διαγραφή πύλης",
|
||||||
"MESSAGE": "Are you sure you want to delete this portal",
|
"MESSAGE": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν την πύλη",
|
||||||
"YES": "Yes, delete portal",
|
"YES": "Ναι, διαγραφή πύλης",
|
||||||
"NO": "No, keep portal",
|
"NO": "Όχι, διατήρηση πύλης",
|
||||||
"API": {
|
"API": {
|
||||||
"DELETE_SUCCESS": "Portal deleted successfully",
|
"DELETE_SUCCESS": "Η πύλη διαγράφηκε επιτυχώς",
|
||||||
"DELETE_ERROR": "Error while deleting portal"
|
"DELETE_ERROR": "Σφάλμα κατά τη διαγραφή της πύλης"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"EDIT": {
|
"EDIT": {
|
||||||
"HEADER_TEXT": "Edit portal",
|
"HEADER_TEXT": "Επεξεργασία πύλης",
|
||||||
"TABS": {
|
"TABS": {
|
||||||
"BASIC_SETTINGS": {
|
"BASIC_SETTINGS": {
|
||||||
"TITLE": "Basic information"
|
"TITLE": "Βασικές πληροφορίες"
|
||||||
},
|
},
|
||||||
"CUSTOMIZATION_SETTINGS": {
|
"CUSTOMIZATION_SETTINGS": {
|
||||||
"TITLE": "Portal customization"
|
"TITLE": "Προσαρμογή πύλης"
|
||||||
},
|
},
|
||||||
"CATEGORY_SETTINGS": {
|
"CATEGORY_SETTINGS": {
|
||||||
"TITLE": "Categories"
|
"TITLE": "Κατηγορίες"
|
||||||
},
|
},
|
||||||
"LOCALE_SETTINGS": {
|
"LOCALE_SETTINGS": {
|
||||||
"TITLE": "Locales"
|
"TITLE": "Γλώσσες"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"CATEGORIES": {
|
"CATEGORIES": {
|
||||||
"TITLE": "Categories in",
|
"TITLE": "Κατηγορίες στο",
|
||||||
"NEW_CATEGORY": "New category",
|
"NEW_CATEGORY": "Νέα κατηγορία",
|
||||||
"TABLE": {
|
"TABLE": {
|
||||||
"NAME": "Όνομα",
|
"NAME": "Όνομα",
|
||||||
"DESCRIPTION": "Περιγραφή",
|
"DESCRIPTION": "Περιγραφή",
|
||||||
"LOCALE": "Locale",
|
"LOCALE": "Γλώσσα",
|
||||||
"ARTICLE_COUNT": "No. of articles",
|
"ARTICLE_COUNT": "Αριθμός άρθρων",
|
||||||
"ACTION_BUTTON": {
|
"ACTION_BUTTON": {
|
||||||
"EDIT": "Edit category",
|
"EDIT": "Επεξεργασία κατηγορίας",
|
||||||
"DELETE": "Delete category"
|
"DELETE": "Διαγραφή κατηγορίας"
|
||||||
},
|
},
|
||||||
"EMPTY_TEXT": "No categories found"
|
"EMPTY_TEXT": "Δεν βρέθηκαν κατηγορίες"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"EDIT_BASIC_INFO": {
|
"EDIT_BASIC_INFO": {
|
||||||
"BUTTON_TEXT": "Update basic settings"
|
"BUTTON_TEXT": "Ενημέρωση βασικών ρυθμίσεων"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ADD": {
|
"ADD": {
|
||||||
"CREATE_FLOW": [
|
"CREATE_FLOW": [
|
||||||
{
|
{
|
||||||
"title": "Help center information",
|
"title": "Πληροφορίες κέντρου βοήθειας",
|
||||||
"route": "new_portal_information",
|
"route": "new_portal_information",
|
||||||
"body": "Basic information about portal",
|
"body": "Βασικές πληροφορίες σχετικά με την πύλη",
|
||||||
"CREATE_BASIC_SETTING_BUTTON": "Create portal basic settings"
|
"CREATE_BASIC_SETTING_BUTTON": "Δημιουργία βασικών ρυθμίσεων πύλης"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"title": "Help center customization",
|
"title": "Προσαρμογή του κέντρου βοήθειας",
|
||||||
"route": "portal_customization",
|
"route": "portal_customization",
|
||||||
"body": "Customize portal",
|
"body": "Προσαρμογή πύλης",
|
||||||
"UPDATE_PORTAL_BUTTON": "Update portal settings"
|
"UPDATE_PORTAL_BUTTON": "Ενημέρωση ρυθμίσεων πύλης"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"title": "Voila! 🎉",
|
"title": "Έξοχα! 🎉",
|
||||||
"route": "portal_finish",
|
"route": "portal_finish",
|
||||||
"body": "You're all set!",
|
"body": "Είναι όλα έτοιμα!",
|
||||||
"FINISH": "Τέλος"
|
"FINISH": "Τέλος"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"CREATE_FLOW_PAGE": {
|
"CREATE_FLOW_PAGE": {
|
||||||
"BACK_BUTTON": "Πίσω",
|
"BACK_BUTTON": "Πίσω",
|
||||||
"BASIC_SETTINGS_PAGE": {
|
"BASIC_SETTINGS_PAGE": {
|
||||||
"HEADER": "Create Portal",
|
"HEADER": "Δημιουργία Πύλης",
|
||||||
"TITLE": "Help center information",
|
"TITLE": "Πληροφορίες κέντρου βοήθειας",
|
||||||
"CREATE_BASIC_SETTING_BUTTON": "Create portal basic settings"
|
"CREATE_BASIC_SETTING_BUTTON": "Δημιουργία βασικών ρυθμίσεων πύλης"
|
||||||
},
|
},
|
||||||
"CUSTOMIZATION_PAGE": {
|
"CUSTOMIZATION_PAGE": {
|
||||||
"HEADER": "Portal customisation",
|
"HEADER": "Προσαρμογή πύλης",
|
||||||
"TITLE": "Help center customization",
|
"TITLE": "Προσαρμογή του κέντρου βοήθειας",
|
||||||
"UPDATE_PORTAL_BUTTON": "Update portal settings"
|
"UPDATE_PORTAL_BUTTON": "Ενημέρωση ρυθμίσεων πύλης"
|
||||||
},
|
},
|
||||||
"FINISH_PAGE": {
|
"FINISH_PAGE": {
|
||||||
"TITLE": "Voila!🎉 You're all set up!",
|
"TITLE": "Έξοχα!🎉 Έχετε ρυθμιστεί!",
|
||||||
"MESSAGE": "You can now see this created portal on your all portals page.",
|
"MESSAGE": "Τώρα μπορείτε να δείτε την πύλη που δημιουργήθηκε στη σελίδα με όλες τις πύλες.",
|
||||||
"FINISH": "Go to all portals page"
|
"FINISH": "Μετάβαση στις πύλες"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"LOGO": {
|
"LOGO": {
|
||||||
"LABEL": "Logo",
|
"LABEL": "Λογότυπο",
|
||||||
"UPLOAD_BUTTON": "Upload logo",
|
"UPLOAD_BUTTON": "Μεταφόρτωση λογότυπου",
|
||||||
"HELP_TEXT": "This logo will be displayed on the portal header."
|
"HELP_TEXT": "Το λογότυπο θα εμφανιστεί στην κεφαλίδα της πύλης."
|
||||||
},
|
},
|
||||||
"NAME": {
|
"NAME": {
|
||||||
"LABEL": "Όνομα",
|
"LABEL": "Όνομα",
|
||||||
"PLACEHOLDER": "Portal name",
|
"PLACEHOLDER": "Όνομα πύλης",
|
||||||
"HELP_TEXT": "The name will be used in the public facing portal internally.",
|
"HELP_TEXT": "Το όνομα θα χρησιμοποιηθεί στο κοινό που βλέπει την πύλη εσωτερικά.",
|
||||||
"ERROR": "Απαιτείται όνομα"
|
"ERROR": "Απαιτείται όνομα"
|
||||||
},
|
},
|
||||||
"SLUG": {
|
"SLUG": {
|
||||||
"LABEL": "Slug",
|
"LABEL": "Slug",
|
||||||
"PLACEHOLDER": "Portal slug for urls",
|
"PLACEHOLDER": "Slug Πύλης για τα urls",
|
||||||
"ERROR": "Slug is required"
|
"ERROR": "Το Slug είναι απαραίτητο"
|
||||||
},
|
},
|
||||||
"DOMAIN": {
|
"DOMAIN": {
|
||||||
"LABEL": "Custom Domain",
|
"LABEL": "Προσαρμοσμένο Domain",
|
||||||
"PLACEHOLDER": "Portal custom domain",
|
"PLACEHOLDER": "Προσαρμοσμένος τομέας πύλης",
|
||||||
"HELP_TEXT": "Add only If you want to use a custom domain for your portals.",
|
"HELP_TEXT": "Προσθήκη μόνο Αν θέλετε να χρησιμοποιήσετε ένα προσαρμοσμένο τομέα για τις πύλες σας. (Automatic Translation).",
|
||||||
"ERROR": "Custom Domain is required"
|
"ERROR": "Ο Προσαρμοσμένος Τομέας απαιτείται"
|
||||||
},
|
},
|
||||||
"HOME_PAGE_LINK": {
|
"HOME_PAGE_LINK": {
|
||||||
"LABEL": "Home Page Link",
|
"LABEL": "Σύνδεσμος Αρχικής Σελίδας",
|
||||||
"PLACEHOLDER": "Portal home page link",
|
"PLACEHOLDER": "Σύνδεσμος αρχικής σελίδας πύλης",
|
||||||
"HELP_TEXT": "The link used to return from the portal to the home page.",
|
"HELP_TEXT": "Ο σύνδεσμος που χρησιμοποιείται για την επιστροφή από την πύλη στην αρχική σελίδα.",
|
||||||
"ERROR": "Home Page Link is required"
|
"ERROR": "Ο σύνδεσμος αρχικής σελίδας απαιτείται"
|
||||||
},
|
},
|
||||||
"THEME_COLOR": {
|
"THEME_COLOR": {
|
||||||
"LABEL": "Portal theme color",
|
"LABEL": "Χρώμα θέματος πύλης",
|
||||||
"HELP_TEXT": "This color will show as the theme color for the portal."
|
"HELP_TEXT": "Αυτό το χρώμα θα εμφανίζεται ως το χρώμα θέματος της πύλης. "
|
||||||
},
|
},
|
||||||
"PAGE_TITLE": {
|
"PAGE_TITLE": {
|
||||||
"LABEL": "Page Title",
|
"LABEL": "Τίτλος Σελίδας",
|
||||||
"PLACEHOLDER": "Portal page title",
|
"PLACEHOLDER": "Τίτλος σελίδας πύλης",
|
||||||
"HELP_TEXT": "The page title will be used in the public facing portal.",
|
"HELP_TEXT": "Ο τίτλος της σελίδας θα χρησιμοποιηθεί στην πύλη που βλέπει το κοινό.",
|
||||||
"ERROR": "Page title is required"
|
"ERROR": "Ο τίτλος είναι απαραίτητος"
|
||||||
},
|
},
|
||||||
"HEADER_TEXT": {
|
"HEADER_TEXT": {
|
||||||
"LABEL": "Header Text",
|
"LABEL": "Κείμενο Κεφαλίδας",
|
||||||
"PLACEHOLDER": "Portal header text",
|
"PLACEHOLDER": "Κείμενο κεφαλίδας πύλης",
|
||||||
"HELP_TEXT": "The Portal header text will be used in the public facing portal.",
|
"HELP_TEXT": "Το κείμενο κεφαλίδας πύλης θα χρησιμοποιηθεί στο κοινό που βλέπει πύλη.",
|
||||||
"ERROR": "Portal header text is required"
|
"ERROR": "Απαιτείται κείμενο κεφαλίδας πύλης"
|
||||||
},
|
},
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE_FOR_BASIC": "Portal created successfully.",
|
"SUCCESS_MESSAGE_FOR_BASIC": "Ο φάκελος δημιουργήθηκε με επιτυχία.",
|
||||||
"ERROR_MESSAGE_FOR_BASIC": "Couldn't create the portal. Try again.",
|
"ERROR_MESSAGE_FOR_BASIC": "Δεν ήταν δυνατή η δημιουργία της πύλης. Δοκιμάστε ξανά.",
|
||||||
"SUCCESS_MESSAGE_FOR_UPDATE": "Portal updated successfully.",
|
"SUCCESS_MESSAGE_FOR_UPDATE": "Η πύλη ενημερώθηκε με επιτυχία.",
|
||||||
"ERROR_MESSAGE_FOR_UPDATE": "Couldn't update the portal. Try again."
|
"ERROR_MESSAGE_FOR_UPDATE": "Δεν ήταν δυνατή η ενημέρωση της πύλης. Δοκιμάστε ξανά."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ADD_LOCALE": {
|
"ADD_LOCALE": {
|
||||||
"TITLE": "Add a new locale",
|
"TITLE": "Προσθέστε μια νέα γλώσσα",
|
||||||
"SUB_TITLE": "This adds a new locale to your available translation list.",
|
"SUB_TITLE": "Προσθέτει μια νέα γλώσσα στη διαθέσιμη λίστα μεταφράσεών σας.",
|
||||||
"PORTAL": "Portal",
|
"PORTAL": "Πύλη",
|
||||||
"LOCALE": {
|
"LOCALE": {
|
||||||
"LABEL": "Locale",
|
"LABEL": "Γλώσσα",
|
||||||
"PLACEHOLDER": "Choose a locale",
|
"PLACEHOLDER": "Επιλέξτε μια γλώσσα",
|
||||||
"ERROR": "Locale is required"
|
"ERROR": "Η γλώσσα απαιτείται"
|
||||||
},
|
},
|
||||||
"BUTTONS": {
|
"BUTTONS": {
|
||||||
"CREATE": "Create locale",
|
"CREATE": "Δημιουργία γλώσσας",
|
||||||
"CANCEL": "Άκυρο"
|
"CANCEL": "Άκυρο"
|
||||||
},
|
},
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Locale added successfully",
|
"SUCCESS_MESSAGE": "Η γλώσσα προστέθηκε επιτυχώς",
|
||||||
"ERROR_MESSAGE": "Unable to add locale. Try again."
|
"ERROR_MESSAGE": "Δεν είναι δυνατή η προσθήκη γλώσσας. Δοκιμάστε ξανά."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"CHANGE_DEFAULT_LOCALE": {
|
"CHANGE_DEFAULT_LOCALE": {
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Default locale updated successfully",
|
"SUCCESS_MESSAGE": "Η προεπιλεγμένη γλώσσα ενημερώθηκε επιτυχώς",
|
||||||
"ERROR_MESSAGE": "Unable to update default locale. Try again."
|
"ERROR_MESSAGE": "Δεν είναι δυνατή η ενημέρωση της προεπιλεγμένης γλώσσας. Δοκιμάστε ξανά."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"DELETE_LOCALE": {
|
"DELETE_LOCALE": {
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Locale removed from portal successfully",
|
"SUCCESS_MESSAGE": "Η γλώσσα αφαιρέθηκε επιτυχώς από την πύλη",
|
||||||
"ERROR_MESSAGE": "Unable to remove locale from portal. Try again."
|
"ERROR_MESSAGE": "Δεν είναι δυνατή η αφαίρεση γλώσσας από την πύλη. Δοκιμάστε ξανά."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"TABLE": {
|
"TABLE": {
|
||||||
"LOADING_MESSAGE": "Loading articles...",
|
"LOADING_MESSAGE": "Φόρτωση άρθρων...",
|
||||||
"404": "No articles matches your search 🔍",
|
"404": "Δεν υπάρχουν άρθρα που να ταιριάζουν στην αναζήτησή σας 🔍",
|
||||||
"NO_ARTICLES": "There are no available articles",
|
"NO_ARTICLES": "Δεν υπάρχουν διαθέσιμα άρθρα",
|
||||||
"HEADERS": {
|
"HEADERS": {
|
||||||
"TITLE": "Τίτλος",
|
"TITLE": "Τίτλος",
|
||||||
"CATEGORY": "Κατηγορία",
|
"CATEGORY": "Κατηγορία",
|
||||||
"READ_COUNT": "Read count",
|
"READ_COUNT": "Πλήθος ανάγνωσεων",
|
||||||
"STATUS": "Κατάσταση",
|
"STATUS": "Κατάσταση",
|
||||||
"LAST_EDITED": "Last edited"
|
"LAST_EDITED": "Τελευταία επεξεργασία"
|
||||||
},
|
},
|
||||||
"COLUMNS": {
|
"COLUMNS": {
|
||||||
"BY": "by"
|
"BY": "από"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"EDIT_ARTICLE": {
|
"EDIT_ARTICLE": {
|
||||||
"LOADING": "Loading article...",
|
"LOADING": "Φόρτωση άρθρου...",
|
||||||
"TITLE_PLACEHOLDER": "Article title goes here",
|
"TITLE_PLACEHOLDER": "Ο τίτλος του άρθρου εμφανίζεται εδώ",
|
||||||
"CONTENT_PLACEHOLDER": "Write your article here",
|
"CONTENT_PLACEHOLDER": "Γράψτε το άρθρο σας εδώ",
|
||||||
"API": {
|
"API": {
|
||||||
"ERROR": "Error while saving article"
|
"ERROR": "Σφάλμα κατά την αποθήκευση άρθρου"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"PUBLISH_ARTICLE": {
|
"PUBLISH_ARTICLE": {
|
||||||
"API": {
|
"API": {
|
||||||
"ERROR": "Error while publishing article",
|
"ERROR": "Σφάλμα κατά τη δημοσίευση του άρθρου",
|
||||||
"SUCCESS": "Article published successfully"
|
"SUCCESS": "Το Άρθρο δημοσιεύθηκε με επιτυχία"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ARCHIVE_ARTICLE": {
|
"ARCHIVE_ARTICLE": {
|
||||||
"API": {
|
"API": {
|
||||||
"ERROR": "Error while archiving article",
|
"ERROR": "Σφάλμα κατά την αρχειοθέτηση άρθρου",
|
||||||
"SUCCESS": "Article archived successfully"
|
"SUCCESS": "Το άρθρο αρχειοθετήθηκε επιτυχώς"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"DELETE_ARTICLE": {
|
"DELETE_ARTICLE": {
|
||||||
"MODAL": {
|
"MODAL": {
|
||||||
"CONFIRM": {
|
"CONFIRM": {
|
||||||
"TITLE": "Επιβεβαίωση Διαγραφής",
|
"TITLE": "Επιβεβαίωση Διαγραφής",
|
||||||
"MESSAGE": "Are you sure to delete the article?",
|
"MESSAGE": "Είστε βέβαιοι να διαγράψετε το άρθρο;",
|
||||||
"YES": "Ναι, Διέγραψε το",
|
"YES": "Ναι, Διέγραψε το",
|
||||||
"NO": "Όχι, Κράτησε τον/την"
|
"NO": "Όχι, Κράτησε τον/την"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Article deleted successfully",
|
"SUCCESS_MESSAGE": "Η επαφή διαγράφηκε επιτυχώς",
|
||||||
"ERROR_MESSAGE": "Error while deleting article"
|
"ERROR_MESSAGE": "Σφάλμα κατά τη διαγραφή άρθρου"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"CREATE_ARTICLE": {
|
"CREATE_ARTICLE": {
|
||||||
"ERROR_MESSAGE": "Please add the article heading and content then only you can update the settings"
|
"ERROR_MESSAGE": "Παρακαλώ προσθέστε την επικεφαλίδα και το περιεχόμενο του άρθρου για να μπορείτε να ενημερώσετε τις ρυθμίσεις"
|
||||||
},
|
},
|
||||||
"SIDEBAR": {
|
"SIDEBAR": {
|
||||||
"SEARCH": {
|
"SEARCH": {
|
||||||
"PLACEHOLDER": "Search for articles"
|
"PLACEHOLDER": "Αναζήτηση άρθρων"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"CATEGORY": {
|
"CATEGORY": {
|
||||||
"ADD": {
|
"ADD": {
|
||||||
"TITLE": "Create a category",
|
"TITLE": "Δημιουργία κατηγορίας",
|
||||||
"SUB_TITLE": "The category will be used in the public facing portal to categorize articles.",
|
"SUB_TITLE": "Η κατηγορία θα χρησιμοποιηθεί στην πύλη που βλέπει το κοινό για την κατηγοριοποίηση των άρθρων.",
|
||||||
"PORTAL": "Portal",
|
"PORTAL": "Πύλη",
|
||||||
"LOCALE": "Locale",
|
"LOCALE": "Γλώσσα",
|
||||||
"NAME": {
|
"NAME": {
|
||||||
"LABEL": "Όνομα",
|
"LABEL": "Όνομα",
|
||||||
"PLACEHOLDER": "Category name",
|
"PLACEHOLDER": "Όνομα κατηγορίας",
|
||||||
"HELP_TEXT": "The category name will be used in the public facing portal to categorize articles.",
|
"HELP_TEXT": "Η κατηγορία θα χρησιμοποιηθεί στην πύλη που βλέπει το κοινό για την κατηγοριοποίηση των άρθρων.",
|
||||||
"ERROR": "Απαιτείται όνομα"
|
"ERROR": "Απαιτείται όνομα"
|
||||||
},
|
},
|
||||||
"SLUG": {
|
"SLUG": {
|
||||||
"LABEL": "Slug",
|
"LABEL": "Slug",
|
||||||
"PLACEHOLDER": "Category slug for urls",
|
"PLACEHOLDER": "Slug κατηγορίας για urls",
|
||||||
"HELP_TEXT": "app.chatwoot.com/hc/my-portal/en-US/categories/my-slug",
|
"HELP_TEXT": "app.chatwoot.com/hc/my-portal/en-US/categories/my-slug",
|
||||||
"ERROR": "Slug is required"
|
"ERROR": "Το Slug είναι απαραίτητο"
|
||||||
},
|
},
|
||||||
"DESCRIPTION": {
|
"DESCRIPTION": {
|
||||||
"LABEL": "Περιγραφή",
|
"LABEL": "Περιγραφή",
|
||||||
"PLACEHOLDER": "Give a short description about the category.",
|
"PLACEHOLDER": "Δώστε μια σύντομη περιγραφή της κατηγορίας.",
|
||||||
"ERROR": "Η περιγραφή απαιτείται"
|
"ERROR": "Η περιγραφή απαιτείται"
|
||||||
},
|
},
|
||||||
"BUTTONS": {
|
"BUTTONS": {
|
||||||
"CREATE": "Create category",
|
"CREATE": "Δημιουργία κατηγορίας",
|
||||||
"CANCEL": "Άκυρο"
|
"CANCEL": "Άκυρο"
|
||||||
},
|
},
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Category created successfully",
|
"SUCCESS_MESSAGE": "Η κατηγορία δημιουργήθηκε με επιτυχία",
|
||||||
"ERROR_MESSAGE": "Unable to create category"
|
"ERROR_MESSAGE": "Αδυναμία δημιουργίας κατηγορίας"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"EDIT": {
|
"EDIT": {
|
||||||
"TITLE": "Edit a category",
|
"TITLE": "Επεξεργασία κατηγορίας",
|
||||||
"SUB_TITLE": "Editing a category will update the category in the public facing portal.",
|
"SUB_TITLE": "Η επεξεργασία μιας κατηγορίας θα ενημερώσει την κατηγορία στην πύλη που βλέπει το κοινό.",
|
||||||
"PORTAL": "Portal",
|
"PORTAL": "Πύλη",
|
||||||
"LOCALE": "Locale",
|
"LOCALE": "Γλώσσα",
|
||||||
"NAME": {
|
"NAME": {
|
||||||
"LABEL": "Όνομα",
|
"LABEL": "Όνομα",
|
||||||
"PLACEHOLDER": "Category name",
|
"PLACEHOLDER": "Όνομα κατηγορίας",
|
||||||
"HELP_TEXT": "The category name will be used in the public facing portal to categorize articles.",
|
"HELP_TEXT": "Η κατηγορία θα χρησιμοποιηθεί στην πύλη που βλέπει το κοινό για την κατηγοριοποίηση των άρθρων.",
|
||||||
"ERROR": "Απαιτείται όνομα"
|
"ERROR": "Απαιτείται όνομα"
|
||||||
},
|
},
|
||||||
"SLUG": {
|
"SLUG": {
|
||||||
"LABEL": "Slug",
|
"LABEL": "Slug",
|
||||||
"PLACEHOLDER": "Category slug for urls",
|
"PLACEHOLDER": "Slug κατηγορίας για urls",
|
||||||
"HELP_TEXT": "app.chatwoot.com/hc/my-portal/en-US/categories/my-slug",
|
"HELP_TEXT": "app.chatwoot.com/hc/my-portal/en-US/categories/my-slug",
|
||||||
"ERROR": "Slug is required"
|
"ERROR": "Το Slug είναι απαραίτητο"
|
||||||
},
|
},
|
||||||
"DESCRIPTION": {
|
"DESCRIPTION": {
|
||||||
"LABEL": "Περιγραφή",
|
"LABEL": "Περιγραφή",
|
||||||
"PLACEHOLDER": "Give a short description about the category.",
|
"PLACEHOLDER": "Δώστε μια σύντομη περιγραφή της κατηγορίας.",
|
||||||
"ERROR": "Η περιγραφή απαιτείται"
|
"ERROR": "Η περιγραφή απαιτείται"
|
||||||
},
|
},
|
||||||
"BUTTONS": {
|
"BUTTONS": {
|
||||||
"CREATE": "Update category",
|
"CREATE": "Επεξεργασία κατηγορίας",
|
||||||
"CANCEL": "Άκυρο"
|
"CANCEL": "Άκυρο"
|
||||||
},
|
},
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Category updated successfully",
|
"SUCCESS_MESSAGE": "Η ετικέτα ενημερώθηκε επιτυχώς",
|
||||||
"ERROR_MESSAGE": "Unable to update category"
|
"ERROR_MESSAGE": "Αδύνατη η ενημέρωση της κατηγορίας"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"DELETE": {
|
"DELETE": {
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Category deleted successfully",
|
"SUCCESS_MESSAGE": "Η καμπάνια διαγράφηκε επιτυχώς",
|
||||||
"ERROR_MESSAGE": "Unable to delete category"
|
"ERROR_MESSAGE": "Δεν είναι δυνατή η διαγραφή κατηγορίας"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -112,10 +112,10 @@
|
||||||
"ERROR": "Το πεδίο είναι απαραίτητο"
|
"ERROR": "Το πεδίο είναι απαραίτητο"
|
||||||
},
|
},
|
||||||
"MESSAGING_SERVICE_SID": {
|
"MESSAGING_SERVICE_SID": {
|
||||||
"LABEL": "Messaging Service SID",
|
"LABEL": "SID Υπηρεσίας Μηνυμάτων",
|
||||||
"PLACEHOLDER": "Please enter your Twilio Messaging Service SID",
|
"PLACEHOLDER": "Παρακαλώ εισάγετε το Twilio Messaging Service SID σας",
|
||||||
"ERROR": "Το πεδίο είναι απαραίτητο",
|
"ERROR": "Το πεδίο είναι απαραίτητο",
|
||||||
"USE_MESSAGING_SERVICE": "Use a Twilio Messaging Service"
|
"USE_MESSAGING_SERVICE": "Χρήση μιας υπηρεσίας μηνυμάτων Twilio"
|
||||||
},
|
},
|
||||||
"CHANNEL_TYPE": {
|
"CHANNEL_TYPE": {
|
||||||
"LABEL": "Τύπος Καναλιού",
|
"LABEL": "Τύπος Καναλιού",
|
||||||
|
@ -239,7 +239,9 @@
|
||||||
},
|
},
|
||||||
"API_CALLBACK": {
|
"API_CALLBACK": {
|
||||||
"TITLE": "URL επανάκλησης",
|
"TITLE": "URL επανάκλησης",
|
||||||
"SUBTITLE": "Θα πρέπει να ρυθμίσετε το URL webhook στο facebook developer portal με το URL που αναφέρεται εδώ."
|
"SUBTITLE": "Πρέπει να ρυθμίσετε τη διεύθυνση URL του webhook και το διακριτικό επαλήθευσης στην πύλη Προγραμματιστή Facebook με τις τιμές που εμφανίζονται παρακάτω.",
|
||||||
|
"WEBHOOK_URL": "Σύνδεσμος Webhook",
|
||||||
|
"WEBHOOK_VERIFICATION_TOKEN": "Token Επαλήθευσης Webhook"
|
||||||
},
|
},
|
||||||
"SUBMIT_BUTTON": "Δημιουργία Καναλιού WhatsApp",
|
"SUBMIT_BUTTON": "Δημιουργία Καναλιού WhatsApp",
|
||||||
"API": {
|
"API": {
|
||||||
|
@ -357,7 +359,7 @@
|
||||||
},
|
},
|
||||||
"FINISH": {
|
"FINISH": {
|
||||||
"TITLE": "Το κιβώτιο σας είναι έτοιμο!",
|
"TITLE": "Το κιβώτιο σας είναι έτοιμο!",
|
||||||
"MESSAGE": "Μπορείτε να συνομιλείτε με τους πελάτες σας από το νέο κανάλι. Καλή υποστήριξη ",
|
"MESSAGE": "Μπορείτε να συνομιλείτε με τους πελάτες σας από το νέο κανάλι. Καλή υποστήριξη",
|
||||||
"BUTTON_TEXT": "Μετάβαση",
|
"BUTTON_TEXT": "Μετάβαση",
|
||||||
"MORE_SETTINGS": "Περισσότερες ρυθμίσεις",
|
"MORE_SETTINGS": "Περισσότερες ρυθμίσεις",
|
||||||
"WEBSITE_SUCCESS": "Επιτυχής δημιουργία του καναλιού ιστοσελίδας. Αντιγράψτε τον κώδικα που παρουσιάζεται παρακάτω, και τοποθετήστε τον στην ιστοσελίδα σας. Την επόμενη φορά που κάποιος πελάτης χρησιμοποιήσει το 'live chat', η συνομιλία θα εμφανιστεί στο κιβώτιο εισερχομένων σας."
|
"WEBSITE_SUCCESS": "Επιτυχής δημιουργία του καναλιού ιστοσελίδας. Αντιγράψτε τον κώδικα που παρουσιάζεται παρακάτω, και τοποθετήστε τον στην ιστοσελίδα σας. Την επόμενη φορά που κάποιος πελάτης χρησιμοποιήσει το 'live chat', η συνομιλία θα εμφανιστεί στο κιβώτιο εισερχομένων σας."
|
||||||
|
@ -414,7 +416,7 @@
|
||||||
"CAMPAIGN": "Καμπάνιες",
|
"CAMPAIGN": "Καμπάνιες",
|
||||||
"PRE_CHAT_FORM": "Φόρμα Προ-Συνομιλίας",
|
"PRE_CHAT_FORM": "Φόρμα Προ-Συνομιλίας",
|
||||||
"BUSINESS_HOURS": "Ώρες Εργασίας",
|
"BUSINESS_HOURS": "Ώρες Εργασίας",
|
||||||
"WIDGET_BUILDER": "Widget Builder"
|
"WIDGET_BUILDER": "Δημιουργός Widget"
|
||||||
},
|
},
|
||||||
"SETTINGS": "Ρυθμίσεις",
|
"SETTINGS": "Ρυθμίσεις",
|
||||||
"FEATURES": {
|
"FEATURES": {
|
||||||
|
@ -579,10 +581,10 @@
|
||||||
"WIDGET_BUILDER": {
|
"WIDGET_BUILDER": {
|
||||||
"WIDGET_OPTIONS": {
|
"WIDGET_OPTIONS": {
|
||||||
"AVATAR": {
|
"AVATAR": {
|
||||||
"LABEL": "Website Avatar",
|
"LABEL": "Avatar Ιστοσελίδας",
|
||||||
"DELETE": {
|
"DELETE": {
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Avatar deleted successfully",
|
"SUCCESS_MESSAGE": "Το Avatar διαγράφηκε επιτυχώς",
|
||||||
"ERROR_MESSAGE": "Υπήρξε ένα σφάλμα, παρακαλώ προσπαθήστε ξανά"
|
"ERROR_MESSAGE": "Υπήρξε ένα σφάλμα, παρακαλώ προσπαθήστε ξανά"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -590,7 +592,7 @@
|
||||||
"WEBSITE_NAME": {
|
"WEBSITE_NAME": {
|
||||||
"LABEL": "Όνομα Ιστοσελίδας",
|
"LABEL": "Όνομα Ιστοσελίδας",
|
||||||
"PLACE_HOLDER": "Συμπληρώστε την ονομασία της ιστοσελίδας σας (π.χ: Ελληνικό Μεσογειακό Πανεπιστήμιο)",
|
"PLACE_HOLDER": "Συμπληρώστε την ονομασία της ιστοσελίδας σας (π.χ: Ελληνικό Μεσογειακό Πανεπιστήμιο)",
|
||||||
"ERROR": "Please enter a valid website name"
|
"ERROR": "Παρακαλώ δώστε ένα έγκυρο όνομα ιστοσελίδας"
|
||||||
},
|
},
|
||||||
"WELCOME_HEADING": {
|
"WELCOME_HEADING": {
|
||||||
"LABEL": "Καλώς ήλθατε (Heading)",
|
"LABEL": "Καλώς ήλθατε (Heading)",
|
||||||
|
@ -601,42 +603,42 @@
|
||||||
"PLACE_HOLDER": "Είναι απλό να συνδεθείτε μαζί μας. Ζητήστε μας οτιδήποτε, ή μοιραστείτε την εμπειρία σας."
|
"PLACE_HOLDER": "Είναι απλό να συνδεθείτε μαζί μας. Ζητήστε μας οτιδήποτε, ή μοιραστείτε την εμπειρία σας."
|
||||||
},
|
},
|
||||||
"REPLY_TIME": {
|
"REPLY_TIME": {
|
||||||
"LABEL": "Reply Time",
|
"LABEL": "Χρόνος Απάντησης",
|
||||||
"IN_A_FEW_MINUTES": "Σε μερικά λεπτά",
|
"IN_A_FEW_MINUTES": "Σε μερικά λεπτά",
|
||||||
"IN_A_FEW_HOURS": "Σε μερικές ώρες",
|
"IN_A_FEW_HOURS": "Σε μερικές ώρες",
|
||||||
"IN_A_DAY": "Σε μία ημέρα"
|
"IN_A_DAY": "Σε μία ημέρα"
|
||||||
},
|
},
|
||||||
"WIDGET_COLOR_LABEL": "Χρώμα Widget",
|
"WIDGET_COLOR_LABEL": "Χρώμα Widget",
|
||||||
"WIDGET_BUBBLE_POSITION_LABEL": "Widget Bubble Position",
|
"WIDGET_BUBBLE_POSITION_LABEL": "Θέση Φυσαλίδας Widget",
|
||||||
"WIDGET_BUBBLE_TYPE_LABEL": "Widget Bubble Type",
|
"WIDGET_BUBBLE_TYPE_LABEL": "Τύπος Φυσαλίδας Widget",
|
||||||
"WIDGET_BUBBLE_LAUNCHER_TITLE": {
|
"WIDGET_BUBBLE_LAUNCHER_TITLE": {
|
||||||
"DEFAULT": "Συνομιλήστε μαζί μας",
|
"DEFAULT": "Συνομιλήστε μαζί μας",
|
||||||
"LABEL": "Widget Bubble Launcher Title",
|
"LABEL": "Τίτλος Εκκίνησης Φυσαλίδας Widget",
|
||||||
"PLACE_HOLDER": "Συνομιλήστε μαζί μας"
|
"PLACE_HOLDER": "Συνομιλήστε μαζί μας"
|
||||||
},
|
},
|
||||||
"UPDATE": {
|
"UPDATE": {
|
||||||
"BUTTON_TEXT": "Update Widget Settings",
|
"BUTTON_TEXT": "Ενημέρωση Ρυθμίσεων Widget",
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Widget settings updated successfully",
|
"SUCCESS_MESSAGE": "Οι ρυθμίσεις widget ενημερώθηκαν με επιτυχία",
|
||||||
"ERROR_MESSAGE": "Unable to update widget settings"
|
"ERROR_MESSAGE": "Δεν είναι δυνατή η ενημέρωση ρυθμίσεων widget"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"WIDGET_VIEW_OPTION": {
|
"WIDGET_VIEW_OPTION": {
|
||||||
"PREVIEW": "Preview",
|
"PREVIEW": "Προεπισκόπηση",
|
||||||
"SCRIPT": "Script"
|
"SCRIPT": "Script"
|
||||||
},
|
},
|
||||||
"WIDGET_BUBBLE_POSITION": {
|
"WIDGET_BUBBLE_POSITION": {
|
||||||
"LEFT": "Left",
|
"LEFT": "Αριστερά",
|
||||||
"RIGHT": "Right"
|
"RIGHT": "Δεξιά"
|
||||||
},
|
},
|
||||||
"WIDGET_BUBBLE_TYPE": {
|
"WIDGET_BUBBLE_TYPE": {
|
||||||
"STANDARD": "Standard",
|
"STANDARD": "Standard",
|
||||||
"EXPANDED_BUBBLE": "Expanded Bubble"
|
"EXPANDED_BUBBLE": "Εκτεταμένη Φυσαλίδα"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"WIDGET_SCREEN": {
|
"WIDGET_SCREEN": {
|
||||||
"DEFAULT": "Default",
|
"DEFAULT": "Προεπιλογή",
|
||||||
"CHAT": "Chat"
|
"CHAT": "Συνομιλία"
|
||||||
},
|
},
|
||||||
"REPLY_TIME": {
|
"REPLY_TIME": {
|
||||||
"IN_A_FEW_MINUTES": "Τυπικά έχετε απάντηση σε μερικά λεπτά",
|
"IN_A_FEW_MINUTES": "Τυπικά έχετε απάντηση σε μερικά λεπτά",
|
||||||
|
@ -649,11 +651,11 @@
|
||||||
},
|
},
|
||||||
"BODY": {
|
"BODY": {
|
||||||
"TEAM_AVAILABILITY": {
|
"TEAM_AVAILABILITY": {
|
||||||
"ONLINE": "We are Online",
|
"ONLINE": "Είμαστε online",
|
||||||
"OFFLINE": "Προς το παρόν, είμαστε εκτός"
|
"OFFLINE": "Προς το παρόν, είμαστε εκτός"
|
||||||
},
|
},
|
||||||
"USER_MESSAGE": "Hi",
|
"USER_MESSAGE": "Γειά",
|
||||||
"AGENT_MESSAGE": "Hello"
|
"AGENT_MESSAGE": "Γειά σας"
|
||||||
},
|
},
|
||||||
"BRANDING_TEXT": "με την δύναμη του Chatwoot",
|
"BRANDING_TEXT": "με την δύναμη του Chatwoot",
|
||||||
"SCRIPT_SETTINGS": "\n window.chatwootSettings = {options};"
|
"SCRIPT_SETTINGS": "\n window.chatwootSettings = {options};"
|
||||||
|
|
|
@ -86,49 +86,49 @@
|
||||||
"BUTTON_TEXT": "Σύνδεση"
|
"BUTTON_TEXT": "Σύνδεση"
|
||||||
},
|
},
|
||||||
"DASHBOARD_APPS": {
|
"DASHBOARD_APPS": {
|
||||||
"TITLE": "Dashboard Apps",
|
"TITLE": "Εφαρμογές Dashboard",
|
||||||
"HEADER_BTN_TXT": "Add a new dashboard app",
|
"HEADER_BTN_TXT": "Προσθήκη νέας εφαρμογής Dashboard",
|
||||||
"SIDEBAR_TXT": "<p><b>Dashboard Apps</b></p><p>Dashboard Apps allow organizations to embed an application inside the Chatwoot dashboard to provide the context for customer support agents. This feature allows you to create an application independently and embed that inside the dashboard to provide user information, their orders, or their previous payment history.</p><p>When you embed your application using the dashboard in Chatwoot, your application will get the context of the conversation and contact as a window event. Implement a listener for the message event on your page to receive the context.</p><p>To add a new dashboard app, click on the button 'Add a new dashboard app'.</p>",
|
"SIDEBAR_TXT": "<p><b>Εφαρμογές Dashboard</b></p><p>Οι εφαρμογές Dashboard επιτρέπουν σε οργανισμούς να ενσωματώσουν μια εφαρμογή μέσα στο ταμπλό Chatwoot για να παρέχουν το πλαίσιο για τους πράκτορες υποστήριξης πελατών. Αυτό το χαρακτηριστικό σας επιτρέπει να δημιουργήσετε μια εφαρμογή ανεξάρτητα και ενσωματωμένη που μέσα στον πίνακα ελέγχου για να παρέχει πληροφορίες χρήστη, τις παραγγελίες τους, ή το ιστορικό προηγούμενων πληρωμών τους.</p><p>Όταν ενσωματώσετε την εφαρμογή σας χρησιμοποιώντας το Dashboard στο Chatwoot, η εφαρμογή σας θα πάρει το πλαίσιο της συνομιλίας και θα επικοινωνήσει ως ένα παράθυρο εκδήλωσης. Εφαρμόστε έναν ακροατή για το γεγονός του μηνύματος στη σελίδα σας για να λάβετε το πλαίσιο.</p><p>Για να προσθέσετε μια νέα εφαρμογή ταμπλό, κάντε κλικ στο κουμπί 'Προσθήκη μιας νέας εφαρμογής Dashboard'.</p>",
|
||||||
"DESCRIPTION": "Dashboard Apps allow organizations to embed an application inside the dashboard to provide the context for customer support agents. This feature allows you to create an application independently and embed that to provide user information, their orders, or their previous payment history.",
|
"DESCRIPTION": "Οι εφαρμογές Dashboard επιτρέπουν στους οργανισμούς να ενσωματώσουν μια εφαρμογή μέσα στον πίνακα ελέγχου για να παρέχουν το περιεχόμενο για τους πράκτορες υποστήριξης πελατών. Αυτή η λειτουργία σας επιτρέπει να δημιουργήσετε μια εφαρμογή ανεξάρτητα και ενσωματωμένη που θα παρέχει πληροφορίες χρήστη, τις παραγγελίες τους, ή το ιστορικό προηγούμενων πληρωμών τους.",
|
||||||
"LIST": {
|
"LIST": {
|
||||||
"404": "There are no dashboard apps configured on this account yet",
|
"404": "Δεν έχουν δημιουργηθεί εφαρμογές Dashboard για αυτόν το λογαριασμό",
|
||||||
"LOADING": "Fetching dashboard apps...",
|
"LOADING": "Λήψη εφαρμογών dashboard ...",
|
||||||
"TABLE_HEADER": [
|
"TABLE_HEADER": [
|
||||||
"Όνομα",
|
"Όνομα",
|
||||||
"Endpoint"
|
"Endpoint"
|
||||||
],
|
],
|
||||||
"EDIT_TOOLTIP": "Edit app",
|
"EDIT_TOOLTIP": "Επεξεργασία εφαρμογής",
|
||||||
"DELETE_TOOLTIP": "Delete app"
|
"DELETE_TOOLTIP": "Διαγραφή εφαρμογής"
|
||||||
},
|
},
|
||||||
"FORM": {
|
"FORM": {
|
||||||
"TITLE_LABEL": "Όνομα",
|
"TITLE_LABEL": "Όνομα",
|
||||||
"TITLE_PLACEHOLDER": "Enter a name for your dashboard app",
|
"TITLE_PLACEHOLDER": "Εισάγετε όνομα για την εφαρμογή dashboard",
|
||||||
"TITLE_ERROR": "A name for the dashboard app is required",
|
"TITLE_ERROR": "Απαιτείται ένα όνομα για την εφαρμογή dashboard",
|
||||||
"URL_LABEL": "Endpoint",
|
"URL_LABEL": "Endpoint",
|
||||||
"URL_PLACEHOLDER": "Enter the endpoint URL where your app is hosted",
|
"URL_PLACEHOLDER": "Εισάγετε το URL του endpoint όπου φιλοξενείται η εφαρμογή σας",
|
||||||
"URL_ERROR": "A valid URL is required"
|
"URL_ERROR": "Απαιτείται ένα έγκυρο URL"
|
||||||
},
|
},
|
||||||
"CREATE": {
|
"CREATE": {
|
||||||
"HEADER": "Add a new dashboard app",
|
"HEADER": "Προσθήκη νέας εφαρμογής Dashboard",
|
||||||
"FORM_SUBMIT": "Καταχώρηση",
|
"FORM_SUBMIT": "Καταχώρηση",
|
||||||
"FORM_CANCEL": "Άκυρο",
|
"FORM_CANCEL": "Άκυρο",
|
||||||
"API_SUCCESS": "Dashboard app configured successfully",
|
"API_SUCCESS": "Η εφαρμογή dashboard ρυθμίστηκε επιτυχώς",
|
||||||
"API_ERROR": "We couldn't create an app. Please try again later"
|
"API_ERROR": "Δεν μπορούμε να δημιουργήσουμε μια εφαρμογή. Παρακαλώ δοκιμάστε ξανά αργότερα"
|
||||||
},
|
},
|
||||||
"UPDATE": {
|
"UPDATE": {
|
||||||
"HEADER": "Edit dashboard app",
|
"HEADER": "Επεξεργασία εφαρμογής dashboard",
|
||||||
"FORM_SUBMIT": "Ενημέρωση",
|
"FORM_SUBMIT": "Ενημέρωση",
|
||||||
"FORM_CANCEL": "Άκυρο",
|
"FORM_CANCEL": "Άκυρο",
|
||||||
"API_SUCCESS": "Dashboard app updated successfully",
|
"API_SUCCESS": "Η εφαρμογή dashboard ενημερώθηκε με επιτυχία",
|
||||||
"API_ERROR": "We couldn't update the app. Please try again later"
|
"API_ERROR": "Δεν ήταν δυνατή η ενημέρωση της εφαρμογής. Παρακαλώ δοκιμάστε ξανά αργότερα"
|
||||||
},
|
},
|
||||||
"DELETE": {
|
"DELETE": {
|
||||||
"CONFIRM_YES": "Yes, delete it",
|
"CONFIRM_YES": "Ναι, Διέγραψε την",
|
||||||
"CONFIRM_NO": "No, keep it",
|
"CONFIRM_NO": "Όχι, Κράτησε την",
|
||||||
"TITLE": "Επιβεβαίωση Διαγραφής",
|
"TITLE": "Επιβεβαίωση Διαγραφής",
|
||||||
"MESSAGE": "Are you sure to delete the app - %{appName}?",
|
"MESSAGE": "Είστε βέβαιοι να διαγράψετε την εφαρμογή - %{appName};",
|
||||||
"API_SUCCESS": "Dashboard app deleted successfully",
|
"API_SUCCESS": "Η εφαρμογή dashboard διαγράφηκε επιτυχώς",
|
||||||
"API_ERROR": "We couldn't delete the app. Please try again later"
|
"API_ERROR": "Δεν μπορούμε να διαγράψουμε την εφαρμογή. Παρακαλώ δοκιμάστε ξανά αργότερα"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
5
app/javascript/dashboard/i18n/locale/el/macros.json
Normal file
5
app/javascript/dashboard/i18n/locale/el/macros.json
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"MACROS": {
|
||||||
|
"HEADER": "Μακροεντολές"
|
||||||
|
}
|
||||||
|
}
|
|
@ -20,17 +20,17 @@
|
||||||
"NOTE": "Η διεύθυνση email είναι η ταυτότητά σας και χρησιμοποιείται για την είσοδο (login) σας."
|
"NOTE": "Η διεύθυνση email είναι η ταυτότητά σας και χρησιμοποιείται για την είσοδο (login) σας."
|
||||||
},
|
},
|
||||||
"SEND_MESSAGE": {
|
"SEND_MESSAGE": {
|
||||||
"TITLE": "Hotkey to send messages",
|
"TITLE": "Πλήκτρο συντόμευσης για αποστολή μηνυμάτων",
|
||||||
"NOTE": "You can select a hotkey (either Enter or Cmd/Ctrl+Enter) based on your preference of writing.",
|
"NOTE": "Μπορείτε να επιλέξετε μια συντόμευση (είτε εισάγετε είτε Cmd/Ctrl+Enter) με βάση την προτίμηση για το γράψιμο.",
|
||||||
"UPDATE_SUCCESS": "Your settings have been updated successfully",
|
"UPDATE_SUCCESS": "Οι ρυθμίσεις σας έχουν ενημερωθεί με επιτυχία",
|
||||||
"CARD": {
|
"CARD": {
|
||||||
"ENTER_KEY": {
|
"ENTER_KEY": {
|
||||||
"HEADING": "Enter (↵)",
|
"HEADING": "Enter (↵)",
|
||||||
"CONTENT": "Send messages by pressing Enter key instead of clicking the send button."
|
"CONTENT": "Αποστολή μηνυμάτων πατώντας το πλήκτρο Enter αντί να πατήσετε το κουμπί αποστολής."
|
||||||
},
|
},
|
||||||
"CMD_ENTER_KEY": {
|
"CMD_ENTER_KEY": {
|
||||||
"HEADING": "Cmd/Ctrl + Enter (⌘ + ↵)",
|
"HEADING": "Cmd/Ctrl + Enter (⌘ + ↵)",
|
||||||
"CONTENT": "Send messages by pressing Cmd/Ctrl + enter key instead of clicking the send button."
|
"CONTENT": "Αποστολή μηνυμάτων πατώντας το πλήκτρο Enter αντί να πατήσετε το κουμπί αποστολής."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -141,8 +141,8 @@
|
||||||
"TRAIL_BUTTON": "Αγόρασε τώρα",
|
"TRAIL_BUTTON": "Αγόρασε τώρα",
|
||||||
"DELETED_USER": "Διαγραμμένος Χρήστης",
|
"DELETED_USER": "Διαγραμμένος Χρήστης",
|
||||||
"ACCOUNT_SUSPENDED": {
|
"ACCOUNT_SUSPENDED": {
|
||||||
"TITLE": "Account Suspended",
|
"TITLE": "Αναστολή Λογαριασμού",
|
||||||
"MESSAGE": "Your account is suspended. Please reach out to the support team for more information."
|
"MESSAGE": "Ο λογαριασμός σας έχει ανασταλεί. Επικοινωνήστε με την ομάδα υποστήριξης για περισσότερες πληροφορίες."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"COMPONENTS": {
|
"COMPONENTS": {
|
||||||
|
@ -179,6 +179,7 @@
|
||||||
"CONTACTS": "Επαφές",
|
"CONTACTS": "Επαφές",
|
||||||
"HOME": "Αρχική",
|
"HOME": "Αρχική",
|
||||||
"AGENTS": "Πράκτορες",
|
"AGENTS": "Πράκτορες",
|
||||||
|
"AGENT_BOTS": "Bots",
|
||||||
"INBOXES": "Κιβώτια Εισερχομένων",
|
"INBOXES": "Κιβώτια Εισερχομένων",
|
||||||
"NOTIFICATIONS": "Ειδοποιήσεις",
|
"NOTIFICATIONS": "Ειδοποιήσεις",
|
||||||
"CANNED_RESPONSES": "Έτοιμες Απαντήσεις",
|
"CANNED_RESPONSES": "Έτοιμες Απαντήσεις",
|
||||||
|
@ -189,8 +190,9 @@
|
||||||
"LABELS": "Ετικέτες",
|
"LABELS": "Ετικέτες",
|
||||||
"CUSTOM_ATTRIBUTES": "Προσαρμοζόμενες Ιδιότητες",
|
"CUSTOM_ATTRIBUTES": "Προσαρμοζόμενες Ιδιότητες",
|
||||||
"AUTOMATION": "Αυτοματισμός",
|
"AUTOMATION": "Αυτοματισμός",
|
||||||
|
"MACROS": "Μακροεντολές",
|
||||||
"TEAMS": "Ομάδες",
|
"TEAMS": "Ομάδες",
|
||||||
"BILLING": "Billing",
|
"BILLING": "Χρεώσεις",
|
||||||
"CUSTOM_VIEWS_FOLDER": "Φάκελοι",
|
"CUSTOM_VIEWS_FOLDER": "Φάκελοι",
|
||||||
"CUSTOM_VIEWS_SEGMENTS": "Τμήματα",
|
"CUSTOM_VIEWS_SEGMENTS": "Τμήματα",
|
||||||
"ALL_CONTACTS": "Όλες Οι Επαφές",
|
"ALL_CONTACTS": "Όλες Οι Επαφές",
|
||||||
|
@ -212,33 +214,33 @@
|
||||||
"REPORTS_OVERVIEW": "Επισκόπηση",
|
"REPORTS_OVERVIEW": "Επισκόπηση",
|
||||||
"FACEBOOK_REAUTHORIZE": "Η σύνδεση Facebook έχει λήξει, παρακαλώ ξανασυνδεθείτε στο Facebook για να συνεχίσετε",
|
"FACEBOOK_REAUTHORIZE": "Η σύνδεση Facebook έχει λήξει, παρακαλώ ξανασυνδεθείτε στο Facebook για να συνεχίσετε",
|
||||||
"HELP_CENTER": {
|
"HELP_CENTER": {
|
||||||
"TITLE": "Help Center (Beta)",
|
"TITLE": "Κέντρο Βοήθειας (Beta)",
|
||||||
"ALL_ARTICLES": "All Articles",
|
"ALL_ARTICLES": "Όλα Τα Άρθρα",
|
||||||
"MY_ARTICLES": "My Articles",
|
"MY_ARTICLES": "Τα Άρθρα Μου",
|
||||||
"DRAFT": "Draft",
|
"DRAFT": "Πρόχειρο",
|
||||||
"ARCHIVED": "Archived",
|
"ARCHIVED": "Αρχειοθετημένο",
|
||||||
"CATEGORY": "Κατηγορία",
|
"CATEGORY": "Κατηγορία",
|
||||||
"CATEGORY_EMPTY_MESSAGE": "No categories found"
|
"CATEGORY_EMPTY_MESSAGE": "Δεν βρέθηκαν κατηγορίες"
|
||||||
},
|
},
|
||||||
"DOCS": "Read docs"
|
"DOCS": "Ανάγνωση εγγράφων"
|
||||||
},
|
},
|
||||||
"BILLING_SETTINGS": {
|
"BILLING_SETTINGS": {
|
||||||
"TITLE": "Billing",
|
"TITLE": "Χρεώσεις",
|
||||||
"CURRENT_PLAN": {
|
"CURRENT_PLAN": {
|
||||||
"TITLE": "Current Plan",
|
"TITLE": "Τρέχον Πλάνο",
|
||||||
"PLAN_NOTE": "You are currently subscribed to the **%{plan}** plan with **%{quantity}** licenses"
|
"PLAN_NOTE": "Αυτή τη στιγμή έχετε εγγραφεί στο πλάνο **%{plan}** με **%{quantity}** άδειες"
|
||||||
},
|
},
|
||||||
"MANAGE_SUBSCRIPTION": {
|
"MANAGE_SUBSCRIPTION": {
|
||||||
"TITLE": "Manage your subscription",
|
"TITLE": "Διαχειριστείτε τη συνδρομή σας",
|
||||||
"DESCRIPTION": "View your previous invoices, edit your billing details, or cancel your subscription.",
|
"DESCRIPTION": "Δείτε τα προηγούμενα τιμολόγια σας, επεξεργαστείτε τα στοιχεία χρέωσης ή ακυρώστε τη συνδρομή σας.",
|
||||||
"BUTTON_TXT": "Go to the billing portal"
|
"BUTTON_TXT": "Μετάβαση στην πύλη χρέωσης"
|
||||||
},
|
},
|
||||||
"CHAT_WITH_US": {
|
"CHAT_WITH_US": {
|
||||||
"TITLE": "Need help?",
|
"TITLE": "Χρειάζεστε βοήθεια;",
|
||||||
"DESCRIPTION": "Do you face any issues in billing? We are here to help.",
|
"DESCRIPTION": "Αντιμετωπίζετε οποιαδήποτε προβλήματα στην τιμολόγηση? Είμαστε εδώ για να βοηθήσουμε.",
|
||||||
"BUTTON_TXT": "Συνομιλήστε μαζί μας"
|
"BUTTON_TXT": "Συνομιλήστε μαζί μας"
|
||||||
},
|
},
|
||||||
"NO_BILLING_USER": "Your billing account is being configured. Please refresh the page and try again."
|
"NO_BILLING_USER": "Ο λογαριασμός χρέωσης έχει ρυθμιστεί. Παρακαλώ ανανεώστε τη σελίδα και προσπαθήστε ξανά."
|
||||||
},
|
},
|
||||||
"CREATE_ACCOUNT": {
|
"CREATE_ACCOUNT": {
|
||||||
"NO_ACCOUNT_WARNING": "Ωχ! Δεν μπορέσαμε να βρούμε κανένα λογαριασμό Chatwoot. Παρακαλούμε δημιουργήστε ένα νέο λογαριασμό για να συνεχίσετε.",
|
"NO_ACCOUNT_WARNING": "Ωχ! Δεν μπορέσαμε να βρούμε κανένα λογαριασμό Chatwoot. Παρακαλούμε δημιουργήστε ένα νέο λογαριασμό για να συνεχίσετε.",
|
||||||
|
|
|
@ -1,5 +1,73 @@
|
||||||
{
|
{
|
||||||
"MACROS": {
|
"MACROS": {
|
||||||
"HEADER": "Macros"
|
"HEADER": "Macros",
|
||||||
|
"HEADER_BTN_TXT": "Add a new macro",
|
||||||
|
"HEADER_BTN_TXT_SAVE": "Save macro",
|
||||||
|
"LOADING": "Fetching macros",
|
||||||
|
"SIDEBAR_TXT": "<p><b>Macros</b><p>A macro is a set of saved actions that help customer service agents easily complete tasks. The agents can define a set of actions like tagging a conversation with a label, sending an email transcript, updating a custom attribute, etc., and they can run these actions in a single click. When the agents run the macro, the actions would be performed sequentially in the order they are defined. Macros improve productivity and increase consistency in actions. </p><p>A macro can be helpful in 2 ways. </p><p><b>As an agent assist:</b> If an agent performs a set of actions multiple times, they can save it as a macro and execute all the actions together using a single click.</p><p><b>As an option to onboard a team member:</b> Every agent has to perform many different checks/actions during each conversation. Onboarding a new support team member will be easy if pre-defined macros are available on the account. Instead of describing each step in detail, the manager/team lead can point to the macros used in different scenarios.</p>",
|
||||||
|
"ERROR": "Something went wrong. Please try again",
|
||||||
|
"ORDER_INFO": "Macros will run in the order you add your actions. You can rearrange them by dragging them by the handle beside each node.",
|
||||||
|
"ADD": {
|
||||||
|
"FORM": {
|
||||||
|
"NAME": {
|
||||||
|
"LABEL": "Macro name",
|
||||||
|
"PLACEHOLDER": "Enter a name for your macro",
|
||||||
|
"ERROR": "Name is required for creating a macro"
|
||||||
|
},
|
||||||
|
"ACTIONS": {
|
||||||
|
"LABEL": "Actions"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"API": {
|
||||||
|
"SUCCESS_MESSAGE": "Macro added successfully",
|
||||||
|
"ERROR_MESSAGE": "Unable to create macro, Please try again later"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"LIST": {
|
||||||
|
"TABLE_HEADER": [
|
||||||
|
"Name",
|
||||||
|
"Created by",
|
||||||
|
"Last updated by",
|
||||||
|
"Visibility"
|
||||||
|
],
|
||||||
|
"404": "No macros found"
|
||||||
|
},
|
||||||
|
"DELETE": {
|
||||||
|
"TOOLTIP": "Delete macro",
|
||||||
|
"CONFIRM": {
|
||||||
|
"MESSAGE": "Are you sure to delete ",
|
||||||
|
"YES": "Yes, Delete",
|
||||||
|
"NO": "No"
|
||||||
|
},
|
||||||
|
"API": {
|
||||||
|
"SUCCESS_MESSAGE": "Macro deleted successfully",
|
||||||
|
"ERROR_MESSAGE": "There was an error deleting the macro. Please try again later"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"EDIT": {
|
||||||
|
"TOOLTIP": "Edit macro",
|
||||||
|
"API": {
|
||||||
|
"SUCCESS_MESSAGE": "Macro updated successfully",
|
||||||
|
"ERROR_MESSAGE": "Could not update Macro, Please try again later"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"EDITOR": {
|
||||||
|
"START_FLOW": "Start Flow",
|
||||||
|
"END_FLOW": "End Flow",
|
||||||
|
"LOADING": "Fetching macro",
|
||||||
|
"ADD_BTN_TOOLTIP": "Add new action",
|
||||||
|
"DELETE_BTN_TOOLTIP": "Delete Action",
|
||||||
|
"VISIBILITY": {
|
||||||
|
"LABEL": "Macro Visibility",
|
||||||
|
"GLOBAL": {
|
||||||
|
"LABEL": "Public",
|
||||||
|
"DESCRIPTION": "This macro is available publicly for all agents in this account."
|
||||||
|
},
|
||||||
|
"PERSONAL": {
|
||||||
|
"LABEL": "Private",
|
||||||
|
"DESCRIPTION": "This macro will be private to you and not be available to others."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
5
app/javascript/dashboard/i18n/locale/es/agentBots.json
Normal file
5
app/javascript/dashboard/i18n/locale/es/agentBots.json
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"AGENT_BOTS": {
|
||||||
|
"HEADER": "Bots"
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,8 +3,10 @@
|
||||||
"CONVERSATIONS_SELECTED": "%{conversationCount} conversaciones seleccionadas",
|
"CONVERSATIONS_SELECTED": "%{conversationCount} conversaciones seleccionadas",
|
||||||
"AGENT_SELECT_LABEL": "Seleccionar agente",
|
"AGENT_SELECT_LABEL": "Seleccionar agente",
|
||||||
"ASSIGN_CONFIRMATION_LABEL": "¿Está seguro que desea asignar %{conversationCount} %{conversationLabel} a",
|
"ASSIGN_CONFIRMATION_LABEL": "¿Está seguro que desea asignar %{conversationCount} %{conversationLabel} a",
|
||||||
|
"UNASSIGN_CONFIRMATION_LABEL": "¿Está seguro de desasignar %{conversationCount} %{conversationLabel}?",
|
||||||
"GO_BACK_LABEL": "Volver",
|
"GO_BACK_LABEL": "Volver",
|
||||||
"ASSIGN_LABEL": "Asignar",
|
"ASSIGN_LABEL": "Asignar",
|
||||||
|
"YES": "Si",
|
||||||
"ASSIGN_AGENT_TOOLTIP": "Asignar agente",
|
"ASSIGN_AGENT_TOOLTIP": "Asignar agente",
|
||||||
"ASSIGN_SUCCESFUL": "Conversaciones asignadas con éxito",
|
"ASSIGN_SUCCESFUL": "Conversaciones asignadas con éxito",
|
||||||
"ASSIGN_FAILED": "Error al asignar conversaciones, inténtelo de nuevo",
|
"ASSIGN_FAILED": "Error al asignar conversaciones, inténtelo de nuevo",
|
||||||
|
|
|
@ -59,19 +59,19 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"BUTTONS": {
|
"BUTTONS": {
|
||||||
"ARCHIVE": "Archive article",
|
"ARCHIVE": "Archivar artículo",
|
||||||
"DELETE": "Delete article"
|
"DELETE": "Eliminar artículo"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"PORTAL": {
|
"PORTAL": {
|
||||||
"HEADER": "Portals",
|
"HEADER": "Portales",
|
||||||
"DEFAULT": "Default",
|
"DEFAULT": "Predeterminado",
|
||||||
"NEW_BUTTON": "New Portal",
|
"NEW_BUTTON": "Nuevo Portal",
|
||||||
"ACTIVE_BADGE": "activo",
|
"ACTIVE_BADGE": "activo",
|
||||||
"CHOOSE_LOCALE_LABEL": "Choose a locale",
|
"CHOOSE_LOCALE_LABEL": "Elige un idioma",
|
||||||
"LOADING_MESSAGE": "Loading portals...",
|
"LOADING_MESSAGE": "Cargando portales...",
|
||||||
"ARTICLES_LABEL": "articles",
|
"ARTICLES_LABEL": "artículos",
|
||||||
"NO_PORTALS_MESSAGE": "There are no available portals",
|
"NO_PORTALS_MESSAGE": "No hay portales disponibles",
|
||||||
"ADD_NEW_LOCALE": "Add a new locale",
|
"ADD_NEW_LOCALE": "Add a new locale",
|
||||||
"POPOVER": {
|
"POPOVER": {
|
||||||
"TITLE": "Portals",
|
"TITLE": "Portals",
|
||||||
|
@ -83,7 +83,7 @@
|
||||||
"PORTAL_SETTINGS": {
|
"PORTAL_SETTINGS": {
|
||||||
"LIST_ITEM": {
|
"LIST_ITEM": {
|
||||||
"HEADER": {
|
"HEADER": {
|
||||||
"COUNT_LABEL": "articles",
|
"COUNT_LABEL": "artículos",
|
||||||
"ADD": "Add locale",
|
"ADD": "Add locale",
|
||||||
"VISIT": "Visit site",
|
"VISIT": "Visit site",
|
||||||
"SETTINGS": "Ajustes",
|
"SETTINGS": "Ajustes",
|
||||||
|
@ -255,7 +255,7 @@
|
||||||
"PORTAL": "Portal",
|
"PORTAL": "Portal",
|
||||||
"LOCALE": {
|
"LOCALE": {
|
||||||
"LABEL": "Locale",
|
"LABEL": "Locale",
|
||||||
"PLACEHOLDER": "Choose a locale",
|
"PLACEHOLDER": "Elige un idioma",
|
||||||
"ERROR": "Locale is required"
|
"ERROR": "Locale is required"
|
||||||
},
|
},
|
||||||
"BUTTONS": {
|
"BUTTONS": {
|
||||||
|
|
|
@ -239,7 +239,9 @@
|
||||||
},
|
},
|
||||||
"API_CALLBACK": {
|
"API_CALLBACK": {
|
||||||
"TITLE": "URL de devolución de llamada",
|
"TITLE": "URL de devolución de llamada",
|
||||||
"SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here."
|
"SUBTITLE": "You have to configure the webhook URL and the verification token in the Facebook Developer portal with the values shown below.",
|
||||||
|
"WEBHOOK_URL": "URL de Webhook",
|
||||||
|
"WEBHOOK_VERIFICATION_TOKEN": "Webhook Verification Token"
|
||||||
},
|
},
|
||||||
"SUBMIT_BUTTON": "Crear canal de WhatsApp",
|
"SUBMIT_BUTTON": "Crear canal de WhatsApp",
|
||||||
"API": {
|
"API": {
|
||||||
|
@ -357,7 +359,7 @@
|
||||||
},
|
},
|
||||||
"FINISH": {
|
"FINISH": {
|
||||||
"TITLE": "¡Tu bandeja de entrada está lista!",
|
"TITLE": "¡Tu bandeja de entrada está lista!",
|
||||||
"MESSAGE": "Ahora puedes colaborar con tus clientes a través de tu nuevo canal. Feliz soporte ",
|
"MESSAGE": "Ahora puedes colaborar con tus clientes a través de tu nuevo canal. Feliz soporte",
|
||||||
"BUTTON_TEXT": "Llévame allí",
|
"BUTTON_TEXT": "Llévame allí",
|
||||||
"MORE_SETTINGS": "Más ajustes",
|
"MORE_SETTINGS": "Más ajustes",
|
||||||
"WEBSITE_SUCCESS": "Has terminado de crear un canal del sitio web. Copia el código que se muestra a continuación y pégalo en tu sitio web. La próxima vez que un cliente use el chat en vivo, la conversación aparecerá automáticamente en su bandeja de entrada."
|
"WEBSITE_SUCCESS": "Has terminado de crear un canal del sitio web. Copia el código que se muestra a continuación y pégalo en tu sitio web. La próxima vez que un cliente use el chat en vivo, la conversación aparecerá automáticamente en su bandeja de entrada."
|
||||||
|
|
5
app/javascript/dashboard/i18n/locale/es/macros.json
Normal file
5
app/javascript/dashboard/i18n/locale/es/macros.json
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"MACROS": {
|
||||||
|
"HEADER": "Macros"
|
||||||
|
}
|
||||||
|
}
|
|
@ -179,6 +179,7 @@
|
||||||
"CONTACTS": "Contactos",
|
"CONTACTS": "Contactos",
|
||||||
"HOME": "Inicio",
|
"HOME": "Inicio",
|
||||||
"AGENTS": "Agentes",
|
"AGENTS": "Agentes",
|
||||||
|
"AGENT_BOTS": "Bots",
|
||||||
"INBOXES": "Entradas",
|
"INBOXES": "Entradas",
|
||||||
"NOTIFICATIONS": "Notificaciones",
|
"NOTIFICATIONS": "Notificaciones",
|
||||||
"CANNED_RESPONSES": "Respuestas predefinidas",
|
"CANNED_RESPONSES": "Respuestas predefinidas",
|
||||||
|
@ -189,6 +190,7 @@
|
||||||
"LABELS": "Etiquetas",
|
"LABELS": "Etiquetas",
|
||||||
"CUSTOM_ATTRIBUTES": "Atributos personalizados",
|
"CUSTOM_ATTRIBUTES": "Atributos personalizados",
|
||||||
"AUTOMATION": "Automatización",
|
"AUTOMATION": "Automatización",
|
||||||
|
"MACROS": "Macros",
|
||||||
"TEAMS": "Equipos",
|
"TEAMS": "Equipos",
|
||||||
"BILLING": "Facturación",
|
"BILLING": "Facturación",
|
||||||
"CUSTOM_VIEWS_FOLDER": "Carpetas",
|
"CUSTOM_VIEWS_FOLDER": "Carpetas",
|
||||||
|
|
5
app/javascript/dashboard/i18n/locale/fa/agentBots.json
Normal file
5
app/javascript/dashboard/i18n/locale/fa/agentBots.json
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"AGENT_BOTS": {
|
||||||
|
"HEADER": "رباتها"
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,9 +2,11 @@
|
||||||
"BULK_ACTION": {
|
"BULK_ACTION": {
|
||||||
"CONVERSATIONS_SELECTED": "%{conversationCount} گفتگو انتخاب شده است",
|
"CONVERSATIONS_SELECTED": "%{conversationCount} گفتگو انتخاب شده است",
|
||||||
"AGENT_SELECT_LABEL": "انتخاب ایجنت",
|
"AGENT_SELECT_LABEL": "انتخاب ایجنت",
|
||||||
"ASSIGN_CONFIRMATION_LABEL": "آیا مطمئن هستید که میخواهید %{conversationCount} %{conversationLabel} را به آن اختصاص دهید؟",
|
"ASSIGN_CONFIRMATION_LABEL": "آیا مطمئن هستید که به %{conversationCount} %{conversationLabel} اختصاص میدهید",
|
||||||
|
"UNASSIGN_CONFIRMATION_LABEL": "آیا مطمئنید که %{conversationCount} %{conversationLabel} را میخواهید اختصاص را لغو کنید؟",
|
||||||
"GO_BACK_LABEL": "بازگشت",
|
"GO_BACK_LABEL": "بازگشت",
|
||||||
"ASSIGN_LABEL": "اختصاص دادن",
|
"ASSIGN_LABEL": "اختصاص دادن",
|
||||||
|
"YES": "بله",
|
||||||
"ASSIGN_AGENT_TOOLTIP": "تعیین ایجنت",
|
"ASSIGN_AGENT_TOOLTIP": "تعیین ایجنت",
|
||||||
"ASSIGN_SUCCESFUL": "گفتگو با موفقیت اختصاص داده شده",
|
"ASSIGN_SUCCESFUL": "گفتگو با موفقیت اختصاص داده شده",
|
||||||
"ASSIGN_FAILED": "گفتگو اختصاص داده نشد، لطفا دوباره امتحان کنید",
|
"ASSIGN_FAILED": "گفتگو اختصاص داده نشد، لطفا دوباره امتحان کنید",
|
||||||
|
|
|
@ -239,7 +239,9 @@
|
||||||
},
|
},
|
||||||
"API_CALLBACK": {
|
"API_CALLBACK": {
|
||||||
"TITLE": "آدرس URL مربوط به API",
|
"TITLE": "آدرس URL مربوط به API",
|
||||||
"SUBTITLE": "شما باید URL webhook را در پورتال توسعه دهنده فیس بوک با URL ذکر شده در اینجا پیکربندی کنید."
|
"SUBTITLE": "شما باید URL webhook و رمز تأیید را در پورتال توسعه دهنده فیس بوک با مقادیر نشان داده شده در زیر پیکربندی کنید.",
|
||||||
|
"WEBHOOK_URL": "آدرس URL وب هوک",
|
||||||
|
"WEBHOOK_VERIFICATION_TOKEN": "توکن تایید Webhook"
|
||||||
},
|
},
|
||||||
"SUBMIT_BUTTON": "ایجاد کانال واتساپ",
|
"SUBMIT_BUTTON": "ایجاد کانال واتساپ",
|
||||||
"API": {
|
"API": {
|
||||||
|
@ -357,7 +359,7 @@
|
||||||
},
|
},
|
||||||
"FINISH": {
|
"FINISH": {
|
||||||
"TITLE": "صندوق ورودی حاضره!",
|
"TITLE": "صندوق ورودی حاضره!",
|
||||||
"MESSAGE": "حالا از طریق این کانال جدید میتوانید با مشتریان صحبت کنید. به امید موفقیت ",
|
"MESSAGE": "حالا از طریق این کانال جدید میتوانید با مشتریان صحبت کنید. به امید موفقیت",
|
||||||
"BUTTON_TEXT": "نشانم بده",
|
"BUTTON_TEXT": "نشانم بده",
|
||||||
"MORE_SETTINGS": "تنظیمات بیشتر",
|
"MORE_SETTINGS": "تنظیمات بیشتر",
|
||||||
"WEBSITE_SUCCESS": "ساختن کانال وب سایت با موفقیت انجام شد. قطعه کد زیر را کپی کرده و در سایت خود قرار دهید. در صورتیکه مشتری از ویجت پشتیبانی آنلاین استفاده کند گفتگوی شما در این صندوق ورودی ظاهر میشود."
|
"WEBSITE_SUCCESS": "ساختن کانال وب سایت با موفقیت انجام شد. قطعه کد زیر را کپی کرده و در سایت خود قرار دهید. در صورتیکه مشتری از ویجت پشتیبانی آنلاین استفاده کند گفتگوی شما در این صندوق ورودی ظاهر میشود."
|
||||||
|
|
5
app/javascript/dashboard/i18n/locale/fa/macros.json
Normal file
5
app/javascript/dashboard/i18n/locale/fa/macros.json
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"MACROS": {
|
||||||
|
"HEADER": "ماکروها"
|
||||||
|
}
|
||||||
|
}
|
|
@ -179,6 +179,7 @@
|
||||||
"CONTACTS": "مخاطبین",
|
"CONTACTS": "مخاطبین",
|
||||||
"HOME": "صفحه اصلی",
|
"HOME": "صفحه اصلی",
|
||||||
"AGENTS": "ایجنت ها",
|
"AGENTS": "ایجنت ها",
|
||||||
|
"AGENT_BOTS": "رباتها",
|
||||||
"INBOXES": "صندوقهای ورودی",
|
"INBOXES": "صندوقهای ورودی",
|
||||||
"NOTIFICATIONS": "اعلان ها",
|
"NOTIFICATIONS": "اعلان ها",
|
||||||
"CANNED_RESPONSES": "پاسخهای آماده",
|
"CANNED_RESPONSES": "پاسخهای آماده",
|
||||||
|
@ -189,6 +190,7 @@
|
||||||
"LABELS": "برچسبها",
|
"LABELS": "برچسبها",
|
||||||
"CUSTOM_ATTRIBUTES": "ویژگیهای سفارشی",
|
"CUSTOM_ATTRIBUTES": "ویژگیهای سفارشی",
|
||||||
"AUTOMATION": "خودکارسازی",
|
"AUTOMATION": "خودکارسازی",
|
||||||
|
"MACROS": "ماکروها",
|
||||||
"TEAMS": "تیمها",
|
"TEAMS": "تیمها",
|
||||||
"BILLING": "صورتحساب",
|
"BILLING": "صورتحساب",
|
||||||
"CUSTOM_VIEWS_FOLDER": "پوشهها",
|
"CUSTOM_VIEWS_FOLDER": "پوشهها",
|
||||||
|
|
5
app/javascript/dashboard/i18n/locale/fi/agentBots.json
Normal file
5
app/javascript/dashboard/i18n/locale/fi/agentBots.json
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"AGENT_BOTS": {
|
||||||
|
"HEADER": "Bots"
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,9 +2,11 @@
|
||||||
"BULK_ACTION": {
|
"BULK_ACTION": {
|
||||||
"CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected",
|
"CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected",
|
||||||
"AGENT_SELECT_LABEL": "Valitse edustaja",
|
"AGENT_SELECT_LABEL": "Valitse edustaja",
|
||||||
"ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to",
|
"ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign %{conversationCount} %{conversationLabel} to",
|
||||||
|
"UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign %{conversationCount} %{conversationLabel}?",
|
||||||
"GO_BACK_LABEL": "Mene takaisin",
|
"GO_BACK_LABEL": "Mene takaisin",
|
||||||
"ASSIGN_LABEL": "Delegoi",
|
"ASSIGN_LABEL": "Delegoi",
|
||||||
|
"YES": "Yes",
|
||||||
"ASSIGN_AGENT_TOOLTIP": "Assign Agent",
|
"ASSIGN_AGENT_TOOLTIP": "Assign Agent",
|
||||||
"ASSIGN_SUCCESFUL": "Conversations assigned successfully",
|
"ASSIGN_SUCCESFUL": "Conversations assigned successfully",
|
||||||
"ASSIGN_FAILED": "Failed to assign conversations, please try again",
|
"ASSIGN_FAILED": "Failed to assign conversations, please try again",
|
||||||
|
|
|
@ -239,7 +239,9 @@
|
||||||
},
|
},
|
||||||
"API_CALLBACK": {
|
"API_CALLBACK": {
|
||||||
"TITLE": "Callback URL",
|
"TITLE": "Callback URL",
|
||||||
"SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here."
|
"SUBTITLE": "You have to configure the webhook URL and the verification token in the Facebook Developer portal with the values shown below.",
|
||||||
|
"WEBHOOK_URL": "Webhookin URL",
|
||||||
|
"WEBHOOK_VERIFICATION_TOKEN": "Webhook Verification Token"
|
||||||
},
|
},
|
||||||
"SUBMIT_BUTTON": "Create WhatsApp Channel",
|
"SUBMIT_BUTTON": "Create WhatsApp Channel",
|
||||||
"API": {
|
"API": {
|
||||||
|
@ -357,7 +359,7 @@
|
||||||
},
|
},
|
||||||
"FINISH": {
|
"FINISH": {
|
||||||
"TITLE": "Postilaatikkosi on valmis!",
|
"TITLE": "Postilaatikkosi on valmis!",
|
||||||
"MESSAGE": "Voit nyt sitoutua asiakkaisiisi uuden kanavan kautta. Hyvää asiakaspalveluhenkeä! ",
|
"MESSAGE": "You can now engage with your customers through your new Channel. Happy supporting",
|
||||||
"BUTTON_TEXT": "Vie minut sinne",
|
"BUTTON_TEXT": "Vie minut sinne",
|
||||||
"MORE_SETTINGS": "More settings",
|
"MORE_SETTINGS": "More settings",
|
||||||
"WEBSITE_SUCCESS": "Olet onnistuneesti lisännyt sivuston chat-widgetin. Kopioi alla näkyvä koodi ja liitä se verkkosivuillesi. Seuraavalla kerralla kun asiakas käyttää live-keskustelua, keskustelu ilmestyy automaattisesti saapuneet-kansioon."
|
"WEBSITE_SUCCESS": "Olet onnistuneesti lisännyt sivuston chat-widgetin. Kopioi alla näkyvä koodi ja liitä se verkkosivuillesi. Seuraavalla kerralla kun asiakas käyttää live-keskustelua, keskustelu ilmestyy automaattisesti saapuneet-kansioon."
|
||||||
|
|
5
app/javascript/dashboard/i18n/locale/fi/macros.json
Normal file
5
app/javascript/dashboard/i18n/locale/fi/macros.json
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"MACROS": {
|
||||||
|
"HEADER": "Macros"
|
||||||
|
}
|
||||||
|
}
|
|
@ -179,6 +179,7 @@
|
||||||
"CONTACTS": "Yhteystiedot",
|
"CONTACTS": "Yhteystiedot",
|
||||||
"HOME": "Koti",
|
"HOME": "Koti",
|
||||||
"AGENTS": "Edustajat",
|
"AGENTS": "Edustajat",
|
||||||
|
"AGENT_BOTS": "Bots",
|
||||||
"INBOXES": "Kansiot",
|
"INBOXES": "Kansiot",
|
||||||
"NOTIFICATIONS": "Ilmoitukset",
|
"NOTIFICATIONS": "Ilmoitukset",
|
||||||
"CANNED_RESPONSES": "Tallennetut vastaukset",
|
"CANNED_RESPONSES": "Tallennetut vastaukset",
|
||||||
|
@ -189,6 +190,7 @@
|
||||||
"LABELS": "Tunnisteet",
|
"LABELS": "Tunnisteet",
|
||||||
"CUSTOM_ATTRIBUTES": "Mukautetut attribuutit",
|
"CUSTOM_ATTRIBUTES": "Mukautetut attribuutit",
|
||||||
"AUTOMATION": "Automation",
|
"AUTOMATION": "Automation",
|
||||||
|
"MACROS": "Macros",
|
||||||
"TEAMS": "Teams",
|
"TEAMS": "Teams",
|
||||||
"BILLING": "Billing",
|
"BILLING": "Billing",
|
||||||
"CUSTOM_VIEWS_FOLDER": "Folders",
|
"CUSTOM_VIEWS_FOLDER": "Folders",
|
||||||
|
|
5
app/javascript/dashboard/i18n/locale/fr/agentBots.json
Normal file
5
app/javascript/dashboard/i18n/locale/fr/agentBots.json
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"AGENT_BOTS": {
|
||||||
|
"HEADER": "Bots"
|
||||||
|
}
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue