Merge branch 'release/1.9.0' into master

This commit is contained in:
Sojan 2020-10-20 12:32:57 +05:30
commit cf7271ecfb
342 changed files with 6224 additions and 2899 deletions

View file

@ -22,6 +22,11 @@ REDIS_URL=redis://redis:6379
# which will be the password for the redis service running inside the docker-compose
# to make it secure
REDIS_PASSWORD=
# Redis Sentinel can be used by passing list of sentinel host and ports e,g. sentinel_host1:port1,sentinel_host2:port2
REDIS_SENTINELS=
# Redis sentinel master name is required when using sentinel, default value is "mymaster".
# You can find list of master using "SENTINEL masters" command
REDIS_SENTINEL_MASTER_NAME=
# Postgres Database config variables
POSTGRES_HOST=postgres

View file

@ -26,6 +26,14 @@ A clear and concise description of what you expected to happen.
If applicable, add screenshots to help explain your problem.
**Browser logs**
Share the browser logs to debug the issue further
**Server logs**
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)

2
.gitignore vendored
View file

@ -23,7 +23,7 @@
*.log
# Ignore application configuration
node_modules
master.key
*.rdb
# Ignore env files

View file

@ -18,56 +18,56 @@ GEM
specs:
action-cable-testing (0.6.1)
actioncable (>= 5.0)
actioncable (6.0.3.3)
actionpack (= 6.0.3.3)
actioncable (6.0.3.4)
actionpack (= 6.0.3.4)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
actionmailbox (6.0.3.3)
actionpack (= 6.0.3.3)
activejob (= 6.0.3.3)
activerecord (= 6.0.3.3)
activestorage (= 6.0.3.3)
activesupport (= 6.0.3.3)
actionmailbox (6.0.3.4)
actionpack (= 6.0.3.4)
activejob (= 6.0.3.4)
activerecord (= 6.0.3.4)
activestorage (= 6.0.3.4)
activesupport (= 6.0.3.4)
mail (>= 2.7.1)
actionmailer (6.0.3.3)
actionpack (= 6.0.3.3)
actionview (= 6.0.3.3)
activejob (= 6.0.3.3)
actionmailer (6.0.3.4)
actionpack (= 6.0.3.4)
actionview (= 6.0.3.4)
activejob (= 6.0.3.4)
mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 2.0)
actionpack (6.0.3.3)
actionview (= 6.0.3.3)
activesupport (= 6.0.3.3)
actionpack (6.0.3.4)
actionview (= 6.0.3.4)
activesupport (= 6.0.3.4)
rack (~> 2.0, >= 2.0.8)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.2.0)
actiontext (6.0.3.3)
actionpack (= 6.0.3.3)
activerecord (= 6.0.3.3)
activestorage (= 6.0.3.3)
activesupport (= 6.0.3.3)
actiontext (6.0.3.4)
actionpack (= 6.0.3.4)
activerecord (= 6.0.3.4)
activestorage (= 6.0.3.4)
activesupport (= 6.0.3.4)
nokogiri (>= 1.8.5)
actionview (6.0.3.3)
activesupport (= 6.0.3.3)
actionview (6.0.3.4)
activesupport (= 6.0.3.4)
builder (~> 3.1)
erubi (~> 1.4)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.1, >= 1.2.0)
activejob (6.0.3.3)
activesupport (= 6.0.3.3)
activejob (6.0.3.4)
activesupport (= 6.0.3.4)
globalid (>= 0.3.6)
activemodel (6.0.3.3)
activesupport (= 6.0.3.3)
activerecord (6.0.3.3)
activemodel (= 6.0.3.3)
activesupport (= 6.0.3.3)
activestorage (6.0.3.3)
actionpack (= 6.0.3.3)
activejob (= 6.0.3.3)
activerecord (= 6.0.3.3)
activemodel (6.0.3.4)
activesupport (= 6.0.3.4)
activerecord (6.0.3.4)
activemodel (= 6.0.3.4)
activesupport (= 6.0.3.4)
activestorage (6.0.3.4)
actionpack (= 6.0.3.4)
activejob (= 6.0.3.4)
activerecord (= 6.0.3.4)
marcel (~> 0.3.1)
activesupport (6.0.3.3)
activesupport (6.0.3.4)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 0.7, < 2)
minitest (~> 5.1)
@ -307,7 +307,7 @@ GEM
multi_xml (0.6.0)
multipart-post (2.1.1)
netrc (0.11.0)
nio4r (2.5.3)
nio4r (2.5.4)
nokogiri (1.10.10)
mini_portile2 (~> 2.4.0)
oauth (0.5.4)
@ -336,29 +336,29 @@ GEM
rack
rack-test (1.1.0)
rack (>= 1.0, < 3)
rails (6.0.3.3)
actioncable (= 6.0.3.3)
actionmailbox (= 6.0.3.3)
actionmailer (= 6.0.3.3)
actionpack (= 6.0.3.3)
actiontext (= 6.0.3.3)
actionview (= 6.0.3.3)
activejob (= 6.0.3.3)
activemodel (= 6.0.3.3)
activerecord (= 6.0.3.3)
activestorage (= 6.0.3.3)
activesupport (= 6.0.3.3)
rails (6.0.3.4)
actioncable (= 6.0.3.4)
actionmailbox (= 6.0.3.4)
actionmailer (= 6.0.3.4)
actionpack (= 6.0.3.4)
actiontext (= 6.0.3.4)
actionview (= 6.0.3.4)
activejob (= 6.0.3.4)
activemodel (= 6.0.3.4)
activerecord (= 6.0.3.4)
activestorage (= 6.0.3.4)
activesupport (= 6.0.3.4)
bundler (>= 1.3.0)
railties (= 6.0.3.3)
railties (= 6.0.3.4)
sprockets-rails (>= 2.0.0)
rails-dom-testing (2.0.3)
activesupport (>= 4.2.0)
nokogiri (>= 1.6)
rails-html-sanitizer (1.3.0)
loofah (~> 2.3)
railties (6.0.3.3)
actionpack (= 6.0.3.3)
activesupport (= 6.0.3.3)
railties (6.0.3.4)
actionpack (= 6.0.3.4)
activesupport (= 6.0.3.4)
method_source
rake (>= 0.8.7)
thor (>= 0.20.3, < 2.0)
@ -481,7 +481,7 @@ GEM
sprockets (3.7.2)
concurrent-ruby (~> 1.0)
rack (> 1, < 3)
sprockets-rails (3.2.1)
sprockets-rails (3.2.2)
actionpack (>= 4.0)
activesupport (>= 4.0)
sprockets (>= 3.0.0)

View file

@ -50,8 +50,8 @@ class Messages::Facebook::MessageBuilder
def attach_file(attachment, file_url)
file_resource = LocalResource.new(file_url)
attachment.file.attach(io: file_resource.file, filename: file_resource.tmp_filename, content_type: file_resource.encoding)
rescue Errno::ETIMEDOUT, Errno::ECONNREFUSED, SocketError => e
attachment.file.attach(io: file_resource.file, filename: file_resource.filename, content_type: file_resource.encoding)
rescue *ExceptionList::URI_EXCEPTIONS => e
Rails.logger.info "invalid url #{file_url} : #{e.message}"
end

View file

@ -15,7 +15,6 @@ class Api::V1::Accounts::BaseController < Api::BaseController
elsif @resource&.is_a?(AgentBot)
account_accessible_for_bot?(account)
end
switch_locale account
account
end

View file

@ -30,7 +30,7 @@ class Api::V1::Accounts::CallbacksController < Api::V1::Accounts::BaseController
if (page_detail = (page_details || []).detect { |page| fb_page_id == page['id'] })
update_fb_page(fb_page_id, page_detail['access_token'])
return head :ok
render and return
end
end
@ -44,9 +44,9 @@ class Api::V1::Accounts::CallbacksController < Api::V1::Accounts::BaseController
end
def update_fb_page(fb_page_id, access_token)
get_fb_page(fb_page_id)&.update!(
user_access_token: @user_access_token, page_access_token: access_token
)
fb_page = get_fb_page(fb_page_id)
fb_page&.update!(user_access_token: @user_access_token, page_access_token: access_token)
fb_page&.reauthorized!
end
def get_fb_page(fb_page_id)
@ -81,7 +81,7 @@ class Api::V1::Accounts::CallbacksController < Api::V1::Accounts::BaseController
avatar_resource = LocalResource.new(uri)
facebook_inbox.avatar.attach(io: avatar_resource.file, filename: avatar_resource.tmp_filename, content_type: avatar_resource.encoding)
rescue Errno::ETIMEDOUT, Errno::ECONNREFUSED, SocketError => e
rescue *ExceptionList::URI_EXCEPTIONS => e
Rails.logger.info "invalid url #{file_url} : #{e.message}"
end

View file

@ -1,7 +1,7 @@
class Api::V1::Accounts::Contacts::ConversationsController < Api::V1::Accounts::BaseController
def index
@conversations = Current.account.conversations.includes(
:assignee, :contact, :inbox
:assignee, :contact, :inbox, :taggings
).where(inbox_id: inbox_ids, contact_id: permitted_params[:contact_id])
end

View file

@ -8,6 +8,12 @@ class Api::V1::Accounts::ContactsController < Api::V1::Accounts::BaseController
@contacts = Current.account.contacts
end
# returns online contacts
def active
@contacts = Current.account.contacts.where(id: ::OnlineStatusTracker
.get_available_contact_ids(Current.account.id))
end
def show; end
def create
@ -63,6 +69,6 @@ class Api::V1::Accounts::ContactsController < Api::V1::Accounts::BaseController
end
def fetch_contact
@contact = Current.account.contacts.find(params[:id])
@contact = Current.account.contacts.includes(contact_inboxes: [:inbox]).find(params[:id])
end
end

View file

@ -15,6 +15,12 @@ class Api::V1::Accounts::ConversationsController < Api::V1::Accounts::BaseContro
@conversations_count = result[:count]
end
def search
result = conversation_finder.perform
@conversations = result[:conversations]
@conversations_count = result[:count]
end
def create
@conversation = ::Conversation.create!(conversation_params)
end
@ -26,6 +32,11 @@ class Api::V1::Accounts::ConversationsController < Api::V1::Accounts::BaseContro
head :ok
end
def unmute
@conversation.unmute!
head :ok
end
def transcript
ConversationReplyMailer.conversation_transcript(@conversation, params[:email])&.deliver_later if params[:email].present?
head :ok

View file

@ -79,7 +79,7 @@ class Api::V1::Accounts::InboxesController < Api::V1::Accounts::BaseController
def permitted_params
params.permit(:id, :avatar, :name, :greeting_message, :greeting_enabled, channel:
[:type, :website_url, :widget_color, :welcome_title, :welcome_tagline, :webhook_url, :email])
[:type, :website_url, :widget_color, :welcome_title, :welcome_tagline, :webhook_url, :email, :reply_time])
end
def inbox_update_params
@ -91,6 +91,7 @@ class Api::V1::Accounts::InboxesController < Api::V1::Accounts::BaseController
:welcome_tagline,
:webhook_url,
:email,
:reply_time,
{ selected_feature_flags: [] }
])
end

View file

@ -0,0 +1,9 @@
class Api::V1::Accounts::Kbase::BaseController < Api::V1::Accounts::BaseController
before_action :portal
private
def portal
@portal ||= Current.account.kbase_portals.find_by(id: params[:portal_id])
end
end

View file

@ -0,0 +1,32 @@
class Api::V1::Accounts::Kbase::CategoriesController < Api::V1::Accounts::Kbase::BaseController
before_action :fetch_category, except: [:index, :create]
def index
@categories = @portal.categories
end
def create
@category = @portal.categories.create!(category_params)
end
def update
@category.update!(category_params)
end
def destroy
@category.destroy
head :ok
end
private
def fetch_category
@category = @portal.categories.find(params[:id])
end
def category_params
params.require(:category).permit(
:name, :description, :position
)
end
end

View file

@ -0,0 +1,32 @@
class Api::V1::Accounts::Kbase::PortalsController < Api::V1::Accounts::Kbase::BaseController
before_action :fetch_portal, except: [:index, :create]
def index
@portals = Current.account.kbase_portals
end
def create
@portal = Current.account.kbase_portals.create!(portal_params)
end
def update
@portal.update!(portal_params)
end
def destroy
@portal.destroy
head :ok
end
private
def fetch_portal
@portal = current_account.kbase_portals.find(params[:id])
end
def portal_params
params.require(:portal).permit(
:account_id, :color, :custom_domain, :header_text, :homepage_link, :name, :page_title, :slug
)
end
end

View file

@ -4,10 +4,12 @@ class Api::V1::Widget::BaseController < ApplicationController
private
def conversations
@conversations = @contact_inbox.conversations.where(inbox_id: auth_token_params[:inbox_id])
end
def conversation
@conversation ||= @contact_inbox.conversations.where(
inbox_id: auth_token_params[:inbox_id]
).last
@conversation ||= conversations.last
end
def auth_token_params
@ -20,8 +22,7 @@ class Api::V1::Widget::BaseController < ApplicationController
def set_web_widget
@web_widget = ::Channel::WebWidget.find_by!(website_token: permitted_params[:website_token])
@account = @web_widget.account
switch_locale @account
@current_account = @web_widget.account
end
def set_contact

View file

@ -1,20 +1,29 @@
class Api::V1::Widget::LabelsController < Api::V1::Widget::BaseController
def create
conversation.label_list.add(permitted_params[:label])
conversation.save!
if conversation.present? && label_defined_in_account?
conversation.label_list.add(permitted_params[:label])
conversation.save!
end
head :no_content
end
def destroy
conversation.label_list.remove(permitted_params[:id])
conversation.save!
if conversation.present?
conversation.label_list.remove(permitted_params[:id])
conversation.save!
end
head :no_content
end
private
def label_defined_in_account?
label = @current_account.labels&.find_by(title: permitted_params[:label])
label.present?
end
def permitted_params
params.permit(:id, :label, :website_token)
end

View file

@ -89,10 +89,10 @@ class Api::V1::Widget::MessagesController < Api::V1::Widget::BaseController
end
def update_contact(email)
contact_with_email = @account.contacts.find_by(email: email)
contact_with_email = @current_account.contacts.find_by(email: email)
if contact_with_email
@contact = ::ContactMergeAction.new(
account: @account,
account: @current_account,
base_contact: contact_with_email,
mergee_contact: @contact
).perform

View file

@ -5,6 +5,7 @@ class ApplicationController < ActionController::Base
protect_from_forgery with: :null_session
before_action :set_current_user, unless: :devise_controller?
around_action :switch_locale
around_action :handle_with_exception, unless: :devise_controller?
# after_action :verify_authorized
@ -64,15 +65,21 @@ class ApplicationController < ActionController::Base
end
def locale_from_account(account)
return unless account
I18n.available_locales.map(&:to_s).include?(account.locale) ? account.locale : nil
end
def switch_locale(account)
def switch_locale(&action)
# priority is for locale set in query string (mostly for widget/from js sdk)
locale ||= locale_from_params
# if local is not set in param, lets try account
locale ||= locale_from_account(account)
I18n.locale = locale || I18n.default_locale
locale ||= locale_from_account(@current_account)
# if nothing works we rely on default locale
locale ||= I18n.default_locale
# ensure locale won't bleed into other requests
# https://guides.rubyonrails.org/i18n.html#managing-the-locale-across-requests
I18n.with_locale(locale, &action)
end
def pundit_user

View file

@ -4,22 +4,34 @@ class DeviseOverrides::ConfirmationsController < Devise::ConfirmationsController
def create
@confirmable = User.find_by(confirmation_token: params[:confirmation_token])
if @confirmable
if @confirmable.confirm || (@confirmable.confirmed_at && @confirmable.reset_password_token)
# confirmed now or already confirmed but quit before setting a password
render json: { "message": 'Success', "redirect_url": create_reset_token_link(@confirmable) }, status: :ok
elsif @confirmable.confirmed_at
render json: { "message": 'Already confirmed', "redirect_url": '/' }, status: 422
else
render json: { "message": 'Failure', "redirect_url": '/' }, status: 422
end
if confirm
render_confirmation_success
else
render json: { "message": 'Invalid token', "redirect_url": '/' }, status: 422
render_confirmation_error
end
end
protected
def confirm
@confirmable&.confirm || (@confirmable&.confirmed_at && @confirmable&.reset_password_token)
end
def render_confirmation_success
render json: { "message": 'Success', "redirect_url": create_reset_token_link(@confirmable) }, status: :ok
end
def render_confirmation_error
if @confirmable.blank?
render json: { "message": 'Invalid token', "redirect_url": '/' }, status: 422
elsif @confirmable.confirmed_at
render json: { "message": 'Already confirmed', "redirect_url": '/' }, status: 422
else
render json: { "message": 'Failure', "redirect_url": '/' }, status: 422
end
end
def create_reset_token_link(user)
raw, enc = Devise.token_generator.generate(user.class, :reset_password_token)
user.reset_password_token = enc

