diff --git a/AGENTS.md b/AGENTS.md
index 2430fae2b..82acfcc25 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -85,8 +85,8 @@
## Project-Specific
- **Translations**:
- - Only update `en.yml` and `en.json`
- - Other languages are handled by the community
+ - For product and source-string changes, only update `en.yml` and `en.json`; other languages are handled through Crowdin and the community
+ - Crowdin-generated translation sync PRs may update non-English locale files; do not flag those changes solely for modifying translated locale files
- Backend i18n → `en.yml`, Frontend i18n → `en.json`
- **Frontend**:
- Use `components-next/` for message bubbles (the rest is being deprecated)
diff --git a/Gemfile.lock b/Gemfile.lock
index 68674155e..46a1c0449 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -211,13 +211,14 @@ GEM
activerecord (>= 5.a)
database_cleaner-core (~> 2.0.0)
database_cleaner-core (2.0.1)
- datadog (2.19.0)
- datadog-ruby_core_source (~> 3.4, >= 3.4.1)
- libdatadog (~> 18.1.0.1.0)
- libddwaf (~> 1.24.1.0.3)
+ datadog (2.38.0)
+ cgi
+ datadog-ruby_core_source (~> 3.5, >= 3.5.3)
+ libdatadog (~> 36.0.0.1.0)
+ libddwaf (~> 1.30.0.0.0)
logger
msgpack
- datadog-ruby_core_source (3.4.1)
+ datadog-ruby_core_source (3.5.3)
date (3.5.1)
debug (1.8.0)
irb (>= 1.5.0)
@@ -522,15 +523,16 @@ GEM
logger (~> 1.6)
letter_opener (1.10.0)
launchy (>= 2.2, < 4)
- libdatadog (18.1.0.1.0)
- libdatadog (18.1.0.1.0-x86_64-linux)
- libddwaf (1.24.1.0.3)
+ libdatadog (36.0.0.1.0)
+ libdatadog (36.0.0.1.0-arm64-darwin)
+ libdatadog (36.0.0.1.0-x86_64-linux)
+ libddwaf (1.30.0.0.2)
ffi (~> 1.0)
- libddwaf (1.24.1.0.3-arm64-darwin)
+ libddwaf (1.30.0.0.2-arm64-darwin)
ffi (~> 1.0)
- libddwaf (1.24.1.0.3-x86_64-darwin)
+ libddwaf (1.30.0.0.2-x86_64-darwin)
ffi (~> 1.0)
- libddwaf (1.24.1.0.3-x86_64-linux)
+ libddwaf (1.30.0.0.2-x86_64-linux)
ffi (~> 1.0)
line-bot-api (1.28.0)
lint_roller (1.1.0)
@@ -547,7 +549,7 @@ GEM
activesupport (>= 4)
railties (>= 4)
request_store (~> 1.0)
- loofah (2.23.1)
+ loofah (2.25.2)
crass (~> 1.0.2)
nokogiri (>= 1.12.0)
mail (2.8.1)
@@ -740,8 +742,8 @@ GEM
activesupport (>= 5.0.0)
minitest
nokogiri (>= 1.6)
- rails-html-sanitizer (1.6.1)
- loofah (~> 2.21)
+ rails-html-sanitizer (1.7.1)
+ loofah (~> 2.25, >= 2.25.2)
nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
rails-i18n (7.0.10)
i18n (>= 0.7, < 2)
diff --git a/LICENSE b/LICENSE
index 8f80f35be..d0425a707 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2017-2024 Chatwoot Inc.
+Copyright (c) 2017-2026 Chatwoot Inc.
Portions of this software are licensed as follows:
diff --git a/VERSION_CW b/VERSION_CW
index fb0557132..ecbc3b030 100644
--- a/VERSION_CW
+++ b/VERSION_CW
@@ -1 +1 @@
-4.15.1
+4.16.0
diff --git a/app/controllers/api/v1/accounts/agent_bots_controller.rb b/app/controllers/api/v1/accounts/agent_bots_controller.rb
index de3d10081..3f0309024 100644
--- a/app/controllers/api/v1/accounts/agent_bots_controller.rb
+++ b/app/controllers/api/v1/accounts/agent_bots_controller.rb
@@ -1,5 +1,4 @@
class Api::V1::Accounts::AgentBotsController < Api::V1::Accounts::BaseController
- before_action :current_account
before_action :check_authorization
before_action :agent_bot, except: [:index, :create]
diff --git a/app/controllers/api/v1/accounts/branded_email_layouts_controller.rb b/app/controllers/api/v1/accounts/branded_email_layouts_controller.rb
new file mode 100644
index 000000000..54f976b79
--- /dev/null
+++ b/app/controllers/api/v1/accounts/branded_email_layouts_controller.rb
@@ -0,0 +1,28 @@
+class Api::V1::Accounts::BrandedEmailLayoutsController < Api::V1::Accounts::BaseController
+ before_action :check_admin_authorization?
+
+ def show
+ set_branded_email_layout
+ end
+
+ def update
+ unless Current.account.feature_enabled?(:branded_email_templates)
+ render_could_not_create_error('Branded email templates feature is not enabled')
+ return
+ end
+
+ branded_email_layout = params[:branded_email_layout] == 'null' ? nil : params[:branded_email_layout]
+ EmailTemplate.update_account_branded_layout!(account: Current.account, body: branded_email_layout) if params.key?(:branded_email_layout)
+ set_branded_email_layout
+ rescue ActiveRecord::RecordInvalid => e
+ render_could_not_create_error(e.record.errors.full_messages.join(', '))
+ end
+
+ private
+
+ def set_branded_email_layout
+ @branded_email_layout = EmailTemplate.account_branded_layout_template_for(Current.account)&.body
+ end
+end
+
+Api::V1::Accounts::BrandedEmailLayoutsController.prepend_mod_with('Api::V1::Accounts::BrandedEmailLayoutsController')
diff --git a/app/controllers/api/v1/accounts/captain/preferences_controller.rb b/app/controllers/api/v1/accounts/captain/preferences_controller.rb
index 482b001d6..3b7fafad5 100644
--- a/app/controllers/api/v1/accounts/captain/preferences_controller.rb
+++ b/app/controllers/api/v1/accounts/captain/preferences_controller.rb
@@ -1,5 +1,4 @@
class Api::V1::Accounts::Captain::PreferencesController < Api::V1::Accounts::BaseController
- before_action :current_account
before_action :authorize_account_update, only: [:update]
def show
diff --git a/app/controllers/api/v1/accounts/inboxes_controller.rb b/app/controllers/api/v1/accounts/inboxes_controller.rb
index bb9ca2a70..822fce7db 100644
--- a/app/controllers/api/v1/accounts/inboxes_controller.rb
+++ b/app/controllers/api/v1/accounts/inboxes_controller.rb
@@ -45,11 +45,20 @@ class Api::V1::Accounts::InboxesController < Api::V1::Accounts::BaseController
end
def update
- inbox_params = permitted_params.except(:channel, :csat_config)
- inbox_params[:csat_config] = format_csat_config(permitted_params[:csat_config]) if permitted_params[:csat_config].present?
- @inbox.update!(inbox_params)
- update_inbox_working_hours
- update_channel if channel_update_required?
+ continue_update = false
+
+ ActiveRecord::Base.transaction do
+ continue_update = update_branded_email_layout
+ raise ActiveRecord::Rollback unless continue_update
+
+ inbox_params = permitted_params.except(:channel, :csat_config)
+ inbox_params[:csat_config] = format_csat_config(permitted_params[:csat_config]) if permitted_params[:csat_config].present?
+ @inbox.update!(inbox_params)
+ update_inbox_working_hours
+ update_channel if channel_update_required?
+ end
+
+ return unless continue_update
end
def agent_bot
@@ -155,6 +164,34 @@ class Api::V1::Accounts::InboxesController < Api::V1::Accounts::BaseController
formatted['template'] = config['template'] if config['template'].present?
end
+ def update_branded_email_layout
+ return true unless params.key?(:branded_email_layout)
+
+ branded_email_layout = normalized_branded_email_layout
+
+ unless Current.account.feature_enabled?(:branded_email_templates)
+ return true if branded_email_layout.blank?
+
+ render_could_not_create_error('Branded email templates feature is not enabled')
+ return false
+ end
+
+ unless @inbox.email?
+ return true if branded_email_layout.blank?
+
+ render_could_not_create_error('Branded email layout is only supported for email inboxes')
+ return false
+ end
+
+ @inbox.update_branded_email_layout!(branded_email_layout)
+ true
+ rescue ActiveRecord::RecordInvalid => e
+ render_could_not_create_error(e.record.errors.full_messages.join(', '))
+ false
+ end
+
+ def normalized_branded_email_layout = params[:branded_email_layout] == 'null' ? nil : params[:branded_email_layout]
+
def inbox_attributes
[:name, :avatar, :greeting_enabled, :greeting_message, :enable_email_collect, :csat_survey_enabled,
:enable_auto_assignment, :working_hours_enabled, :out_of_office_message, :timezone, :allow_messages_after_resolved,
diff --git a/app/controllers/api/v1/accounts/labels_controller.rb b/app/controllers/api/v1/accounts/labels_controller.rb
index 6889d30a4..f678fee42 100644
--- a/app/controllers/api/v1/accounts/labels_controller.rb
+++ b/app/controllers/api/v1/accounts/labels_controller.rb
@@ -1,5 +1,4 @@
class Api::V1::Accounts::LabelsController < Api::V1::Accounts::BaseController
- before_action :current_account
before_action :fetch_label, except: [:index, :create]
before_action :check_authorization
diff --git a/app/controllers/api/v1/accounts/portals_controller.rb b/app/controllers/api/v1/accounts/portals_controller.rb
index c74c0ecfc..bdaf82f6c 100644
--- a/app/controllers/api/v1/accounts/portals_controller.rb
+++ b/app/controllers/api/v1/accounts/portals_controller.rb
@@ -81,7 +81,8 @@ class Api::V1::Accounts::PortalsController < Api::V1::Accounts::BaseController
:name, :page_title, :slug, :archived,
{ config: [:default_locale, :layout, { allowed_locales: [] }, { draft_locales: [] },
{ social_profiles: %i[facebook x instagram linkedin youtube tiktok github whatsapp] },
- { locale_translations: locale_translation_keys.index_with { %i[name page_title header_text] } }] }
+ { locale_translations: locale_translation_keys.index_with { %i[name page_title header_text] } },
+ { popular_content: popular_content_keys.index_with { { category_ids: [], article_ids: [] } } }] }
)
end
@@ -89,6 +90,10 @@ class Api::V1::Accounts::PortalsController < Api::V1::Accounts::BaseController
params.dig(:portal, :config, :locale_translations)&.keys || []
end
+ def popular_content_keys
+ params.dig(:portal, :config, :popular_content)&.keys || []
+ end
+
def live_chat_widget_params
permitted_params = params.permit(:inbox_id)
return {} unless permitted_params.key?(:inbox_id)
diff --git a/app/controllers/api/v1/accounts/whatsapp/authorizations_controller.rb b/app/controllers/api/v1/accounts/whatsapp/authorizations_controller.rb
index 580ae77c6..46d89a1ba 100644
--- a/app/controllers/api/v1/accounts/whatsapp/authorizations_controller.rb
+++ b/app/controllers/api/v1/accounts/whatsapp/authorizations_controller.rb
@@ -1,4 +1,5 @@
class Api::V1::Accounts::Whatsapp::AuthorizationsController < Api::V1::Accounts::BaseController
+ before_action :ensure_embedded_signup_enabled
# Reconfiguring/reauthorizing a live inbox swaps its credentials, so restrict it to admins.
before_action :check_admin_authorization?, if: -> { params[:inbox_id].present? }
before_action :fetch_and_validate_inbox, if: -> { params[:inbox_id].present? }
@@ -18,6 +19,13 @@ class Api::V1::Accounts::Whatsapp::AuthorizationsController < Api::V1::Accounts:
private
+ def ensure_embedded_signup_enabled
+ return unless ChatwootApp.chatwoot_cloud?
+ return if Current.account.feature_enabled?('whatsapp_embedded_signup_inbox_creation')
+
+ raise Pundit::NotAuthorizedError
+ end
+
def process_embedded_signup
service = Whatsapp::EmbeddedSignupService.new(
account: Current.account,
@@ -44,8 +52,7 @@ class Api::V1::Accounts::Whatsapp::AuthorizationsController < Api::V1::Accounts:
def can_reconfigure_channel?
channel = @inbox.channel
return false unless channel.provider == 'whatsapp_cloud'
-
- # Reconfiguring a live embedded-signup channel requires the feature flag.
+ return true if ChatwootApp.chatwoot_cloud?
return Current.account.feature_enabled?('whatsapp_reconfigure') if channel.provider_config['source'] == 'embedded_signup'
true
diff --git a/app/controllers/concerns/portal_home_data.rb b/app/controllers/concerns/portal_home_data.rb
index 633071301..71eaad081 100644
--- a/app/controllers/concerns/portal_home_data.rb
+++ b/app/controllers/concerns/portal_home_data.rb
@@ -4,17 +4,53 @@ module PortalHomeData
private
def load_home_data
- base_articles = @portal.articles.published.where(locale: @locale).includes(:author, :category)
+ load_recommended_content
+ # The classic hero only needs the recommendations above; the rest is
+ # documentation-layout home data (also used on custom-domain home pages).
+ return unless @portal.layout == 'documentation'
+
@visible_categories = @portal.categories
.where(locale: @locale)
.joins(:articles).where(articles: { status: :published })
.order(position: :asc)
.group('categories.id')
- @popular_topics = @visible_categories.first(3)
+ @popular_topics = @recommended_categories.presence || @visible_categories.first(3)
@featured = base_articles.order_by_views.limit(6)
@category_contributors = build_category_contributors(@visible_categories)
end
+ def load_recommended_content
+ @recommended_categories = recommended_categories
+ @recommended_articles = recommended_articles
+ end
+
+ def base_articles
+ @base_articles ||= @portal.articles.published.where(locale: @locale).includes(:author, :category)
+ end
+
+ # Admin-recommended categories for the locale, in the chosen order. Unlike the
+ # position-based fallback, published articles aren't required: the admin's pick wins.
+ def recommended_categories
+ ids = @portal.popular_category_ids(@locale)
+ ordered_by_ids(@portal.categories.where(locale: @locale, id: ids), ids)
+ end
+
+ # Admin-recommended articles for the locale, in the chosen order, limited to
+ # published articles that still exist.
+ def recommended_articles
+ ids = @portal.popular_article_ids(@locale)
+ ordered_by_ids(base_articles.where(id: ids), ids)
+ end
+
+ # Loads the scope and returns its records ordered to match `ids`, dropping any
+ # that no longer exist. Skips the query entirely when `ids` is blank.
+ def ordered_by_ids(scope, ids)
+ return [] if ids.blank?
+
+ by_id = scope.index_by(&:id)
+ ids.filter_map { |id| by_id[id] }
+ end
+
def build_category_contributors(categories)
category_ids = categories.map(&:id)
return {} if category_ids.empty?
diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb
index a369830b6..a72687b42 100644
--- a/app/controllers/dashboard_controller.rb
+++ b/app/controllers/dashboard_controller.rb
@@ -64,10 +64,8 @@ class DashboardController < ActionController::Base
return unless @portal
@locale = @portal.default_locale
- if @portal.layout == 'documentation'
- request.variant = :documentation
- load_home_data
- end
+ request.variant = :documentation if @portal.layout == 'documentation'
+ load_home_data
render 'public/api/v1/portals/show', layout: 'portal', portal: @portal and return
end
diff --git a/app/controllers/public/api/v1/portals_controller.rb b/app/controllers/public/api/v1/portals_controller.rb
index 4982278d7..da7d9e6a5 100644
--- a/app/controllers/public/api/v1/portals_controller.rb
+++ b/app/controllers/public/api/v1/portals_controller.rb
@@ -7,7 +7,7 @@ class Public::Api::V1::PortalsController < Public::Api::V1::Portals::BaseControl
before_action :set_portal_layout
before_action :set_view_variant
before_action :ensure_portal_feature_enabled
- before_action :load_home_data, only: [:show], if: -> { @portal_layout == 'documentation' }
+ before_action :load_home_data, only: [:show], unless: -> { @is_plain_layout_enabled }
layout 'portal'
def show
diff --git a/app/drops/inbox_drop.rb b/app/drops/inbox_drop.rb
index 563916d5f..29698fb4b 100644
--- a/app/drops/inbox_drop.rb
+++ b/app/drops/inbox_drop.rb
@@ -2,4 +2,18 @@ class InboxDrop < BaseDrop
def name
@obj.try(:name)
end
+
+ def business_name
+ @obj.try(:sanitized_business_name)
+ end
+
+ def avatar_url
+ @obj.try(:avatar_url)
+ end
+
+ def email
+ return unless @obj.try(:email?)
+
+ @obj.try(:email_address).presence || @obj.try(:channel).try(:email)
+ end
end
diff --git a/app/javascript/dashboard/api/calls.js b/app/javascript/dashboard/api/calls.js
new file mode 100644
index 000000000..aa220bdee
--- /dev/null
+++ b/app/javascript/dashboard/api/calls.js
@@ -0,0 +1,14 @@
+/* global axios */
+import ApiClient from './ApiClient';
+
+class CallsAPI extends ApiClient {
+ constructor() {
+ super('calls', { accountScoped: true });
+ }
+
+ get(params = {}) {
+ return axios.get(this.url, { params });
+ }
+}
+
+export default new CallsAPI();
diff --git a/app/javascript/dashboard/api/captain/agentSessions.js b/app/javascript/dashboard/api/captain/agentSessions.js
new file mode 100644
index 000000000..a557b5938
--- /dev/null
+++ b/app/javascript/dashboard/api/captain/agentSessions.js
@@ -0,0 +1,9 @@
+import ApiClient from '../ApiClient';
+
+class CaptainAgentSessions extends ApiClient {
+ constructor() {
+ super('captain/agent_sessions', { accountScoped: true });
+ }
+}
+
+export default new CaptainAgentSessions();
diff --git a/app/javascript/dashboard/api/captain/assistant.js b/app/javascript/dashboard/api/captain/assistant.js
index 1fc17798d..5af6110ab 100644
--- a/app/javascript/dashboard/api/captain/assistant.js
+++ b/app/javascript/dashboard/api/captain/assistant.js
@@ -26,15 +26,18 @@ class CaptainAssistant extends ApiClient {
});
}
- getStats({ assistantId, range }) {
- return axios.get(`${this.url}/${assistantId}/stats`, {
+ getStats({ assistantId, range, signal }) {
+ const requestConfig = {
params: { range, timezone_offset: getTimezoneOffset() },
- });
+ };
+ if (signal) requestConfig.signal = signal;
+
+ return axios.get(`${this.url}/${assistantId}/stats`, requestConfig);
}
- getSummary({ assistantId, range }) {
+ getSummary({ assistantId, range, stats }) {
return axios.get(`${this.url}/${assistantId}/summary`, {
- params: { range, timezone_offset: getTimezoneOffset() },
+ params: { range, timezone_offset: getTimezoneOffset(), stats },
});
}
diff --git a/app/javascript/dashboard/api/channel/whatsapp/whatsappCallsAPI.js b/app/javascript/dashboard/api/channel/whatsapp/whatsappCallsAPI.js
index ec24aae34..d458c1e5d 100644
--- a/app/javascript/dashboard/api/channel/whatsapp/whatsappCallsAPI.js
+++ b/app/javascript/dashboard/api/channel/whatsapp/whatsappCallsAPI.js
@@ -10,10 +10,13 @@ class WhatsappCallsAPI extends ApiClient {
return axios.get(`${this.url}/${callId}`).then(r => r.data);
}
- initiate(conversationId, sdpOffer) {
+ // Either conversationId, or contactId + inboxId to let the BE resolve the conversation.
+ initiate({ conversationId, contactId, inboxId }, sdpOffer) {
return axios
.post(`${this.url}/initiate`, {
conversation_id: conversationId,
+ contact_id: contactId,
+ inbox_id: inboxId,
sdp_offer: sdpOffer,
})
.then(r => r.data);
diff --git a/app/javascript/dashboard/api/helpCenter/articles.js b/app/javascript/dashboard/api/helpCenter/articles.js
index 55b620d1a..610ba1e57 100644
--- a/app/javascript/dashboard/api/helpCenter/articles.js
+++ b/app/javascript/dashboard/api/helpCenter/articles.js
@@ -17,6 +17,7 @@ class ArticlesAPI extends PortalsAPI {
categorySlug,
sort,
query,
+ signal,
}) {
const url = getArticleSearchURL({
pageNumber,
@@ -30,7 +31,7 @@ class ArticlesAPI extends PortalsAPI {
host: this.url,
});
- return axios.get(url);
+ return axios.get(url, { signal });
}
searchArticles({ portalSlug, query }) {
diff --git a/app/javascript/dashboard/api/specs/article.spec.js b/app/javascript/dashboard/api/specs/article.spec.js
index b40613739..9f7052ed5 100644
--- a/app/javascript/dashboard/api/specs/article.spec.js
+++ b/app/javascript/dashboard/api/specs/article.spec.js
@@ -37,7 +37,8 @@ describe('#PortalAPI', () => {
authorId: '1',
});
expect(axiosMock.get).toHaveBeenCalledWith(
- '/api/v1/portals/room-rental/articles?page=1&locale=en-US&status=published&author_id=1'
+ '/api/v1/portals/room-rental/articles?page=1&locale=en-US&status=published&author_id=1',
+ { signal: undefined }
);
});
});
diff --git a/app/javascript/dashboard/components-next/Calls/CallListItem.vue b/app/javascript/dashboard/components-next/Calls/CallListItem.vue
new file mode 100644
index 000000000..dd2b3af37
--- /dev/null
+++ b/app/javascript/dashboard/components-next/Calls/CallListItem.vue
@@ -0,0 +1,240 @@
+
+
+
+
+ +
++ +
++ {{ row.label }} +
++ {{ row.subtitle }} +
+
+
+
Audit Logs
Audit Logs are trails for events and actions in a Chatwoot System.
", + "LIST": { + "404": "There are no Audit Logs available in this account.", + "TITLE": "Manage Audit Logs", + "DESC": "Audit Logs are trails for events and actions in a Chatwoot System.", + "TABLE_HEADER": { + "ACTIVITY": "Activity", + "TIME": "Time", + "IP_ADDRESS": "IP Address" + } + }, + "API": { + "SUCCESS_MESSAGE": "AuditLogs retrieved successfully", + "ERROR_MESSAGE": "Could not connect to Woot Server, Please try again later" + }, + "DEFAULT_USER": "System", + "AUTOMATION_RULE": { + "ADD": "{agentName} created a new automation rule (#{id})", + "EDIT": "{agentName} updated an automation rule (#{id})", + "DELETE": "{agentName} deleted an automation rule (#{id})" + }, + "ACCOUNT_USER": { + "ADD": "{agentName} invited {invitee} to the account as an {role}", + "EDIT": { + "SELF": "{agentName} changed their {attributes} to {values}", + "OTHER": "{agentName} changed {attributes} of {user} to {values}", + "DELETED": "{agentName} changed {attributes} of a deleted user to {values}" + } + }, + "INBOX": { + "ADD": "{agentName} created a new inbox (#{id})", + "EDIT": "{agentName} updated an inbox (#{id})", + "DELETE": "{agentName} deleted an inbox (#{id})" + }, + "WEBHOOK": { + "ADD": "{agentName} created a new webhook (#{id})", + "EDIT": "{agentName} updated a webhook (#{id})", + "DELETE": "{agentName} deleted a webhook (#{id})" + }, + "USER_ACTION": { + "SIGN_IN": "{agentName} signed in", + "SIGN_OUT": "{agentName} signed out" + }, + "TEAM": { + "ADD": "{agentName} created a new team (#{id})", + "EDIT": "{agentName} updated a team (#{id})", + "DELETE": "{agentName} deleted a team (#{id})" + }, + "MACRO": { + "ADD": "{agentName} created a new macro (#{id})", + "EDIT": "{agentName} updated a macro (#{id})", + "DELETE": "{agentName} deleted a macro (#{id})" + }, + "INBOX_MEMBER": { + "ADD": "{agentName} added {user} to the inbox(#{inbox_id})", + "REMOVE": "{agentName} removed {user} from the inbox(#{inbox_id})" + }, + "TEAM_MEMBER": { + "ADD": "{agentName} added {user} to the team(#{team_id})", + "REMOVE": "{agentName} removed {user} from the team(#{team_id})" + }, + "ACCOUNT": { + "EDIT": "{agentName} updated the account configuration (#{id})" + }, + "CONVERSATION": { + "DELETE": "{agentName} deleted conversation #{id}" + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/automation.json b/app/javascript/dashboard/i18n/locale/uz/automation.json new file mode 100644 index 000000000..256a0c8f6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/automation.json @@ -0,0 +1,193 @@ +{ + "AUTOMATION": { + "HEADER": "Automation", + "DESCRIPTION": "Automation can replace and streamline existing processes that require manual effort, such as adding labels and assigning conversations to the most suitable agent. This allows the team to focus on their strengths while reducing time spent on routine tasks.", + "LEARN_MORE": "Learn more about automation", + "COUNT": "{n} automation | {n} automations", + "HEADER_BTN_TXT": "Create Automation", + "LOADING": "Fetching automation rules", + "SEARCH_PLACEHOLDER": "Search automation rules...", + "NO_RESULTS": "No automation rules found matching your search", + "ADD": { + "TITLE": "Add Automation Rule", + "SUBMIT": "Create", + "CANCEL_BUTTON_TEXT": "Cancel", + "FORM": { + "NAME": { + "LABEL": "Rule Name", + "PLACEHOLDER": "Enter rule name", + "ERROR": "Name is required" + }, + "DESC": { + "LABEL": "Description", + "PLACEHOLDER": "Enter rule description", + "ERROR": "Description is required" + }, + "EVENT": { + "LABEL": "Event", + "PLACEHOLDER": "Please select one", + "ERROR": "Event is required" + }, + "CONDITIONS": { + "LABEL": "Conditions" + }, + "ACTIONS": { + "LABEL": "Actions" + } + }, + "CONDITION_BUTTON_LABEL": "Add Condition", + "ACTION_BUTTON_LABEL": "Add Action", + "API": { + "SUCCESS_MESSAGE": "Automation rule added successfully", + "ERROR_MESSAGE": "Could not able to create a automation rule, Please try again later" + } + }, + "LIST": { + "TABLE_HEADER": { + "NAME": "Name", + "ACTIVE": "Active", + "CREATED_ON": "Created on", + "ACTIONS": "Actions" + }, + "404": "No automation rules found" + }, + "DELETE": { + "TITLE": "Delete Automation Rule", + "SUBMIT": "Delete", + "CANCEL_BUTTON_TEXT": "Cancel", + "CONFIRM": { + "TITLE": "Confirm Deletion", + "MESSAGE": "Are you sure to delete ", + "YES": "Yes, Delete ", + "NO": "No, Keep " + }, + "API": { + "SUCCESS_MESSAGE": "Automation rule deleted successfully", + "ERROR_MESSAGE": "Could not able to delete a automation rule, Please try again later" + } + }, + "EDIT": { + "TITLE": "Edit Automation Rule", + "SUBMIT": "Update", + "CANCEL_BUTTON_TEXT": "Cancel", + "API": { + "SUCCESS_MESSAGE": "Automation rule updated successfully", + "ERROR_MESSAGE": "Could not update automation rule, Please try again later" + } + }, + "CLONE": { + "TOOLTIP": "Clone", + "API": { + "SUCCESS_MESSAGE": "Automation cloned successfully", + "ERROR_MESSAGE": "Could not clone automation rule, Please try again later" + } + }, + "FORM": { + "EDIT": "Edit", + "CREATE": "Create", + "DELETE": "Delete", + "CANCEL": "Cancel", + "RESET_MESSAGE": "Changing event type will reset the conditions and events you have added below" + }, + "CONDITION": { + "DELETE_MESSAGE": "You need to have atleast one condition to save", + "CONTACT_CUSTOM_ATTR_LABEL": "Contact Custom Attributes", + "CONVERSATION_CUSTOM_ATTR_LABEL": "Conversation Custom Attributes" + }, + "ACTION": { + "DELETE_MESSAGE": "You need to have atleast one action to save", + "TEAM_MESSAGE_INPUT_PLACEHOLDER": "Enter your message here", + "TEAM_DROPDOWN_PLACEHOLDER": "Select teams", + "EMAIL_INPUT_PLACEHOLDER": "Enter email", + "URL_INPUT_PLACEHOLDER": "Enter URL" + }, + "TOGGLE": { + "ACTIVATION_TITLE": "Activate Automation Rule", + "DEACTIVATION_TITLE": "Deactivate Automation Rule", + "ACTIVATION_DESCRIPTION": "This action will activate the automation rule '{automationName}'. Are you sure you want to proceed?", + "DEACTIVATION_DESCRIPTION": "This action will deactivate the automation rule '{automationName}'. Are you sure you want to proceed?", + "ACTIVATION_SUCCESFUL": "Automation Rule Activated Successfully", + "DEACTIVATION_SUCCESFUL": "Automation Rule Deactivated Successfully", + "ACTIVATION_ERROR": "Could not Activate Automation, Please try again later", + "DEACTIVATION_ERROR": "Could not Deactivate Automation, Please try again later", + "CONFIRMATION_LABEL": "Yes", + "CANCEL_LABEL": "No" + }, + "ATTACHMENT": { + "UPLOAD_ERROR": "Could not upload attachment, Please try again", + "LABEL_IDLE": "Upload Attachment", + "LABEL_UPLOADING": "Yuklanmoqda...", + "LABEL_UPLOADED": "Successfully Uploaded", + "LABEL_UPLOAD_FAILED": "Upload Failed" + }, + "ERRORS": { + "ATTRIBUTE_KEY_REQUIRED": "Attribute key is required", + "FILTER_OPERATOR_REQUIRED": "Filter operator is required", + "VALUE_REQUIRED": "Value is required", + "VALUE_MUST_BE_BETWEEN_1_AND_998": "Value must be between 1 and 998", + "ACTION_PARAMETERS_REQUIRED": "Action parameters are required", + "ATLEAST_ONE_CONDITION_REQUIRED": "At least one condition is required", + "ATLEAST_ONE_ACTION_REQUIRED": "At least one action is required" + }, + "NONE_OPTION": "None", + "LAST_RESPONDING_AGENT": "Last Responding Agent", + "EVENTS": { + "CONVERSATION_CREATED": "Conversation Created", + "CONVERSATION_UPDATED": "Conversation Updated", + "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", + "CONVERSATION_OPENED": "Conversation Opened" + }, + "ACTIONS": { + "ASSIGN_AGENT": "Assign to Agent", + "ASSIGN_TEAM": "Assign a Team", + "REMOVE_ASSIGNED_AGENT": "Remove Assigned Agent", + "REMOVE_ASSIGNED_TEAM": "Remove Assigned Team", + "ADD_LABEL": "Add a Label", + "REMOVE_LABEL": "Remove a Label", + "SEND_EMAIL_TO_TEAM": "Send an Email to Team", + "SEND_EMAIL_TRANSCRIPT": "Send an Email Transcript", + "MUTE_CONVERSATION": "Mute Conversation", + "SNOOZE_CONVERSATION": "Snooze Conversation", + "RESOLVE_CONVERSATION": "Resolve Conversation", + "SEND_WEBHOOK_EVENT": "Send Webhook Event", + "SEND_ATTACHMENT": "Send Attachment", + "SEND_MESSAGE": "Send a Message", + "ADD_PRIVATE_NOTE": "Add a Private Note", + "CHANGE_PRIORITY": "Change Priority", + "ADD_SLA": "Add SLA", + "OPEN_CONVERSATION": "Open conversation", + "PENDING_CONVERSATION": "Mark conversation as pending" + }, + "MESSAGE_TYPES": { + "INCOMING": "Incoming Message", + "OUTGOING": "Outgoing Message" + }, + "PRIORITY_TYPES": { + "NONE": "None", + "LOW": "Low", + "MEDIUM": "Medium", + "HIGH": "High", + "URGENT": "Urgent" + }, + "ATTRIBUTES": { + "MESSAGE_TYPE": "Message Type", + "PRIVATE_NOTE": "Private Note", + "MESSAGE_CONTAINS": "Message Contains", + "EMAIL": "Email", + "INBOX": "Inbox", + "CONVERSATION_LANGUAGE": "Conversation Language", + "PHONE_NUMBER": "Phone Number", + "STATUS": "Status", + "BROWSER_LANGUAGE": "Browser Language", + "MAIL_SUBJECT": "Email Subject", + "COUNTRY_NAME": "Country", + "COMPANY_NAME": "Company", + "REFERER_LINK": "Referrer Link", + "ASSIGNEE_NAME": "Assignee", + "TEAM_NAME": "Team", + "PRIORITY": "Priority", + "LABELS": "Labels" + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/bulkActions.json b/app/javascript/dashboard/i18n/locale/uz/bulkActions.json new file mode 100644 index 000000000..0c8ea34f2 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/bulkActions.json @@ -0,0 +1,46 @@ +{ + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "{conversationCount} selected", + "NONE": "None", + "CLEAR_SELECTION": "Clear", + "ASSIGN_AGENT_CONFIRMATION_LABEL": "Are you sure you want to assign {n} conversation to {agentName}? | Are you sure you want to assign {n} conversations to {agentName}?", + "UNASSIGN_AGENT_CONFIRMATION_LABEL": "Are you sure you want to unassign {n} conversation? | Are you sure you want to unassign {n} conversations?", + "YES": "Yes", + "CANCEL": "Cancel", + "SEARCH_INPUT_PLACEHOLDER": "Search", + "ASSIGN_AGENT_TOOLTIP": "Assign agent", + "ASSIGN_TEAM_TOOLTIP": "Assign team", + "ASSIGN_SUCCESFUL": "Conversations assigned successfully.", + "ASSIGN_FAILED": "Failed to assign conversations. Please try again.", + "RESOLVE_SUCCESFUL": "Conversations resolved successfully.", + "RESOLVE_FAILED": "Failed to resolve conversations. Please try again.", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", + "UPDATE": { + "CHANGE_STATUS": "Change status", + "SNOOZE_UNTIL": "Snooze", + "UPDATE_SUCCESFUL": "Conversation status updated successfully.", + "UPDATE_FAILED": "Failed to update conversations. Please try again." + }, + "RESOLVE": { + "ALL_MISSING_ATTRIBUTES": "Cannot resolve conversations due to missing required attributes", + "PARTIAL_SUCCESS": "Some conversations need required attributes before resolving and were skipped" + }, + "LABELS": { + "ASSIGN_LABELS": "Assign labels", + "REMOVE_LABELS": "Remove labels", + "ASSIGN_SELECTED_LABELS": "Assign selected labels", + "REMOVE_SELECTED_LABELS": "Remove selected labels", + "ASSIGN_SUCCESFUL": "Labels assigned successfully.", + "ASSIGN_FAILED": "Failed to assign labels. Please try again.", + "REMOVE_SUCCESFUL": "Labels removed successfully.", + "REMOVE_FAILED": "Failed to remove labels. Please try again." + }, + "TEAMS": { + "NONE": "None", + "ASSIGN_TEAM_CONFIRMATION_LABEL": "Are you sure you want to assign {n} conversation to {teamName}? | Are you sure you want to assign {n} conversations to {teamName}?", + "UNASSIGN_TEAM_CONFIRMATION_LABEL": "Are you sure you want to unassign {n} conversation? | Are you sure you want to unassign {n} conversations?", + "ASSIGN_SUCCESFUL": "Teams assigned successfully.", + "ASSIGN_FAILED": "Failed to assign team. Please try again." + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/campaign.json b/app/javascript/dashboard/i18n/locale/uz/campaign.json new file mode 100644 index 000000000..cd108a8b4 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/campaign.json @@ -0,0 +1,216 @@ +{ + "CAMPAIGN": { + "LIVE_CHAT": { + "HEADER_TITLE": "Live chat campaigns", + "NEW_CAMPAIGN": "Create campaign", + "CARD": { + "STATUS": { + "ENABLED": "Enabled", + "DISABLED": "Disabled" + }, + "CAMPAIGN_DETAILS": { + "SENT_BY": "Sent by", + "BOT": "Bot", + "FROM": "tomonidan", + "URL": "URL:" + } + }, + "EMPTY_STATE": { + "TITLE": "No live chat campaigns are available", + "SUBTITLE": "Connect with your customers using proactive messages. Click 'Create campaign' to get started." + }, + "CREATE": { + "TITLE": "Create a live chat campaign", + "CANCEL_BUTTON_TEXT": "Cancel", + "CREATE_BUTTON_TEXT": "Create", + "FORM": { + "TITLE": { + "LABEL": "Title", + "PLACEHOLDER": "Please enter the title of campaign", + "ERROR": "Title is required" + }, + "MESSAGE": { + "LABEL": "Xabar", + "PLACEHOLDER": "Please enter the message of campaign", + "ERROR": "Message is required" + }, + "INBOX": { + "LABEL": "Select Inbox", + "PLACEHOLDER": "Select Inbox", + "ERROR": "Inbox is required" + }, + "SENT_BY": { + "LABEL": "Sent by", + "PLACEHOLDER": "Please select sender", + "ERROR": "Sender is required" + }, + "END_POINT": { + "LABEL": "URL", + "PLACEHOLDER": "Please enter the URL", + "ERROR": "Please enter a valid URL" + }, + "TIME_ON_PAGE": { + "LABEL": "Time on page(Seconds)", + "PLACEHOLDER": "Please enter the time", + "ERROR": "Time on page is required" + }, + "OTHER_PREFERENCES": { + "TITLE": "Other preferences", + "ENABLED": "Enable campaign", + "TRIGGER_ONLY_BUSINESS_HOURS": "Trigger only during business hours" + }, + "BUTTONS": { + "CREATE": "Create", + "CANCEL": "Cancel" + }, + "API": { + "SUCCESS_MESSAGE": "Live chat campaign created successfully", + "ERROR_MESSAGE": "There was an error. Please try again." + } + } + }, + "EDIT": { + "TITLE": "Edit live chat campaign", + "FORM": { + "API": { + "SUCCESS_MESSAGE": "Live chat campaign updated successfully", + "ERROR_MESSAGE": "There was an error. Please try again." + } + } + } + }, + "SMS": { + "HEADER_TITLE": "SMS campaigns", + "NEW_CAMPAIGN": "Create campaign", + "EMPTY_STATE": { + "TITLE": "No SMS campaigns are available", + "SUBTITLE": "Launch an SMS campaign to reach your customers directly. Send offers or make announcements with ease. Click 'Create campaign' to get started." + }, + "CARD": { + "STATUS": { + "PROCESSING": "Processing", + "COMPLETED": "Completed", + "SCHEDULED": "Scheduled" + }, + "CAMPAIGN_DETAILS": { + "SENT_FROM": "Sent from", + "ON": "on" + } + }, + "CREATE": { + "TITLE": "Create SMS campaign", + "CANCEL_BUTTON_TEXT": "Cancel", + "CREATE_BUTTON_TEXT": "Create", + "FORM": { + "TITLE": { + "LABEL": "Title", + "PLACEHOLDER": "Please enter the title of campaign", + "ERROR": "Title is required" + }, + "MESSAGE": { + "LABEL": "Xabar", + "PLACEHOLDER": "Please enter the message of campaign", + "ERROR": "Message is required" + }, + "INBOX": { + "LABEL": "Select Inbox", + "PLACEHOLDER": "Select Inbox", + "ERROR": "Inbox is required" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "ERROR": "Scheduled time is required" + }, + "BUTTONS": { + "CREATE": "Create", + "CANCEL": "Cancel" + }, + "API": { + "SUCCESS_MESSAGE": "SMS campaign created successfully", + "ERROR_MESSAGE": "There was an error. Please try again." + } + } + } + }, + "WHATSAPP": { + "HEADER_TITLE": "WhatsApp campaigns", + "NEW_CAMPAIGN": "Create campaign", + "EMPTY_STATE": { + "TITLE": "No WhatsApp campaigns are available", + "SUBTITLE": "Launch a WhatsApp campaign to reach your customers directly. Send offers or make announcements with ease. Click 'Create campaign' to get started." + }, + "CARD": { + "STATUS": { + "PROCESSING": "Processing", + "COMPLETED": "Completed", + "SCHEDULED": "Scheduled" + }, + "CAMPAIGN_DETAILS": { + "SENT_FROM": "Sent from", + "ON": "on" + } + }, + "CREATE": { + "TITLE": "Create WhatsApp campaign", + "CANCEL_BUTTON_TEXT": "Cancel", + "CREATE_BUTTON_TEXT": "Create", + "FORM": { + "TITLE": { + "LABEL": "Title", + "PLACEHOLDER": "Please enter the title of campaign", + "ERROR": "Title is required" + }, + "INBOX": { + "LABEL": "Select Inbox", + "PLACEHOLDER": "Select Inbox", + "ERROR": "Inbox is required" + }, + "TEMPLATE": { + "LABEL": "WhatsApp Template", + "PLACEHOLDER": "Select a template", + "INFO": "Select a template to use for this campaign.", + "ERROR": "Template is required", + "PREVIEW_TITLE": "Process {templateName}", + "LANGUAGE": "Language", + "CATEGORY": "Category", + "VARIABLES_LABEL": "Variables", + "VARIABLE_PLACEHOLDER": "Enter value for {variable}" + }, + "AUDIENCE": { + "LABEL": "Audience", + "PLACEHOLDER": "Select the customer labels", + "ERROR": "Audience is required" + }, + "SCHEDULED_AT": { + "LABEL": "Scheduled time", + "PLACEHOLDER": "Please select the time", + "ERROR": "Scheduled time is required" + }, + "BUTTONS": { + "CREATE": "Create", + "CANCEL": "Cancel" + }, + "API": { + "SUCCESS_MESSAGE": "WhatsApp campaign created successfully", + "ERROR_MESSAGE": "There was an error. Please try again." + } + } + } + }, + "CONFIRM_DELETE": { + "TITLE": "Are you sure to delete?", + "DESCRIPTION": "The delete action is permanent and cannot be reversed.", + "CONFIRM": "Delete", + "API": { + "SUCCESS_MESSAGE": "Campaign deleted successfully", + "ERROR_MESSAGE": "There was an error. Please try again." + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/cannedMgmt.json b/app/javascript/dashboard/i18n/locale/uz/cannedMgmt.json new file mode 100644 index 000000000..e768e1522 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/cannedMgmt.json @@ -0,0 +1,80 @@ +{ + "CANNED_MGMT": { + "HEADER": "Canned Responses", + "LEARN_MORE": "Learn more about canned responses", + "DESCRIPTION": "Canned Responses are pre-written reply templates that help you quickly respond to a conversation. Agents can type the '/' character followed by the shortcode to insert a canned response during a conversation. ", + "COUNT": "{n} canned response | {n} canned responses", + "HEADER_BTN_TXT": "Add canned response", + "LOADING": "Fetching canned responses...", + "SEARCH_PLACEHOLDER": "Search canned responses...", + "NO_RESULTS": "No canned responses found matching your search", + "SEARCH_404": "There are no items matching this query.", + "LIST": { + "404": "There are no canned responses available in this account.", + "TITLE": "Manage canned responses", + "DESC": "Canned Responses are predefined reply templates which can be used to quickly send out replies to conversations.", + "TABLE_HEADER": { + "SHORT_CODE": "Short code", + "CONTENT": "Content", + "ACTIONS": "Actions" + } + }, + "ADD": { + "TITLE": "Add canned response", + "DESC": "Canned Responses are predefined reply templates which can be used to quickly send out replies to conversations.", + "CANCEL_BUTTON_TEXT": "Cancel", + "FORM": { + "SHORT_CODE": { + "LABEL": "Short code", + "PLACEHOLDER": "Please enter a short code.", + "ERROR": "Short Code is required." + }, + "CONTENT": { + "LABEL": "Xabar", + "PLACEHOLDER": "Please write the message you want to save as a template to use later.", + "ERROR": "Message is required." + }, + "SUBMIT": "Submit" + }, + "API": { + "SUCCESS_MESSAGE": "Canned response added successfully.", + "ERROR_MESSAGE": "Could not connect to Woot server. Please try again." + } + }, + "EDIT": { + "TITLE": "Edit canned response", + "CANCEL_BUTTON_TEXT": "Cancel", + "FORM": { + "SHORT_CODE": { + "LABEL": "Short code", + "PLACEHOLDER": "Please enter a shortcode.", + "ERROR": "Short code is required." + }, + "CONTENT": { + "LABEL": "Xabar", + "PLACEHOLDER": "Please write the message you want to save as a template to use later.", + "ERROR": "Message is required." + }, + "SUBMIT": "Submit" + }, + "BUTTON_TEXT": "Edit", + "API": { + "SUCCESS_MESSAGE": "Canned response is updated successfully.", + "ERROR_MESSAGE": "Could not connect to Woot server. Please try again." + } + }, + "DELETE": { + "BUTTON_TEXT": "Delete", + "API": { + "SUCCESS_MESSAGE": "Canned response deleted successfully.", + "ERROR_MESSAGE": "Could not connect to Woot server. Please try again." + }, + "CONFIRM": { + "TITLE": "Confirm deletion", + "MESSAGE": "Are you sure to delete ", + "YES": "Yes, delete ", + "NO": "No, keep " + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/chatlist.json b/app/javascript/dashboard/i18n/locale/uz/chatlist.json new file mode 100644 index 000000000..45755892d --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/chatlist.json @@ -0,0 +1,149 @@ +{ + "CHAT_LIST": { + "LOADING": "Fetching conversations", + "LOAD_MORE_CONVERSATIONS": "Load more conversations", + "EOF": "All conversations loaded 🎉", + "LIST": { + "404": "There are no active conversations in this group." + }, + "FAILED_TO_SEND": "Failed to send", + "TAB_HEADING": "Conversations", + "MENTION_HEADING": "Mentions", + "UNATTENDED_HEADING": "Unattended", + "SEARCH": { + "INPUT": "Search for People, Chats, Saved Replies .." + }, + "FILTER_ALL": "All", + "ASSIGNEE_TYPE_TABS": { + "me": "Mine", + "unassigned": "Unassigned", + "all": "All" + }, + "CHAT_STATUS_FILTER_ITEMS": { + "open": { + "TEXT": "Open" + }, + "resolved": { + "TEXT": "Resolved" + }, + "pending": { + "TEXT": "Pending" + }, + "snoozed": { + "TEXT": "Snoozed" + }, + "all": { + "TEXT": "All" + } + }, + "VIEW_FILTER": "View", + "SORT_TOOLTIP_LABEL": "Sort conversations", + "CHAT_SORT": { + "STATUS": "Status", + "ORDER_BY": "Order by" + }, + "CHAT_TIME_STAMP": { + "CREATED": { + "LATEST": "Created", + "OLDEST": "Created at:" + }, + "LAST_ACTIVITY": { + "NOT_ACTIVE": "Last activity:", + "ACTIVE": "Last activity" + } + }, + "SORT_ORDER_ITEMS": { + "last_activity_at_asc": { + "TEXT": "Last activity: Oldest first" + }, + "last_activity_at_desc": { + "TEXT": "Last activity: Newest first" + }, + "created_at_desc": { + "TEXT": "Created at: Newest first" + }, + "created_at_asc": { + "TEXT": "Created at: Oldest first" + }, + "priority_desc": { + "TEXT": "Priority: Highest first" + }, + "priority_asc": { + "TEXT": "Priority: Lowest first" + }, + "waiting_since_asc": { + "TEXT": "Pending Response: Longest first" + }, + "waiting_since_desc": { + "TEXT": "Pending Response: Shortest first" + }, + "priority_desc_created_at_asc": { + "TEXT": "Priority: Highest first, Created: Oldest first" + }, + "unread": { + "TEXT": "Unread Count: Highest first" + } + }, + "ATTACHMENTS": { + "image": { + "CONTENT": "Picture message" + }, + "audio": { + "CONTENT": "Audio message" + }, + "video": { + "CONTENT": "Video message" + }, + "file": { + "CONTENT": "File Attachment" + }, + "location": { + "CONTENT": "Location" + }, + "ig_reel": { + "CONTENT": "Instagram Reel" + }, + "fallback": { + "CONTENT": "has shared a url" + }, + "contact": { + "CONTENT": "Shared contact" + }, + "embed": { + "CONTENT": "Embedded content" + } + }, + "CHAT_SORT_BY_FILTER": { + "TITLE": "Sort conversation", + "DROPDOWN_TITLE": "Sort by", + "ITEMS": { + "LATEST": { + "NAME": "Last activity at", + "LABEL": "Last activity" + }, + "CREATED_AT": { + "NAME": "Created at", + "LABEL": "Created at" + }, + "LAST_USER_MESSAGE_AT": { + "NAME": "Last user message at", + "LABEL": "Last message" + } + } + }, + "RECEIVED_VIA_EMAIL": "Received via email", + "VIEW_TWEET_IN_TWITTER": "View tweet in Twitter", + "REPLY_TO_TWEET": "Reply to this tweet", + "LINK_TO_STORY": "Go to instagram story", + "SENT": "Sent successfully", + "READ": "Read successfully", + "DELIVERED": "Delivered successfully", + "NO_MESSAGES": "No Messages", + "NO_CONTENT": "No content available", + "HIDE_QUOTED_TEXT": "Hide Quoted Text", + "SHOW_QUOTED_TEXT": "Show Quoted Text", + "MESSAGE_READ": "Read", + "SENDING": "Sending", + "UNREAD_COUNT_OVERFLOW": "9+" + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/companies.json b/app/javascript/dashboard/i18n/locale/uz/companies.json new file mode 100644 index 000000000..d4cd0b72f --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/companies.json @@ -0,0 +1,153 @@ +{ + "COMPANIES": { + "HEADER": "Companies", + "SORT_BY": { + "LABEL": "Sort by", + "OPTIONS": { + "NAME": "Name", + "DOMAIN": "Domain", + "CREATED_AT": "Created at", + "LAST_ACTIVITY_AT": "Last activity", + "CONTACTS_COUNT": "Contacts count" + } + }, + "ORDER": { + "LABEL": "Order", + "OPTIONS": { + "ASCENDING": "Ascending", + "DESCENDING": "Descending" + } + }, + "SEARCH_PLACEHOLDER": "Search companies...", + "LOADING": "Loading companies...", + "UNNAMED": "Unnamed Company", + "CONTACTS_COUNT": "{n} contact | {n} contacts", + "ACTIONS": { + "CREATE": "Add company" + }, + "SELECTOR": { + "PLACEHOLDER": "Select company", + "CREATE_OPTION": "Add \"{name}\"" + }, + "CREATE": { + "TITLE": "Add company details", + "ACTIONS": { + "SAVE": "Add company" + }, + "MESSAGES": { + "SUCCESS": "Company created.", + "ERROR": "Could not create the company." + } + }, + "DETAIL": { + "LOADING": "Loading company details...", + "EMPTY_STATE": { + "TITLE": "Company not found", + "SUBTITLE": "This company may have been removed or is no longer available in this account." + }, + "SIDEBAR": { + "TABS": { + "ATTRIBUTES": "Attributes", + "CONTACTS": "Contacts", + "HISTORY": "History", + "NOTES": "Notes" + } + }, + "HISTORY": { + "EMPTY": "No conversations found for this company's contacts yet." + }, + "NOTES": { + "EMPTY": "No notes found for this company's contacts yet." + }, + "ATTRIBUTES": { + "SEARCH_PLACEHOLDER": "Search attributes...", + "EMPTY_STATE": "There are no company custom attributes configured yet.", + "NO_ATTRIBUTES": "No matching attributes found.", + "UNUSED_ATTRIBUTES": "{count} unused attribute | {count} unused attributes", + "MESSAGES": { + "UPDATE_SUCCESS": "Company attribute updated.", + "UPDATE_ERROR": "Could not update company attribute.", + "DELETE_SUCCESS": "Company attribute removed.", + "DELETE_ERROR": "Could not remove company attribute." + } + }, + "CONTACTS": { + "LOADING": "Loading contacts...", + "EMPTY": "No contacts are linked to this company yet.", + "UNNAMED_CONTACT": "Unnamed contact", + "ACTIONS": { + "ADD": "Add contact", + "REMOVE": "Remove contact" + }, + "DIALOGS": { + "ADD": { + "DESCRIPTION": "Search for an existing contact and link it to this company.", + "SEARCH_PLACEHOLDER": "Search contacts...", + "INITIAL": "Start typing to search contacts.", + "EMPTY": "No contacts found.", + "CONFIRM_TITLE": "Link contact", + "CONFIRM_DESCRIPTION": "Confirm the company and contact before linking them.", + "COMPANY_LABEL": "Company", + "CONTACT_LABEL": "Contact", + "CURRENT_COMPANY": "Currently linked to {companyName}", + "ADD": "Link contact", + "CANCEL": "Cancel" + } + }, + "MESSAGES": { + "ADD_SUCCESS": "Contact linked to company.", + "ADD_ERROR": "Could not link contact to company.", + "REASSIGN_SUCCESS": "Contact reassigned to company.", + "REASSIGN_ERROR": "Could not reassign contact to company.", + "REMOVE_SUCCESS": "Contact removed from company.", + "REMOVE_ERROR": "Could not remove contact from company." + } + }, + "AVATAR": { + "UPDATING": "Updating company avatar...", + "UPLOAD_SUCCESS": "Company avatar updated.", + "UPLOAD_ERROR": "Could not update the company avatar.", + "DELETE_SUCCESS": "Company avatar removed.", + "DELETE_ERROR": "Could not remove the company avatar." + }, + "PROFILE": { + "TITLE": "Edit company details", + "CREATED_AT": "Created {date}", + "LAST_ACTIVE": "Last active {date}", + "DESCRIPTION_PLACEHOLDER": "Add a short description for this company", + "ACTIONS": { + "SAVE": "Update company" + }, + "MESSAGES": { + "UPDATE_SUCCESS": "Company updated.", + "UPDATE_ERROR": "Could not update the company." + }, + "FIELDS": { + "NAME": "Name", + "DOMAIN": "Domain" + } + }, + "DELETE": { + "SECTION_TITLE": "Danger zone", + "SECTION_DESCRIPTION": "Delete this company and unlink its contacts. The contacts will remain in the account.", + "BUTTON": "Delete company", + "TITLE": "Delete company?", + "DESCRIPTION": "This will remove the company and unlink all associated contacts. Contacts themselves will be preserved.", + "DESCRIPTION_WITH_NAME": "This will remove {companyName} and unlink all associated contacts. Contacts themselves will be preserved.", + "CONFIRM": "Delete company", + "MESSAGES": { + "SUCCESS": "Company deleted.", + "ERROR": "Could not delete the company." + } + } + }, + "EMPTY_STATE": { + "TITLE": "No companies found" + } + }, + "COMPANIES_LAYOUT": { + "PAGINATION_FOOTER": { + "SHOWING": "Showing {startItem} – {endItem} of {totalItems} company | Showing {startItem} – {endItem} of {totalItems} companies" + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/components.json b/app/javascript/dashboard/i18n/locale/uz/components.json new file mode 100644 index 000000000..ce1f47313 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/components.json @@ -0,0 +1,69 @@ +{ + "PAGINATION_FOOTER": { + "SHOWING": "Showing {startItem} - {endItem} of {totalItems} item | Showing {startItem} - {endItem} of {totalItems} items", + "CURRENT_PAGE_INFO": "{currentPage} of {totalPages} page | {currentPage} of {totalPages} pages" + }, + "COMBOBOX": { + "PLACEHOLDER": "Select an option...", + "EMPTY_SEARCH_RESULTS": "No items found for the search term `{searchTerm}`", + "EMPTY_STATE": "No results found.", + "SEARCH_PLACEHOLDER": "Search...", + "MORE": "+{count} more" + }, + "DROPDOWN_MENU": { + "SEARCH_PLACEHOLDER": "Search...", + "EMPTY_STATE": "No results found.", + "SEARCHING": "Searching..." + }, + "DIALOG": { + "BUTTONS": { + "CANCEL": "Cancel", + "CONFIRM": "Confirm" + } + }, + "PHONE_INPUT": { + "SEARCH_PLACEHOLDER": "Mamlakatni qidirish", + "ERROR": "Phone number should be empty or in E.164 format", + "DIAL_CODE_ERROR": "Please select a dial code from the list" + }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Author is not available" + } + }, + "BREADCRUMB": { + "ARIA_LABEL": "Breadcrumb" + }, + "SWITCH": { + "TOGGLE": "Toggle switch" + }, + "LABEL": { + "TAG_BUTTON": "tag" + }, + "FEATURE_SPOTLIGHT": { + "LEARN_MORE": "Learn more", + "WATCH_VIDEO": "Watch video" + }, + "DURATION_INPUT": { + "MINUTES": "Minutes", + "HOURS": "Hours", + "DAYS": "Days", + "PLACEHOLDER": "Enter duration" + }, + "CHANNEL_SELECTOR": { + "COMING_SOON": "Coming Soon!" + }, + "SLASH_COMMANDS": { + "HEADING_1": "Heading 1", + "HEADING_2": "Heading 2", + "HEADING_3": "Heading 3", + "BOLD": "Bold", + "ITALIC": "Italic", + "STRIKETHROUGH": "Strikethrough", + "CODE": "Code", + "BULLET_LIST": "Bullet List", + "ORDERED_LIST": "Ordered List", + "TABLE": "Table", + "IMAGE": "Image" + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/contact.json b/app/javascript/dashboard/i18n/locale/uz/contact.json new file mode 100644 index 000000000..87beb282e --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/contact.json @@ -0,0 +1,667 @@ +{ + "CONTACT_PANEL": { + "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.", + "WHATSAPP_CALL_PERMISSION_REQUESTED": "Sent a call permission request to the contact. Try again once they accept.", + "WHATSAPP_CALL_PERMISSION_PENDING": "Call permission request already sent recently. Try again once the contact accepts.", + "CLICK_TO_EDIT": "Click to edit", + "VOICE_INBOX_PICKER": { + "TITLE": "Choose a voice inbox" + }, + "CONVERSATIONS": { + "NO_RECORDS_FOUND": "There are no previous conversations associated to this contact.", + "TITLE": "Previous Conversations" + }, + "LABELS": { + "CONTACT": { + "TITLE": "Contact Labels", + "ERROR": "Couldn't update labels" + }, + "CONVERSATION": { + "TITLE": "Conversation Labels", + "ADD_BUTTON": "Add Labels" + }, + "LABEL_SELECT": { + "TITLE": "Add Labels", + "PLACEHOLDER": "Search labels", + "NO_RESULT": "No labels found", + "CREATE_LABEL": "Create new 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": "Custom Attributes", + "CONTACT_LABELS": "Contact Labels", + "PREVIOUS_CONVERSATIONS": "Previous Conversations", + "NO_RECORDS_FOUND": "No attributes found" + } + }, + "EDIT_CONTACT": { + "BUTTON_LABEL": "Edit Contact", + "TITLE": "Edit contact", + "DESC": "Edit contact details" + }, + "DELETE_CONTACT": { + "BUTTON_LABEL": "Delete Contact", + "TITLE": "Delete contact", + "DESC": "Delete contact details", + "CONFIRM": { + "TITLE": "Confirm Deletion", + "MESSAGE": "Are you sure to delete ", + "YES": "Yes, Delete", + "NO": "No, Keep" + }, + "API": { + "SUCCESS_MESSAGE": "Contact deleted successfully", + "ERROR_MESSAGE": "Could not delete contact. Please try again later." + } + }, + "CONTACT_FORM": { + "FORM": { + "SUBMIT": "Submit", + "CANCEL": "Cancel", + "AVATAR": { + "LABEL": "Contact Avatar" + }, + "NAME": { + "PLACEHOLDER": "Enter the full name of the contact", + "LABEL": "To'liq ism" + }, + "BIO": { + "PLACEHOLDER": "Enter the bio of the contact", + "LABEL": "Bio" + }, + "EMAIL_ADDRESS": { + "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": "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": "Enter the location of the contact", + "LABEL": "Location" + }, + "COMPANY_NAME": { + "PLACEHOLDER": "Enter the company name", + "LABEL": "Company Name" + }, + "COUNTRY": { + "PLACEHOLDER": "Enter the country name", + "LABEL": "Country Name", + "SELECT_PLACEHOLDER": "Select", + "REMOVE": "Remove", + "SELECT_COUNTRY": "Select Country" + }, + "CITY": { + "PLACEHOLDER": "Enter the city name", + "LABEL": "City Name" + }, + "SOCIAL_PROFILES": { + "FACEBOOK": { + "PLACEHOLDER": "Enter the Facebook username", + "LABEL": "Facebook" + }, + "TWITTER": { + "PLACEHOLDER": "Enter the Twitter username", + "LABEL": "Twitter" + }, + "LINKEDIN": { + "PLACEHOLDER": "Enter the LinkedIn username", + "LABEL": "LinkedIn" + }, + "GITHUB": { + "PLACEHOLDER": "Enter the Github username", + "LABEL": "Github" + } + } + }, + "DELETE_AVATAR": { + "API": { + "SUCCESS_MESSAGE": "Contact avatar deleted successfully", + "ERROR_MESSAGE": "Could not delete the contact avatar. Please try again later." + } + }, + "SUCCESS_MESSAGE": "Contact saved successfully", + "ERROR_MESSAGE": "There was an error, please try again" + }, + "NEW_CONVERSATION": { + "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": "To" + }, + "INBOX": { + "LABEL": "Via Inbox", + "PLACEHOLDER": "Choose source inbox", + "ERROR": "Select an inbox" + }, + "SUBJECT": { + "LABEL": "Subject", + "PLACEHOLDER": "Subject", + "ERROR": "Subject can't be empty" + }, + "MESSAGE": { + "LABEL": "Xabar", + "PLACEHOLDER": "Write your message here", + "ERROR": "Message can't be empty" + }, + "ATTACHMENTS": { + "SELECT": "Choose files", + "HELP_TEXT": "Drag and drop files here or choose files to attach" + }, + "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" + } + } + }, + "CUSTOM_ATTRIBUTES": { + "BUTTON": "Add custom attribute", + "COPY_SUCCESSFUL": "Copied to clipboard successfully", + "SHOW_MORE": "Show all attributes", + "SHOW_LESS": "Show less attributes", + "ACTIONS": { + "COPY": "Copy attribute", + "DELETE": "Delete attribute", + "EDIT": "Edit attribute" + }, + "ADD": { + "TITLE": "Create custom attribute", + "DESC": "Add custom information to this contact." + }, + "FORM": { + "CREATE": "Add attribute", + "CANCEL": "Cancel", + "NAME": { + "LABEL": "Custom attribute name", + "PLACEHOLDER": "Eg: shopify id", + "ERROR": "Invalid custom attribute name" + }, + "VALUE": { + "LABEL": "Attribute value", + "PLACEHOLDER": "Eg: 11901 " + }, + "ADD": { + "TITLE": "Create new attribute ", + "SUCCESS": "Attribute added successfully", + "ERROR": "Unable to add attribute. Please try again later" + }, + "UPDATE": { + "SUCCESS": "Attribute updated successfully", + "ERROR": "Unable to update attribute. Please try again later" + }, + "DELETE": { + "SUCCESS": "Attribute deleted successfully", + "ERROR": "Unable to delete attribute. Please try again later" + }, + "ATTRIBUTE_SELECT": { + "TITLE": "Add attributes", + "PLACEHOLDER": "Search attributes", + "NO_RESULT": "No attributes found" + }, + "ATTRIBUTE_TYPE": { + "LIST": { + "PLACEHOLDER": "Select value", + "SEARCH_INPUT_PLACEHOLDER": "Search value", + "NO_RESULT": "No result found" + } + } + }, + "VALIDATIONS": { + "REQUIRED": "Valid value is required", + "INVALID_URL": "Invalid URL", + "INVALID_INPUT": "Invalid Input" + } + }, + "MERGE_CONTACTS": { + "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": "Primary contact", + "HELP_LABEL": "To be deleted" + }, + "PARENT": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Search for a contact", + "HELP_LABEL": "To be kept" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of {primaryContactName} will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of {primaryContactName} will be copied to {parentContactName}." + }, + "SEARCH": { + "ERROR_MESSAGE": "Something went wrong. Please try again later." + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Cancel", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contacts, try again!" + }, + "DROPDOWN_ITEM": { + "ID": "(ID: {identifier})" + } + }, + "CONTACTS_LAYOUT": { + "HEADER": { + "TITLE": "Contacts", + "SEARCH_TITLE": "Search contacts", + "ACTIVE_TITLE": "Active contacts", + "SEARCH_PLACEHOLDER": "Search...", + "MESSAGE_BUTTON": "Xabar", + "SEND_MESSAGE": "Send message", + "BLOCK_CONTACT": "Block contact", + "UNBLOCK_CONTACT": "Unblock contact", + "BREADCRUMB": { + "CONTACTS": "Contacts" + }, + "ACTIONS": { + "CONTACT_CREATION": { + "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": "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": "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": "Sort by", + "OPTIONS": { + "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": "Ascending", + "DESCENDING": "Descending" + } + }, + "FILTERS": { + "CREATE_SEGMENT": { + "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": "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." + } + } + } + }, + "PAGINATION_FOOTER": { + "SHOWING": "Showing {startItem} - {endItem} of {totalItems} contact | Showing {startItem} - {endItem} of {totalItems} contacts" + }, + "FILTER": { + "NAME": "Name", + "EMAIL": "Email", + "PHONE_NUMBER": "Phone number", + "IDENTIFIER": "Identifier", + "COUNTRY": "Country", + "CITY": "City", + "COMPANY": "Company", + "CREATED_AT": "Created at", + "LAST_ACTIVITY": "Last activity", + "REFERER_LINK": "Referer link", + "BLOCKED": "Blocked", + "BLOCKED_TRUE": "True", + "BLOCKED_FALSE": "False", + "BUTTONS": { + "CLEAR_FILTERS": "Clear filters", + "UPDATE_SEGMENT": "Update segment", + "APPLY_FILTERS": "Apply filters", + "ADD_FILTER": "Add filter" + }, + "TITLE": "Filter contacts", + "EDIT_SEGMENT": "Edit segment", + "SEGMENT": { + "LABEL": "Segment name", + "INPUT_PLACEHOLDER": "Enter the name of the segment" + }, + "ACTIVE_FILTERS": { + "MORE_FILTERS": "+ {count} more filters", + "CLEAR_FILTERS": "Clear filters" + } + }, + "CARD": { + "OF": "of", + "VIEW_DETAILS": "View details", + "EDIT_DETAILS_FORM": { + "TITLE": "Edit contact details", + "FORM": { + "FIRST_NAME": { + "PLACEHOLDER": "Enter the first name" + }, + "LAST_NAME": { + "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": "Enter the phone number", + "DUPLICATE": "This phone number is in use for another contact." + }, + "CITY": { + "PLACEHOLDER": "Enter the city name" + }, + "COUNTRY": { + "PLACEHOLDER": "Select country" + }, + "BIO": { + "PLACEHOLDER": "Enter the bio" + }, + "COMPANY_NAME": { + "PLACEHOLDER": "Enter the company name" + } + }, + "UPDATE_BUTTON": "Update contact", + "SUCCESS_MESSAGE": "Contact updated successfully", + "ERROR_MESSAGE": "Unable to update contact. Please try again later." + }, + "SOCIAL_MEDIA": { + "TITLE": "Edit social links", + "FORM": { + "FACEBOOK": { + "PLACEHOLDER": "Add Facebook" + }, + "GITHUB": { + "PLACEHOLDER": "Add Github" + }, + "INSTAGRAM": { + "PLACEHOLDER": "Add Instagram" + }, + "TELEGRAM": { + "PLACEHOLDER": "Add Telegram" + }, + "TIKTOK": { + "PLACEHOLDER": "Add TikTok" + }, + "LINKEDIN": { + "PLACEHOLDER": "Add LinkedIn" + }, + "TWITTER": { + "PLACEHOLDER": "Add Twitter" + } + } + }, + "DELETE_CONTACT": { + "MESSAGE": "This action is permanent and irreversible.", + "BUTTON": "Delete now" + } + }, + "DETAILS": { + "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": "Confirm Deletion", + "DESCRIPTION": "Are you sure you want to delete this contact?", + "CONFIRM": "Yes, Delete", + "API": { + "SUCCESS_MESSAGE": "Contact deleted successfully", + "ERROR_MESSAGE": "Could not delete contact. Please try again later." + } + }, + "AVATAR": { + "UPLOAD": { + "ERROR_MESSAGE": "Could not upload avatar. Please try again later.", + "SUCCESS_MESSAGE": "Avatar uploaded successfully" + }, + "DELETE": { + "SUCCESS_MESSAGE": "Avatar deleted successfully", + "ERROR_MESSAGE": "Could not delete avatar. Please try again later." + } + } + }, + "SIDEBAR": { + "TABS": { + "ATTRIBUTES": "Attributes", + "HISTORY": "History", + "NOTES": "Notes", + "MEDIA": "Media", + "MERGE": "Merge" + }, + "HISTORY": { + "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": "Yes", + "NO": "No", + "TRIGGER": { + "SELECT": "Select value", + "INPUT": "Enter value" + }, + "VALIDATIONS": { + "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": "Unable to delete attribute. Please try again later" + } + }, + "MERGE": { + "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": "Cancel", + "CONFIRM": "Merge contact" + } + }, + "NOTES": { + "PLACEHOLDER": "Add a note", + "WROTE": "wrote", + "YOU": "Siz", + "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": "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": "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" + }, + "CONTACTS_BULK_ACTIONS": { + "ASSIGN_LABELS": "Assign Labels", + "REMOVE_LABELS": "Remove Labels", + "ASSIGN_LABELS_SUCCESS": "Labels assigned successfully.", + "ASSIGN_LABELS_FAILED": "Failed to assign labels", + "REMOVE_LABELS_SUCCESS": "Labels removed successfully.", + "REMOVE_LABELS_FAILED": "Failed to remove labels", + "DESCRIPTION": "Select the labels you want to add to the selected contacts.", + "NO_LABELS_FOUND": "No labels available yet.", + "SELECTED_COUNT": "{count} selected", + "CLEAR_SELECTION": "Clear selection", + "SELECT_ALL": "Select all ({count})", + "DELETE_CONTACTS": "Delete", + "DELETE_SUCCESS": "Contacts deleted successfully.", + "DELETE_FAILED": "Failed to delete contacts.", + "DELETE_DIALOG": { + "TITLE": "Delete selected contacts", + "SINGULAR_TITLE": "Delete selected contact", + "DESCRIPTION": "This will permanently delete {count} selected contacts. This action cannot be undone.", + "SINGULAR_DESCRIPTION": "This will permanently delete the selected contact. This action cannot be undone.", + "CONFIRM_MULTIPLE": "Delete contacts", + "CONFIRM_SINGLE": "Delete contact" + } + }, + "COMPOSE_NEW_CONVERSATION": { + "CONTACT_SEARCH": { + "ERROR_MESSAGE": "We couldn’t complete the search. Please try again." + }, + "FORM": { + "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": "To:", + "TAG_INPUT_PLACEHOLDER": "Enter at least 2 characters to search by name, email, or phone number", + "CONTACT_CREATING": "Creating contact..." + }, + "INBOX_SELECTOR": { + "LABEL": "Via:", + "BUTTON": "Show inboxes" + }, + "EMAIL_OPTIONS": { + "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": "Bcc" + }, + "MESSAGE_EDITOR": { + "PLACEHOLDER": "Write your message here..." + }, + "WHATSAPP_OPTIONS": { + "LABEL": "Select template", + "SEARCH_PLACEHOLDER": "Search templates", + "EMPTY_STATE": "No templates found", + "TEMPLATE_PARSER": { + "TEMPLATE_NAME": "WhatsApp template: {templateName}", + "VARIABLES": "Variables", + "BACK": "Go back", + "SEND_MESSAGE": "Send message" + } + }, + "TWILIO_OPTIONS": { + "LABEL": "Select template", + "SEARCH_PLACEHOLDER": "Search templates", + "EMPTY_STATE": "No templates found", + "TEMPLATE_PARSER": { + "BACK": "Go back", + "SEND_MESSAGE": "Send message" + } + }, + "ACTION_BUTTONS": { + "DISCARD": "Discard", + "SEND": "Send ({keyCode})" + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/contactFilters.json b/app/javascript/dashboard/i18n/locale/uz/contactFilters.json new file mode 100644 index 000000000..4c62f0789 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/contactFilters.json @@ -0,0 +1,60 @@ +{ + "CONTACTS_FILTER": { + "TITLE": "Filter Contacts", + "SUBTITLE": "Add filters below and hit 'Submit' to filter contacts.", + "EDIT_CUSTOM_SEGMENT": "Edit Segment", + "CUSTOM_VIEWS_SUBTITLE": "Add or remove filters and update your segment.", + "ADD_NEW_FILTER": "Add Filter", + "CLEAR_ALL_FILTERS": "Clear All Filters", + "FILTER_DELETE_ERROR": "You should have atleast one filter to save", + "SUBMIT_BUTTON_LABEL": "Submit", + "UPDATE_BUTTON_LABEL": "Update Segment", + "CANCEL_BUTTON_LABEL": "Cancel", + "CLEAR_BUTTON_LABEL": "Clear Filters", + "EMPTY_VALUE_ERROR": "Value is required", + "SEGMENT_LABEL": "Segment Name", + "SEGMENT_QUERY_LABEL": "Segment Query", + "TOOLTIP_LABEL": "Filter contacts", + "QUERY_DROPDOWN_LABELS": { + "AND": "AND", + "OR": "OR" + }, + "OPERATOR_LABELS": { + "equal_to": "Equal to", + "not_equal_to": "Not equal to", + "contains": "Contains", + "does_not_contain": "Does not contain", + "is_present": "Is present", + "is_not_present": "Is not present", + "is_greater_than": "Is greater than", + "is_lesser_than": "Is lesser than", + "days_before": "Is x days before" + }, + "ERRORS": { + "VALUE_REQUIRED": "Value is required" + }, + "ATTRIBUTES": { + "NAME": "Name", + "EMAIL": "Email", + "PHONE_NUMBER": "Phone number", + "IDENTIFIER": "Identifier", + "CITY": "City", + "COUNTRY": "Country", + "CUSTOM_ATTRIBUTE_LIST": "List", + "CUSTOM_ATTRIBUTE_TEXT": "Text", + "CUSTOM_ATTRIBUTE_NUMBER": "Number", + "CUSTOM_ATTRIBUTE_LINK": "Link", + "CUSTOM_ATTRIBUTE_CHECKBOX": "Checkbox", + "CREATED_AT": "Created At", + "LAST_ACTIVITY": "Last Activity", + "REFERER_LINK": "Referrer link", + "BLOCKED": "Blocked", + "LABELS": "Labels" + }, + "GROUPS": { + "STANDARD_FILTERS": "Standard Filters", + "ADDITIONAL_FILTERS": "Additional Filters", + "CUSTOM_ATTRIBUTES": "Custom Attributes" + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/contentTemplates.json b/app/javascript/dashboard/i18n/locale/uz/contentTemplates.json new file mode 100644 index 000000000..79c2c8c64 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/contentTemplates.json @@ -0,0 +1,52 @@ +{ + "CONTENT_TEMPLATES": { + "MODAL": { + "TITLE": "Twilio Templates", + "SUBTITLE": "Select the Twilio template you want to send", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Search Templates", + "NO_TEMPLATES_FOUND": "No templates found for", + "NO_CONTENT": "No content", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Category", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No Twilio templates available. Click refresh to sync templates from Twilio.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Language", + "TEMPLATE_BODY": "Template Body", + "CATEGORY": "Category" + }, + "TYPES": { + "MEDIA": "Media", + "QUICK_REPLY": "Quick Reply", + "CALL_TO_ACTION": "Call to Action", + "TEXT": "Text" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variables", + "LANGUAGE": "Language", + "CATEGORY": "Category", + "VARIABLE_PLACEHOLDER": "Enter {variable} value", + "GO_BACK_LABEL": "Go Back", + "SEND_MESSAGE_LABEL": "Send Message", + "FORM_ERROR_MESSAGE": "Please fill all variables before sending", + "MEDIA_HEADER_LABEL": "{type} Header", + "MEDIA_URL_LABEL": "Enter full media URL", + "MEDIA_URL_PLACEHOLDER": "https://example.com/image.jpg" + }, + "FORM": { + "BACK_BUTTON": "Back", + "SEND_MESSAGE_BUTTON": "Send Message" + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/conversation.json b/app/javascript/dashboard/i18n/locale/uz/conversation.json new file mode 100644 index 000000000..fe71b8974 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/conversation.json @@ -0,0 +1,513 @@ +{ + "CONVERSATION": { + "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": "to open command menu", + "KEYBOARD_SHORTCUTS": "to view keyboard shortcuts" + }, + "SEARCH": { + "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 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.", + "INSTAGRAM_RESTRICTION_BANNER": "Instagram is currently restricted. Some messages or actions may be delayed or unavailable while we restore full support.", + "INSTAGRAM_RESTRICTION_STATUS_LINK": "View status update", + "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": "Uploading attachments...", + "REPLIED_TO_STORY": "Replied to your story", + "UNSUPPORTED_MESSAGE": "This message is unsupported. To view it, please open it on the original platform.", + "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.", + "UNSUPPORTED_MESSAGE_WHATSAPP": "This message is unsupported. You can view this message on the WhatsApp 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": "Show labels", + "HIDE_LABELS": "Hide labels", + "LABELS_COUNT": "{count} labels" + }, + "VOICE_CALL": { + "INCOMING_CALL": "Incoming call", + "OUTGOING_CALL": "Outgoing call", + "CALL_IN_PROGRESS": "Call in progress", + "NO_ANSWER": "No answer", + "NO_ANSWER_OUTBOUND_LABEL": "No answer", + "NO_ANSWER_OUTBOUND_SUBTEXT": "Contact didn't pick up", + "MISSED_CALL": "Missed call", + "MISSED_CALL_INBOUND_SUBTEXT": "No agent picked up", + "MISSED_CALL_DECLINED_BY": "Declined by {agentName}", + "CALL_ENDED": "Call ended", + "HANDLED_BY": "Handled by {agentName}", + "NOT_ANSWERED_YET": "Not answered yet", + "CALLING": "Calling…", + "THEY_ANSWERED": "They answered", + "YOU_ANSWERED": "You answered", + "AGENT_ANSWERED": "{agentName} answered", + "JOIN_CALL": "Join call", + "CALL_BACK": "Call back", + "TRANSCRIPT_SHOW_MORE": "Show more", + "TRANSCRIPT_SHOW_LESS": "Show less" + }, + "HEADER": { + "RESOLVE_ACTION": "Resolve", + "REOPEN_ACTION": "Reopen", + "OPEN_ACTION": "Open", + "MORE_ACTIONS": "More actions", + "OPEN": "More", + "CLOSE": "Close", + "DETAILS": "details", + "COPY_ID_SUCCESS": "Conversation ID copied to clipboard", + "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", + "WHATSAPP_CALL": "Start WhatsApp call", + "WHATSAPP_CALL_FAILED": "Could not start the WhatsApp call.", + "VOICE_CALL": "Start call", + "VOICE_CALL_FAILED": "Could not start the call.", + "WHATSAPP_CALL_PERMISSION_REQUESTED": "Sent a call permission request to the contact. Try again once they accept.", + "WHATSAPP_CALL_PERMISSION_PENDING": "Call permission request already sent recently. Try again once the contact accepts.", + "SLA_STATUS": { + "FRT": "FRT {status}", + "NRT": "NRT {status}", + "RT": "RT {status}", + "MISSED": "missed", + "DUE": "due" + } + }, + "RESOLVE_DROPDOWN": { + "MARK_PENDING": "Mark as pending", + "SNOOZE_UNTIL": "Snooze", + "SNOOZE": { + "TITLE": "Snooze until", + "NEXT_REPLY": "Next reply", + "TOMORROW": "Tomorrow", + "NEXT_WEEK": "Next week" + } + }, + "MENTION": { + "AGENTS": "Agents", + "TEAMS": "Teams" + }, + "CUSTOM_SNOOZE": { + "TITLE": "Snooze until", + "APPLY": "Snooze", + "CANCEL": "Cancel" + }, + "PRIORITY": { + "TITLE": "Priority", + "OPTIONS": { + "NONE": "None", + "URGENT": "Urgent", + "HIGH": "High", + "MEDIUM": "Medium", + "LOW": "Low" + }, + "CHANGE_PRIORITY": { + "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": "Delete conversation #{conversationId}", + "DESCRIPTION": "Are you sure you want to delete this conversation?", + "CONFIRM": "Delete" + }, + "CARD_CONTEXT_MENU": { + "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": "Snooze", + "NEXT_REPLY": "Until next reply", + "TOMORROW": "Until tomorrow", + "NEXT_WEEK": "Until next week" + }, + "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": "Couldn't assign agent. Please try again." + }, + "LABEL_ASSIGNMENT": { + "SUCCESFUL": "Assigned label #{labelName} to conversation id {conversationId}", + "FAILED": "Couldn't assign label. Please try again." + }, + "LABEL_REMOVAL": { + "SUCCESFUL": "Removed label #{labelName} from conversation id {conversationId}", + "FAILED": "Couldn't remove label. Please try again." + }, + "TEAM_ASSIGNMENT": { + "SUCCESFUL": "Assigned team \"{team}\" to conversation id {conversationId}", + "FAILED": "Couldn't assign team. Please try again." + } + } + }, + "FOOTER": { + "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": "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", + "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.", + "DRAG_DROP": "Drag and drop here to attach", + "IMAGE_UPLOAD_SUCCESS": "Image uploaded successfully", + "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", + "CC": { + "LABEL": "CC", + "PLACEHOLDER": "Emails separated by commas", + "ERROR": "Please enter valid email addresses" + }, + "BCC": { + "LABEL": "BCC", + "PLACEHOLDER": "Emails separated by commas", + "ERROR": "Please enter valid email addresses" + } + }, + "UNDEFINED_VARIABLES": { + "TITLE": "Undefined variables", + "MESSAGE": "You have {undefinedVariablesCount} undefined variables in your message: {undefinedVariables}. Would you like to send the message anyway?", + "CONFIRM": { + "YES": "Send", + "CANCEL": "Cancel" + } + }, + "QUOTED_REPLY": { + "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": "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": "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": "Select Agent", + "REMOVE": "Remove", + "ASSIGN": "Assign" + }, + "CONTEXT_MENU": { + "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": "Are you sure you want to delete this message?", + "MESSAGE": "You cannot undo this action", + "DELETE": "Delete", + "CANCEL": "Cancel" + }, + "REPORT_MESSAGE": { + "LABEL": "Report message", + "TITLE": "Report Captain message", + "DESCRIPTION": "Found an issue with this AI response? Let us know what went wrong and our team will review it to help improve Captain's accuracy.", + "PROBLEM_TYPE": "Problem type", + "PROBLEM_TYPE_PLACEHOLDER": "Select a problem type", + "DESCRIPTION_LABEL": "Description", + "DESCRIPTION_PLACEHOLDER": "Describe the problem in detail", + "SUBMIT": "Report", + "SUCCESS": "Thanks for reporting. Our team will take a look.", + "ERROR": "Could not report this message. Please try again.", + "REASONS": { + "incorrect_information": "Incorrect information", + "inappropriate_response": "Inappropriate response", + "incomplete_response": "Incomplete response", + "outdated_information": "Outdated information", + "other": "Other" + } + } + }, + "SIDEBAR": { + "CONTACT": "Contact", + "COPILOT": "Copilot" + }, + "VOICE_WIDGET": { + "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", + "DISMISS_CALL": "Dismiss", + "JOIN_CALL": "Join call", + "END_CALL": "End call", + "MUTE": "Mute mic", + "UNMUTE": "Unmute mic", + "VIEW_CHAT_HISTORY": "View chat history", + "GO_TO_CONVERSATION": "Go to conversation thread" + } + }, + "EMAIL_TRANSCRIPT": { + "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 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": "Enter an email address", + "ERROR": "Please enter a valid email address" + } + } + }, + "ONBOARDING": { + "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": "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": "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": "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": "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": "Assigned Agent", + "SELF_ASSIGN": "Assign to me", + "TEAM_LABEL": "Assigned Team", + "SELECT": { + "PLACEHOLDER": "None" + }, + "ACCORDION": { + "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", + "SHARED_FILES": "Attachments" + }, + "SHARED_FILES": { + "EMPTY": "No attachments yet", + "DOWNLOAD": "Download file", + "DOWNLOAD_ERROR": "Could not download the file. Please try again.", + "MEDIA_HEADING": "Media", + "FILES_HEADING": "Files", + "VIEW_ALL": "View all", + "SHOW_LESS": "Show less", + "MORE_COUNT": "+{count}", + "UNTITLED_FILE": "Untitled file", + "JUMP_TO_MESSAGE": "Jump to message" + }, + "SHOPIFY": { + "ORDER_ID": "Order #{id}", + "ERROR": "Error loading orders", + "NO_SHOPIFY_ORDERS": "No orders found", + "FINANCIAL_STATUS": { + "PENDING": "Pending", + "AUTHORIZED": "Authorized", + "PARTIALLY_PAID": "Partially Paid", + "PAID": "Paid", + "PARTIALLY_REFUNDED": "Partially Refunded", + "REFUNDED": "Refunded", + "VOIDED": "Voided" + }, + "FULFILLMENT_STATUS": { + "FULFILLED": "Fulfilled", + "PARTIALLY_FULFILLED": "Partially Fulfilled", + "UNFULFILLED": "Unfulfilled" + } + } + }, + "CONVERSATION_CUSTOM_ATTRIBUTES": { + "ADD_BUTTON_TEXT": "Create attribute", + "NO_RECORDS_FOUND": "No attributes found", + "UPDATE": { + "SUCCESS": "Attribute updated successfully", + "ERROR": "Unable to update attribute. Please try again later" + }, + "ADD": { + "TITLE": "Add", + "SUCCESS": "Attribute added successfully", + "ERROR": "Unable to add attribute. Please try again later" + }, + "DELETE": { + "SUCCESS": "Attribute deleted successfully", + "ERROR": "Unable to delete attribute. Please try again later" + }, + "ATTRIBUTE_SELECT": { + "TITLE": "Add attributes", + "PLACEHOLDER": "Search attributes", + "NO_RESULT": "No attributes found" + } + }, + "EMAIL_HEADER": { + "FROM": "From", + "TO": "To", + "BCC": "Bcc", + "CC": "Cc", + "SUBJECT": "Subject", + "EXPAND": "Expand email" + }, + "CONVERSATION_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": "Join conversation", + "YOU_ARE_WATCHING": "You are participating", + "API": { + "ERROR_MESSAGE": "Could not update, try again!", + "SUCCESS_MESSAGE": "Participants updated!" + } + }, + "TRANSLATE_MODAL": { + "TITLE": "View translated content", + "DESC": "You can view the translated content in each langauge.", + "ORIGINAL_CONTENT": "Original Content", + "TRANSLATED_CONTENT": "Translated Content", + "NO_TRANSLATIONS_AVAILABLE": "No translations are available for this content" + }, + "TYPING": { + "ONE": "{user} is typing", + "TWO": "{user} and {secondUser} are typing", + "MULTIPLE": "{user} and {count} others are typing" + }, + "COPILOT": { + "TRY_THESE_PROMPTS": "Try these prompts" + }, + "GALLERY_VIEW": { + "ERROR_DOWNLOADING": "Unable to download attachment. Please try again" + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/csatMgmt.json b/app/javascript/dashboard/i18n/locale/uz/csatMgmt.json new file mode 100644 index 000000000..9e16dc2b3 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/csatMgmt.json @@ -0,0 +1,13 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more...", + "RATINGS": { + "POOR": "😞 Poor", + "FAIR": "😑 Fair", + "AVERAGE": "😐 Average", + "GOOD": "😀 Good", + "EXCELLENT": "😍 Excellent" + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/customRole.json b/app/javascript/dashboard/i18n/locale/uz/customRole.json new file mode 100644 index 000000000..f7c1709bd --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/customRole.json @@ -0,0 +1,94 @@ +{ + "CUSTOM_ROLE": { + "HEADER": "Custom Roles", + "LEARN_MORE": "Learn more about custom roles", + "DESCRIPTION": "Custom roles are roles that are created by the account owner or admin. These roles can be assigned to agents to define their access and permissions within the account. Custom roles can be created with specific permissions and access levels to suit the requirements of the organization.", + "COUNT": "{n} custom role | {n} custom roles", + "HEADER_BTN_TXT": "Add custom role", + "LOADING": "Fetching custom roles...", + "SEARCH_PLACEHOLDER": "Search custom roles...", + "NO_RESULTS": "No custom roles found matching your search", + "SEARCH_404": "There are no items matching this query.", + "PAYWALL": { + "TITLE": "Upgrade to create custom roles", + "AVAILABLE_ON": "The custom role feature is only available in the Business and Enterprise plans.", + "UPGRADE_PROMPT": "Upgrade your plan to get access to advanced features like team management, automations, custom attributes, and more.", + "UPGRADE_NOW": "Upgrade now", + "CANCEL_ANYTIME": "You can change or cancel your plan anytime" + }, + "ENTERPRISE_PAYWALL": { + "AVAILABLE_ON": "The custom role feature is only available in the paid plans.", + "UPGRADE_PROMPT": "Upgrade to a paid plan to access advanced features like audit logs, agent capacity, and more.", + "ASK_ADMIN": "Please reach out to your administrator for the upgrade." + }, + "LIST": { + "404": "There are no custom roles available in this account.", + "TITLE": "Manage custom roles", + "DESC": "Custom roles are roles that are created by the account owner or admin. These roles can be assigned to agents to define their access and permissions within the account. Custom roles can be created with specific permissions and access levels to suit the requirements of the organization.", + "TABLE_HEADER": { + "NAME": "Name", + "DESCRIPTION": "Description", + "PERMISSIONS": "Permissions", + "ACTIONS": "Actions" + } + }, + "PERMISSIONS": { + "CONVERSATION_MANAGE": "Manage all conversations", + "CONVERSATION_UNASSIGNED_MANAGE": "Manage unassigned conversations and those assigned to them", + "CONVERSATION_PARTICIPATING_MANAGE": "Manage participating conversations and those assigned to them", + "CONTACT_MANAGE": "Manage contacts", + "REPORT_MANAGE": "Manage reports", + "KNOWLEDGE_BASE_MANAGE": "Manage knowledge base" + }, + "FORM": { + "NAME": { + "LABEL": "Name", + "PLACEHOLDER": "Please enter a name.", + "ERROR": "Name is required." + }, + "DESCRIPTION": { + "LABEL": "Description", + "PLACEHOLDER": "Please enter a description.", + "ERROR": "Description is required." + }, + "PERMISSIONS": { + "LABEL": "Permissions", + "ERROR": "Permissions are required." + }, + "CANCEL_BUTTON_TEXT": "Cancel", + "API": { + "ERROR_MESSAGE": "Could not connect to Woot server. Please try again." + } + }, + "ADD": { + "TITLE": "Add custom role", + "DESC": " Custom roles allows you to create roles with specific permissions and access levels to suit the requirements of the organization.", + "SUBMIT": "Submit", + "API": { + "SUCCESS_MESSAGE": "Custom role added successfully." + } + }, + "EDIT": { + "BUTTON_TEXT": "Edit", + "TITLE": "Edit custom role", + "DESC": " Custom roles allows you to create roles with specific permissions and access levels to suit the requirements of the organization.", + "SUBMIT": "Update", + "API": { + "SUCCESS_MESSAGE": "Custom role updated successfully." + } + }, + "DELETE": { + "BUTTON_TEXT": "Delete", + "API": { + "SUCCESS_MESSAGE": "Custom role deleted successfully.", + "ERROR_MESSAGE": "Could not connect to Woot server. Please try again." + }, + "CONFIRM": { + "TITLE": "Confirm deletion", + "MESSAGE": "Are you sure to delete ", + "YES": "Yes, delete ", + "NO": "No, keep " + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/datePicker.json b/app/javascript/dashboard/i18n/locale/uz/datePicker.json new file mode 100644 index 000000000..95d304cc6 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/datePicker.json @@ -0,0 +1,24 @@ +{ + "DATE_PICKER": { + "PREVIOUS_PERIOD": "Previous period", + "NEXT_PERIOD": "Next period", + "WEEK_NUMBER": "Week #{weekNumber}", + "APPLY_BUTTON": "Apply", + "CLEAR_BUTTON": "Clear", + "DATE_RANGE_INPUT": { + "START": "Start Date", + "END": "End Date" + }, + "DATE_RANGE_OPTIONS": { + "TITLE": "DATE RANGE", + "LAST_7_DAYS": "Last 7 days", + "LAST_30_DAYS": "Last 30 days", + "LAST_3_MONTHS": "Last 3 months", + "LAST_6_MONTHS": "Last 6 months", + "LAST_YEAR": "Last year", + "THIS_WEEK": "This week", + "MONTH_TO_DATE": "This month", + "CUSTOM_RANGE": "Custom date range" + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/emoji.json b/app/javascript/dashboard/i18n/locale/uz/emoji.json new file mode 100644 index 000000000..2370dff54 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/emoji.json @@ -0,0 +1,35 @@ +{ + "EMOJI": { + "PLACEHOLDER": "Search emojis", + "NOT_FOUND": "No emoji match your search", + "REMOVE": "Remove" + }, + "EMOJI_ICON_PICKER": { + "TABS": { + "ICONS": "Icons", + "EMOJIS": "Emojis" + }, + "SEARCH_EMOJI": "Search emoji…", + "SEARCH_ICON": "Search icons…", + "FREQUENTLY_USED": "Frequently used", + "NO_EMOJI": "Qidiruvga mos emoji topilmadi", + "NO_ICON": "No icons match your search", + "REMOVE": "Remove", + "STYLE": { + "OUTLINE": "Outline icons", + "FILLED": "Filled icons" + }, + "COLORS": { + "SLATE": "Slate", + "RED": "Red", + "ORANGE": "Orange", + "AMBER": "Amber", + "GREEN": "Green", + "TEAL": "Teal", + "BLUE": "Blue", + "INDIGO": "Indigo", + "VIOLET": "Violet", + "PINK": "Pink" + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/general.json b/app/javascript/dashboard/i18n/locale/uz/general.json new file mode 100644 index 000000000..bdc7cb8a4 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/general.json @@ -0,0 +1,19 @@ +{ + "GENERAL": { + "SHOWING_RESULTS": "Showing {firstIndex}-{lastIndex} of {totalCount} items", + "PHONE_INPUT": { + "PLACEHOLDER": "Search", + "EMPTY_STATE": "No results found" + }, + "CLOSE": "Close", + "BETA": "Beta", + "BETA_DESCRIPTION": "This feature is in beta and may change as we improve it.", + "ACCEPT": "Accept", + "DISCARD": "Discard", + "PREFERRED": "Preferred" + }, + "CHOICE_TOGGLE": { + "YES": "Yes", + "NO": "No" + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/generalSettings.json b/app/javascript/dashboard/i18n/locale/uz/generalSettings.json new file mode 100644 index 000000000..fab8020e2 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/generalSettings.json @@ -0,0 +1,252 @@ +{ + "GENERAL_SETTINGS": { + "LIMIT_MESSAGES": { + "CONVERSATION": "You have exceeded the conversation limit. Hacker plan allows only 500 conversations.", + "INBOXES": "You have exceeded the inbox limit. Hacker plan only supports website live-chat. Additional inboxes like email, WhatsApp etc. require a paid plan.", + "AGENTS": "You have exceeded the agent limit. Your plan only allows {allowedAgents} agents.", + "NON_ADMIN": "Please contact your administrator to upgrade the plan and continue using all features." + }, + "TITLE": "Account settings", + "SUBMIT": "Update settings", + "BACK": "Back", + "DISMISS": "Dismiss", + "UPDATE": { + "ERROR": "Could not update settings, try again!", + "SUCCESS": "Successfully updated account settings" + }, + "ACCOUNT_DELETE_SECTION": { + "TITLE": "Delete your Account", + "NOTE": "Once you delete your account, all your data will be deleted.", + "BUTTON_TEXT": "Delete Your Account", + "CONFIRM": { + "TITLE": "Delete Account", + "MESSAGE": "Deleting your Account is irreversible. Enter your account name below to confirm you want to permanently delete it.", + "BUTTON_TEXT": "Delete", + "DISMISS": "Cancel", + "PLACE_HOLDER": "Please type {accountName} to confirm" + }, + "SUCCESS": "Account marked for deletion", + "FAILURE": "Could not delete account, try again!", + "SCHEDULED_DELETION": { + "TITLE": "Account Scheduled for Deletion", + "MESSAGE_MANUAL": "This account is scheduled for deletion on {deletionDate}. This was requested by an administrator. You can cancel the deletion before this date.", + "MESSAGE_INACTIVITY": "This account is scheduled for deletion on {deletionDate} due to account inactivity. You can cancel the deletion before this date.", + "CLEAR_BUTTON": "Cancel Scheduled Deletion" + } + }, + "FORM": { + "ERROR": "Please fix form errors", + "GENERAL_SECTION": { + "TITLE": "General settings", + "NOTE": "" + }, + "ACCOUNT_ID": { + "TITLE": "Account ID", + "NOTE": "This ID is required if you are building an API based integration" + }, + "AUTO_RESOLVE": { + "TITLE": "Auto-resolve conversations", + "NOTE": "This configuration would allow you to automatically resolve the conversation after a certain period of inactivity.", + "DURATION": { + "LABEL": "Inactivity duration", + "HELP": "Time period of inactivity after which conversation is auto-resolved", + "PLACEHOLDER": "30", + "ERROR": "Auto resolve duration should be between 10 minutes and 999 days", + "API": { + "SUCCESS": "Auto resolve settings updated successfully", + "ERROR": "Failed to update auto resolve settings" + } + }, + "MESSAGE": { + "LABEL": "Custom auto-resolution message", + "PLACEHOLDER": "Conversation was marked resolved by system due to 15 days of inactivity", + "HELP": "Message sent to the customer after conversation is auto-resolved" + }, + "PREFERENCES": "Preferences", + "LABEL": { + "LABEL": "Add label after auto-resolution", + "PLACEHOLDER": "Select a label" + }, + "IGNORE_WAITING": { + "LABEL": "Skip conversations waiting for agent’s reply" + }, + "UPDATE_BUTTON": "Save Changes" + }, + "NAME": { + "LABEL": "Account name", + "PLACEHOLDER": "Your account name", + "ERROR": "Please enter a valid account name" + }, + "LANGUAGE": { + "LABEL": "Site language", + "PLACEHOLDER": "Your account name", + "ERROR": "" + }, + "DOMAIN": { + "LABEL": "Incoming Email Domain", + "PLACEHOLDER": "The domain where you will receive the emails", + "ERROR": "" + }, + "SUPPORT_EMAIL": { + "LABEL": "Support Email", + "PLACEHOLDER": "Your company's support email", + "ERROR": "" + }, + "AUTO_RESOLVE_IGNORE_WAITING": { + "LABEL": "Exclude unattended conversations", + "HELP": "When enabled, the system will skip resolving conversations that are still waiting for an agent's reply." + }, + "AUDIO_TRANSCRIPTION": { + "TITLE": "Transcribe Audio Messages", + "NOTE": "Automatically transcribe audio messages in conversations. Generate a text transcript whenever an audio message is sent or received, and display it alongside the message.", + "API": { + "SUCCESS": "Audio transcription setting updated successfully", + "ERROR": "Failed to update audio transcription setting" + } + }, + "AUTO_RESOLVE_DURATION": { + "LABEL": "Inactivity duration for resolution", + "HELP": "Duration after a conversation should auto resolve if there is no activity", + "PLACEHOLDER": "30", + "ERROR": "Auto resolve duration should be between 10 minutes and 999 days", + "API": { + "SUCCESS": "Auto resolve settings updated successfully", + "ERROR": "Failed to update auto resolve settings" + }, + "UPDATE_BUTTON": "Update", + "MESSAGE_LABEL": "Custom resolution message", + "MESSAGE_PLACEHOLDER": "Conversation was marked resolved by system due to 15 days of inactivity", + "MESSAGE_HELP": "This message is sent to the customer when a conversation is automatically resolved by the system due to inactivity." + }, + "FEATURES": { + "INBOUND_EMAIL_ENABLED": "Conversation continuity with emails is enabled for your account.", + "CUSTOM_EMAIL_DOMAIN_ENABLED": "You can receive emails in your custom domain now." + } + }, + "UPDATE_CHATWOOT": "An update {latestChatwootVersion} for Chatwoot is available. Please update your instance.", + "LEARN_MORE": "Learn more", + "PAYMENT_PENDING": "Your payment is pending. Please update your payment information to continue using Chatwoot", + "UPGRADE": "Upgrade to continue using Chatwoot", + "LIMITS_UPGRADE": "Your account has exceeded the usage limits, please upgrade your plan to continue using Chatwoot", + "OPEN_BILLING": "Open billing" + }, + "FORMS": { + "MULTISELECT": { + "ENTER_TO_SELECT": "Press enter to select", + "ENTER_TO_REMOVE": "Press enter to remove", + "NO_OPTIONS": "List is empty", + "SELECT_ONE": "Select one", + "SELECT": "Select" + } + }, + "NOTIFICATIONS_PAGE": { + "HEADER": "Notifications", + "MARK_ALL_DONE": "Mark All Done", + "DELETE_TITLE": "deleted", + "UNREAD_NOTIFICATION": { + "TITLE": "Unread Notifications", + "ALL_NOTIFICATIONS": "View all notifications", + "LOADING_UNREAD_MESSAGE": "Loading unread notifications...", + "EMPTY_MESSAGE": "You have no unread notifications" + }, + "LIST": { + "LOADING_MESSAGE": "Loading notifications...", + "404": "No Notifications", + "TABLE_HEADER": [ + "Name", + "Phone Number", + "Conversations", + "Last Contacted" + ] + }, + "TYPE_LABEL": { + "conversation_creation": "New conversation", + "conversation_assignment": "Conversation Assigned", + "assigned_conversation_new_message": "New Message", + "participating_conversation_new_message": "New Message", + "conversation_mention": "Mention", + "sla_missed_first_response": "SLA Missed", + "sla_missed_next_response": "SLA Missed", + "sla_missed_resolution": "SLA Missed" + } + }, + "NETWORK": { + "NOTIFICATION": { + "OFFLINE": "Offline", + "RECONNECTING": "Reconnecting...", + "RECONNECT_SUCCESS": "Reconnected" + }, + "BUTTON": { + "REFRESH": "Refresh" + } + }, + "COMMAND_BAR": { + "SEARCH_PLACEHOLDER": "Search or jump to", + "SNOOZE_PLACEHOLDER": "Type a time e.g. tomorrow, 2 hours, next friday, jan 15...", + "SECTIONS": { + "GENERAL": "General", + "REPORTS": "Reports", + "CONVERSATION": "Conversation", + "BULK_ACTIONS": "Bulk Actions", + "CHANGE_ASSIGNEE": "Change Assignee", + "CHANGE_PRIORITY": "Change Priority", + "CHANGE_TEAM": "Change Team", + "SNOOZE_CONVERSATION": "Snooze Conversation", + "ADD_LABEL": "Add label to the conversation", + "REMOVE_LABEL": "Remove label from the conversation", + "SETTINGS": "Settings", + "AI_ASSIST": "AI Assist", + "APPEARANCE": "Appearance", + "SNOOZE_NOTIFICATION": "Snooze Notification" + }, + "COMMANDS": { + "GO_TO_CONVERSATION_DASHBOARD": "Go to Conversation Dashboard", + "GO_TO_CONTACTS_DASHBOARD": "Go to Contacts Dashboard", + "GO_TO_REPORTS_OVERVIEW": "Go to Reports Overview", + "GO_TO_CONVERSATION_REPORTS": "Go to Conversation Reports", + "GO_TO_AGENT_REPORTS": "Go to Agent Reports", + "GO_TO_LABEL_REPORTS": "Go to Label Reports", + "GO_TO_INBOX_REPORTS": "Go to Inbox Reports", + "GO_TO_TEAM_REPORTS": "Go to Team Reports", + "GO_TO_SETTINGS_AGENTS": "Go to Agent Settings", + "GO_TO_SETTINGS_TEAMS": "Go to Team Settings", + "GO_TO_SETTINGS_INBOXES": "Go to Inbox Settings", + "GO_TO_SETTINGS_LABELS": "Go to Label Settings", + "GO_TO_SETTINGS_CANNED_RESPONSES": "Go to Canned Response Settings", + "GO_TO_SETTINGS_APPLICATIONS": "Go to Application Settings", + "GO_TO_SETTINGS_ACCOUNT": "Go to Account Settings", + "GO_TO_SETTINGS_PROFILE": "Go to Profile Settings", + "GO_TO_NOTIFICATIONS": "Go to Notifications", + "ADD_LABELS_TO_CONVERSATION": "Add label to the conversation", + "ASSIGN_AN_AGENT": "Assign an agent", + "AI_ASSIST": "AI Assist", + "ASSIGN_PRIORITY": "Assign priority", + "ASSIGN_A_TEAM": "Assign a team", + "MUTE_CONVERSATION": "Mute conversation", + "UNMUTE_CONVERSATION": "Unmute conversation", + "REMOVE_LABEL_FROM_CONVERSATION": "Remove label from the conversation", + "REOPEN_CONVERSATION": "Reopen conversation", + "RESOLVE_CONVERSATION": "Resolve conversation", + "SEND_TRANSCRIPT": "Send an email transcript", + "SNOOZE_CONVERSATION": "Snooze Conversation", + "UNTIL_NEXT_REPLY": "Until next reply", + "UNTIL_NEXT_WEEK": "Until next week", + "UNTIL_TOMORROW": "Until tomorrow", + "UNTIL_NEXT_MONTH": "Until next month", + "AN_HOUR_FROM_NOW": "Until an hour from now", + "UNTIL_CUSTOM_TIME": "Custom...", + "CHANGE_APPEARANCE": "Change Appearance", + "LIGHT_MODE": "Light", + "DARK_MODE": "Dark", + "SYSTEM_MODE": "System", + "SNOOZE_NOTIFICATION": "Snooze Notification" + } + }, + "DASHBOARD_APPS": { + "LOADING_MESSAGE": "Loading Dashboard App..." + }, + "COMMON": { + "OR": "Or", + "CLICK_HERE": "click here" + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/helpCenter.json b/app/javascript/dashboard/i18n/locale/uz/helpCenter.json new file mode 100644 index 000000000..a406046b9 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/helpCenter.json @@ -0,0 +1,1039 @@ +{ + "HELP_CENTER": { + "TITLE": "Help Center", + "NEW_PAGE": { + "DESCRIPTION": "Create self-service help center portals for your customers. Help them find answers quickly, without waiting. Streamline inquiries, boost agent efficiency, and elevate customer support.", + "CREATE_PORTAL_BUTTON": "Create Portal" + }, + "HEADER": { + "FILTER": "Filter by", + "SORT": "Sort by", + "LOCALE": "Locale", + "SETTINGS_BUTTON": "Settings", + "NEW_BUTTON": "New Article", + "DROPDOWN_OPTIONS": { + "PUBLISHED": "Published", + "DRAFT": "Draft", + "ARCHIVED": "Archived" + }, + "TITLES": { + "ALL_ARTICLES": "All Articles", + "MINE": "My Articles", + "DRAFT": "Draft Articles", + "ARCHIVED": "Archived Articles" + }, + "LOCALE_SELECT": { + "TITLE": "Select locale", + "PLACEHOLDER": "Select locale", + "NO_RESULT": "No locale found", + "SEARCH_PLACEHOLDER": "Search locale" + } + }, + "EDIT_HEADER": { + "ALL_ARTICLES": "All Articles", + "PUBLISH_BUTTON": "Publish", + "MOVE_TO_ARCHIVE_BUTTON": "Move to archived", + "PREVIEW": "Preview", + "ADD_TRANSLATION": "Add translation", + "OPEN_SIDEBAR": "Open sidebar", + "CLOSE_SIDEBAR": "Close sidebar", + "SAVING": "Saving...", + "SAVED": "Saved" + }, + "ARTICLE_EDITOR": { + "IMAGE_UPLOAD": { + "TITLE": "Upload image", + "UPLOADING": "Yuklanmoqda...", + "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": "Article Settings", + "FORM": { + "CATEGORY": { + "LABEL": "Category", + "TITLE": "Select category", + "PLACEHOLDER": "Select category", + "NO_RESULT": "No category found", + "SEARCH_PLACEHOLDER": "Search category" + }, + "AUTHOR": { + "LABEL": "Author", + "TITLE": "Select author", + "PLACEHOLDER": "Select author", + "NO_RESULT": "No authors found", + "SEARCH_PLACEHOLDER": "Search author" + }, + "META_TITLE": { + "LABEL": "Meta title", + "PLACEHOLDER": "Add a meta title" + }, + "META_DESCRIPTION": { + "LABEL": "Meta description", + "PLACEHOLDER": "Add your meta description for better SEO results..." + }, + "META_TAGS": { + "LABEL": "Meta tags", + "PLACEHOLDER": "Add meta tags separated by comma..." + } + }, + "BUTTONS": { + "ARCHIVE": "Archive article", + "DELETE": "Delete article" + } + }, + "ARTICLE_SEARCH_RESULT": { + "UNCATEGORIZED": "Uncategorized", + "SEARCH_RESULTS": "Search results for {query}", + "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": "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": "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": "articles", + "ADD": "Add locale", + "VISIT": "Visit site", + "SETTINGS": "Settings", + "DELETE": "Delete" + }, + "PORTAL_CONFIG": { + "TITLE": "Portal Configurations", + "ITEMS": { + "NAME": "Name", + "DOMAIN": "Custom domain", + "SLUG": "Slug", + "TITLE": "Portal title", + "THEME": "Theme color", + "SUB_TEXT": "Portal sub text" + } + }, + "AVAILABLE_LOCALES": { + "TITLE": "Available locales", + "TABLE": { + "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": "Delete portal", + "MESSAGE": "Are you sure you want to delete this portal", + "YES": "Yes, delete portal", + "NO": "No, keep portal", + "API": { + "DELETE_SUCCESS": "Portal deleted successfully", + "DELETE_ERROR": "Error while deleting portal" + } + }, + "SEND_CNAME_INSTRUCTIONS": { + "API": { + "SUCCESS_MESSAGE": "CNAME instructions sent successfully", + "ERROR_MESSAGE": "Error while sending CNAME instructions" + } + } + }, + "EDIT": { + "HEADER_TEXT": "Edit portal", + "TABS": { + "BASIC_SETTINGS": { + "TITLE": "Basic information" + }, + "CUSTOMIZATION_SETTINGS": { + "TITLE": "Portal customization" + }, + "CATEGORY_SETTINGS": { + "TITLE": "Categories" + }, + "LOCALE_SETTINGS": { + "TITLE": "Locales" + } + }, + "CATEGORIES": { + "TITLE": "Categories in", + "NEW_CATEGORY": "New category", + "TABLE": { + "NAME": "Name", + "DESCRIPTION": "Description", + "LOCALE": "Locale", + "ARTICLE_COUNT": "No. of articles", + "ACTION_BUTTON": { + "EDIT": "Edit category", + "DELETE": "Delete category" + }, + "EMPTY_TEXT": "No categories found" + } + }, + "EDIT_BASIC_INFO": { + "BUTTON_TEXT": "Update basic settings" + } + }, + "ADD": { + "CREATE_FLOW": { + "BASIC": { + "TITLE": "Help center information", + "BODY": "Basic information about portal" + }, + "CUSTOMIZATION": { + "TITLE": "Help center customization", + "BODY": "Customize portal" + }, + "FINISH": { + "TITLE": "Voila! 🎉", + "BODY": "You're all set!" + } + }, + "CREATE_FLOW_PAGE": { + "BACK_BUTTON": "Back", + "BASIC_SETTINGS_PAGE": { + "HEADER": "Create Portal", + "TITLE": "Help center information", + "CREATE_BASIC_SETTING_BUTTON": "Create portal basic settings" + }, + "CUSTOMIZATION_PAGE": { + "HEADER": "Portal customisation", + "TITLE": "Help center customization", + "UPDATE_PORTAL_BUTTON": "Update portal settings" + }, + "FINISH_PAGE": { + "TITLE": "Voila!🎉 You're all set up!", + "MESSAGE": "You can now see this created portal on your all portals page.", + "FINISH": "Go to all portals page" + } + }, + "LOGO": { + "LABEL": "Logo", + "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": "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 for urls", + "ERROR": "Slug is required" + }, + "DOMAIN": { + "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": "Enter a valid domain URL" + }, + "HOME_PAGE_LINK": { + "LABEL": "Home Page Link", + "PLACEHOLDER": "Portal home page link", + "HELP_TEXT": "The link used to return from the portal to the home page. Eg: {exampleURL}", + "ERROR": "Enter a valid home page URL" + }, + "THEME_COLOR": { + "LABEL": "Portal theme color", + "HELP_TEXT": "This color will show as the theme color for the portal." + }, + "PAGE_TITLE": { + "LABEL": "Page Title", + "PLACEHOLDER": "Portal page title", + "HELP_TEXT": "The page title will be used in the public facing portal.", + "ERROR": "Page title is required" + }, + "HEADER_TEXT": { + "LABEL": "Header Text", + "PLACEHOLDER": "Portal header text", + "HELP_TEXT": "The Portal header text will be used in the public facing portal.", + "ERROR": "Portal header text is required" + }, + "API": { + "SUCCESS_MESSAGE_FOR_BASIC": "Portal created successfully.", + "ERROR_MESSAGE_FOR_BASIC": "Couldn't create the portal. Try again.", + "SUCCESS_MESSAGE_FOR_UPDATE": "Portal updated successfully.", + "ERROR_MESSAGE_FOR_UPDATE": "Couldn't update the portal. Try again." + } + }, + "ADD_LOCALE": { + "TITLE": "Add a new locale", + "SUB_TITLE": "This adds a new locale to your available translation list.", + "PORTAL": "Portal", + "LOCALE": { + "LABEL": "Locale", + "PLACEHOLDER": "Choose a locale", + "ERROR": "Locale is required" + }, + "BUTTONS": { + "CREATE": "Create locale", + "CANCEL": "Cancel" + }, + "API": { + "SUCCESS_MESSAGE": "Locale added successfully", + "ERROR_MESSAGE": "Unable to add locale. Try again." + } + }, + "CHANGE_DEFAULT_LOCALE": { + "API": { + "SUCCESS_MESSAGE": "Default locale updated successfully", + "ERROR_MESSAGE": "Unable to update default locale. Try again." + } + }, + "DELETE_LOCALE": { + "API": { + "SUCCESS_MESSAGE": "Locale removed from portal successfully", + "ERROR_MESSAGE": "Unable to remove locale from portal. Try again." + } + }, + "DRAFT_LOCALE": { + "API": { + "SUCCESS_MESSAGE": "Locale moved to draft successfully", + "ERROR_MESSAGE": "Unable to move locale to draft. Try again." + } + }, + "PUBLISH_LOCALE": { + "API": { + "SUCCESS_MESSAGE": "Locale published successfully", + "ERROR_MESSAGE": "Unable to publish locale. Try again." + } + } + }, + "TABLE": { + "LOADING_MESSAGE": "Loading articles...", + "404": "No articles matches your search 🔍", + "NO_ARTICLES": "There are no available articles", + "HEADERS": { + "TITLE": "Title", + "CATEGORY": "Category", + "READ_COUNT": "Views", + "STATUS": "Status", + "LAST_EDITED": "Last edited" + }, + "COLUMNS": { + "BY": "by", + "AUTHOR_NOT_AVAILABLE": "Author is not available" + } + }, + "EDIT_ARTICLE": { + "LOADING": "Loading article...", + "TITLE_PLACEHOLDER": "Article title goes here", + "CONTENT_PLACEHOLDER": "Write your article here", + "API": { + "ERROR": "Error while saving article" + } + }, + "PUBLISH_ARTICLE": { + "API": { + "ERROR": "Error while publishing article", + "SUCCESS": "Article published successfully" + } + }, + "ARCHIVE_ARTICLE": { + "API": { + "ERROR": "Error while archiving article", + "SUCCESS": "Article archived successfully" + } + }, + "DRAFT_ARTICLE": { + "API": { + "ERROR": "Error while drafting article", + "SUCCESS": "Article drafted successfully" + } + }, + "DELETE_ARTICLE": { + "MODAL": { + "CONFIRM": { + "TITLE": "Confirm Deletion", + "MESSAGE": "Are you sure to delete the article?", + "YES": "Yes, Delete", + "NO": "No, Keep it" + } + }, + "API": { + "SUCCESS_MESSAGE": "Article deleted successfully", + "ERROR_MESSAGE": "Error while deleting article" + } + }, + "REORDER_ARTICLE": { + "API": { + "ERROR_MESSAGE": "Unable to reorder articles. Please try again." + } + }, + "REORDER_CATEGORY": { + "API": { + "ERROR_MESSAGE": "Unable to reorder categories. Please try again." + } + }, + "CREATE_ARTICLE": { + "ERROR_MESSAGE": "Please add the article heading and content then only you can update the settings" + }, + "SIDEBAR": { + "SEARCH": { + "PLACEHOLDER": "Search for articles" + } + }, + "CATEGORY": { + "ADD": { + "TITLE": "Create a category", + "SUB_TITLE": "The category will be used in the public facing portal to categorize articles.", + "PORTAL": "Portal", + "LOCALE": "Locale", + "NAME": { + "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": "Category slug for urls", + "HELP_TEXT": "app.chatwoot.com/hc/my-portal/en-US/categories/my-slug", + "ERROR": "Slug is required" + }, + "DESCRIPTION": { + "LABEL": "Description", + "PLACEHOLDER": "Give a short description about the category.", + "ERROR": "Description is required" + }, + "BUTTONS": { + "CREATE": "Create category", + "CANCEL": "Cancel" + }, + "API": { + "SUCCESS_MESSAGE": "Category created successfully", + "ERROR_MESSAGE": "Unable to create category" + } + }, + "EDIT": { + "TITLE": "Edit a category", + "SUB_TITLE": "Editing a category will update the category in the public facing portal.", + "PORTAL": "Portal", + "LOCALE": "Locale", + "NAME": { + "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": "Category slug for urls", + "HELP_TEXT": "app.chatwoot.com/hc/my-portal/en-US/categories/my-slug", + "ERROR": "Slug is required" + }, + "DESCRIPTION": { + "LABEL": "Description", + "PLACEHOLDER": "Give a short description about the category.", + "ERROR": "Description is required" + }, + "BUTTONS": { + "CREATE": "Update category", + "CANCEL": "Cancel" + }, + "API": { + "SUCCESS_MESSAGE": "Category updated successfully", + "ERROR_MESSAGE": "Unable to update category" + } + }, + "DELETE": { + "API": { + "SUCCESS_MESSAGE": "Category deleted successfully", + "ERROR_MESSAGE": "Unable to delete category" + } + } + }, + "ARTICLE_SEARCH": { + "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": "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": "Learn more", + "UPGRADE": "Upgrade" + }, + "FEATURES": { + "PORTALS": { + "TITLE": "Multiple portals", + "DESCRIPTION": "Create multiple help center portals for different products using the same account." + }, + "LOCALES": { + "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-friendly design", + "DESCRIPTION": "Customize your meta tags to improve your visibility on search engines with our SEO-friendly pages." + }, + "API": { + "TITLE": "Full API support", + "DESCRIPTION": "Use the portal as a headless CMS with third party front-end frameworks using our APIs." + } + } + }, + "LOADING": "Loading...", + "ARTICLES_PAGE": { + "ARTICLE_CARD": { + "CARD": { + "VIEWS": "{count} view | {count} views", + "DROPDOWN_MENU": { + "PUBLISH": "Publish", + "DRAFT": "Draft", + "ARCHIVE": "Archive", + "TRANSLATE": "Translate", + "DELETE": "Delete" + }, + "STATUS": { + "DRAFT": "Draft", + "PUBLISHED": "Published", + "ARCHIVED": "Archived" + }, + "PENDING_EDITS": "Unpublished edits", + "PENDING_EDITS_TOOLTIP": "This published article has unpublished edits", + "CATEGORY": { + "UNCATEGORISED": "Uncategorised" + } + } + }, + "ARTICLES_HEADER": { + "TABS": { + "ALL": "All articles", + "MINE": "Mine", + "DRAFT": "Draft", + "PUBLISHED": "Published", + "ARCHIVED": "Archived" + }, + "CATEGORY": { + "ALL": "All categories" + }, + "LOCALE": { + "ALL": "All locales" + }, + "SEARCH_PLACEHOLDER": "Search articles...", + "NEW_ARTICLE": "New article" + }, + "EMPTY_STATE": { + "ALL": { + "TITLE": "Write an article", + "SUBTITLE": "Write a rich article, let’s get started!", + "BUTTON_LABEL": "New article" + }, + "MINE": { + "TITLE": "You haven't written any articles here", + "SUBTITLE": "All articles written by you show up here for quick access." + }, + "DRAFT": { + "TITLE": "There are no articles in drafts", + "SUBTITLE": "Draft articles will appear here" + }, + "PUBLISHED": { + "TITLE": "There are no published articles", + "SUBTITLE": "Published articles will appear here" + }, + "ARCHIVED": { + "TITLE": "There are no articles in the archive", + "SUBTITLE": "Archived articles don't show up on the portal, you can use it to mark deprecated or outdated pages" + }, + "CATEGORY": { + "TITLE": "There are no articles in this category", + "SUBTITLE": "Articles in this category will appear here" + }, + "SEARCH": { + "TITLE": "No matching articles", + "SUBTITLE": "We couldn't find any articles matching your search. Try a different term." + } + }, + "BULK_TRANSLATE": { + "TITLE": "Translate article | Translate {count} articles", + "DESCRIPTION": "Translate the selected article to another language. | Translate the selected articles to another language.", + "LOCALE_LABEL": "Target language", + "LOCALE_PLACEHOLDER": "Select a language", + "CATEGORY_LABEL": "Target category", + "CATEGORY_PLACEHOLDER": "Select a category", + "OPTIONAL": "(optional)", + "CONFIRM": "Translate", + "SELECT_ALL": "Select all ({count})", + "SELECTED_COUNT": "{count} selected", + "CLEAR_SELECTION": "Clear selection", + "TRANSLATE_BUTTON": "Translate", + "CONFIRM_OVERWRITE": "Overwrite and translate", + "DUPLICATE_WARNING": "A translation already exists for this article in the selected language. | Translations already exist for {count} articles in the selected language.", + "DUPLICATE_CONFIRM_HINT": "Click translate again to overwrite the existing translation.", + "API": { + "SUCCESS_MESSAGE": "Translation in progress. The article will appear as a draft once ready.", + "ERROR_MESSAGE": "Failed to start translation. Please try again." + } + }, + "BULK_ACTIONS": { + "PUBLISH": "Publish", + "DRAFT": "Draft", + "ARCHIVE": "Archive", + "TRANSLATE": "Translate", + "MOVE_TO_CATEGORY": "Category", + "DELETE": "Delete", + "STATUS_SUCCESS": "Articles updated successfully", + "STATUS_ERROR": "Failed to update articles", + "STATUS_SKIPPED": "1 article with unpublished edits was skipped — open it to publish or discard. | {count} articles with unpublished edits were skipped — open them to publish or discard.", + "STATUS_SKIPPED_ALL": "These articles have unpublished edits — open each to publish or discard.", + "CATEGORY_SUCCESS": "Articles moved successfully", + "CATEGORY_ERROR": "Failed to move articles", + "DELETE_CONFIRM_TITLE": "Delete article | Delete {count} articles", + "DELETE_CONFIRM_DESCRIPTION": "This will permanently delete the selected article. This action cannot be undone. | This will permanently delete {count} selected articles. This action cannot be undone.", + "DELETE_CONFIRM": "Delete", + "DELETE_SUCCESS": "Articles deleted successfully", + "DELETE_ERROR": "Failed to delete articles" + } + }, + "CATEGORY_PAGE": { + "CATEGORY_HEADER": { + "NEW_CATEGORY": "New category", + "EDIT_CATEGORY": "Edit category", + "SEARCH_PLACEHOLDER": "Search categories...", + "CATEGORIES_COUNT": "{n} category | {n} categories", + "BREADCRUMB": { + "CATEGORY_LOCALE": "Categories ({localeCode})", + "ACTIVE_CATEGORY": "{categoryName} ({categoryCount} articles) | {categoryName} ({categoryCount} article)" + } + }, + "CATEGORY_EMPTY_STATE": { + "TITLE": "No categories found", + "SUBTITLE": "Categories will appear here. You can add a category by clicking the 'New Category' button." + }, + "SEARCH_EMPTY_STATE": { + "TITLE": "No matching categories", + "SUBTITLE": "We couldn't find any categories matching your search. Try a different term." + }, + "CATEGORY_CARD": { + "ARTICLES_COUNT": "{count} article | {count} articles" + }, + "CATEGORY_DIALOG": { + "CREATE": { + "API": { + "SUCCESS_MESSAGE": "Category created successfully", + "ERROR_MESSAGE": "Unable to create category" + } + }, + "EDIT": { + "API": { + "SUCCESS_MESSAGE": "Category updated successfully", + "ERROR_MESSAGE": "Unable to update category" + } + }, + "DELETE": { + "API": { + "SUCCESS_MESSAGE": "Category deleted successfully", + "ERROR_MESSAGE": "Unable to delete category" + } + }, + "HEADER": { + "CREATE": "Create category", + "EDIT": "Edit category", + "DESCRIPTION": "Editing a category will update the category in the public facing portal.", + "PORTAL": "Portal", + "LOCALE": "Locale" + }, + "FORM": { + "NAME": { + "LABEL": "Name", + "PLACEHOLDER": "Category name", + "ERROR": "Name is required" + }, + "SLUG": { + "LABEL": "Slug", + "PLACEHOLDER": "Category slug for urls", + "ERROR": "Slug is required", + "HELP_TEXT": "app.chatwoot.com/hc/{portalSlug}/{localeCode}/categories/{categorySlug}" + }, + "DESCRIPTION": { + "LABEL": "Description", + "PLACEHOLDER": "Give a short description about the category.", + "ERROR": "Description is required" + } + }, + "BUTTONS": { + "CREATE": "Create", + "EDIT": "Update", + "CANCEL": "Cancel" + } + } + }, + "LOCALES_PAGE": { + "LOCALES_COUNT": "No locales available | {n} locale | {n} locales", + "NEW_LOCALE_BUTTON_TEXT": "New locale", + "SEARCH_PLACEHOLDER": "Search locales...", + "SEARCH_EMPTY_STATE": { + "TITLE": "No matching locales", + "SUBTITLE": "We couldn't find any locales matching your search. Try a different term." + }, + "LOCALE_CARD": { + "ARTICLES_COUNT": "{count} article | {count} articles", + "CATEGORIES_COUNT": "{count} category | {count} categories", + "DEFAULT": "Default", + "DRAFT": "Draft", + "DROPDOWN_MENU": { + "MAKE_DEFAULT": "Make default", + "MOVE_TO_DRAFT": "Move to draft", + "PUBLISH_LOCALE": "Publish locale", + "CUSTOMIZE_CONTENT": "Localize content", + "SELECT_POPULAR_CONTENT": "Select recommended content", + "DELETE": "Delete" + } + }, + "POPULAR_CONTENT_DIALOG": { + "TITLE": "Recommended content", + "DESCRIPTION": "Pick up to 3 categories and 6 articles to feature on this locale's help center home page. Drag them into the order you want visitors to see.", + "SEARCH": "Search...", + "EMPTY": "No matching results", + "ADD_ANOTHER": "Add another...", + "SLOTS_LEFT": "{count} slots left", + "OVERRIDING_DEFAULTS": "Overriding defaults for this locale", + "CONFIRM": "Save recommendations", + "CATEGORIES": { + "LABEL": "Recommended categories", + "ARTICLES_COUNT": "No articles | {count} article | {count} articles" + }, + "ARTICLES": { + "LABEL": "Recommended articles", + "IN_CATEGORY": "in {category}", + "UNCATEGORIZED": "Uncategorized" + }, + "API": { + "SUCCESS_MESSAGE": "Recommended content updated successfully", + "ERROR_MESSAGE": "Unable to update recommended content. Try again." + } + }, + "CONTENT_DIALOG": { + "TITLE": "Localize content", + "DESCRIPTION": "Set values specific to this locale. Anything left blank falls back to the default locale.", + "NAME": { + "LABEL": "Name" + }, + "PAGE_TITLE": { + "LABEL": "Page title" + }, + "HEADER_TEXT": { + "LABEL": "Header text" + }, + "API": { + "SUCCESS_MESSAGE": "Locale content updated successfully", + "ERROR_MESSAGE": "Unable to update locale content. Try again." + } + }, + "ADD_LOCALE_DIALOG": { + "TITLE": "Add a new locale", + "DESCRIPTION": "Select the language in which this article will be written. This will be added to your list of translations, and you can add more later.", + "COMBOBOX": { + "PLACEHOLDER": "Select locale..." + }, + "STATUS": { + "LABEL": "Status", + "OPTIONS": { + "LIVE": "Published", + "DRAFT": "Draft" + } + }, + "API": { + "SUCCESS_MESSAGE": "Locale added successfully", + "ERROR_MESSAGE": "Unable to add locale. Try again." + } + } + }, + "EDIT_ARTICLE_PAGE": { + "HEADER": { + "STATUS": { + "SAVING": "Saving...", + "SAVED": "Saved" + }, + "PREVIEW": "Preview", + "PUBLISH": "Publish", + "PUBLISH_CHANGES": "Publish changes", + "PUBLISH_CHANGES_SUCCESS": "Changes published successfully", + "PUBLISH_CHANGES_ERROR": "Could not publish changes", + "SAVE_IN_PROGRESS": "Still saving your latest changes — please try again in a moment.", + "DISCARD_CHANGES": "Discard changes", + "DISCARD_CHANGES_SUCCESS": "Changes discarded", + "DISCARD_CHANGES_ERROR": "Could not discard changes", + "PENDING_CHANGES": "Pending changes", + "VIEW_CHANGES": "View unpublished changes", + "DRAFT": "Draft", + "ARCHIVE": "Archive", + "BACK_TO_ARTICLES": "Back to articles" + }, + "PENDING_CHANGES_POPOVER": { + "TITLE": "Unpublished changes", + "DESCRIPTION": "This article has draft changes that aren't live yet. Apply them before changing the status, or discard them?", + "APPLY": "Apply changes", + "DISCARD": "Discard changes" + }, + "DIFF_DIALOG": { + "TITLE": "Unpublished changes", + "DESCRIPTION": "Compare your draft against the version that's currently live.", + "TITLE_LABEL": "Title" + }, + "EDIT_ARTICLE": { + "MORE_PROPERTIES": "More properties", + "UNCATEGORIZED": "Uncategorized", + "EDITOR_PLACEHOLDER": "Write your content here. Type '/' for formatting options." + }, + "ARTICLE_PROPERTIES": { + "ARTICLE_PROPERTIES": "Article properties", + "META_DESCRIPTION": "Meta description", + "META_DESCRIPTION_PLACEHOLDER": "Add meta description", + "META_TITLE": "Meta title", + "META_TITLE_PLACEHOLDER": "Add meta title", + "META_TAGS": "Meta tags", + "META_TAGS_PLACEHOLDER": "Add meta tags" + }, + "API": { + "ERROR": "Error while saving article" + } + }, + "PORTAL_SWITCHER": { + "NEW_PORTAL": "New portal", + "PORTALS": "Portals", + "CREATE_PORTAL": "Create and manage multiple portals", + "ARTICLES": "articles", + "DOMAIN": "domain", + "PORTAL_NAME": "Portal name" + }, + "CREATE_PORTAL_DIALOG": { + "TITLE": "Create new portal", + "DESCRIPTION": "Give your portal a name and create a user-friendly URL slug. You can modify both later in the settings.", + "CONFIRM_BUTTON_LABEL": "Create", + "NAME": { + "LABEL": "Name", + "PLACEHOLDER": "User Guide | Chatwoot", + "MESSAGE": "Choose an name for your portal.", + "ERROR": "Name is required" + }, + "SLUG": { + "LABEL": "Slug", + "PLACEHOLDER": "user-guide", + "ERROR": "Slug is required", + "FORMAT_ERROR": "Please enter a valid slug, for eg: user-guide" + } + }, + "PORTAL_SETTINGS": { + "FORM": { + "AVATAR": { + "LABEL": "Logo", + "IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again", + "IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save changes to save the logo", + "IMAGE_DELETE_SUCCESS": "Logo deleted successfully", + "IMAGE_DELETE_ERROR": "Unable to delete logo", + "IMAGE_UPLOAD_SIZE_ERROR": "Image size should be less than {size}MB" + }, + "NAME": { + "LABEL": "Name", + "PLACEHOLDER": "Portal name", + "ERROR": "Name is required" + }, + "HEADER_TEXT": { + "LABEL": "Header text", + "PLACEHOLDER": "Portal header text" + }, + "PAGE_TITLE": { + "LABEL": "Page title", + "PLACEHOLDER": "Portal page title" + }, + "HOME_PAGE_LINK": { + "LABEL": "Home page link", + "PLACEHOLDER": "Portal home page link", + "ERROR": "Enter a valid URL. The Home page link must start with 'http://' or 'https://'." + }, + "SLUG": { + "LABEL": "Slug", + "PLACEHOLDER": "Portal slug" + }, + "LIVE_CHAT_WIDGET": { + "LABEL": "Live chat widget", + "PLACEHOLDER": "Select live chat widget", + "HELP_TEXT": "Select a live chat widget that will appear on your help center", + "NONE_OPTION": "No widget" + }, + "BRAND_COLOR": { + "LABEL": "Brand color" + }, + "SAVE_CHANGES": "Save changes" + }, + "CONFIGURATION_FORM": { + "CUSTOM_DOMAIN": { + "HEADER": "Custom domain", + "LABEL": "Custom domain:", + "DESCRIPTION": "You can host your portal on a custom domain. For instance, if your website is yourdomain.com and you want your portal available at docs.yourdomain.com, simply enter that in this field.", + "STATUS_DESCRIPTION": "Your custom portal will start working as soon as it is verified.", + "PLACEHOLDER": "Portal custom domain", + "EDIT_BUTTON": "Edit", + "ADD_BUTTON": "Add custom domain", + "STATUS": { + "LIVE": "Live", + "PENDING": "Awaiting verification", + "ERROR": "Verification failed" + }, + "DIALOG": { + "ADD_HEADER": "Add custom domain", + "EDIT_HEADER": "Edit custom domain", + "ADD_CONFIRM_BUTTON_LABEL": "Add domain", + "EDIT_CONFIRM_BUTTON_LABEL": "Update domain", + "LABEL": "Custom domain", + "PLACEHOLDER": "Portal custom domain", + "ERROR": "Custom domain is required", + "FORMAT_ERROR": "Please enter a valid domain URL e.g. docs.yourdomain.com" + }, + "DNS_CONFIGURATION_DIALOG": { + "HEADER": "DNS configuration", + "DESCRIPTION": "Log in to the account you have with your DNS provider, and add a CNAME record for subdomain pointing to chatwoot.help", + "COPY": "Successfully copied CNAME", + "SEND_INSTRUCTIONS": { + "HEADER": "Send instructions", + "DESCRIPTION": "If you would prefer to have someone from your development team to handle this step, you can enter email address below, and we will send them the required instructions.", + "PLACEHOLDER": "Enter their email", + "ERROR": "Enter a valid email address", + "SEND_BUTTON": "Send" + } + } + }, + "DELETE_PORTAL": { + "BUTTON": "Delete {portalName}", + "HEADER": "Delete portal", + "DESCRIPTION": "Permanently delete this portal. This action is irreversible", + "DIALOG": { + "HEADER": "Sure you want to delete {portalName}?", + "DESCRIPTION": "This is a permanent action that cannot be reversed.", + "CONFIRM_BUTTON_LABEL": "Delete" + } + }, + "EDIT_CONFIGURATION": "Edit configuration" + }, + "LAYOUT_CONTENT": { + "HEADER": "Appearance", + "DESCRIPTION": "Pick the layout that fits how your visitors read.", + "LAYOUT": { + "CLASSIC": { + "TITLE": "Classic", + "DESCRIPTION": "A welcoming home page with search and featured topics." + }, + "SIDEBAR": { + "TITLE": "Documentation", + "DESCRIPTION": "Side-by-side navigation that keeps every guide a click away." + } + }, + "SOCIAL_LINKS": { + "HEADER": "Social links", + "DESCRIPTION": "Add the handle for each network and your help center builds the full link. Shown in the documentation layout footer.", + "PLACEHOLDER": "handle", + "ADD": "Add social link", + "REMOVE": "Remove" + }, + "SAVE": "Save changes" + }, + "API": { + "CREATE_PORTAL": { + "SUCCESS_MESSAGE": "Portal created successfully", + "ERROR_MESSAGE": "Unable to create portal" + }, + "UPDATE_PORTAL": { + "SUCCESS_MESSAGE": "Portal updated successfully", + "ERROR_MESSAGE": "Unable to update portal" + } + } + }, + "PDF_UPLOAD": { + "TITLE": "Upload PDF Document", + "DESCRIPTION": "Upload a PDF document to automatically generate FAQs using AI", + "DRAG_DROP_TEXT": "Drag and drop your PDF file here, or click to select", + "SELECT_FILE": "Select PDF File", + "ADDITIONAL_CONTEXT_LABEL": "Additional Context (Optional)", + "ADDITIONAL_CONTEXT_PLACEHOLDER": "Provide any additional context or instructions for FAQ generation...", + "UPLOADING": "Yuklanmoqda...", + "UPLOAD": "Upload & Process", + "CANCEL": "Cancel", + "ERROR_INVALID_TYPE": "Please select a valid PDF file", + "ERROR_FILE_TOO_LARGE": "File size must be less than 512MB", + "ERROR_UPLOAD_FAILED": "Failed to upload PDF. Please try again." + }, + "PDF_DOCUMENTS": { + "TITLE": "PDF Documents", + "DESCRIPTION": "Manage uploaded PDF documents and generate FAQs from them", + "UPLOAD_PDF": "Upload PDF", + "UPLOAD_FIRST_PDF": "Upload your first PDF", + "UPLOADED_BY": "Uploaded by", + "GENERATE_FAQS": "Generate FAQs", + "GENERATING": "Generating...", + "CONFIRM_DELETE": "Are you sure you want to delete {filename}?", + "EMPTY_STATE": { + "TITLE": "No PDF documents yet", + "DESCRIPTION": "Upload PDF documents to automatically generate FAQs using AI" + }, + "STATUS": { + "UPLOADED": "Ready", + "PROCESSING": "Processing", + "PROCESSED": "Completed", + "FAILED": "Failed" + } + }, + "CONTENT_GENERATION": { + "TITLE": "Content Generation", + "DESCRIPTION": "Upload PDF documents to automatically generate FAQ content using AI", + "UPLOAD_TITLE": "Upload PDF Document", + "DRAG_DROP": "Drag and drop your PDF file here, or click to select", + "SELECT_FILE": "Select PDF File", + "UPLOADING": "Processing document...", + "UPLOAD_SUCCESS": "Document processed successfully!", + "UPLOAD_ERROR": "Failed to upload document. Please try again.", + "INVALID_FILE_TYPE": "Please select a valid PDF file", + "FILE_TOO_LARGE": "File size must be less than 512MB", + "GENERATED_CONTENT": "Generated FAQ Content", + "PUBLISH_SELECTED": "Publish Selected", + "PUBLISHING": "Publishing...", + "FROM_DOCUMENT": "From document", + "NO_CONTENT": "No generated content available. Upload a PDF document to get started.", + "LOADING": "Loading generated content..." + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/inbox.json b/app/javascript/dashboard/i18n/locale/uz/inbox.json new file mode 100644 index 000000000..385e9e4ce --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/inbox.json @@ -0,0 +1,95 @@ +{ + "INBOX": { + "LIST": { + "TITLE": "My Inbox", + "DISPLAY_DROPDOWN": "Display", + "LOADING": "Fetching notifications", + "404": "There are no active notifications in this group.", + "NO_NOTIFICATIONS": "No notifications", + "NOTE": "Notifications from all subscribed inboxes", + "NO_MESSAGES_AVAILABLE": "Oops! Not able to fetch messages", + "SNOOZED_UNTIL": "Snoozed until", + "SNOOZED_UNTIL_TOMORROW": "Snoozed until tomorrow", + "SNOOZED_UNTIL_NEXT_WEEK": "Snoozed until next week" + }, + "ACTION_HEADER": { + "SNOOZE": "Snooze notification", + "DELETE": "Delete notification", + "BACK": "Back" + }, + "TYPES": { + "CONVERSATION_MENTION": "You have been mentioned in a conversation", + "CONVERSATION_CREATION": "New conversation created", + "CONVERSATION_ASSIGNMENT": "A conversation has been assigned to you", + "ASSIGNED_CONVERSATION_NEW_MESSAGE": "New message in an assigned conversation", + "PARTICIPATING_CONVERSATION_NEW_MESSAGE": "New message in a conversation you are participating in", + "SLA_MISSED_FIRST_RESPONSE": "SLA target first response missed for conversation", + "SLA_MISSED_NEXT_RESPONSE": "SLA target next response missed for conversation", + "SLA_MISSED_RESOLUTION": "SLA target resolution missed for conversation" + }, + "TYPES_NEXT": { + "CONVERSATION_MENTION": "Mentioned", + "CONVERSATION_ASSIGNMENT": "Assigned to you", + "CONVERSATION_CREATION": "New Conversation", + "SLA_MISSED_FIRST_RESPONSE": "SLA breach", + "SLA_MISSED_NEXT_RESPONSE": "SLA breach", + "SLA_MISSED_RESOLUTION": "SLA breach", + "PARTICIPATING_CONVERSATION_NEW_MESSAGE": "New message", + "ASSIGNED_CONVERSATION_NEW_MESSAGE": "New message", + "SNOOZED_UNTIL": "Snoozed for {time}", + "SNOOZED_ENDS": "Snooze ended" + }, + "NO_CONTENT": "No content available", + "MENU_ITEM": { + "MARK_AS_READ": "Mark as read", + "MARK_AS_UNREAD": "Mark as unread", + "SNOOZE": "Snooze", + "DELETE": "Delete", + "MARK_ALL_READ": "Mark all as read", + "DELETE_ALL": "Delete all", + "DELETE_ALL_READ": "Delete all read" + }, + "DISPLAY_MENU": { + "SORT": "Sort", + "DISPLAY": "Display :", + "SORT_OPTIONS": { + "NEWEST": "Newest", + "OLDEST": "Oldest", + "PRIORITY": "Priority" + }, + "DISPLAY_OPTIONS": { + "SNOOZED": "Snoozed", + "READ": "Read", + "LABELS": "Labels", + "CONVERSATION_ID": "Conversation ID" + } + }, + "ALERTS": { + "MARK_AS_READ": "Notification marked as read", + "MARK_AS_UNREAD": "Notification marked as unread", + "SNOOZE": "Notification snoozed", + "DELETE": "Notification deleted", + "MARK_ALL_READ": "All notifications marked as read", + "DELETE_ALL": "All notifications deleted", + "DELETE_ALL_READ": "All read notifications deleted" + }, + "REAUTHORIZE": { + "TITLE": "Reauthorization Required", + "DESCRIPTION": "Your WhatsApp connection has expired. Please reconnect to continue receiving and sending messages.", + "BUTTON_TEXT": "Reconnect WhatsApp", + "LOADING_FACEBOOK": "Loading Facebook SDK...", + "SUCCESS": "WhatsApp reconnected successfully", + "ERROR": "Failed to reconnect WhatsApp. Please try again.", + "WHATSAPP_APP_ID_MISSING": "WhatsApp App ID is not configured. Please contact your administrator.", + "WHATSAPP_CONFIG_ID_MISSING": "WhatsApp Configuration ID is not configured. Please contact your administrator.", + "CONFIGURATION_ERROR": "Configuration error occurred during reauthorization.", + "FACEBOOK_LOAD_ERROR": "Failed to load Facebook SDK. Please try again.", + "TROUBLESHOOTING": { + "TITLE": "Troubleshooting", + "POPUP_BLOCKED": "Ensure pop-ups are allowed for this site", + "COOKIES": "Third-party cookies must be enabled", + "ADMIN_ACCESS": "You need admin access to the WhatsApp Business Account" + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/uz/inboxMgmt.json new file mode 100644 index 000000000..e2b257980 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/inboxMgmt.json @@ -0,0 +1,1282 @@ +{ + "INBOX_MGMT": { + "HEADER": "Inboxes", + "DESCRIPTION": "A channel is the mode of communication your customer chooses to interact with you. An inbox is where you manage interactions for a specific channel. It can include communications from various sources such as email, live chat, and social media.", + "LEARN_MORE": "Learn more about inboxes", + "COUNT": "{n} inbox | {n} inboxes", + "SEARCH_PLACEHOLDER": "Search inboxes...", + "NO_RESULTS": "No inboxes found matching your search", + "RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.", + "CLICK_TO_RECONNECT": "Click here to reconnect.", + "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.", + "COMPLETE_REGISTRATION": "Complete Registration", + "LIST": { + "404": "There are no inboxes attached to this account." + }, + "CREATE_FLOW": { + "CHANNEL": { + "TITLE": "Choose Channel", + "BODY": "Choose the provider you want to integrate with Chatwoot." + }, + "INBOX": { + "TITLE": "Create Inbox", + "BODY": "Authenticate your account and create an inbox." + }, + "AGENT": { + "TITLE": "Add Agents", + "BODY": "Add agents to the created inbox." + }, + "FINISH": { + "TITLE": "Voilà!", + "BODY": "You are all set to go!" + } + }, + "ADD": { + "CHANNEL_NAME": { + "LABEL": "Inbox Name", + "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)", + "ERROR": "Please enter a valid inbox name" + }, + "WEBSITE_NAME": { + "LABEL": "Website Name", + "PLACEHOLDER": "Enter your website name (eg: Acme Inc)" + }, + "FB": { + "HELP": "PS: By signing in, we only get access to your Page's messages. Your private messages can never be accessed by Chatwoot.", + "CHOOSE_PAGE": "Choose Page", + "CHOOSE_PLACEHOLDER": "Select a page from the list", + "INBOX_NAME": "Inbox Name", + "ADD_NAME": "Add a name for your inbox", + "PICK_NAME": "Pick a Name for your Inbox", + "PICK_A_VALUE": "Pick a value", + "CREATE_INBOX": "Create Inbox" + }, + "INSTAGRAM": { + "CONTINUE_WITH_INSTAGRAM": "Continue with Instagram", + "CONNECT_YOUR_INSTAGRAM_PROFILE": "Connect your Instagram Profile", + "HELP": "To add your Instagram profile as a channel, you need to authenticate your Instagram Profile by clicking on 'Continue with Instagram' ", + "ERROR_MESSAGE": "There was an error connecting to Instagram, please try again", + "ERROR_AUTH": "There was an error connecting to Instagram, please try again", + "NEW_INBOX_SUGGESTION": "This Instagram account was previously linked to a different inbox and has now been migrated here. All new messages will appear here. The old inbox will no longer be able to send or receive messages for this account.", + "DUPLICATE_INBOX_BANNER": "This Instagram account was migrated to the new Instagram channel inbox. You won’t be able to send/receive Instagram messages from this inbox anymore.", + "SETTINGS_RESTRICTED_WARNING": "Instagram is currently restricted. Some messages or actions may be delayed or unavailable while we restore full support.", + "STATUS_LINK": "View status update" + }, + "TIKTOK": { + "CONTINUE_WITH_TIKTOK": "Continue with TikTok", + "CONNECT_YOUR_TIKTOK_PROFILE": "Connect your TikTok Profile", + "HELP": "To add your TikTok profile as a channel, you need to authenticate your TikTok Profile by clicking on 'Continue with TikTok' ", + "ERROR_MESSAGE": "There was an error connecting to TikTok, please try again", + "ERROR_AUTH": "There was an error connecting to TikTok, please try again", + "NORTH_AMERICA_WARNING": "TikTok connections for North American accounts are temporarily unavailable while we wait for an update from the TikTok team." + }, + "TWITTER": { + "HELP": "To add your Twitter profile as a channel, you need to authenticate your Twitter Profile by clicking on 'Sign in with Twitter' ", + "ERROR_MESSAGE": "There was an error connecting to Twitter, please try again", + "TWEETS": { + "ENABLE": "Create conversations from mentioned Tweets" + } + }, + "WEBSITE_CHANNEL": { + "TITLE": "Website channel", + "DESC": "Create a channel for your website and start supporting your customers via our website widget.", + "LOADING_MESSAGE": "Creating Website Support Channel", + "CHANNEL_AVATAR": { + "LABEL": "Channel Avatar" + }, + "CHANNEL_WEBHOOK_URL": { + "LABEL": "Webhook URL", + "PLACEHOLDER": "Please enter your Webhook URL", + "ERROR": "Please enter a valid URL" + }, + "CHANNEL_WEBHOOK_SECRET": { + "LABEL": "Webhook Secret", + "COPY": "Copy secret to clipboard", + "COPY_SUCCESS": "Secret copied to clipboard", + "TOGGLE": "Toggle secret visibility", + "RESET_SUCCESS": "Webhook secret regenerated successfully", + "RESET_ERROR": "Unable to regenerate webhook secret. Please try again" + }, + "CHANNEL_DOMAIN": { + "LABEL": "Website Domain", + "PLACEHOLDER": "Enter your website domain (eg: acme.com)" + }, + "CHANNEL_WELCOME_TITLE": { + "LABEL": "Welcome Heading", + "PLACEHOLDER": "Hi there !" + }, + "CHANNEL_WELCOME_TAGLINE": { + "LABEL": "Welcome Tagline", + "PLACEHOLDER": "We make it simple to connect with us. Ask us anything, or share your feedback." + }, + "CHANNEL_GREETING_MESSAGE": { + "LABEL": "Channel greeting message", + "PLACEHOLDER": "Acme Inc typically replies in a few hours." + }, + "CHANNEL_GREETING_TOGGLE": { + "LABEL": "Enable channel greeting", + "HELP_TEXT": "Auto-send greeting messages when customers start a conversation and send their first message.", + "ENABLED": "Enabled", + "DISABLED": "Disabled" + }, + "REPLY_TIME": { + "TITLE": "Set Reply time", + "IN_A_FEW_MINUTES": "In a few minutes", + "IN_A_FEW_HOURS": "In a few hours", + "IN_A_DAY": "In a day", + "HELP_TEXT": "This reply time will be displayed on the live chat widget" + }, + "WIDGET_COLOR": { + "LABEL": "Widget Color", + "PLACEHOLDER": "Update the widget color used in widget" + }, + "SUBMIT_BUTTON": "Create inbox", + "API": { + "ERROR_MESSAGE": "We were not able to create a website channel, please try again" + } + }, + "TWILIO": { + "TITLE": "Twilio SMS/WhatsApp Channel", + "DESC": "Integrate Twilio and start supporting your customers via SMS or WhatsApp.", + "ACCOUNT_SID": { + "LABEL": "Account SID", + "PLACEHOLDER": "Please enter your Twilio Account SID", + "ERROR": "This field is required" + }, + "API_KEY": { + "USE_API_KEY": "Use API Key Authentication", + "LABEL": "API Key SID", + "PLACEHOLDER": "Please enter your API Key SID", + "ERROR": "This field is required" + }, + "API_KEY_SECRET": { + "LABEL": "API Key Secret", + "PLACEHOLDER": "Please enter your API Key Secret", + "ERROR": "This field is required" + }, + "MESSAGING_SERVICE_SID": { + "LABEL": "Messaging Service SID", + "PLACEHOLDER": "Please enter your Twilio Messaging Service SID", + "ERROR": "This field is required", + "USE_MESSAGING_SERVICE": "Use a Twilio Messaging Service" + }, + "CHANNEL_TYPE": { + "LABEL": "Channel Type", + "ERROR": "Please select your Channel Type" + }, + "AUTH_TOKEN": { + "LABEL": "Auth Token", + "PLACEHOLDER": "Please enter your Twilio Auth Token", + "ERROR": "This field is required" + }, + "CHANNEL_NAME": { + "LABEL": "Inbox Name", + "PLACEHOLDER": "Please enter a inbox name", + "ERROR": "This field is required" + }, + "PHONE_NUMBER": { + "LABEL": "Phone Number", + "PLACEHOLDER": "Please enter the phone number from which message will be sent.", + "ERROR": "Please provide a valid phone number that starts with a `+` sign and does not contain any spaces." + }, + "API_CALLBACK": { + "TITLE": "Callback URL", + "SUBTITLE": "You have to configure the message callback URL in Twilio with the URL mentioned here." + }, + "SUBMIT_BUTTON": "Create Twilio Channel", + "API": { + "ERROR_MESSAGE": "We were not able to authenticate Twilio credentials, please try again" + } + }, + "SMS": { + "TITLE": "SMS Channel", + "DESC": "Start supporting your customers via SMS.", + "PROVIDERS": { + "LABEL": "API Provider", + "TWILIO": "Twilio", + "BANDWIDTH": "Bandwidth" + }, + "API": { + "ERROR_MESSAGE": "We were not able to save the SMS channel" + }, + "BANDWIDTH": { + "ACCOUNT_ID": { + "LABEL": "Account ID", + "PLACEHOLDER": "Please enter your Bandwidth Account ID", + "ERROR": "This field is required" + }, + "API_KEY": { + "LABEL": "API Key", + "PLACEHOLDER": "Please enter your Bandwidth API Key", + "ERROR": "This field is required" + }, + "API_SECRET": { + "LABEL": "API Secret", + "PLACEHOLDER": "Please enter your Bandwidth API Secret", + "ERROR": "This field is required" + }, + "APPLICATION_ID": { + "LABEL": "Application ID", + "PLACEHOLDER": "Please enter your Bandwidth Application ID", + "ERROR": "This field is required" + }, + "INBOX_NAME": { + "LABEL": "Inbox Name", + "PLACEHOLDER": "Please enter a inbox name", + "ERROR": "This field is required" + }, + "PHONE_NUMBER": { + "LABEL": "Phone number", + "PLACEHOLDER": "Please enter the phone number from which message will be sent.", + "ERROR": "Please provide a valid phone number that starts with a `+` sign and does not contain any spaces." + }, + "SUBMIT_BUTTON": "Create Bandwidth Channel", + "API": { + "ERROR_MESSAGE": "We were not able to authenticate Bandwidth credentials, please try again" + }, + "API_CALLBACK": { + "TITLE": "Callback URL", + "SUBTITLE": "You have to configure the message callback URL in Bandwidth with the URL mentioned here." + } + } + }, + "WHATSAPP": { + "TITLE": "WhatsApp Channel", + "DESC": "Start supporting your customers via WhatsApp.", + "PROVIDERS": { + "LABEL": "API Provider", + "WHATSAPP_EMBEDDED": "WhatsApp Business", + "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", + "WHATSAPP_CLOUD_DESC": "Quick setup through Meta", + "TWILIO_DESC": "Connect via Twilio credentials", + "360_DIALOG": "360Dialog" + }, + "SELECT_PROVIDER": { + "TITLE": "Select your API provider", + "DESCRIPTION": "Choose your WhatsApp provider. You can connect directly through Meta which requires no setup, or connect through Twilio using your account credentials." + }, + "INBOX_NAME": { + "LABEL": "Inbox Name", + "PLACEHOLDER": "Please enter an inbox name", + "ERROR": "This field is required" + }, + "PHONE_NUMBER": { + "LABEL": "Phone number", + "PLACEHOLDER": "Please enter the phone number from which message will be sent.", + "ERROR": "Please provide a valid phone number that starts with a `+` sign and does not contain any spaces." + }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for Facebook webhooks.", + "ERROR": "Please enter a valid value." + }, + "API_KEY": { + "LABEL": "API key", + "SUBTITLE": "Configure the WhatsApp API key.", + "PLACEHOLDER": "API key", + "ERROR": "Please enter a valid value." + }, + "API_CALLBACK": { + "TITLE": "Callback URL", + "SUBTITLE": "You have to configure the webhook URL and the verification token in the Facebook Developer portal with the values shown below.", + "WEBHOOK_URL": "Webhook URL", + "WEBHOOK_VERIFICATION_TOKEN": "Webhook Verification Token" + }, + "SUBMIT_BUTTON": "Create WhatsApp Channel", + "EMBEDDED_SIGNUP": { + "TITLE": "Quick setup with Meta", + "DESC": "Use the WhatsApp Embedded Signup flow to quickly connect new numbers. You will be redirected to Meta to log into your WhatsApp Business account. Having admin access will help make the setup smooth and easy.", + "BENEFITS": { + "TITLE": "Benefits of Embedded Signup:", + "EASY_SETUP": "No manual configuration required", + "SECURE_AUTH": "Secure OAuth based authentication", + "AUTO_CONFIG": "Automatic webhook and phone number configuration" + }, + "LEARN_MORE": { + "TEXT": "To learn more about integrated signup, pricing, and limitations, visit {link}.", + "LINK_TEXT": "this link" + }, + "SUBMIT_BUTTON": "Connect with WhatsApp Business", + "AUTH_PROCESSING": "Authenticating with Meta", + "WAITING_FOR_BUSINESS_INFO": "Please complete business setup in the Meta window...", + "PROCESSING": "Setting up your WhatsApp Business Account", + "ENABLING_CALLING": "Enabling WhatsApp Calling on your number…", + "LOADING_SDK": "Loading Facebook SDK...", + "CANCELLED": "WhatsApp Signup was cancelled", + "SUCCESS_TITLE": "WhatsApp Business Account Connected!", + "WAITING_FOR_AUTH": "Waiting for authentication...", + "INVALID_BUSINESS_DATA": "Invalid business data received from Facebook. Please try again.", + "SIGNUP_ERROR": "Signup error occurred", + "AUTH_NOT_COMPLETED": "Authentication not completed. Please restart the process.", + "SUCCESS_FALLBACK": "WhatsApp Business Account has been successfully configured", + "MANUAL_FALLBACK": "If your number is already connected to the WhatsApp Business Platform (API), or if you’re a tech provider onboarding your own number, please use the {link} flow", + "MANUAL_LINK_TEXT": "manual setup flow", + "CALLING_ENABLE_FAILED": "Your WhatsApp inbox is ready, but voice calling couldn't be turned on — this number isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then turn calling on from the inbox's Calls settings." + }, + "API": { + "ERROR_MESSAGE": "We were not able to save the WhatsApp channel" + } + }, + "VOICE": { + "TITLE": "Voice Channel", + "DESC": "Integrate Twilio Voice and start supporting your customers via phone calls.", + "PHONE_NUMBER": { + "LABEL": "Phone Number", + "PLACEHOLDER": "Enter your phone number (e.g. +1234567890)", + "ERROR": "Please provide a valid phone number in E.164 format (e.g. +1234567890)" + }, + "TWILIO": { + "ACCOUNT_SID": { + "LABEL": "Account SID", + "PLACEHOLDER": "Enter your Twilio Account SID", + "REQUIRED": "Account SID is required" + }, + "AUTH_TOKEN": { + "LABEL": "Auth Token", + "PLACEHOLDER": "Enter your Twilio Auth Token", + "REQUIRED": "Auth Token is required" + }, + "API_KEY_SID": { + "LABEL": "API Key SID", + "PLACEHOLDER": "Enter your Twilio API Key SID", + "REQUIRED": "API Key SID is required" + }, + "API_KEY_SECRET": { + "LABEL": "API Key Secret", + "PLACEHOLDER": "Enter your Twilio API Key Secret", + "REQUIRED": "API Key Secret is required" + } + }, + "CONFIGURATION": { + "TWILIO_VOICE_URL_TITLE": "Twilio Voice URL", + "TWILIO_VOICE_URL_SUBTITLE": "Configure this URL as the Voice URL on your Twilio phone number and TwiML App.", + "TWILIO_STATUS_URL_TITLE": "Twilio Status Callback URL", + "TWILIO_STATUS_URL_SUBTITLE": "Configure this URL as the Status Callback URL on your Twilio phone number." + }, + "SUBMIT_BUTTON": "Create Voice Channel", + "API": { + "ERROR_MESSAGE": "We were not able to create the voice channel" + } + }, + "API_CHANNEL": { + "TITLE": "API Channel", + "DESC": "Integrate with API channel and start supporting your customers.", + "CHANNEL_NAME": { + "LABEL": "Channel Name", + "PLACEHOLDER": "Please enter a channel name", + "ERROR": "This field is required" + }, + "WEBHOOK_URL": { + "LABEL": "Webhook URL", + "SUBTITLE": "Configure the URL where you want to receive callbacks on events.", + "PLACEHOLDER": "Webhook URL" + }, + "SUBMIT_BUTTON": "Create API Channel", + "API": { + "ERROR_MESSAGE": "We were not able to save the api channel" + } + }, + "EMAIL_CHANNEL": { + "TITLE": "Email Channel", + "DESC": "Integrate your email inbox.", + "CHANNEL_NAME": { + "LABEL": "Channel Name", + "PLACEHOLDER": "Please enter a channel name", + "ERROR": "This field is required" + }, + "EMAIL": { + "LABEL": "Email", + "SUBTITLE": "Provide the email address where your customers send support requests.", + "PLACEHOLDER": "Email" + }, + "SUBMIT_BUTTON": "Create Email Channel", + "API": { + "ERROR_MESSAGE": "We were not able to save the email channel" + }, + "FINISH_MESSAGE": "Your email inbox has been created successfully! You can start forwarding your emails to the address below, or configure SMTP and IMAP credentials to send and receive emails directly.", + "FINISH_MESSAGE_NO_FORWARDING": "Your email inbox has been created successfully! You need to configure SMTP and IMAP credentials to send and receive emails. Without these settings, no emails will be processed.", + "FORWARDING_ADDRESS_LABEL": "Forward emails to this address:", + "CONFIGURE_SMTP_IMAP_LINK": "Click here", + "CONFIGURE_SMTP_IMAP_TEXT": " to configure IMAP and SMTP settings" + }, + "LINE_CHANNEL": { + "TITLE": "LINE Channel", + "DESC": "Integrate with LINE channel and start supporting your customers.", + "CHANNEL_NAME": { + "LABEL": "Channel Name", + "PLACEHOLDER": "Please enter a channel name", + "ERROR": "This field is required" + }, + "LINE_CHANNEL_ID": { + "LABEL": "LINE Channel ID", + "PLACEHOLDER": "LINE Channel ID" + }, + "LINE_CHANNEL_SECRET": { + "LABEL": "LINE Channel Secret", + "PLACEHOLDER": "LINE Channel Secret" + }, + "LINE_CHANNEL_TOKEN": { + "LABEL": "LINE Channel Token", + "PLACEHOLDER": "LINE Channel Token" + }, + "SUBMIT_BUTTON": "Create LINE Channel", + "API": { + "ERROR_MESSAGE": "We were not able to save the LINE channel" + }, + "API_CALLBACK": { + "TITLE": "Callback URL", + "SUBTITLE": "You have to configure the webhook URL in LINE application with the URL mentioned here." + } + }, + "TELEGRAM_CHANNEL": { + "TITLE": "Telegram Channel", + "DESC": "Integrate with Telegram channel and start supporting your customers.", + "BOT_TOKEN": { + "LABEL": "Bot Token", + "SUBTITLE": "Configure the bot token you have obtained from Telegram BotFather.", + "PLACEHOLDER": "Bot Token" + }, + "SUBMIT_BUTTON": "Create Telegram Channel", + "API": { + "ERROR_MESSAGE": "We were not able to save the telegram channel" + } + }, + "AUTH": { + "TITLE": "Choose a channel", + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below.", + "TITLE_NEXT": "Complete the setup", + "TITLE_FINISH": "Voilà!", + "CHANNEL": { + "WEBSITE": { + "TITLE": "Website", + "DESCRIPTION": "Create a live-chat widget" + }, + "FACEBOOK": { + "TITLE": "Facebook", + "DESCRIPTION": "Connect your Facebook page" + }, + "WHATSAPP": { + "TITLE": "WhatsApp", + "DESCRIPTION": "Support your customers on WhatsApp" + }, + "WHATSAPP_CALL": { + "TITLE": "WhatsApp Call", + "DESCRIPTION": "Take voice calls on your WhatsApp number" + }, + "EMAIL": { + "TITLE": "Email", + "DESCRIPTION": "Connect with Gmail, Outlook, or other providers" + }, + "SMS": { + "TITLE": "SMS", + "DESCRIPTION": "Integrate SMS channel with Twilio or bandwidth" + }, + "API": { + "TITLE": "API", + "DESCRIPTION": "Make a custom channel using our API" + }, + "TELEGRAM": { + "TITLE": "Telegram", + "DESCRIPTION": "Configure Telegram channel using Bot token" + }, + "LINE": { + "TITLE": "Line", + "DESCRIPTION": "Integrate your Line channel" + }, + "INSTAGRAM": { + "TITLE": "Instagram", + "DESCRIPTION": "Connect your instagram account" + }, + "TIKTOK": { + "TITLE": "TikTok", + "DESCRIPTION": "Connect your TikTok account" + }, + "VOICE": { + "TITLE": "Voice", + "DESCRIPTION": "Integrate with Twilio Voice" + } + } + }, + "AGENTS": { + "TITLE": "Agents", + "DESC": "Here you can add agents to manage your newly created inbox. Only these selected agents will have access to your inbox. Agents which are not part of this inbox will not be able to see or respond to messages in this inbox when they login.Webhooks
Webhooks are HTTP callbacks which can be defined for every account. They are triggered by events like message creation in Chatwoot. You can create more than one webhook for this account.
For creating a webhook, click on the Add new webhook button. You can also remove any existing webhook by clicking on the Delete button.
Dashboard Apps
Dashboard Apps allow organizations to embed an application inside the Chatwoot dashboard to provide the context for customer support agents. This feature allows you to create an application independently and embed that inside the dashboard to provide user information, their orders, or their previous payment history.
When you embed your application using the dashboard in Chatwoot, your application will get the context of the conversation and contact as a window event. Implement a listener for the message event on your page to receive the context.
To add a new dashboard app, click on the button 'Add a new dashboard app'.
", + "DESCRIPTION": "Dashboard Apps allow organizations to embed an application inside the dashboard to provide the context for customer support agents. This feature allows you to create an application independently and embed that to provide user information, their orders, or their previous payment history.", + "LEARN_MORE": "Learn more about Dashboard Apps", + "COUNT": "{n} dashboard app | {n} dashboard apps", + "SEARCH_PLACEHOLDER": "Search dashboard apps...", + "NO_RESULTS": "No dashboard apps found matching your search", + "LIST": { + "404": "There are no dashboard apps configured on this account yet", + "LOADING": "Fetching dashboard apps...", + "TABLE_HEADER": { + "NAME": "Name", + "ENDPOINT": "Endpoint", + "ACTIONS": "Actions" + }, + "EDIT_TOOLTIP": "Edit app", + "DELETE_TOOLTIP": "Delete app" + }, + "FORM": { + "TITLE_LABEL": "Name", + "TITLE_PLACEHOLDER": "Enter a name for your dashboard app", + "TITLE_ERROR": "A name for the dashboard app is required", + "URL_LABEL": "Endpoint", + "URL_PLACEHOLDER": "Enter the endpoint URL where your app is hosted", + "URL_ERROR": "A valid URL is required" + }, + "CREATE": { + "HEADER": "Add a new dashboard app", + "FORM_SUBMIT": "Submit", + "FORM_CANCEL": "Cancel", + "API_SUCCESS": "Dashboard app configured successfully", + "API_ERROR": "We couldn't create an app. Please try again later" + }, + "UPDATE": { + "HEADER": "Edit dashboard app", + "FORM_SUBMIT": "Update", + "FORM_CANCEL": "Cancel", + "API_SUCCESS": "Dashboard app updated successfully", + "API_ERROR": "We couldn't update the app. Please try again later" + }, + "DELETE": { + "CONFIRM_YES": "Yes, delete it", + "CONFIRM_NO": "No, keep it", + "TITLE": "Confirm deletion", + "MESSAGE": "Are you sure to delete the app - {appName}?", + "API_SUCCESS": "Dashboard app deleted successfully", + "API_ERROR": "We couldn't delete the app. Please try again later" + } + }, + "LINEAR": { + "HEADER": "Linear", + "ADD_OR_LINK_BUTTON": "Create/Link Linear Issue", + "LOADING": "Fetching linear issues...", + "LOADING_ERROR": "There was an error fetching the linear issues, please try again", + "CREATE": "Create", + "LINK": { + "SEARCH": "Search issues", + "SELECT": "Select issue", + "TITLE": "Link", + "EMPTY_LIST": "No linear issues found", + "LOADING": "Loading", + "ERROR": "There was an error fetching the linear issues, please try again", + "LINK_SUCCESS": "Issue linked successfully", + "LINK_ERROR": "There was an error linking the issue, please try again", + "LINK_TITLE": "Conversation (#{conversationId}) with {name}" + }, + "ADD_OR_LINK": { + "TITLE": "Create/link linear issue", + "DESCRIPTION": "Create Linear issues from conversations, or link existing ones for seamless tracking.", + "FORM": { + "TITLE": { + "LABEL": "Title", + "PLACEHOLDER": "Enter title", + "REQUIRED_ERROR": "Title is required" + }, + "DESCRIPTION": { + "LABEL": "Description", + "PLACEHOLDER": "Enter description" + }, + "TEAM": { + "LABEL": "Team", + "PLACEHOLDER": "Select team", + "SEARCH": "Search team", + "REQUIRED_ERROR": "Team is required" + }, + "ASSIGNEE": { + "LABEL": "Assignee", + "PLACEHOLDER": "Select assignee", + "SEARCH": "Search assignee" + }, + "PRIORITY": { + "LABEL": "Priority", + "PLACEHOLDER": "Select priority", + "SEARCH": "Search priority" + }, + "LABEL": { + "LABEL": "Label", + "PLACEHOLDER": "Select label", + "SEARCH": "Search label" + }, + "STATUS": { + "LABEL": "Status", + "PLACEHOLDER": "Select status", + "SEARCH": "Search status" + }, + "PROJECT": { + "LABEL": "Project", + "PLACEHOLDER": "Select project", + "SEARCH": "Search project" + } + }, + "CREATE": "Create", + "CANCEL": "Cancel", + "CREATE_SUCCESS": "Issue created successfully", + "CREATE_ERROR": "There was an error creating the issue, please try again", + "LOADING_TEAM_ERROR": "There was an error fetching the teams, please try again", + "LOADING_TEAM_ENTITIES_ERROR": "There was an error fetching the team entities, please try again" + }, + "ISSUE": { + "STATUS": "Status", + "PRIORITY": "Priority", + "ASSIGNEE": "Assignee", + "LABELS": "Labels", + "CREATED_AT": "Created at {createdAt}" + }, + "UNLINK": { + "TITLE": "Unlink", + "SUCCESS": "Issue unlinked successfully", + "ERROR": "There was an error unlinking the issue, please try again" + }, + "NO_LINKED_ISSUES": "No linked issues found", + "DELETE": { + "TITLE": "Are you sure you want to delete the integration?", + "MESSAGE": "Are you sure you want to delete the integration?", + "CONFIRM": "Yes, delete", + "CANCEL": "Cancel" + }, + "CTA": { + "TITLE": "Connect to Linear", + "AGENT_DESCRIPTION": "Linear workspace is not connected. Request your administrator to connect a workspace to use this integration.", + "DESCRIPTION": "Linear workspace is not connected. Click the button below to connect your workspace to use this integration.", + "BUTTON_TEXT": "Connect Linear workspace" + } + }, + "NOTION": { + "HEADER": "Notion", + "DELETE": { + "TITLE": "Are you sure you want to delete the Notion integration?", + "MESSAGE": "Deleting this integration will remove access to your Notion workspace and stop all related functionality.", + "CONFIRM": "Yes, delete", + "CANCEL": "Cancel" + } + } + }, + "CAPTAIN": { + "NAME": "Captain", + "HEADER_KNOW_MORE": "Know more", + "OVERVIEW": { + "HEADER": "Overview", + "WELCOME": { + "LABEL": "Captain summary", + "LOADING": "Generating summary…" + }, + "INBOX_BANNER": { + "TEXT": "This assistant isn't connected to any inbox yet, so it won't respond to conversations.", + "ACTION": "Connect inbox", + "DISMISS": "Dismiss" + }, + "COVERAGE_BANNER": { + "TEXT": "{count} FAQs are pending review, keeping coverage at {coverage}%. Approve them so your assistant can resolve more on its own.", + "ACTION": "Review FAQs", + "DISMISS": "Dismiss" + }, + "RANGES": { + "LAST_DAYS": "Last {count} days", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month" + }, + "METRICS": { + "HANDLED": { + "LABEL": "Conversations handled", + "HINT": "Distinct conversations this assistant replied in." + }, + "AUTO_RESOLUTION": { + "LABEL": "Auto-resolution rate", + "HINT": "Share of handled conversations closed without a human reply." + }, + "HANDOFF": { + "LABEL": "Handoff rate", + "HINT": "Share of handled conversations escalated to a human agent." + }, + "HOURS_SAVED": { + "LABEL": "Time saved", + "HINT": "Estimate: Captain replies times ~2 minutes of assumed agent effort per reply. Directional, not measured labor." + }, + "REOPEN": { + "LABEL": "Reopen rate", + "HINT": "Auto-resolved conversations that were reopened afterwards." + }, + "DEPTH": { + "LABEL": "Messages / conversation", + "HINT": "Average replies the assistant sends per conversation." + } + }, + "DRILLDOWN": { + "CLOSE": "Close details", + "EMPTY": "No records found for this metric.", + "ERROR": "Could not load records. Please try again.", + "LOAD_MORE": "Load more", + "RESULT_COUNT_CONVERSATION": "{count} conversation | {count} conversations" + }, + "KNOWLEDGE": { + "TITLE": "Knowledge coverage", + "COVERAGE": "{pct}% approved", + "APPROVED": "Approved FAQs", + "PENDING": "Pending FAQs", + "DOCUMENTS": "Documents" + }, + "LINKS": { + "DOCS": { + "TITLE": "Captain docs", + "DESCRIPTION": "Guides and how-tos for Captain" + }, + "PLAYGROUND": { + "TITLE": "Playground", + "DESCRIPTION": "Test this assistant's replies" + }, + "BILLING": { + "TITLE": "Billing", + "DESCRIPTION": "Manage credits and plan" + } + } + }, + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant", + "EMPTY_LIST": "No assistants found, please create one to get started" + }, + "COPILOT": { + "TITLE": "Copilot", + "TRY_THESE_PROMPTS": "Try these prompts", + "PANEL_TITLE": "Get started with Copilot", + "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.", + "SEND_MESSAGE": "Send message...", + "EMPTY_MESSAGE": "There was an error generating the response. Please try again.", + "LOADER": "Captain is thinking", + "YOU": "Siz", + "USE": "Use this", + "RESET": "Reset", + "SHOW_STEPS": "Show steps", + "SELECT_ASSISTANT": "Select Assistant", + "PROMPTS": { + "SUMMARIZE": { + "LABEL": "Summarize this conversation", + "CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent" + }, + "SUGGEST": { + "LABEL": "Suggest an answer", + "CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information." + }, + "RATE": { + "LABEL": "Rate this conversation", + "CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness." + }, + "HIGH_PRIORITY": { + "LABEL": "High priority conversations", + "CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant." + }, + "LIST_CONTACTS": { + "LABEL": "List contacts", + "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)." + } + } + }, + "PLAYGROUND": { + "USER": "Siz", + "ASSISTANT": "Assistant", + "MESSAGE_PLACEHOLDER": "Type your message...", + "HEADER": "Playground", + "DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.", + "CREDIT_NOTE": "Messages sent here will count toward your Captain credits." + }, + "PAYWALL": { + "TITLE": "Upgrade to use Captain AI", + "AVAILABLE_ON": "Captain is not available on the free plan.", + "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.", + "UPGRADE_NOW": "Upgrade now", + "CANCEL_ANYTIME": "You can change or cancel your plan anytime" + }, + "ENTERPRISE_PAYWALL": { + "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.", + "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.", + "ASK_ADMIN": "Please reach out to your administrator for the upgrade." + }, + "BANNER": { + "RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.", + "DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI." + }, + "FORM": { + "CANCEL": "Cancel", + "CREATE": "Create", + "EDIT": "Update" + }, + "ASSISTANTS": { + "HEADER": "Assistants", + "NO_ASSISTANTS_AVAILABLE": "There are no assistants available in your account.", + "ADD_NEW": "Create a new assistant", + "DELETE": { + "TITLE": "Are you sure to delete the assistant?", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "CONFIRM": "Yes, delete", + "SUCCESS_MESSAGE": "The assistant has been successfully deleted", + "ERROR_MESSAGE": "There was an error deleting the assistant, please try again." + }, + "FORM_DESCRIPTION": "Fill out the details below to name your assistant, describe its purpose, and specify the product it will support.", + "CREATE": { + "TITLE": "Create an assistant", + "SUCCESS_MESSAGE": "The assistant has been successfully created", + "ERROR_MESSAGE": "There was an error creating the assistant, please try again." + }, + "FORM": { + "UPDATE": "Update", + "SECTIONS": { + "BASIC_INFO": "Basic Information", + "SYSTEM_MESSAGES": "System Messages", + "INSTRUCTIONS": "Instructions", + "FEATURES": "Features", + "TOOLS": "Tools " + }, + "NAME": { + "LABEL": "Name", + "PLACEHOLDER": "Enter assistant name", + "ERROR": "The name is required" + }, + "DESCRIPTION": { + "LABEL": "Description", + "PLACEHOLDER": "Enter assistant description", + "ERROR": "The description is required" + }, + "PRODUCT_NAME": { + "LABEL": "Product Name", + "PLACEHOLDER": "Enter product name", + "ERROR": "The product name is required" + }, + "WELCOME_MESSAGE": { + "LABEL": "Welcome Message", + "PLACEHOLDER": "Enter welcome message" + }, + "HANDOFF_MESSAGE": { + "LABEL": "Handoff Message", + "PLACEHOLDER": "Enter handoff message" + }, + "RESOLUTION_MESSAGE": { + "LABEL": "Resolution Message", + "PLACEHOLDER": "Enter resolution message" + }, + "INSTRUCTIONS": { + "LABEL": "Instructions", + "PLACEHOLDER": "Enter instructions for the assistant" + }, + "FEATURES": { + "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" + } + }, + "EDIT": { + "TITLE": "Update the assistant", + "SUCCESS_MESSAGE": "The assistant has been successfully updated", + "ERROR_MESSAGE": "There was an error updating the assistant, please try again.", + "NOT_FOUND": "Could not find the assistant. Please try again." + }, + "SETTINGS": { + "HEADER": "Settings", + "BASIC_SETTINGS": { + "TITLE": "Basic settings", + "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." + }, + "SYSTEM_SETTINGS": { + "TITLE": "System settings", + "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." + }, + "CONTROL_ITEMS": { + "TITLE": "The Fun Stuff", + "DESCRIPTION": "Add more control to the assistant. (a bit more visual like a story : Query guardrail → scenarios → output) Nudges user to actually utilise these.", + "OPTIONS": { + "GUARDRAILS": { + "TITLE": "Guardrails", + "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." + }, + "RESPONSE_GUIDELINES": { + "TITLE": "Response guidelines", + "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" + } + } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" + } + }, + "OPTIONS": { + "EDIT_ASSISTANT": "Edit Assistant", + "DELETE_ASSISTANT": "Delete Assistant", + "VIEW_CONNECTED_INBOXES": "View connected inboxes" + }, + "EMPTY_STATE": { + "TITLE": "No assistants available", + "SUBTITLE": "Create an assistant to provide quick and accurate responses to your users. It can learn from your help articles and past conversations.", + "FEATURE_SPOTLIGHT": { + "TITLE": "Captain Assistant", + "NOTE": "Captain Assistant engages directly with customers, learns from your help docs and past conversations, and delivers instant, accurate responses. It handles the initial queries, providing quick resolutions before transferring to an agent when needed." + } + }, + "GUARDRAILS": { + "TITLE": "Guardrails", + "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", + "BULK_ACTION": { + "SELECTED": "{count} item selected | {count} items selected", + "SELECT_ALL": "Select all ({count})", + "UNSELECT_ALL": "Unselect all ({count})", + "BULK_DELETE_BUTTON": "Delete" + }, + "ADD": { + "SUGGESTED": { + "TITLE": "Example guardrails", + "ADD": "Add all", + "ADD_SINGLE": "Add this", + "SAVE": "Add and save (↵)", + "PLACEHOLDER": "Type in another guardrail..." + }, + "NEW": { + "TITLE": "Add a guardrail", + "CREATE": "Create", + "CANCEL": "Cancel", + "PLACEHOLDER": "Type in another guardrail...", + "TEST_ALL": "Test all" + } + }, + "LIST": { + "SEARCH_PLACEHOLDER": "Search..." + }, + "EMPTY_MESSAGE": "No guardrails found. Create or add examples to begin.", + "SEARCH_EMPTY_MESSAGE": "No guardrails found for this search.", + "API": { + "ADD": { + "SUCCESS": "Guardrails added successfully", + "ERROR": "There was an error adding guardrails, please try again." + }, + "UPDATE": { + "SUCCESS": "Guardrails updated successfully", + "ERROR": "There was an error updating guardrails, please try again." + }, + "DELETE": { + "SUCCESS": "Guardrails deleted successfully", + "ERROR": "There was an error deleting guardrails, please try again." + } + } + }, + "RESPONSE_GUIDELINES": { + "TITLE": "Response Guidelines", + "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", + "BULK_ACTION": { + "SELECTED": "{count} item selected | {count} items selected", + "SELECT_ALL": "Select all ({count})", + "UNSELECT_ALL": "Unselect all ({count})", + "BULK_DELETE_BUTTON": "Delete" + }, + "ADD": { + "SUGGESTED": { + "TITLE": "Example response guidelines", + "ADD": "Add all", + "ADD_SINGLE": "Add this", + "SAVE": "Add and save (↵)", + "PLACEHOLDER": "Type in another response guideline..." + }, + "NEW": { + "TITLE": "Add a response guideline", + "CREATE": "Create", + "CANCEL": "Cancel", + "PLACEHOLDER": "Type in another response guideline...", + "TEST_ALL": "Test all" + } + }, + "LIST": { + "SEARCH_PLACEHOLDER": "Search..." + }, + "EMPTY_MESSAGE": "No response guidelines found. Create or add examples to begin.", + "SEARCH_EMPTY_MESSAGE": "No response guidelines found for this search.", + "API": { + "ADD": { + "SUCCESS": "Response Guidelines added successfully", + "ERROR": "There was an error adding response guidelines, please try again." + }, + "UPDATE": { + "SUCCESS": "Response Guidelines updated successfully", + "ERROR": "There was an error updating response guidelines, please try again." + }, + "DELETE": { + "SUCCESS": "Response Guidelines deleted successfully", + "ERROR": "There was an error deleting response guidelines, please try again." + } + } + }, + "SCENARIOS": { + "TITLE": "Scenarios", + "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", + "BULK_ACTION": { + "SELECTED": "{count} item selected | {count} items selected", + "SELECT_ALL": "Select all ({count})", + "UNSELECT_ALL": "Unselect all ({count})", + "BULK_DELETE_BUTTON": "Delete" + }, + "ADD": { + "SUGGESTED": { + "TITLE": "Example scenarios", + "ADD": "Add all", + "ADD_SINGLE": "Add this", + "TOOLS_USED": "Tools used :" + }, + "NEW": { + "CREATE": "Add a scenario", + "TITLE": "Create a scenario", + "FORM": { + "TITLE": { + "LABEL": "Title", + "PLACEHOLDER": "Enter a name for the scenario", + "ERROR": "Scenario name is required" + }, + "DESCRIPTION": { + "LABEL": "Description", + "PLACEHOLDER": "Describe how and where this scenario will be used", + "ERROR": "Scenario description is required" + }, + "INSTRUCTION": { + "LABEL": "How to handle", + "PLACEHOLDER": "Describe how and where this scenario will be handled", + "ERROR": "Scenario content is required" + }, + "CREATE": "Create", + "CANCEL": "Cancel" + } + } + }, + "UPDATE": { + "CANCEL": "Cancel", + "UPDATE": "Update changes" + }, + "LIST": { + "SEARCH_PLACEHOLDER": "Search..." + }, + "EMPTY_MESSAGE": "No scenarios found. Create or add examples to begin.", + "SEARCH_EMPTY_MESSAGE": "No scenarios found for this search.", + "API": { + "ADD": { + "SUCCESS": "Scenarios added successfully", + "ERROR": "There was an error adding scenarios, please try again." + }, + "UPDATE": { + "SUCCESS": "Scenarios updated successfully", + "ERROR": "There was an error updating scenarios, please try again." + }, + "DELETE": { + "SUCCESS": "Scenarios deleted successfully", + "ERROR": "There was an error deleting scenarios, please try again." + } + } + } + }, + "DOCUMENTS": { + "HEADER": "Documents", + "ADD_NEW": "Create a new document", + "FAQ_COUNT": "{n} FAQ | {n} FAQs", + "SELECTED": "{count} selected", + "SELECT_ALL": "Select all ({count})", + "UNSELECT_ALL": "Unselect all ({count})", + "BULK_DELETE_BUTTON": "Delete", + "BULK_SYNC_BUTTON": "Refresh", + "BULK_DELETE": { + "TITLE": "Delete documents?", + "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.", + "CONFIRM": "Yes, delete all", + "SUCCESS_MESSAGE": "Documents deleted successfully", + "ERROR_MESSAGE": "There was an error deleting the documents, please try again." + }, + "BULK_SYNC": { + "SUCCESS_MESSAGE_ONE": "Refresh queued for 1 document", + "SUCCESS_MESSAGE": "Refresh queued for {count} documents", + "ZERO_MESSAGE": "No documents marked for refresh.", + "ERROR_MESSAGE": "There was an error queuing the refresh, please try again." + }, + "SYNC": { + "QUEUED_MESSAGE": "Refresh queued. We'll update the document shortly.", + "ERROR_MESSAGE": "Could not queue refresh, please try again." + }, + "FILTERS": { + "SOURCE": { + "ALL": "All sources", + "WEB": "Web pages", + "PDF": "PDFs" + }, + "STATUS": { + "ANY": "Any status", + "UPDATED": "Updated", + "NEEDS_UPDATE": "Needs update", + "UPDATING": "Updating", + "FAILED": "Failed" + }, + "SORT": { + "RECENTLY_UPDATED": "Recently updated", + "RECENTLY_CREATED": "Recently created" + }, + "SEARCH_PLACEHOLDER": "Search..." + }, + "SYNC_STATUS": { + "SYNCED": "last updated {time}", + "SYNCING": "updating...", + "STALE_SYNC": "update stalled", + "FAILED": "Failed to sync", + "NEVER_SYNCED": "not updated yet" + }, + "SYNC_ERRORS": { + "NOT_FOUND": "Page not found", + "ACCESS_DENIED": "Access denied", + "TIMEOUT": "Page took too long to respond", + "CONTENT_EMPTY": "Page returned empty content", + "FETCH_FAILED": "Could not fetch page", + "SYNC_ERROR": "Unexpected error", + "DEFAULT": "Sync error" + }, + "RELATED_RESPONSES": { + "TITLE": "Related FAQs", + "EMPTY": "No FAQs have been generated from this document yet." + }, + "DETAILS": { + "DESCRIPTION": "Review the crawled content and the FAQs generated from this source.", + "SOURCE": "Source", + "GENERATED_FAQS": "Generated FAQs", + "LAST_UPDATED": "Last updated", + "NOT_AVAILABLE": "Mavjud emas", + "CONTENT_TAB": "Crawled content", + "PDF_TAB": "PDF details", + "CONTENT_TITLE": "Crawled content", + "PDF_TITLE": "PDF file", + "PDF_DESCRIPTION": "Review the original PDF source.", + "CHARACTER_COUNT": "{count} characters extracted", + "COPY_CONTENT": "Copy", + "COPY_SUCCESS": "Crawled content copied to clipboard", + "COPY_ERROR": "Could not copy crawled content", + "VIEW_RAW": "View raw", + "VIEW_PREVIEW": "View preview", + "UNREADABLE_CONTENT": "Readable content could not be extracted from this document. You can view the raw extracted content.", + "EMPTY_CONTENT": "No crawled content is available for this document yet." + }, + "FORM_DESCRIPTION": "Enter the URL of the document to add it as a knowledge source and choose the assistant to associate it with.", + "CREATE": { + "TITLE": "Add a document", + "SUCCESS_MESSAGE": "The document has been successfully created", + "ERROR_MESSAGE": "There was an error creating the document, please try again." + }, + "FORM": { + "TYPE": { + "LABEL": "Document Type", + "URL": "URL", + "PDF": "PDF File" + }, + "URL": { + "LABEL": "URL", + "PLACEHOLDER": "Enter the URL of the document", + "ERROR": "Please provide a valid URL for the document" + }, + "PDF_FILE": { + "LABEL": "PDF File", + "CHOOSE_FILE": "Choose PDF file", + "ERROR": "Please select a PDF file", + "HELP_TEXT": "Maximum file size: 10MB", + "INVALID_TYPE": "Please select a valid PDF file", + "TOO_LARGE": "File size exceeds 10MB limit" + }, + "NAME": { + "LABEL": "Document Name (Optional)", + "PLACEHOLDER": "Enter a name for the document" + } + }, + "DELETE": { + "TITLE": "Are you sure to delete the document?", + "DESCRIPTION": "This action is permanent. Deleting this document will permanently erase all generated knowledge.", + "CONFIRM": "Yes, delete", + "SUCCESS_MESSAGE": "The document has been successfully deleted", + "ERROR_MESSAGE": "There was an error deleting the document, please try again." + }, + "OPTIONS": { + "VIEW_DETAILS": "View details", + "SYNC_NOW": "Refresh now", + "RETRY_SYNC": "Retry refresh", + "DELETE_DOCUMENT": "Delete Document" + }, + "EMPTY_STATE": { + "TITLE": "No documents available", + "SUBTITLE": "Documents are used by your assistant to generate FAQs. You can import documents to provide context for your assistant.", + "FILTERED_TITLE": "No matching documents", + "FILTERED_SUBTITLE": "Try changing the source, status, or search term.", + "FEATURE_SPOTLIGHT": { + "TITLE": "Captain Document", + "NOTE": "A document in Captain serves as a knowledge resource for the assistant. By connecting your help center or guides, Captain can analyze the content and provide accurate responses for customer inquiries." + } + } + }, + "CUSTOM_TOOLS": { + "HEADER": "Tools", + "ADD_NEW": "Create a new tool", + "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.", + "EMPTY_STATE": { + "TITLE": "No custom tools available", + "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.", + "FEATURE_SPOTLIGHT": { + "TITLE": "Custom Tools", + "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities." + } + }, + "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs", + "OPTIONS": { + "EDIT_TOOL": "Edit tool", + "DELETE_TOOL": "Delete tool" + }, + "CREATE": { + "TITLE": "Create Custom Tool", + "SUCCESS_MESSAGE": "Custom tool created successfully", + "ERROR_MESSAGE": "Failed to create custom tool" + }, + "EDIT": { + "TITLE": "Edit Custom Tool", + "SUCCESS_MESSAGE": "Custom tool updated successfully", + "ERROR_MESSAGE": "Failed to update custom tool" + }, + "DELETE": { + "TITLE": "Delete Custom Tool", + "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.", + "CONFIRM": "Yes, delete", + "SUCCESS_MESSAGE": "Custom tool deleted successfully", + "ERROR_MESSAGE": "Failed to delete custom tool" + }, + "PAYWALL": { + "TITLE": "Upgrade to use tools with Captain", + "AVAILABLE_ON": "Captain Tools are only available in Business and Enterprise plans. Please upgrade to Business plan to use the feature.", + "UPGRADE_PROMPT": "", + "UPGRADE_NOW": "Open billing", + "CANCEL_ANYTIME": "" + }, + "ENTERPRISE_PAYWALL": { + "AVAILABLE_ON": "Captain Tools are only available in the paid plans.", + "UPGRADE_PROMPT": "Please upgrade to a paid plan to use this feature.", + "ASK_ADMIN": "Please reach out to your administrator for the upgrade." + }, + "TEST": { + "BUTTON": "Test connection", + "SUCCESS": "Endpoint returned HTTP {status}", + "ERROR": "Connection failed", + "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies." + }, + "FORM": { + "TITLE": { + "LABEL": "Tool Name", + "PLACEHOLDER": "Order Lookup", + "ERROR": "Tool name is required", + "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer" + }, + "DESCRIPTION": { + "LABEL": "Description", + "PLACEHOLDER": "Looks up order details by order ID" + }, + "HTTP_METHOD": { + "LABEL": "Method" + }, + "ENDPOINT_URL": { + "LABEL": "Endpoint URL", + "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}", + "ERROR": "Valid URL is required" + }, + "AUTH_TYPE": { + "LABEL": "Authentication Type" + }, + "AUTH_TYPES": { + "NONE": "None", + "BEARER": "Bearer Token", + "BASIC": "Basic Auth", + "API_KEY": "API Key" + }, + "AUTH_CONFIG": { + "BEARER_TOKEN": "Bearer Token", + "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token", + "USERNAME": "Username", + "USERNAME_PLACEHOLDER": "Enter username", + "PASSWORD": "Password", + "PASSWORD_PLACEHOLDER": "Enter password", + "API_KEY": "Header Name", + "API_KEY_PLACEHOLDER": "X-API-Key", + "API_VALUE": "Header Value", + "API_VALUE_PLACEHOLDER": "Enter API key value" + }, + "PARAMETERS": { + "LABEL": "Parameters", + "HELP_TEXT": "Define the parameters that will be extracted from user queries" + }, + "ADD_PARAMETER": "Add Parameter", + "PARAM_NAME": { + "PLACEHOLDER": "Parameter name (e.g., order_id)" + }, + "PARAM_TYPE": { + "PLACEHOLDER": "Type" + }, + "PARAM_TYPES": { + "STRING": "String", + "NUMBER": "Number", + "BOOLEAN": "Boolean", + "ARRAY": "Array", + "OBJECT": "Object" + }, + "PARAM_DESCRIPTION": { + "PLACEHOLDER": "Description of the parameter" + }, + "PARAM_REQUIRED": { + "LABEL": "Required" + }, + "REQUEST_TEMPLATE": { + "LABEL": "Request Body Template (Optional)", + "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}" + }, + "RESPONSE_TEMPLATE": { + "LABEL": "Response Template (Optional)", + "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}" + }, + "ERRORS": { + "PARAM_NAME_REQUIRED": "Parameter name is required" + } + } + }, + "RESPONSES": { + "HEADER": "FAQs", + "PENDING_FAQS": "Pending FAQs", + "ADD_NEW": "Create new FAQ", + "DOCUMENTABLE": { + "CONVERSATION": "Conversation #{id}" + }, + "SELECTED": "{count} selected", + "SELECT_ALL": "Select all ({count})", + "UNSELECT_ALL": "Unselect all ({count})", + "SEARCH_PLACEHOLDER": "Search FAQs...", + "BULK_APPROVE_BUTTON": "Approve", + "BULK_DELETE_BUTTON": "Delete", + "BULK_APPROVE": { + "SUCCESS_MESSAGE": "FAQs approved successfully", + "ERROR_MESSAGE": "There was an error approving the FAQs, please try again." + }, + "BULK_DELETE": { + "TITLE": "Delete FAQs?", + "DESCRIPTION": "Are you sure you want to delete the selected FAQs? This action cannot be undone.", + "CONFIRM": "Yes, delete all", + "SUCCESS_MESSAGE": "FAQs deleted successfully", + "ERROR_MESSAGE": "There was an error deleting the FAQs, please try again." + }, + "DELETE": { + "TITLE": "Are you sure to delete the FAQ?", + "DESCRIPTION": "", + "CONFIRM": "Yes, delete", + "SUCCESS_MESSAGE": "FAQ deleted successfully", + "ERROR_MESSAGE": "There was an error deleting the FAQ, please try again." + }, + "FILTER": { + "ASSISTANT": "Assistant: {selected}", + "STATUS": "Status: {selected}", + "ALL_ASSISTANTS": "All" + }, + "STATUS": { + "TITLE": "Status", + "PENDING": "Pending", + "APPROVED": "Approved", + "ALL": "All" + }, + "PENDING_BANNER": { + "TITLE": "Captain has found some FAQs your customers were looking for.", + "ACTION": "Click here to review" + }, + "FORM_DESCRIPTION": "Add a question and its corresponding answer to the knowledge base and select the assistant it should be associated with.", + "CREATE": { + "TITLE": "Add an FAQ", + "SUCCESS_MESSAGE": "The response has been added successfully.", + "ERROR_MESSAGE": "An error occurred while adding the response. Please try again." + }, + "FORM": { + "QUESTION": { + "LABEL": "Question", + "PLACEHOLDER": "Enter the question here", + "ERROR": "Please provide a valid question." + }, + "ANSWER": { + "LABEL": "Answer", + "PLACEHOLDER": "Enter the answer here", + "ERROR": "Please provide a valid answer." + } + }, + "EDIT": { + "TITLE": "Update the FAQ", + "SUCCESS_MESSAGE": "The FAQ has been successfully updated", + "ERROR_MESSAGE": "There was an error updating the FAQ, please try again", + "APPROVE_SUCCESS_MESSAGE": "The FAQ was marked as approved" + }, + "OPTIONS": { + "APPROVE": "Approve", + "EDIT_RESPONSE": "Edit", + "DELETE_RESPONSE": "Delete" + }, + "EMPTY_STATE": { + "TITLE": "No FAQs Found", + "NO_PENDING_TITLE": "There are no more pending FAQs to review", + "SUBTITLE": "FAQs help your assistant provide quick and accurate answers to questions from your customers. They can be generated automatically from your content or can be added manually.", + "CLEAR_SEARCH": "Clear active filters", + "FEATURE_SPOTLIGHT": { + "TITLE": "Captain FAQ", + "NOTE": "Captain FAQs detects common customer questions—whether missing from your knowledge base or frequently asked—and generates relevant FAQs to improve support. You can review each suggestion and decide whether to approve or reject it." + } + } + }, + "INBOXES": { + "HEADER": "Connected Inboxes", + "ADD_NEW": "Connect a new inbox", + "OPTIONS": { + "DISCONNECT": "Disconnect" + }, + "DELETE": { + "TITLE": "Are you sure to disconnect the inbox?", + "DESCRIPTION": "", + "CONFIRM": "Yes, delete", + "SUCCESS_MESSAGE": "The inbox was successfully disconnected.", + "ERROR_MESSAGE": "There was an error disconnecting the inbox, please try again." + }, + "FORM_DESCRIPTION": "Choose an inbox to connect with the assistant.", + "CREATE": { + "TITLE": "Connect an Inbox", + "SUCCESS_MESSAGE": "The inbox was successfully connected.", + "ERROR_MESSAGE": "An error occurred while connecting the inbox. Please try again." + }, + "FORM": { + "INBOX": { + "LABEL": "Inbox", + "PLACEHOLDER": "Choose the inbox to deploy the assistant.", + "ERROR": "An inbox selection is required." + } + }, + "EMPTY_STATE": { + "TITLE": "No Connected Inboxes", + "SUBTITLE": "Connecting an inbox allows the assistant to handle initial questions from your customers before transferring them to you." + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/labelsMgmt.json b/app/javascript/dashboard/i18n/locale/uz/labelsMgmt.json new file mode 100644 index 000000000..96e272e46 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/labelsMgmt.json @@ -0,0 +1,89 @@ +{ + "LABEL_MGMT": { + "HEADER": "Labels", + "HEADER_BTN_TXT": "Add label", + "LOADING": "Fetching labels", + "DESCRIPTION": "Labels help you categorize and prioritize conversations and leads. You can assign a label to a conversation or contact using the side panel.", + "LEARN_MORE": "Learn more about labels", + "COUNT": "{n} label | {n} labels", + "SEARCH_PLACEHOLDER": "Search labels...", + "NO_RESULTS": "No labels found matching your search", + "SEARCH_404": "There are no items matching this query", + "LIST": { + "404": "There are no labels available in this account.", + "TITLE": "Manage labels", + "DESC": "Labels let you group the conversations together.", + "TABLE_HEADER": { + "NAME": "Name", + "DESCRIPTION": "Description", + "COLOR": "Color", + "ACTION": "Actions" + } + }, + "FORM": { + "NAME": { + "LABEL": "Label Name", + "PLACEHOLDER": "Label name", + "REQUIRED_ERROR": "Label name is required", + "MINIMUM_LENGTH_ERROR": "Minimum length 2 is required", + "VALID_ERROR": "Only Alphabets, Numbers, Hyphen and Underscore are allowed" + }, + "DESCRIPTION": { + "LABEL": "Description", + "PLACEHOLDER": "Label Description" + }, + "COLOR": { + "LABEL": "Color" + }, + "SHOW_ON_SIDEBAR": { + "LABEL": "Show label on sidebar" + }, + "EDIT": "Edit", + "CREATE": "Create", + "DELETE": "Delete", + "CANCEL": "Cancel" + }, + "SUGGESTIONS": { + "TOOLTIP": { + "SINGLE_SUGGESTION": "Add label to conversation", + "MULTIPLE_SUGGESTION": "Select this label", + "DESELECT": "Deselect label", + "DISMISS": "Dismiss suggestion" + }, + "POWERED_BY": "Chatwoot AI", + "DISMISS": "Dismiss", + "ADD_SELECTED_LABELS": "Add selected labels", + "ADD_SELECTED_LABEL": "Add selected label", + "ADD_ALL_LABELS": "Add all labels", + "SUGGESTED_LABELS": "Suggested labels" + }, + "ADD": { + "TITLE": "Add label", + "DESC": "Labels let you group the conversations together.", + "API": { + "SUCCESS_MESSAGE": "Label added successfully", + "ERROR_MESSAGE": "There was an error, please try again" + } + }, + "EDIT": { + "TITLE": "Edit label", + "API": { + "SUCCESS_MESSAGE": "Label updated successfully", + "ERROR_MESSAGE": "There was an error, please try again" + } + }, + "DELETE": { + "BUTTON_TEXT": "Delete", + "API": { + "SUCCESS_MESSAGE": "Label deleted successfully", + "ERROR_MESSAGE": "There was an error, please try again" + }, + "CONFIRM": { + "TITLE": "Confirm Deletion", + "MESSAGE": "Are you sure to delete ", + "YES": "Yes, Delete ", + "NO": "No, Keep " + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/login.json b/app/javascript/dashboard/i18n/locale/uz/login.json new file mode 100644 index 000000000..061284247 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/login.json @@ -0,0 +1,41 @@ +{ + "LOGIN": { + "TITLE": "Login to Chatwoot", + "EMAIL": { + "LABEL": "Email", + "PLACEHOLDER": "example{'@'}companyname.com", + "ERROR": "Please enter a valid email address" + }, + "PASSWORD": { + "LABEL": "Password", + "PLACEHOLDER": "Password" + }, + "API": { + "SUCCESS_MESSAGE": "Login successful", + "ERROR_MESSAGE": "Could not connect to Woot server. Please try again.", + "UNAUTH": "Username or password is incorrect. Please try again." + }, + "OAUTH": { + "GOOGLE_LOGIN": "Login with Google", + "BUSINESS_ACCOUNTS_ONLY": "Please use your company email address to login", + "NO_ACCOUNT_FOUND": "We couldn't find an account for your email address." + }, + "FORGOT_PASSWORD": "Forgot your password?", + "CREATE_NEW_ACCOUNT": "Create a new account", + "SUBMIT": "Login", + "SAML": { + "LABEL": "Login via SSO", + "TITLE": "Initiate Single Sign-on (SSO)", + "SUBTITLE": "Enter your work email to access your organization", + "BACK_TO_LOGIN": "Login via Password", + "WORK_EMAIL": { + "LABEL": "Work Email", + "PLACEHOLDER": "Enter your work email" + }, + "SUBMIT": "Continue with SSO", + "API": { + "ERROR_MESSAGE": "SSO authentication failed. Please check your credentials and try again." + } + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/macros.json b/app/javascript/dashboard/i18n/locale/uz/macros.json new file mode 100644 index 000000000..e51975921 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/macros.json @@ -0,0 +1,121 @@ +{ + "MACROS": { + "HEADER": "Macros", + "DESCRIPTION": "A macro is a set of saved actions that help customer service agents easily complete tasks. The agents can define a set of actions like tagging a conversation with a label, sending an email transcript, updating a custom attribute, etc., and they can run these actions in a single click.", + "LEARN_MORE": "Learn more about macros", + "COUNT": "{n} macro | {n} macros", + "HEADER_BTN_TXT": "Add a new macro", + "HEADER_BTN_TXT_SAVE": "Save macro", + "LOADING": "Fetching macros", + "SEARCH_PLACEHOLDER": "Search macros...", + "NO_RESULTS": "No macros found matching your search", + "ERROR": "Something went wrong. Please try again", + "ORDER_INFO": "Macros will run in the order you add your actions. You can rearrange them by dragging them by the handle beside each node.", + "ADD": { + "FORM": { + "NAME": { + "LABEL": "Macro name", + "PLACEHOLDER": "Enter a name for your macro", + "ERROR": "Name is required for creating a macro" + }, + "ACTIONS": { + "LABEL": "Actions" + } + }, + "API": { + "SUCCESS_MESSAGE": "Macro added successfully", + "ERROR_MESSAGE": "Unable to create macro, Please try again later" + } + }, + "LIST": { + "TABLE_HEADER": { + "NAME": "Name", + "CREATED BY": "Created by", + "LAST_UPDATED_BY": "Last updated by", + "VISIBILITY": "Visibility", + "ACTIONS": "Actions" + }, + "404": "No macros found" + }, + "DELETE": { + "TOOLTIP": "Delete macro", + "CONFIRM": { + "MESSAGE": "Are you sure to delete ", + "YES": "Yes, Delete", + "NO": "No" + }, + "API": { + "SUCCESS_MESSAGE": "Macro deleted successfully", + "ERROR_MESSAGE": "There was an error deleting the macro. Please try again later" + } + }, + "VIEW": { + "TOOLTIP": "View macro" + }, + "EDIT": { + "TOOLTIP": "Edit macro", + "API": { + "SUCCESS_MESSAGE": "Macro updated successfully", + "ERROR_MESSAGE": "Could not update Macro, Please try again later" + } + }, + "EDITOR": { + "START_FLOW": "Start Flow", + "END_FLOW": "End Flow", + "LOADING": "Fetching macro", + "ADD_BTN_TOOLTIP": "Add new action", + "DELETE_BTN_TOOLTIP": "Delete Action", + "VISIBILITY": { + "LABEL": "Macro Visibility", + "GLOBAL": { + "LABEL": "Public", + "DESCRIPTION": "This macro is available publicly for all agents in this account.", + "CREATE_DISABLED_DESCRIPTION": "Only administrators can create public macros.", + "EDIT_DISABLED_DESCRIPTION": "Only administrators can edit public macros." + }, + "PERSONAL": { + "LABEL": "Private", + "DESCRIPTION": "This macro will be private to you and not be available to others." + } + } + }, + "EXECUTE": { + "BUTTON_TOOLTIP": "Execute", + "PREVIEW": "Preview Macro", + "EXECUTED_SUCCESSFULLY": "Macro executed successfully" + }, + "ERRORS": { + "ATTRIBUTE_KEY_REQUIRED": "Attribute key is required", + "FILTER_OPERATOR_REQUIRED": "Filter operator is required", + "VALUE_REQUIRED": "Value is required", + "VALUE_MUST_BE_BETWEEN_1_AND_998": "Value must be between 1 and 998", + "ACTION_PARAMETERS_REQUIRED": "Action parameters are required", + "ATLEAST_ONE_CONDITION_REQUIRED": "At least one condition is required", + "ATLEAST_ONE_ACTION_REQUIRED": "At least one action is required" + }, + "ACTIONS": { + "ASSIGN_TEAM": "Assign a Team", + "ASSIGN_AGENT": "Assign an Agent", + "ADD_LABEL": "Add a Label", + "REMOVE_LABEL": "Remove a Label", + "REMOVE_ASSIGNED_AGENT": "Remove Assigned Agent", + "REMOVE_ASSIGNED_TEAM": "Remove Assigned Team", + "SEND_EMAIL_TRANSCRIPT": "Send an Email Transcript", + "MUTE_CONVERSATION": "Mute Conversation", + "SNOOZE_CONVERSATION": "Snooze Conversation", + "RESOLVE_CONVERSATION": "Resolve Conversation", + "SEND_ATTACHMENT": "Send Attachment", + "SEND_MESSAGE": "Send a Message", + "CHANGE_PRIORITY": "Change Priority", + "ADD_PRIVATE_NOTE": "Add a Private Note", + "SEND_WEBHOOK_EVENT": "Send Webhook Event" + }, + "PRIORITY_TYPES": { + "NONE": "None", + "LOW": "Low", + "MEDIUM": "Medium", + "HIGH": "High", + "URGENT": "Urgent" + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/mfa.json b/app/javascript/dashboard/i18n/locale/uz/mfa.json new file mode 100644 index 000000000..8e356aad4 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/mfa.json @@ -0,0 +1,110 @@ +{ + "MFA_SETTINGS": { + "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": "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": "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", + "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": "Disable Two-Factor Authentication", + "DESCRIPTION": "You'll need to enter your password and either a verification code from your authenticator app or a backup code to disable two-factor authentication.", + "PASSWORD": "Password", + "OTP_CODE": "Verification Code", + "OTP_CODE_PLACEHOLDER": "000000", + "BACKUP_CODE": "Backup Code", + "BACKUP_CODE_PLACEHOLDER": "Enter one of your backup codes", + "USE_BACKUP_CODE": "Lost access to your authenticator? Use a backup code instead", + "USE_OTP_CODE": "Use a verification code from your authenticator app", + "CONFIRM": "Disable 2FA", + "CANCEL": "Cancel", + "SUCCESS": "Two-factor authentication has been disabled", + "ERROR": "Failed to disable MFA. Please check your credentials." + }, + "REGENERATE": { + "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": "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": "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. Please try again." + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/onboarding.json b/app/javascript/dashboard/i18n/locale/uz/onboarding.json new file mode 100644 index 000000000..51d511091 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/onboarding.json @@ -0,0 +1,88 @@ +{ + "ONBOARDING_NEXT": { + "GREETING": "Hello {name}!", + "SUBTITLE": "Please review the following details", + "YOUR_DETAILS": "Your details", + "COMPANY_DETAILS": "Company details", + "FIELDS": { + "EMAIL": "Email", + "YOUR_ROLE": "Your Role", + "WEBSITE": "Website", + "LANGUAGE": "Language", + "TIMEZONE": "Timezone", + "COMPANY_SIZE": "Company Size", + "INDUSTRY": "Industry", + "REFERRAL_SOURCE": "Where did you find us?" + }, + "PLACEHOLDERS": { + "SELECT_ROLE": "Select your role", + "ENTER_WEBSITE": "www.example.com", + "SELECT_LANGUAGE": "Select language", + "SELECT_TIMEZONE": "Select timezone", + "SELECT_COMPANY_SIZE": "Select company size", + "SELECT_INDUSTRY": "Select industry", + "SELECT_REFERRAL_SOURCE": "Select source" + }, + "EMAIL_VERIFIED": "Email verified", + "SETTING_UP": "Setting up your account...", + "CONTINUE": "Continue", + "SAVING": "Saving...", + "VALIDATION_ERROR": "Please fill in all required fields", + "SUCCESS": "Details saved successfully", + "ERROR": "Could not save details. Please try again." + }, + "ONBOARDING_INBOX_SETUP": { + "GREETING": "Let's set up a few things", + "SUBTITLE": "This will give you head-start in your workspace", + "CONTINUE": "Continue", + "SKIP": "Skip", + "ERROR": "Something went wrong. Please try again.", + "WHATSAPP_CONNECTED": "WhatsApp connected successfully", + "FACEBOOK_CONNECTED": "Facebook connected successfully", + "CREATED_FOR_YOU": { + "TITLE": "We've created the following for you", + "LIVE_CHAT": "Live Chat widget", + "LIVE_CHAT_DESCRIPTION": "Instant messenger for your website", + "LIVE_CHAT_STATUS": "Almost done…", + "LIVE_CHAT_READY": "Ready", + "HELP_CENTER": "Help Center", + "HELP_CENTER_DESCRIPTION": "Your digital encyclopedia", + "HELP_CENTER_GENERATING": "Creating your help center…", + "HELP_CENTER_ANALYZING_WEBSITE": "Analyzing your website…", + "HELP_CENTER_SETTING_UP_CATEGORIES": "Setting up categories…", + "HELP_CENTER_CURATING_ARTICLES": "Curating articles…", + "HELP_CENTER_ARTICLES": "Created {count} article | Created {count} articles", + "HELP_CENTER_CATEGORIES": "{count} category | {count} categories", + "HELP_CENTER_SUMMARY": "Created {count} article across {categories} | Created {count} articles across {categories}" + }, + "CHANNELS": { + "TITLE": "Connect all your conversation channels", + "HEADER": "We found a few channels you can connect", + "CONNECT": "Connect", + "CONNECTED": "Connected", + "MORE_CHANNELS_NOTE": "Set up {email} and {voice} channels later inside the app", + "MORE_CHANNELS_EMAIL": "Email", + "MORE_CHANNELS_VOICE": "Voice", + "VIEW_ALL": "View all", + "GMAIL": "Gmail", + "OUTLOOK": "Outlook", + "OTHER_EMAIL": "Other Email Providers" + }, + "CHANNELS_DIALOG": { + "TITLE": "Connect all your channels instantly", + "SUBTITLE": "Manage all of them from one dashboard. You can also set up and edit inboxes later inside the app.", + "NOTE": "SMS, API, Voice, and other email providers can be set up later from your dashboard.", + "CONNECT_TITLE": "Connect your {name} account", + "CONNECT_SUBTITLE": "Fill out these quick details", + "CONNECT": "Connect", + "BACK": "Back", + "SETUP_LATER": "Setup later in app", + "FACEBOOK_SUBTITLE": "Authorize access and choose a Page to connect.", + "FACEBOOK_LAUNCH": "Continue with Facebook", + "FACEBOOK_SELECT_PAGE": "Select a Page to connect", + "FACEBOOK_LOADING": "Loading your Facebook Pages…", + "FACEBOOK_NO_PAGES": "No connectable Pages found. All your Pages are already connected.", + "FACEBOOK_ERROR": "Couldn't connect to Facebook. Please try again." + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/report.json b/app/javascript/dashboard/i18n/locale/uz/report.json new file mode 100644 index 000000000..0171b9620 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/report.json @@ -0,0 +1,670 @@ +{ + "REPORT": { + "HEADER": "Conversations", + "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": "Conversations", + "DESC": "( Total )" + }, + "INCOMING_MESSAGES": { + "NAME": "Messages received", + "DESC": "( Total )" + }, + "OUTGOING_MESSAGES": { + "NAME": "Messages sent", + "DESC": "( Total )" + }, + "FIRST_RESPONSE_TIME": { + "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": "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": "Resolution Count", + "DESC": "( Total )" + }, + "BOT_RESOLUTION_COUNT": { + "NAME": "Resolution Count", + "DESC": "( Total )" + }, + "BOT_HANDOFF_COUNT": { + "NAME": "Handoff Count", + "DESC": "( Total )" + }, + "REPLY_TIME": { + "NAME": "Customer waiting time", + "TOOLTIP_TEXT": "Waiting time is {metricValue} (based on {conversationCount} replies)", + "DESC": "" + } + }, + "DATE_RANGE_OPTIONS": { + "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": "Apply", + "PLACEHOLDER": "Select date range" + }, + "GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By", + "DURATION_FILTER_LABEL": "Duration", + "GROUPING_OPTIONS": { + "DAY": "Day", + "WEEK": "Week", + "MONTH": "Month", + "YEAR": "Year" + }, + "GROUP_BY_DAY_OPTIONS": [ + { + "id": 1, + "groupBy": "Day" + } + ], + "GROUP_BY_WEEK_OPTIONS": [ + { + "id": 1, + "groupBy": "Day" + }, + { + "id": 2, + "groupBy": "Week" + } + ], + "GROUP_BY_MONTH_OPTIONS": [ + { + "id": 1, + "groupBy": "Day" + }, + { + "id": 2, + "groupBy": "Week" + }, + { + "id": 3, + "groupBy": "Month" + } + ], + "GROUP_BY_YEAR_OPTIONS": [ + { + "id": 2, + "groupBy": "Week" + }, + { + "id": 3, + "groupBy": "Month" + }, + { + "id": 4, + "groupBy": "Year" + } + ], + "BUSINESS_HOURS": "Business Hours", + "FILTER_ACTIONS": { + "CLEAR_FILTER": "Clear filter", + "EMPTY_LIST": "No results found" + }, + "DRILLDOWN": { + "TITLE": "{metric} details", + "RESULT_COUNT_CONVERSATION": "{count} conversation | {count} conversations", + "RESULT_COUNT_MESSAGE": "{count} message | {count} messages", + "EMPTY": "No records found for this bar.", + "ERROR": "Could not load records. Please try again.", + "ADMIN_ONLY": "Only administrators can drill down into report records.", + "LOAD_MORE": "Load more", + "CLOSE": "Close details", + "PREVIOUS_BUCKET": "Previous bar", + "NEXT_BUCKET": "Next bar", + "UNKNOWN_CONTACT": "Unknown contact", + "UNKNOWN_INBOX": "Unknown inbox", + "UNASSIGNED_AGENT": "Unassigned", + "NO_MESSAGE_CONTENT": "No message content", + "MESSAGE_CREATED_AT": "Message created at {time}", + "EVENT_OCCURRED_AT": "Event occurred at {time}", + "INCOMING_MESSAGE": "Incoming message", + "OUTGOING_MESSAGE": "Outgoing message" + }, + "PAGINATION": { + "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": "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" + } + }, + "METRICS": { + "CONVERSATIONS": { + "NAME": "Conversations", + "DESC": "( Total )" + }, + "INCOMING_MESSAGES": { + "NAME": "Incoming Messages", + "DESC": "( Total )" + }, + "OUTGOING_MESSAGES": { + "NAME": "Outgoing Messages", + "DESC": "( Total )" + }, + "FIRST_RESPONSE_TIME": { + "NAME": "First Response Time", + "DESC": "( Avg )", + "INFO_TEXT": "Total number of conversations used for computation:", + "TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)" + }, + "RESOLUTION_TIME": { + "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": "Resolution Count", + "DESC": "( Total )" + } + }, + "DATE_RANGE": [ + { + "id": 0, + "name": "Last 7 days" + }, + { + "id": 1, + "name": "Last 30 days" + }, + { + "id": 2, + "name": "Last 3 months" + }, + { + "id": 3, + "name": "Last 6 months" + }, + { + "id": 4, + "name": "Last year" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "LABEL_REPORTS": { + "HEADER": "Labels Overview", + "DESCRIPTION": "Track label performance with key metrics including conversations, response times, resolution times, and resolved cases. Click a label name for detailed insights.", + "LOADING_CHART": "Loading chart data...", + "NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.", + "DOWNLOAD_LABEL_REPORTS": "Download label reports", + "FILTER_DROPDOWN_LABEL": "Select Label", + "FILTERS": { + "INPUT_PLACEHOLDER": { + "LABELS": "Search labels" + } + }, + "METRICS": { + "CONVERSATIONS": { + "NAME": "Conversations", + "DESC": "( Total )" + }, + "INCOMING_MESSAGES": { + "NAME": "Incoming Messages", + "DESC": "( Total )" + }, + "OUTGOING_MESSAGES": { + "NAME": "Outgoing Messages", + "DESC": "( Total )" + }, + "FIRST_RESPONSE_TIME": { + "NAME": "First Response Time", + "DESC": "( Avg )", + "INFO_TEXT": "Total number of conversations used for computation:", + "TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)" + }, + "RESOLUTION_TIME": { + "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": "Resolution Count", + "DESC": "( Total )" + } + }, + "DATE_RANGE": [ + { + "id": 0, + "name": "Last 7 days" + }, + { + "id": 1, + "name": "Last 30 days" + }, + { + "id": 2, + "name": "Last 3 months" + }, + { + "id": 3, + "name": "Last 6 months" + }, + { + "id": 4, + "name": "Last year" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "INBOX_REPORTS": { + "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": "We've not received enough data points to generate report, Please try again later.", + "DOWNLOAD_INBOX_REPORTS": "Download inbox reports", + "FILTER_DROPDOWN_LABEL": "Select Inbox", + "ALL_INBOXES": "All Inboxes", + "SEARCH_INBOX": "Search Inbox", + "FILTERS": { + "INPUT_PLACEHOLDER": { + "INBOXES": "Search inboxes" + } + }, + "METRICS": { + "CONVERSATIONS": { + "NAME": "Conversations", + "DESC": "( Total )" + }, + "INCOMING_MESSAGES": { + "NAME": "Incoming Messages", + "DESC": "( Total )" + }, + "OUTGOING_MESSAGES": { + "NAME": "Outgoing Messages", + "DESC": "( Total )" + }, + "FIRST_RESPONSE_TIME": { + "NAME": "First Response Time", + "DESC": "( Avg )", + "INFO_TEXT": "Total number of conversations used for computation:", + "TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)" + }, + "RESOLUTION_TIME": { + "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": "Resolution Count", + "DESC": "( Total )" + } + }, + "DATE_RANGE": [ + { + "id": 0, + "name": "Last 7 days" + }, + { + "id": 1, + "name": "Last 30 days" + }, + { + "id": 2, + "name": "Last 3 months" + }, + { + "id": 3, + "name": "Last 6 months" + }, + { + "id": 4, + "name": "Last year" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "TEAM_REPORTS": { + "HEADER": "Team Overview", + "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": "We've not received enough data points to generate report, Please try again later.", + "DOWNLOAD_TEAM_REPORTS": "Download team reports", + "FILTER_DROPDOWN_LABEL": "Select Team", + "FILTERS": { + "ADD_FILTER": "Add filter", + "CLEAR_ALL": "Clear all", + "NO_FILTER": "No filters available", + "INPUT_PLACEHOLDER": { + "TEAMS": "Search teams" + } + }, + "METRICS": { + "CONVERSATIONS": { + "NAME": "Conversations", + "DESC": "( Total )" + }, + "INCOMING_MESSAGES": { + "NAME": "Incoming Messages", + "DESC": "( Total )" + }, + "OUTGOING_MESSAGES": { + "NAME": "Outgoing Messages", + "DESC": "( Total )" + }, + "FIRST_RESPONSE_TIME": { + "NAME": "First Response Time", + "DESC": "( Avg )", + "INFO_TEXT": "Total number of conversations used for computation:", + "TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)" + }, + "RESOLUTION_TIME": { + "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": "Resolution Count", + "DESC": "( Total )" + } + }, + "DATE_RANGE": [ + { + "id": 0, + "name": "Last 7 days" + }, + { + "id": 1, + "name": "Last 30 days" + }, + { + "id": 2, + "name": "Last 3 months" + }, + { + "id": 3, + "name": "Last 6 months" + }, + { + "id": 4, + "name": "Last year" + }, + { + "id": 5, + "name": "Custom date range" + } + ], + "CUSTOM_DATE_RANGE": { + "CONFIRM": "Apply", + "PLACEHOLDER": "Select date range" + } + }, + "CSAT_REPORTS": { + "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", + "FILTERS": { + "ADD_FILTER": "Add filter", + "CLEAR_ALL": "Clear all", + "NO_FILTER": "No filters available", + "INPUT_PLACEHOLDER": { + "AGENTS": "Search agents", + "INBOXES": "Search inboxes", + "TEAMS": "Search teams", + "RATINGS": "Search ratings" + }, + "AGENTS": { + "LABEL": "Agent" + }, + "INBOXES": { + "LABEL": "Inbox" + }, + "TEAMS": { + "LABEL": "Team" + }, + "RATINGS": { + "LABEL": "Rating" + } + }, + "TABLE": { + "HEADER": { + "CONTACT_NAME": "Contact", + "AGENT_NAME": "Agent", + "RATING": "Rating", + "FEEDBACK_TEXT": "Feedback comment", + "CONVERSATION": "Conversation", + "CUSTOMER": "Customer", + "RESPONSE": "Response", + "HANDLED_BY": "Handled by" + }, + "UNKNOWN_CUSTOMER": "Unknown customer" + }, + "NO_AGENT": "No assigned agent", + "NO_FEEDBACK": "No feedback provided", + "METRIC": { + "TOTAL_RESPONSES": { + "LABEL": "Total responses", + "TOOLTIP": "Total number of responses collected" + }, + "SATISFACTION_SCORE": { + "LABEL": "Satisfaction score", + "TOOLTIP": "Total number of positive responses / Total number of responses * 100" + }, + "RESPONSE_RATE": { + "LABEL": "Response rate", + "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100" + }, + "RATING_DISTRIBUTION": "Rating distribution" + }, + "REVIEW_NOTES": { + "TITLE": "Review notes", + "PLACEHOLDER": "Add review notes about this rating...", + "SAVE": "Save", + "CANCEL": "Cancel", + "SAVING": "Saving...", + "SAVED": "Notes saved successfully", + "SAVE_ERROR": "Failed to save notes", + "UPDATED_BY": "Updated by {name} {time}", + "UPDATED_BY_LABEL": "Updated by", + "PAYWALL": { + "TITLE": "Upgrade to add review notes", + "AVAILABLE_ON": "The review notes feature is only available in the Business and Enterprise plans.", + "UPGRADE_PROMPT": "Add internal context to every CSAT response with review notes. Capture what really happened, spot patterns faster, and make better decisions from your feedback.", + "UPGRADE_NOW": "Upgrade now", + "CANCEL_ANYTIME": "You can change or cancel your plan anytime" + } + } + }, + "BOT_REPORTS": { + "HEADER": "Bot Reports", + "METRIC": { + "TOTAL_CONVERSATIONS": { + "LABEL": "No. of Conversations", + "TOOLTIP": "Total number of conversations handled by the bot" + }, + "TOTAL_RESPONSES": { + "LABEL": "Total Responses", + "TOOLTIP": "Total number of responses sent by the bot" + }, + "RESOLUTION_RATE": { + "LABEL": "Resolution Rate", + "TOOLTIP": "Total number of conversations resolved by the bot / Total number of conversations handled by the bot * 100" + }, + "HANDOFF_RATE": { + "LABEL": "Handoff Rate", + "TOOLTIP": "Total number of conversations handed off to agents / Total number of conversations handled by the bot * 100" + } + } + }, + "OVERVIEW_REPORTS": { + "HEADER": "Overview", + "LIVE": "Live", + "ACCOUNT_CONVERSATIONS": { + "HEADER": "Open Conversations", + "LOADING_MESSAGE": "Loading conversation metrics...", + "OPEN": "Open", + "UNATTENDED": "Unattended", + "UNASSIGNED": "Unassigned", + "PENDING": "Pending" + }, + "CONVERSATION_HEATMAP": { + "HEADER": "Conversation Traffic", + "NO_CONVERSATIONS": "No conversations", + "CONVERSATION": "{count} conversation", + "CONVERSATIONS": "{count} conversations", + "DOWNLOAD_REPORT": "Download report" + }, + "RESOLUTION_HEATMAP": { + "HEADER": "Resolutions", + "NO_CONVERSATIONS": "No conversations", + "CONVERSATION": "{count} conversation", + "CONVERSATIONS": "{count} conversations", + "DOWNLOAD_REPORT": "Download report" + }, + "AGENT_CONVERSATIONS": { + "HEADER": "Conversations by agents", + "LOADING_MESSAGE": "Loading agent metrics...", + "NO_AGENTS": "There are no conversations by agents", + "TABLE_HEADER": { + "AGENT": "Agent", + "OPEN": "Open", + "UNATTENDED": "Unattended", + "STATUS": "Status" + } + }, + "TEAM_CONVERSATIONS": { + "ALL_TEAMS": "All Teams", + "HEADER": "Conversations by teams", + "LOADING_MESSAGE": "Loading team metrics...", + "NO_TEAMS": "There is no data available", + "TABLE_HEADER": { + "TEAM": "Team", + "OPEN": "Open", + "UNATTENDED": "Unattended", + "STATUS": "Status" + } + }, + "AGENT_STATUS": { + "HEADER": "Agent status", + "ONLINE": "Online", + "BUSY": "Busy", + "OFFLINE": "Offline" + } + }, + "DAYS_OF_WEEK": { + "SUNDAY": "Sunday", + "MONDAY": "Monday", + "TUESDAY": "Tuesday", + "WEDNESDAY": "Wednesday", + "THURSDAY": "Thursday", + "FRIDAY": "Friday", + "SATURDAY": "Saturday" + }, + "SLA_REPORTS": { + "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", + "DROPDOWN": { + "ADD_FIlTER": "Add filter", + "CLEAR_ALL": "Clear all", + "CLEAR_FILTER": "Clear filter", + "EMPTY_LIST": "No results found", + "NO_FILTER": "No filters available", + "SEARCH": "Search filter", + "INPUT_PLACEHOLDER": { + "SLA": "SLA name", + "AGENTS": "Agent name", + "INBOXES": "Inbox name", + "LABELS": "Label name", + "TEAMS": "Team name" + }, + "SLA": "SLA Policy", + "INBOXES": "Inbox", + "AGENTS": "Agent", + "LABELS": "Label", + "TEAMS": "Team" + }, + "WITH": "with", + "METRICS": { + "HIT_RATE": { + "LABEL": "Hit Rate", + "TOOLTIP": "Percentage of SLAs created were completed successfully" + }, + "NO_OF_MISSES": { + "LABEL": "Number of Misses", + "TOOLTIP": "Total SLA misses in a certain period" + }, + "NO_OF_CONVERSATIONS": { + "LABEL": "Number of Conversations", + "TOOLTIP": "Total number of conversations with SLA" + } + }, + "TABLE": { + "HEADER": { + "POLICY": "Policy", + "CONVERSATION": "Conversation", + "AGENT": "Agent" + }, + "VIEW_DETAILS": "View Details" + } + }, + "SUMMARY_REPORTS": { + "INBOX": "Inbox", + "AGENT": "Agent", + "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" + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/resetPassword.json b/app/javascript/dashboard/i18n/locale/uz/resetPassword.json new file mode 100644 index 000000000..955696b0c --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/resetPassword.json @@ -0,0 +1,17 @@ +{ + "RESET_PASSWORD": { + "TITLE": "Reset password", + "DESCRIPTION": "Enter the email address you use to log in to Chatwoot to get the password reset instructions.", + "GO_BACK_TO_LOGIN": "If you want to go back to the login page,", + "EMAIL": { + "LABEL": "Email", + "PLACEHOLDER": "Please enter your email.", + "ERROR": "Please enter a valid email." + }, + "API": { + "SUCCESS_MESSAGE": "Password reset link has been sent to your email.", + "ERROR_MESSAGE": "Could not connect to Woot server. Please try again." + }, + "SUBMIT": "Submit" + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/search.json b/app/javascript/dashboard/i18n/locale/uz/search.json new file mode 100644 index 000000000..2fc8e7998 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/search.json @@ -0,0 +1,68 @@ +{ + "SEARCH": { + "TABS": { + "ALL": "All results", + "CONTACTS": "Contacts", + "CONVERSATIONS": "Conversations", + "MESSAGES": "Messages", + "ARTICLES": "Articles" + }, + "SECTION": { + "CONTACTS": "Contacts", + "CONVERSATIONS": "Conversations", + "MESSAGES": "Messages", + "ARTICLES": "Articles" + }, + "VIEW_MORE": "View more", + "LOAD_MORE": "Load more", + "SEARCHING_DATA": "Searching", + "LOADING_DATA": "Loading", + "EMPTY_STATE": "No {item} found for query '{query}'", + "EMPTY_STATE_FULL": "No results found for query '{query}'", + "PLACEHOLDER_KEYBINDING": "/to focus", + "INPUT_PLACEHOLDER": "Type 3 or more characters to search", + "RECENT_SEARCHES": "Recent searches", + "CLEAR_ALL": "Clear all", + "MOST_RECENT": "Most recent", + "EMPTY_STATE_DEFAULT": "Search by conversation id, email, phone number, messages for better search results. ", + "BOT_LABEL": "Bot", + "READ_MORE": "Read more", + "READ_LESS": "Read less", + "WROTE": "wrote:", + "FROM": "From", + "EMAIL": "Email", + "EMAIL_SUBJECT": "Subject", + "PRIVATE": "Private note", + "TRANSCRIPT": "Transcript", + "CREATED_AT": "created {time}", + "UPDATED_AT": "updated {time}", + "SORT_BY": { + "RELEVANCE": "Relevance" + }, + "DATE_RANGE": { + "LAST_7_DAYS": "Last 7 days", + "LAST_30_DAYS": "Last 30 days", + "LAST_60_DAYS": "Last 60 days", + "LAST_90_DAYS": "Last 90 days", + "CUSTOM_RANGE": "Custom range:", + "CREATED_BETWEEN": "Created between", + "AND": "and", + "APPLY": "Apply", + "BEFORE_DATE": "Before {date}", + "AFTER_DATE": "After {date}", + "TIME_RANGE": "Filter by time", + "CLEAR_FILTER": "Clear filter" + }, + "FILTERS": { + "FILTER_MESSAGE": "Filter messages by:", + "FROM": "Sender", + "IN": "Inbox", + "AGENTS": "Agents", + "CONTACTS": "Contacts", + "INBOXES": "Inboxes", + "NO_AGENTS": "No agents found", + "NO_CONTACTS": "Start by searching to see results", + "NO_INBOXES": "No inboxes found" + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/sessionLimit.json b/app/javascript/dashboard/i18n/locale/uz/sessionLimit.json new file mode 100644 index 000000000..926745c23 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/sessionLimit.json @@ -0,0 +1,12 @@ +{ + "SESSION_LIMIT": { + "TITLE": "Active session limit reached", + "DESCRIPTION": "You have reached your limit of active sessions. Please end a session before logging in.", + "END": "End", + "END_ALL": "End all sessions", + "LOG_IN": "Log in", + "CANCEL": "Back to login", + "UNKNOWN_DEVICE": "Unknown device", + "STARTED": "Started" + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/setNewPassword.json b/app/javascript/dashboard/i18n/locale/uz/setNewPassword.json new file mode 100644 index 000000000..4908dad02 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/setNewPassword.json @@ -0,0 +1,23 @@ +{ + "SET_NEW_PASSWORD": { + "TITLE": "Set new password", + "PASSWORD": { + "LABEL": "Password", + "PLACEHOLDER": "Password", + "ERROR": "Password is too short." + }, + "CONFIRM_PASSWORD": { + "LABEL": "Confirm password", + "PLACEHOLDER": "Confirm Password", + "ERROR": "Passwords do not match." + }, + "API": { + "SUCCESS_MESSAGE": "Successfully changed the password.", + "ERROR_MESSAGE": "Could not connect to Woot server. Please try again." + }, + "CAPTCHA": { + "ERROR": "Verification expired. Please solve captcha again." + }, + "SUBMIT": "Submit" + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/settings.json b/app/javascript/dashboard/i18n/locale/uz/settings.json new file mode 100644 index 000000000..43409fa88 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/settings.json @@ -0,0 +1,1068 @@ +{ + "PROFILE_SETTINGS": { + "LINK": "Profile Settings", + "TITLE": "Profile Settings", + "BTN_TEXT": "Update Profile", + "DELETE_AVATAR": "Delete Avatar", + "AVATAR_DELETE_SUCCESS": "Avatar has been deleted successfully", + "AVATAR_DELETE_FAILED": "There is an error while deleting avatar, please try again", + "UPDATE_SUCCESS": "Your profile has been updated successfully", + "PASSWORD_UPDATE_SUCCESS": "Your password has been changed successfully", + "AFTER_EMAIL_CHANGED": "Your profile has been updated successfully, please login again as your login credentials are changed", + "FORM": { + "PICTURE": "Profile Picture", + "AVATAR": "Profile Image", + "ERROR": "Please fix form errors", + "REMOVE_IMAGE": "Remove", + "UPLOAD_IMAGE": "Upload image", + "UPDATE_IMAGE": "Update image", + "PROFILE_SECTION": { + "TITLE": "Profile", + "NOTE": "Your email address is your identity and is used to log in." + }, + "SEND_MESSAGE": { + "TITLE": "Hotkey to send messages", + "NOTE": "You can select a hotkey (either Enter or Cmd/Ctrl+Enter) based on your preference of writing.", + "UPDATE_SUCCESS": "Your settings have been updated successfully", + "CARD": { + "ENTER_KEY": { + "HEADING": "Enter (↵)", + "CONTENT": "Send messages by pressing Enter key instead of clicking the send button." + }, + "CMD_ENTER_KEY": { + "HEADING": "Cmd/Ctrl + Enter (⌘ + ↵)", + "CONTENT": "Send messages by pressing Cmd/Ctrl + enter key instead of clicking the send button." + } + } + }, + "INTERFACE_SECTION": { + "TITLE": "Interface", + "NOTE": "Customize the look and feel of your Chatwoot dashboard.", + "FONT_SIZE": { + "TITLE": "Font size", + "NOTE": "Adjust the text size across the dashboard based on your preference.", + "UPDATE_SUCCESS": "Your font settings have been updated successfully", + "UPDATE_ERROR": "There is an error while updating the font settings, please try again", + "OPTIONS": { + "SMALLER": "Smaller", + "SMALL": "Small", + "DEFAULT": "Default", + "LARGE": "Large", + "LARGER": "Larger", + "EXTRA_LARGE": "Extra Large" + } + }, + "LANGUAGE": { + "TITLE": "Preferred Language", + "NOTE": "Choose the language you want to use.", + "UPDATE_SUCCESS": "Your Language settings have been updated successfully", + "UPDATE_ERROR": "There is an error while updating the language settings, please try again", + "USE_ACCOUNT_DEFAULT": "Use account default" + } + }, + "MESSAGE_SIGNATURE_SECTION": { + "TITLE": "Personal message signature", + "NOTE": "Create a unique message signature to appear at the end of every message you send from any inbox. You can also include an inline image, which is supported in live-chat, email, and API inboxes.", + "BTN_TEXT": "Save message signature", + "API_ERROR": "Couldn't save signature! Try again", + "API_SUCCESS": "Signature saved successfully", + "IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again", + "IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save to save the signature", + "IMAGE_UPLOAD_SIZE_ERROR": "Image size should be less than {size}MB", + "INLINE_IMAGE_WARNING": "Pasted inline images were removed. Please use the image upload button to add images to your signature." + }, + "MESSAGE_SIGNATURE": { + "LABEL": "Message Signature", + "ERROR": "Message Signature cannot be empty", + "PLACEHOLDER": "Insert your personal message signature here." + }, + "PASSWORD_SECTION": { + "TITLE": "Password", + "NOTE": "Updating your password would reset your logins in multiple devices.", + "BTN_TEXT": "Change password" + }, + "SECURITY_SECTION": { + "TITLE": "Security", + "NOTE": "Manage additional security features for your account.", + "MFA_BUTTON": "Manage Two-Factor Authentication" + }, + "SESSIONS_SECTION": { + "TITLE": "Active Sessions", + "NOTE": "These are the devices currently logged in to your account.", + "CURRENT": "Current session", + "REVOKE": "Revoke", + "REVOKE_SUCCESS": "Session revoked successfully", + "REVOKE_ERROR": "Unable to revoke session. Please try again.", + "FETCH_ERROR": "Unable to fetch sessions. Please try again.", + "LAST_ACTIVE": "Last active", + "UNKNOWN_DEVICE": "Unknown device" + }, + "ACCESS_TOKEN": { + "TITLE": "Access Token", + "NOTE": "This token can be used if you are building an API based integration", + "PAID_PLAN_NOTE": "API access tokens are available on paid plans.", + "COPY": "Copy", + "RESET": "Reset", + "CONFIRM_RESET": "Are you sure?", + "CONFIRM_HINT": "Click again to confirm", + "RESET_SUCCESS": "Access token regenerated successfully", + "RESET_ERROR": "Unable to regenerate access token. Please try again" + }, + "AUDIO_NOTIFICATIONS_SECTION": { + "TITLE": "Audio Alerts", + "NOTE": "Enable audio alerts in dashboard for new messages and conversations.", + "PLAY": "Play sound", + "ALERT_TYPES": { + "NONE": "None", + "MINE": "Assigned", + "ALL": "All", + "ASSIGNED": "My assigned conversations", + "UNASSIGNED": "Unassigned conversations", + "NOTME": "Open conversations assigned to others" + }, + "ALERT_COMBINATIONS": { + "NONE": "You haven't selected any options, you won't receive any audio alerts.", + "ASSIGNED": "You'll receive alerts for conversations assigned to you.", + "UNASSIGNED": "You'll receive alerts for any unassigned conversations.", + "NOTME": "You'll receive alerts for conversations assigned to others.", + "ASSIGNED+UNASSIGNED": "You'll receive alerts for your assigned conversations and any unattended ones.", + "ASSIGNED+NOTME": "You'll receive alerts for conversations assigned to you and to others, but not for unassigned ones.", + "NOTME+UNASSIGNED": "You'll receive alerts for unattended conversations and those assigned to others.", + "ASSIGNED+NOTME+UNASSIGNED": "You'll receive alerts for all conversations." + }, + "ALERT_TYPE": { + "TITLE": "Alert events for conversations", + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" + }, + "DEFAULT_TONE": { + "TITLE": "Alert tone:" + }, + "CONDITIONS": { + "TITLE": "Alert conditions:", + "CONDITION_ONE": "Send audio alerts only if the browser window is not active", + "CONDITION_TWO": "Send alerts every 30s until all the assigned conversations are read" + }, + "SOUND_PERMISSION_ERROR": "Autoplay is disabled in your browser. To hear alerts automatically, enable sound permission in your browser settings or interact with the page.", + "READ_MORE": "Read more" + }, + "EMAIL_NOTIFICATIONS_SECTION": { + "TITLE": "Email Notifications", + "NOTE": "Update your email notification preferences here", + "CONVERSATION_ASSIGNMENT": "Send email notifications when a conversation is assigned to me", + "CONVERSATION_CREATION": "Send email notifications when a new conversation is created", + "CONVERSATION_MENTION": "Send email notifications when you are mentioned in a conversation", + "ASSIGNED_CONVERSATION_NEW_MESSAGE": "Send email notifications when a new message is created in an assigned conversation", + "PARTICIPATING_CONVERSATION_NEW_MESSAGE": "Send email notifications when a new message is created in a participating conversation", + "SLA_MISSED_FIRST_RESPONSE": "Send email notifications when a conversation misses first response SLA", + "SLA_MISSED_NEXT_RESPONSE": "Send email notifications when a conversation misses next response SLA", + "SLA_MISSED_RESOLUTION": "Send email notifications when a conversation misses resolution SLA" + }, + "NOTIFICATIONS": { + "TITLE": "Notification preferences", + "TYPE_TITLE": "Notification type", + "EMAIL": "Email", + "PUSH": "Push notification", + "TYPES": { + "CONVERSATION_CREATED": "A new conversation is created", + "CONVERSATION_ASSIGNED": "A conversation is assigned to you", + "CONVERSATION_MENTION": "You are mentioned in a conversation", + "ASSIGNED_CONVERSATION_NEW_MESSAGE": "A new message is created in an assigned conversation", + "PARTICIPATING_CONVERSATION_NEW_MESSAGE": "A new message is created in a participating conversation", + "SLA_MISSED_FIRST_RESPONSE": "A conversation misses first response SLA", + "SLA_MISSED_NEXT_RESPONSE": "A conversation misses next response SLA", + "SLA_MISSED_RESOLUTION": "A conversation misses resolution SLA" + }, + "BROWSER_PERMISSION": "Enable push notifications for your browser so you’re able to receive them" + }, + "API": { + "UPDATE_SUCCESS": "Your notification preferences are updated successfully", + "UPDATE_ERROR": "There is an error while updating the preferences, please try again" + }, + "PUSH_NOTIFICATIONS_SECTION": { + "TITLE": "Push Notifications", + "NOTE": "Update your push notification preferences here", + "CONVERSATION_ASSIGNMENT": "Send push notifications when a conversation is assigned to me", + "CONVERSATION_CREATION": "Send push notifications when a new conversation is created", + "CONVERSATION_MENTION": "Send push notifications when you are mentioned in a conversation", + "ASSIGNED_CONVERSATION_NEW_MESSAGE": "Send push notifications when a new message is created in an assigned conversation", + "PARTICIPATING_CONVERSATION_NEW_MESSAGE": "Send push notifications when a new message is created in a participating conversation", + "HAS_ENABLED_PUSH": "You have enabled push for this browser.", + "REQUEST_PUSH": "Enable push notifications", + "SLA_MISSED_FIRST_RESPONSE": "Send push notifications when a conversation misses first response SLA", + "SLA_MISSED_NEXT_RESPONSE": "Send push notifications when a conversation misses next response SLA", + "SLA_MISSED_RESOLUTION": "Send push notifications when a conversation misses resolution SLA" + }, + "PROFILE_IMAGE": { + "LABEL": "Profile Image" + }, + "NAME": { + "LABEL": "Your full name", + "ERROR": "Please enter a valid full name", + "PLACEHOLDER": "Please enter your full name" + }, + "DISPLAY_NAME": { + "LABEL": "Display name", + "ERROR": "Please enter a valid display name", + "PLACEHOLDER": "Please enter a display name, this would be displayed in conversations" + }, + "AVAILABILITY": { + "LABEL": "Availability", + "STATUS": { + "ONLINE": "Online", + "BUSY": "Busy", + "OFFLINE": "Offline" + }, + "SET_AVAILABILITY_SUCCESS": "Availability has been set successfully", + "SET_AVAILABILITY_ERROR": "Couldn't set availability, please try again", + "IMPERSONATING_ERROR": "Cannot change availability while impersonating a user" + }, + "EMAIL": { + "LABEL": "Your email address", + "ERROR": "Please enter a valid email address", + "PLACEHOLDER": "Please enter your email address, this would be displayed in conversations" + }, + "CURRENT_PASSWORD": { + "LABEL": "Current password", + "ERROR": "Please enter the current password", + "PLACEHOLDER": "Please enter the current password" + }, + "PASSWORD": { + "LABEL": "New password", + "ERROR": "Please enter a password of length 6 or more", + "PLACEHOLDER": "Please enter a new password" + }, + "PASSWORD_CONFIRMATION": { + "LABEL": "Confirm new password", + "ERROR": "Confirm password should match the password", + "PLACEHOLDER": "Please re-enter your new password" + } + } + }, + "SIDEBAR_ITEMS": { + "CHANGE_AVAILABILITY_STATUS": "Change", + "CHANGE_ACCOUNTS": "Switch account", + "SWITCH_ACCOUNT": "Switch account", + "CONTACT_SUPPORT": "Contact support", + "SELECTOR_SUBTITLE": "Select an account from the following list", + "PROFILE_SETTINGS": "Profile settings", + "YEAR_IN_REVIEW": "Year in Review", + "KEYBOARD_SHORTCUTS": "Keyboard shortcuts", + "APPEARANCE": "Change appearance", + "SUPER_ADMIN_CONSOLE": "SuperAdmin console", + "DOCS": "Read documentation", + "CHANGELOG": "Changelog", + "LOGOUT": "Log out" + }, + "APP_GLOBAL": { + "TRIAL_MESSAGE": "days trial remaining.", + "TRAIL_BUTTON": "Buy Now", + "DELETED_USER": "Deleted User", + "EMAIL_VERIFICATION_PENDING": "It seems that you haven't verified your email address yet. Please check your inbox for the verification email.", + "RESEND_VERIFICATION_MAIL": "Resend verification email", + "EMAIL_VERIFICATION_SENT": "Verification email has been sent. Please check your inbox.", + "ACCOUNT_SUSPENDED": { + "TITLE": "Account Suspended", + "MESSAGE": "Your account has been suspended due to activity that may violate our policies. If you believe this is a mistake, please contact our support team." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" + } + }, + "COMPONENTS": { + "CODE": { + "BUTTON_TEXT": "Copy", + "CODEPEN": "Open in CodePen", + "COPY_SUCCESSFUL": "Copied to clipboard" + }, + "SHOW_MORE_BLOCK": { + "SHOW_MORE": "Show More", + "SHOW_LESS": "Show Less" + }, + "FILE_BUBBLE": { + "DOWNLOAD": "Download", + "UPLOADING": "Yuklanmoqda...", + "INSTAGRAM_STORY_UNAVAILABLE": "This story is no longer available.", + "INSTAGRAM_STORY_REPLY": "Replied to your story:" + }, + "LOCATION_BUBBLE": { + "SEE_ON_MAP": "See on map" + }, + "FORM_BUBBLE": { + "SUBMIT": "Submit" + }, + "MEDIA": { + "IMAGE_UNAVAILABLE": "This image is no longer available.", + "LOADING_FAILED": "Loading failed" + } + }, + "CONFIRM_EMAIL": "Verifying...", + "SETTINGS": { + "INBOXES": { + "NEW_INBOX": "Add Inbox" + } + }, + "SIDEBAR": { + "NO_ITEMS": "No items", + "CURRENTLY_VIEWING_ACCOUNT": "Currently viewing:", + "SWITCH": "Switch", + "INBOX_VIEW": "Inbox View", + "CONVERSATIONS": "Conversations", + "INBOX": "My Inbox", + "ALL_CONVERSATIONS": "All Conversations", + "MENTIONED_CONVERSATIONS": "Mentions", + "PARTICIPATING_CONVERSATIONS": "Participating", + "UNATTENDED_CONVERSATIONS": "Unattended", + "REPORTS": "Reports", + "SETTINGS": "Settings", + "CONTACTS": "Contacts", + "ACTIVE": "Active", + "COMPANIES": "Companies", + "ALL_COMPANIES": "All Companies", + "CAPTAIN": "Captain", + "CAPTAIN_ASSISTANTS": "Assistants", + "CAPTAIN_OVERVIEW": "Overview", + "CAPTAIN_DOCUMENTS": "Documents", + "CAPTAIN_RESPONSES": "FAQs", + "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Inboxes", + "CAPTAIN_SETTINGS": "Settings", + "HOME": "Home", + "AGENTS": "Agents", + "AGENT_BOTS": "Bots", + "AUDIT_LOGS": "Audit Logs", + "INBOXES": "Inboxes", + "NOTIFICATIONS": "Notifications", + "CANNED_RESPONSES": "Canned Responses", + "INTEGRATIONS": "Integrations", + "DATA": "Data", + "PROFILE_SETTINGS": "Profile Settings", + "ACCOUNT_SETTINGS": "Account Settings", + "APPLICATIONS": "Applications", + "LABELS": "Labels", + "CUSTOM_ATTRIBUTES": "Custom Attributes", + "AUTOMATION": "Automation", + "MACROS": "Macros", + "TEAMS": "Teams", + "BILLING": "Billing", + "CUSTOM_VIEWS_FOLDER": "Folders", + "CUSTOM_VIEWS_SEGMENTS": "Segments", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with", + "NEW_LABEL": "New label", + "NEW_TEAM": "New team", + "NEW_INBOX": "New inbox", + "REPORTS_CONVERSATION": "Conversations", + "CSAT": "CSAT", + "LIVE_CHAT": "Live Chat", + "SMS": "SMS", + "WHATSAPP": "WhatsApp", + "CAMPAIGNS": "Campaigns", + "ONGOING": "Ongoing", + "ONE_OFF": "One off", + "REPORTS_SLA": "SLA", + "REPORTS_BOT": "Bot", + "REPORTS_AGENT": "Agents", + "REPORTS_LABEL": "Labels", + "REPORTS_INBOX": "Inbox", + "REPORTS_TEAM": "Team", + "AGENT_ASSIGNMENT": "Agent Assignment", + "SET_AVAILABILITY_TITLE": "Set yourself as", + "SET_YOUR_AVAILABILITY": "Set your availability", + "SLA": "SLA", + "CUSTOM_ROLES": "Custom Roles", + "BETA": "Beta", + "REPORTS_OVERVIEW": "Overview", + "REAUTHORIZE": "Your inbox connection has expired, please reconnect\n to continue receiving and sending messages", + "HELP_CENTER": { + "TITLE": "Help Center", + "ARTICLES": "Articles", + "CATEGORIES": "Categories", + "LOCALES": "Locales", + "SETTINGS": "Settings" + }, + "CHANNELS": "Channels", + "SET_AUTO_OFFLINE": { + "TEXT": "Mark offline automatically", + "INFO_TEXT": "Let the system automatically mark you offline when you aren't using the app or dashboard.", + "INFO_SHORT": "Automatically mark offline when you aren't using the app." + }, + "SORT_TOOLTIP": "Sort", + "SORT_BY": "Sort by", + "SORT_GROUPS": { + "CREATED": "Sort by date of creation", + "ALPHABETICAL": "Sort in alphabetical order", + "UNREAD_COUNT": "Sort by unread count" + }, + "SORT_OPTIONS": { + "CREATED_DESC": "Newest first", + "CREATED_ASC": "Oldest first", + "ALPHABETICAL_ASC": "Ascending (A - Z)", + "ALPHABETICAL_DESC": "Descending (Z - A)", + "UNREAD_COUNT_DESC": "Highest first", + "UNREAD_COUNT_ASC": "Lowest first" + }, + "DOCS": "Read docs", + "SECURITY": "Security", + "CAPTAIN_AI": "Captain", + "CONVERSATION_WORKFLOW": "Conversation Workflow" + }, + "DATA_IMPORTS": { + "HEADER": "Data", + "DESCRIPTION": "Bring your existing contacts and past conversations into this account from another support tool. Each import runs in the background, so you can keep working while it finishes, track its progress, and review anything that was skipped along the way.", + "LOADING": "Fetching imports", + "DEFAULT_IMPORT_NAME": "Intercom import", + "TABS": { + "IMPORT": "Import", + "EXPORT": "Export" + }, + "TYPES": { + "CONTACTS": "Contacts", + "CONVERSATIONS": "Conversations", + "MESSAGES": "Messages" + }, + "DRAWER": { + "TITLE": "New import", + "SOURCE": "Source", + "NAME": "Import name", + "NAME_PLACEHOLDER": "July Intercom migration", + "ACCESS_KEY": "Intercom access key", + "ACCESS_KEY_PLACEHOLDER": "Paste your Intercom access key", + "DATA_TYPES": "Data to import", + "VALIDATING": "Validating access key...", + "VALID_KEY": "Access key validated.", + "INVALID_KEY": "Could not validate this access key.", + "ACTIVE_IMPORT": "Wait for the active import to finish before starting another one.", + "CANCEL": "Cancel", + "IMPORT": "Import" + }, + "EXPORT": { + "TITLE": "Exports are on the way", + "DESCRIPTION": "Export your contacts and conversations out of this account. This workflow is coming soon.", + "COMING_SOON": "Coming soon" + }, + "TABLE": { + "TITLE": "Recent imports", + "EMPTY": "No imports yet", + "EMPTY_DESCRIPTION": "Start an import to bring your existing customer history into this account.", + "NEW_IMPORT": "Import", + "COUNT": "{count} imports", + "UNNAMED": "Untitled import", + "IMPORTED_COUNT": "{count} imported", + "VIEW": "View import", + "NAME": "Name", + "TYPE": "Type", + "STATUS": "Status", + "IMPORTED": "Imported", + "CREATED": "Created", + "ABANDON": "Abandon" + }, + "DETAIL": { + "BACK": "Back to imports", + "ERRORS": "Errors", + "SKIP_LOGS": "Skip logs", + "SOURCE": "Source", + "IMPORT_TYPES": "Import types", + "CREATED": "Created", + "DURATION": "Duration", + "INITIATED_BY": "Started by", + "PROGRESS": "Import progress", + "PROGRESS_WITH_TOTAL": "{imported} of {total} imported", + "PROGRESS_WITHOUT_TOTAL": "{imported} imported", + "PROGRESS_OF_TOTAL": "of {total} imported", + "PROGRESS_IMPORTED": "imported", + "LAST_UPDATED_TOOLTIP": "Last updated {time}", + "NO_SKIP_LOGS": "No skipped or failed records recorded.", + "DOWNLOAD_SKIP_LOGS": "Download CSV", + "DOWNLOAD_ERROR_LOGS": "Download CSV", + "ALL_SKIP_LOGS": "All", + "KIND": "Kind", + "NO_ERRORS": "No errors recorded.", + "ERROR_CODE": "Code", + "SOURCE_OBJECT": "Source object", + "MESSAGE": "Xabar" + }, + "MONITOR": { + "LIVE": "Live updates every {seconds}s", + "LAST_UPDATED": "Last updated {time}", + "REFRESH": "Refresh", + "REFRESHING": "Refreshing", + "STAGES": { + "unknown": "Waiting for update", + "queued": "Queued", + "contacts": "Importing contacts", + "conversations": "Importing conversations", + "finalizing": "Finalizing import", + "completed": "Completed", + "completed_with_errors": "Completed with errors", + "failed": "Failed", + "abandoned": "Abandoned" + } + }, + "ALERTS": { + "IMPORT_STARTED": "Intercom import has started.", + "IMPORT_ABANDONED": "Intercom import has been abandoned.", + "IMPORT_FAILED": "Could not start the Intercom import." + } + }, + "CAPTAIN_SETTINGS": { + "TITLE": "Captain Settings", + "DESCRIPTION": "Configure your AI models and features for Captain. Captain follows a credit based billing, you will be charged credits for every action Captain takes based on the model selected.", + "LOADING": "Loading Captain configuration...", + "LINK_TEXT": "Learn more about Captain Credits", + "NOT_ENABLED": "Captain is not enabled for your account. Please upgrade your plan to access Captain features.", + "MODEL_CONFIG": { + "TITLE": "Model Configuration", + "DESCRIPTION": "Select AI models for different features.", + "SELECT_MODEL": "Select model", + "CREDITS_PER_MESSAGE": "{credits} credit/message", + "COMING_SOON": "Coming soon", + "EDITOR": { + "TITLE": "Editor Features", + "DESCRIPTION": "Powers smart compose, grammar corrections, tone adjustments, and content enhancement in your message editor." + }, + "ASSISTANT": { + "TITLE": "Assistant", + "DESCRIPTION": "Handles automated responses, conversation summaries, and intelligent reply suggestions for customer interactions." + }, + "COPILOT": { + "TITLE": "Co-pilot", + "DESCRIPTION": "Provides real-time contextual suggestions, knowledge base recommendations, and proactive insights during conversations." + } + }, + "FEATURES": { + "TITLE": "Features", + "DESCRIPTION": "Enable or disable AI-powered features.", + "AUDIO_TRANSCRIPTION": { + "TITLE": "Audio Transcription", + "DESCRIPTION": "Automatically convert voice messages and call recordings into searchable text transcripts.", + "MODEL_TITLE": "Audio Transcription Model", + "MODEL_DESCRIPTION": "Select the AI model to use for converting audio messages into text transcripts" + }, + "HELP_CENTER_SEARCH": { + "TITLE": "Help Center Search Indexing", + "DESCRIPTION": "Use AI for context aware search inside your help center articles." + }, + "LABEL_SUGGESTION": { + "TITLE": "Label Suggestion", + "DESCRIPTION": "Automatically suggest relevant labels and tags for conversations based on content analysis and context.", + "MODEL_TITLE": "Label Suggestion Model", + "MODEL_DESCRIPTION": "Select the AI model to use for analyzing conversations and suggesting appropriate labels" + } + }, + "API": { + "SUCCESS": "Captain settings updated successfully.", + "ERROR": "Failed to update Captain settings. Please try again." + } + }, + "BILLING_SETTINGS": { + "TITLE": "Billing", + "DESCRIPTION": "Manage your subscription here, upgrade your plan and get more for your team.", + "CURRENT_PLAN": { + "TITLE": "Current Plan", + "PLAN_NOTE": "You are currently subscribed to the **{plan}** plan with **{quantity}** licenses", + "SEAT_COUNT": "Number of seats", + "RENEWS_ON": "Renews on", + "CURRENCY": "Currency" + }, + "CURRENCY": { + "SELECT": { + "TITLE": "Choose your billing currency", + "DESCRIPTION": "Select the currency you'd like to be billed in. This can't be changed once your subscription is created." + }, + "OPTIONS": { + "USD": "US Dollar (USD)", + "BRL": "Brazilian Real (BRL)" + } + }, + "VIEW_PRICING": "View Pricing", + "MANAGE_SUBSCRIPTION": { + "TITLE": "Manage your subscription", + "DESCRIPTION": "View your previous invoices, edit your billing details, or cancel your subscription.", + "BUTTON_TXT": "Go to the billing portal" + }, + "CAPTAIN": { + "TITLE": "Captain", + "DESCRIPTION": "Manage usage and credits for Captain AI.", + "BUTTON_TXT": "Buy more credits", + "DOCUMENTS": "Documents", + "RESPONSES": "Credits", + "UPGRADE": "Captain is not available on the free plan, upgrade now to get access to assistants, copilot and more.", + "REFRESH_CREDITS": "Refresh" + }, + "CHAT_WITH_US": { + "TITLE": "Need help?", + "DESCRIPTION": "Do you face any issues in billing? We are here to help.", + "BUTTON_TXT": "Biz bilan suhbatlashing" + }, + "NO_BILLING_USER": "Your billing account is being configured. Please refresh the page and try again.", + "TOPUP": { + "BUY_CREDITS": "Buy more credits", + "MODAL_TITLE": "Buy AI Credits", + "MODAL_DESCRIPTION": "Purchase additional credits for Captain AI.", + "CREDITS": "CREDITS", + "ONE_TIME": "one-time", + "POPULAR": "Most Popular", + "NOTE_TITLE": "Note:", + "NOTE_DESCRIPTION": "Credits are added immediately and expire in 6 months. An active subscription is required to use credits. Purchased credits are consumed after your monthly plan credits.", + "CANCEL": "Cancel", + "PURCHASE": "Purchase Credits", + "LOADING": "Loading options...", + "FETCH_ERROR": "Failed to load credit options. Please try again.", + "RETRY": "Retry", + "PURCHASE_ERROR": "Failed to process purchase. Please try again.", + "PURCHASE_SUCCESS": "Successfully added {credits} credits to your account", + "CONFIRM": { + "TITLE": "Confirm Purchase", + "DESCRIPTION": "You are about to purchase {credits} credits for {amount}.", + "INSTANT_DEDUCTION_NOTE": "Your saved card will be charged immediately upon confirmation.", + "GO_BACK": "Go Back", + "CONFIRM_PURCHASE": "Confirm Purchase" + } + } + }, + "SECURITY_SETTINGS": { + "TITLE": "Security", + "DESCRIPTION": "Manage your account security settings.", + "LINK_TEXT": "Learn more about SAML SSO", + "SAML_DISABLED_MESSAGE": "SAML SSO is currently disabled. Please contact your administrator to enable this feature.", + "SAML": { + "TITLE": "SAML SSO", + "NOTE": "Configure SAML single sign-on for your account. Users will authenticate through your identity provider instead of using email/password.", + "ACS_URL": { + "LABEL": "ACS URL", + "TOOLTIP": "Assertion Consumer Service URL - Configure this URL in your IdP as the destination for SAML responses" + }, + "SSO_URL": { + "LABEL": "SSO URL", + "HELP": "The URL where SAML authentication requests will be sent", + "PLACEHOLDER": "https://sso.example.com/saml/sso" + }, + "CERTIFICATE": { + "LABEL": "Signing certificate in PEM format", + "HELP": "The public certificate from your identity provider used to verify SAML responses", + "PLACEHOLDER": "-----BEGIN CERTIFICATE-----\nMIIC..." + }, + "FINGERPRINT": { + "LABEL": "Fingerprint", + "TOOLTIP": "SHA-1 fingerprint of the certificate - Use this to verify the certificate in your IdP configuration" + }, + "COPY_SUCCESS": "Copied to clipboard", + "SP_ENTITY_ID": { + "LABEL": "SP Entity ID", + "HELP": "Unique identifier for this application as a service provider (auto-generated).", + "TOOLTIP": "Unique identifier for Chatwoot as the Service Provider - Configure this in your IdP settings" + }, + "IDP_ENTITY_ID": { + "LABEL": "Identity Provider Entity ID", + "HELP": "Unique identifier for your identity provider (usually found in IdP configuration)", + "PLACEHOLDER": "https://sso.example.com/saml" + }, + "UPDATE_BUTTON": "Update SAML Settings", + "API": { + "SUCCESS": "SAML settings updated successfully", + "ERROR": "Failed to update SAML settings", + "ERROR_LOADING": "Failed to load SAML settings", + "DISABLED": "SAML settings disabled successfully" + }, + "VALIDATION": { + "REQUIRED_FIELDS": "SSO URL, Identity Provider Entity ID, and Certificate are required fields", + "SSO_URL_ERROR": "Please enter a valid SSO URL", + "CERTIFICATE_ERROR": "Certificate is required", + "IDP_ENTITY_ID_ERROR": "Identity Provider Entity ID is required" + }, + "ENTERPRISE_PAYWALL": { + "AVAILABLE_ON": "The SAML SSO feature is only available in the Enterprise plans.", + "UPGRADE_PROMPT": "Upgrade to an Enterprise plan to access SAML single sign-on and other advanced security features.", + "ASK_ADMIN": "Please reach out to your administrator for the upgrade." + }, + "PAYWALL": { + "TITLE": "Upgrade to enable SAML SSO", + "AVAILABLE_ON": "The SAML SSO feature is only available in the Enterprise plans.", + "UPGRADE_PROMPT": "Upgrade your plan to get access to SAML single sign-on and other advanced features.", + "UPGRADE_NOW": "Upgrade now", + "CANCEL_ANYTIME": "You can change or cancel your plan anytime" + }, + "ATTRIBUTE_MAPPING": { + "TITLE": "SAML Attribute Setup", + "DESCRIPTION": "The following attribute mappings must be configured in your identity provider" + }, + "INFO_SECTION": { + "TITLE": "Service Provider Information", + "TOOLTIP": "Copy these values and configure them in your Identity Provider to establish the SAML connection" + } + } + }, + "CONVERSATION_WORKFLOW": { + "INDEX": { + "HEADER": { + "TITLE": "Conversation Workflows", + "DESCRIPTION": "Configure rules and required fields for conversation resolution." + } + }, + "REQUIRED_ATTRIBUTES": { + "TITLE": "Attributes required on resolution", + "DESCRIPTION": "When resolving a conversation, agents will be prompted to fill these attributes if they haven't yet.", + "NO_ATTRIBUTES": "No attributes added yet", + "ADD": { + "TITLE": "Add Attributes", + "SEARCH_PLACEHOLDER": "Search attributes" + }, + "SAVE": { + "SUCCESS": "Required attributes updated", + "ERROR": "Could not update required attributes, please try again" + }, + "MODAL": { + "TITLE": "Resolve conversation", + "DESCRIPTION": "Please fill in the following custom attributes before resolving this conversation", + "ACTIONS": { + "RESOLVE": "Resolve conversation", + "CANCEL": "Cancel" + }, + "PLACEHOLDERS": { + "TEXT": "Write a note...", + "NUMBER": "Enter a number", + "LINK": "Add a link", + "DATE": "Pick a date", + "LIST": "Select an option" + }, + "CHECKBOX": { + "YES": "Yes", + "NO": "No" + } + }, + "PAYWALL": { + "TITLE": "Upgrade to use required attributes", + "AVAILABLE_ON": "The required conversation attributes feature is available on the Business and Enterprise plans.", + "UPGRADE_PROMPT": "Upgrade your plan to prompt agents to fill required attributes before conversation resolution.", + "UPGRADE_NOW": "Upgrade now", + "CANCEL_ANYTIME": "You can change or cancel your plan anytime" + }, + "ENTERPRISE_PAYWALL": { + "AVAILABLE_ON": "The required conversation attributes feature is available on the paid plans.", + "UPGRADE_PROMPT": "Upgrade to a paid plan to enforce required attributes before conversation resolution.", + "ASK_ADMIN": "Please reach out to your administrator for the upgrade." + } + } + }, + "CREATE_ACCOUNT": { + "NO_ACCOUNT_WARNING": "Uh oh! We could not find any Chatwoot accounts. Please create a new account to continue.", + "NEW_ACCOUNT": "New Account", + "SELECTOR_SUBTITLE": "Create a new account", + "API": { + "SUCCESS_MESSAGE": "Account created successfully", + "EXIST_MESSAGE": "Account already exists", + "ERROR_MESSAGE": "Could not connect to Woot Server, Please try again later" + }, + "FORM": { + "NAME": { + "LABEL": "Company Name", + "PLACEHOLDER": "Wayne Enterprises" + }, + "SUBMIT": "Submit", + "CANCEL": "Cancel" + } + }, + "KEYBOARD_SHORTCUTS": { + "TOGGLE_MODAL": "View all shortcuts", + "TITLE": { + "OPEN_CONVERSATION": "Open conversation", + "RESOLVE_AND_NEXT": "Resolve and move to next", + "NAVIGATE_DROPDOWN": "Navigate dropdown items", + "RESOLVE_CONVERSATION": "Resolve Conversation", + "GO_TO_CONVERSATION_DASHBOARD": "Go to Conversation Dashboard", + "ADD_ATTACHMENT": "Add Attachment", + "GO_TO_CONTACTS_DASHBOARD": "Go to Contacts Dashboard", + "TOGGLE_SIDEBAR": "Toggle Sidebar", + "GO_TO_REPORTS_SIDEBAR": "Go to Reports sidebar", + "MOVE_TO_NEXT_TAB": "Move to next tab in conversation list", + "GO_TO_SETTINGS": "Go to Settings", + "SWITCH_TO_PRIVATE_NOTE": "Switch to Private Note", + "SWITCH_TO_REPLY": "Switch to Reply", + "TOGGLE_SNOOZE_DROPDOWN": "Toggle snooze dropdown" + } + }, + "ASSIGNMENT_POLICY": { + "INDEX": { + "HEADER": { + "TITLE": "Agent assignment", + "DESCRIPTION": "Define policies to effectively manage workload and route conversations based on the needs of inboxes and agents. Learn more here" + }, + "ASSIGNMENT_POLICY": { + "TITLE": "Assignment policy", + "DESCRIPTION": "Manage how conversations get assigned in inboxes.", + "FEATURES": [ + "Assign by conversations evenly or by available capacity", + "Add fair distribution rules to avoid overloading any agent", + "Add inboxes to a policy - one policy per inbox" + ] + }, + "AGENT_CAPACITY_POLICY": { + "TITLE": "Agent capacity policy", + "DESCRIPTION": "Manage workload for agents.", + "FEATURES": [ + "Define maximum conversations per inbox", + "Create exceptions based on labels and time", + "Add agents to a policy - one policy per agent" + ] + } + }, + "AGENT_ASSIGNMENT_POLICY": { + "INDEX": { + "HEADER": { + "TITLE": "Assignment policy", + "CREATE_POLICY": "New policy" + }, + "CARD": { + "ORDER": "Order", + "PRIORITY": "Priority", + "ACTIVE": "Active", + "INACTIVE": "Inactive", + "POPOVER": "Added inboxes", + "EDIT": "Edit" + }, + "NO_RECORDS_FOUND": "No assignment policies found" + }, + "CREATE": { + "HEADER": { + "TITLE": "Create assignment policy" + }, + "CREATE_BUTTON": "Create policy", + "API": { + "SUCCESS_MESSAGE": "Assignment policy created successfully", + "ERROR_MESSAGE": "Failed to create assignment policy", + "INBOX_LINKED": "Inbox has been linked to the policy" + } + }, + "EDIT": { + "HEADER": { + "TITLE": "Edit assignment policy" + }, + "EDIT_BUTTON": "Update policy", + "CONFIRM_ADD_INBOX_DIALOG": { + "TITLE": "Add inbox", + "DESCRIPTION": "{inboxName} inbox is already linked to another policy. Are you sure you want to link it to this policy? It will be unlinked from the other policy.", + "CONFIRM_BUTTON_LABEL": "Continue", + "CANCEL_BUTTON_LABEL": "Cancel" + }, + "INBOX_LINK_PROMPT": { + "TITLE": "Link inbox to policy", + "DESCRIPTION": "Would you like to link this inbox to the assignment policy?", + "LINK_BUTTON": "Link inbox", + "CANCEL_BUTTON": "Skip" + }, + "API": { + "SUCCESS_MESSAGE": "Assignment policy updated successfully", + "ERROR_MESSAGE": "Failed to update assignment policy" + }, + "INBOX_API": { + "ADD": { + "SUCCESS_MESSAGE": "Inbox added to policy successfully", + "ERROR_MESSAGE": "Failed to add inbox to policy" + }, + "REMOVE": { + "SUCCESS_MESSAGE": "Inbox removed from policy successfully", + "ERROR_MESSAGE": "Failed to remove inbox from policy" + } + } + }, + "FORM": { + "NAME": { + "LABEL": "Policy name:", + "PLACEHOLDER": "Enter policy name" + }, + "DESCRIPTION": { + "LABEL": "Description:", + "PLACEHOLDER": "Enter description" + }, + "STATUS": { + "LABEL": "Status:", + "PLACEHOLDER": "Select status", + "ACTIVE": "Policy is active", + "INACTIVE": "Policy is inactive" + }, + "ASSIGNMENT_ORDER": { + "LABEL": "Assignment order", + "ROUND_ROBIN": { + "LABEL": "Round robin", + "DESCRIPTION": "Assign conversations evenly among agents." + }, + "BALANCED": { + "LABEL": "Balanced", + "DESCRIPTION": "Assign conversations based on available capacity.", + "PREMIUM_MESSAGE": "Upgrade to access balanced assignment and agent capacity management.", + "PREMIUM_BADGE": "Premium" + } + }, + "ASSIGNMENT_PRIORITY": { + "LABEL": "Assignment priority", + "EARLIEST_CREATED": { + "LABEL": "Earliest created", + "DESCRIPTION": "The conversation that was created first gets assigned first." + }, + "LONGEST_WAITING": { + "LABEL": "Longest waiting", + "DESCRIPTION": "The conversation waiting the longest gets assigned first." + } + }, + "FAIR_DISTRIBUTION": { + "LABEL": "Fair distribution policy", + "DESCRIPTION": "Cap conversations per agent within a time window to avoid overload. Defaults to 100 per hour.", + "INPUT_MAX": "Assign max", + "DURATION": "Conversations per agent in every" + }, + "EXCLUDE_OLDER_THAN": { + "LABEL": "Skip stale conversations", + "DESCRIPTION": "Skip unassigned conversations older than this. Defaults to 7 days; clear to disable." + }, + "INBOXES": { + "LABEL": "Added inboxes", + "DESCRIPTION": "Add inboxes for which this policy will be applicable.", + "ADD_BUTTON": "Add inbox", + "DROPDOWN": { + "SEARCH_PLACEHOLDER": "Search and select inboxes to add", + "ADD_BUTTON": "Add" + }, + "EMPTY_STATE": "No inboxes added to this policy, add an inbox to get started", + "API": { + "SUCCESS_MESSAGE": "Inbox successfully added to policy", + "ERROR_MESSAGE": "Failed to add inbox to policy" + } + } + }, + "DELETE_POLICY": { + "SUCCESS_MESSAGE": "Assignment policy deleted successfully", + "ERROR_MESSAGE": "Failed to delete assignment policy" + } + }, + "AGENT_CAPACITY_POLICY": { + "INDEX": { + "HEADER": { + "TITLE": "Agent capacity", + "CREATE_POLICY": "New policy" + }, + "CARD": { + "POPOVER": "Added agents", + "EDIT": "Edit" + }, + "NO_RECORDS_FOUND": "No agent capacity policies found" + }, + "CREATE": { + "HEADER": { + "TITLE": "Create agent capacity policy" + }, + "CREATE_BUTTON": "Create policy", + "API": { + "SUCCESS_MESSAGE": "Agent capacity policy created successfully", + "ERROR_MESSAGE": "Failed to create agent capacity policy" + } + }, + "EDIT": { + "HEADER": { + "TITLE": "Edit agent capacity policy" + }, + "EDIT_BUTTON": "Update policy", + "CONFIRM_ADD_AGENT_DIALOG": { + "TITLE": "Add agent", + "DESCRIPTION": "{agentName} is already linked to another policy. Are you sure you want to link it to this policy? It will be unlinked from the other policy.", + "CONFIRM_BUTTON_LABEL": "Continue", + "CANCEL_BUTTON_LABEL": "Cancel" + }, + "API": { + "SUCCESS_MESSAGE": "Agent capacity policy updated successfully", + "ERROR_MESSAGE": "Failed to update agent capacity policy" + }, + "AGENT_API": { + "ADD": { + "SUCCESS_MESSAGE": "Agent added to policy successfully", + "ERROR_MESSAGE": "Failed to add agent to policy" + }, + "REMOVE": { + "SUCCESS_MESSAGE": "Agent removed from policy successfully", + "ERROR_MESSAGE": "Failed to remove agent from policy" + } + }, + "INBOX_LIMIT_API": { + "ADD": { + "SUCCESS_MESSAGE": "Inbox limit added successfully", + "ERROR_MESSAGE": "Failed to add inbox limit" + }, + "UPDATE": { + "SUCCESS_MESSAGE": "Inbox limit updated successfully", + "ERROR_MESSAGE": "Failed to update inbox limit" + }, + "DELETE": { + "SUCCESS_MESSAGE": "Inbox limit deleted successfully", + "ERROR_MESSAGE": "Failed to delete inbox limit" + } + } + }, + "FORM": { + "NAME": { + "LABEL": "Policy name:", + "PLACEHOLDER": "Enter policy name" + }, + "DESCRIPTION": { + "LABEL": "Description:", + "PLACEHOLDER": "Enter description" + }, + "INBOX_CAPACITY_LIMIT": { + "LABEL": "Inbox capacity limits", + "ADD_BUTTON": "Add inbox", + "FIELD": { + "SELECT_INBOX": "Select inbox", + "MAX_CONVERSATIONS": "Max conversations", + "SET_LIMIT": "Set limit" + }, + "EMPTY_STATE": "No inbox limit set" + }, + "EXCLUSION_RULES": { + "LABEL": "Exclusion rules", + "DESCRIPTION": "Conversations that satisfy the following conditions would not count towards agent capacity", + "TAGS": { + "LABEL": "Exclude conversations tagged with specific labels", + "ADD_TAG": "add tag", + "DROPDOWN": { + "SEARCH_PLACEHOLDER": "Search and select tags to add" + }, + "EMPTY_STATE": "No tags added to this policy." + }, + "DURATION": { + "LABEL": "Exclude conversations older than a specified duration", + "PLACEHOLDER": "Set time" + } + }, + "USERS": { + "LABEL": "Assigned agents", + "DESCRIPTION": "Add agents for which this policy will be applicable.", + "ADD_BUTTON": "Add agent", + "DROPDOWN": { + "SEARCH_PLACEHOLDER": "Search and select agents to add", + "ADD_BUTTON": "Add" + }, + "EMPTY_STATE": "No agents added", + "API": { + "SUCCESS_MESSAGE": "Agent successfully added to policy", + "ERROR_MESSAGE": "Failed to add agent to policy" + } + } + }, + "DELETE_POLICY": { + "SUCCESS_MESSAGE": "Agent capacity policy deleted successfully", + "ERROR_MESSAGE": "Failed to delete agent capacity policy" + } + }, + "DELETE_POLICY": { + "TITLE": "Delete policy", + "DESCRIPTION": "Are you sure you want to delete this policy? This action cannot be undone.", + "CONFIRM_BUTTON_LABEL": "Delete", + "CANCEL_BUTTON_LABEL": "Cancel" + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/signup.json b/app/javascript/dashboard/i18n/locale/uz/signup.json new file mode 100644 index 000000000..238a1f061 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/signup.json @@ -0,0 +1,57 @@ +{ + "REGISTER": { + "TRY_WOOT": "Create an account", + "GET_STARTED": "Get started with Chatwoot", + "TITLE": "Register", + "TESTIMONIAL_HEADER": "All it takes is one step to move forward", + "TESTIMONIAL_CONTENT": "You're one step away from engaging your customers, retaining them and finding new ones.", + "TERMS_ACCEPT": "By creating an account, you agree to our T & C and Privacy policy", + "OAUTH": { + "GOOGLE_SIGNUP": "Sign up with Google" + }, + "COMPANY_NAME": { + "LABEL": "Company name", + "PLACEHOLDER": "Enter your company name. E.g., Wayne Enterprises", + "ERROR": "Company name is too short." + }, + "FULL_NAME": { + "LABEL": "Full name", + "PLACEHOLDER": "Enter your full name. E.g., Bruce Wayne", + "ERROR": "Full name is too short." + }, + "EMAIL": { + "LABEL": "Work email", + "PLACEHOLDER": "Enter your work email address. E.g., bruce{'@'}wayne{'.'}enterprises", + "ERROR": "Please enter a valid work email address." + }, + "PASSWORD": { + "LABEL": "Password", + "PLACEHOLDER": "Password", + "ERROR": "Password is too short.", + "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character.", + "REQUIREMENTS_LENGTH": "At least 6 characters long", + "REQUIREMENTS_UPPERCASE": "At least one uppercase letter", + "REQUIREMENTS_LOWERCASE": "At least one lowercase letter", + "REQUIREMENTS_NUMBER": "At least one number", + "REQUIREMENTS_SPECIAL": "At least one special character" + }, + "CONFIRM_PASSWORD": { + "LABEL": "Confirm password", + "PLACEHOLDER": "Confirm password", + "ERROR": "Passwords do not match." + }, + "API": { + "SUCCESS_MESSAGE": "Registration Successful", + "ERROR_MESSAGE": "Could not connect to Woot server. Please try again." + }, + "SUBMIT": "Create account", + "HAVE_AN_ACCOUNT": "Already have an account?", + "VERIFY_EMAIL": { + "TITLE": "Check your inbox", + "DESCRIPTION": "We sent a verification link to {email}. Click the link to verify your email and get started.", + "RESEND": "Resend verification email", + "RESEND_SUCCESS": "Verification email sent. Please check your inbox.", + "RESEND_ERROR": "Could not send verification email. Please try again." + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/sla.json b/app/javascript/dashboard/i18n/locale/uz/sla.json new file mode 100644 index 000000000..9ab41fb82 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/sla.json @@ -0,0 +1,117 @@ +{ + "SLA": { + "HEADER": "Service Level Agreements", + "ADD_ACTION": "Add SLA", + "ADD_ACTION_LONG": "Create a new SLA Policy", + "DESCRIPTION": "Service Level Agreements (SLAs) are contracts that define clear expectations between your team and customers. They establish standards for response and resolution times, creating a framework for accountability and ensures a consistent, high-quality experience.", + "LEARN_MORE": "Learn more about SLA", + "COUNT": "{n} SLA | {n} SLAs", + "LOADING": "Fetching SLAs", + "SEARCH_PLACEHOLDER": "Search SLA...", + "SEARCH": { + "NO_RESULTS": "No SLA found matching your search" + }, + "PAYWALL": { + "TITLE": "Upgrade to create SLAs", + "AVAILABLE_ON": "The SLA feature is only available in the Business and Enterprise plans.", + "UPGRADE_PROMPT": "Upgrade your plan to get access to advanced features like team management, automations, custom attributes, and more.", + "UPGRADE_NOW": "Upgrade now", + "CANCEL_ANYTIME": "You can change or cancel your plan anytime" + }, + "ENTERPRISE_PAYWALL": { + "AVAILABLE_ON": "The SLA feature is only available in the paid plans.", + "UPGRADE_PROMPT": "Upgrade to a paid plan to access advanced features like audit logs, agent capacity, and more.", + "ASK_ADMIN": "Please reach out to your administrator for the upgrade." + }, + "LIST": { + "404": "There are no SLAs available in this account.", + "TABLE_HEADER": { + "SLA": "SLA", + "BUSINESS_HOURS": "Business hours" + }, + "EMPTY": { + "TITLE_1": "Enterprise P0", + "DESC_1": "Issues raised by enterprise customers, that require immediate attention.", + "TITLE_2": "Enterprise P1", + "DESC_2": "Issues raised by enterprise customers, that needs to be acknowledged quickly." + }, + "BUSINESS_HOURS_ON": "Turned on", + "BUSINESS_HOURS_OFF": "Turned off", + "RESPONSE_TYPES": { + "FRT": "First response time threshold", + "NRT": "Next response time threshold", + "RT": "Resolution time threshold", + "SHORT_HAND": { + "FRT": "FRT", + "NRT": "NRT", + "RT": "RT" + } + } + }, + "FORM": { + "NAME": { + "LABEL": "SLA Name", + "PLACEHOLDER": "SLA Name", + "REQUIRED_ERROR": "SLA name is required", + "MINIMUM_LENGTH_ERROR": "Minimum length 2 is required", + "VALID_ERROR": "Only Alphabets, Numbers, Hyphen and Underscore are allowed" + }, + "DESCRIPTION": { + "LABEL": "Description", + "PLACEHOLDER": "SLA for premium customers" + }, + "FIRST_RESPONSE_TIME": { + "LABEL": "First Response Time", + "PLACEHOLDER": "5" + }, + "NEXT_RESPONSE_TIME": { + "LABEL": "Next Response Time", + "PLACEHOLDER": "5" + }, + "RESOLUTION_TIME": { + "LABEL": "Resolution Time", + "PLACEHOLDER": "60" + }, + "BUSINESS_HOURS": { + "LABEL": "Business Hours", + "PLACEHOLDER": "Only during business hours" + }, + "THRESHOLD_TIME": { + "INVALID_FORMAT_ERROR": "Threshold should be a number and greater than zero" + }, + "EDIT": "Edit", + "CREATE": "Create", + "DELETE": "Delete", + "CANCEL": "Cancel" + }, + "ADD": { + "TITLE": "Add SLA", + "DESC": "Friendly promises for great service!", + "API": { + "SUCCESS_MESSAGE": "SLA added successfully", + "ERROR_MESSAGE": "There was an error, please try again" + } + }, + "DELETE": { + "TITLE": "Delete SLA", + "API": { + "SUCCESS_MESSAGE": "SLA deleted successfully", + "ERROR_MESSAGE": "There was an error, please try again" + }, + "CONFIRM": { + "TITLE": "Confirm Deletion", + "MESSAGE": "Are you sure you want to delete ", + "YES": "Yes, Delete ", + "NO": "No, Keep " + } + }, + "EVENTS": { + "TITLE": "SLA Misses", + "FRT": "First response time", + "NRT": "Next response time", + "RT": "Resolution time", + "SHOW_MORE": "{count} more", + "HIDE": "Hide {count} rows" + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/snooze.json b/app/javascript/dashboard/i18n/locale/uz/snooze.json new file mode 100644 index 000000000..2d9a876aa --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/snooze.json @@ -0,0 +1,72 @@ +{ + "SNOOZE_PARSER": { + "UNITS": { + "MINUTE": "minute", + "MINUTES": "minutes", + "HOUR": "hour", + "HOURS": "hours", + "DAY": "day", + "DAYS": "days", + "WEEK": "week", + "WEEKS": "weeks", + "MONTH": "month", + "MONTHS": "months", + "YEAR": "year", + "YEARS": "years" + }, + "HALF": "half", + "NEXT": "next", + "THIS": "this", + "AT": "at", + "IN": "in", + "FROM_NOW": "from now", + "NEXT_YEAR": "next year", + "MERIDIEM": { + "AM": "am", + "PM": "pm" + }, + "RELATIVE": { + "TOMORROW": "tomorrow", + "DAY_AFTER_TOMORROW": "day after tomorrow", + "NEXT_WEEK": "next week", + "NEXT_MONTH": "next month", + "THIS_WEEKEND": "this weekend", + "NEXT_WEEKEND": "next weekend" + }, + "TIME_OF_DAY": { + "MORNING": "morning", + "AFTERNOON": "afternoon", + "EVENING": "evening", + "NIGHT": "night", + "NOON": "noon", + "MIDNIGHT": "midnight" + }, + "WORD_NUMBERS": { + "ONE": "one", + "TWO": "two", + "THREE": "three", + "FOUR": "four", + "FIVE": "five", + "SIX": "six", + "SEVEN": "seven", + "EIGHT": "eight", + "NINE": "nine", + "TEN": "ten", + "TWELVE": "twelve", + "FIFTEEN": "fifteen", + "TWENTY": "twenty", + "THIRTY": "thirty" + }, + "ORDINALS": { + "FIRST": "first", + "SECOND": "second", + "THIRD": "third", + "FOURTH": "fourth", + "FIFTH": "fifth" + }, + "OF": "of", + "AFTER": "after", + "WEEK": "week", + "DAY": "day" + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/teamsSettings.json b/app/javascript/dashboard/i18n/locale/uz/teamsSettings.json new file mode 100644 index 000000000..f3ce7f167 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/teamsSettings.json @@ -0,0 +1,124 @@ +{ + "TEAMS_SETTINGS": { + "NEW_TEAM": "Create new team", + "HEADER": "Teams", + "LOADING": "Fetching teams", + "DESCRIPTION": "Teams allow you to organize agents into groups based on their responsibilities. An agent can belong to multiple teams. When working collaboratively, you can assign conversations to specific teams.", + "LEARN_MORE": "Learn more about teams", + "COUNT": "{n} team | {n} teams", + "SEARCH_PLACEHOLDER": "Search teams...", + "NO_RESULTS": "No teams found matching your search", + "LIST": { + "404": "There are no teams created on this account.", + "EDIT_TEAM": "Edit team", + "NONE": "None" + }, + "CREATE_FLOW": { + "CREATE": { + "TITLE": "Create a new team", + "DESC": "Add a title and description to your new team." + }, + "AGENTS": { + "BUTTON_TEXT": "Add agents to team", + "TITLE": "Add agents to team - {teamName}", + "DESC": "Add Agents to your newly created team. This lets you collaborate as a team on conversations, get notified on new events in the same conversation." + }, + "WIZARD_CREATE": { + "TITLE": "Create", + "BODY": "Create a new team of agents." + }, + "WIZARD_ADD_AGENTS": { + "TITLE": "Add Agents", + "BODY": "Add agents to the team." + }, + "WIZARD_FINISH": { + "TITLE": "Finish", + "BODY": "You are all set to go!" + } + }, + "EDIT_FLOW": { + "CREATE": { + "TITLE": "Edit your team details", + "DESC": "Edit title and description to your team.", + "BUTTON_TEXT": "Update team" + }, + "AGENTS": { + "BUTTON_TEXT": "Update agents in team", + "TITLE": "Add agents to team - {teamName}", + "DESC": "Add Agents to your newly created team. All the added agents will be notified when a conversation is assigned to this team." + }, + "EDIT_WIZARD_DETAILS": { + "TITLE": "Team details", + "ROUTE": "settings_teams_edit", + "BODY": "Change name, description and other details." + }, + "EDIT_WIZARD_AGENTS": { + "TITLE": "Edit Agents", + "ROUTE": "settings_teams_edit_members", + "BODY": "Edit agents in your team." + }, + "EDIT_WIZARD_FINISH": { + "TITLE": "Finish", + "ROUTE": "settings_teams_edit_finish", + "BODY": "You are all set to go!" + } + }, + "TEAM_FORM": { + "ERROR_MESSAGE": "Couldn't save the team details. Try again." + }, + "AGENTS": { + "AGENT": "Agent", + "EMAIL": "Email", + "BUTTON_TEXT": "Add agents", + "ADD_AGENTS": "Adding Agents to your Team...", + "SELECT": "select", + "SELECT_ALL": "select all agents", + "SELECTED_COUNT": "{selected} out of {total} agents selected." + }, + "ADD": { + "TITLE": "Add agents to team - {teamName}", + "DESC": "Add Agents to your newly created team. This lets you collaborate as a team on conversations, get notified on new events in the same conversation.", + "SELECT": "select", + "SELECT_ALL": "select all agents", + "SELECTED_COUNT": "{selected} out of {total} agents selected.", + "BUTTON_TEXT": "Add agents", + "AGENT_VALIDATION_ERROR": "Select at least one agent." + }, + "FINISH": { + "TITLE": "Your team is ready!", + "MESSAGE": "You can now collaborate as a team on conversations. Happy supporting ", + "BUTTON_TEXT": "Finish" + }, + "DELETE": { + "BUTTON_TEXT": "Delete", + "API": { + "SUCCESS_MESSAGE": "Team deleted successfully.", + "ERROR_MESSAGE": "Couldn't delete the team. Try again." + }, + "CONFIRM": { + "TITLE": "Are you sure you want to delete the team?", + "PLACE_HOLDER": "Please type {teamName} to confirm", + "MESSAGE": "Deleting the team will remove the team assignment from the conversations assigned to this team.", + "YES": "Delete ", + "NO": "Cancel" + } + }, + "SETTINGS": "Settings", + "FORM": { + "UPDATE": "Update team", + "CREATE": "Create team", + "NAME": { + "LABEL": "Team name", + "PLACEHOLDER": "Example: Sales, Customer Support" + }, + "DESCRIPTION": { + "LABEL": "Team Description", + "PLACEHOLDER": "Short description about this team." + }, + "AUTO_ASSIGN": { + "LABEL": "Allow auto assign for this team." + }, + "SUBMIT_CREATE": "Create team" + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/webhooks.json b/app/javascript/dashboard/i18n/locale/uz/webhooks.json new file mode 100644 index 000000000..347c96893 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/webhooks.json @@ -0,0 +1,5 @@ +{ + "WEBHOOKS_SETTINGS": { + "HEADER": "Webhook Settings" + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/uz/whatsappTemplates.json new file mode 100644 index 000000000..cf28312dc --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/whatsappTemplates.json @@ -0,0 +1,47 @@ +{ + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Whatsapp Templates", + "SUBTITLE": "Select the whatsapp template you want to send", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Search Templates", + "NO_TEMPLATES_FOUND": "No templates found for", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Category", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Language", + "TEMPLATE_BODY": "Template Body", + "CATEGORY": "Category" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variables", + "LANGUAGE": "Language", + "CATEGORY": "Category", + "VARIABLE_PLACEHOLDER": "Enter {variable} value", + "GO_BACK_LABEL": "Go Back", + "SEND_MESSAGE_LABEL": "Send Message", + "FORM_ERROR_MESSAGE": "Please fill all variables before sending", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "DOCUMENT_NAME_PLACEHOLDER": "Enter document filename (e.g., Invoice_2025.pdf)", + "BUTTON_PARAMETER": "Enter button parameter" + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/uz/yearInReview.json b/app/javascript/dashboard/i18n/locale/uz/yearInReview.json new file mode 100644 index 000000000..d72e0c679 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uz/yearInReview.json @@ -0,0 +1,64 @@ +{ + "YEAR_IN_REVIEW": { + "TITLE": "Year in Review", + "LOADING": "Loading your year in review...", + "ERROR": "Failed to load year in review", + "CLOSE": "Close", + "CONVERSATIONS": { + "TITLE": "You have handled", + "SUBTITLE": "conversations", + "FALLBACK": "This year wasn't about the numbers. It was about showing up.", + "COMPARISON": { + "0_50": "You showed up, and that's how every good inbox begins.", + "50_100": "You kept the replies flowing and the conversations alive.", + "100_500": "You handled serious volume and kept everything on track.", + "500_2000": "You kept things moving while the volume kept climbing.", + "2000_10000": "You ran high traffic through your inbox without breaking a sweat.", + "10000_PLUS": "That's a full city of customers knocking on your door. You made it look effortless." + } + }, + "BUSIEST_DAY": { + "TITLE": "Your busiest day was", + "MESSAGE": "{count} conversations that day.", + "COMPARISON": { + "0_5": "A warm-up lap that barely woke the inbox.", + "5_10": "Enough action to justify a second cup of coffee.", + "10_25": "Things got busy and the inbox stayed on its toes.", + "25_50": "A proper rush that barely broke a sweat.", + "50_100": "Controlled chaos, handled like a normal Tuesday.", + "100_500": "Absolute dumpster fire, somehow still shipping replies.", + "500_PLUS": "The inbox lost all chill and never slowed down." + } + }, + "PERSONALITY": { + "TITLE": "Your support personality is", + "MESSAGES": { + "SWIFT_HELPER": "You replied in {time} on average. Faster than most notifications.", + "QUICK_RESPONDER": "You replied in {time} on average. The inbox barely waited.", + "STEADY_SUPPORT": "You replied in {time} on average. Calm pace, solid replies.", + "THOUGHTFUL_ADVISOR": "You replied in {time} on average. Took the time to get it right." + } + }, + "THANK_YOU": { + "TITLE": "Congratulations on surviving the inbox of {year}.", + "MESSAGE": "Thank you for your incredible dedication to supporting customers throughout this year. Your hard work has made a real difference, and we're grateful to have you on this journey. Here's to making {nextYear} even better together!" + }, + "SHARE_MODAL": { + "TITLE": "Share Your Year in Review", + "PREPARING": "Preparing your image...", + "DOWNLOAD": "Download", + "SHARE_TITLE": "My {year} Year in Review", + "SHARE_TEXT": "Check out my {year} Year in Review with Chatwoot!", + "BRANDING": "Made with Chatwoot" + }, + "BANNER": { + "TITLE": "Your {year} Year in Review is here", + "BUTTON": "See your impact" + }, + "NAVIGATION": { + "PREVIOUS": "Previous", + "NEXT": "Next", + "SHARE": "Share" + } + } +} diff --git a/app/javascript/dashboard/i18n/locale/vi/advancedFilters.json b/app/javascript/dashboard/i18n/locale/vi/advancedFilters.json index 9669efcab..145ddbe97 100644 --- a/app/javascript/dashboard/i18n/locale/vi/advancedFilters.json +++ b/app/javascript/dashboard/i18n/locale/vi/advancedFilters.json @@ -19,6 +19,8 @@ "OR": "HOẶC" }, "INPUT_PLACEHOLDER": "Enter value", + "CONTACT_SEARCH_PLACEHOLDER": "Tìm kiếm liên hệ", + "CONTACT_FALLBACK": "Contact #{id}", "OPERATOR_LABELS": { "equal_to": "Bằng", "not_equal_to": "Không bằng", @@ -49,6 +51,7 @@ "ASSIGNEE_NAME": "Tên người được phân công", "INBOX_NAME": "Tên kênh", "TEAM_NAME": "Tên nhóm", + "CONTACT": "Liên hệ", "CONVERSATION_IDENTIFIER": "Định danh cuộc hội thoại", "CAMPAIGN_NAME": "Tên chiến dịch", "LABELS": "Nhãn", diff --git a/app/javascript/dashboard/i18n/locale/vi/chatlist.json b/app/javascript/dashboard/i18n/locale/vi/chatlist.json index c66341891..e76d78ef0 100644 --- a/app/javascript/dashboard/i18n/locale/vi/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/vi/chatlist.json @@ -79,6 +79,9 @@ }, "priority_desc_created_at_asc": { "TEXT": "Priority: Highest first, Created: Oldest first" + }, + "unread": { + "TEXT": "Unread Count: Highest first" } }, "ATTACHMENTS": { diff --git a/app/javascript/dashboard/i18n/locale/vi/companies.json b/app/javascript/dashboard/i18n/locale/vi/companies.json index 82ac9c245..08f76e616 100644 --- a/app/javascript/dashboard/i18n/locale/vi/companies.json +++ b/app/javascript/dashboard/i18n/locale/vi/companies.json @@ -25,6 +25,10 @@ "ACTIONS": { "CREATE": "Add company" }, + "SELECTOR": { + "PLACEHOLDER": "Select company", + "CREATE_OPTION": "Add \"{name}\"" + }, "CREATE": { "TITLE": "Add company details", "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/vi/contact.json b/app/javascript/dashboard/i18n/locale/vi/contact.json index aaaaaae94..0d58c7591 100644 --- a/app/javascript/dashboard/i18n/locale/vi/contact.json +++ b/app/javascript/dashboard/i18n/locale/vi/contact.json @@ -510,6 +510,7 @@ "ATTRIBUTES": "Attributes", "HISTORY": "History", "NOTES": "Ghi chú", + "MEDIA": "Media", "MERGE": "Merge" }, "HISTORY": { diff --git a/app/javascript/dashboard/i18n/locale/vi/conversation.json b/app/javascript/dashboard/i18n/locale/vi/conversation.json index ca100bb22..ed8aa3a30 100644 --- a/app/javascript/dashboard/i18n/locale/vi/conversation.json +++ b/app/javascript/dashboard/i18n/locale/vi/conversation.json @@ -44,6 +44,8 @@ "TWILIO_WHATSAPP_CAN_REPLY": "Bạn chỉ có thể phản hồi hội thoại này bằng tin nhắn mẫu vì", "TWILIO_WHATSAPP_24_HOURS_WINDOW": "Giới hạn thời lượng tin nhắn 24 giờ", "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.", + "INSTAGRAM_RESTRICTION_BANNER": "Instagram is currently restricted. Some messages or actions may be delayed or unavailable while we restore full support.", + "INSTAGRAM_RESTRICTION_STATUS_LINK": "View status update", "REPLYING_TO": "Bạn đang trả lời:", "REMOVE_SELECTION": "Xóa lựa chọn", "DOWNLOAD": "Tải xuống", @@ -233,6 +235,7 @@ "TIP_AUDIORECORDER_ERROR": "Không thể mở bản ghi âm", "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.", "DRAG_DROP": "Kéo thả vào đây để đính kèm", + "IMAGE_UPLOAD_SUCCESS": "Ảnh tải lên thành công", "START_AUDIO_RECORDING": "Bắt đầu ghi âm", "STOP_AUDIO_RECORDING": "Dừng ghi âm", "COPILOT_THINKING": "Copilot đang suy nghĩ", @@ -303,6 +306,25 @@ "MESSAGE": "You cannot undo this action", "DELETE": "Xoá", "CANCEL": "Huỷ" + }, + "REPORT_MESSAGE": { + "LABEL": "Report message", + "TITLE": "Report Captain message", + "DESCRIPTION": "Found an issue with this AI response? Let us know what went wrong and our team will review it to help improve Captain's accuracy.", + "PROBLEM_TYPE": "Problem type", + "PROBLEM_TYPE_PLACEHOLDER": "Select a problem type", + "DESCRIPTION_LABEL": "Mô tả", + "DESCRIPTION_PLACEHOLDER": "Describe the problem in detail", + "SUBMIT": "Report", + "SUCCESS": "Thanks for reporting. Our team will take a look.", + "ERROR": "Could not report this message. Please try again.", + "REASONS": { + "incorrect_information": "Incorrect information", + "inappropriate_response": "Inappropriate response", + "incomplete_response": "Incomplete response", + "outdated_information": "Outdated information", + "other": "Other" + } } }, "SIDEBAR": { @@ -400,7 +422,8 @@ "VIEW_ALL": "View all", "SHOW_LESS": "Show less", "MORE_COUNT": "+{count}", - "UNTITLED_FILE": "Untitled file" + "UNTITLED_FILE": "Untitled file", + "JUMP_TO_MESSAGE": "Jump to message" }, "SHOPIFY": { "ORDER_ID": "Order #{id}", diff --git a/app/javascript/dashboard/i18n/locale/vi/emoji.json b/app/javascript/dashboard/i18n/locale/vi/emoji.json index 6311baec1..2a13bbaeb 100644 --- a/app/javascript/dashboard/i18n/locale/vi/emoji.json +++ b/app/javascript/dashboard/i18n/locale/vi/emoji.json @@ -3,5 +3,33 @@ "PLACEHOLDER": "Search emojis", "NOT_FOUND": "No emoji match your search", "REMOVE": "Xoá" + }, + "EMOJI_ICON_PICKER": { + "TABS": { + "ICONS": "Icons", + "EMOJIS": "Emojis" + }, + "SEARCH_EMOJI": "Search emoji…", + "SEARCH_ICON": "Search icons…", + "FREQUENTLY_USED": "Frequently used", + "NO_EMOJI": "No emoji match your search", + "NO_ICON": "No icons match your search", + "REMOVE": "Xoá", + "STYLE": { + "OUTLINE": "Outline icons", + "FILLED": "Filled icons" + }, + "COLORS": { + "SLATE": "Slate", + "RED": "Red", + "ORANGE": "Orange", + "AMBER": "Amber", + "GREEN": "Green", + "TEAL": "Teal", + "BLUE": "Blue", + "INDIGO": "Indigo", + "VIOLET": "Violet", + "PINK": "Pink" + } } } diff --git a/app/javascript/dashboard/i18n/locale/vi/helpCenter.json b/app/javascript/dashboard/i18n/locale/vi/helpCenter.json index 944d5ede7..4a11f277c 100644 --- a/app/javascript/dashboard/i18n/locale/vi/helpCenter.json +++ b/app/javascript/dashboard/i18n/locale/vi/helpCenter.json @@ -533,6 +533,8 @@ "PUBLISHED": "Đã phát hành", "ARCHIVED": "Đã lưu trữ" }, + "PENDING_EDITS": "Unpublished edits", + "PENDING_EDITS_TOOLTIP": "This published article has unpublished edits", "CATEGORY": { "UNCATEGORISED": "Uncategorised" } @@ -552,6 +554,7 @@ "LOCALE": { "ALL": "All locales" }, + "SEARCH_PLACEHOLDER": "Search articles...", "NEW_ARTICLE": "New article" }, "EMPTY_STATE": { @@ -579,6 +582,10 @@ "CATEGORY": { "TITLE": "There are no articles in this category", "SUBTITLE": "Articles in this category will appear here" + }, + "SEARCH": { + "TITLE": "No matching articles", + "SUBTITLE": "We couldn't find any articles matching your search. Try a different term." } }, "BULK_TRANSLATE": { @@ -611,6 +618,8 @@ "DELETE": "Xoá", "STATUS_SUCCESS": "Articles updated successfully", "STATUS_ERROR": "Failed to update articles", + "STATUS_SKIPPED": "1 article with unpublished edits was skipped — open it to publish or discard. | {count} articles with unpublished edits were skipped — open them to publish or discard.", + "STATUS_SKIPPED_ALL": "These articles have unpublished edits — open each to publish or discard.", "CATEGORY_SUCCESS": "Articles moved successfully", "CATEGORY_ERROR": "Failed to move articles", "DELETE_CONFIRM_TITLE": "Delete article | Delete {count} articles", @@ -624,6 +633,7 @@ "CATEGORY_HEADER": { "NEW_CATEGORY": "Tạo danh mục", "EDIT_CATEGORY": "Sửa danh mục", + "SEARCH_PLACEHOLDER": "Search categories...", "CATEGORIES_COUNT": "{n} category | {n} categories", "BREADCRUMB": { "CATEGORY_LOCALE": "Categories ({localeCode})", @@ -634,6 +644,10 @@ "TITLE": "Không tìm thấy danh mục nào", "SUBTITLE": "Categories will appear here. You can add a category by clicking the 'New Category' button." }, + "SEARCH_EMPTY_STATE": { + "TITLE": "No matching categories", + "SUBTITLE": "We couldn't find any categories matching your search. Try a different term." + }, "CATEGORY_CARD": { "ARTICLES_COUNT": "{count} article | {count} articles" }, @@ -691,6 +705,11 @@ "LOCALES_PAGE": { "LOCALES_COUNT": "No locales available | {n} locale | {n} locales", "NEW_LOCALE_BUTTON_TEXT": "New locale", + "SEARCH_PLACEHOLDER": "Search locales...", + "SEARCH_EMPTY_STATE": { + "TITLE": "No matching locales", + "SUBTITLE": "We couldn't find any locales matching your search. Try a different term." + }, "LOCALE_CARD": { "ARTICLES_COUNT": "{count} article | {count} articles", "CATEGORIES_COUNT": "{count} category | {count} categories", @@ -700,9 +719,51 @@ "MAKE_DEFAULT": "Make default", "MOVE_TO_DRAFT": "Move to draft", "PUBLISH_LOCALE": "Publish locale", + "CUSTOMIZE_CONTENT": "Localize content", + "SELECT_POPULAR_CONTENT": "Select recommended content", "DELETE": "Xoá" } }, + "POPULAR_CONTENT_DIALOG": { + "TITLE": "Recommended content", + "DESCRIPTION": "Pick up to 3 categories and 6 articles to feature on this locale's help center home page. Drag them into the order you want visitors to see.", + "SEARCH": "Search...", + "EMPTY": "No matching results", + "ADD_ANOTHER": "Add another...", + "SLOTS_LEFT": "{count} slots left", + "OVERRIDING_DEFAULTS": "Overriding defaults for this locale", + "CONFIRM": "Save recommendations", + "CATEGORIES": { + "LABEL": "Recommended categories", + "ARTICLES_COUNT": "No articles | {count} article | {count} articles" + }, + "ARTICLES": { + "LABEL": "Recommended articles", + "IN_CATEGORY": "in {category}", + "UNCATEGORIZED": "Chưa được phân loại" + }, + "API": { + "SUCCESS_MESSAGE": "Recommended content updated successfully", + "ERROR_MESSAGE": "Unable to update recommended content. Try again." + } + }, + "CONTENT_DIALOG": { + "TITLE": "Localize content", + "DESCRIPTION": "Set values specific to this locale. Anything left blank falls back to the default locale.", + "NAME": { + "LABEL": "Tên" + }, + "PAGE_TITLE": { + "LABEL": "Page title" + }, + "HEADER_TEXT": { + "LABEL": "Header text" + }, + "API": { + "SUCCESS_MESSAGE": "Locale content updated successfully", + "ERROR_MESSAGE": "Unable to update locale content. Try again." + } + }, "ADD_LOCALE_DIALOG": { "TITLE": "Thêm ngôn ngữ", "DESCRIPTION": "Select the language in which this article will be written. This will be added to your list of translations, and you can add more later.", @@ -730,10 +791,30 @@ }, "PREVIEW": "Xem trước", "PUBLISH": "Phát hành", + "PUBLISH_CHANGES": "Publish changes", + "PUBLISH_CHANGES_SUCCESS": "Changes published successfully", + "PUBLISH_CHANGES_ERROR": "Could not publish changes", + "SAVE_IN_PROGRESS": "Still saving your latest changes — please try again in a moment.", + "DISCARD_CHANGES": "Discard changes", + "DISCARD_CHANGES_SUCCESS": "Changes discarded", + "DISCARD_CHANGES_ERROR": "Could not discard changes", + "PENDING_CHANGES": "Pending changes", + "VIEW_CHANGES": "View unpublished changes", "DRAFT": "Nháp", "ARCHIVE": "Archive", "BACK_TO_ARTICLES": "Back to articles" }, + "PENDING_CHANGES_POPOVER": { + "TITLE": "Unpublished changes", + "DESCRIPTION": "This article has draft changes that aren't live yet. Apply them before changing the status, or discard them?", + "APPLY": "Apply changes", + "DISCARD": "Discard changes" + }, + "DIFF_DIALOG": { + "TITLE": "Unpublished changes", + "DESCRIPTION": "Compare your draft against the version that's currently live.", + "TITLE_LABEL": "Tiêu đề" + }, "EDIT_ARTICLE": { "MORE_PROPERTIES": "More properties", "UNCATEGORIZED": "Chưa được phân loại", diff --git a/app/javascript/dashboard/i18n/locale/vi/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/vi/inboxMgmt.json index 00e15289a..0a5ef6829 100644 --- a/app/javascript/dashboard/i18n/locale/vi/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/vi/inboxMgmt.json @@ -58,14 +58,17 @@ "ERROR_MESSAGE": "There was an error connecting to Instagram, please try again", "ERROR_AUTH": "There was an error connecting to Instagram, please try again", "NEW_INBOX_SUGGESTION": "This Instagram account was previously linked to a different inbox and has now been migrated here. All new messages will appear here. The old inbox will no longer be able to send or receive messages for this account.", - "DUPLICATE_INBOX_BANNER": "This Instagram account was migrated to the new Instagram channel inbox. You won’t be able to send/receive Instagram messages from this inbox anymore." + "DUPLICATE_INBOX_BANNER": "This Instagram account was migrated to the new Instagram channel inbox. You won’t be able to send/receive Instagram messages from this inbox anymore.", + "SETTINGS_RESTRICTED_WARNING": "Instagram is currently restricted. Some messages or actions may be delayed or unavailable while we restore full support.", + "STATUS_LINK": "View status update" }, "TIKTOK": { "CONTINUE_WITH_TIKTOK": "Continue with TikTok", "CONNECT_YOUR_TIKTOK_PROFILE": "Connect your TikTok Profile", "HELP": "To add your TikTok profile as a channel, you need to authenticate your TikTok Profile by clicking on 'Continue with TikTok' ", "ERROR_MESSAGE": "There was an error connecting to TikTok, please try again", - "ERROR_AUTH": "There was an error connecting to TikTok, please try again" + "ERROR_AUTH": "There was an error connecting to TikTok, please try again", + "NORTH_AMERICA_WARNING": "TikTok connections for North American accounts are temporarily unavailable while we wait for an update from the TikTok team." }, "TWITTER": { "HELP": "Để thêm hồ sơ Twitter của bạn làm kênh, bạn cần xác thực Hồ sơ Twitter của mình bằng cách nhấp vào 'Đăng nhập bằng Twitter", @@ -653,6 +656,10 @@ }, "CREDENTIALS": { "DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections." + }, + "INBOUND": { + "LABEL": "Allow incoming calls", + "DESCRIPTION": "Let customers call this number. When turned off, incoming calls are declined automatically — agents aren't notified and no conversation is created. Agents can still place outgoing calls." } }, "WHATSAPP_CALLING": { @@ -810,6 +817,15 @@ "WHATSAPP_EMBEDDED_SIGNUP_SUBHEADER": "This inbox is connected through WhatsApp embedded signup.", "WHATSAPP_EMBEDDED_SIGNUP_DESCRIPTION": "You can reconfigure this inbox to update your WhatsApp Business settings.", "WHATSAPP_RECONFIGURE_BUTTON": "Reconfigure", + "WHATSAPP_MANUAL_TRANSFER_TITLE": "Switch to Manual Setup", + "WHATSAPP_MANUAL_TRANSFER_SUBHEADER": "This inbox was connected through WhatsApp embedded signup, which is no longer supported. Enter the WhatsApp Cloud API credentials from your own Meta app to switch this inbox to a manual setup. Configure the webhook in your Meta app using the verification token above before switching.", + "WHATSAPP_MANUAL_TRANSFER_PHONE_NUMBER_ID_LABEL": "Phone Number ID", + "WHATSAPP_MANUAL_TRANSFER_BUSINESS_ACCOUNT_ID_LABEL": "ID tài khoản doanh nghiệp", + "WHATSAPP_MANUAL_TRANSFER_API_KEY_LABEL": "Khoá API", + "WHATSAPP_MANUAL_TRANSFER_API_KEY_PLACEHOLDER": "Enter a permanent access token from your Meta app", + "WHATSAPP_MANUAL_TRANSFER_BUTTON": "Switch to Manual Setup", + "WHATSAPP_MANUAL_TRANSFER_SUCCESS": "Inbox switched to manual setup successfully.", + "WHATSAPP_MANUAL_TRANSFER_ERROR": "Could not switch to manual setup. Please verify the credentials and try again.", "WHATSAPP_CONNECT_TITLE": "Connect to WhatsApp Business", "WHATSAPP_CONNECT_SUBHEADER": "Upgrade to WhatsApp embedded signup for easier management.", "WHATSAPP_CONNECT_DESCRIPTION": "Connect this inbox to WhatsApp Business for enhanced features and easier management.", @@ -827,6 +843,70 @@ "WHATSAPP_TEMPLATES_SYNC_SUBHEADER": "Manually sync message templates from WhatsApp to update your available templates.", "WHATSAPP_TEMPLATES_SYNC_BUTTON": "Sync Templates", "WHATSAPP_TEMPLATES_SYNC_SUCCESS": "Templates sync initiated successfully. It may take a couple of minutes to update.", + "WHATSAPP_MANUAL_MIGRATION": { + "BANNER": { + "TITLE": "Manual setup recommended", + "DESCRIPTION": "This inbox connects through the shared Meta app used for embedded signup, which recent Meta restrictions have affected. To avoid similar issues in the future, we recommend reconnecting it with your own Meta app.", + "START": "Start manual migration", + "GUIDE": "View guide" + }, + "DIALOG": { + "EYEBROW": "WhatsApp manual migration", + "TITLE": "Reconnect WhatsApp inbox", + "CLOSE": "Đóng", + "ACTION_REQUIRED_TITLE": "Reconnect with your own Meta app", + "ACTION_REQUIRED_DESCRIPTION": "Inboxes connected through your own Meta app are not affected by restrictions on the shared embedded signup app. This guided flow updates the WhatsApp API connection without creating a new inbox.", + "GUIDE_LINK": "Open the manual setup guide", + "PRESERVED_TITLE": "Preserved", + "PRESERVED_DESCRIPTION": "Conversations, contacts, collaborators, routing, business hours, and inbox settings.", + "UPDATED_TITLE": "Updated", + "UPDATED_DESCRIPTION": "WABA ID, phone number ID, access token, and webhook configuration.", + "WABA_ID": "WABA ID", + "WABA_PLACEHOLDER": "Enter WABA ID", + "WABA_HELP": "The WhatsApp Business Account that owns this phone number.", + "PHONE_NUMBER_ID": "Phone Number ID", + "PHONE_NUMBER_PLACEHOLDER": "Enter Phone Number ID", + "PHONE_NUMBER_HELP": "Meta's unique ID for the WhatsApp number connected to this inbox.", + "DISPLAY_PHONE_NUMBER": "Display phone number", + "DISPLAY_PHONE_NUMBER_PLACEHOLDER": "Enter display phone number", + "DISPLAY_PHONE_NUMBER_HELP": "The customer-facing WhatsApp number. This cannot be changed during migration.", + "ACCESS_TOKEN": "Permanent access token or system user token", + "ACCESS_TOKEN_PLACEHOLDER": "Paste access token", + "TOKEN_HELP_PREFIX": "The token must include", + "TOKEN_HELP_MIDDLE": "Thêm", + "TOKEN_HELP_SUFFIX": "for template sync and template management.", + "MESSAGING_PERMISSION": "whatsapp_business_messaging.", + "MANAGEMENT_PERMISSION": "whatsapp_business_management", + "REVIEW_TITLE": "Review before reconnecting", + "INBOX": "Hộp thư đến", + "PHONE_NUMBER": "Số điện thoại", + "NOT_ENTERED": "Not entered", + "VERIFY_NOTICE": "Chatwoot will verify these credentials with Meta before applying any changes. If verification fails, the current configuration is left untouched.", + "BACK": "Trờ về", + "CANCEL": "Huỷ", + "CONTINUE": "Continue", + "REVIEW_MIGRATION": "Review migration", + "RECONNECT": "Reconnect WhatsApp inbox" + }, + "STEPS": { + "BEFORE_YOU_START": { + "TITLE": "Before you start", + "DESCRIPTION": "This reconnects the WhatsApp API details for this inbox. Conversations, collaborators, routing, business hours, CSAT, and bot settings will be preserved." + }, + "BUSINESS_DETAILS": { + "TITLE": "Business details", + "DESCRIPTION": "Enter the WhatsApp assets from the customer Meta Business account." + }, + "ACCESS_TOKEN": { + "TITLE": "Access token", + "DESCRIPTION": "Paste a permanent access token or system user token with WhatsApp permissions." + }, + "REVIEW_MIGRATION": { + "TITLE": "Review migration", + "DESCRIPTION": "Confirm the connection details before reconnecting this inbox. Chatwoot will verify the token, WABA, and phone number with Meta before applying changes." + } + } + }, "WHATSAPP_CALLING_ENABLED": { "LABEL": "Enable voice calling", "DESCRIPTION": "Allow agents to start and receive WhatsApp voice calls on this inbox. Available only on embedded-signup WhatsApp Cloud channels with calling permission granted by Meta." diff --git a/app/javascript/dashboard/i18n/locale/vi/index.js b/app/javascript/dashboard/i18n/locale/vi/index.js index 785b1e0b1..290a47a14 100644 --- a/app/javascript/dashboard/i18n/locale/vi/index.js +++ b/app/javascript/dashboard/i18n/locale/vi/index.js @@ -33,6 +33,7 @@ import report from './report.json'; import resetPassword from './resetPassword.json'; import search from './search.json'; import setNewPassword from './setNewPassword.json'; +import sessionLimit from './sessionLimit.json'; import settings from './settings.json'; import signup from './signup.json'; import sla from './sla.json'; @@ -75,6 +76,7 @@ export default { ...resetPassword, ...search, ...setNewPassword, + ...sessionLimit, ...settings, ...signup, ...sla, diff --git a/app/javascript/dashboard/i18n/locale/vi/integrations.json b/app/javascript/dashboard/i18n/locale/vi/integrations.json index 816b6d328..433566774 100644 --- a/app/javascript/dashboard/i18n/locale/vi/integrations.json +++ b/app/javascript/dashboard/i18n/locale/vi/integrations.json @@ -31,6 +31,13 @@ "WEBHOOK": { "SUBSCRIBED_EVENTS": "Những sự kiện được theo dõi", "LEARN_MORE": "Learn more about webhooks", + "PAYWALL": { + "TITLE": "Webhooks are available on paid plans", + "AVAILABLE_ON": "Use webhooks to receive real-time events from your Chatwoot account.", + "UPGRADE_PROMPT": "Upgrade to the Startups, Business, or Enterprise plan to use webhooks.", + "UPGRADE_NOW": "Upgrade now", + "CANCEL_ANYTIME": "Change or cancel your plan anytime." + }, "SECRET": { "LABEL": "Secret", "COPY": "Copy secret to clipboard", @@ -392,6 +399,82 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Tìm hiểu thêm", + "OVERVIEW": { + "HEADER": "Tổng quan", + "WELCOME": { + "LABEL": "Captain summary", + "LOADING": "Generating summary…" + }, + "INBOX_BANNER": { + "TEXT": "This assistant isn't connected to any inbox yet, so it won't respond to conversations.", + "ACTION": "Connect inbox", + "DISMISS": "Dismiss" + }, + "COVERAGE_BANNER": { + "TEXT": "{count} FAQs are pending review, keeping coverage at {coverage}%. Approve them so your assistant can resolve more on its own.", + "ACTION": "Review FAQs", + "DISMISS": "Dismiss" + }, + "RANGES": { + "LAST_DAYS": "Last {count} days", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month" + }, + "METRICS": { + "HANDLED": { + "LABEL": "Conversations handled", + "HINT": "Distinct conversations this assistant replied in." + }, + "AUTO_RESOLUTION": { + "LABEL": "Auto-resolution rate", + "HINT": "Share of handled conversations closed without a human reply." + }, + "HANDOFF": { + "LABEL": "Handoff rate", + "HINT": "Share of handled conversations escalated to a human agent." + }, + "HOURS_SAVED": { + "LABEL": "Time saved", + "HINT": "Estimate: Captain replies times ~2 minutes of assumed agent effort per reply. Directional, not measured labor." + }, + "REOPEN": { + "LABEL": "Reopen rate", + "HINT": "Auto-resolved conversations that were reopened afterwards." + }, + "DEPTH": { + "LABEL": "Messages / conversation", + "HINT": "Average replies the assistant sends per conversation." + } + }, + "DRILLDOWN": { + "CLOSE": "Close details", + "EMPTY": "No records found for this metric.", + "ERROR": "Could not load records. Please try again.", + "LOAD_MORE": "Load more", + "RESULT_COUNT_CONVERSATION": "{count} conversation | {count} conversations" + }, + "KNOWLEDGE": { + "TITLE": "Knowledge coverage", + "COVERAGE": "{pct}% approved", + "APPROVED": "Approved FAQs", + "PENDING": "Pending FAQs", + "DOCUMENTS": "Documents" + }, + "LINKS": { + "DOCS": { + "TITLE": "Captain docs", + "DESCRIPTION": "Guides and how-tos for Captain" + }, + "PLAYGROUND": { + "TITLE": "Sân chơi", + "DESCRIPTION": "Test this assistant's replies" + }, + "BILLING": { + "TITLE": "Phí", + "DESCRIPTION": "Manage credits and plan" + } + } + }, "ASSISTANT_SWITCHER": { "ASSISTANTS": "Trợ lý", "SWITCH_ASSISTANT": "Chuyển đổi giữa các trợ lý", @@ -494,10 +577,6 @@ "PLACEHOLDER": "Enter assistant name", "ERROR": "The name is required" }, - "TEMPERATURE": { - "LABEL": "Response Temperature", - "DESCRIPTION": "Adjust how creative or restrictive the assistant's responses should be. Lower values produce more focused and deterministic responses, while higher values allow for more creative and varied outputs." - }, "DESCRIPTION": { "LABEL": "Mô tả", "PLACEHOLDER": "Enter assistant description", @@ -739,6 +818,7 @@ "DOCUMENTS": { "HEADER": "Documents", "ADD_NEW": "Create a new document", + "FAQ_COUNT": "{n} FAQ | {n} FAQs", "SELECTED": "{count} selected", "SELECT_ALL": "Select all ({count})", "UNSELECT_ALL": "Unselect all ({count})", @@ -798,7 +878,27 @@ }, "RELATED_RESPONSES": { "TITLE": "Related FAQs", - "DESCRIPTION": "These FAQs are generated directly from the document." + "EMPTY": "No FAQs have been generated from this document yet." + }, + "DETAILS": { + "DESCRIPTION": "Review the crawled content and the FAQs generated from this source.", + "SOURCE": "Source", + "GENERATED_FAQS": "Generated FAQs", + "LAST_UPDATED": "Last updated", + "NOT_AVAILABLE": "Not available", + "CONTENT_TAB": "Crawled content", + "PDF_TAB": "PDF details", + "CONTENT_TITLE": "Crawled content", + "PDF_TITLE": "PDF file", + "PDF_DESCRIPTION": "Review the original PDF source.", + "CHARACTER_COUNT": "{count} characters extracted", + "COPY_CONTENT": "Sao Chép", + "COPY_SUCCESS": "Crawled content copied to clipboard", + "COPY_ERROR": "Could not copy crawled content", + "VIEW_RAW": "View raw", + "VIEW_PREVIEW": "View preview", + "UNREADABLE_CONTENT": "Readable content could not be extracted from this document. You can view the raw extracted content.", + "EMPTY_CONTENT": "No crawled content is available for this document yet." }, "FORM_DESCRIPTION": "Enter the URL of the document to add it as a knowledge source and choose the assistant to associate it with.", "CREATE": { @@ -838,7 +938,7 @@ "ERROR_MESSAGE": "There was an error deleting the document, please try again." }, "OPTIONS": { - "VIEW_RELATED_RESPONSES": "View Related Responses", + "VIEW_DETAILS": "Xem chi tiết", "SYNC_NOW": "Refresh now", "RETRY_SYNC": "Retry refresh", "DELETE_DOCUMENT": "Delete Document" diff --git a/app/javascript/dashboard/i18n/locale/vi/onboarding.json b/app/javascript/dashboard/i18n/locale/vi/onboarding.json index ffbae5a8b..f6d0dc868 100644 --- a/app/javascript/dashboard/i18n/locale/vi/onboarding.json +++ b/app/javascript/dashboard/i18n/locale/vi/onboarding.json @@ -30,5 +30,59 @@ "VALIDATION_ERROR": "Please fill in all required fields", "SUCCESS": "Details saved successfully", "ERROR": "Could not save details. Please try again." + }, + "ONBOARDING_INBOX_SETUP": { + "GREETING": "Let's set up a few things", + "SUBTITLE": "This will give you head-start in your workspace", + "CONTINUE": "Continue", + "SKIP": "Skip", + "ERROR": "Đã xảy ra lỗi. Vui lòng thử lại.", + "WHATSAPP_CONNECTED": "WhatsApp connected successfully", + "FACEBOOK_CONNECTED": "Facebook connected successfully", + "CREATED_FOR_YOU": { + "TITLE": "We've created the following for you", + "LIVE_CHAT": "Live Chat widget", + "LIVE_CHAT_DESCRIPTION": "Instant messenger for your website", + "LIVE_CHAT_STATUS": "Almost done…", + "LIVE_CHAT_READY": "Ready", + "HELP_CENTER": "Help Center", + "HELP_CENTER_DESCRIPTION": "Your digital encyclopedia", + "HELP_CENTER_GENERATING": "Creating your help center…", + "HELP_CENTER_ANALYZING_WEBSITE": "Analyzing your website…", + "HELP_CENTER_SETTING_UP_CATEGORIES": "Setting up categories…", + "HELP_CENTER_CURATING_ARTICLES": "Curating articles…", + "HELP_CENTER_ARTICLES": "Created {count} article | Created {count} articles", + "HELP_CENTER_CATEGORIES": "{count} category | {count} categories", + "HELP_CENTER_SUMMARY": "Created {count} article across {categories} | Created {count} articles across {categories}" + }, + "CHANNELS": { + "TITLE": "Connect all your conversation channels", + "HEADER": "We found a few channels you can connect", + "CONNECT": "Kết nối", + "CONNECTED": "Connected", + "MORE_CHANNELS_NOTE": "Set up {email} and {voice} channels later inside the app", + "MORE_CHANNELS_EMAIL": "Email", + "MORE_CHANNELS_VOICE": "Voice", + "VIEW_ALL": "View all", + "GMAIL": "Gmail", + "OUTLOOK": "Outlook", + "OTHER_EMAIL": "Other Email Providers" + }, + "CHANNELS_DIALOG": { + "TITLE": "Connect all your channels instantly", + "SUBTITLE": "Manage all of them from one dashboard. You can also set up and edit inboxes later inside the app.", + "NOTE": "SMS, API, Voice, and other email providers can be set up later from your dashboard.", + "CONNECT_TITLE": "Connect your {name} account", + "CONNECT_SUBTITLE": "Fill out these quick details", + "CONNECT": "Kết nối", + "BACK": "Trờ về", + "SETUP_LATER": "Setup later in app", + "FACEBOOK_SUBTITLE": "Authorize access and choose a Page to connect.", + "FACEBOOK_LAUNCH": "Continue with Facebook", + "FACEBOOK_SELECT_PAGE": "Select a Page to connect", + "FACEBOOK_LOADING": "Loading your Facebook Pages…", + "FACEBOOK_NO_PAGES": "No connectable Pages found. All your Pages are already connected.", + "FACEBOOK_ERROR": "Couldn't connect to Facebook. Please try again." + } } } diff --git a/app/javascript/dashboard/i18n/locale/vi/report.json b/app/javascript/dashboard/i18n/locale/vi/report.json index 2db342d1c..c8b08f7c9 100644 --- a/app/javascript/dashboard/i18n/locale/vi/report.json +++ b/app/javascript/dashboard/i18n/locale/vi/report.json @@ -121,6 +121,26 @@ "CLEAR_FILTER": "Clear filter", "EMPTY_LIST": "Không tìm thấy kết quả" }, + "DRILLDOWN": { + "TITLE": "{metric} details", + "RESULT_COUNT_CONVERSATION": "{count} conversation | {count} conversations", + "RESULT_COUNT_MESSAGE": "{count} message | {count} messages", + "EMPTY": "No records found for this bar.", + "ERROR": "Could not load records. Please try again.", + "ADMIN_ONLY": "Only administrators can drill down into report records.", + "LOAD_MORE": "Load more", + "CLOSE": "Close details", + "PREVIOUS_BUCKET": "Previous bar", + "NEXT_BUCKET": "Next bar", + "UNKNOWN_CONTACT": "Unknown contact", + "UNKNOWN_INBOX": "Unknown inbox", + "UNASSIGNED_AGENT": "Chưa được phân công", + "NO_MESSAGE_CONTENT": "No message content", + "MESSAGE_CREATED_AT": "Message created at {time}", + "EVENT_OCCURRED_AT": "Event occurred at {time}", + "INCOMING_MESSAGE": "Incoming message", + "OUTGOING_MESSAGE": "Outgoing message" + }, "PAGINATION": { "RESULTS": "Showing {start} to {end} of {total} results", "PER_PAGE_TEMPLATE": "{size} / page" diff --git a/app/javascript/dashboard/i18n/locale/vi/sessionLimit.json b/app/javascript/dashboard/i18n/locale/vi/sessionLimit.json new file mode 100644 index 000000000..926745c23 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/vi/sessionLimit.json @@ -0,0 +1,12 @@ +{ + "SESSION_LIMIT": { + "TITLE": "Active session limit reached", + "DESCRIPTION": "You have reached your limit of active sessions. Please end a session before logging in.", + "END": "End", + "END_ALL": "End all sessions", + "LOG_IN": "Log in", + "CANCEL": "Back to login", + "UNKNOWN_DEVICE": "Unknown device", + "STARTED": "Started" + } +} diff --git a/app/javascript/dashboard/i18n/locale/vi/settings.json b/app/javascript/dashboard/i18n/locale/vi/settings.json index 4a3fe947c..51fb5f8be 100644 --- a/app/javascript/dashboard/i18n/locale/vi/settings.json +++ b/app/javascript/dashboard/i18n/locale/vi/settings.json @@ -86,9 +86,21 @@ "NOTE": "Manage additional security features for your account.", "MFA_BUTTON": "Manage Two-Factor Authentication" }, + "SESSIONS_SECTION": { + "TITLE": "Active Sessions", + "NOTE": "These are the devices currently logged in to your account.", + "CURRENT": "Current session", + "REVOKE": "Revoke", + "REVOKE_SUCCESS": "Session revoked successfully", + "REVOKE_ERROR": "Unable to revoke session. Please try again.", + "FETCH_ERROR": "Unable to fetch sessions. Please try again.", + "LAST_ACTIVE": "Last active", + "UNKNOWN_DEVICE": "Unknown device" + }, "ACCESS_TOKEN": { "TITLE": "Token truy cập", "NOTE": "Có thể sử dụng Token này nếu bạn đang xây dựng tích hợp dựa trên API", + "PAID_PLAN_NOTE": "API access tokens are available on paid plans.", "COPY": "Sao Chép", "RESET": "Reset", "CONFIRM_RESET": "Are you sure?", @@ -313,6 +325,7 @@ "ALL_COMPANIES": "All Companies", "CAPTAIN": "Captain", "CAPTAIN_ASSISTANTS": "Assistants", + "CAPTAIN_OVERVIEW": "Tổng quan", "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", @@ -328,6 +341,7 @@ "NOTIFICATIONS": "Thông báo", "CANNED_RESPONSES": "Thư mẫu phẩn hồi", "INTEGRATIONS": "Tích hợp", + "DATA": "Data", "PROFILE_SETTINGS": "Cài Đặt Hồ Sơ", "ACCOUNT_SETTINGS": "Cài Đặt Tài Khoản", "APPLICATIONS": "Ứng dụng", @@ -379,11 +393,124 @@ "INFO_TEXT": "Hãy để hệ thống tự động đánh dấu bạn ngoại tuyến khi bạn không sử dụng ứng dụng hoặc trang tổng quan.", "INFO_SHORT": "Automatically mark offline when you aren't using the app." }, + "SORT_TOOLTIP": "Sort", + "SORT_BY": "Sắp bởi", + "SORT_GROUPS": { + "CREATED": "Sort by date of creation", + "ALPHABETICAL": "Sort in alphabetical order", + "UNREAD_COUNT": "Sort by unread count" + }, + "SORT_OPTIONS": { + "CREATED_DESC": "Newest first", + "CREATED_ASC": "Oldest first", + "ALPHABETICAL_ASC": "Ascending (A - Z)", + "ALPHABETICAL_DESC": "Descending (Z - A)", + "UNREAD_COUNT_DESC": "Highest first", + "UNREAD_COUNT_ASC": "Lowest first" + }, "DOCS": "Đọc tài liệu", "SECURITY": "Security", "CAPTAIN_AI": "Captain", "CONVERSATION_WORKFLOW": "Conversation Workflow" }, + "DATA_IMPORTS": { + "HEADER": "Data", + "DESCRIPTION": "Bring your existing contacts and past conversations into this account from another support tool. Each import runs in the background, so you can keep working while it finishes, track its progress, and review anything that was skipped along the way.", + "LOADING": "Fetching imports", + "DEFAULT_IMPORT_NAME": "Intercom import", + "TABS": { + "IMPORT": "Nhập", + "EXPORT": "Export" + }, + "TYPES": { + "CONTACTS": "Liên hệ", + "CONVERSATIONS": "Các cuộc hội thoại", + "MESSAGES": "Tin nhắn" + }, + "DRAWER": { + "TITLE": "New import", + "SOURCE": "Source", + "NAME": "Import name", + "NAME_PLACEHOLDER": "July Intercom migration", + "ACCESS_KEY": "Intercom access key", + "ACCESS_KEY_PLACEHOLDER": "Paste your Intercom access key", + "DATA_TYPES": "Data to import", + "VALIDATING": "Validating access key...", + "VALID_KEY": "Access key validated.", + "INVALID_KEY": "Could not validate this access key.", + "ACTIVE_IMPORT": "Wait for the active import to finish before starting another one.", + "CANCEL": "Huỷ", + "IMPORT": "Nhập" + }, + "EXPORT": { + "TITLE": "Exports are on the way", + "DESCRIPTION": "Export your contacts and conversations out of this account. This workflow is coming soon.", + "COMING_SOON": "Coming soon" + }, + "TABLE": { + "TITLE": "Recent imports", + "EMPTY": "No imports yet", + "EMPTY_DESCRIPTION": "Start an import to bring your existing customer history into this account.", + "NEW_IMPORT": "Nhập", + "COUNT": "{count} imports", + "UNNAMED": "Untitled import", + "IMPORTED_COUNT": "{count} imported", + "VIEW": "View import", + "NAME": "Tên", + "TYPE": "Kiểu", + "STATUS": "Trạng thái", + "IMPORTED": "Imported", + "CREATED": "Đã tạo", + "ABANDON": "Abandon" + }, + "DETAIL": { + "BACK": "Back to imports", + "ERRORS": "Errors", + "SKIP_LOGS": "Skip logs", + "SOURCE": "Source", + "IMPORT_TYPES": "Import types", + "CREATED": "Đã tạo", + "DURATION": "Thời lượng", + "INITIATED_BY": "Started by", + "PROGRESS": "Import progress", + "PROGRESS_WITH_TOTAL": "{imported} of {total} imported", + "PROGRESS_WITHOUT_TOTAL": "{imported} imported", + "PROGRESS_OF_TOTAL": "of {total} imported", + "PROGRESS_IMPORTED": "imported", + "LAST_UPDATED_TOOLTIP": "Last updated {time}", + "NO_SKIP_LOGS": "No skipped or failed records recorded.", + "DOWNLOAD_SKIP_LOGS": "Download CSV", + "DOWNLOAD_ERROR_LOGS": "Download CSV", + "ALL_SKIP_LOGS": "Tất cả", + "KIND": "Kind", + "NO_ERRORS": "No errors recorded.", + "ERROR_CODE": "Code", + "SOURCE_OBJECT": "Source object", + "MESSAGE": "Tin nhắn" + }, + "MONITOR": { + "LIVE": "Live updates every {seconds}s", + "LAST_UPDATED": "Last updated {time}", + "REFRESH": "Làm mới", + "REFRESHING": "Refreshing", + "STAGES": { + "unknown": "Waiting for update", + "queued": "Queued", + "contacts": "Importing contacts", + "conversations": "Importing conversations", + "finalizing": "Finalizing import", + "completed": "Hoàn tất", + "completed_with_errors": "Completed with errors", + "failed": "Failed", + "abandoned": "Abandoned" + } + }, + "ALERTS": { + "IMPORT_STARTED": "Intercom import has started.", + "IMPORT_ABANDONED": "Intercom import has been abandoned.", + "IMPORT_FAILED": "Could not start the Intercom import." + } + }, "CAPTAIN_SETTINGS": { "TITLE": "Captain Settings", "DESCRIPTION": "Configure your AI models and features for Captain. Captain follows a credit based billing, you will be charged credits for every action Captain takes based on the model selected.", @@ -414,7 +541,9 @@ "DESCRIPTION": "Enable or disable AI-powered features.", "AUDIO_TRANSCRIPTION": { "TITLE": "Audio Transcription", - "DESCRIPTION": "Automatically convert voice messages and call recordings into searchable text transcripts." + "DESCRIPTION": "Automatically convert voice messages and call recordings into searchable text transcripts.", + "MODEL_TITLE": "Audio Transcription Model", + "MODEL_DESCRIPTION": "Select the AI model to use for converting audio messages into text transcripts" }, "HELP_CENTER_SEARCH": { "TITLE": "Help Center Search Indexing", @@ -439,7 +568,18 @@ "TITLE": "Gói hiện tại", "PLAN_NOTE": "Bạn hiện đã đăng ký gói **{plan}** với **{quantity}** giấy phép", "SEAT_COUNT": "Number of seats", - "RENEWS_ON": "Renews on" + "RENEWS_ON": "Renews on", + "CURRENCY": "Currency" + }, + "CURRENCY": { + "SELECT": { + "TITLE": "Choose your billing currency", + "DESCRIPTION": "Select the currency you'd like to be billed in. This can't be changed once your subscription is created." + }, + "OPTIONS": { + "USD": "US Dollar (USD)", + "BRL": "Brazilian Real (BRL)" + } }, "VIEW_PRICING": "View Pricing", "MANAGE_SUBSCRIPTION": { @@ -475,6 +615,7 @@ "PURCHASE": "Purchase Credits", "LOADING": "Loading options...", "FETCH_ERROR": "Failed to load credit options. Please try again.", + "RETRY": "Retry", "PURCHASE_ERROR": "Failed to process purchase. Please try again.", "PURCHASE_SUCCESS": "Successfully added {credits} credits to your account", "CONFIRM": { @@ -776,6 +917,10 @@ "INPUT_MAX": "Assign max", "DURATION": "Conversations per agent in every" }, + "EXCLUDE_OLDER_THAN": { + "LABEL": "Skip stale conversations", + "DESCRIPTION": "Skip unassigned conversations older than this. Defaults to 7 days; clear to disable." + }, "INBOXES": { "LABEL": "Added inboxes", "DESCRIPTION": "Add inboxes for which this policy will be applicable.", diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/advancedFilters.json b/app/javascript/dashboard/i18n/locale/zh_CN/advancedFilters.json index 01a418d04..7f9cba789 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/advancedFilters.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/advancedFilters.json @@ -19,6 +19,8 @@ "OR": "或" }, "INPUT_PLACEHOLDER": "填写内容", + "CONTACT_SEARCH_PLACEHOLDER": "搜索联系人", + "CONTACT_FALLBACK": "Contact #{id}", "OPERATOR_LABELS": { "equal_to": "等于", "not_equal_to": "不等于", @@ -49,6 +51,7 @@ "ASSIGNEE_NAME": "受理人姓名", "INBOX_NAME": "收件箱名称", "TEAM_NAME": "团队名称", + "CONTACT": "联系人", "CONVERSATION_IDENTIFIER": "对话标识", "CAMPAIGN_NAME": "活动名称", "LABELS": "标签", diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/bulkActions.json b/app/javascript/dashboard/i18n/locale/zh_CN/bulkActions.json index 63b92acbe..ff87f81e7 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/bulkActions.json @@ -27,13 +27,13 @@ }, "LABELS": { "ASSIGN_LABELS": "分配标签", - "REMOVE_LABELS": "Remove labels", + "REMOVE_LABELS": "删除标签", "ASSIGN_SELECTED_LABELS": "分配指定的标签", - "REMOVE_SELECTED_LABELS": "Remove selected labels", + "REMOVE_SELECTED_LABELS": "删除选中标签", "ASSIGN_SUCCESFUL": "已成功分配标签.", "ASSIGN_FAILED": "分配标签失败。请再试一次。", - "REMOVE_SUCCESFUL": "Labels removed successfully.", - "REMOVE_FAILED": "Failed to remove labels. Please try again." + "REMOVE_SUCCESFUL": "标签删除成功。", + "REMOVE_FAILED": "删除标签失败,请重试。" }, "TEAMS": { "NONE": "啥都没有", diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/chatlist.json b/app/javascript/dashboard/i18n/locale/zh_CN/chatlist.json index 9d170012f..89edca56f 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/chatlist.json @@ -79,6 +79,9 @@ }, "priority_desc_created_at_asc": { "TEXT": "Priority: Highest first, Created: Oldest first" + }, + "unread": { + "TEXT": "Unread Count: Highest first" } }, "ATTACHMENTS": { diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/companies.json b/app/javascript/dashboard/i18n/locale/zh_CN/companies.json index 211a9b577..bc692a48a 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/companies.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/companies.json @@ -25,6 +25,10 @@ "ACTIONS": { "CREATE": "Add company" }, + "SELECTOR": { + "PLACEHOLDER": "Select company", + "CREATE_OPTION": "Add \"{name}\"" + }, "CREATE": { "TITLE": "Add company details", "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/contact.json b/app/javascript/dashboard/i18n/locale/zh_CN/contact.json index 8508692d5..35031f78f 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/contact.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/contact.json @@ -510,6 +510,7 @@ "ATTRIBUTES": "属性", "HISTORY": "历史记录", "NOTES": "备注", + "MEDIA": "媒体", "MERGE": "合并" }, "HISTORY": { @@ -588,7 +589,7 @@ "REMOVE_LABELS": "Remove Labels", "ASSIGN_LABELS_SUCCESS": "已成功分配标签.", "ASSIGN_LABELS_FAILED": "Failed to assign labels", - "REMOVE_LABELS_SUCCESS": "Labels removed successfully.", + "REMOVE_LABELS_SUCCESS": "标签删除成功。", "REMOVE_LABELS_FAILED": "Failed to remove labels", "DESCRIPTION": "Select the labels you want to add to the selected contacts.", "NO_LABELS_FOUND": "No labels available yet.", diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/conversation.json b/app/javascript/dashboard/i18n/locale/zh_CN/conversation.json index 3ff4fdd2e..66ac83550 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/conversation.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/conversation.json @@ -44,6 +44,8 @@ "TWILIO_WHATSAPP_CAN_REPLY": "您只能使用模板信息回复此会话,原因是", "TWILIO_WHATSAPP_24_HOURS_WINDOW": "24 小时消息窗口限制", "OLD_INSTAGRAM_INBOX_REPLY_BANNER": "此 Instagram 帐户已迁移到新的 Instagram 通道收件箱。 所有新消息都将在这里显示。您将无法从这个对话中发送消息。", + "INSTAGRAM_RESTRICTION_BANNER": "Instagram is currently restricted. Some messages or actions may be delayed or unavailable while we restore full support.", + "INSTAGRAM_RESTRICTION_STATUS_LINK": "View status update", "REPLYING_TO": "您正在回复到:", "REMOVE_SELECTION": "移除选择", "DOWNLOAD": "下载", @@ -233,6 +235,7 @@ "TIP_AUDIORECORDER_ERROR": "无法打开音频", "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.", "DRAG_DROP": "拖放到此处添加附件", + "IMAGE_UPLOAD_SUCCESS": "图片上传成功", "START_AUDIO_RECORDING": "开始录音", "STOP_AUDIO_RECORDING": "停止录音", "COPILOT_THINKING": "Copilot 正在思考", @@ -303,6 +306,25 @@ "MESSAGE": "此操作无法撤销。", "DELETE": "删除", "CANCEL": "取消" + }, + "REPORT_MESSAGE": { + "LABEL": "Report message", + "TITLE": "Report Captain message", + "DESCRIPTION": "Found an issue with this AI response? Let us know what went wrong and our team will review it to help improve Captain's accuracy.", + "PROBLEM_TYPE": "Problem type", + "PROBLEM_TYPE_PLACEHOLDER": "Select a problem type", + "DESCRIPTION_LABEL": "描述信息", + "DESCRIPTION_PLACEHOLDER": "Describe the problem in detail", + "SUBMIT": "Report", + "SUCCESS": "Thanks for reporting. Our team will take a look.", + "ERROR": "Could not report this message. Please try again.", + "REASONS": { + "incorrect_information": "Incorrect information", + "inappropriate_response": "Inappropriate response", + "incomplete_response": "Incomplete response", + "outdated_information": "Outdated information", + "other": "Other" + } } }, "SIDEBAR": { @@ -400,7 +422,8 @@ "VIEW_ALL": "查看全部", "SHOW_LESS": "Show less", "MORE_COUNT": "+{count}", - "UNTITLED_FILE": "Untitled file" + "UNTITLED_FILE": "Untitled file", + "JUMP_TO_MESSAGE": "Jump to message" }, "SHOPIFY": { "ORDER_ID": "Order #{id}", diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/emoji.json b/app/javascript/dashboard/i18n/locale/zh_CN/emoji.json index 7cea49648..9cbbd1d14 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/emoji.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/emoji.json @@ -3,5 +3,33 @@ "PLACEHOLDER": "搜索表情符号", "NOT_FOUND": "没有适合你的搜索结果", "REMOVE": "删除" + }, + "EMOJI_ICON_PICKER": { + "TABS": { + "ICONS": "Icons", + "EMOJIS": "Emojis" + }, + "SEARCH_EMOJI": "Search emoji…", + "SEARCH_ICON": "Search icons…", + "FREQUENTLY_USED": "Frequently used", + "NO_EMOJI": "没有适合你的搜索结果", + "NO_ICON": "No icons match your search", + "REMOVE": "删除", + "STYLE": { + "OUTLINE": "Outline icons", + "FILLED": "Filled icons" + }, + "COLORS": { + "SLATE": "Slate", + "RED": "Red", + "ORANGE": "Orange", + "AMBER": "Amber", + "GREEN": "Green", + "TEAL": "Teal", + "BLUE": "Blue", + "INDIGO": "Indigo", + "VIOLET": "Violet", + "PINK": "Pink" + } } } diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/helpCenter.json b/app/javascript/dashboard/i18n/locale/zh_CN/helpCenter.json index adf8bdf07..e27f97b6b 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/helpCenter.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/helpCenter.json @@ -533,6 +533,8 @@ "PUBLISHED": "已发布", "ARCHIVED": "已归档" }, + "PENDING_EDITS": "Unpublished edits", + "PENDING_EDITS_TOOLTIP": "This published article has unpublished edits", "CATEGORY": { "UNCATEGORISED": "未分类" } @@ -552,6 +554,7 @@ "LOCALE": { "ALL": "所有语言环境" }, + "SEARCH_PLACEHOLDER": "搜索文章...", "NEW_ARTICLE": "新建文章" }, "EMPTY_STATE": { @@ -579,6 +582,10 @@ "CATEGORY": { "TITLE": "此类别中没有文章", "SUBTITLE": "此类别中的文章将显示在此处" + }, + "SEARCH": { + "TITLE": "No matching articles", + "SUBTITLE": "We couldn't find any articles matching your search. Try a different term." } }, "BULK_TRANSLATE": { @@ -611,6 +618,8 @@ "DELETE": "删除", "STATUS_SUCCESS": "Articles updated successfully", "STATUS_ERROR": "Failed to update articles", + "STATUS_SKIPPED": "1 article with unpublished edits was skipped — open it to publish or discard. | {count} articles with unpublished edits were skipped — open them to publish or discard.", + "STATUS_SKIPPED_ALL": "These articles have unpublished edits — open each to publish or discard.", "CATEGORY_SUCCESS": "Articles moved successfully", "CATEGORY_ERROR": "Failed to move articles", "DELETE_CONFIRM_TITLE": "Delete article | Delete {count} articles", @@ -624,6 +633,7 @@ "CATEGORY_HEADER": { "NEW_CATEGORY": "新建类别", "EDIT_CATEGORY": "编辑类别", + "SEARCH_PLACEHOLDER": "Search categories...", "CATEGORIES_COUNT": "{n} 个类别 | {n} 个类别", "BREADCRUMB": { "CATEGORY_LOCALE": "类别 ({localeCode})", @@ -634,6 +644,10 @@ "TITLE": "未找到类别", "SUBTITLE": "类别将显示在此处。您可以点击“新建类别”按钮添加类别。" }, + "SEARCH_EMPTY_STATE": { + "TITLE": "No matching categories", + "SUBTITLE": "We couldn't find any categories matching your search. Try a different term." + }, "CATEGORY_CARD": { "ARTICLES_COUNT": "{count} 篇文章 | {count} 篇文章" }, @@ -691,6 +705,11 @@ "LOCALES_PAGE": { "LOCALES_COUNT": "没有可用的语言环境 | {n} 个语言环境 | {n} 个语言环境", "NEW_LOCALE_BUTTON_TEXT": "新建语言环境", + "SEARCH_PLACEHOLDER": "Search locales...", + "SEARCH_EMPTY_STATE": { + "TITLE": "No matching locales", + "SUBTITLE": "We couldn't find any locales matching your search. Try a different term." + }, "LOCALE_CARD": { "ARTICLES_COUNT": "{count} 篇文章 | {count} 篇文章", "CATEGORIES_COUNT": "{count} 个类别 | {count} 个类别", @@ -700,9 +719,51 @@ "MAKE_DEFAULT": "设为默认", "MOVE_TO_DRAFT": "Move to draft", "PUBLISH_LOCALE": "Publish locale", + "CUSTOMIZE_CONTENT": "Localize content", + "SELECT_POPULAR_CONTENT": "Select recommended content", "DELETE": "删除" } }, + "POPULAR_CONTENT_DIALOG": { + "TITLE": "Recommended content", + "DESCRIPTION": "Pick up to 3 categories and 6 articles to feature on this locale's help center home page. Drag them into the order you want visitors to see.", + "SEARCH": "搜索……", + "EMPTY": "No matching results", + "ADD_ANOTHER": "Add another...", + "SLOTS_LEFT": "{count} slots left", + "OVERRIDING_DEFAULTS": "Overriding defaults for this locale", + "CONFIRM": "Save recommendations", + "CATEGORIES": { + "LABEL": "Recommended categories", + "ARTICLES_COUNT": "No articles | {count} article | {count} articles" + }, + "ARTICLES": { + "LABEL": "Recommended articles", + "IN_CATEGORY": "in {category}", + "UNCATEGORIZED": "未分类" + }, + "API": { + "SUCCESS_MESSAGE": "Recommended content updated successfully", + "ERROR_MESSAGE": "Unable to update recommended content. Try again." + } + }, + "CONTENT_DIALOG": { + "TITLE": "Localize content", + "DESCRIPTION": "Set values specific to this locale. Anything left blank falls back to the default locale.", + "NAME": { + "LABEL": "姓名:" + }, + "PAGE_TITLE": { + "LABEL": "页面标题" + }, + "HEADER_TEXT": { + "LABEL": "标题文本" + }, + "API": { + "SUCCESS_MESSAGE": "Locale content updated successfully", + "ERROR_MESSAGE": "Unable to update locale content. Try again." + } + }, "ADD_LOCALE_DIALOG": { "TITLE": "添加一个新的语言环境", "DESCRIPTION": "选择此文章将使用的语言。这将添加到您的翻译列表中,您可以稍后添加更多。", @@ -730,10 +791,30 @@ }, "PREVIEW": "预览", "PUBLISH": "发布", + "PUBLISH_CHANGES": "Publish changes", + "PUBLISH_CHANGES_SUCCESS": "Changes published successfully", + "PUBLISH_CHANGES_ERROR": "Could not publish changes", + "SAVE_IN_PROGRESS": "Still saving your latest changes — please try again in a moment.", + "DISCARD_CHANGES": "Discard changes", + "DISCARD_CHANGES_SUCCESS": "Changes discarded", + "DISCARD_CHANGES_ERROR": "Could not discard changes", + "PENDING_CHANGES": "Pending changes", + "VIEW_CHANGES": "View unpublished changes", "DRAFT": "草稿", "ARCHIVE": "归档", "BACK_TO_ARTICLES": "返回文章" }, + "PENDING_CHANGES_POPOVER": { + "TITLE": "Unpublished changes", + "DESCRIPTION": "This article has draft changes that aren't live yet. Apply them before changing the status, or discard them?", + "APPLY": "Apply changes", + "DISCARD": "Discard changes" + }, + "DIFF_DIALOG": { + "TITLE": "Unpublished changes", + "DESCRIPTION": "Compare your draft against the version that's currently live.", + "TITLE_LABEL": "标题" + }, "EDIT_ARTICLE": { "MORE_PROPERTIES": "更多属性", "UNCATEGORIZED": "未分类", diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/zh_CN/inboxMgmt.json index e29dd5cb9..d382ec198 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/inboxMgmt.json @@ -58,14 +58,17 @@ "ERROR_MESSAGE": "连接到 Instagram 时出错,请重试", "ERROR_AUTH": "连接到 Instagram 时出错,请重试", "NEW_INBOX_SUGGESTION": "这个 Instagram 账户先前已连接到一个不同的收件箱,现在已经迁移到这里。 所有新消息都将出现在这里。旧收件箱将无法再发送或接收此账户的消息。", - "DUPLICATE_INBOX_BANNER": "此 Instagram 账户已迁移到新的 Instagram 通道收件箱。您将无法从此收件箱发送/接收 Instagram 消息。" + "DUPLICATE_INBOX_BANNER": "此 Instagram 账户已迁移到新的 Instagram 通道收件箱。您将无法从此收件箱发送/接收 Instagram 消息。", + "SETTINGS_RESTRICTED_WARNING": "Instagram is currently restricted. Some messages or actions may be delayed or unavailable while we restore full support.", + "STATUS_LINK": "View status update" }, "TIKTOK": { "CONTINUE_WITH_TIKTOK": "Continue with TikTok", "CONNECT_YOUR_TIKTOK_PROFILE": "Connect your TikTok Profile", "HELP": "To add your TikTok profile as a channel, you need to authenticate your TikTok Profile by clicking on 'Continue with TikTok' ", "ERROR_MESSAGE": "There was an error connecting to TikTok, please try again", - "ERROR_AUTH": "There was an error connecting to TikTok, please try again" + "ERROR_AUTH": "There was an error connecting to TikTok, please try again", + "NORTH_AMERICA_WARNING": "TikTok connections for North American accounts are temporarily unavailable while we wait for an update from the TikTok team." }, "TWITTER": { "HELP": "若要将您的Twitter个人资料添加为频道,您需要通过点击“使用Twitter登录”来验证您的Twitter个人资料。 ", @@ -653,6 +656,10 @@ }, "CREDENTIALS": { "DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections." + }, + "INBOUND": { + "LABEL": "Allow incoming calls", + "DESCRIPTION": "Let customers call this number. When turned off, incoming calls are declined automatically — agents aren't notified and no conversation is created. Agents can still place outgoing calls." } }, "WHATSAPP_CALLING": { @@ -810,6 +817,15 @@ "WHATSAPP_EMBEDDED_SIGNUP_SUBHEADER": "此收件箱已通过嵌入注册的 WhatsApp 连接。", "WHATSAPP_EMBEDDED_SIGNUP_DESCRIPTION": "您可以重新配置此收件箱来更新您的 WhatsApp Business 设置。", "WHATSAPP_RECONFIGURE_BUTTON": "重新配置", + "WHATSAPP_MANUAL_TRANSFER_TITLE": "Switch to Manual Setup", + "WHATSAPP_MANUAL_TRANSFER_SUBHEADER": "This inbox was connected through WhatsApp embedded signup, which is no longer supported. Enter the WhatsApp Cloud API credentials from your own Meta app to switch this inbox to a manual setup. Configure the webhook in your Meta app using the verification token above before switching.", + "WHATSAPP_MANUAL_TRANSFER_PHONE_NUMBER_ID_LABEL": "Phone Number ID", + "WHATSAPP_MANUAL_TRANSFER_BUSINESS_ACCOUNT_ID_LABEL": "企业账户ID", + "WHATSAPP_MANUAL_TRANSFER_API_KEY_LABEL": "API 密钥", + "WHATSAPP_MANUAL_TRANSFER_API_KEY_PLACEHOLDER": "Enter a permanent access token from your Meta app", + "WHATSAPP_MANUAL_TRANSFER_BUTTON": "Switch to Manual Setup", + "WHATSAPP_MANUAL_TRANSFER_SUCCESS": "Inbox switched to manual setup successfully.", + "WHATSAPP_MANUAL_TRANSFER_ERROR": "Could not switch to manual setup. Please verify the credentials and try again.", "WHATSAPP_CONNECT_TITLE": "连接到 WhatsApp Business", "WHATSAPP_CONNECT_SUBHEADER": "Upgrade to WhatsApp embedded signup for easier management.", "WHATSAPP_CONNECT_DESCRIPTION": "Connect this inbox to WhatsApp Business for enhanced features and easier management.", @@ -827,6 +843,70 @@ "WHATSAPP_TEMPLATES_SYNC_SUBHEADER": "Manually sync message templates from WhatsApp to update your available templates.", "WHATSAPP_TEMPLATES_SYNC_BUTTON": "同步模板", "WHATSAPP_TEMPLATES_SYNC_SUCCESS": "Templates sync initiated successfully. It may take a couple of minutes to update.", + "WHATSAPP_MANUAL_MIGRATION": { + "BANNER": { + "TITLE": "Manual setup recommended", + "DESCRIPTION": "This inbox connects through the shared Meta app used for embedded signup, which recent Meta restrictions have affected. To avoid similar issues in the future, we recommend reconnecting it with your own Meta app.", + "START": "Start manual migration", + "GUIDE": "View guide" + }, + "DIALOG": { + "EYEBROW": "WhatsApp manual migration", + "TITLE": "Reconnect WhatsApp inbox", + "CLOSE": "关闭", + "ACTION_REQUIRED_TITLE": "Reconnect with your own Meta app", + "ACTION_REQUIRED_DESCRIPTION": "Inboxes connected through your own Meta app are not affected by restrictions on the shared embedded signup app. This guided flow updates the WhatsApp API connection without creating a new inbox.", + "GUIDE_LINK": "Open the manual setup guide", + "PRESERVED_TITLE": "Preserved", + "PRESERVED_DESCRIPTION": "Conversations, contacts, collaborators, routing, business hours, and inbox settings.", + "UPDATED_TITLE": "Updated", + "UPDATED_DESCRIPTION": "WABA ID, phone number ID, access token, and webhook configuration.", + "WABA_ID": "WABA ID", + "WABA_PLACEHOLDER": "Enter WABA ID", + "WABA_HELP": "The WhatsApp Business Account that owns this phone number.", + "PHONE_NUMBER_ID": "Phone Number ID", + "PHONE_NUMBER_PLACEHOLDER": "Enter Phone Number ID", + "PHONE_NUMBER_HELP": "Meta's unique ID for the WhatsApp number connected to this inbox.", + "DISPLAY_PHONE_NUMBER": "Display phone number", + "DISPLAY_PHONE_NUMBER_PLACEHOLDER": "Enter display phone number", + "DISPLAY_PHONE_NUMBER_HELP": "The customer-facing WhatsApp number. This cannot be changed during migration.", + "ACCESS_TOKEN": "Permanent access token or system user token", + "ACCESS_TOKEN_PLACEHOLDER": "Paste access token", + "TOKEN_HELP_PREFIX": "The token must include", + "TOKEN_HELP_MIDDLE": "添加", + "TOKEN_HELP_SUFFIX": "for template sync and template management.", + "MESSAGING_PERMISSION": "whatsapp_business_messaging.", + "MANAGEMENT_PERMISSION": "whatsapp_business_management", + "REVIEW_TITLE": "Review before reconnecting", + "INBOX": "收件箱", + "PHONE_NUMBER": "电话号码", + "NOT_ENTERED": "Not entered", + "VERIFY_NOTICE": "Chatwoot will verify these credentials with Meta before applying any changes. If verification fails, the current configuration is left untouched.", + "BACK": "后退", + "CANCEL": "取消", + "CONTINUE": "Continue", + "REVIEW_MIGRATION": "Review migration", + "RECONNECT": "Reconnect WhatsApp inbox" + }, + "STEPS": { + "BEFORE_YOU_START": { + "TITLE": "Before you start", + "DESCRIPTION": "This reconnects the WhatsApp API details for this inbox. Conversations, collaborators, routing, business hours, CSAT, and bot settings will be preserved." + }, + "BUSINESS_DETAILS": { + "TITLE": "Business details", + "DESCRIPTION": "Enter the WhatsApp assets from the customer Meta Business account." + }, + "ACCESS_TOKEN": { + "TITLE": "Access token", + "DESCRIPTION": "Paste a permanent access token or system user token with WhatsApp permissions." + }, + "REVIEW_MIGRATION": { + "TITLE": "Review migration", + "DESCRIPTION": "Confirm the connection details before reconnecting this inbox. Chatwoot will verify the token, WABA, and phone number with Meta before applying changes." + } + } + }, "WHATSAPP_CALLING_ENABLED": { "LABEL": "Enable voice calling", "DESCRIPTION": "Allow agents to start and receive WhatsApp voice calls on this inbox. Available only on embedded-signup WhatsApp Cloud channels with calling permission granted by Meta." diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/index.js b/app/javascript/dashboard/i18n/locale/zh_CN/index.js index 785b1e0b1..290a47a14 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/index.js +++ b/app/javascript/dashboard/i18n/locale/zh_CN/index.js @@ -33,6 +33,7 @@ import report from './report.json'; import resetPassword from './resetPassword.json'; import search from './search.json'; import setNewPassword from './setNewPassword.json'; +import sessionLimit from './sessionLimit.json'; import settings from './settings.json'; import signup from './signup.json'; import sla from './sla.json'; @@ -75,6 +76,7 @@ export default { ...resetPassword, ...search, ...setNewPassword, + ...sessionLimit, ...settings, ...signup, ...sla, diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/integrations.json b/app/javascript/dashboard/i18n/locale/zh_CN/integrations.json index 66191b450..497aa58c9 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/integrations.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/integrations.json @@ -31,6 +31,13 @@ "WEBHOOK": { "SUBSCRIBED_EVENTS": "订阅事件", "LEARN_MORE": "了解更多关于 Webhooks 的信息", + "PAYWALL": { + "TITLE": "Webhooks are available on paid plans", + "AVAILABLE_ON": "Use webhooks to receive real-time events from your Chatwoot account.", + "UPGRADE_PROMPT": "Upgrade to the Startups, Business, or Enterprise plan to use webhooks.", + "UPGRADE_NOW": "立即升级", + "CANCEL_ANYTIME": "Change or cancel your plan anytime." + }, "SECRET": { "LABEL": "Secret", "COPY": "Copy secret to clipboard", @@ -392,6 +399,82 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "了解更多", + "OVERVIEW": { + "HEADER": "概览", + "WELCOME": { + "LABEL": "Captain summary", + "LOADING": "Generating summary…" + }, + "INBOX_BANNER": { + "TEXT": "This assistant isn't connected to any inbox yet, so it won't respond to conversations.", + "ACTION": "Connect inbox", + "DISMISS": "取消" + }, + "COVERAGE_BANNER": { + "TEXT": "{count} FAQs are pending review, keeping coverage at {coverage}%. Approve them so your assistant can resolve more on its own.", + "ACTION": "Review FAQs", + "DISMISS": "取消" + }, + "RANGES": { + "LAST_DAYS": "Last {count} days", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month" + }, + "METRICS": { + "HANDLED": { + "LABEL": "Conversations handled", + "HINT": "Distinct conversations this assistant replied in." + }, + "AUTO_RESOLUTION": { + "LABEL": "Auto-resolution rate", + "HINT": "Share of handled conversations closed without a human reply." + }, + "HANDOFF": { + "LABEL": "Handoff rate", + "HINT": "Share of handled conversations escalated to a human agent." + }, + "HOURS_SAVED": { + "LABEL": "Time saved", + "HINT": "Estimate: Captain replies times ~2 minutes of assumed agent effort per reply. Directional, not measured labor." + }, + "REOPEN": { + "LABEL": "Reopen rate", + "HINT": "Auto-resolved conversations that were reopened afterwards." + }, + "DEPTH": { + "LABEL": "Messages / conversation", + "HINT": "Average replies the assistant sends per conversation." + } + }, + "DRILLDOWN": { + "CLOSE": "Close details", + "EMPTY": "No records found for this metric.", + "ERROR": "Could not load records. Please try again.", + "LOAD_MORE": "加载更多", + "RESULT_COUNT_CONVERSATION": "{count} conversation | {count} conversations" + }, + "KNOWLEDGE": { + "TITLE": "Knowledge coverage", + "COVERAGE": "{pct}% approved", + "APPROVED": "Approved FAQs", + "PENDING": "Pending FAQs", + "DOCUMENTS": "文档" + }, + "LINKS": { + "DOCS": { + "TITLE": "Captain docs", + "DESCRIPTION": "Guides and how-tos for Captain" + }, + "PLAYGROUND": { + "TITLE": "试验场", + "DESCRIPTION": "Test this assistant's replies" + }, + "BILLING": { + "TITLE": "计费", + "DESCRIPTION": "Manage credits and plan" + } + } + }, "ASSISTANT_SWITCHER": { "ASSISTANTS": "助手", "SWITCH_ASSISTANT": "在助手之间切换", @@ -494,10 +577,6 @@ "PLACEHOLDER": "输入助手名称", "ERROR": "名称是必需的" }, - "TEMPERATURE": { - "LABEL": "响应温度", - "DESCRIPTION": "调整助手回复的创造性或限制程度。较低的数值会产生更专注和确定性的回复,而较高的数值则允许更有创意和多样化的输出。" - }, "DESCRIPTION": { "LABEL": "描述信息", "PLACEHOLDER": "输入助手描述", @@ -739,6 +818,7 @@ "DOCUMENTS": { "HEADER": "文档", "ADD_NEW": "创建新文档", + "FAQ_COUNT": "{n} FAQ | {n} FAQs", "SELECTED": "{count} 已选择", "SELECT_ALL": "全选 ({count})", "UNSELECT_ALL": "取消全选({count})", @@ -798,7 +878,27 @@ }, "RELATED_RESPONSES": { "TITLE": "相关常见问题", - "DESCRIPTION": "这些常见问题直接从文档生成。" + "EMPTY": "No FAQs have been generated from this document yet." + }, + "DETAILS": { + "DESCRIPTION": "Review the crawled content and the FAQs generated from this source.", + "SOURCE": "Source", + "GENERATED_FAQS": "Generated FAQs", + "LAST_UPDATED": "Last updated", + "NOT_AVAILABLE": "暂无", + "CONTENT_TAB": "Crawled content", + "PDF_TAB": "PDF details", + "CONTENT_TITLE": "Crawled content", + "PDF_TITLE": "PDF file", + "PDF_DESCRIPTION": "Review the original PDF source.", + "CHARACTER_COUNT": "{count} characters extracted", + "COPY_CONTENT": "复制", + "COPY_SUCCESS": "Crawled content copied to clipboard", + "COPY_ERROR": "Could not copy crawled content", + "VIEW_RAW": "View raw", + "VIEW_PREVIEW": "View preview", + "UNREADABLE_CONTENT": "Readable content could not be extracted from this document. You can view the raw extracted content.", + "EMPTY_CONTENT": "No crawled content is available for this document yet." }, "FORM_DESCRIPTION": "输入文档的 URL 以将其添加为知识源,并选择要关联的助手。", "CREATE": { @@ -838,7 +938,7 @@ "ERROR_MESSAGE": "删除文档时出错,请重试" }, "OPTIONS": { - "VIEW_RELATED_RESPONSES": "查看相关常见问题", + "VIEW_DETAILS": "查看详细信息", "SYNC_NOW": "Refresh now", "RETRY_SYNC": "Retry refresh", "DELETE_DOCUMENT": "删除文档" diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/onboarding.json b/app/javascript/dashboard/i18n/locale/zh_CN/onboarding.json index b2305361d..afb267c12 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/onboarding.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/onboarding.json @@ -30,5 +30,59 @@ "VALIDATION_ERROR": "Please fill in all required fields", "SUCCESS": "Details saved successfully", "ERROR": "Could not save details. Please try again." + }, + "ONBOARDING_INBOX_SETUP": { + "GREETING": "Let's set up a few things", + "SUBTITLE": "This will give you head-start in your workspace", + "CONTINUE": "Continue", + "SKIP": "Skip", + "ERROR": "出错了。请重试。", + "WHATSAPP_CONNECTED": "WhatsApp connected successfully", + "FACEBOOK_CONNECTED": "Facebook connected successfully", + "CREATED_FOR_YOU": { + "TITLE": "We've created the following for you", + "LIVE_CHAT": "Live Chat widget", + "LIVE_CHAT_DESCRIPTION": "Instant messenger for your website", + "LIVE_CHAT_STATUS": "Almost done…", + "LIVE_CHAT_READY": "已就绪", + "HELP_CENTER": "帮助中心", + "HELP_CENTER_DESCRIPTION": "Your digital encyclopedia", + "HELP_CENTER_GENERATING": "Creating your help center…", + "HELP_CENTER_ANALYZING_WEBSITE": "Analyzing your website…", + "HELP_CENTER_SETTING_UP_CATEGORIES": "Setting up categories…", + "HELP_CENTER_CURATING_ARTICLES": "Curating articles…", + "HELP_CENTER_ARTICLES": "Created {count} article | Created {count} articles", + "HELP_CENTER_CATEGORIES": "{count} 个类别 | {count} 个类别", + "HELP_CENTER_SUMMARY": "Created {count} article across {categories} | Created {count} articles across {categories}" + }, + "CHANNELS": { + "TITLE": "Connect all your conversation channels", + "HEADER": "We found a few channels you can connect", + "CONNECT": "连接", + "CONNECTED": "Connected", + "MORE_CHANNELS_NOTE": "Set up {email} and {voice} channels later inside the app", + "MORE_CHANNELS_EMAIL": "Email", + "MORE_CHANNELS_VOICE": "语音", + "VIEW_ALL": "查看全部", + "GMAIL": "Gmail", + "OUTLOOK": "Outlook", + "OTHER_EMAIL": "Other Email Providers" + }, + "CHANNELS_DIALOG": { + "TITLE": "Connect all your channels instantly", + "SUBTITLE": "Manage all of them from one dashboard. You can also set up and edit inboxes later inside the app.", + "NOTE": "SMS, API, Voice, and other email providers can be set up later from your dashboard.", + "CONNECT_TITLE": "Connect your {name} account", + "CONNECT_SUBTITLE": "Fill out these quick details", + "CONNECT": "连接", + "BACK": "后退", + "SETUP_LATER": "Setup later in app", + "FACEBOOK_SUBTITLE": "Authorize access and choose a Page to connect.", + "FACEBOOK_LAUNCH": "Continue with Facebook", + "FACEBOOK_SELECT_PAGE": "Select a Page to connect", + "FACEBOOK_LOADING": "Loading your Facebook Pages…", + "FACEBOOK_NO_PAGES": "No connectable Pages found. All your Pages are already connected.", + "FACEBOOK_ERROR": "Couldn't connect to Facebook. Please try again." + } } } diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/report.json b/app/javascript/dashboard/i18n/locale/zh_CN/report.json index 0d5592e44..5c34c44bb 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/report.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/report.json @@ -121,6 +121,26 @@ "CLEAR_FILTER": "清除筛选条件", "EMPTY_LIST": "没有检索到相关信息" }, + "DRILLDOWN": { + "TITLE": "{metric} details", + "RESULT_COUNT_CONVERSATION": "{count} conversation | {count} conversations", + "RESULT_COUNT_MESSAGE": "{count} message | {count} messages", + "EMPTY": "No records found for this bar.", + "ERROR": "Could not load records. Please try again.", + "ADMIN_ONLY": "Only administrators can drill down into report records.", + "LOAD_MORE": "加载更多", + "CLOSE": "Close details", + "PREVIOUS_BUCKET": "Previous bar", + "NEXT_BUCKET": "Next bar", + "UNKNOWN_CONTACT": "Unknown contact", + "UNKNOWN_INBOX": "Unknown inbox", + "UNASSIGNED_AGENT": "未分配", + "NO_MESSAGE_CONTENT": "No message content", + "MESSAGE_CREATED_AT": "Message created at {time}", + "EVENT_OCCURRED_AT": "Event occurred at {time}", + "INCOMING_MESSAGE": "Incoming message", + "OUTGOING_MESSAGE": "Outgoing message" + }, "PAGINATION": { "RESULTS": "显示 {start} 到 {end} 条,共 {total} 条结果", "PER_PAGE_TEMPLATE": "{size} / page" diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/sessionLimit.json b/app/javascript/dashboard/i18n/locale/zh_CN/sessionLimit.json new file mode 100644 index 000000000..926745c23 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/zh_CN/sessionLimit.json @@ -0,0 +1,12 @@ +{ + "SESSION_LIMIT": { + "TITLE": "Active session limit reached", + "DESCRIPTION": "You have reached your limit of active sessions. Please end a session before logging in.", + "END": "End", + "END_ALL": "End all sessions", + "LOG_IN": "Log in", + "CANCEL": "Back to login", + "UNKNOWN_DEVICE": "Unknown device", + "STARTED": "Started" + } +} diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/settings.json b/app/javascript/dashboard/i18n/locale/zh_CN/settings.json index 1ae37314e..635e81723 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/settings.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/settings.json @@ -86,9 +86,21 @@ "NOTE": "Manage additional security features for your account.", "MFA_BUTTON": "Manage Two-Factor Authentication" }, + "SESSIONS_SECTION": { + "TITLE": "Active Sessions", + "NOTE": "These are the devices currently logged in to your account.", + "CURRENT": "Current session", + "REVOKE": "Revoke", + "REVOKE_SUCCESS": "Session revoked successfully", + "REVOKE_ERROR": "Unable to revoke session. Please try again.", + "FETCH_ERROR": "Unable to fetch sessions. Please try again.", + "LAST_ACTIVE": "Last active", + "UNKNOWN_DEVICE": "Unknown device" + }, "ACCESS_TOKEN": { "TITLE": "访问令牌", "NOTE": "如果您正在构建基于 API 的集成,这个令牌可以被使用", + "PAID_PLAN_NOTE": "API access tokens are available on paid plans.", "COPY": "复制", "RESET": "重置", "CONFIRM_RESET": "您确定吗?", @@ -313,6 +325,7 @@ "ALL_COMPANIES": "All Companies", "CAPTAIN": "Captain", "CAPTAIN_ASSISTANTS": "助手", + "CAPTAIN_OVERVIEW": "概览", "CAPTAIN_DOCUMENTS": "文档", "CAPTAIN_RESPONSES": "常见问题", "CAPTAIN_TOOLS": "工具", @@ -328,6 +341,7 @@ "NOTIFICATIONS": "消息通知", "CANNED_RESPONSES": "预设回复", "INTEGRATIONS": "集成方式", + "DATA": "Data", "PROFILE_SETTINGS": "个人资料设置", "ACCOUNT_SETTINGS": "账户设置", "APPLICATIONS": "应用程序", @@ -379,11 +393,124 @@ "INFO_TEXT": "当您不使用应用程序或仪表板时,让系统自动标记您离线。", "INFO_SHORT": "当您不使用应用程序时自动标记离线。" }, + "SORT_TOOLTIP": "排序", + "SORT_BY": "排序方式", + "SORT_GROUPS": { + "CREATED": "Sort by date of creation", + "ALPHABETICAL": "Sort in alphabetical order", + "UNREAD_COUNT": "Sort by unread count" + }, + "SORT_OPTIONS": { + "CREATED_DESC": "Newest first", + "CREATED_ASC": "Oldest first", + "ALPHABETICAL_ASC": "Ascending (A - Z)", + "ALPHABETICAL_DESC": "Descending (Z - A)", + "UNREAD_COUNT_DESC": "Highest first", + "UNREAD_COUNT_ASC": "Lowest first" + }, "DOCS": "阅读文档", "SECURITY": "安全", "CAPTAIN_AI": "Captain", "CONVERSATION_WORKFLOW": "Conversation Workflow" }, + "DATA_IMPORTS": { + "HEADER": "Data", + "DESCRIPTION": "Bring your existing contacts and past conversations into this account from another support tool. Each import runs in the background, so you can keep working while it finishes, track its progress, and review anything that was skipped along the way.", + "LOADING": "Fetching imports", + "DEFAULT_IMPORT_NAME": "Intercom import", + "TABS": { + "IMPORT": "导入", + "EXPORT": "导出" + }, + "TYPES": { + "CONTACTS": "联系人", + "CONVERSATIONS": "会话", + "MESSAGES": "消息" + }, + "DRAWER": { + "TITLE": "New import", + "SOURCE": "Source", + "NAME": "Import name", + "NAME_PLACEHOLDER": "July Intercom migration", + "ACCESS_KEY": "Intercom access key", + "ACCESS_KEY_PLACEHOLDER": "Paste your Intercom access key", + "DATA_TYPES": "Data to import", + "VALIDATING": "Validating access key...", + "VALID_KEY": "Access key validated.", + "INVALID_KEY": "Could not validate this access key.", + "ACTIVE_IMPORT": "Wait for the active import to finish before starting another one.", + "CANCEL": "取消", + "IMPORT": "导入" + }, + "EXPORT": { + "TITLE": "Exports are on the way", + "DESCRIPTION": "Export your contacts and conversations out of this account. This workflow is coming soon.", + "COMING_SOON": "Coming soon" + }, + "TABLE": { + "TITLE": "Recent imports", + "EMPTY": "No imports yet", + "EMPTY_DESCRIPTION": "Start an import to bring your existing customer history into this account.", + "NEW_IMPORT": "导入", + "COUNT": "{count} imports", + "UNNAMED": "Untitled import", + "IMPORTED_COUNT": "{count} imported", + "VIEW": "View import", + "NAME": "姓名:", + "TYPE": "类型", + "STATUS": "状态", + "IMPORTED": "Imported", + "CREATED": "创建时间", + "ABANDON": "Abandon" + }, + "DETAIL": { + "BACK": "Back to imports", + "ERRORS": "Errors", + "SKIP_LOGS": "Skip logs", + "SOURCE": "Source", + "IMPORT_TYPES": "Import types", + "CREATED": "创建时间", + "DURATION": "持续时间", + "INITIATED_BY": "Started by", + "PROGRESS": "Import progress", + "PROGRESS_WITH_TOTAL": "{imported} of {total} imported", + "PROGRESS_WITHOUT_TOTAL": "{imported} imported", + "PROGRESS_OF_TOTAL": "of {total} imported", + "PROGRESS_IMPORTED": "imported", + "LAST_UPDATED_TOOLTIP": "Last updated {time}", + "NO_SKIP_LOGS": "No skipped or failed records recorded.", + "DOWNLOAD_SKIP_LOGS": "Download CSV", + "DOWNLOAD_ERROR_LOGS": "Download CSV", + "ALL_SKIP_LOGS": "所有的", + "KIND": "Kind", + "NO_ERRORS": "No errors recorded.", + "ERROR_CODE": "Code", + "SOURCE_OBJECT": "Source object", + "MESSAGE": "消息" + }, + "MONITOR": { + "LIVE": "Live updates every {seconds}s", + "LAST_UPDATED": "Last updated {time}", + "REFRESH": "刷新", + "REFRESHING": "Refreshing", + "STAGES": { + "unknown": "Waiting for update", + "queued": "Queued", + "contacts": "Importing contacts", + "conversations": "Importing conversations", + "finalizing": "Finalizing import", + "completed": "已完成", + "completed_with_errors": "Completed with errors", + "failed": "失败", + "abandoned": "Abandoned" + } + }, + "ALERTS": { + "IMPORT_STARTED": "Intercom import has started.", + "IMPORT_ABANDONED": "Intercom import has been abandoned.", + "IMPORT_FAILED": "Could not start the Intercom import." + } + }, "CAPTAIN_SETTINGS": { "TITLE": "Captain Settings", "DESCRIPTION": "Configure your AI models and features for Captain. Captain follows a credit based billing, you will be charged credits for every action Captain takes based on the model selected.", @@ -414,7 +541,9 @@ "DESCRIPTION": "Enable or disable AI-powered features.", "AUDIO_TRANSCRIPTION": { "TITLE": "Audio Transcription", - "DESCRIPTION": "Automatically convert voice messages and call recordings into searchable text transcripts." + "DESCRIPTION": "Automatically convert voice messages and call recordings into searchable text transcripts.", + "MODEL_TITLE": "Audio Transcription Model", + "MODEL_DESCRIPTION": "Select the AI model to use for converting audio messages into text transcripts" }, "HELP_CENTER_SEARCH": { "TITLE": "Help Center Search Indexing", @@ -439,7 +568,18 @@ "TITLE": "当前计划", "PLAN_NOTE": "您当前订阅的是 **{plan}** 计划,拥有 **{quantity}** 个许可证", "SEAT_COUNT": "座位数", - "RENEWS_ON": "续订于" + "RENEWS_ON": "续订于", + "CURRENCY": "Currency" + }, + "CURRENCY": { + "SELECT": { + "TITLE": "Choose your billing currency", + "DESCRIPTION": "Select the currency you'd like to be billed in. This can't be changed once your subscription is created." + }, + "OPTIONS": { + "USD": "US Dollar (USD)", + "BRL": "Brazilian Real (BRL)" + } }, "VIEW_PRICING": "查看价格", "MANAGE_SUBSCRIPTION": { @@ -475,6 +615,7 @@ "PURCHASE": "Purchase Credits", "LOADING": "Loading options...", "FETCH_ERROR": "Failed to load credit options. Please try again.", + "RETRY": "重试", "PURCHASE_ERROR": "Failed to process purchase. Please try again.", "PURCHASE_SUCCESS": "Successfully added {credits} credits to your account", "CONFIRM": { @@ -776,6 +917,10 @@ "INPUT_MAX": "Assign max", "DURATION": "Conversations per agent in every" }, + "EXCLUDE_OLDER_THAN": { + "LABEL": "Skip stale conversations", + "DESCRIPTION": "Skip unassigned conversations older than this. Defaults to 7 days; clear to disable." + }, "INBOXES": { "LABEL": "Added inboxes", "DESCRIPTION": "Add inboxes for which this policy will be applicable.", diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/advancedFilters.json b/app/javascript/dashboard/i18n/locale/zh_TW/advancedFilters.json index 2ab003990..04c612d27 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/advancedFilters.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/advancedFilters.json @@ -19,6 +19,8 @@ "OR": "或" }, "INPUT_PLACEHOLDER": "輸入值", + "CONTACT_SEARCH_PLACEHOLDER": "搜尋聯絡人", + "CONTACT_FALLBACK": "Contact #{id}", "OPERATOR_LABELS": { "equal_to": "等於", "not_equal_to": "不等於", @@ -49,6 +51,7 @@ "ASSIGNEE_NAME": "指派對象", "INBOX_NAME": "收件匣名稱", "TEAM_NAME": "團隊名稱", + "CONTACT": "聯絡人", "CONVERSATION_IDENTIFIER": "對話識別碼", "CAMPAIGN_NAME": "活動名稱", "LABELS": "標籤", diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/chatlist.json b/app/javascript/dashboard/i18n/locale/zh_TW/chatlist.json index 71f4d58f7..5316d7ed2 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/chatlist.json @@ -79,6 +79,9 @@ }, "priority_desc_created_at_asc": { "TEXT": "優先順序:高的在前,建立日期:舊的在前" + }, + "unread": { + "TEXT": "Unread Count: Highest first" } }, "ATTACHMENTS": { diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/companies.json b/app/javascript/dashboard/i18n/locale/zh_TW/companies.json index fa023537d..c30bf1423 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/companies.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/companies.json @@ -25,6 +25,10 @@ "ACTIONS": { "CREATE": "Add company" }, + "SELECTOR": { + "PLACEHOLDER": "Select company", + "CREATE_OPTION": "Add \"{name}\"" + }, "CREATE": { "TITLE": "Add company details", "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/contact.json b/app/javascript/dashboard/i18n/locale/zh_TW/contact.json index a7848de4c..8a2eef0f8 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/contact.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/contact.json @@ -510,6 +510,7 @@ "ATTRIBUTES": "屬性", "HISTORY": "歷史紀錄", "NOTES": "備註", + "MEDIA": "媒體", "MERGE": "合併" }, "HISTORY": { diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json b/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json index 9501312d7..beaecf9ce 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json @@ -44,6 +44,8 @@ "TWILIO_WHATSAPP_CAN_REPLY": "由於以下原因,您只能使用範本訊息回覆此對話", "TWILIO_WHATSAPP_24_HOURS_WINDOW": "24 小時訊息視窗限制", "OLD_INSTAGRAM_INBOX_REPLY_BANNER": "此 Instagram 帳號已遷移至新的 Instagram 頻道收件匣。所有新訊息將顯示在該處。您將無法再從此對話發送訊息。", + "INSTAGRAM_RESTRICTION_BANNER": "Instagram is currently restricted. Some messages or actions may be delayed or unavailable while we restore full support.", + "INSTAGRAM_RESTRICTION_STATUS_LINK": "View status update", "REPLYING_TO": "您正在回覆:", "REMOVE_SELECTION": "移除選擇", "DOWNLOAD": "下載", @@ -233,6 +235,7 @@ "TIP_AUDIORECORDER_ERROR": "無法開啟音訊", "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.", "DRAG_DROP": "拖放至此處以附加檔案", + "IMAGE_UPLOAD_SUCCESS": "圖片上傳成功", "START_AUDIO_RECORDING": "開始錄音", "STOP_AUDIO_RECORDING": "停止錄音", "COPILOT_THINKING": "Copilot 正在思考", @@ -303,6 +306,25 @@ "MESSAGE": "此操作無法復原", "DELETE": "刪除", "CANCEL": "取消" + }, + "REPORT_MESSAGE": { + "LABEL": "Report message", + "TITLE": "Report Captain message", + "DESCRIPTION": "Found an issue with this AI response? Let us know what went wrong and our team will review it to help improve Captain's accuracy.", + "PROBLEM_TYPE": "Problem type", + "PROBLEM_TYPE_PLACEHOLDER": "Select a problem type", + "DESCRIPTION_LABEL": "描述", + "DESCRIPTION_PLACEHOLDER": "Describe the problem in detail", + "SUBMIT": "Report", + "SUCCESS": "Thanks for reporting. Our team will take a look.", + "ERROR": "Could not report this message. Please try again.", + "REASONS": { + "incorrect_information": "Incorrect information", + "inappropriate_response": "Inappropriate response", + "incomplete_response": "Incomplete response", + "outdated_information": "Outdated information", + "other": "Other" + } } }, "SIDEBAR": { @@ -400,7 +422,8 @@ "VIEW_ALL": "查看全部", "SHOW_LESS": "Show less", "MORE_COUNT": "+{count}", - "UNTITLED_FILE": "Untitled file" + "UNTITLED_FILE": "Untitled file", + "JUMP_TO_MESSAGE": "Jump to message" }, "SHOPIFY": { "ORDER_ID": "訂單 #{id}", diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/emoji.json b/app/javascript/dashboard/i18n/locale/zh_TW/emoji.json index d6a1703af..aacf33dc4 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/emoji.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/emoji.json @@ -3,5 +3,33 @@ "PLACEHOLDER": "搜尋表情符號", "NOT_FOUND": "找不到符合的表情符號", "REMOVE": "移除" + }, + "EMOJI_ICON_PICKER": { + "TABS": { + "ICONS": "Icons", + "EMOJIS": "Emojis" + }, + "SEARCH_EMOJI": "Search emoji…", + "SEARCH_ICON": "Search icons…", + "FREQUENTLY_USED": "Frequently used", + "NO_EMOJI": "找不到符合的表情符號", + "NO_ICON": "No icons match your search", + "REMOVE": "移除", + "STYLE": { + "OUTLINE": "Outline icons", + "FILLED": "Filled icons" + }, + "COLORS": { + "SLATE": "Slate", + "RED": "Red", + "ORANGE": "Orange", + "AMBER": "Amber", + "GREEN": "Green", + "TEAL": "Teal", + "BLUE": "Blue", + "INDIGO": "Indigo", + "VIOLET": "Violet", + "PINK": "Pink" + } } } diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/helpCenter.json b/app/javascript/dashboard/i18n/locale/zh_TW/helpCenter.json index ca899905c..a310aac24 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/helpCenter.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/helpCenter.json @@ -533,6 +533,8 @@ "PUBLISHED": "已發佈", "ARCHIVED": "已封存" }, + "PENDING_EDITS": "Unpublished edits", + "PENDING_EDITS_TOOLTIP": "This published article has unpublished edits", "CATEGORY": { "UNCATEGORISED": "未分類" } @@ -552,6 +554,7 @@ "LOCALE": { "ALL": "所有語系" }, + "SEARCH_PLACEHOLDER": "搜尋文章...", "NEW_ARTICLE": "新增文章" }, "EMPTY_STATE": { @@ -579,6 +582,10 @@ "CATEGORY": { "TITLE": "此分類中沒有文章", "SUBTITLE": "此分類中的文章將顯示在此處" + }, + "SEARCH": { + "TITLE": "No matching articles", + "SUBTITLE": "We couldn't find any articles matching your search. Try a different term." } }, "BULK_TRANSLATE": { @@ -611,6 +618,8 @@ "DELETE": "刪除", "STATUS_SUCCESS": "Articles updated successfully", "STATUS_ERROR": "Failed to update articles", + "STATUS_SKIPPED": "1 article with unpublished edits was skipped — open it to publish or discard. | {count} articles with unpublished edits were skipped — open them to publish or discard.", + "STATUS_SKIPPED_ALL": "These articles have unpublished edits — open each to publish or discard.", "CATEGORY_SUCCESS": "Articles moved successfully", "CATEGORY_ERROR": "Failed to move articles", "DELETE_CONFIRM_TITLE": "Delete article | Delete {count} articles", @@ -624,6 +633,7 @@ "CATEGORY_HEADER": { "NEW_CATEGORY": "新增分類", "EDIT_CATEGORY": "編輯分類", + "SEARCH_PLACEHOLDER": "Search categories...", "CATEGORIES_COUNT": "{n} 個分類 | {n} 個分類", "BREADCRUMB": { "CATEGORY_LOCALE": "分類 ({localeCode})", @@ -634,6 +644,10 @@ "TITLE": "找不到分類", "SUBTITLE": "分類將顯示在此處。您可以點擊「新增分類」按鈕來新增分類。" }, + "SEARCH_EMPTY_STATE": { + "TITLE": "No matching categories", + "SUBTITLE": "We couldn't find any categories matching your search. Try a different term." + }, "CATEGORY_CARD": { "ARTICLES_COUNT": "{count} 篇文章 | {count} 篇文章" }, @@ -691,6 +705,11 @@ "LOCALES_PAGE": { "LOCALES_COUNT": "沒有可用的語系 | {n} 個語系 | {n} 個語系", "NEW_LOCALE_BUTTON_TEXT": "新增語系", + "SEARCH_PLACEHOLDER": "Search locales...", + "SEARCH_EMPTY_STATE": { + "TITLE": "No matching locales", + "SUBTITLE": "We couldn't find any locales matching your search. Try a different term." + }, "LOCALE_CARD": { "ARTICLES_COUNT": "{count} 篇文章 | {count} 篇文章", "CATEGORIES_COUNT": "{count} 個分類 | {count} 個分類", @@ -700,9 +719,51 @@ "MAKE_DEFAULT": "設為預設", "MOVE_TO_DRAFT": "移至草稿", "PUBLISH_LOCALE": "發佈語系", + "CUSTOMIZE_CONTENT": "Localize content", + "SELECT_POPULAR_CONTENT": "Select recommended content", "DELETE": "刪除" } }, + "POPULAR_CONTENT_DIALOG": { + "TITLE": "Recommended content", + "DESCRIPTION": "Pick up to 3 categories and 6 articles to feature on this locale's help center home page. Drag them into the order you want visitors to see.", + "SEARCH": "搜尋...", + "EMPTY": "No matching results", + "ADD_ANOTHER": "Add another...", + "SLOTS_LEFT": "{count} slots left", + "OVERRIDING_DEFAULTS": "Overriding defaults for this locale", + "CONFIRM": "Save recommendations", + "CATEGORIES": { + "LABEL": "Recommended categories", + "ARTICLES_COUNT": "No articles | {count} article | {count} articles" + }, + "ARTICLES": { + "LABEL": "Recommended articles", + "IN_CATEGORY": "in {category}", + "UNCATEGORIZED": "未分類" + }, + "API": { + "SUCCESS_MESSAGE": "Recommended content updated successfully", + "ERROR_MESSAGE": "Unable to update recommended content. Try again." + } + }, + "CONTENT_DIALOG": { + "TITLE": "Localize content", + "DESCRIPTION": "Set values specific to this locale. Anything left blank falls back to the default locale.", + "NAME": { + "LABEL": "名稱" + }, + "PAGE_TITLE": { + "LABEL": "頁面標題" + }, + "HEADER_TEXT": { + "LABEL": "標頭文字" + }, + "API": { + "SUCCESS_MESSAGE": "Locale content updated successfully", + "ERROR_MESSAGE": "Unable to update locale content. Try again." + } + }, "ADD_LOCALE_DIALOG": { "TITLE": "新增語系", "DESCRIPTION": "選擇此文章將使用的語言。這將新增到您的翻譯清單中,您可以稍後新增更多。", @@ -730,10 +791,30 @@ }, "PREVIEW": "預覽", "PUBLISH": "發佈", + "PUBLISH_CHANGES": "Publish changes", + "PUBLISH_CHANGES_SUCCESS": "Changes published successfully", + "PUBLISH_CHANGES_ERROR": "Could not publish changes", + "SAVE_IN_PROGRESS": "Still saving your latest changes — please try again in a moment.", + "DISCARD_CHANGES": "Discard changes", + "DISCARD_CHANGES_SUCCESS": "Changes discarded", + "DISCARD_CHANGES_ERROR": "Could not discard changes", + "PENDING_CHANGES": "Pending changes", + "VIEW_CHANGES": "View unpublished changes", "DRAFT": "草稿", "ARCHIVE": "封存", "BACK_TO_ARTICLES": "返回文章列表" }, + "PENDING_CHANGES_POPOVER": { + "TITLE": "Unpublished changes", + "DESCRIPTION": "This article has draft changes that aren't live yet. Apply them before changing the status, or discard them?", + "APPLY": "Apply changes", + "DISCARD": "Discard changes" + }, + "DIFF_DIALOG": { + "TITLE": "Unpublished changes", + "DESCRIPTION": "Compare your draft against the version that's currently live.", + "TITLE_LABEL": "標題" + }, "EDIT_ARTICLE": { "MORE_PROPERTIES": "更多屬性", "UNCATEGORIZED": "未分類", diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json index c21756e36..3b15ffd12 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json @@ -58,14 +58,17 @@ "ERROR_MESSAGE": "連結 Instagram 時發生錯誤,請重試", "ERROR_AUTH": "連結 Instagram 時發生錯誤,請重試", "NEW_INBOX_SUGGESTION": "此 Instagram 帳號先前連結至其他收件匣,現已遷移至此處。所有新訊息將顯示在此。舊收件匣將無法再為此帳號收發訊息。", - "DUPLICATE_INBOX_BANNER": "此 Instagram 帳號已遷移至新的 Instagram 頻道收件匣。您將無法再從此收件匣收發 Instagram 訊息。" + "DUPLICATE_INBOX_BANNER": "此 Instagram 帳號已遷移至新的 Instagram 頻道收件匣。您將無法再從此收件匣收發 Instagram 訊息。", + "SETTINGS_RESTRICTED_WARNING": "Instagram is currently restricted. Some messages or actions may be delayed or unavailable while we restore full support.", + "STATUS_LINK": "View status update" }, "TIKTOK": { "CONTINUE_WITH_TIKTOK": "繼續使用 TikTok", "CONNECT_YOUR_TIKTOK_PROFILE": "連結您的 TikTok 個人檔案", "HELP": "若要將您的 TikTok 個人檔案新增為頻道,請點擊「繼續使用 TikTok」來驗證您的 TikTok 個人檔案。", "ERROR_MESSAGE": "連結 TikTok 時發生錯誤,請重試", - "ERROR_AUTH": "連結 TikTok 時發生錯誤,請重試" + "ERROR_AUTH": "連結 TikTok 時發生錯誤,請重試", + "NORTH_AMERICA_WARNING": "TikTok connections for North American accounts are temporarily unavailable while we wait for an update from the TikTok team." }, "TWITTER": { "HELP": "若要將您的 Twitter 個人檔案新增為頻道,請點擊「使用 Twitter 登入」來驗證您的 Twitter 個人檔案。", @@ -653,6 +656,10 @@ }, "CREDENTIALS": { "DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections." + }, + "INBOUND": { + "LABEL": "Allow incoming calls", + "DESCRIPTION": "Let customers call this number. When turned off, incoming calls are declined automatically — agents aren't notified and no conversation is created. Agents can still place outgoing calls." } }, "WHATSAPP_CALLING": { @@ -810,6 +817,15 @@ "WHATSAPP_EMBEDDED_SIGNUP_SUBHEADER": "此收件匣透過 WhatsApp Embedded Signup 連接。", "WHATSAPP_EMBEDDED_SIGNUP_DESCRIPTION": "您可以重新設定此收件匣以更新 WhatsApp Business 設定。", "WHATSAPP_RECONFIGURE_BUTTON": "重新設定", + "WHATSAPP_MANUAL_TRANSFER_TITLE": "Switch to Manual Setup", + "WHATSAPP_MANUAL_TRANSFER_SUBHEADER": "This inbox was connected through WhatsApp embedded signup, which is no longer supported. Enter the WhatsApp Cloud API credentials from your own Meta app to switch this inbox to a manual setup. Configure the webhook in your Meta app using the verification token above before switching.", + "WHATSAPP_MANUAL_TRANSFER_PHONE_NUMBER_ID_LABEL": "Phone Number ID", + "WHATSAPP_MANUAL_TRANSFER_BUSINESS_ACCOUNT_ID_LABEL": "商業帳戶 ID", + "WHATSAPP_MANUAL_TRANSFER_API_KEY_LABEL": "API Key", + "WHATSAPP_MANUAL_TRANSFER_API_KEY_PLACEHOLDER": "Enter a permanent access token from your Meta app", + "WHATSAPP_MANUAL_TRANSFER_BUTTON": "Switch to Manual Setup", + "WHATSAPP_MANUAL_TRANSFER_SUCCESS": "Inbox switched to manual setup successfully.", + "WHATSAPP_MANUAL_TRANSFER_ERROR": "Could not switch to manual setup. Please verify the credentials and try again.", "WHATSAPP_CONNECT_TITLE": "連接到 WhatsApp Business", "WHATSAPP_CONNECT_SUBHEADER": "升級至 WhatsApp Embedded Signup 以便於管理。", "WHATSAPP_CONNECT_DESCRIPTION": "將此收件匣連接到 WhatsApp Business,以獲得進階功能和更便捷的管理。", @@ -827,6 +843,70 @@ "WHATSAPP_TEMPLATES_SYNC_SUBHEADER": "手動從 WhatsApp 同步訊息範本以更新可用範本。", "WHATSAPP_TEMPLATES_SYNC_BUTTON": "同步範本", "WHATSAPP_TEMPLATES_SYNC_SUCCESS": "範本同步已啟動。可能需要幾分鐘才能更新完成。", + "WHATSAPP_MANUAL_MIGRATION": { + "BANNER": { + "TITLE": "Manual setup recommended", + "DESCRIPTION": "This inbox connects through the shared Meta app used for embedded signup, which recent Meta restrictions have affected. To avoid similar issues in the future, we recommend reconnecting it with your own Meta app.", + "START": "Start manual migration", + "GUIDE": "View guide" + }, + "DIALOG": { + "EYEBROW": "WhatsApp manual migration", + "TITLE": "Reconnect WhatsApp inbox", + "CLOSE": "關閉", + "ACTION_REQUIRED_TITLE": "Reconnect with your own Meta app", + "ACTION_REQUIRED_DESCRIPTION": "Inboxes connected through your own Meta app are not affected by restrictions on the shared embedded signup app. This guided flow updates the WhatsApp API connection without creating a new inbox.", + "GUIDE_LINK": "Open the manual setup guide", + "PRESERVED_TITLE": "Preserved", + "PRESERVED_DESCRIPTION": "Conversations, contacts, collaborators, routing, business hours, and inbox settings.", + "UPDATED_TITLE": "Updated", + "UPDATED_DESCRIPTION": "WABA ID, phone number ID, access token, and webhook configuration.", + "WABA_ID": "WABA ID", + "WABA_PLACEHOLDER": "Enter WABA ID", + "WABA_HELP": "The WhatsApp Business Account that owns this phone number.", + "PHONE_NUMBER_ID": "Phone Number ID", + "PHONE_NUMBER_PLACEHOLDER": "Enter Phone Number ID", + "PHONE_NUMBER_HELP": "Meta's unique ID for the WhatsApp number connected to this inbox.", + "DISPLAY_PHONE_NUMBER": "顯示電話號碼", + "DISPLAY_PHONE_NUMBER_PLACEHOLDER": "Enter display phone number", + "DISPLAY_PHONE_NUMBER_HELP": "The customer-facing WhatsApp number. This cannot be changed during migration.", + "ACCESS_TOKEN": "Permanent access token or system user token", + "ACCESS_TOKEN_PLACEHOLDER": "Paste access token", + "TOKEN_HELP_PREFIX": "The token must include", + "TOKEN_HELP_MIDDLE": "新增", + "TOKEN_HELP_SUFFIX": "for template sync and template management.", + "MESSAGING_PERMISSION": "whatsapp_business_messaging.", + "MANAGEMENT_PERMISSION": "whatsapp_business_management", + "REVIEW_TITLE": "Review before reconnecting", + "INBOX": "收件匣", + "PHONE_NUMBER": "電話號碼", + "NOT_ENTERED": "Not entered", + "VERIFY_NOTICE": "Chatwoot will verify these credentials with Meta before applying any changes. If verification fails, the current configuration is left untouched.", + "BACK": "返回", + "CANCEL": "取消", + "CONTINUE": "繼續", + "REVIEW_MIGRATION": "Review migration", + "RECONNECT": "Reconnect WhatsApp inbox" + }, + "STEPS": { + "BEFORE_YOU_START": { + "TITLE": "Before you start", + "DESCRIPTION": "This reconnects the WhatsApp API details for this inbox. Conversations, collaborators, routing, business hours, CSAT, and bot settings will be preserved." + }, + "BUSINESS_DETAILS": { + "TITLE": "Business details", + "DESCRIPTION": "Enter the WhatsApp assets from the customer Meta Business account." + }, + "ACCESS_TOKEN": { + "TITLE": "Access token", + "DESCRIPTION": "Paste a permanent access token or system user token with WhatsApp permissions." + }, + "REVIEW_MIGRATION": { + "TITLE": "Review migration", + "DESCRIPTION": "Confirm the connection details before reconnecting this inbox. Chatwoot will verify the token, WABA, and phone number with Meta before applying changes." + } + } + }, "WHATSAPP_CALLING_ENABLED": { "LABEL": "Enable voice calling", "DESCRIPTION": "Allow agents to start and receive WhatsApp voice calls on this inbox. Available only on embedded-signup WhatsApp Cloud channels with calling permission granted by Meta." diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/index.js b/app/javascript/dashboard/i18n/locale/zh_TW/index.js index 7974e3385..965553a67 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/index.js +++ b/app/javascript/dashboard/i18n/locale/zh_TW/index.js @@ -33,6 +33,7 @@ import report from './report.json'; import resetPassword from './resetPassword.json'; import search from './search.json'; import setNewPassword from './setNewPassword.json'; +import sessionLimit from './sessionLimit.json'; import settings from './settings.json'; import signup from './signup.json'; import sla from './sla.json'; @@ -76,6 +77,7 @@ export default { ...resetPassword, ...search, ...setNewPassword, + ...sessionLimit, ...settings, ...signup, ...sla, diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json b/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json index ff9422d88..9141b1ca1 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json @@ -31,6 +31,13 @@ "WEBHOOK": { "SUBSCRIBED_EVENTS": "已訂閱的事件", "LEARN_MORE": "進一步瞭解 webhook", + "PAYWALL": { + "TITLE": "Webhooks are available on paid plans", + "AVAILABLE_ON": "Use webhooks to receive real-time events from your Chatwoot account.", + "UPGRADE_PROMPT": "Upgrade to the Startups, Business, or Enterprise plan to use webhooks.", + "UPGRADE_NOW": "立即升級", + "CANCEL_ANYTIME": "Change or cancel your plan anytime." + }, "SECRET": { "LABEL": "密鑰", "COPY": "複製密鑰至剪貼簿", @@ -392,6 +399,82 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "瞭解更多", + "OVERVIEW": { + "HEADER": "總覽", + "WELCOME": { + "LABEL": "Captain summary", + "LOADING": "Generating summary…" + }, + "INBOX_BANNER": { + "TEXT": "This assistant isn't connected to any inbox yet, so it won't respond to conversations.", + "ACTION": "Connect inbox", + "DISMISS": "關閉" + }, + "COVERAGE_BANNER": { + "TEXT": "{count} FAQs are pending review, keeping coverage at {coverage}%. Approve them so your assistant can resolve more on its own.", + "ACTION": "Review FAQs", + "DISMISS": "關閉" + }, + "RANGES": { + "LAST_DAYS": "Last {count} days", + "THIS_MONTH": "本月", + "LAST_MONTH": "上個月" + }, + "METRICS": { + "HANDLED": { + "LABEL": "Conversations handled", + "HINT": "Distinct conversations this assistant replied in." + }, + "AUTO_RESOLUTION": { + "LABEL": "Auto-resolution rate", + "HINT": "Share of handled conversations closed without a human reply." + }, + "HANDOFF": { + "LABEL": "Handoff rate", + "HINT": "Share of handled conversations escalated to a human agent." + }, + "HOURS_SAVED": { + "LABEL": "Time saved", + "HINT": "Estimate: Captain replies times ~2 minutes of assumed agent effort per reply. Directional, not measured labor." + }, + "REOPEN": { + "LABEL": "Reopen rate", + "HINT": "Auto-resolved conversations that were reopened afterwards." + }, + "DEPTH": { + "LABEL": "Messages / conversation", + "HINT": "Average replies the assistant sends per conversation." + } + }, + "DRILLDOWN": { + "CLOSE": "Close details", + "EMPTY": "No records found for this metric.", + "ERROR": "Could not load records. Please try again.", + "LOAD_MORE": "載入更多", + "RESULT_COUNT_CONVERSATION": "{count} conversation | {count} conversations" + }, + "KNOWLEDGE": { + "TITLE": "Knowledge coverage", + "COVERAGE": "{pct}% approved", + "APPROVED": "Approved FAQs", + "PENDING": "待審核的常見問答", + "DOCUMENTS": "文件" + }, + "LINKS": { + "DOCS": { + "TITLE": "Captain docs", + "DESCRIPTION": "Guides and how-tos for Captain" + }, + "PLAYGROUND": { + "TITLE": "Playground", + "DESCRIPTION": "Test this assistant's replies" + }, + "BILLING": { + "TITLE": "帳單", + "DESCRIPTION": "Manage credits and plan" + } + } + }, "ASSISTANT_SWITCHER": { "ASSISTANTS": "助理", "SWITCH_ASSISTANT": "切換助理", @@ -494,10 +577,6 @@ "PLACEHOLDER": "請輸入助理名稱", "ERROR": "名稱為必填" }, - "TEMPERATURE": { - "LABEL": "回應溫度", - "DESCRIPTION": "調整助理回應的創造性或限制性。較低的值會產生更聚焦且確定性的回應,而較高的值則允許更多創意和多樣化的輸出。" - }, "DESCRIPTION": { "LABEL": "描述", "PLACEHOLDER": "請輸入助理描述", @@ -739,6 +818,7 @@ "DOCUMENTS": { "HEADER": "文件", "ADD_NEW": "建立新文件", + "FAQ_COUNT": "{n} FAQ | {n} FAQs", "SELECTED": "已選擇 {count} 個", "SELECT_ALL": "全選({count})", "UNSELECT_ALL": "取消全選({count})", @@ -798,7 +878,27 @@ }, "RELATED_RESPONSES": { "TITLE": "相關常見問答", - "DESCRIPTION": "這些常見問答是直接從文件中生成的。" + "EMPTY": "No FAQs have been generated from this document yet." + }, + "DETAILS": { + "DESCRIPTION": "Review the crawled content and the FAQs generated from this source.", + "SOURCE": "Source", + "GENERATED_FAQS": "Generated FAQs", + "LAST_UPDATED": "Last updated", + "NOT_AVAILABLE": "不可用", + "CONTENT_TAB": "Crawled content", + "PDF_TAB": "PDF details", + "CONTENT_TITLE": "Crawled content", + "PDF_TITLE": "PDF file", + "PDF_DESCRIPTION": "Review the original PDF source.", + "CHARACTER_COUNT": "{count} characters extracted", + "COPY_CONTENT": "複製", + "COPY_SUCCESS": "Crawled content copied to clipboard", + "COPY_ERROR": "Could not copy crawled content", + "VIEW_RAW": "View raw", + "VIEW_PREVIEW": "View preview", + "UNREADABLE_CONTENT": "Readable content could not be extracted from this document. You can view the raw extracted content.", + "EMPTY_CONTENT": "No crawled content is available for this document yet." }, "FORM_DESCRIPTION": "請輸入文件的 URL 將其新增為知識來源,並選擇要關聯的助理。", "CREATE": { @@ -838,7 +938,7 @@ "ERROR_MESSAGE": "刪除文件時發生錯誤,請重試。" }, "OPTIONS": { - "VIEW_RELATED_RESPONSES": "檢視相關回應", + "VIEW_DETAILS": "查看詳細資訊", "SYNC_NOW": "Refresh now", "RETRY_SYNC": "Retry refresh", "DELETE_DOCUMENT": "刪除文件" diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/onboarding.json b/app/javascript/dashboard/i18n/locale/zh_TW/onboarding.json index db6b89923..818540d23 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/onboarding.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/onboarding.json @@ -30,5 +30,59 @@ "VALIDATION_ERROR": "Please fill in all required fields", "SUCCESS": "Details saved successfully", "ERROR": "Could not save details. Please try again." + }, + "ONBOARDING_INBOX_SETUP": { + "GREETING": "Let's set up a few things", + "SUBTITLE": "This will give you head-start in your workspace", + "CONTINUE": "繼續", + "SKIP": "略過", + "ERROR": "發生錯誤,請重試.", + "WHATSAPP_CONNECTED": "WhatsApp connected successfully", + "FACEBOOK_CONNECTED": "Facebook connected successfully", + "CREATED_FOR_YOU": { + "TITLE": "We've created the following for you", + "LIVE_CHAT": "Live Chat widget", + "LIVE_CHAT_DESCRIPTION": "Instant messenger for your website", + "LIVE_CHAT_STATUS": "Almost done…", + "LIVE_CHAT_READY": "已就緒", + "HELP_CENTER": "幫助中心", + "HELP_CENTER_DESCRIPTION": "Your digital encyclopedia", + "HELP_CENTER_GENERATING": "Creating your help center…", + "HELP_CENTER_ANALYZING_WEBSITE": "Analyzing your website…", + "HELP_CENTER_SETTING_UP_CATEGORIES": "Setting up categories…", + "HELP_CENTER_CURATING_ARTICLES": "Curating articles…", + "HELP_CENTER_ARTICLES": "Created {count} article | Created {count} articles", + "HELP_CENTER_CATEGORIES": "{count} 個分類 | {count} 個分類", + "HELP_CENTER_SUMMARY": "Created {count} article across {categories} | Created {count} articles across {categories}" + }, + "CHANNELS": { + "TITLE": "Connect all your conversation channels", + "HEADER": "We found a few channels you can connect", + "CONNECT": "連接", + "CONNECTED": "Connected", + "MORE_CHANNELS_NOTE": "Set up {email} and {voice} channels later inside the app", + "MORE_CHANNELS_EMAIL": "電子郵件", + "MORE_CHANNELS_VOICE": "語音", + "VIEW_ALL": "查看全部", + "GMAIL": "Gmail", + "OUTLOOK": "Outlook", + "OTHER_EMAIL": "Other Email Providers" + }, + "CHANNELS_DIALOG": { + "TITLE": "Connect all your channels instantly", + "SUBTITLE": "Manage all of them from one dashboard. You can also set up and edit inboxes later inside the app.", + "NOTE": "SMS, API, Voice, and other email providers can be set up later from your dashboard.", + "CONNECT_TITLE": "Connect your {name} account", + "CONNECT_SUBTITLE": "Fill out these quick details", + "CONNECT": "連接", + "BACK": "返回", + "SETUP_LATER": "Setup later in app", + "FACEBOOK_SUBTITLE": "Authorize access and choose a Page to connect.", + "FACEBOOK_LAUNCH": "Continue with Facebook", + "FACEBOOK_SELECT_PAGE": "Select a Page to connect", + "FACEBOOK_LOADING": "Loading your Facebook Pages…", + "FACEBOOK_NO_PAGES": "No connectable Pages found. All your Pages are already connected.", + "FACEBOOK_ERROR": "Couldn't connect to Facebook. Please try again." + } } } diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/report.json b/app/javascript/dashboard/i18n/locale/zh_TW/report.json index 3cece1b9b..1e0eaa719 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/report.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/report.json @@ -121,6 +121,26 @@ "CLEAR_FILTER": "清除篩選條件", "EMPTY_LIST": "查無結果" }, + "DRILLDOWN": { + "TITLE": "{metric} details", + "RESULT_COUNT_CONVERSATION": "{count} conversation | {count} conversations", + "RESULT_COUNT_MESSAGE": "{count} message | {count} messages", + "EMPTY": "No records found for this bar.", + "ERROR": "Could not load records. Please try again.", + "ADMIN_ONLY": "Only administrators can drill down into report records.", + "LOAD_MORE": "載入更多", + "CLOSE": "Close details", + "PREVIOUS_BUCKET": "Previous bar", + "NEXT_BUCKET": "Next bar", + "UNKNOWN_CONTACT": "Unknown contact", + "UNKNOWN_INBOX": "Unknown inbox", + "UNASSIGNED_AGENT": "未指派", + "NO_MESSAGE_CONTENT": "No message content", + "MESSAGE_CREATED_AT": "Message created at {time}", + "EVENT_OCCURRED_AT": "Event occurred at {time}", + "INCOMING_MESSAGE": "Incoming message", + "OUTGOING_MESSAGE": "Outgoing message" + }, "PAGINATION": { "RESULTS": "顯示第 {start} 至 {end} 筆,共 {total} 筆結果", "PER_PAGE_TEMPLATE": "{size} / 頁" diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/sessionLimit.json b/app/javascript/dashboard/i18n/locale/zh_TW/sessionLimit.json new file mode 100644 index 000000000..926745c23 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/zh_TW/sessionLimit.json @@ -0,0 +1,12 @@ +{ + "SESSION_LIMIT": { + "TITLE": "Active session limit reached", + "DESCRIPTION": "You have reached your limit of active sessions. Please end a session before logging in.", + "END": "End", + "END_ALL": "End all sessions", + "LOG_IN": "Log in", + "CANCEL": "Back to login", + "UNKNOWN_DEVICE": "Unknown device", + "STARTED": "Started" + } +} diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/settings.json b/app/javascript/dashboard/i18n/locale/zh_TW/settings.json index dcf3ed6a3..0e05bc352 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/settings.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/settings.json @@ -86,9 +86,21 @@ "NOTE": "管理您帳戶的額外安全功能。", "MFA_BUTTON": "管理雙因素驗證" }, + "SESSIONS_SECTION": { + "TITLE": "Active Sessions", + "NOTE": "These are the devices currently logged in to your account.", + "CURRENT": "Current session", + "REVOKE": "Revoke", + "REVOKE_SUCCESS": "Session revoked successfully", + "REVOKE_ERROR": "Unable to revoke session. Please try again.", + "FETCH_ERROR": "Unable to fetch sessions. Please try again.", + "LAST_ACTIVE": "Last active", + "UNKNOWN_DEVICE": "Unknown device" + }, "ACCESS_TOKEN": { "TITLE": "存取 Token", "NOTE": "若您正在建立基於 API 的整合,可以使用此 token", + "PAID_PLAN_NOTE": "API access tokens are available on paid plans.", "COPY": "複製", "RESET": "重設", "CONFIRM_RESET": "確定要重設嗎?", @@ -313,6 +325,7 @@ "ALL_COMPANIES": "所有公司", "CAPTAIN": "Captain", "CAPTAIN_ASSISTANTS": "助理", + "CAPTAIN_OVERVIEW": "總覽", "CAPTAIN_DOCUMENTS": "文件", "CAPTAIN_RESPONSES": "常見問答", "CAPTAIN_TOOLS": "工具", @@ -328,6 +341,7 @@ "NOTIFICATIONS": "通知", "CANNED_RESPONSES": "預設回覆", "INTEGRATIONS": "整合", + "DATA": "Data", "PROFILE_SETTINGS": "個人資料設定", "ACCOUNT_SETTINGS": "帳戶設定", "APPLICATIONS": "應用程式", @@ -379,11 +393,124 @@ "INFO_TEXT": "當您未使用應用程式或儀表板時,讓系統自動將您標記為離線。", "INFO_SHORT": "當您未使用應用程式時自動標記為離線。" }, + "SORT_TOOLTIP": "排序", + "SORT_BY": "排序方式", + "SORT_GROUPS": { + "CREATED": "Sort by date of creation", + "ALPHABETICAL": "Sort in alphabetical order", + "UNREAD_COUNT": "Sort by unread count" + }, + "SORT_OPTIONS": { + "CREATED_DESC": "Newest first", + "CREATED_ASC": "Oldest first", + "ALPHABETICAL_ASC": "Ascending (A - Z)", + "ALPHABETICAL_DESC": "Descending (Z - A)", + "UNREAD_COUNT_DESC": "Highest first", + "UNREAD_COUNT_ASC": "Lowest first" + }, "DOCS": "閱讀文件", "SECURITY": "安全性", "CAPTAIN_AI": "Captain", "CONVERSATION_WORKFLOW": "對話工作流程" }, + "DATA_IMPORTS": { + "HEADER": "Data", + "DESCRIPTION": "Bring your existing contacts and past conversations into this account from another support tool. Each import runs in the background, so you can keep working while it finishes, track its progress, and review anything that was skipped along the way.", + "LOADING": "Fetching imports", + "DEFAULT_IMPORT_NAME": "Intercom import", + "TABS": { + "IMPORT": "匯入", + "EXPORT": "匯出" + }, + "TYPES": { + "CONTACTS": "聯絡人", + "CONVERSATIONS": "對話", + "MESSAGES": "訊息" + }, + "DRAWER": { + "TITLE": "New import", + "SOURCE": "Source", + "NAME": "Import name", + "NAME_PLACEHOLDER": "July Intercom migration", + "ACCESS_KEY": "Intercom access key", + "ACCESS_KEY_PLACEHOLDER": "Paste your Intercom access key", + "DATA_TYPES": "Data to import", + "VALIDATING": "Validating access key...", + "VALID_KEY": "Access key validated.", + "INVALID_KEY": "Could not validate this access key.", + "ACTIVE_IMPORT": "Wait for the active import to finish before starting another one.", + "CANCEL": "取消", + "IMPORT": "匯入" + }, + "EXPORT": { + "TITLE": "Exports are on the way", + "DESCRIPTION": "Export your contacts and conversations out of this account. This workflow is coming soon.", + "COMING_SOON": "即將推出" + }, + "TABLE": { + "TITLE": "Recent imports", + "EMPTY": "No imports yet", + "EMPTY_DESCRIPTION": "Start an import to bring your existing customer history into this account.", + "NEW_IMPORT": "匯入", + "COUNT": "{count} imports", + "UNNAMED": "Untitled import", + "IMPORTED_COUNT": "{count} imported", + "VIEW": "View import", + "NAME": "名稱", + "TYPE": "類型", + "STATUS": "狀態", + "IMPORTED": "Imported", + "CREATED": "建立時間", + "ABANDON": "Abandon" + }, + "DETAIL": { + "BACK": "Back to imports", + "ERRORS": "Errors", + "SKIP_LOGS": "Skip logs", + "SOURCE": "Source", + "IMPORT_TYPES": "Import types", + "CREATED": "建立時間", + "DURATION": "期間", + "INITIATED_BY": "Started by", + "PROGRESS": "Import progress", + "PROGRESS_WITH_TOTAL": "{imported} of {total} imported", + "PROGRESS_WITHOUT_TOTAL": "{imported} imported", + "PROGRESS_OF_TOTAL": "of {total} imported", + "PROGRESS_IMPORTED": "imported", + "LAST_UPDATED_TOOLTIP": "Last updated {time}", + "NO_SKIP_LOGS": "No skipped or failed records recorded.", + "DOWNLOAD_SKIP_LOGS": "Download CSV", + "DOWNLOAD_ERROR_LOGS": "Download CSV", + "ALL_SKIP_LOGS": "全部", + "KIND": "Kind", + "NO_ERRORS": "No errors recorded.", + "ERROR_CODE": "Code", + "SOURCE_OBJECT": "Source object", + "MESSAGE": "訊息" + }, + "MONITOR": { + "LIVE": "Live updates every {seconds}s", + "LAST_UPDATED": "Last updated {time}", + "REFRESH": "重新整理", + "REFRESHING": "Refreshing", + "STAGES": { + "unknown": "Waiting for update", + "queued": "Queued", + "contacts": "Importing contacts", + "conversations": "Importing conversations", + "finalizing": "Finalizing import", + "completed": "已完成", + "completed_with_errors": "Completed with errors", + "failed": "失敗", + "abandoned": "Abandoned" + } + }, + "ALERTS": { + "IMPORT_STARTED": "Intercom import has started.", + "IMPORT_ABANDONED": "Intercom import has been abandoned.", + "IMPORT_FAILED": "Could not start the Intercom import." + } + }, "CAPTAIN_SETTINGS": { "TITLE": "Captain 設定", "DESCRIPTION": "設定 Captain 的 AI 模型和功能。Captain 採用點數計費制,您將根據所選模型為 Captain 執行的每項操作支付點數。", @@ -414,7 +541,9 @@ "DESCRIPTION": "啟用或停用 AI 驅動的功能。", "AUDIO_TRANSCRIPTION": { "TITLE": "語音轉文字", - "DESCRIPTION": "自動將語音訊息和通話錄音轉換為可搜尋的文字記錄。" + "DESCRIPTION": "自動將語音訊息和通話錄音轉換為可搜尋的文字記錄。", + "MODEL_TITLE": "Audio Transcription Model", + "MODEL_DESCRIPTION": "Select the AI model to use for converting audio messages into text transcripts" }, "HELP_CENTER_SEARCH": { "TITLE": "幫助中心搜尋索引", @@ -439,7 +568,18 @@ "TITLE": "目前方案", "PLAN_NOTE": "您目前訂閱的是 **{plan}** 方案,擁有 **{quantity}** 個授權", "SEAT_COUNT": "席位數量", - "RENEWS_ON": "續約日期" + "RENEWS_ON": "續約日期", + "CURRENCY": "Currency" + }, + "CURRENCY": { + "SELECT": { + "TITLE": "Choose your billing currency", + "DESCRIPTION": "Select the currency you'd like to be billed in. This can't be changed once your subscription is created." + }, + "OPTIONS": { + "USD": "US Dollar (USD)", + "BRL": "Brazilian Real (BRL)" + } }, "VIEW_PRICING": "查看定價", "MANAGE_SUBSCRIPTION": { @@ -475,6 +615,7 @@ "PURCHASE": "購買點數", "LOADING": "正在載入選項...", "FETCH_ERROR": "無法載入點數選項,請再試一次。", + "RETRY": "Retry", "PURCHASE_ERROR": "購買處理失敗,請再試一次。", "PURCHASE_SUCCESS": "已成功將 {credits} 點數加入您的帳戶", "CONFIRM": { @@ -776,6 +917,10 @@ "INPUT_MAX": "最大指派數", "DURATION": "每位客服人員在每段時間內的對話數" }, + "EXCLUDE_OLDER_THAN": { + "LABEL": "Skip stale conversations", + "DESCRIPTION": "Skip unassigned conversations older than this. Defaults to 7 days; clear to disable." + }, "INBOXES": { "LABEL": "已加入的收件匣", "DESCRIPTION": "新增適用此政策的收件匣。", diff --git a/app/javascript/dashboard/routes/dashboard/calls/pages/CallsIndex.vue b/app/javascript/dashboard/routes/dashboard/calls/pages/CallsIndex.vue new file mode 100644 index 000000000..553cbceac --- /dev/null +++ b/app/javascript/dashboard/routes/dashboard/calls/pages/CallsIndex.vue @@ -0,0 +1,176 @@ + + + +