Compare commits

..
583 changed files with 18147 additions and 23867 deletions
-65
View File
@@ -1,65 +0,0 @@
---
:position: before
:position_in_additional_file_patterns: before
:position_in_class: before
:position_in_factory: before
:position_in_fixture: before
:position_in_routes: before
:position_in_serializer: before
:position_in_test: before
:classified_sort: true
:exclude_controllers: true
:exclude_factories: true
:exclude_fixtures: true
:exclude_helpers: true
:exclude_scaffolds: true
:exclude_serializers: true
:exclude_sti_subclasses: false
:exclude_tests: true
:force: false
:format_markdown: false
:format_rdoc: false
:format_yard: false
:frozen: false
:grouped_polymorphic: false
:ignore_model_sub_dir: false
:ignore_unknown_models: false
:include_version: false
:show_check_constraints: false
:show_complete_foreign_keys: false
:show_foreign_keys: true
:show_indexes: true
:show_indexes_include: false
:simple_indexes: false
:sort: false
:timestamp: false
:trace: false
:with_comment: true
:with_column_comments: true
:with_table_comments: true
:position_of_column_comment: :with_name
:active_admin: false
:command:
:debug: false
:hide_default_column_types: json,jsonb,hstore
:hide_limit_column_types: integer,bigint,boolean
:timestamp_columns:
- created_at
- updated_at
:ignore_columns:
:ignore_routes:
:models: true
:routes: false
:skip_on_db_migrate: false
:target_action: :do_annotations
:wrapper:
:wrapper_close:
:wrapper_open:
:classes_default_to_s: []
:additional_file_patterns: []
:model_dir:
- app/models
- enterprise/app/models
:require: []
:root_dir:
- ''
-5
View File
@@ -2,8 +2,3 @@
ignore:
- CVE-2021-41098 # https://github.com/chatwoot/chatwoot/issues/3097 (update once azure blob storage is updated)
- GHSA-57hq-95w6-v4fc # Devise confirmable race condition — patched locally in User model (remove once on Devise 5+)
# Chatwoot defaults to Active Storage redirect-style URLs, and its recommended
# storage setup uses local/cloud storage with optional direct uploads to the
# storage provider rather than Rails proxy mode. Revisit if we enable
# rails_storage_proxy or other app-served Active Storage proxy routes.
- CVE-2026-33658
-2
View File
@@ -40,8 +40,6 @@ gem 'json_refs'
gem 'rack-attack', '>= 6.7.0'
# a utility tool for streaming, flexible and safe downloading of remote files
gem 'down'
# SSRF-safe URL fetching
gem 'ssrf_filter', '~> 1.5'
# authentication type to fetch and send mail over oauth2.0
gem 'gmail_xoauth'
# Lock net-smtp to 0.3.4 to avoid issues with gmail_xoauth2
-2
View File
@@ -942,7 +942,6 @@ GEM
activesupport (>= 5.2)
sprockets (>= 3.0.0)
squasher (0.7.2)
ssrf_filter (1.5.0)
stackprof (0.2.25)
statsd-ruby (1.5.0)
stripe (18.0.1)
@@ -1159,7 +1158,6 @@ DEPENDENCIES
spring
spring-watcher-listen
squasher
ssrf_filter (~> 1.5)
stackprof
stripe (~> 18.0)
telephone_number
+1 -1
View File
@@ -1 +1 @@
4.12.1
4.12.0
+4 -2
View File
@@ -1,6 +1,4 @@
class Email::BaseBuilder
include EmailAddressParseable
pattr_initialize [:inbox!]
private
@@ -49,4 +47,8 @@ class Email::BaseBuilder
# can save it in the format "Name <email@domain.com>"
parse_email(account.support_email)
end
def parse_email(email_string)
Mail::Address.new(email_string).address
end
end
@@ -34,10 +34,6 @@ class Api::V1::Accounts::AgentBotsController < Api::V1::Accounts::BaseController
@agent_bot.reload
end
def reset_secret
@agent_bot.reset_secret!
end
private
def agent_bot
@@ -116,8 +116,6 @@ class Api::V1::Accounts::ConversationsController < Api::V1::Accounts::BaseContro
# High-traffic accounts generate excessive DB writes when agents frequently switch between conversations.
# Throttle last_seen updates to once per hour when there are no unread messages to reduce DB load.
# Always update immediately if there are unread messages to maintain accurate read/unread state.
# Visiting a conversation should clear any unread inbox notifications for this conversation.
Notification::MarkConversationReadService.new(user: Current.user, account: Current.account, conversation: @conversation).perform
return update_last_seen_on_conversation(DateTime.now.utc, true) if assignee? && @conversation.assignee_unread_messages.any?
return update_last_seen_on_conversation(DateTime.now.utc, false) if !assignee? && @conversation.unread_messages.any?
@@ -66,12 +66,6 @@ class Api::V1::Accounts::InboxesController < Api::V1::Accounts::BaseController
head :ok
end
def reset_secret
return head :not_found unless @inbox.api?
@inbox.channel.reset_secret!
end
def destroy
::DeleteObjectJob.perform_later(@inbox, Current.user, request.ip) if @inbox.present?
render status: :ok, json: { message: I18n.t('messages.inbox_deletetion_response') }
@@ -5,7 +5,7 @@ class Api::V1::Accounts::UploadController < Api::V1::Accounts::BaseController
elsif params[:external_url].present?
create_from_url
else
render_error(I18n.t('errors.upload.missing_input'), :unprocessable_entity)
render_error('No file or URL provided', :unprocessable_entity)
end
render_success(result) if result.is_a?(ActiveStorage::Blob)
@@ -19,21 +19,35 @@ class Api::V1::Accounts::UploadController < Api::V1::Accounts::BaseController
end
def create_from_url
SafeFetch.fetch(params[:external_url].to_s) do |result|
create_and_save_blob(result.tempfile, result.filename, result.content_type)
uri = parse_uri(params[:external_url])
return if performed?
fetch_and_process_file_from_uri(uri)
end
def parse_uri(url)
uri = URI.parse(url)
validate_uri(uri)
uri
rescue URI::InvalidURIError, SocketError
render_error('Invalid URL provided', :unprocessable_entity)
nil
end
def validate_uri(uri)
raise URI::InvalidURIError unless uri.is_a?(URI::HTTP) || uri.is_a?(URI::HTTPS)
end
def fetch_and_process_file_from_uri(uri)
uri.open do |file|
create_and_save_blob(file, File.basename(uri.path), file.content_type)
end
rescue SafeFetch::HttpError => e
render_error(I18n.t('errors.upload.fetch_failed_with_message', message: e.message), :unprocessable_entity)
rescue SafeFetch::FetchError
render_error(I18n.t('errors.upload.fetch_failed'), :unprocessable_entity)
rescue SafeFetch::FileTooLargeError
render_error(I18n.t('errors.upload.file_too_large'), :unprocessable_entity)
rescue SafeFetch::UnsupportedContentTypeError
render_error(I18n.t('errors.upload.unsupported_content_type'), :unprocessable_entity)
rescue SafeFetch::Error
render_error(I18n.t('errors.upload.invalid_url'), :unprocessable_entity)
rescue OpenURI::HTTPError => e
render_error("Failed to fetch file from URL: #{e.message}", :unprocessable_entity)
rescue SocketError
render_error('Invalid URL provided', :unprocessable_entity)
rescue StandardError
render_error(I18n.t('errors.upload.unexpected'), :internal_server_error)
render_error('An unexpected error occurred', :internal_server_error)
end
def create_and_save_blob(io, filename, content_type)
+2 -32
View File
@@ -30,20 +30,9 @@ class Api::V1::AccountsController < Api::BaseController
locale: account_params[:locale],
user: current_user
).perform
enqueue_branding_enrichment
if @user
# Authenticated users (dashboard "add account") and api_only signups
# need the full response with account_id. API-only deployments have no
# frontend to handle the email confirmation flow, so they need auth
# tokens to proceed.
# Unauthenticated web signup returns only the email — no session is
# created until the user confirms via the email link.
if current_user || api_only_signup?
send_auth_headers(@user)
render 'api/v1/accounts/create', format: :json, locals: { resource: @user }
else
render json: { email: @user.email }
end
send_auth_headers(@user)
render 'api/v1/accounts/create', format: :json, locals: { resource: @user }
else
render_error_response(CustomExceptions::Account::SignupFailed.new({}))
end
@@ -70,16 +59,6 @@ class Api::V1::AccountsController < Api::BaseController
private
def enqueue_branding_enrichment
return if account_params[:email].blank?
Account::BrandingEnrichmentJob.perform_later(@account.id, account_params[:email])
Redis::Alfred.set(format(Redis::Alfred::ACCOUNT_ONBOARDING_ENRICHMENT, account_id: @account.id), '1', ex: 30)
rescue StandardError => e
# Enrichment is optional — never let queue/Redis failures abort signup
ChatwootExceptionTracker.new(e).capture_exception
end
def ensure_account_name
# ensure that account_name and user_full_name is present
# this is becuase the account builder and the models validations are not triggered
@@ -124,15 +103,6 @@ class Api::V1::AccountsController < Api::BaseController
raise ActionController::RoutingError, 'Not Found' unless GlobalConfigService.account_signup_enabled?
end
def api_only_signup?
# CW_API_ONLY_SERVER is the canonical flag for API-only deployments.
# ENABLE_ACCOUNT_SIGNUP='api_only' is a legacy sentinel for the same purpose.
# Read ENABLE_ACCOUNT_SIGNUP raw from InstallationConfig because GlobalConfig.get
# typecasts it to boolean, coercing 'api_only' to true.
ActiveModel::Type::Boolean.new.cast(ENV.fetch('CW_API_ONLY_SERVER', false)) ||
InstallationConfig.find_by(name: 'ENABLE_ACCOUNT_SIGNUP')&.value.to_s == 'api_only'
end
def validate_captcha
raise ActionController::InvalidAuthenticityToken, 'Invalid Captcha' unless ChatwootCaptcha.new(params[:h_captcha_client_response]).valid?
end
@@ -43,15 +43,7 @@ class Api::V1::Widget::MessagesController < Api::V1::Widget::BaseController
end
def set_conversation
return unless conversation.nil?
@conversation = create_conversation
apply_labels if permitted_params[:labels].present?
end
def apply_labels
valid_labels = inbox.account.labels.where(title: permitted_params[:labels]).pluck(:title)
@conversation.update_labels(valid_labels) if valid_labels.present?
@conversation = create_conversation if conversation.nil?
end
def message_finder_params
@@ -72,14 +64,7 @@ class Api::V1::Widget::MessagesController < Api::V1::Widget::BaseController
def permitted_params
# timestamp parameter is used in create conversation method
# custom_attributes and labels are applied when a new conversation is created alongside the first message
params.permit(
:id, :before, :after, :website_token,
contact: [:name, :email],
message: [:content, :referer_url, :timestamp, :echo_id, :reply_to],
custom_attributes: {},
labels: []
)
params.permit(:id, :before, :after, :website_token, contact: [:name, :email], message: [:content, :referer_url, :timestamp, :echo_id, :reply_to])
end
def set_message
@@ -1,18 +0,0 @@
# Unauthenticated endpoint for resending confirmation emails during signup.
# This is a standalone controller (not on DeviseOverrides::ConfirmationsController)
# because OmniAuth middleware intercepts all POST /auth/* routes as provider
# callbacks, and Devise controller filters cause 307 redirects for custom actions.
# Inherits from ActionController::API to avoid both issues entirely.
# Rate-limited by Rack::Attack (IP + email) and gated by hCaptcha.
class Auth::ResendConfirmationsController < ActionController::API
def create
return head(:ok) unless ChatwootCaptcha.new(params[:h_captcha_client_response]).valid?
email = params[:email]
return head(:ok) unless email.is_a?(String)
user = User.from_email(email.strip.downcase)
user&.send_confirmation_instructions unless user&.confirmed?
head :ok
end
end
@@ -10,12 +10,7 @@ class DeviseOverrides::OmniauthCallbacksController < DeviseTokenAuth::OmniauthCa
private
def sign_in_user
# Capture before skip_confirmation! sets confirmed_at, which would
# make oauth_user_needs_password_reset? return false and skip the
# password reset for persisted unconfirmed users.
needs_password_reset = oauth_user_needs_password_reset?
@resource.skip_confirmation! if confirmable_enabled?
set_random_password_if_oauth_user if needs_password_reset
# once the resource is found and verified
# we can just send them to the login page again with the SSO params
@@ -25,10 +20,7 @@ class DeviseOverrides::OmniauthCallbacksController < DeviseTokenAuth::OmniauthCa
end
def sign_in_user_on_mobile
# See comment in sign_in_user for why this is captured before skip_confirmation!
needs_password_reset = oauth_user_needs_password_reset?
@resource.skip_confirmation! if confirmable_enabled?
set_random_password_if_oauth_user if needs_password_reset
# once the resource is found and verified
# we can just send them to the login page again with the SSO params
@@ -45,7 +37,6 @@ class DeviseOverrides::OmniauthCallbacksController < DeviseTokenAuth::OmniauthCa
return redirect_to login_page_url(error: 'business-account-only') unless validate_signup_email_is_business_domain?
create_account_for_user
set_random_password_if_oauth_user
token = @resource.send(:set_reset_password_token)
frontend_url = ENV.fetch('FRONTEND_URL', nil)
redirect_to "#{frontend_url}/app/auth/password/edit?config=default&reset_password_token=#{token}"
@@ -90,15 +81,6 @@ class DeviseOverrides::OmniauthCallbacksController < DeviseTokenAuth::OmniauthCa
Avatar::AvatarFromUrlJob.perform_later(@resource, auth_hash['info']['image'])
end
def oauth_user_needs_password_reset?
@resource.present? && (@resource.new_record? || !@resource.confirmed?)
end
def set_random_password_if_oauth_user
# Password must satisfy secure_password requirements (uppercase, lowercase, number, special char)
@resource.update(password: "#{SecureRandom.hex(16)}aA1!") if @resource.persisted?
end
def default_devise_mapping
'user'
end
@@ -1,101 +0,0 @@
class Platform::Api::V1::EmailChannelMigrationsController < PlatformController
before_action :set_account
before_action :validate_account_permissible
before_action :validate_feature_flag
before_action :validate_params
def create
results = migrate_email_channels
render json: { results: results }, status: :ok
end
private
def set_account
@account = Account.find(params[:account_id])
end
def validate_account_permissible
return if @platform_app.platform_app_permissibles.find_by(permissible: @account)
render json: { error: 'Non permissible resource' }, status: :unauthorized
end
def validate_feature_flag
return if ActiveModel::Type::Boolean.new.cast(ENV.fetch('EMAIL_CHANNEL_MIGRATION', false))
render json: { error: 'Email channel migration is not enabled' }, status: :forbidden
end
def validate_params
return render json: { error: 'Missing migrations parameter' }, status: :unprocessable_entity if migration_params.blank?
return unless migration_params.size > MAX_MIGRATIONS
return render json: { error: "Too many migrations (max #{MAX_MIGRATIONS})" },
status: :unprocessable_entity
end
def migrate_email_channels
migration_params.map { |entry| migrate_single(entry) }
end
MAX_MIGRATIONS = 25
SUPPORTED_PROVIDERS = %w[google microsoft].freeze
def migrate_single(entry)
validate_provider!(entry[:provider])
ActiveRecord::Base.transaction do
channel = create_channel(entry)
inbox = create_inbox(channel, entry)
{ email: entry[:email], inbox_id: inbox.id, channel_id: channel.id, status: 'success' }
end
rescue StandardError => e
{ email: entry[:email], status: 'error', message: e.message }
end
def create_channel(entry)
Channel::Email.create!(
account_id: @account.id,
email: entry[:email],
provider: entry[:provider],
provider_config: entry[:provider_config]&.to_h,
imap_enabled: entry.fetch(:imap_enabled, true),
imap_address: entry[:imap_address] || default_imap_address(entry[:provider]),
imap_port: entry[:imap_port] || 993,
imap_login: entry[:imap_login] || entry[:email],
imap_enable_ssl: entry.fetch(:imap_enable_ssl, true)
)
end
def create_inbox(channel, entry)
@account.inboxes.create!(
name: entry[:inbox_name] || "Migrated #{entry[:provider]&.capitalize}: #{entry[:email]}",
channel: channel
)
end
def validate_provider!(provider)
return if SUPPORTED_PROVIDERS.include?(provider)
raise ArgumentError, "Unsupported provider '#{provider}'. Must be one of: #{SUPPORTED_PROVIDERS.join(', ')}"
end
def default_imap_address(provider)
case provider
when 'google' then 'imap.gmail.com'
when 'microsoft' then 'outlook.office365.com'
else ''
end
end
def migration_params
params.permit(migrations: [
:email, :provider, :inbox_name,
:imap_enabled, :imap_address, :imap_port, :imap_login, :imap_enable_ssl,
{ provider_config: {} }
])[:migrations]
end
end
@@ -1,7 +1,6 @@
class Public::Api::V1::Portals::ArticlesController < Public::Api::V1::Portals::BaseController
before_action :ensure_custom_domain_request, only: [:show, :index]
before_action :portal
before_action :ensure_portal_feature_enabled
before_action :set_category, except: [:index, :show, :tracking_pixel]
before_action :set_article, only: [:show]
layout 'portal'
@@ -62,7 +61,7 @@ class Public::Api::V1::Portals::ArticlesController < Public::Api::V1::Portals::B
def set_article
@article = @portal.articles.find_by(slug: permitted_params[:article_slug])
@parsed_content = render_article_content(@article.content.to_s)
@parsed_content = render_article_content(@article.content)
end
def set_category
@@ -1,7 +1,6 @@
class Public::Api::V1::Portals::CategoriesController < Public::Api::V1::Portals::BaseController
before_action :ensure_custom_domain_request, only: [:show, :index]
before_action :portal
before_action :ensure_portal_feature_enabled
before_action :set_category, only: [:show]
layout 'portal'
@@ -1,8 +1,7 @@
class Public::Api::V1::PortalsController < Public::Api::V1::Portals::BaseController
before_action :ensure_custom_domain_request, only: [:show]
before_action :redirect_to_portal_with_locale, only: [:show]
before_action :portal
before_action :ensure_portal_feature_enabled
before_action :redirect_to_portal_with_locale, only: [:show]
layout 'portal'
def show
@@ -25,7 +24,6 @@ class Public::Api::V1::PortalsController < Public::Api::V1::Portals::BaseControl
def redirect_to_portal_with_locale
return if params[:locale].present?
portal
redirect_to "/hc/#{@portal.slug}/#{@portal.default_locale}"
end
end
-7
View File
@@ -18,11 +18,4 @@ class PublicController < ActionController::Base
Please send us an email at support@chatwoot.com with the custom domain name and account API key"
}, status: :unauthorized and return
end
def ensure_portal_feature_enabled
return unless ChatwootApp.chatwoot_cloud?
return if @portal.account.feature_enabled?('help_center')
render 'public/api/v1/portals/not_active', status: :payment_required
end
end
+1 -3
View File
@@ -98,9 +98,7 @@ export default {
mql.onchange = e => setColorTheme(e.matches);
},
setLocale(locale) {
if (locale) {
this.$root.$i18n.locale = locale;
}
this.$root.$i18n.locale = locale;
},
async initializeAccount() {
await this.$store.dispatch('accounts/get');
@@ -25,10 +25,6 @@ class AgentBotsAPI extends ApiClient {
resetAccessToken(botId) {
return axios.post(`${this.url}/${botId}/reset_access_token`);
}
resetSecret(botId) {
return axios.post(`${this.url}/${botId}/reset_secret`);
}
}
export default new AgentBotsAPI();
@@ -31,12 +31,6 @@ class CaptainCustomTools extends ApiClient {
delete(id) {
return axios.delete(`${this.url}/${id}`);
}
test(data = {}) {
return axios.post(`${this.url}/test`, {
custom_tool: data,
});
}
}
export default new CaptainCustomTools();
-4
View File
@@ -48,10 +48,6 @@ class Inboxes extends CacheEnabledApiClient {
template,
});
}
resetSecret(inboxId) {
return axios.post(`${this.url}/${inboxId}/reset_secret`);
}
}
export default new Inboxes();
@@ -106,10 +106,6 @@ select {
&[disabled] {
@apply field-disabled;
}
option:not(:disabled) {
@apply bg-n-solid-2 text-n-slate-12;
}
}
// Textarea
@@ -20,11 +20,11 @@ const excludedLabels = defineModel('excludedLabels', {
const excludeOlderThanMinutes = defineModel('excludeOlderThanMinutes', {
type: Number,
default: null,
default: 10,
});
// Duration limits: 1 minute to 999 days (in minutes)
const MIN_DURATION_MINUTES = 1;
// Duration limits: 10 minutes to 999 days (in minutes)
const MIN_DURATION_MINUTES = 10;
const MAX_DURATION_MINUTES = 1438560; // 999 days * 24 hours * 60 minutes
const { t } = useI18n();
@@ -27,7 +27,7 @@ const { t } = useI18n();
const BASE_KEY = 'ASSIGNMENT_POLICY.AGENT_CAPACITY_POLICY';
const DEFAULT_CONVERSATION_LIMIT = 10;
const MIN_CONVERSATION_LIMIT = 0;
const MIN_CONVERSATION_LIMIT = 1;
const MAX_CONVERSATION_LIMIT = 100000;
const selectedInboxIds = computed(
@@ -42,7 +42,6 @@ const availableInboxes = computed(() =>
const isLimitValid = limit => {
return (
Number.isInteger(limit.conversationLimit) &&
limit.conversationLimit >= MIN_CONVERSATION_LIMIT &&
limit.conversationLimit <= MAX_CONVERSATION_LIMIT
);
@@ -1,63 +1,207 @@
<script setup>
import { computed } from 'vue';
import { useI18n } from 'vue-i18n';
import { CONVERSATION_PRIORITY } from 'shared/constants/messages';
import Icon from 'dashboard/components-next/icon/Icon.vue';
const props = defineProps({
defineProps({
priority: {
type: String,
default: '',
},
showEmpty: {
type: Boolean,
default: false,
},
});
const { t } = useI18n();
const icons = {
[CONVERSATION_PRIORITY.URGENT]: 'i-woot-priority-urgent',
[CONVERSATION_PRIORITY.HIGH]: 'i-woot-priority-high',
[CONVERSATION_PRIORITY.MEDIUM]: 'i-woot-priority-medium',
[CONVERSATION_PRIORITY.LOW]: 'i-woot-priority-low',
};
const priorityLabels = {
[CONVERSATION_PRIORITY.URGENT]: 'CONVERSATION.PRIORITY.OPTIONS.URGENT',
[CONVERSATION_PRIORITY.HIGH]: 'CONVERSATION.PRIORITY.OPTIONS.HIGH',
[CONVERSATION_PRIORITY.MEDIUM]: 'CONVERSATION.PRIORITY.OPTIONS.MEDIUM',
[CONVERSATION_PRIORITY.LOW]: 'CONVERSATION.PRIORITY.OPTIONS.LOW',
};
const iconName = computed(() => {
if (props.priority && icons[props.priority]) {
return icons[props.priority];
}
return props.showEmpty ? 'i-woot-priority-empty' : '';
});
const tooltipContent = computed(() => {
if (props.priority && priorityLabels[props.priority]) {
return t(priorityLabels[props.priority]);
}
if (props.showEmpty) {
return t('CONVERSATION.PRIORITY.OPTIONS.NONE');
}
return '';
});
</script>
<!-- eslint-disable vue/no-static-inline-styles -->
<template>
<Icon
v-tooltip.top="{
content: tooltipContent,
delay: { show: 500, hide: 0 },
}"
:icon="iconName"
class="size-4 text-n-slate-5"
/>
<div class="inline-flex items-center justify-center rounded-md">
<!-- Low Priority -->
<svg
v-if="priority === CONVERSATION_PRIORITY.LOW"
width="20"
height="20"
viewBox="0 0 20 20"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<mask
id="mask0_2030_12879"
style="mask-type: alpha"
maskUnits="userSpaceOnUse"
x="0"
y="0"
width="20"
height="20"
>
<rect width="20" height="20" fill="#D9D9D9" />
</mask>
<g mask="url(#mask0_2030_12879)">
<rect
x="3.33301"
y="10"
width="3.33333"
height="6.66667"
rx="1.66667"
class="fill-n-amber-9"
/>
<rect
x="8.33301"
y="6.6665"
width="3.33333"
height="10"
rx="1.66667"
class="fill-n-slate-6"
/>
<rect
x="13.333"
y="3.3335"
width="3.33333"
height="13.3333"
rx="1.66667"
class="fill-n-slate-6"
/>
</g>
</svg>
<!-- Medium Priority -->
<svg
v-if="priority === CONVERSATION_PRIORITY.MEDIUM"
width="20"
height="20"
viewBox="0 0 20 20"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<mask
id="mask0_2030_12879"
style="mask-type: alpha"
maskUnits="userSpaceOnUse"
x="0"
y="0"
width="20"
height="20"
>
<rect width="20" height="20" fill="#D9D9D9" />
</mask>
<g mask="url(#mask0_2030_12879)">
<rect
x="3.33301"
y="10"
width="3.33333"
height="6.66667"
rx="1.66667"
class="fill-n-amber-9"
/>
<rect
x="8.33301"
y="6.6665"
width="3.33333"
height="10"
rx="1.66667"
class="fill-n-amber-9"
/>
<rect
x="13.333"
y="3.3335"
width="3.33333"
height="13.3333"
rx="1.66667"
class="fill-n-slate-6"
/>
</g>
</svg>
<!-- High Priority -->
<svg
v-if="priority === CONVERSATION_PRIORITY.HIGH"
width="20"
height="20"
viewBox="0 0 20 20"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<mask
id="mask0_2030_12879"
style="mask-type: alpha"
maskUnits="userSpaceOnUse"
x="0"
y="0"
width="20"
height="20"
>
<rect width="20" height="20" fill="#D9D9D9" />
</mask>
<g mask="url(#mask0_2030_12879)">
<rect
x="3.33301"
y="10"
width="3.33333"
height="6.66667"
rx="1.66667"
class="fill-n-amber-9"
/>
<rect
x="8.33301"
y="6.6665"
width="3.33333"
height="10"
rx="1.66667"
class="fill-n-amber-9"
/>
<rect
x="13.333"
y="3.3335"
width="3.33333"
height="13.3333"
rx="1.66667"
class="fill-n-amber-9"
/>
</g>
</svg>
<!-- Urgent Priority -->
<svg
v-if="priority === CONVERSATION_PRIORITY.URGENT"
width="20"
height="20"
viewBox="0 0 20 20"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<mask
id="mask0_2030_12879"
style="mask-type: alpha"
maskUnits="userSpaceOnUse"
x="0"
y="0"
width="20"
height="20"
>
<rect width="20" height="20" fill="#D9D9D9" />
</mask>
<g mask="url(#mask0_2030_12879)">
<rect
x="3.33301"
y="10"
width="3.33333"
height="6.66667"
rx="1.66667"
class="fill-n-ruby-9"
/>
<rect
x="8.33301"
y="6.6665"
width="3.33333"
height="10"
rx="1.66667"
class="fill-n-ruby-9"
/>
<rect
x="13.333"
y="3.3335"
width="3.33333"
height="13.3333"
rx="1.66667"
class="fill-n-ruby-9"
/>
</g>
</svg>
</div>
</template>
@@ -1,5 +1,5 @@
<script setup>
import { computed, ref } from 'vue';
import { computed } from 'vue';
import { debounce } from '@chatwoot/utils';
import { useI18n } from 'vue-i18n';
import { ARTICLE_EDITOR_MENU_OPTIONS } from 'dashboard/constants/editor';
@@ -32,7 +32,6 @@ const emit = defineEmits([
'setAuthor',
'setCategory',
'previewArticle',
'createArticle',
]);
const { t } = useI18n();
@@ -58,10 +57,16 @@ const quickSave = debounce(
// Only use to save for existing articles
const saveAndSyncDebounced = debounce(saveAndSync, 2500, false);
// Debounced save for new articles
const quickSaveNewArticle = debounce(saveAndSync, 400, false);
const handleSave = value => {
if (isNewArticle.value) return;
quickSave(value);
saveAndSyncDebounced(value);
if (isNewArticle.value) {
quickSaveNewArticle(value);
} else {
quickSave(value);
saveAndSyncDebounced(value);
}
};
const articleTitle = computed({
@@ -71,12 +76,9 @@ const articleTitle = computed({
},
});
const localContent = ref(props.article.content || '');
const articleContent = computed({
get: () => props.article.content,
set: content => {
localContent.value = content;
handleSave({ content });
},
});
@@ -96,14 +98,6 @@ const setCategoryId = categoryId => {
const previewArticle = () => {
emit('previewArticle');
};
const handleCreateArticle = event => {
if (!isNewArticle.value) return;
const title = event?.target?.value || '';
if (title.trim()) {
emit('createArticle', { title, content: localContent.value });
}
};
</script>
<template>
@@ -128,7 +122,6 @@ const handleCreateArticle = event => {
custom-text-area-wrapper-class="border-0 !bg-transparent dark:!bg-transparent !py-0 !px-0"
placeholder="Title"
autofocus
@blur="handleCreateArticle"
/>
<ArticleEditorControls
:article="article"
@@ -12,7 +12,6 @@ import {
import CardLayout from 'dashboard/components-next/CardLayout.vue';
import DropdownMenu from 'dashboard/components-next/dropdown-menu/DropdownMenu.vue';
import Button from 'dashboard/components-next/button/Button.vue';
import Checkbox from 'dashboard/components-next/checkbox/Checkbox.vue';
const props = defineProps({
id: {
@@ -35,34 +34,14 @@ const props = defineProps({
type: Number,
required: true,
},
isSelected: {
type: Boolean,
default: false,
},
selectable: {
type: Boolean,
default: false,
},
showSelectionControl: {
type: Boolean,
default: false,
},
showMenu: {
type: Boolean,
default: true,
},
});
const emit = defineEmits(['action', 'select', 'hover']);
const emit = defineEmits(['action']);
const { checkPermissions } = usePolicy();
const { t } = useI18n();
const [showActionsDropdown, toggleDropdown] = useToggle();
const modelValue = computed({
get: () => props.isSelected,
set: () => emit('select', props.id),
});
const menuItems = computed(() => {
const allOptions = [
@@ -100,23 +79,12 @@ const handleAction = ({ action, value }) => {
</script>
<template>
<CardLayout
:selectable="selectable"
class="relative"
@mouseenter="emit('hover', true)"
@mouseleave="emit('hover', false)"
>
<div
v-show="showSelectionControl"
class="absolute top-7 ltr:left-3 rtl:right-3"
>
<Checkbox v-model="modelValue" />
</div>
<CardLayout>
<div class="flex gap-1 justify-between w-full">
<span class="text-base text-n-slate-12 line-clamp-1">
{{ name }}
</span>
<div v-if="showMenu" class="flex gap-2 items-center">
<div class="flex gap-2 items-center">
<div
v-on-clickaway="() => toggleDropdown(false)"
class="flex relative items-center group"
@@ -21,22 +21,16 @@ const emit = defineEmits(['deleteSuccess']);
const { t } = useI18n();
const store = useStore();
const bulkDeleteDialogRef = ref(null);
const i18nKey = computed(() => {
const i18nTypeMap = {
AssistantResponse: 'RESPONSES',
AssistantDocument: 'DOCUMENTS',
};
return i18nTypeMap[props.type];
});
const i18nKey = computed(() => props.type.toUpperCase());
const handleBulkDelete = async ids => {
if (!ids) return;
try {
await store.dispatch('captainBulkActions/handleBulkDelete', {
ids: Array.from(props.bulkIds),
type: props.type,
});
await store.dispatch(
'captainBulkActions/handleBulkDelete',
Array.from(props.bulkIds)
);
emit('deleteSuccess');
useAlert(t(`CAPTAIN.${i18nKey.value}.BULK_DELETE.SUCCESS_MESSAGE`));
@@ -6,13 +6,6 @@ import { useAccount } from 'dashboard/composables/useAccount';
import BasePaywallModal from 'dashboard/routes/dashboard/settings/components/BasePaywallModal.vue';
defineProps({
featurePrefix: {
type: String,
default: 'CAPTAIN',
},
});
const router = useRouter();
const currentUser = useMapGetter('getCurrentUser');
@@ -38,7 +31,7 @@ const openBilling = () => {
>
<BasePaywallModal
class="mx-auto"
:feature-prefix="featurePrefix"
feature-prefix="CAPTAIN"
:i18n-key="i18nKey"
:is-super-admin="isSuperAdmin"
:is-on-chatwoot-cloud="isOnChatwootCloud"
@@ -101,9 +101,12 @@ const authTypeLabel = computed(() => {
</Policy>
</div>
</div>
<div class="flex items-center justify-between w-full gap-4 min-w-0">
<div class="flex items-center gap-3 flex-1 min-w-0">
<span v-if="description" class="text-sm truncate text-n-slate-11">
<div class="flex items-center justify-between w-full gap-4">
<div class="flex items-center gap-3 flex-1">
<span
v-if="description"
class="text-sm truncate text-n-slate-11 flex-1"
>
{{ description }}
</span>
<span
@@ -1,10 +1,9 @@
<script setup>
import { reactive, computed, ref, useTemplateRef, watch } from 'vue';
import { reactive, computed, useTemplateRef, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import { useVuelidate } from '@vuelidate/core';
import { required, maxLength } from '@vuelidate/validators';
import { required } from '@vuelidate/validators';
import { useMapGetter } from 'dashboard/composables/store';
import CustomToolsAPI from 'dashboard/api/captain/customTools';
import Input from 'dashboard/components-next/input/Input.vue';
import TextArea from 'dashboard/components-next/textarea/TextArea.vue';
@@ -73,12 +72,8 @@ const DEFAULT_PARAM = {
required: false,
};
// OpenAI enforces a 64-char limit on function names. The backend slug is
// "custom_" (7 chars) + parameterized title, so cap the title conservatively.
const MAX_TOOL_NAME_LENGTH = 55;
const validationRules = {
title: { required, maxLength: maxLength(MAX_TOOL_NAME_LENGTH) },
title: { required },
endpoint_url: { required },
http_method: { required },
auth_type: { required },
@@ -108,15 +103,9 @@ const isLoading = computed(() =>
);
const getErrorMessage = (field, errorKey) => {
if (!v$.value[field].$error) return '';
const failedRule = v$.value[field].$errors[0]?.$validator;
if (failedRule === 'maxLength') {
return t(`CAPTAIN.CUSTOM_TOOLS.FORM.${errorKey}.MAX_LENGTH_ERROR`, {
max: MAX_TOOL_NAME_LENGTH,
});
}
return t(`CAPTAIN.CUSTOM_TOOLS.FORM.${errorKey}.ERROR`);
return v$.value[field].$error
? t(`CAPTAIN.CUSTOM_TOOLS.FORM.${errorKey}.ERROR`)
: '';
};
const formErrors = computed(() => ({
@@ -151,30 +140,6 @@ const handleSubmit = async () => {
emit('submit', state);
};
const isTesting = ref(false);
const testResult = ref(null);
const isTestDisabled = computed(
() => state.endpoint_url.includes('{{') || !!state.request_template
);
const handleTest = async () => {
if (!state.endpoint_url) return;
isTesting.value = true;
testResult.value = null;
try {
const { data } = await CustomToolsAPI.test(state);
const isOk = data.status >= 200 && data.status < 300;
testResult.value = { success: isOk, status: data.status };
} catch (e) {
const message =
e.response?.data?.error || t('CAPTAIN.CUSTOM_TOOLS.TEST.ERROR');
testResult.value = { success: false, message };
} finally {
isTesting.value = false;
}
};
</script>
<template>
@@ -283,45 +248,6 @@ const handleTest = async () => {
class="[&_textarea]:font-mono"
/>
<div class="flex flex-col gap-2">
<Button
type="button"
variant="faded"
color="slate"
icon="i-lucide-play"
:label="t('CAPTAIN.CUSTOM_TOOLS.TEST.BUTTON')"
:is-loading="isTesting"
:disabled="isTesting || !state.endpoint_url || isTestDisabled"
@click="handleTest"
/>
<p v-if="isTestDisabled" class="text-xs text-n-slate-11">
{{ t('CAPTAIN.CUSTOM_TOOLS.TEST.DISABLED_HINT') }}
</p>
<div
v-if="testResult"
class="flex items-center gap-2 px-3 py-2 text-xs rounded-lg"
:class="
testResult.success
? 'bg-n-teal-2 text-n-teal-11'
: 'bg-n-ruby-2 text-n-ruby-11'
"
>
<span
:class="
testResult.success ? 'i-lucide-check-circle' : 'i-lucide-x-circle'
"
class="size-3.5 shrink-0"
/>
{{
testResult.status
? t('CAPTAIN.CUSTOM_TOOLS.TEST.SUCCESS', {
status: testResult.status,
})
: testResult.message
}}
</div>
</div>
<div class="flex gap-3 justify-between items-center w-full">
<Button
type="button"
@@ -1,11 +1,8 @@
<script setup>
import { useAccount } from 'dashboard/composables/useAccount';
import EmptyStateLayout from 'dashboard/components-next/EmptyStateLayout.vue';
import FeatureSpotlight from 'dashboard/components-next/feature-spotlight/FeatureSpotlight.vue';
import Button from 'dashboard/components-next/button/Button.vue';
const emit = defineEmits(['click']);
const { isOnChatwootCloud } = useAccount();
const onClick = () => {
emit('click');
@@ -13,15 +10,6 @@ const onClick = () => {
</script>
<template>
<FeatureSpotlight
:title="$t('CAPTAIN.CUSTOM_TOOLS.EMPTY_STATE.FEATURE_SPOTLIGHT.TITLE')"
:note="$t('CAPTAIN.CUSTOM_TOOLS.EMPTY_STATE.FEATURE_SPOTLIGHT.NOTE')"
fallback-thumbnail="/assets/images/dashboard/captain/assistant-light.svg"
fallback-thumbnail-dark="/assets/images/dashboard/captain/assistant-dark.svg"
learn-more-url="https://chwt.app/hc/captain-tools"
class="mb-8"
:hide-actions="!isOnChatwootCloud"
/>
<EmptyStateLayout
:title="$t('CAPTAIN.CUSTOM_TOOLS.EMPTY_STATE.TITLE')"
:subtitle="$t('CAPTAIN.CUSTOM_TOOLS.EMPTY_STATE.SUBTITLE')"
@@ -32,7 +32,6 @@ const convertToMinutes = newValue => {
const transformedValue = computed({
get() {
if (duration.value == null) return null;
if (unit.value === DURATION_UNITS.MINUTES) return duration.value;
if (unit.value === DURATION_UNITS.HOURS)
return Math.floor(duration.value / 60);
@@ -42,10 +41,6 @@ const transformedValue = computed({
return 0;
},
set(newValue) {
if (newValue == null || newValue === '') {
duration.value = null;
return;
}
let minuteValue = convertToMinutes(newValue);
duration.value = Math.min(Math.max(minuteValue, props.min), props.max);
@@ -58,7 +53,6 @@ const transformedValue = computed({
// this might create some confusion, especially when saving
// this watcher fixes it by rounding the duration basically, to the nearest unit value
watch(unit, () => {
if (duration.value == null) return;
let adjustedValue = convertToMinutes(transformedValue.value);
duration.value = Math.min(Math.max(adjustedValue, props.min), props.max);
});
@@ -226,10 +226,4 @@ const handleSeeOriginal = () => {
}
}
}
// Email clients (Gmail, Outlook) hardcode dir="ltr" on wrapper elements.
// In RTL apps this forces email content LTR regardless of actual text.
[dir='rtl'] .letter-render [dir='ltr'] {
direction: inherit;
}
</style>
@@ -0,0 +1,216 @@
import { ref } from 'vue';
import { mount } from '@vue/test-utils';
import VoiceCallBubble from './VoiceCall.vue';
import { MESSAGE_TYPES, VOICE_CALL_STATUS } from '../constants';
let messageContext;
let joinCallMock;
let endCallMock;
let conversationsById;
let activeCall;
let hasActiveCall;
let isJoining;
vi.mock('../provider.js', () => ({
useMessageContext: () => messageContext,
}));
vi.mock('dashboard/composables/useCallSession', () => ({
useCallSession: () => ({
activeCall,
hasActiveCall,
isJoining,
joinCall: joinCallMock,
endCall: endCallMock,
}),
}));
vi.mock('vuex', () => ({
useStore: () => ({
getters: {
getConversationById: id => conversationsById[id] || null,
},
}),
}));
vi.mock('vue-i18n', () => ({
useI18n: () => ({
t: (key, params = {}) => {
const translations = {
'CONVERSATION.VOICE_CALL.CALL_IN_PROGRESS': 'Call in progress',
'CONVERSATION.VOICE_CALL.AGENT_ANSWERED': `${params.agentName} answered`,
'CONVERSATION.VOICE_CALL.YOU_ANSWERED': 'You answered',
'CONVERSATION.VOICE_CALL.THEY_ANSWERED': 'They answered',
'CONVERSATION.VOICE_CALL.NOT_ANSWERED_YET': 'Not answered yet',
'CONVERSATION.VOICE_CALL.CALL_ENDED': 'Call ended',
'CONVERSATION.VOICE_CALL.NO_ANSWER': 'No answer',
'CONVERSATION.VOICE_CALL.JOIN_CALL': 'Join call',
'CONVERSATION.VOICE_CALL.REJOIN_CALL': 'Rejoin call',
};
return translations[key] || key;
},
}),
}));
const mountComponent = () =>
mount(VoiceCallBubble, {
global: {
stubs: {
BaseBubble: {
template: '<div><slot /></div>',
},
Icon: true,
AudioChip: {
props: ['attachment'],
template:
'<div data-test-id="audio-chip">{{ attachment.dataUrl }}</div>',
},
},
mocks: {
$t: key => key,
},
},
});
describe('VoiceCall.vue', () => {
beforeEach(() => {
joinCallMock = vi.fn().mockResolvedValue({ conferenceSid: 'CF123' });
endCallMock = vi.fn().mockResolvedValue();
conversationsById = {
12: {
id: 12,
inbox_id: 3,
meta: {
assignee: null,
},
},
};
activeCall = ref(null);
hasActiveCall = ref(false);
isJoining = ref(false);
messageContext = {
contentAttributes: ref({
data: {
status: VOICE_CALL_STATUS.IN_PROGRESS,
call_sid: 'CALL123',
meta: {},
},
}),
attachments: ref([]),
conversationId: ref(12),
currentUserId: ref(1),
inboxId: ref(3),
messageType: ref(MESSAGE_TYPES.INCOMING),
};
});
it('shows the answering agent name when another agent answers the call', () => {
messageContext.contentAttributes.value.data.meta.joinedBy = {
id: 2,
name: 'Ben',
};
const wrapper = mountComponent();
expect(wrapper.text()).toContain('Ben answered');
});
it('shows "You answered" when the current user answered the call', () => {
messageContext.contentAttributes.value.data.meta.joinedBy = {
id: 1,
name: 'John',
};
const wrapper = mountComponent();
expect(wrapper.text()).toContain('You answered');
});
it('shows the formatted duration when a call has ended', () => {
messageContext.contentAttributes.value.data.status =
VOICE_CALL_STATUS.COMPLETED;
messageContext.contentAttributes.value.data.meta.duration = 133;
const wrapper = mountComponent();
expect(wrapper.text()).toContain('Call ended');
expect(wrapper.text()).toContain('02:13');
});
it('renders the recording attachment on the voice call message', () => {
messageContext.attachments.value = [
{
id: 1,
fileType: 'audio',
dataUrl: 'https://example.com/recording.mp3',
},
];
const wrapper = mountComponent();
expect(wrapper.find('[data-test-id="audio-chip"]').exists()).toBe(true);
expect(wrapper.text()).toContain('https://example.com/recording.mp3');
});
it('shows a rejoin action for an in-progress call when not already connected', async () => {
const wrapper = mountComponent();
await wrapper.find('[data-test-id="voice-call-join"]').trigger('click');
expect(joinCallMock).toHaveBeenCalledWith({
conversationId: 12,
inboxId: 3,
callSid: 'CALL123',
});
expect(wrapper.text()).toContain('Rejoin call');
});
it('joins the call after refresh when the payload is camel-cased', async () => {
messageContext.contentAttributes.value.data = {
status: VOICE_CALL_STATUS.IN_PROGRESS,
callSid: 'CALL456',
meta: {},
};
const wrapper = mountComponent();
await wrapper.find('[data-test-id="voice-call-join"]').trigger('click');
expect(joinCallMock).toHaveBeenCalledWith({
conversationId: 12,
inboxId: 3,
callSid: 'CALL456',
});
expect(wrapper.text()).toContain('Rejoin call');
});
it('hides the rejoin action when the agent is already on the same call', async () => {
activeCall.value = {
callSid: 'CALL123',
conversationId: 12,
};
hasActiveCall.value = true;
const wrapper = mountComponent();
const joinButton = wrapper.find('[data-test-id="voice-call-join"]');
await joinButton.trigger('click');
expect(joinButton.attributes('disabled')).toBeDefined();
expect(joinCallMock).not.toHaveBeenCalled();
expect(wrapper.text()).not.toContain('Join call');
expect(wrapper.text()).not.toContain('Rejoin call');
});
it('does not expose a join action when another agent is assigned', () => {
conversationsById[12].meta.assignee = { id: 99, name: 'Ben' };
const wrapper = mountComponent();
const joinButton = wrapper.find('[data-test-id="voice-call-join"]');
expect(joinButton.attributes('disabled')).toBeDefined();
expect(wrapper.text()).not.toContain('Join call');
expect(wrapper.text()).not.toContain('Rejoin call');
});
});
@@ -1,20 +1,19 @@
<script setup>
import { computed } from 'vue';
import { useStore } from 'vuex';
import { useI18n } from 'vue-i18n';
import { useMessageContext } from '../provider.js';
import { MESSAGE_TYPES, VOICE_CALL_STATUS } from '../constants';
import {
ATTACHMENT_TYPES,
MESSAGE_TYPES,
VOICE_CALL_STATUS,
} from '../constants';
import { formatDuration } from 'shared/helpers/timeHelper';
import Icon from 'dashboard/components-next/icon/Icon.vue';
import BaseBubble from 'next/message/bubbles/Base.vue';
const LABEL_MAP = {
[VOICE_CALL_STATUS.IN_PROGRESS]: 'CONVERSATION.VOICE_CALL.CALL_IN_PROGRESS',
[VOICE_CALL_STATUS.COMPLETED]: 'CONVERSATION.VOICE_CALL.CALL_ENDED',
};
const SUBTEXT_MAP = {
[VOICE_CALL_STATUS.RINGING]: 'CONVERSATION.VOICE_CALL.NOT_ANSWERED_YET',
[VOICE_CALL_STATUS.COMPLETED]: 'CONVERSATION.VOICE_CALL.CALL_ENDED',
};
import AudioChip from 'next/message/chips/Audio.vue';
import { useCallSession } from 'dashboard/composables/useCallSession';
const ICON_MAP = {
[VOICE_CALL_STATUS.IN_PROGRESS]: 'i-ph-phone-call',
@@ -30,38 +29,114 @@ const BG_COLOR_MAP = {
[VOICE_CALL_STATUS.FAILED]: 'bg-n-ruby-9',
};
const { contentAttributes, messageType } = useMessageContext();
const { t } = useI18n();
const store = useStore();
const { activeCall, hasActiveCall, isJoining, joinCall, endCall } =
useCallSession({
manageSessionState: false,
});
const {
attachments,
contentAttributes,
conversationId,
currentUserId,
inboxId,
messageType,
} = useMessageContext();
const JOINABLE_STATUSES = [
VOICE_CALL_STATUS.RINGING,
VOICE_CALL_STATUS.IN_PROGRESS,
];
const data = computed(() => contentAttributes.value?.data);
const status = computed(() => data.value?.status?.toString());
const callSid = computed(() => {
return (data.value?.callSid || data.value?.call_sid || '').toString();
});
const joinedBy = computed(() => {
return data.value?.meta?.joinedBy || data.value?.meta?.joined_by;
});
const callDuration = computed(() => {
return data.value?.meta?.duration;
});
const recordingAttachment = computed(() => {
return attachments.value?.find(
attachment => attachment.fileType === ATTACHMENT_TYPES.AUDIO
);
});
const conversation = computed(() => {
return store.getters.getConversationById?.(conversationId.value) || null;
});
const activeConversation = computed(() => {
const activeConversationId = activeCall.value?.conversationId;
if (!activeConversationId) return null;
return store.getters.getConversationById?.(activeConversationId) || null;
});
const assigneeId = computed(() => {
return (
conversation.value?.meta?.assignee?.id || conversation.value?.assignee_id
);
});
const isOutbound = computed(() => messageType.value === MESSAGE_TYPES.OUTGOING);
const isFailed = computed(() =>
[VOICE_CALL_STATUS.NO_ANSWER, VOICE_CALL_STATUS.FAILED].includes(status.value)
);
const labelKey = computed(() => {
if (LABEL_MAP[status.value]) return LABEL_MAP[status.value];
if (status.value === VOICE_CALL_STATUS.RINGING) {
return isOutbound.value
? 'CONVERSATION.VOICE_CALL.OUTGOING_CALL'
: 'CONVERSATION.VOICE_CALL.INCOMING_CALL';
}
return isFailed.value
? 'CONVERSATION.VOICE_CALL.MISSED_CALL'
: 'CONVERSATION.VOICE_CALL.INCOMING_CALL';
const didCurrentUserAnswer = computed(() => {
return joinedBy.value?.id === currentUserId.value;
});
const subtextKey = computed(() => {
if (SUBTEXT_MAP[status.value]) return SUBTEXT_MAP[status.value];
const label = computed(() => {
if (status.value === VOICE_CALL_STATUS.IN_PROGRESS) {
return isOutbound.value
? 'CONVERSATION.VOICE_CALL.THEY_ANSWERED'
: 'CONVERSATION.VOICE_CALL.YOU_ANSWERED';
return t('CONVERSATION.VOICE_CALL.CALL_IN_PROGRESS');
}
if (status.value === VOICE_CALL_STATUS.COMPLETED) {
return t('CONVERSATION.VOICE_CALL.CALL_ENDED');
}
if (status.value === VOICE_CALL_STATUS.RINGING) {
return isOutbound.value
? t('CONVERSATION.VOICE_CALL.OUTGOING_CALL')
: t('CONVERSATION.VOICE_CALL.INCOMING_CALL');
}
return isFailed.value
? 'CONVERSATION.VOICE_CALL.NO_ANSWER'
: 'CONVERSATION.VOICE_CALL.NOT_ANSWERED_YET';
? t('CONVERSATION.VOICE_CALL.MISSED_CALL')
: t('CONVERSATION.VOICE_CALL.INCOMING_CALL');
});
const subtext = computed(() => {
if (status.value === VOICE_CALL_STATUS.RINGING) {
return t('CONVERSATION.VOICE_CALL.NOT_ANSWERED_YET');
}
if (status.value === VOICE_CALL_STATUS.COMPLETED) {
return (
formatDuration(callDuration.value) ||
t('CONVERSATION.VOICE_CALL.CALL_ENDED')
);
}
if (status.value === VOICE_CALL_STATUS.IN_PROGRESS) {
if (didCurrentUserAnswer.value) {
return t('CONVERSATION.VOICE_CALL.YOU_ANSWERED');
}
if (joinedBy.value?.name) {
return t('CONVERSATION.VOICE_CALL.AGENT_ANSWERED', {
agentName: joinedBy.value.name,
});
}
return t('CONVERSATION.VOICE_CALL.THEY_ANSWERED');
}
return isFailed.value
? t('CONVERSATION.VOICE_CALL.NO_ANSWER')
: t('CONVERSATION.VOICE_CALL.NOT_ANSWERED_YET');
});
const iconName = computed(() => {
@@ -70,12 +145,66 @@ const iconName = computed(() => {
});
const bgColor = computed(() => BG_COLOR_MAP[status.value] || 'bg-n-teal-9');
const resolvedInboxId = computed(() => {
return inboxId.value || conversation.value?.inbox_id || null;
});
const isCurrentActiveCall = computed(() => {
return activeCall.value?.callSid === callSid.value;
});
const canJoinCall = computed(() => {
return (
JOINABLE_STATUSES.includes(status.value) &&
!!conversationId.value &&
!!resolvedInboxId.value &&
!!callSid.value &&
(!assigneeId.value || assigneeId.value === currentUserId.value) &&
!isCurrentActiveCall.value
);
});
const joinCallText = computed(() => {
return status.value === VOICE_CALL_STATUS.IN_PROGRESS
? t('CONVERSATION.VOICE_CALL.REJOIN_CALL')
: t('CONVERSATION.VOICE_CALL.JOIN_CALL');
});
const handleJoinCall = async () => {
if (!canJoinCall.value || isJoining.value) return;
if (hasActiveCall.value) {
if (activeCall.value?.callSid === callSid.value) return;
const activeInboxId = activeConversation.value?.inbox_id;
if (activeCall.value?.conversationId && activeInboxId) {
await endCall({
conversationId: activeCall.value.conversationId,
inboxId: activeInboxId,
});
}
}
await joinCall({
conversationId: conversationId.value,
inboxId: resolvedInboxId.value,
callSid: callSid.value,
});
};
</script>
<template>
<BaseBubble class="p-0 border-none" hide-meta>
<div class="flex overflow-hidden flex-col w-full max-w-xs">
<div class="flex gap-3 items-center p-3 w-full">
<div class="flex overflow-hidden flex-col w-full max-w-sm">
<button
class="flex gap-3 items-center p-3 w-full text-left border-none bg-transparent"
:class="{
'cursor-pointer transition-colors hover:bg-n-alpha-1 active:bg-n-alpha-2':
canJoinCall,
'cursor-default': !canJoinCall,
}"
:disabled="!canJoinCall || isJoining"
data-test-id="voice-call-join"
type="button"
@click="handleJoinCall"
>
<div
class="flex justify-center items-center rounded-full size-10 shrink-0"
:class="bgColor"
@@ -92,12 +221,21 @@ const bgColor = computed(() => BG_COLOR_MAP[status.value] || 'bg-n-teal-9');
<div class="flex overflow-hidden flex-col flex-grow">
<span class="text-sm font-medium truncate text-n-slate-12">
{{ $t(labelKey) }}
{{ label }}
</span>
<span class="text-xs text-n-slate-11">
{{ $t(subtextKey) }}
{{ subtext }}
</span>
<span
v-if="canJoinCall"
class="mt-1 text-xs font-medium text-n-teal-10"
>
{{ joinCallText }}
</span>
</div>
</button>
<div v-if="recordingAttachment" class="px-3 pb-3">
<AudioChip class="text-n-slate-12" :attachment="recordingAttachment" />
</div>
</div>
</BaseBubble>
@@ -313,12 +313,7 @@ const plugins = computed(() => {
const sendWithSignature = computed(() => {
// this is considered the source of truth, we watch this property
// on change, we toggle the signature in the editor
if (
props.allowSignature &&
!props.isPrivate &&
props.channelType &&
!props.disabled
) {
if (props.allowSignature && !props.isPrivate && props.channelType) {
return fetchSignatureFlagFromUISettings(props.channelType);
}
@@ -441,7 +436,6 @@ function reloadState(content = props.modelValue) {
}
function addSignature() {
if (props.disabled) return;
let content = props.modelValue;
// see if the content is empty, if it is before appending the signature
// we need to add a paragraph node and move the cursor at the start of the editor
@@ -460,7 +454,6 @@ function addSignature() {
}
function removeSignature() {
if (props.disabled) return;
if (!props.signature) return;
let content = props.modelValue;
content = removeSignatureHelper(
@@ -813,7 +806,7 @@ watch(
watch(sendWithSignature, newValue => {
// see if the allowSignature flag is true
if (props.allowSignature && !props.disabled) {
if (props.allowSignature) {
toggleSignatureInEditor(newValue);
}
});
@@ -79,7 +79,7 @@ export default {
created() {
state = createState(
this.modelValue || '',
this.modelValue,
this.placeholder,
this.plugins,
{ onImageUpload: this.openFileBrowser },
@@ -170,7 +170,7 @@ export default {
},
reloadState() {
state = createState(
this.modelValue || '',
this.modelValue,
this.placeholder,
this.plugins,
{ onImageUpload: this.openFileBrowser },
@@ -128,6 +128,7 @@ export default {
},
},
emits: [
'replaceText',
'toggleInsertArticle',
'selectWhatsappTemplate',
'selectContentTemplate',
@@ -276,6 +277,9 @@ export default {
toggleMessageSignature() {
this.setSignatureFlagForInbox(this.channelType, !this.sendWithSignature);
},
replaceText(text) {
this.$emit('replaceText', text);
},
toggleInsertArticle() {
this.$emit('toggleInsertArticle');
},
@@ -10,7 +10,7 @@ import InboxName from '../InboxName.vue';
import ConversationContextMenu from './contextMenu/Index.vue';
import TimeAgo from 'dashboard/components/ui/TimeAgo.vue';
import CardLabels from './conversationCardComponents/CardLabels.vue';
import CardPriorityIcon from 'dashboard/components-next/Conversation/ConversationCard/CardPriorityIcon.vue';
import PriorityMark from './PriorityMark.vue';
import SLACardLabel from './components/SLACardLabel.vue';
import ContextMenu from 'dashboard/components/ui/ContextMenu.vue';
import VoiceCallStatus from './VoiceCallStatus.vue';
@@ -305,7 +305,7 @@ const deleteConversation = () => {
>
<InboxName v-if="showInboxName" :inbox="inbox" class="flex-1 min-w-0" />
<div
class="flex items-baseline gap-2 flex-shrink-0"
class="flex items-center gap-2 flex-shrink-0"
:class="{
'flex-1 justify-between': !showInboxName,
}"
@@ -317,10 +317,7 @@ const deleteConversation = () => {
<fluent-icon icon="person" size="12" class="text-n-slate-11" />
{{ assignee.name }}
</span>
<CardPriorityIcon
:priority="chat.priority"
class="flex-shrink-0 !size-3.5"
/>
<PriorityMark :priority="chat.priority" class="flex-shrink-0" />
</div>
</div>
<h4
@@ -0,0 +1,53 @@
<script>
import { CONVERSATION_PRIORITY } from '../../../../shared/constants/messages';
export default {
name: 'PriorityMark',
props: {
priority: {
type: String,
default: '',
validate: value =>
[...Object.values(CONVERSATION_PRIORITY), ''].includes(value),
},
},
data() {
return {
CONVERSATION_PRIORITY,
};
},
computed: {
tooltipText() {
return this.$t(
`CONVERSATION.PRIORITY.OPTIONS.${this.priority.toUpperCase()}`
);
},
isUrgent() {
return this.priority === CONVERSATION_PRIORITY.URGENT;
},
},
};
</script>
<!-- eslint-disable-next-line vue/no-root-v-if -->
<template>
<span
v-if="priority"
v-tooltip="{
content: tooltipText,
delay: { show: 1500, hide: 0 },
}"
class="shrink-0 rounded-sm inline-flex items-center justify-center w-3.5 h-3.5"
:class="{
'bg-n-ruby-4 text-n-ruby-10': isUrgent,
'bg-n-slate-4 text-n-slate-11': !isUrgent,
}"
>
<fluent-icon
:icon="`priority-${priority.toLowerCase()}`"
:size="isUrgent ? 12 : 14"
class="flex-shrink-0"
view-box="0 0 14 14"
/>
</span>
</template>
@@ -27,6 +27,7 @@ import { CMD_AI_ASSIST } from 'dashboard/helper/commandbar/events';
import {
getMessageVariables,
getUndefinedVariablesInMessage,
replaceVariablesInMessage,
} from '@chatwoot/utils';
import WhatsappTemplates from './WhatsappTemplates/Modal.vue';
import ContentTemplates from './ContentTemplates/ContentTemplatesModal.vue';
@@ -252,9 +253,6 @@ export default {
if (this.isAnInstagramChannel) {
return MESSAGE_MAX_LENGTH.INSTAGRAM;
}
if (this.isATelegramChannel) {
return MESSAGE_MAX_LENGTH.TELEGRAM;
}
if (this.isATiktokChannel) {
return MESSAGE_MAX_LENGTH.TIKTOK;
}
@@ -547,10 +545,7 @@ export default {
},
setCopilotAcceptedMessage(message, replyType = this.replyType) {
const key = this.getDraftKey(this.conversationIdByRoute, replyType);
this.copilotAcceptedMessages[key] = trimContent(
message || '',
this.maxLength
);
this.copilotAcceptedMessages[key] = trimContent(message || '');
},
clearCopilotAcceptedMessage(replyType = this.replyType) {
const key = this.getDraftKey(this.conversationIdByRoute, replyType);
@@ -608,7 +603,7 @@ export default {
saveDraft(conversationId, replyType) {
if (this.message || this.message === '') {
const key = this.getDraftKey(conversationId, replyType);
const draftToSave = trimContent(this.message || '', this.maxLength);
const draftToSave = trimContent(this.message || '');
this.$store.dispatch('draftMessages/set', {
key,
@@ -635,17 +630,10 @@ export default {
return message;
}
// Even when editor is disabled (e.g. WhatsApp/API can't reply), we must
// still normalize stale signatures out of drafts when signature is off.
if (this.isEditorDisabled && this.sendWithSignature) {
return message;
}
const effectiveChannelType = getEffectiveChannelType(
this.channelType,
this.inbox?.medium || ''
);
return this.sendWithSignature
? appendSignature(message, this.messageSignature, effectiveChannelType)
: removeSignature(message, this.messageSignature, effectiveChannelType);
@@ -917,6 +905,32 @@ export default {
});
this.hideContentTemplatesModal();
},
replaceText(message) {
if (this.sendWithSignature && !this.private) {
// if signature is enabled, append it to the message
// appendSignature ensures that the signature is not duplicated
// so we don't need to check if the signature is already present
const effectiveChannelType = getEffectiveChannelType(
this.channelType,
this.inbox?.medium || ''
);
message = appendSignature(
message,
this.messageSignature,
effectiveChannelType
);
}
const updatedMessage = replaceVariablesInMessage({
message,
variables: this.messageVariables,
});
setTimeout(() => {
useTrack(CONVERSATION_EVENTS.INSERTED_A_CANNED_RESPONSE);
this.message = updatedMessage;
}, 100);
},
setReplyMode(mode = REPLY_EDITOR_MODES.REPLY) {
// Clear attachments when switching between private note and reply modes
// This is to prevent from breaking the upload rules
@@ -1415,6 +1429,7 @@ export default {
:new-conversation-modal-active="newConversationModalActive"
@select-whatsapp-template="openWhatsappTemplateModal"
@select-content-template="openContentTemplateModal"
@replace-text="replaceText"
@toggle-insert-article="toggleInsertArticle"
@toggle-quoted-reply="toggleQuotedReply"
/>
@@ -8,7 +8,6 @@ import {
agents,
teams,
labels,
booleanFilterOptions,
statusFilterOptions,
messageTypeOptions,
priorityOptions,
@@ -74,8 +73,6 @@ describe('useAutomation', () => {
return countries;
case 'message_type':
return messageTypeOptions;
case 'private_note':
return booleanFilterOptions;
case 'priority':
return priorityOptions;
default:
@@ -229,9 +226,6 @@ describe('useAutomation', () => {
expect(getConditionDropdownValues('message_type')).toEqual(
messageTypeOptions
);
expect(getConditionDropdownValues('private_note')).toEqual(
booleanFilterOptions
);
expect(getConditionDropdownValues('priority')).toEqual(priorityOptions);
});
@@ -0,0 +1,79 @@
import { createPinia, setActivePinia } from 'pinia';
import { useAlert } from 'dashboard/composables';
import VoiceAPI from 'dashboard/api/channel/voice/voiceAPIClient';
import TwilioVoiceClient from 'dashboard/api/channel/voice/twilioVoiceClient';
import { useCallSession } from '../useCallSession';
vi.mock('vue', async importOriginal => {
const actual = await importOriginal();
return {
...actual,
onMounted: vi.fn(),
onUnmounted: vi.fn(),
};
});
vi.mock('dashboard/composables', () => ({
useAlert: vi.fn(),
}));
vi.mock('dashboard/api/channel/voice/voiceAPIClient', () => ({
default: {
joinConference: vi.fn(),
leaveConference: vi.fn(),
},
}));
vi.mock('dashboard/api/channel/voice/twilioVoiceClient', () => ({
default: {
addEventListener: vi.fn(),
removeEventListener: vi.fn(),
initializeDevice: vi.fn(),
joinClientCall: vi.fn(),
endClientCall: vi.fn(),
},
}));
vi.mock('vue-i18n', () => ({
useI18n: () => ({
t: vi.fn(key => key),
}),
}));
describe('useCallSession', () => {
let consoleErrorSpy;
beforeEach(() => {
setActivePinia(createPinia());
vi.clearAllMocks();
consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
});
afterEach(() => {
consoleErrorSpy.mockRestore();
});
it('shows the backend conflict message when another agent already claimed the call', async () => {
TwilioVoiceClient.initializeDevice.mockResolvedValue({ device: true });
VoiceAPI.joinConference.mockRejectedValue({
response: {
data: {
error: 'Jane Agent is already handling the call.',
},
},
});
const { joinCall } = useCallSession();
const result = await joinCall({
conversationId: 42,
inboxId: 1,
callSid: 'CALL123',
});
expect(result).toBeNull();
expect(useAlert).toHaveBeenCalledWith(
'Jane Agent is already handling the call.'
);
expect(TwilioVoiceClient.joinClientCall).not.toHaveBeenCalled();
});
});
@@ -1,54 +0,0 @@
import { useEditableAutomation } from '../useEditableAutomation';
import useAutomationValues from '../useAutomationValues';
vi.mock('../useAutomationValues');
describe('useEditableAutomation', () => {
beforeEach(() => {
useAutomationValues.mockReturnValue({
getConditionDropdownValues: vi.fn(attributeKey => {
if (attributeKey === 'private_note') {
return [
{ id: true, name: 'True' },
{ id: false, name: 'False' },
];
}
return [];
}),
getActionDropdownValues: vi.fn(),
});
});
it('rehydrates boolean conditions as a single selected option', () => {
const automation = {
event_name: 'message_created',
conditions: [
{
attribute_key: 'private_note',
filter_operator: 'equal_to',
values: [false],
query_operator: null,
},
],
actions: [],
};
const automationTypes = {
message_created: {
conditions: [{ key: 'private_note', inputType: 'search_select' }],
},
};
const { formatAutomation } = useEditableAutomation();
const result = formatAutomation(automation, [], automationTypes, []);
expect(result.conditions).toEqual([
{
attribute_key: 'private_note',
filter_operator: 'equal_to',
values: { id: false, name: 'False' },
query_operator: 'and',
},
]);
});
});
@@ -1,51 +1,62 @@
import { computed, ref, watch, onUnmounted, onMounted } from 'vue';
import { useI18n } from 'vue-i18n';
import VoiceAPI from 'dashboard/api/channel/voice/voiceAPIClient';
import TwilioVoiceClient from 'dashboard/api/channel/voice/twilioVoiceClient';
import { useAlert } from 'dashboard/composables';
import { useCallsStore } from 'dashboard/stores/calls';
import Timer from 'dashboard/helper/Timer';
import { formatDuration } from 'shared/helpers/timeHelper';
export function useCallSession() {
export function useCallSession({ manageSessionState = true } = {}) {
const callsStore = useCallsStore();
const { t } = useI18n();
const isJoining = ref(false);
const callDuration = ref(0);
const durationTimer = new Timer(elapsed => {
callDuration.value = elapsed;
});
const handleCallDisconnected = () => callsStore.clearActiveCall();
const activeCall = computed(() => callsStore.activeCall);
const incomingCalls = computed(() => callsStore.incomingCalls);
const hasActiveCall = computed(() => callsStore.hasActiveCall);
watch(
hasActiveCall,
active => {
if (active) {
durationTimer.start();
} else {
durationTimer.stop();
callDuration.value = 0;
}
},
{ immediate: true }
);
onMounted(() => {
TwilioVoiceClient.addEventListener('call:disconnected', () =>
callsStore.clearActiveCall()
if (manageSessionState) {
watch(
hasActiveCall,
active => {
if (active) {
durationTimer.start();
} else {
durationTimer.stop();
callDuration.value = 0;
}
},
{ immediate: true }
);
});
onUnmounted(() => {
durationTimer.stop();
TwilioVoiceClient.removeEventListener('call:disconnected', () =>
callsStore.clearActiveCall()
);
});
onMounted(() => {
TwilioVoiceClient.addEventListener(
'call:disconnected',
handleCallDisconnected
);
});
onUnmounted(() => {
durationTimer.stop();
TwilioVoiceClient.removeEventListener(
'call:disconnected',
handleCallDisconnected
);
});
}
const endCall = async ({ conversationId, inboxId }) => {
await VoiceAPI.leaveConference(inboxId, conversationId);
TwilioVoiceClient.endClientCall();
durationTimer.stop();
if (manageSessionState) {
durationTimer.stop();
}
callsStore.clearActiveCall();
};
@@ -69,10 +80,13 @@ export function useCallSession() {
});
callsStore.setCallActive(callSid);
durationTimer.start();
if (manageSessionState) {
durationTimer.start();
}
return { conferenceSid: joinResponse?.conference_sid };
} catch (error) {
useAlert(error.response?.data?.error || t('CONTACT_PANEL.CALL_FAILED'));
// eslint-disable-next-line no-console
console.error('Failed to join call:', error);
return null;
@@ -91,9 +105,7 @@ export function useCallSession() {
};
const formattedCallDuration = computed(() => {
const minutes = Math.floor(callDuration.value / 60);
const seconds = callDuration.value % 60;
return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
return formatDuration(callDuration.value);
});
return {
@@ -46,26 +46,11 @@ export function useEditableAutomation() {
if (inputType === 'comma_separated_plain_text') {
return { ...condition, values: condition.values.join(',') };
}
const dropdownValues = getConditionDropdownValues(
condition.attribute_key
);
const hasBooleanOptions =
inputType === 'search_select' &&
dropdownValues.length &&
dropdownValues.every(item => typeof item.id === 'boolean');
if (hasBooleanOptions) {
return {
...condition,
query_operator: condition.query_operator || 'and',
values: dropdownValues.find(item => item.id === condition.values[0]),
};
}
return {
...condition,
query_operator: condition.query_operator || 'and',
values: [...dropdownValues].filter(item =>
[...condition.values].includes(item.id)
values: [...getConditionDropdownValues(condition.attribute_key)].filter(
item => [...condition.values].includes(item.id)
),
};
});
-2
View File
@@ -37,7 +37,6 @@ export const FEATURE_FLAGS = {
CHANNEL_INSTAGRAM: 'channel_instagram',
CHANNEL_TIKTOK: 'channel_tiktok',
CONTACT_CHATWOOT_SUPPORT_TEAM: 'contact_chatwoot_support_team',
CAPTAIN_CUSTOM_TOOLS: 'custom_tools',
CAPTAIN_V2: 'captain_integration_v2',
CAPTAIN_TASKS: 'captain_tasks',
SAML: 'saml',
@@ -50,7 +49,6 @@ export const FEATURE_FLAGS = {
export const PREMIUM_FEATURES = [
FEATURE_FLAGS.SLA,
FEATURE_FLAGS.CAPTAIN,
FEATURE_FLAGS.CAPTAIN_CUSTOM_TOOLS,
FEATURE_FLAGS.CUSTOM_ROLES,
FEATURE_FLAGS.AUDIT_LOGS,
FEATURE_FLAGS.HELP_CENTER,
@@ -150,7 +150,6 @@ export const getConditionOptions = ({
conversation_language: languages,
country_code: countries,
message_type: messageTypeOptions,
private_note: booleanFilterOptions,
priority: priorityOptions,
labels: generateConditionOptions(labels, 'title'),
};
@@ -32,25 +32,6 @@ export function extractTextFromMarkdown(markdown) {
.trim(); // Trim any extra space
}
/**
* Removes inline base64 markdown images from signature content.
*
* @param {string} content
* @returns {{ sanitizedContent: string, hasInlineImages: boolean }}
*/
export function stripInlineBase64Images(content) {
if (!content || typeof content !== 'string') {
return { sanitizedContent: content || '', hasInlineImages: false };
}
const markdownInlineBase64ImageRegex =
/!\[[^\]]*]\(\s*data:image\/[a-zA-Z0-9.+-]+;base64,[^)]+\s*\)/gi;
const sanitizedContent = content.replace(markdownInlineBase64ImageRegex, '');
const hasInlineImages = sanitizedContent !== content;
return { sanitizedContent, hasInlineImages };
}
/**
* Strip unsupported markdown formatting based on channel capabilities.
* Uses MARKDOWN_PATTERNS from editor constants.
@@ -166,8 +166,6 @@ const TOD_TO_MERIDIEM = {
evening: 'pm',
night: 'pm',
};
const CJK_CHAR_RE =
/[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}]/u;
// ─── Translation Cache ──────────────────────────────────────────────────────
@@ -280,13 +278,8 @@ const escapeRegex = s => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
const substituteLocalTokens = (text, pairs) => {
let r = text;
pairs.forEach(([local, en]) => {
if (CJK_CHAR_RE.test(local)) {
const re = new RegExp(escapeRegex(local), 'g');
r = r.replace(re, ` ${en} `);
} else {
const re = new RegExp(`(?<=^|\\s)${escapeRegex(local)}(?=\\s|$)`, 'g');
r = r.replace(re, en);
}
const re = new RegExp(`(?<=^|\\s)${escapeRegex(local)}(?=\\s|$)`, 'g');
r = r.replace(re, en);
});
return r;
};
@@ -82,9 +82,6 @@ const ORDINAL_RE = `(\\d{1,2}(?:st|nd|rd|th)?|${ORDINAL_WORDS})`;
const HALF_UNIT_RE = /^(?:in\s+)?half\s+(?:an?\s+)?(hour|day|week|month|year)$/;
const RELATIVE_DURATION_RE = new RegExp(`^(?:in\\s+)?${NUM_RE}\\s+${UNIT_RE}$`);
const RELATIVE_DURATION_AFTER_RE = new RegExp(
`^(?:in\\s+)?${NUM_RE}\\s+${UNIT_RE}\\s+after$`
);
const DURATION_FROM_NOW_RE = new RegExp(
`^${NUM_RE}\\s+${UNIT_RE}\\s+from\\s+now$`
);
@@ -92,9 +89,6 @@ const RELATIVE_DAY_ONLY_RE = new RegExp(`^(${RELATIVE_DAYS})$`);
const RELATIVE_DAY_TOD_RE = new RegExp(
`^(${RELATIVE_DAYS})\\s+(?:at\\s+)?(${TIME_OF_DAY_NAMES})$`
);
const RELATIVE_DAY_MERIDIEM_RE = new RegExp(
`^(${RELATIVE_DAYS})\\s+(?:at\\s+)?(am|pm)$`
);
const RELATIVE_DAY_TOD_TIME_RE = new RegExp(
`^(${RELATIVE_DAYS})\\s+(?:at\\s+)?(${TIME_OF_DAY_NAMES})\\s+(\\d{1,2}(?::\\d{2})?)$`
);
@@ -251,7 +245,6 @@ const matchDuration = (text, now) => {
return (
parseDuration(text.match(DURATION_FROM_NOW_RE), now) ||
parseDuration(text.match(RELATIVE_DURATION_AFTER_RE), now) ||
parseDuration(text.match(RELATIVE_DURATION_RE), now)
);
};
@@ -310,13 +303,6 @@ const matchRelativeDay = (text, now) => {
);
}
const dayMeridiemMatch = text.match(RELATIVE_DAY_MERIDIEM_RE);
if (dayMeridiemMatch) {
const [, dayKey, meridiem] = dayMeridiemMatch;
const hours = meridiem === 'am' ? 9 : 14;
return applyTimeWithRollover(RELATIVE_DAY_MAP[dayKey], hours, 0, now);
}
const dayAtTimeMatch = text.match(RELATIVE_DAY_AT_TIME_RE);
if (dayAtTimeMatch) {
const [, dayKey, timeRaw] = dayAtTimeMatch;
@@ -178,21 +178,6 @@ describe('getConditionOptions', () => {
})
).toEqual(testOptions);
});
it('returns boolean options for private_note', () => {
const booleanOptions = [
{ id: true, name: 'True' },
{ id: false, name: 'False' },
];
expect(
helpers.getConditionOptions({
booleanFilterOptions: booleanOptions,
customAttributes,
type: 'private_note',
})
).toEqual(booleanOptions);
});
});
describe('getFileName', () => {
@@ -15,7 +15,6 @@ import {
getMenuAnchor,
calculateMenuPosition,
stripUnsupportedFormatting,
stripInlineBase64Images,
} from '../editorHelper';
import { FORMATTING } from 'dashboard/constants/editor';
import { EditorState } from '@chatwoot/prosemirror-schema';
@@ -424,36 +423,6 @@ describe('extractTextFromMarkdown', () => {
});
});
describe('stripInlineBase64Images', () => {
it('removes markdown data:image base64 images and sets hasInlineImages', () => {
const content =
'Hello\n![x](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAE)\nWorld';
const { sanitizedContent, hasInlineImages } =
stripInlineBase64Images(content);
expect(hasInlineImages).toBe(true);
expect(sanitizedContent).not.toContain('data:image/png;base64');
expect(sanitizedContent).toContain('Hello');
expect(sanitizedContent).toContain('World');
});
it('leaves hosted image markdown unchanged', () => {
const content = '![](https://example.com/logo.png)';
const { sanitizedContent, hasInlineImages } =
stripInlineBase64Images(content);
expect(hasInlineImages).toBe(false);
expect(sanitizedContent).toBe(content);
});
it('returns empty hasInlineImages for empty input', () => {
expect(stripInlineBase64Images('')).toEqual({
sanitizedContent: '',
hasInlineImages: false,
});
});
});
describe('insertAtCursor', () => {
it('should return undefined if editorView is not provided', () => {
const result = insertAtCursor(undefined, schema.text('Hello'), 0);
@@ -1626,24 +1626,6 @@ describe('generateDateSuggestions — localized input regressions', () => {
},
};
const zhTWSnoozeTranslations = {
UNITS: {
HOUR: '小時',
HOURS: '小時',
DAY: '天',
DAYS: '天',
},
HALF: '半',
RELATIVE: {
TOMORROW: '明天',
},
MERIDIEM: {
AM: '上午',
PM: '下午',
},
AFTER: '後',
};
describe('P1: short non-English tokens must NOT produce spurious half-duration suggestions', () => {
it('Arabic "غد" does not produce half-duration suggestions', () => {
const results = generateDateSuggestions('غد', now, {
@@ -1739,37 +1721,6 @@ describe('generateDateSuggestions — localized input regressions', () => {
expect(results[0].date.getHours()).toBe(6);
});
});
describe('zh_TW compact CJK inputs', () => {
const options = {
translations: zhTWSnoozeTranslations,
locale: 'zh-TW',
};
it('parses "2小時後" (2 hours from now) without spaces', () => {
const results = generateDateSuggestions('2小時後', now, options);
expect(results.length).toBeGreaterThan(0);
expect(results[0].date.getDate()).toBe(16);
expect(results[0].date.getHours()).toBe(12);
expect(results[0].date.getMinutes()).toBe(0);
});
it('parses "半天" (half day) without spaces', () => {
const results = generateDateSuggestions('半天', now, options);
expect(results.length).toBeGreaterThan(0);
expect(results[0].date.getDate()).toBe(16);
expect(results[0].date.getHours()).toBe(22);
expect(results[0].date.getMinutes()).toBe(0);
});
it('parses "明天 上午" (tomorrow AM) into tomorrow 9am', () => {
const results = generateDateSuggestions('明天 上午', now, options);
expect(results.length).toBeGreaterThan(0);
expect(results[0].date.getDate()).toBe(17);
expect(results[0].date.getHours()).toBe(9);
expect(results[0].date.getMinutes()).toBe(0);
});
});
});
describe('no-space duration suggestions', () => {
@@ -0,0 +1,116 @@
import { createPinia, setActivePinia } from 'pinia';
import { CONTENT_TYPES } from 'dashboard/components-next/message/constants';
import { useCallsStore } from 'dashboard/stores/calls';
import {
handleVoiceCallCreated,
handleVoiceCallUpdated,
syncConversationCallVisibility,
} from '../voice';
vi.mock('dashboard/api/channel/voice/twilioVoiceClient', () => ({
default: {
endClientCall: vi.fn(),
},
}));
const buildVoiceMessage = overrides => ({
content_type: CONTENT_TYPES.VOICE_CALL,
content_attributes: {
data: {
call_sid: 'CALL123',
status: 'ringing',
call_direction: 'inbound',
},
},
conversation_id: 42,
conversation: {
assignee_id: null,
},
sender: {
id: 7,
},
...overrides,
});
describe('voice helper', () => {
const commit = vi.fn();
beforeEach(() => {
setActivePinia(createPinia());
vi.clearAllMocks();
});
it('shows inbound calls to everyone when the conversation is unassigned', () => {
const callsStore = useCallsStore();
handleVoiceCallCreated(buildVoiceMessage(), 1);
expect(callsStore.calls).toEqual([
expect.objectContaining({
callSid: 'CALL123',
conversationId: 42,
}),
]);
});
it('hides inbound calls when they are assigned to another agent', () => {
const callsStore = useCallsStore();
handleVoiceCallCreated(
buildVoiceMessage({
conversation: {
assignee_id: 9,
},
}),
1
);
expect(callsStore.calls).toEqual([]);
});
it('removes a visible call when an update shows it is assigned to another agent', () => {
const callsStore = useCallsStore();
callsStore.addCall({
callSid: 'CALL123',
conversationId: 42,
callDirection: 'inbound',
senderId: 7,
});
handleVoiceCallUpdated(
commit,
buildVoiceMessage({
conversation: {
assignee_id: 9,
},
}),
1
);
expect(callsStore.calls).toEqual([]);
});
it('removes the call widget when the conversation assignment changes to another agent', () => {
const callsStore = useCallsStore();
callsStore.addCall({
callSid: 'CALL123',
conversationId: 42,
callDirection: 'inbound',
senderId: 7,
});
syncConversationCallVisibility(
{
id: 42,
meta: {
assignee: {
id: 9,
},
},
},
1
);
expect(callsStore.calls).toEqual([]);
});
});
+61 -7
View File
@@ -22,6 +22,26 @@ const shouldSkipCall = (callDirection, senderId, currentUserId) => {
return callDirection === 'outbound' && senderId !== currentUserId;
};
const extractAssigneeId = conversation => {
return conversation?.assignee_id || conversation?.meta?.assignee?.id || null;
};
const isAssignedToAnotherAgent = (assigneeId, currentUserId) => {
return !!assigneeId && assigneeId !== currentUserId;
};
const shouldShowCall = ({
callDirection,
senderId,
assigneeId,
currentUserId,
}) => {
return (
!shouldSkipCall(callDirection, senderId, currentUserId) &&
!isAssignedToAnotherAgent(assigneeId, currentUserId)
);
};
function extractCallData(message) {
const contentData = message?.content_attributes?.data || {};
return {
@@ -29,6 +49,7 @@ function extractCallData(message) {
status: contentData.status,
callDirection: contentData.call_direction,
conversationId: message?.conversation_id,
assigneeId: extractAssigneeId(message?.conversation),
senderId: message?.sender?.id,
};
}
@@ -36,10 +57,19 @@ function extractCallData(message) {
export function handleVoiceCallCreated(message, currentUserId) {
if (!isVoiceCallMessage(message)) return;
const { callSid, callDirection, conversationId, senderId } =
const { callSid, callDirection, conversationId, assigneeId, senderId } =
extractCallData(message);
if (shouldSkipCall(callDirection, senderId, currentUserId)) return;
if (
!shouldShowCall({
callDirection,
senderId,
assigneeId,
currentUserId,
})
) {
return;
}
const callsStore = useCallsStore();
callsStore.addCall({
@@ -53,8 +83,14 @@ export function handleVoiceCallCreated(message, currentUserId) {
export function handleVoiceCallUpdated(commit, message, currentUserId) {
if (!isVoiceCallMessage(message)) return;
const { callSid, status, callDirection, conversationId, senderId } =
extractCallData(message);
const {
callSid,
status,
callDirection,
conversationId,
assigneeId,
senderId,
} = extractCallData(message);
const callsStore = useCallsStore();
@@ -64,9 +100,19 @@ export function handleVoiceCallUpdated(commit, message, currentUserId) {
commit(types.UPDATE_CONVERSATION_CALL_STATUS, callInfo);
commit(types.UPDATE_MESSAGE_CALL_STATUS, callInfo);
const isNewCall =
status === 'ringing' &&
!shouldSkipCall(callDirection, senderId, currentUserId);
if (
!shouldShowCall({
callDirection,
senderId,
assigneeId,
currentUserId,
})
) {
callsStore.removeCallsForConversation(conversationId);
return;
}
const isNewCall = status === 'ringing';
if (isNewCall) {
callsStore.addCall({
@@ -77,3 +123,11 @@ export function handleVoiceCallUpdated(commit, message, currentUserId) {
});
}
}
export function syncConversationCallVisibility(conversation, currentUserId) {
const assigneeId = extractAssigneeId(conversation);
if (!isAssignedToAnotherAgent(assigneeId, currentUserId)) return;
const callsStore = useCallsStore();
callsStore.removeCallsForConversation(conversation.id);
}
@@ -6,12 +6,12 @@
"SWITCH_VIEW_LAYOUT": "Switch the layout",
"DASHBOARD_APP_TAB_MESSAGES": "Messages",
"UNVERIFIED_SESSION": "The identity of this user is not verified",
"NO_MESSAGE_1": "የደንበኞች መልእክቶች በኢንቦክስዎ አልተገኙም።",
"NO_MESSAGE_2": " ወደ ገፅዎ መልእክት ለመላክ!",
"NO_INBOX_1": "እሺ! አሁን ምንም ኢንቦክስ አልጨመሩም።",
"NO_INBOX_2": " ለመጀመር",
"NO_INBOX_AGENT": "ወይ! ምንም ኢንቦክስ አባል አይደለህም። እባክዎ አስተዳዳሪዎን ያነጋግሩ",
"SEARCH_MESSAGES": "መልእክቶችን በውይይቶች ውስጥ ይፈልጉ",
"NO_MESSAGE_1": "Uh oh! Looks like there are no messages from customers in your inbox.",
"NO_MESSAGE_2": " to send a message to your page!",
"NO_INBOX_1": "Hola! Looks like you haven't added any inboxes yet.",
"NO_INBOX_2": " to get started",
"NO_INBOX_AGENT": "Uh Oh! Looks like you are not part of any inbox. Please contact your administrator",
"SEARCH_MESSAGES": "Search for messages in conversations",
"VIEW_ORIGINAL": "View original",
"VIEW_TRANSLATED": "View translated",
"EMPTY_STATE": {
@@ -19,19 +19,19 @@
"KEYBOARD_SHORTCUTS": "to view keyboard shortcuts"
},
"SEARCH": {
"TITLE": "መልእክቶችን ይፈልጉ",
"TITLE": "Search messages",
"RESULT_TITLE": "Search Results",
"LOADING_MESSAGE": "መረጃ በማስተናገድ ላይ...",
"LOADING_MESSAGE": "Crunching data...",
"PLACEHOLDER": "Type any text to search messages",
"NO_MATCHING_RESULTS": "No results found."
},
"UNREAD_MESSAGES": "Unread Messages",
"UNREAD_MESSAGE": "Unread Message",
"CLICK_HERE": "እዚህ ጠቅ ያድርጉ",
"LOADING_INBOXES": "ኢንቦክሶች በመጫን ላይ",
"LOADING_CONVERSATIONS": "ውይይቶች በመጫን ላይ",
"CANNOT_REPLY": "ምክንያቱን በመነሳት መልስ ማድረግ አይችሉም",
"24_HOURS_WINDOW": "የ24 ሰዓት መልእክት ጊዜ ገደብ",
"CLICK_HERE": "Click here",
"LOADING_INBOXES": "Loading inboxes",
"LOADING_CONVERSATIONS": "Loading Conversations",
"CANNOT_REPLY": "You cannot reply due to",
"24_HOURS_WINDOW": "24 hour message window restriction",
"48_HOURS_WINDOW": "48 hour message window restriction",
"API_HOURS_WINDOW": "ለዚህ ውይይት መመለስ በ{hours} ሰአታት ውስጥ ብቻ ይቻላል",
"NOT_ASSIGNED_TO_YOU": "This conversation is not assigned to you. Would you like to assign this conversation to yourself?",
@@ -44,9 +44,9 @@
"TWILIO_WHATSAPP_CAN_REPLY": "You can only reply to this conversation using a template message due to",
"TWILIO_WHATSAPP_24_HOURS_WINDOW": "24 hour message window restriction",
"OLD_INSTAGRAM_INBOX_REPLY_BANNER": "ይህ የInstagram መለያ ወደ አዲሱ የInstagram ቻናል ገቢ ሳጥን ተዛውሯል። ሁሉም አዲስ መልዕክቶች በዚያ ይታያሉ። ከአሁን ጀምሮ ከዚህ ውይይት መልዕክቶች መላክ አትችሉም።",
"REPLYING_TO": "ለዚህ ትመልሳለህ፦",
"REMOVE_SELECTION": "ምርጫ አስወግድ",
"DOWNLOAD": "አውርድ",
"REPLYING_TO": "You are replying to:",
"REMOVE_SELECTION": "Remove Selection",
"DOWNLOAD": "Download",
"UNKNOWN_FILE_TYPE": "Unknown File",
"SAVE_CONTACT": "Save Contact",
"NO_CONTENT": "No content to display",
@@ -85,13 +85,13 @@
"YOU_ANSWERED": "You answered"
},
"HEADER": {
"RESOLVE_ACTION": "ተፈትኗል",
"REOPEN_ACTION": "እንደገና ክፈት",
"RESOLVE_ACTION": "Resolve",
"REOPEN_ACTION": "Reopen",
"OPEN_ACTION": "Open",
"MORE_ACTIONS": "ተጨማሪ እርምጃዎች",
"OPEN": "ተጨማሪ",
"CLOSE": "ዝጋ",
"DETAILS": "ዝርዝሮች",
"OPEN": "More",
"CLOSE": "Close",
"DETAILS": "details",
"SNOOZED_UNTIL": "Snoozed until",
"SNOOZED_UNTIL_TOMORROW": "Snoozed until tomorrow",
"SNOOZED_UNTIL_NEXT_WEEK": "Snoozed until next week",
@@ -188,21 +188,21 @@
"MESSAGE_SIGN_TOOLTIP": "Message signature",
"ENABLE_SIGN_TOOLTIP": "Enable signature",
"DISABLE_SIGN_TOOLTIP": "Disable signature",
"MSG_INPUT": "አዲስ መስመር ለማስገባት Shift + enter ይጠቀሙ። '/' በመጀመር የተዘጋጀ ምላሽ ይምረጡ።",
"PRIVATE_MSG_INPUT": "አዲስ መስመር ለማስገባት Shift + enter ይጠቀሙ። ይህ ለወኪሎች ብቻ ይታያል",
"MSG_INPUT": "Shift + enter for new line. Start with '/' to select a Canned Response.",
"PRIVATE_MSG_INPUT": "Shift + enter for new line. This will be visible only to Agents",
"MESSAGING_RESTRICTED": "You cannot reply to this conversation",
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Message signature is not configured, please configure it in profile settings.",
"COPILOT_MSG_INPUT": "ኮፒሎት ተጨማሪ እባብነቶች ስጡው, ወይም ሌላ ማንኛውንም ጥያቄ ያቀርቡ... ተከትሎ ለማስተላለፊያ ኤንተር ይጫኑ።",
"COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
"CLICK_HERE": "Click here to update",
"WHATSAPP_TEMPLATES": "Whatsapp Templates"
},
"REPLYBOX": {
"REPLY": "መልስ",
"PRIVATE_NOTE": "የግል ማስታወሻ",
"SEND": "ላክ",
"CREATE": "ማስታወሻ አክል",
"REPLY": "Reply",
"PRIVATE_NOTE": "Private Note",
"SEND": "Send",
"CREATE": "Add Note",
"INSERT_READ_MORE": "Read more",
"DISMISS_REPLY": "Dismiss reply",
"REPLYING_TO": "Replying to:",
@@ -214,7 +214,7 @@
"DRAG_DROP": "Drag and drop here to attach",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
"COPILOT_THINKING": "ኮፒሎት እየሰማራ ነው",
"COPILOT_THINKING": "Copilot is thinking",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Add bcc",
@@ -245,10 +245,10 @@
"EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "የግል ማስታወሻ፡ ለአንተና ቡድንህ ብቻ ይታያል",
"CHANGE_STATUS": "የውይይቱ ሁኔታ ተቀይሯል",
"VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team",
"CHANGE_STATUS": "Conversation status changed",
"CHANGE_STATUS_FAILED": "Conversation status change failed",
"CHANGE_AGENT": "የውይይቱ ተመድብ ተቀይሯል",
"CHANGE_AGENT": "Conversation Assignee changed",
"CHANGE_AGENT_FAILED": "Assignee change failed",
"ASSIGN_LABEL_SUCCESFUL": "Label assigned successfully",
"ASSIGN_LABEL_FAILED": "Label assignment failed",
@@ -300,20 +300,20 @@
}
},
"EMAIL_TRANSCRIPT": {
"TITLE": "የውይይት ጽሑፍ ላክ",
"DESC": "የውይይቱን ጽሑፍ ቅጂ ወደ ተጠቃሚው ኢሜይል ላክ",
"SUBMIT": "አስገባ",
"CANCEL": "ይቅር",
"SEND_EMAIL_SUCCESS": "የቻት አጭር መግለጫው በተሳካ ሁኔታ ተልኳል",
"SEND_EMAIL_ERROR": "ስህተት ተፈጥሯል፣ እባክዎ ደግመው ይሞክሩ",
"TITLE": "Send conversation transcript",
"DESC": "Send a copy of the conversation transcript to the specified email address",
"SUBMIT": "Submit",
"CANCEL": "Cancel",
"SEND_EMAIL_SUCCESS": "The chat transcript was sent successfully",
"SEND_EMAIL_ERROR": "There was an error, please try again",
"SEND_EMAIL_PAYMENT_REQUIRED": "Email transcript is not available on your current plan. Please upgrade to use this feature.",
"FORM": {
"SEND_TO_CONTACT": "መግለጫውን ለደንበኛው ይላኩ",
"SEND_TO_CONTACT": "Send the transcript to the customer",
"SEND_TO_AGENT": "Send the transcript to the assigned agent",
"SEND_TO_OTHER_EMAIL_ADDRESS": "መግለጫውን ወደ ሌላ ኢሜይል አድራሻ ይላኩ",
"SEND_TO_OTHER_EMAIL_ADDRESS": "Send the transcript to another email address",
"EMAIL": {
"PLACEHOLDER": "ኢሜይል አድራሻ ያስገቡ",
"ERROR": "ትክክለኛ ኢሜይል አድራሻ ያስገቡ"
"PLACEHOLDER": "Enter an email address",
"ERROR": "Please enter a valid email address"
}
}
},
@@ -316,18 +316,6 @@
"SUCCESS_MESSAGE": "ቋንቋው ከፖርታል በተሳካ ሁኔታ ተሰርዟል",
"ERROR_MESSAGE": "ከፖርታሉ ቋንቋ ማስወገድ አልተቻለም። እባክዎ ደግመው ይሞክሩ።."
}
},
"DRAFT_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale moved to draft successfully",
"ERROR_MESSAGE": "Unable to move locale to draft. Try again."
}
},
"PUBLISH_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale published successfully",
"ERROR_MESSAGE": "Unable to publish locale. Try again."
}
}
},
"TABLE": {
@@ -656,11 +644,8 @@
"ARTICLES_COUNT": "{count} ጽሑፍ | {count} ጽሑፎች",
"CATEGORIES_COUNT": "{count} ምድብ | {count} ምድቦች",
"DEFAULT": "ነባሪ",
"DRAFT": "እቅድ",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "እንደ ነባሪ አድርግ",
"MOVE_TO_DRAFT": "Move to draft",
"PUBLISH_LOCALE": "Publish locale",
"DELETE": "ሰርዝ"
}
},
@@ -670,13 +655,6 @@
"COMBOBOX": {
"PLACEHOLDER": "ቋንቋ ይምረጡ..."
},
"STATUS": {
"LABEL": "Status",
"OPTIONS": {
"LIVE": "ተለቀቀ",
"DRAFT": "እቅድ"
}
},
"API": {
"SUCCESS_MESSAGE": "ቋንቋ በተሳካ ሁኔታ ተጨምሯል",
"ERROR_MESSAGE": "ቋንቋውን ማክሰኞ አልተቻለም። እባክዎ ደግመው ይሞክሩ።."
@@ -11,7 +11,7 @@
"WHATSAPP_REGISTRATION_INCOMPLETE": "የWhatsApp ንግድ ምዝገባዎ አልተጠናቀቀም። እባክዎ ከመገናኛ ባለሥልጣን ጋር በMeta Business Manager ውስጥ የሚታይ ስም ሁኔታዎን ያረጋግጡ።.",
"COMPLETE_REGISTRATION": "ምዝገባ አሟልት",
"LIST": {
"404": "ወደዚህ መለያ የተያዙ ኢንቦክሶች የሉም።"
"404": "Այս հաշվի հետ կապված մուտքային արկղեր չկան։"
},
"CREATE_FLOW": {
"CHANNEL": {
@@ -42,7 +42,7 @@
"PLACEHOLDER": "የድር ጣቢያ ስምዎን ያስገቡ (ለምሳሌ፡ Acme Inc)"
},
"FB": {
"HELP": "ማስታወሻ፡ በመግባት ብቻ የገጹ መልእክቶችን ብቻ እንደምንያዝ ነው። የግል መልእክቶችዎን በChatwoot ማድረስ አይቻልም።",
"HELP": "Հիշեցում․ Մուտք գործելով մենք միայն հասանելիություն ենք ստանում Ձեր էջի հաղորդագրություններին։ Ձեր անձնական հաղորդագրություններին Chatwoot-ը երբեք չի կարող հասանելիություն ունենալ։",
"CHOOSE_PAGE": "ገጽ ይምረጡ",
"CHOOSE_PLACEHOLDER": "ከዝርዝር ገጽ ይምረጡ",
"INBOX_NAME": "የኢንቦክስ ስም",
@@ -76,7 +76,7 @@
},
"WEBSITE_CHANNEL": {
"TITLE": "የድር ጣቢያ ቻናል",
"DESC": "ለድህረ ገጹ ቻናል ይፍጠሩ እና በድህረ ገጻችን ዊጅት ደንበኞቻችሁን ይደግፉ።",
"DESC": "Ստեղծեք ալիք Ձեր կայքի համար և սկսեք աջակցել Ձեր հաճախորդներին մեր կայքի վիջեթի միջոցով։",
"LOADING_MESSAGE": "የድር ጣቢያ ድጋፍ ቻናል እየተፈጠረ ነው",
"CHANNEL_AVATAR": {
"LABEL": "የቻናል ፎቶ"
@@ -96,11 +96,11 @@
},
"CHANNEL_WELCOME_TAGLINE": {
"LABEL": "የእንኳን ደህና መጡ መልዕክት",
"PLACEHOLDER": "ከእኛ ጋር ቀላል መገናኘት እንደምንሠራ ነው። ማንኛውንም ጥያቄ ያቀርቡ ወይም አስተያየትዎን ያጋሩ።"
"PLACEHOLDER": "Մենք հեշտացնում ենք կապվել մեզ հետ։ Հարցրեք ցանկացած բան կամ կիսվեք Ձեր կարծիքով։"
},
"CHANNEL_GREETING_MESSAGE": {
"LABEL": "የቻናል ደስታ መልእክት",
"PLACEHOLDER": "Acme Inc በተለምዶ በጥቂት ሰዓታት ውስጥ ይመልሳል።"
"PLACEHOLDER": "Acme Inc սովորաբար պատասխանում է մի քանի ժամվա ընթացքում։"
},
"CHANNEL_GREETING_TOGGLE": {
"LABEL": "የቻናል ደስታ አንቀሳቅስ",
@@ -126,9 +126,9 @@
},
"TWILIO": {
"TITLE": "Twilio SMS/WhatsApp ቻናል",
"DESC": "Twilio ያገናኙ እና በSMS ወይም WhatsApp ደንበኞቻችሁን ይደግፉ።",
"DESC": "Միացրեք Twilio-ն և սկսեք աջակցել Ձեր հաճախորդներին SMS կամ WhatsApp միջոցով։",
"ACCOUNT_SID": {
"LABEL": "አካውንት SID",
"LABEL": "Account SID",
"PLACEHOLDER": "እባክዎ የTwilio መለያ መለያዎን ያስገቡ",
"ERROR": "ይህ መስክ አስፈላጊ ነው"
},
@@ -165,12 +165,12 @@
},
"PHONE_NUMBER": {
"LABEL": "ስልክ ቁጥር",
"PLACEHOLDER": "ከዚህ መልእክት የሚልከው የስልክ ቁጥር እባክዎ ያስገቡ።",
"PLACEHOLDER": "Խնդրում ենք մուտքագրել այն հեռախոսահամարը, որտեղից կուղարկվի հաղորդագրությունը։",
"ERROR": "እባክዎ በ`+` ምልክት የሚጀምር እና ቦታ ያልያዘ ትክክለኛ የስልክ ቁጥር ያቀርቡ።."
},
"API_CALLBACK": {
"TITLE": "ካልባክ URL",
"SUBTITLE": "በTwilio ውስጥ የመልእክት እንደገና መግባት አድራሻን ከዚህ በተጠቀሰው አድራሻ ጋር መቀነባበር አለብዎት።"
"TITLE": "Callback URL",
"SUBTITLE": "Twilio-ում պետք է կարգավորեք հաղորդագրության պատասխան URL-ը՝ օգտագործելով այստեղ նշված հասցեն։"
},
"SUBMIT_BUTTON": "የTwilio ቻናል ይፍጠሩ",
"API": {
@@ -179,7 +179,7 @@
},
"SMS": {
"TITLE": "SMS ቻናል",
"DESC": "በSMS ደንበኞቻችሁን ይደግፉ።",
"DESC": "Սկսեք աջակցել Ձեր հաճախորդներին SMS-ի միջոցով։",
"PROVIDERS": {
"LABEL": "API አቅራቢ",
"TWILIO": "Twilio",
@@ -231,7 +231,7 @@
},
"WHATSAPP": {
"TITLE": "WhatsApp ቻናል",
"DESC": "በWhatsApp ደንበኞቻችሁን ይደግፉ።",
"DESC": "Սկսեք աջակցել Ձեր հաճախորդներին WhatsApp-ի միջոցով։",
"PROVIDERS": {
"LABEL": "API አቅራቢ",
"WHATSAPP_EMBEDDED": "WhatsApp ቢዝነስ",
@@ -252,7 +252,7 @@
},
"PHONE_NUMBER": {
"LABEL": "የስልክ ቁጥር",
"PLACEHOLDER": "ከዚህ መልእክት የሚልከው የስልክ ቁጥር እባክዎ ያስገቡ።",
"PLACEHOLDER": "Խնդրում ենք մուտքագրել այն հեռախոսահամարը, որտեղից կուղարկվի հաղորդագրությունը։",
"ERROR": "እባክዎ በ`+` ምልክት የሚጀምር እና ቦታ ያልያዘ ትክክለኛ የስልክ ቁጥር ያቀርቡ።."
},
"PHONE_NUMBER_ID": {
@@ -272,9 +272,9 @@
},
"API_KEY": {
"LABEL": "API ቁልፍ",
"SUBTITLE": "የWhatsApp API ቁልፍን ያቀናብሩ።",
"SUBTITLE": "Կարգավորեք WhatsApp API բանալին։",
"PLACEHOLDER": "API ቁልፍ",
"ERROR": "እባክዎ ትክክለኛ እሴት ያስገቡ።"
"ERROR": "Խնդրում ենք մուտքագրել վավեր արժեք։"
},
"API_CALLBACK": {
"TITLE": "የተመለሰ አድራሻ URL",
@@ -358,7 +358,7 @@
},
"API_CHANNEL": {
"TITLE": "የAPI ቻናል",
"DESC": "ከAPI ቻናል ጋር ያገናኙ እና ደንበኞቻችሁን ይደግፉ።",
"DESC": "Միացրեք API ալիքը և սկսեք աջակցել Ձեր հաճախորդներին։",
"CHANNEL_NAME": {
"LABEL": "የቻናል ስም",
"PLACEHOLDER": "እባክዎ የቻናል ስም ያስገቡ",
@@ -371,7 +371,7 @@
},
"SUBMIT_BUTTON": "API ቻናል ፍጠር",
"API": {
"ERROR_MESSAGE": "API ቻናሉን ማስቀመጥ አልተቻለንም"
"ERROR_MESSAGE": "Չհաջողվեց պահպանել API ալիքը"
}
},
"EMAIL_CHANNEL": {
@@ -399,7 +399,7 @@
},
"LINE_CHANNEL": {
"TITLE": "LINE ቻናል",
"DESC": "ከLINE ቻናል ጋር ያገናኙ እና ደንበኞቻችሁን ይደግፉ።",
"DESC": "Միացրեք LINE ալիքը և սկսեք աջակցել Ձեր հաճախորդներին։",
"CHANNEL_NAME": {
"LABEL": "የቻናል ስም",
"PLACEHOLDER": "እባክዎ የቻናል ስም ያስገቡ",
@@ -423,15 +423,15 @@
},
"API_CALLBACK": {
"TITLE": "የእንደገና ጥሪ አድራሻ",
"SUBTITLE": "በLINE መተግበሪያ ውስጥ የwebhook አድራሻን ከዚህ በተጠቀሰው አድራሻ ጋር መቀነባበር አለብዎት።"
"SUBTITLE": "LINE հավելվածում պետք է կարգավորեք webhook URL-ը՝ օգտագործելով այստեղ նշված հասցեն։"
}
},
"TELEGRAM_CHANNEL": {
"TITLE": "Telegram ቻናል",
"DESC": "ከTelegram ቻናል ጋር ያገናኙ እና ደንበኞቻችሁን ይደግፉ።",
"DESC": "Միացրեք Telegram ալիքը և սկսեք աջակցել Ձեր հաճախորդներին։",
"BOT_TOKEN": {
"LABEL": "የቦት ቶክን",
"SUBTITLE": "ከTelegram BotFather ያገኙትን የቦት ቶክን ያቀናብሩ።",
"SUBTITLE": "Կարգավորեք Telegram BotFather-ից ստացած բոտի տոկենը։",
"PLACEHOLDER": "የቦት ቶክን"
},
"SUBMIT_BUTTON": "Telegram ቻናል ፍጠር",
@@ -450,11 +450,11 @@
"DESCRIPTION": "ቀጥታ የሚነጋገር ቪጅት ይፍጠሩ"
},
"FACEBOOK": {
"TITLE": "ፌስቡክ",
"TITLE": "Facebook",
"DESCRIPTION": "የFacebook ገጽዎን ያገናኙ"
},
"WHATSAPP": {
"TITLE": "ዋትስአፕ",
"TITLE": "WhatsApp",
"DESCRIPTION": "በWhatsApp ላይ ደንበኞችዎን ድጋፍ ያድርጉ"
},
"EMAIL": {
@@ -470,15 +470,15 @@
"DESCRIPTION": "በAPI ቻናል ለራስዎ ተለዋዋጭ ቻናል ይፍጠሩ"
},
"TELEGRAM": {
"TITLE": "ቴሌግራም",
"TITLE": "Telegram",
"DESCRIPTION": "በBot ቶክን የTelegram ቻናል ያቀናብሩ"
},
"LINE": {
"TITLE": "ላይን",
"TITLE": "Line",
"DESCRIPTION": "የLine ቻናልዎን ያካተቱ"
},
"INSTAGRAM": {
"TITLE": "ኢንስታግራም",
"TITLE": "Instagram",
"DESCRIPTION": "የInstagram አካውንትዎን ያገናኙ"
},
"TIKTOK": {
@@ -493,13 +493,13 @@
},
"AGENTS": {
"TITLE": "Agent-ዎች",
"DESC": "እዚህ አዲስ የተፈጠረውን ኢንቦክስ ለመቆጣጠር ወኪሎችን ማከል ይችላሉ። እነዚህ የተመረጡ ወኪሎች ብቻ ወደ ኢንቦክስዎ መዳረሻ አላቸው። ከዚህ ኢንቦክስ አካል ያልሆኑ ወኪሎች ሲግቡ መልእክቶችን ማየት ወይም መልስ ማድረግ አይችሉም። <br> <b>ማስታወሻ፡</b> እንደ አስተዳደር ባለስልጣን ሁሉንም ኢንቦክሶች ለመዳረሻ ከፈለጉ ራስዎን እንደ ወኪል ወደ ሁሉም የሚፈጥሩት ኢንቦክሶች መጨመር አለብዎት።",
"DESC": "Այստեղ կարող եք ավելացնել գործակալներ՝ նոր ստեղծված մուտքային արկղը կառավարելու համար։ Միայն այս ընտրված գործակալները կունենան մուտք դեպի Ձեր մուտքային արկղը։ Գործակալները, որոնք չեն պատկանում այս մուտքային արկղին, չեն կարողանա տեսնել կամ պատասխանել հաղորդագրություններին մուտք գործելիս։ <br> <b>Հիշեցում․</b> Որպես ադմինիստրատոր, եթե Ձեզ անհրաժեշտ է մուտք բոլոր մուտքային արկղերին, պետք է ինքներդ Ձեզ ավելացնեք որպես գործակալ բոլոր ստեղծած մուտքային արկղերում։",
"VALIDATION_ERROR": "ከአዲሱ ኢንቦክስዎ ቢያንስ አንድ ወኪል ያክሉ",
"PICK_AGENTS": "ለኢንቦክሱ ወኪሎችን ይምረጡ"
},
"DETAILS": {
"TITLE": "የኢንቦክስ ዝርዝሮች",
"DESC": "ከታች ያለው ከዝርዝር ማስተካከያ በተጠቃሚው ፌስቡክ ገጽ ወደ Chatwoot ለመገናኘት ይምረጡ። ለምርጥ መለያየት የእርስዎን ኢንቦክስ በተለየ ስም ማቅረብ ይችላሉ።"
"DESC": "Ընտրեք ներքևի բացվող ցանկից այն Facebook էջը, որը ցանկանում եք կապել Chatwoot-ի հետ։ Կարող եք նաև մուտքային արկղին տալ հատուկ անուն՝ ավելի լավ ճանաչման համար։"
},
"FINISH": {
"TITLE": "ተሳክቷል!",
@@ -543,7 +543,7 @@
"MESSAGE": "ከአዲሱ ቻናልዎ ጋር ከደንበኞችዎ ጋር እንዲገናኙ አሁን ትችላላችሁ። ደስታ ያለው ድጋፍ",
"BUTTON_TEXT": "ወደ እዚያ ይውሰዱኝ",
"MORE_SETTINGS": "ተጨማሪ ቅንብሮች",
"WEBSITE_SUCCESS": "የድር ጣቢያ ቻናል መፍጠር በተሳካ ሁኔታ ተጠናቋል። ከታች የተሳየውን ኮድ ቅዳት እና በድር ጣቢያዎ ያስገቡ። ቀጣዩ ጊዜ ደንበኛ በላይቭ ቻት ሲጠቀም ውይይቱ በራሱ በኢንቦክስዎ ይታያል።",
"WEBSITE_SUCCESS": "Դուք հաջողությամբ ստեղծել եք կայքի ալիք։ Նշված կոդը պատճենեք և տեղադրեք Ձեր կայքում։ Հաջորդ անգամ, երբ հաճախորդը օգտագործի ուղիղ զրույցը, հաղորդակցությունը ավտոմատ կհայտնվի Ձեր մուտքային արկղում։",
"WHATSAPP_QR_INSTRUCTION": "ለፈጣን ሙከራ የ WhatsApp ጥቅል ላይ ከላይ ያለውን QR ኮድ ይስካን ያድርጉ",
"MESSENGER_QR_INSTRUCTION": "ለፈጣን ሙከራ የ Facebook Messenger ጥቅል ላይ ከላይ ያለውን QR ኮድ ይስካን ያድርጉ",
"TELEGRAM_QR_INSTRUCTION": "ለፈጣን ሙከራ የ Telegram ጥቅል ላይ ከላይ ያለውን QR ኮድ ይስካን ያድርጉ"
@@ -613,9 +613,9 @@
},
"API": {
"SUCCESS_MESSAGE": "ኢንቦክስ በተሳካ ሁኔታ ተሰርዟል",
"ERROR_MESSAGE": "ኢንቦክስ ማጥፋት አልተቻለም። እባክዎ በኋላ ደግመው ይሞክሩ።",
"ERROR_MESSAGE": "Չհաջողվեց ջնջել մուտքային արկղը։ Խնդրում ենք փորձել ավելի ուշ։",
"AVATAR_SUCCESS_MESSAGE": "የኢንቦክስ አቫታር በተሳካ ሁኔታ ተሰርዟል",
"AVATAR_ERROR_MESSAGE": "የኢንቦክስ አቫታር ማጥፋት አልተቻለም። እባክዎ በኋላ ደግመው ይሞክሩ።"
"AVATAR_ERROR_MESSAGE": "Չհաջողվեց ջնջել մուտքային արկղի պատկերակը։ Խնդրում ենք փորձել ավելի ուշ։"
}
},
"TABS": {
@@ -628,7 +628,7 @@
"WIDGET_BUILDER": "የዊጅት አሰራር መሣሪያ",
"BOT_CONFIGURATION": "የቦት ቅንብሮች",
"ACCOUNT_HEALTH": "የመለያ ጤና",
"CSAT": "የደንበኞች ደህንነት ግምገማ (CSAT)"
"CSAT": "CSAT"
},
"CHANNEL_PREFERENCES": "የቻናል ቅድሚያዎች",
"WIDGET_FEATURES": "የዊጅት ባህሪያት",
@@ -710,7 +710,7 @@
"MESSENGER_SUB_HEAD": "ይህን አዝራር በbody ታግ ውስጥ ያቀርቡ",
"ALLOWED_DOMAINS": {
"TITLE": "የተፈቀዱ ድር ስፍራዎች",
"DESCRIPTION": "የቻት ዊጅትዎን ማን እንደሚጨምር ድር ጣቢያዎችን ያገዙ። ለደህንነት፣ ብቻ የእርስዎን እና የሚታመኑትን ድር ጣቢያዎች ያክሉ። አንድ ወይም ከዚያ በላይ ድር ጣቢያዎችን በኮማ በመለያየት ያክሉ። ሁሉንም ድር ጣቢያዎች ለመፍቀድ ቦታውን ባዶ ተው (ለምርት አይመከርም)።.",
"DESCRIPTION": "Restrict which websites can embed your chat widget. For security, only add domains you own and trust. Add one or more domains separated by commas. Leave blank to allow all domains (not recommended for production).",
"PLACEHOLDER": "example.com, www.example.com, app.example.com"
},
"ALLOW_MOBILE_WEBVIEW": {
@@ -736,24 +736,24 @@
"SENDER_NAME_SECTION": "በኢሜይል ውስጥ የAgent ስም አርግ",
"SENDER_NAME_SECTION_TEXT": "በኢሜይል ውስጥ የAgent ስም እንዲታይ/እንዳይታይ አርግ፣ ካልተከናወነ የንግድ ስም ይታያል",
"ENABLE_CONTINUITY_VIA_EMAIL": "በኢሜል የውይይት ቀጥታነት አንቀሳቅስ",
"ENABLE_CONTINUITY_VIA_EMAIL_SUB_TEXT": "ከኮንታክት ኢሜይል አድራሻ ካለ ውይይቶች በኢሜይል ይቀጥላሉ።",
"ENABLE_CONTINUITY_VIA_EMAIL_SUB_TEXT": "Եթե կոնտակտի էլ.փոստի հասցեն հասանելի է, զրույցները կշարունակվեն էլ.փոստով։",
"LOCK_TO_SINGLE_CONVERSATION": "የውይይት መላኪያ",
"LOCK_TO_SINGLE_CONVERSATION_SUB_TEXT": "ለአሁን ያሉ እውቂያዎች ውይይት ፍጠራ ያስተካክሉ",
"INBOX_UPDATE_TITLE": "የኢንቦክስ ቅንብሮች",
"INBOX_UPDATE_SUB_TEXT": "የኢንቦክስዎን ቅንብሮች ያዘምኑ",
"AUTO_ASSIGNMENT_SUB_TEXT": "አዲስ ውይይቶችን ወደ ይህ ኢንቦክስ የተጨመሩ ወኪሎች በራስሰር ማድረግን አቅርቦ ወይም አቋርጦ ያድርጉ።",
"AUTO_ASSIGNMENT_SUB_TEXT": "Միացրեք կամ անջատեք նոր հաղորդակցությունները ավտոմատ նշանակումը այս մուտքային արկղին ավելացված գործակալներին։",
"HMAC_VERIFICATION": "የተጠቃሚ መለያ ማረጋገጫ",
"HMAC_DESCRIPTION": "በዚህ ቁልፍ የተለየ ቶክን ማመንጨት ይችላሉ ይህም የተጠቃሚዎችዎን መለያ ለማረጋገጥ ይጠቅማል።.",
"HMAC_LINK_TO_DOCS": "እንደ ተጨማሪ መረጃ እዚህ ማንበብ ይችላሉ።.",
"HMAC_MANDATORY_VERIFICATION": "የተጠቃሚ መለያ ማረጋገጫን አጽድቅ",
"HMAC_MANDATORY_DESCRIPTION": "ከተከፈተ ግምገማዎች ካልተረጋገጡ ጥያቄዎች ይተንቀሳቀሳሉ።.",
"INBOX_IDENTIFIER": "የኢንቦክስ መለያ",
"INBOX_IDENTIFIER_SUB_TEXT": "የ API ደንበኞችዎን ማረጋገጫ ለማድረግ እዚህ የተሳየውን `inbox_identifier` ቶክን ይጠቀሙ።",
"INBOX_IDENTIFIER_SUB_TEXT": "Օգտագործեք այստեղ նշված `inbox_identifier` տոկենը՝ Ձեր API հաճախորդների վավերացման համար։",
"FORWARD_EMAIL_TITLE": "ወደ ኢሜይል አስቀምጥ",
"FORWARD_EMAIL_SUB_TEXT": "ኢሜይሎችዎን ወደ ቀጣዩ ኢሜይል አድራሻ መላክ ይጀምሩ።",
"FORWARD_EMAIL_SUB_TEXT": "Սկսեք Ձեր էլ.փոստերը ուղարկել հետևյալ էլ.փոստի հասցեին։",
"FORWARD_EMAIL_NOT_CONFIGURED": "ኢሜይሎችን ወደ ኢንቦክስዎ መቀላቀል በዚህ መገናኛ አሁን አልተፈቀደም። ይህን ባህሪ ለመጠቀም ከአስተዳደሩ መፍቀድ አለቦት። እባክዎ ለመቀጠል ከእነርሱ ጋር ያገናኙ።.",
"ALLOW_MESSAGES_AFTER_RESOLVED": "ከውይይት መፍታት በኋላ መልእክቶችን እንዲፈቀድ",
"ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "ውይይቱ ከተፈታ በኋላም እንደገና መልእክቶችን ለመላክ ለመጠቀሚያ ተጠቃሚዎች ፈቃድ ይስጡ።",
"ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Թույլ տվեք վերջնական օգտատերերին ուղարկել հաղորդագրություններ նույնիսկ զրույցի լուծումից հետո։",
"WHATSAPP_SECTION_SUBHEADER": "ይህ የAPI ቁልፍ ለWhatsApp API ጋር ለመያዝ ይጠቅማል።.",
"WHATSAPP_SECTION_UPDATE_SUBHEADER": "ለWhatsApp API ጋር ለመያዝ አዲሱን የAPI ቁልፍ ያስገቡ።.",
"WHATSAPP_SECTION_TITLE": "API ቁልፍ",
@@ -850,7 +850,7 @@
"MESSAGE_ERROR": "ስህተት አጋጥሟል፣ እባክዎ እንደገና ይሞክሩ"
},
"PRE_CHAT_FORM": {
"DESCRIPTION": "የቀድሞ ቻት ቅጥያዎች ተጠቃሚ መረጃ ከመደምደሚያ በፊት ለመሰብሰብ ይፈቅዳሉ።",
"DESCRIPTION": "Նախնական զրույցի ձևերը թույլ են տալիս հավաքել օգտատիրոջ տեղեկությունները նախքան զրույցի սկսելը։",
"SET_FIELDS": "የቀደም የውይይት ቅጽ መስኮች",
"SET_FIELDS_HEADER": {
"FIELDS": "መስኮች",
@@ -960,7 +960,7 @@
"HOURS": "ሰዓታት",
"ENABLE": "ለዚህ ቀን እንደሚገኙ አንቀሳቅስ",
"UNAVAILABLE": "አይገኝም",
"VALIDATION_ERROR": "የመጀመሪያ ሰዓት ከመዝጊያ ሰዓት በፊት መሆን አለበት።",
"VALIDATION_ERROR": "Սկիզբի ժամանակը պետք է լինի փակման ժամանակից առաջ։",
"CHOOSE": "ይምረጡ"
},
"ALL_DAY": "ቀኑን ሙሉ"
@@ -1138,12 +1138,12 @@
"TWITTER_PROFILE": "Twitter",
"TWILIO_SMS": "Twilio SMS",
"WHATSAPP": "WhatsApp",
"SMS": "ኤስኤምኤስ",
"SMS": "SMS",
"EMAIL": "ኢሜል",
"TELEGRAM": "ቴሌግራም",
"LINE": "ላይን",
"TELEGRAM": "Telegram",
"LINE": "Line",
"API": "API ቻናል",
"INSTAGRAM": "ኢንስታግራም",
"INSTAGRAM": "Instagram",
"TIKTOK": "TikTok",
"VOICE": "ድምጽ"
}
@@ -738,17 +738,6 @@
"DOCUMENTS": {
"HEADER": "ሰነዶች",
"ADD_NEW": "አዲስ ሰነድ ፍጠር",
"SELECTED": "{count} ተመረጡ",
"SELECT_ALL": "ሁሉንም ይምረጡ ({count})",
"UNSELECT_ALL": "ሁሉንም አልምረጥም ({count})",
"BULK_DELETE_BUTTON": "Delete",
"BULK_DELETE": {
"TITLE": "Delete documents?",
"DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
"CONFIRM": "አዎን፣ ሁሉንም አጥፋ",
"SUCCESS_MESSAGE": "Documents deleted successfully",
"ERROR_MESSAGE": "There was an error deleting the documents, please try again."
},
"RELATED_RESPONSES": {
"TITLE": "ተዛማጅ የFAQ ጥያቄዎች",
"DESCRIPTION": "እነዚህ የFAQ ጥያቄዎች ቀጥተኛ ከሰነዱ ተፈጥረዋል።"
@@ -806,7 +795,6 @@
"CUSTOM_TOOLS": {
"HEADER": "መሣሪያዎች",
"ADD_NEW": "አዲስ መሣሪያ ይፍጠሩ",
"SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "ምንም የተለየ መሣሪያዎች አልተገኙም",
"SUBTITLE": "እርስዎን ከውጭ ኤፒአይዎችና አገልግሎቶች ጋር ለማገናኘት የተለየ መሣሪያዎችን ይፍጠሩ፣ እንዲሁም እርስዎን በአካል ውስጥ መረጃ ለማግኘትና ለማከናወን ይፈቅዱ።",
@@ -837,18 +825,11 @@
"SUCCESS_MESSAGE": "ብልጽግና ተጠቃሚ መሣሪያ ተሰርዟል",
"ERROR_MESSAGE": "ብልጽግና መሣሪያውን ማስወገድ አልተሳካም"
},
"TEST": {
"BUTTON": "Test connection",
"SUCCESS": "Endpoint returned HTTP {status}",
"ERROR": "Connection failed",
"DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
},
"FORM": {
"TITLE": {
"LABEL": "የመሣሪያ ስም",
"PLACEHOLDER": "የትዕዛዝ ፍለጋ",
"ERROR": "የመሣሪያ ስም አስፈላጊ ነው",
"MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
"ERROR": "የመሣሪያ ስም አስፈላጊ ነው"
},
"DESCRIPTION": {
"LABEL": "መግለጫ",
@@ -1,39 +1,39 @@
{
"REPORT": {
"HEADER": "Conversations",
"LOADING_CHART": "ገበታ ውሂብ በማስጫን ላይ...",
"NO_ENOUGH_DATA": "ሪፖርት ለማመንጨት በቂ ውሂብ ነጥቦች አልደረሰንም፣ እባክዎ በኋላ ደግመው ይሞክሩ።",
"LOADING_CHART": "Loading chart data...",
"NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
"DOWNLOAD_CONVERSATION_REPORTS": "Download conversation reports",
"DATA_FETCHING_FAILED": "Failed to fetch data, please try again later.",
"SUMMARY_FETCHING_FAILED": "Failed to fetch summary, please try again later.",
"METRICS": {
"CONVERSATIONS": {
"NAME": "ውይይቶች",
"DESC": "( ጠቅላላ )"
"NAME": "Conversations",
"DESC": "( Total )"
},
"INCOMING_MESSAGES": {
"NAME": "Messages received",
"DESC": "( ጠቅላላ )"
"DESC": "( Total )"
},
"OUTGOING_MESSAGES": {
"NAME": "Messages sent",
"DESC": "( ጠቅላላ )"
"DESC": "( Total )"
},
"FIRST_RESPONSE_TIME": {
"NAME": "First Response Time",
"DESC": "( አማካይ )",
"DESC": "( Avg )",
"INFO_TEXT": "Total number of conversations used for computation:",
"TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)"
},
"RESOLUTION_TIME": {
"NAME": "የመፍትሄ ጊዜ",
"DESC": "( አማካይ )",
"NAME": "Resolution Time",
"DESC": "( Avg )",
"INFO_TEXT": "Total number of conversations used for computation:",
"TOOLTIP_TEXT": "Resolution Time is {metricValue} (based on {conversationCount} conversations)"
},
"RESOLUTION_COUNT": {
"NAME": "የመፍትሄ ብዛት",
"DESC": "( ጠቅላላ )"
"NAME": "Resolution Count",
"DESC": "( Total )"
},
"BOT_RESOLUTION_COUNT": {
"NAME": "Resolution Count",
@@ -61,8 +61,8 @@
"CUSTOM_DATE_RANGE": "Custom date range"
},
"CUSTOM_DATE_RANGE": {
"CONFIRM": "አተግባር ላይ አውርድ",
"PLACEHOLDER": "የቀን ክልል ይምረጡ"
"CONFIRM": "Apply",
"PLACEHOLDER": "Select date range"
},
"GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By",
"DURATION_FILTER_LABEL": "Duration",
@@ -127,12 +127,12 @@
}
},
"AGENT_REPORTS": {
"HEADER": "የወኪሎች እይታ",
"HEADER": "Agents Overview",
"DESCRIPTION": "Easily track agent performance with key metrics such as conversations, response times, resolution times, and resolved cases. Click an agent's name to learn more.",
"LOADING_CHART": "የቅርጸ ቁምፊ ውሂብ በመጫን ላይ...",
"NO_ENOUGH_DATA": "ሪፖርት ለማቅረብ በቂ ውሂብ አልደረሰንም፣ እባክዎ በኋላ ደግመው ይሞክሩ።.",
"DOWNLOAD_AGENT_REPORTS": "የAgent ሪፖርቶችን አውርድ",
"FILTER_DROPDOWN_LABEL": "Agent ይምረጡ",
"LOADING_CHART": "Loading chart data...",
"NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
"DOWNLOAD_AGENT_REPORTS": "Download agent reports",
"FILTER_DROPDOWN_LABEL": "Select Agent",
"FILTERS": {
"INPUT_PLACEHOLDER": {
"AGENTS": "Search agents"
@@ -140,72 +140,72 @@
},
"METRICS": {
"CONVERSATIONS": {
"NAME": "ውይይቶች",
"DESC": "( ጠቅላላ )"
"NAME": "Conversations",
"DESC": "( Total )"
},
"INCOMING_MESSAGES": {
"NAME": "የመጣ መልእክቶች",
"DESC": "( ጠቅላላ )"
"NAME": "Incoming Messages",
"DESC": "( Total )"
},
"OUTGOING_MESSAGES": {
"NAME": "የሚያልኩ መልእክቶች",
"DESC": "( ጠቅላላ )"
"NAME": "Outgoing Messages",
"DESC": "( Total )"
},
"FIRST_RESPONSE_TIME": {
"NAME": "First Response Time",
"DESC": "( አማካይ )",
"DESC": "( Avg )",
"INFO_TEXT": "Total number of conversations used for computation:",
"TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)"
},
"RESOLUTION_TIME": {
"NAME": "የመፍትሄ ጊዜ",
"DESC": "( አማካይ )",
"NAME": "Resolution Time",
"DESC": "( Avg )",
"INFO_TEXT": "Total number of conversations used for computation:",
"TOOLTIP_TEXT": "Resolution Time is {metricValue} (based on {conversationCount} conversations)"
},
"RESOLUTION_COUNT": {
"NAME": "የተፈታ ብዛት",
"DESC": "( ጠቅላላ )"
"NAME": "Resolution Count",
"DESC": "( Total )"
}
},
"DATE_RANGE": [
{
"id": 0,
"name": "ያለፉት 7 ቀናት"
"name": "Last 7 days"
},
{
"id": 1,
"name": "ያለፉት 30 ቀናት"
"name": "Last 30 days"
},
{
"id": 2,
"name": "ያለፉት 3 ወራት"
"name": "Last 3 months"
},
{
"id": 3,
"name": "ያለፉት 6 ወራት"
"name": "Last 6 months"
},
{
"id": 4,
"name": "ያለፈው ዓመት"
"name": "Last year"
},
{
"id": 5,
"name": "በተለይ የተመረጠ ቀን ክልል"
"name": "Custom date range"
}
],
"CUSTOM_DATE_RANGE": {
"CONFIRM": "ተግባሩን ተፈጽም",
"PLACEHOLDER": "የቀን ክልል ይምረጡ"
"CONFIRM": "Apply",
"PLACEHOLDER": "Select date range"
}
},
"LABEL_REPORTS": {
"HEADER": "የመለያ አጠቃላይ እይታ",
"HEADER": "Labels Overview",
"DESCRIPTION": "Track label performance with key metrics including conversations, response times, resolution times, and resolved cases. Click a label name for detailed insights.",
"LOADING_CHART": "የገበታ ውሂብ በመጫን ላይ...",
"NO_ENOUGH_DATA": "የበቂ ውሂብ አልተሰበሰበም፣ እባክዎ በኋላ ይሞክሩ።",
"DOWNLOAD_LABEL_REPORTS": "የመለያ ሪፖርቶችን ይውሰዱ",
"FILTER_DROPDOWN_LABEL": "መለያ ይምረጡ",
"LOADING_CHART": "Loading chart data...",
"NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
"DOWNLOAD_LABEL_REPORTS": "Download label reports",
"FILTER_DROPDOWN_LABEL": "Select Label",
"FILTERS": {
"INPUT_PLACEHOLDER": {
"LABELS": "Search labels"
@@ -213,71 +213,71 @@
},
"METRICS": {
"CONVERSATIONS": {
"NAME": "ውይይቶች",
"DESC": "( ድምር )"
"NAME": "Conversations",
"DESC": "( Total )"
},
"INCOMING_MESSAGES": {
"NAME": "የሚገቡ መልእክቶች",
"DESC": "( ድምር )"
"NAME": "Incoming Messages",
"DESC": "( Total )"
},
"OUTGOING_MESSAGES": {
"NAME": "የወጪ መልእክቶች",
"DESC": "( ድምር )"
"NAME": "Outgoing Messages",
"DESC": "( Total )"
},
"FIRST_RESPONSE_TIME": {
"NAME": "First Response Time",
"DESC": "( አማካይ )",
"DESC": "( Avg )",
"INFO_TEXT": "Total number of conversations used for computation:",
"TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)"
},
"RESOLUTION_TIME": {
"NAME": "የመፍትሄ ጊዜ",
"DESC": "( አማካይ )",
"NAME": "Resolution Time",
"DESC": "( Avg )",
"INFO_TEXT": "Total number of conversations used for computation:",
"TOOLTIP_TEXT": "Resolution Time is {metricValue} (based on {conversationCount} conversations)"
},
"RESOLUTION_COUNT": {
"NAME": "የመፍትሄ ብዛት",
"DESC": "( ድምር )"
"NAME": "Resolution Count",
"DESC": "( Total )"
}
},
"DATE_RANGE": [
{
"id": 0,
"name": "ያለፉ 7 ቀናት"
"name": "Last 7 days"
},
{
"id": 1,
"name": "ያለፉ 30 ቀናት"
"name": "Last 30 days"
},
{
"id": 2,
"name": "ያለፉት 3 ወራት"
"name": "Last 3 months"
},
{
"id": 3,
"name": "ያለፉት 6 ወራት"
"name": "Last 6 months"
},
{
"id": 4,
"name": "ያለፈው ዓመት"
"name": "Last year"
},
{
"id": 5,
"name": "በተፈጥሮ የተመረጠ የቀን ክልል"
"name": "Custom date range"
}
],
"CUSTOM_DATE_RANGE": {
"CONFIRM": "ተግባር አድርግ",
"PLACEHOLDER": "የቀን ክልል ይምረጡ"
"CONFIRM": "Apply",
"PLACEHOLDER": "Select date range"
}
},
"INBOX_REPORTS": {
"HEADER": "የኢንቦክስ አጠቃላይ እይታ",
"HEADER": "Inbox Overview",
"DESCRIPTION": "Quickly view your inbox performance with key metrics like conversations, response times, resolution times, and resolved cases—all in one place. Click an inbox name for more details.",
"LOADING_CHART": "የገቢ ግምገማ መረጃ በመጫን ላይ...",
"NO_ENOUGH_DATA": "ሪፖርት ለማዘጋጀት በቂ መረጃ አልተደረሰም። እባክዎ በኋላ ይሞክሩ።",
"DOWNLOAD_INBOX_REPORTS": "የኢንቦክስ ሪፖርቶችን ይውሰዱ",
"LOADING_CHART": "Loading chart data...",
"NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
"DOWNLOAD_INBOX_REPORTS": "Download inbox reports",
"FILTER_DROPDOWN_LABEL": "Select Inbox",
"ALL_INBOXES": "All Inboxes",
"SEARCH_INBOX": "Search Inbox",
@@ -424,7 +424,7 @@
}
},
"CSAT_REPORTS": {
"HEADER": "CSAT ሪፖርቶች",
"HEADER": "CSAT Reports",
"NO_RECORDS": "No responses yet",
"NO_RECORDS_DESCRIPTION": "CSAT survey responses will appear here once customers start providing feedback.",
"DOWNLOAD": "Download CSAT Reports",
@@ -454,10 +454,10 @@
},
"TABLE": {
"HEADER": {
"CONTACT_NAME": "እውቂያ",
"CONTACT_NAME": "Contact",
"AGENT_NAME": "Agent",
"RATING": "እምነት ደረጃ",
"FEEDBACK_TEXT": "አስተያየት አስተያየት",
"RATING": "Rating",
"FEEDBACK_TEXT": "Feedback comment",
"CONVERSATION": "Conversation",
"CUSTOMER": "Customer",
"RESPONSE": "Response",
@@ -469,16 +469,16 @@
"NO_FEEDBACK": "No feedback provided",
"METRIC": {
"TOTAL_RESPONSES": {
"LABEL": "ጠቅላላ ምላሾች",
"TOOLTIP": "የተሰበሰበው ምላሾች ጠቅላላ ብዛት"
"LABEL": "Total responses",
"TOOLTIP": "Total number of responses collected"
},
"SATISFACTION_SCORE": {
"LABEL": "የደስታ ነጥብ",
"TOOLTIP": "አጠቃላይ የአዎንታዊ ምላሾች ብዛት / አጠቃላይ የምላሾች ብዛት * 100"
"LABEL": "Satisfaction score",
"TOOLTIP": "Total number of positive responses / Total number of responses * 100"
},
"RESPONSE_RATE": {
"LABEL": "የምላሽ ተመን",
"TOOLTIP": "አጠቃላይ የምላሾች ብዛት / አጠቃላይ የተላኩ የCSAT እቅድ መልእክቶች ብዛት * 100"
"LABEL": "Response rate",
"TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100"
},
"RATING_DISTRIBUTION": "Rating distribution"
},
@@ -316,18 +316,6 @@
"SUCCESS_MESSAGE": "تم إزالة اللغة من البوابة بنجاح",
"ERROR_MESSAGE": "غير قادر على إزالة اللغة من البوابة. حاول مرة أخرى."
}
},
"DRAFT_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale moved to draft successfully",
"ERROR_MESSAGE": "Unable to move locale to draft. Try again."
}
},
"PUBLISH_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale published successfully",
"ERROR_MESSAGE": "Unable to publish locale. Try again."
}
}
},
"TABLE": {
@@ -656,11 +644,8 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "افتراضي",
"DRAFT": "مسودة",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
"MOVE_TO_DRAFT": "Move to draft",
"PUBLISH_LOCALE": "Publish locale",
"DELETE": "حذف"
}
},
@@ -670,13 +655,6 @@
"COMBOBOX": {
"PLACEHOLDER": "حدد اللغة..."
},
"STATUS": {
"LABEL": "الحالة",
"OPTIONS": {
"LIVE": "نُشرت",
"DRAFT": "مسودة"
}
},
"API": {
"SUCCESS_MESSAGE": "تمت إضافة اللغة بنجاح",
"ERROR_MESSAGE": "غير قادر على إضافة اللغة . حاول مرة أخرى."
@@ -715,7 +715,7 @@
},
"ALLOW_MOBILE_WEBVIEW": {
"LABEL": "Enable widget in mobile apps",
"SUBTITLE": "حدد هذا الخيار إذا كنت تقوم بتضمين الأداة في تطبيقات iOS أو Android. لا ترسل تطبيقات الجوال معلومات النطاق، لذا سيتم حظرها بسبب قيود النطاق ما لم يتم تفعيل هذا الخيار."
"SUBTITLE": "Check this if you embed the widget in iOS or Android apps. Mobile apps don't send domain information, so they would be blocked by domain restrictions unless this is enabled."
},
"IDENTITY_VALIDATION": {
"TITLE": "Identity Validation",
@@ -126,7 +126,7 @@
},
"HELP_TEXT": {
"TITLE": "استخدام تكامل Slack",
"BODY": "باستخدام هذا التكامل، ستتم مزامنة جميع محادثاتك الواردة مع قناة ***{selectedChannelName}*** في مساحة عمل Slack الخاصة بك. يمكنك إدارة جميع محادثات عملائك مباشرة من داخل القناة ولن تفوّت أي رسالة.\n\nفيما يلي الميزات الرئيسية لهذا التكامل:\n\n**الرد على المحادثات من داخل Slack:** للرد على محادثة في قناة Slack ***{selectedChannelName}***، ما عليك سوى كتابة رسالتك وإرسالها كسلسلة رسائل. سيؤدي ذلك إلى إنشاء رد للعميل عبر Chatwoot. الأمر بهذه البساطة!\n\n **إنشاء ملاحظات خاصة:** إذا كنت تريد إنشاء ملاحظات خاصة بدلاً من الردود، فابدأ رسالتك بـ ***`note:`***. يضمن ذلك بقاء رسالتك خاصة وعدم ظهورها للعميل.\n\n**ربط ملف وكيل:** إذا كان الشخص الذي ردّ في Slack لديه ملف وكيل في Chatwoot تحت البريد الإلكتروني نفسه، فسيتم ربط الردود تلقائيًا بذلك الملف. وهذا يعني أنه يمكنك بسهولة تتبع من قال ماذا ومتى. من ناحية أخرى، إذا لم يكن لدى الشخص الذي ردّ ملف وكيل مرتبط، فستظهر الردود للعميل على أنها صادرة من ملف البوت.",
"BODY": "With this integration, all of your incoming conversations will be synced to the ***{selectedChannelName}*** channel in your Slack workspace. You can manage all your customer conversations right within the channel and never miss a message.\n\nHere are the main features of the integration:\n\n**Respond to conversations from within Slack:** To respond to a conversation in the ***{selectedChannelName}*** Slack channel, simply type out your message and send it as a thread. This will create a response back to the customer through Chatwoot. It's that simple!\n\n **Create private notes:** If you want to create private notes instead of replies, start your message with ***`note:`***. This ensures that your message is kept private and won't be visible to the customer.\n\n**Associate an agent profile:** If the person who replied on Slack has an agent profile in Chatwoot under the same email, the replies will be associated with that agent profile automatically. This means you can easily track who said what and when. On the other hand, when the replier doesn't have an associated agent profile, the replies will appear from the bot profile to the customer.",
"SELECTED": "selected"
},
"SELECT_CHANNEL": {
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "قائد",
"HEADER_KNOW_MORE": "اعرف المزيد",
"HEADER_KNOW_MORE": "Know more",
"ASSISTANT_SWITCHER": {
"ASSISTANTS": "المساعدون",
"SWITCH_ASSISTANT": "التبديل بين المساعدين",
"NEW_ASSISTANT": "إنشاء مساعد",
"EMPTY_LIST": "لم يتم العثور على مساعدين، يرجى إنشاء واحد للبدء"
"ASSISTANTS": "Assistants",
"SWITCH_ASSISTANT": "Switch between assistants",
"NEW_ASSISTANT": "Create Assistant",
"EMPTY_LIST": "No assistants found, please create one to get started"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
"PANEL_TITLE": "ابدأ مع Copilot",
"KICK_OFF_MESSAGE": "هل تحتاج إلى ملخص سريع، ترغب في مراجعة المحادثات السابقة، أو صياغة رد أفضل؟ Copilot هنا لتسريع الأمور.",
"PANEL_TITLE": "Get started with Copilot",
"KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
"SEND_MESSAGE": "إرسال الرسالة...",
"EMPTY_MESSAGE": "حدث خطأ أثناء توليد الاستجابة. يرجى المحاولة مرة أخرى.",
"LOADER": "يقوم Captain بالتفكير",
"EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
"LOADER": "Captain is thinking",
"YOU": "أنت",
"USE": "استخدام هذا",
"RESET": "إعادة تعيين",
"SHOW_STEPS": "عرض الخطوات",
"SELECT_ASSISTANT": "اختر المساعد",
"USE": "Use this",
"RESET": "Reset",
"SHOW_STEPS": "Show steps",
"SELECT_ASSISTANT": "Select Assistant",
"PROMPTS": {
"SUMMARIZE": {
"LABEL": "لخص هذه المحادثة",
"CONTENT": "لخص النقاط الرئيسية التي نوقشت بين العميل ووكيل الدعم، بما في ذلك مخاوف العميل، أسئلته، والحلول أو الردود المقدمة من الوكيل."
"LABEL": "Summarize this conversation",
"CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
},
"SUGGEST": {
"LABEL": "اقترح إجابة",
"CONTENT": "حلل استفسار العميل وقم بصياغة رد يعالج مخاوفه أو أسئلته بفعالية. تأكد من أن الرد واضح، موجز، ويوفر معلومات مفيدة."
"LABEL": "Suggest an answer",
"CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
},
"RATE": {
"LABEL": "قم بتقييم هذه المحادثة",
"CONTENT": "راجع المحادثة لترى مدى تلبيتها لاحتياجات العميل. شارك تقييمًا من 5 بناءً على النغمة، الوضوح، والفعالية."
"LABEL": "Rate this conversation",
"CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
},
"HIGH_PRIORITY": {
"LABEL": "المحادثات ذات الأولوية العالية",
"CONTENT": "اعطني ملخصًا لجميع المحادثات المفتوحة ذات الأولوية العالية. تضمّن معرف المحادثة، اسم العميل (إن وُجد)، محتوى آخر رسالة، والوكيل المعين. قم بالتجميع حسب الحالة إذا كان ذلك مناسبًا."
"LABEL": "High priority conversations",
"CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
},
"LIST_CONTACTS": {
"LABEL": "قائمة جهات الاتصال",
"CONTENT": "اعرض لي قائمة بأفضل 10 جهات اتصال. تضمّن الاسم، البريد الإلكتروني أو رقم الهاتف (إن وُجد)، آخر وقت مشاهدة، العلامات (إن وجدت)."
"LABEL": "List contacts",
"CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
}
}
},
"PLAYGROUND": {
"USER": "أنت",
"ASSISTANT": "مساعد",
"ASSISTANT": "Assistant",
"MESSAGE_PLACEHOLDER": "أكتب رسالتك...",
"HEADER": "ساحة اللعب",
"DESCRIPTION": "استخدم هذه الساحة لإرسال رسائل إلى مساعدك والتحقق مما إذا كان يرد بدقة وسرعة وبالنغمة التي تتوقعها.",
"CREDIT_NOTE": "الرسائل المرسلة هنا ستُحتسب ضمن رصيد Captain الخاص بك."
"HEADER": "Playground",
"DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
"CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
},
"PAYWALL": {
"TITLE": "قم بالترقية لاستخدام Captain AI",
"AVAILABLE_ON": "Captain غير متاح على الخطة المجانية.",
"UPGRADE_PROMPT": "قم بترقية خطتك للحصول على الوصول إلى مساعدينا، وcopilot، والمزيد.",
"TITLE": "Upgrade to use Captain AI",
"AVAILABLE_ON": "Captain is not available on the free plan.",
"UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
"AVAILABLE_ON": "ولا يتوفر الكابتن AI إلا في خطط المؤسسة.",
"UPGRADE_PROMPT": "قم بترقية خطتك للحصول على الوصول إلى مساعدينا، وcopilot، والمزيد.",
"UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"BANNER": {
"RESPONSES": "لقد استخدمت أكثر من 80٪ من حد الاستجابات الخاص بك. للاستمرار في استخدام Captain AI، يرجى الترقية.",
"DOCUMENTS": "تم الوصول إلى حد المستندات. قم بالترقية للاستمرار في استخدام Captain AI."
"RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
"DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
},
"FORM": {
"CANCEL": "إلغاء",
@@ -738,17 +738,6 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
"SELECTED": "{count} selected",
"SELECT_ALL": "Select all ({count})",
"UNSELECT_ALL": "Unselect all ({count})",
"BULK_DELETE_BUTTON": "حذف",
"BULK_DELETE": {
"TITLE": "Delete documents?",
"DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
"CONFIRM": "Yes, delete all",
"SUCCESS_MESSAGE": "Documents deleted successfully",
"ERROR_MESSAGE": "There was an error deleting the documents, please try again."
},
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -806,7 +795,6 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
"SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -837,18 +825,11 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
"TEST": {
"BUTTON": "Test connection",
"SUCCESS": "Endpoint returned HTTP {status}",
"ERROR": "Connection failed",
"DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
},
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
"ERROR": "Tool name is required",
"MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
"ERROR": "Tool name is required"
},
"DESCRIPTION": {
"LABEL": "الوصف",
@@ -316,18 +316,6 @@
"SUCCESS_MESSAGE": "Dil portaldan uğurla silindi",
"ERROR_MESSAGE": "Dili portaldan silmək mümkün olmadı. Yenidən cəhd edin."
}
},
"DRAFT_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale moved to draft successfully",
"ERROR_MESSAGE": "Unable to move locale to draft. Try again."
}
},
"PUBLISH_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale published successfully",
"ERROR_MESSAGE": "Unable to publish locale. Try again."
}
}
},
"TABLE": {
@@ -656,11 +644,8 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Default",
"DRAFT": "Qaralama",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
"MOVE_TO_DRAFT": "Move to draft",
"PUBLISH_LOCALE": "Publish locale",
"DELETE": "Delete"
}
},
@@ -670,13 +655,6 @@
"COMBOBOX": {
"PLACEHOLDER": "Select locale..."
},
"STATUS": {
"LABEL": "Status",
"OPTIONS": {
"LIVE": "Yayımlanıb",
"DRAFT": "Qaralama"
}
},
"API": {
"SUCCESS_MESSAGE": "Locale added successfully",
"ERROR_MESSAGE": "Unable to add locale. Try again."
@@ -3,18 +3,18 @@
"SHOPIFY": {
"HEADER": "Shopify",
"DELETE": {
"TITLE": "Shopify İnteqrasiyasını Sil",
"MESSAGE": "Shopify inteqrasiyasını silmək istədiyinizə əminsiniz?"
"TITLE": "Delete Shopify Integration",
"MESSAGE": "Are you sure you want to delete the Shopify integration?"
},
"STORE_URL": {
"TITLE": "Shopify Mağazasını Bağla",
"LABEL": "Mağaza URL-i",
"TITLE": "Connect Shopify Store",
"LABEL": "Store URL",
"PLACEHOLDER": "your-store.myshopify.com",
"HELP": "Shopify mağazanızın myshopify.com URL-ni daxil edin",
"HELP": "Enter your Shopify store's myshopify.com URL",
"CANCEL": "Ləğv et",
"SUBMIT": "Mağazanı Bağla"
"SUBMIT": "Connect Store"
},
"ERROR": "Shopify-a qoşularkən xəta baş verdi. Zəhmət olmasa yenidən cəhd edin və ya problem davam edərsə dəstək xidməti ilə əlaqə saxlayın."
"ERROR": "There was an error connecting to Shopify. Please try again or contact support if the issue persists."
},
"HEADER": "İnteqrasiyalar",
"DESCRIPTION": "Chatwoot komandamızın səmərəliliyini artırmaq üçün bir neçə alət və xidmətlə inteqrasiya olunur. Sevdiyiniz tətbiqləri konfiqurasiya etmək üçün aşağıdakı siyahını araşdırın.",
@@ -126,7 +126,7 @@
},
"HELP_TEXT": {
"TITLE": "Slack inteqrasiyasından necə istifadə etmək olar?",
"BODY": "Bu inteqrasiya ilə bütün gələn söhbətləriniz Slack iş sahənizdəki ***{selectedChannelName}*** kanalına sinxronlaşdırılacaq. Müştəri söhbətlərinizə birbaşa həmin kanalda nəzarət edə və heç bir mesajı qaçırmazsınız.\n\nİnteqrasiyanın əsas xüsusiyyətləri bunlardır:\n\n**Slack daxilində söhbətlərə cavab verin:** ***{selectedChannelName}*** Slack kanalında söhbətə cavab vermək üçün sadəcə mesajınızı yazıb thread kimi göndərin. Bu, Chatwoot vasitəsilə müştəriyə cavab göndərəcək. Çox sadədir!\n\n**Şəxsi qeydlər yaradın:** Əgər cavab əvəzinə şəxsi qeyd əlavə etmək istəyirsinizsə, mesajınıza ***`note:`*** ilə başlayın. Bu halda mesajınız şəxsi qalacaq və müştəriyə görünməyəcək.\n\n**Agent profilini əlaqələndirin:** Əgər Slack-də cavab verən şəxsin Chatwoot-da eyni e-poçt ünvanı ilə agent profili varsa, cavablar avtomatik olaraq həmin agent profili ilə əlaqələndiriləcək. Bu, kim nə vaxt nə yazıb asanlıqla izləməyə imkan verir. Əks halda, agent profili əlaqələndirilməyibsə, cavablar müştəriyə bot profili adından göndəriləcək.",
"BODY": "With this integration, all of your incoming conversations will be synced to the ***{selectedChannelName}*** channel in your Slack workspace. You can manage all your customer conversations right within the channel and never miss a message.\n\nHere are the main features of the integration:\n\n**Respond to conversations from within Slack:** To respond to a conversation in the ***{selectedChannelName}*** Slack channel, simply type out your message and send it as a thread. This will create a response back to the customer through Chatwoot. It's that simple!\n\n **Create private notes:** If you want to create private notes instead of replies, start your message with ***`note:`***. This ensures that your message is kept private and won't be visible to the customer.\n\n**Associate an agent profile:** If the person who replied on Slack has an agent profile in Chatwoot under the same email, the replies will be associated with that agent profile automatically. This means you can easily track who said what and when. On the other hand, when the replier doesn't have an associated agent profile, the replies will appear from the bot profile to the customer.",
"SELECTED": "seçilmiş"
},
"SELECT_CHANNEL": {
@@ -364,400 +364,389 @@
"SUCCESS": "Məsələ uğurla bağlantısı kəsildi",
"ERROR": "Məsələnin bağlantısını kəsməkdə xəta baş verdi, zəhmət olmasa yenidən cəhd edin"
},
"NO_LINKED_ISSUES": "Bağlı məsələ tapılmadı",
"NO_LINKED_ISSUES": "No linked issues found",
"DELETE": {
"TITLE": "İnteqrasiyanı silmək istədiyinizə əminsiniz?",
"MESSAGE": "İnteqrasiyanı silmək istədiyinizə əminsiniz?",
"CONFIRM": "Bəli, sil",
"TITLE": "Are you sure you want to delete the integration?",
"MESSAGE": "Are you sure you want to delete the integration?",
"CONFIRM": "Yes, delete",
"CANCEL": "Ləğv et"
},
"CTA": {
"TITLE": "Linear-a qoşul",
"AGENT_DESCRIPTION": "Linear iş sahəsi qoşulmayıb. Bu inteqrasiyadan istifadə etmək üçün administratorunuzdan bir iş sahəsi qoşmasını xahiş edin.",
"DESCRIPTION": "Linear iş sahəsi qoşulmayıb. Bu inteqrasiyadan istifadə etmək üçün iş sahənizi qoşmaq məqsədilə aşağıdakı düyməyə klikləyin.",
"BUTTON_TEXT": "Linear iş sahəsini qoşun"
"TITLE": "Connect to Linear",
"AGENT_DESCRIPTION": "Linear workspace is not connected. Request your administrator to connect a workspace to use this integration.",
"DESCRIPTION": "Linear workspace is not connected. Click the button below to connect your workspace to use this integration.",
"BUTTON_TEXT": "Connect Linear workspace"
}
},
"NOTION": {
"HEADER": "Notion",
"DELETE": {
"TITLE": "Notion inteqrasiyasını silmək istədiyinizə əminsiniz?",
"TITLE": "Are you sure you want to delete the Notion integration?",
"MESSAGE": "Bu inteqrasiyanı silmək Notion iş sahənizə girişinizi itirəcək və bütün əlaqəli funksionallığı dayandıracaq.",
"CONFIRM": "Bəli, sil",
"CONFIRM": "Yes, delete",
"CANCEL": "Ləğv et"
}
}
},
"CAPTAIN": {
"NAME": "Captain",
"HEADER_KNOW_MORE": "Daha ətraflı",
"NAME": "Kapitan",
"HEADER_KNOW_MORE": "Daha çox məlumat",
"ASSISTANT_SWITCHER": {
"ASSISTANTS": "Köməkçilər",
"SWITCH_ASSISTANT": "Köməkçilər arasında keçid edin",
"ASSISTANTS": "Assistants",
"SWITCH_ASSISTANT": "Switch between assistants",
"NEW_ASSISTANT": "Köməkçi yaradın",
"EMPTY_LIST": "Assistent tapılmadı, başlamaq üçün birini yaradın"
"EMPTY_LIST": "No assistants found, please create one to get started"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Bu təklifləri yoxlayın",
"PANEL_TITLE": "Copilot ilə başlayın",
"KICK_OFF_MESSAGE": "Qısa xülasəyə ehtiyacınız var, əvvəlki söhbətlərə baxmaq istəyirsiniz, yoxsa daha yaxşı cavab hazırlamaq istəyirsiniz? Copilot işləri sürətləndirmək üçün buradadır.",
"SEND_MESSAGE": "Mesaj göndərin...",
"EMPTY_MESSAGE": "Cavab yaradılarkən xəta baş verdi. Zəhmət olmasa yenidən cəhd edin.",
"TRY_THESE_PROMPTS": "Bu təklifləri sınayın",
"PANEL_TITLE": "Get started with Copilot",
"KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
"SEND_MESSAGE": "Mesaj göndər...",
"EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
"LOADER": "Captain düşünür",
"YOU": "Siz",
"USE": "Bunu istifadə et",
"RESET": "Sıfırla",
"RESET": "Reset",
"SHOW_STEPS": "Addımları göstər",
"SELECT_ASSISTANT": "Köməkçini seçin",
"SELECT_ASSISTANT": "Select Assistant",
"PROMPTS": {
"SUMMARIZE": {
"LABEL": "Bu söhbəti xülasə et",
"CONTENT": "Müştəri və dəstək agenti arasında müzakirə olunan əsas məqamları xülasə et, müştərinin narahatlıqları, sualları və agentin verdiyi həll və ya cavabları daxil et"
"LABEL": "Summarize this conversation",
"CONTENT": "Müştəri ilə dəstək agenti arasında müzakirə olunan əsas məqamları ümumiləşdirin, o cümlədən müştərinin narahatlıqları, sualları və dəstək agentinin təqdim etdiyi həllər və ya cavablar"
},
"SUGGEST": {
"LABEL": "Cavab təklif et",
"CONTENT": "Müştərinin sorğusunu analiz et və onların narahatlıqlarını və ya suallarını effektiv şəkildə cavablandıran bir cavab hazırla. Cavabın aydın, qısa və faydalı məlumat verdiyinə əmin ol."
"LABEL": "Cavab təklif edin",
"CONTENT": "Müştərinin sorğusunu təhlil edin və narahatlıqlarını və ya suallarını effektiv şəkildə əhatə edən cavab layihələndirin. Cavabın aydın, qısa və faydalı məlumat verdiyinə əmin olun."
},
"RATE": {
"LABEL": "Bu söhbəti qiymətləndir",
"CONTENT": "Söhbəti nəzərdən keçir və müştərinin ehtiyaclarını nə dərəcədə qarşıladığını yoxla. Ton, aydınlıq və effektivliyə əsaslanaraq 5 üzərindən qiymət ver."
"LABEL": "Rate this conversation",
"CONTENT": "Müştərinin ehtiyaclarını nə dərəcədə qarşıladığını görmək üçün söhbəti nəzərdən keçirin. Ton, aydınlıq və effektivlik əsasında 5 ballıq qiymətləndirmə paylaşın."
},
"HIGH_PRIORITY": {
"LABEL": "Yüksək prioritetli söhbətlər",
"CONTENT": "Bütün yüksək prioritetli açıq söhbətlərin xülasəsini ver. Söhbət ID-si, müştərinin adı (əgər varsa), son mesajın məzmunu və təyin olunmuş agenti daxil et. Əgər uyğun olarsa, statusa görə qrupla."
"LABEL": "High priority conversations",
"CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
},
"LIST_CONTACTS": {
"LABEL": "Əlaqələri siyahıla",
"CONTENT": "Ən yaxşı 10 əlaqənin siyahısını göstər. Ad, e-poçt və ya telefon nömrəsi (əgər varsa), son görülmə vaxtı, etiketlər (əgər varsa) daxil et."
"LABEL": "List contacts",
"CONTENT": "Mənə ən yaxşı 10 əlaqə siyahısını göstərin. Ad, e-poçt və ya telefon nömrəsi (mövcuddursa), son görülmə vaxtı, etiketlər (əgər varsa) daxil edin."
}
}
},
"PLAYGROUND": {
"USER": "Siz",
"ASSISTANT": "Assistent",
"MESSAGE_PLACEHOLDER": "Mesajınızı yazın...",
"HEADER": "Sınaq sahəsi",
"DESCRIPTION": "Bu sınaq sahəsində köməkçinizə mesaj göndərin və cavabların dəqiq, sürətli və istədiyiniz tonda olub-olmadığını yoxlayın.",
"CREDIT_NOTE": "Burada göndərilən mesajlar Captain kreditlərinizdən çıxılacaq."
"ASSISTANT": "Köməkçi",
"MESSAGE_PLACEHOLDER": "Type your message...",
"HEADER": "Oyun Sahəsi",
"DESCRIPTION": "Bu meydançadan köməkçinizə mesajlar göndərmək və onun dəqiq, sürətli və gözlədiyiniz tonda cavab verib-vermədiyini yoxlamaq üçün istifadə edin.",
"CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
},
"PAYWALL": {
"TITLE": "Captain AI istifadə etmək üçün yüksəldin",
"AVAILABLE_ON": "Captain pulsuz planda mövcud deyil.",
"UPGRADE_PROMPT": "Assistentlərimizə, copilot və daha çoxuna çıxış əldə etmək üçün planınızı yüksəldin.",
"UPGRADE_NOW": "İndi yüksəlt",
"CANCEL_ANYTIME": "Planınızı istənilən vaxt dəyişə və ya ləğv edə bilərsiniz"
"TITLE": "Upgrade to use Captain AI",
"AVAILABLE_ON": "Captain is not available on the free plan.",
"UPGRADE_PROMPT": "Köməkçilərimizə, copilot və daha çoxuna giriş üçün planınızı yüksəldin.",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
"AVAILABLE_ON": "Captain AI yalnız Enterprise planlarında mövcuddur.",
"UPGRADE_PROMPT": "Assistentlərimizə, copilot və daha çoxuna çıxış əldə etmək üçün planınızı yüksəldin.",
"ASK_ADMIN": "Təkmilləşdirmə üçün administratorunuzla əlaqə saxlayın."
"AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
"UPGRADE_PROMPT": "Köməkçilərimizə, copilot və daha çoxuna giriş üçün planınızı yüksəldin.",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"BANNER": {
"RESPONSES": "Cavab limitinizin 80%-dən çoxunu istifadə etmisiniz. Captain AI-dan istifadə etməyə davam etmək üçün zəhmət olmasa tarifinizi yüksəldin.",
"DOCUMENTS": "Sənəd limiti çatdı. Captain AI-dan istifadəni davam etdirmək üçün yüksəldin."
"RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
"DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
},
"FORM": {
"CANCEL": "Ləğv et",
"CREATE": "Yarat",
"CREATE": "Create",
"EDIT": "Yenilə"
},
"ASSISTANTS": {
"HEADER": "Köməkçilər",
"NO_ASSISTANTS_AVAILABLE": "Hesabınızda heç bir köməkçi yoxdur.",
"HEADER": "Assistants",
"NO_ASSISTANTS_AVAILABLE": "There are no assistants available in your account.",
"ADD_NEW": "Yeni köməkçi yaradın",
"DELETE": {
"TITLE": "Assistent silinsin?",
"DESCRIPTION": "Bu əməliyyat geri qaytarıla bilməz. Bu assistenti silmək onu bütün bağlı poçt qutularından siləcək və yaradılmış bütün bilikləri daimi olaraq siləcək.",
"CONFIRM": "Bəli, sil",
"SUCCESS_MESSAGE": "Assistent uğurla silindi",
"ERROR_MESSAGE": "Köməkçi silinərkən xəta baş verdi, zəhmət olmasa yenidən cəhd edin."
"TITLE": "Are you sure to delete the assistant?",
"DESCRIPTION": "Bu əməliyyat geri dönməzdir. Bu köməkçi silindikdə, o, bütün əlaqəli qutulardan silinəcək və yaradılmış bütün biliklər daimi olaraq silinəcək.",
"CONFIRM": "Yes, delete",
"SUCCESS_MESSAGE": "The assistant has been successfully deleted",
"ERROR_MESSAGE": "There was an error deleting the assistant, please try again."
},
"FORM_DESCRIPTION": "Aşağıdakı detalları doldurun: assistentinizin adını, məqsədini və dəstək verəcəyi məhsulu qeyd edin.",
"FORM_DESCRIPTION": "Fill out the details below to name your assistant, describe its purpose, and specify the product it will support.",
"CREATE": {
"TITLE": "Assistent yarat",
"SUCCESS_MESSAGE": "Assistent uğurla yaradıldı",
"ERROR_MESSAGE": "Köməkçi yaradılarkən xəta baş verdi, zəhmət olmasa yenidən cəhd edin."
"TITLE": "Köməkçi yaradın",
"SUCCESS_MESSAGE": "Köməkçi uğurla yaradıldı",
"ERROR_MESSAGE": "There was an error creating the assistant, please try again."
},
"FORM": {
"UPDATE": "Yenilə",
"SECTIONS": {
"BASIC_INFO": "Əsas Məlumat",
"SYSTEM_MESSAGES": "Sistem Mesajları",
"INSTRUCTIONS": "Təlimatlar",
"SYSTEM_MESSAGES": "System Messages",
"INSTRUCTIONS": "Instructions",
"FEATURES": "Xüsusiyyətlər",
"TOOLS": "Alətlər"
"TOOLS": "Alətlər "
},
"NAME": {
"LABEL": "Ad",
"PLACEHOLDER": "Assistent adını daxil edin",
"PLACEHOLDER": "Köməkçi adını daxil edin",
"ERROR": "Ad tələb olunur"
},
"TEMPERATURE": {
"LABEL": "Cavab Temperaturu",
"DESCRIPTION": "Assistentin cavablarının nə qədər yaradıcı və ya məhdud olacağını tənzimləyin. Aşağı dəyərlər daha fokuslanmış və deterministik cavablar verir, yüksək dəyərlər isə daha yaradıcı və müxtəlif nəticələr verir."
"LABEL": "Cavabın Temperaturu",
"DESCRIPTION": "Adjust how creative or restrictive the assistant's responses should be. Lower values produce more focused and deterministic responses, while higher values allow for more creative and varied outputs."
},
"DESCRIPTION": {
"LABEL": "Təsvir",
"PLACEHOLDER": "Assistent təsvirini daxil edin",
"PLACEHOLDER": "Enter assistant description",
"ERROR": "Təsvir tələb olunur"
},
"PRODUCT_NAME": {
"LABEL": "Məhsulun Adı",
"LABEL": "Product Name",
"PLACEHOLDER": "Məhsul adını daxil edin",
"ERROR": "Məhsulun adı tələb olunur"
"ERROR": "The product name is required"
},
"WELCOME_MESSAGE": {
"LABEL": "Salamlaşma Mesajı",
"PLACEHOLDER": "Salamlaşma mesajını daxil edin"
"LABEL": "Welcome Message",
"PLACEHOLDER": "Enter welcome message"
},
"HANDOFF_MESSAGE": {
"LABEL": "Transfer Mesajı",
"PLACEHOLDER": "Transfer mesajını daxil edin"
"LABEL": "Handoff Message",
"PLACEHOLDER": "Enter handoff message"
},
"RESOLUTION_MESSAGE": {
"LABEL": "Həll mesajı",
"PLACEHOLDER": "Həll mesajını daxil edin"
"LABEL": "Resolution Message",
"PLACEHOLDER": "Enter resolution message"
},
"INSTRUCTIONS": {
"LABEL": "Təlimatlar",
"PLACEHOLDER": "Assistent üçün təlimatları daxil edin"
"LABEL": "Instructions",
"PLACEHOLDER": "Enter instructions for the assistant"
},
"FEATURES": {
"TITLE": "Xüsusiyyətlər",
"ALLOW_CONVERSATION_FAQS": "Həll olunmuş söhbətlərdən FAQ yaradın",
"ALLOW_MEMORIES": "Müştəri ilə ünsiyyətdən əsas detalları yadda saxla.",
"ALLOW_CITATIONS": "Cavablarda mənbə istinadlarını daxil et",
"ALLOW_CONTACT_ATTRIBUTES": "Əlaqə məlumatlarına çıxışa icazə ver"
"ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations",
"ALLOW_MEMORIES": "Müştəri qarşılıqlı əlaqələrindən əsas detalları yaddaş kimi tutun.",
"ALLOW_CITATIONS": "Include source citations in responses",
"ALLOW_CONTACT_ATTRIBUTES": "Allow access to contact information"
}
},
"EDIT": {
"TITLE": "Assistenti yenilə",
"SUCCESS_MESSAGE": "Assistent uğurla yeniləndi",
"ERROR_MESSAGE": "Köməkçi yenilənərkən xəta baş verdi, zəhmət olmasa yenidən cəhd edin.",
"NOT_FOUND": "Köməkçi tapılmadı. Zəhmət olmasa yenidən cəhd edin."
"TITLE": "Update the assistant",
"SUCCESS_MESSAGE": "The assistant has been successfully updated",
"ERROR_MESSAGE": "There was an error updating the assistant, please try again.",
"NOT_FOUND": "Could not find the assistant. Please try again."
},
"SETTINGS": {
"HEADER": "Ayarlar",
"HEADER": "Parametrlər",
"BASIC_SETTINGS": {
"TITLE": "Əsas ayarlar",
"DESCRIPTION": "Assistentin söhbəti bitirərkən və ya insana ötürərkən nə deyəcəyini fərdiləşdirin."
"TITLE": "Basic settings",
"DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human."
},
"SYSTEM_SETTINGS": {
"TITLE": "Sistem ayarları",
"DESCRIPTION": "Assistentin söhbəti bitirərkən və ya insana ötürərkən nə deyəcəyini fərdiləşdirin."
"TITLE": "System settings",
"DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human."
},
"CONTROL_ITEMS": {
"TITLE": "Əyləncəli Hissə",
"DESCRIPTION": "Assistentə daha çox nəzarət əlavə edin. (vizual olaraq bir hekayə kimi: Sorğu məhdudiyyəti → ssenarilər → nəticə) İstifadəçini bunlardan istifadə etməyə təşviq edir.",
"TITLE": "The Fun Stuff",
"DESCRIPTION": "Köməkçiyə daha çox nəzarət əlavə edin. (bir az daha vizual, məsələn, hekayə kimi: Sorğu qoruyucusu → ssenarilər → çıxış) İstifadəçini bunlardan istifadə etməyə təşviq edir.",
"OPTIONS": {
"GUARDRAILS": {
"TITLE": "Məhdudiyyətlər",
"DESCRIPTION": "Hər şeyin nəzarətdə qalmasını təmin edir—assistentinizin yalnız istədiyiniz suallara cavab verməsini təmin edir, mövzudan kənar və ya icazəsiz heç nə yoxdur."
"TITLE": "Guardrails",
"DESCRIPTION": "İşləri yolunda saxlayır — yalnız köməkçinizin cavablandırmasını istədiyiniz sual növləri, mövzudan kənar və ya qadağan olunmuş heç nə yoxdur."
},
"RESPONSE_GUIDELINES": {
"TITLE": "Cavab qaydaları",
"DESCRIPTION": "Assistentinizin cavablarının tərzi və quruluşu—aydın və dostcasına? Qısa və yığcam? Ətraflı və rəsmi?"
"DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?"
}
}
},
"DELETE": {
"TITLE": "Assistenti Sil",
"DESCRIPTION": "Bu əməliyyat geri qaytarıla bilməz. Bu assistenti silmək onu bütün bağlı poçt qutularından siləcək və yaradılmış bütün bilikləri daimi olaraq siləcək.",
"BUTTON_TEXT": "{assistantName} sil"
"TITLE": "Delete Assistant",
"DESCRIPTION": "Bu əməliyyat geri dönməzdir. Bu köməkçi silindikdə, o, bütün əlaqəli qutulardan silinəcək və yaradılmış bütün biliklər daimi olaraq silinəcək.",
"BUTTON_TEXT": "Delete {assistantName}"
}
},
"OPTIONS": {
"EDIT_ASSISTANT": "Assistenti redaktə et",
"DELETE_ASSISTANT": "Assistenti sil",
"VIEW_CONNECTED_INBOXES": "Bağlı poçt qutularına bax"
"EDIT_ASSISTANT": "Edit Assistant",
"DELETE_ASSISTANT": "Delete Assistant",
"VIEW_CONNECTED_INBOXES": "Əlaqəli qutuları göstər"
},
"EMPTY_STATE": {
"TITLE": "Assistent yoxdur",
"SUBTITLE": "İstifadəçilərinizə sürətli və dəqiq cavablar vermək üçün köməkçi yaradın. O, yardım məqalələrinizdən və əvvəlki söhbətlərdən öyrənə bilər.",
"TITLE": "Heç bir köməkçi mövcud deyil",
"SUBTITLE": "Create an assistant to provide quick and accurate responses to your users. It can learn from your help articles and past conversations.",
"FEATURE_SPOTLIGHT": {
"TITLE": "Captain Assistent",
"NOTE": "Captain Assistent birbaşa müştərilərlə ünsiyyət qurur, kömək sənədlərinizdən və keçmiş söhbətlərdən öyrənir və dərhal, dəqiq cavablar verir. O, ilkin sorğuları idarə edir və lazım olduqda agentə ötürür."
"TITLE": "Captain Assistant",
"NOTE": "Captain Assistant engages directly with customers, learns from your help docs and past conversations, and delivers instant, accurate responses. It handles the initial queries, providing quick resolutions before transferring to an agent when needed."
}
},
"GUARDRAILS": {
"TITLE": "Məhdudiyyətlər",
"DESCRIPTION": "Hər şeyin nəzarətdə qalmasını təmin edir—assistentinizin yalnız istədiyiniz suallara cavab verməsini təmin edir, mövzudan kənar və ya icazəsiz heç nə yoxdur.",
"TITLE": "Guardrails",
"DESCRIPTION": "İşləri yolunda saxlayır — yalnız köməkçinizin cavablandırmasını istədiyiniz sual növləri, mövzudan kənar və ya qadağan olunmuş heç nə yoxdur.",
"BULK_ACTION": {
"SELECTED": "{count} element seçildi | {count} element seçildi",
"SELECT_ALL": "Hamısını seç ({count})",
"UNSELECT_ALL": "Hamısını seçmə ({count})",
"BULK_DELETE_BUTTON": "Sil"
"SELECT_ALL": "Select all ({count})",
"UNSELECT_ALL": "Hamısının seçimini ləğv et ({count})",
"BULK_DELETE_BUTTON": "Delete"
},
"ADD": {
"SUGGESTED": {
"TITLE": "Məhdudiyyət nümunələri",
"TITLE": "Example guardrails",
"ADD": "Hamısını əlavə et",
"ADD_SINGLE": "Bunu əlavə et",
"SAVE": "Əlavə et və yadda saxla (↵)",
"PLACEHOLDER": "Başqa bir məhdudiyyət yazın..."
"PLACEHOLDER": "Type in another guardrail..."
},
"NEW": {
"TITLE": "Məhdudiyyət əlavə et",
"CREATE": "Yarat",
"TITLE": "Add a guardrail",
"CREATE": "Create",
"CANCEL": "Ləğv et",
"PLACEHOLDER": "Başqa bir məhdudiyyət yazın...",
"TEST_ALL": "Hamısını yoxla"
"PLACEHOLDER": "Type in another guardrail...",
"TEST_ALL": "Test all"
}
},
"LIST": {
"SEARCH_PLACEHOLDER": "Axtar..."
"SEARCH_PLACEHOLDER": "Axtarış..."
},
"EMPTY_MESSAGE": "Məhdudiyyət tapılmadı. Başlamaq üçün yaradın və ya nümunələr əlavə edin.",
"SEARCH_EMPTY_MESSAGE": "Axtarış üçün məhdudiyyət tapılmadı.",
"EMPTY_MESSAGE": "No guardrails found. Create or add examples to begin.",
"SEARCH_EMPTY_MESSAGE": "No guardrails found for this search.",
"API": {
"ADD": {
"SUCCESS": "Məhdudiyyətlər uğurla əlavə olundu",
"ERROR": "Məhdudiyyətlər əlavə olunarkən xəta baş verdi, yenidən cəhd edin."
"SUCCESS": "Guardrails added successfully",
"ERROR": "There was an error adding guardrails, please try again."
},
"UPDATE": {
"SUCCESS": "Məhdudiyyətlər uğurla yeniləndi",
"ERROR": "Məhdudiyyətlər yenilənərkən xəta baş verdi, yenidən cəhd edin."
"SUCCESS": "Guardrails updated successfully",
"ERROR": "There was an error updating guardrails, please try again."
},
"DELETE": {
"SUCCESS": "Məhdudiyyətlər uğurla silindi",
"ERROR": "Məhdudiyyətlər silinərkən xəta baş verdi, yenidən cəhd edin."
"SUCCESS": "Guardrails deleted successfully",
"ERROR": "There was an error deleting guardrails, please try again."
}
}
},
"RESPONSE_GUIDELINES": {
"TITLE": "Cavab qaydaları",
"DESCRIPTION": "Assistentinizin cavablarının tərzi və quruluşu—aydın və dostcasına? Qısa və yığcam? Ətraflı və rəsmi?",
"TITLE": "Response Guidelines",
"DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?",
"BULK_ACTION": {
"SELECTED": "{count} element seçildi | {count} element seçildi",
"SELECT_ALL": "Hamısını seç ({count})",
"UNSELECT_ALL": "Hamısını seçmə ({count})",
"BULK_DELETE_BUTTON": "Sil"
"SELECT_ALL": "Select all ({count})",
"UNSELECT_ALL": "Hamısının seçimini götür ({count})",
"BULK_DELETE_BUTTON": "Delete"
},
"ADD": {
"SUGGESTED": {
"TITLE": "Cavab qaydası nümunələri",
"TITLE": "Nümunə cavab qaydaları",
"ADD": "Hamısını əlavə et",
"ADD_SINGLE": "Bunu əlavə et",
"SAVE": "Əlavə et və yadda saxla (↵)",
"PLACEHOLDER": "Başqa bir cavab qaydası yazın..."
"PLACEHOLDER": "Başqa cavab qaydasını yazın..."
},
"NEW": {
"TITLE": "Cavab qaydası əlavə et",
"CREATE": "Yarat",
"CREATE": "Create",
"CANCEL": "Ləğv et",
"PLACEHOLDER": "Başqa bir cavab qaydası yazın...",
"TEST_ALL": "Hamısını yoxla"
"PLACEHOLDER": "Başqa cavab qaydasını yazın...",
"TEST_ALL": "Test all"
}
},
"LIST": {
"SEARCH_PLACEHOLDER": "Axtar..."
},
"EMPTY_MESSAGE": "Cavab qaydası tapılmadı. Başlamaq üçün yaradın və ya nümunələr əlavə edin.",
"SEARCH_EMPTY_MESSAGE": "Axtarış üçün cavab qaydası tapılmadı.",
"EMPTY_MESSAGE": "No response guidelines found. Create or add examples to begin.",
"SEARCH_EMPTY_MESSAGE": "No response guidelines found for this search.",
"API": {
"ADD": {
"SUCCESS": "Cavab qaydaları uğurla əlavə olundu",
"ERROR": "Cavab qaydaları əlavə olunarkən xəta baş verdi, yenidən cəhd edin."
"SUCCESS": "Cavab qaydaları uğurla əlavə edildi",
"ERROR": "There was an error adding response guidelines, please try again."
},
"UPDATE": {
"SUCCESS": "Cavab qaydaları uğurla yeniləndi",
"ERROR": "Cavab qaydaları yenilənərkən xəta baş verdi, yenidən cəhd edin."
"SUCCESS": "Response Guidelines updated successfully",
"ERROR": "There was an error updating response guidelines, please try again."
},
"DELETE": {
"SUCCESS": "Cavab qaydaları uğurla silindi",
"ERROR": "Cavab qaydaları silinərkən xəta baş verdi, yenidən cəhd edin."
"SUCCESS": "Response Guidelines deleted successfully",
"ERROR": "There was an error deleting response guidelines, please try again."
}
}
},
"SCENARIOS": {
"TITLE": "Ssenarilər",
"DESCRIPTION": "Assistentinizə bir az kontekst verin—məsələn, “istifadəçi ilişibsə nə etməli”, ya da “geri qaytarma sorğusu zamanı necə davranmalı.”",
"TITLE": "Scenarios",
"DESCRIPTION": "Köməkçinizə müəyyən kontekst verin — məsələn, “istifadəçi qaldıqda nə etməli” və ya “geri ödəmə tələbi zamanı necə davranmalı.”",
"BULK_ACTION": {
"SELECTED": "{count} element seçildi | {count} element seçildi",
"SELECT_ALL": "Hamısını seç ({count})",
"UNSELECT_ALL": "Hamısını seçmə ({count})",
"BULK_DELETE_BUTTON": "Sil"
"SELECT_ALL": "Select all ({count})",
"UNSELECT_ALL": "Hamısının seçimini ləğv et ({count})",
"BULK_DELETE_BUTTON": "Delete"
},
"ADD": {
"SUGGESTED": {
"TITLE": "Ssenari nümunələri",
"TITLE": "Example scenarios",
"ADD": "Hamısını əlavə et",
"ADD_SINGLE": "Bunu əlavə et",
"TOOLS_USED": "İstifadə olunan alətlər :"
},
"NEW": {
"CREATE": "Ssenari əlavə et",
"TITLE": "Ssenari yarat",
"CREATE": "Add a scenario",
"TITLE": "Create a scenario",
"FORM": {
"TITLE": {
"LABEL": "Başlıq",
"PLACEHOLDER": "Ssenari üçün ad daxil edin",
"ERROR": "Ssenari adı tələb olunur"
"PLACEHOLDER": "Enter a name for the scenario",
"ERROR": "Scenario name is required"
},
"DESCRIPTION": {
"LABEL": "Təsvir",
"PLACEHOLDER": "Bu ssenarinin necə və harada istifadə olunacağını təsvir edin",
"ERROR": "Ssenari təsviri tələb olunur"
"PLACEHOLDER": "Describe how and where this scenario will be used",
"ERROR": "Scenario description is required"
},
"INSTRUCTION": {
"LABEL": "Necə idarə olunacaq",
"PLACEHOLDER": "Bu ssenarinin necə və harada idarə olunacağını təsvir edin",
"ERROR": "Ssenari məzmunu tələb olunur"
"PLACEHOLDER": "Describe how and where this scenario will be handled",
"ERROR": "Scenario content is required"
},
"CREATE": "Yarat",
"CREATE": "Create",
"CANCEL": "Ləğv et"
}
}
},
"UPDATE": {
"CANCEL": "Ləğv et",
"UPDATE": "Dəyişiklikləri yenilə"
"UPDATE": "Update changes"
},
"LIST": {
"SEARCH_PLACEHOLDER": "Axtar..."
},
"EMPTY_MESSAGE": "Ssenari tapılmadı. Başlamaq üçün yaradın və ya nümunələr əlavə edin.",
"SEARCH_EMPTY_MESSAGE": "Axtarış üçün ssenari tapılmadı.",
"EMPTY_MESSAGE": "No scenarios found. Create or add examples to begin.",
"SEARCH_EMPTY_MESSAGE": "No scenarios found for this search.",
"API": {
"ADD": {
"SUCCESS": "Ssenarilər uğurla əlavə olundu",
"ERROR": "Ssenarilər əlavə olunarkən xəta baş verdi, yenidən cəhd edin."
"SUCCESS": "Scenarios added successfully",
"ERROR": "There was an error adding scenarios, please try again."
},
"UPDATE": {
"SUCCESS": "Ssenarilər uğurla yeniləndi",
"ERROR": "Ssenarilər yenilənərkən xəta baş verdi, yenidən cəhd edin."
"SUCCESS": "Scenarios updated successfully",
"ERROR": "There was an error updating scenarios, please try again."
},
"DELETE": {
"SUCCESS": "Ssenarilər uğurla silindi",
"ERROR": "Ssenarilər silinərkən xəta baş verdi, yenidən cəhd edin."
"SUCCESS": "Scenarios deleted successfully",
"ERROR": "There was an error deleting scenarios, please try again."
}
}
}
},
"DOCUMENTS": {
"HEADER": "Sənədlər",
"ADD_NEW": "Yeni sənəd yarat",
"SELECTED": "{count} seçildi",
"SELECT_ALL": "Hamısını seç ({count})",
"UNSELECT_ALL": "Hamısını seçmə ({count})",
"BULK_DELETE_BUTTON": "Sil",
"BULK_DELETE": {
"TITLE": "Sənədlər silinsin?",
"DESCRIPTION": "Seçilmiş sənədləri silmək istədiyinizə əminsiniz? Bu əməliyyat geri qaytarıla bilməz.",
"CONFIRM": "Bəli, hamısını sil",
"SUCCESS_MESSAGE": "Sənədlər uğurla silindi",
"ERROR_MESSAGE": "Sənədlər silinərkən xəta baş verdi, yenidən cəhd edin."
},
"ADD_NEW": "Yeni sənəd yaradın",
"RELATED_RESPONSES": {
"TITLE": "Əlaqəli FAQ-lar",
"DESCRIPTION": "Bu FAQ-lar birbaşa sənəddən yaradılıb."
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
},
"FORM_DESCRIPTION": "Sənədi bilik mənbəyi kimi əlavə etmək üçün onun URL-ni daxil edin və əlaqələndiriləcək assistenti seçin.",
"FORM_DESCRIPTION": "Sənədi bilik mənbəyi kimi əlavə etmək üçün URL-ni daxil edin və onu əlaqələndirmək istədiyiniz köməkçini seçin.",
"CREATE": {
"TITLE": "Sənəd əlavə et",
"SUCCESS_MESSAGE": "Sənəd uğurla yaradıldı",
"ERROR_MESSAGE": "Sənəd yaradılarkən xəta baş verdi, zəhmət olmasa yenidən cəhd edin."
"ERROR_MESSAGE": "There was an error creating the document, please try again."
},
"FORM": {
"TYPE": {
@@ -767,92 +756,84 @@
},
"URL": {
"LABEL": "URL",
"PLACEHOLDER": "Sənədin URL-ni daxil edin",
"ERROR": "Sənəd üçün düzgün URL daxil edin"
"PLACEHOLDER": "Sənədin URL ünvanını daxil edin",
"ERROR": "Zəhmət olmasa sənəd üçün düzgün URL təqdim edin"
},
"PDF_FILE": {
"LABEL": "PDF Faylı",
"CHOOSE_FILE": "PDF faylını seçin",
"ERROR": "PDF fayl seçin",
"HELP_TEXT": "Maksimum fayl ölçüsü: 10MB",
"INVALID_TYPE": "Düzgün PDF fayl seçin",
"TOO_LARGE": "Fayl ölçüsü 10MB limiti aşır"
"CHOOSE_FILE": "Choose PDF file",
"ERROR": "Zəhmət olmasa PDF faylı seçin",
"HELP_TEXT": "Maximum file size: 10MB",
"INVALID_TYPE": "Zəhmət olmasa, düzgün PDF faylı seçin",
"TOO_LARGE": "File size exceeds 10MB limit"
},
"NAME": {
"LABEL": "Sənədin Adı (İstəyə bağlı)",
"LABEL": "Document Name (Optional)",
"PLACEHOLDER": "Sənəd üçün ad daxil edin"
}
},
"DELETE": {
"TITLE": "Sənəd silinsin?",
"DESCRIPTION": "Bu əməliyyat geri qaytarıla bilməz. Bu sənədi silmək bütün yaradılmış bilikləri daimi olaraq siləcək.",
"CONFIRM": "Bəli, sil",
"SUCCESS_MESSAGE": "Sənəd uğurla silindi",
"ERROR_MESSAGE": "Sənəd silinərkən xəta baş verdi, zəhmət olmasa yenidən cəhd edin."
"TITLE": "Are you sure to delete the document?",
"DESCRIPTION": "Bu əməliyyat geri dönməzdir. Bu sənəd silindikdə, yaradılmış bütün biliklər daimi olaraq silinəcək.",
"CONFIRM": "Yes, delete",
"SUCCESS_MESSAGE": "The document has been successfully deleted",
"ERROR_MESSAGE": "There was an error deleting the document, please try again."
},
"OPTIONS": {
"VIEW_RELATED_RESPONSES": "Əlaqəli cavablara bax",
"DELETE_DOCUMENT": "Sənədi sil"
"VIEW_RELATED_RESPONSES": "Əlaqəli cavabları göstər",
"DELETE_DOCUMENT": "Delete Document"
},
"EMPTY_STATE": {
"TITLE": "Sənəd yoxdur",
"SUBTITLE": "Sənədlər assistentiniz tərəfindən FAQ-lar yaratmaq üçün istifadə olunur. Assistentinizə kontekst vermək üçün sənədləri əlavə edə bilərsiniz.",
"TITLE": "Heç bir sənəd mövcud deyil",
"SUBTITLE": "Documents are used by your assistant to generate FAQs. You can import documents to provide context for your assistant.",
"FEATURE_SPOTLIGHT": {
"TITLE": "Captain Sənəd",
"NOTE": "Captain-da sənəd assistent üçün bilik mənbəyi rolunu oynayır. Kömək mərkəzinizi və ya təlimatları bağlayaraq, Captain məzmunu analiz edə və müştəri sorğuları üçün dəqiq cavablar verə bilər."
"TITLE": "Captain Document",
"NOTE": "Captain-da sənəd köməkçi üçün bilik mənbəyi kimi xidmət edir. Köməkçi yardım mərkəzinizə və ya bələdçilərinizə qoşularaq məzmunu təhlil edə və müştəri sorğularına dəqiq cavablar verə bilər."
}
}
},
"CUSTOM_TOOLS": {
"HEADER": "Alətlər",
"ADD_NEW": "Yeni alət yarat",
"SOFT_LIMIT_WARNING": "10-dan çox alət olması assistentin düzgün alət seçmə ehtimalını azalda bilər. Daha yaxşı nəticə üçün istifadə olunmayan alətləri silməyi düşünün.",
"ADD_NEW": "Yeni alət yaradın",
"EMPTY_STATE": {
"TITLE": "Xüsusi alət yoxdur",
"SUBTITLE": "Assistentinizi xarici API və servislərlə birləşdirmək üçün xüsusi alətlər yaradın, beləliklə məlumat əldə edə və sizin adınızdan əməliyyatlar yerinə yetirə bilər.",
"TITLE": "Fərdi alətlər mövcud deyil",
"SUBTITLE": "Köməkçinizi xarici API-lər və xidmətlərlə qoşmaq üçün xüsusi alətlər yaradın, beləliklə o, məlumatları əldə edə və sizin adınıza əməliyyatlar apara bilsin.",
"FEATURE_SPOTLIGHT": {
"TITLE": "Xüsusi Alətlər",
"NOTE": "Xüsusi alətlər assistentinizə xarici API və servislərlə qarşılıqlı əlaqə qurmağa imkan verir. Məlumat əldə etmək, əməliyyatlar yerinə yetirmək və ya mövcud sistemlərinizlə inteqrasiya etmək üçün alətlər yaradın və assistentin imkanlarını artırın."
"NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
}
},
"FORM_DESCRIPTION": "Xüsusi alətinizi xarici API-lərlə birləşdirmək üçün konfiqurasiya edin",
"FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
"OPTIONS": {
"EDIT_TOOL": "Aləti redaktə et",
"DELETE_TOOL": "Aləti sil"
"DELETE_TOOL": "Delete tool"
},
"CREATE": {
"TITLE": "Xüsusi Alət Yarat",
"TITLE": "Create Custom Tool",
"SUCCESS_MESSAGE": "Xüsusi alət uğurla yaradıldı",
"ERROR_MESSAGE": "Xüsusi alət yaradılmadı"
"ERROR_MESSAGE": "Xüsusi alət yaratmaq mümkün olmadı"
},
"EDIT": {
"TITLE": "Xüsusi Aləti Redaktə Et",
"SUCCESS_MESSAGE": "Xüsusi alət uğurla yeniləndi",
"ERROR_MESSAGE": "Xüsusi alət yenilənmədi"
"SUCCESS_MESSAGE": "Custom tool updated successfully",
"ERROR_MESSAGE": "Failed to update custom tool"
},
"DELETE": {
"TITLE": "Xüsusi Aləti Sil",
"DESCRIPTION": "Bu xüsusi aləti silmək istədiyinizə əminsiniz? Bu əməliyyat geri qaytarıla bilməz.",
"CONFIRM": "Bəli, sil",
"SUCCESS_MESSAGE": "Xüsusi alət uğurla silindi",
"ERROR_MESSAGE": "Xüsusi alət silinmədi"
},
"TEST": {
"BUTTON": "Bağlantını yoxla",
"SUCCESS": "Endpoint HTTP {status} qaytardı",
"ERROR": "Bağlantı uğursuz oldu",
"DISABLED_HINT": "Test yalnız şablonsuz və ya sorğu gövdəsi olmayan endpoint-lər üçün mümkündür."
"TITLE": "Delete Custom Tool",
"DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
"CONFIRM": "Yes, delete",
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Xüsusi aləti silmək mümkün olmadı"
},
"FORM": {
"TITLE": {
"LABEL": "Alətin Adı",
"PLACEHOLDER": "Sifariş axtarışı",
"ERROR": "Alət adı tələb olunur",
"MAX_LENGTH_ERROR": "Alət adı maksimum {max} simvol olmalıdır"
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
"ERROR": "Tool name is required"
},
"DESCRIPTION": {
"LABEL": "Təsvir",
"PLACEHOLDER": "Sifariş ID-si ilə sifariş detalları axtarılır"
"PLACEHOLDER": "Looks up order details by order ID"
},
"HTTP_METHOD": {
"LABEL": "Metod"
@@ -863,7 +844,7 @@
"ERROR": "Düzgün URL tələb olunur"
},
"AUTH_TYPE": {
"LABEL": "Avtorizasiya növü"
"LABEL": "Authentication Type"
},
"AUTH_TYPES": {
"NONE": "Heç biri",
@@ -873,23 +854,23 @@
},
"AUTH_CONFIG": {
"BEARER_TOKEN": "Bearer Token",
"BEARER_TOKEN_PLACEHOLDER": "Bearer tokeninizi daxil edin",
"USERNAME": "İstifadəçi adı",
"BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
"USERNAME": "Username",
"USERNAME_PLACEHOLDER": "İstifadəçi adını daxil edin",
"PASSWORD": "Şifrə",
"PASSWORD_PLACEHOLDER": "Şifrəni daxil edin",
"API_KEY": "Başlıq Adı",
"PASSWORD": "Password",
"PASSWORD_PLACEHOLDER": "Enter password",
"API_KEY": "Header Name",
"API_KEY_PLACEHOLDER": "X-API-Key",
"API_VALUE": "Başlıq Dəyəri",
"API_VALUE": "Başlıq dəyəri",
"API_VALUE_PLACEHOLDER": "API açar dəyərini daxil edin"
},
"PARAMETERS": {
"LABEL": "Parametrlər",
"HELP_TEXT": "İstifadəçi sorğularından çıxarılacaq parametrləri müəyyən edin"
"LABEL": "Parameters",
"HELP_TEXT": "Define the parameters that will be extracted from user queries"
},
"ADD_PARAMETER": "Parametr əlavə et",
"ADD_PARAMETER": "Add Parameter",
"PARAM_NAME": {
"PLACEHOLDER": "Parametr adı (məs., order_id)"
"PLACEHOLDER": "Parameter name (e.g., order_id)"
},
"PARAM_TYPE": {
"PLACEHOLDER": "Növ"
@@ -902,139 +883,139 @@
"OBJECT": "Obyekt"
},
"PARAM_DESCRIPTION": {
"PLACEHOLDER": "Parametrin təsviri"
"PLACEHOLDER": "Description of the parameter"
},
"PARAM_REQUIRED": {
"LABEL": "Tələb olunur"
},
"REQUEST_TEMPLATE": {
"LABEL": "Sorğu Gövdəsi Şablonu (İstəyə bağlı)",
"LABEL": "Sorğu Bədəninin Şablonu (İxtiyari)",
"PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
},
"RESPONSE_TEMPLATE": {
"LABEL": "Cavab Şablonu (İstəyə bağlı)",
"PLACEHOLDER": "Sifariş {'{{'} order_id {'}}'} statusu: {'{{'} status {'}}'}"
"LABEL": "Response Template (Optional)",
"PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
},
"ERRORS": {
"PARAM_NAME_REQUIRED": "Parametr adı tələb olunur"
"PARAM_NAME_REQUIRED": "Parameter name is required"
}
}
},
"RESPONSES": {
"HEADER": "FAQ-lar",
"PENDING_FAQS": "Gözləyən FAQ-lar",
"ADD_NEW": "Yeni FAQ yarat",
"HEADER": "Tez-tez verilən suallar",
"PENDING_FAQS": "Gözləyən tez-tez verilən suallar",
"ADD_NEW": "Yeni FAQ yaradın",
"DOCUMENTABLE": {
"CONVERSATION": "Söhbət #{id}"
},
"SELECTED": "{count} seçildi",
"SELECT_ALL": "Hamısını seç ({count})",
"UNSELECT_ALL": "Hamısını seçmə ({count})",
"SEARCH_PLACEHOLDER": "FAQ-larda axtar...",
"BULK_APPROVE_BUTTON": "Təsdiqlə",
"BULK_DELETE_BUTTON": "Sil",
"SELECT_ALL": "Select all ({count})",
"UNSELECT_ALL": "Hamısının seçimini götür ({count})",
"SEARCH_PLACEHOLDER": "Search FAQs...",
"BULK_APPROVE_BUTTON": "Approve",
"BULK_DELETE_BUTTON": "Delete",
"BULK_APPROVE": {
"SUCCESS_MESSAGE": "FAQ-lar uğurla təsdiqləndi",
"ERROR_MESSAGE": "FAQ-lar təsdiqlənərkən xəta baş verdi, zəhmət olmasa yenidən cəhd edin."
"SUCCESS_MESSAGE": "FAQs approved successfully",
"ERROR_MESSAGE": "There was an error approving the FAQs, please try again."
},
"BULK_DELETE": {
"TITLE": "FAQ-lar silinsin?",
"DESCRIPTION": "Seçilmiş FAQ-ları silmək istədiyinizə əminsiniz? Bu əməliyyat geri qaytarıla bilməz.",
"CONFIRM": "Bəli, hamısını sil",
"SUCCESS_MESSAGE": "FAQ-lar uğurla silindi",
"ERROR_MESSAGE": "FAQ-lar silinərkən xəta baş verdi, zəhmət olmasa yenidən cəhd edin."
"TITLE": "Tez-tez verilən sualları silmək?",
"DESCRIPTION": "Are you sure you want to delete the selected FAQs? This action cannot be undone.",
"CONFIRM": "Yes, delete all",
"SUCCESS_MESSAGE": "FAQs deleted successfully",
"ERROR_MESSAGE": "There was an error deleting the FAQs, please try again."
},
"DELETE": {
"TITLE": "FAQ silinsin?",
"TITLE": "Are you sure to delete the FAQ?",
"DESCRIPTION": "",
"CONFIRM": "Bəli, sil",
"SUCCESS_MESSAGE": "FAQ uğurla silindi",
"ERROR_MESSAGE": "FAQ silinərkən xəta baş verdi, zəhmət olmasa yenidən cəhd edin."
"CONFIRM": "Yes, delete",
"SUCCESS_MESSAGE": "FAQ deleted successfully",
"ERROR_MESSAGE": "There was an error deleting the FAQ, please try again."
},
"FILTER": {
"ASSISTANT": "Assistent: {selected}",
"STATUS": "Status: {selected}",
"ASSISTANT": "Köməkçi: {selected}",
"STATUS": "Vəziyyət: {selected}",
"ALL_ASSISTANTS": "Hamısı"
},
"STATUS": {
"TITLE": "Status",
"TITLE": "Vəziyyət",
"PENDING": "Gözləyir",
"APPROVED": "Təsdiqlənib",
"ALL": "Hamısı"
},
"PENDING_BANNER": {
"TITLE": "Captain müştərilərinizin axtardığı bəzi FAQ-ları tapdı.",
"ACTION": "Baxmaq üçün bura klikləyin"
"TITLE": "Captain has found some FAQs your customers were looking for.",
"ACTION": "Nəzərdən keçirmək üçün buraya klikləyin"
},
"FORM_DESCRIPTION": "Bilik bazasına sual və ona uyğun cavabı əlavə edin, sonra onun əlaqələndiriləcəyi köməkçini seçin.",
"FORM_DESCRIPTION": "Add a question and its corresponding answer to the knowledge base and select the assistant it should be associated with.",
"CREATE": {
"TITLE": "FAQ əlavə et",
"SUCCESS_MESSAGE": "Cavab uğurla əlavə olundu.",
"ERROR_MESSAGE": "Cavab əlavə olunarkən xəta baş verdi. Yenidən cəhd edin."
"TITLE": "Tez-tez verilən sual əlavə et",
"SUCCESS_MESSAGE": "Cavab uğurla əlavə edildi.",
"ERROR_MESSAGE": "Cavab əlavə edilərkən xəta baş verdi. Zəhmət olmasa, yenidən cəhd edin."
},
"FORM": {
"QUESTION": {
"LABEL": "Sual",
"PLACEHOLDER": "Sualı buraya daxil edin",
"ERROR": "Düzgün sual daxil edin."
"ERROR": "Zəhmət olmasa, düzgün sual daxil edin."
},
"ANSWER": {
"LABEL": "Cavab",
"PLACEHOLDER": "Cavabı buraya daxil edin",
"ERROR": "Düzgün cavab daxil edin."
"ERROR": "Zəhmət olmasa, düzgün cavab daxil edin."
}
},
"EDIT": {
"TITLE": "FAQ-ı yenilə",
"SUCCESS_MESSAGE": "FAQ uğurla yeniləndi",
"ERROR_MESSAGE": "FAQ yenilənərkən xəta baş verdi, zəhmət olmasa yenidən cəhd edin.",
"APPROVE_SUCCESS_MESSAGE": "FAQ təsdiqləndi"
"TITLE": "Update the FAQ",
"SUCCESS_MESSAGE": "The FAQ has been successfully updated",
"ERROR_MESSAGE": "There was an error updating the FAQ, please try again",
"APPROVE_SUCCESS_MESSAGE": "The FAQ was marked as approved"
},
"OPTIONS": {
"APPROVE": "Təsdiqlə",
"APPROVE": "Approve",
"EDIT_RESPONSE": "Redaktə et",
"DELETE_RESPONSE": "Sil"
"DELETE_RESPONSE": "Delete"
},
"EMPTY_STATE": {
"TITLE": "FAQ tapılmadı",
"NO_PENDING_TITLE": "Baxılacaq başqa gözləyən FAQ yoxdur",
"SUBTITLE": "FAQ-lar köməkçinizə müştərilərinizdən gələn suallara sürətli və dəqiq cavablar verməyə kömək edir. Onlar məzmununuzdan avtomatik yaradına və ya əl ilə əlavə edilə bilər.",
"CLEAR_SEARCH": "Aktiv filtrləri təmizlə",
"TITLE": "No FAQs Found",
"NO_PENDING_TITLE": "Yoxlanılacaq daha çox gözləyən FAQ yoxdur",
"SUBTITLE": "FAQs help your assistant provide quick and accurate answers to questions from your customers. They can be generated automatically from your content or can be added manually.",
"CLEAR_SEARCH": "Clear active filters",
"FEATURE_SPOTLIGHT": {
"TITLE": "Captain FAQ",
"NOTE": "Captain FAQ tez-tez verilən və ya bilik bazasında olmayan müştəri suallarını aşkar edir və uyğun FAQ-lar yaradır. Hər təklifi nəzərdən keçirə və təsdiqləyə və ya rədd edə bilərsiniz."
"NOTE": "Captain FAQ-ları ümumi müştəri suallarını aşkar edir — bilik bazanızda olmayan və ya tez-tez verilən — və dəstəyi yaxşılaşdırmaq üçün müvafiq FAQ-lar yaradır. Hər təklifi nəzərdən keçirə və təsdiqləyib-təsdiqləməməyə qərar verə bilərsiniz."
}
}
},
"INBOXES": {
"HEADER": "Bağlı Poçt Qutuları",
"ADD_NEW": "Yeni gələn qutu qoşun",
"HEADER": "Qoşulmuş poçt qutuları",
"ADD_NEW": "Yeni qutu qoşun",
"OPTIONS": {
"DISCONNECT": "Bağlantını kəs"
"DISCONNECT": "Disconnect"
},
"DELETE": {
"TITLE": "Gələn qutunu ayırmaq istədiyinizə əminsiniz?",
"TITLE": "Are you sure to disconnect the inbox?",
"DESCRIPTION": "",
"CONFIRM": "Bəli, sil",
"SUCCESS_MESSAGE": "Poçt qutusu uğurla bağlantıdan çıxarıldı.",
"ERROR_MESSAGE": "Gələn qutu ayrılarkən xəta baş verdi, zəhmət olmasa yenidən cəhd edin."
"CONFIRM": "Yes, delete",
"SUCCESS_MESSAGE": "Qutu uğurla qoşulması kəsildi.",
"ERROR_MESSAGE": "There was an error disconnecting the inbox, please try again."
},
"FORM_DESCRIPTION": "Köməkçi ilə əlaqələndirmək üçün gələn qutunu seçin.",
"FORM_DESCRIPTION": "Köməkçi ilə əlaqələndirmək üçün qutu seçin.",
"CREATE": {
"TITLE": "Poçt qutusu qoş",
"SUCCESS_MESSAGE": "Poçt qutusu uğurla qoşuldu.",
"ERROR_MESSAGE": "Gələn qutu qoşularkən xəta baş verdi. Zəhmət olmasa yenidən cəhd edin."
"TITLE": "Qutu qoşun",
"SUCCESS_MESSAGE": "Qutu uğurla qoşuldu.",
"ERROR_MESSAGE": "An error occurred while connecting the inbox. Please try again."
},
"FORM": {
"INBOX": {
"LABEL": "Gələn qutu",
"PLACEHOLDER": "Köməkçini yerləşdirmək üçün gələn qutunu seçin.",
"ERROR": "Poçt qutusu seçimi tələb olunur."
"LABEL": "Qutu",
"PLACEHOLDER": "Choose the inbox to deploy the assistant.",
"ERROR": "Qutu seçimi tələb olunur."
}
},
"EMPTY_STATE": {
"TITLE": "Bağlı poçt qutusu yoxdur",
"SUBTITLE": "Poçt qutusu qoşmaq assistentin müştərilərinizin ilkin suallarını idarə etməsinə imkan verir və sonra sizi işə cəlb edir."
"TITLE": "Əlaqəli qutular tapılmadı",
"SUBTITLE": "Qutu qoşmaq köməkçiyə müştərilərinizdən gələn ilkin sualları cavablandırmağa və onları sizə yönləndirmədən əvvəl idarə etməyə imkan verir."
}
}
}
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Message signature is not configured, please configure it in profile settings.",
"COPILOT_MSG_INPUT": "Дайте на copilot допълнителни инструкции или питайте нещо друго... Натиснете enter, за да изпратите последващо съобщение",
"COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
"CLICK_HERE": "Click here to update",
"WHATSAPP_TEMPLATES": "Whatsapp Templates"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Drag and drop here to attach",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
"COPILOT_THINKING": "Copilot мисли",
"COPILOT_THINKING": "Copilot is thinking",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Add bcc",
@@ -316,18 +316,6 @@
"SUCCESS_MESSAGE": "Locale removed from portal successfully",
"ERROR_MESSAGE": "Unable to remove locale from portal. Try again."
}
},
"DRAFT_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale moved to draft successfully",
"ERROR_MESSAGE": "Unable to move locale to draft. Try again."
}
},
"PUBLISH_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale published successfully",
"ERROR_MESSAGE": "Unable to publish locale. Try again."
}
}
},
"TABLE": {
@@ -656,11 +644,8 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Default",
"DRAFT": "Draft",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
"MOVE_TO_DRAFT": "Move to draft",
"PUBLISH_LOCALE": "Publish locale",
"DELETE": "Изтрий"
}
},
@@ -670,13 +655,6 @@
"COMBOBOX": {
"PLACEHOLDER": "Select locale..."
},
"STATUS": {
"LABEL": "Статус",
"OPTIONS": {
"LIVE": "Published",
"DRAFT": "Draft"
}
},
"API": {
"SUCCESS_MESSAGE": "Locale added successfully",
"ERROR_MESSAGE": "Unable to add locale. Try again."
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Captain",
"HEADER_KNOW_MORE": "Научете повече",
"HEADER_KNOW_MORE": "Know more",
"ASSISTANT_SWITCHER": {
"ASSISTANTS": "Асистенти",
"SWITCH_ASSISTANT": "Превключване между асистенти",
"NEW_ASSISTANT": "Създайте асистент",
"EMPTY_LIST": "Не са намерени асистенти, моля създайте един, за да започнете"
"ASSISTANTS": "Assistants",
"SWITCH_ASSISTANT": "Switch between assistants",
"NEW_ASSISTANT": "Create Assistant",
"EMPTY_LIST": "No assistants found, please create one to get started"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
"PANEL_TITLE": "Започнете с Copilot",
"KICK_OFF_MESSAGE": "Имате нужда от бързо резюме, искате да проверите минали разговори или да създадете по-добър отговор? Copilot е тук, за да ускори нещата.",
"PANEL_TITLE": "Get started with Copilot",
"KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
"SEND_MESSAGE": "Изпрати съобщение...",
"EMPTY_MESSAGE": "Възникна грешка при генериране на отговора. Моля, опитайте отново.",
"LOADER": "Captain мисли",
"EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
"LOADER": "Captain is thinking",
"YOU": "You",
"USE": "Използвай това",
"RESET": "Нулиране",
"SHOW_STEPS": "Покажи стъпки",
"SELECT_ASSISTANT": "Изберете асистент",
"USE": "Use this",
"RESET": "Reset",
"SHOW_STEPS": "Show steps",
"SELECT_ASSISTANT": "Select Assistant",
"PROMPTS": {
"SUMMARIZE": {
"LABEL": "Обобщете този разговор",
"CONTENT": "Обобщете основните точки, обсъдени между клиента и поддържащия агент, включително притесненията на клиента, въпросите и решенията или отговорите, предоставени от агента."
"LABEL": "Summarize this conversation",
"CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
},
"SUGGEST": {
"LABEL": "Предложете отговор",
"CONTENT": "Анализирайте запитването на клиента и създайте отговор, който ефективно адресира техните притеснения или въпроси. Уверете се, че отговорът е ясен, кратък и предоставя полезна информация."
"LABEL": "Suggest an answer",
"CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
},
"RATE": {
"LABEL": "Оценете този разговор",
"CONTENT": "Прегледайте разговора, за да видите доколко отговаря на нуждите на клиента. Споделете оценка от 5 въз основа на тон, яснота и ефективност."
"LABEL": "Rate this conversation",
"CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
},
"HIGH_PRIORITY": {
"LABEL": "Разговори с висок приоритет",
"CONTENT": "Дайте ми резюме на всички отворени разговори с висок приоритет. Включете ID на разговора, името на клиента (ако е налично), съдържанието на последното съобщение и назначен агент. Групирайте по статус, ако е приложимо."
"LABEL": "High priority conversations",
"CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
},
"LIST_CONTACTS": {
"LABEL": "Списък с контакти",
"CONTENT": "Покажете ми списък с топ 10 контакта. Включете име, имейл или телефонен номер (ако е наличен), време на последно виждане, етикети (ако има такива)."
"LABEL": "List contacts",
"CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
}
}
},
"PLAYGROUND": {
"USER": "You",
"ASSISTANT": "Асистент",
"ASSISTANT": "Assistant",
"MESSAGE_PLACEHOLDER": "Напишете вашето съобщение...",
"HEADER": "Площадка",
"DESCRIPTION": "Използвайте тази площадка, за да изпращате съобщения до вашия асистент и да проверите дали отговаря точно, бързо и в очаквания тон.",
"CREDIT_NOTE": "Изпратените съобщения тук ще се броят към вашите кредити на Captain."
"HEADER": "Playground",
"DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
"CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
},
"PAYWALL": {
"TITLE": "Надградете, за да използвате Captain AI",
"AVAILABLE_ON": "Captain не е наличен в безплатния план.",
"UPGRADE_PROMPT": "Надградете вашия план, за да получите достъп до нашите асистенти, copilot и още.",
"TITLE": "Upgrade to use Captain AI",
"AVAILABLE_ON": "Captain is not available on the free plan.",
"UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
"AVAILABLE_ON": "Captain AI е наличен само в Enterprise плановете.",
"UPGRADE_PROMPT": "Надградете вашия план, за да получите достъп до нашите асистенти, copilot и още.",
"AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
"UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"BANNER": {
"RESPONSES": "Използвали сте над 80% от лимита си за отговори. За да продължите да използвате Captain AI, моля надградете.",
"DOCUMENTS": "Достигнат е лимитът за документи. Надградете, за да продължите да използвате Captain AI."
"RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
"DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
},
"FORM": {
"CANCEL": "Отмени",
@@ -738,17 +738,6 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
"SELECTED": "{count} selected",
"SELECT_ALL": "Select all ({count})",
"UNSELECT_ALL": "Unselect all ({count})",
"BULK_DELETE_BUTTON": "Изтрий",
"BULK_DELETE": {
"TITLE": "Delete documents?",
"DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
"CONFIRM": "Yes, delete all",
"SUCCESS_MESSAGE": "Documents deleted successfully",
"ERROR_MESSAGE": "There was an error deleting the documents, please try again."
},
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -806,7 +795,6 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
"SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -837,18 +825,11 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
"TEST": {
"BUTTON": "Test connection",
"SUCCESS": "Endpoint returned HTTP {status}",
"ERROR": "Connection failed",
"DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
},
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
"ERROR": "Tool name is required",
"MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
"ERROR": "Tool name is required"
},
"DESCRIPTION": {
"LABEL": "Описание",
@@ -302,75 +302,75 @@
},
"ACTIONS": {
"CONTACT_CREATION": {
"ADD_CONTACT": "যোগাযোগ যুক্ত করুন",
"EXPORT_CONTACT": "যোগাযোগসমূহ রপ্তানি করুন",
"IMPORT_CONTACT": "কন্টাক্ট আমদানি করুন",
"SAVE_CONTACT": "যোগাযোগ সংরক্ষণ করুন",
"EMAIL_ADDRESS_DUPLICATE": "এই ইমেইল ঠিকানাটি অন্য একটি যোগাযোগের জন্য ব্যবহৃত হচ্ছে।",
"PHONE_NUMBER_DUPLICATE": "এই ফোন নম্বরটি অন্য একটি যোগাযোগের জন্য ব্যবহৃত হচ্ছে।",
"SUCCESS_MESSAGE": "যোগাযোগ সফলভাবে সংরক্ষণ করা হয়েছে",
"ERROR_MESSAGE": "যোগাযোগ সংরক্ষণ করা যায়নি। অনুগ্রহ করে পরে আবার চেষ্টা করুন।"
"ADD_CONTACT": "Add contact",
"EXPORT_CONTACT": "Export contacts",
"IMPORT_CONTACT": "Import contacts",
"SAVE_CONTACT": "Save contact",
"EMAIL_ADDRESS_DUPLICATE": "This email address is in use for another contact.",
"PHONE_NUMBER_DUPLICATE": "This phone number is in use for another contact.",
"SUCCESS_MESSAGE": "Contact saved successfully",
"ERROR_MESSAGE": "Unable to save contact. Please try again later."
},
"BLOCK_SUCCESS_MESSAGE": "This contact is blocked successfully",
"BLOCK_ERROR_MESSAGE": "Unable to block contact. Please try again later.",
"UNBLOCK_SUCCESS_MESSAGE": "This contact is unblocked successfully",
"UNBLOCK_ERROR_MESSAGE": "Unable to unblock contact. Please try again later.",
"IMPORT_CONTACT": {
"TITLE": "কন্টাক্ট আমদানি করুন",
"DESCRIPTION": "CSV ফাইলের মাধ্যমে কন্টাক্ট আমদানি করুন.",
"DOWNLOAD_LABEL": "একটি নমুনা CSV ডাউনলোড করুন.",
"LABEL": "CSV ফাইল:",
"CHOOSE_FILE": "ফাইল নির্বাচন করুন",
"CHANGE": "পরিবর্তন করুন",
"CANCEL": "বাতিল করুন",
"IMPORT": "আমদানি করুন",
"SUCCESS_MESSAGE": "আমদানি সম্পন্ন হলে আপনাকে ইমেইলে জানানো হবে.",
"ERROR_MESSAGE": "একটি সমস্যা হয়েছে, অনুগ্রহ করে আবার চেষ্টা করুন"
"TITLE": "Import contacts",
"DESCRIPTION": "Import contacts through a CSV file.",
"DOWNLOAD_LABEL": "Download a sample csv.",
"LABEL": "CSV File:",
"CHOOSE_FILE": "Choose file",
"CHANGE": "Change",
"CANCEL": "Cancel",
"IMPORT": "Import",
"SUCCESS_MESSAGE": "You will be notified via email when the import is complete.",
"ERROR_MESSAGE": "There was an error, please try again"
},
"EXPORT_CONTACT": {
"TITLE": "যোগাযোগসমূহ রপ্তানি করুন",
"DESCRIPTION": "আপনার পরিচিতিগুলোর বিস্তারিত তথ্যসহ দ্রুত একটি csv ফাইল রপ্তানি করুন",
"CONFIRM": "রপ্তানি করুন",
"SUCCESS_MESSAGE": "রপ্তানি চলছে. ডাউনলোডের জন্য ফাইল প্রস্তুত হলে আপনাকে ইমেইলে জানানো হবে.",
"ERROR_MESSAGE": "একটি ত্রুটি হয়েছে, অনুগ্রহ করে আবার চেষ্টা করুন"
"TITLE": "Export contacts",
"DESCRIPTION": "Quickly export a csv file with comprehensive details of your contacts",
"CONFIRM": "Export",
"SUCCESS_MESSAGE": "Export is in progress. You will be notified on email when the export file is ready to download.",
"ERROR_MESSAGE": "There was an error, please try again"
},
"SORT_BY": {
"LABEL": "সাজান",
"LABEL": "Sort by",
"OPTIONS": {
"NAME": "নাম",
"EMAIL": "ইমেইল",
"PHONE_NUMBER": "ফোন নম্বর",
"COMPANY": "কোম্পানি",
"COUNTRY": "দেশ",
"CITY": "শহর",
"LAST_ACTIVITY": "সর্বশেষ কার্যকলাপ",
"CREATED_AT": "তৈরি হয়েছে"
"NAME": "Name",
"EMAIL": "Email",
"PHONE_NUMBER": "Phone number",
"COMPANY": "Company",
"COUNTRY": "Country",
"CITY": "City",
"LAST_ACTIVITY": "Last activity",
"CREATED_AT": "Created at"
}
},
"ORDER": {
"LABEL": "অর্ডারিং",
"LABEL": "Ordering",
"OPTIONS": {
"ASCENDING": "আরোহী",
"DESCENDING": "নিম্নক্রমে"
"ASCENDING": "Ascending",
"DESCENDING": "Descending"
}
},
"FILTERS": {
"CREATE_SEGMENT": {
"TITLE": "আপনি কি এই ফিল্টারটি সংরক্ষণ করতে চান?",
"CONFIRM": "ফিল্টার সংরক্ষণ করুন",
"LABEL": "নাম",
"PLACEHOLDER": "ফিল্টারের নাম লিখুন",
"ERROR": "একটি বৈধ নাম লিখুন",
"SUCCESS_MESSAGE": "ফিল্টার সফলভাবে সংরক্ষণ করা হয়েছে",
"ERROR_MESSAGE": "ফিল্টার সংরক্ষণ করা যায়নি। অনুগ্রহ করে পরে আবার চেষ্টা করুন।."
"TITLE": "Do you want to save this filter?",
"CONFIRM": "Save filter",
"LABEL": "Name",
"PLACEHOLDER": "Enter the name of the filter",
"ERROR": "Enter a valid name",
"SUCCESS_MESSAGE": "Filter saved successfully",
"ERROR_MESSAGE": "Unable to save filter. Please try again later."
},
"DELETE_SEGMENT": {
"TITLE": "মুছে ফেলার নিশ্চয়তা দিন",
"DESCRIPTION": "আপনি কি নিশ্চিত যে আপনি এই ফিল্টারটি মুছে ফেলতে চান?",
"CONFIRM": "হ্যাঁ, মুছে ফেলুন",
"CANCEL": "না, বাতিল করুন",
"SUCCESS_MESSAGE": "ফিল্টার সফলভাবে মুছে ফেলা হয়েছে",
"ERROR_MESSAGE": "ফিল্টার মুছে ফেলা যায়নি। অনুগ্রহ করে পরে আবার চেষ্টা করুন।."
"TITLE": "Confirm Deletion",
"DESCRIPTION": "Are you sure you want to delete this filter?",
"CONFIRM": "Yes, Delete",
"CANCEL": "No, Cancel",
"SUCCESS_MESSAGE": "Filter deleted successfully",
"ERROR_MESSAGE": "Unable to delete filter. Please try again later."
}
}
}
@@ -379,33 +379,33 @@
"SHOWING": "Showing {startItem} - {endItem} of {totalItems} contacts"
},
"FILTER": {
"NAME": "নাম",
"EMAIL": "ইমেইল",
"PHONE_NUMBER": "ফোন নম্বর",
"IDENTIFIER": "আইডেন্টিফায়ার",
"COUNTRY": "দেশ",
"CITY": "শহর",
"CREATED_AT": "তৈরি হয়েছে",
"LAST_ACTIVITY": "সর্বশেষ কার্যকলাপ",
"REFERER_LINK": "রেফারার লিঙ্ক",
"BLOCKED": "ব্লক করা হয়েছে",
"BLOCKED_TRUE": "সত্য",
"BLOCKED_FALSE": "ফলস",
"NAME": "Name",
"EMAIL": "Email",
"PHONE_NUMBER": "Phone number",
"IDENTIFIER": "Identifier",
"COUNTRY": "Country",
"CITY": "City",
"CREATED_AT": "Created at",
"LAST_ACTIVITY": "Last activity",
"REFERER_LINK": "Referer link",
"BLOCKED": "Blocked",
"BLOCKED_TRUE": "True",
"BLOCKED_FALSE": "False",
"BUTTONS": {
"CLEAR_FILTERS": "ফিল্টার মুছুন",
"UPDATE_SEGMENT": "সেগমেন্ট আপডেট করুন",
"APPLY_FILTERS": "ফিল্টারগুলি প্রয়োগ করুন",
"ADD_FILTER": "ফিল্টার যোগ করুন"
"CLEAR_FILTERS": "Clear filters",
"UPDATE_SEGMENT": "Update segment",
"APPLY_FILTERS": "Apply filters",
"ADD_FILTER": "Add filter"
},
"TITLE": "যোগাযোগ ফিল্টার করুন",
"EDIT_SEGMENT": "সেগমেন্ট সম্পাদনা করুন",
"TITLE": "Filter contacts",
"EDIT_SEGMENT": "Edit segment",
"SEGMENT": {
"LABEL": "সেগমেন্টের নাম",
"INPUT_PLACEHOLDER": "সেগমেন্টের নাম লিখুন"
"LABEL": "Segment name",
"INPUT_PLACEHOLDER": "Enter the name of the segment"
},
"ACTIVE_FILTERS": {
"MORE_FILTERS": "+ {count} টি আরও ফিল্টার",
"CLEAR_FILTERS": "ফিল্টারগুলি মুছে ফেলুন"
"MORE_FILTERS": "+ {count} more filters",
"CLEAR_FILTERS": "Clear filters"
}
},
"CARD": {
@@ -422,11 +422,11 @@
},
"EMAIL_ADDRESS": {
"PLACEHOLDER": "ইমেইল ঠিকানা লিখুন",
"DUPLICATE": "এই ইমেইল ঠিকানাটি অন্য একটি যোগাযোগের জন্য ব্যবহৃত হচ্ছে।."
"DUPLICATE": "This email address is in use for another contact."
},
"PHONE_NUMBER": {
"PLACEHOLDER": "ফোন নম্বর লিখুন",
"DUPLICATE": "এই ফোন নম্বরটি অন্য একটি যোগাযোগের জন্য ব্যবহৃত হচ্ছে।."
"DUPLICATE": "This phone number is in use for another contact."
},
"CITY": {
"PLACEHOLDER": "শহরের নাম লিখুন"
@@ -441,9 +441,9 @@
"PLACEHOLDER": "কোম্পানির নাম লিখুন"
}
},
"UPDATE_BUTTON": "যোগাযোগ আপডেট করুন",
"SUCCESS_MESSAGE": "যোগাযোগ সফলভাবে আপডেট হয়েছে",
"ERROR_MESSAGE": "যোগাযোগ আপডেট করা যাচ্ছে না। অনুগ্রহ করে পরে আবার চেষ্টা করুন।."
"UPDATE_BUTTON": "Update contact",
"SUCCESS_MESSAGE": "Contact updated successfully",
"ERROR_MESSAGE": "Unable to update contact. Please try again later."
},
"SOCIAL_MEDIA": {
"TITLE": "সামাজিক লিঙ্ক সম্পাদনা করুন",
@@ -477,34 +477,34 @@
}
},
"DETAILS": {
"CREATED_AT": "তৈরি হয়েছে {date}",
"LAST_ACTIVITY": "সর্বশেষ সক্রিয় {date}",
"DELETE_CONTACT_DESCRIPTION": "এই যোগাযোগ স্থায়ীভাবে মুছে ফেলুন। এই ক্রিয়াটি অপরিবর্তনীয়।",
"DELETE_CONTACT": "যোগাযোগ মুছুন",
"CREATED_AT": "Created {date}",
"LAST_ACTIVITY": "Last active {date}",
"DELETE_CONTACT_DESCRIPTION": "Permanently delete this contact. This action is irreversible",
"DELETE_CONTACT": "Delete contact",
"DELETE_DIALOG": {
"TITLE": "মুছে ফেলার নিশ্চিতকরণ",
"DESCRIPTION": "আপনি কি নিশ্চিত যে আপনি এই যোগাযোগটি মুছে ফেলতে চান?",
"CONFIRM": "হ্যাঁ, মুছে ফেলুন",
"TITLE": "Confirm Deletion",
"DESCRIPTION": "Are you sure you want to delete this contact?",
"CONFIRM": "Yes, Delete",
"API": {
"SUCCESS_MESSAGE": "যোগাযোগ সফলভাবে মুছে ফেলা হয়েছে",
"ERROR_MESSAGE": "যোগাযোগ মুছে ফেলা যায়নি। অনুগ্রহ করে পরে আবার চেষ্টা করুন।"
"SUCCESS_MESSAGE": "Contact deleted successfully",
"ERROR_MESSAGE": "Could not delete contact. Please try again later."
}
},
"AVATAR": {
"UPLOAD": {
"ERROR_MESSAGE": "অবতার আপলোড করা যায়নি। অনুগ্রহ করে পরে আবার চেষ্টা করুন।",
"SUCCESS_MESSAGE": "অবতার সফলভাবে আপলোড হয়েছে"
"ERROR_MESSAGE": "Could not upload avatar. Please try again later.",
"SUCCESS_MESSAGE": "Avatar uploaded successfully"
},
"DELETE": {
"SUCCESS_MESSAGE": "অবতার সফলভাবে মুছে ফেলা হয়েছে",
"ERROR_MESSAGE": "অবতার মুছে ফেলা যায়নি। অনুগ্রহ করে পরে আবার চেষ্টা করুন।"
"SUCCESS_MESSAGE": "Avatar deleted successfully",
"ERROR_MESSAGE": "Could not delete avatar. Please try again later."
}
}
},
"SIDEBAR": {
"TABS": {
"ATTRIBUTES": "বৈশিষ্ট্যসমূহ",
"HISTORY": "ইতিহাস",
"ATTRIBUTES": "Attributes",
"HISTORY": "History",
"NOTES": "Notes",
"MERGE": "Merge"
},
@@ -570,11 +570,11 @@
}
},
"EMPTY_STATE": {
"TITLE": "এই অ্যাকাউন্টে কোনো যোগাযোগ পাওয়া যায়নি",
"SUBTITLE": "নিচের বোতামে ক্লিক করে নতুন কন্টাক্ট যোগ করা শুরু করুন",
"BUTTON_LABEL": "কন্টাক্ট যোগ করুন",
"SEARCH_EMPTY_STATE_TITLE": "আপনার অনুসন্ধানের সাথে কোনো কন্টাক্ট মেলে নি 🔍",
"LIST_EMPTY_STATE_TITLE": "এই ভিউতে কোনো কন্টাক্ট নেই 📋",
"TITLE": "No contacts found in this account",
"SUBTITLE": "Start adding new contacts by clicking on the button below",
"BUTTON_LABEL": "Add contact",
"SEARCH_EMPTY_STATE_TITLE": "No contacts matches your search 🔍",
"LIST_EMPTY_STATE_TITLE": "No contacts available in this view 📋",
"ACTIVE_EMPTY_STATE_TITLE": "No contacts are active at the moment 🌙"
},
"LOAD_MORE": "Load more"
@@ -1,319 +1,319 @@
{
"CONVERSATION": {
"SELECT_A_CONVERSATION": "বাম পাশ থেকে একটি কনভার্সেশন নির্বাচন করুন",
"CSAT_REPLY_MESSAGE": "অনুগ্রহ করে কথোপকথনের মূল্যায়ন করুন",
"404": "দুঃখিত, আমরা কনভার্সেশনটি খুঁজে পাচ্ছি না। আবার চেষ্টা করুন",
"SWITCH_VIEW_LAYOUT": "লেআউট পরিবর্তন করুন",
"DASHBOARD_APP_TAB_MESSAGES": "বার্তা",
"UNVERIFIED_SESSION": "এই ব্যবহারকারীর পরিচয় যাচাই করা হয়নি",
"NO_MESSAGE_1": "ওহ! আপনার ইনবক্সে কোনো গ্রাহকের বার্তা নেই।",
"NO_MESSAGE_2": " আপনার পেজে বার্তা পাঠাতে!",
"NO_INBOX_1": "হ্যালো! আপনি এখনো কোনো ইনবক্স যোগ করেননি।",
"NO_INBOX_2": " শুরু করতে",
"NO_INBOX_AGENT": "ওহ! আপনি কোনো ইনবক্সের সদস্য নন। অনুগ্রহ করে আপনার অ্যাডমিনের সাথে যোগাযোগ করুন।",
"SEARCH_MESSAGES": "কথোপকথনে বার্তা অনুসন্ধান করুন",
"VIEW_ORIGINAL": "মূল দেখুন",
"VIEW_TRANSLATED": "অনুবাদ দেখুন",
"SELECT_A_CONVERSATION": "Please select a conversation from left pane",
"CSAT_REPLY_MESSAGE": "Please rate the conversation",
"404": "Sorry, we cannot find the conversation. Please try again",
"SWITCH_VIEW_LAYOUT": "Switch the layout",
"DASHBOARD_APP_TAB_MESSAGES": "Messages",
"UNVERIFIED_SESSION": "The identity of this user is not verified",
"NO_MESSAGE_1": "Uh oh! Looks like there are no messages from customers in your inbox.",
"NO_MESSAGE_2": " to send a message to your page!",
"NO_INBOX_1": "Hola! Looks like you haven't added any inboxes yet.",
"NO_INBOX_2": " to get started",
"NO_INBOX_AGENT": "Uh Oh! Looks like you are not part of any inbox. Please contact your administrator",
"SEARCH_MESSAGES": "Search for messages in conversations",
"VIEW_ORIGINAL": "View original",
"VIEW_TRANSLATED": "View translated",
"EMPTY_STATE": {
"CMD_BAR": "কমান্ড মেনু খুলতে",
"KEYBOARD_SHORTCUTS": "কীবোর্ড শর্টকাট দেখতে"
"CMD_BAR": "to open command menu",
"KEYBOARD_SHORTCUTS": "to view keyboard shortcuts"
},
"SEARCH": {
"TITLE": "বার্তা অনুসন্ধান",
"RESULT_TITLE": "অনুসন্ধান ফলাফল",
"LOADING_MESSAGE": "ডেটা বিশ্লেষণ হচ্ছে...",
"PLACEHOLDER": "বার্তা খুঁজতে যেকোনো লেখা টাইপ করুন",
"NO_MATCHING_RESULTS": "কোন ফলাফল পাওয়া যায়নি।"
"TITLE": "Search messages",
"RESULT_TITLE": "Search Results",
"LOADING_MESSAGE": "Crunching data...",
"PLACEHOLDER": "Type any text to search messages",
"NO_MATCHING_RESULTS": "No results found."
},
"UNREAD_MESSAGES": "অপঠিত বার্তা",
"UNREAD_MESSAGE": "অপঠিত বার্তা",
"CLICK_HERE": "এখানে ক্লিক করুন",
"LOADING_INBOXES": "ইনবক্স লোড হচ্ছে",
"LOADING_CONVERSATIONS": "কথোপকথন লোড হচ্ছে",
"CANNOT_REPLY": "আপনি উত্তর দিতে পারবেন না কারণ",
"24_HOURS_WINDOW": "২৪ ঘণ্টার মেসেজ সীমাবদ্ধতা",
"48_HOURS_WINDOW": "৪৮ ঘণ্টার মেসেজ সীমাবদ্ধতা",
"UNREAD_MESSAGES": "Unread Messages",
"UNREAD_MESSAGE": "Unread Message",
"CLICK_HERE": "Click here",
"LOADING_INBOXES": "Loading inboxes",
"LOADING_CONVERSATIONS": "Loading Conversations",
"CANNOT_REPLY": "You cannot reply due to",
"24_HOURS_WINDOW": "24 hour message window restriction",
"48_HOURS_WINDOW": "48 hour message window restriction",
"API_HOURS_WINDOW": "You can only reply to this conversation within {hours} hours",
"NOT_ASSIGNED_TO_YOU": "এই কথোপকথনটি আপনার কাছে বরাদ্দ নয়। আপনি কি এটি নিজের কাছে বরাদ্দ করতে চান?",
"ASSIGN_TO_ME": "নিজের কাছে বরাদ্দ করুন",
"BOT_HANDOFF_MESSAGE": "আপনি এমন একটি কথোপকথনে উত্তর দিচ্ছেন যা বর্তমানে সহকারী বা বট দ্বারা পরিচালিত হচ্ছে।",
"BOT_HANDOFF_ACTION": "ওপেন করুন এবং নিজের কাছে অ্যাসাইন করুন",
"BOT_HANDOFF_REOPEN_ACTION": "কথোপকথন ওপেন করুন",
"BOT_HANDOFF_SUCCESS": "কথোপকথনটি আপনার কাছে হস্তান্তর করা হয়েছে",
"BOT_HANDOFF_ERROR": "কথোপকথনটি নেওয়া যায়নি। আবার চেষ্টা করুন।",
"TWILIO_WHATSAPP_CAN_REPLY": "আপনি শুধুমাত্র টেমপ্লেট বার্তা ব্যবহার করে এই আলাপে উত্তর দিতে পারবেন কারণ",
"TWILIO_WHATSAPP_24_HOURS_WINDOW": "২৪ ঘণ্টার বার্তা সীমাবদ্ধতা",
"OLD_INSTAGRAM_INBOX_REPLY_BANNER": "এই Instagram অ্যাকাউন্টটি নতুন Instagram চ্যানেল ইনবক্সে স্থানান্তরিত হয়েছে। সব নতুন বার্তা সেখানে দেখা যাবে। আপনি আর এই কথোপকথন থেকে বার্তা পাঠাতে পারবেন না।",
"REPLYING_TO": "আপনি যাকে উত্তর দিচ্ছেন:",
"REMOVE_SELECTION": "নির্বাচন সরান",
"DOWNLOAD": "ডাউনলোড",
"UNKNOWN_FILE_TYPE": "অজানা ফাইল",
"SAVE_CONTACT": "যোগাযোগ সংরক্ষণ করুন",
"NO_CONTENT": "দেখানোর জন্য কোনো বিষয়বস্তু নেই",
"NOT_ASSIGNED_TO_YOU": "This conversation is not assigned to you. Would you like to assign this conversation to yourself?",
"ASSIGN_TO_ME": "Assign to me",
"BOT_HANDOFF_MESSAGE": "You are responding to a conversation which is currently handled by an assistant or a bot.",
"BOT_HANDOFF_ACTION": "Mark open and assign to you",
"BOT_HANDOFF_REOPEN_ACTION": "Mark conversation open",
"BOT_HANDOFF_SUCCESS": "Conversation has been handed over to you",
"BOT_HANDOFF_ERROR": "Failed to take over the conversation. Please try again.",
"TWILIO_WHATSAPP_CAN_REPLY": "You can only reply to this conversation using a template message due to",
"TWILIO_WHATSAPP_24_HOURS_WINDOW": "24 hour message window restriction",
"OLD_INSTAGRAM_INBOX_REPLY_BANNER": "This Instagram account was migrated to the new Instagram channel inbox. All new messages will show up there. You won’t be able to send messages from this conversation anymore.",
"REPLYING_TO": "You are replying to:",
"REMOVE_SELECTION": "Remove Selection",
"DOWNLOAD": "Download",
"UNKNOWN_FILE_TYPE": "Unknown File",
"SAVE_CONTACT": "Save Contact",
"NO_CONTENT": "No content to display",
"SHARED_ATTACHMENT": {
"CONTACT": "{sender} has shared a contact",
"LOCATION": "{sender} has shared a location",
"FILE": "{sender} has shared a file",
"MEETING": "{sender} has started a meeting"
},
"UPLOADING_ATTACHMENTS": "সংযুক্তি আপলোড হচ্ছে...",
"REPLIED_TO_STORY": "আপনার স্টোরিতে উত্তর দিয়েছে",
"UPLOADING_ATTACHMENTS": "Uploading attachments...",
"REPLIED_TO_STORY": "Replied to your story",
"UNSUPPORTED_MESSAGE": "This message is unsupported. You can view this message on the Facebook / Instagram app.",
"UNSUPPORTED_MESSAGE_FACEBOOK": "এই বার্তাটি সমর্থিত নয়। আপনি Facebook Messenger অ্যাপে এই বার্তাটি দেখতে পারেন।",
"UNSUPPORTED_MESSAGE_INSTAGRAM": "এই বার্তাটি সমর্থিত নয়। আপনি Instagram অ্যাপে এই বার্তাটি দেখতে পারেন।",
"UNSUPPORTED_MESSAGE_TIKTOK": "এই বার্তাটি সমর্থিত নয়। TikTok অ্যাপে এই বার্তাটি দেখতে পারেন।",
"SUCCESS_DELETE_MESSAGE": "বার্তা সফলভাবে মুছে ফেলা হয়েছে",
"FAIL_DELETE_MESSSAGE": "বার্তা মুছে ফেলা যায়নি! আবার চেষ্টা করুন",
"NO_RESPONSE": "কোনো উত্তর নেই",
"RESPONSE": "উত্তর",
"RATING_TITLE": "রেটিং",
"FEEDBACK_TITLE": "মতামত",
"REPLY_MESSAGE_NOT_FOUND": "বার্তাটি পাওয়া যায়নি",
"UNSUPPORTED_MESSAGE_FACEBOOK": "This message is unsupported. You can view this message on the Facebook Messenger app.",
"UNSUPPORTED_MESSAGE_INSTAGRAM": "This message is unsupported. You can view this message on the Instagram app.",
"UNSUPPORTED_MESSAGE_TIKTOK": "This message is unsupported. You can view this message on the TikTok app.",
"SUCCESS_DELETE_MESSAGE": "Message deleted successfully",
"FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again",
"NO_RESPONSE": "No response",
"RESPONSE": "Response",
"RATING_TITLE": "Rating",
"FEEDBACK_TITLE": "Feedback",
"REPLY_MESSAGE_NOT_FOUND": "Message not available",
"CARD": {
"SHOW_LABELS": "লেবেল দেখান",
"HIDE_LABELS": "লেবেল লুকান"
"SHOW_LABELS": "Show labels",
"HIDE_LABELS": "Hide labels"
},
"VOICE_CALL": {
"INCOMING_CALL": "ইনকামিং কল",
"OUTGOING_CALL": "আউটগোয়িং কল",
"CALL_IN_PROGRESS": "কল চলছে",
"NO_ANSWER": "উত্তর নেই",
"MISSED_CALL": "মিসড কল",
"CALL_ENDED": "কল শেষ হয়েছে",
"NOT_ANSWERED_YET": "এখনও উত্তর পাওয়া যায়নি",
"THEY_ANSWERED": "তারা উত্তর দিয়েছে",
"YOU_ANSWERED": "আপনি উত্তর দিয়েছেন"
"INCOMING_CALL": "Incoming call",
"OUTGOING_CALL": "Outgoing call",
"CALL_IN_PROGRESS": "Call in progress",
"NO_ANSWER": "No answer",
"MISSED_CALL": "Missed call",
"CALL_ENDED": "Call ended",
"NOT_ANSWERED_YET": "Not answered yet",
"THEY_ANSWERED": "They answered",
"YOU_ANSWERED": "You answered"
},
"HEADER": {
"RESOLVE_ACTION": "সমাধান করুন",
"REOPEN_ACTION": "পুনরায় খুলুন",
"OPEN_ACTION": "খুলুন",
"MORE_ACTIONS": "আরও অপশন",
"OPEN": "আরও",
"CLOSE": "বন্ধ করুন",
"DETAILS": "বিস্তারিত",
"SNOOZED_UNTIL": "স্নুজ করা হয়েছে পর্যন্ত",
"SNOOZED_UNTIL_TOMORROW": "আগামীকাল পর্যন্ত স্থগিত",
"SNOOZED_UNTIL_NEXT_WEEK": "পরবর্তী সপ্তাহ পর্যন্ত স্থগিত",
"SNOOZED_UNTIL_NEXT_REPLY": "পরবর্তী উত্তর পর্যন্ত স্থগিত",
"RESOLVE_ACTION": "Resolve",
"REOPEN_ACTION": "Reopen",
"OPEN_ACTION": "Open",
"MORE_ACTIONS": "More actions",
"OPEN": "More",
"CLOSE": "Close",
"DETAILS": "details",
"SNOOZED_UNTIL": "Snoozed until",
"SNOOZED_UNTIL_TOMORROW": "Snoozed until tomorrow",
"SNOOZED_UNTIL_NEXT_WEEK": "Snoozed until next week",
"SNOOZED_UNTIL_NEXT_REPLY": "Snoozed until next reply",
"SLA_STATUS": {
"FRT": "FRT {status}",
"NRT": "NRT {status}",
"RT": "RT {status}",
"MISSED": "মিস হয়েছে",
"DUE": "বাকি"
"MISSED": "missed",
"DUE": "due"
}
},
"RESOLVE_DROPDOWN": {
"MARK_PENDING": "পেন্ডিং হিসেবে চিহ্নিত করুন",
"SNOOZE_UNTIL": "স্নুজ",
"MARK_PENDING": "Mark as pending",
"SNOOZE_UNTIL": "Snooze",
"SNOOZE": {
"TITLE": "স্নুজ করুন যতক্ষণ না",
"NEXT_REPLY": "পরবর্তী উত্তর",
"TOMORROW": "আগামীকাল",
"NEXT_WEEK": "পরবর্তী সপ্তাহ"
"TITLE": "Snooze until",
"NEXT_REPLY": "Next reply",
"TOMORROW": "Tomorrow",
"NEXT_WEEK": "Next week"
}
},
"MENTION": {
"AGENTS": "এজেন্টরা",
"TEAMS": "টিমসমূহ"
"AGENTS": "Agents",
"TEAMS": "Teams"
},
"CUSTOM_SNOOZE": {
"TITLE": "স্নুজ করা হবে পর্যন্ত",
"APPLY": "স্নুজ",
"CANCEL": "বাতিল"
"TITLE": "Snooze until",
"APPLY": "Snooze",
"CANCEL": "Cancel"
},
"PRIORITY": {
"TITLE": "অগ্রাধিকার",
"TITLE": "Priority",
"OPTIONS": {
"NONE": "কিছুই না",
"URGENT": "জরুরি",
"HIGH": "উচ্চ",
"MEDIUM": "মাঝারি",
"LOW": "নিম্ন"
"NONE": "None",
"URGENT": "Urgent",
"HIGH": "High",
"MEDIUM": "Medium",
"LOW": "Low"
},
"CHANGE_PRIORITY": {
"SELECT_PLACEHOLDER": "কিছুই না",
"INPUT_PLACEHOLDER": "অগ্রাধিকার নির্বাচন করুন",
"NO_RESULTS": "কোন ফলাফল পাওয়া যায়নি",
"SELECT_PLACEHOLDER": "None",
"INPUT_PLACEHOLDER": "Select priority",
"NO_RESULTS": "No results found",
"SUCCESSFUL": "Changed priority of conversation id {conversationId} to {priority}",
"FAILED": "প্রাধান্য পরিবর্তন করা যায়নি। আবার চেষ্টা করুন।"
"FAILED": "Couldn't change priority. Please try again."
}
},
"DELETE_CONVERSATION": {
"TITLE": "Delete conversation #{conversationId}",
"DESCRIPTION": "আপনি কি নিশ্চিতভাবে এই কথোপকথনটি মুছে ফেলতে চান?",
"CONFIRM": "মুছে ফেলুন"
"DESCRIPTION": "Are you sure you want to delete this conversation?",
"CONFIRM": "Delete"
},
"CARD_CONTEXT_MENU": {
"PENDING": "বিচারাধীন হিসেবে চিহ্নিত করুন",
"RESOLVED": "সমাধান হয়েছে হিসেবে চিহ্নিত করুন",
"MARK_AS_UNREAD": "অপঠিত হিসেবে চিহ্নিত করুন",
"MARK_AS_READ": "পড়া হয়েছে হিসেবে চিহ্নিত করুন",
"REOPEN": "আলোচনা পুনরায় খুলুন",
"PENDING": "Mark as pending",
"RESOLVED": "Mark as resolved",
"MARK_AS_UNREAD": "Mark as unread",
"MARK_AS_READ": "Mark as read",
"REOPEN": "Reopen conversation",
"SNOOZE": {
"TITLE": "স্নুজ",
"NEXT_REPLY": "পরবর্তী উত্তর পর্যন্ত",
"TOMORROW": "আগামীকাল পর্যন্ত",
"NEXT_WEEK": "পরবর্তী সপ্তাহ পর্যন্ত"
"TITLE": "Snooze",
"NEXT_REPLY": "Until next reply",
"TOMORROW": "Until tomorrow",
"NEXT_WEEK": "Until next week"
},
"ASSIGN_AGENT": "এজেন্ট নির্ধারণ করুন",
"ASSIGN_LABEL": "লেবেল নির্ধারণ করুন",
"AGENTS_LOADING": "এজেন্ট লোড হচ্ছে...",
"ASSIGN_TEAM": "টিম নির্ধারণ করুন",
"DELETE": "কথোপকথন মুছে ফেলুন",
"OPEN_IN_NEW_TAB": "নতুন ট্যাবে খুলুন",
"COPY_LINK": "কথোপকথনের লিংক কপি করুন",
"COPY_LINK_SUCCESS": "কথোপকথনের লিংক ক্লিপবোর্ডে কপি হয়েছে",
"ASSIGN_AGENT": "Assign agent",
"ASSIGN_LABEL": "Assign label",
"AGENTS_LOADING": "Loading agents...",
"ASSIGN_TEAM": "Assign team",
"DELETE": "Delete conversation",
"OPEN_IN_NEW_TAB": "Open in new tab",
"COPY_LINK": "Copy conversation link",
"COPY_LINK_SUCCESS": "Conversation link copied to clipboard",
"API": {
"AGENT_ASSIGNMENT": {
"SUCCESFUL": "Conversation id {conversationId} assigned to \"{agentName}\"",
"FAILED": "এজেন্ট নির্ধারণ করা যায়নি। আবার চেষ্টা করুন।"
"FAILED": "Couldn't assign agent. Please try again."
},
"LABEL_ASSIGNMENT": {
"SUCCESFUL": "Assigned label #{labelName} to conversation id {conversationId}",
"FAILED": "লেবেল নির্ধারণ করা যায়নি। আবার চেষ্টা করুন।"
"FAILED": "Couldn't assign label. Please try again."
},
"LABEL_REMOVAL": {
"SUCCESFUL": "Removed label #{labelName} from conversation id {conversationId}",
"FAILED": "লেবেল সরানো যায়নি। অনুগ্রহ করে আবার চেষ্টা করুন।"
"FAILED": "Couldn't remove label. Please try again."
},
"TEAM_ASSIGNMENT": {
"SUCCESFUL": "Assigned team \"{team}\" to conversation id {conversationId}",
"FAILED": "টিম নির্ধারণ করা যায়নি। আবার চেষ্টা করুন।"
"FAILED": "Couldn't assign team. Please try again."
}
}
},
"FOOTER": {
"MESSAGE_SIGN_TOOLTIP": "বার্তার স্বাক্ষর",
"ENABLE_SIGN_TOOLTIP": "স্বাক্ষর চালু করুন",
"DISABLE_SIGN_TOOLTIP": "স্বাক্ষর বন্ধ করুন",
"MSG_INPUT": "নতুন লাইনের জন্য Shift + Enter চাপুন। Canned Response বাছাই করতে '/' দিয়ে শুরু করুন।",
"PRIVATE_MSG_INPUT": "নতুন লাইনের জন্য Shift + Enter চাপুন। এটি শুধু এজেন্টদের জন্য দৃশ্যমান হবে",
"MESSAGING_RESTRICTED": "আপনি এই কথোপকথনে উত্তর দিতে পারবেন না",
"MESSAGING_RESTRICTED_WHATSAPP": "২৪ ঘণ্টার বার্তা সীমাবদ্ধতার কারণে শুধু টেমপ্লেট বার্তা দিয়ে উত্তর দিতে পারবেন",
"MESSAGING_RESTRICTED_API": "বার্তা উইন্ডো সীমাবদ্ধতার কারণে শুধু টেমপ্লেট বার্তা দিয়ে উত্তর দিতে পারবেন",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "বার্তার স্বাক্ষর কনফিগার করা হয়নি, প্রোফাইল সেটিংসে কনফিগার করুন।",
"COPILOT_MSG_INPUT": "Copilot-কে আরও নির্দেশ দিন বা অন্য কিছু জিজ্ঞাসা করুন... ফলো-আপ পাঠাতে এন্টার চাপুন",
"CLICK_HERE": "আপডেট করতে এখানে ক্লিক করুন",
"WHATSAPP_TEMPLATES": "Whatsapp টেমপ্লেট"
"MESSAGE_SIGN_TOOLTIP": "Message signature",
"ENABLE_SIGN_TOOLTIP": "Enable signature",
"DISABLE_SIGN_TOOLTIP": "Disable signature",
"MSG_INPUT": "Shift + enter for new line. Start with '/' to select a Canned Response.",
"PRIVATE_MSG_INPUT": "Shift + enter for new line. This will be visible only to Agents",
"MESSAGING_RESTRICTED": "You cannot reply to this conversation",
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Message signature is not configured, please configure it in profile settings.",
"COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
"CLICK_HERE": "Click here to update",
"WHATSAPP_TEMPLATES": "Whatsapp Templates"
},
"REPLYBOX": {
"REPLY": "উত্তর দিন",
"PRIVATE_NOTE": "ব্যক্তিগত নোট",
"SEND": "পাঠান",
"CREATE": "নোট যোগ করুন",
"INSERT_READ_MORE": "আরও পড়ুন",
"DISMISS_REPLY": "উত্তর বাতিল করুন",
"REPLYING_TO": "উত্তর দিচ্ছেন:",
"TIP_EMOJI_ICON": "ইমোজি সিলেক্টর দেখান",
"TIP_ATTACH_ICON": "ফাইল সংযুক্ত করুন",
"TIP_AUDIORECORDER_ICON": "অডিও রেকর্ড করুন",
"TIP_AUDIORECORDER_PERMISSION": "অডিও অ্যাক্সেসের অনুমতি দিন",
"TIP_AUDIORECORDER_ERROR": "অডিও খোলা যায়নি",
"DRAG_DROP": "সংযুক্ত করতে এখানে ড্র্যাগ ও ড্রপ করুন",
"START_AUDIO_RECORDING": "অডিও রেকর্ডিং শুরু করুন",
"STOP_AUDIO_RECORDING": "অডিও রেকর্ডিং বন্ধ করুন",
"COPILOT_THINKING": "Copilot ভাবছে",
"REPLY": "Reply",
"PRIVATE_NOTE": "Private Note",
"SEND": "Send",
"CREATE": "Add Note",
"INSERT_READ_MORE": "Read more",
"DISMISS_REPLY": "Dismiss reply",
"REPLYING_TO": "Replying to:",
"TIP_EMOJI_ICON": "Show emoji selector",
"TIP_ATTACH_ICON": "Attach files",
"TIP_AUDIORECORDER_ICON": "Record audio",
"TIP_AUDIORECORDER_PERMISSION": "Allow access to audio",
"TIP_AUDIORECORDER_ERROR": "Could not open the audio",
"DRAG_DROP": "Drag and drop here to attach",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
"COPILOT_THINKING": "Copilot is thinking",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "বিসিসি যোগ করুন",
"ADD_BCC": "Add bcc",
"CC": {
"LABEL": "CC",
"PLACEHOLDER": "কমা দিয়ে আলাদা ইমেইল",
"ERROR": "সঠিক ইমেইল ঠিকানা দিন"
"PLACEHOLDER": "Emails separated by commas",
"ERROR": "Please enter valid email addresses"
},
"BCC": {
"LABEL": "BCC",
"PLACEHOLDER": "কমা দিয়ে আলাদা ইমেইল",
"ERROR": "বৈধ ইমেইল ঠিকানা দিন"
"PLACEHOLDER": "Emails separated by commas",
"ERROR": "Please enter valid email addresses"
}
},
"UNDEFINED_VARIABLES": {
"TITLE": "অনির্ধারিত ভেরিয়েবল",
"TITLE": "Undefined variables",
"MESSAGE": "You have {undefinedVariablesCount} undefined variables in your message: {undefinedVariables}. Would you like to send the message anyway?",
"CONFIRM": {
"YES": "পাঠান",
"CANCEL": "বাতিল"
"YES": "Send",
"CANCEL": "Cancel"
}
},
"QUOTED_REPLY": {
"ENABLE_TOOLTIP": "উদ্ধৃত ইমেইল থ্রেড যুক্ত করুন",
"DISABLE_TOOLTIP": "উদ্ধৃত ইমেইল থ্রেড যুক্ত করবেন না",
"REMOVE_PREVIEW": "উদ্ধৃত ইমেইল থ্রেড সরান",
"COLLAPSE": "প্রিভিউ সংকুচিত করুন",
"EXPAND": "প্রিভিউ বড় করুন"
"ENABLE_TOOLTIP": "Include quoted email thread",
"DISABLE_TOOLTIP": "Don't include quoted email thread",
"REMOVE_PREVIEW": "Remove quoted email thread",
"COLLAPSE": "Collapse preview",
"EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "ব্যক্তিগত নোট: শুধু আপনি ও আপনার টিম দেখতে পারবেন",
"CHANGE_STATUS": "কথোপকথনের অবস্থা পরিবর্তিত হয়েছে",
"CHANGE_STATUS_FAILED": "কনভার্সেশনের স্ট্যাটাস পরিবর্তন ব্যর্থ হয়েছে",
"CHANGE_AGENT": "কথোপকথনের দায়িত্বপ্রাপ্ত ব্যক্তি পরিবর্তিত হয়েছে",
"CHANGE_AGENT_FAILED": "অ্যাসাইনি পরিবর্তন ব্যর্থ হয়েছে",
"ASSIGN_LABEL_SUCCESFUL": "লেবেল সফলভাবে নির্ধারণ হয়েছে",
"ASSIGN_LABEL_FAILED": "লেবেল নির্ধারণ ব্যর্থ হয়েছে",
"CHANGE_TEAM": "আলাপের টিম পরিবর্তন হয়েছে",
"SUCCESS_DELETE_CONVERSATION": "কথোপকথন সফলভাবে মুছে ফেলা হয়েছে",
"FAIL_DELETE_CONVERSATION": "কথোপকথন মুছে ফেলা যায়নি! আবার চেষ্টা করুন",
"VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team",
"CHANGE_STATUS": "Conversation status changed",
"CHANGE_STATUS_FAILED": "Conversation status change failed",
"CHANGE_AGENT": "Conversation Assignee changed",
"CHANGE_AGENT_FAILED": "Assignee change failed",
"ASSIGN_LABEL_SUCCESFUL": "Label assigned successfully",
"ASSIGN_LABEL_FAILED": "Label assignment failed",
"CHANGE_TEAM": "Conversation team changed",
"SUCCESS_DELETE_CONVERSATION": "Conversation deleted successfully",
"FAIL_DELETE_CONVERSATION": "Couldn't delete conversation! Try again",
"FILE_SIZE_LIMIT": "File exceeds the {MAXIMUM_SUPPORTED_FILE_UPLOAD_SIZE} MB attachment limit",
"FILE_TYPE_NOT_SUPPORTED": "This {fileName} file type is not supported in this conversation",
"MESSAGE_ERROR": "বার্তাটি পাঠানো যায়নি, পরে আবার চেষ্টা করুন",
"SENT_BY": "প্রেরক:",
"MESSAGE_ERROR": "Unable to send this message, please try again later",
"SENT_BY": "Sent by:",
"BOT": "Bot",
"NATIVE_APP": "নেটিভ অ্যাপ",
"NATIVE_APP_ADVISORY": "এই বার্তাটি নেটিভ অ্যাপ থেকে পাঠানো হয়েছে। বার্তা উইন্ডো বজায় রাখতে Chatwoot থেকে উত্তর দিন।",
"SEND_FAILED": "বার্তা পাঠানো যায়নি! আবার চেষ্টা করুন",
"TRY_AGAIN": "পুনরায় চেষ্টা করুন",
"NATIVE_APP": "Native app",
"NATIVE_APP_ADVISORY": "This message was sent from the native app. Reply from Chatwoot to maintain the message window.",
"SEND_FAILED": "Couldn't send message! Try again",
"TRY_AGAIN": "retry",
"ASSIGNMENT": {
"SELECT_AGENT": "এজেন্ট নির্বাচন করুন",
"REMOVE": "সরান",
"ASSIGN": "নিয়োগ করুন"
"SELECT_AGENT": "Select Agent",
"REMOVE": "Remove",
"ASSIGN": "Assign"
},
"CONTEXT_MENU": {
"COPY": "কপি করুন",
"REPLY_TO": "এই বার্তায় উত্তর দিন",
"DELETE": "মুছুন",
"CREATE_A_CANNED_RESPONSE": "ক্যানড রেসপন্সে যোগ করুন",
"TRANSLATE": "অনুবাদ করুন",
"COPY_PERMALINK": "বার্তার লিঙ্ক কপি করুন",
"LINK_COPIED": "বার্তার URL ক্লিপবোর্ডে কপি হয়েছে",
"COPY": "Copy",
"REPLY_TO": "Reply to this message",
"DELETE": "Delete",
"CREATE_A_CANNED_RESPONSE": "Add to canned responses",
"TRANSLATE": "Translate",
"COPY_PERMALINK": "Copy link to the message",
"LINK_COPIED": "Message URL copied to the clipboard",
"DELETE_CONFIRMATION": {
"TITLE": "আপনি কি নিশ্চিত এই বার্তাটি মুছে ফেলতে চান?",
"MESSAGE": "এই কাজটি পূর্বাবস্থায় ফেরানো যাবে না",
"DELETE": "মুছে ফেলুন",
"CANCEL": "বাতিল করুন"
"TITLE": "Are you sure you want to delete this message?",
"MESSAGE": "You cannot undo this action",
"DELETE": "Delete",
"CANCEL": "Cancel"
}
},
"SIDEBAR": {
"CONTACT": "যোগাযোগ",
"CONTACT": "Contact",
"COPILOT": "Copilot"
},
"VOICE_WIDGET": {
"INCOMING_CALL": "আসন্ন কল",
"OUTGOING_CALL": "প্রেরিত কল",
"CALL_IN_PROGRESS": "কল চলছে",
"NOT_ANSWERED_YET": "এখনও উত্তর পাওয়া যায়নি",
"HANDLED_IN_ANOTHER_TAB": "অন্য ট্যাবে পরিচালিত হচ্ছে",
"REJECT_CALL": "প্রত্যাখ্যান করুন",
"JOIN_CALL": "কলে যোগ দিন",
"END_CALL": "কল শেষ করুন"
"INCOMING_CALL": "Incoming call",
"OUTGOING_CALL": "Outgoing call",
"CALL_IN_PROGRESS": "Call in progress",
"NOT_ANSWERED_YET": "Not answered yet",
"HANDLED_IN_ANOTHER_TAB": "Being handled in another tab",
"REJECT_CALL": "Reject",
"JOIN_CALL": "Join call",
"END_CALL": "End call"
}
},
"EMAIL_TRANSCRIPT": {
"TITLE": "কথোপকথনের ট্রান্সক্রিপ্ট পাঠান",
"DESC": "নির্দিষ্ট ইমেইল ঠিকানায় কথোপকথনের ট্রান্সক্রিপ্ট পাঠান",
"SUBMIT": "জমা দিন",
"CANCEL": "বাতিল করুন",
"SEND_EMAIL_SUCCESS": "চ্যাট ট্রান্সক্রিপ্ট সফলভাবে পাঠানো হয়েছে",
"SEND_EMAIL_ERROR": "একটি ত্রুটি হয়েছে, অনুগ্রহ করে আবার চেষ্টা করুন",
"SEND_EMAIL_PAYMENT_REQUIRED": "আপনার বর্তমান প্ল্যানে ইমেইল ট্রান্সক্রিপ্ট সুবিধা নেই। এই ফিচারটি ব্যবহার করতে প্ল্যান আপগ্রেড করুন।",
"TITLE": "Send conversation transcript",
"DESC": "Send a copy of the conversation transcript to the specified email address",
"SUBMIT": "Submit",
"CANCEL": "Cancel",
"SEND_EMAIL_SUCCESS": "The chat transcript was sent successfully",
"SEND_EMAIL_ERROR": "There was an error, please try again",
"SEND_EMAIL_PAYMENT_REQUIRED": "Email transcript is not available on your current plan. Please upgrade to use this feature.",
"FORM": {
"SEND_TO_CONTACT": "গ্রাহককে ট্রান্সক্রিপ্ট পাঠান",
"SEND_TO_AGENT": "নিয়োজিত এজেন্টকে ট্রান্সক্রিপ্ট পাঠান",
"SEND_TO_OTHER_EMAIL_ADDRESS": "অন্য ইমেইল ঠিকানায় ট্রান্সক্রিপ্ট পাঠান",
"SEND_TO_CONTACT": "Send the transcript to the customer",
"SEND_TO_AGENT": "Send the transcript to the assigned agent",
"SEND_TO_OTHER_EMAIL_ADDRESS": "Send the transcript to another email address",
"EMAIL": {
"PLACEHOLDER": "ইমেইল ঠিকানা লিখুন",
"ERROR": "একটি বৈধ ইমেইল ঠিকানা লিখুন"
"PLACEHOLDER": "Enter an email address",
"ERROR": "Please enter a valid email address"
}
}
},
@@ -323,120 +323,120 @@
"GREETING_MORNING": "👋 Good morning, {name}. Welcome to {installationName}.",
"GREETING_AFTERNOON": "👋 Good afternoon, {name}. Welcome to {installationName}.",
"GREETING_EVENING": "👋 Good evening, {name}. Welcome to {installationName}.",
"READ_LATEST_UPDATES": "আমাদের সর্বশেষ আপডেট পড়ুন",
"READ_LATEST_UPDATES": "Read our latest updates",
"ALL_CONVERSATION": {
"TITLE": "আপনার সব কথোপকথন এক জায়গায়",
"DESCRIPTION": "একটি ড্যাশবোর্ডে আপনার গ্রাহকদের সব কথোপকথন দেখুন। আপনি চ্যানেল, লেবেল ও স্ট্যাটাস অনুযায়ী ফিল্টার করতে পারবেন।",
"NEW_LINK": "ইনবক্স তৈরি করতে এখানে ক্লিক করুন"
"TITLE": "All your conversations in one place",
"DESCRIPTION": "View all the conversations from your customers in one single dashboard. You can filter the conversations by the incoming channel, label and status.",
"NEW_LINK": "Click here to create an inbox"
},
"TEAM_MEMBERS": {
"TITLE": "আপনার টিম সদস্যদের আমন্ত্রণ জানান",
"DESCRIPTION": "আপনি যখন গ্রাহকের সাথে কথা বলার জন্য প্রস্তুতি নিচ্ছেন, তখন সহায়তার জন্য আপনার টিমমেটদের যুক্ত করুন। এজেন্ট তালিকায় তাদের ইমেইল ঠিকানা যোগ করে আমন্ত্রণ জানাতে পারেন।",
"NEW_LINK": "টিম সদস্য আমন্ত্রণ জানাতে এখানে ক্লিক করুন"
"TITLE": "Invite your team members",
"DESCRIPTION": "Since you are getting ready to talk to your customer, bring in your teammates to assist you. You can invite your teammates by adding their email addresses to the agent list.",
"NEW_LINK": "Click here to invite a team member"
},
"LABELS": {
"TITLE": "লেবেল দিয়ে কথোপকথন সাজান",
"DESCRIPTION": "লেবেল ব্যবহার করে সহজেই কথোপকথন শ্রেণিবদ্ধ করুন। যেমন #support-enquiry, #billing-question ইত্যাদি লেবেল তৈরি করুন, পরে কথোপকথনে ব্যবহার করতে পারবেন।",
"NEW_LINK": "ট্যাগ তৈরি করতে এখানে ক্লিক করুন"
"TITLE": "Organize conversations with labels",
"DESCRIPTION": "Labels provide an easier way to categorize your conversation. Create some labels like #support-enquiry, #billing-question etc., so that you can use them in a conversation later.",
"NEW_LINK": "Click here to create tags"
},
"CANNED_RESPONSES": {
"TITLE": "ক্যানড রেসপন্স তৈরি করুন",
"DESCRIPTION": "আগে থেকে লেখা দ্রুত উত্তর টেমপ্লেট দিয়ে সহজেই কথোপকথনে উত্তর দিন। এজেন্টরা '/' চিহ্ন ও শর্টকোড লিখে দ্রুত উত্তর যোগ করতে পারেন।",
"NEW_LINK": "ক্যানড রেসপন্স তৈরি করতে এখানে ক্লিক করুন"
"TITLE": "Create canned responses",
"DESCRIPTION": "Pre-written quick reply templates help you quickly respond to a conversation. Agents can type the '/' character followed by the shortcode to insert a response.",
"NEW_LINK": "Click here to create a canned response"
}
},
"CONVERSATION_SIDEBAR": {
"ASSIGNEE_LABEL": "নিযুক্ত এজেন্ট",
"SELF_ASSIGN": "নিজেকে নির্ধারণ করুন",
"TEAM_LABEL": "নিযুক্ত টিম",
"ASSIGNEE_LABEL": "Assigned Agent",
"SELF_ASSIGN": "Assign to me",
"TEAM_LABEL": "Assigned Team",
"SELECT": {
"PLACEHOLDER": "কিছুই না"
"PLACEHOLDER": "None"
},
"ACCORDION": {
"CONTACT_DETAILS": "যোগাযোগের বিবরণ",
"CONVERSATION_ACTIONS": "আলোচনার কার্যক্রম",
"CONVERSATION_LABELS": "আলোচনার লেবেল",
"CONVERSATION_INFO": "আলোচনার তথ্য",
"CONTACT_NOTES": "যোগাযোগ নোট",
"CONTACT_ATTRIBUTES": "যোগাযোগের বৈশিষ্ট্য",
"PREVIOUS_CONVERSATION": "পূর্বের আলোচনা",
"MACROS": "ম্যাক্রো",
"LINEAR_ISSUES": "সংযুক্ত Linear সমস্যা",
"SHOPIFY_ORDERS": "Shopify অর্ডার"
"CONTACT_DETAILS": "Contact Details",
"CONVERSATION_ACTIONS": "Conversation Actions",
"CONVERSATION_LABELS": "Conversation Labels",
"CONVERSATION_INFO": "Conversation Information",
"CONTACT_NOTES": "Contact Notes",
"CONTACT_ATTRIBUTES": "Contact Attributes",
"PREVIOUS_CONVERSATION": "Previous Conversations",
"MACROS": "Macros",
"LINEAR_ISSUES": "Linked Linear Issues",
"SHOPIFY_ORDERS": "Shopify Orders"
},
"SHOPIFY": {
"ORDER_ID": "Order #{id}",
"ERROR": "অর্ডার লোড করতে সমস্যা হয়েছে",
"NO_SHOPIFY_ORDERS": "কোনো অর্ডার পাওয়া যায়নি",
"ERROR": "Error loading orders",
"NO_SHOPIFY_ORDERS": "No orders found",
"FINANCIAL_STATUS": {
"PENDING": "অপেক্ষমাণ",
"AUTHORIZED": "অনুমোদিত",
"PARTIALLY_PAID": "আংশিক পরিশোধিত",
"PAID": "পরিশোধিত",
"PARTIALLY_REFUNDED": "আংশিক ফেরত",
"REFUNDED": "ফেরত",
"VOIDED": "বাতিল"
"PENDING": "Pending",
"AUTHORIZED": "Authorized",
"PARTIALLY_PAID": "Partially Paid",
"PAID": "Paid",
"PARTIALLY_REFUNDED": "Partially Refunded",
"REFUNDED": "Refunded",
"VOIDED": "Voided"
},
"FULFILLMENT_STATUS": {
"FULFILLED": "সম্পন্ন",
"PARTIALLY_FULFILLED": "আংশিক সম্পন্ন",
"UNFULFILLED": "অসম্পন্ন"
"FULFILLED": "Fulfilled",
"PARTIALLY_FULFILLED": "Partially Fulfilled",
"UNFULFILLED": "Unfulfilled"
}
}
},
"CONVERSATION_CUSTOM_ATTRIBUTES": {
"ADD_BUTTON_TEXT": "অ্যাট্রিবিউট তৈরি করুন",
"NO_RECORDS_FOUND": "কোনো অ্যাট্রিবিউট পাওয়া যায়নি",
"ADD_BUTTON_TEXT": "Create attribute",
"NO_RECORDS_FOUND": "No attributes found",
"UPDATE": {
"SUCCESS": "অ্যাট্রিবিউট সফলভাবে আপডেট হয়েছে",
"ERROR": "অ্যাট্রিবিউট আপডেট করা যায়নি। পরে আবার চেষ্টা করুন"
"SUCCESS": "Attribute updated successfully",
"ERROR": "Unable to update attribute. Please try again later"
},
"ADD": {
"TITLE": "যোগ করুন",
"SUCCESS": "অ্যাট্রিবিউট সফলভাবে যোগ হয়েছে",
"ERROR": "অ্যাট্রিবিউট যোগ করা যায়নি। পরে আবার চেষ্টা করুন"
"TITLE": "Add",
"SUCCESS": "Attribute added successfully",
"ERROR": "Unable to add attribute. Please try again later"
},
"DELETE": {
"SUCCESS": "অ্যাট্রিবিউট সফলভাবে মুছে ফেলা হয়েছে",
"ERROR": "অ্যাট্রিবিউট মুছে ফেলা যায়নি। পরে আবার চেষ্টা করুন"
"SUCCESS": "Attribute deleted successfully",
"ERROR": "Unable to delete attribute. Please try again later"
},
"ATTRIBUTE_SELECT": {
"TITLE": "অ্যাট্রিবিউট যোগ করুন",
"PLACEHOLDER": "অ্যাট্রিবিউট অনুসন্ধান করুন",
"NO_RESULT": "কোনো অ্যাট্রিবিউট পাওয়া যায়নি"
"TITLE": "Add attributes",
"PLACEHOLDER": "Search attributes",
"NO_RESULT": "No attributes found"
}
},
"EMAIL_HEADER": {
"FROM": "প্রেরক",
"TO": "প্রাপক",
"BCC": "বিসিসি",
"CC": "সিসি",
"SUBJECT": "বিষয়",
"EXPAND": "ইমেইল প্রসারিত করুন"
"FROM": "From",
"TO": "To",
"BCC": "Bcc",
"CC": "Cc",
"SUBJECT": "Subject",
"EXPAND": "Expand email"
},
"CONVERSATION_PARTICIPANTS": {
"SIDEBAR_MENU_TITLE": "অংশগ্রহণকারী",
"SIDEBAR_TITLE": "আলোচনার অংশগ্রহণকারীরা",
"NO_RECORDS_FOUND": "কোনো ফলাফল পাওয়া যায়নি",
"ADD_PARTICIPANTS": "অংশগ্রহণকারী নির্বাচন করুন",
"SIDEBAR_MENU_TITLE": "Participating",
"SIDEBAR_TITLE": "Conversation participants",
"NO_RECORDS_FOUND": "No results found",
"ADD_PARTICIPANTS": "Select participants",
"REMANING_PARTICIPANTS_TEXT": "+{count} others",
"REMANING_PARTICIPANT_TEXT": "+{count} other",
"TOTAL_PARTICIPANTS_TEXT": "{count} people are participating.",
"TOTAL_PARTICIPANT_TEXT": "{count} person is participating.",
"NO_PARTICIPANTS_TEXT": "No one is participating!.",
"WATCH_CONVERSATION": "আলাপচারিতায় যোগ দিন",
"YOU_ARE_WATCHING": "আপনি অংশগ্রহণ করছেন",
"WATCH_CONVERSATION": "Join conversation",
"YOU_ARE_WATCHING": "You are participating",
"API": {
"ERROR_MESSAGE": "আপডেট করা যায়নি, আবার চেষ্টা করুন!",
"SUCCESS_MESSAGE": "অংশগ্রহণকারীরা আপডেট হয়েছে!"
"ERROR_MESSAGE": "Could not update, try again!",
"SUCCESS_MESSAGE": "Participants updated!"
}
},
"TRANSLATE_MODAL": {
"TITLE": "অনুবাদিত বিষয়বস্তু দেখুন",
"TITLE": "View translated content",
"DESC": "You can view the translated content in each langauge.",
"ORIGINAL_CONTENT": "মূল বিষয়বস্তু",
"TRANSLATED_CONTENT": "অনুবাদিত বিষয়বস্তু",
"NO_TRANSLATIONS_AVAILABLE": "এই বিষয়বস্তুর জন্য কোনো অনুবাদ নেই"
"ORIGINAL_CONTENT": "Original Content",
"TRANSLATED_CONTENT": "Translated Content",
"NO_TRANSLATIONS_AVAILABLE": "No translations are available for this content"
},
"TYPING": {
"ONE": "{user} is typing",
@@ -444,9 +444,9 @@
"MULTIPLE": "{user} and {count} others are typing"
},
"COPILOT": {
"TRY_THESE_PROMPTS": "এই পরামর্শগুলো চেষ্টা করুন"
"TRY_THESE_PROMPTS": "Try these prompts"
},
"GALLERY_VIEW": {
"ERROR_DOWNLOADING": "সংযুক্তি ডাউনলোড করা যাচ্ছে না। আবার চেষ্টা করুন"
"ERROR_DOWNLOADING": "Unable to download attachment. Please try again"
}
}
@@ -316,18 +316,6 @@
"SUCCESS_MESSAGE": "লোকেল সফলভাবে পোর্টাল থেকে সরানো হয়েছে",
"ERROR_MESSAGE": "লোকেল পোর্টাল থেকে সরানো যায়নি। আবার চেষ্টা করুন।."
}
},
"DRAFT_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale moved to draft successfully",
"ERROR_MESSAGE": "Unable to move locale to draft. Try again."
}
},
"PUBLISH_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale published successfully",
"ERROR_MESSAGE": "Unable to publish locale. Try again."
}
}
},
"TABLE": {
@@ -656,11 +644,8 @@
"ARTICLES_COUNT": "{count} নিবন্ধ | {count} নিবন্ধসমূহ",
"CATEGORIES_COUNT": "{count} বিভাগ | {count} বিভাগসমূহ",
"DEFAULT": "ডিফল্ট",
"DRAFT": "খসড়া",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "ডিফল্ট করুন",
"MOVE_TO_DRAFT": "Move to draft",
"PUBLISH_LOCALE": "Publish locale",
"DELETE": "মুছে ফেলুন"
}
},
@@ -670,13 +655,6 @@
"COMBOBOX": {
"PLACEHOLDER": "লোকেল নির্বাচন করুন..."
},
"STATUS": {
"LABEL": "অবস্থা",
"OPTIONS": {
"LIVE": "প্রকাশিত",
"DRAFT": "খসড়া"
}
},
"API": {
"SUCCESS_MESSAGE": "লোকেল সফলভাবে যোগ করা হয়েছে",
"ERROR_MESSAGE": "লোকেল যোগ করা যায়নি. আবার চেষ্টা করুন."
@@ -126,7 +126,7 @@
},
"HELP_TEXT": {
"TITLE": "Slack ইন্টিগ্রেশন কীভাবে ব্যবহার করবেন?",
"BODY": "এই ইন্টিগ্রেশনের মাধ্যমে, আপনার সমস্ত ইনকামিং কথোপকথন আপনার Slack ওয়ার্কস্পেসের ***{selectedChannelName}*** চ্যানেলে সিঙ্ক হবে। আপনি এই চ্যানেল থেকেই আপনার গ্রাহকদের সব কথোপকথন পরিচালনা করতে পারবেন এবং কোনো মেসেজ মিস করবেন না।\n\nএই ইন্টিগ্রেশনের প্রধান বৈশিষ্ট্যগুলো:\n\n**Slack থেকেই কথোপকথনে উত্তর দিন:** ***{selectedChannelName}*** Slack চ্যানেলে কোনো কথোপকথনে উত্তর দিতে, শুধু আপনার মেসেজ লিখে থ্রেড হিসেবে পাঠান। এতে Chatwoot-এর মাধ্যমে গ্রাহককে উত্তর পাঠানো হবে। এটি খুব সহজ!\n\n**প্রাইভেট নোট তৈরি করুন:** উত্তর না দিয়ে যদি প্রাইভেট নোট যোগ করতে চান, তাহলে আপনার মেসেজটি ***`note:`*** দিয়ে শুরু করুন। এতে আপনার মেসেজটি প্রাইভেট থাকবে এবং গ্রাহক দেখতে পারবে না।\n\n**এজেন্ট প্রোফাইল যুক্ত করুন:** Slack-এ উত্তরদাতা যদি একই ইমেইলে Chatwoot-এ এজেন্ট প্রোফাইল থাকে, তাহলে উত্তরগুলো স্বয়ংক্রিয়ভাবে সেই এজেন্ট প্রোফাইলের সাথে যুক্ত হবে। এতে সহজেই জানা যাবে কে কখন কী বলেছেন। অন্যদিকে, যদি উত্তরদাতার কোনো এজেন্ট প্রোফাইল না থাকে, তাহলে উত্তরগুলো গ্রাহকের কাছে বট প্রোফাইল থেকে যাবে।.",
"BODY": "With this integration, all of your incoming conversations will be synced to the ***{selectedChannelName}*** channel in your Slack workspace. You can manage all your customer conversations right within the channel and never miss a message.\n\nHere are the main features of the integration:\n\n**Respond to conversations from within Slack:** To respond to a conversation in the ***{selectedChannelName}*** Slack channel, simply type out your message and send it as a thread. This will create a response back to the customer through Chatwoot. It's that simple!\n\n **Create private notes:** If you want to create private notes instead of replies, start your message with ***`note:`***. This ensures that your message is kept private and won't be visible to the customer.\n\n**Associate an agent profile:** If the person who replied on Slack has an agent profile in Chatwoot under the same email, the replies will be associated with that agent profile automatically. This means you can easily track who said what and when. On the other hand, when the replier doesn't have an associated agent profile, the replies will appear from the bot profile to the customer.",
"SELECTED": "নির্বাচিত"
},
"SELECT_CHANNEL": {
@@ -738,17 +738,6 @@
"DOCUMENTS": {
"HEADER": "নথিপত্র",
"ADD_NEW": "নতুন নথি তৈরি করুন",
"SELECTED": "{count} নির্বাচিত",
"SELECT_ALL": "সব নির্বাচন করুন ({count})",
"UNSELECT_ALL": "সব নির্বাচন বাতিল করুন ({count})",
"BULK_DELETE_BUTTON": "মুছে ফেলুন",
"BULK_DELETE": {
"TITLE": "Delete documents?",
"DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
"CONFIRM": "হ্যাঁ, সব মুছে ফেলুন",
"SUCCESS_MESSAGE": "Documents deleted successfully",
"ERROR_MESSAGE": "There was an error deleting the documents, please try again."
},
"RELATED_RESPONSES": {
"TITLE": "সম্পর্কিত FAQ",
"DESCRIPTION": "এই FAQ গুলো সরাসরি ডকুমেন্ট থেকে তৈরি হয়েছে।"
@@ -806,7 +795,6 @@
"CUSTOM_TOOLS": {
"HEADER": "টুলস",
"ADD_NEW": "নতুন টুল তৈরি করুন",
"SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "কোনো কাস্টম টুল নেই",
"SUBTITLE": "আপনার অ্যাসিস্ট্যান্টকে বাহ্যিক API ও সার্ভিসের সাথে সংযুক্ত করতে কাস্টম টুল তৈরি করুন, যাতে এটি আপনার পক্ষ থেকে ডেটা সংগ্রহ ও বিভিন্ন কাজ করতে পারে।.",
@@ -837,18 +825,11 @@
"SUCCESS_MESSAGE": "কাস্টম টুল সফলভাবে মুছে ফেলা হয়েছে",
"ERROR_MESSAGE": "কাস্টম টুল মুছে ফেলা যায়নি"
},
"TEST": {
"BUTTON": "Test connection",
"SUCCESS": "Endpoint returned HTTP {status}",
"ERROR": "Connection failed",
"DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
},
"FORM": {
"TITLE": {
"LABEL": "টুলের নাম",
"PLACEHOLDER": "অর্ডার অনুসন্ধান",
"ERROR": "টুলের নাম আবশ্যক",
"MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
"ERROR": "টুলের নাম আবশ্যক"
},
"DESCRIPTION": {
"LABEL": "বর্ণনা",
File diff suppressed because it is too large Load Diff
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "La signatura del missatge no està configurada, configura-la a la configuració del perfil.",
"COPILOT_MSG_INPUT": "Dóna instruccions addicionals a copilot o pregunta qualsevol altra cosa... Prem enter per enviar un seguiment",
"COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
"CLICK_HERE": "Fes clic aquí per actualitzar",
"WHATSAPP_TEMPLATES": "Plantilles de Whatsapp"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Arrossega i deixa anar aquí per adjuntar-lo",
"START_AUDIO_RECORDING": "Inicia la gravació d'àudio",
"STOP_AUDIO_RECORDING": "Atura la gravació d'àudio",
"COPILOT_THINKING": "Copilot està pensant",
"COPILOT_THINKING": "Copilot is thinking",
"EMAIL_HEAD": {
"TO": "A",
"ADD_BCC": "Afegeix cco",
@@ -316,18 +316,6 @@
"SUCCESS_MESSAGE": "La localització s'ha eliminat del portal correctament",
"ERROR_MESSAGE": "No es pot eliminar la localització del portal. Torna-ho a provar."
}
},
"DRAFT_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale moved to draft successfully",
"ERROR_MESSAGE": "Unable to move locale to draft. Try again."
}
},
"PUBLISH_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale published successfully",
"ERROR_MESSAGE": "Unable to publish locale. Try again."
}
}
},
"TABLE": {
@@ -656,11 +644,8 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Per defecte",
"DRAFT": "Esborrany",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
"MOVE_TO_DRAFT": "Move to draft",
"PUBLISH_LOCALE": "Publish locale",
"DELETE": "Esborrar"
}
},
@@ -670,13 +655,6 @@
"COMBOBOX": {
"PLACEHOLDER": "Selecciona localització..."
},
"STATUS": {
"LABEL": "Estat",
"OPTIONS": {
"LIVE": "Publicat",
"DRAFT": "Esborrany"
}
},
"API": {
"SUCCESS_MESSAGE": "La localització s'ha afegit correctament",
"ERROR_MESSAGE": "No es pot afegir la localització. Torna-ho a provar."
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Captain",
"HEADER_KNOW_MORE": "Saber més",
"HEADER_KNOW_MORE": "Know more",
"ASSISTANT_SWITCHER": {
"ASSISTANTS": "Assistents",
"SWITCH_ASSISTANT": "Canvia entre assistents",
"NEW_ASSISTANT": "Crea un assistent",
"EMPTY_LIST": "No s'ha trobat cap assistent, si us plau crea'n un per començar"
"ASSISTANTS": "Assistants",
"SWITCH_ASSISTANT": "Switch between assistants",
"NEW_ASSISTANT": "Create Assistant",
"EMPTY_LIST": "No assistants found, please create one to get started"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
"PANEL_TITLE": "Comença amb Copilot",
"KICK_OFF_MESSAGE": "Necessites un resum ràpid, vols revisar converses anteriors o redactar una resposta millor? Copilot és aquí per accelerar-ho.",
"PANEL_TITLE": "Get started with Copilot",
"KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
"SEND_MESSAGE": "Envia missatge...",
"EMPTY_MESSAGE": "Hi ha hagut un error generant la resposta. Torna-ho a provar.",
"LOADER": "Captain està pensant",
"EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
"LOADER": "Captain is thinking",
"YOU": "Tu",
"USE": "Utilitza això",
"RESET": "Reinicia",
"SHOW_STEPS": "Mostra passos",
"SELECT_ASSISTANT": "Selecciona Assistente",
"USE": "Use this",
"RESET": "Reset",
"SHOW_STEPS": "Show steps",
"SELECT_ASSISTANT": "Select Assistant",
"PROMPTS": {
"SUMMARIZE": {
"LABEL": "Resumeix aquesta conversa",
"CONTENT": "Resumeix els punts claus que s'han discutit entre el client i l'agent de suport, incloent les preocupacions, preguntes del client i les solucions o respostes aportades per l'agent."
"LABEL": "Summarize this conversation",
"CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
},
"SUGGEST": {
"LABEL": "Suggerir una resposta",
"CONTENT": "Analitza la consulta del client i redacta una resposta que atiqui eficaçment les seves preocupacions o preguntes. Assegura que la resposta sigui clara, concisa i ofereixi informació útil."
"LABEL": "Suggest an answer",
"CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
},
"RATE": {
"LABEL": "Valora aquesta conversa",
"CONTENT": "Revisa la conversa per veure com de bé s'adapta a les necessitats del client. Comparteix una valoració de 5 punts basada en to, claredat i efectivitat."
"LABEL": "Rate this conversation",
"CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
},
"HIGH_PRIORITY": {
"LABEL": "Converses d'alta prioritat",
"CONTENT": "Dóna'm un resum de totes les converses obertes d'alta prioritat. Inclou la ID de la conversa, nom del client (si està disponible), contingut de l'últim missatge i agent assignat. Agrupa per estat si és rellevant."
"LABEL": "High priority conversations",
"CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
},
"LIST_CONTACTS": {
"LABEL": "Llista de contactes",
"CONTENT": "Mostra'm la llista dels 10 contactes principals. Inclou nom, correu electrònic o telèfon (si està disponible), última vegada que es va veure, etiquetes (si n'hi ha)."
"LABEL": "List contacts",
"CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
}
}
},
"PLAYGROUND": {
"USER": "Tu",
"ASSISTANT": "Assistent",
"ASSISTANT": "Assistant",
"MESSAGE_PLACEHOLDER": "Escriu el missatge...",
"HEADER": "Zona de proves",
"DESCRIPTION": "Utilitza aquest espai de proves per enviar missatges al teu assistent i comprovar si respon de manera precisa, ràpida i amb el to que esperes.",
"CREDIT_NOTE": "Els missatges enviats aquí comptaran per als teus crèdits de Captain."
"HEADER": "Playground",
"DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
"CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
},
"PAYWALL": {
"TITLE": "Actualitza per usar Captain AI",
"AVAILABLE_ON": "Captain no està disponible en el pla gratuït.",
"UPGRADE_PROMPT": "Actualitza el teu pla per accedir als nostres assistents, copilot i més.",
"TITLE": "Upgrade to use Captain AI",
"AVAILABLE_ON": "Captain is not available on the free plan.",
"UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
"UPGRADE_NOW": "Actualitza ara",
"CANCEL_ANYTIME": "Pots canviar o cancel·lar el teu pla en qualsevol moment"
},
"ENTERPRISE_PAYWALL": {
"AVAILABLE_ON": "Captain AI només està disponible en els plans Enterprise.",
"UPGRADE_PROMPT": "Actualitza el teu pla per accedir als nostres assistents, copilot i més.",
"AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
"UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
"ASK_ADMIN": "Posa't en contacte amb el vostre administrador per obtenir l'actualització."
},
"BANNER": {
"RESPONSES": "Has utilitzat més del 80% del teu límit de respostes. Per continuar utilitzant Captain AI, si us plau actualitza.",
"DOCUMENTS": "S'ha arribat al límit de documents. Actualitza per continuar utilitzant Captain AI."
"RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
"DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
},
"FORM": {
"CANCEL": "Cancel·la",
@@ -738,17 +738,6 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
"SELECTED": "{count} selected",
"SELECT_ALL": "Select all ({count})",
"UNSELECT_ALL": "Unselect all ({count})",
"BULK_DELETE_BUTTON": "Esborrar",
"BULK_DELETE": {
"TITLE": "Delete documents?",
"DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
"CONFIRM": "Yes, delete all",
"SUCCESS_MESSAGE": "Documents deleted successfully",
"ERROR_MESSAGE": "There was an error deleting the documents, please try again."
},
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -806,7 +795,6 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
"SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -837,18 +825,11 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
"TEST": {
"BUTTON": "Test connection",
"SUCCESS": "Endpoint returned HTTP {status}",
"ERROR": "Connection failed",
"DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
},
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
"ERROR": "Tool name is required",
"MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
"ERROR": "Tool name is required"
},
"DESCRIPTION": {
"LABEL": "Descripció",
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Podpis zprávy není nakonfigurován, prosím nakonfigurujte jej v nastavení profilu.",
"COPILOT_MSG_INPUT": "Dejte copilotu další podněty nebo se zeptejte na cokoliv dalšího... Stiskněte Enter pro odeslání pokračování",
"COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
"CLICK_HERE": "Klikněte zde pro aktualizaci",
"WHATSAPP_TEMPLATES": "Whatsapp Templates"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Přetažením sem připojíte",
"START_AUDIO_RECORDING": "Spustit nahrávání zvuku",
"STOP_AUDIO_RECORDING": "Zastavit nahrávání zvuku",
"COPILOT_THINKING": "Copilot přemýšlí",
"COPILOT_THINKING": "Copilot is thinking",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Přidat bcc",
@@ -316,18 +316,6 @@
"SUCCESS_MESSAGE": "Locale removed from portal successfully",
"ERROR_MESSAGE": "Unable to remove locale from portal. Try again."
}
},
"DRAFT_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale moved to draft successfully",
"ERROR_MESSAGE": "Unable to move locale to draft. Try again."
}
},
"PUBLISH_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale published successfully",
"ERROR_MESSAGE": "Unable to publish locale. Try again."
}
}
},
"TABLE": {
@@ -656,11 +644,8 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Default",
"DRAFT": "Koncept",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
"MOVE_TO_DRAFT": "Move to draft",
"PUBLISH_LOCALE": "Publish locale",
"DELETE": "Vymazat"
}
},
@@ -670,13 +655,6 @@
"COMBOBOX": {
"PLACEHOLDER": "Select locale..."
},
"STATUS": {
"LABEL": "Stav",
"OPTIONS": {
"LIVE": "Publikované",
"DRAFT": "Koncept"
}
},
"API": {
"SUCCESS_MESSAGE": "Locale added successfully",
"ERROR_MESSAGE": "Unable to add locale. Try again."
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Captain",
"HEADER_KNOW_MORE": "Zjistit více",
"HEADER_KNOW_MORE": "Know more",
"ASSISTANT_SWITCHER": {
"ASSISTANTS": "Asistenti",
"SWITCH_ASSISTANT": "Přepínání mezi asistenty",
"NEW_ASSISTANT": "Vytvořit asistenta",
"EMPTY_LIST": "Nebyli nalezeni žádní asistenti, prosím vytvořte si jednoho pro začátek"
"ASSISTANTS": "Assistants",
"SWITCH_ASSISTANT": "Switch between assistants",
"NEW_ASSISTANT": "Create Assistant",
"EMPTY_LIST": "No assistants found, please create one to get started"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
"PANEL_TITLE": "Začněte s Copilotem",
"KICK_OFF_MESSAGE": "Potřebujete rychlý přehled, chcete zkontrolovat předchozí rozhovory, nebo vytvořit lepší odpověď? Copilot je tu, aby to zrychlil.",
"PANEL_TITLE": "Get started with Copilot",
"KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
"SEND_MESSAGE": "Send message...",
"EMPTY_MESSAGE": "Při generování odpovědi došlo k chybě. Zkuste to prosím znovu.",
"LOADER": "Captain přemýšlí",
"EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
"LOADER": "Captain is thinking",
"YOU": "Vy",
"USE": "Použít toto",
"RESET": "Resetovat",
"SHOW_STEPS": "Zobrazit kroky",
"SELECT_ASSISTANT": "Vybrat asistenta",
"USE": "Use this",
"RESET": "Reset",
"SHOW_STEPS": "Show steps",
"SELECT_ASSISTANT": "Select Assistant",
"PROMPTS": {
"SUMMARIZE": {
"LABEL": "Shrň tuto konverzaci",
"CONTENT": "Shrň klíčové body diskutované mezi zákazníkem a podpůrným agentem, včetně obav zákazníka, otázek a řešení nebo odpovědí poskytnutých agentem podpory"
"LABEL": "Summarize this conversation",
"CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
},
"SUGGEST": {
"LABEL": "Navrhni odpověď",
"CONTENT": "Analyzuj dotaz zákazníka a vytvoř odpověď, která efektivně řeší jeho obavy nebo otázky. Zajisti, aby byla odpověď jasná, stručná a poskytovala užitečné informace."
"LABEL": "Suggest an answer",
"CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
},
"RATE": {
"LABEL": "Ohodnoť tuto konverzaci",
"CONTENT": "Prohlédni konverzaci a zhodnoť, jak dobře odpovídá potřebám zákazníka. Sdílej hodnocení od 1 do 5 na základě tónu, srozumitelnosti a efektivity."
"LABEL": "Rate this conversation",
"CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
},
"HIGH_PRIORITY": {
"LABEL": "Konverzace s vysokou prioritou",
"CONTENT": "Dej mi shrnutí všech otevřených konverzací s vysokou prioritou. Uveď ID konverzace, jméno zákazníka (pokud je k dispozici), obsah poslední zprávy a přiděleného agenta. Pokud je relevantní, seskup je podle stavu."
"LABEL": "High priority conversations",
"CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
},
"LIST_CONTACTS": {
"LABEL": "Seznam kontaktů",
"CONTENT": "Ukázat seznam 10 nejlepších kontaktů. Uveď jméno, email nebo telefonní číslo (pokud je k dispozici), čas posledního přístupu, štítky (pokud jsou)."
"LABEL": "List contacts",
"CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
}
}
},
"PLAYGROUND": {
"USER": "Vy",
"ASSISTANT": "Asistent",
"ASSISTANT": "Assistant",
"MESSAGE_PLACEHOLDER": "Zde začněte psát...",
"HEADER": "Hřiště",
"DESCRIPTION": "Použijte toto hřiště pro odesílání zpráv vašemu asistentovi a ověřte, zda odpovídá přesně, rychle a v očekávaném tónu.",
"CREDIT_NOTE": "Zprávy odeslané zde se budou počítat do vašich kreditů Captain."
"HEADER": "Playground",
"DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
"CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
},
"PAYWALL": {
"TITLE": "Upgradujte pro používání Captain AI",
"AVAILABLE_ON": "Captain není dostupný v bezplatném plánu.",
"UPGRADE_PROMPT": "Upgradujte svůj plán, abyste získali přístup k našim asistentům, copilotu a dalším funkcím.",
"TITLE": "Upgrade to use Captain AI",
"AVAILABLE_ON": "Captain is not available on the free plan.",
"UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
"AVAILABLE_ON": "Captain AI je dostupný pouze v podnicích plánech.",
"UPGRADE_PROMPT": "Upgradujte svůj plán, abyste získali přístup k našim asistentům, copilotu a dalším funkcím.",
"AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
"UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"BANNER": {
"RESPONSES": "Vyčerpali jste více než 80 % svého limitu odpovědí. Pro pokračování v používání Captain AI upgradujte.",
"DOCUMENTS": "Limit dokumentů byl dosažen. Pro pokračování v používání Captain AI upgradujte."
"RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
"DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
},
"FORM": {
"CANCEL": "Zrušit",
@@ -738,17 +738,6 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
"SELECTED": "{count} selected",
"SELECT_ALL": "Select all ({count})",
"UNSELECT_ALL": "Unselect all ({count})",
"BULK_DELETE_BUTTON": "Vymazat",
"BULK_DELETE": {
"TITLE": "Delete documents?",
"DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
"CONFIRM": "Yes, delete all",
"SUCCESS_MESSAGE": "Documents deleted successfully",
"ERROR_MESSAGE": "There was an error deleting the documents, please try again."
},
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -806,7 +795,6 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
"SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -837,18 +825,11 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
"TEST": {
"BUTTON": "Test connection",
"SUCCESS": "Endpoint returned HTTP {status}",
"ERROR": "Connection failed",
"DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
},
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
"ERROR": "Tool name is required",
"MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
"ERROR": "Tool name is required"
},
"DESCRIPTION": {
"LABEL": "Description",
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Beskedsignatur er ikke konfigureret, konfigurer den i profilindstillinger.",
"COPILOT_MSG_INPUT": "Giv copilot yderligere prompts, eller spørg om noget andet... Tryk enter for at sende opfølgning",
"COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
"CLICK_HERE": "Klik her for at opdatere",
"WHATSAPP_TEMPLATES": "Whatsapp Skabeloner"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Træk og slip her for at vedhæfte",
"START_AUDIO_RECORDING": "Start lydoptagelse",
"STOP_AUDIO_RECORDING": "Stop lydoptagelse",
"COPILOT_THINKING": "Copilot tænker",
"COPILOT_THINKING": "Copilot is thinking",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Tilføj bcc",
@@ -316,18 +316,6 @@
"SUCCESS_MESSAGE": "Landestandard fjernet fra portal",
"ERROR_MESSAGE": "Kan ikke fjerne landestandard fra portalen. Prøv igen."
}
},
"DRAFT_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale moved to draft successfully",
"ERROR_MESSAGE": "Unable to move locale to draft. Try again."
}
},
"PUBLISH_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale published successfully",
"ERROR_MESSAGE": "Unable to publish locale. Try again."
}
}
},
"TABLE": {
@@ -656,11 +644,8 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Standard",
"DRAFT": "Kladde",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
"MOVE_TO_DRAFT": "Move to draft",
"PUBLISH_LOCALE": "Publish locale",
"DELETE": "Slet"
}
},
@@ -670,13 +655,6 @@
"COMBOBOX": {
"PLACEHOLDER": "Select locale..."
},
"STATUS": {
"LABEL": "Status",
"OPTIONS": {
"LIVE": "Publiceret",
"DRAFT": "Kladde"
}
},
"API": {
"SUCCESS_MESSAGE": "Landestandard tilføjet",
"ERROR_MESSAGE": "Kan ikke tilføje locale. Prøv igen."
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Captain",
"HEADER_KNOW_MORE": "Få mere at vide",
"HEADER_KNOW_MORE": "Know more",
"ASSISTANT_SWITCHER": {
"ASSISTANTS": "Assistenter",
"SWITCH_ASSISTANT": "Skift mellem assistenter",
"NEW_ASSISTANT": "Opret assistent",
"EMPTY_LIST": "Ingen assistenter fundet, opret en for at komme i gang"
"ASSISTANTS": "Assistants",
"SWITCH_ASSISTANT": "Switch between assistants",
"NEW_ASSISTANT": "Create Assistant",
"EMPTY_LIST": "No assistants found, please create one to get started"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
"PANEL_TITLE": "Kom godt i gang med Copilot",
"KICK_OFF_MESSAGE": "Brug for et hurtigt sammendrag, vil du tjekke tidligere samtaler eller udarbejde et bedre svar? Copilot er her for at fremskynde processen.",
"PANEL_TITLE": "Get started with Copilot",
"KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
"SEND_MESSAGE": "Send besked...",
"EMPTY_MESSAGE": "Der opstod en fejl ved generering af svaret. Prøv igen.",
"LOADER": "Captain tænker",
"EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
"LOADER": "Captain is thinking",
"YOU": "Dig",
"USE": "Brug dette",
"RESET": "Nulstil",
"SHOW_STEPS": "Vis trin",
"SELECT_ASSISTANT": "Vælg assistent",
"USE": "Use this",
"RESET": "Reset",
"SHOW_STEPS": "Show steps",
"SELECT_ASSISTANT": "Select Assistant",
"PROMPTS": {
"SUMMARIZE": {
"LABEL": "Sammenfat denne samtale",
"CONTENT": "Sammenfat hovedpunkterne diskuteret mellem kunden og supportagenten, inklusive kundens bekymringer, spørgsmål og de løsninger eller svar, supportagenten har givet"
"LABEL": "Summarize this conversation",
"CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
},
"SUGGEST": {
"LABEL": "Foreslå et svar",
"CONTENT": "Analyser kundens forespørgsel, og udarbejd et svar, der effektivt imødekommer deres bekymringer eller spørgsmål. Sørg for, at svaret er klart, præcist og giver nyttige oplysninger."
"LABEL": "Suggest an answer",
"CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
},
"RATE": {
"LABEL": "Vurder denne samtale",
"CONTENT": "Gennemgå samtalen for at se, hvor godt den opfylder kundens behov. Del en vurdering ud af 5 baseret på tone, klarhed og effektivitet."
"LABEL": "Rate this conversation",
"CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
},
"HIGH_PRIORITY": {
"LABEL": "Samtaler med høj prioritet",
"CONTENT": "Giv mig et sammendrag af alle åbne samtaler med høj prioritet. Inkluder samtale-ID, kundens navn (hvis tilgængeligt), indholdet af sidste besked og tildelt agent. Grupper efter status, hvis relevant."
"LABEL": "High priority conversations",
"CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
},
"LIST_CONTACTS": {
"LABEL": "Liste over kontakter",
"CONTENT": "Vis mig listen over de 10 bedste kontakter. Inkluder navn, e-mail eller telefonnummer (hvis tilgængeligt), sidst set tidspunkt, tags (hvis nogen)."
"LABEL": "List contacts",
"CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
}
}
},
"PLAYGROUND": {
"USER": "Dig",
"ASSISTANT": "Assistent",
"ASSISTANT": "Assistant",
"MESSAGE_PLACEHOLDER": "Skriv din besked...",
"HEADER": "Legeplads",
"DESCRIPTION": "Brug denne legeplads til at sende beskeder til din assistent og tjekke, om den svarer korrekt, hurtigt og i den tone, du forventer.",
"CREDIT_NOTE": "Beskeder sendt her tæller mod dine Captain-kreditter."
"HEADER": "Playground",
"DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
"CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
},
"PAYWALL": {
"TITLE": "Opgrader for at bruge Captain AI",
"AVAILABLE_ON": "Captain er ikke tilgængelig på gratisplanen.",
"UPGRADE_PROMPT": "Opgrader din plan for at få adgang til vores assistenter, copilot og mere.",
"TITLE": "Upgrade to use Captain AI",
"AVAILABLE_ON": "Captain is not available on the free plan.",
"UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
"AVAILABLE_ON": "Captain AI er kun tilgængelig i Enterprise-planerne.",
"UPGRADE_PROMPT": "Opgrader din plan for at få adgang til vores assistenter, copilot og mere.",
"AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
"UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"BANNER": {
"RESPONSES": "Du har brugt over 80 % af din svargrænse. For at fortsætte med at bruge Captain AI skal du opgradere.",
"DOCUMENTS": "Dokumentgrænse nået. Opgrader for at fortsætte med at bruge Captain AI."
"RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
"DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
},
"FORM": {
"CANCEL": "Annuller",
@@ -738,17 +738,6 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
"SELECTED": "{count} selected",
"SELECT_ALL": "Select all ({count})",
"UNSELECT_ALL": "Unselect all ({count})",
"BULK_DELETE_BUTTON": "Slet",
"BULK_DELETE": {
"TITLE": "Delete documents?",
"DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
"CONFIRM": "Yes, delete all",
"SUCCESS_MESSAGE": "Documents deleted successfully",
"ERROR_MESSAGE": "There was an error deleting the documents, please try again."
},
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -806,7 +795,6 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
"SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -837,18 +825,11 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
"TEST": {
"BUTTON": "Test connection",
"SUCCESS": "Endpoint returned HTTP {status}",
"ERROR": "Connection failed",
"DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
},
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
"ERROR": "Tool name is required",
"MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
"ERROR": "Tool name is required"
},
"DESCRIPTION": {
"LABEL": "Beskrivelse",
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Die Nachrichtensignatur ist nicht konfiguriert, bitte konfigurieren Sie sie in den Profileinstellungen.",
"COPILOT_MSG_INPUT": "Geben Sie Copilot zusätzliche Aufforderungen oder fragen Sie etwas anderes ... Drücken Sie Enter, um eine Folgefrage zu senden",
"COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
"CLICK_HERE": "Klicken Sie hier, um zu aktualisieren",
"WHATSAPP_TEMPLATES": "WhatsApp-Vorlagen"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Zum Anhängen hierher ziehen und ablegen",
"START_AUDIO_RECORDING": "Audioaufzeichnung starten",
"STOP_AUDIO_RECORDING": "Audioaufzeichnung stoppen",
"COPILOT_THINKING": "Copilot denkt",
"COPILOT_THINKING": "Copilot is thinking",
"EMAIL_HEAD": {
"TO": "An",
"ADD_BCC": "BCC hinzufügen",
@@ -316,18 +316,6 @@
"SUCCESS_MESSAGE": "Sprache wurde erfolgreich aus dem Portal entfernt",
"ERROR_MESSAGE": "Sprache kann nicht aus dem Portal entfernt werden. Versuchen Sie es nochmal."
}
},
"DRAFT_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale moved to draft successfully",
"ERROR_MESSAGE": "Unable to move locale to draft. Try again."
}
},
"PUBLISH_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale published successfully",
"ERROR_MESSAGE": "Unable to publish locale. Try again."
}
}
},
"TABLE": {
@@ -656,11 +644,8 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Standard",
"DRAFT": "Entwürfe",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
"MOVE_TO_DRAFT": "Move to draft",
"PUBLISH_LOCALE": "Publish locale",
"DELETE": "Löschen"
}
},
@@ -670,13 +655,6 @@
"COMBOBOX": {
"PLACEHOLDER": "Sprache auswählen..."
},
"STATUS": {
"LABEL": "Status",
"OPTIONS": {
"LIVE": "Veröffentlicht",
"DRAFT": "Entwürfe"
}
},
"API": {
"SUCCESS_MESSAGE": "Sprache erfolgreich hinzugefügt",
"ERROR_MESSAGE": "Sprache kann nicht hinzugefügt werden. Versuchen Sie es nochmal."
@@ -390,71 +390,71 @@
},
"CAPTAIN": {
"NAME": "Kapitän",
"HEADER_KNOW_MORE": "Mehr erfahren",
"HEADER_KNOW_MORE": "Know more",
"ASSISTANT_SWITCHER": {
"ASSISTANTS": "Assistenten",
"SWITCH_ASSISTANT": "Zwischen Assistenten wechseln",
"NEW_ASSISTANT": "Assistent erstellen",
"EMPTY_LIST": "Keine Assistenten gefunden, bitte erstellen Sie einen, um zu beginnen"
"ASSISTANTS": "Assistants",
"SWITCH_ASSISTANT": "Switch between assistants",
"NEW_ASSISTANT": "Create Assistant",
"EMPTY_LIST": "No assistants found, please create one to get started"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Probiere diese Prompts",
"PANEL_TITLE": "Starten Sie mit Copilot",
"KICK_OFF_MESSAGE": "Brauchen Sie eine schnelle Zusammenfassung, möchten Sie vergangene Gespräche prüfen oder eine bessere Antwort entwerfen? Copilot hilft Ihnen, schneller voranzukommen.",
"PANEL_TITLE": "Get started with Copilot",
"KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
"SEND_MESSAGE": "Nachricht senden...",
"EMPTY_MESSAGE": "Beim Generieren der Antwort ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.",
"EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
"LOADER": "Captain denkt nach",
"YOU": "Sie",
"USE": "Verwenden",
"RESET": "Zurücksetzen",
"SHOW_STEPS": "Schritte anzeigen",
"SHOW_STEPS": "Show steps",
"SELECT_ASSISTANT": "Assistent auswählen",
"PROMPTS": {
"SUMMARIZE": {
"LABEL": "Dieses Gespräch zusammenfassen",
"CONTENT": "Fassen Sie die wichtigsten Punkte zusammen, die zwischen dem Kunden und dem Supportmitarbeiter besprochen wurden, einschließlich der Anliegen, Fragen des Kunden sowie der vom Supportmitarbeiter gegebenen Lösungen oder Antworten"
"LABEL": "Summarize this conversation",
"CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
},
"SUGGEST": {
"LABEL": "Antwort vorschlagen",
"CONTENT": "Analysiere die Anfrage des Kunden und entwerfe eine Antwort, die seine Anliegen oder Fragen effektiv beantwortet. Stelle sicher, dass die Antwort klar, prägnant und hilfreich ist."
"LABEL": "Suggest an answer",
"CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
},
"RATE": {
"LABEL": "Bewerten Sie dieses Gespräch",
"CONTENT": "Bewerten Sie das Gespräch, um zu sehen, wie gut es die Bedürfnisse des Kunden erfüllt. Geben Sie eine Bewertung von 1 bis 5 basierend auf Ton, Klarheit und Effektivität ab."
"LABEL": "Rate this conversation",
"CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
},
"HIGH_PRIORITY": {
"LABEL": "Gespräche mit hoher Priorität",
"CONTENT": "Gib mir eine Zusammenfassung aller offenen Gespräche mit hoher Priorität. Bitte die Gesprächs-ID, den Kundennamen (falls vorhanden), den Inhalt der letzten Nachricht und den zugewiesenen Mitarbeiter einschließen. Gruppiere nach Status, wenn relevant."
"LABEL": "High priority conversations",
"CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
},
"LIST_CONTACTS": {
"LABEL": "Kontakte auflisten",
"CONTENT": "Zeige mir die Liste der Top 10 Kontakte. Bitte Name, E-Mail oder Telefonnummer (falls vorhanden), zuletzt gesehen Zeit, Tags (falls vorhanden) einschließen."
"LABEL": "List contacts",
"CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
}
}
},
"PLAYGROUND": {
"USER": "Sie",
"ASSISTANT": "Assistent",
"ASSISTANT": "Assistant",
"MESSAGE_PLACEHOLDER": "Schreiben Sie Ihre Nachricht...",
"HEADER": "Spielwiese",
"DESCRIPTION": "Nutzen Sie diesen Playground, um Nachrichten an Ihren Assistenten zu senden und zu prüfen, ob dieser genau, schnell und im erwarteten Ton antwortet.",
"CREDIT_NOTE": "Hier gesendete Nachrichten werden auf Ihre Captain-Guthaben angerechnet."
"HEADER": "Playground",
"DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
"CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
},
"PAYWALL": {
"TITLE": "Upgrade auf Captain AI",
"AVAILABLE_ON": "Captain ist im kostenlosen Tarif nicht verfügbar.",
"AVAILABLE_ON": "Captain is not available on the free plan.",
"UPGRADE_PROMPT": "Tarif upgraden, um Zugang zu unseren Assistenten, Copilot und mehr zu erhalten.",
"UPGRADE_NOW": "Jetzt upgraden",
"CANCEL_ANYTIME": "Sie können Ihr Paket jederzeit ändern oder kündigen"
},
"ENTERPRISE_PAYWALL": {
"AVAILABLE_ON": "Captain AI ist nur in den Enterprise-Tarifen verfügbar.",
"AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
"UPGRADE_PROMPT": "Tarif upgraden, um Zugang zu unseren Assistenten, Copilot und mehr zu erhalten.",
"ASK_ADMIN": "Bitte kontaktieren Sie Ihren Administrator für das Upgrade."
},
"BANNER": {
"RESPONSES": "Sie haben über 80 % Ihres Antwortlimits verbraucht. Um Captain AI weiterhin zu nutzen, bitte upgraden.",
"RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
"DOCUMENTS": "Dokumentenlimit erreicht. Upgraden um Cpatain AI weiter zu verwenden."
},
"FORM": {
@@ -738,17 +738,6 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
"SELECTED": "{count} selected",
"SELECT_ALL": "Select all ({count})",
"UNSELECT_ALL": "Unselect all ({count})",
"BULK_DELETE_BUTTON": "Löschen",
"BULK_DELETE": {
"TITLE": "Delete documents?",
"DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
"CONFIRM": "Yes, delete all",
"SUCCESS_MESSAGE": "Documents deleted successfully",
"ERROR_MESSAGE": "There was an error deleting the documents, please try again."
},
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -806,7 +795,6 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
"SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -837,18 +825,11 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
"TEST": {
"BUTTON": "Test connection",
"SUCCESS": "Endpoint returned HTTP {status}",
"ERROR": "Connection failed",
"DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
},
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
"ERROR": "Tool name is required",
"MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
"ERROR": "Tool name is required"
},
"DESCRIPTION": {
"LABEL": "Beschreibung",
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Δεν έχει ρυθμιστεί η υπογραφή μηνύματος, παρακαλώ ρυθμίστε την στις ρυθμίσεις προφίλ.",
"COPILOT_MSG_INPUT": "Δώστε στον copilot επιπλέον εντολές ή ρωτήστε οτιδήποτε άλλο... Πατήστε enter για να στείλετε συνέχεια",
"COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
"CLICK_HERE": "Πατήστε εδώ για ενημέρωση",
"WHATSAPP_TEMPLATES": "Πρότυπα Whatsapp"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Σύρετε και αφήστε εδώ για επισύναψη",
"START_AUDIO_RECORDING": "Έναρξη ηχογράφησης",
"STOP_AUDIO_RECORDING": "Διακοπή ηχογράφησης",
"COPILOT_THINKING": "Ο Copilot σκέφτεται",
"COPILOT_THINKING": "Copilot is thinking",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Προσθήκη bcc",
@@ -316,18 +316,6 @@
"SUCCESS_MESSAGE": "Η γλώσσα αφαιρέθηκε επιτυχώς από την πύλη",
"ERROR_MESSAGE": "Δεν είναι δυνατή η αφαίρεση γλώσσας από την πύλη. Δοκιμάστε ξανά."
}
},
"DRAFT_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale moved to draft successfully",
"ERROR_MESSAGE": "Unable to move locale to draft. Try again."
}
},
"PUBLISH_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale published successfully",
"ERROR_MESSAGE": "Unable to publish locale. Try again."
}
}
},
"TABLE": {
@@ -656,11 +644,8 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Προεπιλογή",
"DRAFT": "Πρόχειρο",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
"MOVE_TO_DRAFT": "Move to draft",
"PUBLISH_LOCALE": "Publish locale",
"DELETE": "Διαγραφή"
}
},
@@ -670,13 +655,6 @@
"COMBOBOX": {
"PLACEHOLDER": "Select locale..."
},
"STATUS": {
"LABEL": "Κατάσταση",
"OPTIONS": {
"LIVE": "Δημοσιευμένο",
"DRAFT": "Πρόχειρο"
}
},
"API": {
"SUCCESS_MESSAGE": "Η γλώσσα προστέθηκε επιτυχώς",
"ERROR_MESSAGE": "Δεν είναι δυνατή η προσθήκη γλώσσας. Δοκιμάστε ξανά."
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Captain",
"HEADER_KNOW_MORE": "Μάθετε περισσότερα",
"HEADER_KNOW_MORE": "Know more",
"ASSISTANT_SWITCHER": {
"ASSISTANTS": "Βοηθοί",
"SWITCH_ASSISTANT": "Εναλλαγή μεταξύ βοηθών",
"NEW_ASSISTANT": "Δημιουργία Βοηθού",
"EMPTY_LIST": "Δεν βρέθηκαν βοηθοί, παρακαλώ δημιουργήστε έναν για να ξεκινήσετε"
"ASSISTANTS": "Assistants",
"SWITCH_ASSISTANT": "Switch between assistants",
"NEW_ASSISTANT": "Create Assistant",
"EMPTY_LIST": "No assistants found, please create one to get started"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
"PANEL_TITLE": "Ξεκινήστε με τον Copilot",
"KICK_OFF_MESSAGE": "Χρειάζεστε μια γρήγορη περίληψη, θέλετε να ελέγξετε παλιές συνομιλίες ή να συντάξετε μια καλύτερη απάντηση; Ο Copilot είναι εδώ για να επιταχύνει τα πράγματα.",
"PANEL_TITLE": "Get started with Copilot",
"KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
"SEND_MESSAGE": "Αποστολή μηνύματος...",
"EMPTY_MESSAGE": "Παρουσιάστηκε σφάλμα κατά τη δημιουργία της απάντησης. Προσπαθήστε ξανά.",
"LOADER": "Ο Captain σκέφτεται",
"EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
"LOADER": "Captain is thinking",
"YOU": "You",
"USE": "Χρησιμοποίησε αυτό",
"RESET": "Επαναφορά",
"SHOW_STEPS": "Εμφάνιση βημάτων",
"SELECT_ASSISTANT": "Επιλογή Βοηθού",
"USE": "Use this",
"RESET": "Reset",
"SHOW_STEPS": "Show steps",
"SELECT_ASSISTANT": "Select Assistant",
"PROMPTS": {
"SUMMARIZE": {
"LABEL": "Συνοψίστε αυτή τη συνομιλία",
"CONTENT": "Συνοψίστε τα βασικά σημεία που συζητήθηκαν μεταξύ του πελάτη και του εκπροσώπου υποστήριξης, συμπεριλαμβανομένων των ανησυχιών, των ερωτήσεων του πελάτη και των λύσεων ή απαντήσεων που παρείχε ο εκπρόσωπος υποστήριξης"
"LABEL": "Summarize this conversation",
"CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
},
"SUGGEST": {
"LABEL": "Προτείνετε μια απάντηση",
"CONTENT": "Αναλύστε το ερώτημα του πελάτη και φτιάξτε μια απάντηση που αντιμετωπίζει αποτελεσματικά τις ανησυχίες ή ερωτήσεις του. Βεβαιωθείτε ότι η απάντηση είναι σαφής, συνοπτική και παρέχει χρήσιμες πληροφορίες."
"LABEL": "Suggest an answer",
"CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
},
"RATE": {
"LABEL": "Βαθμολογήστε αυτή τη συνομιλία",
"CONTENT": "Αξιολογήστε τη συνομιλία για το πόσο καλά ικανοποιεί τις ανάγκες του πελάτη. Μοιραστείτε μια βαθμολογία από 5 βασιζόμενοι στον τόνο, την καθαρότητα και την αποτελεσματικότητα."
"LABEL": "Rate this conversation",
"CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
},
"HIGH_PRIORITY": {
"LABEL": "Συνομιλίες υψηλής προτεραιότητας",
"CONTENT": "Δώστε μου μια περίληψη όλων των ανοιχτών συνομιλιών υψηλής προτεραιότητας. Συμπεριλάβετε τον ID συνομιλίας, το όνομα πελάτη (αν είναι διαθέσιμο), το περιεχόμενο του τελευταίου μηνύματος και τον ανατεθέντα πράκτορα. Ομαδοποιήστε κατά κατάσταση εάν είναι σχετικό."
"LABEL": "High priority conversations",
"CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
},
"LIST_CONTACTS": {
"LABEL": "Καταχώρηση επαφών",
"CONTENT": "Δείξε μου τη λίστα με τις 10 κορυφαίες επαφές. Συμπεριλάβετε όνομα, email ή αριθμό τηλεφώνου (αν είναι διαθέσιμο), τελευταία φορά που εμφανίστηκαν, ετικέτες (αν υπάρχουν)."
"LABEL": "List contacts",
"CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
}
}
},
"PLAYGROUND": {
"USER": "You",
"ASSISTANT": "Βοηθός",
"ASSISTANT": "Assistant",
"MESSAGE_PLACEHOLDER": "Πληκτρολογήστε το μήνυμά σας...",
"HEADER": "Παιδική Χαρά",
"DESCRIPTION": "Χρησιμοποιήστε αυτήν την παιδική χαρά για να στείλετε μηνύματα στον βοηθό σας και να ελέγξετε αν ανταποκρίνεται με ακρίβεια, γρήγορα και με τον τόνο που περιμένετε.",
"CREDIT_NOTE": "Τα μηνύματα που στέλνονται εδώ θα μετρήσουν στα credits του Captain σας."
"HEADER": "Playground",
"DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
"CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
},
"PAYWALL": {
"TITLE": "Αναβαθμίστε για να χρησιμοποιήσετε το Captain AI",
"AVAILABLE_ON": "Ο Captain δεν είναι διαθέσιμος στο δωρεάν πακέτο.",
"UPGRADE_PROMPT": "Αναβαθμίστε το πακέτο σας για να αποκτήσετε πρόσβαση στους βοηθούς μας, τον copilot και άλλα.",
"TITLE": "Upgrade to use Captain AI",
"AVAILABLE_ON": "Captain is not available on the free plan.",
"UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
"AVAILABLE_ON": "Το Captain AI είναι διαθέσιμο μόνο στα Enterprise πακέτα.",
"UPGRADE_PROMPT": "Αναβαθμίστε το πακέτο σας για να αποκτήσετε πρόσβαση στους βοηθούς μας, τον copilot και άλλα.",
"AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
"UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"BANNER": {
"RESPONSES": "Έχετε χρησιμοποιήσει πάνω από το 80% του ορίου απαντήσεών σας. Για να συνεχίσετε να χρησιμοποιείτε το Captain AI, παρακαλώ αναβαθμίστε.",
"DOCUMENTS": "Έχετε φτάσει στο όριο εγγράφων. Αναβαθμίστε για να συνεχίσετε να χρησιμοποιείτε το Captain AI."
"RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
"DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
},
"FORM": {
"CANCEL": "Άκυρο",
@@ -738,17 +738,6 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
"SELECTED": "{count} selected",
"SELECT_ALL": "Select all ({count})",
"UNSELECT_ALL": "Unselect all ({count})",
"BULK_DELETE_BUTTON": "Διαγραφή",
"BULK_DELETE": {
"TITLE": "Delete documents?",
"DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
"CONFIRM": "Yes, delete all",
"SUCCESS_MESSAGE": "Documents deleted successfully",
"ERROR_MESSAGE": "There was an error deleting the documents, please try again."
},
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -806,7 +795,6 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
"SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -837,18 +825,11 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
"TEST": {
"BUTTON": "Test connection",
"SUCCESS": "Endpoint returned HTTP {status}",
"ERROR": "Connection failed",
"DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
},
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
"ERROR": "Tool name is required",
"MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
"ERROR": "Tool name is required"
},
"DESCRIPTION": {
"LABEL": "Περιγραφή",
@@ -63,16 +63,6 @@
"ERROR_MESSAGE": "Could not update bot. Please try again."
}
},
"SECRET": {
"LABEL": "Webhook Secret",
"COPY": "Copy secret to clipboard",
"COPY_SUCCESS": "Secret copied to clipboard",
"TOGGLE": "Toggle secret visibility",
"CREATED_DESC": "Use the secret below to verify webhook signatures. Please copy it now, you can also find it later in the bot settings.",
"DONE": "Done",
"RESET_SUCCESS": "Webhook secret regenerated successfully",
"RESET_ERROR": "Unable to regenerate webhook secret. Please try again"
},
"ACCESS_TOKEN": {
"TITLE": "Access Token",
"DESCRIPTION": "Copy the access token and save it securely",
@@ -169,7 +169,6 @@
},
"ATTRIBUTES": {
"MESSAGE_TYPE": "Message Type",
"PRIVATE_NOTE": "Private Note",
"MESSAGE_CONTAINS": "Message Contains",
"EMAIL": "Email",
"INBOX": "Inbox",
@@ -81,8 +81,11 @@
"MISSED_CALL": "Missed call",
"CALL_ENDED": "Call ended",
"NOT_ANSWERED_YET": "Not answered yet",
"AGENT_ANSWERED": "{agentName} answered",
"THEY_ANSWERED": "They answered",
"YOU_ANSWERED": "You answered"
"YOU_ANSWERED": "You answered",
"JOIN_CALL": "Join call",
"REJOIN_CALL": "Rejoin call"
},
"HEADER": {
"RESOLVE_ACTION": "Resolve",
@@ -86,14 +86,6 @@
"PLACEHOLDER": "Please enter your Webhook URL",
"ERROR": "Please enter a valid URL"
},
"CHANNEL_WEBHOOK_SECRET": {
"LABEL": "Webhook Secret",
"COPY": "Copy secret to clipboard",
"COPY_SUCCESS": "Secret copied to clipboard",
"TOGGLE": "Toggle secret visibility",
"RESET_SUCCESS": "Webhook secret regenerated successfully",
"RESET_ERROR": "Unable to regenerate webhook secret. Please try again"
},
"CHANNEL_DOMAIN": {
"LABEL": "Website Domain",
"PLACEHOLDER": "Enter your website domain (eg: acme.com)"
@@ -738,17 +738,6 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
"SELECTED": "{count} selected",
"SELECT_ALL": "Select all ({count})",
"UNSELECT_ALL": "Unselect all ({count})",
"BULK_DELETE_BUTTON": "Delete",
"BULK_DELETE": {
"TITLE": "Delete documents?",
"DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
"CONFIRM": "Yes, delete all",
"SUCCESS_MESSAGE": "Documents deleted successfully",
"ERROR_MESSAGE": "There was an error deleting the documents, please try again."
},
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -807,7 +796,6 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
"SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -838,30 +826,11 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
"PAYWALL": {
"TITLE": "Upgrade to use tools with Captain",
"AVAILABLE_ON": "Captain Tools are only available in Business and Enterprise plans. Please upgrade to Business plan to use the feature.",
"UPGRADE_PROMPT": "",
"UPGRADE_NOW": "Open billing",
"CANCEL_ANYTIME": ""
},
"ENTERPRISE_PAYWALL": {
"AVAILABLE_ON": "Captain Tools are only available in the paid plans.",
"UPGRADE_PROMPT": "Please upgrade to a paid plan to use this feature.",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"TEST": {
"BUTTON": "Test connection",
"SUCCESS": "Endpoint returned HTTP {status}",
"ERROR": "Connection failed",
"DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
},
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
"ERROR": "Tool name is required",
"MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
"ERROR": "Tool name is required"
},
"DESCRIPTION": {
"LABEL": "Description",
@@ -68,8 +68,7 @@
"API_SUCCESS": "Signature saved successfully",
"IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again",
"IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save to save the signature",
"IMAGE_UPLOAD_SIZE_ERROR": "Image size should be less than {size}MB",
"INLINE_IMAGE_WARNING": "Pasted inline images were removed. Please use the image upload button to add images to your signature."
"IMAGE_UPLOAD_SIZE_ERROR": "Image size should be less than {size}MB"
},
"MESSAGE_SIGNATURE": {
"LABEL": "Message Signature",
@@ -45,13 +45,6 @@
"ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
},
"SUBMIT": "Create account",
"HAVE_AN_ACCOUNT": "Already have an account?",
"VERIFY_EMAIL": {
"TITLE": "Check your inbox",
"DESCRIPTION": "We sent a verification link to {email}. Click the link to verify your email and get started.",
"RESEND": "Resend verification email",
"RESEND_SUCCESS": "Verification email sent. Please check your inbox.",
"RESEND_ERROR": "Could not send verification email. Please try again."
}
"HAVE_AN_ACCOUNT": "Already have an account?"
}
}
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "La firma del mensaje no está configurada, por favor configúrela en la configuración del perfil.",
"COPILOT_MSG_INPUT": "Dale instrucciones adicionales a Copilot o pregúntale cualquier otra cosa... Pulsa Enter para enviar el seguimiento",
"COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
"CLICK_HERE": "Haga clic aquí para actualizar",
"WHATSAPP_TEMPLATES": "Plantillas de Whatsapp"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Arrastra y suelta aquí para adjuntar",
"START_AUDIO_RECORDING": "Iniciar grabación de audio",
"STOP_AUDIO_RECORDING": "Detener grabación de audio",
"COPILOT_THINKING": "Copilot está pensando",
"COPILOT_THINKING": "Copilot is thinking",
"EMAIL_HEAD": {
"TO": "A",
"ADD_BCC": "Añadir bcc",

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