View file

@ -27,6 +27,7 @@ class ConversationFinder
find_all_conversations
filter_by_status
filter_by_labels if params[:labels]
filter_by_query if params[:q]
mine_count, unassigned_count, all_count = set_count_for_all_conversations
@ -62,7 +63,7 @@ class ConversationFinder
def find_all_conversations
@conversations = current_account.conversations.includes(
:assignee, :inbox, contact: [:avatar_attachment]
:assignee, :inbox, :taggings, contact: [:avatar_attachment]
).where(inbox_id: @inbox_ids)
end
@ -76,6 +77,12 @@ class ConversationFinder
@conversations
end
def filter_by_query
@conversations = @conversations.joins(:messages).where('messages.content LIKE :search',
search: "%#{params[:q]}%").includes(:messages).where('messages.content LIKE :search',
search: "%#{params[:q]}%")
end
def filter_by_status
@conversations = @conversations.where(status: params[:status] || DEFAULT_STATUS)
end

View file

@ -11,7 +11,7 @@ class MessageFinder
private
def conversation_messages
@conversation.messages.includes(:attachments, user: { avatar_attachment: :blob })
@conversation.messages.includes(:attachments, :sender)
end
def messages

View file

@ -138,4 +138,10 @@ export default {
}
return axios.put(endPoints('profileUpdate').url, formData);
},
updateAvailability({ availability }) {
return axios.put(endPoints('profileUpdate').url, {
profile: { availability },
});
},
};

View file

@ -12,6 +12,13 @@ class FBChannel extends ApiClient {
params
);
}
reauthorizeFacebookPage({ omniauthToken, inboxId }) {
return axios.post(`${this.baseUrl()}/callbacks/reauthorize_page`, {
omniauth_token: omniauthToken,
inbox_id: inboxId,
});
}
}
export default new FBChannel();

View file

