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/survey/i18n/index.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
|
||||
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
|
||||
# enable the following configuration
|
||||
# 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: ''
|
||||
|
||||
---
|
||||
|
||||
**Describe the bug**
|
||||
|
||||
A clear and concise description of what the bug is.
|
||||
|
@ -16,11 +17,11 @@ Steps to reproduce the behavior:
|
|||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
4. See the error
|
||||
|
||||
**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**
|
||||
|
||||
|
@ -28,27 +29,50 @@ If applicable, add screenshots to help explain your problem.
|
|||
|
||||
**Browser logs**
|
||||
|
||||
Share the browser logs to debug the issue further
|
||||
Share the browser logs to debug the issue further.
|
||||
|
||||
**Server logs**
|
||||
|
||||
Share the server logs to debug the issue further
|
||||
Share the server logs to debug the issue further.
|
||||
|
||||
**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):**
|
||||
- OS: [e.g. iOS]
|
||||
- Browser [e.g. chrome, safari]
|
||||
- [ ] app.chatwoot.com (Chatwoot Cloud)
|
||||
- [ ] Self-hosted
|
||||
- - [ ] 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]
|
||||
|
||||
**Smartphone (please complete the following information):**
|
||||
- Device: [e.g. iPhone6]
|
||||
**Smartphone (please complete the following information)** (If applicable)
|
||||
- Device: [e.g. iPhone6, Pixel7]
|
||||
- OS: [e.g. iOS8.1]
|
||||
- Browser [e.g. stock browser, safari]
|
||||
- Browser [e.g. stock browser, firefox, safari]
|
||||
- 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**
|
||||
|
||||
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
|
||||
|
||||
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)
|
||||
|
||||
## Type of change
|
||||
|
@ -12,18 +11,18 @@ Please delete options that are not relevant.
|
|||
|
||||
- [ ] Bug fix (non-breaking change which fixes an issue)
|
||||
- [ ] 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
|
||||
|
||||
## 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:
|
||||
|
||||
- [ ] 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 made corresponding changes to the documentation
|
||||
- [ ] 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:
|
||||
context: .
|
||||
file: docker/Dockerfile
|
||||
platforms: linux/amd64,linux/arm64
|
||||
platforms: linux/amd64
|
||||
push: true
|
||||
tags: ${{ env.DOCKER_TAG }}
|
||||
|
|
|
@ -16,6 +16,7 @@ Metrics/ClassLength:
|
|||
- 'app/models/message.rb'
|
||||
- 'app/builders/messages/facebook/message_builder.rb'
|
||||
- 'app/controllers/api/v1/accounts/contacts_controller.rb'
|
||||
- 'app/controllers/api/v1/accounts/conversations_controller.rb'
|
||||
- 'app/listeners/action_cable_listener.rb'
|
||||
- 'app/models/conversation.rb'
|
||||
RSpec/ExampleLength:
|
||||
|
|
10
Gemfile.lock
10
Gemfile.lock
|
@ -427,14 +427,14 @@ GEM
|
|||
netrc (0.11.0)
|
||||
newrelic_rpm (8.9.0)
|
||||
nio4r (2.5.8)
|
||||
nokogiri (1.13.7)
|
||||
nokogiri (1.13.9)
|
||||
mini_portile2 (~> 2.8.0)
|
||||
racc (~> 1.4)
|
||||
nokogiri (1.13.7-arm64-darwin)
|
||||
nokogiri (1.13.9-arm64-darwin)
|
||||
racc (~> 1.4)
|
||||
nokogiri (1.13.7-x86_64-darwin)
|
||||
nokogiri (1.13.9-x86_64-darwin)
|
||||
racc (~> 1.4)
|
||||
nokogiri (1.13.7-x86_64-linux)
|
||||
nokogiri (1.13.9-x86_64-linux)
|
||||
racc (~> 1.4)
|
||||
oauth (0.5.10)
|
||||
orm_adapter (0.5.0)
|
||||
|
@ -808,4 +808,4 @@ RUBY VERSION
|
|||
ruby 3.0.4p208
|
||||
|
||||
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
|
||||
pattr_initialize [:contact_id!, :inbox_id!, :source_id]
|
||||
pattr_initialize [:contact, :inbox, :source_id, { hmac_verified: false }]
|
||||
|
||||
def perform
|
||||
@contact = Contact.find(contact_id)
|
||||
@inbox = @contact.account.inboxes.find(inbox_id)
|
||||
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?
|
||||
@source_id ||= generate_source_id
|
||||
create_contact_inbox if source_id.present?
|
||||
end
|
||||
|
||||
private
|
||||
|
@ -19,23 +18,37 @@ class ContactInboxBuilder
|
|||
when 'Channel::Whatsapp'
|
||||
wa_source_id
|
||||
when 'Channel::Email'
|
||||
@contact.email
|
||||
email_source_id
|
||||
when 'Channel::Sms'
|
||||
@contact.phone_number
|
||||
when 'Channel::Api'
|
||||
phone_source_id
|
||||
when 'Channel::Api', 'Channel::WebWidget'
|
||||
SecureRandom.uuid
|
||||
else
|
||||
raise "Unsupported operation for this channel: #{@inbox.channel_type}"
|
||||
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
|
||||
return unless @contact.phone_number
|
||||
raise ActionController::ParameterMissing, 'contact phone number' unless @contact.phone_number
|
||||
|
||||
# whatsapp doesn't want the + in e164 format
|
||||
@contact.phone_number.delete('+').to_s
|
||||
end
|
||||
|
||||
def twilio_source_id
|
||||
return unless @contact.phone_number
|
||||
raise ActionController::ParameterMissing, 'contact phone number' unless @contact.phone_number
|
||||
|
||||
case @inbox.channel.medium
|
||||
when 'sms'
|
||||
|
@ -45,11 +58,11 @@ class ContactInboxBuilder
|
|||
end
|
||||
end
|
||||
|
||||
def create_contact_inbox(source_id)
|
||||
::ContactInbox.find_or_create_by!(
|
||||
def create_contact_inbox
|
||||
::ContactInbox.create_with(hmac_verified: hmac_verified || false).find_or_create_by!(
|
||||
contact_id: @contact.id,
|
||||
inbox_id: @inbox.id,
|
||||
source_id: source_id
|
||||
source_id: @source_id
|
||||
)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,25 +1,47 @@
|
|||
class ContactBuilder
|
||||
pattr_initialize [:source_id!, :inbox!, :contact_attributes!, :hmac_verified]
|
||||
# This Builder will create a contact and contact inbox with specified attributes.
|
||||
# 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
|
||||
contact_inbox = inbox.contact_inboxes.find_by(source_id: source_id)
|
||||
return contact_inbox if contact_inbox
|
||||
find_or_create_contact_and_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
|
||||
|
||||
private
|
||||
|
||||
def build_contact_with_contact_inbox
|
||||
@contact = find_contact || create_contact
|
||||
@contact_inbox = create_contact_inbox
|
||||
end
|
||||
|
||||
def account
|
||||
@account ||= inbox.account
|
||||
end
|
||||
|
||||
def create_contact_inbox(contact)
|
||||
::ContactInbox.create_with(hmac_verified: hmac_verified || false).find_or_create_by!(
|
||||
contact_id: contact.id,
|
||||
inbox_id: inbox.id,
|
||||
source_id: source_id
|
||||
)
|
||||
def create_contact_inbox
|
||||
ContactInboxBuilder.new(
|
||||
contact: @contact,
|
||||
inbox: @inbox,
|
||||
source_id: @source_id,
|
||||
hmac_verified: hmac_verified
|
||||
).perform
|
||||
end
|
||||
|
||||
def update_contact_avatar(contact)
|
||||
|
@ -61,16 +83,4 @@ class ContactBuilder
|
|||
|
||||
account.contacts.find_by(phone_number: phone_number)
|
||||
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
|
|
@ -22,10 +22,9 @@ class Messages::Facebook::MessageBuilder < Messages::Messenger::MessageBuilder
|
|||
return if @inbox.channel.reauthorization_required?
|
||||
|
||||
ActiveRecord::Base.transaction do
|
||||
build_contact
|
||||
build_contact_inbox
|
||||
build_message
|
||||
end
|
||||
ensure_contact_avatar
|
||||
rescue Koala::Facebook::AuthenticationError
|
||||
@inbox.channel.authorization_error!
|
||||
rescue StandardError => e
|
||||
|
@ -35,15 +34,12 @@ class Messages::Facebook::MessageBuilder < Messages::Messenger::MessageBuilder
|
|||
|
||||
private
|
||||
|
||||
def contact
|
||||
@contact ||= @inbox.contact_inboxes.find_by(source_id: @sender_id)&.contact
|
||||
end
|
||||
|
||||
def build_contact
|
||||
return if contact.present?
|
||||
|
||||
@contact = Contact.create!(contact_params.except(:remote_avatar_url))
|
||||
@contact_inbox = ContactInbox.find_or_create_by!(contact: contact, inbox: @inbox, source_id: @sender_id)
|
||||
def build_contact_inbox
|
||||
@contact_inbox = ::ContactInboxWithContactBuilder.new(
|
||||
source_id: @sender_id,
|
||||
inbox: @inbox,
|
||||
contact_attributes: contact_params
|
||||
).perform
|
||||
end
|
||||
|
||||
def build_message
|
||||
|
@ -54,19 +50,11 @@ class Messages::Facebook::MessageBuilder < Messages::Messenger::MessageBuilder
|
|||
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
|
||||
@conversation ||= Conversation.find_by(conversation_params) || build_conversation
|
||||
end
|
||||
|
||||
def build_conversation
|
||||
@contact_inbox ||= contact.contact_inboxes.find_by!(source_id: @sender_id)
|
||||
Conversation.create!(conversation_params.merge(
|
||||
contact_inbox_id: @contact_inbox.id
|
||||
))
|
||||
|
@ -94,7 +82,7 @@ class Messages::Facebook::MessageBuilder < Messages::Messenger::MessageBuilder
|
|||
{
|
||||
account_id: @inbox.account_id,
|
||||
inbox_id: @inbox.id,
|
||||
contact_id: contact.id
|
||||
contact_id: @contact_inbox.contact_id
|
||||
}
|
||||
end
|
||||
|
||||
|
@ -105,7 +93,7 @@ class Messages::Facebook::MessageBuilder < Messages::Messenger::MessageBuilder
|
|||
message_type: @message_type,
|
||||
content: response.content,
|
||||
source_id: response.identifier,
|
||||
sender: @outgoing_echo ? nil : contact
|
||||
sender: @outgoing_echo ? nil : @contact_inbox.contact
|
||||
}
|
||||
end
|
||||
|
||||
|
@ -113,7 +101,7 @@ class Messages::Facebook::MessageBuilder < Messages::Messenger::MessageBuilder
|
|||
{
|
||||
name: "#{result['first_name'] || 'John'} #{result['last_name'] || 'Doe'}",
|
||||
account_id: @inbox.account_id,
|
||||
remote_avatar_url: result['profile_pic'] || ''
|
||||
avatar_url: result['profile_pic']
|
||||
}
|
||||
end
|
||||
|
||||
|
|
|
@ -72,6 +72,7 @@ class Messages::Instagram::MessageBuilder < Messages::Messenger::MessageBuilder
|
|||
|
||||
def build_message
|
||||
return if @outgoing_echo && already_sent_from_chatwoot?
|
||||
return if message_content.blank? && all_unsupported_files?
|
||||
|
||||
@message = conversation.messages.create!(message_params)
|
||||
|
||||
|
@ -117,6 +118,13 @@ class Messages::Instagram::MessageBuilder < Messages::Messenger::MessageBuilder
|
|||
cw_message.present?
|
||||
end
|
||||
|
||||
def all_unsupported_files?
|
||||
return if attachments.empty?
|
||||
|
||||
attachments_type = attachments.pluck(:type).uniq.first
|
||||
unsupported_file_type?(attachments_type)
|
||||
end
|
||||
|
||||
### Sample response
|
||||
# {
|
||||
# "object": "instagram",
|
||||
|
|
|
@ -2,7 +2,8 @@ class Messages::Messenger::MessageBuilder
|
|||
include ::FileTypeHelper
|
||||
|
||||
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.save!
|
||||
|
@ -80,4 +81,10 @@ class Messages::Messenger::MessageBuilder
|
|||
ChatwootExceptionTracker.new(e, account: @inbox.account).capture_exception
|
||||
{}
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def unsupported_file_type?(attachment_type)
|
||||
[:template, :unsupported_type].include? attachment_type.to_sym
|
||||
end
|
||||
end
|
||||
|
|
|
@ -2,8 +2,11 @@ class Api::V1::Accounts::Contacts::ContactInboxesController < Api::V1::Accounts:
|
|||
before_action :ensure_inbox, only: [:create]
|
||||
|
||||
def create
|
||||
source_id = params[:source_id] || SecureRandom.uuid
|
||||
@contact_inbox = ContactInbox.create!(contact: @contact, inbox: @inbox, source_id: source_id)
|
||||
@contact_inbox = ContactInboxBuilder.new(
|
||||
contact: @contact,
|
||||
inbox: @inbox,
|
||||
source_id: params[:source_id]
|
||||
).perform
|
||||
end
|
||||
|
||||
private
|
||||
|
|
|
@ -134,8 +134,11 @@ class Api::V1::Accounts::ContactsController < Api::V1::Accounts::BaseController
|
|||
return if params[:inbox_id].blank?
|
||||
|
||||
inbox = Current.account.inboxes.find(params[:inbox_id])
|
||||
source_id = params[:source_id] || SecureRandom.uuid
|
||||
ContactInbox.create!(contact: @contact, inbox: inbox, source_id: source_id)
|
||||
ContactInboxBuilder.new(
|
||||
contact: @contact,
|
||||
inbox: inbox,
|
||||
source_id: params[:source_id]
|
||||
).perform
|
||||
end
|
||||
|
||||
def permitted_params
|
||||
|
|
|
@ -3,7 +3,7 @@ class Api::V1::Accounts::ConversationsController < Api::V1::Accounts::BaseContro
|
|||
include DateRangeHelper
|
||||
|
||||
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
|
||||
result = conversation_finder.perform
|
||||
|
@ -109,22 +109,35 @@ class Api::V1::Accounts::ConversationsController < Api::V1::Accounts::BaseContro
|
|||
authorize @conversation.inbox, :show?
|
||||
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
|
||||
@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])
|
||||
authorize @contact_inbox.inbox, :show?
|
||||
end
|
||||
|
||||
def build_contact_inbox
|
||||
return if params[:contact_id].blank? || params[:inbox_id].blank?
|
||||
|
||||
inbox = Current.account.inboxes.find(params[:inbox_id])
|
||||
authorize inbox, :show?
|
||||
return if @inbox.blank? || @contact.blank?
|
||||
|
||||
ContactInboxBuilder.new(
|
||||
contact_id: params[:contact_id],
|
||||
inbox_id: inbox.id,
|
||||
contact: @contact,
|
||||
inbox: @inbox,
|
||||
source_id: params[:source_id]
|
||||
).perform
|
||||
end
|
||||
|
|
|
@ -17,7 +17,8 @@ class Api::V1::Widget::ConversationsController < Api::V1::Widget::BaseController
|
|||
@contact = ContactIdentifyAction.new(
|
||||
contact: @contact,
|
||||
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
|
||||
end
|
||||
|
||||
|
|
|
@ -13,6 +13,8 @@ module RequestExceptionHandler
|
|||
render_not_found_error('Resource could not be found')
|
||||
rescue Pundit::NotAuthorizedError
|
||||
render_unauthorized('You are not authorized to do this action')
|
||||
rescue ActionController::ParameterMissing => e
|
||||
render_could_not_create_error(e.message)
|
||||
ensure
|
||||
# to address the thread variable leak issues in Puma/Thin webserver
|
||||
Current.reset
|
||||
|
|
|
@ -3,16 +3,12 @@ class Platform::Api::V1::AccountsController < PlatformController
|
|||
@resource = Account.new(account_params)
|
||||
@resource.save!
|
||||
@platform_app.platform_app_permissibles.find_or_create_by(permissible: @resource)
|
||||
render json: @resource
|
||||
end
|
||||
|
||||
def show
|
||||
render json: @resource
|
||||
end
|
||||
def show; end
|
||||
|
||||
def update
|
||||
@resource.update!(account_params)
|
||||
render json: @resource
|
||||
end
|
||||
|
||||
def destroy
|
||||
|
@ -27,6 +23,14 @@ class Platform::Api::V1::AccountsController < PlatformController
|
|||
end
|
||||
|
||||
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
|
||||
|
|
|
@ -4,7 +4,7 @@ class Public::Api::V1::Inboxes::ContactsController < Public::Api::V1::InboxesCon
|
|||
|
||||
def create
|
||||
source_id = params[:source_id] || SecureRandom.uuid
|
||||
@contact_inbox = ::ContactBuilder.new(
|
||||
@contact_inbox = ::ContactInboxWithContactBuilder.new(
|
||||
source_id: source_id,
|
||||
inbox: @inbox_channel.inbox,
|
||||
contact_attributes: permitted_params.except(:identifier, :identifier_hash)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
class Public::Api::V1::Portals::ArticlesController < PublicController
|
||||
before_action :ensure_custom_domain_request, only: [:show, :index]
|
||||
before_action :portal
|
||||
before_action :set_category
|
||||
before_action :set_category, except: [:index]
|
||||
before_action :set_article, only: [:show]
|
||||
layout 'portal'
|
||||
|
||||
|
@ -26,7 +26,7 @@ class Public::Api::V1::Portals::ArticlesController < PublicController
|
|||
end
|
||||
|
||||
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
|
||||
|
||||
def portal
|
||||
|
|
|
@ -113,9 +113,22 @@ $default-button-height: 4.0rem;
|
|||
}
|
||||
|
||||
&.clear {
|
||||
color: var(--w-700);
|
||||
|
||||
&.secondary {
|
||||
color: var(--s-700)
|
||||
}
|
||||
|
||||
&.success {
|
||||
color: var(--g-700)
|
||||
}
|
||||
|
||||
&.alert {
|
||||
color: var(--r-700)
|
||||
}
|
||||
|
||||
&.warning {
|
||||
color: var(--y-600);
|
||||
color: var(--y-700)
|
||||
}
|
||||
|
||||
&:hover {
|
||||
|
@ -146,6 +159,8 @@ $default-button-height: 4.0rem;
|
|||
|
||||
&.small {
|
||||
height: var(--space-large);
|
||||
padding-bottom: var(--space-smaller);
|
||||
padding-top: var(--space-smaller);
|
||||
}
|
||||
|
||||
&.large {
|
||||
|
|
|
@ -14,15 +14,9 @@
|
|||
}
|
||||
|
||||
.modal--close {
|
||||
border-radius: 50%;
|
||||
color: $color-heading;
|
||||
cursor: pointer;
|
||||
font-size: $font-size-big;
|
||||
line-height: $space-normal;
|
||||
padding: $space-normal;
|
||||
position: absolute;
|
||||
right: $space-micro;
|
||||
top: $space-micro;
|
||||
right: $space-small;
|
||||
top: $space-small;
|
||||
|
||||
&:hover {
|
||||
background: $color-background;
|
||||
|
|
|
@ -7,9 +7,13 @@
|
|||
@click="onBackDropClick"
|
||||
>
|
||||
<div :class="modalContainerClassName" @click.stop>
|
||||
<button class="modal--close" @click="close">
|
||||
<fluent-icon icon="dismiss" />
|
||||
</button>
|
||||
<woot-button
|
||||
color-scheme="secondary"
|
||||
icon="dismiss"
|
||||
variant="clear"
|
||||
class="modal--close"
|
||||
@click="close"
|
||||
/>
|
||||
<slot />
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -73,14 +73,14 @@ export default {
|
|||
|
||||
computed: {
|
||||
...mapGetters({
|
||||
currentUser: 'getCurrentUser',
|
||||
globalConfig: 'globalConfig/get',
|
||||
isACustomBrandedInstance: 'globalConfig/isACustomBrandedInstance',
|
||||
isOnChatwootCloud: 'globalConfig/isOnChatwootCloud',
|
||||
inboxes: 'inboxes/getInboxes',
|
||||
accountId: 'getCurrentAccountId',
|
||||
currentRole: 'getCurrentRole',
|
||||
currentUser: 'getCurrentUser',
|
||||
globalConfig: 'globalConfig/get',
|
||||
inboxes: 'inboxes/getInboxes',
|
||||
isACustomBrandedInstance: 'globalConfig/isACustomBrandedInstance',
|
||||
isFeatureEnabledonAccount: 'accounts/isFeatureEnabledonAccount',
|
||||
isOnChatwootCloud: 'globalConfig/isOnChatwootCloud',
|
||||
labels: 'labels/getLabelsOnSidebar',
|
||||
teams: 'teams/getMyTeams',
|
||||
}),
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import { FEATURE_FLAGS } from '../../../../featureFlags';
|
||||
import { frontendURL } from '../../../../helper/URLHelper';
|
||||
|
||||
const settings = accountId => ({
|
||||
|
@ -38,12 +39,20 @@ const settings = accountId => ({
|
|||
'settings_teams_new',
|
||||
],
|
||||
menuItems: [
|
||||
{
|
||||
icon: 'briefcase',
|
||||
label: 'ACCOUNT_SETTINGS',
|
||||
hasSubMenu: false,
|
||||
toState: frontendURL(`accounts/${accountId}/settings/general`),
|
||||
toStateName: 'general_settings_index',
|
||||
},
|
||||
{
|
||||
icon: 'people',
|
||||
label: 'AGENTS',
|
||||
hasSubMenu: false,
|
||||
toState: frontendURL(`accounts/${accountId}/settings/agents/list`),
|
||||
toStateName: 'agent_list',
|
||||
featureFlag: FEATURE_FLAGS.AGENT_MANAGEMENT,
|
||||
},
|
||||
{
|
||||
icon: 'people-team',
|
||||
|
@ -51,6 +60,7 @@ const settings = accountId => ({
|
|||
hasSubMenu: false,
|
||||
toState: frontendURL(`accounts/${accountId}/settings/teams/list`),
|
||||
toStateName: 'settings_teams_list',
|
||||
featureFlag: FEATURE_FLAGS.TEAM_MANAGEMENT,
|
||||
},
|
||||
{
|
||||
icon: 'mail-inbox-all',
|
||||
|
@ -58,6 +68,7 @@ const settings = accountId => ({
|
|||
hasSubMenu: false,
|
||||
toState: frontendURL(`accounts/${accountId}/settings/inboxes/list`),
|
||||
toStateName: 'settings_inbox_list',
|
||||
featureFlag: FEATURE_FLAGS.INBOX_MANAGEMENT,
|
||||
},
|
||||
{
|
||||
icon: 'tag',
|
||||
|
@ -65,6 +76,7 @@ const settings = accountId => ({
|
|||
hasSubMenu: false,
|
||||
toState: frontendURL(`accounts/${accountId}/settings/labels/list`),
|
||||
toStateName: 'labels_list',
|
||||
featureFlag: FEATURE_FLAGS.LABELS,
|
||||
},
|
||||
{
|
||||
icon: 'code',
|
||||
|
@ -74,6 +86,7 @@ const settings = accountId => ({
|
|||
`accounts/${accountId}/settings/custom-attributes/list`
|
||||
),
|
||||
toStateName: 'attributes_list',
|
||||
featureFlag: FEATURE_FLAGS.CUSTOM_ATTRIBUTES,
|
||||
},
|
||||
{
|
||||
icon: 'automation',
|
||||
|
@ -82,6 +95,7 @@ const settings = accountId => ({
|
|||
hasSubMenu: false,
|
||||
toState: frontendURL(`accounts/${accountId}/settings/automation/list`),
|
||||
toStateName: 'automation_list',
|
||||
featureFlag: FEATURE_FLAGS.AUTOMATIONS,
|
||||
},
|
||||
{
|
||||
icon: 'bot',
|
||||
|
@ -90,7 +104,7 @@ const settings = accountId => ({
|
|||
hasSubMenu: false,
|
||||
toState: frontendURL(`accounts/${accountId}/settings/agent-bots`),
|
||||
toStateName: 'agent_bots',
|
||||
featureFlagKey: 'agent_bots',
|
||||
featureFlag: FEATURE_FLAGS.AGENT_BOTS,
|
||||
},
|
||||
{
|
||||
icon: 'flash-settings',
|
||||
|
@ -99,7 +113,7 @@ const settings = accountId => ({
|
|||
toState: frontendURL(`accounts/${accountId}/settings/macros`),
|
||||
toStateName: 'macros_wrapper',
|
||||
beta: true,
|
||||
featureFlagKey: 'macros',
|
||||
featureFlag: FEATURE_FLAGS.MACROS,
|
||||
},
|
||||
{
|
||||
icon: 'chat-multiple',
|
||||
|
@ -109,6 +123,7 @@ const settings = accountId => ({
|
|||
`accounts/${accountId}/settings/canned-response/list`
|
||||
),
|
||||
toStateName: 'canned_list',
|
||||
featureFlag: FEATURE_FLAGS.CANNED_RESPONSES,
|
||||
},
|
||||
{
|
||||
icon: 'flash-on',
|
||||
|
@ -116,6 +131,7 @@ const settings = accountId => ({
|
|||
hasSubMenu: false,
|
||||
toState: frontendURL(`accounts/${accountId}/settings/integrations`),
|
||||
toStateName: 'settings_integrations',
|
||||
featureFlag: FEATURE_FLAGS.INTEGRATIONS,
|
||||
},
|
||||
{
|
||||
icon: 'star-emphasis',
|
||||
|
@ -123,6 +139,7 @@ const settings = accountId => ({
|
|||
hasSubMenu: false,
|
||||
toState: frontendURL(`accounts/${accountId}/settings/applications`),
|
||||
toStateName: 'settings_applications',
|
||||
featureFlag: FEATURE_FLAGS.INTEGRATIONS,
|
||||
},
|
||||
{
|
||||
icon: 'credit-card-person',
|
||||
|
@ -132,13 +149,6 @@ const settings = accountId => ({
|
|||
toStateName: 'billing_settings_index',
|
||||
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 SecondaryNavItem from './SecondaryNavItem.vue';
|
||||
import AccountContext from './AccountContext.vue';
|
||||
import { mapGetters } from 'vuex';
|
||||
import { FEATURE_FLAGS } from '../../../featureFlags';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
|
@ -61,6 +63,9 @@ export default {
|
|||
},
|
||||
},
|
||||
computed: {
|
||||
...mapGetters({
|
||||
isFeatureEnabledonAccount: 'accounts/isFeatureEnabledonAccount',
|
||||
}),
|
||||
hasSecondaryMenu() {
|
||||
return this.menuConfig.menuItems && this.menuConfig.menuItems.length;
|
||||
},
|
||||
|
@ -89,7 +94,7 @@ export default {
|
|||
icon: 'folder',
|
||||
label: 'INBOXES',
|
||||
hasSubMenu: true,
|
||||
newLink: true,
|
||||
newLink: this.showNewLink(FEATURE_FLAGS.INBOX_MANAGEMENT),
|
||||
newLinkTag: 'NEW_INBOX',
|
||||
key: 'inbox',
|
||||
toState: frontendURL(`accounts/${this.accountId}/settings/inboxes/new`),
|
||||
|
@ -117,7 +122,7 @@ export default {
|
|||
icon: 'number-symbol',
|
||||
label: 'LABELS',
|
||||
hasSubMenu: true,
|
||||
newLink: true,
|
||||
newLink: this.showNewLink(FEATURE_FLAGS.TEAM_MANAGEMENT),
|
||||
newLinkTag: 'NEW_LABEL',
|
||||
key: 'label',
|
||||
toState: frontendURL(`accounts/${this.accountId}/settings/labels`),
|
||||
|
@ -141,7 +146,7 @@ export default {
|
|||
label: 'TAGGED_WITH',
|
||||
hasSubMenu: true,
|
||||
key: 'label',
|
||||
newLink: true,
|
||||
newLink: this.showNewLink(FEATURE_FLAGS.TEAM_MANAGEMENT),
|
||||
newLinkTag: 'NEW_LABEL',
|
||||
toState: frontendURL(`accounts/${this.accountId}/settings/labels`),
|
||||
toStateName: 'labels_list',
|
||||
|
@ -163,7 +168,7 @@ export default {
|
|||
icon: 'people-team',
|
||||
label: 'TEAMS',
|
||||
hasSubMenu: true,
|
||||
newLink: true,
|
||||
newLink: this.showNewLink(FEATURE_FLAGS.TEAM_MANAGEMENT),
|
||||
newLinkTag: 'NEW_TEAM',
|
||||
key: 'team',
|
||||
toState: frontendURL(`accounts/${this.accountId}/settings/teams/new`),
|
||||
|
@ -238,6 +243,9 @@ export default {
|
|||
toggleAccountModal() {
|
||||
this.$emit('toggle-accounts');
|
||||
},
|
||||
showNewLink(featureFlag) {
|
||||
return this.isFeatureEnabledonAccount(this.accountId, featureFlag);
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
|
|
@ -123,12 +123,12 @@ export default {
|
|||
return !!this.menuItem.children;
|
||||
},
|
||||
isMenuItemVisible() {
|
||||
if (!this.menuItem.featureFlagKey) {
|
||||
if (!this.menuItem.featureFlag) {
|
||||
return true;
|
||||
}
|
||||
return this.isFeatureEnabledonAccount(
|
||||
this.accountId,
|
||||
this.menuItem.featureFlagKey
|
||||
this.menuItem.featureFlag
|
||||
);
|
||||
},
|
||||
isInboxConversation() {
|
||||
|
@ -217,7 +217,7 @@ export default {
|
|||
}
|
||||
},
|
||||
showItem(item) {
|
||||
return this.isAdmin && item.newLink !== undefined;
|
||||
return this.isAdmin && !!item.newLink;
|
||||
},
|
||||
onClickOpen() {
|
||||
this.$emit('open');
|
||||
|
@ -321,7 +321,7 @@ export default {
|
|||
.beta {
|
||||
padding-right: 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;
|
||||
font-size: var(--font-size-micro);
|
||||
font-weight: var(--font-weight-medium);
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
<template>
|
||||
<div
|
||||
class="filter"
|
||||
:class="{ error: v.action_params.$dirty && v.action_params.$error }"
|
||||
>
|
||||
<div class="filter" :class="actionInputStyles">
|
||||
<div class="filter-inputs">
|
||||
<select
|
||||
v-model="action_name"
|
||||
|
@ -60,6 +57,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<woot-button
|
||||
v-if="!isMacro"
|
||||
icon="dismiss"
|
||||
variant="clear"
|
||||
color-scheme="secondary"
|
||||
|
@ -120,6 +118,10 @@ export default {
|
|||
type: String,
|
||||
default: '',
|
||||
},
|
||||
isMacro: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
action_name: {
|
||||
|
@ -146,6 +148,12 @@ export default {
|
|||
return this.actionTypes.find(action => action.key === this.action_name)
|
||||
.inputType;
|
||||
},
|
||||
actionInputStyles() {
|
||||
return {
|
||||
error: this.v.action_params.$dirty && this.v.action_params.$error,
|
||||
'is-a-macro': this.isMacro,
|
||||
};
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
removeAction() {
|
||||
|
@ -165,6 +173,18 @@ export default {
|
|||
border: 1px solid var(--color-border);
|
||||
border-radius: var(--border-radius-medium);
|
||||
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 {
|
||||
|
|
|
@ -11,7 +11,6 @@
|
|||
size="small"
|
||||
@click="toggleEmojiPicker"
|
||||
/>
|
||||
<!-- ensure the same validations for attachment types are implemented in backend models as well -->
|
||||
<file-upload
|
||||
ref="upload"
|
||||
v-tooltip.top-end="$t('CONVERSATION.REPLYBOX.TIP_ATTACH_ICON')"
|
||||
|
@ -47,6 +46,16 @@
|
|||
:title="$t('CONVERSATION.REPLYBOX.TIP_AUDIORECORDER_ICON')"
|
||||
@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
|
||||
v-if="showAudioPlayStopButton"
|
||||
:icon="audioRecorderPlayStopIcon"
|
||||
|
@ -110,13 +119,15 @@ import { hasPressedAltAndAKey } from 'shared/helpers/KeyboardHelpers';
|
|||
import eventListenerMixins from 'shared/mixins/eventListenerMixins';
|
||||
import uiSettingsMixin from 'dashboard/mixins/uiSettings';
|
||||
import inboxMixin from 'shared/mixins/inboxMixin';
|
||||
|
||||
import { FEATURE_FLAGS } from 'dashboard/featureFlags';
|
||||
import {
|
||||
ALLOWED_FILE_TYPES,
|
||||
ALLOWED_FILE_TYPES_FOR_TWILIO_WHATSAPP,
|
||||
} from 'shared/constants/messages';
|
||||
|
||||
import { REPLY_EDITOR_MODES } from './constants';
|
||||
import { mapGetters } from 'vuex';
|
||||
|
||||
export default {
|
||||
name: 'ReplyBottomPanel',
|
||||
components: { FileUpload },
|
||||
|
@ -182,7 +193,7 @@ export default {
|
|||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
isFormatMode: {
|
||||
showEditorToggle: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
@ -200,6 +211,10 @@ export default {
|
|||
},
|
||||
},
|
||||
computed: {
|
||||
...mapGetters({
|
||||
accountId: 'getCurrentAccountId',
|
||||
isFeatureEnabledonAccount: 'accounts/isFeatureEnabledonAccount',
|
||||
}),
|
||||
isNote() {
|
||||
return this.mode === REPLY_EDITOR_MODES.NOTE;
|
||||
},
|
||||
|
@ -217,7 +232,12 @@ export default {
|
|||
return this.showFileUpload || this.isNote;
|
||||
},
|
||||
showAudioRecorderButton() {
|
||||
return this.showAudioRecorder;
|
||||
return (
|
||||
this.isFeatureEnabledonAccount(
|
||||
this.accountId,
|
||||
FEATURE_FLAGS.VOICE_RECORDER
|
||||
) && this.showAudioRecorder
|
||||
);
|
||||
},
|
||||
showAudioPlayStopButton() {
|
||||
return this.showAudioRecorder && this.isRecordingAudio;
|
||||
|
|
|
@ -420,6 +420,8 @@ export default {
|
|||
<style lang="scss">
|
||||
.wrap {
|
||||
> .bubble {
|
||||
min-width: 128px;
|
||||
|
||||
&.is-image,
|
||||
&.is-video {
|
||||
padding: 0;
|
||||
|
|
|
@ -434,7 +434,7 @@ export default {
|
|||
|
||||
&::before {
|
||||
transform: rotate(0deg);
|
||||
left: var(--space-half);
|
||||
left: var(--space-smaller);
|
||||
bottom: var(--space-minus-slab);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -109,10 +109,11 @@
|
|||
:recording-audio-state="recordingAudioState"
|
||||
:is-recording-audio="isRecordingAudio"
|
||||
:is-on-private-note="isOnPrivateNote"
|
||||
:is-format-mode="showRichContentEditor"
|
||||
:show-editor-toggle="isAPIInbox && !isOnPrivateNote"
|
||||
:enable-multiple-file-upload="enableMultipleFileUpload"
|
||||
:has-whatsapp-templates="hasWhatsappTemplates"
|
||||
@selectWhatsappTemplate="openWhatsappTemplateModal"
|
||||
@toggle-editor="toggleRichContentEditor"
|
||||
/>
|
||||
<whatsapp-templates
|
||||
:inbox-id="inbox.id"
|
||||
|
@ -230,6 +231,13 @@ export default {
|
|||
return true;
|
||||
}
|
||||
|
||||
if (this.isAPIInbox) {
|
||||
const {
|
||||
display_rich_content_editor: displayRichContentEditor = false,
|
||||
} = this.uiSettings;
|
||||
return displayRichContentEditor;
|
||||
}
|
||||
|
||||
return false;
|
||||
},
|
||||
assignedAgent: {
|
||||
|
@ -365,7 +373,7 @@ export default {
|
|||
);
|
||||
},
|
||||
isRichEditorEnabled() {
|
||||
return this.isAWebWidgetInbox || this.isAnEmailChannel || this.isAPIInbox;
|
||||
return this.isAWebWidgetInbox || this.isAnEmailChannel;
|
||||
},
|
||||
showAudioRecorder() {
|
||||
return !this.isOnPrivateNote && this.showFileUpload;
|
||||
|
@ -511,6 +519,11 @@ export default {
|
|||
document.removeEventListener('keydown', this.handleKeyEvents);
|
||||
},
|
||||
methods: {
|
||||
toggleRichContentEditor() {
|
||||
this.updateUISettings({
|
||||
display_rich_content_editor: !this.showRichContentEditor,
|
||||
});
|
||||
},
|
||||
getSavedDraftMessages() {
|
||||
return LocalStorage.get(LOCAL_STORAGE_KEYS.DRAFT_MESSAGES) || {};
|
||||
},
|
||||
|
@ -970,7 +983,7 @@ export default {
|
|||
|
||||
&::before {
|
||||
transform: rotate(0deg);
|
||||
left: var(--space-half);
|
||||
left: var(--space-smaller);
|
||||
bottom: var(--space-minus-slab);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,7 +17,10 @@
|
|||
@click="snoozeConversation(option.snoozedUntil)"
|
||||
/>
|
||||
</menu-item-with-submenu>
|
||||
<menu-item-with-submenu :option="labelMenuConfig">
|
||||
<menu-item-with-submenu
|
||||
:option="labelMenuConfig"
|
||||
:sub-menu-available="!!labels.length"
|
||||
>
|
||||
<template>
|
||||
<menu-item
|
||||
v-for="label in labels"
|
||||
|
@ -28,7 +31,10 @@
|
|||
/>
|
||||
</template>
|
||||
</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" />
|
||||
<template v-else>
|
||||
<menu-item
|
||||
|
@ -40,7 +46,10 @@
|
|||
/>
|
||||
</template>
|
||||
</menu-item-with-submenu>
|
||||
<menu-item-with-submenu :option="teamMenuConfig">
|
||||
<menu-item-with-submenu
|
||||
:option="teamMenuConfig"
|
||||
:sub-menu-available="!!teams.length"
|
||||
>
|
||||
<menu-item
|
||||
v-for="team in teams"
|
||||
:key="team.id"
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
size="20px"
|
||||
class="agent-thumbnail"
|
||||
/>
|
||||
<p class="menu-label truncate-text">{{ option.label }}</p>
|
||||
<p class="menu-label text-truncate">{{ option.label }}</p>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
@ -50,7 +50,6 @@ export default {
|
|||
padding: var(--space-smaller);
|
||||
border-radius: var(--border-radius-small);
|
||||
overflow: hidden;
|
||||
|
||||
.menu-label {
|
||||
margin: 0;
|
||||
font-size: var(--font-size-mini);
|
||||
|
|
|
@ -1,11 +1,14 @@
|
|||
<template>
|
||||
<div class="menu-with-submenu flex-between">
|
||||
<div
|
||||
class="menu-with-submenu flex-between"
|
||||
:class="{ disabled: !subMenuAvailable }"
|
||||
>
|
||||
<div class="menu-left">
|
||||
<fluent-icon :icon="option.icon" size="14" class="menu-icon" />
|
||||
<p class="menu-label">{{ option.label }}</p>
|
||||
</div>
|
||||
<fluent-icon icon="chevron-right" size="12" />
|
||||
<div class="submenu">
|
||||
<div v-if="subMenuAvailable" class="submenu">
|
||||
<slot />
|
||||
</div>
|
||||
</div>
|
||||
|
@ -18,6 +21,10 @@ export default {
|
|||
type: Object,
|
||||
default: () => {},
|
||||
},
|
||||
subMenuAvailable: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
@ -55,6 +62,11 @@ export default {
|
|||
left: 100%;
|
||||
top: 0;
|
||||
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 {
|
||||
|
@ -73,5 +85,10 @@ export default {
|
|||
clip-path: polygon(100% 0, 0% 0%, 100% 100%);
|
||||
}
|
||||
}
|
||||
|
||||
&.disabled {
|
||||
opacity: 50%;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
|
@ -181,7 +181,7 @@ export default {
|
|||
color: var(--y-700);
|
||||
font-size: var(--font-size-mini);
|
||||
margin-top: var(--space-small);
|
||||
padding: var(--space-half) var(--space-one);
|
||||
padding: var(--space-smaller) var(--space-small);
|
||||
}
|
||||
|
||||
.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,
|
||||
'first.reply.created': this.onFirstReplyCreated,
|
||||
'conversation.read': this.onConversationRead,
|
||||
'conversation.updated': this.onConversationUpdated,
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -85,6 +86,11 @@ class ActionCableConnector extends BaseActionCableConnector {
|
|||
this.fetchConversationStats();
|
||||
};
|
||||
|
||||
onConversationUpdated = data => {
|
||||
this.app.$store.dispatch('updateConversation', data);
|
||||
this.fetchConversationStats();
|
||||
};
|
||||
|
||||
onTypingOn = ({ conversation, user }) => {
|
||||
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": {
|
||||
"CONVERSATIONS_SELECTED": "%{conversationCount} المحادثات المحددة",
|
||||
"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": "العودة للخلف",
|
||||
"ASSIGN_LABEL": "تكليف",
|
||||
"YES": "نعم",
|
||||
"ASSIGN_AGENT_TOOLTIP": "إسناد وكيل",
|
||||
"ASSIGN_SUCCESFUL": "تم تعيين المحادثات بنجاح",
|
||||
"ASSIGN_FAILED": "فشل في تعيين المحادثات، الرجاء المحاولة مرة أخرى",
|
||||
|
|
|
@ -306,7 +306,7 @@
|
|||
"PUBLISH_ARTICLE": {
|
||||
"API": {
|
||||
"ERROR": "حدث خطأ أثناء نشر المقالة",
|
||||
"SUCCESS": "تم نشر المقالة بنجاح"
|
||||
"SUCCESS": "Article published successfully"
|
||||
}
|
||||
},
|
||||
"ARCHIVE_ARTICLE": {
|
||||
|
|
|
@ -239,7 +239,9 @@
|
|||
},
|
||||
"API_CALLBACK": {
|
||||
"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": "إنشاء قناة واتساب",
|
||||
"API": {
|
||||
|
@ -357,7 +359,7 @@
|
|||
},
|
||||
"FINISH": {
|
||||
"TITLE": "أصبحت قناة التواصل جاهزة الآن!",
|
||||
"MESSAGE": "يمكنك الآن التواصل مع عملائك من خلال قناتك الجديدة ",
|
||||
"MESSAGE": "يمكنك الآن التواصل مع عملائك من خلال قناتك الجديدة",
|
||||
"BUTTON_TEXT": "خذني إلى هناك",
|
||||
"MORE_SETTINGS": "المزيد من الإعدادات",
|
||||
"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": "جهات الاتصال",
|
||||
"HOME": "الرئيسية",
|
||||
"AGENTS": "موظف الدعم",
|
||||
"AGENT_BOTS": "Bots",
|
||||
"INBOXES": "قنوات التواصل",
|
||||
"NOTIFICATIONS": "الإشعارات",
|
||||
"CANNED_RESPONSES": "الردود السريعة",
|
||||
|
@ -189,6 +190,7 @@
|
|||
"LABELS": "الوسوم",
|
||||
"CUSTOM_ATTRIBUTES": "سمات مخصصة",
|
||||
"AUTOMATION": "الأتمتة",
|
||||
"MACROS": "Macros",
|
||||
"TEAMS": "الفرق",
|
||||
"BILLING": "الفواتير",
|
||||
"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": {
|
||||
"CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected",
|
||||
"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",
|
||||
"ASSIGN_LABEL": "Assign",
|
||||
"YES": "Yes",
|
||||
"ASSIGN_AGENT_TOOLTIP": "Assign Agent",
|
||||
"ASSIGN_SUCCESFUL": "Conversations assigned successfully",
|
||||
"ASSIGN_FAILED": "Failed to assign conversations, please try again",
|
||||
|
|
|
@ -239,7 +239,9 @@
|
|||
},
|
||||
"API_CALLBACK": {
|
||||
"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",
|
||||
"API": {
|
||||
|
@ -357,7 +359,7 @@
|
|||
},
|
||||
"FINISH": {
|
||||
"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",
|
||||
"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."
|
||||
|
|
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": "Контакти",
|
||||
"HOME": "Home",
|
||||
"AGENTS": "Агенти",
|
||||
"AGENT_BOTS": "Bots",
|
||||
"INBOXES": "Inboxes",
|
||||
"NOTIFICATIONS": "Notifications",
|
||||
"CANNED_RESPONSES": "Готови отговори",
|
||||
|
@ -189,6 +190,7 @@
|
|||
"LABELS": "Labels",
|
||||
"CUSTOM_ATTRIBUTES": "Персонализирани атрибути",
|
||||
"AUTOMATION": "Автоматизация",
|
||||
"MACROS": "Macros",
|
||||
"TEAMS": "Teams",
|
||||
"BILLING": "Billing",
|
||||
"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": {
|
||||
"CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected",
|
||||
"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",
|
||||
"ASSIGN_LABEL": "Assignar",
|
||||
"YES": "Si",
|
||||
"ASSIGN_AGENT_TOOLTIP": "Assign Agent",
|
||||
"ASSIGN_SUCCESFUL": "Conversations assigned successfully",
|
||||
"ASSIGN_FAILED": "Failed to assign conversations, please try again",
|
||||
|
|
|
@ -239,7 +239,9 @@
|
|||
},
|
||||
"API_CALLBACK": {
|
||||
"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",
|
||||
"API": {
|
||||
|
@ -357,7 +359,7 @@
|
|||
},
|
||||
"FINISH": {
|
||||
"TITLE": "La vostra safata d'entrada està a punt!",
|
||||
"MESSAGE": "Ja podeu interactuar amb els vostres clients a través del vostre canal nou. Feliç suport ",
|
||||
"MESSAGE": "Ja podeu interactuar amb els vostres clients a través del vostre canal nou. Feliç suport",
|
||||
"BUTTON_TEXT": "Porta'm allà",
|
||||
"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."
|
||||
|
|
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",
|
||||
"HOME": "Inici",
|
||||
"AGENTS": "Agents",
|
||||
"AGENT_BOTS": "Bots",
|
||||
"INBOXES": "Safates d'entrada",
|
||||
"NOTIFICATIONS": "Notificacions",
|
||||
"CANNED_RESPONSES": "Respostes predeterminades",
|
||||
|
@ -189,6 +190,7 @@
|
|||
"LABELS": "Etiquetes",
|
||||
"CUSTOM_ATTRIBUTES": "Atributs personalitzats",
|
||||
"AUTOMATION": "Automation",
|
||||
"MACROS": "Macros",
|
||||
"TEAMS": "Equips",
|
||||
"BILLING": "Billing",
|
||||
"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": {
|
||||
"CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected",
|
||||
"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",
|
||||
"ASSIGN_LABEL": "Přiřadit",
|
||||
"YES": "Ano",
|
||||
"ASSIGN_AGENT_TOOLTIP": "Assign Agent",
|
||||
"ASSIGN_SUCCESFUL": "Conversations assigned successfully",
|
||||
"ASSIGN_FAILED": "Failed to assign conversations, please try again",
|
||||
|
|
|
@ -239,7 +239,9 @@
|
|||
},
|
||||
"API_CALLBACK": {
|
||||
"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",
|
||||
"API": {
|
||||
|
@ -357,7 +359,7 @@
|
|||
},
|
||||
"FINISH": {
|
||||
"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",
|
||||
"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ě."
|
||||
|
|
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",
|
||||
"HOME": "Domů",
|
||||
"AGENTS": "Agenti",
|
||||
"AGENT_BOTS": "Bots",
|
||||
"INBOXES": "Schránky",
|
||||
"NOTIFICATIONS": "Oznámení",
|
||||
"CANNED_RESPONSES": "Konzervované odpovědi",
|
||||
|
@ -189,6 +190,7 @@
|
|||
"LABELS": "Štítky",
|
||||
"CUSTOM_ATTRIBUTES": "Vlastní atributy",
|
||||
"AUTOMATION": "Automation",
|
||||
"MACROS": "Macros",
|
||||
"TEAMS": "Týmy",
|
||||
"BILLING": "Billing",
|
||||
"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": {
|
||||
"CONVERSATIONS_SELECTED": "%{conversationCount} samtaler valgt",
|
||||
"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",
|
||||
"ASSIGN_LABEL": "Tildel",
|
||||
"YES": "Ja",
|
||||
"ASSIGN_AGENT_TOOLTIP": "Tildel Agent",
|
||||
"ASSIGN_SUCCESFUL": "Samtaler tildelt",
|
||||
"ASSIGN_FAILED": "Mislykkedes at tildele samtaler, prøv igen",
|
||||
|
|
|
@ -306,7 +306,7 @@
|
|||
"PUBLISH_ARTICLE": {
|
||||
"API": {
|
||||
"ERROR": "Fejl under publicering af artikel",
|
||||
"SUCCESS": "Artikel publiceret med succes"
|
||||
"SUCCESS": "Article published successfully"
|
||||
}
|
||||
},
|
||||
"ARCHIVE_ARTICLE": {
|
||||
|
|
|
@ -239,7 +239,9 @@
|
|||
},
|
||||
"API_CALLBACK": {
|
||||
"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",
|
||||
"API": {
|
||||
|
@ -357,7 +359,7 @@
|
|||
},
|
||||
"FINISH": {
|
||||
"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",
|
||||
"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."
|
||||
|
|
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",
|
||||
"HOME": "Hjem",
|
||||
"AGENTS": "Agenter",
|
||||
"AGENT_BOTS": "Bots",
|
||||
"INBOXES": "Indbakker",
|
||||
"NOTIFICATIONS": "Notifikationer",
|
||||
"CANNED_RESPONSES": "Standardsvar Svar",
|
||||
|
@ -189,6 +190,7 @@
|
|||
"LABELS": "Etiketter",
|
||||
"CUSTOM_ATTRIBUTES": "Brugerdefinerede Egenskaber",
|
||||
"AUTOMATION": "Automatisering",
|
||||
"MACROS": "Macros",
|
||||
"TEAMS": "Teams",
|
||||
"BILLING": "Fakturering",
|
||||
"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": {
|
||||
"CONVERSATIONS_SELECTED": "%{conversationCount} Konversationen ausgewählt",
|
||||
"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",
|
||||
"ASSIGN_LABEL": "Zuordnen",
|
||||
"YES": "Ja",
|
||||
"ASSIGN_AGENT_TOOLTIP": "Agent zuweisen",
|
||||
"ASSIGN_SUCCESFUL": "Konversationen erfolgreich zugewiesen",
|
||||
"ASSIGN_FAILED": "Konversationen konnten nicht zugewiesen werden. Bitte versuchen Sie es erneut",
|
||||
|
|
|
@ -239,7 +239,9 @@
|
|||
},
|
||||
"API_CALLBACK": {
|
||||
"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",
|
||||
"API": {
|
||||
|
@ -357,7 +359,7 @@
|
|||
},
|
||||
"FINISH": {
|
||||
"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",
|
||||
"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."
|
||||
|
|
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",
|
||||
"HOME": "Hauptseite",
|
||||
"AGENTS": "Agenten",
|
||||
"AGENT_BOTS": "Bots",
|
||||
"INBOXES": "Posteingänge",
|
||||
"NOTIFICATIONS": "Push-Benachrichtigungen",
|
||||
"CANNED_RESPONSES": "Vorgefertigte Antworten",
|
||||
|
@ -189,6 +190,7 @@
|
|||
"LABELS": "Labels",
|
||||
"CUSTOM_ATTRIBUTES": "Benutzerdefinierte Attribute",
|
||||
"AUTOMATION": "Automatisierung",
|
||||
"MACROS": "Makros",
|
||||
"TEAMS": "Teams",
|
||||
"BILLING": "Rechnungen",
|
||||
"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} σινομιλίες επιλέχθηκαν",
|
||||
"AGENT_SELECT_LABEL": "Επιλογή πράκτορα",
|
||||
"ASSIGN_CONFIRMATION_LABEL": "Είσαστε σίγουροι ότι θέλετε να αντιστοιχίσετε %{conversationCount} %{conversationLabel} στον",
|
||||
"UNASSIGN_CONFIRMATION_LABEL": "Είσαστε σίγουροι ότι θέλετε να αφαιρέσετε την αντιστοίχιση %{conversationCount} %{conversationLabel} στον;",
|
||||
"GO_BACK_LABEL": "Πίσω",
|
||||
"ASSIGN_LABEL": "Αντιστοίχιση",
|
||||
"YES": "Ναι",
|
||||
"ASSIGN_AGENT_TOOLTIP": "Ανάθεση σε πράκτορα",
|
||||
"ASSIGN_SUCCESFUL": "Οι σινομιλίες αντιστοιχήθηκαν επιτυχώς",
|
||||
"ASSIGN_FAILED": "Αποτυχία στην αντιστοίχιση σινομιλιών, παρακαλώ δοκιμάστε αργότερα",
|
||||
|
|
|
@ -152,8 +152,8 @@
|
|||
},
|
||||
"DELETE_AVATAR": {
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "Contact avatar deleted successfully",
|
||||
"ERROR_MESSAGE": "Could not delete the contact avatar. Please try again later."
|
||||
"SUCCESS_MESSAGE": "Το avatar της επαφής διαγράφηκε επιτυχώς",
|
||||
"ERROR_MESSAGE": "Δεν ήταν δυνατή η διαγραφή του avatar της επαφής. Παρακαλώ προσπαθήστε ξανά αργότερα."
|
||||
}
|
||||
},
|
||||
"SUCCESS_MESSAGE": "Η επαφή αποθηκεύτηκε με επιτυχία",
|
||||
|
|
|
@ -39,7 +39,7 @@
|
|||
"CUSTOM_ATTRIBUTE_CHECKBOX": "Checkbox",
|
||||
"CREATED_AT": "Δημιουργήθηκε στις",
|
||||
"LAST_ACTIVITY": "Τελευταία Δραστηριότητα",
|
||||
"REFERER_LINK": "Referrer link"
|
||||
"REFERER_LINK": "Σύνδεσμος αναφοράς"
|
||||
},
|
||||
"GROUPS": {
|
||||
"STANDARD_FILTERS": "Τυπικά Φίλτρα",
|
||||
|
|
|
@ -2,8 +2,8 @@
|
|||
"CONVERSATION": {
|
||||
"SELECT_A_CONVERSATION": "Παρακαλώ επιλέξτε συζήτηση από το αριστερό τμήμα",
|
||||
"CSAT_REPLY_MESSAGE": "Παρακαλώ αξιολογήστε τη συνομιλία",
|
||||
"404": "Sorry, we cannot find the conversation. Please try again",
|
||||
"SWITCH_VIEW_LAYOUT": "Switch the layout",
|
||||
"404": "Λυπούμαστε, δεν μπορούμε να βρούμε την συνομιλία. Παρακαλώ προσπαθήστε ξανά",
|
||||
"SWITCH_VIEW_LAYOUT": "Εναλλαγή διάταξης",
|
||||
"DASHBOARD_APP_TAB_MESSAGES": "Μηνύματα",
|
||||
"UNVERIFIED_SESSION": "Η ταυτότητα αυτού του χρήστη δεν επαληθεύεται",
|
||||
"NO_MESSAGE_1": "Ωχ ωχ! Φαίνεται ότι δεν υπάρχουν μηνύματα από τους πελάτες στα εισερχόμενά σας.",
|
||||
|
@ -63,30 +63,30 @@
|
|||
},
|
||||
"CARD_CONTEXT_MENU": {
|
||||
"PENDING": "Σήμανση ως εκκρεμής",
|
||||
"RESOLVED": "Mark as resolved",
|
||||
"RESOLVED": "Σήμανση ως επιλυμένου",
|
||||
"REOPEN": "Άνοιγμα συνομιλίας",
|
||||
"SNOOZE": {
|
||||
"TITLE": "Snooze",
|
||||
"TITLE": "Αναβολή",
|
||||
"NEXT_REPLY": "Μέχρι την επόμενη απάντηση",
|
||||
"TOMORROW": "Μέχρι αύριο",
|
||||
"NEXT_WEEK": "Έως την επόμενη εβδομάδα"
|
||||
},
|
||||
"ASSIGN_AGENT": "Assign agent",
|
||||
"ASSIGN_LABEL": "Assign label",
|
||||
"AGENTS_LOADING": "Loading agents...",
|
||||
"ASSIGN_TEAM": "Assign team",
|
||||
"ASSIGN_AGENT": "Ανάθεση σε πράκτορα",
|
||||
"ASSIGN_LABEL": "Εκχώρηση ετικέτας",
|
||||
"AGENTS_LOADING": "Φόρτωση πρακτόρων...",
|
||||
"ASSIGN_TEAM": "Ανάθεση ομάδας",
|
||||
"API": {
|
||||
"AGENT_ASSIGNMENT": {
|
||||
"SUCCESFUL": "Conversation id %{conversationId} assigned to \"%{agentName}\"",
|
||||
"FAILED": "Couldn't assign agent. Please try again."
|
||||
"SUCCESFUL": "Η συνομιλία με αριθμό %{conversationId} ανατέθηκε στον \"%{agentName}\"",
|
||||
"FAILED": "Αδυναμία αντιστοίχισης σε πράκτορα. Παρακαλώ δοκιμάστε ξανά."
|
||||
},
|
||||
"LABEL_ASSIGNMENT": {
|
||||
"SUCCESFUL": "Assigned label #%{labelName} to conversation id %{conversationId}",
|
||||
"FAILED": "Couldn't assign label. Please try again."
|
||||
"SUCCESFUL": "Εκχώρηση ετικέτας #%{labelName} στην συνομιλία με αριθμό %{conversationId}",
|
||||
"FAILED": "Αποτυχία στην εκχώρηση ετικέτας, παρακαλώ δοκιμάστε αργότερα."
|
||||
},
|
||||
"TEAM_ASSIGNMENT": {
|
||||
"SUCCESFUL": "Assigned team \"%{team}\" to conversation id %{conversationId}",
|
||||
"FAILED": "Couldn't assign team. Please try again."
|
||||
"SUCCESFUL": "Η συνομιλία με αριθμό %{conversationId} ανατέθηκε στην ομάδα \"%{team}\"",
|
||||
"FAILED": "Αδυναμία αντιστοίχισης ομάδας. Παρακαλώ δοκιμάστε ξανά."
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -131,13 +131,13 @@
|
|||
},
|
||||
"VISIBLE_TO_AGENTS": "Ιδιωτική Σημείωση: Ορατή μόνο σε σας και την ομάδα σας",
|
||||
"CHANGE_STATUS": "Η κατάσταση της συνομιλίας άλλαξε",
|
||||
"CHANGE_STATUS_FAILED": "Conversation status change failed",
|
||||
"CHANGE_STATUS_FAILED": "Η αλλαγή κατάστασης συνομιλίας απέτυχε",
|
||||
"CHANGE_AGENT": "Η εκπροσώπηση για την συνομιλία άλλαξε",
|
||||
"CHANGE_AGENT_FAILED": "Assignee change failed",
|
||||
"ASSIGN_LABEL_SUCCESFUL": "Label assigned successfully",
|
||||
"ASSIGN_LABEL_FAILED": "Label assignment failed",
|
||||
"CHANGE_AGENT_FAILED": "Η αλλαγή της ανάθεσης απέτυχε",
|
||||
"ASSIGN_LABEL_SUCCESFUL": "Επιτυχής εκχώρηση ετικέτας",
|
||||
"ASSIGN_LABEL_FAILED": "Η εκχώρηση ετικέτας απέτυχε",
|
||||
"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": "Δεν είναι δυνατή η αποστολή του μηνύματος, παρακαλώ προσπαθήστε ξανά αργότερα",
|
||||
"SENT_BY": "Αποστολή από:",
|
||||
"BOT": "Bot",
|
||||
|
@ -151,7 +151,7 @@
|
|||
"CONTEXT_MENU": {
|
||||
"COPY": "Αντιγραφή",
|
||||
"DELETE": "Διαγραφή",
|
||||
"CREATE_A_CANNED_RESPONSE": "Add to canned responses"
|
||||
"CREATE_A_CANNED_RESPONSE": "Προσθήκη στις έτοιμες απαντήσεις"
|
||||
}
|
||||
},
|
||||
"EMAIL_TRANSCRIPT": {
|
||||
|
|
|
@ -1,409 +1,409 @@
|
|||
{
|
||||
"HELP_CENTER": {
|
||||
"HEADER": {
|
||||
"FILTER": "Filter by",
|
||||
"SORT": "Sort by",
|
||||
"FILTER": "Φιλτράρισμα κατά",
|
||||
"SORT": "Ταξινόμηση κατά",
|
||||
"SETTINGS_BUTTON": "Ρυθμίσεις",
|
||||
"NEW_BUTTON": "New Article",
|
||||
"NEW_BUTTON": "Νέο Άρθρο",
|
||||
"DROPDOWN_OPTIONS": {
|
||||
"PUBLISHED": "Published",
|
||||
"DRAFT": "Draft",
|
||||
"ARCHIVED": "Archived"
|
||||
"PUBLISHED": "Δημοσιευμένο",
|
||||
"DRAFT": "Πρόχειρο",
|
||||
"ARCHIVED": "Αρχειοθετημένο"
|
||||
},
|
||||
"TITLES": {
|
||||
"ALL_ARTICLES": "All Articles",
|
||||
"MINE": "My Articles",
|
||||
"DRAFT": "Draft Articles",
|
||||
"ARCHIVED": "Archived Articles"
|
||||
"ALL_ARTICLES": "Όλα Τα Άρθρα",
|
||||
"MINE": "Τα Άρθρα Μου",
|
||||
"DRAFT": "Πρόχειρα Άρθρα",
|
||||
"ARCHIVED": "Αρχειοθετημένα Άρθρα"
|
||||
}
|
||||
},
|
||||
"EDIT_HEADER": {
|
||||
"ALL_ARTICLES": "All Articles",
|
||||
"PUBLISH_BUTTON": "Publish",
|
||||
"MOVE_TO_ARCHIVE_BUTTON": "Move to archived",
|
||||
"PREVIEW": "Preview",
|
||||
"ADD_TRANSLATION": "Add translation",
|
||||
"OPEN_SIDEBAR": "Open sidebar",
|
||||
"CLOSE_SIDEBAR": "Close sidebar",
|
||||
"SAVING": "Saving...",
|
||||
"SAVED": "Saved"
|
||||
"ALL_ARTICLES": "Όλα Τα Άρθρα",
|
||||
"PUBLISH_BUTTON": "Δημοσιευμένο",
|
||||
"MOVE_TO_ARCHIVE_BUTTON": "Μετακίνηση στα αρχειοθετημένα",
|
||||
"PREVIEW": "Προεπισκόπηση",
|
||||
"ADD_TRANSLATION": "Προσθήκη μετάφρασης",
|
||||
"OPEN_SIDEBAR": "Άνοιγμα πλευρικής μπάρας",
|
||||
"CLOSE_SIDEBAR": "Κλείσιμο πλευρικής μπάρας",
|
||||
"SAVING": "Αποθηκεύεται...",
|
||||
"SAVED": "Αποθηκεύτηκε"
|
||||
},
|
||||
"ARTICLE_SETTINGS": {
|
||||
"TITLE": "Article Settings",
|
||||
"TITLE": "Ρυθμίσεις Άρθρου",
|
||||
"FORM": {
|
||||
"CATEGORY": {
|
||||
"LABEL": "Κατηγορία",
|
||||
"TITLE": "Select category",
|
||||
"PLACEHOLDER": "Select category",
|
||||
"NO_RESULT": "No category found",
|
||||
"SEARCH_PLACEHOLDER": "Search category"
|
||||
"TITLE": "Επιλογή κατηγορίας",
|
||||
"PLACEHOLDER": "Επιλογή κατηγορίας",
|
||||
"NO_RESULT": "Δεν βρέθηκε καμία κατηγορία",
|
||||
"SEARCH_PLACEHOLDER": "Αναζήτηση κατηγορίας"
|
||||
},
|
||||
"AUTHOR": {
|
||||
"LABEL": "Author",
|
||||
"TITLE": "Select author",
|
||||
"PLACEHOLDER": "Select author",
|
||||
"NO_RESULT": "No authors found",
|
||||
"SEARCH_PLACEHOLDER": "Search author"
|
||||
"LABEL": "Συγγραφέας",
|
||||
"TITLE": "Επιλογή συγγραφέα",
|
||||
"PLACEHOLDER": "Επιλογή συγγραφέα",
|
||||
"NO_RESULT": "Δεν βρέθηκαν συγγραφείς",
|
||||
"SEARCH_PLACEHOLDER": "Αναζήτηση συγγραφέα"
|
||||
},
|
||||
"META_TITLE": {
|
||||
"LABEL": "Meta title",
|
||||
"PLACEHOLDER": "Add a meta title"
|
||||
"LABEL": "Μετα-τίτλος",
|
||||
"PLACEHOLDER": "Προσθήκη meta Τίτλου"
|
||||
},
|
||||
"META_DESCRIPTION": {
|
||||
"LABEL": "Meta description",
|
||||
"PLACEHOLDER": "Add your meta description for better SEO results..."
|
||||
"LABEL": "Meta περιγραφή",
|
||||
"PLACEHOLDER": "Προσθέστε τη meta περιγραφή σας για καλύτερα αποτελέσματα SEO..."
|
||||
},
|
||||
"META_TAGS": {
|
||||
"LABEL": "Meta tags",
|
||||
"PLACEHOLDER": "Add meta tags separated by comma..."
|
||||
"PLACEHOLDER": "Προσθήκη μετα-ετικετών διαχωρισμένων με κόμμα..."
|
||||
}
|
||||
},
|
||||
"BUTTONS": {
|
||||
"ARCHIVE": "Archive article",
|
||||
"DELETE": "Delete article"
|
||||
"ARCHIVE": "Αρχειοθέτηση άρθρου",
|
||||
"DELETE": "Διαγραφή άρθρου"
|
||||
}
|
||||
},
|
||||
"PORTAL": {
|
||||
"HEADER": "Portals",
|
||||
"DEFAULT": "Default",
|
||||
"NEW_BUTTON": "New Portal",
|
||||
"HEADER": "Πύλες",
|
||||
"DEFAULT": "Προεπιλογή",
|
||||
"NEW_BUTTON": "Νέα Πύλη",
|
||||
"ACTIVE_BADGE": "ενεργή",
|
||||
"CHOOSE_LOCALE_LABEL": "Choose a locale",
|
||||
"LOADING_MESSAGE": "Loading portals...",
|
||||
"ARTICLES_LABEL": "articles",
|
||||
"NO_PORTALS_MESSAGE": "There are no available portals",
|
||||
"ADD_NEW_LOCALE": "Add a new locale",
|
||||
"CHOOSE_LOCALE_LABEL": "Επιλέξτε μια γλώσσα",
|
||||
"LOADING_MESSAGE": "Φόρτωση πυλών...",
|
||||
"ARTICLES_LABEL": "άρθρα",
|
||||
"NO_PORTALS_MESSAGE": "Δεν υπάρχουν διαθέσιμες πύλες",
|
||||
"ADD_NEW_LOCALE": "Προσθέστε μια νέα γλώσσα",
|
||||
"POPOVER": {
|
||||
"TITLE": "Portals",
|
||||
"PORTAL_SETTINGS": "Portal settings",
|
||||
"SUBTITLE": "You have multiple portals and can have different locales for each portal.",
|
||||
"TITLE": "Πύλες",
|
||||
"PORTAL_SETTINGS": "Ρυθμίσεις πύλης",
|
||||
"SUBTITLE": "Έχετε πολλαπλές πύλες με διαφορετικές γλώσσες για κάθε πύλη.",
|
||||
"CANCEL_BUTTON_LABEL": "Άκυρο",
|
||||
"CHOOSE_LOCALE_BUTTON": "Choose Locale"
|
||||
"CHOOSE_LOCALE_BUTTON": "Επιλέξτε γλώσσα"
|
||||
},
|
||||
"PORTAL_SETTINGS": {
|
||||
"LIST_ITEM": {
|
||||
"HEADER": {
|
||||
"COUNT_LABEL": "articles",
|
||||
"ADD": "Add locale",
|
||||
"VISIT": "Visit site",
|
||||
"COUNT_LABEL": "άρθρα",
|
||||
"ADD": "Προσθήκη γλώσσας",
|
||||
"VISIT": "Επίσκεψη site",
|
||||
"SETTINGS": "Ρυθμίσεις",
|
||||
"DELETE": "Διαγραφή"
|
||||
},
|
||||
"PORTAL_CONFIG": {
|
||||
"TITLE": "Portal Configurations",
|
||||
"TITLE": "Ρυθμίσεις Πύλης",
|
||||
"ITEMS": {
|
||||
"NAME": "Όνομα",
|
||||
"DOMAIN": "Custom domain",
|
||||
"DOMAIN": "Προσαρμοσμένο Domain",
|
||||
"SLUG": "Slug",
|
||||
"TITLE": "Portal title",
|
||||
"THEME": "Theme color",
|
||||
"SUB_TEXT": "Portal sub text"
|
||||
"TITLE": "Τίτλος πύλης",
|
||||
"THEME": "Χρώμα θέματος",
|
||||
"SUB_TEXT": "Υποκείμενο πύλης"
|
||||
}
|
||||
},
|
||||
"AVAILABLE_LOCALES": {
|
||||
"TITLE": "Available locales",
|
||||
"TITLE": "Διαθέσιμες γλώσσες",
|
||||
"TABLE": {
|
||||
"NAME": "Locale name",
|
||||
"CODE": "Locale code",
|
||||
"ARTICLE_COUNT": "No. of articles",
|
||||
"CATEGORIES": "No. of categories",
|
||||
"SWAP": "Swap",
|
||||
"NAME": "Όνομα γλώσσας",
|
||||
"CODE": "Κωδικός γλώσσας",
|
||||
"ARTICLE_COUNT": "Αριθμός άρθρων",
|
||||
"CATEGORIES": "Αριθμός κατηγοριών",
|
||||
"SWAP": "Εναλλαγή",
|
||||
"DELETE": "Διαγραφή",
|
||||
"DEFAULT_LOCALE": "Default"
|
||||
"DEFAULT_LOCALE": "Προεπιλογή"
|
||||
}
|
||||
}
|
||||
},
|
||||
"DELETE_PORTAL": {
|
||||
"TITLE": "Delete portal",
|
||||
"MESSAGE": "Are you sure you want to delete this portal",
|
||||
"YES": "Yes, delete portal",
|
||||
"NO": "No, keep portal",
|
||||
"TITLE": "Διαγραφή πύλης",
|
||||
"MESSAGE": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν την πύλη",
|
||||
"YES": "Ναι, διαγραφή πύλης",
|
||||
"NO": "Όχι, διατήρηση πύλης",
|
||||
"API": {
|
||||
"DELETE_SUCCESS": "Portal deleted successfully",
|
||||
"DELETE_ERROR": "Error while deleting portal"
|
||||
"DELETE_SUCCESS": "Η πύλη διαγράφηκε επιτυχώς",
|
||||
"DELETE_ERROR": "Σφάλμα κατά τη διαγραφή της πύλης"
|
||||
}
|
||||
}
|
||||
},
|
||||
"EDIT": {
|
||||
"HEADER_TEXT": "Edit portal",
|
||||
"HEADER_TEXT": "Επεξεργασία πύλης",
|
||||
"TABS": {
|
||||
"BASIC_SETTINGS": {
|
||||
"TITLE": "Basic information"
|
||||
"TITLE": "Βασικές πληροφορίες"
|
||||
},
|
||||
"CUSTOMIZATION_SETTINGS": {
|
||||
"TITLE": "Portal customization"
|
||||
"TITLE": "Προσαρμογή πύλης"
|
||||
},
|
||||
"CATEGORY_SETTINGS": {
|
||||
"TITLE": "Categories"
|
||||
"TITLE": "Κατηγορίες"
|
||||
},
|
||||
"LOCALE_SETTINGS": {
|
||||
"TITLE": "Locales"
|
||||
"TITLE": "Γλώσσες"
|
||||
}
|
||||
},
|
||||
"CATEGORIES": {
|
||||
"TITLE": "Categories in",
|
||||
"NEW_CATEGORY": "New category",
|
||||
"TITLE": "Κατηγορίες στο",
|
||||
"NEW_CATEGORY": "Νέα κατηγορία",
|
||||
"TABLE": {
|
||||
"NAME": "Όνομα",
|
||||
"DESCRIPTION": "Περιγραφή",
|
||||
"LOCALE": "Locale",
|
||||
"ARTICLE_COUNT": "No. of articles",
|
||||
"LOCALE": "Γλώσσα",
|
||||
"ARTICLE_COUNT": "Αριθμός άρθρων",
|
||||
"ACTION_BUTTON": {
|
||||
"EDIT": "Edit category",
|
||||
"DELETE": "Delete category"
|
||||
"EDIT": "Επεξεργασία κατηγορίας",
|
||||
"DELETE": "Διαγραφή κατηγορίας"
|
||||
},
|
||||
"EMPTY_TEXT": "No categories found"
|
||||
"EMPTY_TEXT": "Δεν βρέθηκαν κατηγορίες"
|
||||
}
|
||||
},
|
||||
"EDIT_BASIC_INFO": {
|
||||
"BUTTON_TEXT": "Update basic settings"
|
||||
"BUTTON_TEXT": "Ενημέρωση βασικών ρυθμίσεων"
|
||||
}
|
||||
},
|
||||
"ADD": {
|
||||
"CREATE_FLOW": [
|
||||
{
|
||||
"title": "Help center information",
|
||||
"title": "Πληροφορίες κέντρου βοήθειας",
|
||||
"route": "new_portal_information",
|
||||
"body": "Basic information about portal",
|
||||
"CREATE_BASIC_SETTING_BUTTON": "Create portal basic settings"
|
||||
"body": "Βασικές πληροφορίες σχετικά με την πύλη",
|
||||
"CREATE_BASIC_SETTING_BUTTON": "Δημιουργία βασικών ρυθμίσεων πύλης"
|
||||
},
|
||||
{
|
||||
"title": "Help center customization",
|
||||
"title": "Προσαρμογή του κέντρου βοήθειας",
|
||||
"route": "portal_customization",
|
||||
"body": "Customize portal",
|
||||
"UPDATE_PORTAL_BUTTON": "Update portal settings"
|
||||
"body": "Προσαρμογή πύλης",
|
||||
"UPDATE_PORTAL_BUTTON": "Ενημέρωση ρυθμίσεων πύλης"
|
||||
},
|
||||
{
|
||||
"title": "Voila! 🎉",
|
||||
"title": "Έξοχα! 🎉",
|
||||
"route": "portal_finish",
|
||||
"body": "You're all set!",
|
||||
"body": "Είναι όλα έτοιμα!",
|
||||
"FINISH": "Τέλος"
|
||||
}
|
||||
],
|
||||
"CREATE_FLOW_PAGE": {
|
||||
"BACK_BUTTON": "Πίσω",
|
||||
"BASIC_SETTINGS_PAGE": {
|
||||
"HEADER": "Create Portal",
|
||||
"TITLE": "Help center information",
|
||||
"CREATE_BASIC_SETTING_BUTTON": "Create portal basic settings"
|
||||
"HEADER": "Δημιουργία Πύλης",
|
||||
"TITLE": "Πληροφορίες κέντρου βοήθειας",
|
||||
"CREATE_BASIC_SETTING_BUTTON": "Δημιουργία βασικών ρυθμίσεων πύλης"
|
||||
},
|
||||
"CUSTOMIZATION_PAGE": {
|
||||
"HEADER": "Portal customisation",
|
||||
"TITLE": "Help center customization",
|
||||
"UPDATE_PORTAL_BUTTON": "Update portal settings"
|
||||
"HEADER": "Προσαρμογή πύλης",
|
||||
"TITLE": "Προσαρμογή του κέντρου βοήθειας",
|
||||
"UPDATE_PORTAL_BUTTON": "Ενημέρωση ρυθμίσεων πύλης"
|
||||
},
|
||||
"FINISH_PAGE": {
|
||||
"TITLE": "Voila!🎉 You're all set up!",
|
||||
"MESSAGE": "You can now see this created portal on your all portals page.",
|
||||
"FINISH": "Go to all portals page"
|
||||
"TITLE": "Έξοχα!🎉 Έχετε ρυθμιστεί!",
|
||||
"MESSAGE": "Τώρα μπορείτε να δείτε την πύλη που δημιουργήθηκε στη σελίδα με όλες τις πύλες.",
|
||||
"FINISH": "Μετάβαση στις πύλες"
|
||||
}
|
||||
},
|
||||
"LOGO": {
|
||||
"LABEL": "Logo",
|
||||
"UPLOAD_BUTTON": "Upload logo",
|
||||
"HELP_TEXT": "This logo will be displayed on the portal header."
|
||||
"LABEL": "Λογότυπο",
|
||||
"UPLOAD_BUTTON": "Μεταφόρτωση λογότυπου",
|
||||
"HELP_TEXT": "Το λογότυπο θα εμφανιστεί στην κεφαλίδα της πύλης."
|
||||
},
|
||||
"NAME": {
|
||||
"LABEL": "Όνομα",
|
||||
"PLACEHOLDER": "Portal name",
|
||||
"HELP_TEXT": "The name will be used in the public facing portal internally.",
|
||||
"PLACEHOLDER": "Όνομα πύλης",
|
||||
"HELP_TEXT": "Το όνομα θα χρησιμοποιηθεί στο κοινό που βλέπει την πύλη εσωτερικά.",
|
||||
"ERROR": "Απαιτείται όνομα"
|
||||
},
|
||||
"SLUG": {
|
||||
"LABEL": "Slug",
|
||||
"PLACEHOLDER": "Portal slug for urls",
|
||||
"ERROR": "Slug is required"
|
||||
"PLACEHOLDER": "Slug Πύλης για τα urls",
|
||||
"ERROR": "Το Slug είναι απαραίτητο"
|
||||
},
|
||||
"DOMAIN": {
|
||||
"LABEL": "Custom Domain",
|
||||
"PLACEHOLDER": "Portal custom domain",
|
||||
"HELP_TEXT": "Add only If you want to use a custom domain for your portals.",
|
||||
"ERROR": "Custom Domain is required"
|
||||
"LABEL": "Προσαρμοσμένο Domain",
|
||||
"PLACEHOLDER": "Προσαρμοσμένος τομέας πύλης",
|
||||
"HELP_TEXT": "Προσθήκη μόνο Αν θέλετε να χρησιμοποιήσετε ένα προσαρμοσμένο τομέα για τις πύλες σας. (Automatic Translation).",
|
||||
"ERROR": "Ο Προσαρμοσμένος Τομέας απαιτείται"
|
||||
},
|
||||
"HOME_PAGE_LINK": {
|
||||
"LABEL": "Home Page Link",
|
||||
"PLACEHOLDER": "Portal home page link",
|
||||
"HELP_TEXT": "The link used to return from the portal to the home page.",
|
||||
"ERROR": "Home Page Link is required"
|
||||
"LABEL": "Σύνδεσμος Αρχικής Σελίδας",
|
||||
"PLACEHOLDER": "Σύνδεσμος αρχικής σελίδας πύλης",
|
||||
"HELP_TEXT": "Ο σύνδεσμος που χρησιμοποιείται για την επιστροφή από την πύλη στην αρχική σελίδα.",
|
||||
"ERROR": "Ο σύνδεσμος αρχικής σελίδας απαιτείται"
|
||||
},
|
||||
"THEME_COLOR": {
|
||||
"LABEL": "Portal theme color",
|
||||
"HELP_TEXT": "This color will show as the theme color for the portal."
|
||||
"LABEL": "Χρώμα θέματος πύλης",
|
||||
"HELP_TEXT": "Αυτό το χρώμα θα εμφανίζεται ως το χρώμα θέματος της πύλης. "
|
||||
},
|
||||
"PAGE_TITLE": {
|
||||
"LABEL": "Page Title",
|
||||
"PLACEHOLDER": "Portal page title",
|
||||
"HELP_TEXT": "The page title will be used in the public facing portal.",
|
||||
"ERROR": "Page title is required"
|
||||
"LABEL": "Τίτλος Σελίδας",
|
||||
"PLACEHOLDER": "Τίτλος σελίδας πύλης",
|
||||
"HELP_TEXT": "Ο τίτλος της σελίδας θα χρησιμοποιηθεί στην πύλη που βλέπει το κοινό.",
|
||||
"ERROR": "Ο τίτλος είναι απαραίτητος"
|
||||
},
|
||||
"HEADER_TEXT": {
|
||||
"LABEL": "Header Text",
|
||||
"PLACEHOLDER": "Portal header text",
|
||||
"HELP_TEXT": "The Portal header text will be used in the public facing portal.",
|
||||
"ERROR": "Portal header text is required"
|
||||
"LABEL": "Κείμενο Κεφαλίδας",
|
||||
"PLACEHOLDER": "Κείμενο κεφαλίδας πύλης",
|
||||
"HELP_TEXT": "Το κείμενο κεφαλίδας πύλης θα χρησιμοποιηθεί στο κοινό που βλέπει πύλη.",
|
||||
"ERROR": "Απαιτείται κείμενο κεφαλίδας πύλης"
|
||||
},
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE_FOR_BASIC": "Portal created successfully.",
|
||||
"ERROR_MESSAGE_FOR_BASIC": "Couldn't create the portal. Try again.",
|
||||
"SUCCESS_MESSAGE_FOR_UPDATE": "Portal updated successfully.",
|
||||
"ERROR_MESSAGE_FOR_UPDATE": "Couldn't update the portal. Try again."
|
||||
"SUCCESS_MESSAGE_FOR_BASIC": "Ο φάκελος δημιουργήθηκε με επιτυχία.",
|
||||
"ERROR_MESSAGE_FOR_BASIC": "Δεν ήταν δυνατή η δημιουργία της πύλης. Δοκιμάστε ξανά.",
|
||||
"SUCCESS_MESSAGE_FOR_UPDATE": "Η πύλη ενημερώθηκε με επιτυχία.",
|
||||
"ERROR_MESSAGE_FOR_UPDATE": "Δεν ήταν δυνατή η ενημέρωση της πύλης. Δοκιμάστε ξανά."
|
||||
}
|
||||
},
|
||||
"ADD_LOCALE": {
|
||||
"TITLE": "Add a new locale",
|
||||
"SUB_TITLE": "This adds a new locale to your available translation list.",
|
||||
"PORTAL": "Portal",
|
||||
"TITLE": "Προσθέστε μια νέα γλώσσα",
|
||||
"SUB_TITLE": "Προσθέτει μια νέα γλώσσα στη διαθέσιμη λίστα μεταφράσεών σας.",
|
||||
"PORTAL": "Πύλη",
|
||||
"LOCALE": {
|
||||
"LABEL": "Locale",
|
||||
"PLACEHOLDER": "Choose a locale",
|
||||
"ERROR": "Locale is required"
|
||||
"LABEL": "Γλώσσα",
|
||||
"PLACEHOLDER": "Επιλέξτε μια γλώσσα",
|
||||
"ERROR": "Η γλώσσα απαιτείται"
|
||||
},
|
||||
"BUTTONS": {
|
||||
"CREATE": "Create locale",
|
||||
"CREATE": "Δημιουργία γλώσσας",
|
||||
"CANCEL": "Άκυρο"
|
||||
},
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "Locale added successfully",
|
||||
"ERROR_MESSAGE": "Unable to add locale. Try again."
|
||||
"SUCCESS_MESSAGE": "Η γλώσσα προστέθηκε επιτυχώς",
|
||||
"ERROR_MESSAGE": "Δεν είναι δυνατή η προσθήκη γλώσσας. Δοκιμάστε ξανά."
|
||||
}
|
||||
},
|
||||
"CHANGE_DEFAULT_LOCALE": {
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "Default locale updated successfully",
|
||||
"ERROR_MESSAGE": "Unable to update default locale. Try again."
|
||||
"SUCCESS_MESSAGE": "Η προεπιλεγμένη γλώσσα ενημερώθηκε επιτυχώς",
|
||||
"ERROR_MESSAGE": "Δεν είναι δυνατή η ενημέρωση της προεπιλεγμένης γλώσσας. Δοκιμάστε ξανά."
|
||||
}
|
||||
},
|
||||
"DELETE_LOCALE": {
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "Locale removed from portal successfully",
|
||||
"ERROR_MESSAGE": "Unable to remove locale from portal. Try again."
|
||||
"SUCCESS_MESSAGE": "Η γλώσσα αφαιρέθηκε επιτυχώς από την πύλη",
|
||||
"ERROR_MESSAGE": "Δεν είναι δυνατή η αφαίρεση γλώσσας από την πύλη. Δοκιμάστε ξανά."
|
||||
}
|
||||
}
|
||||
},
|
||||
"TABLE": {
|
||||
"LOADING_MESSAGE": "Loading articles...",
|
||||
"404": "No articles matches your search 🔍",
|
||||
"NO_ARTICLES": "There are no available articles",
|
||||
"LOADING_MESSAGE": "Φόρτωση άρθρων...",
|
||||
"404": "Δεν υπάρχουν άρθρα που να ταιριάζουν στην αναζήτησή σας 🔍",
|
||||
"NO_ARTICLES": "Δεν υπάρχουν διαθέσιμα άρθρα",
|
||||
"HEADERS": {
|
||||
"TITLE": "Τίτλος",
|
||||
"CATEGORY": "Κατηγορία",
|
||||
"READ_COUNT": "Read count",
|
||||
"READ_COUNT": "Πλήθος ανάγνωσεων",
|
||||
"STATUS": "Κατάσταση",
|
||||
"LAST_EDITED": "Last edited"
|
||||
"LAST_EDITED": "Τελευταία επεξεργασία"
|
||||
},
|
||||
"COLUMNS": {
|
||||
"BY": "by"
|
||||
"BY": "από"
|
||||
}
|
||||
},
|
||||
"EDIT_ARTICLE": {
|
||||
"LOADING": "Loading article...",
|
||||
"TITLE_PLACEHOLDER": "Article title goes here",
|
||||
"CONTENT_PLACEHOLDER": "Write your article here",
|
||||
"LOADING": "Φόρτωση άρθρου...",
|
||||
"TITLE_PLACEHOLDER": "Ο τίτλος του άρθρου εμφανίζεται εδώ",
|
||||
"CONTENT_PLACEHOLDER": "Γράψτε το άρθρο σας εδώ",
|
||||
"API": {
|
||||
"ERROR": "Error while saving article"
|
||||
"ERROR": "Σφάλμα κατά την αποθήκευση άρθρου"
|
||||
}
|
||||
},
|
||||
"PUBLISH_ARTICLE": {
|
||||
"API": {
|
||||
"ERROR": "Error while publishing article",
|
||||
"SUCCESS": "Article published successfully"
|
||||
"ERROR": "Σφάλμα κατά τη δημοσίευση του άρθρου",
|
||||
"SUCCESS": "Το Άρθρο δημοσιεύθηκε με επιτυχία"
|
||||
}
|
||||
},
|
||||
"ARCHIVE_ARTICLE": {
|
||||
"API": {
|
||||
"ERROR": "Error while archiving article",
|
||||
"SUCCESS": "Article archived successfully"
|
||||
"ERROR": "Σφάλμα κατά την αρχειοθέτηση άρθρου",
|
||||
"SUCCESS": "Το άρθρο αρχειοθετήθηκε επιτυχώς"
|
||||
}
|
||||
},
|
||||
"DELETE_ARTICLE": {
|
||||
"MODAL": {
|
||||
"CONFIRM": {
|
||||
"TITLE": "Επιβεβαίωση Διαγραφής",
|
||||
"MESSAGE": "Are you sure to delete the article?",
|
||||
"MESSAGE": "Είστε βέβαιοι να διαγράψετε το άρθρο;",
|
||||
"YES": "Ναι, Διέγραψε το",
|
||||
"NO": "Όχι, Κράτησε τον/την"
|
||||
}
|
||||
},
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "Article deleted successfully",
|
||||
"ERROR_MESSAGE": "Error while deleting article"
|
||||
"SUCCESS_MESSAGE": "Η επαφή διαγράφηκε επιτυχώς",
|
||||
"ERROR_MESSAGE": "Σφάλμα κατά τη διαγραφή άρθρου"
|
||||
}
|
||||
},
|
||||
"CREATE_ARTICLE": {
|
||||
"ERROR_MESSAGE": "Please add the article heading and content then only you can update the settings"
|
||||
"ERROR_MESSAGE": "Παρακαλώ προσθέστε την επικεφαλίδα και το περιεχόμενο του άρθρου για να μπορείτε να ενημερώσετε τις ρυθμίσεις"
|
||||
},
|
||||
"SIDEBAR": {
|
||||
"SEARCH": {
|
||||
"PLACEHOLDER": "Search for articles"
|
||||
"PLACEHOLDER": "Αναζήτηση άρθρων"
|
||||
}
|
||||
},
|
||||
"CATEGORY": {
|
||||
"ADD": {
|
||||
"TITLE": "Create a category",
|
||||
"SUB_TITLE": "The category will be used in the public facing portal to categorize articles.",
|
||||
"PORTAL": "Portal",
|
||||
"LOCALE": "Locale",
|
||||
"TITLE": "Δημιουργία κατηγορίας",
|
||||
"SUB_TITLE": "Η κατηγορία θα χρησιμοποιηθεί στην πύλη που βλέπει το κοινό για την κατηγοριοποίηση των άρθρων.",
|
||||
"PORTAL": "Πύλη",
|
||||
"LOCALE": "Γλώσσα",
|
||||
"NAME": {
|
||||
"LABEL": "Όνομα",
|
||||
"PLACEHOLDER": "Category name",
|
||||
"HELP_TEXT": "The category name will be used in the public facing portal to categorize articles.",
|
||||
"PLACEHOLDER": "Όνομα κατηγορίας",
|
||||
"HELP_TEXT": "Η κατηγορία θα χρησιμοποιηθεί στην πύλη που βλέπει το κοινό για την κατηγοριοποίηση των άρθρων.",
|
||||
"ERROR": "Απαιτείται όνομα"
|
||||
},
|
||||
"SLUG": {
|
||||
"LABEL": "Slug",
|
||||
"PLACEHOLDER": "Category slug for urls",
|
||||
"PLACEHOLDER": "Slug κατηγορίας για urls",
|
||||
"HELP_TEXT": "app.chatwoot.com/hc/my-portal/en-US/categories/my-slug",
|
||||
"ERROR": "Slug is required"
|
||||
"ERROR": "Το Slug είναι απαραίτητο"
|
||||
},
|
||||
"DESCRIPTION": {
|
||||
"LABEL": "Περιγραφή",
|
||||
"PLACEHOLDER": "Give a short description about the category.",
|
||||
"PLACEHOLDER": "Δώστε μια σύντομη περιγραφή της κατηγορίας.",
|
||||
"ERROR": "Η περιγραφή απαιτείται"
|
||||
},
|
||||
"BUTTONS": {
|
||||
"CREATE": "Create category",
|
||||
"CREATE": "Δημιουργία κατηγορίας",
|
||||
"CANCEL": "Άκυρο"
|
||||
},
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "Category created successfully",
|
||||
"ERROR_MESSAGE": "Unable to create category"
|
||||
"SUCCESS_MESSAGE": "Η κατηγορία δημιουργήθηκε με επιτυχία",
|
||||
"ERROR_MESSAGE": "Αδυναμία δημιουργίας κατηγορίας"
|
||||
}
|
||||
},
|
||||
"EDIT": {
|
||||
"TITLE": "Edit a category",
|
||||
"SUB_TITLE": "Editing a category will update the category in the public facing portal.",
|
||||
"PORTAL": "Portal",
|
||||
"LOCALE": "Locale",
|
||||
"TITLE": "Επεξεργασία κατηγορίας",
|
||||
"SUB_TITLE": "Η επεξεργασία μιας κατηγορίας θα ενημερώσει την κατηγορία στην πύλη που βλέπει το κοινό.",
|
||||
"PORTAL": "Πύλη",
|
||||
"LOCALE": "Γλώσσα",
|
||||
"NAME": {
|
||||
"LABEL": "Όνομα",
|
||||
"PLACEHOLDER": "Category name",
|
||||
"HELP_TEXT": "The category name will be used in the public facing portal to categorize articles.",
|
||||
"PLACEHOLDER": "Όνομα κατηγορίας",
|
||||
"HELP_TEXT": "Η κατηγορία θα χρησιμοποιηθεί στην πύλη που βλέπει το κοινό για την κατηγοριοποίηση των άρθρων.",
|
||||
"ERROR": "Απαιτείται όνομα"
|
||||
},
|
||||
"SLUG": {
|
||||
"LABEL": "Slug",
|
||||
"PLACEHOLDER": "Category slug for urls",
|
||||
"PLACEHOLDER": "Slug κατηγορίας για urls",
|
||||
"HELP_TEXT": "app.chatwoot.com/hc/my-portal/en-US/categories/my-slug",
|
||||
"ERROR": "Slug is required"
|
||||
"ERROR": "Το Slug είναι απαραίτητο"
|
||||
},
|
||||
"DESCRIPTION": {
|
||||
"LABEL": "Περιγραφή",
|
||||
"PLACEHOLDER": "Give a short description about the category.",
|
||||
"PLACEHOLDER": "Δώστε μια σύντομη περιγραφή της κατηγορίας.",
|
||||
"ERROR": "Η περιγραφή απαιτείται"
|
||||
},
|
||||
"BUTTONS": {
|
||||
"CREATE": "Update category",
|
||||
"CREATE": "Επεξεργασία κατηγορίας",
|
||||
"CANCEL": "Άκυρο"
|
||||
},
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "Category updated successfully",
|
||||
"ERROR_MESSAGE": "Unable to update category"
|
||||
"SUCCESS_MESSAGE": "Η ετικέτα ενημερώθηκε επιτυχώς",
|
||||
"ERROR_MESSAGE": "Αδύνατη η ενημέρωση της κατηγορίας"
|
||||
}
|
||||
},
|
||||
"DELETE": {
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "Category deleted successfully",
|
||||
"ERROR_MESSAGE": "Unable to delete category"
|
||||
"SUCCESS_MESSAGE": "Η καμπάνια διαγράφηκε επιτυχώς",
|
||||
"ERROR_MESSAGE": "Δεν είναι δυνατή η διαγραφή κατηγορίας"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -112,10 +112,10 @@
|
|||
"ERROR": "Το πεδίο είναι απαραίτητο"
|
||||
},
|
||||
"MESSAGING_SERVICE_SID": {
|
||||
"LABEL": "Messaging Service SID",
|
||||
"PLACEHOLDER": "Please enter your Twilio Messaging Service SID",
|
||||
"LABEL": "SID Υπηρεσίας Μηνυμάτων",
|
||||
"PLACEHOLDER": "Παρακαλώ εισάγετε το Twilio Messaging Service SID σας",
|
||||
"ERROR": "Το πεδίο είναι απαραίτητο",
|
||||
"USE_MESSAGING_SERVICE": "Use a Twilio Messaging Service"
|
||||
"USE_MESSAGING_SERVICE": "Χρήση μιας υπηρεσίας μηνυμάτων Twilio"
|
||||
},
|
||||
"CHANNEL_TYPE": {
|
||||
"LABEL": "Τύπος Καναλιού",
|
||||
|
@ -239,7 +239,9 @@
|
|||
},
|
||||
"API_CALLBACK": {
|
||||
"TITLE": "URL επανάκλησης",
|
||||
"SUBTITLE": "Θα πρέπει να ρυθμίσετε το URL webhook στο facebook developer portal με το URL που αναφέρεται εδώ."
|
||||
"SUBTITLE": "Πρέπει να ρυθμίσετε τη διεύθυνση URL του webhook και το διακριτικό επαλήθευσης στην πύλη Προγραμματιστή Facebook με τις τιμές που εμφανίζονται παρακάτω.",
|
||||
"WEBHOOK_URL": "Σύνδεσμος Webhook",
|
||||
"WEBHOOK_VERIFICATION_TOKEN": "Token Επαλήθευσης Webhook"
|
||||
},
|
||||
"SUBMIT_BUTTON": "Δημιουργία Καναλιού WhatsApp",
|
||||
"API": {
|
||||
|
@ -357,7 +359,7 @@
|
|||
},
|
||||
"FINISH": {
|
||||
"TITLE": "Το κιβώτιο σας είναι έτοιμο!",
|
||||
"MESSAGE": "Μπορείτε να συνομιλείτε με τους πελάτες σας από το νέο κανάλι. Καλή υποστήριξη ",
|
||||
"MESSAGE": "Μπορείτε να συνομιλείτε με τους πελάτες σας από το νέο κανάλι. Καλή υποστήριξη",
|
||||
"BUTTON_TEXT": "Μετάβαση",
|
||||
"MORE_SETTINGS": "Περισσότερες ρυθμίσεις",
|
||||
"WEBSITE_SUCCESS": "Επιτυχής δημιουργία του καναλιού ιστοσελίδας. Αντιγράψτε τον κώδικα που παρουσιάζεται παρακάτω, και τοποθετήστε τον στην ιστοσελίδα σας. Την επόμενη φορά που κάποιος πελάτης χρησιμοποιήσει το 'live chat', η συνομιλία θα εμφανιστεί στο κιβώτιο εισερχομένων σας."
|
||||
|
@ -414,7 +416,7 @@
|
|||
"CAMPAIGN": "Καμπάνιες",
|
||||
"PRE_CHAT_FORM": "Φόρμα Προ-Συνομιλίας",
|
||||
"BUSINESS_HOURS": "Ώρες Εργασίας",
|
||||
"WIDGET_BUILDER": "Widget Builder"
|
||||
"WIDGET_BUILDER": "Δημιουργός Widget"
|
||||
},
|
||||
"SETTINGS": "Ρυθμίσεις",
|
||||
"FEATURES": {
|
||||
|
@ -579,10 +581,10 @@
|
|||
"WIDGET_BUILDER": {
|
||||
"WIDGET_OPTIONS": {
|
||||
"AVATAR": {
|
||||
"LABEL": "Website Avatar",
|
||||
"LABEL": "Avatar Ιστοσελίδας",
|
||||
"DELETE": {
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "Avatar deleted successfully",
|
||||
"SUCCESS_MESSAGE": "Το Avatar διαγράφηκε επιτυχώς",
|
||||
"ERROR_MESSAGE": "Υπήρξε ένα σφάλμα, παρακαλώ προσπαθήστε ξανά"
|
||||
}
|
||||
}
|
||||
|
@ -590,7 +592,7 @@
|
|||
"WEBSITE_NAME": {
|
||||
"LABEL": "Όνομα Ιστοσελίδας",
|
||||
"PLACE_HOLDER": "Συμπληρώστε την ονομασία της ιστοσελίδας σας (π.χ: Ελληνικό Μεσογειακό Πανεπιστήμιο)",
|
||||
"ERROR": "Please enter a valid website name"
|
||||
"ERROR": "Παρακαλώ δώστε ένα έγκυρο όνομα ιστοσελίδας"
|
||||
},
|
||||
"WELCOME_HEADING": {
|
||||
"LABEL": "Καλώς ήλθατε (Heading)",
|
||||
|
@ -601,42 +603,42 @@
|
|||
"PLACE_HOLDER": "Είναι απλό να συνδεθείτε μαζί μας. Ζητήστε μας οτιδήποτε, ή μοιραστείτε την εμπειρία σας."
|
||||
},
|
||||
"REPLY_TIME": {
|
||||
"LABEL": "Reply Time",
|
||||
"LABEL": "Χρόνος Απάντησης",
|
||||
"IN_A_FEW_MINUTES": "Σε μερικά λεπτά",
|
||||
"IN_A_FEW_HOURS": "Σε μερικές ώρες",
|
||||
"IN_A_DAY": "Σε μία ημέρα"
|
||||
},
|
||||
"WIDGET_COLOR_LABEL": "Χρώμα Widget",
|
||||
"WIDGET_BUBBLE_POSITION_LABEL": "Widget Bubble Position",
|
||||
"WIDGET_BUBBLE_TYPE_LABEL": "Widget Bubble Type",
|
||||
"WIDGET_BUBBLE_POSITION_LABEL": "Θέση Φυσαλίδας Widget",
|
||||
"WIDGET_BUBBLE_TYPE_LABEL": "Τύπος Φυσαλίδας Widget",
|
||||
"WIDGET_BUBBLE_LAUNCHER_TITLE": {
|
||||
"DEFAULT": "Συνομιλήστε μαζί μας",
|
||||
"LABEL": "Widget Bubble Launcher Title",
|
||||
"LABEL": "Τίτλος Εκκίνησης Φυσαλίδας Widget",
|
||||
"PLACE_HOLDER": "Συνομιλήστε μαζί μας"
|
||||
},
|
||||
"UPDATE": {
|
||||
"BUTTON_TEXT": "Update Widget Settings",
|
||||
"BUTTON_TEXT": "Ενημέρωση Ρυθμίσεων Widget",
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "Widget settings updated successfully",
|
||||
"ERROR_MESSAGE": "Unable to update widget settings"
|
||||
"SUCCESS_MESSAGE": "Οι ρυθμίσεις widget ενημερώθηκαν με επιτυχία",
|
||||
"ERROR_MESSAGE": "Δεν είναι δυνατή η ενημέρωση ρυθμίσεων widget"
|
||||
}
|
||||
},
|
||||
"WIDGET_VIEW_OPTION": {
|
||||
"PREVIEW": "Preview",
|
||||
"PREVIEW": "Προεπισκόπηση",
|
||||
"SCRIPT": "Script"
|
||||
},
|
||||
"WIDGET_BUBBLE_POSITION": {
|
||||
"LEFT": "Left",
|
||||
"RIGHT": "Right"
|
||||
"LEFT": "Αριστερά",
|
||||
"RIGHT": "Δεξιά"
|
||||
},
|
||||
"WIDGET_BUBBLE_TYPE": {
|
||||
"STANDARD": "Standard",
|
||||
"EXPANDED_BUBBLE": "Expanded Bubble"
|
||||
"EXPANDED_BUBBLE": "Εκτεταμένη Φυσαλίδα"
|
||||
}
|
||||
},
|
||||
"WIDGET_SCREEN": {
|
||||
"DEFAULT": "Default",
|
||||
"CHAT": "Chat"
|
||||
"DEFAULT": "Προεπιλογή",
|
||||
"CHAT": "Συνομιλία"
|
||||
},
|
||||
"REPLY_TIME": {
|
||||
"IN_A_FEW_MINUTES": "Τυπικά έχετε απάντηση σε μερικά λεπτά",
|
||||
|
@ -649,11 +651,11 @@
|
|||
},
|
||||
"BODY": {
|
||||
"TEAM_AVAILABILITY": {
|
||||
"ONLINE": "We are Online",
|
||||
"ONLINE": "Είμαστε online",
|
||||
"OFFLINE": "Προς το παρόν, είμαστε εκτός"
|
||||
},
|
||||
"USER_MESSAGE": "Hi",
|
||||
"AGENT_MESSAGE": "Hello"
|
||||
"USER_MESSAGE": "Γειά",
|
||||
"AGENT_MESSAGE": "Γειά σας"
|
||||
},
|
||||
"BRANDING_TEXT": "με την δύναμη του Chatwoot",
|
||||
"SCRIPT_SETTINGS": "\n window.chatwootSettings = {options};"
|
||||
|
|
|
@ -86,49 +86,49 @@
|
|||
"BUTTON_TEXT": "Σύνδεση"
|
||||
},
|
||||
"DASHBOARD_APPS": {
|
||||
"TITLE": "Dashboard Apps",
|
||||
"HEADER_BTN_TXT": "Add a new dashboard app",
|
||||
"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>",
|
||||
"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.",
|
||||
"TITLE": "Εφαρμογές Dashboard",
|
||||
"HEADER_BTN_TXT": "Προσθήκη νέας εφαρμογής Dashboard",
|
||||
"SIDEBAR_TXT": "<p><b>Εφαρμογές Dashboard</b></p><p>Οι εφαρμογές Dashboard επιτρέπουν σε οργανισμούς να ενσωματώσουν μια εφαρμογή μέσα στο ταμπλό Chatwoot για να παρέχουν το πλαίσιο για τους πράκτορες υποστήριξης πελατών. Αυτό το χαρακτηριστικό σας επιτρέπει να δημιουργήσετε μια εφαρμογή ανεξάρτητα και ενσωματωμένη που μέσα στον πίνακα ελέγχου για να παρέχει πληροφορίες χρήστη, τις παραγγελίες τους, ή το ιστορικό προηγούμενων πληρωμών τους.</p><p>Όταν ενσωματώσετε την εφαρμογή σας χρησιμοποιώντας το Dashboard στο Chatwoot, η εφαρμογή σας θα πάρει το πλαίσιο της συνομιλίας και θα επικοινωνήσει ως ένα παράθυρο εκδήλωσης. Εφαρμόστε έναν ακροατή για το γεγονός του μηνύματος στη σελίδα σας για να λάβετε το πλαίσιο.</p><p>Για να προσθέσετε μια νέα εφαρμογή ταμπλό, κάντε κλικ στο κουμπί 'Προσθήκη μιας νέας εφαρμογής Dashboard'.</p>",
|
||||
"DESCRIPTION": "Οι εφαρμογές Dashboard επιτρέπουν στους οργανισμούς να ενσωματώσουν μια εφαρμογή μέσα στον πίνακα ελέγχου για να παρέχουν το περιεχόμενο για τους πράκτορες υποστήριξης πελατών. Αυτή η λειτουργία σας επιτρέπει να δημιουργήσετε μια εφαρμογή ανεξάρτητα και ενσωματωμένη που θα παρέχει πληροφορίες χρήστη, τις παραγγελίες τους, ή το ιστορικό προηγούμενων πληρωμών τους.",
|
||||
"LIST": {
|
||||
"404": "There are no dashboard apps configured on this account yet",
|
||||
"LOADING": "Fetching dashboard apps...",
|
||||
"404": "Δεν έχουν δημιουργηθεί εφαρμογές Dashboard για αυτόν το λογαριασμό",
|
||||
"LOADING": "Λήψη εφαρμογών dashboard ...",
|
||||
"TABLE_HEADER": [
|
||||
"Όνομα",
|
||||
"Endpoint"
|
||||
],
|
||||
"EDIT_TOOLTIP": "Edit app",
|
||||
"DELETE_TOOLTIP": "Delete app"
|
||||
"EDIT_TOOLTIP": "Επεξεργασία εφαρμογής",
|
||||
"DELETE_TOOLTIP": "Διαγραφή εφαρμογής"
|
||||
},
|
||||
"FORM": {
|
||||
"TITLE_LABEL": "Όνομα",
|
||||
"TITLE_PLACEHOLDER": "Enter a name for your dashboard app",
|
||||
"TITLE_ERROR": "A name for the dashboard app is required",
|
||||
"TITLE_PLACEHOLDER": "Εισάγετε όνομα για την εφαρμογή dashboard",
|
||||
"TITLE_ERROR": "Απαιτείται ένα όνομα για την εφαρμογή dashboard",
|
||||
"URL_LABEL": "Endpoint",
|
||||
"URL_PLACEHOLDER": "Enter the endpoint URL where your app is hosted",
|
||||
"URL_ERROR": "A valid URL is required"
|
||||
"URL_PLACEHOLDER": "Εισάγετε το URL του endpoint όπου φιλοξενείται η εφαρμογή σας",
|
||||
"URL_ERROR": "Απαιτείται ένα έγκυρο URL"
|
||||
},
|
||||
"CREATE": {
|
||||
"HEADER": "Add a new dashboard app",
|
||||
"HEADER": "Προσθήκη νέας εφαρμογής Dashboard",
|
||||
"FORM_SUBMIT": "Καταχώρηση",
|
||||
"FORM_CANCEL": "Άκυρο",
|
||||
"API_SUCCESS": "Dashboard app configured successfully",
|
||||
"API_ERROR": "We couldn't create an app. Please try again later"
|
||||
"API_SUCCESS": "Η εφαρμογή dashboard ρυθμίστηκε επιτυχώς",
|
||||
"API_ERROR": "Δεν μπορούμε να δημιουργήσουμε μια εφαρμογή. Παρακαλώ δοκιμάστε ξανά αργότερα"
|
||||
},
|
||||
"UPDATE": {
|
||||
"HEADER": "Edit dashboard app",
|
||||
"HEADER": "Επεξεργασία εφαρμογής dashboard",
|
||||
"FORM_SUBMIT": "Ενημέρωση",
|
||||
"FORM_CANCEL": "Άκυρο",
|
||||
"API_SUCCESS": "Dashboard app updated successfully",
|
||||
"API_ERROR": "We couldn't update the app. Please try again later"
|
||||
"API_SUCCESS": "Η εφαρμογή dashboard ενημερώθηκε με επιτυχία",
|
||||
"API_ERROR": "Δεν ήταν δυνατή η ενημέρωση της εφαρμογής. Παρακαλώ δοκιμάστε ξανά αργότερα"
|
||||
},
|
||||
"DELETE": {
|
||||
"CONFIRM_YES": "Yes, delete it",
|
||||
"CONFIRM_NO": "No, keep it",
|
||||
"CONFIRM_YES": "Ναι, Διέγραψε την",
|
||||
"CONFIRM_NO": "Όχι, Κράτησε την",
|
||||
"TITLE": "Επιβεβαίωση Διαγραφής",
|
||||
"MESSAGE": "Are you sure to delete the app - %{appName}?",
|
||||
"API_SUCCESS": "Dashboard app deleted successfully",
|
||||
"API_ERROR": "We couldn't delete the app. Please try again later"
|
||||
"MESSAGE": "Είστε βέβαιοι να διαγράψετε την εφαρμογή - %{appName};",
|
||||
"API_SUCCESS": "Η εφαρμογή dashboard διαγράφηκε επιτυχώς",
|
||||
"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) σας."
|
||||
},
|
||||
"SEND_MESSAGE": {
|
||||
"TITLE": "Hotkey to send messages",
|
||||
"NOTE": "You can select a hotkey (either Enter or Cmd/Ctrl+Enter) based on your preference of writing.",
|
||||
"UPDATE_SUCCESS": "Your settings have been updated successfully",
|
||||
"TITLE": "Πλήκτρο συντόμευσης για αποστολή μηνυμάτων",
|
||||
"NOTE": "Μπορείτε να επιλέξετε μια συντόμευση (είτε εισάγετε είτε Cmd/Ctrl+Enter) με βάση την προτίμηση για το γράψιμο.",
|
||||
"UPDATE_SUCCESS": "Οι ρυθμίσεις σας έχουν ενημερωθεί με επιτυχία",
|
||||
"CARD": {
|
||||
"ENTER_KEY": {
|
||||
"HEADING": "Enter (↵)",
|
||||
"CONTENT": "Send messages by pressing Enter key instead of clicking the send button."
|
||||
"CONTENT": "Αποστολή μηνυμάτων πατώντας το πλήκτρο Enter αντί να πατήσετε το κουμπί αποστολής."
|
||||
},
|
||||
"CMD_ENTER_KEY": {
|
||||
"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": "Αγόρασε τώρα",
|
||||
"DELETED_USER": "Διαγραμμένος Χρήστης",
|
||||
"ACCOUNT_SUSPENDED": {
|
||||
"TITLE": "Account Suspended",
|
||||
"MESSAGE": "Your account is suspended. Please reach out to the support team for more information."
|
||||
"TITLE": "Αναστολή Λογαριασμού",
|
||||
"MESSAGE": "Ο λογαριασμός σας έχει ανασταλεί. Επικοινωνήστε με την ομάδα υποστήριξης για περισσότερες πληροφορίες."
|
||||
}
|
||||
},
|
||||
"COMPONENTS": {
|
||||
|
@ -179,6 +179,7 @@
|
|||
"CONTACTS": "Επαφές",
|
||||
"HOME": "Αρχική",
|
||||
"AGENTS": "Πράκτορες",
|
||||
"AGENT_BOTS": "Bots",
|
||||
"INBOXES": "Κιβώτια Εισερχομένων",
|
||||
"NOTIFICATIONS": "Ειδοποιήσεις",
|
||||
"CANNED_RESPONSES": "Έτοιμες Απαντήσεις",
|
||||
|
@ -189,8 +190,9 @@
|
|||
"LABELS": "Ετικέτες",
|
||||
"CUSTOM_ATTRIBUTES": "Προσαρμοζόμενες Ιδιότητες",
|
||||
"AUTOMATION": "Αυτοματισμός",
|
||||
"MACROS": "Μακροεντολές",
|
||||
"TEAMS": "Ομάδες",
|
||||
"BILLING": "Billing",
|
||||
"BILLING": "Χρεώσεις",
|
||||
"CUSTOM_VIEWS_FOLDER": "Φάκελοι",
|
||||
"CUSTOM_VIEWS_SEGMENTS": "Τμήματα",
|
||||
"ALL_CONTACTS": "Όλες Οι Επαφές",
|
||||
|
@ -212,33 +214,33 @@
|
|||
"REPORTS_OVERVIEW": "Επισκόπηση",
|
||||
"FACEBOOK_REAUTHORIZE": "Η σύνδεση Facebook έχει λήξει, παρακαλώ ξανασυνδεθείτε στο Facebook για να συνεχίσετε",
|
||||
"HELP_CENTER": {
|
||||
"TITLE": "Help Center (Beta)",
|
||||
"ALL_ARTICLES": "All Articles",
|
||||
"MY_ARTICLES": "My Articles",
|
||||
"DRAFT": "Draft",
|
||||
"ARCHIVED": "Archived",
|
||||
"TITLE": "Κέντρο Βοήθειας (Beta)",
|
||||
"ALL_ARTICLES": "Όλα Τα Άρθρα",
|
||||
"MY_ARTICLES": "Τα Άρθρα Μου",
|
||||
"DRAFT": "Πρόχειρο",
|
||||
"ARCHIVED": "Αρχειοθετημένο",
|
||||
"CATEGORY": "Κατηγορία",
|
||||
"CATEGORY_EMPTY_MESSAGE": "No categories found"
|
||||
"CATEGORY_EMPTY_MESSAGE": "Δεν βρέθηκαν κατηγορίες"
|
||||
},
|
||||
"DOCS": "Read docs"
|
||||
"DOCS": "Ανάγνωση εγγράφων"
|
||||
},
|
||||
"BILLING_SETTINGS": {
|
||||
"TITLE": "Billing",
|
||||
"TITLE": "Χρεώσεις",
|
||||
"CURRENT_PLAN": {
|
||||
"TITLE": "Current Plan",
|
||||
"PLAN_NOTE": "You are currently subscribed to the **%{plan}** plan with **%{quantity}** licenses"
|
||||
"TITLE": "Τρέχον Πλάνο",
|
||||
"PLAN_NOTE": "Αυτή τη στιγμή έχετε εγγραφεί στο πλάνο **%{plan}** με **%{quantity}** άδειες"
|
||||
},
|
||||
"MANAGE_SUBSCRIPTION": {
|
||||
"TITLE": "Manage your subscription",
|
||||
"DESCRIPTION": "View your previous invoices, edit your billing details, or cancel your subscription.",
|
||||
"BUTTON_TXT": "Go to the billing portal"
|
||||
"TITLE": "Διαχειριστείτε τη συνδρομή σας",
|
||||
"DESCRIPTION": "Δείτε τα προηγούμενα τιμολόγια σας, επεξεργαστείτε τα στοιχεία χρέωσης ή ακυρώστε τη συνδρομή σας.",
|
||||
"BUTTON_TXT": "Μετάβαση στην πύλη χρέωσης"
|
||||
},
|
||||
"CHAT_WITH_US": {
|
||||
"TITLE": "Need help?",
|
||||
"DESCRIPTION": "Do you face any issues in billing? We are here to help.",
|
||||
"TITLE": "Χρειάζεστε βοήθεια;",
|
||||
"DESCRIPTION": "Αντιμετωπίζετε οποιαδήποτε προβλήματα στην τιμολόγηση? Είμαστε εδώ για να βοηθήσουμε.",
|
||||
"BUTTON_TXT": "Συνομιλήστε μαζί μας"
|
||||
},
|
||||
"NO_BILLING_USER": "Your billing account is being configured. Please refresh the page and try again."
|
||||
"NO_BILLING_USER": "Ο λογαριασμός χρέωσης έχει ρυθμιστεί. Παρακαλώ ανανεώστε τη σελίδα και προσπαθήστε ξανά."
|
||||
},
|
||||
"CREATE_ACCOUNT": {
|
||||
"NO_ACCOUNT_WARNING": "Ωχ! Δεν μπορέσαμε να βρούμε κανένα λογαριασμό Chatwoot. Παρακαλούμε δημιουργήστε ένα νέο λογαριασμό για να συνεχίσετε.",
|
||||
|
|
|
@ -1,5 +1,73 @@
|
|||
{
|
||||
"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",
|
||||
"AGENT_SELECT_LABEL": "Seleccionar agente",
|
||||
"ASSIGN_CONFIRMATION_LABEL": "¿Está seguro que desea asignar %{conversationCount} %{conversationLabel} a",
|
||||
"UNASSIGN_CONFIRMATION_LABEL": "¿Está seguro de desasignar %{conversationCount} %{conversationLabel}?",
|
||||
"GO_BACK_LABEL": "Volver",
|
||||
"ASSIGN_LABEL": "Asignar",
|
||||
"YES": "Si",
|
||||
"ASSIGN_AGENT_TOOLTIP": "Asignar agente",
|
||||
"ASSIGN_SUCCESFUL": "Conversaciones asignadas con éxito",
|
||||
"ASSIGN_FAILED": "Error al asignar conversaciones, inténtelo de nuevo",
|
||||
|
|
|
@ -59,19 +59,19 @@
|
|||
}
|
||||
},
|
||||
"BUTTONS": {
|
||||
"ARCHIVE": "Archive article",
|
||||
"DELETE": "Delete article"
|
||||
"ARCHIVE": "Archivar artículo",
|
||||
"DELETE": "Eliminar artículo"
|
||||
}
|
||||
},
|
||||
"PORTAL": {
|
||||
"HEADER": "Portals",
|
||||
"DEFAULT": "Default",
|
||||
"NEW_BUTTON": "New Portal",
|
||||
"HEADER": "Portales",
|
||||
"DEFAULT": "Predeterminado",
|
||||
"NEW_BUTTON": "Nuevo Portal",
|
||||
"ACTIVE_BADGE": "activo",
|
||||
"CHOOSE_LOCALE_LABEL": "Choose a locale",
|
||||
"LOADING_MESSAGE": "Loading portals...",
|
||||
"ARTICLES_LABEL": "articles",
|
||||
"NO_PORTALS_MESSAGE": "There are no available portals",
|
||||
"CHOOSE_LOCALE_LABEL": "Elige un idioma",
|
||||
"LOADING_MESSAGE": "Cargando portales...",
|
||||
"ARTICLES_LABEL": "artículos",
|
||||
"NO_PORTALS_MESSAGE": "No hay portales disponibles",
|
||||
"ADD_NEW_LOCALE": "Add a new locale",
|
||||
"POPOVER": {
|
||||
"TITLE": "Portals",
|
||||
|
@ -83,7 +83,7 @@
|
|||
"PORTAL_SETTINGS": {
|
||||
"LIST_ITEM": {
|
||||
"HEADER": {
|
||||
"COUNT_LABEL": "articles",
|
||||
"COUNT_LABEL": "artículos",
|
||||
"ADD": "Add locale",
|
||||
"VISIT": "Visit site",
|
||||
"SETTINGS": "Ajustes",
|
||||
|
@ -255,7 +255,7 @@
|
|||
"PORTAL": "Portal",
|
||||
"LOCALE": {
|
||||
"LABEL": "Locale",
|
||||
"PLACEHOLDER": "Choose a locale",
|
||||
"PLACEHOLDER": "Elige un idioma",
|
||||
"ERROR": "Locale is required"
|
||||
},
|
||||
"BUTTONS": {
|
||||
|
|
|
@ -239,7 +239,9 @@
|
|||
},
|
||||
"API_CALLBACK": {
|
||||
"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",
|
||||
"API": {
|
||||
|
@ -357,7 +359,7 @@
|
|||
},
|
||||
"FINISH": {
|
||||
"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í",
|
||||
"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."
|
||||
|
|
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",
|
||||
"HOME": "Inicio",
|
||||
"AGENTS": "Agentes",
|
||||
"AGENT_BOTS": "Bots",
|
||||
"INBOXES": "Entradas",
|
||||
"NOTIFICATIONS": "Notificaciones",
|
||||
"CANNED_RESPONSES": "Respuestas predefinidas",
|
||||
|
@ -189,6 +190,7 @@
|
|||
"LABELS": "Etiquetas",
|
||||
"CUSTOM_ATTRIBUTES": "Atributos personalizados",
|
||||
"AUTOMATION": "Automatización",
|
||||
"MACROS": "Macros",
|
||||
"TEAMS": "Equipos",
|
||||
"BILLING": "Facturación",
|
||||
"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": {
|
||||
"CONVERSATIONS_SELECTED": "%{conversationCount} گفتگو انتخاب شده است",
|
||||
"AGENT_SELECT_LABEL": "انتخاب ایجنت",
|
||||
"ASSIGN_CONFIRMATION_LABEL": "آیا مطمئن هستید که میخواهید %{conversationCount} %{conversationLabel} را به آن اختصاص دهید؟",
|
||||
"ASSIGN_CONFIRMATION_LABEL": "آیا مطمئن هستید که به %{conversationCount} %{conversationLabel} اختصاص میدهید",
|
||||
"UNASSIGN_CONFIRMATION_LABEL": "آیا مطمئنید که %{conversationCount} %{conversationLabel} را میخواهید اختصاص را لغو کنید؟",
|
||||
"GO_BACK_LABEL": "بازگشت",
|
||||
"ASSIGN_LABEL": "اختصاص دادن",
|
||||
"YES": "بله",
|
||||
"ASSIGN_AGENT_TOOLTIP": "تعیین ایجنت",
|
||||
"ASSIGN_SUCCESFUL": "گفتگو با موفقیت اختصاص داده شده",
|
||||
"ASSIGN_FAILED": "گفتگو اختصاص داده نشد، لطفا دوباره امتحان کنید",
|
||||
|
|
|
@ -239,7 +239,9 @@
|
|||
},
|
||||
"API_CALLBACK": {
|
||||
"TITLE": "آدرس URL مربوط به API",
|
||||
"SUBTITLE": "شما باید URL webhook را در پورتال توسعه دهنده فیس بوک با URL ذکر شده در اینجا پیکربندی کنید."
|
||||
"SUBTITLE": "شما باید URL webhook و رمز تأیید را در پورتال توسعه دهنده فیس بوک با مقادیر نشان داده شده در زیر پیکربندی کنید.",
|
||||
"WEBHOOK_URL": "آدرس URL وب هوک",
|
||||
"WEBHOOK_VERIFICATION_TOKEN": "توکن تایید Webhook"
|
||||
},
|
||||
"SUBMIT_BUTTON": "ایجاد کانال واتساپ",
|
||||
"API": {
|
||||
|
@ -357,7 +359,7 @@
|
|||
},
|
||||
"FINISH": {
|
||||
"TITLE": "صندوق ورودی حاضره!",
|
||||
"MESSAGE": "حالا از طریق این کانال جدید میتوانید با مشتریان صحبت کنید. به امید موفقیت ",
|
||||
"MESSAGE": "حالا از طریق این کانال جدید میتوانید با مشتریان صحبت کنید. به امید موفقیت",
|
||||
"BUTTON_TEXT": "نشانم بده",
|
||||
"MORE_SETTINGS": "تنظیمات بیشتر",
|
||||
"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": "مخاطبین",
|
||||
"HOME": "صفحه اصلی",
|
||||
"AGENTS": "ایجنت ها",
|
||||
"AGENT_BOTS": "رباتها",
|
||||
"INBOXES": "صندوقهای ورودی",
|
||||
"NOTIFICATIONS": "اعلان ها",
|
||||
"CANNED_RESPONSES": "پاسخهای آماده",
|
||||
|
@ -189,6 +190,7 @@
|
|||
"LABELS": "برچسبها",
|
||||
"CUSTOM_ATTRIBUTES": "ویژگیهای سفارشی",
|
||||
"AUTOMATION": "خودکارسازی",
|
||||
"MACROS": "ماکروها",
|
||||
"TEAMS": "تیمها",
|
||||
"BILLING": "صورتحساب",
|
||||
"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": {
|
||||
"CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected",
|
||||
"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",
|
||||
"ASSIGN_LABEL": "Delegoi",
|
||||
"YES": "Yes",
|
||||
"ASSIGN_AGENT_TOOLTIP": "Assign Agent",
|
||||
"ASSIGN_SUCCESFUL": "Conversations assigned successfully",
|
||||
"ASSIGN_FAILED": "Failed to assign conversations, please try again",
|
||||
|
|
|
@ -239,7 +239,9 @@
|
|||
},
|
||||
"API_CALLBACK": {
|
||||
"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",
|
||||
"API": {
|
||||
|
@ -357,7 +359,7 @@
|
|||
},
|
||||
"FINISH": {
|
||||
"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",
|
||||
"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."
|
||||
|
|
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",
|
||||
"HOME": "Koti",
|
||||
"AGENTS": "Edustajat",
|
||||
"AGENT_BOTS": "Bots",
|
||||
"INBOXES": "Kansiot",
|
||||
"NOTIFICATIONS": "Ilmoitukset",
|
||||
"CANNED_RESPONSES": "Tallennetut vastaukset",
|
||||
|
@ -189,6 +190,7 @@
|
|||
"LABELS": "Tunnisteet",
|
||||
"CUSTOM_ATTRIBUTES": "Mukautetut attribuutit",
|
||||
"AUTOMATION": "Automation",
|
||||
"MACROS": "Macros",
|
||||
"TEAMS": "Teams",
|
||||
"BILLING": "Billing",
|
||||
"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