Compare commits
191
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5b72f3a26b | ||
|
|
70e9fbc53c | ||
|
|
186d9e0457 | ||
|
|
295bc94fa3 | ||
|
|
83e96956fc | ||
|
|
190416d765 | ||
|
|
3bf370dbba | ||
|
|
5b4d3c1f83 | ||
|
|
475ca365c0 | ||
|
|
6ff0c67501 | ||
|
|
3bd4570580 | ||
|
|
fb75f8783f | ||
|
|
135357a455 | ||
|
|
5670f38eb4 | ||
|
|
477dad1e8e | ||
|
|
6b1389a489 | ||
|
|
b19747a23a | ||
|
|
64d0aae672 | ||
|
|
6d3926413b | ||
|
|
3489e21753 | ||
|
|
6d541a8d39 | ||
|
|
07b9dbc720 | ||
|
|
7331b0a98d | ||
|
|
38d991f19a | ||
|
|
2f46cf162d | ||
|
|
6a6c3b7c27 | ||
|
|
15c710ec01 | ||
|
|
787c99bfd2 | ||
|
|
76b1769731 | ||
|
|
ce5b7e310e | ||
|
|
4a2b64cc7c | ||
|
|
28cc377a8d | ||
|
|
ae76548f8e | ||
|
|
87e8c50ee1 | ||
|
|
8cacf95aae | ||
|
|
e7ae724488 | ||
|
|
05da860aca | ||
|
|
290c2ff4c5 | ||
|
|
9d95f73ec2 | ||
|
|
3396087047 | ||
|
|
f6bef53252 | ||
|
|
c22f8a07c5 | ||
|
|
e8157a2c0e | ||
|
|
7a8b1700ea | ||
|
|
c811d698df | ||
|
|
ae9b2daf84 | ||
|
|
73bd05a941 | ||
|
|
9ea746df9a | ||
|
|
44d363f437 | ||
|
|
391b139652 | ||
|
|
55d1e249dc | ||
|
|
852f23f0f5 | ||
|
|
443991078a | ||
|
|
5c3ba3ccf2 | ||
|
|
f161d8bf23 | ||
|
|
aebb93f88c | ||
|
|
2a824151cb | ||
|
|
219ce15302 | ||
|
|
1c363262b6 | ||
|
|
1dcafe6e47 | ||
|
|
491569fa4f | ||
|
|
c421f75bca | ||
|
|
52fc0c683d | ||
|
|
9145b513c8 | ||
|
|
1f7136860b | ||
|
|
3758a07a29 | ||
|
|
de9fea0983 | ||
|
|
11917b7bd7 | ||
|
|
d80247b5ee | ||
|
|
c8ade357d7 | ||
|
|
c548f71c1a | ||
|
|
faf6b29626 | ||
|
|
6535d19945 | ||
|
|
1844758848 | ||
|
|
567092b9a8 | ||
|
|
59e5a5feea | ||
|
|
52ce0baef7 | ||
|
|
22a0dac4d6 | ||
|
|
2f215a9cff | ||
|
|
8f8c7fdfe7 | ||
|
|
f046d6be32 | ||
|
|
3e5928c8e9 | ||
|
|
1fe5a3c8fb | ||
|
|
2b933f0166 | ||
|
|
d617266258 | ||
|
|
65a254705a | ||
|
|
1ede5bdeec | ||
|
|
3a348d594d | ||
|
|
6b57264fec | ||
|
|
5aaa0400af | ||
|
|
c9bd109dd8 | ||
|
|
8f47496373 | ||
|
|
0990e33860 | ||
|
|
c93c6aed5f | ||
|
|
0381aa188a | ||
|
|
90e212a81a | ||
|
|
76e1643ccf | ||
|
|
0b56add844 | ||
|
|
e9b99a5811 | ||
|
|
a910758fd8 | ||
|
|
aa68525b6b | ||
|
|
ba1f363a28 | ||
|
|
b8e64722a7 | ||
|
|
153d0371ff | ||
|
|
c66f8600ec | ||
|
|
38b5c61d51 | ||
|
|
81f5c9aa12 | ||
|
|
532c5c3324 | ||
|
|
2dca1eee89 | ||
|
|
851f622fe1 | ||
|
|
1503ddeda4 | ||
|
|
c645ba3922 | ||
|
|
5d64079a5e | ||
|
|
82e296b152 | ||
|
|
016a8541c1 | ||
|
|
d289daf6ca | ||
|
|
c8cc157683 | ||
|
|
3fd506c27f | ||
|
|
d8a1fdbce5 | ||
|
|
6840108f30 | ||
|
|
d7288835fa | ||
|
|
31e1d59d58 | ||
|
|
4f55a66fba | ||
|
|
312c8a1a74 | ||
|
|
79f7afaeec | ||
|
|
4e7ca49297 | ||
|
|
db51d2d011 | ||
|
|
6f86944758 | ||
|
|
d74798fcd5 | ||
|
|
394419ce95 | ||
|
|
4fe9b88642 | ||
|
|
0f8037b6fc | ||
|
|
38938fe776 | ||
|
|
02ca4136ad | ||
|
|
da4049d18a | ||
|
|
088608abcf | ||
|
|
afb3c0109b | ||
|
|
c54973eeb2 | ||
|
|
cb2785096e | ||
|
|
27f35a7dd8 | ||
|
|
59790e38da | ||
|
|
461f1b3bf0 | ||
|
|
4056a144e4 | ||
|
|
31681610f2 | ||
|
|
a8b33023f8 | ||
|
|
8c5204d0c9 | ||
|
|
aa5242fdb0 | ||
|
|
b591893486 | ||
|
|
a118bef98e | ||
|
|
daa54f6866 | ||
|
|
c38e7af0e7 | ||
|
|
d6f862a85c | ||
|
|
13f742fd68 | ||
|
|
b74e78f698 | ||
|
|
5d8646a3f3 | ||
|
|
453eba9a81 | ||
|
|
6beb355f29 | ||
|
|
980eca46c6 | ||
|
|
0868a9af70 | ||
|
|
da6fbe8579 | ||
|
|
2c814fff99 | ||
|
|
c1c44512d4 | ||
|
|
1138195846 | ||
|
|
84d31b91f4 | ||
|
|
2df2459674 | ||
|
|
81e18aaafa | ||
|
|
f07a5215cf | ||
|
|
1899a31416 | ||
|
|
60f5145365 | ||
|
|
e58736e746 | ||
|
|
a9fd459cf4 | ||
|
|
7235e44a9d | ||
|
|
ddd1fb5396 | ||
|
|
a97cf6e4ad | ||
|
|
4ecc92ad6d | ||
|
|
ff70fbe2e4 | ||
|
|
4f27f1605a | ||
|
|
e00b54ce07 | ||
|
|
df20a59a6c | ||
|
|
bb6f7b9fcd | ||
|
|
e28c6312e4 | ||
|
|
fc119d14d9 | ||
|
|
9243b6367c | ||
|
|
5af8881a5a | ||
|
|
70029177da | ||
|
|
1abb04f592 | ||
|
|
355b587c2c | ||
|
|
b22a903446 | ||
|
|
2d5993dfe3 | ||
|
|
db50f42054 | ||
|
|
f8afc1509f |
@@ -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:
|
||||
- ''
|
||||
@@ -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
|
||||
|
||||
@@ -94,6 +94,10 @@ yarn-debug.log*
|
||||
.vscode
|
||||
.claude/settings.local.json
|
||||
.cursor
|
||||
|
||||
# react component
|
||||
dist
|
||||
|
||||
.codex/
|
||||
.claude/
|
||||
CLAUDE.local.md
|
||||
|
||||
+2
-2
@@ -166,7 +166,7 @@ GEM
|
||||
multi_json (~> 1)
|
||||
statsd-ruby (~> 1.1)
|
||||
base64 (0.3.0)
|
||||
bcrypt (3.1.22)
|
||||
bcrypt (3.1.20)
|
||||
benchmark (0.4.1)
|
||||
bigdecimal (3.2.2)
|
||||
bindex (0.8.1)
|
||||
@@ -465,7 +465,7 @@ GEM
|
||||
rails-dom-testing (>= 1, < 3)
|
||||
railties (>= 4.2.0)
|
||||
thor (>= 0.14, < 2.0)
|
||||
json (2.19.2)
|
||||
json (2.18.1)
|
||||
json_refs (0.1.8)
|
||||
hana
|
||||
json_schemer (0.2.24)
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
4.12.1
|
||||
4.12.0
|
||||
|
||||
@@ -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?
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -15,6 +15,12 @@ class ApiClient {
|
||||
|
||||
// eslint-disable-next-line class-methods-use-this
|
||||
get accountIdFromRoute() {
|
||||
// eslint-disable-next-line no-underscore-dangle
|
||||
if (window.__WOOT_ACCOUNT_ID__) {
|
||||
// eslint-disable-next-line no-underscore-dangle
|
||||
return window.__WOOT_ACCOUNT_ID__;
|
||||
}
|
||||
|
||||
const isInsideAccountScopedURLs =
|
||||
window.location.pathname.includes('/app/accounts');
|
||||
|
||||
|
||||
@@ -14,7 +14,8 @@ class CacheEnabledApiClient extends ApiClient {
|
||||
}
|
||||
|
||||
get(cache = false) {
|
||||
if (cache) {
|
||||
// eslint-disable-next-line no-underscore-dangle
|
||||
if (cache && !window.__WOOT_ISOLATED_SHELL__) {
|
||||
return this.getFromCache();
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,14 @@ import {
|
||||
} from '../store/utils/api';
|
||||
|
||||
export default {
|
||||
validityCheck() {
|
||||
async validityCheck() {
|
||||
if (this.hasAuthToken()) {
|
||||
const urlData = endPoints('profileUpdate');
|
||||
const response = await axios.get(urlData.url);
|
||||
// to match the response signature of the validityCheck endpoint
|
||||
return Promise.resolve({ data: { payload: response } });
|
||||
}
|
||||
|
||||
const urlData = endPoints('validityCheck');
|
||||
return axios.get(urlData.url);
|
||||
},
|
||||
@@ -31,6 +38,10 @@ export default {
|
||||
hasAuthCookie() {
|
||||
return !!Cookies.get('cw_d_session_info');
|
||||
},
|
||||
hasAuthToken() {
|
||||
// eslint-disable-next-line no-underscore-dangle
|
||||
return !!window.__WOOT_ACCESS_TOKEN__;
|
||||
},
|
||||
getAuthData() {
|
||||
if (this.hasAuthCookie()) {
|
||||
const savedAuthInfo = Cookies.get('cw_d_session_info');
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -1,7 +1,13 @@
|
||||
/* global axios */
|
||||
import CacheEnabledApiClient from './CacheEnabledApiClient';
|
||||
import ApiClient from './ApiClient';
|
||||
|
||||
class Inboxes extends CacheEnabledApiClient {
|
||||
// eslint-disable-next-line no-underscore-dangle
|
||||
const BaseClass = window.__WOOT_ISOLATED_SHELL__
|
||||
? ApiClient
|
||||
: CacheEnabledApiClient;
|
||||
|
||||
class Inboxes extends BaseClass {
|
||||
constructor() {
|
||||
super('inboxes', { accountScoped: true });
|
||||
}
|
||||
|
||||
@@ -106,10 +106,6 @@ select {
|
||||
&[disabled] {
|
||||
@apply field-disabled;
|
||||
}
|
||||
|
||||
option:not(:disabled) {
|
||||
@apply bg-n-solid-2 text-n-slate-12;
|
||||
}
|
||||
}
|
||||
|
||||
// Textarea
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
// scss-lint:disable PropertySortOrder
|
||||
|
||||
// NEXT COLORS START
|
||||
@layer base {
|
||||
// NEXT COLORS START
|
||||
:root {
|
||||
:root,
|
||||
:host {
|
||||
// slate
|
||||
--slate-1: 252 252 253;
|
||||
--slate-2: 249 249 251;
|
||||
@@ -138,6 +140,48 @@
|
||||
--label-background: 247 247 247;
|
||||
--label-border: 0, 0, 0, 0.04;
|
||||
|
||||
// Bubble-specific colors (override these for custom theming)
|
||||
--bubble-agent-bg: var(--solid-blue);
|
||||
--bubble-agent-text: var(--slate-12);
|
||||
--bubble-user-bg: var(--slate-4);
|
||||
--bubble-user-text: var(--slate-12);
|
||||
--bubble-private-bg: var(--solid-amber);
|
||||
--bubble-private-text: var(--amber-12);
|
||||
--bubble-bot-bg: var(--solid-iris);
|
||||
--bubble-bot-text: var(--slate-12);
|
||||
|
||||
// Bubble border customization
|
||||
--bubble-border-width: 0;
|
||||
--bubble-agent-border: var(--blue-6);
|
||||
--bubble-user-border: var(--slate-6);
|
||||
--bubble-private-border: var(--amber-6);
|
||||
--bubble-bot-border: var(--iris-6);
|
||||
|
||||
// Bubble spacing (ratio of 1 = default, 1.5 = 50% larger, 0.5 = 50% smaller)
|
||||
--bubble-spacing-ratio: 1;
|
||||
--bubble-radius: calc(0.75rem * var(--bubble-spacing-ratio));
|
||||
--bubble-radius-sm: calc(0.125rem * var(--bubble-spacing-ratio));
|
||||
--bubble-radius-md: calc(0.375rem * var(--bubble-spacing-ratio));
|
||||
--bubble-radius-lg: calc(0.5rem * var(--bubble-spacing-ratio));
|
||||
--bubble-padding-x: calc(1rem * var(--bubble-spacing-ratio));
|
||||
--bubble-padding-y: calc(0.75rem * var(--bubble-spacing-ratio));
|
||||
|
||||
// Bubble meta text colors (per variant)
|
||||
--bubble-agent-meta: var(--slate-11);
|
||||
--bubble-user-meta: var(--slate-11);
|
||||
--bubble-private-meta: var(--amber-12);
|
||||
--bubble-bot-meta: var(--slate-11);
|
||||
|
||||
// Message status colors (per variant)
|
||||
--bubble-agent-status: var(--slate-10);
|
||||
--bubble-agent-status-read: 126 182 255;
|
||||
--bubble-user-status: var(--slate-10);
|
||||
--bubble-user-status-read: 126 182 255;
|
||||
--bubble-private-status: var(--amber-11);
|
||||
--bubble-private-status-read: 126 182 255;
|
||||
--bubble-bot-status: var(--slate-10);
|
||||
--bubble-bot-status-read: 126 182 255;
|
||||
|
||||
--alpha-1: 215, 215, 215, 0.22;
|
||||
--alpha-2: 196, 197, 198, 0.22;
|
||||
--alpha-3: 255, 255, 255, 0.96;
|
||||
@@ -147,7 +191,8 @@
|
||||
--white-alpha: 255, 255, 255, 0.8;
|
||||
}
|
||||
|
||||
.dark {
|
||||
.dark,
|
||||
:host(.dark) {
|
||||
// slate
|
||||
--slate-1: 17 17 19;
|
||||
--slate-2: 24 25 27;
|
||||
@@ -283,6 +328,48 @@
|
||||
--label-background: 36 38 45;
|
||||
--label-border: 255, 255, 255, 0.03;
|
||||
|
||||
// Bubble-specific colors (override these for custom theming)
|
||||
--bubble-agent-bg: var(--solid-blue);
|
||||
--bubble-agent-text: var(--slate-12);
|
||||
--bubble-user-bg: var(--slate-4);
|
||||
--bubble-user-text: var(--slate-12);
|
||||
--bubble-private-bg: var(--solid-amber);
|
||||
--bubble-private-text: var(--amber-12);
|
||||
--bubble-bot-bg: var(--solid-iris);
|
||||
--bubble-bot-text: var(--slate-12);
|
||||
|
||||
// Bubble border customization
|
||||
--bubble-border-width: 0;
|
||||
--bubble-agent-border: var(--blue-6);
|
||||
--bubble-user-border: var(--slate-6);
|
||||
--bubble-private-border: var(--amber-6);
|
||||
--bubble-bot-border: var(--iris-6);
|
||||
|
||||
// Bubble spacing (inherited from light mode, can be overridden)
|
||||
--bubble-spacing-ratio: 1;
|
||||
--bubble-radius: calc(0.75rem * var(--bubble-spacing-ratio));
|
||||
--bubble-radius-sm: calc(0.125rem * var(--bubble-spacing-ratio));
|
||||
--bubble-radius-md: calc(0.375rem * var(--bubble-spacing-ratio));
|
||||
--bubble-radius-lg: calc(0.5rem * var(--bubble-spacing-ratio));
|
||||
--bubble-padding-x: calc(1rem * var(--bubble-spacing-ratio));
|
||||
--bubble-padding-y: calc(0.75rem * var(--bubble-spacing-ratio));
|
||||
|
||||
// Bubble meta text colors (per variant)
|
||||
--bubble-agent-meta: var(--slate-11);
|
||||
--bubble-user-meta: var(--slate-11);
|
||||
--bubble-private-meta: var(--amber-12);
|
||||
--bubble-bot-meta: var(--slate-11);
|
||||
|
||||
// Message status colors (per variant)
|
||||
--bubble-agent-status: var(--slate-10);
|
||||
--bubble-agent-status-read: 126 182 255;
|
||||
--bubble-user-status: var(--slate-10);
|
||||
--bubble-user-status-read: 126 182 255;
|
||||
--bubble-private-status: var(--amber-11);
|
||||
--bubble-private-status-read: 126 182 255;
|
||||
--bubble-bot-status: var(--slate-10);
|
||||
--bubble-bot-status-read: 126 182 255;
|
||||
|
||||
--alpha-1: 35, 36, 42, 0.8;
|
||||
--alpha-2: 147, 153, 176, 0.12;
|
||||
--alpha-3: 33, 34, 38, 0.95;
|
||||
@@ -293,4 +380,3 @@
|
||||
--white-alpha: 255, 255, 255, 0.1;
|
||||
}
|
||||
}
|
||||
// NEXT COLORS END
|
||||
|
||||
+195
-51
@@ -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>
|
||||
|
||||
@@ -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"
|
||||
|
||||
+5
-11
@@ -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
-3
@@ -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
|
||||
|
||||
+6
-80
@@ -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"
|
||||
|
||||
-12
@@ -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')"
|
||||
|
||||
@@ -134,6 +134,11 @@ const props = defineProps({
|
||||
senderId: { type: Number, default: null },
|
||||
senderType: { type: String, default: null },
|
||||
sourceId: { type: String, default: '' }, // eslint-disable-line vue/no-unused-properties
|
||||
forceAlignTo: {
|
||||
type: String,
|
||||
default: null,
|
||||
validator: value => value === null || ['left', 'right'].includes(value),
|
||||
},
|
||||
});
|
||||
|
||||
const emit = defineEmits(['retry']);
|
||||
@@ -226,12 +231,16 @@ const isBotOrAgentMessage = computed(() => {
|
||||
* @returns {import('vue').ComputedRef<'left'|'right'|'center'>} The computed orientation
|
||||
*/
|
||||
const orientation = computed(() => {
|
||||
if (props.messageType === MESSAGE_TYPES.ACTIVITY) return ORIENTATION.CENTER;
|
||||
|
||||
if (props.forceAlignTo) {
|
||||
return props.forceAlignTo === 'left' ? ORIENTATION.LEFT : ORIENTATION.RIGHT;
|
||||
}
|
||||
|
||||
if (isBotOrAgentMessage.value) {
|
||||
return ORIENTATION.RIGHT;
|
||||
}
|
||||
|
||||
if (props.messageType === MESSAGE_TYPES.ACTIVITY) return ORIENTATION.CENTER;
|
||||
|
||||
return ORIENTATION.LEFT;
|
||||
});
|
||||
|
||||
@@ -246,6 +255,10 @@ const flexOrientationClass = computed(() => {
|
||||
});
|
||||
|
||||
const gridClass = computed(() => {
|
||||
if (props.forceAlignTo) {
|
||||
return 'grid gap-y-2';
|
||||
}
|
||||
|
||||
const map = {
|
||||
[ORIENTATION.LEFT]: 'grid grid-cols-1fr',
|
||||
[ORIENTATION.RIGHT]: 'grid grid-cols-[1fr_24px]',
|
||||
@@ -255,6 +268,14 @@ const gridClass = computed(() => {
|
||||
});
|
||||
|
||||
const gridTemplate = computed(() => {
|
||||
if (props.forceAlignTo) {
|
||||
return `
|
||||
"avatar"
|
||||
"bubble"
|
||||
"meta"
|
||||
`;
|
||||
}
|
||||
|
||||
const map = {
|
||||
[ORIENTATION.LEFT]: `
|
||||
"bubble"
|
||||
@@ -277,11 +298,19 @@ const shouldGroupWithNext = computed(() => {
|
||||
|
||||
const shouldShowAvatar = computed(() => {
|
||||
if (props.messageType === MESSAGE_TYPES.ACTIVITY) return false;
|
||||
if (props.forceAlignTo) return true;
|
||||
if (orientation.value === ORIENTATION.LEFT) return false;
|
||||
|
||||
return true;
|
||||
});
|
||||
|
||||
const shouldShowSenderName = computed(() => {
|
||||
if (props.messageType === MESSAGE_TYPES.ACTIVITY) return false;
|
||||
if (!props.forceAlignTo) return false;
|
||||
|
||||
return true;
|
||||
});
|
||||
|
||||
const componentToRender = computed(() => {
|
||||
if (props.isEmailInbox && !props.private) {
|
||||
const emailInboxTypes = [MESSAGE_TYPES.INCOMING, MESSAGE_TYPES.OUTGOING];
|
||||
@@ -344,6 +373,8 @@ const componentToRender = computed(() => {
|
||||
});
|
||||
|
||||
const shouldShowContextMenu = computed(() => {
|
||||
// eslint-disable-next-line no-underscore-dangle
|
||||
if (window.__WOOT_DISABLE_CONTEXT_MENU__) return false;
|
||||
return !props.contentAttributes?.isUnsupported;
|
||||
});
|
||||
|
||||
@@ -410,6 +441,12 @@ const shouldRenderMessage = computed(() => {
|
||||
});
|
||||
|
||||
function openContextMenu(e) {
|
||||
// eslint-disable-next-line no-underscore-dangle
|
||||
if (window.__WOOT_DISABLE_CONTEXT_MENU__) {
|
||||
e.preventDefault();
|
||||
return;
|
||||
}
|
||||
|
||||
const shouldSkipContextMenu =
|
||||
e.target?.classList.contains('skip-context-menu') ||
|
||||
['a', 'img'].includes(e.target?.tagName.toLowerCase());
|
||||
@@ -490,7 +527,8 @@ const avatarTooltip = computed(() => {
|
||||
});
|
||||
|
||||
const setupHighlightTimer = () => {
|
||||
if (Number(route.query.messageId) !== Number(props.id)) {
|
||||
// This is a defensive check, since in the ISOLATED shell mode, there might be no route.query
|
||||
if (Number(route?.query?.messageId) !== Number(props.id)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -548,15 +586,23 @@ provideMessageContext({
|
||||
<div
|
||||
v-if="!shouldGroupWithNext && shouldShowAvatar"
|
||||
v-tooltip.left-end="avatarTooltip"
|
||||
class="[grid-area:avatar] flex items-end"
|
||||
class="[grid-area:avatar] flex items-end gap-2"
|
||||
>
|
||||
<Avatar v-bind="avatarInfo" :size="24" />
|
||||
<span
|
||||
v-if="shouldShowSenderName"
|
||||
class="text-sm font-semibold text-n-slate-12 pb-0.5"
|
||||
>
|
||||
{{ avatarInfo.name }}
|
||||
</span>
|
||||
</div>
|
||||
<div
|
||||
class="[grid-area:bubble] flex"
|
||||
:class="{
|
||||
'ltr:ml-8 rtl:mr-8 justify-end': orientation === ORIENTATION.RIGHT,
|
||||
'ltr:mr-8 rtl:ml-8': orientation === ORIENTATION.LEFT,
|
||||
'ltr:ml-8 rtl:mr-8 justify-end':
|
||||
!props.forceAlignTo && orientation === ORIENTATION.RIGHT,
|
||||
'ltr:mr-8 rtl:ml-8':
|
||||
!props.forceAlignTo && orientation === ORIENTATION.LEFT,
|
||||
'min-w-0': variant === MESSAGE_VARIANTS.EMAIL,
|
||||
}"
|
||||
@contextmenu="openContextMenu($event)"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<script setup>
|
||||
import { defineProps, computed, reactive } from 'vue';
|
||||
import Message from './Message.vue';
|
||||
import { MESSAGE_TYPES } from './constants.js';
|
||||
import shouldGroupWithNext from './groupWithNext.js';
|
||||
import { useCamelCase } from 'dashboard/composables/useTransformKeys';
|
||||
import { useMapGetter } from 'dashboard/composables/store.js';
|
||||
import MessageApi from 'dashboard/api/inbox/message.js';
|
||||
@@ -90,39 +90,6 @@ const fetchReplyMessage = async (messageId, conversationId) => {
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Determines if a message should be grouped with the next message
|
||||
* @param {Number} index - Index of the current message
|
||||
* @param {Array} searchList - Array of messages to check
|
||||
* @returns {Boolean} - Whether the message should be grouped with next
|
||||
*/
|
||||
const shouldGroupWithNext = (index, searchList) => {
|
||||
if (index === searchList.length - 1) return false;
|
||||
|
||||
const current = searchList[index];
|
||||
const next = searchList[index + 1];
|
||||
|
||||
if (next.status === 'failed') return false;
|
||||
|
||||
const nextSenderId = next.senderId ?? next.sender?.id;
|
||||
const currentSenderId = current.senderId ?? current.sender?.id;
|
||||
const hasSameSender = nextSenderId === currentSenderId;
|
||||
|
||||
const nextMessageType = next.messageType;
|
||||
const currentMessageType = current.messageType;
|
||||
|
||||
const areBothTemplates =
|
||||
nextMessageType === MESSAGE_TYPES.TEMPLATE &&
|
||||
currentMessageType === MESSAGE_TYPES.TEMPLATE;
|
||||
|
||||
if (!hasSameSender || areBothTemplates) return false;
|
||||
|
||||
if (currentMessageType !== nextMessageType) return false;
|
||||
|
||||
// Check if messages are in the same minute by rounding down to nearest minute
|
||||
return Math.floor(next.createdAt / 60) === Math.floor(current.createdAt / 60);
|
||||
};
|
||||
|
||||
/**
|
||||
* Gets the message that was replied to
|
||||
* @param {Object} parentMessage - The message containing the reply reference
|
||||
|
||||
@@ -9,6 +9,21 @@ import { useMessageContext } from './provider.js';
|
||||
|
||||
import { MESSAGE_STATUS, MESSAGE_TYPES } from './constants';
|
||||
|
||||
const {
|
||||
status,
|
||||
isPrivate,
|
||||
createdAt,
|
||||
sourceId,
|
||||
messageType,
|
||||
contentAttributes,
|
||||
inboxId,
|
||||
} = useMessageContext();
|
||||
|
||||
// Resolve channel type from the message's own inbox so that the status
|
||||
// indicator does not depend on `getSelectedChat` being populated. In the
|
||||
// Agent SDK shell `setActiveChat` runs from a watcher in MessageList and can
|
||||
// race with the first render of MessageMeta, leaving `currentChat` empty and
|
||||
// every channel check returning false (the spinner stays forever).
|
||||
const {
|
||||
isAFacebookInbox,
|
||||
isALineChannel,
|
||||
@@ -21,16 +36,7 @@ const {
|
||||
isAnEmailChannel,
|
||||
isAnInstagramChannel,
|
||||
isATiktokChannel,
|
||||
} = useInbox();
|
||||
|
||||
const {
|
||||
status,
|
||||
isPrivate,
|
||||
createdAt,
|
||||
sourceId,
|
||||
messageType,
|
||||
contentAttributes,
|
||||
} = useMessageContext();
|
||||
} = useInbox(inboxId.value);
|
||||
|
||||
const readableTime = computed(() =>
|
||||
messageTimestamp(createdAt.value, 'LLL d, h:mm a')
|
||||
|
||||
@@ -2,7 +2,8 @@
|
||||
import { computed, ref } from 'vue';
|
||||
import { useIntervalFn } from '@vueuse/core';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import { MESSAGE_STATUS } from './constants';
|
||||
import { MESSAGE_STATUS, MESSAGE_VARIANTS } from './constants';
|
||||
import { useMessageContext } from './provider.js';
|
||||
|
||||
import Icon from 'next/icon/Icon.vue';
|
||||
|
||||
@@ -15,6 +16,19 @@ const { status } = defineProps({
|
||||
});
|
||||
|
||||
const { t } = useI18n();
|
||||
const { variant } = useMessageContext();
|
||||
|
||||
const variantPrefix = computed(() => {
|
||||
const prefixMap = {
|
||||
[MESSAGE_VARIANTS.AGENT]: 'agent',
|
||||
[MESSAGE_VARIANTS.USER]: 'user',
|
||||
[MESSAGE_VARIANTS.PRIVATE]: 'private',
|
||||
[MESSAGE_VARIANTS.BOT]: 'bot',
|
||||
[MESSAGE_VARIANTS.TEMPLATE]: 'bot',
|
||||
[MESSAGE_VARIANTS.EMAIL]: 'agent',
|
||||
};
|
||||
return prefixMap[variant.value] || 'agent';
|
||||
});
|
||||
|
||||
const progresIconSequence = [
|
||||
'i-lucide-clock-1',
|
||||
@@ -54,14 +68,44 @@ const statusIcon = computed(() => {
|
||||
return statusIconMap[status];
|
||||
});
|
||||
|
||||
const statusColor = computed(() => {
|
||||
const statusIconMap = {
|
||||
[MESSAGE_STATUS.SENT]: 'text-n-slate-10',
|
||||
[MESSAGE_STATUS.DELIVERED]: 'text-n-slate-10',
|
||||
[MESSAGE_STATUS.READ]: 'text-[#7EB6FF]',
|
||||
};
|
||||
const statusColorMap = {
|
||||
agent: {
|
||||
[MESSAGE_STATUS.SENT]: 'text-[rgb(var(--bubble-agent-status))]',
|
||||
[MESSAGE_STATUS.DELIVERED]: 'text-[rgb(var(--bubble-agent-status))]',
|
||||
[MESSAGE_STATUS.READ]: 'text-[rgb(var(--bubble-agent-status-read))]',
|
||||
},
|
||||
user: {
|
||||
[MESSAGE_STATUS.SENT]: 'text-[rgb(var(--bubble-user-status))]',
|
||||
[MESSAGE_STATUS.DELIVERED]: 'text-[rgb(var(--bubble-user-status))]',
|
||||
[MESSAGE_STATUS.READ]: 'text-[rgb(var(--bubble-user-status-read))]',
|
||||
},
|
||||
private: {
|
||||
[MESSAGE_STATUS.SENT]: 'text-[rgb(var(--bubble-private-status))]',
|
||||
[MESSAGE_STATUS.DELIVERED]: 'text-[rgb(var(--bubble-private-status))]',
|
||||
[MESSAGE_STATUS.READ]: 'text-[rgb(var(--bubble-private-status-read))]',
|
||||
},
|
||||
bot: {
|
||||
[MESSAGE_STATUS.SENT]: 'text-[rgb(var(--bubble-bot-status))]',
|
||||
[MESSAGE_STATUS.DELIVERED]: 'text-[rgb(var(--bubble-bot-status))]',
|
||||
[MESSAGE_STATUS.READ]: 'text-[rgb(var(--bubble-bot-status-read))]',
|
||||
},
|
||||
};
|
||||
|
||||
return statusIconMap[status];
|
||||
const statusColor = computed(() => {
|
||||
const variantMap =
|
||||
statusColorMap[variantPrefix.value] || statusColorMap.agent;
|
||||
return variantMap[status];
|
||||
});
|
||||
|
||||
const progressColorMap = {
|
||||
agent: 'text-[rgb(var(--bubble-agent-status))]',
|
||||
user: 'text-[rgb(var(--bubble-user-status))]',
|
||||
private: 'text-[rgb(var(--bubble-private-status))]',
|
||||
bot: 'text-[rgb(var(--bubble-bot-status))]',
|
||||
};
|
||||
|
||||
const progressColor = computed(() => {
|
||||
return progressColorMap[variantPrefix.value] || progressColorMap.agent;
|
||||
});
|
||||
|
||||
const tooltipText = computed(() => {
|
||||
@@ -81,7 +125,7 @@ const tooltipText = computed(() => {
|
||||
v-if="status === MESSAGE_STATUS.PROGRESS"
|
||||
v-tooltip.top-start="tooltipText"
|
||||
:icon="progessIcon"
|
||||
class="text-n-slate-10"
|
||||
:class="progressColor"
|
||||
/>
|
||||
<Icon
|
||||
v-else
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
<template>
|
||||
<svg
|
||||
class="w-8 h-4"
|
||||
viewBox="0 0 120 30"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="currentColor"
|
||||
>
|
||||
<circle cx="15" cy="15" r="12">
|
||||
<animate
|
||||
attributeName="cy"
|
||||
from="15"
|
||||
to="5"
|
||||
begin="0s"
|
||||
dur="0.9s"
|
||||
values="15;5;15;15;15;15"
|
||||
calcMode="linear"
|
||||
repeatCount="indefinite"
|
||||
/>
|
||||
</circle>
|
||||
<circle cx="55" cy="15" r="12">
|
||||
<animate
|
||||
attributeName="cy"
|
||||
from="15"
|
||||
to="5"
|
||||
begin="0.1s"
|
||||
dur="0.9s"
|
||||
values="15;5;15;15;15;15"
|
||||
calcMode="linear"
|
||||
repeatCount="indefinite"
|
||||
/>
|
||||
</circle>
|
||||
<circle cx="95" cy="15" r="12">
|
||||
<animate
|
||||
attributeName="cy"
|
||||
from="15"
|
||||
to="5"
|
||||
begin="0.2s"
|
||||
dur="0.9s"
|
||||
values="15;5;15;15;15;15"
|
||||
calcMode="linear"
|
||||
repeatCount="indefinite"
|
||||
/>
|
||||
</circle>
|
||||
</svg>
|
||||
</template>
|
||||
@@ -3,19 +3,31 @@ import { computed } from 'vue';
|
||||
import BaseBubble from './Base.vue';
|
||||
import AudioChip from 'next/message/chips/Audio.vue';
|
||||
import { useMessageContext } from '../provider.js';
|
||||
import { MESSAGE_VARIANTS } from '../constants';
|
||||
|
||||
const { attachments } = useMessageContext();
|
||||
const { attachments, variant } = useMessageContext();
|
||||
|
||||
const attachment = computed(() => {
|
||||
return attachments.value[0];
|
||||
});
|
||||
|
||||
const textClass = computed(() => {
|
||||
const textClassMap = {
|
||||
[MESSAGE_VARIANTS.AGENT]: 'text-[rgb(var(--bubble-agent-text))]',
|
||||
[MESSAGE_VARIANTS.USER]: 'text-[rgb(var(--bubble-user-text))]',
|
||||
[MESSAGE_VARIANTS.PRIVATE]: 'text-[rgb(var(--bubble-private-text))]',
|
||||
[MESSAGE_VARIANTS.BOT]: 'text-[rgb(var(--bubble-bot-text))]',
|
||||
};
|
||||
return textClassMap[variant.value] || 'text-[rgb(var(--bubble-agent-text))]';
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<BaseBubble class="bg-transparent" data-bubble-name="audio">
|
||||
<AudioChip
|
||||
:attachment="attachment"
|
||||
class="p-2 text-n-slate-12 skip-context-menu"
|
||||
class="p-2 skip-context-menu"
|
||||
:class="textClass"
|
||||
/>
|
||||
</BaseBubble>
|
||||
</template>
|
||||
|
||||
@@ -20,25 +20,30 @@ const { variant, orientation, inReplyTo, shouldGroupWithNext } =
|
||||
const { t } = useI18n();
|
||||
|
||||
const varaintBaseMap = {
|
||||
[MESSAGE_VARIANTS.AGENT]: 'bg-n-solid-blue text-n-slate-12',
|
||||
[MESSAGE_VARIANTS.AGENT]:
|
||||
'bg-[rgb(var(--bubble-agent-bg))] text-[rgb(var(--bubble-agent-text))] border-[length:var(--bubble-border-width)] border-[rgb(var(--bubble-agent-border))]',
|
||||
[MESSAGE_VARIANTS.PRIVATE]:
|
||||
'bg-n-solid-amber text-n-amber-12 [&_.prosemirror-mention-node]:font-semibold',
|
||||
[MESSAGE_VARIANTS.USER]: 'bg-n-slate-4 text-n-slate-12',
|
||||
'bg-[rgb(var(--bubble-private-bg))] text-[rgb(var(--bubble-private-text))] border-[length:var(--bubble-border-width)] border-[rgb(var(--bubble-private-border))] [&_.prosemirror-mention-node]:font-semibold',
|
||||
[MESSAGE_VARIANTS.USER]:
|
||||
'bg-[rgb(var(--bubble-user-bg))] text-[rgb(var(--bubble-user-text))] border-[length:var(--bubble-border-width)] border-[rgb(var(--bubble-user-border))]',
|
||||
[MESSAGE_VARIANTS.ACTIVITY]: 'bg-n-alpha-1 text-n-slate-11 text-sm',
|
||||
[MESSAGE_VARIANTS.BOT]: 'bg-n-solid-iris text-n-slate-12',
|
||||
[MESSAGE_VARIANTS.TEMPLATE]: 'bg-n-solid-iris text-n-slate-12',
|
||||
[MESSAGE_VARIANTS.ERROR]: 'bg-n-ruby-4 text-n-ruby-12',
|
||||
[MESSAGE_VARIANTS.BOT]:
|
||||
'bg-[rgb(var(--bubble-bot-bg))] text-[rgb(var(--bubble-bot-text))] border-[length:var(--bubble-border-width)] border-[rgb(var(--bubble-bot-border))]',
|
||||
[MESSAGE_VARIANTS.TEMPLATE]:
|
||||
'bg-[rgb(var(--bubble-bot-bg))] text-[rgb(var(--bubble-bot-text))] border-[length:var(--bubble-border-width)] border-[rgb(var(--bubble-bot-border))]',
|
||||
[MESSAGE_VARIANTS.ERROR]:
|
||||
'bg-[rgb(var(--bubble-error-bg))] text-[rgb(var(--bubble-error-text))] border-[length:var(--bubble-border-width)] border-[rgb(var(--bubble-error-border))]',
|
||||
[MESSAGE_VARIANTS.EMAIL]: 'w-full',
|
||||
[MESSAGE_VARIANTS.UNSUPPORTED]:
|
||||
'bg-n-solid-amber/70 border border-dashed border-n-amber-12 text-n-amber-12',
|
||||
'bg-[rgb(var(--bubble-unsupported-bg))]/70 border border-dashed border-[rgb(var(--bubble-unsupported-border))] text-[rgb(var(--bubble-unsupported-text))]',
|
||||
};
|
||||
|
||||
const orientationMap = {
|
||||
[ORIENTATION.LEFT]:
|
||||
'left-bubble rounded-xl ltr:rounded-bl-sm rtl:rounded-br-sm',
|
||||
'left-bubble rounded-[var(--bubble-radius)] ltr:rounded-bl-[var(--bubble-radius-sm)] rtl:rounded-br-[var(--bubble-radius-sm)]',
|
||||
[ORIENTATION.RIGHT]:
|
||||
'right-bubble rounded-xl ltr:rounded-br-sm rtl:rounded-bl-sm',
|
||||
[ORIENTATION.CENTER]: 'rounded-md',
|
||||
'right-bubble rounded-[var(--bubble-radius)] ltr:rounded-br-[var(--bubble-radius-sm)] rtl:rounded-bl-[var(--bubble-radius-sm)]',
|
||||
[ORIENTATION.CENTER]: 'rounded-[var(--bubble-radius-md)]',
|
||||
};
|
||||
|
||||
const flexOrientationClass = computed(() => {
|
||||
@@ -57,7 +62,7 @@ const messageClass = computed(() => {
|
||||
if (variant.value !== MESSAGE_VARIANTS.ACTIVITY) {
|
||||
classToApply.push(orientationMap[orientation.value]);
|
||||
} else {
|
||||
classToApply.push('rounded-lg');
|
||||
classToApply.push('rounded-[var(--bubble-radius-lg)]');
|
||||
}
|
||||
|
||||
return classToApply;
|
||||
@@ -76,6 +81,20 @@ const shouldShowMeta = computed(
|
||||
variant.value !== MESSAGE_VARIANTS.ACTIVITY
|
||||
);
|
||||
|
||||
const metaColorClass = computed(() => {
|
||||
const metaClassMap = {
|
||||
[MESSAGE_VARIANTS.AGENT]: 'text-[rgb(var(--bubble-agent-meta))]',
|
||||
[MESSAGE_VARIANTS.USER]: 'text-[rgb(var(--bubble-user-meta))]',
|
||||
[MESSAGE_VARIANTS.PRIVATE]:
|
||||
'text-[rgb(var(--bubble-private-meta))] opacity-50',
|
||||
[MESSAGE_VARIANTS.BOT]: 'text-[rgb(var(--bubble-bot-meta))]',
|
||||
[MESSAGE_VARIANTS.TEMPLATE]: 'text-[rgb(var(--bubble-bot-meta))]',
|
||||
[MESSAGE_VARIANTS.EMAIL]: 'text-[rgb(var(--bubble-agent-meta))]',
|
||||
[MESSAGE_VARIANTS.ERROR]: 'text-[rgb(var(--bubble-error-meta))]',
|
||||
};
|
||||
return metaClassMap[variant.value] || 'text-[rgb(var(--bubble-agent-meta))]';
|
||||
});
|
||||
|
||||
const replyToPreview = computed(() => {
|
||||
if (!inReplyTo) return '';
|
||||
|
||||
@@ -119,9 +138,7 @@ const replyToPreview = computed(() => {
|
||||
:class="[
|
||||
flexOrientationClass,
|
||||
variant === MESSAGE_VARIANTS.EMAIL ? 'px-3 pb-3' : '',
|
||||
variant === MESSAGE_VARIANTS.PRIVATE
|
||||
? 'text-n-amber-12/50'
|
||||
: 'text-n-slate-11',
|
||||
metaColorClass,
|
||||
]"
|
||||
class="mt-2"
|
||||
/>
|
||||
|
||||
@@ -4,6 +4,7 @@ import { useI18n } from 'vue-i18n';
|
||||
import BaseBubble from './Base.vue';
|
||||
import Icon from 'next/icon/Icon.vue';
|
||||
import { useMessageContext } from '../provider.js';
|
||||
import { MESSAGE_VARIANTS } from '../constants';
|
||||
|
||||
defineProps({
|
||||
icon: { type: [String, Object], required: true },
|
||||
@@ -20,16 +21,39 @@ defineProps({
|
||||
},
|
||||
});
|
||||
|
||||
const { sender } = useMessageContext();
|
||||
const { sender, variant } = useMessageContext();
|
||||
const { t } = useI18n();
|
||||
|
||||
const senderName = computed(() => {
|
||||
return sender?.value?.name || '';
|
||||
});
|
||||
|
||||
const primaryTextClass = computed(() => {
|
||||
const classMap = {
|
||||
[MESSAGE_VARIANTS.AGENT]: 'text-[rgb(var(--bubble-agent-text))]',
|
||||
[MESSAGE_VARIANTS.USER]: 'text-[rgb(var(--bubble-user-text))]',
|
||||
[MESSAGE_VARIANTS.PRIVATE]: 'text-[rgb(var(--bubble-private-text))]',
|
||||
[MESSAGE_VARIANTS.BOT]: 'text-[rgb(var(--bubble-bot-text))]',
|
||||
};
|
||||
return classMap[variant.value] || 'text-[rgb(var(--bubble-agent-text))]';
|
||||
});
|
||||
|
||||
const secondaryTextClass = computed(() => {
|
||||
const classMap = {
|
||||
[MESSAGE_VARIANTS.AGENT]: 'text-[rgb(var(--bubble-agent-meta))]',
|
||||
[MESSAGE_VARIANTS.USER]: 'text-[rgb(var(--bubble-user-meta))]',
|
||||
[MESSAGE_VARIANTS.PRIVATE]: 'text-[rgb(var(--bubble-private-meta))]',
|
||||
[MESSAGE_VARIANTS.BOT]: 'text-[rgb(var(--bubble-bot-meta))]',
|
||||
};
|
||||
return classMap[variant.value] || 'text-[rgb(var(--bubble-agent-meta))]';
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<BaseBubble class="overflow-hidden p-3" data-bubble-name="attachment">
|
||||
<BaseBubble
|
||||
class="overflow-hidden p-[var(--bubble-padding-y)]"
|
||||
data-bubble-name="attachment"
|
||||
>
|
||||
<div class="grid gap-4 min-w-64">
|
||||
<div class="grid gap-3">
|
||||
<div
|
||||
@@ -41,7 +65,11 @@ const senderName = computed(() => {
|
||||
</slot>
|
||||
</div>
|
||||
<div class="space-y-1 overflow-hidden">
|
||||
<div v-if="senderName" class="text-n-slate-12 text-sm truncate">
|
||||
<div
|
||||
v-if="senderName"
|
||||
class="text-sm truncate"
|
||||
:class="primaryTextClass"
|
||||
>
|
||||
{{
|
||||
t(senderTranslationKey, {
|
||||
sender: senderName,
|
||||
@@ -49,10 +77,18 @@ const senderName = computed(() => {
|
||||
}}
|
||||
</div>
|
||||
<slot>
|
||||
<div v-if="title" class="truncate text-sm text-n-slate-12">
|
||||
<div
|
||||
v-if="title"
|
||||
class="truncate text-sm"
|
||||
:class="primaryTextClass"
|
||||
>
|
||||
{{ title }}
|
||||
</div>
|
||||
<div v-if="content" class="truncate text-sm text-n-slate-11">
|
||||
<div
|
||||
v-if="content"
|
||||
class="truncate text-sm"
|
||||
:class="secondaryTextClass"
|
||||
>
|
||||
{{ content }}
|
||||
</div>
|
||||
</slot>
|
||||
|
||||
@@ -40,7 +40,10 @@ const starRatingValue = computed(() => {
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<BaseBubble class="px-4 py-3" data-bubble-name="csat">
|
||||
<BaseBubble
|
||||
class="px-[var(--bubble-padding-x)] py-[var(--bubble-padding-y)]"
|
||||
data-bubble-name="csat"
|
||||
>
|
||||
<h4>{{ content || t('CONVERSATION.CSAT_REPLY_MESSAGE') }}</h4>
|
||||
<dl v-if="isRatingSubmitted" class="mt-4">
|
||||
<dt class="text-n-slate-11 italic">
|
||||
|
||||
@@ -1,14 +1,32 @@
|
||||
<script setup>
|
||||
import { computed } from 'vue';
|
||||
import { MESSAGE_STATUS } from '../../constants';
|
||||
import { MESSAGE_STATUS, MESSAGE_TYPES } from '../../constants';
|
||||
import { useMessageContext } from '../../provider.js';
|
||||
|
||||
const { contentAttributes, status, sender } = useMessageContext();
|
||||
const { contentAttributes, status, sender, messageType } = useMessageContext();
|
||||
|
||||
const hasError = computed(() => {
|
||||
return status.value === MESSAGE_STATUS.FAILED;
|
||||
});
|
||||
|
||||
const isIncoming = computed(() => {
|
||||
return messageType.value === MESSAGE_TYPES.INCOMING;
|
||||
});
|
||||
|
||||
const secondaryTextClass = computed(() => {
|
||||
if (hasError.value) return 'text-[rgb(var(--bubble-error-meta))]';
|
||||
return isIncoming.value
|
||||
? 'text-[rgb(var(--bubble-user-meta))]'
|
||||
: 'text-[rgb(var(--bubble-agent-meta))]';
|
||||
});
|
||||
|
||||
const primaryTextClass = computed(() => {
|
||||
if (hasError.value) return 'text-[rgb(var(--bubble-error-text))]';
|
||||
return isIncoming.value
|
||||
? 'text-[rgb(var(--bubble-user-text))]'
|
||||
: 'text-[rgb(var(--bubble-agent-text))]';
|
||||
});
|
||||
|
||||
const fromEmail = computed(() => {
|
||||
return contentAttributes.value?.email?.from ?? [];
|
||||
});
|
||||
@@ -68,13 +86,10 @@ const showMeta = computed(() => {
|
||||
<section
|
||||
v-show="showMeta"
|
||||
class="space-y-1 rtl:pl-9 ltr:pr-9 text-sm break-words"
|
||||
:class="hasError ? 'text-n-ruby-11' : 'text-n-slate-11'"
|
||||
:class="secondaryTextClass"
|
||||
>
|
||||
<template v-if="showMeta">
|
||||
<div
|
||||
v-if="fromEmail[0]"
|
||||
:class="hasError ? 'text-n-ruby-11' : 'text-n-slate-12'"
|
||||
>
|
||||
<div v-if="fromEmail[0]" :class="primaryTextClass">
|
||||
<template v-if="senderName">
|
||||
<span>
|
||||
{{ senderName }}
|
||||
|
||||
@@ -104,21 +104,26 @@ const handleSeeOriginal = () => {
|
||||
|
||||
<template>
|
||||
<BaseBubble
|
||||
class="w-full"
|
||||
class="w-full border-[length:var(--bubble-border-width)]"
|
||||
:class="{
|
||||
'bg-n-slate-4': isIncoming,
|
||||
'bg-n-solid-blue': isOutgoing,
|
||||
'bg-[rgb(var(--bubble-user-bg))] text-[rgb(var(--bubble-user-text))] border-[rgb(var(--bubble-user-border))]':
|
||||
isIncoming,
|
||||
'bg-[rgb(var(--bubble-agent-bg))] text-[rgb(var(--bubble-agent-text))] border-[rgb(var(--bubble-agent-border))]':
|
||||
isOutgoing,
|
||||
}"
|
||||
data-bubble-name="email"
|
||||
>
|
||||
<EmailMeta
|
||||
class="p-3"
|
||||
class="px-[var(--bubble-padding-x)] py-[var(--bubble-padding-y)]"
|
||||
:class="{
|
||||
'border-b border-n-strong': isIncoming,
|
||||
'border-b border-n-slate-8/20': isOutgoing,
|
||||
'border-b border-[rgb(var(--bubble-user-border))]': isIncoming,
|
||||
'border-b border-[rgb(var(--bubble-agent-border))]': isOutgoing,
|
||||
}"
|
||||
/>
|
||||
<section ref="contentContainer" class="p-3">
|
||||
<section
|
||||
ref="contentContainer"
|
||||
class="px-[var(--bubble-padding-x)] py-[var(--bubble-padding-y)]"
|
||||
>
|
||||
<div
|
||||
:class="{
|
||||
'max-h-[400px] overflow-hidden relative': !isExpanded && isExpandable,
|
||||
@@ -129,14 +134,18 @@ const handleSeeOriginal = () => {
|
||||
v-if="isExpandable && !isExpanded"
|
||||
class="absolute left-0 right-0 bottom-0 h-40 px-8 flex items-end"
|
||||
:class="{
|
||||
'bg-gradient-to-t from-n-slate-4 via-n-slate-4 via-20% to-transparent':
|
||||
'bg-gradient-to-t from-[rgb(var(--bubble-user-bg))] via-[rgb(var(--bubble-user-bg))] via-20% to-transparent':
|
||||
isIncoming,
|
||||
'bg-gradient-to-t from-n-solid-blue via-n-solid-blue via-20% to-transparent':
|
||||
'bg-gradient-to-t from-[rgb(var(--bubble-agent-bg))] via-[rgb(var(--bubble-agent-bg))] via-20% to-transparent':
|
||||
isOutgoing,
|
||||
}"
|
||||
>
|
||||
<button
|
||||
class="text-n-slate-12 py-2 px-8 mx-auto text-center flex items-center gap-2"
|
||||
class="py-2 px-8 mx-auto text-center flex items-center gap-2"
|
||||
:class="{
|
||||
'text-[rgb(var(--bubble-user-text))]': isIncoming,
|
||||
'text-[rgb(var(--bubble-agent-text))]': isOutgoing,
|
||||
}"
|
||||
@click="isExpanded = true"
|
||||
>
|
||||
<Icon icon="i-lucide-maximize-2" />
|
||||
@@ -145,7 +154,7 @@ const handleSeeOriginal = () => {
|
||||
</div>
|
||||
<FormattedContent
|
||||
v-if="isOutgoing && content && !hasEmailContent"
|
||||
class="text-n-slate-12"
|
||||
class="text-[rgb(var(--bubble-agent-text))]"
|
||||
:content="messageContent"
|
||||
/>
|
||||
<template v-else>
|
||||
@@ -176,7 +185,11 @@ const handleSeeOriginal = () => {
|
||||
</template>
|
||||
<button
|
||||
v-if="hasQuotedMessage"
|
||||
class="text-n-slate-11 px-1 leading-none text-sm bg-n-alpha-black2 text-center flex items-center gap-1 mt-2"
|
||||
class="px-1 leading-none text-sm bg-n-alpha-black2 text-center flex items-center gap-1 mt-2"
|
||||
:class="{
|
||||
'text-[rgb(var(--bubble-user-meta))]': isIncoming,
|
||||
'text-[rgb(var(--bubble-agent-meta))]': isOutgoing,
|
||||
}"
|
||||
@click="showQuotedMessage = !showQuotedMessage"
|
||||
>
|
||||
<template v-if="showQuotedMessage">
|
||||
|
||||
@@ -48,7 +48,10 @@ const formValues = computed(() => {
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<BaseBubble class="px-4 py-3" data-bubble-name="csat">
|
||||
<BaseBubble
|
||||
class="px-[var(--bubble-padding-x)] py-[var(--bubble-padding-y)]"
|
||||
data-bubble-name="form"
|
||||
>
|
||||
<span v-dompurify-html="content" :title="content" />
|
||||
<dl v-if="formValues.length" class="mt-4">
|
||||
<template v-for="item in formValues" :key="item.title">
|
||||
|
||||
@@ -6,6 +6,7 @@ import { useLoadWithRetry } from 'dashboard/composables/loadWithRetry';
|
||||
import BaseBubble from './Base.vue';
|
||||
import Button from 'next/button/Button.vue';
|
||||
import Icon from 'next/icon/Icon.vue';
|
||||
import { useGallery } from '../useGallery';
|
||||
import { useSnakeCase } from 'dashboard/composables/useTransformKeys';
|
||||
import { useMessageContext } from '../provider.js';
|
||||
import { downloadFile } from '@chatwoot/utils';
|
||||
@@ -22,8 +23,8 @@ const attachment = computed(() => {
|
||||
|
||||
const { isLoaded, hasError, loadWithRetry } = useLoadWithRetry();
|
||||
|
||||
const showGallery = ref(false);
|
||||
const isDownloading = ref(false);
|
||||
const { showGallery, isGalleryAllowed, toggleGallery } = useGallery();
|
||||
|
||||
onMounted(() => {
|
||||
if (attachment.value?.dataUrl) {
|
||||
@@ -50,13 +51,16 @@ const handleImageError = () => {
|
||||
|
||||
<template>
|
||||
<BaseBubble
|
||||
class="overflow-hidden p-3"
|
||||
class="overflow-hidden p-[var(--bubble-padding-y)]"
|
||||
data-bubble-name="image"
|
||||
@click="showGallery = true"
|
||||
@click="toggleGallery(true)"
|
||||
>
|
||||
<div v-if="hasError" class="flex items-center gap-1 text-center rounded-lg">
|
||||
<Icon icon="i-lucide-circle-off" class="text-n-slate-11" />
|
||||
<p class="mb-0 text-n-slate-11">
|
||||
<div
|
||||
v-if="hasError"
|
||||
class="flex items-center gap-1 text-center rounded-lg text-[rgb(var(--bubble-error-meta))]"
|
||||
>
|
||||
<Icon icon="i-lucide-circle-off" />
|
||||
<p class="mb-0">
|
||||
{{ $t('COMPONENTS.MEDIA.IMAGE_UNAVAILABLE') }}
|
||||
</p>
|
||||
</div>
|
||||
@@ -86,7 +90,7 @@ const handleImageError = () => {
|
||||
</div>
|
||||
</BaseBubble>
|
||||
<GalleryView
|
||||
v-if="showGallery"
|
||||
v-if="showGallery && isGalleryAllowed"
|
||||
v-model:show="showGallery"
|
||||
:attachment="useSnakeCase(attachment)"
|
||||
:all-attachments="filteredCurrentChatAttachments"
|
||||
|
||||
@@ -44,7 +44,10 @@ const onVideoLoadError = () => {
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<BaseBubble class="p-3 overflow-hidden" data-bubble-name="ig-story">
|
||||
<BaseBubble
|
||||
class="p-[var(--bubble-padding-y)] overflow-hidden"
|
||||
data-bubble-name="ig-story"
|
||||
>
|
||||
<p v-if="isStoryReply" class="mb-1 text-xs text-n-slate-11">
|
||||
{{ t('COMPONENTS.FILE_BUBBLE.INSTAGRAM_STORY_REPLY') }}
|
||||
</p>
|
||||
@@ -64,10 +67,10 @@ const onVideoLoadError = () => {
|
||||
/>
|
||||
<div
|
||||
v-else
|
||||
class="flex items-center gap-1 px-5 py-4 text-center rounded-lg bg-n-alpha-1"
|
||||
class="flex items-center gap-1 px-5 py-4 text-center rounded-lg bg-n-alpha-1 text-[rgb(var(--bubble-error-meta))]"
|
||||
>
|
||||
<Icon icon="i-lucide-circle-off" class="text-n-slate-11" />
|
||||
<p class="mb-0 text-n-slate-11">
|
||||
<Icon icon="i-lucide-circle-off" />
|
||||
<p class="mb-0">
|
||||
{{ $t('COMPONENTS.FILE_BUBBLE.INSTAGRAM_STORY_UNAVAILABLE') }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -4,11 +4,11 @@ import BaseBubble from 'next/message/bubbles/Base.vue';
|
||||
import FormattedContent from './FormattedContent.vue';
|
||||
import AttachmentChips from 'next/message/chips/AttachmentChips.vue';
|
||||
import TranslationToggle from 'dashboard/components-next/message/TranslationToggle.vue';
|
||||
import { MESSAGE_TYPES } from '../../constants';
|
||||
import { MESSAGE_TYPES, MESSAGE_VARIANTS } from '../../constants';
|
||||
import { useMessageContext } from '../../provider.js';
|
||||
import { useTranslations } from 'dashboard/composables/useTranslations';
|
||||
|
||||
const { content, attachments, contentAttributes, messageType } =
|
||||
const { content, attachments, contentAttributes, messageType, variant } =
|
||||
useMessageContext();
|
||||
|
||||
const { hasTranslations, translationContent } =
|
||||
@@ -36,15 +36,29 @@ const isEmpty = computed(() => {
|
||||
return !content.value && !attachments.value?.length;
|
||||
});
|
||||
|
||||
const emptyTextClass = computed(() => {
|
||||
const metaClassMap = {
|
||||
[MESSAGE_VARIANTS.AGENT]: 'text-[rgb(var(--bubble-agent-meta))]',
|
||||
[MESSAGE_VARIANTS.USER]: 'text-[rgb(var(--bubble-user-meta))]',
|
||||
[MESSAGE_VARIANTS.PRIVATE]: 'text-[rgb(var(--bubble-private-meta))]',
|
||||
[MESSAGE_VARIANTS.BOT]: 'text-[rgb(var(--bubble-bot-meta))]',
|
||||
[MESSAGE_VARIANTS.TEMPLATE]: 'text-[rgb(var(--bubble-bot-meta))]',
|
||||
};
|
||||
return metaClassMap[variant.value] || 'text-[rgb(var(--bubble-agent-meta))]';
|
||||
});
|
||||
|
||||
const handleSeeOriginal = () => {
|
||||
renderOriginal.value = !renderOriginal.value;
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<BaseBubble class="px-4 py-3" data-bubble-name="text">
|
||||
<BaseBubble
|
||||
class="px-[var(--bubble-padding-x)] py-[var(--bubble-padding-y)]"
|
||||
data-bubble-name="text"
|
||||
>
|
||||
<div class="gap-3 flex flex-col">
|
||||
<span v-if="isEmpty" class="text-n-slate-11">
|
||||
<span v-if="isEmpty" :class="emptyTextClass">
|
||||
{{ $t('CONVERSATION.NO_CONTENT') }}
|
||||
</span>
|
||||
<FormattedContent v-if="renderContent" :content="renderContent" />
|
||||
|
||||
@@ -21,7 +21,10 @@ const unsupportedMessageKey = computed(() => {
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<BaseBubble class="px-4 py-3 text-sm" data-bubble-name="unsupported">
|
||||
<BaseBubble
|
||||
class="px-[var(--bubble-padding-x)] py-[var(--bubble-padding-y)] text-sm"
|
||||
data-bubble-name="unsupported"
|
||||
>
|
||||
{{ $t(unsupportedMessageKey) }}
|
||||
</BaseBubble>
|
||||
</template>
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
import { ref, computed } from 'vue';
|
||||
import BaseBubble from './Base.vue';
|
||||
import Icon from 'next/icon/Icon.vue';
|
||||
import { useGallery } from '../useGallery';
|
||||
import { useSnakeCase } from 'dashboard/composables/useTransformKeys';
|
||||
import { useMessageContext } from '../provider.js';
|
||||
import GalleryView from 'dashboard/components/widgets/conversation/components/GalleryView.vue';
|
||||
@@ -9,7 +10,7 @@ import { ATTACHMENT_TYPES } from '../constants';
|
||||
|
||||
const emit = defineEmits(['error']);
|
||||
const hasError = ref(false);
|
||||
const showGallery = ref(false);
|
||||
const { showGallery, isGalleryAllowed, toggleGallery } = useGallery();
|
||||
const { filteredCurrentChatAttachments, attachments } = useMessageContext();
|
||||
|
||||
const handleError = () => {
|
||||
@@ -28,9 +29,9 @@ const isReel = computed(() => {
|
||||
|
||||
<template>
|
||||
<BaseBubble
|
||||
class="overflow-hidden p-3"
|
||||
class="overflow-hidden p-[var(--bubble-padding-y)]"
|
||||
data-bubble-name="video"
|
||||
@click="showGallery = true"
|
||||
@click="toggleGallery(true)"
|
||||
>
|
||||
<div class="relative group rounded-lg overflow-hidden">
|
||||
<div
|
||||
@@ -53,7 +54,7 @@ const isReel = computed(() => {
|
||||
</div>
|
||||
</BaseBubble>
|
||||
<GalleryView
|
||||
v-if="showGallery"
|
||||
v-if="showGallery && isGalleryAllowed"
|
||||
v-model:show="showGallery"
|
||||
:attachment="useSnakeCase(attachment)"
|
||||
:all-attachments="filteredCurrentChatAttachments"
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<script setup>
|
||||
import { ref } from 'vue';
|
||||
import Icon from 'next/icon/Icon.vue';
|
||||
import { useGallery } from '../useGallery';
|
||||
import { useSnakeCase } from 'dashboard/composables/useTransformKeys';
|
||||
import { useMessageContext } from '../provider.js';
|
||||
|
||||
@@ -13,7 +14,7 @@ defineProps({
|
||||
},
|
||||
});
|
||||
const hasError = ref(false);
|
||||
const showGallery = ref(false);
|
||||
const { showGallery, toggleGallery, isGalleryAllowed } = useGallery();
|
||||
|
||||
const { filteredCurrentChatAttachments } = useMessageContext();
|
||||
|
||||
@@ -25,7 +26,7 @@ const handleError = () => {
|
||||
<template>
|
||||
<div
|
||||
class="size-[72px] overflow-hidden contain-content rounded-xl cursor-pointer"
|
||||
@click="showGallery = true"
|
||||
@click="toggleGallery(true)"
|
||||
>
|
||||
<div
|
||||
v-if="hasError"
|
||||
@@ -42,7 +43,7 @@ const handleError = () => {
|
||||
/>
|
||||
</div>
|
||||
<GalleryView
|
||||
v-if="showGallery"
|
||||
v-if="showGallery && isGalleryAllowed"
|
||||
v-model:show="showGallery"
|
||||
:attachment="useSnakeCase(attachment)"
|
||||
:all-attachments="filteredCurrentChatAttachments"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<script setup>
|
||||
import { ref } from 'vue';
|
||||
import Icon from 'next/icon/Icon.vue';
|
||||
import { useGallery } from '../useGallery';
|
||||
import { useSnakeCase } from 'dashboard/composables/useTransformKeys';
|
||||
import { useMessageContext } from '../provider.js';
|
||||
import GalleryView from 'dashboard/components/widgets/conversation/components/GalleryView.vue';
|
||||
@@ -12,7 +12,7 @@ defineProps({
|
||||
},
|
||||
});
|
||||
|
||||
const showGallery = ref(false);
|
||||
const { showGallery, isGalleryAllowed, toggleGallery } = useGallery();
|
||||
|
||||
const { filteredCurrentChatAttachments } = useMessageContext();
|
||||
</script>
|
||||
@@ -20,7 +20,7 @@ const { filteredCurrentChatAttachments } = useMessageContext();
|
||||
<template>
|
||||
<div
|
||||
class="size-[72px] overflow-hidden contain-content rounded-xl cursor-pointer relative group"
|
||||
@click="showGallery = true"
|
||||
@click="toggleGallery(true)"
|
||||
>
|
||||
<video
|
||||
:src="attachment.dataUrl"
|
||||
@@ -42,7 +42,7 @@ const { filteredCurrentChatAttachments } = useMessageContext();
|
||||
</div>
|
||||
</div>
|
||||
<GalleryView
|
||||
v-if="showGallery"
|
||||
v-if="showGallery && isGalleryAllowed"
|
||||
v-model:show="showGallery"
|
||||
:attachment="useSnakeCase(attachment)"
|
||||
:all-attachments="filteredCurrentChatAttachments"
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
import { MESSAGE_TYPES } from './constants';
|
||||
/**
|
||||
* Determines if a message should be grouped with the next message
|
||||
* @param {Number} index - Index of the current message
|
||||
* @param {Array} searchList - Array of messages to check
|
||||
* @returns {Boolean} - Whether the message should be grouped with next
|
||||
*/
|
||||
export default (index, searchList) => {
|
||||
if (index === searchList.length - 1) return false;
|
||||
|
||||
const current = searchList[index];
|
||||
const next = searchList[index + 1];
|
||||
|
||||
if (next.status === 'failed') return false;
|
||||
|
||||
const nextSenderId = next.senderId ?? next.sender?.id;
|
||||
const currentSenderId = current.senderId ?? current.sender?.id;
|
||||
const hasSameSender = nextSenderId === currentSenderId;
|
||||
|
||||
const nextMessageType = next.messageType;
|
||||
const currentMessageType = current.messageType;
|
||||
|
||||
const areBothTemplates =
|
||||
nextMessageType === MESSAGE_TYPES.TEMPLATE &&
|
||||
currentMessageType === MESSAGE_TYPES.TEMPLATE;
|
||||
|
||||
if (!hasSameSender || areBothTemplates) return false;
|
||||
|
||||
if (currentMessageType !== nextMessageType) return false;
|
||||
|
||||
// Check if messages are in the same minute by rounding down to nearest minute
|
||||
return Math.floor(next.createdAt / 60) === Math.floor(current.createdAt / 60);
|
||||
};
|
||||
@@ -0,0 +1,20 @@
|
||||
import { computed } from 'vue';
|
||||
import { useToggle } from '@vueuse/core';
|
||||
|
||||
export function useGallery() {
|
||||
const [showGallery] = useToggle(false);
|
||||
|
||||
const isGalleryAllowed = computed(() => {
|
||||
return true;
|
||||
});
|
||||
|
||||
const toggleGallery = value => {
|
||||
showGallery.value = value;
|
||||
};
|
||||
|
||||
return {
|
||||
showGallery,
|
||||
isGalleryAllowed,
|
||||
toggleGallery,
|
||||
};
|
||||
}
|
||||
@@ -63,16 +63,6 @@ const hasAdvancedAssignment = computed(() => {
|
||||
);
|
||||
});
|
||||
|
||||
const hasCustomTools = computed(() => {
|
||||
return (
|
||||
isFeatureEnabledonAccount.value(
|
||||
accountId.value,
|
||||
FEATURE_FLAGS.CAPTAIN_CUSTOM_TOOLS
|
||||
) ||
|
||||
isFeatureEnabledonAccount.value(accountId.value, FEATURE_FLAGS.CAPTAIN_V2)
|
||||
);
|
||||
});
|
||||
|
||||
const toggleShortcutModalFn = show => {
|
||||
if (show) {
|
||||
emit('openKeyShortcutModal');
|
||||
@@ -374,18 +364,14 @@ const menuItems = computed(() => {
|
||||
navigationPath: 'captain_assistants_inboxes_index',
|
||||
}),
|
||||
},
|
||||
...(hasCustomTools.value
|
||||
? [
|
||||
{
|
||||
name: 'Tools',
|
||||
label: t('SIDEBAR.CAPTAIN_TOOLS'),
|
||||
activeOn: ['captain_tools_index'],
|
||||
to: accountScopedRoute('captain_assistants_index', {
|
||||
navigationPath: 'captain_tools_index',
|
||||
}),
|
||||
},
|
||||
]
|
||||
: []),
|
||||
{
|
||||
name: 'Tools',
|
||||
label: t('SIDEBAR.CAPTAIN_TOOLS'),
|
||||
activeOn: ['captain_tools_index'],
|
||||
to: accountScopedRoute('captain_assistants_index', {
|
||||
navigationPath: 'captain_tools_index',
|
||||
}),
|
||||
},
|
||||
{
|
||||
name: 'Settings',
|
||||
label: t('SIDEBAR.CAPTAIN_SETTINGS'),
|
||||
|
||||
@@ -15,6 +15,7 @@ const { modalType, closeOnBackdropClick, onClose } = defineProps({
|
||||
|
||||
const emit = defineEmits(['close']);
|
||||
const show = defineModel('show', { type: Boolean, default: false });
|
||||
const teleportTarget = ref(null);
|
||||
|
||||
const modalClassName = computed(() => {
|
||||
const modalClassNameMap = {
|
||||
@@ -25,6 +26,24 @@ const modalClassName = computed(() => {
|
||||
return `modal-mask skip-context-menu ${modalClassNameMap[modalType] || ''}`;
|
||||
});
|
||||
|
||||
const resolveTeleportTarget = () => {
|
||||
// eslint-disable-next-line no-underscore-dangle
|
||||
if (window.__WOOT_ISOLATED_SHELL__) {
|
||||
// Look for the specific chatwoot-message-list custom element
|
||||
const messageListElement = document.querySelector('chatwoot-message-list');
|
||||
if (messageListElement?.shadowRoot) {
|
||||
const modalRoot =
|
||||
messageListElement.shadowRoot.querySelector('#cw-modal-root');
|
||||
if (modalRoot) {
|
||||
teleportTarget.value = modalRoot;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
teleportTarget.value = document.body;
|
||||
};
|
||||
|
||||
// [TODO] Revisit this logic to use outside click directive
|
||||
const mousedDownOnBackdrop = ref(false);
|
||||
|
||||
@@ -58,6 +77,7 @@ useEventListener(document.body, 'mouseup', onMouseUp);
|
||||
useEventListener(document, 'keydown', onKeydown);
|
||||
|
||||
onMounted(() => {
|
||||
resolveTeleportTarget();
|
||||
if (import.meta.env.DEV && onClose && typeof onClose === 'function') {
|
||||
// eslint-disable-next-line no-console
|
||||
console.warn(
|
||||
@@ -68,36 +88,38 @@ onMounted(() => {
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<transition name="modal-fade">
|
||||
<div
|
||||
v-if="show"
|
||||
:class="modalClassName"
|
||||
transition="modal"
|
||||
@mousedown="handleMouseDown"
|
||||
>
|
||||
<Teleport v-if="teleportTarget" :to="teleportTarget">
|
||||
<transition name="modal-fade">
|
||||
<div
|
||||
class="relative max-h-full overflow-auto bg-n-alpha-3 shadow-md modal-container rtl:text-right skip-context-menu"
|
||||
:class="{
|
||||
'rounded-xl w-[37.5rem]': !fullWidth,
|
||||
'items-center rounded-none flex h-full justify-center w-full':
|
||||
fullWidth,
|
||||
[size]: true,
|
||||
}"
|
||||
@mouse.stop
|
||||
@mousedown="event => event.stopPropagation()"
|
||||
v-if="show"
|
||||
:class="modalClassName"
|
||||
transition="modal"
|
||||
@mousedown="handleMouseDown"
|
||||
>
|
||||
<Button
|
||||
v-if="showCloseButton"
|
||||
ghost
|
||||
slate
|
||||
icon="i-lucide-x"
|
||||
class="absolute z-10 ltr:right-2 rtl:left-2 top-2"
|
||||
@click="close"
|
||||
/>
|
||||
<slot />
|
||||
<div
|
||||
class="relative max-h-full overflow-auto bg-n-alpha-3 shadow-md modal-container rtl:text-right skip-context-menu"
|
||||
:class="{
|
||||
'rounded-xl w-[37.5rem]': !fullWidth,
|
||||
'items-center rounded-none flex h-full justify-center w-full':
|
||||
fullWidth,
|
||||
[size]: true,
|
||||
}"
|
||||
@mouse.stop
|
||||
@mousedown="event => event.stopPropagation()"
|
||||
>
|
||||
<Button
|
||||
v-if="showCloseButton"
|
||||
ghost
|
||||
slate
|
||||
icon="i-lucide-x"
|
||||
class="absolute z-10 ltr:right-2 rtl:left-2 top-2"
|
||||
@click="close"
|
||||
/>
|
||||
<slot />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</transition>
|
||||
</transition>
|
||||
</Teleport>
|
||||
</template>
|
||||
|
||||
<style lang="scss">
|
||||
|
||||
@@ -89,6 +89,7 @@ const props = defineProps({
|
||||
// are triggered except when this flag is true
|
||||
allowSignature: { type: Boolean, default: false },
|
||||
channelType: { type: String, default: '' },
|
||||
forceSignature: { type: Boolean, default: false },
|
||||
conversationId: { type: Number, default: null },
|
||||
medium: { type: String, default: '' },
|
||||
showImageResizeToolbar: { type: Boolean, default: false }, // A kill switch to show or hide the image toolbar
|
||||
@@ -313,6 +314,10 @@ 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.forceSignature && props.allowSignature && !props.isPrivate) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (props.allowSignature && !props.isPrivate && props.channelType) {
|
||||
return fetchSignatureFlagFromUISettings(props.channelType);
|
||||
}
|
||||
@@ -564,10 +569,14 @@ function updateImgToolbarOnDelete() {
|
||||
}
|
||||
|
||||
function isEnterToSendEnabled() {
|
||||
// eslint-disable-next-line no-underscore-dangle
|
||||
if (window.__WOOT_ISOLATED_SHELL__) return false;
|
||||
return isEditorHotKeyEnabled('enter');
|
||||
}
|
||||
|
||||
function isCmdPlusEnterToSendEnabled() {
|
||||
// eslint-disable-next-line no-underscore-dangle
|
||||
if (window.__WOOT_ISOLATED_SHELL__) return true;
|
||||
return isEditorHotKeyEnabled('cmd_enter');
|
||||
}
|
||||
|
||||
@@ -811,7 +820,7 @@ watch(sendWithSignature, newValue => {
|
||||
}
|
||||
});
|
||||
|
||||
onMounted(() => {
|
||||
onMounted(async () => {
|
||||
// [VITE] state assignment was done in created before
|
||||
state = createState(
|
||||
props.modelValue,
|
||||
@@ -823,7 +832,10 @@ onMounted(() => {
|
||||
|
||||
createEditorView();
|
||||
editorView.updateState(state);
|
||||
if (props.focusOnMount) {
|
||||
// TODO: test this in the main app
|
||||
if (sendWithSignature.value) {
|
||||
addSignature();
|
||||
} else if (props.focusOnMount) {
|
||||
focusEditorInputField();
|
||||
}
|
||||
});
|
||||
@@ -917,6 +929,10 @@ useEmitter(BUS_EVENTS.INSERT_INTO_RICH_EDITOR, insertContentIntoEditor);
|
||||
.ProseMirror-menubar-wrapper {
|
||||
@apply flex flex-col gap-3;
|
||||
|
||||
.ProseMirror-menubar:empty {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.ProseMirror-menubar {
|
||||
min-height: 1.25rem !important;
|
||||
@apply items-center gap-4 flex pb-0 bg-transparent text-n-slate-11 relative ltr:-left-[3px] rtl:-right-[3px];
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
import { computed, useTemplateRef } from 'vue';
|
||||
import { useElementSize } from '@vueuse/core';
|
||||
import { REPLY_EDITOR_MODES } from './constants';
|
||||
import Icon from 'next/icon/Icon.vue';
|
||||
|
||||
const props = defineProps({
|
||||
mode: {
|
||||
@@ -12,6 +13,10 @@ const props = defineProps({
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
iconOnly: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
isReplyRestricted: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
@@ -69,22 +74,34 @@ const translateValue = computed(() => {
|
||||
|
||||
<template>
|
||||
<button
|
||||
class="flex items-center w-auto h-8 p-1 transition-all border rounded-full bg-n-alpha-2 group relative duration-300 ease-in-out z-0 active:scale-[0.995] active:duration-75"
|
||||
class="flex items-center w-auto p-1 transition-all border rounded-full bg-n-alpha-2 group relative duration-300 ease-in-out z-0 active:scale-[0.995] active:duration-75"
|
||||
:disabled="disabled || isReplyRestricted"
|
||||
:class="{
|
||||
'h-7': iconOnly,
|
||||
'h-8': !iconOnly,
|
||||
'cursor-not-allowed': disabled || isReplyRestricted,
|
||||
}"
|
||||
@click="$emit('toggleMode')"
|
||||
>
|
||||
<div ref="wootEditorReplyMode" class="flex items-center gap-1 px-2 z-20">
|
||||
{{ $t('CONVERSATION.REPLYBOX.REPLY') }}
|
||||
<div
|
||||
ref="wootEditorReplyMode"
|
||||
class="flex items-center gap-1 px-2 z-20 text-n-slate-11"
|
||||
>
|
||||
<Icon v-if="iconOnly" icon="i-lucide-message-circle" class="size-4" />
|
||||
<template v-else>{{ $t('CONVERSATION.REPLYBOX.REPLY') }}</template>
|
||||
</div>
|
||||
<div ref="wootEditorPrivateMode" class="flex items-center gap-1 px-2 z-20">
|
||||
{{ $t('CONVERSATION.REPLYBOX.PRIVATE_NOTE') }}
|
||||
<div
|
||||
ref="wootEditorPrivateMode"
|
||||
class="flex items-center gap-1 px-2 z-20 text-n-slate-11"
|
||||
>
|
||||
<Icon v-if="iconOnly" icon="i-lucide-lock-keyhole" class="size-4" />
|
||||
<template v-else>{{ $t('CONVERSATION.REPLYBOX.PRIVATE_NOTE') }}</template>
|
||||
</div>
|
||||
<div
|
||||
class="absolute shadow-sm rounded-full h-6 w-[var(--chip-width)] ease-in-out translate-x-[var(--translate-x)] rtl:translate-x-[var(--rtl-translate-x)] bg-n-solid-1"
|
||||
:class="{
|
||||
'h-5': iconOnly,
|
||||
'h-6': !iconOnly,
|
||||
'transition-all duration-300': !disabled && !isReplyRestricted,
|
||||
}"
|
||||
:style="{
|
||||
|
||||
@@ -114,6 +114,11 @@ export default {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
allowSignature: { type: Boolean, default: false },
|
||||
allowEmoji: { type: Boolean, default: false },
|
||||
allowVideoCall: { type: Boolean, default: false },
|
||||
allowFileUpload: { type: Boolean, default: false },
|
||||
allowAudioRecorder: { type: Boolean, default: false },
|
||||
showQuotedReplyToggle: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
@@ -291,7 +296,7 @@ export default {
|
||||
<div class="flex justify-between p-3" :class="wrapClass">
|
||||
<div class="left-wrap">
|
||||
<NextButton
|
||||
v-if="!isEditorDisabled"
|
||||
v-if="allowEmoji && !isEditorDisabled"
|
||||
v-tooltip.top-end="$t('CONVERSATION.REPLYBOX.TIP_EMOJI_ICON')"
|
||||
icon="i-ph-smiley-sticker"
|
||||
slate
|
||||
@@ -300,7 +305,7 @@ export default {
|
||||
@click="toggleEmojiPicker"
|
||||
/>
|
||||
<FileUpload
|
||||
v-if="showAttachButton"
|
||||
v-if="showAttachButton && allowFileUpload"
|
||||
ref="uploadRef"
|
||||
v-tooltip.top-end="$t('CONVERSATION.REPLYBOX.TIP_ATTACH_ICON')"
|
||||
input-id="conversationAttachment"
|
||||
@@ -325,7 +330,7 @@ export default {
|
||||
/>
|
||||
</FileUpload>
|
||||
<NextButton
|
||||
v-if="showAudioRecorderButton"
|
||||
v-if="allowAudioRecorder && showAudioRecorderButton"
|
||||
v-tooltip.top-end="$t('CONVERSATION.REPLYBOX.TIP_AUDIORECORDER_ICON')"
|
||||
:icon="!isRecordingAudio ? 'i-ph-microphone' : 'i-ph-microphone-slash'"
|
||||
slate
|
||||
@@ -334,7 +339,7 @@ export default {
|
||||
@click="toggleAudioRecorder"
|
||||
/>
|
||||
<NextButton
|
||||
v-if="showAudioPlayStopButton"
|
||||
v-if="allowAudioRecorder && showAudioPlayStopButton"
|
||||
:icon="audioRecorderPlayStopIcon"
|
||||
slate
|
||||
faded
|
||||
@@ -343,7 +348,7 @@ export default {
|
||||
@click="toggleAudioRecorderPlayPause"
|
||||
/>
|
||||
<NextButton
|
||||
v-if="showMessageSignatureButton"
|
||||
v-if="showMessageSignatureButton && allowSignature"
|
||||
v-tooltip.top-end="signatureToggleTooltip"
|
||||
icon="i-ph-signature"
|
||||
slate
|
||||
@@ -381,6 +386,7 @@ export default {
|
||||
/>
|
||||
<VideoCallButton
|
||||
v-if="
|
||||
allowVideoCall &&
|
||||
(isAWebWidgetInbox || isAPIInbox) &&
|
||||
!isOnPrivateNote &&
|
||||
!isEditorDisabled
|
||||
|
||||
@@ -25,6 +25,10 @@ export default {
|
||||
type: String,
|
||||
default: REPLY_EDITOR_MODES.REPLY,
|
||||
},
|
||||
disablePopout: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
isReplyRestricted: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
|
||||
@@ -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>
|
||||
@@ -253,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;
|
||||
}
|
||||
@@ -548,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);
|
||||
@@ -609,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,
|
||||
|
||||
@@ -9,6 +9,7 @@ import { useImageZoom } from 'dashboard/composables/useImageZoom';
|
||||
import { messageTimestamp } from 'shared/helpers/timeHelper';
|
||||
import { downloadFile } from '@chatwoot/utils';
|
||||
|
||||
import WootModal from 'dashboard/components/Modal.vue';
|
||||
import NextButton from 'dashboard/components-next/button/Button.vue';
|
||||
import Avatar from 'next/avatar/Avatar.vue';
|
||||
import TeleportWithDirection from 'dashboard/components-next/TeleportWithDirection.vue';
|
||||
@@ -168,7 +169,7 @@ onMounted(() => {
|
||||
|
||||
<template>
|
||||
<TeleportWithDirection to="body">
|
||||
<woot-modal
|
||||
<WootModal
|
||||
v-model:show="show"
|
||||
full-width
|
||||
:show-close-button="false"
|
||||
@@ -211,7 +212,7 @@ onMounted(() => {
|
||||
</div>
|
||||
|
||||
<div
|
||||
class="flex-1 mx-2 px-2 truncate text-sm font-medium text-center text-n-slate-12"
|
||||
class="flex-1 mx-2 px-2 truncate text-sm font-medium text-center text-n-slate-12 hidden sm:block"
|
||||
>
|
||||
<span v-dompurify-html="fileNameFromDataUrl" class="truncate" />
|
||||
</div>
|
||||
@@ -353,6 +354,6 @@ onMounted(() => {
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
</woot-modal>
|
||||
</WootModal>
|
||||
</TeleportWithDirection>
|
||||
</template>
|
||||
|
||||
@@ -2,6 +2,12 @@ import { computed, unref } from 'vue';
|
||||
import { getCurrentInstance } from 'vue';
|
||||
|
||||
export const useStore = () => {
|
||||
// eslint-disable-next-line no-underscore-dangle
|
||||
if (window.__CHATWOOT_STORE__) {
|
||||
// eslint-disable-next-line no-underscore-dangle
|
||||
return window.__CHATWOOT_STORE__;
|
||||
}
|
||||
|
||||
const vm = getCurrentInstance();
|
||||
if (!vm) throw new Error('must be called in setup');
|
||||
return vm.proxy.$store;
|
||||
|
||||
@@ -11,7 +11,12 @@ export function useAccount() {
|
||||
* Computed property for the current account ID.
|
||||
* @type {import('vue').ComputedRef<number>}
|
||||
*/
|
||||
const route = useRoute();
|
||||
// In the isolated shell (react-components / Web Component context),
|
||||
// vue-router is not available. Fall back to the global variable.
|
||||
// eslint-disable-next-line no-underscore-dangle
|
||||
const isIsolatedShell = !!window.__WOOT_ISOLATED_SHELL__;
|
||||
const route = isIsolatedShell ? null : useRoute();
|
||||
|
||||
const store = useStore();
|
||||
const getAccountFn = useMapGetter('accounts/getAccount');
|
||||
const isOnChatwootCloud = useMapGetter('globalConfig/isOnChatwootCloud');
|
||||
@@ -20,6 +25,10 @@ export function useAccount() {
|
||||
);
|
||||
|
||||
const accountId = computed(() => {
|
||||
if (isIsolatedShell) {
|
||||
// eslint-disable-next-line no-underscore-dangle
|
||||
return Number(window.__WOOT_ACCOUNT_ID__);
|
||||
}
|
||||
return Number(route.params.accountId);
|
||||
});
|
||||
const currentAccount = computed(() => getAccountFn.value(accountId.value));
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -10,7 +10,10 @@ const { isImpersonating } = useImpersonation();
|
||||
class ActionCableConnector extends BaseActionCableConnector {
|
||||
constructor(app, pubsubToken) {
|
||||
const { websocketURL = '' } = window.chatwootConfig || {};
|
||||
super(app, pubsubToken, websocketURL);
|
||||
|
||||
// eslint-disable-next-line no-underscore-dangle
|
||||
const wsURL = websocketURL || window.__WEBSOCKET_URL__ || '';
|
||||
super(app, pubsubToken, wsURL);
|
||||
this.CancelTyping = [];
|
||||
this.events = {
|
||||
'message.created': this.onMessageCreated,
|
||||
@@ -98,7 +101,10 @@ class ActionCableConnector extends BaseActionCableConnector {
|
||||
conversation: { last_activity_at: lastActivityAt },
|
||||
conversation_id: conversationId,
|
||||
} = data;
|
||||
DashboardAudioNotificationHelper.onNewMessage(data);
|
||||
// eslint-disable-next-line no-underscore-dangle
|
||||
if (!window.__WOOT_ISOLATED_SHELL__) {
|
||||
DashboardAudioNotificationHelper.onNewMessage(data);
|
||||
}
|
||||
this.app.$store.dispatch('addMessage', data);
|
||||
this.app.$store.dispatch('updateConversationLastActivity', {
|
||||
lastActivityAt,
|
||||
|
||||
@@ -1,18 +1,6 @@
|
||||
/* eslint no-param-reassign: 0 */
|
||||
|
||||
import getUuid from 'widget/helpers/uuid';
|
||||
import { MESSAGE_STATUS, MESSAGE_TYPE } from 'shared/constants/messages';
|
||||
|
||||
export default () => {
|
||||
if (!Array.prototype.last) {
|
||||
Object.assign(Array.prototype, {
|
||||
last() {
|
||||
return this[this.length - 1];
|
||||
},
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export const isEmptyObject = obj =>
|
||||
Object.keys(obj).length === 0 && obj.constructor === Object;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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', () => {
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -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,20 +140,20 @@
|
||||
},
|
||||
"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)"
|
||||
},
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -710,21 +710,9 @@
|
||||
"MESSENGER_SUB_HEAD": "ضع هذا الكود داخل وسم الـ body في موقعك",
|
||||
"ALLOWED_DOMAINS": {
|
||||
"TITLE": "Allowed Domains",
|
||||
"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).",
|
||||
"SUBTITLE": "Add wildcard or regular domains separated by commas (leave blank to allow all), e.g. *.chatwoot.dev, chatwoot.com.",
|
||||
"PLACEHOLDER": "example.com, www.example.com, app.example.com"
|
||||
},
|
||||
"ALLOW_MOBILE_WEBVIEW": {
|
||||
"LABEL": "Enable widget in mobile apps",
|
||||
"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",
|
||||
"DESCRIPTION": "Verify user authenticity by generating secure tokens. This prevents unauthorized users from impersonating others in your chat.",
|
||||
"SECRET_KEY": "Secret Key",
|
||||
"VIEW_DOCS": "View documentation",
|
||||
"REQUIRE_LABEL": "Require identity validation for all conversations",
|
||||
"REQUIRE_DESCRIPTION": "When enabled, users must provide a valid identity token to start conversations. Requests without valid tokens will be rejected."
|
||||
},
|
||||
"INBOX_AGENTS": "وكيل الدعم",
|
||||
"INBOX_AGENTS_SUB_TEXT": "إضافة أو إزالة وكلاء من صندوق الوارد هذا",
|
||||
"AGENT_ASSIGNMENT": "تعيين المحادثة",
|
||||
|
||||
@@ -527,8 +527,7 @@
|
||||
"TITLE": "الخصائص",
|
||||
"ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations",
|
||||
"ALLOW_MEMORIES": "Capture key details as memories from customer interactions.",
|
||||
"ALLOW_CITATIONS": "Include source citations in responses",
|
||||
"ALLOW_CONTACT_ATTRIBUTES": "Allow access to contact information"
|
||||
"ALLOW_CITATIONS": "Include source citations in responses"
|
||||
}
|
||||
},
|
||||
"EDIT": {
|
||||
|
||||
@@ -1,31 +1,31 @@
|
||||
{
|
||||
"CONTACT_PANEL": {
|
||||
"NOT_AVAILABLE": "Mövcud deyil",
|
||||
"NOT_AVAILABLE": "Not Available",
|
||||
"EMAIL_ADDRESS": "Email Address",
|
||||
"PHONE_NUMBER": "Telefon nömrəsi",
|
||||
"PHONE_NUMBER": "Phone number",
|
||||
"IDENTIFIER": "Identifier",
|
||||
"COPY_SUCCESSFUL": "Copied to clipboard successfully",
|
||||
"COMPANY": "Şirkət",
|
||||
"LOCATION": "Yer",
|
||||
"COMPANY": "Company",
|
||||
"LOCATION": "Location",
|
||||
"BROWSER_LANGUAGE": "Browser Language",
|
||||
"CONVERSATION_TITLE": "Conversation Details",
|
||||
"VIEW_PROFILE": "View Profile",
|
||||
"BROWSER": "Browser",
|
||||
"OS": "Əməliyyat Sistemi",
|
||||
"INITIATED_FROM": "Başlanğıc yeri",
|
||||
"INITIATED_AT": "Başlanğıc vaxtı",
|
||||
"IP_ADDRESS": "IP ünvanı",
|
||||
"CREATED_AT_LABEL": "Yaradılıb",
|
||||
"OS": "Operating System",
|
||||
"INITIATED_FROM": "Initiated from",
|
||||
"INITIATED_AT": "Initiated at",
|
||||
"IP_ADDRESS": "IP Address",
|
||||
"CREATED_AT_LABEL": "Created",
|
||||
"NEW_MESSAGE": "New message",
|
||||
"CALL": "Zəng et",
|
||||
"CALL": "Call",
|
||||
"CALL_INITIATED": "Calling the contact…",
|
||||
"CALL_FAILED": "Unable to start the call. Please try again.",
|
||||
"VOICE_INBOX_PICKER": {
|
||||
"TITLE": "Choose a voice inbox"
|
||||
},
|
||||
"CONVERSATIONS": {
|
||||
"NO_RECORDS_FOUND": "Bu əlaqə ilə bağlı əvvəlki söhbətlər yoxdur.",
|
||||
"TITLE": "Əvvəlki Söhbətlər"
|
||||
"NO_RECORDS_FOUND": "There are no previous conversations associated to this contact.",
|
||||
"TITLE": "Previous Conversations"
|
||||
},
|
||||
"LABELS": {
|
||||
"CONTACT": {
|
||||
@@ -44,23 +44,23 @@
|
||||
}
|
||||
},
|
||||
"MERGE_CONTACT": "Merge contact",
|
||||
"CONTACT_ACTIONS": "Əlaqə əməliyyatları",
|
||||
"CONTACT_ACTIONS": "Contact actions",
|
||||
"MUTE_CONTACT": "Block Contact",
|
||||
"UNMUTE_CONTACT": "Unblock Contact",
|
||||
"MUTED_SUCCESS": "This contact is blocked successfully. You will not be notified of any future conversations.",
|
||||
"UNMUTED_SUCCESS": "Bu əlaqənin bloku uğurla açıldı.",
|
||||
"SEND_TRANSCRIPT": "Mətni Göndər",
|
||||
"EDIT_LABEL": "Redaktə et",
|
||||
"UNMUTED_SUCCESS": "This contact is unblocked successfully.",
|
||||
"SEND_TRANSCRIPT": "Send Transcript",
|
||||
"EDIT_LABEL": "Edit",
|
||||
"SIDEBAR_SECTIONS": {
|
||||
"CUSTOM_ATTRIBUTES": "Custom Attributes",
|
||||
"CONTACT_LABELS": "Contact Labels",
|
||||
"PREVIOUS_CONVERSATIONS": "Əvvəlki Söhbətlər",
|
||||
"PREVIOUS_CONVERSATIONS": "Previous Conversations",
|
||||
"NO_RECORDS_FOUND": "No attributes found"
|
||||
}
|
||||
},
|
||||
"EDIT_CONTACT": {
|
||||
"BUTTON_LABEL": "Əlaqəni redaktə et",
|
||||
"TITLE": "Əlaqəni redaktə et",
|
||||
"BUTTON_LABEL": "Edit Contact",
|
||||
"TITLE": "Edit contact",
|
||||
"DESC": "Edit contact details"
|
||||
},
|
||||
"DELETE_CONTACT": {
|
||||
@@ -71,23 +71,23 @@
|
||||
"TITLE": "Confirm Deletion",
|
||||
"MESSAGE": "Are you sure to delete ",
|
||||
"YES": "Yes, Delete",
|
||||
"NO": "Xeyr, Saxla"
|
||||
"NO": "No, Keep"
|
||||
},
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "Contact deleted successfully",
|
||||
"ERROR_MESSAGE": "Əlaqəni silmək mümkün olmadı. Zəhmət olmasa, bir az sonra yenidən cəhd edin."
|
||||
"ERROR_MESSAGE": "Could not delete contact. Please try again later."
|
||||
}
|
||||
},
|
||||
"CONTACT_FORM": {
|
||||
"FORM": {
|
||||
"SUBMIT": "Submit",
|
||||
"CANCEL": "Ləğv et",
|
||||
"CANCEL": "Cancel",
|
||||
"AVATAR": {
|
||||
"LABEL": "Contact Avatar"
|
||||
},
|
||||
"NAME": {
|
||||
"PLACEHOLDER": "Əlaqənin tam adını daxil edin",
|
||||
"LABEL": "Tam Ad"
|
||||
"PLACEHOLDER": "Enter the full name of the contact",
|
||||
"LABEL": "Full Name"
|
||||
},
|
||||
"BIO": {
|
||||
"PLACEHOLDER": "Enter the bio of the contact",
|
||||
@@ -100,30 +100,30 @@
|
||||
"ERROR": "Please enter a valid email address."
|
||||
},
|
||||
"PHONE_NUMBER": {
|
||||
"PLACEHOLDER": "Əlaqə şəxsin telefon nömrəsini daxil edin",
|
||||
"LABEL": "Telefon nömrəsi",
|
||||
"HELP": "Telefon nömrəsi E.164 formatında olmalıdır, məsələn: +1415555555. Ölkə kodunu siyahıdan seçə bilərsiniz.",
|
||||
"ERROR": "Telefon nömrəsi ya boş olmalıdır, ya da E.164 formatında olmalıdır",
|
||||
"DIAL_CODE_ERROR": "Zəhmət olmasa siyahıdan kodu seçin",
|
||||
"DUPLICATE": "Bu telefon nömrəsi başqa bir əlaqə üçün istifadə olunur."
|
||||
"PLACEHOLDER": "Enter the phone number of the contact",
|
||||
"LABEL": "Phone Number",
|
||||
"HELP": "Phone number should be of E.164 format eg: +1415555555 [+][country code][area code][local phone number]. You can select the dial code from the dropdown.",
|
||||
"ERROR": "Phone number should be either empty or of E.164 format",
|
||||
"DIAL_CODE_ERROR": "Please select a dial code from the list",
|
||||
"DUPLICATE": "This phone number is in use for another contact."
|
||||
},
|
||||
"LOCATION": {
|
||||
"PLACEHOLDER": "Əlaqə yerini daxil edin",
|
||||
"LABEL": "Yer"
|
||||
"PLACEHOLDER": "Enter the location of the contact",
|
||||
"LABEL": "Location"
|
||||
},
|
||||
"COMPANY_NAME": {
|
||||
"PLACEHOLDER": "Şirkət adını daxil edin",
|
||||
"PLACEHOLDER": "Enter the company name",
|
||||
"LABEL": "Company Name"
|
||||
},
|
||||
"COUNTRY": {
|
||||
"PLACEHOLDER": "Ölkə adını daxil edin",
|
||||
"PLACEHOLDER": "Enter the country name",
|
||||
"LABEL": "Country Name",
|
||||
"SELECT_PLACEHOLDER": "Seçin",
|
||||
"REMOVE": "Sil",
|
||||
"SELECT_COUNTRY": "Ölkəni seçin"
|
||||
"SELECT_PLACEHOLDER": "Select",
|
||||
"REMOVE": "Remove",
|
||||
"SELECT_COUNTRY": "Select Country"
|
||||
},
|
||||
"CITY": {
|
||||
"PLACEHOLDER": "Şəhərin adını daxil edin",
|
||||
"PLACEHOLDER": "Enter the city name",
|
||||
"LABEL": "City Name"
|
||||
},
|
||||
"SOCIAL_PROFILES": {
|
||||
@@ -155,23 +155,23 @@
|
||||
"ERROR_MESSAGE": "There was an error, please try again"
|
||||
},
|
||||
"NEW_CONVERSATION": {
|
||||
"BUTTON_LABEL": "Söhbətə başla",
|
||||
"TITLE": "Yeni söhbət",
|
||||
"BUTTON_LABEL": "Start conversation",
|
||||
"TITLE": "New conversation",
|
||||
"DESC": "Start a new conversation by sending a new message.",
|
||||
"NO_INBOX": "Couldn't find an inbox to initiate a new conversation with this contact.",
|
||||
"FORM": {
|
||||
"TO": {
|
||||
"LABEL": "Kimə"
|
||||
"LABEL": "To"
|
||||
},
|
||||
"INBOX": {
|
||||
"LABEL": "Via Inbox",
|
||||
"PLACEHOLDER": "Choose source inbox",
|
||||
"ERROR": "Bir qutu seçin"
|
||||
"ERROR": "Select an inbox"
|
||||
},
|
||||
"SUBJECT": {
|
||||
"LABEL": "Mövzu",
|
||||
"PLACEHOLDER": "Mövzu",
|
||||
"ERROR": "Mövzu boş ola bilməz"
|
||||
"LABEL": "Subject",
|
||||
"PLACEHOLDER": "Subject",
|
||||
"ERROR": "Subject can't be empty"
|
||||
},
|
||||
"MESSAGE": {
|
||||
"LABEL": "Message",
|
||||
@@ -183,10 +183,10 @@
|
||||
"HELP_TEXT": "Drag and drop files here or choose files to attach"
|
||||
},
|
||||
"SUBMIT": "Send message",
|
||||
"CANCEL": "Ləğv et",
|
||||
"CANCEL": "Cancel",
|
||||
"SUCCESS_MESSAGE": "Message sent!",
|
||||
"GO_TO_CONVERSATION": "Bax",
|
||||
"ERROR_MESSAGE": "Göndərmək mümkün olmadı! yenidən cəhd et"
|
||||
"GO_TO_CONVERSATION": "View",
|
||||
"ERROR_MESSAGE": "Couldn't send! try again"
|
||||
}
|
||||
},
|
||||
"CONTACTS_PAGE": {
|
||||
@@ -204,7 +204,7 @@
|
||||
"ACTIONS": {
|
||||
"COPY": "Copy attribute",
|
||||
"DELETE": "Delete attribute",
|
||||
"EDIT": "Xüsusiyyəti redaktə et"
|
||||
"EDIT": "Edit attribute"
|
||||
},
|
||||
"ADD": {
|
||||
"TITLE": "Create custom attribute",
|
||||
@@ -212,7 +212,7 @@
|
||||
},
|
||||
"FORM": {
|
||||
"CREATE": "Add attribute",
|
||||
"CANCEL": "Ləğv et",
|
||||
"CANCEL": "Cancel",
|
||||
"NAME": {
|
||||
"LABEL": "Custom attribute name",
|
||||
"PLACEHOLDER": "Eg: shopify id",
|
||||
@@ -220,12 +220,12 @@
|
||||
},
|
||||
"VALUE": {
|
||||
"LABEL": "Attribute value",
|
||||
"PLACEHOLDER": "Məsələn: 11901 "
|
||||
"PLACEHOLDER": "Eg: 11901 "
|
||||
},
|
||||
"ADD": {
|
||||
"TITLE": "Create new attribute ",
|
||||
"SUCCESS": "Xüsusiyyət uğurla əlavə edildi",
|
||||
"ERROR": "Xüsusiyyəti əlavə etmək mümkün olmadı. Zəhmət olmasa, bir az sonra yenidən cəhd edin"
|
||||
"SUCCESS": "Attribute added successfully",
|
||||
"ERROR": "Unable to add attribute. Please try again later"
|
||||
},
|
||||
"UPDATE": {
|
||||
"SUCCESS": "Attribute updated successfully",
|
||||
@@ -236,52 +236,52 @@
|
||||
"ERROR": "Unable to delete attribute. Please try again later"
|
||||
},
|
||||
"ATTRIBUTE_SELECT": {
|
||||
"TITLE": "Xüsusiyyətlər əlavə et",
|
||||
"TITLE": "Add attributes",
|
||||
"PLACEHOLDER": "Search attributes",
|
||||
"NO_RESULT": "No attributes found"
|
||||
},
|
||||
"ATTRIBUTE_TYPE": {
|
||||
"LIST": {
|
||||
"PLACEHOLDER": "Dəyəri seçin",
|
||||
"PLACEHOLDER": "Select value",
|
||||
"SEARCH_INPUT_PLACEHOLDER": "Search value",
|
||||
"NO_RESULT": "No result found"
|
||||
}
|
||||
}
|
||||
},
|
||||
"VALIDATIONS": {
|
||||
"REQUIRED": "Düzgün dəyər tələb olunur",
|
||||
"INVALID_URL": "Yanlış URL",
|
||||
"INVALID_INPUT": "Yanlış Giriş"
|
||||
"REQUIRED": "Valid value is required",
|
||||
"INVALID_URL": "Invalid URL",
|
||||
"INVALID_INPUT": "Invalid Input"
|
||||
}
|
||||
},
|
||||
"MERGE_CONTACTS": {
|
||||
"TITLE": "Merge contacts",
|
||||
"DESCRIPTION": "İki profili bütün atributlar və söhbətlər daxil olmaqla birləşdirərək əlaqələri birləşdirin. Ziddiyyət olduqda, Əsas əlaqənin atributları üstünlük təşkil edəcək.",
|
||||
"DESCRIPTION": "Merge contacts to combine two profiles into one, including all attributes and conversations. In case of conflict, the Primary contact’s attributes will take precedence.",
|
||||
"PRIMARY": {
|
||||
"TITLE": "Əsas əlaqə",
|
||||
"TITLE": "Primary contact",
|
||||
"HELP_LABEL": "To be deleted"
|
||||
},
|
||||
"PARENT": {
|
||||
"TITLE": "Contact to merge",
|
||||
"PLACEHOLDER": "Əlaqə axtar",
|
||||
"PLACEHOLDER": "Search for a contact",
|
||||
"HELP_LABEL": "To be kept"
|
||||
},
|
||||
"SUMMARY": {
|
||||
"TITLE": "Yekun",
|
||||
"TITLE": "Summary",
|
||||
"DELETE_WARNING": "Contact of <strong>{primaryContactName}</strong> will be deleted.",
|
||||
"ATTRIBUTE_WARNING": "Contact details of <strong>{primaryContactName}</strong> will be copied to <strong>{parentContactName}</strong>."
|
||||
},
|
||||
"SEARCH": {
|
||||
"ERROR_MESSAGE": "Nəsə səhv getdi. Zəhmət olmasa, bir az sonra yenidən cəhd edin."
|
||||
"ERROR_MESSAGE": "Something went wrong. Please try again later."
|
||||
},
|
||||
"FORM": {
|
||||
"SUBMIT": " Merge contacts",
|
||||
"CANCEL": "Ləğv et",
|
||||
"CANCEL": "Cancel",
|
||||
"CHILD_CONTACT": {
|
||||
"ERROR": "Birləşdirmək üçün alt əlaqəni seçin"
|
||||
"ERROR": "Select a child contact to merge"
|
||||
},
|
||||
"SUCCESS_MESSAGE": "Contact merged successfully",
|
||||
"ERROR_MESSAGE": "Əlaqələri birləşdirmək mümkün olmadı, yenidən cəhd edin!"
|
||||
"ERROR_MESSAGE": "Could not merge contacts, try again!"
|
||||
},
|
||||
"DROPDOWN_ITEM": {
|
||||
"ID": "(ID: {identifier})"
|
||||
@@ -289,68 +289,68 @@
|
||||
},
|
||||
"CONTACTS_LAYOUT": {
|
||||
"HEADER": {
|
||||
"TITLE": "Əlaqələr",
|
||||
"SEARCH_TITLE": "Əlaqələrdə axtarış",
|
||||
"ACTIVE_TITLE": "Aktiv əlaqələr",
|
||||
"SEARCH_PLACEHOLDER": "Axtarış...",
|
||||
"TITLE": "Contacts",
|
||||
"SEARCH_TITLE": "Search contacts",
|
||||
"ACTIVE_TITLE": "Active contacts",
|
||||
"SEARCH_PLACEHOLDER": "Search...",
|
||||
"MESSAGE_BUTTON": "Message",
|
||||
"SEND_MESSAGE": "Send message",
|
||||
"BLOCK_CONTACT": "Block contact",
|
||||
"UNBLOCK_CONTACT": "Unblock contact",
|
||||
"BREADCRUMB": {
|
||||
"CONTACTS": "Əlaqələr"
|
||||
"CONTACTS": "Contacts"
|
||||
},
|
||||
"ACTIONS": {
|
||||
"CONTACT_CREATION": {
|
||||
"ADD_CONTACT": "Əlaqə əlavə et",
|
||||
"EXPORT_CONTACT": "Əlaqələri ixrac et",
|
||||
"IMPORT_CONTACT": "Əlaqələri idxal et",
|
||||
"SAVE_CONTACT": "Əlaqəni yadda saxla",
|
||||
"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": "Bu telefon nömrəsi başqa bir əlaqə üçün istifadə olunur.",
|
||||
"PHONE_NUMBER_DUPLICATE": "This phone number is in use for another contact.",
|
||||
"SUCCESS_MESSAGE": "Contact saved successfully",
|
||||
"ERROR_MESSAGE": "Əlaqəni saxlamaq mümkün olmadı. Zəhmət olmasa sonra yenidən cəhd edin."
|
||||
"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": "Bu əlaqənin bloku uğurla açıldı",
|
||||
"UNBLOCK_SUCCESS_MESSAGE": "This contact is unblocked successfully",
|
||||
"UNBLOCK_ERROR_MESSAGE": "Unable to unblock contact. Please try again later.",
|
||||
"IMPORT_CONTACT": {
|
||||
"TITLE": "Əlaqələri idxal et",
|
||||
"DESCRIPTION": "Əlaqələri CSV faylı vasitəsilə idxal edin.",
|
||||
"TITLE": "Import contacts",
|
||||
"DESCRIPTION": "Import contacts through a CSV file.",
|
||||
"DOWNLOAD_LABEL": "Download a sample csv.",
|
||||
"LABEL": "CSV faylı:",
|
||||
"CHOOSE_FILE": "Fayl seçin",
|
||||
"CHANGE": "Dəyiş",
|
||||
"CANCEL": "Ləğv et",
|
||||
"IMPORT": "İdxal et",
|
||||
"SUCCESS_MESSAGE": "İdxal bitdikdə sizə elektron bildiriş göndəriləcək.",
|
||||
"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": "Əlaqələri ixrac et",
|
||||
"TITLE": "Export contacts",
|
||||
"DESCRIPTION": "Quickly export a csv file with comprehensive details of your contacts",
|
||||
"CONFIRM": "İxrac et",
|
||||
"SUCCESS_MESSAGE": "İxrac davam edir. Fayl hazır olanda sizə elektron bildiriş göndəriləcək.",
|
||||
"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": "Sırala",
|
||||
"LABEL": "Sort by",
|
||||
"OPTIONS": {
|
||||
"NAME": "Ad",
|
||||
"EMAIL": "Elektron poçt",
|
||||
"PHONE_NUMBER": "Telefon nömrəsi",
|
||||
"COMPANY": "Şirkət",
|
||||
"COUNTRY": "Ölkə",
|
||||
"CITY": "Şəhər",
|
||||
"LAST_ACTIVITY": "Son fəaliyyət",
|
||||
"NAME": "Name",
|
||||
"EMAIL": "Email",
|
||||
"PHONE_NUMBER": "Phone number",
|
||||
"COMPANY": "Company",
|
||||
"COUNTRY": "Country",
|
||||
"CITY": "City",
|
||||
"LAST_ACTIVITY": "Last activity",
|
||||
"CREATED_AT": "Created at"
|
||||
}
|
||||
},
|
||||
"ORDER": {
|
||||
"LABEL": "Ordering",
|
||||
"OPTIONS": {
|
||||
"ASCENDING": "Artan sıra ilə",
|
||||
"ASCENDING": "Ascending",
|
||||
"DESCENDING": "Descending"
|
||||
}
|
||||
},
|
||||
@@ -358,17 +358,17 @@
|
||||
"CREATE_SEGMENT": {
|
||||
"TITLE": "Do you want to save this filter?",
|
||||
"CONFIRM": "Save filter",
|
||||
"LABEL": "Ad",
|
||||
"LABEL": "Name",
|
||||
"PLACEHOLDER": "Enter the name of the filter",
|
||||
"ERROR": "Etibarlı ad daxil edin",
|
||||
"ERROR": "Enter a valid name",
|
||||
"SUCCESS_MESSAGE": "Filter saved successfully",
|
||||
"ERROR_MESSAGE": "Unable to save filter. Please try again later."
|
||||
},
|
||||
"DELETE_SEGMENT": {
|
||||
"TITLE": "Confirm Deletion",
|
||||
"DESCRIPTION": "Bu filtrin silinməsini təsdiqləyirsiniz?",
|
||||
"DESCRIPTION": "Are you sure you want to delete this filter?",
|
||||
"CONFIRM": "Yes, Delete",
|
||||
"CANCEL": "Xeyr, Ləğv et",
|
||||
"CANCEL": "No, Cancel",
|
||||
"SUCCESS_MESSAGE": "Filter deleted successfully",
|
||||
"ERROR_MESSAGE": "Unable to delete filter. Please try again later."
|
||||
}
|
||||
@@ -379,18 +379,18 @@
|
||||
"SHOWING": "Showing {startItem} - {endItem} of {totalItems} contacts"
|
||||
},
|
||||
"FILTER": {
|
||||
"NAME": "Ad",
|
||||
"EMAIL": "Elektron poçt",
|
||||
"PHONE_NUMBER": "Telefon nömrəsi",
|
||||
"NAME": "Name",
|
||||
"EMAIL": "Email",
|
||||
"PHONE_NUMBER": "Phone number",
|
||||
"IDENTIFIER": "Identifier",
|
||||
"COUNTRY": "Ölkə",
|
||||
"CITY": "Şəhər",
|
||||
"COUNTRY": "Country",
|
||||
"CITY": "City",
|
||||
"CREATED_AT": "Created at",
|
||||
"LAST_ACTIVITY": "Son fəaliyyət",
|
||||
"LAST_ACTIVITY": "Last activity",
|
||||
"REFERER_LINK": "Referer link",
|
||||
"BLOCKED": "Blocked",
|
||||
"BLOCKED_TRUE": "Doğru",
|
||||
"BLOCKED_FALSE": "Yanlış",
|
||||
"BLOCKED_TRUE": "True",
|
||||
"BLOCKED_FALSE": "False",
|
||||
"BUTTONS": {
|
||||
"CLEAR_FILTERS": "Clear filters",
|
||||
"UPDATE_SEGMENT": "Update segment",
|
||||
@@ -409,7 +409,7 @@
|
||||
}
|
||||
},
|
||||
"CARD": {
|
||||
"OF": "də",
|
||||
"OF": "of",
|
||||
"VIEW_DETAILS": "View details",
|
||||
"EDIT_DETAILS_FORM": {
|
||||
"TITLE": "Edit contact details",
|
||||
@@ -418,27 +418,27 @@
|
||||
"PLACEHOLDER": "Enter the first name"
|
||||
},
|
||||
"LAST_NAME": {
|
||||
"PLACEHOLDER": "Soyadı daxil edin"
|
||||
"PLACEHOLDER": "Enter the last name"
|
||||
},
|
||||
"EMAIL_ADDRESS": {
|
||||
"PLACEHOLDER": "Enter the email address",
|
||||
"DUPLICATE": "This email address is in use for another contact."
|
||||
},
|
||||
"PHONE_NUMBER": {
|
||||
"PLACEHOLDER": "Telefon nömrəsini daxil edin",
|
||||
"DUPLICATE": "Bu telefon nömrəsi başqa bir əlaqə üçün istifadə olunur."
|
||||
"PLACEHOLDER": "Enter the phone number",
|
||||
"DUPLICATE": "This phone number is in use for another contact."
|
||||
},
|
||||
"CITY": {
|
||||
"PLACEHOLDER": "Şəhər adını daxil edin"
|
||||
"PLACEHOLDER": "Enter the city name"
|
||||
},
|
||||
"COUNTRY": {
|
||||
"PLACEHOLDER": "Ölkəni seçin"
|
||||
"PLACEHOLDER": "Select country"
|
||||
},
|
||||
"BIO": {
|
||||
"PLACEHOLDER": "Enter the bio"
|
||||
},
|
||||
"COMPANY_NAME": {
|
||||
"PLACEHOLDER": "Şirkət adını daxil edin"
|
||||
"PLACEHOLDER": "Enter the company name"
|
||||
}
|
||||
},
|
||||
"UPDATE_BUTTON": "Update contact",
|
||||
@@ -477,8 +477,8 @@
|
||||
}
|
||||
},
|
||||
"DETAILS": {
|
||||
"CREATED_AT": "Yaradılıb {date}",
|
||||
"LAST_ACTIVITY": "Son fəaliyyət {date}",
|
||||
"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": {
|
||||
@@ -487,7 +487,7 @@
|
||||
"CONFIRM": "Yes, Delete",
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "Contact deleted successfully",
|
||||
"ERROR_MESSAGE": "Əlaqəni silmək mümkün olmadı. Zəhmət olmasa sonra yenidən cəhd edin."
|
||||
"ERROR_MESSAGE": "Could not delete contact. Please try again later."
|
||||
}
|
||||
},
|
||||
"AVATAR": {
|
||||
@@ -496,86 +496,86 @@
|
||||
"SUCCESS_MESSAGE": "Avatar uploaded successfully"
|
||||
},
|
||||
"DELETE": {
|
||||
"SUCCESS_MESSAGE": "Avatar uğurla silindi",
|
||||
"SUCCESS_MESSAGE": "Avatar deleted successfully",
|
||||
"ERROR_MESSAGE": "Could not delete avatar. Please try again later."
|
||||
}
|
||||
}
|
||||
},
|
||||
"SIDEBAR": {
|
||||
"TABS": {
|
||||
"ATTRIBUTES": "Xüsusiyyətlər",
|
||||
"HISTORY": "Tarix",
|
||||
"NOTES": "Qeydlər",
|
||||
"ATTRIBUTES": "Attributes",
|
||||
"HISTORY": "History",
|
||||
"NOTES": "Notes",
|
||||
"MERGE": "Merge"
|
||||
},
|
||||
"HISTORY": {
|
||||
"EMPTY_STATE": "Bu əlaqə ilə bağlı əvvəlki söhbətlər yoxdur"
|
||||
"EMPTY_STATE": "There are no previous conversations associated to this contact"
|
||||
},
|
||||
"ATTRIBUTES": {
|
||||
"SEARCH_PLACEHOLDER": "Search for attributes",
|
||||
"UNUSED_ATTRIBUTES": "{count} Used attribute | {count} Unused attributes",
|
||||
"EMPTY_STATE": "There are no contact custom attributes available in this account. You can create a custom attribute in settings.",
|
||||
"YES": "Bəli",
|
||||
"NO": "Xeyr",
|
||||
"YES": "Yes",
|
||||
"NO": "No",
|
||||
"TRIGGER": {
|
||||
"SELECT": "Dəyəri seçin",
|
||||
"INPUT": "Dəyər daxil edin"
|
||||
"SELECT": "Select value",
|
||||
"INPUT": "Enter value"
|
||||
},
|
||||
"VALIDATIONS": {
|
||||
"INVALID_NUMBER": "Yanlış nömrə",
|
||||
"REQUIRED": "Düzgün dəyər tələb olunur",
|
||||
"INVALID_INPUT": "Yanlış giriş",
|
||||
"INVALID_URL": "Yanlış URL",
|
||||
"INVALID_DATE": "Yanlış tarix"
|
||||
"INVALID_NUMBER": "Invalid number",
|
||||
"REQUIRED": "Valid value is required",
|
||||
"INVALID_INPUT": "Invalid input",
|
||||
"INVALID_URL": "Invalid URL",
|
||||
"INVALID_DATE": "Invalid date"
|
||||
},
|
||||
"NO_ATTRIBUTES": "No attributes found",
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "Attribute updated successfully",
|
||||
"DELETE_SUCCESS_MESSAGE": "Attribute deleted successfully",
|
||||
"UPDATE_ERROR": "Unable to update attribute. Please try again later",
|
||||
"DELETE_ERROR": "Xüsusiyyəti silmək mümkün olmadı. Zəhmət olmasa, bir az sonra yenidən cəhd edin"
|
||||
"DELETE_ERROR": "Unable to delete attribute. Please try again later"
|
||||
}
|
||||
},
|
||||
"MERGE": {
|
||||
"TITLE": "Merge contact",
|
||||
"DESCRIPTION": "İki profili bütün atributlar və söhbətlər daxil olmaqla birləşdirin. Ziddiyyət olduqda, əsas əlaqənin atributları üstünlük təşkil edəcək.",
|
||||
"PRIMARY": "Əsas əlaqə",
|
||||
"DESCRIPTION": "Combine two profiles into one, including all attributes and conversations. In case of conflict, the primary contact’s attributes will take precedence.",
|
||||
"PRIMARY": "Primary contact",
|
||||
"PRIMARY_HELP_LABEL": "To be saved",
|
||||
"PRIMARY_REQUIRED_ERROR": "Davam etməzdən əvvəl birləşdirmək üçün əlaqə seçin",
|
||||
"PRIMARY_REQUIRED_ERROR": "Please select a contact to merge with before proceeding",
|
||||
"PARENT": "To be merged",
|
||||
"PARENT_HELP_LABEL": "To be deleted",
|
||||
"EMPTY_STATE": "No contacts found",
|
||||
"PLACEHOLDER": "Əsas əlaqəni axtar",
|
||||
"SEARCH_PLACEHOLDER": "Əlaqə axtar",
|
||||
"PLACEHOLDER": "Search for primary contact",
|
||||
"SEARCH_PLACEHOLDER": "Search for a contact",
|
||||
"SEARCH_ERROR_MESSAGE": "Could not search for contacts. Please try again later.",
|
||||
"SUCCESS_MESSAGE": "Contact merged successfully",
|
||||
"ERROR_MESSAGE": "Əlaqələri birləşdirmək mümkün olmadı, yenidən cəhd edin!",
|
||||
"ERROR_MESSAGE": "Could not merge contacts, try again!",
|
||||
"IS_SEARCHING": "Searching...",
|
||||
"BUTTONS": {
|
||||
"CANCEL": "Ləğv et",
|
||||
"CANCEL": "Cancel",
|
||||
"CONFIRM": "Merge contact"
|
||||
}
|
||||
},
|
||||
"NOTES": {
|
||||
"PLACEHOLDER": "Qeyd əlavə et",
|
||||
"WROTE": "yazdı",
|
||||
"YOU": "Siz",
|
||||
"PLACEHOLDER": "Add a note",
|
||||
"WROTE": "wrote",
|
||||
"YOU": "You",
|
||||
"SAVE": "Save note",
|
||||
"ADD_NOTE": "Add contact note",
|
||||
"EXPAND": "Genişləndir",
|
||||
"EXPAND": "Expand",
|
||||
"COLLAPSE": "Collapse",
|
||||
"NO_NOTES": "No notes, you can add notes from the contact details page.",
|
||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above.",
|
||||
"CONVERSATION_EMPTY_STATE": "Hələ qeydlər yoxdur. Yeni qeyd yaratmaq üçün Qeyd əlavə et düyməsini istifadə edin."
|
||||
"CONVERSATION_EMPTY_STATE": "There are no notes yet. Use the Add note button to create one."
|
||||
}
|
||||
},
|
||||
"EMPTY_STATE": {
|
||||
"TITLE": "No contacts found in this account",
|
||||
"SUBTITLE": "Start adding new contacts by clicking on the button below",
|
||||
"BUTTON_LABEL": "Əlaqə əlavə et",
|
||||
"BUTTON_LABEL": "Add contact",
|
||||
"SEARCH_EMPTY_STATE_TITLE": "No contacts matches your search 🔍",
|
||||
"LIST_EMPTY_STATE_TITLE": "Bu baxışda əlaqə mövcud deyil 📋",
|
||||
"ACTIVE_EMPTY_STATE_TITLE": "Hazırda aktiv əlaqə yoxdur 🌙"
|
||||
"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"
|
||||
},
|
||||
@@ -585,12 +585,12 @@
|
||||
"ASSIGN_LABELS_FAILED": "Failed to assign labels",
|
||||
"DESCRIPTION": "Select the labels you want to add to the selected contacts.",
|
||||
"NO_LABELS_FOUND": "No labels available yet.",
|
||||
"SELECTED_COUNT": "{count} seçildi",
|
||||
"SELECTED_COUNT": "{count} selected",
|
||||
"CLEAR_SELECTION": "Clear selection",
|
||||
"SELECT_ALL": "Select all ({count})",
|
||||
"DELETE_CONTACTS": "Delete",
|
||||
"DELETE_SUCCESS": "Contacts deleted successfully.",
|
||||
"DELETE_FAILED": "Əlaqələri silmək mümkün olmadı.",
|
||||
"DELETE_FAILED": "Failed to delete contacts.",
|
||||
"DELETE_DIALOG": {
|
||||
"TITLE": "Delete selected contacts",
|
||||
"SINGULAR_TITLE": "Delete selected contact",
|
||||
@@ -605,27 +605,27 @@
|
||||
"ERROR_MESSAGE": "We couldn’t complete the search. Please try again."
|
||||
},
|
||||
"FORM": {
|
||||
"GO_TO_CONVERSATION": "Bax",
|
||||
"GO_TO_CONVERSATION": "View",
|
||||
"SUCCESS_MESSAGE": "The message was sent successfully!",
|
||||
"ERROR_MESSAGE": "An error occurred while creating the conversation. Please try again later.",
|
||||
"NO_INBOX_ALERT": "There are no available inboxes to start a conversation with this contact.",
|
||||
"CONTACT_SELECTOR": {
|
||||
"LABEL": "Kimə:",
|
||||
"LABEL": "To:",
|
||||
"TAG_INPUT_PLACEHOLDER": "Enter at least 2 characters to search by name, email, or phone number",
|
||||
"CONTACT_CREATING": "Əlaqə yaradılır..."
|
||||
"CONTACT_CREATING": "Creating contact..."
|
||||
},
|
||||
"INBOX_SELECTOR": {
|
||||
"LABEL": "Via:",
|
||||
"BUTTON": "Qutuları göstər"
|
||||
"BUTTON": "Show inboxes"
|
||||
},
|
||||
"EMAIL_OPTIONS": {
|
||||
"SUBJECT_LABEL": "Mövzu :",
|
||||
"SUBJECT_LABEL": "Subject :",
|
||||
"SUBJECT_PLACEHOLDER": "Enter your email subject here",
|
||||
"CC_LABEL": "Cc:",
|
||||
"CC_PLACEHOLDER": "Enter at least 2 characters to search by email",
|
||||
"BCC_LABEL": "Bcc:",
|
||||
"BCC_PLACEHOLDER": "Enter at least 2 characters to search by email",
|
||||
"BCC_BUTTON": "Gizli nüsxə"
|
||||
"BCC_BUTTON": "Bcc"
|
||||
},
|
||||
"MESSAGE_EDITOR": {
|
||||
"PLACEHOLDER": "Write your message here..."
|
||||
@@ -651,8 +651,8 @@
|
||||
}
|
||||
},
|
||||
"ACTION_BUTTONS": {
|
||||
"DISCARD": "İmtina et",
|
||||
"SEND": "Göndər ({keyCode})"
|
||||
"DISCARD": "Discard",
|
||||
"SEND": "Send ({keyCode})"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,452 +1,452 @@
|
||||
{
|
||||
"CONVERSATION": {
|
||||
"SELECT_A_CONVERSATION": "Zəhmət olmasa, soldakı paneldən bir söhbət seçin",
|
||||
"CSAT_REPLY_MESSAGE": "Zəhmət olmasa söhbəti qiymətləndirin",
|
||||
"404": "Bağışlayın, söhbəti tapa bilmirik. Zəhmət olmasa, yenidən cəhd edin",
|
||||
"SWITCH_VIEW_LAYOUT": "Düzəni dəyişdirin",
|
||||
"DASHBOARD_APP_TAB_MESSAGES": "Mesajlar",
|
||||
"UNVERIFIED_SESSION": "Bu istifadəçinin şəxsiyyəti təsdiqlənməyib",
|
||||
"NO_MESSAGE_1": "Uh oh! Görünür qutunuzda müştərilərdən mesaj yoxdur.",
|
||||
"NO_MESSAGE_2": " səhifənizə mesaj göndərmək üçün!",
|
||||
"NO_INBOX_1": "Hola! Görünür hələ heç bir poçt qutusu əlavə etməmisiniz.",
|
||||
"NO_INBOX_2": " başlamaq üçün",
|
||||
"NO_INBOX_AGENT": "Uh Oh! Görünür heç bir poçt qutusunun üzvü deyilsiniz. Zəhmət olmasa administratorunuzla əlaqə saxlayın",
|
||||
"SEARCH_MESSAGES": "Söhbətlərdə mesajları axtarın",
|
||||
"VIEW_ORIGINAL": "Orijinalı göstər",
|
||||
"VIEW_TRANSLATED": "Tərcüməni göstər",
|
||||
"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": "əmr menyusunu açmaq üçün",
|
||||
"KEYBOARD_SHORTCUTS": "klaviatura qısa yollarını görmək üçün"
|
||||
"CMD_BAR": "to open command menu",
|
||||
"KEYBOARD_SHORTCUTS": "to view keyboard shortcuts"
|
||||
},
|
||||
"SEARCH": {
|
||||
"TITLE": "Mesajları axtar",
|
||||
"RESULT_TITLE": "Axtarış Nəticələri",
|
||||
"LOADING_MESSAGE": "Məlumatlar işlənir...",
|
||||
"PLACEHOLDER": "Mesajları axtarmaq üçün istənilən mətni yazın",
|
||||
"NO_MATCHING_RESULTS": "Nəticə tapılmadı."
|
||||
"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": "Oxunmamış Mesajlar",
|
||||
"UNREAD_MESSAGE": "Oxunmamış Mesaj",
|
||||
"CLICK_HERE": "Buraya klik edin",
|
||||
"LOADING_INBOXES": "Qutular yüklənir",
|
||||
"LOADING_CONVERSATIONS": "Söhbətlər yüklənir",
|
||||
"CANNOT_REPLY": "Cavab verə bilməzsiniz, çünki",
|
||||
"24_HOURS_WINDOW": "24 saatlıq mesaj pəncərəsi məhdudiyyəti",
|
||||
"48_HOURS_WINDOW": "48 saatlıq mesaj pəncərəsi məhdudiyyəti",
|
||||
"API_HOURS_WINDOW": "Bu söhbətə yalnız {hours} saat ərzində cavab verə bilərsiniz",
|
||||
"NOT_ASSIGNED_TO_YOU": "Bu söhbət sizə təyin edilməyib. Bu söhbəti özünüzə təyin etmək istərdiniz?",
|
||||
"ASSIGN_TO_ME": "Mənə təyin et",
|
||||
"BOT_HANDOFF_MESSAGE": "Hazırda köməkçi və ya bot tərəfindən idarə olunan söhbətə cavab verirsiniz.",
|
||||
"BOT_HANDOFF_ACTION": "Açıq kimi işarələ və özünüzə təyin et",
|
||||
"BOT_HANDOFF_REOPEN_ACTION": "Söhbəti açıq kimi işarələyin",
|
||||
"BOT_HANDOFF_SUCCESS": "Söhbət sizə təhvil verildi",
|
||||
"BOT_HANDOFF_ERROR": "Söhbəti ələ keçirmək alınmadı. Zəhmət olmasa, yenidən cəhd edin.",
|
||||
"TWILIO_WHATSAPP_CAN_REPLY": "Bu söhbətə yalnız şablon mesajı ilə cavab verə bilərsiniz, çünki",
|
||||
"TWILIO_WHATSAPP_24_HOURS_WINDOW": "24 saatlıq mesaj pəncərəsi məhdudiyyəti",
|
||||
"OLD_INSTAGRAM_INBOX_REPLY_BANNER": "Bu Instagram hesabı yeni Instagram kanalının daxil olan qutusuna köçürülüb. Bütün yeni mesajlar orada görünəcək. Bu söhbətdən artıq mesaj göndərə bilməyəcəksiniz.",
|
||||
"REPLYING_TO": "Siz cavab verirsiniz:",
|
||||
"REMOVE_SELECTION": "Seçimi sil",
|
||||
"DOWNLOAD": "Yüklə",
|
||||
"UNKNOWN_FILE_TYPE": "Naməlum fayl",
|
||||
"SAVE_CONTACT": "Əlaqəni yadda saxla",
|
||||
"NO_CONTENT": "Göstəriləcək məzmun yoxdur",
|
||||
"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": "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} bir əlaqə paylaşıb",
|
||||
"LOCATION": "{sender} bir yer paylaşıb",
|
||||
"FILE": "{sender} bir fayl paylaşıb",
|
||||
"MEETING": "{sender} bir görüş başlayıb"
|
||||
"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": "Əlavələr yüklənir...",
|
||||
"REPLIED_TO_STORY": "Hekayənizə cavab verdi",
|
||||
"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": "Bu mesaj dəstəklənmir. Bu mesajı Facebook Messenger tətbiqində görə bilərsiniz.",
|
||||
"UNSUPPORTED_MESSAGE_INSTAGRAM": "Bu mesaj dəstəklənmir. Bu mesajı Instagram tətbiqində görə bilərsiniz.",
|
||||
"UNSUPPORTED_MESSAGE_TIKTOK": "Bu mesaj dəstəklənmir. Bu mesajı TikTok tətbiqində görə bilərsiniz.",
|
||||
"SUCCESS_DELETE_MESSAGE": "Mesaj uğurla silindi",
|
||||
"FAIL_DELETE_MESSSAGE": "Mesajı silmək mümkün olmadı! Yenidən cəhd edin",
|
||||
"NO_RESPONSE": "Cavab yoxdur",
|
||||
"RESPONSE": "Cavab",
|
||||
"RATING_TITLE": "Qiymətləndirmə",
|
||||
"FEEDBACK_TITLE": "Rəy",
|
||||
"REPLY_MESSAGE_NOT_FOUND": "Mesaj mövcud deyil",
|
||||
"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": "Etiketləri göstər",
|
||||
"HIDE_LABELS": "Etiketləri gizlədin"
|
||||
"SHOW_LABELS": "Show labels",
|
||||
"HIDE_LABELS": "Hide labels"
|
||||
},
|
||||
"VOICE_CALL": {
|
||||
"INCOMING_CALL": "Gələn zəng",
|
||||
"OUTGOING_CALL": "Gedən zəng",
|
||||
"CALL_IN_PROGRESS": "Zəng davam edir",
|
||||
"NO_ANSWER": "Cavab yoxdur",
|
||||
"MISSED_CALL": "Qeyri-işlək zəng",
|
||||
"CALL_ENDED": "Zəng bitdi",
|
||||
"NOT_ANSWERED_YET": "Hələ cavab verilməyib",
|
||||
"THEY_ANSWERED": "Onlar cavab verdi",
|
||||
"YOU_ANSWERED": "Siz cavab verdiniz"
|
||||
"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": "Həll et",
|
||||
"REOPEN_ACTION": "Yenidən aç",
|
||||
"OPEN_ACTION": "Aç",
|
||||
"MORE_ACTIONS": "Daha çox əməliyyat",
|
||||
"OPEN": "Daha çox",
|
||||
"CLOSE": "Bağla",
|
||||
"DETAILS": "təfərrüatlar",
|
||||
"SNOOZED_UNTIL": "Gecikdirilib",
|
||||
"SNOOZED_UNTIL_TOMORROW": "Sabaha qədər təxirə salındı",
|
||||
"SNOOZED_UNTIL_NEXT_WEEK": "Gələn həftəyə qədər təxirə salındı",
|
||||
"SNOOZED_UNTIL_NEXT_REPLY": "Növbəti cavaba qədər təxirə salındı",
|
||||
"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": "qaçırıldı",
|
||||
"DUE": "vaxtı çatıb"
|
||||
"MISSED": "missed",
|
||||
"DUE": "due"
|
||||
}
|
||||
},
|
||||
"RESOLVE_DROPDOWN": {
|
||||
"MARK_PENDING": "Gözləmədə kimi işarələyin",
|
||||
"SNOOZE_UNTIL": "Gecikdir",
|
||||
"MARK_PENDING": "Mark as pending",
|
||||
"SNOOZE_UNTIL": "Snooze",
|
||||
"SNOOZE": {
|
||||
"TITLE": "Gecikdirin, qədər",
|
||||
"NEXT_REPLY": "Növbəti cavab",
|
||||
"TOMORROW": "Sabah",
|
||||
"NEXT_WEEK": "Gələn həftə"
|
||||
"TITLE": "Snooze until",
|
||||
"NEXT_REPLY": "Next reply",
|
||||
"TOMORROW": "Tomorrow",
|
||||
"NEXT_WEEK": "Next week"
|
||||
}
|
||||
},
|
||||
"MENTION": {
|
||||
"AGENTS": "Agentlər",
|
||||
"TEAMS": "Komandalar"
|
||||
"AGENTS": "Agents",
|
||||
"TEAMS": "Teams"
|
||||
},
|
||||
"CUSTOM_SNOOZE": {
|
||||
"TITLE": "Gecikdirmə müddəti",
|
||||
"APPLY": "Gecikdir",
|
||||
"CANCEL": "Ləğv et"
|
||||
"TITLE": "Snooze until",
|
||||
"APPLY": "Snooze",
|
||||
"CANCEL": "Cancel"
|
||||
},
|
||||
"PRIORITY": {
|
||||
"TITLE": "Prioritet",
|
||||
"TITLE": "Priority",
|
||||
"OPTIONS": {
|
||||
"NONE": "Heç biri",
|
||||
"URGENT": "Təcili",
|
||||
"HIGH": "Yüksək",
|
||||
"MEDIUM": "Orta",
|
||||
"LOW": "Aşağı"
|
||||
"NONE": "None",
|
||||
"URGENT": "Urgent",
|
||||
"HIGH": "High",
|
||||
"MEDIUM": "Medium",
|
||||
"LOW": "Low"
|
||||
},
|
||||
"CHANGE_PRIORITY": {
|
||||
"SELECT_PLACEHOLDER": "Heç biri",
|
||||
"INPUT_PLACEHOLDER": "Prioritet seçin",
|
||||
"NO_RESULTS": "Nəticə tapılmadı",
|
||||
"SUCCESSFUL": "{conversationId} söhbətinin prioriteti {priority} olaraq dəyişdirildi",
|
||||
"FAILED": "Prioritet dəyişdirilə bilmədi. Zəhmət olmasa yenidən cəhd edin."
|
||||
"SELECT_PLACEHOLDER": "None",
|
||||
"INPUT_PLACEHOLDER": "Select priority",
|
||||
"NO_RESULTS": "No results found",
|
||||
"SUCCESSFUL": "Changed priority of conversation id {conversationId} to {priority}",
|
||||
"FAILED": "Couldn't change priority. Please try again."
|
||||
}
|
||||
},
|
||||
"DELETE_CONVERSATION": {
|
||||
"TITLE": "#{conversationId} nömrəli söhbəti sil",
|
||||
"DESCRIPTION": "Bu söhbəti silmək istədiyinizə əminsiniz?",
|
||||
"CONFIRM": "Sil"
|
||||
"TITLE": "Delete conversation #{conversationId}",
|
||||
"DESCRIPTION": "Are you sure you want to delete this conversation?",
|
||||
"CONFIRM": "Delete"
|
||||
},
|
||||
"CARD_CONTEXT_MENU": {
|
||||
"PENDING": "Gözləyən kimi işarələyin",
|
||||
"RESOLVED": "Həll olundu kimi işarələyin",
|
||||
"MARK_AS_UNREAD": "Oxunmamış kimi işarələyin",
|
||||
"MARK_AS_READ": "Oxunmuş kimi işarələ",
|
||||
"REOPEN": "Söhbəti yenidən açın",
|
||||
"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": "Gecikdir",
|
||||
"NEXT_REPLY": "Növbəti cavaba qədər",
|
||||
"TOMORROW": "Sabaha qədər",
|
||||
"NEXT_WEEK": "Növbəti həftəyə qədər"
|
||||
"TITLE": "Snooze",
|
||||
"NEXT_REPLY": "Until next reply",
|
||||
"TOMORROW": "Until tomorrow",
|
||||
"NEXT_WEEK": "Until next week"
|
||||
},
|
||||
"ASSIGN_AGENT": "Agent təyin et",
|
||||
"ASSIGN_LABEL": "Etiket təyin et",
|
||||
"AGENTS_LOADING": "Agentlər yüklənir...",
|
||||
"ASSIGN_TEAM": "Komandaya təyin et",
|
||||
"DELETE": "Söhbəti sil",
|
||||
"OPEN_IN_NEW_TAB": "Yeni nişanda aç",
|
||||
"COPY_LINK": "Söhbət linkini kopyala",
|
||||
"COPY_LINK_SUCCESS": "Söhbət linki panoya kopyalandı",
|
||||
"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": "{conversationId} söhbəti \"{agentName}\" agentinə təyin edildi",
|
||||
"FAILED": "Agent təyin etmək mümkün olmadı. Zəhmət olmasa yenidən cəhd edin."
|
||||
"SUCCESFUL": "Conversation id {conversationId} assigned to \"{agentName}\"",
|
||||
"FAILED": "Couldn't assign agent. Please try again."
|
||||
},
|
||||
"LABEL_ASSIGNMENT": {
|
||||
"SUCCESFUL": "{conversationId} söhbətinə #{labelName} etiketi təyin edildi",
|
||||
"FAILED": "Etiket təyin etmək mümkün olmadı. Zəhmət olmasa yenidən cəhd edin."
|
||||
"SUCCESFUL": "Assigned label #{labelName} to conversation id {conversationId}",
|
||||
"FAILED": "Couldn't assign label. Please try again."
|
||||
},
|
||||
"LABEL_REMOVAL": {
|
||||
"SUCCESFUL": "{conversationId} nömrəli söhbətdən #{labelName} etiketi silindi",
|
||||
"FAILED": "Etiketi silmək mümkün olmadı. Zəhmət olmasa yenidən cəhd edin."
|
||||
"SUCCESFUL": "Removed label #{labelName} from conversation id {conversationId}",
|
||||
"FAILED": "Couldn't remove label. Please try again."
|
||||
},
|
||||
"TEAM_ASSIGNMENT": {
|
||||
"SUCCESFUL": "Söhbət id-si {conversationId} üçün \"{team}\" komandası təyin edildi",
|
||||
"FAILED": "Komanda təyin etmək mümkün olmadı. Zəhmət olmasa yenidən cəhd edin."
|
||||
"SUCCESFUL": "Assigned team \"{team}\" to conversation id {conversationId}",
|
||||
"FAILED": "Couldn't assign team. Please try again."
|
||||
}
|
||||
}
|
||||
},
|
||||
"FOOTER": {
|
||||
"MESSAGE_SIGN_TOOLTIP": "Mesaj imzası",
|
||||
"ENABLE_SIGN_TOOLTIP": "İmzaya icazə ver",
|
||||
"DISABLE_SIGN_TOOLTIP": "İmzaya icazə vermə",
|
||||
"MSG_INPUT": "Yeni sətr üçün Shift + enter. Canned Response seçmək üçün '/' ilə başlayın.",
|
||||
"PRIVATE_MSG_INPUT": "Yeni sətr üçün Shift + enter. Bu yalnız Agentlər üçün görünəcək",
|
||||
"MESSAGING_RESTRICTED": "Bu söhbətə cavab verə bilməzsiniz",
|
||||
"MESSAGING_RESTRICTED_WHATSAPP": "24 saatlıq mesaj pəncərəsi məhdudiyyəti səbəbindən yalnız şablon mesajla cavab verə bilərsiniz",
|
||||
"MESSAGING_RESTRICTED_API": "Mesaj pəncərəsi məhdudiyyəti səbəbindən yalnız şablon mesajla cavab verə bilərsiniz",
|
||||
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Mesaj imzası qurulmayıb, zəhmət olmasa profil parametrlərində qurun.",
|
||||
"COPILOT_MSG_INPUT": "Copilot üçün əlavə göstərişlər verin və ya başqa sual verin... Davam etmək üçün enter düyməsini basın",
|
||||
"CLICK_HERE": "Yeniləmək üçün buraya klikləyin",
|
||||
"WHATSAPP_TEMPLATES": "Whatsapp Şablonları"
|
||||
"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": "Cavab ver",
|
||||
"PRIVATE_NOTE": "Şəxsi Qeyd",
|
||||
"SEND": "Göndər",
|
||||
"CREATE": "Qeyd əlavə et",
|
||||
"INSERT_READ_MORE": "Daha çox oxu",
|
||||
"DISMISS_REPLY": "Cavabı ləğv et",
|
||||
"REPLYING_TO": "Cavab verir:",
|
||||
"TIP_EMOJI_ICON": "Emoji seçicisini göstər",
|
||||
"TIP_ATTACH_ICON": "Faylları əlavə et",
|
||||
"TIP_AUDIORECORDER_ICON": "Səs yaz",
|
||||
"TIP_AUDIORECORDER_PERMISSION": "Səsə girişə icazə ver",
|
||||
"TIP_AUDIORECORDER_ERROR": "Səsi açmaq mümkün olmadı",
|
||||
"DRAG_DROP": "Qoşmaq üçün buraya sürükləyin və buraxın",
|
||||
"START_AUDIO_RECORDING": "Səs yazısını başla",
|
||||
"STOP_AUDIO_RECORDING": "Səs yazısını dayandırın",
|
||||
"COPILOT_THINKING": "Copilot düşünür",
|
||||
"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": "KİMƏ",
|
||||
"ADD_BCC": "Gizli nüsxə əlavə et",
|
||||
"TO": "TO",
|
||||
"ADD_BCC": "Add bcc",
|
||||
"CC": {
|
||||
"LABEL": "CC",
|
||||
"PLACEHOLDER": "Vergüllə ayrılmış elektron poçtlar",
|
||||
"ERROR": "Zəhmət olmasa düzgün elektron poçt ünvanları daxil edin"
|
||||
"PLACEHOLDER": "Emails separated by commas",
|
||||
"ERROR": "Please enter valid email addresses"
|
||||
},
|
||||
"BCC": {
|
||||
"LABEL": "BCC",
|
||||
"PLACEHOLDER": "Vergüllə ayrılmış e-poçtlar",
|
||||
"ERROR": "Zəhmət olmasa, düzgün e-poçt ünvanları daxil edin"
|
||||
"PLACEHOLDER": "Emails separated by commas",
|
||||
"ERROR": "Please enter valid email addresses"
|
||||
}
|
||||
},
|
||||
"UNDEFINED_VARIABLES": {
|
||||
"TITLE": "Təyin olunmamış dəyişənlər",
|
||||
"MESSAGE": "Mesajınızda {undefinedVariablesCount} təyin olunmamış dəyişən var: {undefinedVariables}. Mesajı yenə də göndərmək istəyirsiniz?",
|
||||
"TITLE": "Undefined variables",
|
||||
"MESSAGE": "You have {undefinedVariablesCount} undefined variables in your message: {undefinedVariables}. Would you like to send the message anyway?",
|
||||
"CONFIRM": {
|
||||
"YES": "Göndər",
|
||||
"CANCEL": "Ləğv et"
|
||||
"YES": "Send",
|
||||
"CANCEL": "Cancel"
|
||||
}
|
||||
},
|
||||
"QUOTED_REPLY": {
|
||||
"ENABLE_TOOLTIP": "Sitat gətirilmiş e-poçt mövzusunu daxil et",
|
||||
"DISABLE_TOOLTIP": "Sitat gətirilmiş e-poçt mövzusunu daxil etmə",
|
||||
"REMOVE_PREVIEW": "Sitat gətirilmiş e-poçt mövzusunu sil",
|
||||
"COLLAPSE": "Önizləməni yığışdır",
|
||||
"EXPAND": "Önizləməni genişləndir"
|
||||
"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": "Şəxsi Qeyd: Yalnız siz və komandanız üçün görünür",
|
||||
"CHANGE_STATUS": "Söhbət statusu dəyişdirildi",
|
||||
"CHANGE_STATUS_FAILED": "Söhbətin statusunu dəyişmək mümkün olmadı",
|
||||
"CHANGE_AGENT": "Söhbətin məsul şəxsi dəyişdirildi",
|
||||
"CHANGE_AGENT_FAILED": "Təyinat dəyişdirilməsi uğursuz oldu",
|
||||
"ASSIGN_LABEL_SUCCESFUL": "Etiket uğurla təyin edildi",
|
||||
"ASSIGN_LABEL_FAILED": "Etiket təyini uğursuz oldu",
|
||||
"CHANGE_TEAM": "Söhbət komandası dəyişdirildi",
|
||||
"SUCCESS_DELETE_CONVERSATION": "Söhbət uğurla silindi",
|
||||
"FAIL_DELETE_CONVERSATION": "Söhbəti silmək mümkün olmadı! Yenidən cəhd edin",
|
||||
"FILE_SIZE_LIMIT": "Fayl {MAXIMUM_SUPPORTED_FILE_UPLOAD_SIZE} MB əlavə limitini aşır",
|
||||
"FILE_TYPE_NOT_SUPPORTED": "Bu {fileName} fayl növü bu söhbətdə dəstəklənmir",
|
||||
"MESSAGE_ERROR": "Bu mesajı göndərmək mümkün olmadı, zəhmət olmasa bir az sonra yenidən cəhd edin",
|
||||
"SENT_BY": "Göndərən:",
|
||||
"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": "Unable to send this message, please try again later",
|
||||
"SENT_BY": "Sent by:",
|
||||
"BOT": "Bot",
|
||||
"NATIVE_APP": "Yerli tətbiq",
|
||||
"NATIVE_APP_ADVISORY": "Bu mesaj yerli tətbiqdən göndərilib. Mesaj pəncərəsini saxlamaq üçün Chatwoot-dan cavab verin.",
|
||||
"SEND_FAILED": "Mesaj göndərmək mümkün olmadı! Yenidən cəhd edin",
|
||||
"TRY_AGAIN": "yenidən cəhd et",
|
||||
"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": "Agent seçin",
|
||||
"REMOVE": "Sil",
|
||||
"ASSIGN": "Təyin et"
|
||||
"SELECT_AGENT": "Select Agent",
|
||||
"REMOVE": "Remove",
|
||||
"ASSIGN": "Assign"
|
||||
},
|
||||
"CONTEXT_MENU": {
|
||||
"COPY": "Kopyala",
|
||||
"REPLY_TO": "Bu mesaja cavab ver",
|
||||
"DELETE": "Sil",
|
||||
"CREATE_A_CANNED_RESPONSE": "Hazır cavablara əlavə et",
|
||||
"TRANSLATE": "Tərcümə et",
|
||||
"COPY_PERMALINK": "Mesaja keçid linkini kopyalayın",
|
||||
"LINK_COPIED": "Mesajın URL-i panoya kopyalandı",
|
||||
"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": "Bu mesajı silmək istədiyinizə əminsiniz?",
|
||||
"MESSAGE": "Bu əməliyyatı geri qaytara bilməzsiniz",
|
||||
"DELETE": "Sil",
|
||||
"CANCEL": "Ləğv et"
|
||||
"TITLE": "Are you sure you want to delete this message?",
|
||||
"MESSAGE": "You cannot undo this action",
|
||||
"DELETE": "Delete",
|
||||
"CANCEL": "Cancel"
|
||||
}
|
||||
},
|
||||
"SIDEBAR": {
|
||||
"CONTACT": "Əlaqə",
|
||||
"CONTACT": "Contact",
|
||||
"COPILOT": "Copilot"
|
||||
},
|
||||
"VOICE_WIDGET": {
|
||||
"INCOMING_CALL": "Gələn zəng",
|
||||
"OUTGOING_CALL": "Gedən zəng",
|
||||
"CALL_IN_PROGRESS": "Zəng davam edir",
|
||||
"NOT_ANSWERED_YET": "Hələ cavab verilməyib",
|
||||
"HANDLED_IN_ANOTHER_TAB": "Başqa sekmədə işlənir",
|
||||
"REJECT_CALL": "İmtina et",
|
||||
"JOIN_CALL": "Zəngə qoşul",
|
||||
"END_CALL": "Zəngi bitir"
|
||||
"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": "Söhbət transkriptini göndər",
|
||||
"DESC": "Söhbət transkriptinin surətini göstərilən e-poçt ünvanına göndərin",
|
||||
"SUBMIT": "Təsdiqlə",
|
||||
"CANCEL": "Ləğv et",
|
||||
"SEND_EMAIL_SUCCESS": "Söhbət yazısı uğurla göndərildi",
|
||||
"SEND_EMAIL_ERROR": "Xəta baş verdi, zəhmət olmasa yenidən cəhd edin",
|
||||
"SEND_EMAIL_PAYMENT_REQUIRED": "Cari planınızda e-poçt yazışması mövcud deyil. Bu funksiyanı istifadə etmək üçün lütfən planınızı yüksəldin.",
|
||||
"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": "Yazını müştəriyə göndər",
|
||||
"SEND_TO_AGENT": "Mətni təyin olunmuş agentə göndər",
|
||||
"SEND_TO_OTHER_EMAIL_ADDRESS": "Yazını başqa e-poçt ünvanına göndər",
|
||||
"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": "E-poçt ünvanı daxil edin",
|
||||
"ERROR": "Zəhmət olmasa, düzgün e-poçt ünvanı daxil edin"
|
||||
"PLACEHOLDER": "Enter an email address",
|
||||
"ERROR": "Please enter a valid email address"
|
||||
}
|
||||
}
|
||||
},
|
||||
"ONBOARDING": {
|
||||
"TITLE": "Salam 👋, {installationName}-ə xoş gəlmisiniz!",
|
||||
"DESCRIPTION": "Qeydiyyatdan keçdiyiniz üçün təşəkkür edirik. {installationName}-dən maksimum faydalanmağınızı istəyirik. Təcrübəni xoş etmək üçün {installationName}-də edə biləcəyiniz bir neçə şey var.",
|
||||
"GREETING_MORNING": "👋 Sabahınız xeyir, {name}. {installationName}-ə xoş gəlmisiniz.",
|
||||
"GREETING_AFTERNOON": "👋 Günortanız xeyir, {name}. {installationName}-ə xoş gəlmisiniz.",
|
||||
"GREETING_EVENING": "👋 Axşamınız xeyir, {name}. {installationName}-ə xoş gəlmisiniz.",
|
||||
"READ_LATEST_UPDATES": "Ən son yeniliklərimizi oxuyun",
|
||||
"TITLE": "Hey 👋, Welcome to {installationName}!",
|
||||
"DESCRIPTION": "Thanks for signing up. We want you to get the most out of {installationName}. Here are a few things you can do in {installationName} to make the experience delightful.",
|
||||
"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 our latest updates",
|
||||
"ALL_CONVERSATION": {
|
||||
"TITLE": "Bütün söhbətləriniz bir yerdə",
|
||||
"DESCRIPTION": "Müştərilərinizdən olan bütün söhbətləri tək bir paneldə görün. Söhbətləri daxil olan kanal, etiket və vəziyyətə görə süzgəcdən keçirə bilərsiniz.",
|
||||
"NEW_LINK": "Qutunu yaratmaq üçün bura klikləyin"
|
||||
"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": "Komanda üzvlərinizi dəvət edin",
|
||||
"DESCRIPTION": "Müştərinizlə danışmağa hazırlaşdığınız üçün, sizə kömək etmək üçün komanda üzvlərinizi dəvət edin. Komanda üzvlərinizi agent siyahısına onların e-poçt ünvanlarını əlavə etməklə dəvət edə bilərsiniz.",
|
||||
"NEW_LINK": "Komanda üzvünü dəvət etmək üçün buraya klikləyin"
|
||||
"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": "Söhbətləri etiketlərlə təşkil edin",
|
||||
"DESCRIPTION": "Etiketlər söhbətinizi kateqoriyalara ayırmağı asanlaşdırır. Sonra söhbətdə istifadə etmək üçün #support-enquiry, #billing-question və s. kimi bəzi etiketlər yaradın.",
|
||||
"NEW_LINK": "Etiket yaratmaq üçün buraya klikləyin"
|
||||
"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": "Hazır cavablar yaradın",
|
||||
"DESCRIPTION": "Əvvəlcədən yazılmış sürətli cavab şablonları söhbətə tez cavab verməyinizə kömək edir. Agentlər cavaba daxil etmək üçün '/' simvolunu və sonra qısa kodu yaza bilərlər.",
|
||||
"NEW_LINK": "Sürətli cavab yaratmaq üçün bura klikləyin"
|
||||
"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": "Təyin olunmuş agent",
|
||||
"SELF_ASSIGN": "Mənə təyin et",
|
||||
"TEAM_LABEL": "Təyin olunmuş komanda",
|
||||
"ASSIGNEE_LABEL": "Assigned Agent",
|
||||
"SELF_ASSIGN": "Assign to me",
|
||||
"TEAM_LABEL": "Assigned Team",
|
||||
"SELECT": {
|
||||
"PLACEHOLDER": "Heç biri"
|
||||
"PLACEHOLDER": "None"
|
||||
},
|
||||
"ACCORDION": {
|
||||
"CONTACT_DETAILS": "Əlaqə Məlumatları",
|
||||
"CONVERSATION_ACTIONS": "Söhbət Əməliyyatları",
|
||||
"CONVERSATION_LABELS": "Söhbət Etiketləri",
|
||||
"CONVERSATION_INFO": "Söhbət Məlumatları",
|
||||
"CONTACT_NOTES": "Əlaqə Qeydləri",
|
||||
"CONTACT_ATTRIBUTES": "Əlaqə Xüsusiyyətləri",
|
||||
"PREVIOUS_CONVERSATION": "Əvvəlki Söhbətlər",
|
||||
"MACROS": "Makrolar",
|
||||
"LINEAR_ISSUES": "Əlaqəli Linear məsələlər",
|
||||
"SHOPIFY_ORDERS": "Shopify Sifarişləri"
|
||||
"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": "Sifariş #{id}",
|
||||
"ERROR": "Sifarişlərin yüklənməsində xəta",
|
||||
"NO_SHOPIFY_ORDERS": "Sifariş tapılmadı",
|
||||
"ORDER_ID": "Order #{id}",
|
||||
"ERROR": "Error loading orders",
|
||||
"NO_SHOPIFY_ORDERS": "No orders found",
|
||||
"FINANCIAL_STATUS": {
|
||||
"PENDING": "Gözləmədə",
|
||||
"AUTHORIZED": "Təsdiqlənmiş",
|
||||
"PARTIALLY_PAID": "Qismən ödənilmiş",
|
||||
"PAID": "Ödənilib",
|
||||
"PARTIALLY_REFUNDED": "Qismən Geri Ödənilib",
|
||||
"REFUNDED": "Geri Ödənilib",
|
||||
"VOIDED": "Ləğv Edilib"
|
||||
"PENDING": "Pending",
|
||||
"AUTHORIZED": "Authorized",
|
||||
"PARTIALLY_PAID": "Partially Paid",
|
||||
"PAID": "Paid",
|
||||
"PARTIALLY_REFUNDED": "Partially Refunded",
|
||||
"REFUNDED": "Refunded",
|
||||
"VOIDED": "Voided"
|
||||
},
|
||||
"FULFILLMENT_STATUS": {
|
||||
"FULFILLED": "Yerinə Yetirilib",
|
||||
"PARTIALLY_FULFILLED": "Qismən Yerinə Yetirilib",
|
||||
"UNFULFILLED": "Yerinə Yetirilməyib"
|
||||
"FULFILLED": "Fulfilled",
|
||||
"PARTIALLY_FULFILLED": "Partially Fulfilled",
|
||||
"UNFULFILLED": "Unfulfilled"
|
||||
}
|
||||
}
|
||||
},
|
||||
"CONVERSATION_CUSTOM_ATTRIBUTES": {
|
||||
"ADD_BUTTON_TEXT": "Xüsusiyyət yaradın",
|
||||
"NO_RECORDS_FOUND": "Heç bir atribut tapılmadı",
|
||||
"ADD_BUTTON_TEXT": "Create attribute",
|
||||
"NO_RECORDS_FOUND": "No attributes found",
|
||||
"UPDATE": {
|
||||
"SUCCESS": "Xüsusiyyət uğurla yeniləndi",
|
||||
"ERROR": "Xüsusiyyət yenilənə bilmədi. Zəhmət olmasa, bir az sonra yenidən cəhd edin"
|
||||
"SUCCESS": "Attribute updated successfully",
|
||||
"ERROR": "Unable to update attribute. Please try again later"
|
||||
},
|
||||
"ADD": {
|
||||
"TITLE": "Əlavə et",
|
||||
"SUCCESS": "Xüsusiyyət uğurla əlavə edildi",
|
||||
"ERROR": "Xüsusiyyət əlavə edilə bilmədi. Zəhmət olmasa, bir az sonra yenidən cəhd edin"
|
||||
"TITLE": "Add",
|
||||
"SUCCESS": "Attribute added successfully",
|
||||
"ERROR": "Unable to add attribute. Please try again later"
|
||||
},
|
||||
"DELETE": {
|
||||
"SUCCESS": "Xüsusiyyət uğurla silindi",
|
||||
"ERROR": "Atributu silmək mümkün olmadı. Zəhmət olmasa, bir az sonra yenidən cəhd edin"
|
||||
"SUCCESS": "Attribute deleted successfully",
|
||||
"ERROR": "Unable to delete attribute. Please try again later"
|
||||
},
|
||||
"ATTRIBUTE_SELECT": {
|
||||
"TITLE": "Atributlar əlavə et",
|
||||
"PLACEHOLDER": "Atributlarda axtar",
|
||||
"NO_RESULT": "Heç bir atribut tapılmadı"
|
||||
"TITLE": "Add attributes",
|
||||
"PLACEHOLDER": "Search attributes",
|
||||
"NO_RESULT": "No attributes found"
|
||||
}
|
||||
},
|
||||
"EMAIL_HEADER": {
|
||||
"FROM": "Kimdən",
|
||||
"TO": "Kimə",
|
||||
"BCC": "Gizli nüsxə",
|
||||
"CC": "Nüsxə",
|
||||
"SUBJECT": "Mövzu",
|
||||
"EXPAND": "E-poçtu genişləndir"
|
||||
"FROM": "From",
|
||||
"TO": "To",
|
||||
"BCC": "Bcc",
|
||||
"CC": "Cc",
|
||||
"SUBJECT": "Subject",
|
||||
"EXPAND": "Expand email"
|
||||
},
|
||||
"CONVERSATION_PARTICIPANTS": {
|
||||
"SIDEBAR_MENU_TITLE": "İştirak edənlər",
|
||||
"SIDEBAR_TITLE": "Söhbət iştirakçıları",
|
||||
"NO_RECORDS_FOUND": "Nəticə tapılmadı",
|
||||
"ADD_PARTICIPANTS": "İştirakçıları seçin",
|
||||
"REMANING_PARTICIPANTS_TEXT": "+{count} digər",
|
||||
"REMANING_PARTICIPANT_TEXT": "+{count} digər",
|
||||
"TOTAL_PARTICIPANTS_TEXT": "{count} nəfər iştirak edir.",
|
||||
"TOTAL_PARTICIPANT_TEXT": "{count} nəfər iştirak edir.",
|
||||
"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": "Söhbətə qoşulun",
|
||||
"YOU_ARE_WATCHING": "Siz iştirak edirsiniz",
|
||||
"WATCH_CONVERSATION": "Join conversation",
|
||||
"YOU_ARE_WATCHING": "You are participating",
|
||||
"API": {
|
||||
"ERROR_MESSAGE": "Yenilənmədi, yenidən cəhd edin!",
|
||||
"SUCCESS_MESSAGE": "İştirakçılar yeniləndi!"
|
||||
"ERROR_MESSAGE": "Could not update, try again!",
|
||||
"SUCCESS_MESSAGE": "Participants updated!"
|
||||
}
|
||||
},
|
||||
"TRANSLATE_MODAL": {
|
||||
"TITLE": "Tərcümə edilmiş məzmunu göstər",
|
||||
"TITLE": "View translated content",
|
||||
"DESC": "You can view the translated content in each langauge.",
|
||||
"ORIGINAL_CONTENT": "Orijinal məzmun",
|
||||
"TRANSLATED_CONTENT": "Tərcümə edilmiş məzmun",
|
||||
"NO_TRANSLATIONS_AVAILABLE": "Bu məzmun üçün tərcümə mövcud deyil"
|
||||
"ORIGINAL_CONTENT": "Original Content",
|
||||
"TRANSLATED_CONTENT": "Translated Content",
|
||||
"NO_TRANSLATIONS_AVAILABLE": "No translations are available for this content"
|
||||
},
|
||||
"TYPING": {
|
||||
"ONE": "{user} yazır",
|
||||
"TWO": "{user} və {secondUser} yazırlar",
|
||||
"MULTIPLE": "{user} və {count} başqası yazırlar"
|
||||
"ONE": "{user} is typing",
|
||||
"TWO": "{user} and {secondUser} are typing",
|
||||
"MULTIPLE": "{user} and {count} others are typing"
|
||||
},
|
||||
"COPILOT": {
|
||||
"TRY_THESE_PROMPTS": "Bu təklifləri sınayın"
|
||||
"TRY_THESE_PROMPTS": "Try these prompts"
|
||||
},
|
||||
"GALLERY_VIEW": {
|
||||
"ERROR_DOWNLOADING": "Əlavəni yükləmək mümkün olmadı. Zəhmət olmasa yenidən cəhd edin"
|
||||
"ERROR_DOWNLOADING": "Unable to download attachment. Please try again"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,156 +6,156 @@
|
||||
"CREATE_PORTAL_BUTTON": "Create Portal"
|
||||
},
|
||||
"HEADER": {
|
||||
"FILTER": "Filtrlə",
|
||||
"SORT": "Sırala",
|
||||
"LOCALE": "Dil",
|
||||
"SETTINGS_BUTTON": "Ayarlar",
|
||||
"NEW_BUTTON": "Yeni Məqalə",
|
||||
"FILTER": "Filter by",
|
||||
"SORT": "Sort by",
|
||||
"LOCALE": "Locale",
|
||||
"SETTINGS_BUTTON": "Settings",
|
||||
"NEW_BUTTON": "New Article",
|
||||
"DROPDOWN_OPTIONS": {
|
||||
"PUBLISHED": "Yayımlanıb",
|
||||
"DRAFT": "Qaralama",
|
||||
"ARCHIVED": "Arxivlənib"
|
||||
"PUBLISHED": "Published",
|
||||
"DRAFT": "Draft",
|
||||
"ARCHIVED": "Archived"
|
||||
},
|
||||
"TITLES": {
|
||||
"ALL_ARTICLES": "Bütün Məqalələr",
|
||||
"MINE": "Mənim Məqalələrim",
|
||||
"DRAFT": "Qaralama Məqalələr",
|
||||
"ARCHIVED": "Arxivləşdirilmiş Məqalələr"
|
||||
"ALL_ARTICLES": "All Articles",
|
||||
"MINE": "My Articles",
|
||||
"DRAFT": "Draft Articles",
|
||||
"ARCHIVED": "Archived Articles"
|
||||
},
|
||||
"LOCALE_SELECT": {
|
||||
"TITLE": "Dili seçin",
|
||||
"PLACEHOLDER": "Dili seçin",
|
||||
"NO_RESULT": "Dil tapılmadı",
|
||||
"SEARCH_PLACEHOLDER": "Dil axtarışı"
|
||||
"TITLE": "Select locale",
|
||||
"PLACEHOLDER": "Select locale",
|
||||
"NO_RESULT": "No locale found",
|
||||
"SEARCH_PLACEHOLDER": "Search locale"
|
||||
}
|
||||
},
|
||||
"EDIT_HEADER": {
|
||||
"ALL_ARTICLES": "Bütün məqalələr",
|
||||
"PUBLISH_BUTTON": "Yayımla",
|
||||
"MOVE_TO_ARCHIVE_BUTTON": "Arxivə köçür",
|
||||
"PREVIEW": "Önizləmə",
|
||||
"ADD_TRANSLATION": "Tərcümə əlavə et",
|
||||
"OPEN_SIDEBAR": "Yan paneli aç",
|
||||
"CLOSE_SIDEBAR": "Yan paneli bağla",
|
||||
"SAVING": "Yadda saxlanılır...",
|
||||
"SAVED": "Yadda saxlanıldı"
|
||||
"ALL_ARTICLES": "All Articles",
|
||||
"PUBLISH_BUTTON": "Publish",
|
||||
"MOVE_TO_ARCHIVE_BUTTON": "Move to archived",
|
||||
"PREVIEW": "Preview",
|
||||
"ADD_TRANSLATION": "Add translation",
|
||||
"OPEN_SIDEBAR": "Open sidebar",
|
||||
"CLOSE_SIDEBAR": "Close sidebar",
|
||||
"SAVING": "Saving...",
|
||||
"SAVED": "Saved"
|
||||
},
|
||||
"ARTICLE_EDITOR": {
|
||||
"IMAGE_UPLOAD": {
|
||||
"TITLE": "Şəkil yüklə",
|
||||
"UPLOADING": "Yüklənir...",
|
||||
"SUCCESS": "Şəkil uğurla yükləndi",
|
||||
"ERROR": "Şəkil yüklənərkən xəta baş verdi",
|
||||
"UN_AUTHORIZED_ERROR": "Şəkilləri yükləmək üçün icazəniz yoxdur",
|
||||
"ERROR_FILE_SIZE": "Şəkilin ölçüsü {size}MB-dən az olmalıdır",
|
||||
"ERROR_FILE_FORMAT": "Şəkil formatı jpg, jpeg və ya png olmalıdır",
|
||||
"ERROR_FILE_DIMENSIONS": "Şəkilin ölçüləri 2000 x 2000-dən az olmalıdır"
|
||||
"TITLE": "Upload image",
|
||||
"UPLOADING": "Uploading...",
|
||||
"SUCCESS": "Image uploaded successfully",
|
||||
"ERROR": "Error while uploading image",
|
||||
"UN_AUTHORIZED_ERROR": "You are not authorized to upload images",
|
||||
"ERROR_FILE_SIZE": "Image size should be less than {size}MB",
|
||||
"ERROR_FILE_FORMAT": "Image format should be jpg, jpeg or png",
|
||||
"ERROR_FILE_DIMENSIONS": "Image dimensions should be less than 2000 x 2000"
|
||||
}
|
||||
},
|
||||
"ARTICLE_SETTINGS": {
|
||||
"TITLE": "Məqalə parametrləri",
|
||||
"TITLE": "Article Settings",
|
||||
"FORM": {
|
||||
"CATEGORY": {
|
||||
"LABEL": "Kateqoriya",
|
||||
"TITLE": "Kateqoriya seçin",
|
||||
"PLACEHOLDER": "Kateqoriya seçin",
|
||||
"NO_RESULT": "Heç bir kateqoriya tapılmadı",
|
||||
"SEARCH_PLACEHOLDER": "Kateqoriya axtar"
|
||||
"LABEL": "Category",
|
||||
"TITLE": "Select category",
|
||||
"PLACEHOLDER": "Select category",
|
||||
"NO_RESULT": "No category found",
|
||||
"SEARCH_PLACEHOLDER": "Search category"
|
||||
},
|
||||
"AUTHOR": {
|
||||
"LABEL": "Müəllif",
|
||||
"TITLE": "Müəllif seçin",
|
||||
"PLACEHOLDER": "Müəllifi seçin",
|
||||
"NO_RESULT": "Müəllif tapılmadı",
|
||||
"SEARCH_PLACEHOLDER": "Müəllifi axtar"
|
||||
"LABEL": "Author",
|
||||
"TITLE": "Select author",
|
||||
"PLACEHOLDER": "Select author",
|
||||
"NO_RESULT": "No authors found",
|
||||
"SEARCH_PLACEHOLDER": "Search author"
|
||||
},
|
||||
"META_TITLE": {
|
||||
"LABEL": "Meta başlıq",
|
||||
"PLACEHOLDER": "Meta başlıq əlavə edin"
|
||||
"LABEL": "Meta title",
|
||||
"PLACEHOLDER": "Add a meta title"
|
||||
},
|
||||
"META_DESCRIPTION": {
|
||||
"LABEL": "Meta təsviri",
|
||||
"PLACEHOLDER": "Daha yaxşı SEO nəticələri üçün meta təsvir əlavə edin..."
|
||||
"LABEL": "Meta description",
|
||||
"PLACEHOLDER": "Add your meta description for better SEO results..."
|
||||
},
|
||||
"META_TAGS": {
|
||||
"LABEL": "Meta teqlər",
|
||||
"PLACEHOLDER": "Vergüllə ayrılmış meta teqlər əlavə edin..."
|
||||
"LABEL": "Meta tags",
|
||||
"PLACEHOLDER": "Add meta tags separated by comma..."
|
||||
}
|
||||
},
|
||||
"BUTTONS": {
|
||||
"ARCHIVE": "Məqaləni arxivləşdir",
|
||||
"DELETE": "Məqaləni sil"
|
||||
"ARCHIVE": "Archive article",
|
||||
"DELETE": "Delete article"
|
||||
}
|
||||
},
|
||||
"ARTICLE_SEARCH_RESULT": {
|
||||
"UNCATEGORIZED": "Kateqoriyasız",
|
||||
"UNCATEGORIZED": "Uncategorized",
|
||||
"SEARCH_RESULTS": "Search results for {query}",
|
||||
"EMPTY_TEXT": "Cavablara əlavə etmək üçün məqalələri axtarın.",
|
||||
"SEARCH_LOADER": "Axtarılır...",
|
||||
"INSERT_ARTICLE": "Daxil et",
|
||||
"NO_RESULT": "Məqalə tapılmadı",
|
||||
"COPY_LINK": "Məqalə linkini panoya kopyala",
|
||||
"OPEN_LINK": "Məqaləni yeni nişanda aç",
|
||||
"PREVIEW_LINK": "Məqaləyə önizləmə baxışı"
|
||||
"EMPTY_TEXT": "Search for articles to insert into replies.",
|
||||
"SEARCH_LOADER": "Searching...",
|
||||
"INSERT_ARTICLE": "Insert",
|
||||
"NO_RESULT": "No articles found",
|
||||
"COPY_LINK": "Copy article link to clipboard",
|
||||
"OPEN_LINK": "Open article in new tab",
|
||||
"PREVIEW_LINK": "Preview article"
|
||||
},
|
||||
"PORTAL": {
|
||||
"HEADER": "Portallar",
|
||||
"DEFAULT": "Defolt",
|
||||
"NEW_BUTTON": "Yeni Portal",
|
||||
"ACTIVE_BADGE": "aktiv",
|
||||
"CHOOSE_LOCALE_LABEL": "Bir dil seçin",
|
||||
"LOADING_MESSAGE": "Portallar yüklənir...",
|
||||
"ARTICLES_LABEL": "məqalələr",
|
||||
"NO_PORTALS_MESSAGE": "Mövcud portal yoxdur",
|
||||
"ADD_NEW_LOCALE": "Yeni dil əlavə et",
|
||||
"HEADER": "Portals",
|
||||
"DEFAULT": "Default",
|
||||
"NEW_BUTTON": "New Portal",
|
||||
"ACTIVE_BADGE": "active",
|
||||
"CHOOSE_LOCALE_LABEL": "Choose a locale",
|
||||
"LOADING_MESSAGE": "Loading portals...",
|
||||
"ARTICLES_LABEL": "articles",
|
||||
"NO_PORTALS_MESSAGE": "There are no available portals",
|
||||
"ADD_NEW_LOCALE": "Add a new locale",
|
||||
"POPOVER": {
|
||||
"TITLE": "Portallar",
|
||||
"PORTAL_SETTINGS": "Portal parametrləri",
|
||||
"SUBTITLE": "Bir neçə portalınız var və hər portal üçün fərqli dillər seçə bilərsiniz.",
|
||||
"CANCEL_BUTTON_LABEL": "Ləğv et",
|
||||
"CHOOSE_LOCALE_BUTTON": "Dil seçin"
|
||||
"TITLE": "Portals",
|
||||
"PORTAL_SETTINGS": "Portal settings",
|
||||
"SUBTITLE": "You have multiple portals and can have different locales for each portal.",
|
||||
"CANCEL_BUTTON_LABEL": "Cancel",
|
||||
"CHOOSE_LOCALE_BUTTON": "Choose Locale"
|
||||
},
|
||||
"PORTAL_SETTINGS": {
|
||||
"LIST_ITEM": {
|
||||
"HEADER": {
|
||||
"COUNT_LABEL": "məqalələr",
|
||||
"ADD": "Dil əlavə et",
|
||||
"VISIT": "Sayta bax",
|
||||
"SETTINGS": "Parametrlər",
|
||||
"DELETE": "Sil"
|
||||
"COUNT_LABEL": "articles",
|
||||
"ADD": "Add locale",
|
||||
"VISIT": "Visit site",
|
||||
"SETTINGS": "Settings",
|
||||
"DELETE": "Delete"
|
||||
},
|
||||
"PORTAL_CONFIG": {
|
||||
"TITLE": "Portal Konfiqurasiyaları",
|
||||
"TITLE": "Portal Configurations",
|
||||
"ITEMS": {
|
||||
"NAME": "Ad",
|
||||
"DOMAIN": "Xüsusi domen",
|
||||
"NAME": "Name",
|
||||
"DOMAIN": "Custom domain",
|
||||
"SLUG": "Slug",
|
||||
"TITLE": "Portal başlığı",
|
||||
"THEME": "Tema rəngi",
|
||||
"SUB_TEXT": "Portal alt mətni"
|
||||
"TITLE": "Portal title",
|
||||
"THEME": "Theme color",
|
||||
"SUB_TEXT": "Portal sub text"
|
||||
}
|
||||
},
|
||||
"AVAILABLE_LOCALES": {
|
||||
"TITLE": "Mövcud dillər",
|
||||
"TITLE": "Available locales",
|
||||
"TABLE": {
|
||||
"NAME": "Dil adı",
|
||||
"CODE": "Dil kodu",
|
||||
"ARTICLE_COUNT": "Məqalələrin sayı",
|
||||
"CATEGORIES": "Kateqoriyaların sayı",
|
||||
"SWAP": "Dəyişdir",
|
||||
"DELETE": "Sil",
|
||||
"DEFAULT_LOCALE": "Əsas"
|
||||
"NAME": "Locale name",
|
||||
"CODE": "Locale code",
|
||||
"ARTICLE_COUNT": "No. of articles",
|
||||
"CATEGORIES": "No. of categories",
|
||||
"SWAP": "Swap",
|
||||
"DELETE": "Delete",
|
||||
"DEFAULT_LOCALE": "Default"
|
||||
}
|
||||
}
|
||||
},
|
||||
"DELETE_PORTAL": {
|
||||
"TITLE": "Portalı sil",
|
||||
"MESSAGE": "Bu portalı silmək istədiyinizə əminsiniz",
|
||||
"YES": "Bəli, portalı sil",
|
||||
"NO": "Xeyr, portalı saxla",
|
||||
"TITLE": "Delete portal",
|
||||
"MESSAGE": "Are you sure you want to delete this portal",
|
||||
"YES": "Yes, delete portal",
|
||||
"NO": "No, keep portal",
|
||||
"API": {
|
||||
"DELETE_SUCCESS": "Portal uğurla silindi",
|
||||
"DELETE_ERROR": "Portal silinərkən xəta baş verdi"
|
||||
"DELETE_SUCCESS": "Portal deleted successfully",
|
||||
"DELETE_ERROR": "Error while deleting portal"
|
||||
}
|
||||
},
|
||||
"SEND_CNAME_INSTRUCTIONS": {
|
||||
@@ -166,192 +166,192 @@
|
||||
}
|
||||
},
|
||||
"EDIT": {
|
||||
"HEADER_TEXT": "Portalı redaktə et",
|
||||
"HEADER_TEXT": "Edit portal",
|
||||
"TABS": {
|
||||
"BASIC_SETTINGS": {
|
||||
"TITLE": "Əsas məlumat"
|
||||
"TITLE": "Basic information"
|
||||
},
|
||||
"CUSTOMIZATION_SETTINGS": {
|
||||
"TITLE": "Portal fərdiləşdirilməsi"
|
||||
"TITLE": "Portal customization"
|
||||
},
|
||||
"CATEGORY_SETTINGS": {
|
||||
"TITLE": "Kateqoriyalar"
|
||||
"TITLE": "Categories"
|
||||
},
|
||||
"LOCALE_SETTINGS": {
|
||||
"TITLE": "Dillər"
|
||||
"TITLE": "Locales"
|
||||
}
|
||||
},
|
||||
"CATEGORIES": {
|
||||
"TITLE": "Kateqoriyalar",
|
||||
"NEW_CATEGORY": "Yeni kateqoriya",
|
||||
"TITLE": "Categories in",
|
||||
"NEW_CATEGORY": "New category",
|
||||
"TABLE": {
|
||||
"NAME": "Ad",
|
||||
"DESCRIPTION": "Təsvir",
|
||||
"LOCALE": "Dil",
|
||||
"ARTICLE_COUNT": "Məqalələrin sayı",
|
||||
"NAME": "Name",
|
||||
"DESCRIPTION": "Description",
|
||||
"LOCALE": "Locale",
|
||||
"ARTICLE_COUNT": "No. of articles",
|
||||
"ACTION_BUTTON": {
|
||||
"EDIT": "Kateqoriyanı redaktə et",
|
||||
"DELETE": "Kateqoriyanı sil"
|
||||
"EDIT": "Edit category",
|
||||
"DELETE": "Delete category"
|
||||
},
|
||||
"EMPTY_TEXT": "Kateqoriyalar tapılmadı"
|
||||
"EMPTY_TEXT": "No categories found"
|
||||
}
|
||||
},
|
||||
"EDIT_BASIC_INFO": {
|
||||
"BUTTON_TEXT": "Əsas parametrləri yenilə"
|
||||
"BUTTON_TEXT": "Update basic settings"
|
||||
}
|
||||
},
|
||||
"ADD": {
|
||||
"CREATE_FLOW": {
|
||||
"BASIC": {
|
||||
"TITLE": "Kömək mərkəzi məlumatları",
|
||||
"BODY": "Portal haqqında əsas məlumat"
|
||||
"TITLE": "Help center information",
|
||||
"BODY": "Basic information about portal"
|
||||
},
|
||||
"CUSTOMIZATION": {
|
||||
"TITLE": "Kömək mərkəzinin fərdiləşdirilməsi",
|
||||
"BODY": "Portalı fərdiləşdirin"
|
||||
"TITLE": "Help center customization",
|
||||
"BODY": "Customize portal"
|
||||
},
|
||||
"FINISH": {
|
||||
"TITLE": "Budur! 🎉",
|
||||
"TITLE": "Voila! 🎉",
|
||||
"BODY": "You're all set!"
|
||||
}
|
||||
},
|
||||
"CREATE_FLOW_PAGE": {
|
||||
"BACK_BUTTON": "Geri",
|
||||
"BACK_BUTTON": "Back",
|
||||
"BASIC_SETTINGS_PAGE": {
|
||||
"HEADER": "Portal yarat",
|
||||
"TITLE": "Kömək mərkəzi məlumatları",
|
||||
"CREATE_BASIC_SETTING_BUTTON": "Portalun əsas parametrlərini yarat"
|
||||
"HEADER": "Create Portal",
|
||||
"TITLE": "Help center information",
|
||||
"CREATE_BASIC_SETTING_BUTTON": "Create portal basic settings"
|
||||
},
|
||||
"CUSTOMIZATION_PAGE": {
|
||||
"HEADER": "Portal fərdiləşdirilməsi",
|
||||
"TITLE": "Kömək mərkəzinin fərdiləşdirilməsi",
|
||||
"UPDATE_PORTAL_BUTTON": "Portal parametrlərini yenilə"
|
||||
"HEADER": "Portal customisation",
|
||||
"TITLE": "Help center customization",
|
||||
"UPDATE_PORTAL_BUTTON": "Update portal settings"
|
||||
},
|
||||
"FINISH_PAGE": {
|
||||
"TITLE": "Voila!🎉 Hər şey hazırdır!",
|
||||
"MESSAGE": "İndi bu yaradılmış portala bütün portallar səhifənizdən baxa bilərsiniz.",
|
||||
"FINISH": "Bütün portallar səhifəsinə keç"
|
||||
"TITLE": "Voila!🎉 You're all set up!",
|
||||
"MESSAGE": "You can now see this created portal on your all portals page.",
|
||||
"FINISH": "Go to all portals page"
|
||||
}
|
||||
},
|
||||
"LOGO": {
|
||||
"LABEL": "Logo",
|
||||
"UPLOAD_BUTTON": "Loqonu yüklə",
|
||||
"HELP_TEXT": "Bu logo portal başlığında göstəriləcək.",
|
||||
"IMAGE_UPLOAD_SUCCESS": "Loqo uğurla yükləndi",
|
||||
"IMAGE_UPLOAD_ERROR": "Loqo uğurla silindi",
|
||||
"IMAGE_DELETE_ERROR": "Loqo silinərkən xəta baş verdi"
|
||||
"UPLOAD_BUTTON": "Upload logo",
|
||||
"HELP_TEXT": "This logo will be displayed on the portal header.",
|
||||
"IMAGE_UPLOAD_SUCCESS": "Logo uploaded successfully",
|
||||
"IMAGE_UPLOAD_ERROR": "Logo deleted successfully",
|
||||
"IMAGE_DELETE_ERROR": "Error while deleting logo"
|
||||
},
|
||||
"NAME": {
|
||||
"LABEL": "Ad",
|
||||
"PLACEHOLDER": "Portal adı",
|
||||
"HELP_TEXT": "Ad daxili olaraq ictimai portalda istifadə olunacaq.",
|
||||
"ERROR": "Ad tələb olunur"
|
||||
"LABEL": "Name",
|
||||
"PLACEHOLDER": "Portal name",
|
||||
"HELP_TEXT": "The name will be used in the public facing portal internally.",
|
||||
"ERROR": "Name is required"
|
||||
},
|
||||
"SLUG": {
|
||||
"LABEL": "Slug",
|
||||
"PLACEHOLDER": "Portal slug URL-lər üçün",
|
||||
"ERROR": "Slug tələb olunur"
|
||||
"PLACEHOLDER": "Portal slug for urls",
|
||||
"ERROR": "Slug is required"
|
||||
},
|
||||
"DOMAIN": {
|
||||
"LABEL": "Xüsusi domen",
|
||||
"PLACEHOLDER": "Portalun xüsusi domeni",
|
||||
"LABEL": "Custom Domain",
|
||||
"PLACEHOLDER": "Portal custom domain",
|
||||
"HELP_TEXT": "Add only If you want to use a custom domain for your portals. Eg: {exampleURL}",
|
||||
"ERROR": "Etibarlı domen URL-si daxil edin"
|
||||
"ERROR": "Enter a valid domain URL"
|
||||
},
|
||||
"HOME_PAGE_LINK": {
|
||||
"LABEL": "Ana səhifə linki",
|
||||
"PLACEHOLDER": "Portalun ana səhifə linki",
|
||||
"LABEL": "Home Page Link",
|
||||
"PLACEHOLDER": "Portal home page link",
|
||||
"HELP_TEXT": "The link used to return from the portal to the home page. Eg: {exampleURL}",
|
||||
"ERROR": "Etibarlı ana səhifə URL-si daxil edin"
|
||||
"ERROR": "Enter a valid home page URL"
|
||||
},
|
||||
"THEME_COLOR": {
|
||||
"LABEL": "Portal tema rəngi",
|
||||
"HELP_TEXT": "Bu rəng portal üçün tema rəngi kimi göstəriləcək."
|
||||
"LABEL": "Portal theme color",
|
||||
"HELP_TEXT": "This color will show as the theme color for the portal."
|
||||
},
|
||||
"PAGE_TITLE": {
|
||||
"LABEL": "Səhifə Başlığı",
|
||||
"PLACEHOLDER": "Portal səhifəsinin başlığı",
|
||||
"HELP_TEXT": "Səhifənin başlığı ictimai portalda istifadə olunacaq.",
|
||||
"ERROR": "Səhifə başlığı tələb olunur"
|
||||
"LABEL": "Page Title",
|
||||
"PLACEHOLDER": "Portal page title",
|
||||
"HELP_TEXT": "The page title will be used in the public facing portal.",
|
||||
"ERROR": "Page title is required"
|
||||
},
|
||||
"HEADER_TEXT": {
|
||||
"LABEL": "Başlıq Mətn",
|
||||
"PLACEHOLDER": "Portal başlıq mətni",
|
||||
"HELP_TEXT": "Portal başlıq mətni ictimai portalda istifadə olunacaq.",
|
||||
"ERROR": "Portal başlıq mətni tələb olunur"
|
||||
"LABEL": "Header Text",
|
||||
"PLACEHOLDER": "Portal header text",
|
||||
"HELP_TEXT": "The Portal header text will be used in the public facing portal.",
|
||||
"ERROR": "Portal header text is required"
|
||||
},
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE_FOR_BASIC": "Portal uğurla yaradıldı.",
|
||||
"ERROR_MESSAGE_FOR_BASIC": "Portal yaradıla bilmədi. Yenidən cəhd edin.",
|
||||
"SUCCESS_MESSAGE_FOR_UPDATE": "Portal uğurla yeniləndi.",
|
||||
"ERROR_MESSAGE_FOR_UPDATE": "Portal yenilənə bilmədi. Yenidən cəhd edin."
|
||||
"SUCCESS_MESSAGE_FOR_BASIC": "Portal created successfully.",
|
||||
"ERROR_MESSAGE_FOR_BASIC": "Couldn't create the portal. Try again.",
|
||||
"SUCCESS_MESSAGE_FOR_UPDATE": "Portal updated successfully.",
|
||||
"ERROR_MESSAGE_FOR_UPDATE": "Couldn't update the portal. Try again."
|
||||
}
|
||||
},
|
||||
"ADD_LOCALE": {
|
||||
"TITLE": "Yeni dil əlavə et",
|
||||
"SUB_TITLE": "Bu, mövcud tərcümə siyahınıza yeni bir dil əlavə edir.",
|
||||
"TITLE": "Add a new locale",
|
||||
"SUB_TITLE": "This adds a new locale to your available translation list.",
|
||||
"PORTAL": "Portal",
|
||||
"LOCALE": {
|
||||
"LABEL": "Dil",
|
||||
"PLACEHOLDER": "Dil seçin",
|
||||
"ERROR": "Dil tələb olunur"
|
||||
"LABEL": "Locale",
|
||||
"PLACEHOLDER": "Choose a locale",
|
||||
"ERROR": "Locale is required"
|
||||
},
|
||||
"BUTTONS": {
|
||||
"CREATE": "Dili yarat",
|
||||
"CANCEL": "Ləğv et"
|
||||
"CREATE": "Create locale",
|
||||
"CANCEL": "Cancel"
|
||||
},
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "Dil uğurla əlavə edildi",
|
||||
"ERROR_MESSAGE": "Dil əlavə etmək mümkün olmadı. Yenidən cəhd edin."
|
||||
"SUCCESS_MESSAGE": "Locale added successfully",
|
||||
"ERROR_MESSAGE": "Unable to add locale. Try again."
|
||||
}
|
||||
},
|
||||
"CHANGE_DEFAULT_LOCALE": {
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "Əsas dil uğurla yeniləndi",
|
||||
"ERROR_MESSAGE": "Əsas dili yeniləmək mümkün olmadı. Yenidən cəhd edin."
|
||||
"SUCCESS_MESSAGE": "Default locale updated successfully",
|
||||
"ERROR_MESSAGE": "Unable to update default locale. Try again."
|
||||
}
|
||||
},
|
||||
"DELETE_LOCALE": {
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "Dil portaldan uğurla silindi",
|
||||
"ERROR_MESSAGE": "Dili portaldan silmək mümkün olmadı. Yenidən cəhd edin."
|
||||
"SUCCESS_MESSAGE": "Locale removed from portal successfully",
|
||||
"ERROR_MESSAGE": "Unable to remove locale from portal. Try again."
|
||||
}
|
||||
}
|
||||
},
|
||||
"TABLE": {
|
||||
"LOADING_MESSAGE": "Məqalələr yüklənir...",
|
||||
"404": "Axtarışınıza uyğun məqalə tapılmadı 🔍",
|
||||
"NO_ARTICLES": "Mövcud məqalə yoxdur",
|
||||
"LOADING_MESSAGE": "Loading articles...",
|
||||
"404": "No articles matches your search 🔍",
|
||||
"NO_ARTICLES": "There are no available articles",
|
||||
"HEADERS": {
|
||||
"TITLE": "Başlıq",
|
||||
"CATEGORY": "Kateqoriya",
|
||||
"READ_COUNT": "Baxışlar",
|
||||
"STATUS": "Vəziyyət",
|
||||
"LAST_EDITED": "Son redaktə"
|
||||
"TITLE": "Title",
|
||||
"CATEGORY": "Category",
|
||||
"READ_COUNT": "Views",
|
||||
"STATUS": "Status",
|
||||
"LAST_EDITED": "Last edited"
|
||||
},
|
||||
"COLUMNS": {
|
||||
"BY": "tərəfindən",
|
||||
"AUTHOR_NOT_AVAILABLE": "Müəllif mövcud deyil"
|
||||
"BY": "by",
|
||||
"AUTHOR_NOT_AVAILABLE": "Author is not available"
|
||||
}
|
||||
},
|
||||
"EDIT_ARTICLE": {
|
||||
"LOADING": "Məqalə yüklənir...",
|
||||
"TITLE_PLACEHOLDER": "Məqalənin başlığı buraya yazılır",
|
||||
"CONTENT_PLACEHOLDER": "Məqalənizi buraya yazın",
|
||||
"LOADING": "Loading article...",
|
||||
"TITLE_PLACEHOLDER": "Article title goes here",
|
||||
"CONTENT_PLACEHOLDER": "Write your article here",
|
||||
"API": {
|
||||
"ERROR": "Məqalə yadda saxlanarkən xəta baş verdi"
|
||||
"ERROR": "Error while saving article"
|
||||
}
|
||||
},
|
||||
"PUBLISH_ARTICLE": {
|
||||
"API": {
|
||||
"ERROR": "Məqalə yayımlanarkən xəta baş verdi",
|
||||
"SUCCESS": "Məqalə uğurla dərc olundu"
|
||||
"ERROR": "Error while publishing article",
|
||||
"SUCCESS": "Article published successfully"
|
||||
}
|
||||
},
|
||||
"ARCHIVE_ARTICLE": {
|
||||
"API": {
|
||||
"ERROR": "Məqalə arxivlənərkən xəta baş verdi",
|
||||
"SUCCESS": "Məqalə uğurla arxivləndi"
|
||||
"ERROR": "Error while archiving article",
|
||||
"SUCCESS": "Article archived successfully"
|
||||
}
|
||||
},
|
||||
"DRAFT_ARTICLE": {
|
||||
@@ -363,15 +363,15 @@
|
||||
"DELETE_ARTICLE": {
|
||||
"MODAL": {
|
||||
"CONFIRM": {
|
||||
"TITLE": "Silinməni təsdiqləyin",
|
||||
"MESSAGE": "Məqaləni silmək istədiyinizə əminsiniz?",
|
||||
"YES": "Bəli, sil",
|
||||
"NO": "Xeyr, Saxla"
|
||||
"TITLE": "Confirm Deletion",
|
||||
"MESSAGE": "Are you sure to delete the article?",
|
||||
"YES": "Yes, Delete",
|
||||
"NO": "No, Keep it"
|
||||
}
|
||||
},
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "Məqalə uğurla silindi",
|
||||
"ERROR_MESSAGE": "Məqaləni silərkən xəta baş verdi"
|
||||
"SUCCESS_MESSAGE": "Article deleted successfully",
|
||||
"ERROR_MESSAGE": "Error while deleting article"
|
||||
}
|
||||
},
|
||||
"REORDER_ARTICLE": {
|
||||
@@ -385,126 +385,126 @@
|
||||
}
|
||||
},
|
||||
"CREATE_ARTICLE": {
|
||||
"ERROR_MESSAGE": "Zəhmət olmasa məqalənin başlığını və məzmununu əlavə edin, yalnız bundan sonra parametrləri yeniləyə bilərsiniz"
|
||||
"ERROR_MESSAGE": "Please add the article heading and content then only you can update the settings"
|
||||
},
|
||||
"SIDEBAR": {
|
||||
"SEARCH": {
|
||||
"PLACEHOLDER": "Məqalələrdə axtarış"
|
||||
"PLACEHOLDER": "Search for articles"
|
||||
}
|
||||
},
|
||||
"CATEGORY": {
|
||||
"ADD": {
|
||||
"TITLE": "Kateqoriya yaradın",
|
||||
"SUB_TITLE": "Kateqoriya, məqalələri kateqoriyalara ayırmaq üçün ictimai portalda istifadə olunacaq.",
|
||||
"TITLE": "Create a category",
|
||||
"SUB_TITLE": "The category will be used in the public facing portal to categorize articles.",
|
||||
"PORTAL": "Portal",
|
||||
"LOCALE": "Dil",
|
||||
"LOCALE": "Locale",
|
||||
"NAME": {
|
||||
"LABEL": "Ad",
|
||||
"PLACEHOLDER": "Kateqoriya adı",
|
||||
"HELP_TEXT": "Kateqoriya adı və ikonu məqalələri kateqoriyalara ayırmaq üçün ictimai portalda istifadə olunacaq.",
|
||||
"ERROR": "Ad tələb olunur"
|
||||
"LABEL": "Name",
|
||||
"PLACEHOLDER": "Category name",
|
||||
"HELP_TEXT": "The category name and icon will be used in the public facing portal to categorize articles.",
|
||||
"ERROR": "Name is required"
|
||||
},
|
||||
"SLUG": {
|
||||
"LABEL": "Slug",
|
||||
"PLACEHOLDER": "URL-lər üçün kateqoriya slug-u",
|
||||
"PLACEHOLDER": "Category slug for urls",
|
||||
"HELP_TEXT": "app.chatwoot.com/hc/my-portal/en-US/categories/my-slug",
|
||||
"ERROR": "Slug tələb olunur"
|
||||
"ERROR": "Slug is required"
|
||||
},
|
||||
"DESCRIPTION": {
|
||||
"LABEL": "Təsvir",
|
||||
"PLACEHOLDER": "Kateqoriya haqqında qısa təsvir verin.",
|
||||
"ERROR": "Təsvir tələb olunur"
|
||||
"LABEL": "Description",
|
||||
"PLACEHOLDER": "Give a short description about the category.",
|
||||
"ERROR": "Description is required"
|
||||
},
|
||||
"BUTTONS": {
|
||||
"CREATE": "Kateqoriya yarat",
|
||||
"CANCEL": "Ləğv et"
|
||||
"CREATE": "Create category",
|
||||
"CANCEL": "Cancel"
|
||||
},
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "Kateqoriya uğurla yaradıldı",
|
||||
"ERROR_MESSAGE": "Kateqoriya yaratmaq mümkün olmadı"
|
||||
"SUCCESS_MESSAGE": "Category created successfully",
|
||||
"ERROR_MESSAGE": "Unable to create category"
|
||||
}
|
||||
},
|
||||
"EDIT": {
|
||||
"TITLE": "Kateqoriyanı redaktə et",
|
||||
"SUB_TITLE": "Kateqoriyanın redaktəsi ictimai portalda kateqoriyanı yeniləyəcək.",
|
||||
"TITLE": "Edit a category",
|
||||
"SUB_TITLE": "Editing a category will update the category in the public facing portal.",
|
||||
"PORTAL": "Portal",
|
||||
"LOCALE": "Dil",
|
||||
"LOCALE": "Locale",
|
||||
"NAME": {
|
||||
"LABEL": "Ad",
|
||||
"PLACEHOLDER": "Kateqoriya adı",
|
||||
"HELP_TEXT": "Kateqoriya adı və ikonu məqalələri kateqoriyalara ayırmaq üçün ictimai portalda istifadə olunacaq.",
|
||||
"ERROR": "Ad tələb olunur"
|
||||
"LABEL": "Name",
|
||||
"PLACEHOLDER": "Category name",
|
||||
"HELP_TEXT": "The category name and icon will be used in the public facing portal to categorize articles.",
|
||||
"ERROR": "Name is required"
|
||||
},
|
||||
"SLUG": {
|
||||
"LABEL": "Slug",
|
||||
"PLACEHOLDER": "URL-lər üçün kateqoriya slug-u",
|
||||
"PLACEHOLDER": "Category slug for urls",
|
||||
"HELP_TEXT": "app.chatwoot.com/hc/my-portal/en-US/categories/my-slug",
|
||||
"ERROR": "Slug tələb olunur"
|
||||
"ERROR": "Slug is required"
|
||||
},
|
||||
"DESCRIPTION": {
|
||||
"LABEL": "Təsvir",
|
||||
"PLACEHOLDER": "Kateqoriya haqqında qısa təsvir verin.",
|
||||
"ERROR": "Təsvir tələb olunur"
|
||||
"LABEL": "Description",
|
||||
"PLACEHOLDER": "Give a short description about the category.",
|
||||
"ERROR": "Description is required"
|
||||
},
|
||||
"BUTTONS": {
|
||||
"CREATE": "Kateqoriyanı yenilə",
|
||||
"CANCEL": "Ləğv et"
|
||||
"CREATE": "Update category",
|
||||
"CANCEL": "Cancel"
|
||||
},
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "Kateqoriya uğurla yeniləndi",
|
||||
"ERROR_MESSAGE": "Kateqoriyanı yeniləmək mümkün olmadı"
|
||||
"SUCCESS_MESSAGE": "Category updated successfully",
|
||||
"ERROR_MESSAGE": "Unable to update category"
|
||||
}
|
||||
},
|
||||
"DELETE": {
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "Kateqoriya uğurla silindi",
|
||||
"ERROR_MESSAGE": "Kateqoriyanı silmək mümkün olmadı"
|
||||
"SUCCESS_MESSAGE": "Category deleted successfully",
|
||||
"ERROR_MESSAGE": "Unable to delete category"
|
||||
}
|
||||
}
|
||||
},
|
||||
"ARTICLE_SEARCH": {
|
||||
"TITLE": "Məqalələrdə axtarış edin",
|
||||
"PLACEHOLDER": "Məqalələrdə axtarış edin",
|
||||
"NO_RESULT": "Məqalə tapılmadı",
|
||||
"SEARCHING": "Axtarılır...",
|
||||
"SEARCH_BUTTON": "Axtar",
|
||||
"INSERT_ARTICLE": "Link əlavə et",
|
||||
"IFRAME_ERROR": "URL boş və ya düzgün deyil. Məzmun göstərilə bilmir.",
|
||||
"OPEN_ARTICLE_SEARCH": "Kömək Mərkəzindən məqalə əlavə et",
|
||||
"SUCCESS_ARTICLE_INSERTED": "Məqalə uğurla əlavə edildi",
|
||||
"PREVIEW_LINK": "Məqaləni önizləyin",
|
||||
"CANCEL": "Bağla",
|
||||
"BACK": "Geri",
|
||||
"BACK_RESULTS": "Nəticələrə qayıdın"
|
||||
"TITLE": "Search articles",
|
||||
"PLACEHOLDER": "Search articles",
|
||||
"NO_RESULT": "No articles found",
|
||||
"SEARCHING": "Searching...",
|
||||
"SEARCH_BUTTON": "Search",
|
||||
"INSERT_ARTICLE": "Insert link",
|
||||
"IFRAME_ERROR": "URL is empty or invalid. Unable to display content.",
|
||||
"OPEN_ARTICLE_SEARCH": "Insert article from Help Center",
|
||||
"SUCCESS_ARTICLE_INSERTED": "Article inserted successfully",
|
||||
"PREVIEW_LINK": "Preview article",
|
||||
"CANCEL": "Close",
|
||||
"BACK": "Back",
|
||||
"BACK_RESULTS": "Back to results"
|
||||
},
|
||||
"UPGRADE_PAGE": {
|
||||
"TITLE": "Kömək Mərkəzi",
|
||||
"DESCRIPTION": "İstifadəçi dostu özünə xidmət portalları yaradın. İstifadəçilərinizə məqalələrə daxil olmaq və 24/7 dəstək almaqda kömək edin. Bu funksiyanı aktivləşdirmək üçün abunəliyinizi yüksəldin.",
|
||||
"SELF_HOSTED_DESCRIPTION": "İstifadəçi dostu özünə xidmət portalları yaradın. İstifadəçilərinizə məqalələrə daxil olmaq və 24/7 dəstək almaqda kömək edin. Zəhmət olmasa, bu funksiyanı aktivləşdirmək üçün administratorunuzla əlaqə saxlayın.",
|
||||
"TITLE": "Help Center",
|
||||
"DESCRIPTION": "Create user-friendly self-service portals. Help your users to access the articles and get support 24/7. Upgrade your subscription to enable this feature.",
|
||||
"SELF_HOSTED_DESCRIPTION": "Create user-friendly self-service portals. Help your users to access the articles and get support 24/7. Please contact your administrator to enable this feature.",
|
||||
"BUTTON": {
|
||||
"LEARN_MORE": "Ətraflı öyrən",
|
||||
"UPGRADE": "Yenilə"
|
||||
"LEARN_MORE": "Learn more",
|
||||
"UPGRADE": "Upgrade"
|
||||
},
|
||||
"FEATURES": {
|
||||
"PORTALS": {
|
||||
"TITLE": "Çoxsaylı portallar",
|
||||
"DESCRIPTION": "Eyni hesabdan istifadə edərək müxtəlif məhsullar üçün çoxsaylı kömək mərkəzi portalları yaradın."
|
||||
"TITLE": "Multiple portals",
|
||||
"DESCRIPTION": "Create multiple help center portals for different products using the same account."
|
||||
},
|
||||
"LOCALES": {
|
||||
"TITLE": "Dil variantlarının tam dəstəyi",
|
||||
"DESCRIPTION": "Portalı öz dilinizə uyğunlaşdırın. Bütün dil variantlarını dəstəkləyirik və hər məqalə üçün tərcümələrə imkan veririk."
|
||||
"TITLE": "Full support for locales",
|
||||
"DESCRIPTION": "Localize the portal in your language. We support all locales and allow translations for every article."
|
||||
},
|
||||
"SEO": {
|
||||
"TITLE": "SEO-ya uyğun dizayn",
|
||||
"DESCRIPTION": "Meta teqlərinizi fərdiləşdirərək axtarış motorlarında görünürlüğünüzü SEO dostu səhifələrimizlə artırın."
|
||||
"TITLE": "SEO-friendly design",
|
||||
"DESCRIPTION": "Customize your meta tags to improve your visibility on search engines with our SEO-friendly pages."
|
||||
},
|
||||
"API": {
|
||||
"TITLE": "Tam API dəstəyi",
|
||||
"DESCRIPTION": "Portaldan üçüncü tərəf ön çərçivələri ilə başsız CMS kimi istifadə etmək üçün API-lərimizdən yararlanın."
|
||||
"TITLE": "Full API support",
|
||||
"DESCRIPTION": "Use the portal as a headless CMS with third party front-end frameworks using our APIs."
|
||||
}
|
||||
}
|
||||
},
|
||||
"LOADING": "Yüklənir...",
|
||||
"LOADING": "Loading...",
|
||||
"ARTICLES_PAGE": {
|
||||
"ARTICLE_CARD": {
|
||||
"CARD": {
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,138 +1,138 @@
|
||||
{
|
||||
"REPORT": {
|
||||
"HEADER": "Söhbətlər",
|
||||
"HEADER": "Conversations",
|
||||
"LOADING_CHART": "Loading chart data...",
|
||||
"NO_ENOUGH_DATA": "Hesabat yaratmaq üçün kifayət qədər məlumat nöqtəsi alınmayıb, zəhmət olmasa bir az sonra yenidən cəhd edin.",
|
||||
"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": "Məlumatları əldə etmək mümkün olmadı, zəhmət olmasa bir az sonra yenidən cəhd edin.",
|
||||
"SUMMARY_FETCHING_FAILED": "Yekunu əldə etmək mümkün olmadı, zəhmət olmasa bir az sonra yenidən cəhd edin.",
|
||||
"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": "Söhbətlər",
|
||||
"DESC": "( Ümumi )"
|
||||
"NAME": "Conversations",
|
||||
"DESC": "( Total )"
|
||||
},
|
||||
"INCOMING_MESSAGES": {
|
||||
"NAME": "Messages received",
|
||||
"DESC": "( Ümumi )"
|
||||
"DESC": "( Total )"
|
||||
},
|
||||
"OUTGOING_MESSAGES": {
|
||||
"NAME": "Messages sent",
|
||||
"DESC": "( Ümumi )"
|
||||
"DESC": "( Total )"
|
||||
},
|
||||
"FIRST_RESPONSE_TIME": {
|
||||
"NAME": "İlk Cavab Vaxtı",
|
||||
"DESC": "( Orta )",
|
||||
"INFO_TEXT": "Hesablama üçün istifadə olunan ümumi söhbət sayı:",
|
||||
"TOOLTIP_TEXT": "İlkin cavab vaxtı {metricValue}-dir ({conversationCount} söhbət əsasında)"
|
||||
"NAME": "First Response Time",
|
||||
"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": "Həll Vaxtı",
|
||||
"DESC": "( Orta )",
|
||||
"INFO_TEXT": "Hesablama üçün istifadə olunan ümumi söhbət sayı:",
|
||||
"TOOLTIP_TEXT": "Həll vaxtı {metricValue}-dir ({conversationCount} söhbət əsasında)"
|
||||
"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": "Həll Sayı",
|
||||
"DESC": "( Ümumi )"
|
||||
"NAME": "Resolution Count",
|
||||
"DESC": "( Total )"
|
||||
},
|
||||
"BOT_RESOLUTION_COUNT": {
|
||||
"NAME": "Həll sayı",
|
||||
"DESC": "( Ümumi )"
|
||||
"NAME": "Resolution Count",
|
||||
"DESC": "( Total )"
|
||||
},
|
||||
"BOT_HANDOFF_COUNT": {
|
||||
"NAME": "Təslim Sayı",
|
||||
"DESC": "( Ümumi )"
|
||||
"NAME": "Handoff Count",
|
||||
"DESC": "( Total )"
|
||||
},
|
||||
"REPLY_TIME": {
|
||||
"NAME": "Customer waiting time",
|
||||
"TOOLTIP_TEXT": "Gözləmə vaxtı {metricValue}-dir ({conversationCount} cavab əsasında)",
|
||||
"TOOLTIP_TEXT": "Waiting time is {metricValue} (based on {conversationCount} replies)",
|
||||
"DESC": ""
|
||||
}
|
||||
},
|
||||
"DATE_RANGE_OPTIONS": {
|
||||
"LAST_7_DAYS": "Son 7 gün",
|
||||
"LAST_14_DAYS": "Son 14 gün",
|
||||
"LAST_30_DAYS": "Son 30 gün",
|
||||
"THIS_MONTH": "Bu ay",
|
||||
"LAST_MONTH": "Keçən ay",
|
||||
"LAST_3_MONTHS": "Son 3 ay",
|
||||
"LAST_6_MONTHS": "Son 6 ay",
|
||||
"LAST_YEAR": "Keçən il",
|
||||
"LAST_7_DAYS": "Last 7 days",
|
||||
"LAST_14_DAYS": "Last 14 days",
|
||||
"LAST_30_DAYS": "Last 30 days",
|
||||
"THIS_MONTH": "This month",
|
||||
"LAST_MONTH": "Last month",
|
||||
"LAST_3_MONTHS": "Last 3 months",
|
||||
"LAST_6_MONTHS": "Last 6 months",
|
||||
"LAST_YEAR": "Last year",
|
||||
"CUSTOM_DATE_RANGE": "Custom date range"
|
||||
},
|
||||
"CUSTOM_DATE_RANGE": {
|
||||
"CONFIRM": "Tətbiq et",
|
||||
"CONFIRM": "Apply",
|
||||
"PLACEHOLDER": "Select date range"
|
||||
},
|
||||
"GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By",
|
||||
"DURATION_FILTER_LABEL": "Müddət",
|
||||
"DURATION_FILTER_LABEL": "Duration",
|
||||
"GROUPING_OPTIONS": {
|
||||
"DAY": "Gün",
|
||||
"WEEK": "Həftə",
|
||||
"MONTH": "Ay",
|
||||
"YEAR": "İl"
|
||||
"DAY": "Day",
|
||||
"WEEK": "Week",
|
||||
"MONTH": "Month",
|
||||
"YEAR": "Year"
|
||||
},
|
||||
"GROUP_BY_DAY_OPTIONS": [
|
||||
{
|
||||
"id": 1,
|
||||
"groupBy": "Gün"
|
||||
"groupBy": "Day"
|
||||
}
|
||||
],
|
||||
"GROUP_BY_WEEK_OPTIONS": [
|
||||
{
|
||||
"id": 1,
|
||||
"groupBy": "Gün"
|
||||
"groupBy": "Day"
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"groupBy": "Həftə"
|
||||
"groupBy": "Week"
|
||||
}
|
||||
],
|
||||
"GROUP_BY_MONTH_OPTIONS": [
|
||||
{
|
||||
"id": 1,
|
||||
"groupBy": "Gün"
|
||||
"groupBy": "Day"
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"groupBy": "Həftə"
|
||||
"groupBy": "Week"
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"groupBy": "Ay"
|
||||
"groupBy": "Month"
|
||||
}
|
||||
],
|
||||
"GROUP_BY_YEAR_OPTIONS": [
|
||||
{
|
||||
"id": 2,
|
||||
"groupBy": "Həftə"
|
||||
"groupBy": "Week"
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"groupBy": "Ay"
|
||||
"groupBy": "Month"
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"groupBy": "İl"
|
||||
"groupBy": "Year"
|
||||
}
|
||||
],
|
||||
"BUSINESS_HOURS": "İş Saatları",
|
||||
"BUSINESS_HOURS": "Business Hours",
|
||||
"FILTER_ACTIONS": {
|
||||
"CLEAR_FILTER": "Clear filter",
|
||||
"EMPTY_LIST": "Nəticə tapılmadı"
|
||||
"EMPTY_LIST": "No results found"
|
||||
},
|
||||
"PAGINATION": {
|
||||
"RESULTS": "{total} nəticədən {start} - {end} göstərilir",
|
||||
"PER_PAGE_TEMPLATE": "{size} / səhifə"
|
||||
"RESULTS": "Showing {start} to {end} of {total} results",
|
||||
"PER_PAGE_TEMPLATE": "{size} / page"
|
||||
}
|
||||
},
|
||||
"AGENT_REPORTS": {
|
||||
"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": "Loading chart data...",
|
||||
"NO_ENOUGH_DATA": "Hesabat yaratmaq üçün kifayət qədər məlumat nöqtəsi almamışıq, zəhmət olmasa sonra yenidən cəhd edin.",
|
||||
"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": "Agent seçin",
|
||||
"FILTER_DROPDOWN_LABEL": "Select Agent",
|
||||
"FILTERS": {
|
||||
"INPUT_PLACEHOLDER": {
|
||||
"AGENTS": "Search agents"
|
||||
@@ -140,54 +140,54 @@
|
||||
},
|
||||
"METRICS": {
|
||||
"CONVERSATIONS": {
|
||||
"NAME": "Söhbətlər",
|
||||
"DESC": "( Ümumi )"
|
||||
"NAME": "Conversations",
|
||||
"DESC": "( Total )"
|
||||
},
|
||||
"INCOMING_MESSAGES": {
|
||||
"NAME": "Incoming Messages",
|
||||
"DESC": "( Ümumi )"
|
||||
"DESC": "( Total )"
|
||||
},
|
||||
"OUTGOING_MESSAGES": {
|
||||
"NAME": "Outgoing Messages",
|
||||
"DESC": "( Ümumi )"
|
||||
"DESC": "( Total )"
|
||||
},
|
||||
"FIRST_RESPONSE_TIME": {
|
||||
"NAME": "İlk Cavab Vaxtı",
|
||||
"DESC": "( Orta )",
|
||||
"INFO_TEXT": "Hesablama üçün istifadə olunan ümumi söhbət sayı:",
|
||||
"TOOLTIP_TEXT": "İlk cavab vaxtı {metricValue}-dir ({conversationCount} söhbət əsasında)"
|
||||
"NAME": "First Response Time",
|
||||
"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": "Həll Vaxtı",
|
||||
"DESC": "( Orta )",
|
||||
"INFO_TEXT": "Hesablama üçün istifadə olunan ümumi söhbət sayı:",
|
||||
"TOOLTIP_TEXT": "Həll vaxtı {metricValue}-dir ({conversationCount} söhbət əsasında)"
|
||||
"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": "Həll Sayı",
|
||||
"DESC": "( Cəmi )"
|
||||
"NAME": "Resolution Count",
|
||||
"DESC": "( Total )"
|
||||
}
|
||||
},
|
||||
"DATE_RANGE": [
|
||||
{
|
||||
"id": 0,
|
||||
"name": "Son 7 gün"
|
||||
"name": "Last 7 days"
|
||||
},
|
||||
{
|
||||
"id": 1,
|
||||
"name": "Son 30 gün"
|
||||
"name": "Last 30 days"
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"name": "Son 3 ay"
|
||||
"name": "Last 3 months"
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"name": "Son 6 ay"
|
||||
"name": "Last 6 months"
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"name": "Keçən il"
|
||||
"name": "Last year"
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
@@ -195,15 +195,15 @@
|
||||
}
|
||||
],
|
||||
"CUSTOM_DATE_RANGE": {
|
||||
"CONFIRM": "Tətbiq et",
|
||||
"CONFIRM": "Apply",
|
||||
"PLACEHOLDER": "Select date range"
|
||||
}
|
||||
},
|
||||
"LABEL_REPORTS": {
|
||||
"HEADER": "Labels Overview",
|
||||
"DESCRIPTION": "Nişan nəticələrini söhbətlər, cavab müddəti, həll müddəti və həll olunmuş hallar üzrə yoxlayın. Ətraflı məlumat üçün nişan adını açın.",
|
||||
"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": "Loading chart data...",
|
||||
"NO_ENOUGH_DATA": "Hesabat yaratmaq üçün kifayət qədər məlumat nöqtəsi almamışıq, zəhmət olmasa bir az sonra yenidən cəhd edin.",
|
||||
"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": {
|
||||
@@ -213,62 +213,62 @@
|
||||
},
|
||||
"METRICS": {
|
||||
"CONVERSATIONS": {
|
||||
"NAME": "Söhbətlər",
|
||||
"DESC": "( Ümumi )"
|
||||
"NAME": "Conversations",
|
||||
"DESC": "( Total )"
|
||||
},
|
||||
"INCOMING_MESSAGES": {
|
||||
"NAME": "Incoming Messages",
|
||||
"DESC": "( Cəmi )"
|
||||
"DESC": "( Total )"
|
||||
},
|
||||
"OUTGOING_MESSAGES": {
|
||||
"NAME": "Outgoing Messages",
|
||||
"DESC": "( Cəmi )"
|
||||
"DESC": "( Total )"
|
||||
},
|
||||
"FIRST_RESPONSE_TIME": {
|
||||
"NAME": "İlk Cavab Vaxtı",
|
||||
"DESC": "( Orta )",
|
||||
"INFO_TEXT": "Hesablama üçün istifadə olunan ümumi söhbət sayı:",
|
||||
"TOOLTIP_TEXT": "İlk cavab vaxtı {metricValue}-dir ({conversationCount} söhbət əsasında)"
|
||||
"NAME": "First Response Time",
|
||||
"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": "Həll Vaxtı",
|
||||
"DESC": "( Orta )",
|
||||
"INFO_TEXT": "Hesablama üçün istifadə olunan ümumi söhbət sayı:",
|
||||
"TOOLTIP_TEXT": "Həll vaxtı {metricValue}-dir ({conversationCount} söhbətə əsaslanır)"
|
||||
"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": "Həll Sayı",
|
||||
"DESC": "( Cəmi )"
|
||||
"NAME": "Resolution Count",
|
||||
"DESC": "( Total )"
|
||||
}
|
||||
},
|
||||
"DATE_RANGE": [
|
||||
{
|
||||
"id": 0,
|
||||
"name": "Son 7 gün"
|
||||
"name": "Last 7 days"
|
||||
},
|
||||
{
|
||||
"id": 1,
|
||||
"name": "Son 30 gün"
|
||||
"name": "Last 30 days"
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"name": "Son 3 ay"
|
||||
"name": "Last 3 months"
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"name": "Son 6 ay"
|
||||
"name": "Last 6 months"
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"name": "Keçən il"
|
||||
"name": "Last year"
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"name": "Xüsusi tarix aralığı"
|
||||
"name": "Custom date range"
|
||||
}
|
||||
],
|
||||
"CUSTOM_DATE_RANGE": {
|
||||
"CONFIRM": "Tətbiq et",
|
||||
"CONFIRM": "Apply",
|
||||
"PLACEHOLDER": "Select date range"
|
||||
}
|
||||
},
|
||||
@@ -276,84 +276,84 @@
|
||||
"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": "Loading chart data...",
|
||||
"NO_ENOUGH_DATA": "Hesabat yaratmaq üçün kifayət qədər məlumat nöqtəsi almamışıq, zəhmət olmasa bir az sonra yenidən cəhd edin.",
|
||||
"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": "Qutu seçin",
|
||||
"ALL_INBOXES": "Bütün Qutular",
|
||||
"SEARCH_INBOX": "Qutu üzrə axtarış",
|
||||
"FILTER_DROPDOWN_LABEL": "Select Inbox",
|
||||
"ALL_INBOXES": "All Inboxes",
|
||||
"SEARCH_INBOX": "Search Inbox",
|
||||
"FILTERS": {
|
||||
"INPUT_PLACEHOLDER": {
|
||||
"INBOXES": "Qutuları axtar"
|
||||
"INBOXES": "Search inboxes"
|
||||
}
|
||||
},
|
||||
"METRICS": {
|
||||
"CONVERSATIONS": {
|
||||
"NAME": "Söhbətlər",
|
||||
"DESC": "( Ümumi )"
|
||||
"NAME": "Conversations",
|
||||
"DESC": "( Total )"
|
||||
},
|
||||
"INCOMING_MESSAGES": {
|
||||
"NAME": "Incoming Messages",
|
||||
"DESC": "( Ümumi )"
|
||||
"DESC": "( Total )"
|
||||
},
|
||||
"OUTGOING_MESSAGES": {
|
||||
"NAME": "Outgoing Messages",
|
||||
"DESC": "( Ümumi )"
|
||||
"DESC": "( Total )"
|
||||
},
|
||||
"FIRST_RESPONSE_TIME": {
|
||||
"NAME": "İlk Cavab Vaxtı",
|
||||
"DESC": "( Orta )",
|
||||
"INFO_TEXT": "Hesablama üçün istifadə olunan ümumi söhbət sayı:",
|
||||
"TOOLTIP_TEXT": "İlk cavab vaxtı {metricValue}-dir ({conversationCount} söhbətə əsaslanır)"
|
||||
"NAME": "First Response Time",
|
||||
"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": "Həll Vaxtı",
|
||||
"DESC": "( Orta )",
|
||||
"INFO_TEXT": "Hesablama üçün istifadə olunan ümumi söhbət sayı:",
|
||||
"TOOLTIP_TEXT": "Həll vaxtı {metricValue}-dir ({conversationCount} söhbətə əsaslanır)"
|
||||
"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": "Həll Sayı",
|
||||
"DESC": "( Cəmi )"
|
||||
"NAME": "Resolution Count",
|
||||
"DESC": "( Total )"
|
||||
}
|
||||
},
|
||||
"DATE_RANGE": [
|
||||
{
|
||||
"id": 0,
|
||||
"name": "Son 7 gün"
|
||||
"name": "Last 7 days"
|
||||
},
|
||||
{
|
||||
"id": 1,
|
||||
"name": "Son 30 gün"
|
||||
"name": "Last 30 days"
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"name": "Son 3 ay"
|
||||
"name": "Last 3 months"
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"name": "Son 6 ay"
|
||||
"name": "Last 6 months"
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"name": "Keçən il"
|
||||
"name": "Last year"
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"name": "Xüsusi tarix aralığı"
|
||||
"name": "Custom date range"
|
||||
}
|
||||
],
|
||||
"CUSTOM_DATE_RANGE": {
|
||||
"CONFIRM": "Tətbiq et",
|
||||
"CONFIRM": "Apply",
|
||||
"PLACEHOLDER": "Select date range"
|
||||
}
|
||||
},
|
||||
"TEAM_REPORTS": {
|
||||
"HEADER": "Team Overview",
|
||||
"DESCRIPTION": "Komanda nəticələrini söhbətlər, cavab müddəti, həll müddəti və həll olunmuş hallar üzrə yoxlayın. Ətraflı məlumat üçün komanda adını açın.",
|
||||
"DESCRIPTION": "Get a snapshot of your team's performance with essential metrics, including conversations, response times, resolution times, and resolved cases. Click a team name for more details.",
|
||||
"LOADING_CHART": "Loading chart data...",
|
||||
"NO_ENOUGH_DATA": "Hesabat yaratmaq üçün kifayət qədər məlumat nöqtəsi almamışıq, zəhmət olmasa sonra yenidən cəhd edin.",
|
||||
"NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
|
||||
"DOWNLOAD_TEAM_REPORTS": "Download team reports",
|
||||
"FILTER_DROPDOWN_LABEL": "Komandanı seçin",
|
||||
"FILTER_DROPDOWN_LABEL": "Select Team",
|
||||
"FILTERS": {
|
||||
"ADD_FILTER": "Add filter",
|
||||
"CLEAR_ALL": "Clear all",
|
||||
@@ -364,54 +364,54 @@
|
||||
},
|
||||
"METRICS": {
|
||||
"CONVERSATIONS": {
|
||||
"NAME": "Söhbətlər",
|
||||
"DESC": "( Ümumi )"
|
||||
"NAME": "Conversations",
|
||||
"DESC": "( Total )"
|
||||
},
|
||||
"INCOMING_MESSAGES": {
|
||||
"NAME": "Incoming Messages",
|
||||
"DESC": "( Cəmi )"
|
||||
"DESC": "( Total )"
|
||||
},
|
||||
"OUTGOING_MESSAGES": {
|
||||
"NAME": "Outgoing Messages",
|
||||
"DESC": "( Cəmi )"
|
||||
"DESC": "( Total )"
|
||||
},
|
||||
"FIRST_RESPONSE_TIME": {
|
||||
"NAME": "İlk Cavab Vaxtı",
|
||||
"DESC": "( Orta )",
|
||||
"INFO_TEXT": "Hesablama üçün istifadə olunan ümumi söhbət sayı:",
|
||||
"TOOLTIP_TEXT": "İlk cavab vaxtı {metricValue}-dir ({conversationCount} söhbətə əsaslanır)"
|
||||
"NAME": "First Response Time",
|
||||
"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": "Həll Vaxtı",
|
||||
"DESC": "( Orta )",
|
||||
"INFO_TEXT": "Hesablama üçün istifadə olunan ümumi söhbət sayı:",
|
||||
"TOOLTIP_TEXT": "Həll vaxtı {metricValue}-dir ({conversationCount} söhbətə əsaslanır)"
|
||||
"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": "Həll Sayı",
|
||||
"DESC": "( Ümumi )"
|
||||
"NAME": "Resolution Count",
|
||||
"DESC": "( Total )"
|
||||
}
|
||||
},
|
||||
"DATE_RANGE": [
|
||||
{
|
||||
"id": 0,
|
||||
"name": "Son 7 gün"
|
||||
"name": "Last 7 days"
|
||||
},
|
||||
{
|
||||
"id": 1,
|
||||
"name": "Son 30 gün"
|
||||
"name": "Last 30 days"
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"name": "Son 3 ay"
|
||||
"name": "Last 3 months"
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"name": "Son 6 ay"
|
||||
"name": "Last 6 months"
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"name": "Keçən il"
|
||||
"name": "Last year"
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
@@ -419,13 +419,13 @@
|
||||
}
|
||||
],
|
||||
"CUSTOM_DATE_RANGE": {
|
||||
"CONFIRM": "Tətbiq et",
|
||||
"CONFIRM": "Apply",
|
||||
"PLACEHOLDER": "Select date range"
|
||||
}
|
||||
},
|
||||
"CSAT_REPORTS": {
|
||||
"HEADER": "CSAT Hesabatları",
|
||||
"NO_RECORDS": "Hələ cavab yoxdur",
|
||||
"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",
|
||||
"DOWNLOAD_FAILED": "Failed to download CSAT Reports",
|
||||
@@ -435,7 +435,7 @@
|
||||
"NO_FILTER": "No filters available",
|
||||
"INPUT_PLACEHOLDER": {
|
||||
"AGENTS": "Search agents",
|
||||
"INBOXES": "Qutuları axtar",
|
||||
"INBOXES": "Search inboxes",
|
||||
"TEAMS": "Search teams",
|
||||
"RATINGS": "Search ratings"
|
||||
},
|
||||
@@ -443,53 +443,53 @@
|
||||
"LABEL": "Agent"
|
||||
},
|
||||
"INBOXES": {
|
||||
"LABEL": "Gələn qutu"
|
||||
"LABEL": "Inbox"
|
||||
},
|
||||
"TEAMS": {
|
||||
"LABEL": "Komanda"
|
||||
"LABEL": "Team"
|
||||
},
|
||||
"RATINGS": {
|
||||
"LABEL": "Qiymətləndirmə"
|
||||
"LABEL": "Rating"
|
||||
}
|
||||
},
|
||||
"TABLE": {
|
||||
"HEADER": {
|
||||
"CONTACT_NAME": "Əlaqə",
|
||||
"CONTACT_NAME": "Contact",
|
||||
"AGENT_NAME": "Agent",
|
||||
"RATING": "Qiymətləndirmə",
|
||||
"RATING": "Rating",
|
||||
"FEEDBACK_TEXT": "Feedback comment",
|
||||
"CONVERSATION": "Söhbət",
|
||||
"CUSTOMER": "Müştəri",
|
||||
"RESPONSE": "Cavab",
|
||||
"HANDLED_BY": "Tərəfindən idarə olunur"
|
||||
"CONVERSATION": "Conversation",
|
||||
"CUSTOMER": "Customer",
|
||||
"RESPONSE": "Response",
|
||||
"HANDLED_BY": "Handled by"
|
||||
},
|
||||
"UNKNOWN_CUSTOMER": "Naməlum müştəri"
|
||||
"UNKNOWN_CUSTOMER": "Unknown customer"
|
||||
},
|
||||
"NO_AGENT": "Təyin olunmuş agent yoxdur",
|
||||
"NO_FEEDBACK": "Rəy verilməyib",
|
||||
"NO_AGENT": "No assigned agent",
|
||||
"NO_FEEDBACK": "No feedback provided",
|
||||
"METRIC": {
|
||||
"TOTAL_RESPONSES": {
|
||||
"LABEL": "Cəmi cavablar",
|
||||
"TOOLTIP": "Toplanmış cavabların ümumi sayı"
|
||||
"LABEL": "Total responses",
|
||||
"TOOLTIP": "Total number of responses collected"
|
||||
},
|
||||
"SATISFACTION_SCORE": {
|
||||
"LABEL": "Məmnunluq balı",
|
||||
"TOOLTIP": "Müsbət cavabların ümumi sayı / Cavabların ümumi sayı * 100"
|
||||
"LABEL": "Satisfaction score",
|
||||
"TOOLTIP": "Total number of positive responses / Total number of responses * 100"
|
||||
},
|
||||
"RESPONSE_RATE": {
|
||||
"LABEL": "Cavab faizi",
|
||||
"LABEL": "Response rate",
|
||||
"TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100"
|
||||
},
|
||||
"RATING_DISTRIBUTION": "Qiymətləndirmə paylanması"
|
||||
"RATING_DISTRIBUTION": "Rating distribution"
|
||||
},
|
||||
"REVIEW_NOTES": {
|
||||
"TITLE": "Rəy qeydləri",
|
||||
"PLACEHOLDER": "Bu qiymətləndirmə haqqında rəy qeydləri əlavə edin...",
|
||||
"SAVE": "Yadda saxla",
|
||||
"CANCEL": "Ləğv et",
|
||||
"SAVING": "Yadda saxlanılır...",
|
||||
"TITLE": "Review notes",
|
||||
"PLACEHOLDER": "Add review notes about this rating...",
|
||||
"SAVE": "Save",
|
||||
"CANCEL": "Cancel",
|
||||
"SAVING": "Saving...",
|
||||
"SAVED": "Notes saved successfully",
|
||||
"SAVE_ERROR": "Qeydləri yadda saxlamaq mümkün olmadı",
|
||||
"SAVE_ERROR": "Failed to save notes",
|
||||
"UPDATED_BY": "Updated by {name} {time}",
|
||||
"UPDATED_BY_LABEL": "Updated by",
|
||||
"PAYWALL": {
|
||||
@@ -509,42 +509,42 @@
|
||||
"TOOLTIP": "Total number of conversations handled by the bot"
|
||||
},
|
||||
"TOTAL_RESPONSES": {
|
||||
"LABEL": "Ümumi Cavablar",
|
||||
"LABEL": "Total Responses",
|
||||
"TOOLTIP": "Total number of responses sent by the bot"
|
||||
},
|
||||
"RESOLUTION_RATE": {
|
||||
"LABEL": "Həll Faizi",
|
||||
"LABEL": "Resolution Rate",
|
||||
"TOOLTIP": "Total number of conversations resolved by the bot / Total number of conversations handled by the bot * 100"
|
||||
},
|
||||
"HANDOFF_RATE": {
|
||||
"LABEL": "Təyinat Faizi",
|
||||
"LABEL": "Handoff Rate",
|
||||
"TOOLTIP": "Total number of conversations handed off to agents / Total number of conversations handled by the bot * 100"
|
||||
}
|
||||
}
|
||||
},
|
||||
"OVERVIEW_REPORTS": {
|
||||
"HEADER": "Ümumi Baxış",
|
||||
"LIVE": "Canlı",
|
||||
"HEADER": "Overview",
|
||||
"LIVE": "Live",
|
||||
"ACCOUNT_CONVERSATIONS": {
|
||||
"HEADER": "Açıq Söhbətlər",
|
||||
"HEADER": "Open Conversations",
|
||||
"LOADING_MESSAGE": "Loading conversation metrics...",
|
||||
"OPEN": "Açıq",
|
||||
"OPEN": "Open",
|
||||
"UNATTENDED": "Unattended",
|
||||
"UNASSIGNED": "Təyin olunmamış",
|
||||
"PENDING": "Gözləyir"
|
||||
"UNASSIGNED": "Unassigned",
|
||||
"PENDING": "Pending"
|
||||
},
|
||||
"CONVERSATION_HEATMAP": {
|
||||
"HEADER": "Conversation Traffic",
|
||||
"NO_CONVERSATIONS": "Söhbət yoxdur",
|
||||
"CONVERSATION": "{count} söhbət",
|
||||
"CONVERSATIONS": "{count} söhbət",
|
||||
"NO_CONVERSATIONS": "No conversations",
|
||||
"CONVERSATION": "{count} conversation",
|
||||
"CONVERSATIONS": "{count} conversations",
|
||||
"DOWNLOAD_REPORT": "Download report"
|
||||
},
|
||||
"RESOLUTION_HEATMAP": {
|
||||
"HEADER": "Resolutions",
|
||||
"NO_CONVERSATIONS": "Söhbət yoxdur",
|
||||
"CONVERSATION": "{count} söhbət",
|
||||
"CONVERSATIONS": "{count} söhbət",
|
||||
"NO_CONVERSATIONS": "No conversations",
|
||||
"CONVERSATION": "{count} conversation",
|
||||
"CONVERSATIONS": "{count} conversations",
|
||||
"DOWNLOAD_REPORT": "Download report"
|
||||
},
|
||||
"AGENT_CONVERSATIONS": {
|
||||
@@ -553,42 +553,42 @@
|
||||
"NO_AGENTS": "There are no conversations by agents",
|
||||
"TABLE_HEADER": {
|
||||
"AGENT": "Agent",
|
||||
"OPEN": "Açıq",
|
||||
"OPEN": "Open",
|
||||
"UNATTENDED": "Unattended",
|
||||
"STATUS": "Vəziyyət"
|
||||
"STATUS": "Status"
|
||||
}
|
||||
},
|
||||
"TEAM_CONVERSATIONS": {
|
||||
"ALL_TEAMS": "All Teams",
|
||||
"HEADER": "Conversations by teams",
|
||||
"LOADING_MESSAGE": "Loading team metrics...",
|
||||
"NO_TEAMS": "Məlumat mövcud deyil",
|
||||
"NO_TEAMS": "There is no data available",
|
||||
"TABLE_HEADER": {
|
||||
"TEAM": "Komanda",
|
||||
"OPEN": "Açıq",
|
||||
"TEAM": "Team",
|
||||
"OPEN": "Open",
|
||||
"UNATTENDED": "Unattended",
|
||||
"STATUS": "Vəziyyət"
|
||||
"STATUS": "Status"
|
||||
}
|
||||
},
|
||||
"AGENT_STATUS": {
|
||||
"HEADER": "Agent vəziyyəti",
|
||||
"ONLINE": "Onlayn",
|
||||
"BUSY": "Məşğul",
|
||||
"HEADER": "Agent status",
|
||||
"ONLINE": "Online",
|
||||
"BUSY": "Busy",
|
||||
"OFFLINE": "Offline"
|
||||
}
|
||||
},
|
||||
"DAYS_OF_WEEK": {
|
||||
"SUNDAY": "Bazar günü",
|
||||
"MONDAY": "Bazar ertəsi",
|
||||
"TUESDAY": "Çərşənbə axşamı",
|
||||
"WEDNESDAY": "Çərşənbə",
|
||||
"THURSDAY": "Cümə axşamı",
|
||||
"FRIDAY": "Cümə",
|
||||
"SATURDAY": "Şənbə"
|
||||
"SUNDAY": "Sunday",
|
||||
"MONDAY": "Monday",
|
||||
"TUESDAY": "Tuesday",
|
||||
"WEDNESDAY": "Wednesday",
|
||||
"THURSDAY": "Thursday",
|
||||
"FRIDAY": "Friday",
|
||||
"SATURDAY": "Saturday"
|
||||
},
|
||||
"SLA_REPORTS": {
|
||||
"HEADER": "SLA Hesabatları",
|
||||
"NO_RECORDS": "Tətbiq edilmiş SLA söhbətləri mövcud deyil.",
|
||||
"HEADER": "SLA Reports",
|
||||
"NO_RECORDS": "SLA applied conversations are not available.",
|
||||
"LOADING": "Loading SLA data...",
|
||||
"DOWNLOAD_SLA_REPORTS": "Download SLA reports",
|
||||
"DOWNLOAD_FAILED": "Failed to download SLA Reports",
|
||||
@@ -596,7 +596,7 @@
|
||||
"ADD_FIlTER": "Add filter",
|
||||
"CLEAR_ALL": "Clear all",
|
||||
"CLEAR_FILTER": "Clear filter",
|
||||
"EMPTY_LIST": "Nəticə tapılmadı",
|
||||
"EMPTY_LIST": "No results found",
|
||||
"NO_FILTER": "No filters available",
|
||||
"SEARCH": "Search filter",
|
||||
"INPUT_PLACEHOLDER": {
|
||||
@@ -606,16 +606,16 @@
|
||||
"LABELS": "Label name",
|
||||
"TEAMS": "Team name"
|
||||
},
|
||||
"SLA": "SLA Siyasəti",
|
||||
"INBOXES": "Gələn qutu",
|
||||
"SLA": "SLA Policy",
|
||||
"INBOXES": "Inbox",
|
||||
"AGENTS": "Agent",
|
||||
"LABELS": "Etiket",
|
||||
"TEAMS": "Komanda"
|
||||
"LABELS": "Label",
|
||||
"TEAMS": "Team"
|
||||
},
|
||||
"WITH": "ilə",
|
||||
"WITH": "with",
|
||||
"METRICS": {
|
||||
"HIT_RATE": {
|
||||
"LABEL": "Uğur Faizi",
|
||||
"LABEL": "Hit Rate",
|
||||
"TOOLTIP": "Percentage of SLAs created were completed successfully"
|
||||
},
|
||||
"NO_OF_MISSES": {
|
||||
@@ -624,27 +624,27 @@
|
||||
},
|
||||
"NO_OF_CONVERSATIONS": {
|
||||
"LABEL": "Number of Conversations",
|
||||
"TOOLTIP": "SLA ilə ümumi söhbət sayı"
|
||||
"TOOLTIP": "Total number of conversations with SLA"
|
||||
}
|
||||
},
|
||||
"TABLE": {
|
||||
"HEADER": {
|
||||
"POLICY": "Siyasət",
|
||||
"CONVERSATION": "Söhbət",
|
||||
"POLICY": "Policy",
|
||||
"CONVERSATION": "Conversation",
|
||||
"AGENT": "Agent"
|
||||
},
|
||||
"VIEW_DETAILS": "Ətraflı Bax"
|
||||
"VIEW_DETAILS": "View Details"
|
||||
}
|
||||
},
|
||||
"SUMMARY_REPORTS": {
|
||||
"INBOX": "Gələnlər",
|
||||
"INBOX": "Inbox",
|
||||
"AGENT": "Agent",
|
||||
"TEAM": "Komanda",
|
||||
"LABEL": "Etiket",
|
||||
"AVG_RESOLUTION_TIME": "Orta Həll Vaxtı",
|
||||
"AVG_FIRST_RESPONSE_TIME": "Orta İlk Cavab Vaxtı",
|
||||
"AVG_REPLY_TIME": "Orta Müştəri Gözləmə Vaxtı",
|
||||
"RESOLUTION_COUNT": "Həll Sayı",
|
||||
"TEAM": "Team",
|
||||
"LABEL": "Label",
|
||||
"AVG_RESOLUTION_TIME": "Avg. Resolution Time",
|
||||
"AVG_FIRST_RESPONSE_TIME": "Avg. First Response Time",
|
||||
"AVG_REPLY_TIME": "Avg. Customer Waiting Time",
|
||||
"RESOLUTION_COUNT": "Resolution Count",
|
||||
"CONVERSATIONS": "No. of conversations"
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -710,21 +710,9 @@
|
||||
"MESSENGER_SUB_HEAD": "Place this button inside your body tag",
|
||||
"ALLOWED_DOMAINS": {
|
||||
"TITLE": "Allowed Domains",
|
||||
"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).",
|
||||
"SUBTITLE": "Add wildcard or regular domains separated by commas (leave blank to allow all), e.g. *.chatwoot.dev, chatwoot.com.",
|
||||
"PLACEHOLDER": "example.com, www.example.com, app.example.com"
|
||||
},
|
||||
"ALLOW_MOBILE_WEBVIEW": {
|
||||
"LABEL": "Enable widget in mobile apps",
|
||||
"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",
|
||||
"DESCRIPTION": "Verify user authenticity by generating secure tokens. This prevents unauthorized users from impersonating others in your chat.",
|
||||
"SECRET_KEY": "Secret Key",
|
||||
"VIEW_DOCS": "View documentation",
|
||||
"REQUIRE_LABEL": "Require identity validation for all conversations",
|
||||
"REQUIRE_DESCRIPTION": "When enabled, users must provide a valid identity token to start conversations. Requests without valid tokens will be rejected."
|
||||
},
|
||||
"INBOX_AGENTS": "Агенти",
|
||||
"INBOX_AGENTS_SUB_TEXT": "Add or remove agents from this inbox",
|
||||
"AGENT_ASSIGNMENT": "Conversation Assignment",
|
||||
|
||||
@@ -527,8 +527,7 @@
|
||||
"TITLE": "Features",
|
||||
"ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations",
|
||||
"ALLOW_MEMORIES": "Capture key details as memories from customer interactions.",
|
||||
"ALLOW_CITATIONS": "Include source citations in responses",
|
||||
"ALLOW_CONTACT_ATTRIBUTES": "Allow access to contact information"
|
||||
"ALLOW_CITATIONS": "Include source citations in responses"
|
||||
}
|
||||
},
|
||||
"EDIT": {
|
||||
|
||||
@@ -1,125 +1,125 @@
|
||||
{
|
||||
"AGENT_MGMT": {
|
||||
"HEADER": "এজেন্ট",
|
||||
"HEADER_BTN_TXT": "এজেন্ট যোগ করুন",
|
||||
"LOADING": "এজেন্ট তালিকা আনছে",
|
||||
"DESCRIPTION": "একজন এজেন্ট হলেন আপনার গ্রাহক সাপোর্ট দলের সদস্য যিনি ব্যবহারকারীর বার্তা দেখতে এবং উত্তর দিতে পারেন। নিচের তালিকায় আপনার অ্যাকাউন্টের সব এজেন্ট দেখানো হয়েছে।",
|
||||
"LEARN_MORE": "ব্যবহারকারীর ভূমিকা সম্পর্কে জানুন",
|
||||
"HEADER": "Agents",
|
||||
"HEADER_BTN_TXT": "Add Agent",
|
||||
"LOADING": "Fetching Agent List",
|
||||
"DESCRIPTION": "An agent is a member of your customer support team who can view and respond to user messages. The list below shows all the agents in your account.",
|
||||
"LEARN_MORE": "Learn about user roles",
|
||||
"AGENT_TYPES": {
|
||||
"ADMINISTRATOR": "প্রশাসক",
|
||||
"AGENT": "এজেন্ট"
|
||||
"ADMINISTRATOR": "Administrator",
|
||||
"AGENT": "Agent"
|
||||
},
|
||||
"COUNT": "{n} এজেন্ট | {n} এজেন্ট",
|
||||
"COUNT": "{n} agent | {n} agents",
|
||||
"LIST": {
|
||||
"404": "এই অ্যাকাউন্টে কোনো এজেন্ট নেই",
|
||||
"TITLE": "আপনার দলের এজেন্ট পরিচালনা করুন",
|
||||
"DESC": "আপনি আপনার দলে এজেন্ট যোগ/অপসারণ করতে পারেন।",
|
||||
"NAME": "নাম",
|
||||
"EMAIL": "ইমেইল",
|
||||
"STATUS": "অবস্থা",
|
||||
"ACTIONS": "কর্ম",
|
||||
"VERIFIED": "যাচাই করা হয়েছে",
|
||||
"VERIFICATION_PENDING": "যাচাই প্রক্রিয়াধীন",
|
||||
"AVAILABLE_CUSTOM_ROLE": "উপলব্ধ কাস্টম ভূমিকার অনুমতিসমূহ"
|
||||
"404": "There are no agents associated to this account",
|
||||
"TITLE": "Manage agents in your team",
|
||||
"DESC": "You can add/remove agents to/in your team.",
|
||||
"NAME": "Name",
|
||||
"EMAIL": "EMAIL",
|
||||
"STATUS": "Status",
|
||||
"ACTIONS": "Actions",
|
||||
"VERIFIED": "Verified",
|
||||
"VERIFICATION_PENDING": "Verification Pending",
|
||||
"AVAILABLE_CUSTOM_ROLE": "Available custom role permissions"
|
||||
},
|
||||
"ADD": {
|
||||
"TITLE": "আপনার দলে এজেন্ট যোগ করুন",
|
||||
"DESC": "আপনি এমন ব্যক্তিদের যোগ করতে পারেন যারা আপনার ইনবক্সের জন্য সাপোর্ট পরিচালনা করতে পারবেন।",
|
||||
"CANCEL_BUTTON_TEXT": "বাতিল করুন",
|
||||
"TITLE": "Add agent to your team",
|
||||
"DESC": "You can add people who will be able to handle support for your inboxes.",
|
||||
"CANCEL_BUTTON_TEXT": "Cancel",
|
||||
"FORM": {
|
||||
"NAME": {
|
||||
"LABEL": "এজেন্টের নাম",
|
||||
"PLACEHOLDER": "এজেন্টের নাম লিখুন"
|
||||
"LABEL": "Agent Name",
|
||||
"PLACEHOLDER": "Please enter a name of the agent"
|
||||
},
|
||||
"AGENT_TYPE": {
|
||||
"LABEL": "ভূমিকা",
|
||||
"PLACEHOLDER": "একটি ভূমিকা নির্বাচন করুন",
|
||||
"ERROR": "ভূমিকা আবশ্যক"
|
||||
"LABEL": "Role",
|
||||
"PLACEHOLDER": "Please select a role",
|
||||
"ERROR": "Role is required"
|
||||
},
|
||||
"EMAIL": {
|
||||
"LABEL": "ইমেইল ঠিকানা",
|
||||
"PLACEHOLDER": "এজেন্টের ইমেইল ঠিকানা লিখুন"
|
||||
"LABEL": "Email Address",
|
||||
"PLACEHOLDER": "Please enter an email address of the agent"
|
||||
},
|
||||
"SUBMIT": "এজেন্ট যোগ করুন"
|
||||
"SUBMIT": "Add Agent"
|
||||
},
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "এজেন্ট সফলভাবে যোগ করা হয়েছে",
|
||||
"EXIST_MESSAGE": "এজেন্টের ইমেইল ইতিমধ্যে ব্যবহৃত, অনুগ্রহ করে অন্য ইমেইল ঠিকানা ব্যবহার করুন",
|
||||
"ERROR_MESSAGE": "Woot Server-এ সংযোগ করা যায়নি, অনুগ্রহ করে পরে আবার চেষ্টা করুন"
|
||||
"SUCCESS_MESSAGE": "Agent added successfully",
|
||||
"EXIST_MESSAGE": "Agent email already in use, Please try another email address",
|
||||
"ERROR_MESSAGE": "Could not connect to Woot Server, Please try again later"
|
||||
}
|
||||
},
|
||||
"DELETE": {
|
||||
"BUTTON_TEXT": "মুছে ফেলুন",
|
||||
"BUTTON_TEXT": "Delete",
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "এজেন্ট সফলভাবে মুছে ফেলা হয়েছে",
|
||||
"ERROR_MESSAGE": "Woot Server-এ সংযোগ করা যায়নি, অনুগ্রহ করে পরে আবার চেষ্টা করুন"
|
||||
"SUCCESS_MESSAGE": "Agent deleted successfully",
|
||||
"ERROR_MESSAGE": "Could not connect to Woot Server, Please try again later"
|
||||
},
|
||||
"CONFIRM": {
|
||||
"TITLE": "মুছে ফেলা নিশ্চিত করুন",
|
||||
"MESSAGE": "আপনি কি নিশ্চিত যে মুছে ফেলতে চান ",
|
||||
"YES": "হ্যাঁ, মুছে ফেলুন ",
|
||||
"NO": "না, রাখুন "
|
||||
"TITLE": "Confirm Deletion",
|
||||
"MESSAGE": "Are you sure to delete ",
|
||||
"YES": "Yes, Delete ",
|
||||
"NO": "No, Keep "
|
||||
}
|
||||
},
|
||||
"EDIT": {
|
||||
"TITLE": "এজেন্ট সম্পাদনা করুন",
|
||||
"TITLE": "Edit agent",
|
||||
"FORM": {
|
||||
"NAME": {
|
||||
"LABEL": "এজেন্টের নাম",
|
||||
"PLACEHOLDER": "এজেন্টের নাম লিখুন"
|
||||
"LABEL": "Agent Name",
|
||||
"PLACEHOLDER": "Please enter a name of the agent"
|
||||
},
|
||||
"AGENT_TYPE": {
|
||||
"LABEL": "ভূমিকা",
|
||||
"PLACEHOLDER": "একটি ভূমিকা নির্বাচন করুন",
|
||||
"ERROR": "ভূমিকা আবশ্যক"
|
||||
"LABEL": "Role",
|
||||
"PLACEHOLDER": "Please select a role",
|
||||
"ERROR": "Role is required"
|
||||
},
|
||||
"EMAIL": {
|
||||
"LABEL": "ইমেইল ঠিকানা",
|
||||
"PLACEHOLDER": "এজেন্টের ইমেইল ঠিকানা লিখুন"
|
||||
"LABEL": "Email Address",
|
||||
"PLACEHOLDER": "Please enter an email address of the agent"
|
||||
},
|
||||
"AGENT_AVAILABILITY": {
|
||||
"LABEL": "উপলব্ধতা",
|
||||
"PLACEHOLDER": "একটি উপলব্ধতা অবস্থা নির্বাচন করুন",
|
||||
"ERROR": "উপলব্ধতা আবশ্যক"
|
||||
"LABEL": "Availability",
|
||||
"PLACEHOLDER": "Please select an availability status",
|
||||
"ERROR": "Availability is required"
|
||||
},
|
||||
"SUBMIT": "এজেন্ট সম্পাদনা করুন"
|
||||
"SUBMIT": "Edit Agent"
|
||||
},
|
||||
"BUTTON_TEXT": "সম্পাদনা করুন",
|
||||
"CANCEL_BUTTON_TEXT": "বাতিল করুন",
|
||||
"BUTTON_TEXT": "Edit",
|
||||
"CANCEL_BUTTON_TEXT": "Cancel",
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "এজেন্ট সফলভাবে আপডেট হয়েছে",
|
||||
"ERROR_MESSAGE": "Woot Server-এ সংযোগ করা যায়নি, অনুগ্রহ করে পরে আবার চেষ্টা করুন"
|
||||
"SUCCESS_MESSAGE": "Agent updated successfully",
|
||||
"ERROR_MESSAGE": "Could not connect to Woot Server, Please try again later"
|
||||
},
|
||||
"PASSWORD_RESET": {
|
||||
"ADMIN_RESET_BUTTON": "পাসওয়ার্ড রিসেট করুন",
|
||||
"ADMIN_SUCCESS_MESSAGE": "পাসওয়ার্ড রিসেট নির্দেশনা সহ একটি ইমেইল এজেন্টকে পাঠানো হয়েছে",
|
||||
"SUCCESS_MESSAGE": "এজেন্টের পাসওয়ার্ড সফলভাবে রিসেট হয়েছে",
|
||||
"ERROR_MESSAGE": "Woot Server-এ সংযোগ করা যায়নি, অনুগ্রহ করে পরে আবার চেষ্টা করুন"
|
||||
"ADMIN_RESET_BUTTON": "Reset Password",
|
||||
"ADMIN_SUCCESS_MESSAGE": "An email with reset password instructions has been sent to the agent",
|
||||
"SUCCESS_MESSAGE": "Agent password reset successfully",
|
||||
"ERROR_MESSAGE": "Could not connect to Woot Server, Please try again later"
|
||||
}
|
||||
},
|
||||
"SEARCH_PLACEHOLDER": "এজেন্ট অনুসন্ধান করুন...",
|
||||
"NO_RESULTS": "আপনার অনুসন্ধানের সাথে মিলিত কোনো এজেন্ট পাওয়া যায়নি",
|
||||
"SEARCH_PLACEHOLDER": "Search agents...",
|
||||
"NO_RESULTS": "No agents found matching your search",
|
||||
"SEARCH": {
|
||||
"NO_RESULTS": "কোনো ফলাফল পাওয়া যায়নি।"
|
||||
"NO_RESULTS": "No results found."
|
||||
},
|
||||
"MULTI_SELECTOR": {
|
||||
"PLACEHOLDER": "কিছুই নয়",
|
||||
"PLACEHOLDER": "None",
|
||||
"TITLE": {
|
||||
"AGENT": "এজেন্ট নির্বাচন করুন",
|
||||
"TEAM": "দল নির্বাচন করুন"
|
||||
"AGENT": "Select agent",
|
||||
"TEAM": "Select team"
|
||||
},
|
||||
"LIST": {
|
||||
"NONE": "কিছুই নয়"
|
||||
"NONE": "None"
|
||||
},
|
||||
"SEARCH": {
|
||||
"NO_RESULTS": {
|
||||
"AGENT": "কোনো এজেন্ট পাওয়া যায়নি",
|
||||
"TEAM": "কোনো দল পাওয়া যায়নি"
|
||||
"AGENT": "No agents found",
|
||||
"TEAM": "No teams found"
|
||||
},
|
||||
"PLACEHOLDER": {
|
||||
"AGENT": "এজেন্ট অনুসন্ধান করুন",
|
||||
"TEAM": "দল অনুসন্ধান করুন",
|
||||
"INPUT": "এজেন্টদের জন্য অনুসন্ধান করুন"
|
||||
"AGENT": "Search agents",
|
||||
"TEAM": "Search teams",
|
||||
"INPUT": "Search for agents"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
{
|
||||
"CONTACT_PANEL": {
|
||||
"NOT_AVAILABLE": "উপলব্ধ নেই",
|
||||
"EMAIL_ADDRESS": "ইমেইল ঠিকানা",
|
||||
"PHONE_NUMBER": "ফোন নম্বর",
|
||||
"IDENTIFIER": "পরিচিতি নম্বর",
|
||||
"COPY_SUCCESSFUL": "ক্লিপবোর্ডে সফলভাবে কপি হয়েছে",
|
||||
"COMPANY": "কোম্পানি",
|
||||
"LOCATION": "অবস্থান",
|
||||
"BROWSER_LANGUAGE": "ব্রাউজারের ভাষা",
|
||||
"CONVERSATION_TITLE": "কথোপকথনের বিবরণ",
|
||||
"VIEW_PROFILE": "প্রোফাইল দেখুন",
|
||||
"BROWSER": "ব্রাউজার",
|
||||
"OS": "অপারেটিং সিস্টেম",
|
||||
"INITIATED_FROM": "শুরু করা হয়েছে",
|
||||
"INITIATED_AT": "শুরু করার সময়",
|
||||
"IP_ADDRESS": "আইপি ঠিকানা",
|
||||
"CREATED_AT_LABEL": "তৈরি হয়েছে",
|
||||
"NEW_MESSAGE": "নতুন বার্তা",
|
||||
"NOT_AVAILABLE": "Not Available",
|
||||
"EMAIL_ADDRESS": "Email Address",
|
||||
"PHONE_NUMBER": "Phone number",
|
||||
"IDENTIFIER": "Identifier",
|
||||
"COPY_SUCCESSFUL": "Copied to clipboard successfully",
|
||||
"COMPANY": "Company",
|
||||
"LOCATION": "Location",
|
||||
"BROWSER_LANGUAGE": "Browser Language",
|
||||
"CONVERSATION_TITLE": "Conversation Details",
|
||||
"VIEW_PROFILE": "View Profile",
|
||||
"BROWSER": "Browser",
|
||||
"OS": "Operating System",
|
||||
"INITIATED_FROM": "Initiated from",
|
||||
"INITIATED_AT": "Initiated at",
|
||||
"IP_ADDRESS": "IP Address",
|
||||
"CREATED_AT_LABEL": "Created",
|
||||
"NEW_MESSAGE": "New message",
|
||||
"CALL": "Call",
|
||||
"CALL_INITIATED": "Calling the contact…",
|
||||
"CALL_FAILED": "Unable to start the call. Please try again.",
|
||||
@@ -24,353 +24,353 @@
|
||||
"TITLE": "Choose a voice inbox"
|
||||
},
|
||||
"CONVERSATIONS": {
|
||||
"NO_RECORDS_FOUND": "এই কন্টাক্টের সাথে পূর্বের কোনো আলাপ নেই।",
|
||||
"TITLE": "পূর্বের আলাপ"
|
||||
"NO_RECORDS_FOUND": "There are no previous conversations associated to this contact.",
|
||||
"TITLE": "Previous Conversations"
|
||||
},
|
||||
"LABELS": {
|
||||
"CONTACT": {
|
||||
"TITLE": "যোগাযোগ লেবেল",
|
||||
"ERROR": "লেবেল আপডেট করা যায়নি"
|
||||
"TITLE": "Contact Labels",
|
||||
"ERROR": "Couldn't update labels"
|
||||
},
|
||||
"CONVERSATION": {
|
||||
"TITLE": "কথোপকথনের লেবেল",
|
||||
"ADD_BUTTON": "লেবেল যোগ করুন"
|
||||
"TITLE": "Conversation Labels",
|
||||
"ADD_BUTTON": "Add Labels"
|
||||
},
|
||||
"LABEL_SELECT": {
|
||||
"TITLE": "লেবেল যোগ করুন",
|
||||
"PLACEHOLDER": "লেবেল অনুসন্ধান করুন",
|
||||
"NO_RESULT": "কোন লেবেল পাওয়া যায়নি",
|
||||
"CREATE_LABEL": "নতুন লেবেল তৈরি করুন"
|
||||
"TITLE": "Add Labels",
|
||||
"PLACEHOLDER": "Search labels",
|
||||
"NO_RESULT": "No labels found",
|
||||
"CREATE_LABEL": "Create new label"
|
||||
}
|
||||
},
|
||||
"MERGE_CONTACT": "যোগাযোগ একত্রিত করুন",
|
||||
"CONTACT_ACTIONS": "যোগাযোগের কার্যক্রম",
|
||||
"MUTE_CONTACT": "কন্টাক্ট ব্লক করুন",
|
||||
"UNMUTE_CONTACT": "কন্টাক্ট আনব্লক করুন",
|
||||
"MUTED_SUCCESS": "এই কন্টাক্ট সফলভাবে ব্লক করা হয়েছে। ভবিষ্যতে কোনো কথোপকথনের জন্য আপনাকে আর জানানো হবে না।",
|
||||
"UNMUTED_SUCCESS": "এই কন্টাক্টের ব্লক সফলভাবে সরানো হয়েছে.",
|
||||
"SEND_TRANSCRIPT": "ট্রান্সক্রিপ্ট পাঠান",
|
||||
"EDIT_LABEL": "সম্পাদনা করুন",
|
||||
"MERGE_CONTACT": "Merge contact",
|
||||
"CONTACT_ACTIONS": "Contact actions",
|
||||
"MUTE_CONTACT": "Block Contact",
|
||||
"UNMUTE_CONTACT": "Unblock Contact",
|
||||
"MUTED_SUCCESS": "This contact is blocked successfully. You will not be notified of any future conversations.",
|
||||
"UNMUTED_SUCCESS": "This contact is unblocked successfully.",
|
||||
"SEND_TRANSCRIPT": "Send Transcript",
|
||||
"EDIT_LABEL": "Edit",
|
||||
"SIDEBAR_SECTIONS": {
|
||||
"CUSTOM_ATTRIBUTES": "কাস্টম অ্যাট্রিবিউট",
|
||||
"CONTACT_LABELS": "যোগাযোগের লেবেলসমূহ",
|
||||
"PREVIOUS_CONVERSATIONS": "পূর্ববর্তী কথোপকথনসমূহ",
|
||||
"NO_RECORDS_FOUND": "কোনো অ্যাট্রিবিউট পাওয়া যায়নি"
|
||||
"CUSTOM_ATTRIBUTES": "Custom Attributes",
|
||||
"CONTACT_LABELS": "Contact Labels",
|
||||
"PREVIOUS_CONVERSATIONS": "Previous Conversations",
|
||||
"NO_RECORDS_FOUND": "No attributes found"
|
||||
}
|
||||
},
|
||||
"EDIT_CONTACT": {
|
||||
"BUTTON_LABEL": "যোগাযোগ সম্পাদনা করুন",
|
||||
"TITLE": "যোগাযোগ সম্পাদনা করুন",
|
||||
"DESC": "যোগাযোগের বিস্তারিত সম্পাদনা করুন"
|
||||
"BUTTON_LABEL": "Edit Contact",
|
||||
"TITLE": "Edit contact",
|
||||
"DESC": "Edit contact details"
|
||||
},
|
||||
"DELETE_CONTACT": {
|
||||
"BUTTON_LABEL": "যোগাযোগ মুছুন",
|
||||
"TITLE": "যোগাযোগ মুছুন",
|
||||
"DESC": "যোগাযোগের বিবরণ মুছে ফেলুন",
|
||||
"BUTTON_LABEL": "Delete Contact",
|
||||
"TITLE": "Delete contact",
|
||||
"DESC": "Delete contact details",
|
||||
"CONFIRM": {
|
||||
"TITLE": "মুছে ফেলা নিশ্চিত করুন",
|
||||
"MESSAGE": "আপনি কি নিশ্চিত যে মুছে ফেলতে চান ",
|
||||
"YES": "হ্যাঁ, মুছে ফেলুন",
|
||||
"NO": "না, রাখুন"
|
||||
"TITLE": "Confirm Deletion",
|
||||
"MESSAGE": "Are you sure to delete ",
|
||||
"YES": "Yes, Delete",
|
||||
"NO": "No, Keep"
|
||||
},
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "যোগাযোগ সফলভাবে মুছে ফেলা হয়েছে",
|
||||
"ERROR_MESSAGE": "যোগাযোগ মুছে ফেলা যায়নি। অনুগ্রহ করে পরে আবার চেষ্টা করুন।."
|
||||
"SUCCESS_MESSAGE": "Contact deleted successfully",
|
||||
"ERROR_MESSAGE": "Could not delete contact. Please try again later."
|
||||
}
|
||||
},
|
||||
"CONTACT_FORM": {
|
||||
"FORM": {
|
||||
"SUBMIT": "জমা দিন",
|
||||
"CANCEL": "বাতিল করুন",
|
||||
"SUBMIT": "Submit",
|
||||
"CANCEL": "Cancel",
|
||||
"AVATAR": {
|
||||
"LABEL": "যোগাযোগের অ্যাভাটার"
|
||||
"LABEL": "Contact Avatar"
|
||||
},
|
||||
"NAME": {
|
||||
"PLACEHOLDER": "যোগাযোগের পূর্ণ নাম লিখুন",
|
||||
"LABEL": "পূর্ণ নাম"
|
||||
"PLACEHOLDER": "Enter the full name of the contact",
|
||||
"LABEL": "Full Name"
|
||||
},
|
||||
"BIO": {
|
||||
"PLACEHOLDER": "যোগাযোগের জীবনী লিখুন",
|
||||
"LABEL": "জীবনবৃত্তান্ত"
|
||||
"PLACEHOLDER": "Enter the bio of the contact",
|
||||
"LABEL": "Bio"
|
||||
},
|
||||
"EMAIL_ADDRESS": {
|
||||
"PLACEHOLDER": "যোগাযোগের ইমেইল ঠিকানা লিখুন",
|
||||
"LABEL": "ইমেইল ঠিকানা",
|
||||
"DUPLICATE": "এই ইমেল ঠিকানাটি অন্য একটি যোগাযোগের জন্য ব্যবহৃত হচ্ছে।.",
|
||||
"ERROR": "একটি বৈধ ইমেল ঠিকানা লিখুন।."
|
||||
"PLACEHOLDER": "Enter the email address of the contact",
|
||||
"LABEL": "Email Address",
|
||||
"DUPLICATE": "This email address is in use for another contact.",
|
||||
"ERROR": "Please enter a valid email address."
|
||||
},
|
||||
"PHONE_NUMBER": {
|
||||
"PLACEHOLDER": "যোগাযোগের ফোন নম্বর লিখুন",
|
||||
"LABEL": "ফোন নম্বর",
|
||||
"HELP": "ফোন নম্বরটি অবশ্যই E.164 ফরম্যাটে হতে হবে যেমন: +1415555555 [+][দেশের কোড][এরিয়া কোড][স্থানীয় ফোন নম্বর]. আপনি ড্রপডাউন থেকে ডায়াল কোড নির্বাচন করতে পারেন.",
|
||||
"ERROR": "ফোন নম্বরটি খালি অথবা E.164 ফরম্যাটে হতে হবে",
|
||||
"DIAL_CODE_ERROR": "অনুগ্রহ করে তালিকা থেকে একটি ডায়াল কোড নির্বাচন করুন",
|
||||
"DUPLICATE": "এই ফোন নম্বরটি অন্য একটি যোগাযোগের জন্য ব্যবহৃত হচ্ছে।."
|
||||
"PLACEHOLDER": "Enter the phone number of the contact",
|
||||
"LABEL": "Phone Number",
|
||||
"HELP": "Phone number should be of E.164 format eg: +1415555555 [+][country code][area code][local phone number]. You can select the dial code from the dropdown.",
|
||||
"ERROR": "Phone number should be either empty or of E.164 format",
|
||||
"DIAL_CODE_ERROR": "Please select a dial code from the list",
|
||||
"DUPLICATE": "This phone number is in use for another contact."
|
||||
},
|
||||
"LOCATION": {
|
||||
"PLACEHOLDER": "যোগাযোগের অবস্থান লিখুন",
|
||||
"LABEL": "অবস্থান"
|
||||
"PLACEHOLDER": "Enter the location of the contact",
|
||||
"LABEL": "Location"
|
||||
},
|
||||
"COMPANY_NAME": {
|
||||
"PLACEHOLDER": "কোম্পানির নাম লিখুন",
|
||||
"LABEL": "কোম্পানির নাম"
|
||||
"PLACEHOLDER": "Enter the company name",
|
||||
"LABEL": "Company Name"
|
||||
},
|
||||
"COUNTRY": {
|
||||
"PLACEHOLDER": "দেশের নাম লিখুন",
|
||||
"LABEL": "দেশের নাম",
|
||||
"SELECT_PLACEHOLDER": "নির্বাচন করুন",
|
||||
"REMOVE": "অপসারণ করুন",
|
||||
"SELECT_COUNTRY": "দেশ নির্বাচন করুন"
|
||||
"PLACEHOLDER": "Enter the country name",
|
||||
"LABEL": "Country Name",
|
||||
"SELECT_PLACEHOLDER": "Select",
|
||||
"REMOVE": "Remove",
|
||||
"SELECT_COUNTRY": "Select Country"
|
||||
},
|
||||
"CITY": {
|
||||
"PLACEHOLDER": "শহরের নাম লিখুন",
|
||||
"LABEL": "শহরের নাম"
|
||||
"PLACEHOLDER": "Enter the city name",
|
||||
"LABEL": "City Name"
|
||||
},
|
||||
"SOCIAL_PROFILES": {
|
||||
"FACEBOOK": {
|
||||
"PLACEHOLDER": "Facebook ব্যবহারকারীর নাম লিখুন",
|
||||
"PLACEHOLDER": "Enter the Facebook username",
|
||||
"LABEL": "Facebook"
|
||||
},
|
||||
"TWITTER": {
|
||||
"PLACEHOLDER": "Twitter ব্যবহারকারীর নাম লিখুন",
|
||||
"PLACEHOLDER": "Enter the Twitter username",
|
||||
"LABEL": "Twitter"
|
||||
},
|
||||
"LINKEDIN": {
|
||||
"PLACEHOLDER": "LinkedIn ব্যবহারকারীর নাম লিখুন",
|
||||
"PLACEHOLDER": "Enter the LinkedIn username",
|
||||
"LABEL": "LinkedIn"
|
||||
},
|
||||
"GITHUB": {
|
||||
"PLACEHOLDER": "Github ব্যবহারকারীর নাম লিখুন",
|
||||
"PLACEHOLDER": "Enter the Github username",
|
||||
"LABEL": "Github"
|
||||
}
|
||||
}
|
||||
},
|
||||
"DELETE_AVATAR": {
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "যোগাযোগের অবতার সফলভাবে মুছে ফেলা হয়েছে",
|
||||
"ERROR_MESSAGE": "যোগাযোগের অবতার মুছে ফেলা যায়নি। অনুগ্রহ করে পরে আবার চেষ্টা করুন।."
|
||||
"SUCCESS_MESSAGE": "Contact avatar deleted successfully",
|
||||
"ERROR_MESSAGE": "Could not delete the contact avatar. Please try again later."
|
||||
}
|
||||
},
|
||||
"SUCCESS_MESSAGE": "যোগাযোগ সফলভাবে সংরক্ষণ করা হয়েছে",
|
||||
"ERROR_MESSAGE": "একটি ত্রুটি হয়েছে, অনুগ্রহ করে আবার চেষ্টা করুন"
|
||||
"SUCCESS_MESSAGE": "Contact saved successfully",
|
||||
"ERROR_MESSAGE": "There was an error, please try again"
|
||||
},
|
||||
"NEW_CONVERSATION": {
|
||||
"BUTTON_LABEL": "আলাপ শুরু করুন",
|
||||
"TITLE": "নতুন আলাপ",
|
||||
"DESC": "নতুন বার্তা পাঠিয়ে একটি নতুন কথোপকথন শুরু করুন।",
|
||||
"NO_INBOX": "এই যোগাযোগের সাথে একটি নতুন কথোপকথন শুরু করার জন্য কোনো ইনবক্স পাওয়া যায়নি।",
|
||||
"BUTTON_LABEL": "Start conversation",
|
||||
"TITLE": "New conversation",
|
||||
"DESC": "Start a new conversation by sending a new message.",
|
||||
"NO_INBOX": "Couldn't find an inbox to initiate a new conversation with this contact.",
|
||||
"FORM": {
|
||||
"TO": {
|
||||
"LABEL": "প্রাপক"
|
||||
"LABEL": "To"
|
||||
},
|
||||
"INBOX": {
|
||||
"LABEL": "ইনবক্সের মাধ্যমে",
|
||||
"PLACEHOLDER": "উৎস ইনবক্স নির্বাচন করুন",
|
||||
"ERROR": "একটি ইনবক্স নির্বাচন করুন"
|
||||
"LABEL": "Via Inbox",
|
||||
"PLACEHOLDER": "Choose source inbox",
|
||||
"ERROR": "Select an inbox"
|
||||
},
|
||||
"SUBJECT": {
|
||||
"LABEL": "বিষয়",
|
||||
"PLACEHOLDER": "বিষয়",
|
||||
"ERROR": "বিষয় খালি রাখা যাবে না"
|
||||
"LABEL": "Subject",
|
||||
"PLACEHOLDER": "Subject",
|
||||
"ERROR": "Subject can't be empty"
|
||||
},
|
||||
"MESSAGE": {
|
||||
"LABEL": "বার্তা",
|
||||
"PLACEHOLDER": "এখানে আপনার বার্তা লিখুন",
|
||||
"ERROR": "বার্তাটি খালি রাখা যাবে না"
|
||||
"LABEL": "Message",
|
||||
"PLACEHOLDER": "Write your message here",
|
||||
"ERROR": "Message can't be empty"
|
||||
},
|
||||
"ATTACHMENTS": {
|
||||
"SELECT": "ফাইল নির্বাচন করুন",
|
||||
"HELP_TEXT": "এখানে ফাইল টেনে আনুন অথবা সংযুক্ত করার জন্য ফাইল নির্বাচন করুন"
|
||||
"SELECT": "Choose files",
|
||||
"HELP_TEXT": "Drag and drop files here or choose files to attach"
|
||||
},
|
||||
"SUBMIT": "বার্তা পাঠান",
|
||||
"CANCEL": "বাতিল করুন",
|
||||
"SUCCESS_MESSAGE": "বার্তা পাঠানো হয়েছে!",
|
||||
"GO_TO_CONVERSATION": "দেখুন",
|
||||
"ERROR_MESSAGE": "পাঠানো যায়নি! আবার চেষ্টা করুন"
|
||||
"SUBMIT": "Send message",
|
||||
"CANCEL": "Cancel",
|
||||
"SUCCESS_MESSAGE": "Message sent!",
|
||||
"GO_TO_CONVERSATION": "View",
|
||||
"ERROR_MESSAGE": "Couldn't send! try again"
|
||||
}
|
||||
},
|
||||
"CONTACTS_PAGE": {
|
||||
"LIST": {
|
||||
"TABLE_HEADER": {
|
||||
"SOCIAL_PROFILES": "সামাজিক প্রোফাইল"
|
||||
"SOCIAL_PROFILES": "Social Profiles"
|
||||
}
|
||||
}
|
||||
},
|
||||
"CUSTOM_ATTRIBUTES": {
|
||||
"BUTTON": "কাস্টম অ্যাট্রিবিউট যোগ করুন",
|
||||
"COPY_SUCCESSFUL": "ক্লিপবোর্ডে সফলভাবে কপি হয়েছে",
|
||||
"SHOW_MORE": "সব অ্যাট্রিবিউট দেখান",
|
||||
"SHOW_LESS": "কম অ্যাট্রিবিউট দেখান",
|
||||
"BUTTON": "Add custom attribute",
|
||||
"COPY_SUCCESSFUL": "Copied to clipboard successfully",
|
||||
"SHOW_MORE": "Show all attributes",
|
||||
"SHOW_LESS": "Show less attributes",
|
||||
"ACTIONS": {
|
||||
"COPY": "অ্যাট্রিবিউট কপি করুন",
|
||||
"DELETE": "অ্যাট্রিবিউট মুছুন",
|
||||
"EDIT": "অ্যাট্রিবিউট সম্পাদনা করুন"
|
||||
"COPY": "Copy attribute",
|
||||
"DELETE": "Delete attribute",
|
||||
"EDIT": "Edit attribute"
|
||||
},
|
||||
"ADD": {
|
||||
"TITLE": "কাস্টম অ্যাট্রিবিউট তৈরি করুন",
|
||||
"DESC": "এই যোগাযোগে কাস্টম তথ্য যোগ করুন।."
|
||||
"TITLE": "Create custom attribute",
|
||||
"DESC": "Add custom information to this contact."
|
||||
},
|
||||
"FORM": {
|
||||
"CREATE": "অ্যাট্রিবিউট যোগ করুন",
|
||||
"CANCEL": "বাতিল করুন",
|
||||
"CREATE": "Add attribute",
|
||||
"CANCEL": "Cancel",
|
||||
"NAME": {
|
||||
"LABEL": "কাস্টম অ্যাট্রিবিউটের নাম",
|
||||
"PLACEHOLDER": "উদাহরণ: shopify id",
|
||||
"ERROR": "অবৈধ কাস্টম অ্যাট্রিবিউট নাম"
|
||||
"LABEL": "Custom attribute name",
|
||||
"PLACEHOLDER": "Eg: shopify id",
|
||||
"ERROR": "Invalid custom attribute name"
|
||||
},
|
||||
"VALUE": {
|
||||
"LABEL": "অ্যাট্রিবিউটের মান",
|
||||
"PLACEHOLDER": "উদাহরণ: 11901 "
|
||||
"LABEL": "Attribute value",
|
||||
"PLACEHOLDER": "Eg: 11901 "
|
||||
},
|
||||
"ADD": {
|
||||
"TITLE": "নতুন অ্যাট্রিবিউট তৈরি করুন ",
|
||||
"SUCCESS": "অ্যাট্রিবিউট সফলভাবে যোগ করা হয়েছে",
|
||||
"ERROR": "অ্যাট্রিবিউট যোগ করা সম্ভব হয়নি। অনুগ্রহ করে পরে আবার চেষ্টা করুন"
|
||||
"TITLE": "Create new attribute ",
|
||||
"SUCCESS": "Attribute added successfully",
|
||||
"ERROR": "Unable to add attribute. Please try again later"
|
||||
},
|
||||
"UPDATE": {
|
||||
"SUCCESS": "অ্যাট্রিবিউট সফলভাবে আপডেট হয়েছে",
|
||||
"ERROR": "অ্যাট্রিবিউট আপডেট করা সম্ভব হয়নি। অনুগ্রহ করে পরে আবার চেষ্টা করুন"
|
||||
"SUCCESS": "Attribute updated successfully",
|
||||
"ERROR": "Unable to update 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"
|
||||
},
|
||||
"ATTRIBUTE_TYPE": {
|
||||
"LIST": {
|
||||
"PLACEHOLDER": "মান নির্বাচন করুন",
|
||||
"SEARCH_INPUT_PLACEHOLDER": "মান অনুসন্ধান করুন",
|
||||
"NO_RESULT": "কোন ফলাফল পাওয়া যায়নি"
|
||||
"PLACEHOLDER": "Select value",
|
||||
"SEARCH_INPUT_PLACEHOLDER": "Search value",
|
||||
"NO_RESULT": "No result found"
|
||||
}
|
||||
}
|
||||
},
|
||||
"VALIDATIONS": {
|
||||
"REQUIRED": "বৈধ মান আবশ্যক",
|
||||
"INVALID_URL": "অবৈধ URL",
|
||||
"INVALID_INPUT": "অবৈধ ইনপুট"
|
||||
"REQUIRED": "Valid value is required",
|
||||
"INVALID_URL": "Invalid URL",
|
||||
"INVALID_INPUT": "Invalid Input"
|
||||
}
|
||||
},
|
||||
"MERGE_CONTACTS": {
|
||||
"TITLE": "যোগাযোগ একত্রিত করুন",
|
||||
"DESCRIPTION": "দুটি প্রোফাইল একত্রিত করতে কন্টাক্ট মার্জ করুন, এতে সব অ্যাট্রিবিউট ও কথোপকথন একত্রিত হবে। কোনো দ্বন্দ্ব হলে, প্রাইমারি কন্টাক্টের অ্যাট্রিবিউট অগ্রাধিকার পাবে।.",
|
||||
"TITLE": "Merge contacts",
|
||||
"DESCRIPTION": "Merge contacts to combine two profiles into one, including all attributes and conversations. In case of conflict, the Primary contact’s attributes will take precedence.",
|
||||
"PRIMARY": {
|
||||
"TITLE": "প্রাথমিক যোগাযোগ",
|
||||
"HELP_LABEL": "মুছে ফেলা হবে"
|
||||
"TITLE": "Primary contact",
|
||||
"HELP_LABEL": "To be deleted"
|
||||
},
|
||||
"PARENT": {
|
||||
"TITLE": "যে কন্টাক্ট মার্জ করা হবে",
|
||||
"PLACEHOLDER": "একটি যোগাযোগ খুঁজুন",
|
||||
"HELP_LABEL": "রাখা হবে"
|
||||
"TITLE": "Contact to merge",
|
||||
"PLACEHOLDER": "Search for a contact",
|
||||
"HELP_LABEL": "To be kept"
|
||||
},
|
||||
"SUMMARY": {
|
||||
"TITLE": "সারাংশ",
|
||||
"DELETE_WARNING": "<strong>{primaryContactName}</strong> এর কন্টাক্ট মুছে ফেলা হবে.",
|
||||
"ATTRIBUTE_WARNING": "<strong>{primaryContactName}</strong> এর কন্টাক্টের বিস্তারিত <strong>{parentContactName}</strong> এ কপি করা হবে."
|
||||
"TITLE": "Summary",
|
||||
"DELETE_WARNING": "Contact of <strong>{primaryContactName}</strong> will be deleted.",
|
||||
"ATTRIBUTE_WARNING": "Contact details of <strong>{primaryContactName}</strong> will be copied to <strong>{parentContactName}</strong>."
|
||||
},
|
||||
"SEARCH": {
|
||||
"ERROR_MESSAGE": "Something went wrong. Please try again later."
|
||||
},
|
||||
"FORM": {
|
||||
"SUBMIT": " যোগাযোগসমূহ একত্রিত করুন",
|
||||
"CANCEL": "বাতিল করুন",
|
||||
"SUBMIT": " Merge contacts",
|
||||
"CANCEL": "Cancel",
|
||||
"CHILD_CONTACT": {
|
||||
"ERROR": "একত্রিত করার জন্য একটি চাইল্ড কন্টাক্ট নির্বাচন করুন"
|
||||
"ERROR": "Select a child contact to merge"
|
||||
},
|
||||
"SUCCESS_MESSAGE": "যোগাযোগ সফলভাবে একত্রিত হয়েছে",
|
||||
"ERROR_MESSAGE": "যোগাযোগগুলো একত্রিত করা যায়নি, আবার চেষ্টা করুন!"
|
||||
"SUCCESS_MESSAGE": "Contact merged successfully",
|
||||
"ERROR_MESSAGE": "Could not merge contacts, try again!"
|
||||
},
|
||||
"DROPDOWN_ITEM": {
|
||||
"ID": "(আইডি: {identifier})"
|
||||
"ID": "(ID: {identifier})"
|
||||
}
|
||||
},
|
||||
"CONTACTS_LAYOUT": {
|
||||
"HEADER": {
|
||||
"TITLE": "যোগাযোগসমূহ",
|
||||
"SEARCH_TITLE": "যোগাযোগ অনুসন্ধান করুন",
|
||||
"TITLE": "Contacts",
|
||||
"SEARCH_TITLE": "Search contacts",
|
||||
"ACTIVE_TITLE": "Active contacts",
|
||||
"SEARCH_PLACEHOLDER": "অনুসন্ধান করুন...",
|
||||
"MESSAGE_BUTTON": "বার্তা পাঠান",
|
||||
"SEARCH_PLACEHOLDER": "Search...",
|
||||
"MESSAGE_BUTTON": "Message",
|
||||
"SEND_MESSAGE": "Send message",
|
||||
"BLOCK_CONTACT": "Block contact",
|
||||
"UNBLOCK_CONTACT": "Unblock contact",
|
||||
"BREADCRUMB": {
|
||||
"CONTACTS": "যোগাযোগসমূহ"
|
||||
"CONTACTS": "Contacts"
|
||||
},
|
||||
"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,83 +379,83 @@
|
||||
"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": {
|
||||
"OF": "এর",
|
||||
"VIEW_DETAILS": "বিস্তারিত দেখুন",
|
||||
"OF": "of",
|
||||
"VIEW_DETAILS": "View details",
|
||||
"EDIT_DETAILS_FORM": {
|
||||
"TITLE": "কন্টাক্টের বিস্তারিত সম্পাদনা করুন",
|
||||
"TITLE": "Edit contact details",
|
||||
"FORM": {
|
||||
"FIRST_NAME": {
|
||||
"PLACEHOLDER": "প্রথম নাম লিখুন"
|
||||
"PLACEHOLDER": "Enter the first name"
|
||||
},
|
||||
"LAST_NAME": {
|
||||
"PLACEHOLDER": "শেষ নাম লিখুন"
|
||||
"PLACEHOLDER": "Enter the last name"
|
||||
},
|
||||
"EMAIL_ADDRESS": {
|
||||
"PLACEHOLDER": "ইমেইল ঠিকানা লিখুন",
|
||||
"DUPLICATE": "এই ইমেইল ঠিকানাটি অন্য একটি যোগাযোগের জন্য ব্যবহৃত হচ্ছে।."
|
||||
"PLACEHOLDER": "Enter the email address",
|
||||
"DUPLICATE": "This email address is in use for another contact."
|
||||
},
|
||||
"PHONE_NUMBER": {
|
||||
"PLACEHOLDER": "ফোন নম্বর লিখুন",
|
||||
"DUPLICATE": "এই ফোন নম্বরটি অন্য একটি যোগাযোগের জন্য ব্যবহৃত হচ্ছে।."
|
||||
"PLACEHOLDER": "Enter the phone number",
|
||||
"DUPLICATE": "This phone number is in use for another contact."
|
||||
},
|
||||
"CITY": {
|
||||
"PLACEHOLDER": "শহরের নাম লিখুন"
|
||||
"PLACEHOLDER": "Enter the city name"
|
||||
},
|
||||
"COUNTRY": {
|
||||
"PLACEHOLDER": "দেশ নির্বাচন করুন"
|
||||
"PLACEHOLDER": "Select country"
|
||||
},
|
||||
"BIO": {
|
||||
"PLACEHOLDER": "জীবনবৃত্তান্ত লিখুন"
|
||||
"PLACEHOLDER": "Enter the bio"
|
||||
},
|
||||
"COMPANY_NAME": {
|
||||
"PLACEHOLDER": "কোম্পানির নাম লিখুন"
|
||||
"PLACEHOLDER": "Enter the company name"
|
||||
}
|
||||
},
|
||||
"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": "সামাজিক লিঙ্ক সম্পাদনা করুন",
|
||||
"TITLE": "Edit social links",
|
||||
"FORM": {
|
||||
"FACEBOOK": {
|
||||
"PLACEHOLDER": "Facebook যোগ করুন"
|
||||
"PLACEHOLDER": "Add Facebook"
|
||||
},
|
||||
"GITHUB": {
|
||||
"PLACEHOLDER": "Github যোগ করুন"
|
||||
"PLACEHOLDER": "Add Github"
|
||||
},
|
||||
"INSTAGRAM": {
|
||||
"PLACEHOLDER": "Instagram যোগ করুন"
|
||||
"PLACEHOLDER": "Add Instagram"
|
||||
},
|
||||
"TELEGRAM": {
|
||||
"PLACEHOLDER": "Add Telegram"
|
||||
@@ -464,10 +464,10 @@
|
||||
"PLACEHOLDER": "Add TikTok"
|
||||
},
|
||||
"LINKEDIN": {
|
||||
"PLACEHOLDER": "LinkedIn যোগ করুন"
|
||||
"PLACEHOLDER": "Add LinkedIn"
|
||||
},
|
||||
"TWITTER": {
|
||||
"PLACEHOLDER": "Twitter যোগ করুন"
|
||||
"PLACEHOLDER": "Add Twitter"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -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"
|
||||
},
|
||||
@@ -512,69 +512,69 @@
|
||||
"EMPTY_STATE": "There are no previous conversations associated to this contact"
|
||||
},
|
||||
"ATTRIBUTES": {
|
||||
"SEARCH_PLACEHOLDER": "বৈশিষ্ট্য অনুসন্ধান করুন",
|
||||
"UNUSED_ATTRIBUTES": "{count} ব্যবহৃত বৈশিষ্ট্য | {count} অব্যবহৃত বৈশিষ্ট্য",
|
||||
"EMPTY_STATE": "এই অ্যাকাউন্টে কোনো কাস্টম কন্টাক্ট অ্যাট্রিবিউট নেই। আপনি সেটিংসে একটি কাস্টম অ্যাট্রিবিউট তৈরি করতে পারেন।.",
|
||||
"YES": "হ্যাঁ",
|
||||
"NO": "না",
|
||||
"SEARCH_PLACEHOLDER": "Search for attributes",
|
||||
"UNUSED_ATTRIBUTES": "{count} Used attribute | {count} Unused attributes",
|
||||
"EMPTY_STATE": "There are no contact custom attributes available in this account. You can create a custom attribute in settings.",
|
||||
"YES": "Yes",
|
||||
"NO": "No",
|
||||
"TRIGGER": {
|
||||
"SELECT": "মান নির্বাচন করুন",
|
||||
"INPUT": "মান লিখুন"
|
||||
"SELECT": "Select value",
|
||||
"INPUT": "Enter value"
|
||||
},
|
||||
"VALIDATIONS": {
|
||||
"INVALID_NUMBER": "অবৈধ সংখ্যা",
|
||||
"REQUIRED": "বৈধ মান আবশ্যক",
|
||||
"INVALID_INPUT": "অবৈধ ইনপুট প্রদান",
|
||||
"INVALID_URL": "অবৈধ URL",
|
||||
"INVALID_DATE": "অবৈধ তারিখ"
|
||||
"INVALID_NUMBER": "Invalid number",
|
||||
"REQUIRED": "Valid value is required",
|
||||
"INVALID_INPUT": "Invalid input",
|
||||
"INVALID_URL": "Invalid URL",
|
||||
"INVALID_DATE": "Invalid date"
|
||||
},
|
||||
"NO_ATTRIBUTES": "কোনো বৈশিষ্ট্য পাওয়া যায়নি",
|
||||
"NO_ATTRIBUTES": "No attributes found",
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "বৈশিষ্ট্য সফলভাবে আপডেট হয়েছে",
|
||||
"DELETE_SUCCESS_MESSAGE": "বৈশিষ্ট্য সফলভাবে মুছে ফেলা হয়েছে",
|
||||
"UPDATE_ERROR": "বৈশিষ্ট্য আপডেট করা যায়নি। অনুগ্রহ করে পরে আবার চেষ্টা করুন",
|
||||
"DELETE_ERROR": "বৈশিষ্ট্য মুছে ফেলা যায়নি। অনুগ্রহ করে পরে আবার চেষ্টা করুন"
|
||||
"SUCCESS_MESSAGE": "Attribute updated successfully",
|
||||
"DELETE_SUCCESS_MESSAGE": "Attribute deleted successfully",
|
||||
"UPDATE_ERROR": "Unable to update attribute. Please try again later",
|
||||
"DELETE_ERROR": "Unable to delete attribute. Please try again later"
|
||||
}
|
||||
},
|
||||
"MERGE": {
|
||||
"TITLE": "কন্টাক্ট একত্রিত করুন",
|
||||
"DESCRIPTION": "দুটি প্রোফাইলের সব বৈশিষ্ট্য ও কথোপকথন একত্র করে একটি প্রোফাইল বানান. কোনো দ্বন্দ্ব হলে, প্রধান কন্টাক্টের তথ্য আগে ধরা হবে.",
|
||||
"PRIMARY": "প্রধান কন্টাক্ট",
|
||||
"PRIMARY_HELP_LABEL": "সংরক্ষণ করা হবে",
|
||||
"PRIMARY_REQUIRED_ERROR": "অনুগ্রহ করে আগে একত্র করার জন্য একটি কন্টাক্ট বেছে নিন",
|
||||
"PARENT": "একত্রিত করা হবে",
|
||||
"PARENT_HELP_LABEL": "মুছে ফেলা হবে",
|
||||
"EMPTY_STATE": "কোনো কন্টাক্ট পাওয়া যায়নি",
|
||||
"PLACEHOLDER": "প্রধান কন্টাক্ট খুঁজুন",
|
||||
"SEARCH_PLACEHOLDER": "একটি কন্টাক্ট খুঁজুন",
|
||||
"SEARCH_ERROR_MESSAGE": "কন্টাক্ট খোঁজা যায়নি. অনুগ্রহ করে পরে আবার চেষ্টা করুন.",
|
||||
"SUCCESS_MESSAGE": "যোগাযোগ সফলভাবে একত্রিত হয়েছে",
|
||||
"ERROR_MESSAGE": "যোগাযোগ একত্রিত করা যায়নি, আবার চেষ্টা করুন!",
|
||||
"IS_SEARCHING": "অনুসন্ধান চলছে...",
|
||||
"TITLE": "Merge contact",
|
||||
"DESCRIPTION": "Combine two profiles into one, including all attributes and conversations. In case of conflict, the primary contact’s attributes will take precedence.",
|
||||
"PRIMARY": "Primary contact",
|
||||
"PRIMARY_HELP_LABEL": "To be saved",
|
||||
"PRIMARY_REQUIRED_ERROR": "Please select a contact to merge with before proceeding",
|
||||
"PARENT": "To be merged",
|
||||
"PARENT_HELP_LABEL": "To be deleted",
|
||||
"EMPTY_STATE": "No contacts found",
|
||||
"PLACEHOLDER": "Search for primary contact",
|
||||
"SEARCH_PLACEHOLDER": "Search for a contact",
|
||||
"SEARCH_ERROR_MESSAGE": "Could not search for contacts. Please try again later.",
|
||||
"SUCCESS_MESSAGE": "Contact merged successfully",
|
||||
"ERROR_MESSAGE": "Could not merge contacts, try again!",
|
||||
"IS_SEARCHING": "Searching...",
|
||||
"BUTTONS": {
|
||||
"CANCEL": "বাতিল করুন",
|
||||
"CONFIRM": "কন্টাক্ট একত্রিত করুন"
|
||||
"CANCEL": "Cancel",
|
||||
"CONFIRM": "Merge contact"
|
||||
}
|
||||
},
|
||||
"NOTES": {
|
||||
"PLACEHOLDER": "নোট যোগ করুন",
|
||||
"WROTE": "লিখেছেন",
|
||||
"YOU": "আপনি",
|
||||
"SAVE": "নোট সংরক্ষণ করুন",
|
||||
"PLACEHOLDER": "Add a note",
|
||||
"WROTE": "wrote",
|
||||
"YOU": "You",
|
||||
"SAVE": "Save note",
|
||||
"ADD_NOTE": "Add contact note",
|
||||
"EXPAND": "Expand",
|
||||
"COLLAPSE": "Collapse",
|
||||
"NO_NOTES": "No notes, you can add notes from the contact details page.",
|
||||
"EMPTY_STATE": "এই যোগাযোগের সাথে কোনো নোট যুক্ত নেই। উপরের বাক্সে লিখে আপনি একটি নোট যোগ করতে পারেন।.",
|
||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above.",
|
||||
"CONVERSATION_EMPTY_STATE": "There are no notes yet. Use the Add note button to create one."
|
||||
}
|
||||
},
|
||||
"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"
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,106 +1,106 @@
|
||||
{
|
||||
"MFA_SETTINGS": {
|
||||
"TITLE": "দ্বি-স্তরীয় প্রমাণীকরণ",
|
||||
"SUBTITLE": "TOTP-ভিত্তিক প্রমাণীকরণের মাধ্যমে আপনার অ্যাকাউন্টকে অননুমোদিত প্রবেশ থেকে সুরক্ষিত করুন। এটি আপনার অ্যাকাউন্টে অতিরিক্ত নিরাপত্তা যোগ করে.",
|
||||
"DESCRIPTION": "সময়-ভিত্তিক একবারের পাসওয়ার্ড (TOTP) ব্যবহার করে আপনার অ্যাকাউন্টে অতিরিক্ত নিরাপত্তা যোগ করুন",
|
||||
"STATUS_TITLE": "প্রমাণীকরণের অবস্থা",
|
||||
"STATUS_DESCRIPTION": "আপনার দ্বি-স্তরীয় প্রমাণীকরণ সেটিংস এবং ব্যাকআপ পুনরুদ্ধার কোডগুলি পরিচালনা করুন",
|
||||
"ENABLED": "সক্রিয়",
|
||||
"DISABLED": "নিষ্ক্রিয়",
|
||||
"STATUS_ENABLED": "দ্বি-স্তরীয় প্রমাণীকরণ সক্রিয় আছে",
|
||||
"STATUS_ENABLED_DESC": "আপনার অ্যাকাউন্ট অতিরিক্ত নিরাপত্তা স্তর দ্বারা সুরক্ষিত",
|
||||
"ENABLE_BUTTON": "দ্বি-স্তরীয় প্রমাণীকরণ চালু করুন",
|
||||
"ENHANCE_SECURITY": "আপনার অ্যাকাউন্টের নিরাপত্তা বৃদ্ধি করুন",
|
||||
"ENHANCE_SECURITY_DESC": "দ্বি-স্তরীয় প্রমাণীকরণ আপনার নিরাপত্তা আরও বাড়ায়, কারণ এটি আপনার পাসওয়ার্ডের পাশাপাশি আপনার authenticator অ্যাপ থেকে একটি যাচাইকরণ কোড চায়.",
|
||||
"TITLE": "Two-Factor Authentication",
|
||||
"SUBTITLE": "Protect your account from unauthorized access with TOTP-based authentication. This adds an extra layer of security to your account.",
|
||||
"DESCRIPTION": "Add an extra layer of security to your account using a time-based one-time password (TOTP)",
|
||||
"STATUS_TITLE": "Authentication Status",
|
||||
"STATUS_DESCRIPTION": "Manage your two-factor authentication settings and backup recovery codes",
|
||||
"ENABLED": "Enabled",
|
||||
"DISABLED": "Disabled",
|
||||
"STATUS_ENABLED": "Two-factor authentication is active",
|
||||
"STATUS_ENABLED_DESC": "Your account is protected with an additional layer of security",
|
||||
"ENABLE_BUTTON": "Enable Two-Factor Authentication",
|
||||
"ENHANCE_SECURITY": "Enhance Your Account Security",
|
||||
"ENHANCE_SECURITY_DESC": "Two-factor authentication adds an extra layer of security by requiring a verification code from your authenticator app in addition to your password.",
|
||||
"SETUP": {
|
||||
"STEP_NUMBER_1": "১",
|
||||
"STEP_NUMBER_2": "২",
|
||||
"STEP1_TITLE": "আপনার Authenticator অ্যাপ দিয়ে QR কোড স্ক্যান করুন",
|
||||
"STEP1_DESCRIPTION": "Google Authenticator, Authy, অথবা যেকোনো TOTP-সামঞ্জস্যপূর্ণ অ্যাপ ব্যবহার করুন",
|
||||
"LOADING_QR": "লোড হচ্ছে...",
|
||||
"MANUAL_ENTRY": "স্ক্যান করতে পারছেন না? কোডটি ম্যানুয়ালি লিখুন",
|
||||
"SECRET_KEY": "সিক্রেট কী",
|
||||
"COPY": "কপি করুন",
|
||||
"ENTER_CODE": "আপনার অথেন্টিকেটর অ্যাপ থেকে ৬-সংখ্যার কোডটি লিখুন",
|
||||
"ENTER_CODE_PLACEHOLDER": "০০০০০০",
|
||||
"VERIFY_BUTTON": "যাচাই করুন ও চালিয়ে যান",
|
||||
"CANCEL": "বাতিল করুন",
|
||||
"ERROR_STARTING": "MFA সক্রিয় নয়। অনুগ্রহ করে প্রশাসকের সাথে যোগাযোগ করুন.",
|
||||
"INVALID_CODE": "ভুল যাচাইকরণ কোড",
|
||||
"SECRET_COPIED": "সিক্রেট কী ক্লিপবোর্ডে কপি করা হয়েছে",
|
||||
"SUCCESS": "দ্বৈত-ধাপ যাচাইকরণ সফলভাবে সক্রিয় করা হয়েছে"
|
||||
"STEP_NUMBER_1": "1",
|
||||
"STEP_NUMBER_2": "2",
|
||||
"STEP1_TITLE": "Scan QR Code with Your Authenticator App",
|
||||
"STEP1_DESCRIPTION": "Use Google Authenticator, Authy, or any TOTP-compatible app",
|
||||
"LOADING_QR": "Loading...",
|
||||
"MANUAL_ENTRY": "Can't scan? Enter code manually",
|
||||
"SECRET_KEY": "Secret Key",
|
||||
"COPY": "Copy",
|
||||
"ENTER_CODE": "Enter the 6-digit code from your authenticator app",
|
||||
"ENTER_CODE_PLACEHOLDER": "000000",
|
||||
"VERIFY_BUTTON": "Verify & Continue",
|
||||
"CANCEL": "Cancel",
|
||||
"ERROR_STARTING": "MFA not enabled. Please contact administrator.",
|
||||
"INVALID_CODE": "Invalid verification code",
|
||||
"SECRET_COPIED": "Secret key copied to clipboard",
|
||||
"SUCCESS": "Two-factor authentication has been enabled successfully"
|
||||
},
|
||||
"BACKUP": {
|
||||
"TITLE": "আপনার ব্যাকআপ কোড সংরক্ষণ করুন",
|
||||
"DESCRIPTION": "এই কোডগুলো নিরাপদে রাখুন। আপনার অথেন্টিকেটরে প্রবেশ হারালে প্রতিটি কোড একবার করে ব্যবহার করা যাবে",
|
||||
"IMPORTANT": "গুরুত্বপূর্ণ:",
|
||||
"IMPORTANT_NOTE": " এই কোডগুলো নিরাপদ স্থানে সংরক্ষণ করুন। আপনি এগুলো আর দেখতে পারবেন না.",
|
||||
"DOWNLOAD": "ডাউনলোড করুন",
|
||||
"COPY_ALL": "সব কপি করুন",
|
||||
"CONFIRM": "আমি আমার ব্যাকআপ কোডগুলো নিরাপদ স্থানে সংরক্ষণ করেছি এবং বুঝতে পেরেছি যে এগুলো আমি আর দেখতে পারব না",
|
||||
"COMPLETE_SETUP": "সেটআপ সম্পন্ন করুন",
|
||||
"CODES_COPIED": "ব্যাকআপ কোডগুলো ক্লিপবোর্ডে কপি করা হয়েছে"
|
||||
"TITLE": "Save Your Backup Codes",
|
||||
"DESCRIPTION": "Keep these codes safe. Each can be used once if you lose access to your authenticator",
|
||||
"IMPORTANT": "Important:",
|
||||
"IMPORTANT_NOTE": " Save these codes in a secure location. You won't be able to see them again.",
|
||||
"DOWNLOAD": "Download",
|
||||
"COPY_ALL": "Copy All",
|
||||
"CONFIRM": "I have saved my backup codes in a secure location and understand that I won't be able to see them again",
|
||||
"COMPLETE_SETUP": "Complete Setup",
|
||||
"CODES_COPIED": "Backup codes copied to clipboard"
|
||||
},
|
||||
"MANAGEMENT": {
|
||||
"BACKUP_CODES": "ব্যাকআপ কোড",
|
||||
"BACKUP_CODES_DESC": "আপনার বিদ্যমান কোডগুলো হারিয়ে গেলে বা ব্যবহার হয়ে গেলে নতুন কোড তৈরি করুন",
|
||||
"REGENERATE": "ব্যাকআপ কোড পুনরায় তৈরি করুন",
|
||||
"DISABLE_MFA": "২এফএ নিষ্ক্রিয় করুন",
|
||||
"DISABLE_MFA_DESC": "আপনার অ্যাকাউন্ট থেকে দুই-ধাপ যাচাইকরণ সরান",
|
||||
"DISABLE_BUTTON": "দুই-ধাপ যাচাইকরণ নিষ্ক্রিয় করুন"
|
||||
"BACKUP_CODES": "Backup Codes",
|
||||
"BACKUP_CODES_DESC": "Generate new codes if you've lost or used your existing ones",
|
||||
"REGENERATE": "Regenerate Backup Codes",
|
||||
"DISABLE_MFA": "Disable 2FA",
|
||||
"DISABLE_MFA_DESC": "Remove two-factor authentication from your account",
|
||||
"DISABLE_BUTTON": "Disable Two-Factor Authentication"
|
||||
},
|
||||
"DISABLE": {
|
||||
"TITLE": "দুই-ধাপ যাচাইকরণ নিষ্ক্রিয় করুন",
|
||||
"DESCRIPTION": "দুই-ধাপ যাচাইকরণ নিষ্ক্রিয় করতে আপনাকে আপনার পাসওয়ার্ড এবং একটি যাচাইকরণ কোড প্রবেশ করতে হবে.",
|
||||
"PASSWORD": "পাসওয়ার্ড",
|
||||
"OTP_CODE": "ভেরিফিকেশন কোড",
|
||||
"OTP_CODE_PLACEHOLDER": "০০০০০০",
|
||||
"CONFIRM": "2FA নিষ্ক্রিয় করুন",
|
||||
"CANCEL": "বাতিল করুন",
|
||||
"SUCCESS": "টু-ফ্যাক্টর অথেন্টিকেশন নিষ্ক্রিয় করা হয়েছে",
|
||||
"ERROR": "MFA নিষ্ক্রিয় করতে ব্যর্থ হয়েছে। অনুগ্রহ করে আপনার শংসাপত্র যাচাই করুন."
|
||||
"TITLE": "Disable Two-Factor Authentication",
|
||||
"DESCRIPTION": "You'll need to enter your password and a verification code to disable two-factor authentication.",
|
||||
"PASSWORD": "Password",
|
||||
"OTP_CODE": "Verification Code",
|
||||
"OTP_CODE_PLACEHOLDER": "000000",
|
||||
"CONFIRM": "Disable 2FA",
|
||||
"CANCEL": "Cancel",
|
||||
"SUCCESS": "Two-factor authentication has been disabled",
|
||||
"ERROR": "Failed to disable MFA. Please check your credentials."
|
||||
},
|
||||
"REGENERATE": {
|
||||
"TITLE": "ব্যাকআপ কোড পুনরায় তৈরি করুন",
|
||||
"DESCRIPTION": "এটি আপনার বর্তমান ব্যাকআপ কোডসমূহ বাতিল করবে এবং নতুন কোড তৈরি করবে। চালিয়ে যেতে আপনার যাচাইকরণ কোড দিন.",
|
||||
"OTP_CODE": "যাচাইকরণ কোড",
|
||||
"OTP_CODE_PLACEHOLDER": "০০০০০০",
|
||||
"CONFIRM": "নতুন কোড তৈরি করুন",
|
||||
"CANCEL": "বাতিল করুন",
|
||||
"NEW_CODES_TITLE": "নতুন ব্যাকআপ কোড তৈরি হয়েছে",
|
||||
"NEW_CODES_DESC": "আপনার পুরোনো ব্যাকআপ কোডগুলো বাতিল করা হয়েছে। এই নতুন কোডগুলো নিরাপদ স্থানে সংরক্ষণ করুন.",
|
||||
"CODES_IMPORTANT": "গুরুত্বপূর্ণ:",
|
||||
"CODES_IMPORTANT_NOTE": " প্রতিটি কোড শুধুমাত্র একবার ব্যবহার করা যাবে। এই উইন্ডো বন্ধ করার আগে কোডগুলো সংরক্ষণ করুন.",
|
||||
"DOWNLOAD_CODES": "কোড ডাউনলোড করুন",
|
||||
"COPY_ALL_CODES": "সব কোড কপি করুন",
|
||||
"CODES_SAVED": "আমি আমার কোডগুলো সংরক্ষণ করেছি",
|
||||
"SUCCESS": "নতুন ব্যাকআপ কোড তৈরি হয়েছে",
|
||||
"ERROR": "ব্যাকআপ কোড পুনরায় তৈরি করতে ব্যর্থ হয়েছে"
|
||||
"TITLE": "Regenerate Backup Codes",
|
||||
"DESCRIPTION": "This will invalidate your existing backup codes and generate new ones. Enter your verification code to continue.",
|
||||
"OTP_CODE": "Verification Code",
|
||||
"OTP_CODE_PLACEHOLDER": "000000",
|
||||
"CONFIRM": "Generate New Codes",
|
||||
"CANCEL": "Cancel",
|
||||
"NEW_CODES_TITLE": "New Backup Codes Generated",
|
||||
"NEW_CODES_DESC": "Your old backup codes have been invalidated. Save these new codes in a secure location.",
|
||||
"CODES_IMPORTANT": "Important:",
|
||||
"CODES_IMPORTANT_NOTE": " Each code can only be used once. Save them before closing this window.",
|
||||
"DOWNLOAD_CODES": "Download Codes",
|
||||
"COPY_ALL_CODES": "Copy All Codes",
|
||||
"CODES_SAVED": "I've Saved My Codes",
|
||||
"SUCCESS": "New backup codes have been generated",
|
||||
"ERROR": "Failed to regenerate backup codes"
|
||||
}
|
||||
},
|
||||
"MFA_VERIFICATION": {
|
||||
"TITLE": "দ্বি-স্তরীয় প্রমাণীকরণ",
|
||||
"DESCRIPTION": "চালিয়ে যেতে আপনার যাচাইকরণ কোড দিন",
|
||||
"AUTHENTICATOR_APP": "অথেন্টিকেটর অ্যাপ",
|
||||
"BACKUP_CODE": "ব্যাকআপ কোড",
|
||||
"ENTER_OTP_CODE": "আপনার authenticator অ্যাপ থেকে ৬-সংখ্যার কোডটি লিখুন",
|
||||
"ENTER_BACKUP_CODE": "আপনার ব্যাকআপ কোডগুলোর মধ্যে একটি লিখুন",
|
||||
"BACKUP_CODE_PLACEHOLDER": "০০০০০০",
|
||||
"VERIFY_BUTTON": "যাচাই করুন",
|
||||
"TRY_ANOTHER_METHOD": "অন্য একটি যাচাইকরণ পদ্ধতি চেষ্টা করুন",
|
||||
"CANCEL_LOGIN": "বাতিল করুন এবং লগইন পৃষ্ঠায় ফিরে যান",
|
||||
"HELP_TEXT": "সাইন ইন করতে সমস্যা হচ্ছে?",
|
||||
"LEARN_MORE": "2FA সম্পর্কে আরও জানুন",
|
||||
"TITLE": "Two-Factor Authentication",
|
||||
"DESCRIPTION": "Enter your verification code to continue",
|
||||
"AUTHENTICATOR_APP": "Authenticator App",
|
||||
"BACKUP_CODE": "Backup Code",
|
||||
"ENTER_OTP_CODE": "Enter 6-digit code from your authenticator app",
|
||||
"ENTER_BACKUP_CODE": "Enter one of your backup codes",
|
||||
"BACKUP_CODE_PLACEHOLDER": "000000",
|
||||
"VERIFY_BUTTON": "Verify",
|
||||
"TRY_ANOTHER_METHOD": "Try another verification method",
|
||||
"CANCEL_LOGIN": "Cancel and return to login",
|
||||
"HELP_TEXT": "Having trouble signing in?",
|
||||
"LEARN_MORE": "Learn more about 2FA",
|
||||
"HELP_MODAL": {
|
||||
"TITLE": "টু-ফ্যাক্টর অথেন্টিকেশন সহায়তা",
|
||||
"AUTHENTICATOR_TITLE": "অথেন্টিকেটর অ্যাপ ব্যবহার করা হচ্ছে",
|
||||
"AUTHENTICATOR_DESC": "আপনার authenticator অ্যাপ (Google Authenticator, Authy, ইত্যাদি) খুলুন এবং আপনার অ্যাকাউন্টের জন্য দেখানো ৬-সংখ্যার কোডটি লিখুন.",
|
||||
"BACKUP_TITLE": "ব্যাকআপ কোড ব্যবহার করুন",
|
||||
"BACKUP_DESC": "যদি আপনার authenticator অ্যাপে প্রবেশাধিকার না থাকে, তাহলে 2FA সেটআপ করার সময় সংরক্ষণ করা ব্যাকআপ কোডগুলোর যেকোনো একটি ব্যবহার করতে পারেন। প্রতিটি কোড কেবল একবারই ব্যবহার করা যাবে.",
|
||||
"CONTACT_TITLE": "আরও সাহায্য দরকার?",
|
||||
"CONTACT_DESC_CLOUD": "আপনি যদি আপনার authenticator অ্যাপ এবং ব্যাকআপ কোড দুটোই হারিয়ে ফেলেন, তাহলে সহায়তার জন্য অনুগ্রহ করে Chatwoot সাপোর্ট টিমের সাথে যোগাযোগ করুন.",
|
||||
"CONTACT_DESC_SELF_HOSTED": "আপনি যদি আপনার authenticator অ্যাপ এবং ব্যাকআপ কোড দুটোই হারিয়ে ফেলেন, সহায়তার জন্য অনুগ্রহ করে আপনার অ্যাডমিনিস্ট্রেটরের সাথে যোগাযোগ করুন."
|
||||
"TITLE": "Two-Factor Authentication Help",
|
||||
"AUTHENTICATOR_TITLE": "Using an Authenticator App",
|
||||
"AUTHENTICATOR_DESC": "Open your authenticator app (Google Authenticator, Authy, etc.) and enter the 6-digit code shown for your account.",
|
||||
"BACKUP_TITLE": "Using a Backup Code",
|
||||
"BACKUP_DESC": "If you don't have access to your authenticator app, you can use one of the backup codes you saved when setting up 2FA. Each code can only be used once.",
|
||||
"CONTACT_TITLE": "Need More Help?",
|
||||
"CONTACT_DESC_CLOUD": "If you've lost access to both your authenticator app and backup codes, please reach out to Chatwoot support for assistance.",
|
||||
"CONTACT_DESC_SELF_HOSTED": "If you've lost access to both your authenticator app and backup codes, please contact your administrator for assistance."
|
||||
},
|
||||
"VERIFICATION_FAILED": "ভেরিফিকেশন ব্যর্থ হয়েছে। অনুগ্রহ করে আবার চেষ্টা করুন."
|
||||
"VERIFICATION_FAILED": "Verification failed. Please try again."
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -710,21 +710,9 @@
|
||||
"MESSENGER_SUB_HEAD": "Col·loca aquest botó dins de l'etiqueta body",
|
||||
"ALLOWED_DOMAINS": {
|
||||
"TITLE": "Allowed Domains",
|
||||
"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).",
|
||||
"SUBTITLE": "Add wildcard or regular domains separated by commas (leave blank to allow all), e.g. *.chatwoot.dev, chatwoot.com.",
|
||||
"PLACEHOLDER": "example.com, www.example.com, app.example.com"
|
||||
},
|
||||
"ALLOW_MOBILE_WEBVIEW": {
|
||||
"LABEL": "Enable widget in mobile apps",
|
||||
"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",
|
||||
"DESCRIPTION": "Verify user authenticity by generating secure tokens. This prevents unauthorized users from impersonating others in your chat.",
|
||||
"SECRET_KEY": "Secret Key",
|
||||
"VIEW_DOCS": "View documentation",
|
||||
"REQUIRE_LABEL": "Require identity validation for all conversations",
|
||||
"REQUIRE_DESCRIPTION": "When enabled, users must provide a valid identity token to start conversations. Requests without valid tokens will be rejected."
|
||||
},
|
||||
"INBOX_AGENTS": "Agents",
|
||||
"INBOX_AGENTS_SUB_TEXT": "Afegir o eliminar agents d'aquesta safata d'entrada",
|
||||
"AGENT_ASSIGNMENT": "Conversació Assignada",
|
||||
|
||||
@@ -527,8 +527,7 @@
|
||||
"TITLE": "Característiques",
|
||||
"ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations",
|
||||
"ALLOW_MEMORIES": "Capture key details as memories from customer interactions.",
|
||||
"ALLOW_CITATIONS": "Include source citations in responses",
|
||||
"ALLOW_CONTACT_ATTRIBUTES": "Allow access to contact information"
|
||||
"ALLOW_CITATIONS": "Include source citations in responses"
|
||||
}
|
||||
},
|
||||
"EDIT": {
|
||||
|
||||
@@ -710,21 +710,9 @@
|
||||
"MESSENGER_SUB_HEAD": "Umístěte toto tlačítko dovnitř vašeho tělesného štítku",
|
||||
"ALLOWED_DOMAINS": {
|
||||
"TITLE": "Allowed Domains",
|
||||
"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).",
|
||||
"SUBTITLE": "Add wildcard or regular domains separated by commas (leave blank to allow all), e.g. *.chatwoot.dev, chatwoot.com.",
|
||||
"PLACEHOLDER": "example.com, www.example.com, app.example.com"
|
||||
},
|
||||
"ALLOW_MOBILE_WEBVIEW": {
|
||||
"LABEL": "Enable widget in mobile apps",
|
||||
"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",
|
||||
"DESCRIPTION": "Verify user authenticity by generating secure tokens. This prevents unauthorized users from impersonating others in your chat.",
|
||||
"SECRET_KEY": "Secret Key",
|
||||
"VIEW_DOCS": "View documentation",
|
||||
"REQUIRE_LABEL": "Require identity validation for all conversations",
|
||||
"REQUIRE_DESCRIPTION": "When enabled, users must provide a valid identity token to start conversations. Requests without valid tokens will be rejected."
|
||||
},
|
||||
"INBOX_AGENTS": "Agenti",
|
||||
"INBOX_AGENTS_SUB_TEXT": "Přidat nebo odebrat agenty z této složky doručené pošty",
|
||||
"AGENT_ASSIGNMENT": "Conversation Assignment",
|
||||
|
||||
@@ -527,8 +527,7 @@
|
||||
"TITLE": "Funkce",
|
||||
"ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations",
|
||||
"ALLOW_MEMORIES": "Capture key details as memories from customer interactions.",
|
||||
"ALLOW_CITATIONS": "Include source citations in responses",
|
||||
"ALLOW_CONTACT_ATTRIBUTES": "Allow access to contact information"
|
||||
"ALLOW_CITATIONS": "Include source citations in responses"
|
||||
}
|
||||
},
|
||||
"EDIT": {
|
||||
|
||||
@@ -710,21 +710,9 @@
|
||||
"MESSENGER_SUB_HEAD": "Placer denne knap inde i din body tag",
|
||||
"ALLOWED_DOMAINS": {
|
||||
"TITLE": "Allowed Domains",
|
||||
"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).",
|
||||
"SUBTITLE": "Add wildcard or regular domains separated by commas (leave blank to allow all), e.g. *.chatwoot.dev, chatwoot.com.",
|
||||
"PLACEHOLDER": "example.com, www.example.com, app.example.com"
|
||||
},
|
||||
"ALLOW_MOBILE_WEBVIEW": {
|
||||
"LABEL": "Enable widget in mobile apps",
|
||||
"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",
|
||||
"DESCRIPTION": "Verify user authenticity by generating secure tokens. This prevents unauthorized users from impersonating others in your chat.",
|
||||
"SECRET_KEY": "Secret Key",
|
||||
"VIEW_DOCS": "View documentation",
|
||||
"REQUIRE_LABEL": "Require identity validation for all conversations",
|
||||
"REQUIRE_DESCRIPTION": "When enabled, users must provide a valid identity token to start conversations. Requests without valid tokens will be rejected."
|
||||
},
|
||||
"INBOX_AGENTS": "Agenter",
|
||||
"INBOX_AGENTS_SUB_TEXT": "Tilføj eller fjern agenter fra denne indbakke",
|
||||
"AGENT_ASSIGNMENT": "Samtale Tildeling",
|
||||
|
||||
@@ -527,8 +527,7 @@
|
||||
"TITLE": "Funktioner",
|
||||
"ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations",
|
||||
"ALLOW_MEMORIES": "Capture key details as memories from customer interactions.",
|
||||
"ALLOW_CITATIONS": "Include source citations in responses",
|
||||
"ALLOW_CONTACT_ATTRIBUTES": "Allow access to contact information"
|
||||
"ALLOW_CITATIONS": "Include source citations in responses"
|
||||
}
|
||||
},
|
||||
"EDIT": {
|
||||
|
||||
@@ -710,21 +710,9 @@
|
||||
"MESSENGER_SUB_HEAD": "Platzieren Sie diese Schaltfläche in Ihrem Body-Tag",
|
||||
"ALLOWED_DOMAINS": {
|
||||
"TITLE": "Allowed Domains",
|
||||
"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).",
|
||||
"SUBTITLE": "Add wildcard or regular domains separated by commas (leave blank to allow all), e.g. *.chatwoot.dev, chatwoot.com.",
|
||||
"PLACEHOLDER": "example.com, www.example.com, app.example.com"
|
||||
},
|
||||
"ALLOW_MOBILE_WEBVIEW": {
|
||||
"LABEL": "Enable widget in mobile apps",
|
||||
"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",
|
||||
"DESCRIPTION": "Verify user authenticity by generating secure tokens. This prevents unauthorized users from impersonating others in your chat.",
|
||||
"SECRET_KEY": "Secret Key",
|
||||
"VIEW_DOCS": "View documentation",
|
||||
"REQUIRE_LABEL": "Require identity validation for all conversations",
|
||||
"REQUIRE_DESCRIPTION": "When enabled, users must provide a valid identity token to start conversations. Requests without valid tokens will be rejected."
|
||||
},
|
||||
"INBOX_AGENTS": "Agenten",
|
||||
"INBOX_AGENTS_SUB_TEXT": "Hinzufügen oder Entfernen von Agenten zu diesem Posteingang",
|
||||
"AGENT_ASSIGNMENT": "Konversationssauftrag",
|
||||
|
||||
@@ -527,8 +527,7 @@
|
||||
"TITLE": "Funktionen",
|
||||
"ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations",
|
||||
"ALLOW_MEMORIES": "Capture key details as memories from customer interactions.",
|
||||
"ALLOW_CITATIONS": "Include source citations in responses",
|
||||
"ALLOW_CONTACT_ATTRIBUTES": "Allow access to contact information"
|
||||
"ALLOW_CITATIONS": "Include source citations in responses"
|
||||
}
|
||||
},
|
||||
"EDIT": {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user