@ -43,6 +43,10 @@ class ConversationApi extends ApiClient {
return axios.post(`${this.url}/${conversationId}/mute`);
}
unmute(conversationId) {
return axios.post(`${this.url}/${conversationId}/unmute`);
}
meta({ inboxId, status, assigneeType, labels }) {
return axios.get(`${this.url}/meta`, {
params: {

View file

@ -14,7 +14,32 @@ describe('#ConversationAPI', () => {
expect(conversationAPI).toHaveProperty('markMessageRead');
expect(conversationAPI).toHaveProperty('toggleTyping');
expect(conversationAPI).toHaveProperty('mute');
expect(conversationAPI).toHaveProperty('unmute');
expect(conversationAPI).toHaveProperty('meta');
expect(conversationAPI).toHaveProperty('sendEmailTranscript');
});
describe('API calls', () => {
let originalAxios = null;
let axiosMock = null;
beforeEach(() => {
originalAxios = window.axios;
axiosMock = { post: jest.fn(() => Promise.resolve()) };
window.axios = axiosMock;
});
afterEach(() => {
window.axios = originalAxios;
});
it('#unmute', () => {
conversationAPI.unmute(45);
expect(axiosMock.post).toHaveBeenCalledWith(
'/api/v1/conversations/45/unmute'
);
});
});
});

View file

@ -1,3 +1,4 @@
.button {
font-family: $body-font-family;
font-weight: $font-weight-medium;

View file

@ -14,5 +14,4 @@
@import '~bourbon/core/bourbon';
@include foundation-everything($flex: true);
@import 'woot';

View file

@ -8,6 +8,7 @@
.integration--image {
display: flex;
height: 10rem;
margin-right: $space-normal;
width: 10rem;

View file

@ -28,3 +28,7 @@ input {
font-size: $font-size-small;
font-weight: $font-weight-medium;
}
.help-text {
font-weight: $font-weight-normal;
}

View file

@ -1,6 +1,6 @@
<template>
<div class="row settings--section">
<div class="medium-4 small-12">
<div class="medium-4 small-12 title--section">
<p class="sub-block-title">
{{ title }}
</p>
@ -35,7 +35,7 @@ export default {
.settings--section {
border-bottom: 1px solid $color-border;
display: flex;
padding: $space-normal 0;
padding: $space-normal $space-normal $space-normal 0;
.sub-block-title {
color: $color-woot;

View file

@ -0,0 +1,169 @@
<template>
<div class="status">
<div class="status-view">
<div
:class="
`status-view--badge status-view--badge__${currentUserAvailabilityStatus}`
"
/>
<div class="status-view--title">
{{ currentUserAvailabilityStatus }}
</div>
</div>
<div class="status-change">
<transition name="menu-slide">
<div
v-if="isStatusMenuOpened"
v-on-clickaway="closeStatusMenu"
class="dropdown-pane top"
>
<ul class="vertical dropdown menu">
<li v-for="status in availabilityStatuses" :key="status.value">
<button
class="button clear status-change--dropdown-button"
:disabled="status.disabled"
@click="changeAvailabilityStatus(status.value)"
>
{{ status.label }}
</button>
</li>
</ul>
</div>
</transition>
<button class="status-change--change-button" @click="openStatusMenu">
{{ $t('SIDEBAR_ITEMS.CHANGE_AVAILABILITY_STATUS') }}
</button>
</div>
</div>
</template>
<script>
import { mapGetters } from 'vuex';
import { mixin as clickaway } from 'vue-clickaway';
export default {
mixins: [clickaway],
data() {
return {
isStatusMenuOpened: false,
isUpdating: false,
};
},
computed: {
...mapGetters({
currentUser: 'getCurrentUser',
}),
currentUserAvailabilityStatus() {
return this.currentUser.availability_status;
},
availabilityStatuses() {
return this.$t('PROFILE_SETTINGS.FORM.AVAILABILITY.STATUSES_LIST').map(
status => ({
...status,
disabled: this.currentUserAvailabilityStatus === status.value,
})
);
},
},
methods: {
openStatusMenu() {
this.isStatusMenuOpened = true;
},
closeStatusMenu() {
this.isStatusMenuOpened = false;
},
changeAvailabilityStatus(availability) {
if (this.isUpdating) {
return;
}
this.isUpdating = true;
this.$store
.dispatch('updateAvailability', {
availability,
})
.finally(() => {
this.isUpdating = false;
});
},
},
};
</script>
<style lang="scss">
@import '~dashboard/assets/scss/variables';
.status {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
padding: $space-micro $space-smaller;
}
.status-view {
display: flex;
align-items: baseline;
& &--badge {
width: $space-one;
height: $space-one;
border-radius: 50%;
&__online {
background: $success-color;
}
&__offline {
background: $color-gray;
}
&__busy {
background: $warning-color;
}
}
& &--title {
color: $color-gray;
font-size: $font-size-small;
font-weight: $font-weight-medium;
margin-left: $space-small;
&:first-letter {
text-transform: capitalize;
}
}
}
.status-change {
.dropdown-pane {
top: -130px;
}
& &--change-button {
color: $color-gray;
font-size: $font-size-small;
border-bottom: 1px solid $color-gray;
cursor: pointer;
&:hover {
border-bottom: none;
}
}
& &--dropdown-button {
font-weight: $font-weight-normal;
font-size: $font-size-small;
padding: $space-small $space-one;
text-align: left;
width: 100%;
}
}
</style>

View file

@ -26,6 +26,10 @@
</transition-group>
</div>
<div class="bottom-nav">
<availability-status />
</div>
<div class="bottom-nav">
<transition name="menu-slide">
<div
@ -55,18 +59,18 @@
</ul>
</div>
</transition>
<div class="current-user" @click.prevent="showOptions()">
<thumbnail
:src="currentUser.avatar_url"
:username="currentUserAvailableName"
:status="currentUser.availability_status"
/>
<div class="current-user--data">
<h3 class="current-user--name">
{{ currentUserAvailableName }}
</h3>
<h5 class="current-user--role">
{{ currentRole }}
<h5 v-if="currentRole" class="current-user--role">
{{ $t(`AGENT_MGMT.AGENT_TYPES.${currentRole.toUpperCase()}`) }}
</h5>
</div>
<span class="current-user--options icon ion-android-more-vertical" />
@ -157,17 +161,18 @@ import { mixin as clickaway } from 'vue-clickaway';
import adminMixin from '../../mixins/isAdmin';
import Auth from '../../api/auth';
import SidebarItem from './SidebarItem';
import AvailabilityStatus from './AvailabilityStatus';
import { frontendURL } from '../../helper/URLHelper';
import Thumbnail from '../widgets/Thumbnail';
import { getSidebarItems } from '../../i18n/default-sidebar';
import { required, minLength } from 'vuelidate/lib/validators';
import alertMixin from 'shared/mixins/alertMixin';
// import accountMixin from '../../../../../mixins/account';
export default {
components: {
SidebarItem,
Thumbnail,
AvailabilityStatus,
},
mixins: [clickaway, adminMixin, alertMixin],
props: {
@ -203,8 +208,7 @@ export default {
accountLabels: 'labels/getLabelsOnSidebar',
}),
currentUserAvailableName() {
const { available_name: availableName } = this.currentUser;
return availableName;
return this.currentUser.name;
},
showChangeAccountOption() {
if (this.globalConfig.createNewAccountFromDashboard) {
@ -253,6 +257,7 @@ export default {
label: inbox.name,
toState: frontendURL(`accounts/${this.accountId}/inbox/${inbox.id}`),
type: inbox.channel_type,
phoneNumber: inbox.phone_number,
})),
};
},
@ -269,6 +274,7 @@ export default {
id: label.id,
label: label.title,
color: label.color,
truncateLabel: true,
toState: frontendURL(
`accounts/${this.accountId}/label/${label.title}`
),

View file

@ -30,7 +30,7 @@
tag="li"
:to="child.toState"
>
<a href="#">
<a href="#" :class="computedChildClass(child)">
<div class="wrap">
<i
v-if="computedInboxClass(child)"
@ -42,8 +42,12 @@
class="label-color--display"
:style="{ backgroundColor: child.color }"
/>
{{ child.label }}
<div
:title="computedChildTitle(child)"
:class="computedChildClass(child)"
>
{{ child.label }}
</div>
</div>
</a>
</router-link>
@ -52,14 +56,13 @@
</template>
<script>
/* eslint no-console: 0 */
import { mapGetters } from 'vuex';
import router from '../../routes';
import adminMixin from '../../mixins/isAdmin';
import { INBOX_TYPES } from 'shared/mixins/inboxMixin';
const getInboxClassByType = type => {
const getInboxClassByType = (type, phoneNumber) => {
switch (type) {
case INBOX_TYPES.WEB:
return 'ion-earth';
@ -71,7 +74,9 @@ const getInboxClassByType = type => {
return 'ion-social-twitter';
case INBOX_TYPES.TWILIO:
return 'ion-android-textsms';
return phoneNumber.startsWith('whatsapp')
? 'ion-social-whatsapp-outline'
: 'ion-android-textsms';
case INBOX_TYPES.API:
return 'ion-cloud';
@ -119,10 +124,18 @@ export default {
},
methods: {
computedInboxClass(child) {
const { type } = child;
const classByType = getInboxClassByType(type);
const { type, phoneNumber } = child;
const classByType = getInboxClassByType(type, phoneNumber);
return classByType;
},
computedChildClass(child) {
if (!child.truncateLabel) return '';
return 'text-truncate';
},
computedChildTitle(child) {
if (!child.truncateLabel) return false;
return child.label;
},
newLinkClick() {
router.push({ name: 'settings_inbox_new', params: { page: 'new' } });
},
@ -149,6 +162,7 @@ export default {
border-radius: $space-smaller;
height: $space-normal;
margin-right: $space-small;
min-width: $space-normal;
width: $space-normal;
}
</style>

View file

@ -0,0 +1,77 @@
import AvailabilityStatus from '../AvailabilityStatus';
import { createLocalVue, mount } from '@vue/test-utils';
import Vuex from 'vuex';
import VueI18n from 'vue-i18n';
import i18n from 'dashboard/i18n';
const localVue = createLocalVue();
localVue.use(Vuex);
localVue.use(VueI18n);
localVue.locale('en', i18n.en);
describe('AvailabilityStatus', () => {
const currentUser = { availability_status: 'online' };
let store = null;
let actions = null;
let modules = null;
let availabilityStatus = null;
beforeEach(() => {
actions = {
updateAvailability: jest.fn(() => {
return Promise.resolve();
}),
};
modules = {
auth: {
getters: {
getCurrentUser: () => currentUser,
},
},
};
store = new Vuex.Store({
actions,
modules,
});
availabilityStatus = mount(AvailabilityStatus, {
store,
localVue,
});
});
it('shows current user status', () => {
const statusViewTitle = availabilityStatus.find('.status-view--title');
expect(statusViewTitle.text()).toBe(currentUser.availability_status);
});
it('opens the menu when user clicks "change"', async () => {
expect(availabilityStatus.find('.dropdown-pane').exists()).toBe(false);
await availabilityStatus
.find('.status-change--change-button')
.trigger('click');
expect(availabilityStatus.find('.dropdown-pane').exists()).toBe(true);
});
it('dispatches an action when user changes status', async () => {
await availabilityStatus
.find('.status-change--change-button')
.trigger('click');
await availabilityStatus
.find('.status-change li:last-child button')
.trigger('click');
expect(actions.updateAvailability).toBeCalledWith(
expect.any(Object),
{ availability: 'offline' },
undefined
);
});
});

View file

@ -56,7 +56,7 @@ export default {
computed: {
isActive() {
const { key } = this.channel;
if (Object.keys(this.enabledFeatures) === 0) {
if (Object.keys(this.enabledFeatures).length === 0) {
return false;
}
if (key === 'facebook') {

View file

@ -10,6 +10,7 @@
</div>
</template>
<script>
import { getContrastingTextColor } from 'shared/helpers/ColorHelper';
export default {
props: {
title: {
@ -43,12 +44,7 @@ export default {
},
computed: {
textColor() {
const color = this.bgColor.replace('#', '');
const r = parseInt(color.slice(0, 2), 16);
const g = parseInt(color.slice(2, 4), 16);
const b = parseInt(color.slice(4, 6), 16);
// http://stackoverflow.com/a/3943023/112731
return r * 0.299 + g * 0.587 + b * 0.114 > 186 ? '#000000' : '#FFFFFF';
return getContrastingTextColor(this.bgColor);
},
labelClass() {
return `label ${this.small ? 'small' : ''}`;

View file

@ -32,7 +32,7 @@
<multiselect
v-model="currentChat.meta.assignee"
:options="agentList"
label="available_name"
label="name"
:allow-empty="true"
deselect-label="Remove"
placeholder="Select Agent"
@ -97,7 +97,7 @@ export default {
return [
{
confirmed: true,
available_name: 'None',
name: 'None',
id: 0,
role: 'agent',
account_id: 0,

View file

@ -41,7 +41,7 @@
size="16px"
/>
<div class="sender--available-name">
{{ sender.available_name || sender.name }}
{{ sender.name }}
</div>
</div>
</div>
@ -121,7 +121,7 @@ export default {
return this.data.message_type === 1 && !this.isHovered && sender
? {
content: `Sent by: ${sender.available_name || sender.name}`,
content: `Sent by: ${sender.name}`,
classes: 'top',
}
: false;

View file

@ -22,6 +22,15 @@
>
<span>{{ $t('CONTACT_PANEL.MUTE_CONTACT') }}</span>
</button>
<button
v-else
class="button small clear row alert small-6 action--button"
@click="unmute"
>
<span>{{ $t('CONTACT_PANEL.UNMUTE_CONTACT') }}</span>
</button>
<button
class="button small clear row small-6 action--button"
@click="toggleEmailActionsModal"
@ -67,6 +76,11 @@ export default {
this.showAlert(this.$t('CONTACT_PANEL.MUTED_SUCCESS'));
this.toggleConversationActions();
},
unmute() {
this.$store.dispatch('unmuteConversation', this.currentChat.id);
this.showAlert(this.$t('CONTACT_PANEL.UNMUTED_SUCCESS'));
this.toggleConversationActions();
},
toggleEmailActionsModal() {
this.showEmailActionsModal = !this.showEmailActionsModal;
this.hideConversationActions();
@ -129,6 +143,7 @@ export default {
display: flex;
align-items: center;
width: 100%;
white-space: nowrap;
padding: var(--space-small) var(--space-smaller);
font-size: var(--font-size-small);

View file

@ -63,6 +63,7 @@ export default {
margin: 0;
color: $color-white;
font-weight: $font-weight-bold;
word-break: break-word;
}
.button {

View file

@ -0,0 +1,130 @@
import { createLocalVue, mount } from '@vue/test-utils';
import Vuex from 'vuex';
import VueI18n from 'vue-i18n';
import Button from 'dashboard/components/buttons/Button';
import i18n from 'dashboard/i18n';
import MoreActions from '../MoreActions';
const localVue = createLocalVue();
localVue.use(Vuex);
localVue.use(VueI18n);
localVue.locale('en', i18n.en);
localVue.component('woot-button', Button);
describe('MoveActions', () => {
let currentChat = { id: 8, muted: false };
let state = null;
let muteConversation = null;
let unmuteConversation = null;
let modules = null;
let getters = null;
let store = null;
let moreActions = null;
beforeEach(() => {
window.bus = {
$emit: jest.fn(),
};
state = {
authenticated: true,
currentChat,
};
muteConversation = jest.fn(() => Promise.resolve());
unmuteConversation = jest.fn(() => Promise.resolve());
modules = {
conversations: {
actions: {
muteConversation,
unmuteConversation,
},
},
};
getters = {
getSelectedChat: () => currentChat,
};
store = new Vuex.Store({
state,
modules,
getters,
});
moreActions = mount(MoreActions, { store, localVue });
});
it('opens the menu when user clicks "more"', async () => {
expect(moreActions.find('.dropdown-pane').exists()).toBe(false);
await moreActions.find('.more--button').trigger('click');
expect(moreActions.find('.dropdown-pane').exists()).toBe(true);
});
describe('muting discussion', () => {
it('triggers "muteConversation"', async () => {
await moreActions.find('.more--button').trigger('click');
await moreActions
.find('.dropdown-pane button:first-child')
.trigger('click');
expect(muteConversation).toBeCalledWith(
expect.any(Object),
currentChat.id,
undefined
);
});
it('shows alert', async () => {
await moreActions.find('.more--button').trigger('click');
await moreActions
.find('.dropdown-pane button:first-child')
.trigger('click');
expect(window.bus.$emit).toBeCalledWith(
'newToastMessage',
'This conversation is muted for 6 hours'
);
});
});
describe('unmuting discussion', () => {
beforeEach(() => {
currentChat.muted = true;
});
it('triggers "unmuteConversation"', async () => {
await moreActions.find('.more--button').trigger('click');
await moreActions
.find('.dropdown-pane button:first-child')
.trigger('click');
expect(unmuteConversation).toBeCalledWith(
expect.any(Object),
currentChat.id,
undefined
);
});
it('shows alert', async () => {
await moreActions.find('.more--button').trigger('click');
await moreActions
.find('.dropdown-pane button:first-child')
.trigger('click');
expect(window.bus.$emit).toBeCalledWith(
'newToastMessage',
'This conversation is unmuted'
);
});
});
});

View file

@ -28,6 +28,7 @@ import tr from './locale/tr';
import uk from './locale/uk';
import vi from './locale/vi';
import zh from './locale/zh';
import zh_TW from './locale/zh_TW';
export default {
ar,
@ -60,4 +61,5 @@ export default {
uk,
vi,
zh,
zh_TW,
};

View file

@ -4,16 +4,10 @@
"HEADER_BTN_TXT": "إضافة موظف",
"LOADING": "جار جلب قائمة الموظفين",
"SIDEBAR_TXT": "<p><b>الموظفين</b></p> <p> موظف الدعم <b></b> هو عضو في فريق دعم العملاء الخاص بك. </p><p> يستطيع موظفو الدعم مشاهدة الرسائل الواردة من المستخدمين والرد عليها. تظهر القائمة جميع الموظفين الموجودين حاليا في حسابك. </p><p> انقر فوق <b>إضافة موظف</b> لإضافة موظف دعم فني جديد. سيتلقى الشخص الذي تضيفه رسالة بريد إلكتروني مع رابط تأكيد لتفعيل حسابه ، وبعد ذلك يمكنهم الوصول إلى Chatwoot والرد على الرسائل. </p><p> الوصول إلى ميزات Chatwoot يتوقف على الصلاحيات التالية. </p><p> <b>الموظف</b> - موظفي الدعم الذين لديهم هذه الصلاحية يمكنهم فقط الوصول إلى صناديق قنوات التواصل والتقارير والمحادثات. ويمكنهم بدء محادثات مع موظفين آخرين أو مع أنفسهم وأيضاً إغلاق المحادثات.</p><p> <b>مدير البرنامج</b> - الشخص المسؤول من الوصول إلى جميع ميزات Chatwoot المفعلة للحساب الخاص بك. بما في ذلك الإعدادات، إلى جانب جميع امتيازات الموظفين العاديين.</p>",
"AGENT_TYPES": [
{
"name": "administrator",
"label": "المدير"
},
{
"name": "agent",
"label": "موظف الدعم"
}
],
"AGENT_TYPES": {
"ADMINISTRATOR": "المدير",
"AGENT": "موظف الدعم"
},
"LIST": {
"404": "لا يوجد موظفي دعم مرتبطين بهذا الحساب",
"TITLE": "إدارة موظفي الدعم في فريقك",

View file

@ -3,38 +3,32 @@
"HEADER": "التقارير",
"LOADING_CHART": "تحميل بيانات الرسم البياني...",
"NO_ENOUGH_DATA": "لم يتم جمع بيانات بقدر كافي لإنشاء التقرير، الرجاء المحاولة مرة أخرى لاحقاً.",
"METRICS": [
{
"METRICS": {
"CONVERSATIONS": {
"NAME": "المحادثات",
"KEY": "conversations_count",
"DESC": "(الإجمالي)"
},
{
"INCOMING_MESSAGES": {
"NAME": "الرسائل الواردة",
"KEY": "incoming_messages_count",
"DESC": "(الإجمالي)"
},
{
"OUTGOING_MESSAGES": {
"NAME": "الرسائل الصادرة",
"KEY": "outgoing_messages_count",
"DESC": "(الإجمالي)"
},
{
"FIRST_RESPONSE_TIME": {
"NAME": "وقت الاستجابة الأولى",
"KEY": "avg_first_response_time",
"DESC": "(متوسط)"
},
{
"RESOLUTION_TIME": {
"NAME": "وقت إغلاق المحادثات",
"KEY": "avg_resolution_time",
"DESC": "(متوسط)"
},
{
"RESOLUTION_COUNT": {
"NAME": "عدد مرات الإغلاق",
"KEY": "resolutions_count",
"DESC": "(الإجمالي)"
}
],
},
"DATE_RANGE": [
{
"id": 0,

View file

@ -88,6 +88,7 @@
}
},
"SIDEBAR_ITEMS": {
"CHANGE_AVAILABILITY_STATUS": "يتغيرون",
"CHANGE_ACCOUNTS": "تبديل الحساب",
"SELECTOR_SUBTITLE": "اختر حساباً من القائمة التالية",
"PROFILE_SETTINGS": "إعدادات الملف الشخصي",

View file

@ -4,16 +4,10 @@
"HEADER_BTN_TXT": "Afegir Agent",
"LOADING": "S'està recollint la llista d'agents",
"SIDEBAR_TXT": "<p><b>Agents</b></p> <p> An <b>Agent</b> is a member of your Customer Support team. </p><p> Agents will be able to view and reply to messages from your users. The list shows all agents currently in your account. </p><p> Click on <b>Add Agent</b> to add a new agent. Agent you add will receive an email with a confirmation link to activate their account, after which they can access Chatwoot and respond to messages. </p><p> Access to Chatwoot's features are based on following roles. </p><p> <b>Agent</b> - Agents with this role can only access inboxes, reports and conversations. They can assign conversations to other agents or themselves and resolve conversations.</p><p> <b>Administrator</b> - Administrator will have access to all Chatwoot features enabled for your account, including settings, along with all of a normal agents' privileges.</p>",
"AGENT_TYPES": [
{
"name": "administrador/a",
"label": "Administrador/a"
},
{
"name": "agent",
"label": "Agent"
}
],
"AGENT_TYPES": {
"ADMINISTRATOR": "Administrador/a",
"AGENT": "Agent"
},
"LIST": {
"404": "No hi ha agents associats a aquest compte",
"TITLE": "Gestiona agents en el teu equip",

View file

@ -3,38 +3,32 @@
"HEADER": "Informes",
"LOADING_CHART": "S'estan carregant dades del gràfic...",
"NO_ENOUGH_DATA": "No hem rebut suficients punts de dades per generar l'informe. Torneu-ho a provar més endavant.",
"METRICS": [
{
"METRICS": {
"CONVERSATIONS": {
"NAME": "Converses",
"KEY": "conversations_count",
"DESC": "( Total )"
},
{
"INCOMING_MESSAGES": {
"NAME": "Missatges d'entrada",
"KEY": "incoming_messages_count",
"DESC": "( Total )"
},
{
"OUTGOING_MESSAGES": {
"NAME": "Missatges de sortida",
"KEY": "outgoing_messages_count",
"DESC": "( Total )"
},
{
"FIRST_RESPONSE_TIME": {
"NAME": "Primer temps de resposta",
"KEY": "avg_first_response_time",
"DESC": "( Promig )"
},
{
"RESOLUTION_TIME": {
"NAME": "Temps de resolució",
"KEY": "avg_resolution_time",
"DESC": "( Promig )"
},
{
"RESOLUTION_COUNT": {
"NAME": "Total de resolucions",
"KEY": "resolutions_count",
"DESC": "( Total )"
}
],
},
"DATE_RANGE": [
{
"id": 0,

View file

@ -88,6 +88,7 @@
}
},
"SIDEBAR_ITEMS": {
"CHANGE_AVAILABILITY_STATUS": "Canviar",
"CHANGE_ACCOUNTS": "Switch Account",
"SELECTOR_SUBTITLE": "Select an account from the following list",
"PROFILE_SETTINGS": "Configuració del Perfil",

View file

@ -4,16 +4,10 @@
"HEADER_BTN_TXT": "Přidat agenta",
"LOADING": "Načítání seznamu agentů",
"SIDEBAR_TXT": "<p><b>Agents</b></p> <p> An <b>Agent</b> is a member of your Customer Support team. </p><p> Agents will be able to view and reply to messages from your users. The list shows all agents currently in your account. </p><p> Click on <b>Add Agent</b> to add a new agent. Agent you add will receive an email with a confirmation link to activate their account, after which they can access Chatwoot and respond to messages. </p><p> Access to Chatwoot's features are based on following roles. </p><p> <b>Agent</b> - Agents with this role can only access inboxes, reports and conversations. They can assign conversations to other agents or themselves and resolve conversations.</p><p> <b>Administrator</b> - Administrator will have access to all Chatwoot features enabled for your account, including settings, along with all of a normal agents' privileges.</p>",
"AGENT_TYPES": [
{
"name": "administrator",
"label": "Administrátor"
},
{
"name": "agent",
"label": "Agent"
}
],
"AGENT_TYPES": {
"ADMINISTRATOR": "Administrátor",
"AGENT": "Agent"
},
"LIST": {
"404": "K tomuto účtu nejsou přiřazeni žádní agenti",
"TITLE": "Spravujte agenty ve vašem týmu",

View file

@ -3,38 +3,32 @@
"HEADER": "Zprávy",
"LOADING_CHART": "Načítání dat mapy...",
"NO_ENOUGH_DATA": "Pro vytvoření hlášení jsme neobdrželi dostatek dat, zkuste to prosím později.",
"METRICS": [
{
"METRICS": {
"CONVERSATIONS": {
"NAME": "Konverzace",
"KEY": "conversations_count",
"DESC": "( celkem)"
},
{
"INCOMING_MESSAGES": {
"NAME": "Příchozí zprávy",
"KEY": "incoming_messages_count",
"DESC": "( celkem)"
},
{
"OUTGOING_MESSAGES": {
"NAME": "Odchozí zprávy",
"KEY": "outgoing_messages_count",
"DESC": "( celkem)"
},
{
"FIRST_RESPONSE_TIME": {
"NAME": "Čas první odpovědi",
"KEY": "avg_first_response_time",
"DESC": "(Průměrný)"
},
{
"RESOLUTION_TIME": {
"NAME": "Čas rozlišení",
"KEY": "avg_resolution_time",
"DESC": "(Průměrný)"
},
{
"RESOLUTION_COUNT": {
"NAME": "Počet rozlišení",
"KEY": "resolutions_count",
"DESC": "( celkem)"
}
],
},
"DATE_RANGE": [
{
"id": 0,

View file

@ -88,6 +88,7 @@
}
},
"SIDEBAR_ITEMS": {
"CHANGE_AVAILABILITY_STATUS": "Změnit",
"CHANGE_ACCOUNTS": "Switch Account",
"SELECTOR_SUBTITLE": "Select an account from the following list",
"PROFILE_SETTINGS": "Nastavení profilu",

View file

@ -4,16 +4,10 @@
"HEADER_BTN_TXT": "Add Agent",
"LOADING": "Fetching Agent List",
"SIDEBAR_TXT": "<p><b>Agents</b></p> <p> An <b>Agent</b> is a member of your Customer Support team. </p><p> Agents will be able to view and reply to messages from your users. The list shows all agents currently in your account. </p><p> Click on <b>Add Agent</b> to add a new agent. Agent you add will receive an email with a confirmation link to activate their account, after which they can access Chatwoot and respond to messages. </p><p> Access to Chatwoot's features are based on following roles. </p><p> <b>Agent</b> - Agents with this role can only access inboxes, reports and conversations. They can assign conversations to other agents or themselves and resolve conversations.</p><p> <b>Administrator</b> - Administrator will have access to all Chatwoot features enabled for your account, including settings, along with all of a normal agents' privileges.</p>",
"AGENT_TYPES": [
{
"name": "administrator",
"label": "Administrator"
},
{
"name": "agent",
"label": "Agent"
}
],
"AGENT_TYPES": {
"ADMINISTRATOR": "Administrator",
"AGENT": "Agent"
},
"LIST": {
"404": "There are no agents associated to this account",
"TITLE": "Manage agents in your team",
@ -35,9 +29,9 @@
"PLACEHOLDER": "Please enter a name of the agent"
},
"AGENT_TYPE": {
"LABEL": "Agent Type",
"PLACEHOLDER": "Please select a type",
"ERROR": "Agent type is required"
"LABEL": "Role",
"PLACEHOLDER": "Please select a role",
"ERROR": "Role is required"
},
"EMAIL": {
"LABEL": "Email Address",
@ -72,9 +66,9 @@
"PLACEHOLDER": "Please enter a name of the agent"
},
"AGENT_TYPE": {
"LABEL": "Agent Type",
"PLACEHOLDER": "Please select a type",
"ERROR": "Agent type is required"
"LABEL": "Role",
"PLACEHOLDER": "Please select a role",
"ERROR": "Role is required"
},
"EMAIL": {
"LABEL": "Email Address",

View file

@ -3,38 +3,32 @@
"HEADER": "Reports",
"LOADING_CHART": "Loading chart data...",
"NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
"METRICS": [
{
"METRICS": {
"CONVERSATIONS": {
"NAME": "Conversations",
"KEY": "conversations_count",
"DESC": "( Total )"
},
{
"INCOMING_MESSAGES": {
"NAME": "Incoming Messages",
"KEY": "incoming_messages_count",
"DESC": "( Total )"
},
{
"OUTGOING_MESSAGES": {
"NAME": "Outgoing Messages",
"KEY": "outgoing_messages_count",
"DESC": "( Total )"
},
{
"FIRST_RESPONSE_TIME": {
"NAME": "First response time",
"KEY": "avg_first_response_time",
"DESC": "( Avg )"
},
{
"RESOLUTION_TIME": {
"NAME": "Resolution Time",
"KEY": "avg_resolution_time",
"DESC": "( Avg )"
},
{
"RESOLUTION_COUNT": {
"NAME": "Resolution Count",
"KEY": "resolutions_count",
"DESC": "( Total )"
}
],
},
"DATE_RANGE": [
{
"id": 0,

View file

@ -88,6 +88,7 @@
}
},
"SIDEBAR_ITEMS": {
"CHANGE_AVAILABILITY_STATUS": "Change",
"CHANGE_ACCOUNTS": "Switch Account",
"SELECTOR_SUBTITLE": "Select an account from the following list",
"PROFILE_SETTINGS": "Profile Settings",

View file

@ -4,16 +4,10 @@
"HEADER_BTN_TXT": "Agent hinzufügen",
"LOADING": "Agentenliste abrufen",
"SIDEBAR_TXT": "<p><b>Agents</b></p> <p> An <b>Agent</b> is a member of your Customer Support team. </p><p> Agents will be able to view and reply to messages from your users. The list shows all agents currently in your account. </p><p> Click on <b>Add Agent</b> to add a new agent. Agent you add will receive an email with a confirmation link to activate their account, after which they can access Chatwoot and respond to messages. </p><p> Access to Chatwoot's features are based on following roles. </p><p> <b>Agent</b> - Agents with this role can only access inboxes, reports and conversations. They can assign conversations to other agents or themselves and resolve conversations.</p><p> <b>Administrator</b> - Administrator will have access to all Chatwoot features enabled for your account, including settings, along with all of a normal agents' privileges.</p>",
"AGENT_TYPES": [
{
"name": "administrator",
"label": "Administrator"
},
{
"name": "agent",
"label": "Agent"
}
],
"AGENT_TYPES": {
"ADMINISTRATOR": "Administrator",
"AGENT": "Agent"
},
"LIST": {
"404": "Diesem Konto sind keine Agenten zugeordnet",
"TITLE": "Verwalten Sie Agenten in Ihrem Team",

View file

@ -3,38 +3,32 @@
"HEADER": "Berichte",
"LOADING_CHART": "Diagrammdaten laden ...",
"NO_ENOUGH_DATA": "Wir haben nicht genügend Datenpunkte erhalten, um einen Bericht zu erstellen. Bitte versuchen Sie es später erneut.",
"METRICS": [
{
"METRICS": {
"CONVERSATIONS": {
"NAME": "Gespräche",
"KEY": "conversations_count",
"DESC": "( Total )"
},
{
"INCOMING_MESSAGES": {
"NAME": "Eingehende Nachrichten",
"KEY": "incoming_messages_count",
"DESC": "( Total )"
},
{
"OUTGOING_MESSAGES": {
"NAME": "Ausgehende Nachrichten",
"KEY": "outgoing_messages_count",
"DESC": "( Total )"
},
{
"FIRST_RESPONSE_TIME": {
"NAME": "Erste Antwortzeit",
"KEY": "avg_first_response_time",
"DESC": "( Avg )"
},
{
"RESOLUTION_TIME": {
"NAME": "Lösungszeit",
"KEY": "avg_resolution_time",
"DESC": "( Avg )"
},
{
"RESOLUTION_COUNT": {
"NAME": "Auflösungsanzahl",
"KEY": "resolutions_count",
"DESC": "( Total )"
}
],
},
"DATE_RANGE": [
{
"id": 0,

View file

@ -88,6 +88,7 @@
}
},
"SIDEBAR_ITEMS": {
"CHANGE_AVAILABILITY_STATUS": "Wechseln",
"CHANGE_ACCOUNTS": "Switch Account",
"SELECTOR_SUBTITLE": "Select an account from the following list",
"PROFILE_SETTINGS": "Profileinstellungen",

View file

@ -4,16 +4,10 @@
"HEADER_BTN_TXT": "Προσθήκη Πράκτορα",
"LOADING": "Λήψη της λίστα των Πρακτόρων",
"SIDEBAR_TXT": "<p><b>Πράκτορες</b></p> <p> Ένας <b>Πράκτορας</b> είναι ένα μέλος της ομάδας υποστήριξής σας. </p><p> Οι πράκτορες θα μπορούν να δουν και να απαντήσουν στα μηνύματα των χρηστών. Στην λίστα φαίνονται όλοι οι πράκτορες που συμμετέχουν στον λογαριασμό σας. </p><p> Πατήστε στο <b>Προσθήκη Πράκτορα</b> για να προσθέσετε έναν νέο. Ο πράκτορας θα λάβει ένα email με σύνδεσμο επιβεβαίωσης για να ενεργοποιήσει τον λογαριασμό του, ύστερα θα μπορούν να δουν το Chatwoot και να ανταποκρίνονται στα μηνύματά τους. </p><p> Η πρόσβαση στις δυνατότητες του Chatwoot βασίζεται στους παρακάτω ρόλους. </p><p> <b>Πράκτορας</b> - Οι χρήστες με αυτόν τον ρόλο έχουν πρόσβαση μόνο στα εισερχόμενα, αναφορές και τις συζητήσεις. Μπορούν επίσης να αναθέσουν συζητήσεις σε άλλους πράκτορες ή τον εαυτό τους και να τις ολοκληρώσουν.</p><p> <b>Διαχειριστής</b> - Ο διαχειριστής θα έχει πρόσβαση σε όλες τις δυνατότητες του Chatwoot που έχουν ενεργοποιηθεί για τον λογαριασμό, συμπεριλαμβανομένων των ρυθμίσεων της εφαρμογής, όπως επίσης και όλα τα δικαιώματα που έχει ένας πράκτορας.</p>",
"AGENT_TYPES": [
{
"name": "administrator",
"label": "Διαχειριστής"
},
{
"name": "agent",
"label": "Πράκτορας"
}
],
"AGENT_TYPES": {
"ADMINISTRATOR": "Διαχειριστής",
"AGENT": "Πράκτορας"
},
"LIST": {
"404": "Δεν υπάρχουν πράκτορες σε αυτόν τον λογαριασμό",
"TITLE": "Διαχείριση πρακτόρων της ομάδας σας",

View file

@ -3,38 +3,32 @@
"HEADER": "Αναφορές",
"LOADING_CHART": "Φόρτωση δεδομένων γραφήματος...",
"NO_ENOUGH_DATA": "Δεν έχουν ληφθεί αρκετά σημεία δεδομένων για την δημιουργία της αναφοράς, Παρακαλώ προσπαθήστε αργότερα.",
"METRICS": [
{
"METRICS": {
"CONVERSATIONS": {
"NAME": "Συζητήσεις",
"KEY": "conversations_count",
"DESC": "(Σύνολο)"
},
{
"INCOMING_MESSAGES": {
"NAME": "Εισερχόμενα Μηνύματα",
"KEY": "incoming_messages_count",
"DESC": "(Σύνολο)"
},
{
"OUTGOING_MESSAGES": {
"NAME": "Εξερχόμενα Μηνύματα",
"KEY": "outgoing_messages_count",
"DESC": "(Σύνολο)"
},
{
"FIRST_RESPONSE_TIME": {
"NAME": "Χρόνος πρώτης ανταπόκρισης",
"KEY": "avg_first_response_time",
"DESC": "(Μ.Ο.)"
},
{
"RESOLUTION_TIME": {
"NAME": "Χρόνος ανάλυσης",
"KEY": "avg_resolution_time",
"DESC": "(Μ.Ο.)"
},
{
"RESOLUTION_COUNT": {
"NAME": "Αριθμός Αναλύσεων",
"KEY": "resolutions_count",
"DESC": "(Σύνολο)"
}
],
},
"DATE_RANGE": [
{
"id": 0,

View file

@ -88,6 +88,7 @@
}
},
"SIDEBAR_ITEMS": {
"CHANGE_AVAILABILITY_STATUS": "Να αλλάξει",
"CHANGE_ACCOUNTS": "Αλλαγή Λογαριασμού",
"SELECTOR_SUBTITLE": "Επιλέξτε ένα λογαριασμό από την Λίστα",
"PROFILE_SETTINGS": "Ρυθμίσεις Προφίλ",

View file

@ -4,16 +4,10 @@
"HEADER_BTN_TXT": "Add Agent",
"LOADING": "Fetching Agent List",
"SIDEBAR_TXT": "<p><b>Agents</b></p> <p> An <b>Agent</b> is a member of your Customer Support team. </p><p> Agents will be able to view and reply to messages from your users. The list shows all agents currently in your account. </p><p> Click on <b>Add Agent</b> to add a new agent. Agent you add will receive an email with a confirmation link to activate their account, after which they can access Chatwoot and respond to messages. </p><p> Access to Chatwoot's features are based on following roles. </p><p> <b>Agent</b> - Agents with this role can only access inboxes, reports and conversations. They can assign conversations to other agents or themselves and resolve conversations.</p><p> <b>Administrator</b> - Administrator will have access to all Chatwoot features enabled for your account, including settings, along with all of a normal agents' privileges.</p>",
"AGENT_TYPES": [
{
"name": "administrator",
"label": "Administrator"
},
{
"name": "agent",
"label": "Agent"
}
],
"AGENT_TYPES": {
"ADMINISTRATOR": "Administrator",
"AGENT": "Agent"
},
"LIST": {
"404": "There are no agents associated to this account",
"TITLE": "Manage agents in your team",
@ -35,9 +29,9 @@
"PLACEHOLDER": "Please enter a name of the agent"
},
"AGENT_TYPE": {
"LABEL": "Agent Type",
"PLACEHOLDER": "Please select a type",
"ERROR": "Agent type is required"
"LABEL": "Role",
"PLACEHOLDER": "Please select a role",
"ERROR": "Role is required"
},
"EMAIL": {
"LABEL": "Email Address",
@ -72,9 +66,9 @@
"PLACEHOLDER": "Please enter a name of the agent"
},
"AGENT_TYPE": {
"LABEL": "Agent Type",
"PLACEHOLDER": "Please select a type",
"ERROR": "Agent type is required"
"LABEL": "Role",
"PLACEHOLDER": "Please select a role",
"ERROR": "Role is required"
},
"EMAIL": {
"LABEL": "Email Address",

View file

@ -3,6 +3,7 @@
"NOT_AVAILABLE": "Not Available",
"EMAIL_ADDRESS": "Email Address",
"PHONE_NUMBER": "Phone number",
"COPY_SUCCESSFUL": "Copied to clipboard successfully",
"COMPANY": "Company",
"LOCATION": "Location",
"CONVERSATION_TITLE": "Conversation Details",
@ -32,7 +33,9 @@
"NO_AVAILABLE_LABELS": "There are no labels added to this conversation."
},
"MUTE_CONTACT": "Mute Conversation",
"UNMUTE_CONTACT": "Unmute Conversation",
"MUTED_SUCCESS": "This conversation is muted for 6 hours",
"UNMUTED_SUCCESS": "This conversation is unmuted",
"SEND_TRANSCRIPT": "Send Transcript",
"EDIT_LABEL": "Edit"
},

View file

@ -73,6 +73,13 @@
"ENABLED": "Enabled",
"DISABLED": "Disabled"
},
"REPLY_TIME": {
"TITLE": "Set Reply time",
"IN_A_FEW_MINUTES": "In a few minutes",
"IN_A_FEW_HOURS": "In a few hours",
"IN_A_DAY": "In a day",
"HELP_TEXT": "This reply time will be displayed on the live chat widget"
},
"WIDGET_COLOR": {
"LABEL": "Widget Color",
"PLACEHOLDER": "Update the widget color used in widget"
@ -233,6 +240,12 @@
"INBOX_UPDATE_TITLE": "Inbox Settings",
"INBOX_UPDATE_SUB_TEXT": "Update your inbox settings",
"AUTO_ASSIGNMENT_SUB_TEXT": "Enable or disable the automatic assignment of new conversations to the agents added to this inbox."
},
"FACEBOOK_REAUTHORIZE": {
"TITLE": "Reauthorize",
"SUBTITLE": "Your Facebook connection has expired, please reconnect your Facebook page to continue services",
"MESSAGE_SUCCESS": "Reconnection successful",
"MESSAGE_ERROR": "There was an error, please try again"
}
}
}

View file

@ -3,17 +3,41 @@
"HEADER": "Reports",
"LOADING_CHART": "Loading chart data...",
"NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
"METRICS": [
{ "NAME": "Conversations", "KEY": "conversations_count", "DESC": "( Total )" },
{ "NAME": "Incoming Messages", "KEY": "incoming_messages_count", "DESC": "( Total )" },
{ "NAME": "Outgoing Messages", "KEY": "outgoing_messages_count", "DESC": "( Total )" },
{ "NAME": "First response time", "KEY": "avg_first_response_time", "DESC": "( Avg )" },
{ "NAME": "Resolution Time", "KEY": "avg_resolution_time", "DESC": "( Avg )" },
{ "NAME": "Resolution Count", "KEY": "resolutions_count", "DESC": "( Total )" }
],
"METRICS": {
"CONVERSATIONS": {
"NAME": "Conversations",
"DESC": "( Total )"
},
"INCOMING_MESSAGES": {
"NAME": "Incoming Messages",
"DESC": "( Total )"
},
"OUTGOING_MESSAGES": {
"NAME": "Outgoing Messages",
"DESC": "( Total )"
},
"FIRST_RESPONSE_TIME": {
"NAME": "First response time",
"DESC": "( Avg )"
},
"RESOLUTION_TIME": {
"NAME": "Resolution Time",
"DESC": "( Avg )"
},
"RESOLUTION_COUNT": {
"NAME": "Resolution Count",
"DESC": "( Total )"
}
},
"DATE_RANGE": [
{ "id": 0, "name": "Last 7 days" },
{ "id": 1, "name": "Last 30 days" }
{
"id": 0,
"name": "Last 7 days"
},
{
"id": 1,
"name": "Last 30 days"
}
]
}
}

View file

@ -90,6 +90,7 @@
}
},
"SIDEBAR_ITEMS": {
"CHANGE_AVAILABILITY_STATUS": "Change",
"CHANGE_ACCOUNTS": "Switch Account",
"SELECTOR_SUBTITLE": "Select an account from the following list",
"PROFILE_SETTINGS": "Profile Settings",

View file

@ -3,21 +3,15 @@
"HEADER": "Agentes",
"HEADER_BTN_TXT": "Añadir agente",
"LOADING": "Se están listando los agentes",
"SIDEBAR_TXT": "<p><b>Agentes</b></p> <p> Un <b>Agente</b> es miembro de su equipo de Atención al Cliente. </p><p> Los agentes podrán ver y responder a los mensajes de sus usuarios. La lista muestra todos los agentes actualmente en tu cuenta. </p><p> Haga clic en <b>Añadir agente</b> para añadir un nuevo agente. El agente que añadas recibirá un correo electrónico con un enlace de confirmación para activar su cuenta, después de lo cual podrá acceder a Chatwoot y responder a los mensajes. </p><p> El acceso a las características de Chatwoot se basa en los siguientes roles. </p><p> <b>Agente</b> - Los agentes con este rol solamente pueden acceder a bandejas, informes y conversaciones. Pueden asignar conversaciones a otros agentes o a sí mismos y resolver conversaciones.</p><p> <b>Administrador</b> - El administrador tendrá acceso a todas las características de Chatwoot habilitadas para su cuenta, incluyendo configuración y facturación, junto con todos los privilegios de los agentes normales.</p>",
"AGENT_TYPES": [
{
"name": "administrator",
"label": "Administrador"
},
{
"name": "agent",
"label": "Agente"
}
],
"SIDEBAR_TXT": "<p><b>Agentes</b></p> <p> Un <b>Agente</b> es miembro de su equipo de Atención al Cliente. </p><p> Los agentes podrán ver y responder a los mensajes de sus usuarios. La lista muestra todos los agentes actualmente en su cuenta. </p><p> Haga clic en <b>Añadir agente</b> para añadir un nuevo agente. El agente que añada recibirá un correo electrónico con un enlace de confirmación para activar la cuenta, después de lo cual podrá acceder a Chatwoot y responder los mensajes. </p><p> El acceso a las características de Chatwoot se basa en los siguientes roles. </p><p> <b>Agente</b> - Los agentes con este rol solamente pueden acceder a bandejas, informes y conversaciones. Pueden asignar conversaciones a otros agentes o a sí mismos y resolver conversaciones.</p><p> <b>Administrador</b> - El administrador tendrá acceso a todas las características de Chatwoot habilitadas para su cuenta, incluyendo configuración y facturación, junto con todos los privilegios de los agentes normales.</p>",
"AGENT_TYPES": {
"ADMINISTRATOR": "Administrador",
"AGENT": "Agente"
},
"LIST": {
"404": "No hay agentes asociados a esta cuenta",
"TITLE": "Administrar agentes en tu equipo",
"DESC": "Puedes añadir/eliminar agentes a/en tu equipo.",
"TITLE": "Administrar agentes en su equipo",
"DESC": "Puede añadir/eliminar agentes a/de su equipo.",
"NAME": "Nombre",
"EMAIL": "Correo electrónico",
"STATUS": "Estado",
@ -26,13 +20,13 @@
"VERIFICATION_PENDING": "Verificación pendiente"
},
"ADD": {
"TITLE": "Añadir agente a tu equipo",
"DESC": "Puedes añadir personas que podrán manejar el soporte para tus bandejas de entrada.",
"TITLE": "Añadir agente a su equipo",
"DESC": "Puede añadir personas que podrán manejar el soporte para sus bandejas de entrada.",
"CANCEL_BUTTON_TEXT": "Cancelar",
"FORM": {
"NAME": {
"LABEL": "Nombre del agente",
"PLACEHOLDER": "Introduce el nombre del agente"
"PLACEHOLDER": "Introduzca el nombre del agente"
},
"AGENT_TYPE": {
"LABEL": "Tipo de agente",
@ -41,21 +35,21 @@
},
"EMAIL": {
"LABEL": "Dirección de correo",
"PLACEHOLDER": "Por favor, introduzca una dirección de correo electrónico del agente"
"PLACEHOLDER": "Por favor, introduzca la dirección de correo electrónico del agente"
},
"SUBMIT": "Añadir agente"
},
"API": {
"SUCCESS_MESSAGE": "Agente añadido correctamente",
"EXIST_MESSAGE": "El correo electrónico del agente ya está en uso, por favor intente otra dirección de correo electrónico",
"ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtalo de nuevo más tarde"
"ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtelo de nuevo más tarde"
}
},
"DELETE": {
"BUTTON_TEXT": "Eliminar",
"API": {
"SUCCESS_MESSAGE": "Agente eliminado correctamente",
"ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtalo de nuevo más tarde"
"ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtelo de nuevo más tarde"
},
"CONFIRM": {
"TITLE": "Confirmar eliminación",
@ -69,16 +63,16 @@
"FORM": {
"NAME": {
"LABEL": "Nombre del agente",
"PLACEHOLDER": "Por favor, introduzca un nombre del agente"
"PLACEHOLDER": "Por favor, introduzca el nombre del agente"
},
"AGENT_TYPE": {
"LABEL": "Tipo de agente",
"PLACEHOLDER": "Por favor, seleccione un tipo",
"ERROR": "El tipo de agente es requerido"
"ERROR": "El tipo de agente es obligatorio"
},
"EMAIL": {
"LABEL": "Dirección de email",
"PLACEHOLDER": "Por favor, introduzca una dirección de correo electrónico del agente"
"PLACEHOLDER": "Por favor, introduzca la dirección de correo electrónico del agente"
},
"SUBMIT": "Editar agente"
},
@ -86,13 +80,13 @@
"CANCEL_BUTTON_TEXT": "Cancelar",
"API": {
"SUCCESS_MESSAGE": "Agente actualizado correctamente",
"ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtalo de nuevo más tarde"
"ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtelo de nuevo más tarde"
},
"PASSWORD_RESET": {
"ADMIN_RESET_BUTTON": "Restablecer contraseña",
"ADMIN_SUCCESS_MESSAGE": "Se ha enviado un correo electrónico con instrucciones para restablecer la contraseña al agente",
"ADMIN_SUCCESS_MESSAGE": "Se ha enviado un correo electrónico con instrucciones para restablecer la contraseña del agente",
"SUCCESS_MESSAGE": "Contraseña del agente restablecida con éxito",
"ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtalo de nuevo más tarde"
"ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtelo de nuevo más tarde"
}
},
"SEARCH": {

View file

@ -6,7 +6,7 @@
"SEARCH_404": "No hay elementos que coincidan con esta consulta",
"SIDEBAR_TXT": "<p><b>Respuestas predefinidas</b> </p><p> Respuestas predefinidas son plantillas de respuesta guardadas que pueden utilizarse para enviar rápidamente una respuesta a una conversación. </p><p> Para crear una respuesta predefinida, simplemente haga clic en <b>Añadir respuesta predefinida</b>. También puede editar o eliminar una respuesta predefinida haciendo clic en el botón Editar o Borrar </p><p> Las respuestas predefinidas se utilizan con la ayuda de <b>Códigos cortos</b>. Los agentes pueden acceder a las respuestas predefinidas mientras están en un chat escribiendo <b>'/'</b> seguido del código corto. </p>",
"LIST": {
"404": "No hay respuestas enlatadas disponibles en esta cuenta.",
"404": "No hay respuestas predefinidas disponibles en esta cuenta.",
"TITLE": "Administrar respuestas predefinidas",
"DESC": "Las respuestas predefinidas son plantillas de respuesta predefinidas que se pueden utilizar para enviar rápidamente respuestas a los Tickets.",
"TABLE_HEADER": [
@ -17,7 +17,7 @@
},
"ADD": {
"TITLE": "Añadir respuesta predefinida",
"DESC": "Las respuestas predefinidas son plantillas de respuesta guardadas que se pueden utilizar para enviar rápidamente la respuesta a la conversación .",
"DESC": "Las respuestas predefinidas son plantillas de respuesta guardadas que se pueden utilizar para enviar rápidamente la respuesta a la conversación.",
"CANCEL_BUTTON_TEXT": "Cancelar",
"FORM": {
"SHORT_CODE": {
@ -34,7 +34,7 @@
},
"API": {
"SUCCESS_MESSAGE": "Respuesta predefinida añadida correctamente",
"ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtalo de nuevo más tarde"
"ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtelo de nuevo más tarde"
}
},
"EDIT": {
@ -56,14 +56,14 @@
"BUTTON_TEXT": "Editar",
"API": {
"SUCCESS_MESSAGE": "Respuesta predefinida actualizada correctamente",
"ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtalo de nuevo más tarde"
"ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtelo de nuevo más tarde"
}
},
"DELETE": {
"BUTTON_TEXT": "Eliminar",
"API": {
"SUCCESS_MESSAGE": "Respuesta predefinida eliminada correctamente",
"ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtalo de nuevo más tarde"
"ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtelo de nuevo más tarde"
},
"CONFIRM": {
"TITLE": "Confirmar eliminación",

View file

@ -12,17 +12,17 @@
},
"STATUS_TABS": [
{
"NAME": "Abrir",
"NAME": "Abiertas",
"KEY": "openCount"
},
{
"NAME": "Resuelto",
"NAME": "Resueltas",
"KEY": "allConvCount"
}
],
"ASSIGNEE_TYPE_TABS": [
{
"NAME": "Mina",
"NAME": "Mías",
"KEY": "me",
"COUNT_KEY": "mineCount"
},
@ -32,18 +32,18 @@
"COUNT_KEY": "unAssignedCount"
},
{
"NAME": "Todos",
"NAME": "Todas",
"KEY": "all",
"COUNT_KEY": "allCount"
}
],
"CHAT_STATUS_ITEMS": [
{
"TEXT": "Abrir",
"TEXT": "Abiertas",
"VALUE": "open"
},
{
"TEXT": "Resuelto",
"TEXT": "Resueltas",
"VALUE": "resolved"
},
{
@ -78,7 +78,7 @@
}
},
"RECEIVED_VIA_EMAIL": "Recibido por email",
"VIEW_TWEET_IN_TWITTER": "View tweet in Twitter",
"REPLY_TO_TWEET": "Reply to this tweet"
"VIEW_TWEET_IN_TWITTER": "Ver trino en Twitter",
"REPLY_TO_TWEET": "Responder a éste trino"
}
}

View file

@ -1,9 +1,9 @@
{
"CONTACT_PANEL": {
"NOT_AVAILABLE": "Not Available",
"NOT_AVAILABLE": "No Disponible",
"EMAIL_ADDRESS": "Dirección de correo",
"PHONE_NUMBER": "Número de teléfono",
"COMPANY": "Company",
"COMPANY": "Empresa",
"LOCATION": "Ubicación",
"CONVERSATION_TITLE": "Detalles de la conversación",
"BROWSER": "Navegador",
@ -15,7 +15,7 @@
"TITLE": "Conversaciones anteriores"
},
"CUSTOM_ATTRIBUTES": {
"TITLE": "Custom Attributes"
"TITLE": "Atributos personalizados"
},
"LABELS": {
"TITLE": "Etiquetas de conversación",
@ -31,66 +31,66 @@
"NO_LABELS_TO_ADD": "No hay más etiquetas definidas en la cuenta.",
"NO_AVAILABLE_LABELS": "No hay etiquetas añadidas a esta conversación."
},
"MUTE_CONTACT": "Mute Conversation",
"MUTED_SUCCESS": "This conversation is muted for 6 hours",
"SEND_TRANSCRIPT": "Send Transcript",
"MUTE_CONTACT": "Silenciar Conversación",
"MUTED_SUCCESS": "Ésta conversación está silenciada por 6 horas",
"SEND_TRANSCRIPT": "Enviar Transcripción",
"EDIT_LABEL": "Editar"
},
"EDIT_CONTACT": {
"BUTTON_LABEL": "Edit Contact",
"TITLE": "Edit contact",
"DESC": "Edit contact details",
"BUTTON_LABEL": "Editar Contacto",
"TITLE": "Editar contacto",
"DESC": "Editar detalles del contacto",
"FORM": {
"SUBMIT": "Enviar",
"CANCEL": "Cancelar",
"AVATAR": {
"LABEL": "Contact Avatar"
"LABEL": "Avatar"
},
"NAME": {
"PLACEHOLDER": "Enter the full name of the contact",
"LABEL": "Full Name"
"PLACEHOLDER": "Escriba el nombre completo del contacto",
"LABEL": "Nombre"
},
"BIO": {
"PLACEHOLDER": "Enter the bio of the contact",
"PLACEHOLDER": "Escriba la bio del contacto",
"LABEL": "Bio"
},
"EMAIL_ADDRESS": {
"PLACEHOLDER": "Enter the email address of the contact",
"PLACEHOLDER": "Escriba la dirección email del contacto",
"LABEL": "Dirección de correo"
},
"PHONE_NUMBER": {
"PLACEHOLDER": "Enter the phone number of the contact",
"LABEL": "Phone Number"
"PLACEHOLDER": "Escriba el número de teléfono del contacto",
"LABEL": "Número telefónico"
},
"LOCATION": {
"PLACEHOLDER": "Enter the location of the contact",
"PLACEHOLDER": "Escriba la ubicación del contacto",
"LABEL": "Ubicación"
},
"COMPANY_NAME": {
"PLACEHOLDER": "Enter the company name",
"LABEL": "Company Name"
"PLACEHOLDER": "Escriba el nombre de la empresa",
"LABEL": "Empresa"
},
"SOCIAL_PROFILES": {
"FACEBOOK": {
"PLACEHOLDER": "Enter the Facebook username",
"PLACEHOLDER": "Escriba el usuario de Facebook",
"LABEL": "Facebook"
},
"TWITTER": {
"PLACEHOLDER": "Enter the Twitter username",
"PLACEHOLDER": "Escriba el usuario de Twitter",
"LABEL": "Twitter"
},
"LINKEDIN": {
"PLACEHOLDER": "Enter the LinkedIn username",
"PLACEHOLDER": "Escriba el usuario de LinkedIn",
"LABEL": "LinkedIn"
},
"GITHUB": {
"PLACEHOLDER": "Enter the Github username",
"PLACEHOLDER": "Escriba el usuario de Github",
"LABEL": "Github"
}
}
},
"SUCCESS_MESSAGE": "Updated contact successfully",
"CONTACT_ALREADY_EXIST": "This email address is in use for another contact.",
"ERROR_MESSAGE": "There was an error updating the contact, please try again"
"SUCCESS_MESSAGE": "El contacto se actualizó",
"CONTACT_ALREADY_EXIST": "Ésta dirección de correo está siendo utilizada por otro contacto.",
"ERROR_MESSAGE": "Se presento un error actualizando el contacto. Por favor inténtelo nuevamente"
}
}

View file

@ -1,19 +1,19 @@
{
"CONVERSATION": {
"404": "Por favor, selecciona una conversación del panel izquierdo",
"NO_MESSAGE_1": "¡Oh oh! Parece que no hay mensajes de los clientes en tu bandeja de entrada.",
"NO_MESSAGE_2": " para enviar un mensaje a tu página!",
"NO_INBOX_1": "¡Hola! Parece que aún no has añadido ninguna bandeja de entrada.",
"404": "Por favor, seleccione una conversación del panel izquierdo",
"NO_MESSAGE_1": "¡Oh oh! Parece que no hay mensajes de los clientes en su bandeja de entrada.",
"NO_MESSAGE_2": " para enviar un mensaje a su página!",
"NO_INBOX_1": "¡Hola! Parece que aún no ha añadido ninguna bandeja de entrada.",
"NO_INBOX_2": " para empezar",
"NO_INBOX_AGENT": Uh Oh! Parece que no eres parte de ninguna bandeja de entrada. Por favor, contacta con tu administrador",
"CLICK_HERE": "Haz clic aquí",
"NO_INBOX_AGENT": Oh Oh! Parece que no es parte de ninguna bandeja de entrada. Por favor, contacte con su administrador",
"CLICK_HERE": "Haga clic aquí",
"LOADING_INBOXES": "Cargando bandeja de entrada",
"LOADING_CONVERSATIONS": "Cargando conversaciones",
"CANNOT_REPLY": "No puedes responder debido a",
"CANNOT_REPLY": "No puede responder debido a",
"24_HOURS_WINDOW": "Restricción de la ventana de mensajes de 24 horas",
"LAST_INCOMING_TWEET": "You are replying to the last incoming tweet",
"REPLYING_TO": "You are replying to:",
"REMOVE_SELECTION": "Remove Selection",
"LAST_INCOMING_TWEET": "Esta respondiendo al último trino",
"REPLYING_TO": "Esta respondiendo a:",
"REMOVE_SELECTION": "Quitar Selección",
"DOWNLOAD": "Descargar",
"HEADER": {
"RESOLVE_ACTION": "Resolver",
@ -23,7 +23,7 @@
"DETAILS": "detalles"
},
"FOOTER": {
"MSG_INPUT": "Shift + enter for new line. Comience con '/' para seleccionar una respuesta predefinida.",
"MSG_INPUT": "Shift + enter para una nueva línea. Comience con '/' para seleccionar una respuesta predefinida.",
"PRIVATE_MSG_INPUT": "Mayús + entrar para una nueva línea. Esto será visible sólo para los agentes"
},
"REPLYBOX": {
@ -31,25 +31,25 @@
"PRIVATE_NOTE": "Nota privada",
"SEND": "Enviar",
"CREATE": "Añadir nota",
"TWEET": "Tweet"
"TWEET": "Trino"
},
"VISIBLE_TO_AGENTS": "Nota privada: solo visible para ti y tu equipo",
"VISIBLE_TO_AGENTS": "Nota privada: solo visible para usted y su equipo",
"CHANGE_STATUS": "Estado de la conversación cambiado",
"CHANGE_AGENT": "Conversación cambiada de asignatario"
},
"EMAIL_TRANSCRIPT": {
"TITLE": "Send conversation transcript",
"DESC": "Send a copy of the conversation transcript to the specified email address",
"TITLE": "Enviar transcripción de la conversación",
"DESC": "Enviar un copia de la transcripción a un dirección de correo especificada",
"SUBMIT": "Enviar",
"CANCEL": "Cancelar",
"SEND_EMAIL_SUCCESS": "The chat transcript was sent successfully",
"SEND_EMAIL_ERROR": "Hubo un error, por favor inténtalo de nuevo",
"SEND_EMAIL_SUCCESS": "La transcripción ha sido enviada",
"SEND_EMAIL_ERROR": "Hubo un error, por favor inténtelo de nuevo",
"FORM": {
"SEND_TO_CONTACT": "Send the transcript to the customer",
"SEND_TO_AGENT": "Send the transcript of the assigned agent",
"SEND_TO_OTHER_EMAIL_ADDRESS": "Send the transcript to another email address",
"SEND_TO_CONTACT": "Enviar la transcripción al cliente",
"SEND_TO_AGENT": "Enviar la transcripción al agente asignado",
"SEND_TO_OTHER_EMAIL_ADDRESS": "Enviar la transcripción a otra dirección de correo",
"EMAIL": {
"PLACEHOLDER": "Enter an email address",
"PLACEHOLDER": "Escriba la dirección de correo",
"ERROR": "Por favor, introduzca una dirección de correo válida"
}
}

View file

@ -4,7 +4,7 @@
"SUBMIT": "Actualizar ajustes",
"BACK": "Atrás",
"UPDATE": {
"ERROR": "No se pudo actualizar la configuración, ¡inténtalo de nuevo!",
"ERROR": "No se pudo actualizar la configuración, ¡inténtelo de nuevo!",
"SUCCESS": "Configuración de cuenta actualizada correctamente"
},
"FORM": {
@ -15,27 +15,27 @@
},
"NAME": {
"LABEL": "Nombre de cuenta",
"PLACEHOLDER": "Tu nombre de cuenta",
"PLACEHOLDER": "Su nombre de cuenta",
"ERROR": "Por favor, introduzca un nombre de cuenta válido"
},
"LANGUAGE": {
"LABEL": "Idioma del sitio (Beta)",
"PLACEHOLDER": "Tu nombre de cuenta",
"PLACEHOLDER": "Su nombre de cuenta",
"ERROR": ""
},
"DOMAIN": {
"LABEL": "Dominio de email entrante",
"PLACEHOLDER": "El dominio donde recibirás los emails",
"PLACEHOLDER": "El dominio donde recibirá los emails",
"ERROR": ""
},
"SUPPORT_EMAIL": {
"LABEL": "Email de soporte",
"PLACEHOLDER": "Email de soporte de tu empresa",
"PLACEHOLDER": "Email de soporte de su empresa",
"ERROR": ""
},
"FEATURES": {
"INBOUND_EMAIL_ENABLED": "Continuidad de la conversación con emails está habilitada para tu cuenta.",
"CUSTOM_EMAIL_DOMAIN_ENABLED": "Ahora puedes recibir emails en tu dominio personalizado."
"INBOUND_EMAIL_ENABLED": "Continuidad de la conversación con emails está habilitada para su cuenta.",
"CUSTOM_EMAIL_DOMAIN_ENABLED": "Ahora puede recibir emails en su dominio personalizado."
}
}
}

View file

@ -1,7 +1,7 @@
{
"INBOX_MGMT": {
"HEADER": "Entradas",
"SIDEBAR_TXT": "<p><b>Bandeja de entrada</b></p> <p> Cuando conectas un sitio web o una página de Facebook a Chatwoot, se llama una <b>Bandeja de entrada</b>. Puedes tener bandejas de entrada ilimitadas en tu cuenta de Chatwoot. </p><p> Haga clic en <b>Añadir bandeja de entrada</b> para conectar un sitio web o una página de Facebook. </p><p> en el panel, puedes ver todas las conversaciones de todas tus bandejas de entrada en un solo lugar y responder a ellas en la pestaña `Conversaciones`. </p><p> También puedes ver conversaciones específicas de una bandeja de entrada haciendo clic en el nombre de la bandeja de entrada en el menú izquierdo del panel. </p>",
"SIDEBAR_TXT": "<p><b>Bandeja de entrada</b></p> <p> Cuando conecta un sitio web o una página de Facebook a Chatwoot, se llama una <b>Bandeja de entrada</b>. Puede tener bandejas de entrada ilimitadas en su cuenta de Chatwoot. </p><p> Haga clic en <b>Añadir bandeja de entrada</b> para conectar un sitio web o una página de Facebook. </p><p> en el panel, puede ver todas las conversaciones de todas su bandejas de entrada en un solo lugar y responder a ellas en la pestaña `Conversaciones`. </p><p> También puede ver conversaciones específicas de una bandeja de entrada haciendo clic en el nombre de la bandeja de entrada en el menú izquierdo del panel. </p>",
"LIST": {
"404": "No hay entradas adjuntas a esta cuenta."
},
@ -14,7 +14,7 @@
{
"title": "Crear bandeja de entrada",
"route": "settings_inboxes_page_channel",
"body": "Autenticar tu cuenta y crear una bandeja de entrada."
"body": "Autenticar su cuenta y crear una bandeja de entrada."
},
{
"title": "Añadir agentes",
@ -29,20 +29,20 @@
],
"ADD": {
"FB": {
"HELP": "PS: Al iniciar sesión, sólo tenemos acceso a los mensajes de tu Página. Tus mensajes privados nunca pueden ser accedidos por Chatwoot.",
"HELP": "PS: Al iniciar sesión, sólo tenemos acceso a los mensajes de su Página. Sus mensajes privados nunca pueden ser accedidos por Chatwoot.",
"CHOOSE_PAGE": "Elegir página",
"CHOOSE_PLACEHOLDER": "Seleccione una página de la lista",
"INBOX_NAME": "Nombre de la bandeja de entrada",
"ADD_NAME": "Añade un nombre para tu bandeja de entrada",
"PICK_NAME": "Elige un nombre para tu bandeja de entrada",
"PICK_A_VALUE": "Elige un valor"
"ADD_NAME": "Añada un nombre para su bandeja de entrada",
"PICK_NAME": "Elija un nombre para su bandeja de entrada",
"PICK_A_VALUE": "Elija un valor"
},
"TWITTER": {
"HELP": "Para añadir tu perfil de Twitter como un canal, necesitas autenticar tu perfil de Twitter haciendo clic en 'Iniciar sesión con Twitter' "
"HELP": "Para añadir su perfil de Twitter como un canal, necesita autenticar su perfil de Twitter haciendo clic en 'Iniciar sesión con Twitter' "
},
"WEBSITE_CHANNEL": {
"TITLE": "Canal del sitio web",
"DESC": "Cree un canal para su sitio web y comience a apoyar a sus clientes a través de nuestro widget de sitio web.",
"DESC": "Cree un canal para su sitio web y comienze a apoyar a sus clientes a través de nuestro widget de sitio web.",
"LOADING_MESSAGE": "Creando Canal de Soporte al Sitio Web",
"CHANNEL_AVATAR": {
"LABEL": "Avatar del canal"
@ -61,7 +61,7 @@
},
"CHANNEL_WELCOME_TAGLINE": {
"LABEL": "Bienvenido Tagline",
"PLACEHOLDER": "Facilitamos la conexión con nosotros. Pídanos cualquier cosa o comparte tus comentarios."
"PLACEHOLDER": "Facilitamos la conexión con nosotros. Pídanos cualquier cosa o comparta sus comentarios."
},
"CHANNEL_GREETING_MESSAGE": {
"LABEL": "Mensaje de bienvenida del canal",
@ -81,10 +81,10 @@
},
"TWILIO": {
"TITLE": "Twilio SMS/Canal de Whatsapp",
"DESC": "Integre Twilio y comience a darle soporte a sus clientes a través de SMS o WhatsApp.",
"DESC": "Integre Twilio y comienze a darle soporte a sus clientes a través de SMS o WhatsApp.",
"ACCOUNT_SID": {
"LABEL": "Cuenta SID",
"PLACEHOLDER": "Introduce tu SID de cuenta de Twilio",
"PLACEHOLDER": "Introduzca su SID de cuenta de Twilio",
"ERROR": "Este campo es obligatorio"
},
"CHANNEL_TYPE": {
@ -104,20 +104,20 @@
"PHONE_NUMBER": {
"LABEL": "Número de teléfono",
"PLACEHOLDER": "Por favor, introduzca el número de teléfono desde el que se enviará el mensaje.",
"ERROR": "Por favor, introduzca un valor válido. El número de teléfono debe comenzar con la firma `+`."
"ERROR": "Por favor, introduzca un valor válido. El número de teléfono debe comenzar con `+`."
},
"API_CALLBACK": {
"TITLE": "URL de devolución de llamada",
"SUBTITLE": "Tienes que configurar la URL de devolución de llamada de mensaje en Twilio con la URL mencionada aquí."
"SUBTITLE": "Tiene que configurar la URL de devolución de llamada de mensaje en Twilio con la URL mencionada aquí."
},
"SUBMIT_BUTTON": "Crear Canal Twilio",
"API": {
"ERROR_MESSAGE": "No pudimos autenticar credenciales de Twilio, por favor inténtalo de nuevo"
"ERROR_MESSAGE": "No pudimos autenticar credenciales de Twilio, por favor inténtelo de nuevo"
}
},
"API_CHANNEL": {
"TITLE": "Canal API",
"DESC": "Integrate with API channel and start supporting your customers.",
"DESC": "Integre con API channel y comienze a dar soporte a sus clientes.",
"CHANNEL_NAME": {
"LABEL": "Nombre del canal",
"PLACEHOLDER": "Por favor, introduzca un nombre de canal",
@ -125,17 +125,17 @@
},
"WEBHOOK_URL": {
"LABEL": "URL de Webhook",
"SUBTITLE": "Configure the URL where you want to recieve callbacks on events.",
"SUBTITLE": "Configure la URL donde recibirá las respuestas a los eventos.",
"PLACEHOLDER": "URL de Webhook"
},
"SUBMIT_BUTTON": "Crear canal de API",
"API": {
"ERROR_MESSAGE": "No pudimos guardar el canal api"
"ERROR_MESSAGE": "No pudimos guardar el canal API"
}
},
"EMAIL_CHANNEL": {
"TITLE": "Canal de Email",
"DESC": "Integrate you email inbox.",
"DESC": "Integre su bandeja de entrada del email.",
"CHANNEL_NAME": {
"LABEL": "Nombre del canal",
"PLACEHOLDER": "Por favor, introduzca un nombre de canal",
@ -143,14 +143,14 @@
},
"EMAIL": {
"LABEL": "E-mail",
"SUBTITLE": "Email donde tus clientes te envían tickets de soporte",
"SUBTITLE": "Email donde sus clientes le envían tickets de soporte",
"PLACEHOLDER": "E-mail"
},
"SUBMIT_BUTTON": "Crear canal de email",
"API": {
"ERROR_MESSAGE": "No pudimos guardar el canal de email"
},
"FINISH_MESSAGE": "Empieza a reenviar tus emails a la siguiente dirección de email."
"FINISH_MESSAGE": "Empieze a reenviar su emails a la siguiente dirección de email."
},
"AUTH": {
"TITLE": "Canales",
@ -158,33 +158,33 @@
},
"AGENTS": {
"TITLE": "Agentes",
"DESC": "Aquí puede agregar agentes para administrar su recién creada bandeja de entrada. Sólo estos agentes seleccionados tendrán acceso a su bandeja de entrada. Los agentes que no forman parte de esta bandeja de entrada no podrán ver o responder a los mensajes de esta bandeja de entrada cuando inicien sesión. <br> <b>PS:</b> Como administrador, si necesita acceso a todas las bandejas, debes añadirte como agente a todas las bandejas de entrada que crees."
"DESC": "Aquí puede agregar agentes para administrar su recién creada bandeja de entrada. Sólo estos agentes seleccionados tendrán acceso a su bandeja de entrada. Los agentes que no forman parte de esta bandeja de entrada no podrán ver o responder a los mensajes de esta bandeja de entrada cuando inicien sesión. <br> <b>PS:</b> Como administrador, si necesita acceso a todas las bandejas, debe añadirze como agente a todas las bandejas de entrada que cree."
},
"DETAILS": {
"TITLE": "Detalles de la bandeja de entrada",
"DESC": "En el menú desplegable de abajo, selecciona la página de Facebook que quieres conectar a Chatwoot. También puede dar un nombre personalizado a su bandeja de entrada para una mejor identificación."
"DESC": "En el menú desplegable de abajo, seleccione la página de Facebook que quiere conectar a Chatwoot. También puede dar un nombre personalizado a su bandeja de entrada para una mejor identificación."
},
"FINISH": {
"TITLE": "¡Se ha clavado!",
"DESC": "Has terminado de integrar correctamente tu página de Facebook con Chatwoot. La próxima vez que un cliente envíe un mensaje a tu Página, la conversación aparecerá automáticamente en tu bandeja de entrada.<br>También le estamos proporcionando un script de widget que puede agregar fácilmente a su sitio web. Una vez que esto está en vivo en tu sitio web, los clientes pueden enviarle mensajes directamente desde su sitio web sin la ayuda de ninguna herramienta externa y la conversación aparecerá aquí, en Chatwoot.<br>¿Genial, eh? Bueno, estamos seguros de que intentaremos ser :)"
"DESC": "Has terminado de integrar correctamente su página de Facebook con Chatwoot. La próxima vez que un cliente envíe un mensaje a su Página, la conversación aparecerá automáticamente en su bandeja de entrada.<br>También le estamos proporcionando un script de widget que puede agregar fácilmente a su sitio web. Una vez que esto esté en vivo en su sitio web, los clientes pueden enviarle mensajes directamente desde su sitio web sin la ayuda de ninguna herramienta externa y la conversación aparecerá aquí, en Chatwoot.<br>¿Genial, eh? Bueno, estamos seguros de que intentaremos serlo :)"
}
},
"DETAILS": {
"LOADING_FB": "Autenticándote con Facebook...",
"ERROR_FB_AUTH": "Algo salió mal, Por favor actualiza la página...",
"CREATING_CHANNEL": "Creando tu bandeja de entrada...",
"ERROR_FB_AUTH": "Algo salió mal, Por favor actualize la página...",
"CREATING_CHANNEL": "Creando su bandeja de entrada...",
"TITLE": "Configurar detalles de la Bandeja de Entrada",
"DESC": ""
},
"AGENTS": {
"BUTTON_TEXT": "Añadir agentes",
"ADD_AGENTS": "Añadiendo agentes a tu bandeja de entrada..."
"ADD_AGENTS": "Añadiendo agentes a su bandeja de entrada..."
},
"FINISH": {
"TITLE": Tu bandeja de entrada está lista!",
"MESSAGE": "Ahora puedes colaborar con tus clientes a través de tu nuevo canal. Feliz soporte ",
"TITLE": Su bandeja de entrada está lista!",
"MESSAGE": "Ahora puede colaborar con sus clientes a través de su nuevo canal. Feliz soporte ",
"BUTTON_TEXT": "Llévame allí",
"WEBSITE_SUCCESS": "Has terminado de crear un canal del sitio web. Copia el código que se muestra a continuación y pégalo en tu sitio web. La próxima vez que un cliente use el chat en vivo, la conversación aparecerá automáticamente en su bandeja de entrada."
"WEBSITE_SUCCESS": "Ha terminado de crear un canal del sitio web. Copie el código que se muestra a continuación y pégelo en su 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."
},
"REAUTH": "Reautorizar",
"VIEW": "Ver",
@ -192,7 +192,7 @@
"API": {
"SUCCESS_MESSAGE": "Configuración de bandeja de entrada actualizada correctamente",
"AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Auto-asignación actualizada correctamente",
"ERROR_MESSAGE": "No se pudo actualizar el color del widget. Inténtalo de nuevo más tarde."
"ERROR_MESSAGE": "No se pudo actualizar el color del widget. Inténtelo de nuevo más tarde."
},
"AUTO_ASSIGNMENT": {
"ENABLED": "Activado",
@ -209,29 +209,29 @@
},
"API": {
"SUCCESS_MESSAGE": "Bandeja de entrada eliminada correctamente",
"ERROR_MESSAGE": "No se pudo eliminar la bandeja de entrada. Inténtalo de nuevo más tarde."
"ERROR_MESSAGE": "No se pudo eliminar la bandeja de entrada. Inténtelo de nuevo más tarde."
}
},
"TABS": {
"SETTINGS": "Ajustes",
"COLLABORATORS": "Collaborators",
"CONFIGURATION": "Configuration"
"COLLABORATORS": "Colaboradores",
"CONFIGURATION": "Configuración"
},
"SETTINGS": "Ajustes",
"FEATURES": {
"LABEL": "Features",
"DISPLAY_FILE_PICKER": "Display file picker on the widget",
"DISPLAY_EMOJI_PICKER": "Display emoji picker on the widget"
"LABEL": "Características",
"DISPLAY_FILE_PICKER": "Mostrar el selector de archivos en el widget",
"DISPLAY_EMOJI_PICKER": "Mostrar el selector de emoji en el widget"
},
"SETTINGS_POPUP": {
"MESSENGER_HEADING": "Script de Messenger",
"MESSENGER_SUB_HEAD": "Coloca este botón dentro de tu etiqueta cuerpo",
"MESSENGER_SUB_HEAD": "Coloque este botón dentro de la etiqueta body",
"INBOX_AGENTS": "Agentes",
"INBOX_AGENTS_SUB_TEXT": "Añadir o quitar agentes de esta bandeja de entrada",
"UPDATE": "Actualizar",
"AUTO_ASSIGNMENT": "Activar asignación automática",
"INBOX_UPDATE_TITLE": "Ajustes de la Bandeja de Entrada",
"INBOX_UPDATE_SUB_TEXT": "Actualizar la configuración de tu bandeja de entrada",
"INBOX_UPDATE_SUB_TEXT": "Actualizar la configuración de su bandeja de entrada",
"AUTO_ASSIGNMENT_SUB_TEXT": "Activar o desactivar la asignación automática de nuevas conversaciones a los agentes añadidos a esta bandeja de entrada."
}
}

View file

@ -6,10 +6,10 @@
"CONFIGURE": "Configurar",
"HEADER": "Configuración de Webhook",
"HEADER_BTN_TXT": "Añadir nuevo webhook",
"INTEGRATION_TXT": "Los eventos Webhook le proporcionan la información en tiempo real sobre lo que está sucediendo en su cuenta de Chatwoot. Puede hacer uso de los webhooks para comunicar los eventos a sus aplicaciones favoritas como Slack o Github. Haga clic en Configurar para configurar sus webhooks.",
"INTEGRATION_TXT": "Los eventos Webhook proporcionan información en tiempo real sobre lo que está sucediendo en su cuenta de Chatwoot. Puede hacer uso de los webhooks para comunicar los eventos a sus aplicaciones favoritas como Slack o Github. Haga clic en Configurar para configurar sus webhooks.",
"LOADING": "Obteniendo webhooks adjuntos",
"SEARCH_404": "No hay elementos que coincidan con esta consulta",
"SIDEBAR_TXT": "<p><b>Webhooks</b> </p> <p>Webhooks son callbacks HTTP que se pueden definir para cada cuenta. Son activados por eventos como la creación de mensajes en Chatwoot. Puede crear más de un webhook para esta cuenta. <br /><br /> Para crear un webhook <b></b>, haga clic en el <b>Añadir un nuevo webhook</b> botón. También puede eliminar cualquier webhook existente haciendo clic en el botón Borrar.</p>",
"SIDEBAR_TXT": "<p><b>Webhooks</b> </p> <p>Webhooks son callbacks HTTP que se pueden definir para cada cuenta. Son activados por eventos como la creación de mensajes en Chatwoot. Puede crear más de un webhook para esta cuenta. <br /><br /> Para crear un webhook <b></b>, Haga clic en el botón <b>Añadir un nuevo webhook</b>. También puede eliminar cualquier webhook existente haciendo clic en el botón Borrar.</p>",
"LIST": {
"404": "No hay webhooks configurados para esta cuenta.",
"TITLE": "Administrar webhooks",
@ -22,7 +22,7 @@
"ADD": {
"CANCEL": "Cancelar",
"TITLE": "Añadir nuevo webhook",
"DESC": "Los eventos Webhook te proporcionan la información en tiempo real sobre lo que está sucediendo en tu cuenta de Chatwoot. Por favor, introduce una URL válida para configurar un callback.",
"DESC": "Los eventos Webhook proporcionan información en tiempo real sobre lo que está sucediendo en su cuenta de Chatwoot. Por favor, introduzca una URL válida para configurar un callback.",
"FORM": {
"END_POINT": {
"LABEL": "URL de Webhook",
@ -33,14 +33,14 @@
},
"API": {
"SUCCESS_MESSAGE": "Webhook añadido correctamente",
"ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtalo de nuevo más tarde"
"ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtelo de nuevo más tarde"
}
},
"DELETE": {
"BUTTON_TEXT": "Eliminar",
"API": {
"SUCCESS_MESSAGE": "Webhook eliminado correctamente",
"ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtalo de nuevo más tarde"
"ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtelo de nuevo más tarde"
},
"CONFIRM": {
"TITLE": "Confirmar eliminación",

View file

@ -4,11 +4,11 @@
"HEADER_BTN_TXT": "Añadir etiqueta",
"LOADING": "Obteniendo etiquetas",
"SEARCH_404": "No hay elementos que coincidan con esta consulta",
"SIDEBAR_TXT": "<p><b>Etiquetas</b> <p>Las etiquetas le ayudan a categorizar las conversaciones y priorizarlas. Puede asignar la etiqueta a una conversación desde el panel latera. <br /><br />Las etiquetas están vinculadas a la cuenta y pueden utilizarse para crear flujos de trabajo personalizados en su organización. Puede asignar un color personalizado a una etiqueta, hace más fácil identificarla. Podrás mostrar la etiqueta en la barra lateral para filtrar las conversaciones fácilmente.</p>",
"SIDEBAR_TXT": "<p><b>Etiquetas</b> <p>Las etiquetas le ayudan a categorizar las conversaciones y priorizarlas. Puede asignar la etiqueta a una conversación desde el panel lateral. <br /><br />Las etiquetas están vinculadas a la cuenta y pueden utilizarse para crear flujos de trabajo personalizados en su organización. Puede asignar un color personalizado a una etiqueta, hace más fácil identificarla. Podrá mostrar la etiqueta en la barra lateral para filtrar las conversaciones fácilmente.</p>",
"LIST": {
"404": "No hay etiquetas disponibles en esta cuenta.",
"TITLE": "Gestionar etiquetas",
"DESC": "Las etiquetas le permiten agrupar las conversaciones.",
"DESC": "Las etiquetas permiten agrupar las conversaciones.",
"TABLE_HEADER": [
"Nombre",
"Descripción",
@ -17,8 +17,8 @@
},
"FORM": {
"NAME": {
"LABEL": "Nombre de etiqueta",
"PLACEHOLDER": "Nombre de etiqueta",
"LABEL": "Nombre de la etiqueta",
"PLACEHOLDER": "Nombre de la etiqueta",
"ERROR": "Nombre de la etiqueta es obligatorio"
},
"DESCRIPTION": {
@ -38,24 +38,24 @@
},
"ADD": {
"TITLE": "Añadir etiqueta",
"DESC": "Las etiquetas le permiten agrupar las conversaciones.",
"DESC": "Las etiquetas permiten agrupar las conversaciones.",
"API": {
"SUCCESS_MESSAGE": "Etiqueta añadida correctamente",
"ERROR_MESSAGE": "Hubo un error, por favor inténtalo de nuevo"
"ERROR_MESSAGE": "Hubo un error, por favor inténtelo de nuevo"
}
},
"EDIT": {
"TITLE": "Editar etiqueta",
"API": {
"SUCCESS_MESSAGE": "Etiqueta actualizada correctamente",
"ERROR_MESSAGE": "Hubo un error, por favor inténtalo de nuevo"
"ERROR_MESSAGE": "Hubo un error, por favor inténtelo de nuevo"
}
},
"DELETE": {
"BUTTON_TEXT": "Eliminar",
"API": {
"SUCCESS_MESSAGE": "Etiqueta actualizada correctamente",
"ERROR_MESSAGE": "Hubo un error, por favor inténtalo de nuevo"
"ERROR_MESSAGE": "Hubo un error, por favor inténtelo de nuevo"
},
"CONFIRM": {
"TITLE": "Confirmar eliminación",

View file

@ -11,10 +11,10 @@
},
"API": {
"SUCCESS_MESSAGE": "Inicio de sesión exitoso",
"ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtalo de nuevo más tarde",
"ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtelo de nuevo más tarde",
"UNAUTH": "Nombre de usuario / Contraseña incorrecto. Inténtelo de nuevo"
},
"FORGOT_PASSWORD": "¿Olvidaste tu contraseña?",
"FORGOT_PASSWORD": "¿Olvidó su contraseña?",
"CREATE_NEW_ACCOUNT": "Crear nueva cuenta",
"SUBMIT": "Iniciar sesión"
}

View file

@ -2,39 +2,33 @@
"REPORT": {
"HEADER": "Informes",
"LOADING_CHART": "Cargando datos del gráfico...",
"NO_ENOUGH_DATA": "No hemos recibido suficientes puntos de datos para generar el informe. Inténtalo de nuevo más tarde.",
"METRICS": [
{
"NO_ENOUGH_DATA": "No hemos recibido suficientes puntos de datos para generar el informe. Inténtelo de nuevo más tarde.",
"METRICS": {
"CONVERSATIONS": {
"NAME": "Conversaciones",
"KEY": "conversations_count",
"DESC": "( Total )"
},
{
"INCOMING_MESSAGES": {
"NAME": "Mensajes entrantes",
"KEY": "incoming_messages_count",
"DESC": "( Total )"
},
{
"OUTGOING_MESSAGES": {
"NAME": "Mensajes salientes",
"KEY": "outgoing_messages_count",
"DESC": "( Total )"
},
{
"FIRST_RESPONSE_TIME": {
"NAME": "Primera respuesta",
"KEY": "avg_first_response_time",
"DESC": "( Media )"
},
{
"RESOLUTION_TIME": {
"NAME": "Tiempo de resolución",
"KEY": "avg_resolution_time",
"DESC": "( Media )"
},
{
"RESOLUTION_COUNT": {
"NAME": "Número de resoluciones",
"KEY": "resolutions_count",
"DESC": "( Total )"
}
],
},
"DATE_RANGE": [
{
"id": 0,

View file

@ -7,8 +7,8 @@
"ERROR": "Por favor ingrese un email válido"
},
"API": {
"SUCCESS_MESSAGE": "El enlace para restablecer la contraseña ha sido enviado a tu correo electrónico",
"ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtalo de nuevo más tarde"
"SUCCESS_MESSAGE": "El enlace para restablecer la contraseña ha sido enviado a su correo electrónico",
"ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtelo de nuevo más tarde"
},
"SUBMIT": "Enviar"
}

View file

@ -13,7 +13,7 @@
},
"API": {
"SUCCESS_MESSAGE": "Contraseña cambiada con éxito",
"ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtalo de nuevo más tarde"
"ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtelo de nuevo más tarde"
},
"SUBMIT": "Enviar"
}

View file

@ -16,15 +16,15 @@
},
"PASSWORD_SECTION": {
"TITLE": "Contraseña",
"NOTE": "Actualizar tu contraseña restablecería tus entradas en varios dispositivos."
"NOTE": "Actualizar su contraseña restablecería sus entradas en varios dispositivos."
},
"ACCESS_TOKEN": {
"TITLE": "Token de acceso",
"NOTE": "Este token puede ser usado si estás construyendo una integración basada en API"
"NOTE": "Este token puede ser usado si está construyendo una integración basada en API"
},
"EMAIL_NOTIFICATIONS_SECTION": {
"TITLE": "Notificaciones por email",
"NOTE": "Actualiza tus preferencias de notificación por correo electrónico aquí",
"NOTE": "Actualize sus preferencias de notificación por correo electrónico aquí",
"CONVERSATION_ASSIGNMENT": "Enviar notificaciones por correo electrónico cuando se me ha asignado una conversación",
"CONVERSATION_CREATION": "Enviar notificaciones por correo electrónico cuando se crea una nueva conversación"
},
@ -34,7 +34,7 @@
},
"PUSH_NOTIFICATIONS_SECTION": {
"TITLE": "Notificaciones push",
"NOTE": "Actualiza tus preferencias de notificaciones push aquí",
"NOTE": "Actualize sus preferencias de notificaciones push aquí",
"CONVERSATION_ASSIGNMENT": "Enviar notificaciones push cuando se me ha asignado una conversación",
"CONVERSATION_CREATION": "Enviar notificaciones push cuando se crea una nueva conversación",
"HAS_ENABLED_PUSH": "Has habilitado notificaciones push para este navegador.",
@ -44,14 +44,14 @@
"LABEL": "Imagen de perfil"
},
"NAME": {
"LABEL": "Tu nombre completo",
"ERROR": "Introduce un nombre válido por favor",
"PLACEHOLDER": "Introduce tu nombre completo por favor"
"LABEL": "Su nombre completo",
"ERROR": "Introduzca un nombre válido por favor",
"PLACEHOLDER": "Introduzca su nombre completo por favor"
},
"DISPLAY_NAME": {
"LABEL": "Nombre a mostrar",
"ERROR": "Introduce un nombre válido por favor",
"PLACEHOLDER": "Introduce un nombre a mostrar por favor, esto se mostrará en las conversaciones"
"ERROR": "Introduzca un nombre válido por favor",
"PLACEHOLDER": "Introduzca un nombre a mostrar por favor, esto se mostrará en las conversaciones"
},
"AVAILABILITY": {
"LABEL": "Disponibilidad",
@ -71,7 +71,7 @@
]
},
"EMAIL": {
"LABEL": "Tu dirección de correo",
"LABEL": "Su dirección de correo",
"ERROR": "Por favor, introduzca una dirección de correo válida",
"PLACEHOLDER": "Por favor, introduzca su dirección de correo electrónico, esto se mostrará en las conversaciones"
},
@ -88,6 +88,7 @@
}
},
"SIDEBAR_ITEMS": {
"CHANGE_AVAILABILITY_STATUS": "Cambiar",
"CHANGE_ACCOUNTS": "Cambiar de cuenta",
"SELECTOR_SUBTITLE": "Seleccione una cuenta de la siguiente lista",
"PROFILE_SETTINGS": "Ajustes del perfil",
@ -134,7 +135,7 @@
"API": {
"SUCCESS_MESSAGE": "Cuenta creada con éxito",
"EXIST_MESSAGE": "La cuenta ya existe",
"ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtalo de nuevo más tarde"
"ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtelo de nuevo más tarde"
},
"FORM": {
"NAME": {

View file

@ -2,10 +2,10 @@
"REGISTER": {
"TRY_WOOT": "Registrar una cuenta",
"TITLE": "Registrarse",
"TERMS_ACCEPT": "Al registrarte, aceptas nuestra <a href=\"https://www.chatwoot.com/terms\">T & C</a> y nuestra <a href=\"https://www.chatwoot.com/privacy-policy\">política de privacidad</a>",
"TERMS_ACCEPT": "Al registrarse, acepta nuestra <a href=\"https://www.chatwoot.com/terms\">T & C</a> y nuestra <a href=\"https://www.chatwoot.com/privacy-policy\">política de privacidad</a>",
"ACCOUNT_NAME": {
"LABEL": "Nombre de cuenta",
"PLACEHOLDER": "Empresas de Wayne",
"PLACEHOLDER": "Empresas Wayne",
"ERROR": "El nombre de la cuenta es demasiado corto"
},
"EMAIL": {
@ -25,7 +25,7 @@
},
"API": {
"SUCCESS_MESSAGE": "Registro Exitoso",
"ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtalo de nuevo más tarde"
"ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtelo de nuevo más tarde"
},
"SUBMIT": "Enviar"
}

View file

@ -4,16 +4,10 @@
"HEADER_BTN_TXT": "اضافه کردن اپراتور",
"LOADING": "دریافت لیست اپراتورها",
"SIDEBAR_TXT": "<p><b>اپراتورها</b></p> <p> یک <b>اپراتور</b> یکی از اعضای تیم پشتیبانی است. </p><p> اپراتورها می‌توانند پیام‌های کاربران را ببینند و به آن‌ها پاسخ بدهند. این لیست حاوی تمام اپراتورهایی است که در حساب شما تعریف شده اند. </p><p> با زدن روی دکمه <b>اضافه کردن اپراتور</b> می‌توانید یک اپراتور جدید معرفی کنید. به ایمیل اپراتوری که معرفی می‌کنید یک دعوتنامه ارسال می‌شود که بعد از پذیرفتن آن اپراتور می‌تواند به پیام‌های کاربران پاسخ بدهد. </p><p> بسته به سطح دسترسی تعیین شده یک اپراتور می‌تواند به بخش‌های مشخصی از اکانت دسترسی پیدا کند </p><p> <b>اپراتور</b> - اپراتورهایی که این نقش را داشته باشند تنها می‌توانند به صندوق‌های ورودی، گزارشات و گفتگوها دسترسی داشته باشند. آن‌ها می‌توانند یک مکالمه را به اپراتور دیگر یا خودشان تخصیص دهند و یا یک مکالمه را حل شده اعلام کنند.</p><p> <b>مدیر</b> - مدیران می‌توانند علاوه بر تمام بخش‌هایی که یک اپراتور دسترسی دارد، به تمام بخش‌هایی که در حساب کاربری شما وجود دارد دسترسی داشته باشند.</p>",
"AGENT_TYPES": [
{
"name": "administrator",
"label": "مدیر"
},
{
"name": "agent",
"label": "اپراتور"
}
],
"AGENT_TYPES": {
"ADMINISTRATOR": "مدیر",
"AGENT": "اپراتور"
},
"LIST": {
"404": "در حال حاضر هیچ اپراتوری برای این حساب معرفی نشده است.",
"TITLE": "مدیریت اپراتورها",

View file

@ -3,38 +3,32 @@
"HEADER": "گزارشات",
"LOADING_CHART": "در حال دریافت اطلاعات...",
"NO_ENOUGH_DATA": "متاسفانه اطلاعات کافی دریافت نشد، لطفا بعدا دوباره امتحان کنید",
"METRICS": [
{
"METRICS": {
"CONVERSATIONS": {
"NAME": "گفتگوها",
"KEY": "conversations_count",
"DESC": "( جمع کل )"
},
{
"INCOMING_MESSAGES": {
"NAME": "پیام‌های ورودی",
"KEY": "incoming_messages_count",
"DESC": "( جمع کل )"
},
{
"OUTGOING_MESSAGES": {
"NAME": "پیام‌های خروجی",
"KEY": "outgoing_messages_count",
"DESC": "( جمع کل )"
},
{
"FIRST_RESPONSE_TIME": {
"NAME": "زمان تا اولین پاسخ",
"KEY": "avg_first_response_time",
"DESC": "( میانگین )"
},
{
"RESOLUTION_TIME": {
"NAME": "زمان تا حل شدن مساله",
"KEY": "avg_resolution_time",
"DESC": "( میانگین )"
},
{
"RESOLUTION_COUNT": {
"NAME": "تعداد مسائل حل شده",
"KEY": "resolutions_count",
"DESC": "( جمع کل )"
}
],
},
"DATE_RANGE": [
{
"id": 0,

View file

@ -88,6 +88,7 @@
}
},
"SIDEBAR_ITEMS": {
"CHANGE_AVAILABILITY_STATUS": "عوض شدن",
"CHANGE_ACCOUNTS": "سوییچ به یک حساب دیگر",
"SELECTOR_SUBTITLE": "از لیست یکی از حساب‌ها را انتخاب کنید",
"PROFILE_SETTINGS": "تنظیمات پروفایل",

View file

@ -4,16 +4,10 @@
"HEADER_BTN_TXT": "Add Agent",
"LOADING": "Fetching Agent List",
"SIDEBAR_TXT": "<p><b>Agents</b></p> <p> An <b>Agent</b> is a member of your Customer Support team. </p><p> Agents will be able to view and reply to messages from your users. The list shows all agents currently in your account. </p><p> Click on <b>Add Agent</b> to add a new agent. Agent you add will receive an email with a confirmation link to activate their account, after which they can access Chatwoot and respond to messages. </p><p> Access to Chatwoot's features are based on following roles. </p><p> <b>Agent</b> - Agents with this role can only access inboxes, reports and conversations. They can assign conversations to other agents or themselves and resolve conversations.</p><p> <b>Administrator</b> - Administrator will have access to all Chatwoot features enabled for your account, including settings, along with all of a normal agents' privileges.</p>",
"AGENT_TYPES": [
{
"name": "administrator",
"label": "Administrator"
},
{
"name": "agent",
"label": "Agent"
}
],
"AGENT_TYPES": {
"ADMINISTRATOR": "Administrator",
"AGENT": "Agent"
},
"LIST": {
"404": "There are no agents associated to this account",
"TITLE": "Manage agents in your team",

View file

@ -3,38 +3,32 @@
"HEADER": "Reports",
"LOADING_CHART": "Loading chart data...",
"NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
"METRICS": [
{
"METRICS": {
"CONVERSATIONS": {
"NAME": "Conversations",
"KEY": "conversations_count",
"DESC": "( Total )"
},
{
"INCOMING_MESSAGES": {
"NAME": "Incoming Messages",
"KEY": "incoming_messages_count",
"DESC": "( Total )"
},
{
"OUTGOING_MESSAGES": {
"NAME": "Outgoing Messages",
"KEY": "outgoing_messages_count",
"DESC": "( Total )"
},
{
"FIRST_RESPONSE_TIME": {
"NAME": "First response time",
"KEY": "avg_first_response_time",
"DESC": "( Avg )"
},
{
"RESOLUTION_TIME": {
"NAME": "Resolution Time",
"KEY": "avg_resolution_time",
"DESC": "( Avg )"
},
{
"RESOLUTION_COUNT": {
"NAME": "Resolution Count",
"KEY": "resolutions_count",
"DESC": "( Total )"
}
],
},
"DATE_RANGE": [
{
"id": 0,

View file

@ -88,6 +88,7 @@
}
},
"SIDEBAR_ITEMS": {
"CHANGE_AVAILABILITY_STATUS": "Change",
"CHANGE_ACCOUNTS": "Switch Account",
"SELECTOR_SUBTITLE": "Select an account from the following list",
"PROFILE_SETTINGS": "Profile Settings",

View file

@ -4,16 +4,10 @@
"HEADER_BTN_TXT": "Ajouter un agent",
"LOADING": "Récupération de la liste des agents",
"SIDEBAR_TXT": "<p><b>Agents</b></p> <p> Un <b>agent</b> est un membre de votre équipe d'assistance clientèle. </p><p> Les agents pourront voir et répondre aux messages de vos utilisateurs. La liste montre tous les agents actuellement dans votre compte. </p><p> Cliquez sur <b>Ajouter un agent</b> pour ajouter un nouvel agent. L'agent que vous ajoutez recevra un courriel avec un lien de confirmation pour activer son compte, après quoi il pourra accéder à Chatwoot et répondre aux messages. </p><p> L'accès aux fonctionnalités de Chatwoot est basé sur les rôles suivants. </p><p> <b>Agent</b> - Les agents ayant ce rôle ne peuvent accéder qu'aux boîtes de réception, aux rapports et aux conversations. Ils peuvent assigner des conversations à d'autres agents ou eux-mêmes et résoudre des conversations.</p><p> <b>Administrateur</b> - Administrateur aura accès à toutes les fonctionnalités de Chatwoot activées pour votre compte, y compris les paramètres, ainsi que tous les privilèges d'un agent normal.</p>",
"AGENT_TYPES": [
{
"name": "administrateur",
"label": "Administrateur"
},
{
"name": "agent",
"label": "Agent"
}
],
"AGENT_TYPES": {
"ADMINISTRATOR": "Administrateur",
"AGENT": "Agent"
},
"LIST": {
"404": "Il n'y a aucun agent associé à ce compte",
"TITLE": "Gérer les agents de votre équipe",

View file

@ -3,38 +3,32 @@
"HEADER": "Rapports",
"LOADING_CHART": "Chargement des données du graphique ...",
"NO_ENOUGH_DATA": "Nous n'avons pas reçu assez de points de données pour générer un rapport. Veuillez réessayer plus tard.",
"METRICS": [
{
"METRICS": {
"CONVERSATIONS": {
"NAME": "Conversations",
"KEY": "conversations_count",
"DESC": "(Total)"
},
{
"INCOMING_MESSAGES": {
"NAME": "Messages entrants",
"KEY": "incoming_messages_count",
"DESC": "(Total)"
},
{
"OUTGOING_MESSAGES": {
"NAME": "Messages sortants",
"KEY": "outgoing_messages_count",
"DESC": "(Total)"
},
{
"FIRST_RESPONSE_TIME": {
"NAME": "Délai de la première réponse",
"KEY": "avg_first_response_time",
"DESC": "(Moy.)"
},
{
"RESOLUTION_TIME": {
"NAME": "Temps de résolution",
"KEY": "avg_resolution_time",
"DESC": "(Moy.)"
},
{
"RESOLUTION_COUNT": {
"NAME": "Nombre de résolutions",
"KEY": "resolutions_count",
"DESC": "(Total)"
}
],
},
"DATE_RANGE": [
{
"id": 0,

View file

@ -88,6 +88,7 @@
}
},
"SIDEBAR_ITEMS": {
"CHANGE_AVAILABILITY_STATUS": "Changer",
"CHANGE_ACCOUNTS": "Changer de compte",
"SELECTOR_SUBTITLE": "Sélectionnez un compte dans la liste suivante",
"PROFILE_SETTINGS": "Paramètres de profil",

View file

@ -4,16 +4,10 @@
"HEADER_BTN_TXT": "Add Agent",
"LOADING": "Fetching Agent List",
"SIDEBAR_TXT": "<p><b>Agents</b></p> <p> An <b>Agent</b> is a member of your Customer Support team. </p><p> Agents will be able to view and reply to messages from your users. The list shows all agents currently in your account. </p><p> Click on <b>Add Agent</b> to add a new agent. Agent you add will receive an email with a confirmation link to activate their account, after which they can access Chatwoot and respond to messages. </p><p> Access to Chatwoot's features are based on following roles. </p><p> <b>Agent</b> - Agents with this role can only access inboxes, reports and conversations. They can assign conversations to other agents or themselves and resolve conversations.</p><p> <b>Administrator</b> - Administrator will have access to all Chatwoot features enabled for your account, including settings, along with all of a normal agents' privileges.</p>",
"AGENT_TYPES": [
{
"name": "administrator",
"label": "Administrator"
},
{
"name": "agent",
"label": "Agent"
}
],
"AGENT_TYPES": {
"ADMINISTRATOR": "Administrator",
"AGENT": "Agent"
},
"LIST": {
"404": "There are no agents associated to this account",
"TITLE": "Manage agents in your team",

View file

@ -3,38 +3,32 @@
"HEADER": "Reports",
"LOADING_CHART": "Loading chart data...",
"NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
"METRICS": [
{
"METRICS": {
"CONVERSATIONS": {
"NAME": "Conversations",
"KEY": "conversations_count",
"DESC": "( Total )"
},
{
"INCOMING_MESSAGES": {
"NAME": "Incoming Messages",
"KEY": "incoming_messages_count",
"DESC": "( Total )"
},
{
"OUTGOING_MESSAGES": {
"NAME": "Outgoing Messages",
"KEY": "outgoing_messages_count",
"DESC": "( Total )"
},
{
"FIRST_RESPONSE_TIME": {
"NAME": "First response time",
"KEY": "avg_first_response_time",
"DESC": "( Avg )"
},
{
"RESOLUTION_TIME": {
"NAME": "Resolution Time",
"KEY": "avg_resolution_time",
"DESC": "( Avg )"
},
{
"RESOLUTION_COUNT": {
"NAME": "Resolution Count",
"KEY": "resolutions_count",
"DESC": "( Total )"
}
],
},
"DATE_RANGE": [
{
"id": 0,

View file

@ -88,6 +88,7 @@
}
},
"SIDEBAR_ITEMS": {
"CHANGE_AVAILABILITY_STATUS": "Change",
"CHANGE_ACCOUNTS": "Switch Account",
"SELECTOR_SUBTITLE": "Select an account from the following list",
"PROFILE_SETTINGS": "Profile Settings",

View file

@ -4,16 +4,10 @@
"HEADER_BTN_TXT": "Add Agent",
"LOADING": "Fetching Agent List",
"SIDEBAR_TXT": "<p><b>Agents</b></p> <p> An <b>Agent</b> is a member of your Customer Support team. </p><p> Agents will be able to view and reply to messages from your users. The list shows all agents currently in your account. </p><p> Click on <b>Add Agent</b> to add a new agent. Agent you add will receive an email with a confirmation link to activate their account, after which they can access Chatwoot and respond to messages. </p><p> Access to Chatwoot's features are based on following roles. </p><p> <b>Agent</b> - Agents with this role can only access inboxes, reports and conversations. They can assign conversations to other agents or themselves and resolve conversations.</p><p> <b>Administrator</b> - Administrator will have access to all Chatwoot features enabled for your account, including settings, along with all of a normal agents' privileges.</p>",
"AGENT_TYPES": [
{
"name": "administrator",
"label": "Administrator"
},
{
"name": "agent",
"label": "Agent"
}
],
"AGENT_TYPES": {
"ADMINISTRATOR": "Administrator",
"AGENT": "Agent"
},
"LIST": {
"404": "There are no agents associated to this account",
"TITLE": "Manage agents in your team",

View file

@ -3,38 +3,32 @@
"HEADER": "Reports",
"LOADING_CHART": "Loading chart data...",
"NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
"METRICS": [
{
"METRICS": {
"CONVERSATIONS": {
"NAME": "Conversations",
"KEY": "conversations_count",
"DESC": "( Total )"
},
{
"INCOMING_MESSAGES": {
"NAME": "Incoming Messages",
"KEY": "incoming_messages_count",
"DESC": "( Total )"
},
{
"OUTGOING_MESSAGES": {
"NAME": "Outgoing Messages",
"KEY": "outgoing_messages_count",
"DESC": "( Total )"
},
{
"FIRST_RESPONSE_TIME": {
"NAME": "First response time",
"KEY": "avg_first_response_time",
"DESC": "( Avg )"
},
{
"RESOLUTION_TIME": {
"NAME": "Resolution Time",
"KEY": "avg_resolution_time",
"DESC": "( Avg )"
},
{
"RESOLUTION_COUNT": {
"NAME": "Resolution Count",
"KEY": "resolutions_count",
"DESC": "( Total )"
}
],
},
"DATE_RANGE": [
{
"id": 0,

View file

@ -88,6 +88,7 @@
}
},
"SIDEBAR_ITEMS": {
"CHANGE_AVAILABILITY_STATUS": "Change",
"CHANGE_ACCOUNTS": "Switch Account",
"SELECTOR_SUBTITLE": "Select an account from the following list",
"PROFILE_SETTINGS": "Profile Settings",

View file

@ -4,16 +4,10 @@
"HEADER_BTN_TXT": "Aggiungi Agente",
"LOADING": "Recupero elenco Operatori",
"SIDEBAR_TXT": "<p><b>Agenti</b></p> <p> Un <b>agente</b> è membro del tuo team di assistenza clienti. </p><p> Gli agenti saranno in grado di visualizzare e rispondere ai messaggi dei tuoi utenti. L'elenco mostra tutti gli agenti attualmente presenti nel tuo account. </p><p> Clicca su <b>Aggiungi agente</b> per aggiungere un nuovo agente. Ogni agente che aggiungi riceverà un'email con un link di conferma per attivare il loro account, dopo di che possono accedere a Chatwoot e rispondere ai messaggi. </p><p> L'accesso alle funzionalità di Chatwoot si basa sui seguenti ruoli. </p><p> <b>Agente</b> - Gli agenti con questo ruolo possono accedere solo a messaggi, report e conversazioni. Possono assegnare conversazioni ad altri agenti o a se stessi e risolvere le conversazioni.</p><p> <b>Amministratore</b> - L'amministratore avrà accesso a tutte le funzionalità di Chatwoot abilitate per il tuo account, comprese le impostazioni, insieme a tutti i privilegi di un agente normale.</p>",
"AGENT_TYPES": [
{
"name": "amministratore",
"label": "Amministratore"
},
{
"name": "agente",
"label": "Agente"
}
],
"AGENT_TYPES": {
"ADMINISTRATOR": "Amministratore",
"AGENT": "Agente"
},
"LIST": {
"404": "Non ci sono agenti associati a questo account",
"TITLE": "Gestisci gli agenti nel tuo team",

View file

@ -3,38 +3,32 @@
"HEADER": "Segnalazioni",
"LOADING_CHART": "Caricamento dati grafici...",
"NO_ENOUGH_DATA": "Non abbiamo ricevuto abbastanza dati per generare la segnalazione, riprova più tardi.",
"METRICS": [
{
"METRICS": {
"CONVERSATIONS": {
"NAME": "Conversazioni",
"KEY": "Conteggio",
"DESC": "(Totale )"
},
{
"INCOMING_MESSAGES": {
"NAME": "Messaggi in arrivo",
"KEY": "in entrata_conto_messaggi",
"DESC": "(Totale )"
},
{
"OUTGOING_MESSAGES": {
"NAME": "Messaggi in uscita",
"KEY": "conto_messaggi",
"DESC": "(Totale )"
},
{
"FIRST_RESPONSE_TIME": {
"NAME": "Tempo di prima risposta",
"KEY": "orario_risposta",
"DESC": "( Media )"
},
{
"RESOLUTION_TIME": {
"NAME": "Risoluzione Tempo",
"KEY": "tempo_risoluzione",
"DESC": "( Media )"
},
{
"RESOLUTION_COUNT": {
"NAME": "Conteggio risoluzioni",
"KEY": "risoluzioni_conteggio",
"DESC": "(Totale )"
}
],
},
"DATE_RANGE": [
{
"id": 0,

View file

@ -88,6 +88,7 @@
}
},
"SIDEBAR_ITEMS": {
"CHANGE_AVAILABILITY_STATUS": "Cambia",
"CHANGE_ACCOUNTS": "Cambia Profilo/Account",
"SELECTOR_SUBTITLE": "Seleziona un account dal seguente elenco",
"PROFILE_SETTINGS": "Impostazioni profilo",

View file

@ -4,16 +4,10 @@
"HEADER_BTN_TXT": "Add Agent",
"LOADING": "Fetching Agent List",
"SIDEBAR_TXT": "<p><b>Agents</b></p> <p> An <b>Agent</b> is a member of your Customer Support team. </p><p> Agents will be able to view and reply to messages from your users. The list shows all agents currently in your account. </p><p> Click on <b>Add Agent</b> to add a new agent. Agent you add will receive an email with a confirmation link to activate their account, after which they can access Chatwoot and respond to messages. </p><p> Access to Chatwoot's features are based on following roles. </p><p> <b>Agent</b> - Agents with this role can only access inboxes, reports and conversations. They can assign conversations to other agents or themselves and resolve conversations.</p><p> <b>Administrator</b> - Administrator will have access to all Chatwoot features enabled for your account, including settings, along with all of a normal agents' privileges.</p>",
"AGENT_TYPES": [
{
"name": "administrator",
"label": "Administrator"
},
{
"name": "agent",
"label": "Agent"
}
],
"AGENT_TYPES": {
"ADMINISTRATOR": "Administrator",
"AGENT": "Agent"
},
"LIST": {
"404": "There are no agents associated to this account",
"TITLE": "Manage agents in your team",

View file

@ -3,38 +3,32 @@
"HEADER": "Reports",
"LOADING_CHART": "Loading chart data...",
"NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
"METRICS": [
{
"METRICS": {
"CONVERSATIONS": {
"NAME": "Conversations",
"KEY": "conversations_count",
"DESC": "( Total )"
},
{
"INCOMING_MESSAGES": {
"NAME": "Incoming Messages",
"KEY": "incoming_messages_count",
"DESC": "( Total )"
},
{
"OUTGOING_MESSAGES": {
"NAME": "Outgoing Messages",
"KEY": "outgoing_messages_count",
"DESC": "( Total )"
},
{
"FIRST_RESPONSE_TIME": {
"NAME": "First response time",
"KEY": "avg_first_response_time",
"DESC": "( Avg )"
},
{
"RESOLUTION_TIME": {
"NAME": "Resolution Time",
"KEY": "avg_resolution_time",
"DESC": "( Avg )"
},
{
"RESOLUTION_COUNT": {
"NAME": "Resolution Count",
"KEY": "resolutions_count",
"DESC": "( Total )"
}
],
},
"DATE_RANGE": [
{
"id": 0,

Some files were not shown because too many files have changed in this diff Show more