diff --git a/app/views/public/api/v1/portals/documentation_layout/_topbar.html.erb b/app/views/public/api/v1/portals/documentation_layout/_topbar.html.erb
index 2b2f56547..46d6f3558 100644
--- a/app/views/public/api/v1/portals/documentation_layout/_topbar.html.erb
+++ b/app/views/public/api/v1/portals/documentation_layout/_topbar.html.erb
@@ -55,7 +55,7 @@
<% portal.public_locale_codes.each do |code| %>
<% is_current = code == locale %>
<%= code %>
<%= language_name(code) %>
diff --git a/app/views/public/api/v1/portals/search/_form.html.erb b/app/views/public/api/v1/portals/search/_form.html.erb
new file mode 100644
index 000000000..5ef0b1f9c
--- /dev/null
+++ b/app/views/public/api/v1/portals/search/_form.html.erb
@@ -0,0 +1,20 @@
+<%# locals: (input_class:) %>
+
diff --git a/app/views/public/api/v1/portals/search/_search_handler.html.erb b/app/views/public/api/v1/portals/search/_search_handler.html.erb
new file mode 100644
index 000000000..293e3459b
--- /dev/null
+++ b/app/views/public/api/v1/portals/search/_search_handler.html.erb
@@ -0,0 +1,33 @@
+
diff --git a/app/views/public/api/v1/portals/search/index.html+documentation.erb b/app/views/public/api/v1/portals/search/index.html+documentation.erb
new file mode 100644
index 000000000..8577a5f4e
--- /dev/null
+++ b/app/views/public/api/v1/portals/search/index.html+documentation.erb
@@ -0,0 +1,64 @@
+<% content_for :head do %>
+ <%= I18n.t('public_portal.search.results_for', query: @query) %> | <%= @portal.name %>
+<% end %>
+
+
+ <% pagination_params = params.permit(:query, :locale, :theme, :show_plain_layout) %>
+
+
+
+
+
+ <%= I18n.t('public_portal.search.results_for', query: @query) %>
+
+ <%= render 'public/api/v1/portals/search/form',
+ input_class: 'w-full px-4 py-3 border border-n-weak rounded-lg bg-n-alpha-1 text-n-slate-12 placeholder-n-slate-10 focus:outline-none focus:ring-2 focus:ring-n-portal focus:border-transparent' %>
+
+
+ <%= render 'public/api/v1/portals/search/search_handler' %>
+
+ <% if @articles.empty? %>
+ <%= render 'public/api/v1/portals/documentation_layout/empty_state',
+ message: I18n.t('public_portal.search.no_results', query: @query) %>
+ <% else %>
+
+ <%= I18n.t('public_portal.search.found_results', count: @articles.total_count) %>
+
+
+
+ <% @articles.each do |article| %>
+ <%= render 'public/api/v1/portals/documentation_layout/article_card',
+ portal: @portal,
+ article: article %>
+ <% end %>
+
+
+ <% if @articles.respond_to?(:total_pages) && @articles.total_pages > 1 %>
+
+ <% end %>
+ <% end %>
+
diff --git a/app/views/public/api/v1/portals/search/index.html.erb b/app/views/public/api/v1/portals/search/index.html.erb
new file mode 100644
index 000000000..82c29775f
--- /dev/null
+++ b/app/views/public/api/v1/portals/search/index.html.erb
@@ -0,0 +1,118 @@
+<% content_for :head do %>
+ <%= I18n.t('public_portal.search.results_for', query: @query) %> | <%= @portal.name %>
+<% end %>
+
+<% search_input_class = 'w-full px-4 py-3 border border-slate-200 dark:border-slate-700 rounded-lg bg-white dark:bg-slate-800 text-slate-900 dark:text-slate-100 placeholder-slate-500 dark:placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent' %>
+
+<% if !@is_plain_layout_enabled %>
+
+
+
+
+
+
+ <%= I18n.t('public_portal.search.results_for', query: @query) %>
+
+
+ <%= render 'public/api/v1/portals/search/form', input_class: search_input_class %>
+
+
+
+<% else %>
+
+
+
+
+ <%= I18n.t('public_portal.search.results_for', query: @query) %>
+
+
+ <%= render 'public/api/v1/portals/search/form', input_class: search_input_class %>
+
+<% end %>
+
+<% pagination_params = params.permit(:query, :locale, :theme, :show_plain_layout) %>
+
+<%= render 'public/api/v1/portals/search/search_handler' %>
+
+
+
+ <% if @articles.empty? %>
+
+
<%= I18n.t('public_portal.search.no_results', query: @query) %>
+
+ <% else %>
+
+ <%= I18n.t('public_portal.search.found_results', count: @articles.total_count) %>
+
+
+ <% @articles.each do |article| %>
+
+ <% end %>
+
+ <% if @articles.respond_to?(:total_pages) && @articles.total_pages > 1 %>
+
+ <% end %>
+ <% end %>
+
+
diff --git a/config/locales/en.yml b/config/locales/en.yml
index ed52f27d8..b6b336f45 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -427,6 +427,13 @@ en:
empty_placeholder: No results found.
loading_placeholder: Searching...
results_title: Search results
+ results: Search Results
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ other: 'Found %{count} results'
+ submit: Search
toc_header: 'On this page'
sidebar:
help_center: Help Center
@@ -458,6 +465,8 @@ en:
others: others
by: By
no_articles: There are no articles here
+ previous: Previous
+ next: Next
article_actions:
label: Open in
view_markdown: View as Markdown
diff --git a/config/routes.rb b/config/routes.rb
index 15c471891..351808744 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -590,6 +590,7 @@ Rails.application.routes.draw do
get 'hc/:slug', to: 'public/api/v1/portals#show'
get 'hc/:slug/sitemap.xml', to: 'public/api/v1/portals#sitemap'
get 'hc/:slug/:locale', to: 'public/api/v1/portals#show', as: :public_portal_locale
+ get 'hc/:slug/:locale/search', to: 'public/api/v1/portals/search#index', as: :portal_search
get 'hc/:slug/:locale/articles', to: 'public/api/v1/portals/articles#index'
get 'hc/:slug/:locale/categories', to: 'public/api/v1/portals/categories#index'
get 'hc/:slug/:locale/categories/:category_slug', to: 'public/api/v1/portals/categories#show', as: :public_portal_category
diff --git a/enterprise/app/controllers/enterprise/public/api/v1/portals/search_controller.rb b/enterprise/app/controllers/enterprise/public/api/v1/portals/search_controller.rb
new file mode 100644
index 000000000..2bb4164fb
--- /dev/null
+++ b/enterprise/app/controllers/enterprise/public/api/v1/portals/search_controller.rb
@@ -0,0 +1,9 @@
+module Enterprise::Public::Api::V1::Portals::SearchController
+ private
+
+ def search_articles
+ return super if @query.blank? || !@portal.account.feature_enabled?('help_center_embedding_search')
+
+ @articles = @articles.vector_search(search_params.merge(account_id: @portal.account_id, limit: nil))
+ end
+end
diff --git a/enterprise/app/models/enterprise/concerns/article.rb b/enterprise/app/models/enterprise/concerns/article.rb
index 4527bfdf6..9482313fd 100644
--- a/enterprise/app/models/enterprise/concerns/article.rb
+++ b/enterprise/app/models/enterprise/concerns/article.rb
@@ -26,13 +26,15 @@ module Enterprise::Concerns::Article
# if using add the filter block to the below query
# .filter { |ae| ae.neighbor_distance <= distance_threshold }
- article_ids = ArticleEmbedding.where(article_id: filtered_article_ids)
- .nearest_neighbors(:embedding, embedding, distance: 'cosine')
- .limit(5)
- .pluck(:article_id)
+ limit = params.key?(:limit) ? params[:limit] : 5
+
+ article_embeddings = ArticleEmbedding.where(article_id: filtered_article_ids)
+ .nearest_neighbors(:embedding, embedding, distance: 'cosine')
+ article_embeddings = article_embeddings.limit(limit) if limit.present?
+ article_ids = article_embeddings.pluck(:article_id)
# Fetch the articles by the IDs obtained from the nearest neighbors search
- where(id: article_ids)
+ where(id: article_ids).in_order_of(:id, article_ids)
end
end
diff --git a/package.json b/package.json
index 8b96ba379..bc49c59dc 100644
--- a/package.json
+++ b/package.json
@@ -40,6 +40,7 @@
"@formkit/vue": "^1.7.2",
"@hcaptcha/vue3-hcaptcha": "^1.3.0",
"@highlightjs/vue-plugin": "^2.1.0",
+ "@hotwired/turbo-rails": "^8.0.13",
"@iconify-json/fluent": "^1.2.32",
"@iconify-json/material-symbols": "^1.2.10",
"@lk77/vue3-color": "^3.0.6",
@@ -92,7 +93,6 @@
"snakecase-keys": "^8.0.1",
"timezone-phone-codes": "^0.0.2",
"tinykeys": "^3.0.0",
- "turbolinks": "^5.2.0",
"urlpattern-polyfill": "^10.0.0",
"video.js": "7.21.1",
"videojs-record": "4.5.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 3a9efa7eb..a4b3044fe 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -43,6 +43,9 @@ importers:
'@highlightjs/vue-plugin':
specifier: ^2.1.0
version: 2.1.0(highlight.js@11.10.0)(vue@3.5.12(typescript@5.6.2))
+ '@hotwired/turbo-rails':
+ specifier: ^8.0.13
+ version: 8.0.13
'@iconify-json/fluent':
specifier: ^1.2.32
version: 1.2.36
@@ -199,9 +202,6 @@ importers:
tinykeys:
specifier: ^3.0.0
version: 3.0.0
- turbolinks:
- specifier: ^5.2.0
- version: 5.2.0
urlpattern-polyfill:
specifier: ^10.0.0
version: 10.0.0
@@ -942,6 +942,13 @@ packages:
'@histoire/vendors@0.17.17':
resolution: {integrity: sha512-QZvmffdoJlLuYftPIkOU5Q2FPAdG2JjMuQ5jF7NmEl0n1XnmbMqtRkdYTZ4eF6CO1KLZ0Zyf6gBQvoT1uWNcjA==}
+ '@hotwired/turbo-rails@8.0.13':
+ resolution: {integrity: sha512-6SCnnOSzhtaJ0pNkAjncZxjtKsK3sP/vPEkCnTXBXSHkr+vF7DTZkOlwjhms1DbbQNTsjCsBoKvzSMbh/omSCQ==}
+
+ '@hotwired/turbo@8.0.13':
+ resolution: {integrity: sha512-M7qXUqcGab6G5PKOiwhgbByTtrPgKPFCTMNQ52QhzUEXEqmp0/ApEguUesh/FPiUjrmFec+3lq98KsWnYY2C7g==}
+ engines: {node: '>= 14'}
+
'@humanwhocodes/config-array@0.11.14':
resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==}
engines: {node: '>=10.10.0'}
@@ -1118,6 +1125,9 @@ packages:
'@rails/actioncable@6.1.3':
resolution: {integrity: sha512-m02524MR9cTnUNfGz39Lkx9jVvuL0tle4O7YgvouJ7H83FILxzG1nQ5jw8pAjLAr9XQGu+P1sY4SKE3zyhCNjw==}
+ '@rails/actioncable@7.2.201':
+ resolution: {integrity: sha512-wsTdWoZ5EfG5k3t7ORdyQF0ZmDEgN4aVPCanHAiNEwCROqibSZMXXmCbH7IDJUVri4FOeAVwwbPINI7HVHPKBw==}
+
'@rails/ujs@7.1.400':
resolution: {integrity: sha512-YwvXm3BR5tn+VCAKYGycLejMRVZE3Ionj5gFjEeGXCZnI0Rpi+7dKpmyu90kdUY7dRUFpHTdu9zZceEzFLl38w==}
@@ -4368,9 +4378,6 @@ packages:
tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
- turbolinks@5.2.0:
- resolution: {integrity: sha512-pMiez3tyBo6uRHFNNZoYMmrES/IaGgMhQQM+VFF36keryjb5ms0XkVpmKHkfW/4Vy96qiGW3K9bz0tF5sK9bBw==}
-
type-check@0.4.0:
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
engines: {node: '>= 0.8.0'}
@@ -5493,6 +5500,13 @@ snapshots:
'@histoire/vendors@0.17.17': {}
+ '@hotwired/turbo-rails@8.0.13':
+ dependencies:
+ '@hotwired/turbo': 8.0.13
+ '@rails/actioncable': 7.2.201
+
+ '@hotwired/turbo@8.0.13': {}
+
'@humanwhocodes/config-array@0.11.14':
dependencies:
'@humanwhocodes/object-schema': 2.0.3
@@ -5704,6 +5718,8 @@ snapshots:
'@rails/actioncable@6.1.3': {}
+ '@rails/actioncable@7.2.201': {}
+
'@rails/ujs@7.1.400': {}
'@rollup/plugin-yaml@4.1.2(rollup@4.59.0)':
@@ -9373,8 +9389,6 @@ snapshots:
tslib@2.8.1: {}
- turbolinks@5.2.0: {}
-
type-check@0.4.0:
dependencies:
prelude-ls: 1.2.1
diff --git a/spec/helpers/portal_helper_spec.rb b/spec/helpers/portal_helper_spec.rb
index d55c83be7..993399e74 100644
--- a/spec/helpers/portal_helper_spec.rb
+++ b/spec/helpers/portal_helper_spec.rb
@@ -140,7 +140,7 @@ describe PortalHelper do
context 'when theme is not present' do
it 'returns the correct link' do
expect(helper.generate_home_link('portal_slug', 'en', nil, true)).to eq(
- '/hc/portal_slug/en'
+ '/hc/portal_slug/en?show_plain_layout=true'
)
end
end
@@ -148,7 +148,7 @@ describe PortalHelper do
context 'when theme is present and plain layout is enabled' do
it 'returns the correct link' do
expect(helper.generate_home_link('portal_slug', 'en', 'dark', true)).to eq(
- '/hc/portal_slug/en?theme=dark'
+ '/hc/portal_slug/en?show_plain_layout=true&theme=dark'
)
end
end
@@ -172,7 +172,7 @@ describe PortalHelper do
theme: nil,
is_plain_layout_enabled: true
)).to eq(
- '/hc/portal_slug/en/categories/category_slug'
+ '/hc/portal_slug/en/categories/category_slug?show_plain_layout=true'
)
end
end
@@ -186,7 +186,7 @@ describe PortalHelper do
theme: 'dark',
is_plain_layout_enabled: true
)).to eq(
- '/hc/portal_slug/en/categories/category_slug?theme=dark'
+ '/hc/portal_slug/en/categories/category_slug?show_plain_layout=true&theme=dark'
)
end
end
@@ -210,7 +210,7 @@ describe PortalHelper do
context 'when theme is not present' do
it 'returns the correct link' do
expect(helper.generate_article_link('portal_slug', 'article_slug', nil, true)).to eq(
- '/hc/portal_slug/articles/article_slug'
+ '/hc/portal_slug/articles/article_slug?show_plain_layout=true'
)
end
end
@@ -218,7 +218,7 @@ describe PortalHelper do
context 'when theme is present and plain layout is enabled' do
it 'returns the correct link' do
expect(helper.generate_article_link('portal_slug', 'article_slug', 'dark', true)).to eq(
- '/hc/portal_slug/articles/article_slug?theme=dark'
+ '/hc/portal_slug/articles/article_slug?show_plain_layout=true&theme=dark'
)
end
end
diff --git a/spec/models/article_spec.rb b/spec/models/article_spec.rb
index 5741b95f0..04466ccd1 100644
--- a/spec/models/article_spec.rb
+++ b/spec/models/article_spec.rb
@@ -20,6 +20,15 @@ RSpec.describe Article do
expect(article).not_to be_valid
expect(article.errors[:content]).to include("can't be blank")
end
+
+ it 'rejects reserved slugs that collide with help center routes' do
+ Article::RESERVED_SLUGS.each do |reserved_slug|
+ article = build(:article, portal_id: portal_1.id, author_id: user.id, category_id: category_1.id,
+ title: reserved_slug, slug: reserved_slug, content: 'content')
+ expect(article).not_to be_valid
+ expect(article.errors[:slug]).to include('is reserved')
+ end
+ end
end
describe 'associations' do
From 95cb3a7ad85396a0fd7c5dff0338963f94cc0d95 Mon Sep 17 00:00:00 2001
From: Shivam Mishra
Date: Tue, 2 Jun 2026 15:28:08 +0530
Subject: [PATCH 15/34] feat(onboarding): honor return_to hint in Instagram
OAuth callback (#14568)
When connecting an Instagram inbox during onboarding, the OAuth flow
used to drop users in inbox settings, breaking onboarding. The OAuth
start endpoint now accepts an optional `return_to=onboarding` hint,
carried tamper-proof inside the signed state (a claim on the Instagram
JWT), and the callback uses it to return the user to the onboarding
inbox-setup screen. Without the hint, behavior is unchanged.
This is the backend half only; the frontend that sends
`return_to=onboarding` ships separately.
Co-authored-by: Muhsin Keloth
---
.../instagram/authorizations_controller.rb | 2 +-
.../instagram/callbacks_controller.rb | 6 +++++
app/helpers/instagram/integration_helper.rb | 25 ++++++++++++-------
3 files changed, 23 insertions(+), 10 deletions(-)
diff --git a/app/controllers/api/v1/accounts/instagram/authorizations_controller.rb b/app/controllers/api/v1/accounts/instagram/authorizations_controller.rb
index 053c29731..116a31e85 100644
--- a/app/controllers/api/v1/accounts/instagram/authorizations_controller.rb
+++ b/app/controllers/api/v1/accounts/instagram/authorizations_controller.rb
@@ -11,7 +11,7 @@ class Api::V1::Accounts::Instagram::AuthorizationsController < Api::V1::Accounts
enable_fb_login: '0',
force_authentication: '1',
response_type: 'code',
- state: generate_instagram_token(Current.account.id)
+ state: generate_instagram_token(Current.account.id, params[:return_to])
}
)
if redirect_url
diff --git a/app/controllers/instagram/callbacks_controller.rb b/app/controllers/instagram/callbacks_controller.rb
index 4dc8ece1c..cd317363c 100644
--- a/app/controllers/instagram/callbacks_controller.rb
+++ b/app/controllers/instagram/callbacks_controller.rb
@@ -28,6 +28,8 @@ class Instagram::CallbacksController < ApplicationController
@long_lived_token_response = exchange_for_long_lived_token(@response.token)
inbox, already_exists = find_or_create_inbox
+ return redirect_to app_onboarding_inbox_setup_url(account_id: account_id) if return_to == 'onboarding'
+
if already_exists
redirect_to app_instagram_inbox_settings_url(account_id: account_id, inbox_id: inbox.id)
else
@@ -149,6 +151,10 @@ class Instagram::CallbacksController < ApplicationController
verify_instagram_token(params[:state])
end
+ def return_to
+ instagram_token_return_to(params[:state])
+ end
+
def oauth_code
params[:code]
end
diff --git a/app/helpers/instagram/integration_helper.rb b/app/helpers/instagram/integration_helper.rb
index 8ba57bf95..2f91eb6b0 100644
--- a/app/helpers/instagram/integration_helper.rb
+++ b/app/helpers/instagram/integration_helper.rb
@@ -4,21 +4,21 @@ module Instagram::IntegrationHelper
# Generates a signed JWT token for Instagram integration
#
# @param account_id [Integer] The account ID to encode in the token
+ # @param return_to [String, nil] Optional onboarding return hint
# @return [String, nil] The encoded JWT token or nil if client secret is missing
- def generate_instagram_token(account_id)
+ def generate_instagram_token(account_id, return_to = nil)
return if client_secret.blank?
- JWT.encode(token_payload(account_id), client_secret, 'HS256')
+ JWT.encode(token_payload(account_id, return_to), client_secret, 'HS256')
rescue StandardError => e
Rails.logger.error("Failed to generate Instagram token: #{e.message}")
nil
end
- def token_payload(account_id)
- {
- sub: account_id,
- iat: Time.current.to_i
- }
+ def token_payload(account_id, return_to = nil)
+ payload = { sub: account_id, iat: Time.current.to_i }
+ payload[:return_to] = return_to if return_to.present?
+ payload
end
# Verifies and decodes a Instagram JWT token
@@ -28,7 +28,14 @@ module Instagram::IntegrationHelper
def verify_instagram_token(token)
return if token.blank? || client_secret.blank?
- decode_token(token, client_secret)
+ decode_token(token, client_secret)&.dig('sub')
+ end
+
+ # Reads the onboarding return hint from a Instagram JWT token, if present.
+ def instagram_token_return_to(token)
+ return if token.blank? || client_secret.blank?
+
+ decode_token(token, client_secret)&.dig('return_to')
end
private
@@ -41,7 +48,7 @@ module Instagram::IntegrationHelper
JWT.decode(token, secret, true, {
algorithm: 'HS256',
verify_expiration: true
- }).first['sub']
+ }).first
rescue StandardError => e
Rails.logger.error("Unexpected error verifying Instagram token: #{e.message}")
nil
From 170b64d1f1d80a19cc4b6957309579d1c108ddfa Mon Sep 17 00:00:00 2001
From: Shivam Mishra
Date: Tue, 2 Jun 2026 17:01:37 +0530
Subject: [PATCH 16/34] chore: upgrade to vite 6 (#14363)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Upgrades the frontend toolchain to Vite 6 and tidies up the build config
along the way. Behavior is unchanged for end users; this is dev/build
infra.
## What changed
- `vite` 5.4 → 6.4, `@vitejs/plugin-vue` → 5.2, `vite-plugin-ruby` → 5.2
(with matching `vite_rails`/`vite_ruby` gem bumps).
- Dropped the `vite-node` 2.0.1 pnpm override — no longer needed now
that vitest 3 runs on Vite 6 directly.
- Split the single `vite.config.ts` into:
- `vite.config.ts` (app), `vite.lib.config.ts` (SDK), `vite.shared.ts`
(aliases / Vue options), `vitest.config.ts` (tests).
- `pnpm build:sdk` now selects the SDK config explicitly instead of
branching on `BUILD_MODE=library`. SDK output path is unchanged
(`public/packs/js/sdk.js`).
No changes needed to Docker images, deployment scripts, or CI — Node 24
and pnpm 10 are already past Vite 6's floor, and the rake
`assets:precompile` hook still drives the SDK build via `pnpm`.
## How to test
- `pnpm dev` and verify the dashboard, widget, and survey routes load
and HMR works.
- Load a Chatwoot site widget on a test page and confirm `sdk.js` is
served and the widget mounts.
- `RAILS_ENV=production bundle exec rake assets:precompile` and confirm
`public/packs/js/sdk.js` plus the rest of the manifest are produced.
- `pnpm test` for the JS suite.
---------
Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Co-authored-by: Sony Mathew <2040199+sony-mathew@users.noreply.github.com>
---
Gemfile.lock | 8 +-
.../dashboard/composables/spec/index.spec.js | 8 +-
.../composables/spec/useCaptain.spec.js | 8 +-
package.json | 11 +-
pnpm-lock.yaml | 622 ++++++++++++------
vite.config.ts | 114 +---
vite.lib.config.ts | 33 +
vite.shared.ts | 22 +
vitest.config.ts | 39 ++
9 files changed, 551 insertions(+), 314 deletions(-)
create mode 100644 vite.lib.config.ts
create mode 100644 vite.shared.ts
create mode 100644 vitest.config.ts
diff --git a/Gemfile.lock b/Gemfile.lock
index 0479393b0..7151d0ff1 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -996,11 +996,13 @@ GEM
activemodel (>= 3.2)
mail (~> 2.5)
version_gem (1.1.4)
- vite_rails (3.0.17)
- railties (>= 5.1, < 8)
+ vite_rails (3.10.0)
+ railties (>= 5.1, < 9)
vite_ruby (~> 3.0, >= 3.2.2)
- vite_ruby (3.8.0)
+ vite_ruby (3.10.2)
dry-cli (>= 0.7, < 2)
+ logger (~> 1.6)
+ mutex_m
rack-proxy (~> 0.6, >= 0.6.1)
zeitwerk (~> 2.2)
warden (1.2.9)
diff --git a/app/javascript/dashboard/composables/spec/index.spec.js b/app/javascript/dashboard/composables/spec/index.spec.js
index dc1016af8..12ea16139 100644
--- a/app/javascript/dashboard/composables/spec/index.spec.js
+++ b/app/javascript/dashboard/composables/spec/index.spec.js
@@ -10,10 +10,12 @@ vi.mock('shared/helpers/mitt', () => ({
vi.mock('dashboard/helper/AnalyticsHelper/index', async importOriginal => {
const actual = await importOriginal();
- actual.default = {
- track: vi.fn(),
+ return {
+ ...actual,
+ default: {
+ track: vi.fn(),
+ },
};
- return actual;
});
describe('useTrack', () => {
diff --git a/app/javascript/dashboard/composables/spec/useCaptain.spec.js b/app/javascript/dashboard/composables/spec/useCaptain.spec.js
index 3932813fe..a29ef967e 100644
--- a/app/javascript/dashboard/composables/spec/useCaptain.spec.js
+++ b/app/javascript/dashboard/composables/spec/useCaptain.spec.js
@@ -16,10 +16,12 @@ vi.mock('vue-i18n');
vi.mock('dashboard/api/captain/tasks');
vi.mock('dashboard/helper/AnalyticsHelper/index', async importOriginal => {
const actual = await importOriginal();
- actual.default = {
- track: vi.fn(),
+ return {
+ ...actual,
+ default: {
+ track: vi.fn(),
+ },
};
- return actual;
});
vi.mock('dashboard/helper/AnalyticsHelper/events', () => ({
CAPTAIN_EVENTS: {
diff --git a/package.json b/package.json
index bc49c59dc..081c706c6 100644
--- a/package.json
+++ b/package.json
@@ -12,7 +12,7 @@
"start:test": "RAILS_ENV=test foreman start -f ./Procfile.test",
"dev": "overmind start -f ./Procfile.dev",
"ruby:prettier": "bundle exec rubocop -a",
- "build:sdk": "BUILD_MODE=library vite build",
+ "build:sdk": "vite build --config vite.lib.config.ts",
"prepare": "husky install",
"size": "size-limit",
"story:dev": "histoire dev",
@@ -53,7 +53,7 @@
"@tailwindcss/typography": "^0.5.19",
"@tanstack/vue-table": "^8.20.5",
"@twilio/voice-sdk": "^2.12.4",
- "@vitejs/plugin-vue": "^5.1.4",
+ "@vitejs/plugin-vue": "^5.2.4",
"@vue/compiler-sfc": "^3.5.8",
"@vuelidate/core": "^2.0.3",
"@vuelidate/validators": "^2.0.4",
@@ -146,8 +146,8 @@
"prosemirror-model": "^1.22.3",
"size-limit": "^8.2.4",
"tailwindcss": "^3.4.19",
- "vite": "^5.4.21",
- "vite-plugin-ruby": "^5.0.0",
+ "vite": "6.4.2",
+ "vite-plugin-ruby": "^5.2.1",
"vitest": "3.0.5"
},
"engines": {
@@ -161,8 +161,7 @@
},
"pnpm": {
"overrides": {
- "vite-node": "2.0.1",
- "vite": "5.4.21",
+ "vite": "6.4.2",
"vitest": "3.0.5",
"minimatch@<4": "3.1.5",
"minimatch@>=9.0.0 <9.0.7": "9.0.9",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index a4b3044fe..afcf5b60f 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -5,8 +5,7 @@ settings:
excludeLinksFromLockfile: false
overrides:
- vite-node: 2.0.1
- vite: 5.4.21
+ vite: 6.4.2
vitest: 3.0.5
minimatch@<4: 3.1.5
minimatch@>=9.0.0 <9.0.7: 9.0.9
@@ -83,8 +82,8 @@ importers:
specifier: ^2.12.4
version: 2.17.0
'@vitejs/plugin-vue':
- specifier: ^5.1.4
- version: 5.1.4(vite@5.4.21(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0))(vue@3.5.12(typescript@5.6.2))
+ specifier: ^5.2.4
+ version: 5.2.4(vite@6.4.2(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2))(vue@3.5.12(typescript@5.6.2))
'@vue/compiler-sfc':
specifier: ^3.5.8
version: 3.5.8
@@ -262,7 +261,7 @@ importers:
version: 1.9.2(tailwindcss@3.4.19)
'@histoire/plugin-vue':
specifier: 0.17.15
- version: 0.17.15(histoire@0.17.15(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0)(vite@5.4.21(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0)))(vite@5.4.21(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0))(vue@3.5.12(typescript@5.6.2))
+ version: 0.17.15(histoire@0.17.15(@types/node@22.7.0)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(vite@6.4.2(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2))(yaml@2.8.2))(vite@6.4.2(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2))(vue@3.5.12(typescript@5.6.2))
'@iconify-json/logos':
specifier: ^1.2.10
version: 1.2.10
@@ -289,7 +288,7 @@ importers:
version: 8.2.6(size-limit@8.2.6)
'@vitest/coverage-v8':
specifier: 3.0.5
- version: 3.0.5(vitest@3.0.5(@types/node@22.7.0)(jsdom@27.2.0)(sass@1.79.3)(terser@5.33.0))
+ version: 3.0.5(vitest@3.0.5(@types/node@22.7.0)(jiti@1.21.6)(jsdom@27.2.0)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2))
'@vue/test-utils':
specifier: ^2.4.6
version: 2.4.6
@@ -328,7 +327,7 @@ importers:
version: 6.0.0
histoire:
specifier: 0.17.15
- version: 0.17.15(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0)(vite@5.4.21(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0))
+ version: 0.17.15(@types/node@22.7.0)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(vite@6.4.2(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2))(yaml@2.8.2)
husky:
specifier: ^7.0.0
version: 7.0.4
@@ -357,14 +356,14 @@ importers:
specifier: ^3.4.19
version: 3.4.19
vite:
- specifier: 5.4.21
- version: 5.4.21(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0)
+ specifier: 6.4.2
+ version: 6.4.2(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2)
vite-plugin-ruby:
- specifier: ^5.0.0
- version: 5.0.0(vite@5.4.21(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0))
+ specifier: ^5.2.1
+ version: 5.2.1(vite@6.4.2(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2))
vitest:
specifier: 3.0.5
- version: 3.0.5(@types/node@22.7.0)(jsdom@27.2.0)(sass@1.79.3)(terser@5.33.0)
+ version: 3.0.5(@types/node@22.7.0)(jiti@1.21.6)(jsdom@27.2.0)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2)
packages:
@@ -710,141 +709,159 @@ packages:
peerDependencies:
tailwindcss: '*'
- '@esbuild/aix-ppc64@0.21.5':
- resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==}
- engines: {node: '>=12'}
+ '@esbuild/aix-ppc64@0.25.12':
+ resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==}
+ engines: {node: '>=18'}
cpu: [ppc64]
os: [aix]
- '@esbuild/android-arm64@0.21.5':
- resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==}
- engines: {node: '>=12'}
+ '@esbuild/android-arm64@0.25.12':
+ resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==}
+ engines: {node: '>=18'}
cpu: [arm64]
os: [android]
- '@esbuild/android-arm@0.21.5':
- resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==}
- engines: {node: '>=12'}
+ '@esbuild/android-arm@0.25.12':
+ resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==}
+ engines: {node: '>=18'}
cpu: [arm]
os: [android]
- '@esbuild/android-x64@0.21.5':
- resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==}
- engines: {node: '>=12'}
+ '@esbuild/android-x64@0.25.12':
+ resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==}
+ engines: {node: '>=18'}
cpu: [x64]
os: [android]
- '@esbuild/darwin-arm64@0.21.5':
- resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==}
- engines: {node: '>=12'}
+ '@esbuild/darwin-arm64@0.25.12':
+ resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==}
+ engines: {node: '>=18'}
cpu: [arm64]
os: [darwin]
- '@esbuild/darwin-x64@0.21.5':
- resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==}
- engines: {node: '>=12'}
+ '@esbuild/darwin-x64@0.25.12':
+ resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==}
+ engines: {node: '>=18'}
cpu: [x64]
os: [darwin]
- '@esbuild/freebsd-arm64@0.21.5':
- resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==}
- engines: {node: '>=12'}
+ '@esbuild/freebsd-arm64@0.25.12':
+ resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==}
+ engines: {node: '>=18'}
cpu: [arm64]
os: [freebsd]
- '@esbuild/freebsd-x64@0.21.5':
- resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==}
- engines: {node: '>=12'}
+ '@esbuild/freebsd-x64@0.25.12':
+ resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==}
+ engines: {node: '>=18'}
cpu: [x64]
os: [freebsd]
- '@esbuild/linux-arm64@0.21.5':
- resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==}
- engines: {node: '>=12'}
+ '@esbuild/linux-arm64@0.25.12':
+ resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==}
+ engines: {node: '>=18'}
cpu: [arm64]
os: [linux]
- '@esbuild/linux-arm@0.21.5':
- resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==}
- engines: {node: '>=12'}
+ '@esbuild/linux-arm@0.25.12':
+ resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==}
+ engines: {node: '>=18'}
cpu: [arm]
os: [linux]
- '@esbuild/linux-ia32@0.21.5':
- resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==}
- engines: {node: '>=12'}
+ '@esbuild/linux-ia32@0.25.12':
+ resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==}
+ engines: {node: '>=18'}
cpu: [ia32]
os: [linux]
- '@esbuild/linux-loong64@0.21.5':
- resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==}
- engines: {node: '>=12'}
+ '@esbuild/linux-loong64@0.25.12':
+ resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==}
+ engines: {node: '>=18'}
cpu: [loong64]
os: [linux]
- '@esbuild/linux-mips64el@0.21.5':
- resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==}
- engines: {node: '>=12'}
+ '@esbuild/linux-mips64el@0.25.12':
+ resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==}
+ engines: {node: '>=18'}
cpu: [mips64el]
os: [linux]
- '@esbuild/linux-ppc64@0.21.5':
- resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==}
- engines: {node: '>=12'}
+ '@esbuild/linux-ppc64@0.25.12':
+ resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==}
+ engines: {node: '>=18'}
cpu: [ppc64]
os: [linux]
- '@esbuild/linux-riscv64@0.21.5':
- resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==}
- engines: {node: '>=12'}
+ '@esbuild/linux-riscv64@0.25.12':
+ resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==}
+ engines: {node: '>=18'}
cpu: [riscv64]
os: [linux]
- '@esbuild/linux-s390x@0.21.5':
- resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==}
- engines: {node: '>=12'}
+ '@esbuild/linux-s390x@0.25.12':
+ resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==}
+ engines: {node: '>=18'}
cpu: [s390x]
os: [linux]
- '@esbuild/linux-x64@0.21.5':
- resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==}
- engines: {node: '>=12'}
+ '@esbuild/linux-x64@0.25.12':
+ resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==}
+ engines: {node: '>=18'}
cpu: [x64]
os: [linux]
- '@esbuild/netbsd-x64@0.21.5':
- resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==}
- engines: {node: '>=12'}
+ '@esbuild/netbsd-arm64@0.25.12':
+ resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-x64@0.25.12':
+ resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==}
+ engines: {node: '>=18'}
cpu: [x64]
os: [netbsd]
- '@esbuild/openbsd-x64@0.21.5':
- resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==}
- engines: {node: '>=12'}
+ '@esbuild/openbsd-arm64@0.25.12':
+ resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.25.12':
+ resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==}
+ engines: {node: '>=18'}
cpu: [x64]
os: [openbsd]
- '@esbuild/sunos-x64@0.21.5':
- resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==}
- engines: {node: '>=12'}
+ '@esbuild/openharmony-arm64@0.25.12':
+ resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@esbuild/sunos-x64@0.25.12':
+ resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==}
+ engines: {node: '>=18'}
cpu: [x64]
os: [sunos]
- '@esbuild/win32-arm64@0.21.5':
- resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==}
- engines: {node: '>=12'}
+ '@esbuild/win32-arm64@0.25.12':
+ resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==}
+ engines: {node: '>=18'}
cpu: [arm64]
os: [win32]
- '@esbuild/win32-ia32@0.21.5':
- resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==}
- engines: {node: '>=12'}
+ '@esbuild/win32-ia32@0.25.12':
+ resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==}
+ engines: {node: '>=18'}
cpu: [ia32]
os: [win32]
- '@esbuild/win32-x64@0.21.5':
- resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==}
- engines: {node: '>=12'}
+ '@esbuild/win32-x64@0.25.12':
+ resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==}
+ engines: {node: '>=18'}
cpu: [x64]
os: [win32]
@@ -937,7 +954,7 @@ packages:
'@histoire/shared@0.17.17':
resolution: {integrity: sha512-ueGtURysonT0MujCObPCR57+mgZluMEXCrbc2FBgKAD/DoAt38tNwSGsmLldk2O6nTr7lr6ClbVSgWrLwgY6Xw==}
peerDependencies:
- vite: 5.4.21
+ vite: 6.4.2
'@histoire/vendors@0.17.17':
resolution: {integrity: sha512-QZvmffdoJlLuYftPIkOU5Q2FPAdG2JjMuQ5jF7NmEl0n1XnmbMqtRkdYTZ4eF6CO1KLZ0Zyf6gBQvoT1uWNcjA==}
@@ -1407,11 +1424,11 @@ packages:
'@videojs/xhr@2.6.0':
resolution: {integrity: sha512-7J361GiN1tXpm+gd0xz2QWr3xNWBE+rytvo8J3KuggFaLg+U37gZQ2BuPLcnkfGffy2e+ozY70RHC8jt7zjA6Q==}
- '@vitejs/plugin-vue@5.1.4':
- resolution: {integrity: sha512-N2XSI2n3sQqp5w7Y/AN/L2XDjBIRGqXko+eDp42sydYSBeJuSm5a1sLf8zakmo8u7tA8NmBgoDLA1HeOESjp9A==}
+ '@vitejs/plugin-vue@5.2.4':
+ resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==}
engines: {node: ^18.0.0 || >=20.0.0}
peerDependencies:
- vite: 5.4.21
+ vite: 6.4.2
vue: ^3.2.25
'@vitest/coverage-v8@3.0.5':
@@ -1430,7 +1447,7 @@ packages:
resolution: {integrity: sha512-CLPNBFBIE7x6aEGbIjaQAX03ZZlBMaWwAjBdMkIf/cAn6xzLTiM3zYqO/WAbieEjsAZir6tO71mzeHZoodThvw==}
peerDependencies:
msw: ^2.4.9
- vite: 5.4.21
+ vite: 6.4.2
peerDependenciesMeta:
msw:
optional: true
@@ -2155,6 +2172,10 @@ packages:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
engines: {node: '>=0.4.0'}
+ detect-libc@2.1.2:
+ resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
+ engines: {node: '>=8'}
+
diacritics@1.3.0:
resolution: {integrity: sha512-wlwEkqcsaxvPJML+rDh/2iS824jbREk6DUMUKkEaSlxdYHeS43cClJtsWglvw2RfeXGm6ohKDqsXteJ5sP5enA==}
@@ -2279,6 +2300,9 @@ packages:
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
engines: {node: '>= 0.4'}
+ es-module-lexer@1.7.0:
+ resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==}
+
es-object-atoms@1.0.0:
resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==}
engines: {node: '>= 0.4'}
@@ -2298,9 +2322,9 @@ packages:
resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==}
engines: {node: '>= 0.4'}
- esbuild@0.21.5:
- resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==}
- engines: {node: '>=12'}
+ esbuild@0.25.12:
+ resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==}
+ engines: {node: '>=18'}
hasBin: true
escalade@3.1.2:
@@ -2507,6 +2531,15 @@ packages:
fastq@1.15.0:
resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==}
+ fdir@6.5.0:
+ resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ picomatch: ^3 || ^4
+ peerDependenciesMeta:
+ picomatch:
+ optional: true
+
file-entry-cache@6.0.1:
resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
engines: {node: ^10.12.0 || >=12.0.0}
@@ -2752,7 +2785,7 @@ packages:
resolution: {integrity: sha512-DiRMSIgj340z+zikqf0f3Pj0CTv2/xtdBMBIAO1EARat+QXxMwumbfK41Gi7f9IIBr+UVmomNcwFxVY2EM/vrw==}
hasBin: true
peerDependencies:
- vite: 5.4.21
+ vite: 6.4.2
hookable@5.5.3:
resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==}
@@ -3115,6 +3148,76 @@ packages:
libphonenumber-js@1.11.9:
resolution: {integrity: sha512-Zs5wf5HaWzW2/inlupe2tstl0I/Tbqo7lH20ZLr6Is58u7Dz2n+gRFGNlj9/gWxFvNfp9+YyDsiegjNhdixB9A==}
+ lightningcss-android-arm64@1.32.0:
+ resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [android]
+
+ lightningcss-darwin-arm64@1.32.0:
+ resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [darwin]
+
+ lightningcss-darwin-x64@1.32.0:
+ resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [darwin]
+
+ lightningcss-freebsd-x64@1.32.0:
+ resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [freebsd]
+
+ lightningcss-linux-arm-gnueabihf@1.32.0:
+ resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm]
+ os: [linux]
+
+ lightningcss-linux-arm64-gnu@1.32.0:
+ resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+
+ lightningcss-linux-arm64-musl@1.32.0:
+ resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+
+ lightningcss-linux-x64-gnu@1.32.0:
+ resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+
+ lightningcss-linux-x64-musl@1.32.0:
+ resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+
+ lightningcss-win32-arm64-msvc@1.32.0:
+ resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [win32]
+
+ lightningcss-win32-x64-msvc@1.32.0:
+ resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [win32]
+
+ lightningcss@1.32.0:
+ resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==}
+ engines: {node: '>= 12.0.0'}
+
lilconfig@2.1.0:
resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
engines: {node: '>=10'}
@@ -3436,6 +3539,9 @@ packages:
resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==}
engines: {node: '>= 0.4'}
+ obug@2.1.1:
+ resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==}
+
on-finished@2.3.0:
resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==}
engines: {node: '>= 0.8'}
@@ -3826,6 +3932,10 @@ packages:
resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==}
engines: {node: ^10 || ^12 || >=14}
+ postcss@8.5.14:
+ resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==}
+ engines: {node: ^10 || ^12 || >=14}
+
postcss@8.5.6:
resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
engines: {node: ^10 || ^12 || >=14}
@@ -4316,6 +4426,10 @@ packages:
resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==}
engines: {node: '>=18'}
+ tinyglobby@0.2.16:
+ resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==}
+ engines: {node: '>=12.0.0'}
+
tinykeys@3.0.0:
resolution: {integrity: sha512-nazawuGv5zx6MuDfDY0rmfXjuOGhD5XU2z0GLURQ1nzl0RUe9OuCJq+0u8xxJZINHe+mr7nw8PWYYZ9WhMFujw==}
@@ -4532,32 +4646,42 @@ packages:
vue:
optional: true
- vite-node@2.0.1:
- resolution: {integrity: sha512-nVd6kyhPAql0s+xIVJzuF+RSRH8ZimNrm6U8ZvTA4MXv8CHI17TFaQwRaFiK75YX6XeFqZD4IoAaAfi9OR1XvQ==}
- engines: {node: ^18.0.0 || >=20.0.0}
+ vite-node@0.34.7:
+ resolution: {integrity: sha512-0Yzb96QzHmqIKIs/x2q/sqG750V/EF6yDkS2p1WjJc1W2bgRSuQjf5vB9HY8h2nVb5j4pO5paS5Npcv3s69YUg==}
+ engines: {node: '>=v14.18.0'}
hasBin: true
- vite-plugin-ruby@5.0.0:
- resolution: {integrity: sha512-c8PjTp21Ah/ttgnNUyu0qvCXZI08Jr9I24oUKg3TRIRhF5GcOZ++6wtlTCrNFd9COEQbpXHxlRIXd/MEg0iZJw==}
- peerDependencies:
- vite: 5.4.21
+ vite-node@3.0.5:
+ resolution: {integrity: sha512-02JEJl7SbtwSDJdYS537nU6l+ktdvcREfLksk/NDAqtdKWGqHl+joXzEubHROmS3E6pip+Xgu2tFezMu75jH7A==}
+ engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+ hasBin: true
- vite@5.4.21:
- resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==}
- engines: {node: ^18.0.0 || >=20.0.0}
+ vite-plugin-ruby@5.2.1:
+ resolution: {integrity: sha512-wI3F/Yr4e4mEwiMff/cvNwGu8nZok5wrwUjHxO8we+h3y9+qCluO3Y5dzvz6vHJDBya9fKXkltoMwoJhaB2SRg==}
+ peerDependencies:
+ vite: 6.4.2
+
+ vite@6.4.2:
+ resolution: {integrity: sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ==}
+ engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
hasBin: true
peerDependencies:
- '@types/node': ^18.0.0 || >=20.0.0
+ '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
+ jiti: '>=1.21.0'
less: '*'
lightningcss: ^1.21.0
sass: '*'
sass-embedded: '*'
stylus: '*'
sugarss: '*'
- terser: ^5.4.0
+ terser: ^5.16.0
+ tsx: ^4.8.1
+ yaml: ^2.4.2
peerDependenciesMeta:
'@types/node':
optional: true
+ jiti:
+ optional: true
less:
optional: true
lightningcss:
@@ -4572,6 +4696,10 @@ packages:
optional: true
terser:
optional: true
+ tsx:
+ optional: true
+ yaml:
+ optional: true
vitest@3.0.5:
resolution: {integrity: sha512-4dof+HvqONw9bvsYxtkfUp2uHsTN9bV2CZIi1pWgoFpL1Lld8LA1ka9q/ONSsoScAKG7NVGf2stJTI7XRkXb2Q==}
@@ -5268,73 +5396,82 @@ snapshots:
'@iconify/utils': 3.1.0
tailwindcss: 3.4.19
- '@esbuild/aix-ppc64@0.21.5':
+ '@esbuild/aix-ppc64@0.25.12':
optional: true
- '@esbuild/android-arm64@0.21.5':
+ '@esbuild/android-arm64@0.25.12':
optional: true
- '@esbuild/android-arm@0.21.5':
+ '@esbuild/android-arm@0.25.12':
optional: true
- '@esbuild/android-x64@0.21.5':
+ '@esbuild/android-x64@0.25.12':
optional: true
- '@esbuild/darwin-arm64@0.21.5':
+ '@esbuild/darwin-arm64@0.25.12':
optional: true
- '@esbuild/darwin-x64@0.21.5':
+ '@esbuild/darwin-x64@0.25.12':
optional: true
- '@esbuild/freebsd-arm64@0.21.5':
+ '@esbuild/freebsd-arm64@0.25.12':
optional: true
- '@esbuild/freebsd-x64@0.21.5':
+ '@esbuild/freebsd-x64@0.25.12':
optional: true
- '@esbuild/linux-arm64@0.21.5':
+ '@esbuild/linux-arm64@0.25.12':
optional: true
- '@esbuild/linux-arm@0.21.5':
+ '@esbuild/linux-arm@0.25.12':
optional: true
- '@esbuild/linux-ia32@0.21.5':
+ '@esbuild/linux-ia32@0.25.12':
optional: true
- '@esbuild/linux-loong64@0.21.5':
+ '@esbuild/linux-loong64@0.25.12':
optional: true
- '@esbuild/linux-mips64el@0.21.5':
+ '@esbuild/linux-mips64el@0.25.12':
optional: true
- '@esbuild/linux-ppc64@0.21.5':
+ '@esbuild/linux-ppc64@0.25.12':
optional: true
- '@esbuild/linux-riscv64@0.21.5':
+ '@esbuild/linux-riscv64@0.25.12':
optional: true
- '@esbuild/linux-s390x@0.21.5':
+ '@esbuild/linux-s390x@0.25.12':
optional: true
- '@esbuild/linux-x64@0.21.5':
+ '@esbuild/linux-x64@0.25.12':
optional: true
- '@esbuild/netbsd-x64@0.21.5':
+ '@esbuild/netbsd-arm64@0.25.12':
optional: true
- '@esbuild/openbsd-x64@0.21.5':
+ '@esbuild/netbsd-x64@0.25.12':
optional: true
- '@esbuild/sunos-x64@0.21.5':
+ '@esbuild/openbsd-arm64@0.25.12':
optional: true
- '@esbuild/win32-arm64@0.21.5':
+ '@esbuild/openbsd-x64@0.25.12':
optional: true
- '@esbuild/win32-ia32@0.21.5':
+ '@esbuild/openharmony-arm64@0.25.12':
optional: true
- '@esbuild/win32-x64@0.21.5':
+ '@esbuild/sunos-x64@0.25.12':
+ optional: true
+
+ '@esbuild/win32-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/win32-ia32@0.25.12':
+ optional: true
+
+ '@esbuild/win32-x64@0.25.12':
optional: true
'@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)':
@@ -5449,10 +5586,10 @@ snapshots:
highlight.js: 11.10.0
vue: 3.5.12(typescript@5.6.2)
- '@histoire/app@0.17.17(vite@5.4.21(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0))':
+ '@histoire/app@0.17.17(vite@6.4.2(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2))':
dependencies:
- '@histoire/controls': 0.17.17(vite@5.4.21(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0))
- '@histoire/shared': 0.17.17(vite@5.4.21(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0))
+ '@histoire/controls': 0.17.17(vite@6.4.2(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2))
+ '@histoire/shared': 0.17.17(vite@6.4.2(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2))
'@histoire/vendors': 0.17.17
'@types/flexsearch': 0.7.6
flexsearch: 0.7.21
@@ -5460,7 +5597,7 @@ snapshots:
transitivePeerDependencies:
- vite
- '@histoire/controls@0.17.17(vite@5.4.21(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0))':
+ '@histoire/controls@0.17.17(vite@6.4.2(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2))':
dependencies:
'@codemirror/commands': 6.7.0
'@codemirror/lang-json': 6.0.1
@@ -5469,26 +5606,26 @@ snapshots:
'@codemirror/state': 6.4.1
'@codemirror/theme-one-dark': 6.1.2
'@codemirror/view': 6.34.1
- '@histoire/shared': 0.17.17(vite@5.4.21(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0))
+ '@histoire/shared': 0.17.17(vite@6.4.2(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2))
'@histoire/vendors': 0.17.17
transitivePeerDependencies:
- vite
- '@histoire/plugin-vue@0.17.15(histoire@0.17.15(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0)(vite@5.4.21(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0)))(vite@5.4.21(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0))(vue@3.5.12(typescript@5.6.2))':
+ '@histoire/plugin-vue@0.17.15(histoire@0.17.15(@types/node@22.7.0)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(vite@6.4.2(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2))(yaml@2.8.2))(vite@6.4.2(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2))(vue@3.5.12(typescript@5.6.2))':
dependencies:
- '@histoire/controls': 0.17.17(vite@5.4.21(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0))
- '@histoire/shared': 0.17.17(vite@5.4.21(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0))
+ '@histoire/controls': 0.17.17(vite@6.4.2(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2))
+ '@histoire/shared': 0.17.17(vite@6.4.2(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2))
'@histoire/vendors': 0.17.17
change-case: 4.1.2
globby: 13.2.2
- histoire: 0.17.15(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0)(vite@5.4.21(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0))
+ histoire: 0.17.15(@types/node@22.7.0)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(vite@6.4.2(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2))(yaml@2.8.2)
launch-editor: 2.9.1
pathe: 1.1.2
vue: 3.5.12(typescript@5.6.2)
transitivePeerDependencies:
- vite
- '@histoire/shared@0.17.17(vite@5.4.21(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0))':
+ '@histoire/shared@0.17.17(vite@6.4.2(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2))':
dependencies:
'@histoire/vendors': 0.17.17
'@types/fs-extra': 9.0.13
@@ -5496,7 +5633,7 @@ snapshots:
chokidar: 3.6.0
pathe: 1.1.2
picocolors: 1.1.0
- vite: 5.4.21(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0)
+ vite: 6.4.2(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2)
'@histoire/vendors@0.17.17': {}
@@ -5947,12 +6084,12 @@ snapshots:
global: 4.4.0
is-function: 1.0.2
- '@vitejs/plugin-vue@5.1.4(vite@5.4.21(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0))(vue@3.5.12(typescript@5.6.2))':
+ '@vitejs/plugin-vue@5.2.4(vite@6.4.2(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2))(vue@3.5.12(typescript@5.6.2))':
dependencies:
- vite: 5.4.21(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0)
+ vite: 6.4.2(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2)
vue: 3.5.12(typescript@5.6.2)
- '@vitest/coverage-v8@3.0.5(vitest@3.0.5(@types/node@22.7.0)(jsdom@27.2.0)(sass@1.79.3)(terser@5.33.0))':
+ '@vitest/coverage-v8@3.0.5(vitest@3.0.5(@types/node@22.7.0)(jiti@1.21.6)(jsdom@27.2.0)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2))':
dependencies:
'@ampproject/remapping': 2.3.0
'@bcoe/v8-coverage': 1.0.2
@@ -5966,7 +6103,7 @@ snapshots:
std-env: 3.8.0
test-exclude: 7.0.1
tinyrainbow: 2.0.0
- vitest: 3.0.5(@types/node@22.7.0)(jsdom@27.2.0)(sass@1.79.3)(terser@5.33.0)
+ vitest: 3.0.5(@types/node@22.7.0)(jiti@1.21.6)(jsdom@27.2.0)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2)
transitivePeerDependencies:
- supports-color
@@ -5977,13 +6114,13 @@ snapshots:
chai: 5.1.2
tinyrainbow: 2.0.0
- '@vitest/mocker@3.0.5(vite@5.4.21(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0))':
+ '@vitest/mocker@3.0.5(vite@6.4.2(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2))':
dependencies:
'@vitest/spy': 3.0.5
estree-walker: 3.0.3
magic-string: 0.30.17
optionalDependencies:
- vite: 5.4.21(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0)
+ vite: 6.4.2(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2)
'@vitest/pretty-format@3.0.5':
dependencies:
@@ -6070,7 +6207,7 @@ snapshots:
'@vue/shared': 3.5.13
estree-walker: 2.0.2
magic-string: 0.30.17
- postcss: 8.5.6
+ postcss: 8.5.14
source-map-js: 1.2.1
'@vue/compiler-sfc@3.5.8':
@@ -6256,7 +6393,7 @@ snapshots:
agent-base@6.0.2:
dependencies:
- debug: 4.4.0
+ debug: 4.4.3
transitivePeerDependencies:
- supports-color
@@ -6821,6 +6958,9 @@ snapshots:
delayed-stream@1.0.0: {}
+ detect-libc@2.1.2:
+ optional: true
+
diacritics@1.3.0: {}
didyoumean@1.2.2: {}
@@ -7013,6 +7153,8 @@ snapshots:
es-errors@1.3.0: {}
+ es-module-lexer@1.7.0: {}
+
es-object-atoms@1.0.0:
dependencies:
es-errors: 1.3.0
@@ -7038,31 +7180,34 @@ snapshots:
is-date-object: 1.0.5
is-symbol: 1.0.4
- esbuild@0.21.5:
+ esbuild@0.25.12:
optionalDependencies:
- '@esbuild/aix-ppc64': 0.21.5
- '@esbuild/android-arm': 0.21.5
- '@esbuild/android-arm64': 0.21.5
- '@esbuild/android-x64': 0.21.5
- '@esbuild/darwin-arm64': 0.21.5
- '@esbuild/darwin-x64': 0.21.5
- '@esbuild/freebsd-arm64': 0.21.5
- '@esbuild/freebsd-x64': 0.21.5
- '@esbuild/linux-arm': 0.21.5
- '@esbuild/linux-arm64': 0.21.5
- '@esbuild/linux-ia32': 0.21.5
- '@esbuild/linux-loong64': 0.21.5
- '@esbuild/linux-mips64el': 0.21.5
- '@esbuild/linux-ppc64': 0.21.5
- '@esbuild/linux-riscv64': 0.21.5
- '@esbuild/linux-s390x': 0.21.5
- '@esbuild/linux-x64': 0.21.5
- '@esbuild/netbsd-x64': 0.21.5
- '@esbuild/openbsd-x64': 0.21.5
- '@esbuild/sunos-x64': 0.21.5
- '@esbuild/win32-arm64': 0.21.5
- '@esbuild/win32-ia32': 0.21.5
- '@esbuild/win32-x64': 0.21.5
+ '@esbuild/aix-ppc64': 0.25.12
+ '@esbuild/android-arm': 0.25.12
+ '@esbuild/android-arm64': 0.25.12
+ '@esbuild/android-x64': 0.25.12
+ '@esbuild/darwin-arm64': 0.25.12
+ '@esbuild/darwin-x64': 0.25.12
+ '@esbuild/freebsd-arm64': 0.25.12
+ '@esbuild/freebsd-x64': 0.25.12
+ '@esbuild/linux-arm': 0.25.12
+ '@esbuild/linux-arm64': 0.25.12
+ '@esbuild/linux-ia32': 0.25.12
+ '@esbuild/linux-loong64': 0.25.12
+ '@esbuild/linux-mips64el': 0.25.12
+ '@esbuild/linux-ppc64': 0.25.12
+ '@esbuild/linux-riscv64': 0.25.12
+ '@esbuild/linux-s390x': 0.25.12
+ '@esbuild/linux-x64': 0.25.12
+ '@esbuild/netbsd-arm64': 0.25.12
+ '@esbuild/netbsd-x64': 0.25.12
+ '@esbuild/openbsd-arm64': 0.25.12
+ '@esbuild/openbsd-x64': 0.25.12
+ '@esbuild/openharmony-arm64': 0.25.12
+ '@esbuild/sunos-x64': 0.25.12
+ '@esbuild/win32-arm64': 0.25.12
+ '@esbuild/win32-ia32': 0.25.12
+ '@esbuild/win32-x64': 0.25.12
escalade@3.1.2: {}
@@ -7305,6 +7450,10 @@ snapshots:
dependencies:
reusify: 1.0.4
+ fdir@6.5.0(picomatch@4.0.4):
+ optionalDependencies:
+ picomatch: 4.0.4
+
file-entry-cache@6.0.1:
dependencies:
flat-cache: 3.1.0
@@ -7570,12 +7719,12 @@ snapshots:
highlight.js@11.10.0: {}
- histoire@0.17.15(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0)(vite@5.4.21(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0)):
+ histoire@0.17.15(@types/node@22.7.0)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(vite@6.4.2(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2))(yaml@2.8.2):
dependencies:
'@akryum/tinypool': 0.3.1
- '@histoire/app': 0.17.17(vite@5.4.21(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0))
- '@histoire/controls': 0.17.17(vite@5.4.21(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0))
- '@histoire/shared': 0.17.17(vite@5.4.21(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0))
+ '@histoire/app': 0.17.17(vite@6.4.2(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2))
+ '@histoire/controls': 0.17.17(vite@6.4.2(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2))
+ '@histoire/shared': 0.17.17(vite@6.4.2(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2))
'@histoire/vendors': 0.17.17
'@types/flexsearch': 0.7.6
'@types/markdown-it': 12.2.3
@@ -7602,8 +7751,8 @@ snapshots:
sade: 1.8.1
shiki-es: 0.2.0
sirv: 2.0.4
- vite: 5.4.21(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0)
- vite-node: 2.0.1(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0)
+ vite: 6.4.2(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2)
+ vite-node: 0.34.7(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2)
transitivePeerDependencies:
- '@types/node'
- bufferutil
@@ -7616,7 +7765,9 @@ snapshots:
- sugarss
- supports-color
- terser
+ - tsx
- utf-8-validate
+ - yaml
hookable@5.5.3: {}
@@ -8009,6 +8160,56 @@ snapshots:
libphonenumber-js@1.11.9: {}
+ lightningcss-android-arm64@1.32.0:
+ optional: true
+
+ lightningcss-darwin-arm64@1.32.0:
+ optional: true
+
+ lightningcss-darwin-x64@1.32.0:
+ optional: true
+
+ lightningcss-freebsd-x64@1.32.0:
+ optional: true
+
+ lightningcss-linux-arm-gnueabihf@1.32.0:
+ optional: true
+
+ lightningcss-linux-arm64-gnu@1.32.0:
+ optional: true
+
+ lightningcss-linux-arm64-musl@1.32.0:
+ optional: true
+
+ lightningcss-linux-x64-gnu@1.32.0:
+ optional: true
+
+ lightningcss-linux-x64-musl@1.32.0:
+ optional: true
+
+ lightningcss-win32-arm64-msvc@1.32.0:
+ optional: true
+
+ lightningcss-win32-x64-msvc@1.32.0:
+ optional: true
+
+ lightningcss@1.32.0:
+ dependencies:
+ detect-libc: 2.1.2
+ optionalDependencies:
+ lightningcss-android-arm64: 1.32.0
+ lightningcss-darwin-arm64: 1.32.0
+ lightningcss-darwin-x64: 1.32.0
+ lightningcss-freebsd-x64: 1.32.0
+ lightningcss-linux-arm-gnueabihf: 1.32.0
+ lightningcss-linux-arm64-gnu: 1.32.0
+ lightningcss-linux-arm64-musl: 1.32.0
+ lightningcss-linux-x64-gnu: 1.32.0
+ lightningcss-linux-x64-musl: 1.32.0
+ lightningcss-win32-arm64-msvc: 1.32.0
+ lightningcss-win32-x64-msvc: 1.32.0
+ optional: true
+
lilconfig@2.1.0: {}
lilconfig@3.1.3: {}
@@ -8333,6 +8534,8 @@ snapshots:
define-properties: 1.2.1
es-object-atoms: 1.0.0
+ obug@2.1.1: {}
+
on-finished@2.3.0:
dependencies:
ee-first: 1.1.1
@@ -8743,6 +8946,12 @@ snapshots:
picocolors: 1.1.0
source-map-js: 1.2.1
+ postcss@8.5.14:
+ dependencies:
+ nanoid: 3.3.11
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
postcss@8.5.6:
dependencies:
nanoid: 3.3.11
@@ -9335,6 +9544,11 @@ snapshots:
tinyexec@1.0.2: {}
+ tinyglobby@0.2.16:
+ dependencies:
+ fdir: 6.5.0(picomatch@4.0.4)
+ picomatch: 4.0.4
+
tinykeys@3.0.0: {}
tinypool@1.0.2: {}
@@ -9561,15 +9775,17 @@ snapshots:
optionalDependencies:
vue: 3.5.12(typescript@5.6.2)
- vite-node@2.0.1(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0):
+ vite-node@0.34.7(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2):
dependencies:
cac: 6.7.14
- debug: 4.4.0
+ debug: 4.4.3
+ mlly: 1.8.1
pathe: 1.1.2
picocolors: 1.1.1
- vite: 5.4.21(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0)
+ vite: 6.4.2(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2)
transitivePeerDependencies:
- '@types/node'
+ - jiti
- less
- lightningcss
- sass
@@ -9578,30 +9794,57 @@ snapshots:
- sugarss
- supports-color
- terser
+ - tsx
+ - yaml
- vite-plugin-ruby@5.0.0(vite@5.4.21(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0)):
+ vite-node@3.0.5(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2):
dependencies:
- debug: 4.3.5
- fast-glob: 3.3.2
- vite: 5.4.21(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0)
+ cac: 6.7.14
+ debug: 4.4.3
+ es-module-lexer: 1.7.0
+ pathe: 2.0.3
+ vite: 6.4.2(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2)
transitivePeerDependencies:
+ - '@types/node'
+ - jiti
+ - less
+ - lightningcss
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
- supports-color
+ - terser
+ - tsx
+ - yaml
- vite@5.4.21(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0):
+ vite-plugin-ruby@5.2.1(vite@6.4.2(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2)):
dependencies:
- esbuild: 0.21.5
- postcss: 8.5.6
+ obug: 2.1.1
+ tinyglobby: 0.2.16
+ vite: 6.4.2(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2)
+
+ vite@6.4.2(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2):
+ dependencies:
+ esbuild: 0.25.12
+ fdir: 6.5.0(picomatch@4.0.4)
+ picomatch: 4.0.4
+ postcss: 8.5.14
rollup: 4.59.0
+ tinyglobby: 0.2.16
optionalDependencies:
'@types/node': 22.7.0
fsevents: 2.3.3
+ jiti: 1.21.6
+ lightningcss: 1.32.0
sass: 1.79.3
terser: 5.33.0
+ yaml: 2.8.2
- vitest@3.0.5(@types/node@22.7.0)(jsdom@27.2.0)(sass@1.79.3)(terser@5.33.0):
+ vitest@3.0.5(@types/node@22.7.0)(jiti@1.21.6)(jsdom@27.2.0)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2):
dependencies:
'@vitest/expect': 3.0.5
- '@vitest/mocker': 3.0.5(vite@5.4.21(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0))
+ '@vitest/mocker': 3.0.5(vite@6.4.2(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2))
'@vitest/pretty-format': 3.0.5
'@vitest/runner': 3.0.5
'@vitest/snapshot': 3.0.5
@@ -9617,13 +9860,14 @@ snapshots:
tinyexec: 0.3.2
tinypool: 1.0.2
tinyrainbow: 2.0.0
- vite: 5.4.21(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0)
- vite-node: 2.0.1(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0)
+ vite: 6.4.2(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2)
+ vite-node: 3.0.5(@types/node@22.7.0)(jiti@1.21.6)(lightningcss@1.32.0)(sass@1.79.3)(terser@5.33.0)(yaml@2.8.2)
why-is-node-running: 2.3.0
optionalDependencies:
'@types/node': 22.7.0
jsdom: 27.2.0
transitivePeerDependencies:
+ - jiti
- less
- lightningcss
- msw
@@ -9633,6 +9877,8 @@ snapshots:
- sugarss
- supports-color
- terser
+ - tsx
+ - yaml
vue-chartjs@5.3.1(chart.js@4.4.4)(vue@3.5.12(typescript@5.6.2)):
dependencies:
diff --git a/vite.config.ts b/vite.config.ts
index 5c3fee26b..49f9af926 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -1,50 +1,11 @@
-///
-
-/**
-What's going on with library mode?
-
-Glad you asked, here's a quick rundown:
-
-1. vite-plugin-ruby will automatically bring all the entrypoints like dashbord and widget as input to vite.
-2. vite needs to be in library mode to build the SDK as a single file. (UMD) format and set `inlineDynamicImports` to true.
-3. But when setting `inlineDynamicImports` to true, vite will not be able to handle mutliple entrypoints.
-
-This puts us in a deadlock, now there are two ways around this, either add another separate build pipeline to
-the app using vanilla rollup or rspack or something. The second option is to remove sdk building from the main pipeline
-and build it separately using Vite itself, toggled by an ENV variable.
-
-`BUILD_MODE=library bin/vite build` should build only the SDK and save it to `public/packs/js/sdk.js`
-`bin/vite build` will build the rest of the app as usual. But exclude the SDK.
-
-We need to edit the `asset:precompile` rake task to include the SDK in the precompile list.
-*/
import { defineConfig } from 'vite';
import ruby from 'vite-plugin-ruby';
-import path from 'path';
import vue from '@vitejs/plugin-vue';
+import { aliases, vueOptions } from './vite.shared';
import yaml from '@rollup/plugin-yaml';
-const isLibraryMode = process.env.BUILD_MODE === 'library';
-const isTestMode = process.env.TEST === 'true';
-
-const vueOptions = {
- template: {
- compilerOptions: {
- isCustomElement: tag => ['ninja-keys'].includes(tag),
- },
- },
-};
-
-let plugins = [ruby(), vue(vueOptions), yaml()];
-
-if (isLibraryMode) {
- plugins = [];
-} else if (isTestMode) {
- plugins = [vue(vueOptions), yaml()];
-}
-
export default defineConfig({
- plugins: plugins,
+ plugins: [ruby(), vue(vueOptions), yaml()],
css: {
preprocessorOptions: {
scss: {
@@ -52,74 +13,5 @@ export default defineConfig({
},
},
},
- build: {
- rollupOptions: {
- output: {
- // [NOTE] when not in library mode, no new keys will be addedd or overwritten
- // setting dir: isLibraryMode ? 'public/packs' : undefined will not work
- ...(isLibraryMode
- ? {
- dir: 'public/packs',
- entryFileNames: chunkInfo => {
- if (chunkInfo.name === 'sdk') {
- return 'js/sdk.js';
- }
- return '[name].js';
- },
- }
- : {}),
- inlineDynamicImports: isLibraryMode, // Disable code-splitting for SDK
- },
- },
- lib: isLibraryMode
- ? {
- entry: path.resolve(__dirname, './app/javascript/entrypoints/sdk.js'),
- formats: ['iife'], // IIFE format for single file
- name: 'sdk',
- }
- : undefined,
- },
- resolve: {
- alias: {
- vue: 'vue/dist/vue.esm-bundler.js',
- components: path.resolve('./app/javascript/dashboard/components'),
- next: path.resolve('./app/javascript/dashboard/components-next'),
- v3: path.resolve('./app/javascript/v3'),
- dashboard: path.resolve('./app/javascript/dashboard'),
- helpers: path.resolve('./app/javascript/shared/helpers'),
- shared: path.resolve('./app/javascript/shared'),
- survey: path.resolve('./app/javascript/survey'),
- widget: path.resolve('./app/javascript/widget'),
- assets: path.resolve('./app/javascript/dashboard/assets'),
- },
- },
- test: {
- environment: 'jsdom',
- include: ['app/**/*.{test,spec}.?(c|m)[jt]s?(x)'],
- coverage: {
- reporter: ['lcov', 'text'],
- include: ['app/**/*.js', 'app/**/*.vue'],
- exclude: [
- 'app/**/*.@(spec|stories|routes).js',
- '**/specs/**/*',
- '**/i18n/**/*',
- ],
- },
- globals: true,
- outputFile: 'coverage/sonar-report.xml',
- pool: 'threads',
- poolOptions: {
- threads: {
- singleThread: false,
- },
- },
- server: {
- deps: {
- inline: ['tinykeys', '@material/mwc-icon'],
- },
- },
- setupFiles: ['fake-indexeddb/auto', 'vitest.setup.js'],
- mockReset: true,
- clearMocks: true,
- },
+ resolve: { alias: aliases },
});
diff --git a/vite.lib.config.ts b/vite.lib.config.ts
new file mode 100644
index 000000000..14d73f6ca
--- /dev/null
+++ b/vite.lib.config.ts
@@ -0,0 +1,33 @@
+/*
+ * SDK library build.
+ *
+ * vite-plugin-ruby pulls every entrypoint as input, but the SDK needs to ship
+ * as a single IIFE file (`inlineDynamicImports: true`), which is incompatible
+ * with multiple entrypoints. So the SDK gets its own pipeline:
+ *
+ * vite build --config vite.lib.config.ts → public/packs/js/sdk.js
+ *
+ * The `assets:precompile` rake task runs this alongside the main app build.
+ */
+import { defineConfig } from 'vite';
+import path from 'path';
+import { aliases } from './vite.shared';
+
+export default defineConfig({
+ build: {
+ rollupOptions: {
+ output: {
+ dir: 'public/packs',
+ entryFileNames: chunkInfo =>
+ chunkInfo.name === 'sdk' ? 'js/sdk.js' : '[name].js',
+ inlineDynamicImports: true,
+ },
+ },
+ lib: {
+ entry: path.resolve(__dirname, './app/javascript/entrypoints/sdk.js'),
+ formats: ['iife'],
+ name: 'sdk',
+ },
+ },
+ resolve: { alias: aliases },
+});
diff --git a/vite.shared.ts b/vite.shared.ts
new file mode 100644
index 000000000..d3892d571
--- /dev/null
+++ b/vite.shared.ts
@@ -0,0 +1,22 @@
+import path from 'path';
+
+export const aliases = {
+ vue: 'vue/dist/vue.esm-bundler.js',
+ components: path.resolve('./app/javascript/dashboard/components'),
+ next: path.resolve('./app/javascript/dashboard/components-next'),
+ v3: path.resolve('./app/javascript/v3'),
+ dashboard: path.resolve('./app/javascript/dashboard'),
+ helpers: path.resolve('./app/javascript/shared/helpers'),
+ shared: path.resolve('./app/javascript/shared'),
+ survey: path.resolve('./app/javascript/survey'),
+ widget: path.resolve('./app/javascript/widget'),
+ assets: path.resolve('./app/javascript/dashboard/assets'),
+};
+
+export const vueOptions = {
+ template: {
+ compilerOptions: {
+ isCustomElement: (tag: string) => ['ninja-keys'].includes(tag),
+ },
+ },
+};
diff --git a/vitest.config.ts b/vitest.config.ts
new file mode 100644
index 000000000..5533f3998
--- /dev/null
+++ b/vitest.config.ts
@@ -0,0 +1,39 @@
+///
+import { defineConfig } from 'vitest/config';
+import vue from '@vitejs/plugin-vue';
+import { aliases, vueOptions } from './vite.shared';
+import yaml from '@rollup/plugin-yaml';
+
+export default defineConfig({
+ plugins: [vue(vueOptions), yaml()],
+ resolve: { alias: aliases },
+ test: {
+ environment: 'jsdom',
+ include: ['app/**/*.{test,spec}.?(c|m)[jt]s?(x)'],
+ coverage: {
+ reporter: ['lcov', 'text'],
+ include: ['app/**/*.js', 'app/**/*.vue'],
+ exclude: [
+ 'app/**/*.@(spec|stories|routes).js',
+ '**/specs/**/*',
+ '**/i18n/**/*',
+ ],
+ },
+ globals: true,
+ outputFile: 'coverage/sonar-report.xml',
+ pool: 'threads',
+ poolOptions: {
+ threads: {
+ singleThread: false,
+ },
+ },
+ server: {
+ deps: {
+ inline: ['tinykeys', '@material/mwc-icon'],
+ },
+ },
+ setupFiles: ['fake-indexeddb/auto', 'vitest.setup.js'],
+ mockReset: true,
+ clearMocks: true,
+ },
+});
From 37eed5de1ea2bfd6b51420fb8bf557ff9b2eb4e0 Mon Sep 17 00:00:00 2001
From: Gabriel Jablonski
Date: Tue, 2 Jun 2026 08:33:32 -0300
Subject: [PATCH 17/34] feat(whatsapp): Add support for voice messages (#14606)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
> Reopened from #13613, now from a personal fork
(`gabrieljablonski/chatwoot`) so maintainers can push edits —
organization-owned forks don't support "Allow edits from maintainers".
The previous PR is closed in favor of this one; same commits, same diff.
## Description
This PR adds support for sending voice messages (voice notes) through
the WhatsApp Cloud API. When agents record audio in Chatwoot, it is now
transcoded in the browser from WebM/Opus to OGG/Opus and sent with the
`voice: true` flag, so it appears as a native voice note bubble on
WhatsApp — not as a file/document attachment.
Closes #13283
**Key Changes:**
- Added `webmOpusToOgg.js` — a pure JS EBML parser + OGG page builder
that remuxes browser-recorded WebM/Opus audio into OGG/Opus entirely
client-side, with no server-side dependencies.
- Updated `AudioRecorder.vue` to use an explicit `mimeType` hint, proper
resource cleanup, and an `AUDIO_EXTENSION_MAP` for correct file
extensions.
- Renamed `mp3ConversionUtils.js` → `audioConversionUtils.js` and added
OGG conversion support via the new remuxer.
- Updated `ReplyBox.vue` to request OGG format for WhatsApp channels,
pass `isVoiceMessage` per-attachment, and handle recording errors with a
user-facing alert.
- Updated `MessageBuilder` to read the `is_voice_message` param and
persist it in attachment metadata.
- Updated `WhatsappCloudService` to:
- Normalize `audio/opus` → `audio/ogg` content type on ActiveStorage
blobs (works around Marcel gem re-detection).
- Send the `voice: true` flag when the attachment is a voice message
with `audio/ogg` content type.
- Use WhatsApp Cloud API `v24.0` for the attachment endpoint.
- Added `AUDIO_CONVERSION_FAILED` i18n key.
**How it works:**
1. The browser records audio as WebM/Opus (Chrome/Firefox default).
2. `audioConversionUtils.js` remuxes it to OGG/Opus using the pure-JS
`webmOpusToOgg` remuxer — no server transcoding needed.
3. The OGG file is uploaded with `is_voice_message: true` in the form
payload.
4. `MessageBuilder` persists `is_voice_message` in the attachment's
`meta` hash.
5. `WhatsappCloudService` normalizes the blob content type if needed,
then sends the attachment with `voice: true` so WhatsApp renders it as a
voice note.
## Type of change
- [X] New feature (non-breaking change which adds functionality)
## How Has This Been Tested?
1. Record a voice message in a WhatsApp Cloud conversation.
2. Verify the audio is transcoded to OGG (check file extension in the
attachment preview).
3. Verify the message arrives on WhatsApp as a voice note bubble (not a
document/file).
4. Send an image or document attachment and verify it still works as
before (no `voice` flag).
5. Send a regular (non-voice) audio file and verify it arrives without
the voice flag.
---------
Co-authored-by: Muhsin Keloth
Co-authored-by: Muhsin <12408980+muhsin-k@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 (1M context)
---
app/builders/messages/message_builder.rb | 24 +-
app/javascript/dashboard/api/inbox/message.js | 6 +
.../dashboard/api/specs/inbox/message.spec.js | 24 +
.../components/widgets/AttachmentsPreview.vue | 4 +-
.../widgets/WootWriter/AudioRecorder.vue | 78 ++-
...ersionUtils.js => audioConversionUtils.js} | 16 +
.../widgets/WootWriter/utils/webmOpusToOgg.js | 457 ++++++++++++++++++
.../widgets/conversation/ReplyBox.vue | 22 +-
.../i18n/locale/en/conversation.json | 1 +
.../providers/whatsapp_cloud_service.rb | 40 +-
.../builders/messages/message_builder_spec.rb | 29 ++
.../providers/whatsapp_cloud_service_spec.rb | 39 +-
12 files changed, 696 insertions(+), 44 deletions(-)
rename app/javascript/dashboard/components/widgets/WootWriter/utils/{mp3ConversionUtils.js => audioConversionUtils.js} (85%)
create mode 100644 app/javascript/dashboard/components/widgets/WootWriter/utils/webmOpusToOgg.js
diff --git a/app/builders/messages/message_builder.rb b/app/builders/messages/message_builder.rb
index 7df72e14a..297e77fcc 100644
--- a/app/builders/messages/message_builder.rb
+++ b/app/builders/messages/message_builder.rb
@@ -13,6 +13,7 @@ class Messages::MessageBuilder
@account = conversation.account
@message_type = params[:message_type] || 'outgoing'
@attachments = params[:attachments]
+ @is_voice_message = ActiveModel::Type::Boolean.new.cast(params[:is_voice_message])
@automation_rule = content_attributes&.dig(:automation_rule_id)
return unless params.instance_of?(ActionController::Parameters)
@@ -56,16 +57,25 @@ class Messages::MessageBuilder
file: uploaded_attachment
)
- attachment.file_type = if uploaded_attachment.is_a?(String)
- file_type_by_signed_id(
- uploaded_attachment
- )
- else
- file_type(uploaded_attachment&.content_type)
- end
+ attachment.file_type = attachment_file_type(uploaded_attachment)
+ tag_voice_message(attachment)
end
end
+ def attachment_file_type(uploaded_attachment)
+ if uploaded_attachment.is_a?(String)
+ file_type_by_signed_id(uploaded_attachment)
+ else
+ file_type(uploaded_attachment&.content_type)
+ end
+ end
+
+ def tag_voice_message(attachment)
+ return unless @is_voice_message && attachment.file_type == 'audio'
+
+ attachment.meta = (attachment.meta || {}).merge('is_voice_message' => true)
+ end
+
def process_emails
return unless @conversation.inbox&.inbox_type == 'Email'
diff --git a/app/javascript/dashboard/api/inbox/message.js b/app/javascript/dashboard/api/inbox/message.js
index 8f294a0ee..06b85078e 100644
--- a/app/javascript/dashboard/api/inbox/message.js
+++ b/app/javascript/dashboard/api/inbox/message.js
@@ -12,6 +12,7 @@ export const buildCreatePayload = ({
bccEmails = '',
toEmails = '',
templateParams,
+ isVoiceMessage = false,
}) => {
let payload;
if (files && files.length !== 0) {
@@ -33,6 +34,9 @@ export const buildCreatePayload = ({
if (contentAttributes) {
payload.append('content_attributes', JSON.stringify(contentAttributes));
}
+ if (isVoiceMessage) {
+ payload.append('is_voice_message', true);
+ }
} else {
payload = {
content: message,
@@ -64,6 +68,7 @@ class MessageApi extends ApiClient {
bccEmails = '',
toEmails = '',
templateParams,
+ isVoiceMessage = false,
}) {
return axios({
method: 'post',
@@ -78,6 +83,7 @@ class MessageApi extends ApiClient {
bccEmails,
toEmails,
templateParams,
+ isVoiceMessage,
}),
});
}
diff --git a/app/javascript/dashboard/api/specs/inbox/message.spec.js b/app/javascript/dashboard/api/specs/inbox/message.spec.js
index 941f5c99c..84c0b9cf2 100644
--- a/app/javascript/dashboard/api/specs/inbox/message.spec.js
+++ b/app/javascript/dashboard/api/specs/inbox/message.spec.js
@@ -83,5 +83,29 @@ describe('#ConversationAPI', () => {
template_params: undefined,
});
});
+
+ it('appends is_voice_message when isVoiceMessage is true', () => {
+ const formPayload = buildCreatePayload({
+ message: 'voice message',
+ echoId: 42,
+ isPrivate: false,
+ files: [new Blob(['audio-data'], { type: 'audio/ogg' })],
+ isVoiceMessage: true,
+ });
+ expect(formPayload).toBeInstanceOf(FormData);
+ expect(formPayload.get('is_voice_message')).toEqual('true');
+ });
+
+ it('does not append is_voice_message when isVoiceMessage is false', () => {
+ const formPayload = buildCreatePayload({
+ message: 'regular audio',
+ echoId: 43,
+ isPrivate: false,
+ files: [new Blob(['audio-data'], { type: 'audio/ogg' })],
+ isVoiceMessage: false,
+ });
+ expect(formPayload).toBeInstanceOf(FormData);
+ expect(formPayload.get('is_voice_message')).toBeNull();
+ });
});
});
diff --git a/app/javascript/dashboard/components/widgets/AttachmentsPreview.vue b/app/javascript/dashboard/components/widgets/AttachmentsPreview.vue
index c924dd65d..c39adcab3 100644
--- a/app/javascript/dashboard/components/widgets/AttachmentsPreview.vue
+++ b/app/javascript/dashboard/components/widgets/AttachmentsPreview.vue
@@ -14,11 +14,11 @@ const props = defineProps({
const emit = defineEmits(['removeAttachment']);
const nonRecordedAudioAttachments = computed(() => {
- return props.attachments.filter(attachment => !attachment?.isRecordedAudio);
+ return props.attachments.filter(attachment => !attachment?.isVoiceMessage);
});
const recordedAudioAttachments = computed(() =>
- props.attachments.filter(attachment => attachment.isRecordedAudio)
+ props.attachments.filter(attachment => attachment.isVoiceMessage)
);
const onRemoveAttachment = itemIndex => {
diff --git a/app/javascript/dashboard/components/widgets/WootWriter/AudioRecorder.vue b/app/javascript/dashboard/components/widgets/WootWriter/AudioRecorder.vue
index b0428ecdb..50bbc6ba4 100644
--- a/app/javascript/dashboard/components/widgets/WootWriter/AudioRecorder.vue
+++ b/app/javascript/dashboard/components/widgets/WootWriter/AudioRecorder.vue
@@ -4,7 +4,7 @@ import { ref, onMounted, onUnmounted } from 'vue';
import WaveSurfer from 'wavesurfer.js';
import RecordPlugin from 'wavesurfer.js/dist/plugins/record.js';
import { format, intervalToDuration } from 'date-fns';
-import { convertAudio } from './utils/mp3ConversionUtils';
+import { convertAudio } from './utils/audioConversionUtils';
const props = defineProps({
audioRecordFormat: {
@@ -18,6 +18,7 @@ const emit = defineEmits([
'finishRecord',
'pause',
'play',
+ 'recordError',
]);
const waveformContainer = ref(null);
@@ -26,6 +27,7 @@ const record = ref(null);
const isRecording = ref(false);
const isPlaying = ref(false);
const hasRecording = ref(false);
+const recordedAudioUrl = ref(null);
const formatTimeProgress = time => {
const duration = intervalToDuration({ start: 0, end: time });
@@ -35,6 +37,28 @@ const formatTimeProgress = time => {
);
};
+const AUDIO_EXTENSION_MAP = {
+ 'audio/ogg': 'ogg',
+ 'audio/mp3': 'mp3',
+ 'audio/mpeg': 'mp3',
+ 'audio/wav': 'wav',
+ 'audio/webm': 'webm',
+};
+
+const getRecordPluginOptions = audioFormat => {
+ const options = {
+ scrollingWaveform: true,
+ renderRecordedAudio: false,
+ };
+ if (
+ audioFormat === 'audio/ogg' &&
+ MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')
+ ) {
+ options.mimeType = 'audio/ogg;codecs=opus';
+ }
+ return options;
+};
+
const initWaveSurfer = () => {
wavesurfer.value = WaveSurfer.create({
container: waveformContainer.value,
@@ -45,10 +69,7 @@ const initWaveSurfer = () => {
barGap: 1,
barRadius: 2,
plugins: [
- RecordPlugin.create({
- scrollingWaveform: true,
- renderRecordedAudio: false,
- }),
+ RecordPlugin.create(getRecordPluginOptions(props.audioRecordFormat)),
],
});
@@ -62,21 +83,34 @@ const initWaveSurfer = () => {
});
record.value.on('record-end', async blob => {
- const audioUrl = URL.createObjectURL(blob);
- const audioBlob = await convertAudio(blob, props.audioRecordFormat);
- const fileName = `${getUuid()}.mp3`;
- const file = new File([audioBlob], fileName, {
- type: props.audioRecordFormat,
- });
- wavesurfer.value.load(audioUrl);
- emit('finishRecord', {
- name: file.name,
- type: file.type,
- size: file.size,
- file,
- });
- hasRecording.value = true;
- isRecording.value = false;
+ try {
+ const audioBlob = await convertAudio(blob, props.audioRecordFormat);
+ // Use the converted blob's actual type, which may differ from the
+ // requested format when the browser can't produce it (e.g. Safari falls
+ // back to MP3 instead of OGG). This keeps the filename, content type, and
+ // voice-note flag consistent with the real bytes.
+ const audioType = audioBlob.type || props.audioRecordFormat;
+ const ext = AUDIO_EXTENSION_MAP[audioType] || 'mp3';
+ const fileName = `${getUuid()}.${ext}`;
+ const file = new File([audioBlob], fileName, {
+ type: audioType,
+ });
+ if (recordedAudioUrl.value) URL.revokeObjectURL(recordedAudioUrl.value);
+ recordedAudioUrl.value = URL.createObjectURL(audioBlob);
+ wavesurfer.value.load(recordedAudioUrl.value);
+ emit('finishRecord', {
+ name: file.name,
+ type: file.type,
+ size: file.size,
+ file,
+ });
+ hasRecording.value = true;
+ isRecording.value = false;
+ } catch (error) {
+ isRecording.value = false;
+ hasRecording.value = false;
+ emit('recordError', { error });
+ }
});
record.value.on('record-progress', time => {
@@ -109,6 +143,10 @@ onMounted(() => {
});
onUnmounted(() => {
+ if (recordedAudioUrl.value) {
+ URL.revokeObjectURL(recordedAudioUrl.value);
+ recordedAudioUrl.value = null;
+ }
if (wavesurfer.value) {
wavesurfer.value.destroy();
}
diff --git a/app/javascript/dashboard/components/widgets/WootWriter/utils/mp3ConversionUtils.js b/app/javascript/dashboard/components/widgets/WootWriter/utils/audioConversionUtils.js
similarity index 85%
rename from app/javascript/dashboard/components/widgets/WootWriter/utils/mp3ConversionUtils.js
rename to app/javascript/dashboard/components/widgets/WootWriter/utils/audioConversionUtils.js
index 3ae37911d..1b0884cbe 100644
--- a/app/javascript/dashboard/components/widgets/WootWriter/utils/mp3ConversionUtils.js
+++ b/app/javascript/dashboard/components/widgets/WootWriter/utils/audioConversionUtils.js
@@ -1,5 +1,7 @@
import lamejs from '@breezystack/lamejs';
+import { remuxWebmToOgg } from './webmOpusToOgg';
+
const writeString = (view, offset, string) => {
// eslint-disable-next-line no-plusplus
for (let i = 0; i < string.length; i++) {
@@ -139,6 +141,20 @@ export const convertAudio = async (inputBlob, outputFormat, bitrate = 128) => {
audio = await convertToWav(inputBlob);
} else if (outputFormat === 'audio/mp3') {
audio = await convertToMp3(inputBlob, bitrate);
+ } else if (outputFormat === 'audio/ogg') {
+ const inputType = inputBlob.type.split(';')[0].trim();
+ if (inputType === 'audio/webm' || inputType === 'video/webm') {
+ audio = await remuxWebmToOgg(inputBlob);
+ } else if (inputType === 'audio/ogg') {
+ audio = inputBlob;
+ } else {
+ // Browsers that record neither WebM nor OGG (e.g. Safari records
+ // audio/mp4) cannot produce OGG/Opus. Fall back to MP3 so the recording
+ // still sends as a regular audio message instead of failing. The caller
+ // keys the voice-note flag off the returned blob type, so an MP3 result
+ // is never mislabeled as an OGG/Opus voice note.
+ audio = await convertToMp3(inputBlob, bitrate);
+ }
} else {
throw new Error('Unsupported output format');
}
diff --git a/app/javascript/dashboard/components/widgets/WootWriter/utils/webmOpusToOgg.js b/app/javascript/dashboard/components/widgets/WootWriter/utils/webmOpusToOgg.js
new file mode 100644
index 000000000..6f8ca087a
--- /dev/null
+++ b/app/javascript/dashboard/components/widgets/WootWriter/utils/webmOpusToOgg.js
@@ -0,0 +1,457 @@
+/* eslint-disable no-bitwise */
+/**
+ * WebM/Opus → OGG/Opus remuxer
+ *
+ * Chrome's MediaRecorder produces WebM containers even when
+ * `audio/ogg;codecs=opus` is requested. WhatsApp Cloud API requires
+ * proper OGG/Opus files for voice messages.
+ *
+ * This module extracts raw Opus packets from the WebM (EBML) container
+ * and repackages them into a valid OGG bitstream. The audio data itself
+ * is never re-encoded — only the container format changes.
+ *
+ * References:
+ * EBML (container for WebM): RFC 8794 — https://www.rfc-editor.org/rfc/rfc8794
+ * Matroska/WebM elements: https://www.matroska.org/technical/elements.html
+ * OGG bitstream framing: RFC 3533 — https://www.rfc-editor.org/rfc/rfc3533
+ * Opus codec: RFC 6716 — https://www.rfc-editor.org/rfc/rfc6716
+ * Opus in OGG (OpusHead/Tags): RFC 7845 — https://www.rfc-editor.org/rfc/rfc7845
+ */
+
+// ======================== EBML / WebM parser ========================
+
+const EBML_IDS = {
+ Segment: 0x18538067,
+ SegmentInfo: 0x1549a966,
+ Tracks: 0x1654ae6b,
+ TrackEntry: 0xae,
+ CodecPrivate: 0x63a2,
+ Audio: 0xe1,
+ SamplingFrequency: 0xb5,
+ Channels: 0x9f,
+ Cluster: 0x1f43b675,
+ Timecode: 0xe7,
+ SimpleBlock: 0xa3,
+ BlockGroup: 0xa0,
+ Block: 0xa1,
+};
+
+const MASTER_ELEMENTS = new Set([
+ 0x1a45dfa3, // EBML header
+ EBML_IDS.Segment,
+ EBML_IDS.SegmentInfo,
+ EBML_IDS.Tracks,
+ EBML_IDS.TrackEntry,
+ EBML_IDS.Audio,
+ EBML_IDS.Cluster,
+ EBML_IDS.BlockGroup,
+]);
+
+/** Read an EBML variable-length integer (data size). */
+function readVint(data, pos) {
+ if (pos >= data.length) return null;
+ const first = data[pos];
+ if (first === 0) return null;
+
+ let len = 1;
+ let mask = 0x80;
+ while (len <= 8 && !(first & mask)) {
+ len += 1;
+ mask >>= 1;
+ }
+ if (len > 8 || pos + len > data.length) return null;
+
+ let value = first & (mask - 1);
+ for (let i = 1; i < len; i += 1) {
+ value = value * 256 + data[pos + i];
+ }
+ return { value, length: len };
+}
+
+/** Read an EBML element ID (leading marker bits are kept). */
+function readElementId(data, pos) {
+ if (pos >= data.length) return null;
+ const first = data[pos];
+ if (first === 0) return null;
+
+ let len = 1;
+ let mask = 0x80;
+ while (len <= 4 && !(first & mask)) {
+ len += 1;
+ mask >>= 1;
+ }
+ if (len > 4 || pos + len > data.length) return null;
+
+ let id = first;
+ for (let i = 1; i < len; i += 1) {
+ id = id * 256 + data[pos + i];
+ }
+ return { id, length: len };
+}
+
+function readUintBE(data, offset, length) {
+ let v = 0;
+ for (let i = 0; i < length; i += 1) v = v * 256 + data[offset + i];
+ return v;
+}
+
+function readFloatBE(data, offset, length) {
+ if (length !== 4 && length !== 8) return NaN;
+ const buf = new ArrayBuffer(length);
+ const u8 = new Uint8Array(buf);
+ for (let i = 0; i < length; i += 1) u8[i] = data[offset + i];
+ const view = new DataView(buf);
+ return length === 4 ? view.getFloat32(0) : view.getFloat64(0);
+}
+
+/** Extract the raw Opus frame from a SimpleBlock / Block element. */
+function extractFrameFromBlock(data, offset, end) {
+ const trackVint = readVint(data, offset);
+ if (!trackVint) return null;
+ let pos = offset + trackVint.length;
+
+ // int16 relative timecode (big-endian, signed) – skip
+ pos += 2;
+ // Flags byte – skip. Lacing (Xiph/EBML/fixed-size) is NOT supported;
+ // this assumes single-frame blocks as produced by MediaRecorder.
+ const flags = data[pos];
+ const lacingBits = (flags >> 1) & 0x03;
+ if (lacingBits !== 0) {
+ // eslint-disable-next-line no-console
+ console.warn(
+ 'webmOpusToOgg: laced SimpleBlock detected (unsupported), frame may be invalid'
+ );
+ }
+ pos += 1;
+
+ if (pos >= end) return null;
+ return data.slice(pos, end);
+}
+
+/**
+ * Walk the EBML tree and collect metadata + Opus frames.
+ * We only descend into master elements and only extract the fields we need.
+ */
+function parseWebM(buffer) {
+ const data = new Uint8Array(buffer);
+ const result = {
+ channels: 1,
+ sampleRate: 48000,
+ codecPrivate: null,
+ frames: [],
+ };
+
+ function walk(start, end) {
+ let pos = start;
+ while (pos < end) {
+ const idRes = readElementId(data, pos);
+ if (!idRes) break;
+ pos += idRes.length;
+
+ const sizeRes = readVint(data, pos);
+ if (!sizeRes) break;
+ pos += sizeRes.length;
+
+ // Handle "unknown size" (all-ones VINT) by treating it as the rest of the parent
+ // Use Math.pow instead of bit-shift to avoid 32-bit overflow for 5+ byte VINTs
+ const maxVint = 2 ** (7 * sizeRes.length) - 1;
+ const elEnd =
+ sizeRes.value === maxVint ? end : Math.min(pos + sizeRes.value, end);
+
+ if (MASTER_ELEMENTS.has(idRes.id)) {
+ walk(pos, elEnd);
+ } else {
+ switch (idRes.id) {
+ case EBML_IDS.Channels:
+ result.channels = readUintBE(data, pos, sizeRes.value);
+ break;
+ case EBML_IDS.SamplingFrequency:
+ result.sampleRate = readFloatBE(data, pos, sizeRes.value);
+ break;
+ case EBML_IDS.CodecPrivate:
+ result.codecPrivate = data.slice(pos, elEnd);
+ break;
+ case EBML_IDS.SimpleBlock:
+ case EBML_IDS.Block: {
+ const frame = extractFrameFromBlock(data, pos, elEnd);
+ if (frame && frame.length > 0) result.frames.push(frame);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ pos = elEnd;
+ }
+ }
+
+ walk(0, data.length);
+ return result;
+}
+
+// ======================== OGG writer ========================
+
+/** OGG CRC-32 table (polynomial 0x04C11DB7). */
+const CRC_TABLE = (() => {
+ const t = new Uint32Array(256);
+ for (let i = 0; i < 256; i += 1) {
+ let c = i << 24;
+ for (let j = 0; j < 8; j += 1) {
+ c = ((c << 1) ^ (c & 0x80000000 ? 0x04c11db7 : 0)) >>> 0;
+ }
+ t[i] = c;
+ }
+ return t;
+})();
+
+function oggCrc32(bytes) {
+ let crc = 0;
+ for (let i = 0; i < bytes.length; i += 1) {
+ crc = (CRC_TABLE[((crc >>> 24) ^ bytes[i]) & 0xff] ^ (crc << 8)) >>> 0;
+ }
+ return crc;
+}
+
+/**
+ * Build one OGG page.
+ *
+ * @param {number} headerType 0x02 = BOS, 0x04 = EOS, 0x00 = normal
+ * @param {number} granulePosition 48 kHz sample count
+ * @param {number} serialNumber logical stream id
+ * @param {number} pageSeq page sequence counter
+ * @param {Uint8Array[]} packets one or more complete Opus packets
+ */
+function createOggPage(
+ headerType,
+ granulePosition,
+ serialNumber,
+ pageSeq,
+ packets
+) {
+ // Build the lacing / segment table
+ const segTable = [];
+ let dataLen = 0;
+ packets.forEach(pkt => {
+ let rem = pkt.length;
+ while (rem >= 255) {
+ segTable.push(255);
+ rem -= 255;
+ }
+ segTable.push(rem); // final segment (0 when pkt.length is a multiple of 255)
+ dataLen += pkt.length;
+ });
+
+ const hdrLen = 27 + segTable.length;
+ const page = new Uint8Array(hdrLen + dataLen);
+ const dv = new DataView(page.buffer);
+
+ // Capture pattern
+ page.set([0x4f, 0x67, 0x67, 0x53]); // "OggS"
+ page[4] = 0; // version
+ page[5] = headerType;
+
+ // Granule position (int64 LE)
+ dv.setUint32(6, granulePosition & 0xffffffff, true);
+ dv.setUint32(
+ 10,
+ Math.floor(granulePosition / 0x100000000) & 0xffffffff,
+ true
+ );
+
+ dv.setUint32(14, serialNumber, true); // serial
+ dv.setUint32(18, pageSeq, true); // page sequence
+ dv.setUint32(22, 0, true); // CRC placeholder
+
+ page[26] = segTable.length;
+ for (let i = 0; i < segTable.length; i += 1) page[27 + i] = segTable[i];
+
+ let off = hdrLen;
+ packets.forEach(pkt => {
+ page.set(pkt, off);
+ off += pkt.length;
+ });
+
+ // Fill in the CRC
+ dv.setUint32(22, oggCrc32(page), true);
+ return page;
+}
+
+// ======================== Opus helpers ========================
+
+/** Lookup table: frame duration in ms for each Opus TOC config index (0-31). */
+const OPUS_FRAME_MS = [
+ 10,
+ 20,
+ 40,
+ 60, // 0-3 SILK NB
+ 10,
+ 20,
+ 40,
+ 60, // 4-7 SILK MB
+ 10,
+ 20,
+ 40,
+ 60, // 8-11 SILK WB
+ 10,
+ 20, // 12-13 Hybrid SWB
+ 10,
+ 20, // 14-15 Hybrid FB
+ 2.5,
+ 5,
+ 10,
+ 20, // 16-19 CELT NB
+ 2.5,
+ 5,
+ 10,
+ 20, // 20-23 CELT WB
+ 2.5,
+ 5,
+ 10,
+ 20, // 24-27 CELT SWB
+ 2.5,
+ 5,
+ 10,
+ 20, // 28-31 CELT FB
+];
+
+/** Return the total number of 48 kHz PCM samples represented by an Opus packet. */
+function opusPacketSamples(pkt) {
+ if (!pkt || pkt.length === 0) return 960; // default 20 ms
+ const toc = pkt[0];
+ const config = (toc >> 3) & 0x1f;
+ const code = toc & 0x03;
+
+ const samplesPerFrame = ((OPUS_FRAME_MS[config] || 20) * 48000) / 1000;
+ let frameCount;
+ if (code <= 1) frameCount = code + 1;
+ else if (code === 2) frameCount = 2;
+ else frameCount = pkt.length >= 2 ? pkt[1] & 0x3f : 1;
+
+ return samplesPerFrame * frameCount;
+}
+
+function buildOpusHead(channels, sampleRate, preSkip) {
+ const buf = new Uint8Array(19);
+ const dv = new DataView(buf.buffer);
+ buf.set(new TextEncoder().encode('OpusHead'));
+ buf[8] = 1; // version
+ buf[9] = channels;
+ dv.setUint16(10, preSkip, true);
+ dv.setUint32(12, sampleRate, true);
+ dv.setInt16(16, 0, true); // output gain
+ buf[18] = 0; // channel mapping family
+ return buf;
+}
+
+function buildOpusTags() {
+ const vendor = new TextEncoder().encode('chatwoot');
+ const buf = new Uint8Array(8 + 4 + vendor.length + 4);
+ const dv = new DataView(buf.buffer);
+ buf.set(new TextEncoder().encode('OpusTags'));
+ dv.setUint32(8, vendor.length, true);
+ buf.set(vendor, 12);
+ dv.setUint32(12 + vendor.length, 0, true); // 0 user comments
+ return buf;
+}
+
+// ======================== Public API ========================
+
+const MAX_FRAMES_PER_PAGE = 50; // ~1 s at 20 ms/frame
+const MAX_SEGMENTS_PER_PAGE = 255;
+
+/**
+ * Remux a WebM/Opus blob into an OGG/Opus blob.
+ * If the input is already OGG (starts with "OggS"), it is returned as-is.
+ *
+ * @param {Blob} webmBlob
+ * @returns {Promise} OGG/Opus blob
+ */
+export async function remuxWebmToOgg(webmBlob) {
+ const buffer = await webmBlob.arrayBuffer();
+ const bytes = new Uint8Array(buffer);
+
+ // Already OGG? Return unchanged.
+ if (
+ bytes.length >= 4 &&
+ bytes[0] === 0x4f &&
+ bytes[1] === 0x67 &&
+ bytes[2] === 0x67 &&
+ bytes[3] === 0x53
+ ) {
+ return webmBlob;
+ }
+
+ const { channels, sampleRate, codecPrivate, frames } = parseWebM(buffer);
+ if (frames.length === 0) {
+ throw new Error('No Opus frames found in WebM input');
+ }
+
+ // Extract pre-skip from the WebM CodecPrivate (which IS the OpusHead)
+ let preSkip = 312;
+ if (codecPrivate && codecPrivate.length >= 12) {
+ const magic = new TextDecoder().decode(codecPrivate.slice(0, 8));
+ if (magic === 'OpusHead') {
+ preSkip = new DataView(
+ codecPrivate.buffer,
+ codecPrivate.byteOffset,
+ codecPrivate.length
+ ).getUint16(10, true);
+ }
+ }
+
+ const serial = (Math.random() * 0x100000000) >>> 0;
+ let pageSeq = 0;
+ const pages = [];
+
+ // Page 0 – OpusHead (BOS)
+ pages.push(
+ createOggPage(0x02, 0, serial, pageSeq, [
+ buildOpusHead(channels, sampleRate, preSkip),
+ ])
+ );
+ pageSeq += 1;
+
+ // Page 1 – OpusTags
+ pages.push(createOggPage(0x00, 0, serial, pageSeq, [buildOpusTags()]));
+ pageSeq += 1;
+
+ // Audio pages
+ let granule = 0;
+ let idx = 0;
+
+ while (idx < frames.length) {
+ const packets = [];
+ let segs = 0;
+
+ while (idx < frames.length && packets.length < MAX_FRAMES_PER_PAGE) {
+ const pkt = frames[idx];
+ // createOggPage always appends a terminating lacing value, so a packet
+ // spans floor(len/255)+1 segments (including the extra 0 when len is an
+ // exact multiple of 255). Math.ceil would undercount those cases.
+ const pktSegs = Math.floor(pkt.length / 255) + 1;
+ if (segs + pktSegs > MAX_SEGMENTS_PER_PAGE && packets.length > 0) break;
+
+ packets.push(pkt);
+ segs += pktSegs;
+ granule += opusPacketSamples(pkt);
+ idx += 1;
+ }
+
+ const isLast = idx >= frames.length;
+ pages.push(
+ createOggPage(isLast ? 0x04 : 0x00, granule, serial, pageSeq, packets)
+ );
+ pageSeq += 1;
+ }
+
+ // Concatenate pages into a single buffer
+ const total = pages.reduce((s, p) => s + p.length, 0);
+ const out = new Uint8Array(total);
+ let off = 0;
+ pages.forEach(p => {
+ out.set(p, off);
+ off += p.length;
+ });
+
+ return new Blob([out], { type: 'audio/ogg' });
+}
diff --git a/app/javascript/dashboard/components/widgets/conversation/ReplyBox.vue b/app/javascript/dashboard/components/widgets/conversation/ReplyBox.vue
index 7f10190e6..17f5559f1 100644
--- a/app/javascript/dashboard/components/widgets/conversation/ReplyBox.vue
+++ b/app/javascript/dashboard/components/widgets/conversation/ReplyBox.vue
@@ -375,7 +375,10 @@ export default {
return `draft-${this.conversationIdByRoute}-${this.replyType}`;
},
audioRecordFormat() {
- if (this.isAWhatsAppChannel || this.isATelegramChannel) {
+ if (this.isAWhatsAppChannel) {
+ return AUDIO_FORMATS.OGG;
+ }
+ if (this.isATelegramChannel) {
return AUDIO_FORMATS.MP3;
}
if (this.isAPIInbox) {
@@ -1008,14 +1011,18 @@ export default {
onFinishRecorder(file) {
this.recordingAudioState = 'stopped';
this.hasRecordedAudio = true;
- // Added a new key isRecordedAudio to the file to find it's and recorded audio
+ // Added a new key isVoiceMessage to the file to identify recorded audio
// Because to filter and show only non recorded audio and other attachments
const autoRecordedFile = {
...file,
- isRecordedAudio: true,
+ isVoiceMessage: true,
};
return file && this.onFileUpload(autoRecordedFile);
},
+ onRecordError() {
+ this.toggleAudioRecorder();
+ useAlert(this.$t('CONVERSATION.REPLYBOX.AUDIO_CONVERSION_FAILED'));
+ },
toggleTyping(status) {
const conversationId = this.currentChat.id;
const isPrivate = this.isPrivate;
@@ -1042,7 +1049,7 @@ export default {
isPrivate: this.isPrivate,
thumb: reader.result,
blobSignedId: blob ? blob.signed_id : undefined,
- isRecordedAudio: file?.isRecordedAudio || false,
+ isVoiceMessage: file?.isVoiceMessage || false,
});
};
},
@@ -1078,6 +1085,7 @@ export default {
private: false,
message: caption,
sender: this.sender,
+ isVoiceMessage: attachment.isVoiceMessage || false,
};
attachmentPayload = this.setReplyToInPayload(attachmentPayload);
@@ -1127,6 +1135,9 @@ export default {
this.attachedFiles.forEach(attachment => {
if (this.globalConfig.directUploadsEnabled) {
messagePayload.files.push(attachment.blobSignedId);
+ if (attachment.isVoiceMessage) {
+ messagePayload.isVoiceMessage = true;
+ }
} else {
messagePayload.files.push(attachment.resource.file);
}
@@ -1215,7 +1226,7 @@ export default {
this.hasRecordedAudio = false;
// Only clear the recorded audio when we click toggle button.
this.attachedFiles = this.attachedFiles.filter(
- file => !file?.isRecordedAudio
+ file => !file?.isVoiceMessage
);
},
toggleEditorSize() {
@@ -1293,6 +1304,7 @@ export default {
:audio-record-format="audioRecordFormat"
@recorder-progress-changed="onRecordProgressChanged"
@finish-record="onFinishRecorder"
+ @record-error="onRecordError"
@play="recordingAudioState = 'playing'"
@pause="recordingAudioState = 'paused'"
/>
diff --git a/app/javascript/dashboard/i18n/locale/en/conversation.json b/app/javascript/dashboard/i18n/locale/en/conversation.json
index daf49ab59..7b1b49493 100644
--- a/app/javascript/dashboard/i18n/locale/en/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/en/conversation.json
@@ -231,6 +231,7 @@
"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",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
diff --git a/app/services/whatsapp/providers/whatsapp_cloud_service.rb b/app/services/whatsapp/providers/whatsapp_cloud_service.rb
index 225242fc5..7981f54b5 100644
--- a/app/services/whatsapp/providers/whatsapp_cloud_service.rb
+++ b/app/services/whatsapp/providers/whatsapp_cloud_service.rb
@@ -90,8 +90,8 @@ class Whatsapp::Providers::WhatsappCloudService < Whatsapp::Providers::BaseServi
end
# TODO: See if we can unify the API versions and for both paths and make it consistent with out facebook app API versions
- def phone_id_path
- "#{api_base_path}/v13.0/#{whatsapp_channel.provider_config['phone_number_id']}"
+ def phone_id_path(version = 'v13.0')
+ "#{api_base_path}/#{version}/#{whatsapp_channel.provider_config['phone_number_id']}"
end
def business_account_path
@@ -116,14 +116,11 @@ class Whatsapp::Providers::WhatsappCloudService < Whatsapp::Providers::BaseServi
def send_attachment_message(phone_number, message)
attachment = message.attachments.first
+ normalize_opus_content_type(attachment)
type = %w[image audio video].include?(attachment.file_type) ? attachment.file_type : 'document'
- type_content = {
- 'link': attachment.download_url
- }
- type_content['caption'] = message.outgoing_content unless %w[audio sticker].include?(type)
- type_content['filename'] = attachment.file.filename if type == 'document'
+ type_content = build_attachment_content(type, attachment, message)
response = HTTParty.post(
- "#{phone_id_path}/messages",
+ "#{phone_id_path('v24.0')}/messages",
headers: api_headers,
body: {
:messaging_product => 'whatsapp',
@@ -142,6 +139,33 @@ class Whatsapp::Providers::WhatsappCloudService < Whatsapp::Providers::BaseServi
response.parsed_response&.dig('error', 'message')
end
+ def voice_message?(type, attachment)
+ type == 'audio' && attachment.meta&.dig('is_voice_message') && attachment.file.content_type == 'audio/ogg'
+ end
+
+ # Marcel gem may re-detect OGG/Opus files as audio/opus after ActiveStorage
+ # blob attachment, but WhatsApp Cloud API requires audio/ogg content type
+ # for voice messages. Normalize so the download URL serves the correct
+ # Content-Type header. No-op when the frontend already uploads as audio/ogg.
+ def normalize_opus_content_type(attachment)
+ return unless attachment.file.attached?
+
+ blob = attachment.file.blob
+ return unless blob.content_type == 'audio/opus'
+
+ return if blob.update(content_type: 'audio/ogg')
+
+ Rails.logger.error("Failed to normalize blob #{blob.id} content_type from audio/opus to audio/ogg")
+ end
+
+ def build_attachment_content(type, attachment, message)
+ type_content = { 'link' => attachment.download_url }
+ type_content['caption'] = message.outgoing_content unless %w[audio sticker].include?(type)
+ type_content['filename'] = attachment.file.filename if type == 'document'
+ type_content['voice'] = true if voice_message?(type, attachment)
+ type_content
+ end
+
def template_body_parameters(template_info)
template_body = {
name: template_info[:name],
diff --git a/spec/builders/messages/message_builder_spec.rb b/spec/builders/messages/message_builder_spec.rb
index e61198b60..671604ad4 100644
--- a/spec/builders/messages/message_builder_spec.rb
+++ b/spec/builders/messages/message_builder_spec.rb
@@ -149,6 +149,35 @@ describe Messages::MessageBuilder do
end
end
+ context 'when is_voice_message is true' do
+ let(:params) do
+ ActionController::Parameters.new({
+ content: 'test',
+ attachments: [Rack::Test::UploadedFile.new('spec/assets/sample.ogg', 'audio/ogg')],
+ is_voice_message: true
+ })
+ end
+
+ it 'sets is_voice_message in attachment meta' do
+ message = message_builder
+ expect(message.attachments.first.meta).to include('is_voice_message' => true)
+ end
+ end
+
+ context 'when is_voice_message is not provided' do
+ let(:params) do
+ ActionController::Parameters.new({
+ content: 'test',
+ attachments: [Rack::Test::UploadedFile.new('spec/assets/avatar.png', 'image/png')]
+ })
+ end
+
+ it 'does not set is_voice_message in attachment meta' do
+ message = message_builder
+ expect(message.attachments.first.meta).not_to include('is_voice_message')
+ end
+ end
+
context 'when email channel messages' do
let!(:channel_email) { create(:channel_email, account: account) }
let(:inbox_member) { create(:inbox_member, inbox: channel_email.inbox) }
diff --git a/spec/services/whatsapp/providers/whatsapp_cloud_service_spec.rb b/spec/services/whatsapp/providers/whatsapp_cloud_service_spec.rb
index 156e46349..a94ba2e44 100644
--- a/spec/services/whatsapp/providers/whatsapp_cloud_service_spec.rb
+++ b/spec/services/whatsapp/providers/whatsapp_cloud_service_spec.rb
@@ -60,7 +60,7 @@ describe Whatsapp::Providers::WhatsappCloudService do
attachment = message.attachments.new(account_id: message.account_id, file_type: :image)
attachment.file.attach(io: Rails.root.join('spec/assets/avatar.png').open, filename: 'avatar.png', content_type: 'image/png')
- stub_request(:post, 'https://graph.facebook.com/v13.0/123456789/messages')
+ stub_request(:post, 'https://graph.facebook.com/v24.0/123456789/messages')
.with(
body: hash_including({
messaging_product: 'whatsapp',
@@ -79,7 +79,7 @@ describe Whatsapp::Providers::WhatsappCloudService do
# ref: https://github.com/bblimke/webmock/issues/900
# reason for Webmock::API.hash_including
- stub_request(:post, 'https://graph.facebook.com/v13.0/123456789/messages')
+ stub_request(:post, 'https://graph.facebook.com/v24.0/123456789/messages')
.with(
body: hash_including({
messaging_product: 'whatsapp',
@@ -91,6 +91,41 @@ describe Whatsapp::Providers::WhatsappCloudService do
.to_return(status: 200, body: whatsapp_response.to_json, headers: response_headers)
expect(service.send_message('+123456789', message)).to eq 'message_id'
end
+
+ it 'calls message endpoints for audio voice message with voice flag' do
+ attachment = message.attachments.new(account_id: message.account_id, file_type: :audio, meta: { 'is_voice_message' => true })
+ attachment.file.attach(io: Rails.root.join('spec/assets/sample.ogg').open, filename: 'voice.ogg', content_type: 'audio/ogg')
+
+ stub_request(:post, 'https://graph.facebook.com/v24.0/123456789/messages')
+ .with(
+ body: hash_including({
+ messaging_product: 'whatsapp',
+ to: '+123456789',
+ type: 'audio',
+ audio: WebMock::API.hash_including({ link: anything, voice: true })
+ })
+ )
+ .to_return(status: 200, body: whatsapp_response.to_json, headers: response_headers)
+ expect(service.send_message('+123456789', message)).to eq 'message_id'
+ end
+
+ it 'calls message endpoints for regular audio attachment without voice flag' do
+ attachment = message.attachments.new(account_id: message.account_id, file_type: :audio)
+ attachment.file.attach(io: Rails.root.join('spec/assets/sample.ogg').open, filename: 'audio.ogg', content_type: 'audio/ogg')
+
+ stub_request(:post, 'https://graph.facebook.com/v24.0/123456789/messages')
+ .with(
+ body: hash_including({
+ messaging_product: 'whatsapp',
+ to: '+123456789',
+ type: 'audio'
+ })
+ )
+ .to_return(status: 200, body: whatsapp_response.to_json, headers: response_headers)
+
+ result = service.send_message('+123456789', message)
+ expect(result).to eq 'message_id'
+ end
end
end
From 28f87d2fcac9179bbe457103d48ec81e4e8babd3 Mon Sep 17 00:00:00 2001
From: Ben7491
Date: Tue, 2 Jun 2026 23:40:44 +0800
Subject: [PATCH 18/34] fix(widget): translate zh_CN availability keys (#14288)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Translate missing Simplified Chinese live-chat widget availability and
reply-time strings so visitors using `zh_CN` no longer see English
fallbacks in offline and pre-chat states.
## Closes
N/A
## How to test
- Open the widget with `Widget Locale = 中文 (zh_CN)` and set the team
offline. The availability card should stay in Chinese.
- Configure working hours so the widget shows minute, hour, tomorrow,
and day-specific return states. The `{time}`, `{n}`, and `{day}`
placeholders should render correctly.
## What changed
- Translated missing `THUMBNAIL.AUTHOR.NOT_AVAILABLE`,
`TEAM_AVAILABILITY.BACK_AS_SOON_AS_POSSIBLE`, and `REPLY_TIME.*` strings
in `app/javascript/widget/i18n/locale/zh_CN.json`.
- Kept the scope limited to Simplified Chinese.
Co-authored-by: Sojan Jose
---
app/javascript/widget/i18n/locale/zh_CN.json | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/app/javascript/widget/i18n/locale/zh_CN.json b/app/javascript/widget/i18n/locale/zh_CN.json
index 3eb08c8f0..dc4a1cebe 100644
--- a/app/javascript/widget/i18n/locale/zh_CN.json
+++ b/app/javascript/widget/i18n/locale/zh_CN.json
@@ -14,24 +14,24 @@
},
"THUMBNAIL": {
"AUTHOR": {
- "NOT_AVAILABLE": "Not available"
+ "NOT_AVAILABLE": "暂无"
}
},
"TEAM_AVAILABILITY": {
"ONLINE": "在线",
"OFFLINE": "当前已离线",
- "BACK_AS_SOON_AS_POSSIBLE": "We will be back as soon as possible"
+ "BACK_AS_SOON_AS_POSSIBLE": "我们会尽快回复您"
},
"REPLY_TIME": {
"IN_A_FEW_MINUTES": "通常在几分钟内回复您",
"IN_A_FEW_HOURS": "通常在几小时内回复您",
"IN_A_DAY": "通常在一天之内回复您",
- "BACK_IN_HOURS": "We will be back online in {n} hour | We will be back online in {n} hours",
- "BACK_IN_MINUTES": "We will be back online in {time} minutes",
- "BACK_AT_TIME": "We will be back online at {time}",
- "BACK_ON_DAY": "We will be back online on {day}",
- "BACK_TOMORROW": "We will be back online tomorrow",
- "BACK_IN_SOME_TIME": "We will be back online in some time"
+ "BACK_IN_HOURS": "{n} 小时后恢复在线",
+ "BACK_IN_MINUTES": "{time} 分钟后恢复在线",
+ "BACK_AT_TIME": "{time} 恢复在线",
+ "BACK_ON_DAY": "{day} 恢复在线",
+ "BACK_TOMORROW": "明天恢复在线",
+ "BACK_IN_SOME_TIME": "稍后恢复在线"
},
"DAY_NAMES": {
"SUNDAY": "周日",
From 87df43bdd090a196fb29e91044d48e5a71166df6 Mon Sep 17 00:00:00 2001
From: Sony Mathew
Date: Tue, 2 Jun 2026 21:11:48 +0530
Subject: [PATCH 19/34] revert: restore conversation unread count feature flag
(#14623)
This reverts #14610 so conversation unread counts are again controlled
by the `conversation_unread_counts` feature flag across the API,
ActionCable broadcasts, notifier/listener paths, and dashboard sidebar
fetching.
## Closes
- None
## What changed
- Restores feature-flag checks for conversation unread count reads and
broadcasts.
- Restores the dashboard feature flag constant and sidebar/store
behavior for disabled unread counts.
- Restores the specs that cover disabled-feature behavior.
## How to test
- In an account with `conversation_unread_counts` enabled, verify
sidebar unread counts are fetched and updated in real time.
- Disable `conversation_unread_counts` for the account and verify unread
count requests/broadcasts are skipped.
---
.../conversations/unread_counts_controller.rb | 10 ++++
.../components-next/sidebar/Sidebar.vue | 16 +++++-
app/javascript/dashboard/featureFlags.js | 1 +
.../dashboard/helper/actionCable.js | 14 +++++
.../helper/specs/actionCable.spec.js | 16 ++++++
.../store/modules/conversationUnreadCounts.js | 3 ++
.../conversationUnreadCounts/actions.spec.js | 11 ++++
app/listeners/action_cable_listener.rb | 2 +-
app/models/account.rb | 1 +
.../conversations/unread_counts/listener.rb | 3 +-
.../conversations/unread_counts/notifier.rb | 2 +
config/features.yml | 3 +-
config/locales/en.yml | 3 ++
.../accounts/conversations_controller_spec.rb | 53 ++++++++++++-------
spec/listeners/action_cable_listener_spec.rb | 12 +++++
spec/models/account_spec.rb | 38 +++++++++++++
.../unread_counts/listener_spec.rb | 13 +++++
.../unread_counts/notifier_spec.rb | 16 ++++++
18 files changed, 193 insertions(+), 24 deletions(-)
diff --git a/app/controllers/api/v1/accounts/conversations/unread_counts_controller.rb b/app/controllers/api/v1/accounts/conversations/unread_counts_controller.rb
index 6b1ee90e6..d9f15613b 100644
--- a/app/controllers/api/v1/accounts/conversations/unread_counts_controller.rb
+++ b/app/controllers/api/v1/accounts/conversations/unread_counts_controller.rb
@@ -1,6 +1,16 @@
class Api::V1::Accounts::Conversations::UnreadCountsController < Api::V1::Accounts::BaseController
+ before_action :ensure_unread_counts_enabled
+
def index
counts = ::Conversations::UnreadCounts::Counter.new(account: Current.account, user: Current.user).perform
render json: { payload: counts }
end
+
+ private
+
+ def ensure_unread_counts_enabled
+ return if Current.account.feature_enabled?('conversation_unread_counts')
+
+ render json: { error: I18n.t('errors.conversations.unread_counts.feature_not_enabled') }, status: :forbidden
+ end
end
diff --git a/app/javascript/dashboard/components-next/sidebar/Sidebar.vue b/app/javascript/dashboard/components-next/sidebar/Sidebar.vue
index 0fccfbee5..d9f523dfc 100644
--- a/app/javascript/dashboard/components-next/sidebar/Sidebar.vue
+++ b/app/javascript/dashboard/components-next/sidebar/Sidebar.vue
@@ -61,9 +61,21 @@ const hasAdvancedAssignment = computed(() => {
);
});
-const fetchConversationUnreadCounts = currentAccountId => {
+const hasConversationUnreadCounts = computed(() => {
+ return isFeatureEnabledonAccount.value(
+ accountId.value,
+ FEATURE_FLAGS.CONVERSATION_UNREAD_COUNTS
+ );
+});
+
+const fetchConversationUnreadCounts = ([currentAccountId, isEnabled]) => {
if (!currentAccountId) return;
+ if (!isEnabled) {
+ store.dispatch('conversationUnreadCounts/clear');
+ return;
+ }
+
store.dispatch('conversationUnreadCounts/get');
};
@@ -188,7 +200,7 @@ onMounted(() => {
store.dispatch('customViews/get', 'contact');
});
-watch(accountId, fetchConversationUnreadCounts, {
+watch([accountId, hasConversationUnreadCounts], fetchConversationUnreadCounts, {
immediate: true,
});
diff --git a/app/javascript/dashboard/featureFlags.js b/app/javascript/dashboard/featureFlags.js
index b97e30984..00a79763b 100644
--- a/app/javascript/dashboard/featureFlags.js
+++ b/app/javascript/dashboard/featureFlags.js
@@ -46,6 +46,7 @@ export const FEATURE_FLAGS = {
COMPANIES: 'companies',
ADVANCED_SEARCH: 'advanced_search',
CONVERSATION_REQUIRED_ATTRIBUTES: 'conversation_required_attributes',
+ CONVERSATION_UNREAD_COUNTS: 'conversation_unread_counts',
};
export const PREMIUM_FEATURES = [
diff --git a/app/javascript/dashboard/helper/actionCable.js b/app/javascript/dashboard/helper/actionCable.js
index a2caab5f5..e6f2993e4 100644
--- a/app/javascript/dashboard/helper/actionCable.js
+++ b/app/javascript/dashboard/helper/actionCable.js
@@ -13,6 +13,7 @@ import {
} from 'dashboard/composables/useWhatsappCallSession';
import { VOICE_CALL_PROVIDERS } from 'dashboard/helper/inbox';
import { VOICE_CALL_DIRECTION } from 'dashboard/components-next/message/constants';
+import { FEATURE_FLAGS } from 'dashboard/featureFlags';
const { isImpersonating } = useImpersonation();
const UNREAD_COUNTS_REFETCH_THROTTLE_MS = 5000;
@@ -171,10 +172,23 @@ class ActionCableConnector extends BaseActionCableConnector {
};
fetchConversationUnreadCounts = () => {
+ if (!this.isConversationUnreadCountsEnabled()) return;
+
this.lastUnreadCountsFetchAt = Date.now();
this.app.$store.dispatch('conversationUnreadCounts/get');
};
+ isConversationUnreadCountsEnabled = () => {
+ const accountId = this.app.$store.getters.getCurrentAccountId;
+ const isFeatureEnabled =
+ this.app.$store.getters['accounts/isFeatureEnabledonAccount'];
+
+ return isFeatureEnabled?.(
+ accountId,
+ FEATURE_FLAGS.CONVERSATION_UNREAD_COUNTS
+ );
+ };
+
onTypingOn = ({ conversation, user }) => {
const conversationId = conversation.id;
diff --git a/app/javascript/dashboard/helper/specs/actionCable.spec.js b/app/javascript/dashboard/helper/specs/actionCable.spec.js
index 2085b415a..8ba411a5f 100644
--- a/app/javascript/dashboard/helper/specs/actionCable.spec.js
+++ b/app/javascript/dashboard/helper/specs/actionCable.spec.js
@@ -30,6 +30,7 @@ describe('ActionCableConnector - Copilot Tests', () => {
dispatch: mockDispatch,
getters: {
getCurrentAccountId: 1,
+ 'accounts/isFeatureEnabledonAccount': vi.fn(() => true),
},
},
};
@@ -88,6 +89,21 @@ describe('ActionCableConnector - Copilot Tests', () => {
expect(mockDispatch).toHaveBeenCalledWith('conversationUnreadCounts/get');
});
+ it('does not refetch unread counts when unread count feature is disabled', () => {
+ store.$store.getters[
+ 'accounts/isFeatureEnabledonAccount'
+ ].mockReturnValue(false);
+
+ actionCable.onReceived({
+ event: 'conversation.unread_count_changed',
+ data: { account_id: 1 },
+ });
+
+ expect(mockDispatch).not.toHaveBeenCalledWith(
+ 'conversationUnreadCounts/get'
+ );
+ });
+
it('should throttle unread count refetches for repeated events', () => {
vi.useFakeTimers();
vi.setSystemTime(new Date('2026-01-01T00:00:00Z'));
diff --git a/app/javascript/dashboard/store/modules/conversationUnreadCounts.js b/app/javascript/dashboard/store/modules/conversationUnreadCounts.js
index edffed4fd..0503c0806 100644
--- a/app/javascript/dashboard/store/modules/conversationUnreadCounts.js
+++ b/app/javascript/dashboard/store/modules/conversationUnreadCounts.js
@@ -48,6 +48,9 @@ export const actions = {
// Ignore errors so the sidebar can continue rendering without badges.
}
},
+ clear({ commit }) {
+ commit(types.SET_CONVERSATION_UNREAD_COUNTS, {});
+ },
};
export const mutations = {
diff --git a/app/javascript/dashboard/store/modules/specs/conversationUnreadCounts/actions.spec.js b/app/javascript/dashboard/store/modules/specs/conversationUnreadCounts/actions.spec.js
index 0974689d5..3100cdd10 100644
--- a/app/javascript/dashboard/store/modules/specs/conversationUnreadCounts/actions.spec.js
+++ b/app/javascript/dashboard/store/modules/specs/conversationUnreadCounts/actions.spec.js
@@ -39,4 +39,15 @@ describe('#actions', () => {
expect(commit).not.toHaveBeenCalled();
});
});
+
+ describe('#clear', () => {
+ it('clears unread counts', () => {
+ actions.clear({ commit });
+
+ expect(commit).toHaveBeenCalledWith(
+ types.SET_CONVERSATION_UNREAD_COUNTS,
+ {}
+ );
+ });
+ });
});
diff --git a/app/listeners/action_cable_listener.rb b/app/listeners/action_cable_listener.rb
index 86fba29a0..3bc221504 100644
--- a/app/listeners/action_cable_listener.rb
+++ b/app/listeners/action_cable_listener.rb
@@ -92,7 +92,7 @@ class ActionCableListener < BaseListener
def conversation_unread_count_changed(event)
account, inbox_members = ::Conversations::UnreadCounts::BroadcastScope.new(event).perform
- return if account.blank?
+ return if account.blank? || !account.feature_enabled?('conversation_unread_counts')
tokens = user_tokens(account, inbox_members)
diff --git a/app/models/account.rb b/app/models/account.rb
index 8d66acca8..667058a2f 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -109,6 +109,7 @@ class Account < ApplicationRecord
before_validation :validate_limit_keys
after_create_commit :notify_creation
+ after_update_commit :clear_unread_conversation_counts_cache, if: :saved_change_to_feature_conversation_unread_counts?
after_destroy :remove_account_sequences
def agents
diff --git a/app/services/conversations/unread_counts/listener.rb b/app/services/conversations/unread_counts/listener.rb
index 729613639..28792d884 100644
--- a/app/services/conversations/unread_counts/listener.rb
+++ b/app/services/conversations/unread_counts/listener.rb
@@ -4,6 +4,7 @@ class Conversations::UnreadCounts::Listener < BaseListener
def message_created(event)
message, = extract_message_and_account(event)
return unless message.incoming?
+ return unless message.account.feature_enabled?('conversation_unread_counts')
refresh(message.conversation)
end
@@ -35,7 +36,7 @@ class Conversations::UnreadCounts::Listener < BaseListener
return if conversation_data.blank?
account = Account.find_by(id: conversation_data[:account_id])
- return if account.blank?
+ return unless account&.feature_enabled?('conversation_unread_counts')
return unless remove_deleted_conversation(account, conversation_data)
Rails.configuration.dispatcher.dispatch(CONVERSATION_UNREAD_COUNT_CHANGED, Time.zone.now, conversation_data: conversation_data.to_h)
diff --git a/app/services/conversations/unread_counts/notifier.rb b/app/services/conversations/unread_counts/notifier.rb
index 461945f2c..652fbde3a 100644
--- a/app/services/conversations/unread_counts/notifier.rb
+++ b/app/services/conversations/unread_counts/notifier.rb
@@ -9,6 +9,8 @@ class Conversations::UnreadCounts::Notifier
end
def perform
+ return false unless conversation.account.feature_enabled?('conversation_unread_counts')
+
return false unless ::Conversations::UnreadCounts::Refresher.new(conversation, changed_attributes: changed_attributes).perform
Rails.configuration.dispatcher.dispatch(CONVERSATION_UNREAD_COUNT_CHANGED, Time.zone.now, conversation: conversation)
diff --git a/config/features.yml b/config/features.yml
index 8444b7379..03105588b 100644
--- a/config/features.yml
+++ b/config/features.yml
@@ -19,9 +19,8 @@
help_url: https://chwt.app/hc/fb
- name: conversation_unread_counts
display_name: Conversation Unread Counts
- enabled: true
+ enabled: false
chatwoot_internal: true
- deprecated: true
- name: ip_lookup
display_name: IP Lookup
enabled: false
diff --git a/config/locales/en.yml b/config/locales/en.yml
index b6b336f45..8b8202f1c 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -81,6 +81,9 @@ en:
saml:
feature_not_enabled: SAML feature not enabled for this account
sso_not_enabled: SAML SSO is not enabled for this installation
+ conversations:
+ unread_counts:
+ feature_not_enabled: Conversation unread counts feature not enabled for this account
data_import:
data_type:
invalid: Invalid data type
diff --git a/spec/controllers/api/v1/accounts/conversations_controller_spec.rb b/spec/controllers/api/v1/accounts/conversations_controller_spec.rb
index 39bdb398c..f8fd446d2 100644
--- a/spec/controllers/api/v1/accounts/conversations_controller_spec.rb
+++ b/spec/controllers/api/v1/accounts/conversations_controller_spec.rb
@@ -126,32 +126,47 @@ RSpec.describe 'Conversations API', type: :request do
Conversations::UnreadCounts::Store.clear_account!(account.id)
end
- it 'returns unread conversation counts scoped to the signed-in user' do
- create_unread_conversation(account: account, inbox: visible_inbox, labels: [label.title])
- create_unread_conversation(account: account, inbox: hidden_inbox, labels: [label.title])
+ context 'when conversation unread counts feature is enabled' do
+ before do
+ account.enable_features!(:conversation_unread_counts)
+ end
- get "/api/v1/accounts/#{account.id}/conversations/unread_counts",
- headers: agent.create_new_auth_token,
- as: :json
+ it 'returns unread conversation counts scoped to the signed-in user' do
+ create_unread_conversation(account: account, inbox: visible_inbox, labels: [label.title])
+ create_unread_conversation(account: account, inbox: hidden_inbox, labels: [label.title])
- expect(response).to have_http_status(:success)
- expect(response.parsed_body['payload']).to eq(
- 'inboxes' => { visible_inbox.id.to_s => 1 },
- 'labels' => { label.id.to_s => 1 },
- 'teams' => {}
- )
+ get "/api/v1/accounts/#{account.id}/conversations/unread_counts",
+ headers: agent.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:success)
+ expect(response.parsed_body['payload']).to eq(
+ 'inboxes' => { visible_inbox.id.to_s => 1 },
+ 'labels' => { label.id.to_s => 1 },
+ 'teams' => {}
+ )
+ end
+
+ it 'returns unread team conversation counts scoped to the signed-in user' do
+ create_unread_conversation(account: account, inbox: visible_inbox, team: team)
+ create_unread_conversation(account: account, inbox: hidden_inbox, team: team)
+
+ get "/api/v1/accounts/#{account.id}/conversations/unread_counts",
+ headers: agent.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:success)
+ expect(response.parsed_body['payload']['teams']).to eq(team.id.to_s => 1)
+ end
end
- it 'returns unread team conversation counts scoped to the signed-in user' do
- create_unread_conversation(account: account, inbox: visible_inbox, team: team)
- create_unread_conversation(account: account, inbox: hidden_inbox, team: team)
-
+ it 'returns forbidden when conversation unread counts feature is disabled' do
get "/api/v1/accounts/#{account.id}/conversations/unread_counts",
headers: agent.create_new_auth_token,
as: :json
- expect(response).to have_http_status(:success)
- expect(response.parsed_body['payload']['teams']).to eq(team.id.to_s => 1)
+ expect(response).to have_http_status(:forbidden)
+ expect(response.parsed_body['error']).to eq('Conversation unread counts feature not enabled for this account')
end
end
end
@@ -833,6 +848,7 @@ RSpec.describe 'Conversations API', type: :request do
end
it 'refreshes unread count cache when conversation is marked read' do
+ account.enable_features!(:conversation_unread_counts)
conversation.update!(agent_last_seen_at: 1.hour.ago)
create(:message, account: account, inbox: conversation.inbox, conversation: conversation, message_type: :incoming, created_at: 5.minutes.ago)
Conversations::UnreadCounts::Builder.new(account).build_base!
@@ -920,6 +936,7 @@ RSpec.describe 'Conversations API', type: :request do
end
it 'refreshes unread count cache when conversation is marked unread' do
+ account.enable_features!(:conversation_unread_counts)
conversation.update!(agent_last_seen_at: 1.minute.from_now, assignee_last_seen_at: 1.minute.from_now)
Conversations::UnreadCounts::Builder.new(account).build_base!
diff --git a/spec/listeners/action_cable_listener_spec.rb b/spec/listeners/action_cable_listener_spec.rb
index f8d50060f..cdb9a93cb 100644
--- a/spec/listeners/action_cable_listener_spec.rb
+++ b/spec/listeners/action_cable_listener_spec.rb
@@ -237,6 +237,10 @@ describe ActionCableListener do
let!(:agent_without_inbox_access) { create(:user, account: account, role: :agent) }
let!(:event) { Events::Base.new(event_name, Time.zone.now, conversation: conversation) }
+ before do
+ account.enable_features!(:conversation_unread_counts)
+ end
+
it 'sends a lightweight refresh event to inbox agents and admins' do
expect(conversation.inbox.reload.inbox_members.count).to eq(1)
@@ -261,6 +265,14 @@ describe ActionCableListener do
listener.conversation_unread_count_changed(event)
end
+ it 'does not broadcast when conversation unread counts feature is disabled' do
+ account.disable_features!(:conversation_unread_counts)
+
+ expect(ActionCableBroadcastJob).not_to receive(:perform_later)
+
+ listener.conversation_unread_count_changed(event)
+ end
+
it 'supports deleted conversation data' do
event = Events::Base.new(
event_name,
diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb
index 76dbbcba2..38ca9694a 100644
--- a/spec/models/account_spec.rb
+++ b/spec/models/account_spec.rb
@@ -50,6 +50,44 @@ RSpec.describe Account do
end
end
+ describe 'conversation unread counts feature flag' do
+ let(:account) { create(:account) }
+ let(:inbox) { create(:inbox, account: account) }
+ let(:store) { Conversations::UnreadCounts::Store }
+ let(:inbox_key) { store.inbox_key(account.id, inbox.id) }
+
+ after do
+ store.clear_account!(account.id)
+ end
+
+ it 'clears unread count cache when the feature is enabled' do
+ build_unread_count_cache
+
+ account.enable_features!(:conversation_unread_counts)
+
+ expect(store.base_ready?(account.id)).to be(false)
+ expect(store.assignment_ready?(account.id)).to be(false)
+ expect(store.counts_for_keys([inbox_key])).to eq(inbox_key => 0)
+ end
+
+ it 'clears unread count cache when the feature is disabled' do
+ account.enable_features!(:conversation_unread_counts)
+ build_unread_count_cache
+
+ account.disable_features!(:conversation_unread_counts)
+
+ expect(store.base_ready?(account.id)).to be(false)
+ expect(store.assignment_ready?(account.id)).to be(false)
+ expect(store.counts_for_keys([inbox_key])).to eq(inbox_key => 0)
+ end
+
+ def build_unread_count_cache
+ store.mark_base_ready!(account.id)
+ store.mark_assignment_ready!(account.id)
+ store.add_base_membership(account_id: account.id, inbox_id: inbox.id, label_ids: [], conversation_id: 1)
+ end
+ end
+
describe 'inbound_email_domain' do
let(:account) { create(:account) }
diff --git a/spec/services/conversations/unread_counts/listener_spec.rb b/spec/services/conversations/unread_counts/listener_spec.rb
index a8a400365..fbb0a0835 100644
--- a/spec/services/conversations/unread_counts/listener_spec.rb
+++ b/spec/services/conversations/unread_counts/listener_spec.rb
@@ -11,6 +11,7 @@ RSpec.describe Conversations::UnreadCounts::Listener do
end
it 'refreshes unread counts when an incoming message is created' do
+ account.enable_features!(:conversation_unread_counts)
message = create(:message, account: account, inbox: conversation.inbox, conversation: conversation, message_type: :incoming)
event = Events::Base.new('message.created', Time.zone.now, message: message)
@@ -29,6 +30,17 @@ RSpec.describe Conversations::UnreadCounts::Listener do
expect(Conversations::UnreadCounts::Notifier).not_to have_received(:new)
end
+ it 'ignores incoming message creation when conversation unread counts are disabled' do
+ message = create(:message, account: account, inbox: conversation.inbox, conversation: conversation, message_type: :incoming)
+ event = Events::Base.new('message.created', Time.zone.now, message: message)
+
+ expect(message).not_to receive(:conversation)
+
+ listener.message_created(event)
+
+ expect(Conversations::UnreadCounts::Notifier).not_to have_received(:new)
+ end
+
it 'refreshes unread counts when conversation status changes' do
changed_attributes = { 'status' => %w[open resolved] }
event = Events::Base.new('conversation.status_changed', Time.zone.now, conversation: conversation, changed_attributes: changed_attributes)
@@ -78,6 +90,7 @@ RSpec.describe Conversations::UnreadCounts::Listener do
end
it 'removes unread count memberships when a conversation is deleted' do
+ account.enable_features!(:conversation_unread_counts)
label = create(:label, account: account)
team = create(:team, account: account)
assignee = create(:user, account: account)
diff --git a/spec/services/conversations/unread_counts/notifier_spec.rb b/spec/services/conversations/unread_counts/notifier_spec.rb
index 6c6028548..1b35d37f6 100644
--- a/spec/services/conversations/unread_counts/notifier_spec.rb
+++ b/spec/services/conversations/unread_counts/notifier_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe Conversations::UnreadCounts::Notifier do
let(:refresh_result) { true }
before do
+ conversation.account.enable_features!(:conversation_unread_counts)
allow(Conversations::UnreadCounts::Refresher).to receive(:new).and_return(refresher)
allow(Rails.configuration.dispatcher).to receive(:dispatch)
end
@@ -29,4 +30,19 @@ RSpec.describe Conversations::UnreadCounts::Notifier do
expect(Rails.configuration.dispatcher).not_to have_received(:dispatch)
end
end
+
+ context 'when conversation unread counts feature is disabled' do
+ before do
+ conversation.account.disable_features!(:conversation_unread_counts)
+ allow(Conversations::UnreadCounts::Store).to receive(:clear_account!)
+ end
+
+ it 'does not refresh, clear cache, or dispatch unread count changed event' do
+ described_class.new(conversation).perform
+
+ expect(Conversations::UnreadCounts::Refresher).not_to have_received(:new)
+ expect(Conversations::UnreadCounts::Store).not_to have_received(:clear_account!)
+ expect(Rails.configuration.dispatcher).not_to have_received(:dispatch)
+ end
+ end
end
From 0a181b0cea826bd52728bb7446c4f05c2668feb6 Mon Sep 17 00:00:00 2001
From: Captain <92152627+chatwoot-bot@users.noreply.github.com>
Date: Tue, 2 Jun 2026 08:51:50 -0700
Subject: [PATCH 20/34] chore: Update translations (#14498)
Updates dashboard, widget, and backend locale files with the latest
translation sync from Crowdin.
## Closes
N/A
## What changed
- Refreshes translated dashboard JSON locale files across supported
languages.
- Adds the latest backend Help Center/public portal locale strings.
- Keeps the branch current with `develop` and resolves the `ar`, `fr`,
and `pt_BR` locale conflicts.
## Validation
- Parsed all changed JSON and YAML locale files successfully.
- Checked for leftover merge conflict markers.
- Ran `git diff --check`.
---------
Co-authored-by: Sojan Jose
---
.../dashboard/i18n/locale/am/bulkActions.json | 16 +--
.../dashboard/i18n/locale/am/campaign.json | 2 +
.../dashboard/i18n/locale/am/components.json | 3 +-
.../dashboard/i18n/locale/am/contact.json | 5 +
.../i18n/locale/am/conversation.json | 26 ++++-
.../dashboard/i18n/locale/am/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/am/inboxMgmt.json | 35 +++++-
.../i18n/locale/am/integrations.json | 3 +-
.../dashboard/i18n/locale/ar/bulkActions.json | 16 +--
.../dashboard/i18n/locale/ar/campaign.json | 2 +
.../dashboard/i18n/locale/ar/components.json | 3 +-
.../dashboard/i18n/locale/ar/contact.json | 5 +
.../i18n/locale/ar/conversation.json | 26 ++++-
.../dashboard/i18n/locale/ar/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/ar/inboxMgmt.json | 35 +++++-
.../i18n/locale/ar/integrations.json | 3 +-
.../dashboard/i18n/locale/az/bulkActions.json | 16 +--
.../dashboard/i18n/locale/az/campaign.json | 2 +
.../dashboard/i18n/locale/az/components.json | 3 +-
.../dashboard/i18n/locale/az/contact.json | 5 +
.../i18n/locale/az/conversation.json | 26 ++++-
.../dashboard/i18n/locale/az/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/az/inboxMgmt.json | 35 +++++-
.../i18n/locale/az/integrations.json | 3 +-
.../dashboard/i18n/locale/bg/bulkActions.json | 16 +--
.../dashboard/i18n/locale/bg/campaign.json | 2 +
.../dashboard/i18n/locale/bg/components.json | 3 +-
.../dashboard/i18n/locale/bg/contact.json | 5 +
.../i18n/locale/bg/conversation.json | 26 ++++-
.../dashboard/i18n/locale/bg/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/bg/inboxMgmt.json | 35 +++++-
.../i18n/locale/bg/integrations.json | 3 +-
.../dashboard/i18n/locale/bn/bulkActions.json | 16 +--
.../dashboard/i18n/locale/bn/campaign.json | 2 +
.../dashboard/i18n/locale/bn/components.json | 3 +-
.../dashboard/i18n/locale/bn/contact.json | 5 +
.../i18n/locale/bn/conversation.json | 26 ++++-
.../dashboard/i18n/locale/bn/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/bn/inboxMgmt.json | 35 +++++-
.../i18n/locale/bn/integrations.json | 3 +-
.../dashboard/i18n/locale/ca/bulkActions.json | 16 +--
.../dashboard/i18n/locale/ca/campaign.json | 2 +
.../dashboard/i18n/locale/ca/components.json | 3 +-
.../dashboard/i18n/locale/ca/contact.json | 5 +
.../i18n/locale/ca/conversation.json | 26 ++++-
.../dashboard/i18n/locale/ca/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/ca/inboxMgmt.json | 35 +++++-
.../i18n/locale/ca/integrations.json | 3 +-
.../dashboard/i18n/locale/cs/bulkActions.json | 16 +--
.../dashboard/i18n/locale/cs/campaign.json | 2 +
.../dashboard/i18n/locale/cs/components.json | 3 +-
.../dashboard/i18n/locale/cs/contact.json | 5 +
.../i18n/locale/cs/conversation.json | 26 ++++-
.../dashboard/i18n/locale/cs/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/cs/inboxMgmt.json | 35 +++++-
.../i18n/locale/cs/integrations.json | 3 +-
.../dashboard/i18n/locale/da/bulkActions.json | 16 +--
.../dashboard/i18n/locale/da/campaign.json | 2 +
.../dashboard/i18n/locale/da/components.json | 3 +-
.../dashboard/i18n/locale/da/contact.json | 5 +
.../i18n/locale/da/conversation.json | 26 ++++-
.../dashboard/i18n/locale/da/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/da/inboxMgmt.json | 35 +++++-
.../i18n/locale/da/integrations.json | 3 +-
.../dashboard/i18n/locale/de/bulkActions.json | 16 +--
.../dashboard/i18n/locale/de/campaign.json | 2 +
.../dashboard/i18n/locale/de/components.json | 3 +-
.../dashboard/i18n/locale/de/contact.json | 5 +
.../i18n/locale/de/conversation.json | 26 ++++-
.../dashboard/i18n/locale/de/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/de/inboxMgmt.json | 35 +++++-
.../i18n/locale/de/integrations.json | 3 +-
.../dashboard/i18n/locale/el/bulkActions.json | 16 +--
.../dashboard/i18n/locale/el/campaign.json | 2 +
.../dashboard/i18n/locale/el/components.json | 3 +-
.../dashboard/i18n/locale/el/contact.json | 5 +
.../i18n/locale/el/conversation.json | 26 ++++-
.../dashboard/i18n/locale/el/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/el/inboxMgmt.json | 35 +++++-
.../i18n/locale/el/integrations.json | 3 +-
.../dashboard/i18n/locale/es/bulkActions.json | 16 +--
.../dashboard/i18n/locale/es/campaign.json | 2 +
.../dashboard/i18n/locale/es/components.json | 3 +-
.../dashboard/i18n/locale/es/contact.json | 5 +
.../i18n/locale/es/conversation.json | 26 ++++-
.../dashboard/i18n/locale/es/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/es/inboxMgmt.json | 35 +++++-
.../i18n/locale/es/integrations.json | 3 +-
.../dashboard/i18n/locale/et/bulkActions.json | 16 +--
.../dashboard/i18n/locale/et/campaign.json | 2 +
.../dashboard/i18n/locale/et/components.json | 3 +-
.../dashboard/i18n/locale/et/contact.json | 5 +
.../i18n/locale/et/conversation.json | 26 ++++-
.../dashboard/i18n/locale/et/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/et/inboxMgmt.json | 35 +++++-
.../i18n/locale/et/integrations.json | 3 +-
.../dashboard/i18n/locale/fa/bulkActions.json | 16 +--
.../dashboard/i18n/locale/fa/campaign.json | 2 +
.../dashboard/i18n/locale/fa/companies.json | 2 +-
.../dashboard/i18n/locale/fa/components.json | 3 +-
.../dashboard/i18n/locale/fa/contact.json | 5 +
.../i18n/locale/fa/conversation.json | 34 +++++-
.../dashboard/i18n/locale/fa/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/fa/inboxMgmt.json | 35 +++++-
.../i18n/locale/fa/integrations.json | 3 +-
.../dashboard/i18n/locale/fi/bulkActions.json | 16 +--
.../dashboard/i18n/locale/fi/campaign.json | 2 +
.../dashboard/i18n/locale/fi/components.json | 3 +-
.../dashboard/i18n/locale/fi/contact.json | 5 +
.../i18n/locale/fi/conversation.json | 26 ++++-
.../dashboard/i18n/locale/fi/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/fi/inboxMgmt.json | 35 +++++-
.../i18n/locale/fi/integrations.json | 3 +-
.../dashboard/i18n/locale/fr/bulkActions.json | 16 +--
.../dashboard/i18n/locale/fr/campaign.json | 2 +
.../dashboard/i18n/locale/fr/components.json | 3 +-
.../dashboard/i18n/locale/fr/contact.json | 5 +
.../i18n/locale/fr/conversation.json | 26 ++++-
.../dashboard/i18n/locale/fr/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/fr/inboxMgmt.json | 35 +++++-
.../i18n/locale/fr/integrations.json | 3 +-
.../dashboard/i18n/locale/fr/onboarding.json | 24 ++--
.../dashboard/i18n/locale/he/bulkActions.json | 16 +--
.../dashboard/i18n/locale/he/campaign.json | 2 +
.../dashboard/i18n/locale/he/components.json | 3 +-
.../dashboard/i18n/locale/he/contact.json | 5 +
.../i18n/locale/he/conversation.json | 26 ++++-
.../dashboard/i18n/locale/he/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/he/inboxMgmt.json | 35 +++++-
.../i18n/locale/he/integrations.json | 3 +-
.../dashboard/i18n/locale/hi/bulkActions.json | 16 +--
.../dashboard/i18n/locale/hi/campaign.json | 2 +
.../dashboard/i18n/locale/hi/components.json | 3 +-
.../dashboard/i18n/locale/hi/contact.json | 5 +
.../i18n/locale/hi/conversation.json | 26 ++++-
.../dashboard/i18n/locale/hi/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/hi/inboxMgmt.json | 35 +++++-
.../i18n/locale/hi/integrations.json | 3 +-
.../dashboard/i18n/locale/hr/bulkActions.json | 16 +--
.../dashboard/i18n/locale/hr/campaign.json | 2 +
.../dashboard/i18n/locale/hr/components.json | 3 +-
.../dashboard/i18n/locale/hr/contact.json | 5 +
.../i18n/locale/hr/conversation.json | 26 ++++-
.../dashboard/i18n/locale/hr/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/hr/inboxMgmt.json | 35 +++++-
.../i18n/locale/hr/integrations.json | 3 +-
.../dashboard/i18n/locale/hu/bulkActions.json | 26 ++---
.../dashboard/i18n/locale/hu/campaign.json | 2 +
.../dashboard/i18n/locale/hu/companies.json | 108 +++++++++---------
.../dashboard/i18n/locale/hu/components.json | 3 +-
.../dashboard/i18n/locale/hu/contact.json | 5 +
.../i18n/locale/hu/conversation.json | 28 ++++-
.../dashboard/i18n/locale/hu/helpCenter.json | 69 +++++++----
.../dashboard/i18n/locale/hu/inboxMgmt.json | 35 +++++-
.../i18n/locale/hu/integrations.json | 3 +-
.../dashboard/i18n/locale/hu/macros.json | 2 +-
.../dashboard/i18n/locale/hu/onboarding.json | 38 +++---
.../dashboard/i18n/locale/hy/bulkActions.json | 16 +--
.../dashboard/i18n/locale/hy/campaign.json | 2 +
.../dashboard/i18n/locale/hy/components.json | 3 +-
.../dashboard/i18n/locale/hy/contact.json | 5 +
.../i18n/locale/hy/conversation.json | 26 ++++-
.../dashboard/i18n/locale/hy/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/hy/inboxMgmt.json | 35 +++++-
.../i18n/locale/hy/integrations.json | 3 +-
.../dashboard/i18n/locale/id/bulkActions.json | 16 +--
.../dashboard/i18n/locale/id/campaign.json | 2 +
.../dashboard/i18n/locale/id/components.json | 3 +-
.../dashboard/i18n/locale/id/contact.json | 5 +
.../i18n/locale/id/conversation.json | 26 ++++-
.../dashboard/i18n/locale/id/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/id/inboxMgmt.json | 35 +++++-
.../i18n/locale/id/integrations.json | 3 +-
.../dashboard/i18n/locale/is/bulkActions.json | 16 +--
.../dashboard/i18n/locale/is/campaign.json | 2 +
.../dashboard/i18n/locale/is/components.json | 3 +-
.../dashboard/i18n/locale/is/contact.json | 5 +
.../i18n/locale/is/conversation.json | 26 ++++-
.../dashboard/i18n/locale/is/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/is/inboxMgmt.json | 35 +++++-
.../i18n/locale/is/integrations.json | 3 +-
.../dashboard/i18n/locale/it/bulkActions.json | 16 +--
.../dashboard/i18n/locale/it/campaign.json | 2 +
.../dashboard/i18n/locale/it/components.json | 3 +-
.../dashboard/i18n/locale/it/contact.json | 5 +
.../i18n/locale/it/conversation.json | 26 ++++-
.../dashboard/i18n/locale/it/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/it/inboxMgmt.json | 35 +++++-
.../i18n/locale/it/integrations.json | 3 +-
.../dashboard/i18n/locale/ja/bulkActions.json | 16 +--
.../dashboard/i18n/locale/ja/campaign.json | 2 +
.../dashboard/i18n/locale/ja/components.json | 3 +-
.../dashboard/i18n/locale/ja/contact.json | 5 +
.../i18n/locale/ja/conversation.json | 26 ++++-
.../dashboard/i18n/locale/ja/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/ja/inboxMgmt.json | 35 +++++-
.../i18n/locale/ja/integrations.json | 3 +-
.../dashboard/i18n/locale/ka/bulkActions.json | 16 +--
.../dashboard/i18n/locale/ka/campaign.json | 2 +
.../dashboard/i18n/locale/ka/components.json | 3 +-
.../dashboard/i18n/locale/ka/contact.json | 5 +
.../i18n/locale/ka/conversation.json | 26 ++++-
.../dashboard/i18n/locale/ka/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/ka/inboxMgmt.json | 35 +++++-
.../i18n/locale/ka/integrations.json | 3 +-
.../dashboard/i18n/locale/ko/bulkActions.json | 16 +--
.../dashboard/i18n/locale/ko/campaign.json | 2 +
.../dashboard/i18n/locale/ko/components.json | 3 +-
.../dashboard/i18n/locale/ko/contact.json | 5 +
.../i18n/locale/ko/conversation.json | 26 ++++-
.../dashboard/i18n/locale/ko/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/ko/inboxMgmt.json | 35 +++++-
.../i18n/locale/ko/integrations.json | 3 +-
.../dashboard/i18n/locale/lt/bulkActions.json | 16 +--
.../dashboard/i18n/locale/lt/campaign.json | 2 +
.../dashboard/i18n/locale/lt/components.json | 3 +-
.../dashboard/i18n/locale/lt/contact.json | 5 +
.../i18n/locale/lt/conversation.json | 26 ++++-
.../dashboard/i18n/locale/lt/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/lt/inboxMgmt.json | 35 +++++-
.../i18n/locale/lt/integrations.json | 3 +-
.../dashboard/i18n/locale/lv/bulkActions.json | 16 +--
.../dashboard/i18n/locale/lv/campaign.json | 2 +
.../dashboard/i18n/locale/lv/components.json | 3 +-
.../dashboard/i18n/locale/lv/contact.json | 5 +
.../i18n/locale/lv/conversation.json | 26 ++++-
.../dashboard/i18n/locale/lv/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/lv/inboxMgmt.json | 35 +++++-
.../i18n/locale/lv/integrations.json | 3 +-
.../dashboard/i18n/locale/ml/bulkActions.json | 16 +--
.../dashboard/i18n/locale/ml/campaign.json | 2 +
.../dashboard/i18n/locale/ml/components.json | 3 +-
.../dashboard/i18n/locale/ml/contact.json | 5 +
.../i18n/locale/ml/conversation.json | 26 ++++-
.../dashboard/i18n/locale/ml/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/ml/inboxMgmt.json | 35 +++++-
.../i18n/locale/ml/integrations.json | 3 +-
.../dashboard/i18n/locale/ms/bulkActions.json | 16 +--
.../dashboard/i18n/locale/ms/campaign.json | 2 +
.../dashboard/i18n/locale/ms/components.json | 3 +-
.../dashboard/i18n/locale/ms/contact.json | 5 +
.../i18n/locale/ms/conversation.json | 26 ++++-
.../dashboard/i18n/locale/ms/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/ms/inboxMgmt.json | 35 +++++-
.../i18n/locale/ms/integrations.json | 3 +-
.../dashboard/i18n/locale/ne/bulkActions.json | 16 +--
.../dashboard/i18n/locale/ne/campaign.json | 2 +
.../dashboard/i18n/locale/ne/components.json | 3 +-
.../dashboard/i18n/locale/ne/contact.json | 5 +
.../i18n/locale/ne/conversation.json | 26 ++++-
.../dashboard/i18n/locale/ne/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/ne/inboxMgmt.json | 35 +++++-
.../i18n/locale/ne/integrations.json | 3 +-
.../dashboard/i18n/locale/nl/bulkActions.json | 16 +--
.../dashboard/i18n/locale/nl/campaign.json | 2 +
.../dashboard/i18n/locale/nl/components.json | 3 +-
.../dashboard/i18n/locale/nl/contact.json | 5 +
.../i18n/locale/nl/conversation.json | 26 ++++-
.../dashboard/i18n/locale/nl/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/nl/inboxMgmt.json | 35 +++++-
.../i18n/locale/nl/integrations.json | 3 +-
.../dashboard/i18n/locale/no/bulkActions.json | 16 +--
.../dashboard/i18n/locale/no/campaign.json | 2 +
.../dashboard/i18n/locale/no/components.json | 3 +-
.../dashboard/i18n/locale/no/contact.json | 5 +
.../i18n/locale/no/conversation.json | 26 ++++-
.../dashboard/i18n/locale/no/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/no/inboxMgmt.json | 35 +++++-
.../i18n/locale/no/integrations.json | 3 +-
.../dashboard/i18n/locale/pl/bulkActions.json | 16 +--
.../dashboard/i18n/locale/pl/campaign.json | 2 +
.../dashboard/i18n/locale/pl/components.json | 3 +-
.../dashboard/i18n/locale/pl/contact.json | 5 +
.../i18n/locale/pl/conversation.json | 26 ++++-
.../dashboard/i18n/locale/pl/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/pl/inboxMgmt.json | 35 +++++-
.../i18n/locale/pl/integrations.json | 3 +-
.../dashboard/i18n/locale/pt/bulkActions.json | 16 +--
.../dashboard/i18n/locale/pt/campaign.json | 2 +
.../dashboard/i18n/locale/pt/components.json | 3 +-
.../dashboard/i18n/locale/pt/contact.json | 5 +
.../i18n/locale/pt/conversation.json | 26 ++++-
.../dashboard/i18n/locale/pt/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/pt/inboxMgmt.json | 35 +++++-
.../i18n/locale/pt/integrations.json | 3 +-
.../i18n/locale/pt_BR/bulkActions.json | 16 +--
.../dashboard/i18n/locale/pt_BR/campaign.json | 2 +
.../i18n/locale/pt_BR/components.json | 3 +-
.../dashboard/i18n/locale/pt_BR/contact.json | 5 +
.../i18n/locale/pt_BR/conversation.json | 26 ++++-
.../i18n/locale/pt_BR/helpCenter.json | 25 ++++
.../i18n/locale/pt_BR/inboxMgmt.json | 35 +++++-
.../i18n/locale/pt_BR/integrationApps.json | 2 +-
.../i18n/locale/pt_BR/integrations.json | 3 +-
.../dashboard/i18n/locale/ro/bulkActions.json | 16 +--
.../dashboard/i18n/locale/ro/campaign.json | 2 +
.../dashboard/i18n/locale/ro/components.json | 3 +-
.../dashboard/i18n/locale/ro/contact.json | 5 +
.../i18n/locale/ro/conversation.json | 26 ++++-
.../dashboard/i18n/locale/ro/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/ro/inboxMgmt.json | 35 +++++-
.../i18n/locale/ro/integrations.json | 3 +-
.../dashboard/i18n/locale/ru/bulkActions.json | 16 +--
.../dashboard/i18n/locale/ru/campaign.json | 2 +
.../dashboard/i18n/locale/ru/components.json | 3 +-
.../dashboard/i18n/locale/ru/contact.json | 5 +
.../i18n/locale/ru/conversation.json | 26 ++++-
.../dashboard/i18n/locale/ru/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/ru/inboxMgmt.json | 35 +++++-
.../i18n/locale/ru/integrations.json | 3 +-
.../dashboard/i18n/locale/sh/bulkActions.json | 16 +--
.../dashboard/i18n/locale/sh/campaign.json | 2 +
.../dashboard/i18n/locale/sh/components.json | 3 +-
.../dashboard/i18n/locale/sh/contact.json | 5 +
.../i18n/locale/sh/conversation.json | 26 ++++-
.../dashboard/i18n/locale/sh/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/sh/inboxMgmt.json | 35 +++++-
.../i18n/locale/sh/integrations.json | 3 +-
.../dashboard/i18n/locale/sk/bulkActions.json | 16 +--
.../dashboard/i18n/locale/sk/campaign.json | 2 +
.../dashboard/i18n/locale/sk/components.json | 3 +-
.../dashboard/i18n/locale/sk/contact.json | 5 +
.../i18n/locale/sk/conversation.json | 26 ++++-
.../dashboard/i18n/locale/sk/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/sk/inboxMgmt.json | 35 +++++-
.../i18n/locale/sk/integrations.json | 3 +-
.../dashboard/i18n/locale/sl/bulkActions.json | 16 +--
.../dashboard/i18n/locale/sl/campaign.json | 2 +
.../dashboard/i18n/locale/sl/components.json | 3 +-
.../dashboard/i18n/locale/sl/contact.json | 5 +
.../i18n/locale/sl/conversation.json | 26 ++++-
.../dashboard/i18n/locale/sl/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/sl/inboxMgmt.json | 35 +++++-
.../i18n/locale/sl/integrations.json | 3 +-
.../dashboard/i18n/locale/sq/bulkActions.json | 16 +--
.../dashboard/i18n/locale/sq/campaign.json | 2 +
.../dashboard/i18n/locale/sq/components.json | 3 +-
.../dashboard/i18n/locale/sq/contact.json | 5 +
.../i18n/locale/sq/conversation.json | 26 ++++-
.../dashboard/i18n/locale/sq/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/sq/inboxMgmt.json | 35 +++++-
.../i18n/locale/sq/integrations.json | 3 +-
.../dashboard/i18n/locale/sr/bulkActions.json | 16 +--
.../dashboard/i18n/locale/sr/campaign.json | 2 +
.../dashboard/i18n/locale/sr/components.json | 3 +-
.../dashboard/i18n/locale/sr/contact.json | 5 +
.../i18n/locale/sr/conversation.json | 26 ++++-
.../dashboard/i18n/locale/sr/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/sr/inboxMgmt.json | 35 +++++-
.../i18n/locale/sr/integrations.json | 3 +-
.../dashboard/i18n/locale/sv/bulkActions.json | 16 +--
.../dashboard/i18n/locale/sv/campaign.json | 2 +
.../dashboard/i18n/locale/sv/components.json | 3 +-
.../dashboard/i18n/locale/sv/contact.json | 5 +
.../i18n/locale/sv/conversation.json | 26 ++++-
.../dashboard/i18n/locale/sv/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/sv/inboxMgmt.json | 35 +++++-
.../i18n/locale/sv/integrations.json | 3 +-
.../dashboard/i18n/locale/ta/bulkActions.json | 16 +--
.../dashboard/i18n/locale/ta/campaign.json | 2 +
.../dashboard/i18n/locale/ta/components.json | 3 +-
.../dashboard/i18n/locale/ta/contact.json | 5 +
.../i18n/locale/ta/conversation.json | 26 ++++-
.../dashboard/i18n/locale/ta/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/ta/inboxMgmt.json | 35 +++++-
.../i18n/locale/ta/integrations.json | 3 +-
.../dashboard/i18n/locale/th/bulkActions.json | 16 +--
.../dashboard/i18n/locale/th/campaign.json | 2 +
.../dashboard/i18n/locale/th/components.json | 3 +-
.../dashboard/i18n/locale/th/contact.json | 5 +
.../i18n/locale/th/conversation.json | 26 ++++-
.../dashboard/i18n/locale/th/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/th/inboxMgmt.json | 35 +++++-
.../i18n/locale/th/integrations.json | 3 +-
.../dashboard/i18n/locale/tl/bulkActions.json | 16 +--
.../dashboard/i18n/locale/tl/campaign.json | 2 +
.../dashboard/i18n/locale/tl/components.json | 3 +-
.../dashboard/i18n/locale/tl/contact.json | 5 +
.../i18n/locale/tl/conversation.json | 26 ++++-
.../dashboard/i18n/locale/tl/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/tl/inboxMgmt.json | 35 +++++-
.../i18n/locale/tl/integrations.json | 3 +-
.../dashboard/i18n/locale/tr/bulkActions.json | 16 +--
.../dashboard/i18n/locale/tr/campaign.json | 2 +
.../dashboard/i18n/locale/tr/components.json | 3 +-
.../dashboard/i18n/locale/tr/contact.json | 5 +
.../i18n/locale/tr/conversation.json | 26 ++++-
.../dashboard/i18n/locale/tr/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/tr/inboxMgmt.json | 35 +++++-
.../i18n/locale/tr/integrations.json | 3 +-
.../dashboard/i18n/locale/uk/bulkActions.json | 16 +--
.../dashboard/i18n/locale/uk/campaign.json | 2 +
.../dashboard/i18n/locale/uk/components.json | 3 +-
.../dashboard/i18n/locale/uk/contact.json | 5 +
.../i18n/locale/uk/conversation.json | 26 ++++-
.../dashboard/i18n/locale/uk/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/uk/inboxMgmt.json | 35 +++++-
.../i18n/locale/uk/integrations.json | 3 +-
.../dashboard/i18n/locale/ur/bulkActions.json | 16 +--
.../dashboard/i18n/locale/ur/campaign.json | 2 +
.../dashboard/i18n/locale/ur/components.json | 3 +-
.../dashboard/i18n/locale/ur/contact.json | 5 +
.../i18n/locale/ur/conversation.json | 26 ++++-
.../dashboard/i18n/locale/ur/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/ur/inboxMgmt.json | 35 +++++-
.../i18n/locale/ur/integrations.json | 3 +-
.../i18n/locale/ur_IN/bulkActions.json | 16 +--
.../dashboard/i18n/locale/ur_IN/campaign.json | 2 +
.../i18n/locale/ur_IN/components.json | 3 +-
.../dashboard/i18n/locale/ur_IN/contact.json | 5 +
.../i18n/locale/ur_IN/conversation.json | 26 ++++-
.../i18n/locale/ur_IN/helpCenter.json | 25 ++++
.../i18n/locale/ur_IN/inboxMgmt.json | 35 +++++-
.../i18n/locale/ur_IN/integrations.json | 3 +-
.../dashboard/i18n/locale/vi/bulkActions.json | 16 +--
.../dashboard/i18n/locale/vi/campaign.json | 2 +
.../dashboard/i18n/locale/vi/components.json | 3 +-
.../dashboard/i18n/locale/vi/contact.json | 5 +
.../i18n/locale/vi/conversation.json | 26 ++++-
.../dashboard/i18n/locale/vi/helpCenter.json | 25 ++++
.../dashboard/i18n/locale/vi/inboxMgmt.json | 35 +++++-
.../i18n/locale/vi/integrations.json | 3 +-
.../i18n/locale/zh_CN/bulkActions.json | 16 +--
.../dashboard/i18n/locale/zh_CN/campaign.json | 2 +
.../i18n/locale/zh_CN/components.json | 3 +-
.../dashboard/i18n/locale/zh_CN/contact.json | 5 +
.../i18n/locale/zh_CN/conversation.json | 26 ++++-
.../i18n/locale/zh_CN/helpCenter.json | 25 ++++
.../i18n/locale/zh_CN/inboxMgmt.json | 35 +++++-
.../i18n/locale/zh_CN/integrations.json | 3 +-
.../i18n/locale/zh_TW/bulkActions.json | 16 +--
.../dashboard/i18n/locale/zh_TW/campaign.json | 2 +
.../i18n/locale/zh_TW/components.json | 3 +-
.../dashboard/i18n/locale/zh_TW/contact.json | 5 +
.../i18n/locale/zh_TW/conversation.json | 26 ++++-
.../i18n/locale/zh_TW/helpCenter.json | 25 ++++
.../i18n/locale/zh_TW/inboxMgmt.json | 35 +++++-
.../i18n/locale/zh_TW/integrations.json | 3 +-
config/locales/am.yml | 33 ++++++
config/locales/ar.yml | 15 +++
config/locales/az.yml | 33 ++++++
config/locales/bg.yml | 33 ++++++
config/locales/bn.yml | 33 ++++++
config/locales/ca.yml | 33 ++++++
config/locales/cs.yml | 35 ++++++
config/locales/da.yml | 33 ++++++
config/locales/de.yml | 33 ++++++
config/locales/el.yml | 33 ++++++
config/locales/es.yml | 33 ++++++
config/locales/et.yml | 33 ++++++
config/locales/fa.yml | 33 ++++++
config/locales/fi.yml | 33 ++++++
config/locales/fr.yml | 43 ++++---
config/locales/he.yml | 35 ++++++
config/locales/hi.yml | 33 ++++++
config/locales/hr.yml | 34 ++++++
config/locales/hu.yml | 33 ++++++
config/locales/hy.yml | 33 ++++++
config/locales/id.yml | 32 ++++++
config/locales/is.yml | 33 ++++++
config/locales/it.yml | 33 ++++++
config/locales/ja.yml | 32 ++++++
config/locales/ka.yml | 33 ++++++
config/locales/ko.yml | 32 ++++++
config/locales/lt.yml | 35 ++++++
config/locales/lv.yml | 34 ++++++
config/locales/ml.yml | 33 ++++++
config/locales/ms.yml | 32 ++++++
config/locales/ne.yml | 33 ++++++
config/locales/nl.yml | 33 ++++++
config/locales/no.yml | 33 ++++++
config/locales/pl.yml | 35 ++++++
config/locales/pt.yml | 33 ++++++
config/locales/pt_BR.yml | 17 ++-
config/locales/ro.yml | 34 ++++++
config/locales/ru.yml | 35 ++++++
config/locales/sh.yml | 35 ++++++
config/locales/sk.yml | 35 ++++++
config/locales/sl.yml | 35 ++++++
config/locales/sq.yml | 33 ++++++
config/locales/sr.yml | 34 ++++++
config/locales/sv.yml | 33 ++++++
config/locales/ta.yml | 33 ++++++
config/locales/th.yml | 32 ++++++
config/locales/tl.yml | 33 ++++++
config/locales/tr.yml | 33 ++++++
config/locales/uk.yml | 35 ++++++
config/locales/ur.yml | 33 ++++++
config/locales/ur_IN.yml | 33 ++++++
config/locales/vi.yml | 32 ++++++
config/locales/zh_CN.yml | 32 ++++++
config/locales/zh_TW.yml | 34 +++++-
492 files changed, 7166 insertions(+), 1058 deletions(-)
diff --git a/app/javascript/dashboard/i18n/locale/am/bulkActions.json b/app/javascript/dashboard/i18n/locale/am/bulkActions.json
index 2472a9288..6b922bc7b 100644
--- a/app/javascript/dashboard/i18n/locale/am/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/am/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} conversations selected",
- "AGENT_SELECT_LABEL": "Select agent",
- "ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign {conversationCount} {conversationLabel} to",
- "UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Go back",
- "ASSIGN_LABEL": "Assign",
"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}?",
@@ -20,7 +15,6 @@
"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.",
- "AGENT_LIST_LOADING": "Loading agents",
"UPDATE": {
"CHANGE_STATUS": "Change status",
"SNOOZE_UNTIL": "Snooze",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assign labels",
- "NO_LABELS_FOUND": "No labels found",
+ "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."
+ "ASSIGN_FAILED": "Failed to assign labels. Please try again.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Select team",
"NONE": "None",
- "NO_TEAMS_AVAILABLE": "There are no teams added to this account yet.",
- "ASSIGN_SELECTED_TEAMS": "Assign selected team.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/am/campaign.json b/app/javascript/dashboard/i18n/locale/am/campaign.json
index 10366e79e..55de22367 100644
--- a/app/javascript/dashboard/i18n/locale/am/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/am/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "በሂደት ላይ",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "በሂደት ላይ",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/am/components.json b/app/javascript/dashboard/i18n/locale/am/components.json
index a75d35b08..3ee865a89 100644
--- a/app/javascript/dashboard/i18n/locale/am/components.json
+++ b/app/javascript/dashboard/i18n/locale/am/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/am/contact.json b/app/javascript/dashboard/i18n/locale/am/contact.json
index 329a29569..aa025f30c 100644
--- a/app/javascript/dashboard/i18n/locale/am/contact.json
+++ b/app/javascript/dashboard/i18n/locale/am/contact.json
@@ -20,6 +20,8 @@
"CALL": "ደውል",
"CALL_INITIATED": "ለእውነተኛው እውቀት መደወል እየተከናወነ ነው…",
"CALL_FAILED": "ጥሪውን መጀመር አልቻልንም። እባክዎ ደግመው ይሞክሩ።.",
+ "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": "የድምፅ ኢንቦክስ ይምረጡ"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "መለያዎችን መሰጠት",
+ "REMOVE_LABELS": "Remove Labels",
"ASSIGN_LABELS_SUCCESS": "መለያዎች በተሳካ ሁኔታ ተመዝግበዋል።.",
"ASSIGN_LABELS_FAILED": "መለያዎችን ማስመዝገብ አልተሳካም",
+ "REMOVE_LABELS_SUCCESS": "Labels removed successfully.",
+ "REMOVE_LABELS_FAILED": "Failed to remove labels",
"DESCRIPTION": "ለተመረጡት እውነተኛዎች የሚያክሉትን መለያዎች ይምረጡ።.",
"NO_LABELS_FOUND": "እስካሁን መለያዎች አልተገኙም።.",
"SELECTED_COUNT": "{count} ተመርጧል",
diff --git a/app/javascript/dashboard/i18n/locale/am/conversation.json b/app/javascript/dashboard/i18n/locale/am/conversation.json
index 3cfaeb3a7..a6803eae1 100644
--- a/app/javascript/dashboard/i18n/locale/am/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/am/conversation.json
@@ -62,6 +62,7 @@
"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",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "ተፈትኗል",
@@ -100,6 +110,12 @@
"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}",
@@ -215,6 +231,7 @@
"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",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
@@ -299,8 +316,13 @@
"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"
+ "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": {
diff --git a/app/javascript/dashboard/i18n/locale/am/helpCenter.json b/app/javascript/dashboard/i18n/locale/am/helpCenter.json
index f40b2b7f0..ef480e1ee 100644
--- a/app/javascript/dashboard/i18n/locale/am/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/am/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "እቅድ",
"ARCHIVE": "አርክቭ",
"TRANSLATE": "Translate",
+ "MOVE_TO_CATEGORY": "Category",
"DELETE": "Delete",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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",
@@ -866,6 +869,28 @@
},
"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": "አስወግድ"
+ },
+ "SAVE": "ለውጦች አስቀምጥ"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "ፖርታል በተሳካ ሁኔታ ተፈጥሯል",
diff --git a/app/javascript/dashboard/i18n/locale/am/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/am/inboxMgmt.json
index dbc8ba1f1..3f784dc92 100644
--- a/app/javascript/dashboard/i18n/locale/am/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/am/inboxMgmt.json
@@ -308,6 +308,7 @@
"AUTH_PROCESSING": "ከMeta ጋር በመረጋገጥ ላይ ነው",
"WAITING_FOR_BUSINESS_INFO": "እባክዎ በMeta መስኮት ውስጥ የንግድ ቅንብር ያርኩ...",
"PROCESSING": "የWhatsApp ቢዝነስ መለያዎን እየተዘጋጀ ነው",
+ "ENABLING_CALLING": "Enabling WhatsApp Calling on your number…",
"LOADING_SDK": "Facebook SDK እየተጫነ ነው...",
"CANCELLED": "የWhatsApp ምዝገባ ተሰርዟል",
"SUCCESS_TITLE": "የWhatsApp ቢዝነስ መለያ ተገናኝቷል!",
@@ -317,7 +318,8 @@
"AUTH_NOT_COMPLETED": "ማረጋገጫ አልተጠናቀቀም። ሂደቱን እባክዎ ዳግም ይጀምሩ።.",
"SUCCESS_FALLBACK": "የWhatsApp የንግድ መለያ በተሳካ ሁኔታ ተቋቋመ",
"MANUAL_FALLBACK": "ቁጥርዎ ከWhatsApp Business Platform (API) ጋር ከተገናኘ እና ወይም እርስዎ የቴክኖሎጂ አቅራቢ ከሆኑ እና የእርስዎን ቁጥር በራስዎ ሲያስገቡ፣ እባክዎ የ{link} ሂደትን ይጠቀሙ",
- "MANUAL_LINK_TEXT": "የእጅ ማቀናበሪያ ሂደት"
+ "MANUAL_LINK_TEXT": "የእጅ ማቀናበሪያ ሂደት",
+ "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": "WhatsApp ቻናሉን ማስቀመጥ አልተቻለም"
@@ -465,6 +467,10 @@
"TITLE": "ዋትስአፕ",
"DESCRIPTION": "በWhatsApp ላይ ደንበኞችዎን ድጋፍ ያድርጉ"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "ኢሜይል",
"DESCRIPTION": "ከGmail, Outlook ወይም ከሌሎች አቅራቢዎች ጋር ያገናኙ"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "የቦት ቅንብሮች",
"ACCOUNT_HEALTH": "የመለያ ጤና",
"CSAT": "የደንበኞች ደህንነት ግምገማ (CSAT)",
- "VOICE": "ድምጽ"
+ "VOICE": "ድምጽ",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "የቻናል ቅድሚያዎች",
"WIDGET_FEATURES": "የዊጅት ባህሪያት",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"WHATSAPP_TEMPLATES_SYNC_SUBHEADER": "ከWhatsApp መልእክት አብነቶች እጅግ በእጅ ማስተካከል ለእንደገና የሚገኙ አብነቶችን ያዘምኑ።.",
"WHATSAPP_TEMPLATES_SYNC_BUTTON": "አብነቶችን ያዘምኑ",
"WHATSAPP_TEMPLATES_SYNC_SUCCESS": "የአብነት ማስተካከያ በተሳካ ሁኔታ ተጀምሯል። ለማዘመን ጥቂት ደቂቃዎች ሊወስድ ይችላል።.",
+ "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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "የቀደም ቻት ቅጥያ ቅንብሮችን አዘምን"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/am/integrations.json b/app/javascript/dashboard/i18n/locale/am/integrations.json
index e26adaa52..8af05114c 100644
--- a/app/javascript/dashboard/i18n/locale/am/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/am/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "እውቂያ ተፈጥሯል",
"CONTACT_UPDATED": "እውቂያ ተሻሽሏል",
"CONVERSATION_TYPING_ON": "ውይይት ማስተካከያ በተጠቃሚ ላይ ነው",
- "CONVERSATION_TYPING_OFF": "ውይይት ማስተካከያ ከተጠቃሚ ላይ አልተጠቀሰም"
+ "CONVERSATION_TYPING_OFF": "ውይይት ማስተካከያ ከተጠቃሚ ላይ አልተጠቀሰም",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/ar/bulkActions.json b/app/javascript/dashboard/i18n/locale/ar/bulkActions.json
index d894fb3ce..d436e35fb 100644
--- a/app/javascript/dashboard/i18n/locale/ar/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/ar/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} المحادثات المحددة",
- "AGENT_SELECT_LABEL": "اختر وكيل",
- "ASSIGN_CONFIRMATION_LABEL": "هل أنت متأكد من أنك تريد تعيين {conversationCount} {conversationLabel} إلى",
- "UNASSIGN_CONFIRMATION_LABEL": "هل أنت متأكد من إلغاء تعيين {conversationCount} {conversationLabel}؟",
- "GO_BACK_LABEL": "العودة للخلف",
- "ASSIGN_LABEL": "تكليف",
"NONE": "لا شيء",
"CLEAR_SELECTION": "مسح",
"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}?",
@@ -20,7 +15,6 @@
"RESOLVE_SUCCESFUL": "تم تسوية المحادثات بنجاح.",
"RESOLVE_FAILED": "فشل في حل المحادثات، يرجى المحاولة مرة أخرى.",
"ALL_CONVERSATIONS_SELECTED_ALERT": "المحادثات المرئية في هذه الصفحة هي المحددة فقط.",
- "AGENT_LIST_LOADING": "جاري جلب الوكلاء",
"UPDATE": {
"CHANGE_STATUS": "تغيير الحالة",
"SNOOZE_UNTIL": "تأجيل",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "إضافة وسم",
- "NO_LABELS_FOUND": "لم يتم العثور على تصنيفات",
+ "REMOVE_LABELS": "Remove labels",
"ASSIGN_SELECTED_LABELS": "تعيين التسميات المحددة",
+ "REMOVE_SELECTED_LABELS": "Remove selected labels",
"ASSIGN_SUCCESFUL": "تم تعيين التسميات بنجاح.",
- "ASSIGN_FAILED": "فشل في تعيين التسميات ، الرجاء المحاولة مرة أخرى."
+ "ASSIGN_FAILED": "فشل في تعيين التسميات ، الرجاء المحاولة مرة أخرى.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "اختر فريق",
"NONE": "لا شيء",
- "NO_TEAMS_AVAILABLE": "لا توجد فرق مضافة إلى هذا الحساب حتى الآن.",
- "ASSIGN_SELECTED_TEAMS": "تعيين فريق محدد.",
"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": "تم تعيين الفرق بنجاح.",
diff --git a/app/javascript/dashboard/i18n/locale/ar/campaign.json b/app/javascript/dashboard/i18n/locale/ar/campaign.json
index 0af3565b3..3d274c437 100644
--- a/app/javascript/dashboard/i18n/locale/ar/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/ar/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "مكتمل",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "مكتمل",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/ar/components.json b/app/javascript/dashboard/i18n/locale/ar/components.json
index 9944f9f47..62ad85d93 100644
--- a/app/javascript/dashboard/i18n/locale/ar/components.json
+++ b/app/javascript/dashboard/i18n/locale/ar/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ar/contact.json b/app/javascript/dashboard/i18n/locale/ar/contact.json
index 14b2e4f0d..f5db01558 100644
--- a/app/javascript/dashboard/i18n/locale/ar/contact.json
+++ b/app/javascript/dashboard/i18n/locale/ar/contact.json
@@ -20,6 +20,8 @@
"CALL": "Call",
"CALL_INITIATED": "جار الاتصال بجهة الاتصال…",
"CALL_FAILED": "تعذر بدء المكالمة. الرجاء المحاولة مرة أخرى.",
+ "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"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "تعيين التسميات",
+ "REMOVE_LABELS": "Remove Labels",
"ASSIGN_LABELS_SUCCESS": "تم تعيين التسميات بنجاح.",
"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",
diff --git a/app/javascript/dashboard/i18n/locale/ar/conversation.json b/app/javascript/dashboard/i18n/locale/ar/conversation.json
index 1bb427f7d..1794227c8 100644
--- a/app/javascript/dashboard/i18n/locale/ar/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ar/conversation.json
@@ -62,6 +62,7 @@
"UNSUPPORTED_MESSAGE_FACEBOOK": "هذه الرسالة غير مدعومة، يمكنك مشاهدة هذه الرسالة على تطبيق فيسبوك (Messenger).",
"UNSUPPORTED_MESSAGE_INSTAGRAM": "هذه الرسالة غير مدعومة، يمكنك عرض هذه الرسالة على تطبيق Instagram.",
"UNSUPPORTED_MESSAGE_TIKTOK": "هذه الرسالة غير مدعومة. يمكنك مشاهدة هذه الرسالة على تطبيق TikTok.",
+ "UNSUPPORTED_MESSAGE_WHATSAPP": "This message is unsupported. You can view this message on the WhatsApp app.",
"SUCCESS_DELETE_MESSAGE": "تم حذف الرسالة بنجاح",
"FAIL_DELETE_MESSSAGE": "تعذر حذف الرسالة! حاول مرة أخرى",
"NO_RESPONSE": "لا توجد استجابة",
@@ -79,13 +80,22 @@
"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": "حل المحادثة",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "تأجيل حتى الغد",
"SNOOZED_UNTIL_NEXT_WEEK": "تأجيل حتى الأسبوع القادم",
"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}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "تسجيل الصوت",
"TIP_AUDIORECORDER_PERMISSION": "السماح بالوصول إلى الصوت",
"TIP_AUDIORECORDER_ERROR": "تعذر فتح الصوت",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "اسحب و أسقط هنا للإرفاق",
"START_AUDIO_RECORDING": "بدء التسجيل الصوتي",
"STOP_AUDIO_RECORDING": "إيقاف التسجيل الصوتي",
@@ -299,8 +316,13 @@
"NOT_ANSWERED_YET": "لم يتم الرد بعد",
"HANDLED_IN_ANOTHER_TAB": "يتم التعامل معها في علامة تبويب أخرى",
"REJECT_CALL": "رفض",
+ "DISMISS_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": {
diff --git a/app/javascript/dashboard/i18n/locale/ar/helpCenter.json b/app/javascript/dashboard/i18n/locale/ar/helpCenter.json
index 66dbd8e12..5289aa444 100644
--- a/app/javascript/dashboard/i18n/locale/ar/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/ar/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "مسودة",
"ARCHIVE": "Archive",
"TRANSLATE": "ترجم",
+ "MOVE_TO_CATEGORY": "الفئة",
"DELETE": "حذف",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "حذف",
@@ -866,6 +869,28 @@
},
"EDIT_CONFIGURATION": "Edit configuration"
},
+ "LAYOUT_CONTENT": {
+ "HEADER": "المظهر",
+ "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": "حذف"
+ },
+ "SAVE": "Save changes"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "تم إنشاء البوابة بنجاح",
diff --git a/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json
index 2f314baa6..6acb48cfc 100644
--- a/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json
@@ -308,6 +308,7 @@
"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!",
@@ -317,7 +318,8 @@
"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"
+ "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": "لم نتمكن من حفظ قناة واتساب"
@@ -465,6 +467,10 @@
"TITLE": "واتساب",
"DESCRIPTION": "Support your customers on WhatsApp"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "البريد الإلكتروني",
"DESCRIPTION": "Connect with Gmail, Outlook, or other providers"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "اعدادات البوت",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "تقييم رضاء العملاء",
- "VOICE": "Voice"
+ "VOICE": "Voice",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Update Pre Chat Form Settings"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/ar/integrations.json b/app/javascript/dashboard/i18n/locale/ar/integrations.json
index 6d875fbcf..2b2dfcef9 100644
--- a/app/javascript/dashboard/i18n/locale/ar/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ar/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Contact created",
"CONTACT_UPDATED": "Contact updated",
"CONVERSATION_TYPING_ON": "Conversation Typing On",
- "CONVERSATION_TYPING_OFF": "Conversation Typing Off"
+ "CONVERSATION_TYPING_OFF": "Conversation Typing Off",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/az/bulkActions.json b/app/javascript/dashboard/i18n/locale/az/bulkActions.json
index 1f56b6ab3..e05829612 100644
--- a/app/javascript/dashboard/i18n/locale/az/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/az/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} conversations selected",
- "AGENT_SELECT_LABEL": "Select agent",
- "ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign {conversationCount} {conversationLabel} to",
- "UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Go back",
- "ASSIGN_LABEL": "Assign",
"NONE": "Heç biri",
"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}?",
@@ -20,7 +15,6 @@
"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.",
- "AGENT_LIST_LOADING": "Loading agents",
"UPDATE": {
"CHANGE_STATUS": "Change status",
"SNOOZE_UNTIL": "Snooze",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assign labels",
- "NO_LABELS_FOUND": "No labels found",
+ "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."
+ "ASSIGN_FAILED": "Failed to assign labels. Please try again.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Select team",
"NONE": "None",
- "NO_TEAMS_AVAILABLE": "There are no teams added to this account yet.",
- "ASSIGN_SELECTED_TEAMS": "Assign selected team.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/az/campaign.json b/app/javascript/dashboard/i18n/locale/az/campaign.json
index 10366e79e..78db922d1 100644
--- a/app/javascript/dashboard/i18n/locale/az/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/az/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/az/components.json b/app/javascript/dashboard/i18n/locale/az/components.json
index a75d35b08..3ee865a89 100644
--- a/app/javascript/dashboard/i18n/locale/az/components.json
+++ b/app/javascript/dashboard/i18n/locale/az/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/az/contact.json b/app/javascript/dashboard/i18n/locale/az/contact.json
index aa19205cb..acf103ceb 100644
--- a/app/javascript/dashboard/i18n/locale/az/contact.json
+++ b/app/javascript/dashboard/i18n/locale/az/contact.json
@@ -20,6 +20,8 @@
"CALL": "Zəng et",
"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"
@@ -583,8 +585,11 @@
},
"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} seçildi",
diff --git a/app/javascript/dashboard/i18n/locale/az/conversation.json b/app/javascript/dashboard/i18n/locale/az/conversation.json
index 0fc8203c5..eff53867c 100644
--- a/app/javascript/dashboard/i18n/locale/az/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/az/conversation.json
@@ -62,6 +62,7 @@
"UNSUPPORTED_MESSAGE_FACEBOOK": "Bu mesaj dəstəklənmir. Bu mesajı Facebook Messenger tətbiqində görə bilərsiniz.",
"UNSUPPORTED_MESSAGE_INSTAGRAM": "Bu mesaj dəstəklənmir. Bu mesajı Instagram tətbiqində görə bilərsiniz.",
"UNSUPPORTED_MESSAGE_TIKTOK": "Bu mesaj dəstəklənmir. Bu mesajı TikTok tətbiqində görə bilərsiniz.",
+ "UNSUPPORTED_MESSAGE_WHATSAPP": "This message is unsupported. You can view this message on the WhatsApp app.",
"SUCCESS_DELETE_MESSAGE": "Mesaj uğurla silindi",
"FAIL_DELETE_MESSSAGE": "Mesajı silmək mümkün olmadı! Yenidən cəhd edin",
"NO_RESPONSE": "Cavab yoxdur",
@@ -79,13 +80,22 @@
"OUTGOING_CALL": "Gedən zəng",
"CALL_IN_PROGRESS": "Zəng davam edir",
"NO_ANSWER": "Cavab yoxdur",
+ "NO_ANSWER_OUTBOUND_LABEL": "Cavab yoxdur",
+ "NO_ANSWER_OUTBOUND_SUBTEXT": "Contact didn't pick up",
"MISSED_CALL": "Qeyri-işlək zəng",
+ "MISSED_CALL_INBOUND_SUBTEXT": "No agent picked up",
+ "MISSED_CALL_DECLINED_BY": "Declined by {agentName}",
"CALL_ENDED": "Zəng bitdi",
+ "HANDLED_BY": "Handled by {agentName}",
"NOT_ANSWERED_YET": "Hələ cavab verilməyib",
+ "CALLING": "Calling…",
"THEY_ANSWERED": "Onlar cavab verdi",
"YOU_ANSWERED": "Siz cavab verdiniz",
"AGENT_ANSWERED": "{agentName} answered",
- "JOIN_CALL": "Zəngə qoşul"
+ "JOIN_CALL": "Zəngə qoşul",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Həll et",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "Sabaha qədər təxirə salındı",
"SNOOZED_UNTIL_NEXT_WEEK": "Gələn həftəyə qədər təxirə salındı",
"SNOOZED_UNTIL_NEXT_REPLY": "Növbəti cavaba qədər təxirə salındı",
+ "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}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "Səs yaz",
"TIP_AUDIORECORDER_PERMISSION": "Səsə girişə icazə ver",
"TIP_AUDIORECORDER_ERROR": "Səsi açmaq mümkün olmadı",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "Qoşmaq üçün buraya sürükləyin və buraxın",
"START_AUDIO_RECORDING": "Səs yazısını başla",
"STOP_AUDIO_RECORDING": "Səs yazısını dayandırın",
@@ -299,8 +316,13 @@
"NOT_ANSWERED_YET": "Hələ cavab verilməyib",
"HANDLED_IN_ANOTHER_TAB": "Başqa sekmədə işlənir",
"REJECT_CALL": "İmtina et",
+ "DISMISS_CALL": "Dismiss",
"JOIN_CALL": "Zəngə qoşul",
- "END_CALL": "Zəngi bitir"
+ "END_CALL": "Zəngi bitir",
+ "MUTE": "Mute mic",
+ "UNMUTE": "Unmute mic",
+ "VIEW_CHAT_HISTORY": "View chat history",
+ "GO_TO_CONVERSATION": "Go to conversation thread"
}
},
"EMAIL_TRANSCRIPT": {
diff --git a/app/javascript/dashboard/i18n/locale/az/helpCenter.json b/app/javascript/dashboard/i18n/locale/az/helpCenter.json
index bbd8d72a6..eefb0c8da 100644
--- a/app/javascript/dashboard/i18n/locale/az/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/az/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Qaralama",
"ARCHIVE": "Archive",
"TRANSLATE": "Tərcümə et",
+ "MOVE_TO_CATEGORY": "Category",
"DELETE": "Delete",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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",
@@ -866,6 +869,28 @@
},
"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": "Sil"
+ },
+ "SAVE": "Save changes"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Portal created successfully",
diff --git a/app/javascript/dashboard/i18n/locale/az/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/az/inboxMgmt.json
index e96e12942..28af6066e 100644
--- a/app/javascript/dashboard/i18n/locale/az/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/az/inboxMgmt.json
@@ -308,6 +308,7 @@
"AUTH_PROCESSING": "Meta ilə autentifikasiya olunur",
"WAITING_FOR_BUSINESS_INFO": "Zəhmət olmasa Meta pəncərəsində biznes quraşdırmasını tamamlayın...",
"PROCESSING": "WhatsApp Biznes Hesabınızı quraşdırırıq",
+ "ENABLING_CALLING": "Enabling WhatsApp Calling on your number…",
"LOADING_SDK": "Facebook SDK yüklənir...",
"CANCELLED": "WhatsApp Qeydiyyatı ləğv edildi",
"SUCCESS_TITLE": "WhatsApp Biznes Hesabı Qoşuldu!",
@@ -317,7 +318,8 @@
"AUTH_NOT_COMPLETED": "Autentifikasiya tamamlanmadı. Zəhmət olmasa prosesi yenidən başladın.",
"SUCCESS_FALLBACK": "WhatsApp Biznes Hesabı uğurla konfiqurasiya edildi",
"MANUAL_FALLBACK": "Əgər nömrəniz artıq WhatsApp Business Platformasına (API) qoşulubsa və ya texnoloji təminatçı olaraq öz nömrənizi əlavə edirsinizsə, zəhmət olmasa {link} prosesindən istifadə edin",
- "MANUAL_LINK_TEXT": "əl ilə qurma prosesi"
+ "MANUAL_LINK_TEXT": "əl ilə qurma prosesi",
+ "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": "WhatsApp kanalını yadda saxlaya bilmədik"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "Müştərilərinizi WhatsApp-da dəstəkləyin"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "Elektron Poçt",
"DESCRIPTION": "Gmail, Outlook və ya digər təminatçılarla qoşulun"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Bot Konfiqurasiyası",
"ACCOUNT_HEALTH": "Hesabın sağlamlığı",
"CSAT": "CSAT",
- "VOICE": "Səs"
+ "VOICE": "Səs",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Kanal üstünlükləri",
"WIDGET_FEATURES": "Widget xüsusiyyətləri",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"WHATSAPP_TEMPLATES_SYNC_SUBHEADER": "Mövcud şablonlarınızı yeniləmək üçün WhatsApp-dan mesaj şablonlarını əl ilə sinxronlaşdırın.",
"WHATSAPP_TEMPLATES_SYNC_BUTTON": "Şablonları sinxronlaşdır",
"WHATSAPP_TEMPLATES_SYNC_SUCCESS": "Şablonların sinxronizasiyası uğurla başlandı. Yenilənməsi bir neçə dəqiqə çəkə bilər.",
+ "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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Pre Chat Form Parametrlərini Yeniləyin"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/az/integrations.json b/app/javascript/dashboard/i18n/locale/az/integrations.json
index 71b974565..be0b09003 100644
--- a/app/javascript/dashboard/i18n/locale/az/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/az/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Əlaqə yaradıldı",
"CONTACT_UPDATED": "Əlaqə yeniləndi",
"CONVERSATION_TYPING_ON": "Söhbət Yazılır",
- "CONVERSATION_TYPING_OFF": "Söhbət Yazması Söndürülüb"
+ "CONVERSATION_TYPING_OFF": "Söhbət Yazması Söndürülüb",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/bg/bulkActions.json b/app/javascript/dashboard/i18n/locale/bg/bulkActions.json
index 9d6ce07b6..24ef578dd 100644
--- a/app/javascript/dashboard/i18n/locale/bg/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/bg/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} conversations selected",
- "AGENT_SELECT_LABEL": "Изберете агент",
- "ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign {conversationCount} {conversationLabel} to",
- "UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Go back",
- "ASSIGN_LABEL": "Assign",
"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}?",
@@ -20,7 +15,6 @@
"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.",
- "AGENT_LIST_LOADING": "Loading agents",
"UPDATE": {
"CHANGE_STATUS": "Change status",
"SNOOZE_UNTIL": "Snooze",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assign labels",
- "NO_LABELS_FOUND": "Няма намерени етикети",
+ "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."
+ "ASSIGN_FAILED": "Failed to assign labels. Please try again.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Изберете екип",
"NONE": "Нито един",
- "NO_TEAMS_AVAILABLE": "There are no teams added to this account yet.",
- "ASSIGN_SELECTED_TEAMS": "Assign selected team.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/bg/campaign.json b/app/javascript/dashboard/i18n/locale/bg/campaign.json
index 49a61ee5a..c7b65800f 100644
--- a/app/javascript/dashboard/i18n/locale/bg/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/bg/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Завършено",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Завършено",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/bg/components.json b/app/javascript/dashboard/i18n/locale/bg/components.json
index 12e3ed232..19a7801ef 100644
--- a/app/javascript/dashboard/i18n/locale/bg/components.json
+++ b/app/javascript/dashboard/i18n/locale/bg/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/bg/contact.json b/app/javascript/dashboard/i18n/locale/bg/contact.json
index ed7277b9c..8d35e6b3a 100644
--- a/app/javascript/dashboard/i18n/locale/bg/contact.json
+++ b/app/javascript/dashboard/i18n/locale/bg/contact.json
@@ -20,6 +20,8 @@
"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"
@@ -583,8 +585,11 @@
},
"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",
diff --git a/app/javascript/dashboard/i18n/locale/bg/conversation.json b/app/javascript/dashboard/i18n/locale/bg/conversation.json
index b2e3ff3ad..43b582b2f 100644
--- a/app/javascript/dashboard/i18n/locale/bg/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/bg/conversation.json
@@ -62,6 +62,7 @@
"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",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Resolve",
@@ -100,6 +110,12 @@
"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}",
@@ -215,6 +231,7 @@
"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",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
@@ -299,8 +316,13 @@
"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"
+ "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": {
diff --git a/app/javascript/dashboard/i18n/locale/bg/helpCenter.json b/app/javascript/dashboard/i18n/locale/bg/helpCenter.json
index 7f3117eb0..fbb944c92 100644
--- a/app/javascript/dashboard/i18n/locale/bg/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/bg/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Draft",
"ARCHIVE": "Archive",
"TRANSLATE": "Translate",
+ "MOVE_TO_CATEGORY": "Category",
"DELETE": "Изтрий",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "Изтрий",
@@ -866,6 +869,28 @@
},
"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",
diff --git a/app/javascript/dashboard/i18n/locale/bg/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/bg/inboxMgmt.json
index f39d20f7f..2867f4db2 100644
--- a/app/javascript/dashboard/i18n/locale/bg/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/bg/inboxMgmt.json
@@ -308,6 +308,7 @@
"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!",
@@ -317,7 +318,8 @@
"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"
+ "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"
@@ -465,6 +467,10 @@
"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"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Bot Configuration",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT",
- "VOICE": "Voice"
+ "VOICE": "Voice",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Update Pre Chat Form Settings"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/bg/integrations.json b/app/javascript/dashboard/i18n/locale/bg/integrations.json
index 40295bf85..419aba43e 100644
--- a/app/javascript/dashboard/i18n/locale/bg/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/bg/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Contact created",
"CONTACT_UPDATED": "Contact updated",
"CONVERSATION_TYPING_ON": "Conversation Typing On",
- "CONVERSATION_TYPING_OFF": "Conversation Typing Off"
+ "CONVERSATION_TYPING_OFF": "Conversation Typing Off",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/bn/bulkActions.json b/app/javascript/dashboard/i18n/locale/bn/bulkActions.json
index 3476a0a4d..d62a07e35 100644
--- a/app/javascript/dashboard/i18n/locale/bn/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/bn/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} conversations selected",
- "AGENT_SELECT_LABEL": "Select agent",
- "ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign {conversationCount} {conversationLabel} to",
- "UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Go back",
- "ASSIGN_LABEL": "Assign",
"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}?",
@@ -20,7 +15,6 @@
"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.",
- "AGENT_LIST_LOADING": "Loading agents",
"UPDATE": {
"CHANGE_STATUS": "Change status",
"SNOOZE_UNTIL": "Snooze",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assign labels",
- "NO_LABELS_FOUND": "No labels found",
+ "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."
+ "ASSIGN_FAILED": "Failed to assign labels. Please try again.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Select team",
"NONE": "None",
- "NO_TEAMS_AVAILABLE": "There are no teams added to this account yet.",
- "ASSIGN_SELECTED_TEAMS": "Assign selected team.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/bn/campaign.json b/app/javascript/dashboard/i18n/locale/bn/campaign.json
index 10366e79e..51231c958 100644
--- a/app/javascript/dashboard/i18n/locale/bn/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/bn/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "প্রক্রিয়াধীন",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "প্রক্রিয়াধীন",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/bn/components.json b/app/javascript/dashboard/i18n/locale/bn/components.json
index a75d35b08..3ee865a89 100644
--- a/app/javascript/dashboard/i18n/locale/bn/components.json
+++ b/app/javascript/dashboard/i18n/locale/bn/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/bn/contact.json b/app/javascript/dashboard/i18n/locale/bn/contact.json
index 385530464..88ff31edc 100644
--- a/app/javascript/dashboard/i18n/locale/bn/contact.json
+++ b/app/javascript/dashboard/i18n/locale/bn/contact.json
@@ -20,6 +20,8 @@
"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"
@@ -583,8 +585,11 @@
},
"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",
diff --git a/app/javascript/dashboard/i18n/locale/bn/conversation.json b/app/javascript/dashboard/i18n/locale/bn/conversation.json
index 26658903b..f79713081 100644
--- a/app/javascript/dashboard/i18n/locale/bn/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/bn/conversation.json
@@ -62,6 +62,7 @@
"UNSUPPORTED_MESSAGE_FACEBOOK": "এই বার্তাটি সমর্থিত নয়। আপনি Facebook Messenger অ্যাপে এই বার্তাটি দেখতে পারেন।",
"UNSUPPORTED_MESSAGE_INSTAGRAM": "এই বার্তাটি সমর্থিত নয়। আপনি Instagram অ্যাপে এই বার্তাটি দেখতে পারেন।",
"UNSUPPORTED_MESSAGE_TIKTOK": "এই বার্তাটি সমর্থিত নয়। TikTok অ্যাপে এই বার্তাটি দেখতে পারেন।",
+ "UNSUPPORTED_MESSAGE_WHATSAPP": "This message is unsupported. You can view this message on the WhatsApp app.",
"SUCCESS_DELETE_MESSAGE": "বার্তা সফলভাবে মুছে ফেলা হয়েছে",
"FAIL_DELETE_MESSSAGE": "বার্তা মুছে ফেলা যায়নি! আবার চেষ্টা করুন",
"NO_RESPONSE": "কোনো উত্তর নেই",
@@ -79,13 +80,22 @@
"OUTGOING_CALL": "আউটগোয়িং কল",
"CALL_IN_PROGRESS": "কল চলছে",
"NO_ANSWER": "উত্তর নেই",
+ "NO_ANSWER_OUTBOUND_LABEL": "উত্তর নেই",
+ "NO_ANSWER_OUTBOUND_SUBTEXT": "Contact didn't pick up",
"MISSED_CALL": "মিসড কল",
+ "MISSED_CALL_INBOUND_SUBTEXT": "No agent picked up",
+ "MISSED_CALL_DECLINED_BY": "Declined by {agentName}",
"CALL_ENDED": "কল শেষ হয়েছে",
+ "HANDLED_BY": "Handled by {agentName}",
"NOT_ANSWERED_YET": "এখনও উত্তর পাওয়া যায়নি",
+ "CALLING": "Calling…",
"THEY_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": "সমাধান করুন",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "আগামীকাল পর্যন্ত স্থগিত",
"SNOOZED_UNTIL_NEXT_WEEK": "পরবর্তী সপ্তাহ পর্যন্ত স্থগিত",
"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}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "অডিও রেকর্ড করুন",
"TIP_AUDIORECORDER_PERMISSION": "অডিও অ্যাক্সেসের অনুমতি দিন",
"TIP_AUDIORECORDER_ERROR": "অডিও খোলা যায়নি",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "সংযুক্ত করতে এখানে ড্র্যাগ ও ড্রপ করুন",
"START_AUDIO_RECORDING": "অডিও রেকর্ডিং শুরু করুন",
"STOP_AUDIO_RECORDING": "অডিও রেকর্ডিং বন্ধ করুন",
@@ -299,8 +316,13 @@
"NOT_ANSWERED_YET": "এখনও উত্তর পাওয়া যায়নি",
"HANDLED_IN_ANOTHER_TAB": "অন্য ট্যাবে পরিচালিত হচ্ছে",
"REJECT_CALL": "প্রত্যাখ্যান করুন",
+ "DISMISS_CALL": "Dismiss",
"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": {
diff --git a/app/javascript/dashboard/i18n/locale/bn/helpCenter.json b/app/javascript/dashboard/i18n/locale/bn/helpCenter.json
index 797386cc1..129a91b01 100644
--- a/app/javascript/dashboard/i18n/locale/bn/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/bn/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "খসড়া",
"ARCHIVE": "আর্কাইভ",
"TRANSLATE": "অনুবাদ করুন",
+ "MOVE_TO_CATEGORY": "Category",
"DELETE": "মুছে ফেলুন",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "মুছে ফেলুন",
@@ -866,6 +869,28 @@
},
"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": "সরান"
+ },
+ "SAVE": "পরিবর্তন সংরক্ষণ করুন"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "পোর্টাল সফলভাবে তৈরি হয়েছে",
diff --git a/app/javascript/dashboard/i18n/locale/bn/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/bn/inboxMgmt.json
index 049273ab6..9446eee8b 100644
--- a/app/javascript/dashboard/i18n/locale/bn/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/bn/inboxMgmt.json
@@ -308,6 +308,7 @@
"AUTH_PROCESSING": "Meta-র সাথে প্রমাণীকরণ চলছে",
"WAITING_FOR_BUSINESS_INFO": "অনুগ্রহ করে Meta উইন্ডোতে ব্যবসার সেটআপ সম্পন্ন করুন...",
"PROCESSING": "আপনার WhatsApp Business Account সেটআপ করা হচ্ছে",
+ "ENABLING_CALLING": "Enabling WhatsApp Calling on your number…",
"LOADING_SDK": "Facebook SDK লোড হচ্ছে...",
"CANCELLED": "WhatsApp সাইনআপ বাতিল করা হয়েছে",
"SUCCESS_TITLE": "WhatsApp Business Account সংযুক্ত হয়েছে!",
@@ -317,7 +318,8 @@
"AUTH_NOT_COMPLETED": "প্রমাণীকরণ সম্পন্ন হয়নি। অনুগ্রহ করে প্রক্রিয়াটি পুনরায় শুরু করুন।.",
"SUCCESS_FALLBACK": "WhatsApp Business Account সফলভাবে কনফিগার করা হয়েছে",
"MANUAL_FALLBACK": "আপনার নম্বর যদি ইতিমধ্যে WhatsApp Business Platform (API)-এর সাথে সংযুক্ত থাকে, অথবা আপনি যদি নিজস্ব নম্বর অনবোর্ড করতে টেক প্রোভাইডার হন, তাহলে অনুগ্রহ করে {link} ফ্লো ব্যবহার করুন",
- "MANUAL_LINK_TEXT": "ম্যানুয়াল সেটআপ ফ্লো"
+ "MANUAL_LINK_TEXT": "ম্যানুয়াল সেটআপ ফ্লো",
+ "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": "আমরা WhatsApp চ্যানেল সংরক্ষণ করতে পারিনি"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "WhatsApp-এ আপনার গ্রাহকদের সহায়তা দিন"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "ইমেইল",
"DESCRIPTION": "Gmail, Outlook, অথবা অন্যান্য প্রদানকারীর সাথে সংযোগ করুন"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "বট কনফিগারেশন",
"ACCOUNT_HEALTH": "অ্যাকাউন্টের স্বাস্থ্য",
"CSAT": "CSAT",
- "VOICE": "ভয়েস"
+ "VOICE": "ভয়েস",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "চ্যানেল পছন্দসমূহ",
"WIDGET_FEATURES": "উইজেট ফিচারসমূহ",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"WHATSAPP_TEMPLATES_SYNC_SUBHEADER": "আপনার উপলব্ধ টেমপ্লেট আপডেট করতে WhatsApp থেকে মেসেজ টেমপ্লেটগুলো ম্যানুয়ালি সিঙ্ক করুন।.",
"WHATSAPP_TEMPLATES_SYNC_BUTTON": "টেমপ্লেট সিঙ্ক করুন",
"WHATSAPP_TEMPLATES_SYNC_SUCCESS": "টেমপ্লেট সিঙ্ক সফলভাবে শুরু হয়েছে। আপডেট হতে কয়েক মিনিট সময় লাগতে পারে।.",
+ "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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "প্রি-চ্যাট ফর্ম সেটিংস আপডেট করুন"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/bn/integrations.json b/app/javascript/dashboard/i18n/locale/bn/integrations.json
index d3cac1501..bcadf8389 100644
--- a/app/javascript/dashboard/i18n/locale/bn/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/bn/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "যোগাযোগ তৈরি হয়েছে",
"CONTACT_UPDATED": "যোগাযোগ আপডেট হয়েছে",
"CONVERSATION_TYPING_ON": "কথোপকথন টাইপিং চালু আছে",
- "CONVERSATION_TYPING_OFF": "কথোপকথন টাইপিং বন্ধ আছে"
+ "CONVERSATION_TYPING_OFF": "কথোপকথন টাইপিং বন্ধ আছে",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/ca/bulkActions.json b/app/javascript/dashboard/i18n/locale/ca/bulkActions.json
index dae8ef3c2..a4713996a 100644
--- a/app/javascript/dashboard/i18n/locale/ca/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/ca/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} converses seleccionades",
- "AGENT_SELECT_LABEL": "Seleccionar Agent",
- "ASSIGN_CONFIRMATION_LABEL": "Estas segur d'assignar {conversationCount} {conversationLabel} a",
- "UNASSIGN_CONFIRMATION_LABEL": "Estàs segur de desassignar {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Torna",
- "ASSIGN_LABEL": "Assignar",
"NONE": "Ningú",
"CLEAR_SELECTION": "Neteja",
"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}?",
@@ -20,7 +15,6 @@
"RESOLVE_SUCCESFUL": "Les converses s'han resolt correctament.",
"RESOLVE_FAILED": "No s'han pogut resoldre les converses. Torna-ho a provar.",
"ALL_CONVERSATIONS_SELECTED_ALERT": "Les converses visibles en aquesta pàgina només estan seleccionades.",
- "AGENT_LIST_LOADING": "S'estan carregant els agents",
"UPDATE": {
"CHANGE_STATUS": "Canvia l'estat",
"SNOOZE_UNTIL": "Posposat",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assignar etiquetes",
- "NO_LABELS_FOUND": "No s'han trobat etiquetes",
+ "REMOVE_LABELS": "Remove labels",
"ASSIGN_SELECTED_LABELS": "Assigna les etiquetes seleccionades",
+ "REMOVE_SELECTED_LABELS": "Remove selected labels",
"ASSIGN_SUCCESFUL": "L'etiqueta s'ha assignat correctament.",
- "ASSIGN_FAILED": "No s'han pogut assignar les etiquetes. Torna-ho a provar."
+ "ASSIGN_FAILED": "No s'han pogut assignar les etiquetes. Torna-ho a provar.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Selecciona equip",
"NONE": "Ningú",
- "NO_TEAMS_AVAILABLE": "Encara no hi ha cap equip afegit a aquest compte.",
- "ASSIGN_SELECTED_TEAMS": "Assigna l'equip seleccionat.",
"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": "Equips assignats correctament.",
diff --git a/app/javascript/dashboard/i18n/locale/ca/campaign.json b/app/javascript/dashboard/i18n/locale/ca/campaign.json
index fa192101e..1686f5c1e 100644
--- a/app/javascript/dashboard/i18n/locale/ca/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/ca/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Completat",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Completat",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/ca/components.json b/app/javascript/dashboard/i18n/locale/ca/components.json
index 3b0e062fd..2f29110f4 100644
--- a/app/javascript/dashboard/i18n/locale/ca/components.json
+++ b/app/javascript/dashboard/i18n/locale/ca/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ca/contact.json b/app/javascript/dashboard/i18n/locale/ca/contact.json
index c27684817..7cff15bb7 100644
--- a/app/javascript/dashboard/i18n/locale/ca/contact.json
+++ b/app/javascript/dashboard/i18n/locale/ca/contact.json
@@ -20,6 +20,8 @@
"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"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "Assign Labels",
+ "REMOVE_LABELS": "Remove Labels",
"ASSIGN_LABELS_SUCCESS": "L'etiqueta s'ha assignat correctament.",
"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",
diff --git a/app/javascript/dashboard/i18n/locale/ca/conversation.json b/app/javascript/dashboard/i18n/locale/ca/conversation.json
index abe1bbc0e..b9c75f2c4 100644
--- a/app/javascript/dashboard/i18n/locale/ca/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ca/conversation.json
@@ -62,6 +62,7 @@
"UNSUPPORTED_MESSAGE_FACEBOOK": "Aquest missatge no està suportat. Pots veure aquest missatge a l'aplicació Facebook Messenger.",
"UNSUPPORTED_MESSAGE_INSTAGRAM": "Aquest missatge no està suportat. Pots veure aquest missatge a l'aplicació d'Instagram.",
"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": "El missatge s'ha suprimit correctament",
"FAIL_DELETE_MESSSAGE": "No s'ha pogut suprimir el missatge! Torna-ho a provar",
"NO_RESPONSE": "Sense resposta",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Resoldre",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "Posposat fins demà",
"SNOOZED_UNTIL_NEXT_WEEK": "Posposat fins a la setmana vinent",
"SNOOZED_UNTIL_NEXT_REPLY": "Posposat fins a la següent resposta",
+ "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}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "Gravar àudio",
"TIP_AUDIORECORDER_PERMISSION": "Permet l'accés a l'àudio",
"TIP_AUDIORECORDER_ERROR": "No s'ha pogut obrir l'àudio",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "Arrossega i deixa anar aquí per adjuntar-lo",
"START_AUDIO_RECORDING": "Inicia la gravació d'àudio",
"STOP_AUDIO_RECORDING": "Atura la gravació d'àudio",
@@ -299,8 +316,13 @@
"NOT_ANSWERED_YET": "Not answered yet",
"HANDLED_IN_ANOTHER_TAB": "Being handled in another tab",
"REJECT_CALL": "Reject",
+ "DISMISS_CALL": "Descartar",
"JOIN_CALL": "Join call",
- "END_CALL": "End 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": {
diff --git a/app/javascript/dashboard/i18n/locale/ca/helpCenter.json b/app/javascript/dashboard/i18n/locale/ca/helpCenter.json
index 7e9f32942..5453c8e74 100644
--- a/app/javascript/dashboard/i18n/locale/ca/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/ca/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Esborrany",
"ARCHIVE": "Archive",
"TRANSLATE": "Tradueix",
+ "MOVE_TO_CATEGORY": "Categoria",
"DELETE": "Esborrar",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "Esborrar",
@@ -866,6 +869,28 @@
},
"EDIT_CONFIGURATION": "Edit configuration"
},
+ "LAYOUT_CONTENT": {
+ "HEADER": "Aparença",
+ "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": "Suprimeix"
+ },
+ "SAVE": "Save changes"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Portal creat correctament",
diff --git a/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json
index 43209268a..e29814a00 100644
--- a/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json
@@ -308,6 +308,7 @@
"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!",
@@ -317,7 +318,8 @@
"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"
+ "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": "No hem pogut desar el canal WhatsApp"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "Support your customers on WhatsApp"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "Correu electrònic",
"DESCRIPTION": "Connect with Gmail, Outlook, or other providers"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Configuracions del bot",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT",
- "VOICE": "Voice"
+ "VOICE": "Voice",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Actualitza la configuració del formulari de xat prèvia"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/ca/integrations.json b/app/javascript/dashboard/i18n/locale/ca/integrations.json
index c83ca86e8..360c3c6bf 100644
--- a/app/javascript/dashboard/i18n/locale/ca/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ca/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Contacte creat",
"CONTACT_UPDATED": "Contacte actualitzat",
"CONVERSATION_TYPING_ON": "Conversation Typing On",
- "CONVERSATION_TYPING_OFF": "Conversation Typing Off"
+ "CONVERSATION_TYPING_OFF": "Conversation Typing Off",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/cs/bulkActions.json b/app/javascript/dashboard/i18n/locale/cs/bulkActions.json
index 0d5b98d1d..0330986df 100644
--- a/app/javascript/dashboard/i18n/locale/cs/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/cs/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} conversations selected",
- "AGENT_SELECT_LABEL": "Vybrat agenta",
- "ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign {conversationCount} {conversationLabel} to",
- "UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Go back",
- "ASSIGN_LABEL": "Přiřadit",
"NONE": "Nic",
"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}?",
@@ -20,7 +15,6 @@
"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.",
- "AGENT_LIST_LOADING": "Načítání agentů",
"UPDATE": {
"CHANGE_STATUS": "Change status",
"SNOOZE_UNTIL": "Odložit",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assign labels",
- "NO_LABELS_FOUND": "No labels found",
+ "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."
+ "ASSIGN_FAILED": "Failed to assign labels. Please try again.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Vybrat tým",
"NONE": "Nic",
- "NO_TEAMS_AVAILABLE": "There are no teams added to this account yet.",
- "ASSIGN_SELECTED_TEAMS": "Assign selected team.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/cs/campaign.json b/app/javascript/dashboard/i18n/locale/cs/campaign.json
index 69f849a34..2d7efdefd 100644
--- a/app/javascript/dashboard/i18n/locale/cs/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/cs/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/cs/components.json b/app/javascript/dashboard/i18n/locale/cs/components.json
index 76de71d16..2caba589c 100644
--- a/app/javascript/dashboard/i18n/locale/cs/components.json
+++ b/app/javascript/dashboard/i18n/locale/cs/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/cs/contact.json b/app/javascript/dashboard/i18n/locale/cs/contact.json
index 86ce1668f..c66408198 100644
--- a/app/javascript/dashboard/i18n/locale/cs/contact.json
+++ b/app/javascript/dashboard/i18n/locale/cs/contact.json
@@ -20,6 +20,8 @@
"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"
@@ -583,8 +585,11 @@
},
"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",
diff --git a/app/javascript/dashboard/i18n/locale/cs/conversation.json b/app/javascript/dashboard/i18n/locale/cs/conversation.json
index 0fd81f5d5..09d1c5408 100644
--- a/app/javascript/dashboard/i18n/locale/cs/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/cs/conversation.json
@@ -62,6 +62,7 @@
"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": "Zpráva byla úspěšně smazána",
"FAIL_DELETE_MESSSAGE": "Zpráva se nepodařilo odstranit! Zkuste to znovu",
"NO_RESPONSE": "Bez odpovědi",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Vyřešit",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "Odloženo do zítřka",
"SNOOZED_UNTIL_NEXT_WEEK": "Odloženo do příštího týdne",
"SNOOZED_UNTIL_NEXT_REPLY": "Odloženo do další odpovědi",
+ "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}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "Nahrát zvuk",
"TIP_AUDIORECORDER_PERMISSION": "Povolit přístup ke zvuku",
"TIP_AUDIORECORDER_ERROR": "Zvuk se nepodařilo otevřít",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "Přetažením sem připojíte",
"START_AUDIO_RECORDING": "Spustit nahrávání zvuku",
"STOP_AUDIO_RECORDING": "Zastavit nahrávání zvuku",
@@ -299,8 +316,13 @@
"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"
+ "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": {
diff --git a/app/javascript/dashboard/i18n/locale/cs/helpCenter.json b/app/javascript/dashboard/i18n/locale/cs/helpCenter.json
index e620ce5d8..7f9405422 100644
--- a/app/javascript/dashboard/i18n/locale/cs/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/cs/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Koncept",
"ARCHIVE": "Archive",
"TRANSLATE": "Translate",
+ "MOVE_TO_CATEGORY": "Category",
"DELETE": "Vymazat",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "Vymazat",
@@ -866,6 +869,28 @@
},
"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": "Odebrat"
+ },
+ "SAVE": "Save changes"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Portal created successfully",
diff --git a/app/javascript/dashboard/i18n/locale/cs/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/cs/inboxMgmt.json
index 6b36d0eff..2f43b809f 100644
--- a/app/javascript/dashboard/i18n/locale/cs/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/cs/inboxMgmt.json
@@ -308,6 +308,7 @@
"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!",
@@ -317,7 +318,8 @@
"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"
+ "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"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "Support your customers on WhatsApp"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "E-mailová adresa",
"DESCRIPTION": "Connect with Gmail, Outlook, or other providers"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Bot Configuration",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT",
- "VOICE": "Voice"
+ "VOICE": "Voice",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Update Pre Chat Form Settings"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/cs/integrations.json b/app/javascript/dashboard/i18n/locale/cs/integrations.json
index 163c58052..f26b6d5bc 100644
--- a/app/javascript/dashboard/i18n/locale/cs/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/cs/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Contact created",
"CONTACT_UPDATED": "Contact updated",
"CONVERSATION_TYPING_ON": "Conversation Typing On",
- "CONVERSATION_TYPING_OFF": "Conversation Typing Off"
+ "CONVERSATION_TYPING_OFF": "Conversation Typing Off",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/da/bulkActions.json b/app/javascript/dashboard/i18n/locale/da/bulkActions.json
index a0947c74f..fdf3ff597 100644
--- a/app/javascript/dashboard/i18n/locale/da/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/da/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} samtaler valgt",
- "AGENT_SELECT_LABEL": "Vælg agent",
- "ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign {conversationCount} {conversationLabel} to",
- "UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Gå tilbage",
- "ASSIGN_LABEL": "Tildel",
"NONE": "Ingen",
"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}?",
@@ -20,7 +15,6 @@
"RESOLVE_SUCCESFUL": "Samtaler løst med succes.",
"RESOLVE_FAILED": "Failed to resolve conversations. Please try again.",
"ALL_CONVERSATIONS_SELECTED_ALERT": "Samtaler synlig på denne side er kun valgt.",
- "AGENT_LIST_LOADING": "Indlæser agenter",
"UPDATE": {
"CHANGE_STATUS": "Skift status",
"SNOOZE_UNTIL": "Udsæt",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assign labels",
- "NO_LABELS_FOUND": "Ingen labels fundet",
+ "REMOVE_LABELS": "Remove labels",
"ASSIGN_SELECTED_LABELS": "Tildel valgte etiketter",
+ "REMOVE_SELECTED_LABELS": "Remove selected labels",
"ASSIGN_SUCCESFUL": "Etiketter tildelt med succes.",
- "ASSIGN_FAILED": "Failed to assign labels. Please try again."
+ "ASSIGN_FAILED": "Failed to assign labels. Please try again.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Vælg hold",
"NONE": "Ingen",
- "NO_TEAMS_AVAILABLE": "There are no teams added to this account yet.",
- "ASSIGN_SELECTED_TEAMS": "Tildel det valgte team.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/da/campaign.json b/app/javascript/dashboard/i18n/locale/da/campaign.json
index 03cb62904..bda82c798 100644
--- a/app/javascript/dashboard/i18n/locale/da/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/da/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Afsluttet",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Afsluttet",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/da/components.json b/app/javascript/dashboard/i18n/locale/da/components.json
index aa566d5c6..d42be12a5 100644
--- a/app/javascript/dashboard/i18n/locale/da/components.json
+++ b/app/javascript/dashboard/i18n/locale/da/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/da/contact.json b/app/javascript/dashboard/i18n/locale/da/contact.json
index d900a6f59..0423dfac1 100644
--- a/app/javascript/dashboard/i18n/locale/da/contact.json
+++ b/app/javascript/dashboard/i18n/locale/da/contact.json
@@ -20,6 +20,8 @@
"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"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "Tildel Etiketter",
+ "REMOVE_LABELS": "Remove Labels",
"ASSIGN_LABELS_SUCCESS": "Etiketter tildelt med succes.",
"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",
diff --git a/app/javascript/dashboard/i18n/locale/da/conversation.json b/app/javascript/dashboard/i18n/locale/da/conversation.json
index 26253212f..3e959a0c4 100644
--- a/app/javascript/dashboard/i18n/locale/da/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/da/conversation.json
@@ -62,6 +62,7 @@
"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": "Besked slettet",
"FAIL_DELETE_MESSSAGE": "Kunne ikke slette beskeden! Prøv igen",
"NO_RESPONSE": "Intet svar",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Løs",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "Udsat til i morgen",
"SNOOZED_UNTIL_NEXT_WEEK": "Udsat indtil næste uge",
"SNOOZED_UNTIL_NEXT_REPLY": "Udsat indtil næste svar",
+ "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}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "Optag lyd",
"TIP_AUDIORECORDER_PERMISSION": "Tillad adgang til lyd",
"TIP_AUDIORECORDER_ERROR": "Kunne ikke åbne lyden",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "Træk og slip her for at vedhæfte",
"START_AUDIO_RECORDING": "Start lydoptagelse",
"STOP_AUDIO_RECORDING": "Stop lydoptagelse",
@@ -299,8 +316,13 @@
"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"
+ "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": {
diff --git a/app/javascript/dashboard/i18n/locale/da/helpCenter.json b/app/javascript/dashboard/i18n/locale/da/helpCenter.json
index 360d3f081..e641bd74d 100644
--- a/app/javascript/dashboard/i18n/locale/da/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/da/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Kladde",
"ARCHIVE": "Archive",
"TRANSLATE": "Translate",
+ "MOVE_TO_CATEGORY": "Kategori",
"DELETE": "Slet",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "Slet",
@@ -866,6 +869,28 @@
},
"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": "Fjern"
+ },
+ "SAVE": "Save changes"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Portal oprettet",
diff --git a/app/javascript/dashboard/i18n/locale/da/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/da/inboxMgmt.json
index c77da592f..f672656da 100644
--- a/app/javascript/dashboard/i18n/locale/da/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/da/inboxMgmt.json
@@ -308,6 +308,7 @@
"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!",
@@ -317,7 +318,8 @@
"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"
+ "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": "Vi kunne ikke gemme WhatsApp-kanalen"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "Support your customers on WhatsApp"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "E-mail",
"DESCRIPTION": "Connect with Gmail, Outlook, or other providers"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Bot konfiguration",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT",
- "VOICE": "Voice"
+ "VOICE": "Voice",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Update Pre Chat Form Settings"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/da/integrations.json b/app/javascript/dashboard/i18n/locale/da/integrations.json
index 04d430620..6e11fc565 100644
--- a/app/javascript/dashboard/i18n/locale/da/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/da/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Contact created",
"CONTACT_UPDATED": "Contact updated",
"CONVERSATION_TYPING_ON": "Conversation Typing On",
- "CONVERSATION_TYPING_OFF": "Conversation Typing Off"
+ "CONVERSATION_TYPING_OFF": "Conversation Typing Off",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/de/bulkActions.json b/app/javascript/dashboard/i18n/locale/de/bulkActions.json
index ccfe8f0d3..64ffeef2e 100644
--- a/app/javascript/dashboard/i18n/locale/de/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/de/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} Konversationen ausgewählt",
- "AGENT_SELECT_LABEL": "Agent auswählen",
- "ASSIGN_CONFIRMATION_LABEL": "Sind Sie sicher, {conversationCount} {conversationLabel} zuzuweisen",
- "UNASSIGN_CONFIRMATION_LABEL": "Möchten Sie die Zuweisung von {conversationCount} {conversationLabel} wirklich aufheben?",
- "GO_BACK_LABEL": "Zurück",
- "ASSIGN_LABEL": "Zuordnen",
"NONE": "Keine",
"CLEAR_SELECTION": "Leeren",
"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}?",
@@ -20,7 +15,6 @@
"RESOLVE_SUCCESFUL": "Konversationen erfolgreich gelöst.",
"RESOLVE_FAILED": "Konversationen konnten nicht gelöst werden. Bitte versuchen Sie es erneut.",
"ALL_CONVERSATIONS_SELECTED_ALERT": "Nur auf dieser Seite sichtbaren Konversationen sind ausgewählt.",
- "AGENT_LIST_LOADING": "Agenten werden geladen",
"UPDATE": {
"CHANGE_STATUS": "Status ändern",
"SNOOZE_UNTIL": "Erinnern",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Labels zuweisen",
- "NO_LABELS_FOUND": "Keine Labels gefunden",
+ "REMOVE_LABELS": "Remove labels",
"ASSIGN_SELECTED_LABELS": "Ausgewählte Labels zuweisen",
+ "REMOVE_SELECTED_LABELS": "Remove selected labels",
"ASSIGN_SUCCESFUL": "Labels erfolgreich zugewiesen.",
- "ASSIGN_FAILED": "Labels konnten nicht zugewiesen werden. Bitte versuchen Sie es erneut."
+ "ASSIGN_FAILED": "Labels konnten nicht zugewiesen werden. Bitte versuchen Sie es erneut.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Team auswählen",
"NONE": "Keine",
- "NO_TEAMS_AVAILABLE": "Es wurden noch keine Teams zu diesem Konto hinzugefügt.",
- "ASSIGN_SELECTED_TEAMS": "Ausgewähltes Team zuweisen.",
"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 erfolgreich zugewiesen.",
diff --git a/app/javascript/dashboard/i18n/locale/de/campaign.json b/app/javascript/dashboard/i18n/locale/de/campaign.json
index 053b5b276..27e9cfeb1 100644
--- a/app/javascript/dashboard/i18n/locale/de/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/de/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Erledigt",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Erledigt",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/de/components.json b/app/javascript/dashboard/i18n/locale/de/components.json
index 8a8387204..9a02af04c 100644
--- a/app/javascript/dashboard/i18n/locale/de/components.json
+++ b/app/javascript/dashboard/i18n/locale/de/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/de/contact.json b/app/javascript/dashboard/i18n/locale/de/contact.json
index 893bb273a..f1f06d269 100644
--- a/app/javascript/dashboard/i18n/locale/de/contact.json
+++ b/app/javascript/dashboard/i18n/locale/de/contact.json
@@ -20,6 +20,8 @@
"CALL": "Anruf",
"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": "Spracheingang wählen"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "Labels zuweisen",
+ "REMOVE_LABELS": "Remove Labels",
"ASSIGN_LABELS_SUCCESS": "Labels erfolgreich zugewiesen.",
"ASSIGN_LABELS_FAILED": "Fehler beim Zuweisen der Labels",
+ "REMOVE_LABELS_SUCCESS": "Labels removed successfully.",
+ "REMOVE_LABELS_FAILED": "Failed to remove labels",
"DESCRIPTION": "Wählen Sie die Labels aus, die zu den ausgewählten Kontakten hinzugefügt werden sollen.",
"NO_LABELS_FOUND": "Noch keine Labels vorhanden.",
"SELECTED_COUNT": "{count} selected",
diff --git a/app/javascript/dashboard/i18n/locale/de/conversation.json b/app/javascript/dashboard/i18n/locale/de/conversation.json
index 48cdb6bb0..e370d3873 100644
--- a/app/javascript/dashboard/i18n/locale/de/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/de/conversation.json
@@ -62,6 +62,7 @@
"UNSUPPORTED_MESSAGE_FACEBOOK": "Diese Nachricht wird nicht unterstützt. Sie können diese Nachricht in der Facebook-Messenger-App sehen.",
"UNSUPPORTED_MESSAGE_INSTAGRAM": "Diese Nachricht wird nicht unterstützt. Sie können diese Nachricht in der Instagram-App sehen.",
"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": "Nachricht erfolgreich gelöscht",
"FAIL_DELETE_MESSSAGE": "Nachricht konnte nicht gelöscht werden! Versuchen Sie es erneut",
"NO_RESPONSE": "Keine Antwort",
@@ -79,13 +80,22 @@
"OUTGOING_CALL": "Ausgehender Anruf",
"CALL_IN_PROGRESS": "Anruf läuft",
"NO_ANSWER": "Keine Antwort",
+ "NO_ANSWER_OUTBOUND_LABEL": "Keine Antwort",
+ "NO_ANSWER_OUTBOUND_SUBTEXT": "Contact didn't pick up",
"MISSED_CALL": "Entgangener Anruf",
+ "MISSED_CALL_INBOUND_SUBTEXT": "No agent picked up",
+ "MISSED_CALL_DECLINED_BY": "Declined by {agentName}",
"CALL_ENDED": "Anruf beendet",
+ "HANDLED_BY": "Handled by {agentName}",
"NOT_ANSWERED_YET": "Noch nicht beantwortet",
+ "CALLING": "Calling…",
"THEY_ANSWERED": "Sie antworteten",
"YOU_ANSWERED": "Sie haben beantwortet",
"AGENT_ANSWERED": "{agentName} answered",
- "JOIN_CALL": "Join call"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Fall schließen",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "Schlummern bis morgen",
"SNOOZED_UNTIL_NEXT_WEEK": "Schlummern bis nächste Woche",
"SNOOZED_UNTIL_NEXT_REPLY": "Schlummern bis zur nächsten Antwort",
+ "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}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "Audio aufzeichnen",
"TIP_AUDIORECORDER_PERMISSION": "Zugriff auf Audio zulassen",
"TIP_AUDIORECORDER_ERROR": "Audio konnte nicht geöffnet werden",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "Zum Anhängen hierher ziehen und ablegen",
"START_AUDIO_RECORDING": "Audioaufzeichnung starten",
"STOP_AUDIO_RECORDING": "Audioaufzeichnung stoppen",
@@ -299,8 +316,13 @@
"NOT_ANSWERED_YET": "Noch nicht beantwortet",
"HANDLED_IN_ANOTHER_TAB": "Being handled in another tab",
"REJECT_CALL": "Reject",
+ "DISMISS_CALL": "Verwerfen",
"JOIN_CALL": "Join call",
- "END_CALL": "End 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": {
diff --git a/app/javascript/dashboard/i18n/locale/de/helpCenter.json b/app/javascript/dashboard/i18n/locale/de/helpCenter.json
index f34c83337..4d416885d 100644
--- a/app/javascript/dashboard/i18n/locale/de/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/de/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Entwürfe",
"ARCHIVE": "Archive",
"TRANSLATE": "Übersetzen",
+ "MOVE_TO_CATEGORY": "Kategorie",
"DELETE": "Löschen",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "Löschen",
@@ -866,6 +869,28 @@
},
"EDIT_CONFIGURATION": "Edit configuration"
},
+ "LAYOUT_CONTENT": {
+ "HEADER": "Darstellung",
+ "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": "Entfernen"
+ },
+ "SAVE": "Save changes"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Portal erfolgreich erstellt",
diff --git a/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json
index 2f7b503ba..4d5f5f71d 100644
--- a/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json
@@ -308,6 +308,7 @@
"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!",
@@ -317,7 +318,8 @@
"AUTH_NOT_COMPLETED": "Authentifizierung nicht abgeschlossen. Bitte starte den Prozess neu.",
"SUCCESS_FALLBACK": "WhatsApp Business Account wurde erfolgreich konfiguriert",
"MANUAL_FALLBACK": "Wenn Ihre Nummer bereits mit der WhatsApp Business Plattform (API) verbunden ist, oder wenn Sie als Technologieanbieter Ihre eigene Nummer an Bord haben, verwenden Sie bitte den {link} Flow",
- "MANUAL_LINK_TEXT": "Manueller Einrichtungsablauf"
+ "MANUAL_LINK_TEXT": "Manueller Einrichtungsablauf",
+ "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": "Wir konnten den WhatsApp-Kanal nicht speichern"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "Support your customers on WhatsApp"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "E-Mail",
"DESCRIPTION": "Connect with Gmail, Outlook, or other providers"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Bot-Konfiguration",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT",
- "VOICE": "Voice"
+ "VOICE": "Voice",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Pre Chat Einstellungen aktualisieren"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/de/integrations.json b/app/javascript/dashboard/i18n/locale/de/integrations.json
index be2430820..6c0f93bee 100644
--- a/app/javascript/dashboard/i18n/locale/de/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/de/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Kontakt erstellt",
"CONTACT_UPDATED": "Kontakt aktualisiert",
"CONVERSATION_TYPING_ON": "Conversation Typing On",
- "CONVERSATION_TYPING_OFF": "Conversation Typing Off"
+ "CONVERSATION_TYPING_OFF": "Conversation Typing Off",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/el/bulkActions.json b/app/javascript/dashboard/i18n/locale/el/bulkActions.json
index 309b88c9e..5bb3d1df8 100644
--- a/app/javascript/dashboard/i18n/locale/el/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/el/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} σινομιλίες επιλέχθηκαν",
- "AGENT_SELECT_LABEL": "Επιλογή πράκτορα",
- "ASSIGN_CONFIRMATION_LABEL": "Είσαστε σίγουροι ότι θέλετε να αντιστοιχίσετε {conversationCount} {conversationLabel} στον",
- "UNASSIGN_CONFIRMATION_LABEL": "Είσαστε σίγουροι ότι θέλετε να αφαιρέσετε την αντιστοίχιση {conversationCount} {conversationLabel} στον;",
- "GO_BACK_LABEL": "Πίσω",
- "ASSIGN_LABEL": "Αντιστοίχιση",
"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}?",
@@ -20,7 +15,6 @@
"RESOLVE_SUCCESFUL": "Οι σινομιλίες επιλύθηκαν επιτυχώς.",
"RESOLVE_FAILED": "Failed to resolve conversations. Please try again.",
"ALL_CONVERSATIONS_SELECTED_ALERT": "Επιλέχθηκαν μόνο οι σινομιλίες που φαίνονται στην σελίδα.",
- "AGENT_LIST_LOADING": "Φόρτωση πρακτόρων",
"UPDATE": {
"CHANGE_STATUS": "Αλλαγή κατάστασης",
"SNOOZE_UNTIL": "Αναβολή",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assign labels",
- "NO_LABELS_FOUND": "Δεν βρέθηκαν ετικέτες",
+ "REMOVE_LABELS": "Remove labels",
"ASSIGN_SELECTED_LABELS": "Ανάθεση επιλεγμένων ετικετών",
+ "REMOVE_SELECTED_LABELS": "Remove selected labels",
"ASSIGN_SUCCESFUL": "Επιτυχής ανάθεση ετικετών.",
- "ASSIGN_FAILED": "Failed to assign labels. Please try again."
+ "ASSIGN_FAILED": "Failed to assign labels. Please try again.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Επιλογή ομάδας",
"NONE": "Κανένα",
- "NO_TEAMS_AVAILABLE": "Δεν έχουν προστεθεί ομάδες σε αυτόν τον λογαριασμό ακόμα.",
- "ASSIGN_SELECTED_TEAMS": "Ανάθεση επιλεγμένης ομάδας.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/el/campaign.json b/app/javascript/dashboard/i18n/locale/el/campaign.json
index 3d0e6b062..f3f5aadd5 100644
--- a/app/javascript/dashboard/i18n/locale/el/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/el/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Ολοκληρώθηκε",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Ολοκληρώθηκε",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/el/components.json b/app/javascript/dashboard/i18n/locale/el/components.json
index 90cbbbded..28c48d8dc 100644
--- a/app/javascript/dashboard/i18n/locale/el/components.json
+++ b/app/javascript/dashboard/i18n/locale/el/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/el/contact.json b/app/javascript/dashboard/i18n/locale/el/contact.json
index 5508e2d64..677cd5e4e 100644
--- a/app/javascript/dashboard/i18n/locale/el/contact.json
+++ b/app/javascript/dashboard/i18n/locale/el/contact.json
@@ -20,6 +20,8 @@
"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"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "Ανάθεση Ετικετών",
+ "REMOVE_LABELS": "Remove Labels",
"ASSIGN_LABELS_SUCCESS": "Επιτυχής ανάθεση ετικετών.",
"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",
diff --git a/app/javascript/dashboard/i18n/locale/el/conversation.json b/app/javascript/dashboard/i18n/locale/el/conversation.json
index 51efa7bc4..206bc68ab 100644
--- a/app/javascript/dashboard/i18n/locale/el/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/el/conversation.json
@@ -62,6 +62,7 @@
"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": "Το μήνυμα διαγράφηκε επιτυχώς",
"FAIL_DELETE_MESSSAGE": "Δεν ήταν δυνατή η διαγραφή μηνύματος! Προσπαθήστε ξανά",
"NO_RESPONSE": "Καμία ανταπόκριση",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Επίλυση",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "Αναβλήθηκε μέχρι αύριο",
"SNOOZED_UNTIL_NEXT_WEEK": "Αναβολή έως την επόμενη εβδομάδα",
"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}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "Εγγραφή ήχου",
"TIP_AUDIORECORDER_PERMISSION": "Να επιτρέπεται η πρόσβαση στον ήχο",
"TIP_AUDIORECORDER_ERROR": "Αδυναμία ανοίγματος ήχου",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "Σύρετε και αφήστε εδώ για επισύναψη",
"START_AUDIO_RECORDING": "Έναρξη ηχογράφησης",
"STOP_AUDIO_RECORDING": "Διακοπή ηχογράφησης",
@@ -299,8 +316,13 @@
"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"
+ "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": {
diff --git a/app/javascript/dashboard/i18n/locale/el/helpCenter.json b/app/javascript/dashboard/i18n/locale/el/helpCenter.json
index bdf939212..1e3b5de1e 100644
--- a/app/javascript/dashboard/i18n/locale/el/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/el/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Πρόχειρο",
"ARCHIVE": "Archive",
"TRANSLATE": "Translate",
+ "MOVE_TO_CATEGORY": "Κατηγορία",
"DELETE": "Διαγραφή",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "Διαγραφή",
@@ -866,6 +869,28 @@
},
"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": "Διαγραφή"
+ },
+ "SAVE": "Save changes"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Ο φάκελος δημιουργήθηκε με επιτυχία",
diff --git a/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json
index 3381c1eee..516f5c6d6 100644
--- a/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json
@@ -308,6 +308,7 @@
"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!",
@@ -317,7 +318,8 @@
"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"
+ "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": "Δεν ήμασταν σε θέση να αποθηκεύσουμε το κανάλι WhatsApp"
@@ -465,6 +467,10 @@
"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"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Ρυθμίσεις Bot",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT",
- "VOICE": "Voice"
+ "VOICE": "Voice",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Update Pre Chat Form Settings"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/el/integrations.json b/app/javascript/dashboard/i18n/locale/el/integrations.json
index 296f40520..6f2f46697 100644
--- a/app/javascript/dashboard/i18n/locale/el/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/el/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Contact created",
"CONTACT_UPDATED": "Contact updated",
"CONVERSATION_TYPING_ON": "Conversation Typing On",
- "CONVERSATION_TYPING_OFF": "Conversation Typing Off"
+ "CONVERSATION_TYPING_OFF": "Conversation Typing Off",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/es/bulkActions.json b/app/javascript/dashboard/i18n/locale/es/bulkActions.json
index d27708e72..b8840aecf 100644
--- a/app/javascript/dashboard/i18n/locale/es/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/es/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} conversaciones seleccionadas",
- "AGENT_SELECT_LABEL": "Seleccionar agente",
- "ASSIGN_CONFIRMATION_LABEL": "¿Está seguro que desea asignar {conversationCount} {conversationLabel} a",
- "UNASSIGN_CONFIRMATION_LABEL": "¿Está seguro de desasignar {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Volver",
- "ASSIGN_LABEL": "Asignar",
"NONE": "Ninguna",
"CLEAR_SELECTION": "Limpiar",
"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}?",
@@ -20,7 +15,6 @@
"RESOLVE_SUCCESFUL": "Conversaciones resueltas con éxito.",
"RESOLVE_FAILED": "Error al resolver las conversaciones, inténtelo de nuevo.",
"ALL_CONVERSATIONS_SELECTED_ALERT": "Las conversaciones visibles en esta página sólo están seleccionadas.",
- "AGENT_LIST_LOADING": "Cargando agentes",
"UPDATE": {
"CHANGE_STATUS": "Cambiar estado",
"SNOOZE_UNTIL": "Posponer",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Asignar etiqueta",
- "NO_LABELS_FOUND": "No se encontraron etiquetas",
+ "REMOVE_LABELS": "Remove labels",
"ASSIGN_SELECTED_LABELS": "Asignar etiquetas seleccionadas",
+ "REMOVE_SELECTED_LABELS": "Remove selected labels",
"ASSIGN_SUCCESFUL": "Etiquetas asignadas correctamente.",
- "ASSIGN_FAILED": "Error al asignar etiquetas, inténtalo de nuevo."
+ "ASSIGN_FAILED": "Error al asignar etiquetas, inténtalo de nuevo.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Seleccionar equipo",
"NONE": "Ninguna",
- "NO_TEAMS_AVAILABLE": "Todavía no hay equipos añadidos a esta cuenta.",
- "ASSIGN_SELECTED_TEAMS": "Asignar equipo seleccionado.",
"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": "Equipos asignados correctamente.",
diff --git a/app/javascript/dashboard/i18n/locale/es/campaign.json b/app/javascript/dashboard/i18n/locale/es/campaign.json
index ff7bcce65..038d50d38 100644
--- a/app/javascript/dashboard/i18n/locale/es/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/es/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Completado",
"SCHEDULED": "Programado"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Completado",
"SCHEDULED": "Programado"
},
diff --git a/app/javascript/dashboard/i18n/locale/es/components.json b/app/javascript/dashboard/i18n/locale/es/components.json
index f588a7602..cebd9a390 100644
--- a/app/javascript/dashboard/i18n/locale/es/components.json
+++ b/app/javascript/dashboard/i18n/locale/es/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/es/contact.json b/app/javascript/dashboard/i18n/locale/es/contact.json
index 8142671dd..8978dc0c8 100644
--- a/app/javascript/dashboard/i18n/locale/es/contact.json
+++ b/app/javascript/dashboard/i18n/locale/es/contact.json
@@ -20,6 +20,8 @@
"CALL": "Llamar",
"CALL_INITIATED": "Llamando al contacto…",
"CALL_FAILED": "No se puede iniciar la llamada. Por favor, inténtelo de nuevo.",
+ "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": "Seleccionar un buzón de entrada"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "Asignar etiquetas",
+ "REMOVE_LABELS": "Remove Labels",
"ASSIGN_LABELS_SUCCESS": "Etiquetas asignadas correctamente.",
"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",
diff --git a/app/javascript/dashboard/i18n/locale/es/conversation.json b/app/javascript/dashboard/i18n/locale/es/conversation.json
index 2418a1392..cb0e2df70 100644
--- a/app/javascript/dashboard/i18n/locale/es/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/es/conversation.json
@@ -62,6 +62,7 @@
"UNSUPPORTED_MESSAGE_FACEBOOK": "Este mensaje no es compatible. Puedes ver este mensaje en la aplicación de Facebook Messenger.",
"UNSUPPORTED_MESSAGE_INSTAGRAM": "Este mensaje no es compatible. Puedes ver este mensaje en la aplicación de Instagram.",
"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": "Mensaje eliminado correctamente",
"FAIL_DELETE_MESSSAGE": "¡No se pudo eliminar el mensaje! Inténtalo de nuevo",
"NO_RESPONSE": "No hay respuesta",
@@ -79,13 +80,22 @@
"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": "Unirse a la llamada"
+ "JOIN_CALL": "Unirse a la llamada",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Resolver",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "Pospuesto hasta mañana",
"SNOOZED_UNTIL_NEXT_WEEK": "Pospuesto hasta la próxima semana",
"SNOOZED_UNTIL_NEXT_REPLY": "Posponer hasta la siguiente respuesta",
+ "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}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "Grabar audio",
"TIP_AUDIORECORDER_PERMISSION": "Permitir el acceso a audio",
"TIP_AUDIORECORDER_ERROR": "No se pudo abrir el audio",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "Arrastra y suelta aquí para adjuntar",
"START_AUDIO_RECORDING": "Iniciar grabación de audio",
"STOP_AUDIO_RECORDING": "Detener grabación de audio",
@@ -299,8 +316,13 @@
"NOT_ANSWERED_YET": "Not answered yet",
"HANDLED_IN_ANOTHER_TAB": "Atendido en otra pestaña",
"REJECT_CALL": "Rechazar",
+ "DISMISS_CALL": "Descartar",
"JOIN_CALL": "Unirse a la llamada",
- "END_CALL": "Terminar llamada"
+ "END_CALL": "Terminar llamada",
+ "MUTE": "Mute mic",
+ "UNMUTE": "Unmute mic",
+ "VIEW_CHAT_HISTORY": "View chat history",
+ "GO_TO_CONVERSATION": "Go to conversation thread"
}
},
"EMAIL_TRANSCRIPT": {
diff --git a/app/javascript/dashboard/i18n/locale/es/helpCenter.json b/app/javascript/dashboard/i18n/locale/es/helpCenter.json
index 9dbf7d92c..4b13441ee 100644
--- a/app/javascript/dashboard/i18n/locale/es/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/es/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Borrador",
"ARCHIVE": "Archive",
"TRANSLATE": "Traducir",
+ "MOVE_TO_CATEGORY": "Categoría",
"DELETE": "Eliminar",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "Eliminar",
@@ -866,6 +869,28 @@
},
"EDIT_CONFIGURATION": "Edit configuration"
},
+ "LAYOUT_CONTENT": {
+ "HEADER": "Apariencia",
+ "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": "Eliminar"
+ },
+ "SAVE": "Save changes"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Portal creado correctamente",
diff --git a/app/javascript/dashboard/i18n/locale/es/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/es/inboxMgmt.json
index 980aa606e..1138e4abf 100644
--- a/app/javascript/dashboard/i18n/locale/es/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/es/inboxMgmt.json
@@ -308,6 +308,7 @@
"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!",
@@ -317,7 +318,8 @@
"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"
+ "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": "No pudimos guardar el canal de WhatsApp"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "Support your customers on WhatsApp"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "E-mail",
"DESCRIPTION": "Connect with Gmail, Outlook, or other providers"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Configuración del bot",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "Encuestas de Satisfacción",
- "VOICE": "Voice"
+ "VOICE": "Voice",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Actualizar configuración de Formulario de Chat"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/es/integrations.json b/app/javascript/dashboard/i18n/locale/es/integrations.json
index f6c9ed63c..c04f79403 100644
--- a/app/javascript/dashboard/i18n/locale/es/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/es/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Contacto creado",
"CONTACT_UPDATED": "Contacto actualizado",
"CONVERSATION_TYPING_ON": "Conversation Typing On",
- "CONVERSATION_TYPING_OFF": "Conversation Typing Off"
+ "CONVERSATION_TYPING_OFF": "Conversation Typing Off",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/et/bulkActions.json b/app/javascript/dashboard/i18n/locale/et/bulkActions.json
index 2170173f2..ed302714d 100644
--- a/app/javascript/dashboard/i18n/locale/et/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/et/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} conversations selected",
- "AGENT_SELECT_LABEL": "Select agent",
- "ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign {conversationCount} {conversationLabel} to",
- "UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Go back",
- "ASSIGN_LABEL": "Assign",
"NONE": "Mitte ükski",
"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}?",
@@ -20,7 +15,6 @@
"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.",
- "AGENT_LIST_LOADING": "Loading agents",
"UPDATE": {
"CHANGE_STATUS": "Change status",
"SNOOZE_UNTIL": "Snooze",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assign labels",
- "NO_LABELS_FOUND": "No labels found",
+ "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."
+ "ASSIGN_FAILED": "Failed to assign labels. Please try again.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Select team",
"NONE": "None",
- "NO_TEAMS_AVAILABLE": "There are no teams added to this account yet.",
- "ASSIGN_SELECTED_TEAMS": "Assign selected team.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/et/campaign.json b/app/javascript/dashboard/i18n/locale/et/campaign.json
index 10366e79e..e407de04f 100644
--- a/app/javascript/dashboard/i18n/locale/et/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/et/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Töötlemisel",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Töötlemisel",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/et/components.json b/app/javascript/dashboard/i18n/locale/et/components.json
index a75d35b08..3ee865a89 100644
--- a/app/javascript/dashboard/i18n/locale/et/components.json
+++ b/app/javascript/dashboard/i18n/locale/et/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/et/contact.json b/app/javascript/dashboard/i18n/locale/et/contact.json
index db03757ef..4400ac26e 100644
--- a/app/javascript/dashboard/i18n/locale/et/contact.json
+++ b/app/javascript/dashboard/i18n/locale/et/contact.json
@@ -20,6 +20,8 @@
"CALL": "Helista",
"CALL_INITIATED": "Helistatakse kontaktile…",
"CALL_FAILED": "Kõne alustamine ebaõnnestus. Palun proovi uuesti.",
+ "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": "Vali häälpostkast"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "Märgendite määramine",
+ "REMOVE_LABELS": "Remove Labels",
"ASSIGN_LABELS_SUCCESS": "Märgendid määrati edukalt.",
"ASSIGN_LABELS_FAILED": "Märgendite määramine ebaõnnestus",
+ "REMOVE_LABELS_SUCCESS": "Labels removed successfully.",
+ "REMOVE_LABELS_FAILED": "Failed to remove labels",
"DESCRIPTION": "Valige sildid, mida soovite valitud kontaktidele lisada.",
"NO_LABELS_FOUND": "Silte pole veel saadaval.",
"SELECTED_COUNT": "{count} valitud",
diff --git a/app/javascript/dashboard/i18n/locale/et/conversation.json b/app/javascript/dashboard/i18n/locale/et/conversation.json
index e8f04d96d..16923b08c 100644
--- a/app/javascript/dashboard/i18n/locale/et/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/et/conversation.json
@@ -62,6 +62,7 @@
"UNSUPPORTED_MESSAGE_FACEBOOK": "See sõnum ei ole toetatud. Sa saad seda vaadata Facebook Messenger rakenduses.",
"UNSUPPORTED_MESSAGE_INSTAGRAM": "See sõnum ei ole toetatud. Sa saad seda vaadata Instagram rakenduses.",
"UNSUPPORTED_MESSAGE_TIKTOK": "See sõnum ei ole toetatud. Sa saad seda vaadata TikTok rakenduses.",
+ "UNSUPPORTED_MESSAGE_WHATSAPP": "This message is unsupported. You can view this message on the WhatsApp app.",
"SUCCESS_DELETE_MESSAGE": "Sõnum kustutati edukalt",
"FAIL_DELETE_MESSSAGE": "Sõnumit ei õnnestunud kustutada! Proovi uuesti",
"NO_RESPONSE": "Vastust pole",
@@ -79,13 +80,22 @@
"OUTGOING_CALL": "Väljaminev kõne",
"CALL_IN_PROGRESS": "Kõne käib",
"NO_ANSWER": "Vastamata",
+ "NO_ANSWER_OUTBOUND_LABEL": "Vastamata",
+ "NO_ANSWER_OUTBOUND_SUBTEXT": "Contact didn't pick up",
"MISSED_CALL": "Vastamata kõne",
+ "MISSED_CALL_INBOUND_SUBTEXT": "No agent picked up",
+ "MISSED_CALL_DECLINED_BY": "Declined by {agentName}",
"CALL_ENDED": "Kõne lõppenud",
+ "HANDLED_BY": "Handled by {agentName}",
"NOT_ANSWERED_YET": "Veel vastamata",
+ "CALLING": "Calling…",
"THEY_ANSWERED": "Nad vastasid",
"YOU_ANSWERED": "Sa vastasid",
"AGENT_ANSWERED": "{agentName} answered",
- "JOIN_CALL": "Liitu kõnega"
+ "JOIN_CALL": "Liitu kõnega",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Lahenda",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "Edasilükatud homseni",
"SNOOZED_UNTIL_NEXT_WEEK": "Edasilükatud järgmise nädalani",
"SNOOZED_UNTIL_NEXT_REPLY": "Edasilükatud järgmise vastuseni",
+ "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}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "Salvesta heli",
"TIP_AUDIORECORDER_PERMISSION": "Luba juurdepääs helile",
"TIP_AUDIORECORDER_ERROR": "Heli avamine ebaõnnestus",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "Lohista siia manusena lisamiseks",
"START_AUDIO_RECORDING": "Alusta heli salvestamist",
"STOP_AUDIO_RECORDING": "Peata heli salvestamine",
@@ -299,8 +316,13 @@
"NOT_ANSWERED_YET": "Veel ei ole vastatud",
"HANDLED_IN_ANOTHER_TAB": "Käsitletakse teises vahekaardis",
"REJECT_CALL": "Keeldu",
+ "DISMISS_CALL": "Dismiss",
"JOIN_CALL": "Liitu kõnega",
- "END_CALL": "Lõpeta kõne"
+ "END_CALL": "Lõpeta kõne",
+ "MUTE": "Mute mic",
+ "UNMUTE": "Unmute mic",
+ "VIEW_CHAT_HISTORY": "View chat history",
+ "GO_TO_CONVERSATION": "Go to conversation thread"
}
},
"EMAIL_TRANSCRIPT": {
diff --git a/app/javascript/dashboard/i18n/locale/et/helpCenter.json b/app/javascript/dashboard/i18n/locale/et/helpCenter.json
index fbe78738a..fd4e98413 100644
--- a/app/javascript/dashboard/i18n/locale/et/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/et/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Mustand",
"ARCHIVE": "Arhiveeri",
"TRANSLATE": "Tõlgi",
+ "MOVE_TO_CATEGORY": "Category",
"DELETE": "Delete",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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",
@@ -866,6 +869,28 @@
},
"EDIT_CONFIGURATION": "Muuda seadistust"
},
+ "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": "Eemalda"
+ },
+ "SAVE": "Salvesta muudatused"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Portaal loodud edukalt",
diff --git a/app/javascript/dashboard/i18n/locale/et/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/et/inboxMgmt.json
index b3a509860..16b86dcae 100644
--- a/app/javascript/dashboard/i18n/locale/et/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/et/inboxMgmt.json
@@ -308,6 +308,7 @@
"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!",
@@ -317,7 +318,8 @@
"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"
+ "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": "WhatsAppi kanalit ei õnnestunud salvestada"
@@ -465,6 +467,10 @@
"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"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Boti seadistamine",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT",
- "VOICE": "Hääl"
+ "VOICE": "Hääl",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Uuenda vestluse-eelse vormi seadeid"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/et/integrations.json b/app/javascript/dashboard/i18n/locale/et/integrations.json
index 54b71051a..a65ce7301 100644
--- a/app/javascript/dashboard/i18n/locale/et/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/et/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Kontakt loodud",
"CONTACT_UPDATED": "Kontakt uuendatud",
"CONVERSATION_TYPING_ON": "Vestluses kirjutamise alustamine",
- "CONVERSATION_TYPING_OFF": "Vestluses kirjutamise lõpetamine"
+ "CONVERSATION_TYPING_OFF": "Vestluses kirjutamise lõpetamine",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/fa/bulkActions.json b/app/javascript/dashboard/i18n/locale/fa/bulkActions.json
index 876d88f0f..deaf2245d 100644
--- a/app/javascript/dashboard/i18n/locale/fa/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/fa/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} گفتگو انتخاب شده است",
- "AGENT_SELECT_LABEL": "انتخاب اپراتور",
- "ASSIGN_CONFIRMATION_LABEL": "آیا مطمئن هستید که به {conversationCount} {conversationLabel} اختصاص میدهید",
- "UNASSIGN_CONFIRMATION_LABEL": "آیا مطمئنید که {conversationCount} {conversationLabel} را میخواهید اختصاص را لغو کنید؟",
- "GO_BACK_LABEL": "بازگشت",
- "ASSIGN_LABEL": "اختصاص دادن",
"NONE": "هیچکدام",
"CLEAR_SELECTION": "پاک کردن",
"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}?",
@@ -20,7 +15,6 @@
"RESOLVE_SUCCESFUL": "گفتگو با موفقیت حل شد.",
"RESOLVE_FAILED": "گفتگو حل نشد، لطفا دوباره امتحان کنید.",
"ALL_CONVERSATIONS_SELECTED_ALERT": "گفتگوهای قابل مشاهده در این صفحه فقط انتخاب میشوند.",
- "AGENT_LIST_LOADING": "بارگذاری ایجنت ها",
"UPDATE": {
"CHANGE_STATUS": "تغییر وضعیت",
"SNOOZE_UNTIL": "به تعویق انداختن",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "برچسب اختصاص دهید",
- "NO_LABELS_FOUND": "هیچ برچسبی یافت نشد",
+ "REMOVE_LABELS": "Remove labels",
"ASSIGN_SELECTED_LABELS": "اختصاص برچسبهای انتخاب شده",
+ "REMOVE_SELECTED_LABELS": "Remove selected labels",
"ASSIGN_SUCCESFUL": "برچسبها با موفقیت اختصاص یافتند.",
- "ASSIGN_FAILED": "اختصاص برچسب به صورت موفق انجام نشد، لطفا دوباره امتحان کنید."
+ "ASSIGN_FAILED": "اختصاص برچسب به صورت موفق انجام نشد، لطفا دوباره امتحان کنید.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "انتخاب تیم",
"NONE": "هیچکدام",
- "NO_TEAMS_AVAILABLE": "هنوز هیچ تیمی به این حساب کاربری اضافه نشده است.",
- "ASSIGN_SELECTED_TEAMS": "اختصاص تیم انتخاب شده.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/fa/campaign.json b/app/javascript/dashboard/i18n/locale/fa/campaign.json
index da401f57e..f4a2fab90 100644
--- a/app/javascript/dashboard/i18n/locale/fa/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/fa/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "تکمیل شد",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "تکمیل شد",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/fa/companies.json b/app/javascript/dashboard/i18n/locale/fa/companies.json
index 654b9fc39..91b7f1fad 100644
--- a/app/javascript/dashboard/i18n/locale/fa/companies.json
+++ b/app/javascript/dashboard/i18n/locale/fa/companies.json
@@ -80,7 +80,7 @@
"DESCRIPTION": "Search for an existing contact and link it to this company.",
"SEARCH_PLACEHOLDER": "جستجوی مخاطبین...",
"INITIAL": "Start typing to search contacts.",
- "EMPTY": "No contacts found.",
+ "EMPTY": "هیچ مخاطبی پیدا نشد.",
"CONFIRM_TITLE": "Link contact",
"CONFIRM_DESCRIPTION": "Confirm the company and contact before linking them.",
"COMPANY_LABEL": "شرکت",
diff --git a/app/javascript/dashboard/i18n/locale/fa/components.json b/app/javascript/dashboard/i18n/locale/fa/components.json
index cab63a405..2681c35a3 100644
--- a/app/javascript/dashboard/i18n/locale/fa/components.json
+++ b/app/javascript/dashboard/i18n/locale/fa/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/fa/contact.json b/app/javascript/dashboard/i18n/locale/fa/contact.json
index 2a42fb278..57e6c5488 100644
--- a/app/javascript/dashboard/i18n/locale/fa/contact.json
+++ b/app/javascript/dashboard/i18n/locale/fa/contact.json
@@ -20,6 +20,8 @@
"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"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "اختصاص برچسبها",
+ "REMOVE_LABELS": "Remove Labels",
"ASSIGN_LABELS_SUCCESS": "برچسبها با موفقیت اختصاص یافتند.",
"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",
diff --git a/app/javascript/dashboard/i18n/locale/fa/conversation.json b/app/javascript/dashboard/i18n/locale/fa/conversation.json
index cdd3733be..b965cf4dd 100644
--- a/app/javascript/dashboard/i18n/locale/fa/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/fa/conversation.json
@@ -62,6 +62,7 @@
"UNSUPPORTED_MESSAGE_FACEBOOK": "این پیام پشتیبانی نمی شود. می توانید این پیام را در برنامه فیس بوک مسنجر مشاهده کنید.",
"UNSUPPORTED_MESSAGE_INSTAGRAM": "این پیام پشتیبانی نمی شود. می توانید این پیام را در برنامه اینستاگرام مشاهده کنید.",
"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": "پیام با موفقیت حذف شد",
"FAIL_DELETE_MESSSAGE": "پیام حذف نشد! دوباره امتحان کنید",
"NO_RESPONSE": "بدون پاسخ",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "نمایش کمتر"
},
"HEADER": {
"RESOLVE_ACTION": "حل شد",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "تا فردا به تعویق افتاد",
"SNOOZED_UNTIL_NEXT_WEEK": "تا هفته آینده به تعویق افتاد",
"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}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "ضبط صدا",
"TIP_AUDIORECORDER_PERMISSION": "اجازه دسترسی به صدا",
"TIP_AUDIORECORDER_ERROR": "صدا را نمیتوان باز کند",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "برای ضمیمه کردن درگ و درآپ کنید",
"START_AUDIO_RECORDING": "در حال شروع ضبط صدا",
"STOP_AUDIO_RECORDING": "در حال توقف ضبط صدا",
@@ -299,8 +316,13 @@
"NOT_ANSWERED_YET": "Not answered yet",
"HANDLED_IN_ANOTHER_TAB": "Being handled in another tab",
"REJECT_CALL": "Reject",
+ "DISMISS_CALL": "نادیده بگیر",
"JOIN_CALL": "Join call",
- "END_CALL": "End 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": {
@@ -367,16 +389,16 @@
"MACROS": "ماکروها",
"LINEAR_ISSUES": "Linked Linear Issues",
"SHOPIFY_ORDERS": "Shopify Orders",
- "SHARED_FILES": "Attachments"
+ "SHARED_FILES": "پیوستها"
},
"SHARED_FILES": {
"EMPTY": "No attachments yet",
- "DOWNLOAD": "Download file",
+ "DOWNLOAD": "دریافت پرونده",
"DOWNLOAD_ERROR": "Could not download the file. Please try again.",
"MEDIA_HEADING": "Media",
- "FILES_HEADING": "Files",
+ "FILES_HEADING": "پروندهها",
"VIEW_ALL": "مشاهده همه",
- "SHOW_LESS": "Show less",
+ "SHOW_LESS": "نمایش کمتر",
"MORE_COUNT": "+{count}",
"UNTITLED_FILE": "Untitled file"
},
diff --git a/app/javascript/dashboard/i18n/locale/fa/helpCenter.json b/app/javascript/dashboard/i18n/locale/fa/helpCenter.json
index 7d4966529..e2ce47b87 100644
--- a/app/javascript/dashboard/i18n/locale/fa/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/fa/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "پیشنویس",
"ARCHIVE": "Archive",
"TRANSLATE": "ترجمه",
+ "MOVE_TO_CATEGORY": "دستهبندی",
"DELETE": "حذف",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "حذف",
@@ -866,6 +869,28 @@
},
"EDIT_CONFIGURATION": "Edit configuration"
},
+ "LAYOUT_CONTENT": {
+ "HEADER": "ظاهری",
+ "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": "حذف"
+ },
+ "SAVE": "Save changes"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "پورتال با موفقیت ایجاد شد",
diff --git a/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json
index d3447414f..479e8a4b8 100644
--- a/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json
@@ -308,6 +308,7 @@
"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!",
@@ -317,7 +318,8 @@
"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"
+ "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": "ما نتوانستیم کانال WhatsApp را ذخیره کنیم"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "Support your customers on WhatsApp"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "ایمیل",
"DESCRIPTION": "Connect with Gmail, Outlook, or other providers"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "پیکربندی ربات",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "رضایت مشتری",
- "VOICE": "Voice"
+ "VOICE": "Voice",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "بهروزرسانی تنظیمات فرم قبل از گفتگو"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/fa/integrations.json b/app/javascript/dashboard/i18n/locale/fa/integrations.json
index 796985aaf..d81daa580 100644
--- a/app/javascript/dashboard/i18n/locale/fa/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/fa/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "مخاطب ایجاد شد",
"CONTACT_UPDATED": "مخاطب بهروزرسانی شد",
"CONVERSATION_TYPING_ON": "Conversation Typing On",
- "CONVERSATION_TYPING_OFF": "Conversation Typing Off"
+ "CONVERSATION_TYPING_OFF": "Conversation Typing Off",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/fi/bulkActions.json b/app/javascript/dashboard/i18n/locale/fi/bulkActions.json
index d7a05e6f6..6ff1b217a 100644
--- a/app/javascript/dashboard/i18n/locale/fi/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/fi/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} conversations selected",
- "AGENT_SELECT_LABEL": "Select agent",
- "ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign {conversationCount} {conversationLabel} to",
- "UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Mene takaisin",
- "ASSIGN_LABEL": "Delegoi",
"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}?",
@@ -20,7 +15,6 @@
"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.",
- "AGENT_LIST_LOADING": "Loading agents",
"UPDATE": {
"CHANGE_STATUS": "Change status",
"SNOOZE_UNTIL": "Snooze",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assign labels",
- "NO_LABELS_FOUND": "No labels found",
+ "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."
+ "ASSIGN_FAILED": "Failed to assign labels. Please try again.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Select team",
"NONE": "None",
- "NO_TEAMS_AVAILABLE": "There are no teams added to this account yet.",
- "ASSIGN_SELECTED_TEAMS": "Assign selected team.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/fi/campaign.json b/app/javascript/dashboard/i18n/locale/fi/campaign.json
index 18db3657f..45679751a 100644
--- a/app/javascript/dashboard/i18n/locale/fi/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/fi/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/fi/components.json b/app/javascript/dashboard/i18n/locale/fi/components.json
index d7dc18f5c..ef02db5c6 100644
--- a/app/javascript/dashboard/i18n/locale/fi/components.json
+++ b/app/javascript/dashboard/i18n/locale/fi/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/fi/contact.json b/app/javascript/dashboard/i18n/locale/fi/contact.json
index dcbf58344..ac8d32016 100644
--- a/app/javascript/dashboard/i18n/locale/fi/contact.json
+++ b/app/javascript/dashboard/i18n/locale/fi/contact.json
@@ -20,6 +20,8 @@
"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"
@@ -583,8 +585,11 @@
},
"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",
diff --git a/app/javascript/dashboard/i18n/locale/fi/conversation.json b/app/javascript/dashboard/i18n/locale/fi/conversation.json
index f5017d16e..8dcc36570 100644
--- a/app/javascript/dashboard/i18n/locale/fi/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/fi/conversation.json
@@ -62,6 +62,7 @@
"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",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Ratkaise",
@@ -100,6 +110,12 @@
"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}",
@@ -215,6 +231,7 @@
"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",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
@@ -299,8 +316,13 @@
"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"
+ "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": {
diff --git a/app/javascript/dashboard/i18n/locale/fi/helpCenter.json b/app/javascript/dashboard/i18n/locale/fi/helpCenter.json
index 02ba84edd..3da9cffb1 100644
--- a/app/javascript/dashboard/i18n/locale/fi/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/fi/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Draft",
"ARCHIVE": "Archive",
"TRANSLATE": "Translate",
+ "MOVE_TO_CATEGORY": "Category",
"DELETE": "Poista",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "Poista",
@@ -866,6 +869,28 @@
},
"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": "Poista"
+ },
+ "SAVE": "Save changes"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Portal created successfully",
diff --git a/app/javascript/dashboard/i18n/locale/fi/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/fi/inboxMgmt.json
index c2ddfdb71..acd660eb0 100644
--- a/app/javascript/dashboard/i18n/locale/fi/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/fi/inboxMgmt.json
@@ -308,6 +308,7 @@
"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!",
@@ -317,7 +318,8 @@
"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"
+ "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"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "Support your customers on WhatsApp"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "Sähköposti",
"DESCRIPTION": "Connect with Gmail, Outlook, or other providers"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Bot Configuration",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT",
- "VOICE": "Voice"
+ "VOICE": "Voice",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Update Pre Chat Form Settings"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/fi/integrations.json b/app/javascript/dashboard/i18n/locale/fi/integrations.json
index ff721724a..b990f68e1 100644
--- a/app/javascript/dashboard/i18n/locale/fi/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/fi/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Contact created",
"CONTACT_UPDATED": "Contact updated",
"CONVERSATION_TYPING_ON": "Conversation Typing On",
- "CONVERSATION_TYPING_OFF": "Conversation Typing Off"
+ "CONVERSATION_TYPING_OFF": "Conversation Typing Off",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/fr/bulkActions.json b/app/javascript/dashboard/i18n/locale/fr/bulkActions.json
index 59d3e3c91..3d875a01b 100644
--- a/app/javascript/dashboard/i18n/locale/fr/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/fr/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} conversations sélectionnées",
- "AGENT_SELECT_LABEL": "Sélectionner un agent",
- "ASSIGN_CONFIRMATION_LABEL": "Êtes-vous sûr de vouloir assigner {conversationCount} {conversationLabel} à",
- "UNASSIGN_CONFIRMATION_LABEL": "Êtes-vous sûr de vouloir retirer l'affectation de {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Retour",
- "ASSIGN_LABEL": "Assigner",
"NONE": "Aucun",
"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}?",
@@ -20,7 +15,6 @@
"RESOLVE_SUCCESFUL": "Conversations résolues avec succès.",
"RESOLVE_FAILED": "Impossible de résoudre les conversations, veuillez réessayer.",
"ALL_CONVERSATIONS_SELECTED_ALERT": "Sont uniquement sélectionnées les conversations visibles sur cette page.",
- "AGENT_LIST_LOADING": "Chargement des agents",
"UPDATE": {
"CHANGE_STATUS": "Changer le statut",
"SNOOZE_UNTIL": "Reporter",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assigner une étiquette",
- "NO_LABELS_FOUND": "Aucune étiquette trouvée",
+ "REMOVE_LABELS": "Remove labels",
"ASSIGN_SELECTED_LABELS": "Assigner les étiquettes sélectionnées",
+ "REMOVE_SELECTED_LABELS": "Remove selected labels",
"ASSIGN_SUCCESFUL": "Étiquettes attribuées avec succès.",
- "ASSIGN_FAILED": "Impossible d'attribuer les étiquettes, veuillez réessayer."
+ "ASSIGN_FAILED": "Impossible d'attribuer les étiquettes, veuillez réessayer.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Sélectionner une équipe",
"NONE": "Aucun",
- "NO_TEAMS_AVAILABLE": "Aucune équipe n'a encore été ajoutée à ce compte.",
- "ASSIGN_SELECTED_TEAMS": "Assigner à l'équipe sélectionnée.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/fr/campaign.json b/app/javascript/dashboard/i18n/locale/fr/campaign.json
index b2bbede32..92756bff7 100644
--- a/app/javascript/dashboard/i18n/locale/fr/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/fr/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Terminé",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Terminé",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/fr/components.json b/app/javascript/dashboard/i18n/locale/fr/components.json
index 53ebf3b1a..68028416e 100644
--- a/app/javascript/dashboard/i18n/locale/fr/components.json
+++ b/app/javascript/dashboard/i18n/locale/fr/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/fr/contact.json b/app/javascript/dashboard/i18n/locale/fr/contact.json
index b0fbf700b..cefa7d0af 100644
--- a/app/javascript/dashboard/i18n/locale/fr/contact.json
+++ b/app/javascript/dashboard/i18n/locale/fr/contact.json
@@ -20,6 +20,8 @@
"CALL": "Appel",
"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": "Choisir une boîte de réception vocale"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "Assigner des étiquettes",
+ "REMOVE_LABELS": "Remove Labels",
"ASSIGN_LABELS_SUCCESS": "Étiquettes attribuées avec succès.",
"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",
diff --git a/app/javascript/dashboard/i18n/locale/fr/conversation.json b/app/javascript/dashboard/i18n/locale/fr/conversation.json
index 2451b4a49..8a5df6eb5 100644
--- a/app/javascript/dashboard/i18n/locale/fr/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/fr/conversation.json
@@ -62,6 +62,7 @@
"UNSUPPORTED_MESSAGE_FACEBOOK": "Ce message n'est pas pris en charge. Vous pouvez voir ce message sur l'application Facebook Messenger.",
"UNSUPPORTED_MESSAGE_INSTAGRAM": "Ce message n'est pas pris en charge. Vous pouvez voir ce message sur l'application Instagram.",
"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": "Le message a bien été supprimé",
"FAIL_DELETE_MESSSAGE": "Impossible de supprimer le message ! Veuillez réessayez",
"NO_RESPONSE": "Pas de réponse",
@@ -79,13 +80,22 @@
"OUTGOING_CALL": "Appel sortant",
"CALL_IN_PROGRESS": "Appel en cours",
"NO_ANSWER": "Pas de réponse",
+ "NO_ANSWER_OUTBOUND_LABEL": "Pas de réponse",
+ "NO_ANSWER_OUTBOUND_SUBTEXT": "Contact didn't pick up",
"MISSED_CALL": "Appel manqué",
+ "MISSED_CALL_INBOUND_SUBTEXT": "No agent picked up",
+ "MISSED_CALL_DECLINED_BY": "Declined by {agentName}",
"CALL_ENDED": "Appel terminé",
+ "HANDLED_BY": "Handled by {agentName}",
"NOT_ANSWERED_YET": "Pas encore répondu",
+ "CALLING": "Calling…",
"THEY_ANSWERED": "Il a répondu",
"YOU_ANSWERED": "Vous avez répondu",
"AGENT_ANSWERED": "{agentName} answered",
- "JOIN_CALL": "Join call"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Résoudre",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "Reporté jusqu'à demain",
"SNOOZED_UNTIL_NEXT_WEEK": "Reporté jusqu'à la semaine prochaine",
"SNOOZED_UNTIL_NEXT_REPLY": "Reporté jusqu'à la prochaine réponse",
+ "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}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "Enregistrer l'audio",
"TIP_AUDIORECORDER_PERMISSION": "Autoriser l'accès à l'audio",
"TIP_AUDIORECORDER_ERROR": "Impossible d'ouvrir l'audio",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "Glissez et déposez ici pour lier",
"START_AUDIO_RECORDING": "Démarrer l'enregistrement audio",
"STOP_AUDIO_RECORDING": "Arrêter l'enregistrement audio",
@@ -299,8 +316,13 @@
"NOT_ANSWERED_YET": "Pas encore répondu",
"HANDLED_IN_ANOTHER_TAB": "Being handled in another tab",
"REJECT_CALL": "Reject",
+ "DISMISS_CALL": "Rejeter",
"JOIN_CALL": "Join call",
- "END_CALL": "End 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": {
diff --git a/app/javascript/dashboard/i18n/locale/fr/helpCenter.json b/app/javascript/dashboard/i18n/locale/fr/helpCenter.json
index 57f2d6245..80eac8126 100644
--- a/app/javascript/dashboard/i18n/locale/fr/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/fr/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Brouillon",
"ARCHIVE": "Archive",
"TRANSLATE": "Traduire",
+ "MOVE_TO_CATEGORY": "Catégorie",
"DELETE": "Supprimer",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "Supprimer",
@@ -866,6 +869,28 @@
},
"EDIT_CONFIGURATION": "Edit configuration"
},
+ "LAYOUT_CONTENT": {
+ "HEADER": "Apparence",
+ "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": "Supprimer"
+ },
+ "SAVE": "Save changes"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Le portail a été créé avec succès",
diff --git a/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json
index 1fd73270c..f90a67fa8 100644
--- a/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json
@@ -308,6 +308,7 @@
"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!",
@@ -317,7 +318,8 @@
"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"
+ "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": "Nous n'avons pas pu enregistrer le canal WhatsApp"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "Support your customers on WhatsApp"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "Appel WhatsApp",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "Courriel",
"DESCRIPTION": "Connect with Gmail, Outlook, or other providers"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Configuration du bot",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT",
- "VOICE": "Voice"
+ "VOICE": "Voice",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Mettre à jour les paramètres du formulaire de pré-chat"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/fr/integrations.json b/app/javascript/dashboard/i18n/locale/fr/integrations.json
index 6fcf86fc0..557365f36 100644
--- a/app/javascript/dashboard/i18n/locale/fr/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/fr/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Contact créé",
"CONTACT_UPDATED": "Contact mis à jour",
"CONVERSATION_TYPING_ON": "Saisie de conversation activée",
- "CONVERSATION_TYPING_OFF": "Saisie de conversation désactivée"
+ "CONVERSATION_TYPING_OFF": "Saisie de conversation désactivée",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/fr/onboarding.json b/app/javascript/dashboard/i18n/locale/fr/onboarding.json
index b3ab630eb..3aa5f93e9 100644
--- a/app/javascript/dashboard/i18n/locale/fr/onboarding.json
+++ b/app/javascript/dashboard/i18n/locale/fr/onboarding.json
@@ -1,26 +1,26 @@
{
"ONBOARDING_NEXT": {
- "GREETING": "Hello {name}!",
- "SUBTITLE": "Please review the following details",
- "YOUR_DETAILS": "Your details",
+ "GREETING": "Bonjour {name} !",
+ "SUBTITLE": "Veuillez vérifier les informations suivantes",
+ "YOUR_DETAILS": "Vos informations",
"COMPANY_DETAILS": "Company details",
"FIELDS": {
"EMAIL": "Courriel",
- "YOUR_ROLE": "Your Role",
+ "YOUR_ROLE": "Votre rôle",
"WEBSITE": "Site internet",
"LANGUAGE": "Langue",
"TIMEZONE": "Fuseau horaire",
- "COMPANY_SIZE": "Company Size",
- "INDUSTRY": "Industry",
+ "COMPANY_SIZE": "Taille de l'entreprise",
+ "INDUSTRY": "Secteur d'activité",
"REFERRAL_SOURCE": "Where did you find us?"
},
"PLACEHOLDERS": {
- "SELECT_ROLE": "Select your role",
- "ENTER_WEBSITE": "www.example.com",
- "SELECT_LANGUAGE": "Select language",
+ "SELECT_ROLE": "Sélectionnez votre rôle",
+ "ENTER_WEBSITE": "www.exemple.fr",
+ "SELECT_LANGUAGE": "Sélectionner la langue",
"SELECT_TIMEZONE": "Sélectionnez le fuseau horaire",
- "SELECT_COMPANY_SIZE": "Select company size",
- "SELECT_INDUSTRY": "Select industry",
+ "SELECT_COMPANY_SIZE": "Sélectionnez la taille de l'entreprise",
+ "SELECT_INDUSTRY": "Sélectionnez un secteur d'activité",
"SELECT_REFERRAL_SOURCE": "Select source"
},
"EMAIL_VERIFIED": "Email verified",
@@ -28,7 +28,7 @@
"CONTINUE": "Continue",
"SAVING": "Enregistrement en cours...",
"VALIDATION_ERROR": "Please fill in all required fields",
- "SUCCESS": "Details saved successfully",
+ "SUCCESS": "Les informations ont été enregistrées avec succès",
"ERROR": "Could not save details. Please try again."
}
}
diff --git a/app/javascript/dashboard/i18n/locale/he/bulkActions.json b/app/javascript/dashboard/i18n/locale/he/bulkActions.json
index 2678e646f..b0d6e3f46 100644
--- a/app/javascript/dashboard/i18n/locale/he/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/he/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} שיחות נבחרו",
- "AGENT_SELECT_LABEL": "בחר נציג",
- "ASSIGN_CONFIRMATION_LABEL": "האם אתה בטוח שברצונך לשייך {conversationCount} {conversationLabel} ל-",
- "UNASSIGN_CONFIRMATION_LABEL": "האם אתה בטוח שברצונך לבטל שיוך {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "חזור",
- "ASSIGN_LABEL": "שייך",
"NONE": "כלום",
"CLEAR_SELECTION": "נקה",
"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}?",
@@ -20,7 +15,6 @@
"RESOLVE_SUCCESFUL": "שיחה טופלה בהצלחה.",
"RESOLVE_FAILED": "הסגירה של השיחות נכשלה. אנא נסה שוב.",
"ALL_CONVERSATIONS_SELECTED_ALERT": "השיחות הנבחרות הן המוצגות בדף זה בלבד.",
- "AGENT_LIST_LOADING": "טוען סוכנים",
"UPDATE": {
"CHANGE_STATUS": "שנה סטאטוס",
"SNOOZE_UNTIL": "נודניק",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "הקצה תוויות",
- "NO_LABELS_FOUND": "לא נמצאו תוויות",
+ "REMOVE_LABELS": "Remove labels",
"ASSIGN_SELECTED_LABELS": "שייך תוויות נבחרות",
+ "REMOVE_SELECTED_LABELS": "Remove selected labels",
"ASSIGN_SUCCESFUL": "תוויות שוייכו בהצלחה.",
- "ASSIGN_FAILED": "ההקצאה של התוויות נכשלה. אנא נסה שוב."
+ "ASSIGN_FAILED": "ההקצאה של התוויות נכשלה. אנא נסה שוב.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "בחר קבוצה",
"NONE": "כלום",
- "NO_TEAMS_AVAILABLE": "לא קיימות קבוצות להוספה.",
- "ASSIGN_SELECTED_TEAMS": "שייך קבוצה.",
"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": "הצוותים הוקצו בהצלחה.",
diff --git a/app/javascript/dashboard/i18n/locale/he/campaign.json b/app/javascript/dashboard/i18n/locale/he/campaign.json
index 45f4a3af9..11c1d639f 100644
--- a/app/javascript/dashboard/i18n/locale/he/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/he/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "מעבד",
"COMPLETED": "הושלם",
"SCHEDULED": "מתוזמן"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "מעבד",
"COMPLETED": "הושלם",
"SCHEDULED": "מתוזמן"
},
diff --git a/app/javascript/dashboard/i18n/locale/he/components.json b/app/javascript/dashboard/i18n/locale/he/components.json
index 87ba64827..636caa1b0 100644
--- a/app/javascript/dashboard/i18n/locale/he/components.json
+++ b/app/javascript/dashboard/i18n/locale/he/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/he/contact.json b/app/javascript/dashboard/i18n/locale/he/contact.json
index b886ebd44..4203d154b 100644
--- a/app/javascript/dashboard/i18n/locale/he/contact.json
+++ b/app/javascript/dashboard/i18n/locale/he/contact.json
@@ -20,6 +20,8 @@
"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": "בחר תיבת דואר קולי"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "הקצה תוויות",
+ "REMOVE_LABELS": "Remove Labels",
"ASSIGN_LABELS_SUCCESS": "תוויות שוייכו בהצלחה.",
"ASSIGN_LABELS_FAILED": "ההקצאה של התוויות נכשלה",
+ "REMOVE_LABELS_SUCCESS": "Labels removed successfully.",
+ "REMOVE_LABELS_FAILED": "Failed to remove labels",
"DESCRIPTION": "בחר את התוויות שברצונך להוסיף לאנשי הקשר שנבחרו.",
"NO_LABELS_FOUND": "אין עדיין תוויות זמינות.",
"SELECTED_COUNT": "{count} נבחרו",
diff --git a/app/javascript/dashboard/i18n/locale/he/conversation.json b/app/javascript/dashboard/i18n/locale/he/conversation.json
index 8cb92ed12..0ce06cd72 100644
--- a/app/javascript/dashboard/i18n/locale/he/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/he/conversation.json
@@ -62,6 +62,7 @@
"UNSUPPORTED_MESSAGE_FACEBOOK": "הודעה זו אינה נתמכת. תוכל לצפות בהודעה זו באפליקציית Facebook Messenger.",
"UNSUPPORTED_MESSAGE_INSTAGRAM": "הודעה זו אינה נתמכת. תוכל לצפות בהודעה זו באפליקציית Instagram.",
"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": "ההודעה נמחקה בהצלחה",
"FAIL_DELETE_MESSSAGE": "לא ניתן למחוק את ההודעה! נסה שוב",
"NO_RESPONSE": "אין תגובה",
@@ -79,13 +80,22 @@
"OUTGOING_CALL": "שיחה יוצאת",
"CALL_IN_PROGRESS": "שיחה מתבצעת",
"NO_ANSWER": "אין מענה",
+ "NO_ANSWER_OUTBOUND_LABEL": "אין מענה",
+ "NO_ANSWER_OUTBOUND_SUBTEXT": "Contact didn't pick up",
"MISSED_CALL": "שיחה שלא נענתה",
+ "MISSED_CALL_INBOUND_SUBTEXT": "No agent picked up",
+ "MISSED_CALL_DECLINED_BY": "Declined by {agentName}",
"CALL_ENDED": "השיחה הסתיימה",
+ "HANDLED_BY": "Handled by {agentName}",
"NOT_ANSWERED_YET": "עדיין לא נענה",
+ "CALLING": "Calling…",
"THEY_ANSWERED": "הם ענו",
"YOU_ANSWERED": "אתה ענית",
"AGENT_ANSWERED": "{agentName} answered",
- "JOIN_CALL": "Join call"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "פתרון",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "נמנם עד מחר",
"SNOOZED_UNTIL_NEXT_WEEK": "נמנם עד שבוע הבא",
"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}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "הקלט אודיו",
"TIP_AUDIORECORDER_PERMISSION": "אפשר גישה לאודיו",
"TIP_AUDIORECORDER_ERROR": "לא יכול לפתוח אודיו",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "גרור ושחרר כאן להוספת קובץ מצורף",
"START_AUDIO_RECORDING": "התחל הקלטת אודיו",
"STOP_AUDIO_RECORDING": "עצור הקלטת אודיו",
@@ -299,8 +316,13 @@
"NOT_ANSWERED_YET": "עדיין לא נענה",
"HANDLED_IN_ANOTHER_TAB": "Being handled in another tab",
"REJECT_CALL": "Reject",
+ "DISMISS_CALL": "סגור",
"JOIN_CALL": "Join call",
- "END_CALL": "End 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": {
diff --git a/app/javascript/dashboard/i18n/locale/he/helpCenter.json b/app/javascript/dashboard/i18n/locale/he/helpCenter.json
index 98b3abe97..e1e793f92 100644
--- a/app/javascript/dashboard/i18n/locale/he/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/he/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "טיוטה",
"ARCHIVE": "ארכיון",
"TRANSLATE": "תרגום",
+ "MOVE_TO_CATEGORY": "קטגוריה",
"DELETE": "מחק",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "מחק",
@@ -866,6 +869,28 @@
},
"EDIT_CONFIGURATION": "ערוך הגדרה"
},
+ "LAYOUT_CONTENT": {
+ "HEADER": "מראה",
+ "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": "הסר"
+ },
+ "SAVE": "שמור שינויים"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "הפורטל נוצר בהצלחה",
diff --git a/app/javascript/dashboard/i18n/locale/he/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/he/inboxMgmt.json
index 47182e2a8..64e5f9a6c 100644
--- a/app/javascript/dashboard/i18n/locale/he/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/he/inboxMgmt.json
@@ -308,6 +308,7 @@
"AUTH_PROCESSING": "מאמת עם Meta",
"WAITING_FOR_BUSINESS_INFO": "אנא השלם את הגדרת העסק בחלון Meta...",
"PROCESSING": "מגדיר את חשבון WhatsApp העסקי שלך",
+ "ENABLING_CALLING": "Enabling WhatsApp Calling on your number…",
"LOADING_SDK": "טוען SDK של Facebook...",
"CANCELLED": "הרשמת WhatsApp בוטלה",
"SUCCESS_TITLE": "חשבון WhatsApp עסקי מחובר!",
@@ -317,7 +318,8 @@
"AUTH_NOT_COMPLETED": "האימות לא הושלם. אנא הפעל מחדש את התהליך.",
"SUCCESS_FALLBACK": "חשבון WhatsApp עסקי הוגדר בהצלחה",
"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_LINK_TEXT": "זרימת הגדרה ידנית",
+ "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": "לא הצלחנו לשמור את ערוץ הוואטסאפ"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "תמוך בלקוחות שלך ב-WhatsApp"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "אימייל",
"DESCRIPTION": "התחבר עם Gmail, Outlook או ספקים אחרים"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "הגדרות בוט",
"ACCOUNT_HEALTH": "תקינות חשבון",
"CSAT": "CSAT",
- "VOICE": "קול"
+ "VOICE": "קול",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"WHATSAPP_TEMPLATES_SYNC_SUBHEADER": "סנכרן תבניות הודעות מ-WhatsApp באופן ידני כדי לעדכן את התבניות הזמינות שלך.",
"WHATSAPP_TEMPLATES_SYNC_BUTTON": "סנכרן תבניות",
"WHATSAPP_TEMPLATES_SYNC_SUCCESS": "סנכרון התבניות הופעל בהצלחה. העדכון עשוי להימשך כמה דקות.",
+ "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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "עדכון הגדרות טופס טרום צ'אט"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/he/integrations.json b/app/javascript/dashboard/i18n/locale/he/integrations.json
index 9c0cb4661..420882e16 100644
--- a/app/javascript/dashboard/i18n/locale/he/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/he/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "צור קשר",
"CONTACT_UPDATED": "איש קשר עודכן",
"CONVERSATION_TYPING_ON": "הקלדה בשיחה מופעלת",
- "CONVERSATION_TYPING_OFF": "הקלדה בשיחה מושבתת"
+ "CONVERSATION_TYPING_OFF": "הקלדה בשיחה מושבתת",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/hi/bulkActions.json b/app/javascript/dashboard/i18n/locale/hi/bulkActions.json
index 2472a9288..6b922bc7b 100644
--- a/app/javascript/dashboard/i18n/locale/hi/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/hi/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} conversations selected",
- "AGENT_SELECT_LABEL": "Select agent",
- "ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign {conversationCount} {conversationLabel} to",
- "UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Go back",
- "ASSIGN_LABEL": "Assign",
"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}?",
@@ -20,7 +15,6 @@
"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.",
- "AGENT_LIST_LOADING": "Loading agents",
"UPDATE": {
"CHANGE_STATUS": "Change status",
"SNOOZE_UNTIL": "Snooze",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assign labels",
- "NO_LABELS_FOUND": "No labels found",
+ "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."
+ "ASSIGN_FAILED": "Failed to assign labels. Please try again.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Select team",
"NONE": "None",
- "NO_TEAMS_AVAILABLE": "There are no teams added to this account yet.",
- "ASSIGN_SELECTED_TEAMS": "Assign selected team.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/hi/campaign.json b/app/javascript/dashboard/i18n/locale/hi/campaign.json
index 2582d37b2..f1a3397f2 100644
--- a/app/javascript/dashboard/i18n/locale/hi/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/hi/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/hi/components.json b/app/javascript/dashboard/i18n/locale/hi/components.json
index ea7ea6eb5..fd9f092a5 100644
--- a/app/javascript/dashboard/i18n/locale/hi/components.json
+++ b/app/javascript/dashboard/i18n/locale/hi/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/hi/contact.json b/app/javascript/dashboard/i18n/locale/hi/contact.json
index 94471638e..93ff820eb 100644
--- a/app/javascript/dashboard/i18n/locale/hi/contact.json
+++ b/app/javascript/dashboard/i18n/locale/hi/contact.json
@@ -20,6 +20,8 @@
"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"
@@ -583,8 +585,11 @@
},
"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",
diff --git a/app/javascript/dashboard/i18n/locale/hi/conversation.json b/app/javascript/dashboard/i18n/locale/hi/conversation.json
index a06d91b81..509afd4e7 100644
--- a/app/javascript/dashboard/i18n/locale/hi/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/hi/conversation.json
@@ -62,6 +62,7 @@
"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",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Resolve",
@@ -100,6 +110,12 @@
"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}",
@@ -215,6 +231,7 @@
"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",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
@@ -299,8 +316,13 @@
"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"
+ "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": {
diff --git a/app/javascript/dashboard/i18n/locale/hi/helpCenter.json b/app/javascript/dashboard/i18n/locale/hi/helpCenter.json
index 28663c015..f80deb4fb 100644
--- a/app/javascript/dashboard/i18n/locale/hi/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/hi/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Draft",
"ARCHIVE": "Archive",
"TRANSLATE": "Translate",
+ "MOVE_TO_CATEGORY": "Category",
"DELETE": "Delete",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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",
@@ -866,6 +869,28 @@
},
"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",
diff --git a/app/javascript/dashboard/i18n/locale/hi/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/hi/inboxMgmt.json
index a1fcd201b..3b3bdfa93 100644
--- a/app/javascript/dashboard/i18n/locale/hi/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/hi/inboxMgmt.json
@@ -308,6 +308,7 @@
"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!",
@@ -317,7 +318,8 @@
"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"
+ "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"
@@ -465,6 +467,10 @@
"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"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Bot Configuration",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT",
- "VOICE": "Voice"
+ "VOICE": "Voice",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Update Pre Chat Form Settings"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/hi/integrations.json b/app/javascript/dashboard/i18n/locale/hi/integrations.json
index 60c98f202..0438ba3d1 100644
--- a/app/javascript/dashboard/i18n/locale/hi/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/hi/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Contact created",
"CONTACT_UPDATED": "Contact updated",
"CONVERSATION_TYPING_ON": "Conversation Typing On",
- "CONVERSATION_TYPING_OFF": "Conversation Typing Off"
+ "CONVERSATION_TYPING_OFF": "Conversation Typing Off",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/hr/bulkActions.json b/app/javascript/dashboard/i18n/locale/hr/bulkActions.json
index 63153e70d..79165bced 100644
--- a/app/javascript/dashboard/i18n/locale/hr/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/hr/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} conversations selected",
- "AGENT_SELECT_LABEL": "Select agent",
- "ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign {conversationCount} {conversationLabel} to",
- "UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Go back",
- "ASSIGN_LABEL": "Assign",
"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}?",
@@ -20,7 +15,6 @@
"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.",
- "AGENT_LIST_LOADING": "Loading agents",
"UPDATE": {
"CHANGE_STATUS": "Change status",
"SNOOZE_UNTIL": "Snooze",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assign labels",
- "NO_LABELS_FOUND": "No labels found",
+ "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."
+ "ASSIGN_FAILED": "Failed to assign labels. Please try again.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Select team",
"NONE": "None",
- "NO_TEAMS_AVAILABLE": "There are no teams added to this account yet.",
- "ASSIGN_SELECTED_TEAMS": "Assign selected team.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/hr/campaign.json b/app/javascript/dashboard/i18n/locale/hr/campaign.json
index f7323f219..d14359d7f 100644
--- a/app/javascript/dashboard/i18n/locale/hr/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/hr/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/hr/components.json b/app/javascript/dashboard/i18n/locale/hr/components.json
index e43d0f95e..d3aa278ec 100644
--- a/app/javascript/dashboard/i18n/locale/hr/components.json
+++ b/app/javascript/dashboard/i18n/locale/hr/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/hr/contact.json b/app/javascript/dashboard/i18n/locale/hr/contact.json
index 3c0e33891..25609fce2 100644
--- a/app/javascript/dashboard/i18n/locale/hr/contact.json
+++ b/app/javascript/dashboard/i18n/locale/hr/contact.json
@@ -20,6 +20,8 @@
"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"
@@ -583,8 +585,11 @@
},
"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",
diff --git a/app/javascript/dashboard/i18n/locale/hr/conversation.json b/app/javascript/dashboard/i18n/locale/hr/conversation.json
index f58308997..a268b80c6 100644
--- a/app/javascript/dashboard/i18n/locale/hr/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/hr/conversation.json
@@ -62,6 +62,7 @@
"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",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Resolve",
@@ -100,6 +110,12 @@
"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}",
@@ -215,6 +231,7 @@
"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",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
@@ -299,8 +316,13 @@
"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"
+ "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": {
diff --git a/app/javascript/dashboard/i18n/locale/hr/helpCenter.json b/app/javascript/dashboard/i18n/locale/hr/helpCenter.json
index 80ad350ee..6d7a9b027 100644
--- a/app/javascript/dashboard/i18n/locale/hr/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/hr/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Skica",
"ARCHIVE": "Archive",
"TRANSLATE": "Translate",
+ "MOVE_TO_CATEGORY": "Kategorija",
"DELETE": "Izbriši",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "Izbriši",
@@ -866,6 +869,28 @@
},
"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": "Izbriši"
+ },
+ "SAVE": "Save changes"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Portal created successfully",
diff --git a/app/javascript/dashboard/i18n/locale/hr/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/hr/inboxMgmt.json
index 4386d2915..abb3e7433 100644
--- a/app/javascript/dashboard/i18n/locale/hr/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/hr/inboxMgmt.json
@@ -308,6 +308,7 @@
"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!",
@@ -317,7 +318,8 @@
"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"
+ "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"
@@ -465,6 +467,10 @@
"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"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Bot Configuration",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT",
- "VOICE": "Voice"
+ "VOICE": "Voice",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Update Pre Chat Form Settings"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/hr/integrations.json b/app/javascript/dashboard/i18n/locale/hr/integrations.json
index e78752c67..d35941385 100644
--- a/app/javascript/dashboard/i18n/locale/hr/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/hr/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Contact created",
"CONTACT_UPDATED": "Contact updated",
"CONVERSATION_TYPING_ON": "Conversation Typing On",
- "CONVERSATION_TYPING_OFF": "Conversation Typing Off"
+ "CONVERSATION_TYPING_OFF": "Conversation Typing Off",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/hu/bulkActions.json b/app/javascript/dashboard/i18n/locale/hu/bulkActions.json
index b132a0e56..0b4c4e0f4 100644
--- a/app/javascript/dashboard/i18n/locale/hu/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/hu/bulkActions.json
@@ -1,15 +1,10 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} conversations selected",
- "AGENT_SELECT_LABEL": "Ügynök kiválasztása",
- "ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign {conversationCount} {conversationLabel} to",
- "UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Visszaugrás",
- "ASSIGN_LABEL": "Hozzárendelés",
"NONE": "Nincs",
- "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?",
+ "CLEAR_SELECTION": "Kijelölés törlése",
+ "ASSIGN_AGENT_CONFIRMATION_LABEL": "Biztosan hozzárendeled a kijelölt {n} beszélgetést ehhez az ügyintézőhöz: {agentName}? | Biztosan hozzárendeled a kijelölt {n} beszélgetést ehhez az ügyintézőhöz: {agentName}?",
+ "UNASSIGN_AGENT_CONFIRMATION_LABEL": "Biztosan megszünteted a kijelölt {n} beszélgetés ügyintézői hozzárendelését? | Biztosan megszünteted a kijelölt {n} beszélgetés ügyintézői hozzárendelését?",
"YES": "Igen",
"CANCEL": "Mégse",
"SEARCH_INPUT_PLACEHOLDER": "Keresés",
@@ -20,7 +15,6 @@
"RESOLVE_SUCCESFUL": "Beszélgetés sikeresen megoldva.",
"RESOLVE_FAILED": "Nem sikerült megoldani a beszélgetéseket. Kérjük, próbálja újra.",
"ALL_CONVERSATIONS_SELECTED_ALERT": "Csak a kiválasztott beszélgetések láthatóak ezen az oldalon.",
- "AGENT_LIST_LOADING": "Ügynökök betöltése",
"UPDATE": {
"CHANGE_STATUS": "Státusz változtatása",
"SNOOZE_UNTIL": "Halasztás",
@@ -33,18 +27,18 @@
},
"LABELS": {
"ASSIGN_LABELS": "Címkék hozzárendelése",
- "NO_LABELS_FOUND": "Nem találtunk címkét",
+ "REMOVE_LABELS": "Remove labels",
"ASSIGN_SELECTED_LABELS": "Válogatott címkék hozzárendelése",
+ "REMOVE_SELECTED_LABELS": "Remove selected labels",
"ASSIGN_SUCCESFUL": "Címkék hozzárendelése sikeres.",
- "ASSIGN_FAILED": "Nem sikerült címkéket hozzárendelni. Kérjük, próbálja újra."
+ "ASSIGN_FAILED": "Nem sikerült címkéket hozzárendelni. Kérjük, próbálja újra.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Csapat kiválasztása",
"NONE": "Nincs",
- "NO_TEAMS_AVAILABLE": "Ebben a fiókban még nincs csapat létrehozva.",
- "ASSIGN_SELECTED_TEAMS": "Válogatott csapatok hozzárendelése.",
- "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_TEAM_CONFIRMATION_LABEL": "Biztosan hozzárendeled a kijelölt {n} beszélgetést ehhez a csapathoz: {teamName}? | Biztosan hozzárendeled a kijelölt {n} beszélgetést ehhez a csapathoz: {teamName}?",
+ "UNASSIGN_TEAM_CONFIRMATION_LABEL": "Biztosan megszünteted a kijelölt {n} beszélgetés csapathoz rendelését? | Biztosan megszünteted a kijelölt {n} beszélgetés csapathoz rendelését?",
"ASSIGN_SUCCESFUL": "Teams assigned successfully.",
"ASSIGN_FAILED": "Nem sikerült csapatot kijelölni. Kérjük, próbálja újra."
}
diff --git a/app/javascript/dashboard/i18n/locale/hu/campaign.json b/app/javascript/dashboard/i18n/locale/hu/campaign.json
index 0f0df48f2..486673acd 100644
--- a/app/javascript/dashboard/i18n/locale/hu/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/hu/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Lezárt",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Lezárt",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/hu/companies.json b/app/javascript/dashboard/i18n/locale/hu/companies.json
index fa8306fc0..534cb98a2 100644
--- a/app/javascript/dashboard/i18n/locale/hu/companies.json
+++ b/app/javascript/dashboard/i18n/locale/hu/companies.json
@@ -23,80 +23,80 @@
"UNNAMED": "Unnamed Company",
"CONTACTS_COUNT": "{n} contact | {n} contacts",
"ACTIONS": {
- "CREATE": "Add company"
+ "CREATE": "Cég létrehozása"
},
"CREATE": {
- "TITLE": "Add company details",
+ "TITLE": "Cég létrehozása",
"ACTIONS": {
- "SAVE": "Add company"
+ "SAVE": "Cég létrehozása"
},
"MESSAGES": {
- "SUCCESS": "Company created.",
- "ERROR": "Could not create the company."
+ "SUCCESS": "A cég sikeresen létrehozva.",
+ "ERROR": "Nem sikerült létrehozni a céget."
}
},
"DETAIL": {
- "LOADING": "Loading company details...",
+ "LOADING": "Cég részleteinek betöltése...",
"EMPTY_STATE": {
- "TITLE": "Company not found",
- "SUBTITLE": "This company may have been removed or is no longer available in this account."
+ "TITLE": "Cég nem található",
+ "SUBTITLE": "Ez a cég lehet, hogy eltávolításra került, vagy már nem elérhető ebben a fiókban."
},
"SIDEBAR": {
"TABS": {
- "ATTRIBUTES": "Attributes",
+ "ATTRIBUTES": "Tulajdonságok",
"CONTACTS": "Kontaktok",
- "HISTORY": "History",
+ "HISTORY": "Előzmények",
"NOTES": "Megjegyzések"
}
},
"HISTORY": {
- "EMPTY": "No conversations found for this company's contacts yet."
+ "EMPTY": "Nincsenek beszélgetések a cég ügyfeleihez kapcsolódóan."
},
"NOTES": {
- "EMPTY": "No notes found for this company's contacts yet."
+ "EMPTY": "Nincsenek megjegyzések a cég ügyfeleihez kapcsolódóan."
},
"ATTRIBUTES": {
"SEARCH_PLACEHOLDER": "Tulajdonságok keresése...",
- "EMPTY_STATE": "There are no company custom attributes configured yet.",
- "NO_ATTRIBUTES": "No matching attributes found.",
- "UNUSED_ATTRIBUTES": "{count} unused attribute | {count} unused attributes",
+ "EMPTY_STATE": "A cégnek még nincsenek egyedi tulajdonságai.",
+ "NO_ATTRIBUTES": "Nincs találat a tulajdonságok között.",
+ "UNUSED_ATTRIBUTES": "{count} nem használt tulajdonság | {count} nem használt tulajdonság",
"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."
+ "UPDATE_SUCCESS": "Cég tulajdonsága frissítve.",
+ "UPDATE_ERROR": "Nem sikerült frissíteni a cég tulajdonságát.",
+ "DELETE_SUCCESS": "Cég tulajdonsága eltávolítva.",
+ "DELETE_ERROR": "Nem sikerült eltávolítani a cég tulajdonságát."
}
},
"CONTACTS": {
"LOADING": "Kontaktok betöltése...",
- "EMPTY": "No contacts are linked to this company yet.",
- "UNNAMED_CONTACT": "Unnamed contact",
+ "EMPTY": "Ehhez a céghez még nincsenek ügyfelek kapcsolva.",
+ "UNNAMED_CONTACT": "Név nélküli ügyfél",
"ACTIONS": {
- "ADD": "Add contact",
- "REMOVE": "Remove contact"
+ "ADD": "Ügyfél hozzáadása",
+ "REMOVE": "Ügyfél eltávolítása"
},
"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.",
+ "DESCRIPTION": "Keress a meglévő ügyfelek között, és csatold őket ehhez a céghez.",
+ "SEARCH_PLACEHOLDER": "Ügyfelek keresése...",
+ "INITIAL": "Kezdj el gépelni az ügyfelek kereséséhez.",
+ "EMPTY": "Nem találhatók ügyfelek.",
+ "CONFIRM_TITLE": "Ügyfél csatolása",
+ "CONFIRM_DESCRIPTION": "Erősítsd meg a cég és az ügyfél csatolását.",
"COMPANY_LABEL": "Cég",
"CONTACT_LABEL": "Kontakt",
- "CURRENT_COMPANY": "Currently linked to {companyName}",
- "ADD": "Link contact",
+ "CURRENT_COMPANY": "Jelenlegi cég: {companyName}",
+ "ADD": "Csatolás",
"CANCEL": "Mégse"
}
},
"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."
+ "ADD_SUCCESS": "Ügyfél csatolva a céghez.",
+ "ADD_ERROR": "Nem sikerült csatolni az ügyfelet a céghez.",
+ "REASSIGN_SUCCESS": "Ügyfél újra hozzárendelve a céghez.",
+ "REASSIGN_ERROR": "Nem sikerült újra hozzárendelni az ügyfelet a céghez.",
+ "REMOVE_SUCCESS": "Ügyfél eltávolítva a cégtől.",
+ "REMOVE_ERROR": "Nem sikerült eltávolítani az ügyfelet a cégtől."
}
},
"AVATAR": {
@@ -104,19 +104,19 @@
"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."
+ "DELETE_ERROR": "Nem sikerült eltávolítani a cég profilképét."
},
"PROFILE": {
- "TITLE": "Edit company details",
- "CREATED_AT": "Created {date}",
- "LAST_ACTIVE": "Last active {date}",
- "DESCRIPTION_PLACEHOLDER": "Add a short description for this company",
+ "TITLE": "Cég részleteinek szerkesztése",
+ "CREATED_AT": "Létrehozás dátuma: {date}",
+ "LAST_ACTIVE": "Utolsó aktivitás: {date}",
+ "DESCRIPTION_PLACEHOLDER": "Adj hozzá egy rövid leírást ehhez a céghez",
"ACTIONS": {
- "SAVE": "Update company"
+ "SAVE": "Cég frissítése"
},
"MESSAGES": {
- "UPDATE_SUCCESS": "Company updated.",
- "UPDATE_ERROR": "Could not update the company."
+ "UPDATE_SUCCESS": "Cég frissítve.",
+ "UPDATE_ERROR": "Nem sikerült frissíteni a céget."
},
"FIELDS": {
"NAME": "Név",
@@ -124,16 +124,16 @@
}
},
"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",
+ "SECTION_TITLE": "Veszélyzóna",
+ "SECTION_DESCRIPTION": "Töröld ezt a céget, és válaszd le a kapcsolódó ügyfeleket. Az ügyfelek megmaradnak a fiókban.",
+ "BUTTON": "Cég törlése",
+ "TITLE": "Cég törlése?",
+ "DESCRIPTION": "Ez eltávolítja a céget, és leválaszt minden kapcsolódó ügyfelet. Az ügyfelek megmaradnak.",
+ "DESCRIPTION_WITH_NAME": "Ez eltávolítja a '{companyName}' céget, és leválaszt minden kapcsolódó ügyfelet. Az ügyfelek megmaradnak.",
+ "CONFIRM": "Cég törlése",
"MESSAGES": {
- "SUCCESS": "Company deleted.",
- "ERROR": "Could not delete the company."
+ "SUCCESS": "Cég törölve.",
+ "ERROR": "Nem sikerült törölni a céget."
}
}
},
diff --git a/app/javascript/dashboard/i18n/locale/hu/components.json b/app/javascript/dashboard/i18n/locale/hu/components.json
index 5fd99eaed..5feb395bf 100644
--- a/app/javascript/dashboard/i18n/locale/hu/components.json
+++ b/app/javascript/dashboard/i18n/locale/hu/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/hu/contact.json b/app/javascript/dashboard/i18n/locale/hu/contact.json
index 5f231cfc4..3a88e7793 100644
--- a/app/javascript/dashboard/i18n/locale/hu/contact.json
+++ b/app/javascript/dashboard/i18n/locale/hu/contact.json
@@ -20,6 +20,8 @@
"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"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "Cimke hozzáadása",
+ "REMOVE_LABELS": "Remove Labels",
"ASSIGN_LABELS_SUCCESS": "Címkék hozzárendelése sikeres.",
"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",
diff --git a/app/javascript/dashboard/i18n/locale/hu/conversation.json b/app/javascript/dashboard/i18n/locale/hu/conversation.json
index ad794fb78..7e68e6b40 100644
--- a/app/javascript/dashboard/i18n/locale/hu/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/hu/conversation.json
@@ -62,6 +62,7 @@
"UNSUPPORTED_MESSAGE_FACEBOOK": "Ez az üzenet nem támogatott. Ezt az üzenetet a Facebook Messenger alkalmazásban tekintheti meg.",
"UNSUPPORTED_MESSAGE_INSTAGRAM": "Ez az üzenet nem támogatott. Ezt az üzenetet az Instagram alkalmazásban tekintheti meg.",
"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": "Üzenet törölve",
"FAIL_DELETE_MESSSAGE": "Nem tudtad törölni az üzenetet! Próbáld újra",
"NO_RESPONSE": "Nincs válasz",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Kevesebb mutatása"
},
"HEADER": {
"RESOLVE_ACTION": "Megoldva",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "Halasztás holnapig",
"SNOOZED_UNTIL_NEXT_WEEK": "Halasztás jövő hétig",
"SNOOZED_UNTIL_NEXT_REPLY": "Halasztás következő válaszig",
+ "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}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "Hangfelvétel",
"TIP_AUDIORECORDER_PERMISSION": "Hozzáférés megadása a hangfelvételhez",
"TIP_AUDIORECORDER_ERROR": "Nem sikerült megnyitni a hangfelvételt",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "Helyezd ide a csatolmányt",
"START_AUDIO_RECORDING": "Hangfelvétel indítása",
"STOP_AUDIO_RECORDING": "Hangfelvétel leállítása",
@@ -299,8 +316,13 @@
"NOT_ANSWERED_YET": "Not answered yet",
"HANDLED_IN_ANOTHER_TAB": "Being handled in another tab",
"REJECT_CALL": "Reject",
+ "DISMISS_CALL": "Elutasítás",
"JOIN_CALL": "Join call",
- "END_CALL": "End 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": {
@@ -376,7 +398,7 @@
"MEDIA_HEADING": "Media",
"FILES_HEADING": "Files",
"VIEW_ALL": "Összes megtekintése",
- "SHOW_LESS": "Show less",
+ "SHOW_LESS": "Kevesebb mutatása",
"MORE_COUNT": "+{count}",
"UNTITLED_FILE": "Untitled file"
},
diff --git a/app/javascript/dashboard/i18n/locale/hu/helpCenter.json b/app/javascript/dashboard/i18n/locale/hu/helpCenter.json
index 8d3690c07..78388171c 100644
--- a/app/javascript/dashboard/i18n/locale/hu/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/hu/helpCenter.json
@@ -582,39 +582,42 @@
}
},
"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)",
+ "TITLE": "Bejegyzés lefordítása | {count} bejegyzés lefordítása",
+ "DESCRIPTION": "Fordítsd le a kiválasztott bejegyzést egy másik nyelvre. | Fordítsd le a kiválasztott bejegyzéseket egy másik nyelvre.",
+ "LOCALE_LABEL": "Célnyelv",
+ "LOCALE_PLACEHOLDER": "Válassz nyelvet",
+ "CATEGORY_LABEL": "Célkategória",
+ "CATEGORY_PLACEHOLDER": "Válassz kategóriát",
+ "OPTIONAL": "(opcionális)",
"CONFIRM": "Fordítás",
- "SELECT_ALL": "Select all ({count})",
- "SELECTED_COUNT": "{count} selected",
- "CLEAR_SELECTION": "Clear selection",
+ "SELECT_ALL": "Összes kijelölése ({count})",
+ "SELECTED_COUNT": "{count} kijelölve",
+ "CLEAR_SELECTION": "Kijelölés törlése",
"TRANSLATE_BUTTON": "Fordítás",
- "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.",
+ "CONFIRM_OVERWRITE": "Felülírás és lefordítás",
+ "DUPLICATE_WARNING": "Ehhez a bejegyzéshez már létezik fordítás a kiválasztott nyelven. | {count} bejegyzéshez már létezik fordítás a kiválasztott nyelven.",
+ "DUPLICATE_CONFIRM_HINT": "Kattints a 'Lefordítás' gombra ismét a meglévő fordítás felülírásához.",
"API": {
- "SUCCESS_MESSAGE": "Translation in progress. The article will appear as a draft once ready.",
- "ERROR_MESSAGE": "Failed to start translation. Please try again."
+ "SUCCESS_MESSAGE": "A fordítás folyamatban van. A bejegyzés elkészülés után piszkozatként fog megjelenni.",
+ "ERROR_MESSAGE": "Nem sikerült elindítani a fordítást. Kérlek, próbáld újra."
}
},
"BULK_ACTIONS": {
"PUBLISH": "Publikálás",
"DRAFT": "Vázlat",
- "ARCHIVE": "Archive",
+ "ARCHIVE": "Archiválás",
"TRANSLATE": "Fordítás",
+ "MOVE_TO_CATEGORY": "Kategória",
"DELETE": "Törlés",
- "STATUS_SUCCESS": "Articles updated successfully",
- "STATUS_ERROR": "Failed to update 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.",
+ "STATUS_SUCCESS": "A bejegyzések sikeresen frissítve",
+ "STATUS_ERROR": "Nem sikerült frissíteni a bejegyzéseket",
+ "CATEGORY_SUCCESS": "Articles moved successfully",
+ "CATEGORY_ERROR": "Failed to move articles",
+ "DELETE_CONFIRM_TITLE": "Bejegyzés törlése | {count} bejegyzés törlése",
+ "DELETE_CONFIRM_DESCRIPTION": "Ez véglegesen törli a kiválasztott bejegyzést. Ez a művelet nem vonható vissza. | Ez véglegesen törli a kijelölt {count} bejegyzést. Ez a művelet nem vonható vissza.",
"DELETE_CONFIRM": "Törlés",
- "DELETE_SUCCESS": "Articles deleted successfully",
- "DELETE_ERROR": "Failed to delete articles"
+ "DELETE_SUCCESS": "A bejegyzések sikeresen törölve",
+ "DELETE_ERROR": "Nem sikerült törölni a bejegyzéseket"
}
},
"CATEGORY_PAGE": {
@@ -866,6 +869,28 @@
},
"EDIT_CONFIGURATION": "Edit configuration"
},
+ "LAYOUT_CONTENT": {
+ "HEADER": "Megjelenés",
+ "DESCRIPTION": "Válaszd ki az elrendezést, amely a legjobban megfelel a céljaidnak.",
+ "LAYOUT": {
+ "CLASSIC": {
+ "TITLE": "Klasszikus",
+ "DESCRIPTION": "Barátságos kezdőlap kereséssel és kiemelt témákkal."
+ },
+ "SIDEBAR": {
+ "TITLE": "Dokumentáció",
+ "DESCRIPTION": "Egymás melletti navigáció, amely minden útmutatót egy kattintásnyira tart."
+ }
+ },
+ "SOCIAL_LINKS": {
+ "HEADER": "Közösségi hivatkozások",
+ "DESCRIPTION": "Add meg az egyes hálózatok felhasználónevét, és a súgóközpont elkészíti a teljes hivatkozást. A dokumentációs elrendezés láblécében jelenik meg.",
+ "PLACEHOLDER": "felhasználónév",
+ "ADD": "Közösségi hivatkozás hozzáadása",
+ "REMOVE": "Eltávolítás"
+ },
+ "SAVE": "Módosítások mentése"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Portál sikeresen létrehozva",
diff --git a/app/javascript/dashboard/i18n/locale/hu/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/hu/inboxMgmt.json
index f24f9e40c..8f778b771 100644
--- a/app/javascript/dashboard/i18n/locale/hu/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/hu/inboxMgmt.json
@@ -308,6 +308,7 @@
"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!",
@@ -317,7 +318,8 @@
"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"
+ "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": "Nem tudtuk elmenteni a WhatsApp csatornát"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "Support your customers on WhatsApp"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "E-mail",
"DESCRIPTION": "Connect with Gmail, Outlook, or other providers"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Bot konfiguráció",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT",
- "VOICE": "Voice"
+ "VOICE": "Voice",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Csevegés előtti űrlap beállításainak frissítése"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/hu/integrations.json b/app/javascript/dashboard/i18n/locale/hu/integrations.json
index 36b4668fb..0750b809e 100644
--- a/app/javascript/dashboard/i18n/locale/hu/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/hu/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Kontakt létrehozva",
"CONTACT_UPDATED": "Kontakt frissítve",
"CONVERSATION_TYPING_ON": "Conversation Typing On",
- "CONVERSATION_TYPING_OFF": "Conversation Typing Off"
+ "CONVERSATION_TYPING_OFF": "Conversation Typing Off",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/hu/macros.json b/app/javascript/dashboard/i18n/locale/hu/macros.json
index 04d1a9207..117061b66 100644
--- a/app/javascript/dashboard/i18n/locale/hu/macros.json
+++ b/app/javascript/dashboard/i18n/locale/hu/macros.json
@@ -71,7 +71,7 @@
"LABEL": "Nyilvános",
"DESCRIPTION": "Ez a makró nyilvánosan elérhető minden ügynök számára ebben a fiókban.",
"CREATE_DISABLED_DESCRIPTION": "Only administrators can create public macros.",
- "EDIT_DISABLED_DESCRIPTION": "Only administrators can edit public macros."
+ "EDIT_DISABLED_DESCRIPTION": "Csak adminisztrátorok tudnak publikus makrókat szerkeszteni."
},
"PERSONAL": {
"LABEL": "Privát",
diff --git a/app/javascript/dashboard/i18n/locale/hu/onboarding.json b/app/javascript/dashboard/i18n/locale/hu/onboarding.json
index bb6f1fe68..1eff9d57e 100644
--- a/app/javascript/dashboard/i18n/locale/hu/onboarding.json
+++ b/app/javascript/dashboard/i18n/locale/hu/onboarding.json
@@ -1,34 +1,34 @@
{
"ONBOARDING_NEXT": {
- "GREETING": "Hello {name}!",
- "SUBTITLE": "Please review the following details",
- "YOUR_DETAILS": "Your details",
- "COMPANY_DETAILS": "Company details",
+ "GREETING": "Szia {name}!",
+ "SUBTITLE": "Ellenőrizd az alábbi adatokat",
+ "YOUR_DETAILS": "Adataid",
+ "COMPANY_DETAILS": "Cégadatok",
"FIELDS": {
"EMAIL": "E-mail",
- "YOUR_ROLE": "Your Role",
+ "YOUR_ROLE": "Szerepköröd",
"WEBSITE": "Honlap",
"LANGUAGE": "Nyelv",
"TIMEZONE": "Időzóna",
- "COMPANY_SIZE": "Company Size",
- "INDUSTRY": "Industry",
- "REFERRAL_SOURCE": "Where did you find us?"
+ "COMPANY_SIZE": "Cégméret",
+ "INDUSTRY": "Iparág",
+ "REFERRAL_SOURCE": "Hol találtál ránk?"
},
"PLACEHOLDERS": {
- "SELECT_ROLE": "Select your role",
+ "SELECT_ROLE": "Válassz szerepkört",
"ENTER_WEBSITE": "www.example.com",
- "SELECT_LANGUAGE": "Select language",
+ "SELECT_LANGUAGE": "Válassz nyelvet",
"SELECT_TIMEZONE": "Időzóna kiválasztása",
- "SELECT_COMPANY_SIZE": "Select company size",
- "SELECT_INDUSTRY": "Select industry",
- "SELECT_REFERRAL_SOURCE": "Select source"
+ "SELECT_COMPANY_SIZE": "Válassz cégméretet",
+ "SELECT_INDUSTRY": "Válassz iparágat",
+ "SELECT_REFERRAL_SOURCE": "Válassz forrást"
},
- "EMAIL_VERIFIED": "Email verified",
- "SETTING_UP": "Setting up your account...",
- "CONTINUE": "Continue",
+ "EMAIL_VERIFIED": "E-mail cím megerősítve",
+ "SETTING_UP": "A fiókod beállítása...",
+ "CONTINUE": "Folytatás",
"SAVING": "Mentés...",
- "VALIDATION_ERROR": "Please fill in all required fields",
- "SUCCESS": "Details saved successfully",
- "ERROR": "Could not save details. Please try again."
+ "VALIDATION_ERROR": "Töltsd ki az összes kötelező mezőt",
+ "SUCCESS": "Az adatok sikeresen mentve",
+ "ERROR": "Nem sikerült menteni az adatokat. Próbáld újra."
}
}
diff --git a/app/javascript/dashboard/i18n/locale/hy/bulkActions.json b/app/javascript/dashboard/i18n/locale/hy/bulkActions.json
index bfed485ca..c6f9648a3 100644
--- a/app/javascript/dashboard/i18n/locale/hy/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/hy/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} conversations selected",
- "AGENT_SELECT_LABEL": "Select agent",
- "ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign {conversationCount} {conversationLabel} to",
- "UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Go back",
- "ASSIGN_LABEL": "Assign",
"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}?",
@@ -20,7 +15,6 @@
"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.",
- "AGENT_LIST_LOADING": "Loading agents",
"UPDATE": {
"CHANGE_STATUS": "Change status",
"SNOOZE_UNTIL": "Snooze",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assign labels",
- "NO_LABELS_FOUND": "No labels found",
+ "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."
+ "ASSIGN_FAILED": "Failed to assign labels. Please try again.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Select team",
"NONE": "None",
- "NO_TEAMS_AVAILABLE": "There are no teams added to this account yet.",
- "ASSIGN_SELECTED_TEAMS": "Assign selected team.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/hy/campaign.json b/app/javascript/dashboard/i18n/locale/hy/campaign.json
index 10366e79e..4b15adb0b 100644
--- a/app/javascript/dashboard/i18n/locale/hy/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/hy/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Ընթացքի մեջ է",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Ընթացքի մեջ է",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/hy/components.json b/app/javascript/dashboard/i18n/locale/hy/components.json
index a75d35b08..3ee865a89 100644
--- a/app/javascript/dashboard/i18n/locale/hy/components.json
+++ b/app/javascript/dashboard/i18n/locale/hy/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/hy/contact.json b/app/javascript/dashboard/i18n/locale/hy/contact.json
index 5770e6ffd..702b355eb 100644
--- a/app/javascript/dashboard/i18n/locale/hy/contact.json
+++ b/app/javascript/dashboard/i18n/locale/hy/contact.json
@@ -20,6 +20,8 @@
"CALL": "Զանգ",
"CALL_INITIATED": "Զանգը սկսվում է…",
"CALL_FAILED": "Չհաջողվեց սկսել զանգը։ Խնդրում ենք փորձել կրկին։",
+ "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": "Ընտրեք ձայնային մուտքագրման արկղը"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "Նշումներ նշանակել",
+ "REMOVE_LABELS": "Remove Labels",
"ASSIGN_LABELS_SUCCESS": "Նշումները հաջողությամբ նշանակվեցին։",
"ASSIGN_LABELS_FAILED": "Հնարավոր չեղավ նշանակել պիտակները",
+ "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": "Դեռ պիտակներ չկան։",
"SELECTED_COUNT": "{count} ընտրված",
diff --git a/app/javascript/dashboard/i18n/locale/hy/conversation.json b/app/javascript/dashboard/i18n/locale/hy/conversation.json
index ca2494dc6..e4f4b6f43 100644
--- a/app/javascript/dashboard/i18n/locale/hy/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/hy/conversation.json
@@ -62,6 +62,7 @@
"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": "Հաղորդագրությունը հաջողությամբ ջնջվեց",
"FAIL_DELETE_MESSSAGE": "Չհաջողվեց ջնջել հաղորդագրությունը։ Փորձեք կրկին",
"NO_RESPONSE": "Պատասխան չկա",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Փակել",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "Հետաձգված է մինչև վաղը",
"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}",
@@ -215,6 +231,7 @@
"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": "Քաշեք և գցեք այստեղ կցելու համար",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
@@ -299,8 +316,13 @@
"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"
+ "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": {
diff --git a/app/javascript/dashboard/i18n/locale/hy/helpCenter.json b/app/javascript/dashboard/i18n/locale/hy/helpCenter.json
index 080b0abe7..648634a48 100644
--- a/app/javascript/dashboard/i18n/locale/hy/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/hy/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Սևագիր",
"ARCHIVE": "Արխիվ",
"TRANSLATE": "Translate",
+ "MOVE_TO_CATEGORY": "Category",
"DELETE": "Delete",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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",
@@ -866,6 +869,28 @@
},
"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": "Հեռացնել"
+ },
+ "SAVE": "Պահպանել փոփոխությունները"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Պորտալը հաջողությամբ ստեղծվեց",
diff --git a/app/javascript/dashboard/i18n/locale/hy/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/hy/inboxMgmt.json
index 8acc1b540..71169f92c 100644
--- a/app/javascript/dashboard/i18n/locale/hy/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/hy/inboxMgmt.json
@@ -308,6 +308,7 @@
"AUTH_PROCESSING": "Վավերացում Meta-ի հետ",
"WAITING_FOR_BUSINESS_INFO": "Խնդրում ենք լրացնել բիզնեսի կարգավորումը Meta պատուհանում...",
"PROCESSING": "Ձեր WhatsApp Business հաշվի կարգավորումը",
+ "ENABLING_CALLING": "Enabling WhatsApp Calling on your number…",
"LOADING_SDK": "Բեռնում է Facebook SDK-ն...",
"CANCELLED": "WhatsApp գրանցումը չեղարկվեց",
"SUCCESS_TITLE": "WhatsApp Business հաշիվը միացված է։",
@@ -317,7 +318,8 @@
"AUTH_NOT_COMPLETED": "Հաստատումը չի ավարտվել։ Խնդրում ենք սկսել գործընթացը նորից։",
"SUCCESS_FALLBACK": "WhatsApp Business հաշիվը հաջողությամբ կարգավորվել է",
"MANUAL_FALLBACK": "Եթե ձեր համարը արդեն միացված է WhatsApp Business Platform (API)-ին, կամ եթե դուք տեխնոլոգիական մատակարար եք, որը միացնում է իր սեփական համարը, խնդրում ենք օգտագործել {link} ընթացքը",
- "MANUAL_LINK_TEXT": "ձեռնարկային կարգավորման ընթացք"
+ "MANUAL_LINK_TEXT": "ձեռնարկային կարգավորման ընթացք",
+ "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": "Չհաջողվեց պահպանել WhatsApp ալիքը"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "Աջակցեք ձեր հաճախորդներին WhatsApp-ում"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "Էլ. փոստ",
"DESCRIPTION": "Կապվեք Gmail-ի, Outlook-ի կամ այլ մատակարարների հետ"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Բոտի կարգավորումներ",
"ACCOUNT_HEALTH": "Հաշվի առողջություն",
"CSAT": "CSAT",
- "VOICE": "Ձայն"
+ "VOICE": "Ձայն",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Անվճարների նախապատվություններ",
"WIDGET_FEATURES": "Վիջեթի հնարավորություններ",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"WHATSAPP_TEMPLATES_SYNC_SUBHEADER": "Ձեռնարկաբար համաժամեցրեք հաղորդագրությունների տիպերը WhatsApp-ից՝ ձեր հասանելի տիպերը թարմացնելու համար։",
"WHATSAPP_TEMPLATES_SYNC_BUTTON": "Համաժամեցնել տիպերը",
"WHATSAPP_TEMPLATES_SYNC_SUCCESS": "Տիպերի համաժամացումը հաջողությամբ սկսվեց։ Թարմացումը կարող է տևել մի քանի րոպե։",
+ "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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Թարմացնել նախազրույցի ձևի կարգավորումները"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/hy/integrations.json b/app/javascript/dashboard/i18n/locale/hy/integrations.json
index cb5e74f53..0dc4b0570 100644
--- a/app/javascript/dashboard/i18n/locale/hy/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/hy/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Կոնտակտ ստեղծվեց",
"CONTACT_UPDATED": "Կոնտակտը թարմացվեց",
"CONVERSATION_TYPING_ON": "Զրույցի տպագրություն ակտիվ է",
- "CONVERSATION_TYPING_OFF": "Զրույցի տպագրություն անջատված է"
+ "CONVERSATION_TYPING_OFF": "Զրույցի տպագրություն անջատված է",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/id/bulkActions.json b/app/javascript/dashboard/i18n/locale/id/bulkActions.json
index 3d3ec9b10..7e7a9ab77 100644
--- a/app/javascript/dashboard/i18n/locale/id/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/id/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} percakapan dipilih",
- "AGENT_SELECT_LABEL": "Pilih Agen",
- "ASSIGN_CONFIRMATION_LABEL": "Apakah Anda yakin ingin menugaskan {conversationCount} {conversationLabel} kepada",
- "UNASSIGN_CONFIRMATION_LABEL": "Apakah Anda yakin ingin melepaskan penugasan dari {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Kembali",
- "ASSIGN_LABEL": "Tugaskan",
"NONE": "Tidak ada",
"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}?",
@@ -20,7 +15,6 @@
"RESOLVE_SUCCESFUL": "Percakapan berhasil diselesaikan.",
"RESOLVE_FAILED": "Failed to resolve conversations. Please try again.",
"ALL_CONVERSATIONS_SELECTED_ALERT": "Percakapan yang terlihat di halaman ini hanya yang dipilih.",
- "AGENT_LIST_LOADING": "Sedang memuat agen",
"UPDATE": {
"CHANGE_STATUS": "Ubah status",
"SNOOZE_UNTIL": "Tunda",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assign labels",
- "NO_LABELS_FOUND": "Tidak ada label",
+ "REMOVE_LABELS": "Remove labels",
"ASSIGN_SELECTED_LABELS": "Tugaskan label terpilih",
+ "REMOVE_SELECTED_LABELS": "Remove selected labels",
"ASSIGN_SUCCESFUL": "Label berhasil ditugaskan.",
- "ASSIGN_FAILED": "Failed to assign labels. Please try again."
+ "ASSIGN_FAILED": "Failed to assign labels. Please try again.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Pilih tim",
"NONE": "Tidak ada",
- "NO_TEAMS_AVAILABLE": "Belum ada tim yang ditambahkan ke akun ini.",
- "ASSIGN_SELECTED_TEAMS": "Tugaskan tim terpilih.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/id/campaign.json b/app/javascript/dashboard/i18n/locale/id/campaign.json
index bae264a62..6faebd197 100644
--- a/app/javascript/dashboard/i18n/locale/id/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/id/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Selesai",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Selesai",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/id/components.json b/app/javascript/dashboard/i18n/locale/id/components.json
index e3c2a8b39..8c5e64738 100644
--- a/app/javascript/dashboard/i18n/locale/id/components.json
+++ b/app/javascript/dashboard/i18n/locale/id/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/id/contact.json b/app/javascript/dashboard/i18n/locale/id/contact.json
index 9733708b8..e95a529b0 100644
--- a/app/javascript/dashboard/i18n/locale/id/contact.json
+++ b/app/javascript/dashboard/i18n/locale/id/contact.json
@@ -20,6 +20,8 @@
"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"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "Tugaskan Label",
+ "REMOVE_LABELS": "Remove Labels",
"ASSIGN_LABELS_SUCCESS": "Label berhasil ditugaskan.",
"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",
diff --git a/app/javascript/dashboard/i18n/locale/id/conversation.json b/app/javascript/dashboard/i18n/locale/id/conversation.json
index 8b37405e9..e69d656da 100644
--- a/app/javascript/dashboard/i18n/locale/id/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/id/conversation.json
@@ -62,6 +62,7 @@
"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": "Pesan berhasil dihapus",
"FAIL_DELETE_MESSSAGE": "Tidak dapat menghapus pesan! Coba lagi",
"NO_RESPONSE": "Tidak ada respon",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Menyelesaikan",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "Ditunda hingga besok",
"SNOOZED_UNTIL_NEXT_WEEK": "Ditunda hingga minggu depan",
"SNOOZED_UNTIL_NEXT_REPLY": "Ditunda hingga balasan selanjutnya",
+ "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}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "Rekam audio",
"TIP_AUDIORECORDER_PERMISSION": "Izinkan akses ke audio",
"TIP_AUDIORECORDER_ERROR": "Tidak dapat membuka audio",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "Seret dan letakkan di sini untuk melampirkan",
"START_AUDIO_RECORDING": "Mulai merekam audio",
"STOP_AUDIO_RECORDING": "Berhenti merekam audio",
@@ -299,8 +316,13 @@
"NOT_ANSWERED_YET": "Not answered yet",
"HANDLED_IN_ANOTHER_TAB": "Being handled in another tab",
"REJECT_CALL": "Reject",
+ "DISMISS_CALL": "Tutup",
"JOIN_CALL": "Join call",
- "END_CALL": "End 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": {
diff --git a/app/javascript/dashboard/i18n/locale/id/helpCenter.json b/app/javascript/dashboard/i18n/locale/id/helpCenter.json
index 212d8ddf2..827bfe632 100644
--- a/app/javascript/dashboard/i18n/locale/id/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/id/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Draf",
"ARCHIVE": "Archive",
"TRANSLATE": "Terjemahkan",
+ "MOVE_TO_CATEGORY": "Kategori",
"DELETE": "Hapus",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "Hapus",
@@ -866,6 +869,28 @@
},
"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": "Hapus"
+ },
+ "SAVE": "Save changes"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Portal berhasil dibuat",
diff --git a/app/javascript/dashboard/i18n/locale/id/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/id/inboxMgmt.json
index fd8a173ee..e0929b473 100644
--- a/app/javascript/dashboard/i18n/locale/id/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/id/inboxMgmt.json
@@ -308,6 +308,7 @@
"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!",
@@ -317,7 +318,8 @@
"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"
+ "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": "Kami tidak dapat menyimpan saluran WhatsApp"
@@ -465,6 +467,10 @@
"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"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Konfigurasi Bot",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT",
- "VOICE": "Voice"
+ "VOICE": "Voice",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Perbarui Pengaturan Formulir Pra Obrolan"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/id/integrations.json b/app/javascript/dashboard/i18n/locale/id/integrations.json
index 97b48856f..0d12f77a0 100644
--- a/app/javascript/dashboard/i18n/locale/id/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/id/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Kontak dibuat",
"CONTACT_UPDATED": "Kontak diperbarui",
"CONVERSATION_TYPING_ON": "Conversation Typing On",
- "CONVERSATION_TYPING_OFF": "Conversation Typing Off"
+ "CONVERSATION_TYPING_OFF": "Conversation Typing Off",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/is/bulkActions.json b/app/javascript/dashboard/i18n/locale/is/bulkActions.json
index 5d63efd82..08eeaf66e 100644
--- a/app/javascript/dashboard/i18n/locale/is/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/is/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} samtöl valin",
- "AGENT_SELECT_LABEL": "Velja þjónustufulltrúa",
- "ASSIGN_CONFIRMATION_LABEL": "Ertu viss um að úthluta {conversationCount} {conversationLabel} á",
- "UNASSIGN_CONFIRMATION_LABEL": "Ertu viss um að hætta við úthlutun {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Go back",
- "ASSIGN_LABEL": "Úthluta",
"NONE": "Enginn",
"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}?",
@@ -20,7 +15,6 @@
"RESOLVE_SUCCESFUL": "Conversations resolved successfully.",
"RESOLVE_FAILED": "Failed to resolve conversations. Please try again.",
"ALL_CONVERSATIONS_SELECTED_ALERT": "Samtöl sem sjást á þessari síðu eru aðeins valin.",
- "AGENT_LIST_LOADING": "Loading agents",
"UPDATE": {
"CHANGE_STATUS": "Change status",
"SNOOZE_UNTIL": "Snooze",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assign labels",
- "NO_LABELS_FOUND": "Engar merkingar fundust",
+ "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."
+ "ASSIGN_FAILED": "Failed to assign labels. Please try again.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Velja teymi",
"NONE": "Enginn",
- "NO_TEAMS_AVAILABLE": "There are no teams added to this account yet.",
- "ASSIGN_SELECTED_TEAMS": "Assign selected team.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/is/campaign.json b/app/javascript/dashboard/i18n/locale/is/campaign.json
index 0b3d92de4..9e12d7d4c 100644
--- a/app/javascript/dashboard/i18n/locale/is/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/is/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/is/components.json b/app/javascript/dashboard/i18n/locale/is/components.json
index 1a4ab4455..d610aba4a 100644
--- a/app/javascript/dashboard/i18n/locale/is/components.json
+++ b/app/javascript/dashboard/i18n/locale/is/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/is/contact.json b/app/javascript/dashboard/i18n/locale/is/contact.json
index d730278a9..cd92ed805 100644
--- a/app/javascript/dashboard/i18n/locale/is/contact.json
+++ b/app/javascript/dashboard/i18n/locale/is/contact.json
@@ -20,6 +20,8 @@
"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"
@@ -583,8 +585,11 @@
},
"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",
diff --git a/app/javascript/dashboard/i18n/locale/is/conversation.json b/app/javascript/dashboard/i18n/locale/is/conversation.json
index 7d778ad84..3c99a01b6 100644
--- a/app/javascript/dashboard/i18n/locale/is/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/is/conversation.json
@@ -62,6 +62,7 @@
"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": "Skilaboðum eytt",
"FAIL_DELETE_MESSSAGE": "Gat ekki eytt skilaboðum! Reynið aftur",
"NO_RESPONSE": "Ekkert svar",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Resolve",
@@ -100,6 +110,12 @@
"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}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "Taka upp hljóð",
"TIP_AUDIORECORDER_PERMISSION": "Leyfa aðgang að hljóði",
"TIP_AUDIORECORDER_ERROR": "Tókst ekki að opna hljóðið",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "Dragðu og slepptu viðhenginu hingað",
"START_AUDIO_RECORDING": "Hefja hljóðupptöku",
"STOP_AUDIO_RECORDING": "Stoppa hljóðupptöku",
@@ -299,8 +316,13 @@
"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"
+ "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": {
diff --git a/app/javascript/dashboard/i18n/locale/is/helpCenter.json b/app/javascript/dashboard/i18n/locale/is/helpCenter.json
index 5af9550e1..88f7830c5 100644
--- a/app/javascript/dashboard/i18n/locale/is/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/is/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Draft",
"ARCHIVE": "Archive",
"TRANSLATE": "Translate",
+ "MOVE_TO_CATEGORY": "Category",
"DELETE": "Eyða",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "Eyða",
@@ -866,6 +869,28 @@
},
"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": "Fjarlægja"
+ },
+ "SAVE": "Save changes"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Portal created successfully",
diff --git a/app/javascript/dashboard/i18n/locale/is/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/is/inboxMgmt.json
index be71aea86..11a47f468 100644
--- a/app/javascript/dashboard/i18n/locale/is/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/is/inboxMgmt.json
@@ -308,6 +308,7 @@
"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!",
@@ -317,7 +318,8 @@
"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"
+ "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": "Við gátum ekki vistað WhatsApp rásina"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "Support your customers on WhatsApp"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "Tölvupóstfang",
"DESCRIPTION": "Connect with Gmail, Outlook, or other providers"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Bot stillingar",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT",
- "VOICE": "Voice"
+ "VOICE": "Voice",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Update Pre Chat Form Settings"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/is/integrations.json b/app/javascript/dashboard/i18n/locale/is/integrations.json
index 2d4b9bf16..23a65ea4a 100644
--- a/app/javascript/dashboard/i18n/locale/is/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/is/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Contact created",
"CONTACT_UPDATED": "Contact updated",
"CONVERSATION_TYPING_ON": "Conversation Typing On",
- "CONVERSATION_TYPING_OFF": "Conversation Typing Off"
+ "CONVERSATION_TYPING_OFF": "Conversation Typing Off",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/it/bulkActions.json b/app/javascript/dashboard/i18n/locale/it/bulkActions.json
index ab3f73690..0399afad0 100644
--- a/app/javascript/dashboard/i18n/locale/it/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/it/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} conversazioni selezionate",
- "AGENT_SELECT_LABEL": "Seleziona un operatore",
- "ASSIGN_CONFIRMATION_LABEL": "Sei sicuro di voler assegnare {conversationCount} {conversationLabel} a",
- "UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Torna indietro",
- "ASSIGN_LABEL": "Assegna",
"NONE": "Nessuno",
"CLEAR_SELECTION": "Rimuovi",
"ASSIGN_AGENT_CONFIRMATION_LABEL": "Sei sicuro di voler assegnare {n} conversazione a {agentName}? | Sei sicuro di voler assegnare {n} conversazioni a {agentName}?",
@@ -20,7 +15,6 @@
"RESOLVE_SUCCESFUL": "Conversazioni risolte correttamente.",
"RESOLVE_FAILED": "Impossibile risolvere le conversazioni. Riprova.",
"ALL_CONVERSATIONS_SELECTED_ALERT": "Solo le conversazioni visibili in questa pagina sono selezionate.",
- "AGENT_LIST_LOADING": "Caricamento operatori",
"UPDATE": {
"CHANGE_STATUS": "Cambia stato",
"SNOOZE_UNTIL": "Posticipa",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assegna etichette",
- "NO_LABELS_FOUND": "Nessuna etichetta trovata",
+ "REMOVE_LABELS": "Remove labels",
"ASSIGN_SELECTED_LABELS": "Assegna etichette selezeionate",
+ "REMOVE_SELECTED_LABELS": "Remove selected labels",
"ASSIGN_SUCCESFUL": "Etichette assegnate correttamente.",
- "ASSIGN_FAILED": "Impossibile assegnare le etichette. Riprova."
+ "ASSIGN_FAILED": "Impossibile assegnare le etichette. Riprova.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Seleziona team",
"NONE": "Nessuno",
- "NO_TEAMS_AVAILABLE": "Non ci sono ancora team aggiunti a questo account.",
- "ASSIGN_SELECTED_TEAMS": "Assegna team selezionato.",
"ASSIGN_TEAM_CONFIRMATION_LABEL": "Sei sicuro di voler assegnare {n} conversazione a {teamName}? | Sei sicuro di voler assegnare {n} conversazioni a {teamName}?",
"UNASSIGN_TEAM_CONFIRMATION_LABEL": "Sei sicuro di voler disassegnare {n} conversazione? | Sei sicuro di voler disassegnare {n} conversazioni?",
"ASSIGN_SUCCESFUL": "Team assegnati con successo.",
diff --git a/app/javascript/dashboard/i18n/locale/it/campaign.json b/app/javascript/dashboard/i18n/locale/it/campaign.json
index 9831fe823..0b42e5b73 100644
--- a/app/javascript/dashboard/i18n/locale/it/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/it/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Elaborazione",
"COMPLETED": "Completata",
"SCHEDULED": "Programmata"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Elaborazione",
"COMPLETED": "Completata",
"SCHEDULED": "Programmata"
},
diff --git a/app/javascript/dashboard/i18n/locale/it/components.json b/app/javascript/dashboard/i18n/locale/it/components.json
index e44c5b92c..bb2aafe5e 100644
--- a/app/javascript/dashboard/i18n/locale/it/components.json
+++ b/app/javascript/dashboard/i18n/locale/it/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/it/contact.json b/app/javascript/dashboard/i18n/locale/it/contact.json
index a5fc3aaa3..504b8e877 100644
--- a/app/javascript/dashboard/i18n/locale/it/contact.json
+++ b/app/javascript/dashboard/i18n/locale/it/contact.json
@@ -20,6 +20,8 @@
"CALL": "Chiama",
"CALL_INITIATED": "Chiamando il contatto…",
"CALL_FAILED": "Impossibile avviare la chiamata. Riprova.",
+ "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": "Clicca per modificare",
"VOICE_INBOX_PICKER": {
"TITLE": "Scegli una inbox vocale"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "Assegna Etichette",
+ "REMOVE_LABELS": "Remove Labels",
"ASSIGN_LABELS_SUCCESS": "Etichette assegnate correttamente.",
"ASSIGN_LABELS_FAILED": "Assegnazione delle etichette non riuscita",
+ "REMOVE_LABELS_SUCCESS": "Labels removed successfully.",
+ "REMOVE_LABELS_FAILED": "Failed to remove labels",
"DESCRIPTION": "Selezionare le etichette da aggiungere ai contatti selezionati.",
"NO_LABELS_FOUND": "Nessuna etichetta disponibile.",
"SELECTED_COUNT": "{count} selezionate",
diff --git a/app/javascript/dashboard/i18n/locale/it/conversation.json b/app/javascript/dashboard/i18n/locale/it/conversation.json
index e725f37b1..663e1e902 100644
--- a/app/javascript/dashboard/i18n/locale/it/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/it/conversation.json
@@ -62,6 +62,7 @@
"UNSUPPORTED_MESSAGE_FACEBOOK": "Questo messaggio non è supportato. Puoi visualizzare questo messaggio sull'app Facebook Messenger.",
"UNSUPPORTED_MESSAGE_INSTAGRAM": "Questo messaggio non è supportato. Puoi visualizzare questo messaggio sull'app Instagram.",
"UNSUPPORTED_MESSAGE_TIKTOK": "Questo messaggio non è supportato. Puoi visualizzare questo messaggio sull'app TikTok.",
+ "UNSUPPORTED_MESSAGE_WHATSAPP": "This message is unsupported. You can view this message on the WhatsApp app.",
"SUCCESS_DELETE_MESSAGE": "Messaggio eliminato con successo",
"FAIL_DELETE_MESSSAGE": "Impossibile eliminare il messaggio! Riprova",
"NO_RESPONSE": "Nessuna risposta",
@@ -79,13 +80,22 @@
"OUTGOING_CALL": "Chiamata in uscita",
"CALL_IN_PROGRESS": "Chiamata in corso",
"NO_ANSWER": "Nessuna risposta",
+ "NO_ANSWER_OUTBOUND_LABEL": "Nessuna risposta",
+ "NO_ANSWER_OUTBOUND_SUBTEXT": "Contact didn't pick up",
"MISSED_CALL": "Chiamata persa",
+ "MISSED_CALL_INBOUND_SUBTEXT": "No agent picked up",
+ "MISSED_CALL_DECLINED_BY": "Declined by {agentName}",
"CALL_ENDED": "Chiamata terminata",
+ "HANDLED_BY": "Handled by {agentName}",
"NOT_ANSWERED_YET": "Non ancora risposta",
+ "CALLING": "Calling…",
"THEY_ANSWERED": "Hanno risposto",
"YOU_ANSWERED": "Hai risposto",
"AGENT_ANSWERED": "{agentName} ha risposto",
- "JOIN_CALL": "Entra nella chiamata"
+ "JOIN_CALL": "Entra nella chiamata",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Mostra meno"
},
"HEADER": {
"RESOLVE_ACTION": "Risolvi",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "Posticipata fino a domani",
"SNOOZED_UNTIL_NEXT_WEEK": "Posticipata fino alla prossima settimana",
"SNOOZED_UNTIL_NEXT_REPLY": "Posticipata fino alla prossima risposta",
+ "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}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "Registra audio",
"TIP_AUDIORECORDER_PERMISSION": "Consenti l'accesso all'audio",
"TIP_AUDIORECORDER_ERROR": "Impossibile aprire l'audio",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "Trascina qui per allegare",
"START_AUDIO_RECORDING": "Avvia registrazione audio",
"STOP_AUDIO_RECORDING": "Interrompi registrazione audio",
@@ -299,8 +316,13 @@
"NOT_ANSWERED_YET": "Non ancora risposta",
"HANDLED_IN_ANOTHER_TAB": "Gestita in un'altra scheda",
"REJECT_CALL": "Rifiuta",
+ "DISMISS_CALL": "Ignora",
"JOIN_CALL": "Entra nella chiamata",
- "END_CALL": "Termina chiamata"
+ "END_CALL": "Termina chiamata",
+ "MUTE": "Mute mic",
+ "UNMUTE": "Unmute mic",
+ "VIEW_CHAT_HISTORY": "View chat history",
+ "GO_TO_CONVERSATION": "Go to conversation thread"
}
},
"EMAIL_TRANSCRIPT": {
diff --git a/app/javascript/dashboard/i18n/locale/it/helpCenter.json b/app/javascript/dashboard/i18n/locale/it/helpCenter.json
index 71fcfe9f8..e2ebb85d5 100644
--- a/app/javascript/dashboard/i18n/locale/it/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/it/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Bozza",
"ARCHIVE": "Archivia",
"TRANSLATE": "Traduci",
+ "MOVE_TO_CATEGORY": "Categoria",
"DELETE": "Elimina",
"STATUS_SUCCESS": "Articoli aggiornati correttamente",
"STATUS_ERROR": "Impossibile aggiornare gli articoli",
+ "CATEGORY_SUCCESS": "Articles moved successfully",
+ "CATEGORY_ERROR": "Failed to move articles",
"DELETE_CONFIRM_TITLE": "Elimina articolo | Elimina {count} articoli",
"DELETE_CONFIRM_DESCRIPTION": "Questo eliminerà definitivamente l'articolo selezionato. Questa azione non può essere annullata. | Questo eliminerà definitivamente {count} articoli selezionati. Questa azione non può essere annullata.",
"DELETE_CONFIRM": "Elimina",
@@ -866,6 +869,28 @@
},
"EDIT_CONFIGURATION": "Modifica configurazione"
},
+ "LAYOUT_CONTENT": {
+ "HEADER": "Aspetto",
+ "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": "Rimuovi"
+ },
+ "SAVE": "Salva modifiche"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Portale creato con successo",
diff --git a/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json
index ea13b8328..cbe0960a3 100644
--- a/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json
@@ -308,6 +308,7 @@
"AUTH_PROCESSING": "Autenticazione con Meta",
"WAITING_FOR_BUSINESS_INFO": "Completa la configurazione aziendale nella finestra Meta...",
"PROCESSING": "Configurazione del tuo account WhatsApp Business",
+ "ENABLING_CALLING": "Enabling WhatsApp Calling on your number…",
"LOADING_SDK": "Caricamento del Facebook SDK...",
"CANCELLED": "Registrazione WhatsApp annullata",
"SUCCESS_TITLE": "Account WhatsApp Business connesso!",
@@ -317,7 +318,8 @@
"AUTH_NOT_COMPLETED": "Autenticazione non completata. Riavvia il processo.",
"SUCCESS_FALLBACK": "Account WhatsApp Business è stato configurato con successo",
"MANUAL_FALLBACK": "Se il tuo numero è già connesso alla WhatsApp Business Platform (API), o se sei un provider tecnologico, si prega di utilizzare il {link}",
- "MANUAL_LINK_TEXT": "flow di registrazione manuale"
+ "MANUAL_LINK_TEXT": "flow di registrazione manuale",
+ "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": "Impossibile salvare il canale WhatsApp"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "Supporta i tuoi clienti su WhatsApp"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "Chiamata WhatsApp",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "Email",
"DESCRIPTION": "Connettiti con Gmail, Outlook, o altri provider"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Configurazione Bot",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT",
- "VOICE": "Voce"
+ "VOICE": "Voce",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Le chiamate vocali richiedono credenziali API di Twilio. Queste vengono usate per generare token per le connessioni voce."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "Vorremmo chiamarti riguardo alla tua conversazione."
+ }
+ },
"CHANNEL_PREFERENCES": "Preferenze Canali",
"WIDGET_FEATURES": "Funzionalità Widget",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"WHATSAPP_TEMPLATES_SYNC_SUBHEADER": "Sincronizza manualmente i modelli di messaggi da WhatsApp per aggiornare i modelli disponibili.",
"WHATSAPP_TEMPLATES_SYNC_BUTTON": "Sincronizza Modelli",
"WHATSAPP_TEMPLATES_SYNC_SUCCESS": "Sincronizzazione modelli iniziata. Potrebbe volerci qualche minuto per aggiornare.",
+ "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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Aggiorna le Impostazioni del Modulo Pre Chat"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/it/integrations.json b/app/javascript/dashboard/i18n/locale/it/integrations.json
index 6bf686914..96f6bd0c0 100644
--- a/app/javascript/dashboard/i18n/locale/it/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/it/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Contatto creato",
"CONTACT_UPDATED": "Contatto aggiornato",
"CONVERSATION_TYPING_ON": "Digitazione conversazione attiva",
- "CONVERSATION_TYPING_OFF": "Digitazione conversazione disattiva"
+ "CONVERSATION_TYPING_OFF": "Digitazione conversazione disattiva",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/ja/bulkActions.json b/app/javascript/dashboard/i18n/locale/ja/bulkActions.json
index ccba7d563..942b5d298 100644
--- a/app/javascript/dashboard/i18n/locale/ja/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/ja/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} 件の会話が選択されました",
- "AGENT_SELECT_LABEL": "担当者を選択",
- "ASSIGN_CONFIRMATION_LABEL": "{conversationCount} 件の{conversationLabel}を割り当てますか?",
- "UNASSIGN_CONFIRMATION_LABEL": "{conversationCount} 件の{conversationLabel}の割り当てを解除しますか?",
- "GO_BACK_LABEL": "戻る",
- "ASSIGN_LABEL": "割り当て",
"NONE": "なし",
"CLEAR_SELECTION": "クリア",
"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}?",
@@ -20,7 +15,6 @@
"RESOLVE_SUCCESFUL": "会話が正常に解決されました。",
"RESOLVE_FAILED": "会話の解決に失敗しました。再試行してください。",
"ALL_CONVERSATIONS_SELECTED_ALERT": "このページに表示されている会話のみが選択されています。",
- "AGENT_LIST_LOADING": "担当者を読み込み中",
"UPDATE": {
"CHANGE_STATUS": "ステータスを変更",
"SNOOZE_UNTIL": "スヌーズ",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "ラベルを割り当てる",
- "NO_LABELS_FOUND": "ラベルが見つかりません",
+ "REMOVE_LABELS": "Remove labels",
"ASSIGN_SELECTED_LABELS": "選択したラベルを割り当てる",
+ "REMOVE_SELECTED_LABELS": "Remove selected labels",
"ASSIGN_SUCCESFUL": "ラベルが正常に割り当てられました。",
- "ASSIGN_FAILED": "ラベルの割り当てに失敗しました。再試行してください。"
+ "ASSIGN_FAILED": "ラベルの割り当てに失敗しました。再試行してください。",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "チームを選択",
"NONE": "該当なし",
- "NO_TEAMS_AVAILABLE": "このアカウントにはまだチームが追加されていません。",
- "ASSIGN_SELECTED_TEAMS": "選択したチームを割り当てる",
"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": "チームが正常に割り当てられました。",
diff --git a/app/javascript/dashboard/i18n/locale/ja/campaign.json b/app/javascript/dashboard/i18n/locale/ja/campaign.json
index 608e66664..3bedca6ba 100644
--- a/app/javascript/dashboard/i18n/locale/ja/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/ja/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "完了",
"SCHEDULED": "スケジュール済み"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "完了",
"SCHEDULED": "スケジュール済み"
},
diff --git a/app/javascript/dashboard/i18n/locale/ja/components.json b/app/javascript/dashboard/i18n/locale/ja/components.json
index 4b7f15413..b6b732e87 100644
--- a/app/javascript/dashboard/i18n/locale/ja/components.json
+++ b/app/javascript/dashboard/i18n/locale/ja/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ja/contact.json b/app/javascript/dashboard/i18n/locale/ja/contact.json
index c206cd3b9..763edb81b 100644
--- a/app/javascript/dashboard/i18n/locale/ja/contact.json
+++ b/app/javascript/dashboard/i18n/locale/ja/contact.json
@@ -20,6 +20,8 @@
"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"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "Assign Labels",
+ "REMOVE_LABELS": "Remove Labels",
"ASSIGN_LABELS_SUCCESS": "ラベルが正常に割り当てられました。",
"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",
diff --git a/app/javascript/dashboard/i18n/locale/ja/conversation.json b/app/javascript/dashboard/i18n/locale/ja/conversation.json
index c8c585b2e..793f00cc8 100644
--- a/app/javascript/dashboard/i18n/locale/ja/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ja/conversation.json
@@ -62,6 +62,7 @@
"UNSUPPORTED_MESSAGE_FACEBOOK": "このメッセージはサポートされていません。Facebook Messengerでこのメッセージを表示できます。",
"UNSUPPORTED_MESSAGE_INSTAGRAM": "このメッセージはサポートされていません。このメッセージは Instagram で表示できます。",
"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": "メッセージの削除に成功",
"FAIL_DELETE_MESSSAGE": "メッセージを削除できませんでした!もう一度お試しください",
"NO_RESPONSE": "返信なし",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "解決する",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "明日までスヌーズしました",
"SNOOZED_UNTIL_NEXT_WEEK": "来週までスヌーズ",
"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}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "音声を録音",
"TIP_AUDIORECORDER_PERMISSION": "音声アクセスを許可",
"TIP_AUDIORECORDER_ERROR": "音声を開けませんでした",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "添付するにはここにドラッグ&ドロップ",
"START_AUDIO_RECORDING": "音声録音を開始",
"STOP_AUDIO_RECORDING": "音声録音を停止",
@@ -299,8 +316,13 @@
"NOT_ANSWERED_YET": "Not answered yet",
"HANDLED_IN_ANOTHER_TAB": "Being handled in another tab",
"REJECT_CALL": "Reject",
+ "DISMISS_CALL": "閉じる",
"JOIN_CALL": "Join call",
- "END_CALL": "End 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": {
diff --git a/app/javascript/dashboard/i18n/locale/ja/helpCenter.json b/app/javascript/dashboard/i18n/locale/ja/helpCenter.json
index 9f3cf0fc4..0ef035f64 100644
--- a/app/javascript/dashboard/i18n/locale/ja/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/ja/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "下書き",
"ARCHIVE": "アーカイブ",
"TRANSLATE": "翻訳",
+ "MOVE_TO_CATEGORY": "カテゴリ",
"DELETE": "削除",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "削除",
@@ -866,6 +869,28 @@
},
"EDIT_CONFIGURATION": "設定を編集"
},
+ "LAYOUT_CONTENT": {
+ "HEADER": "外観",
+ "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": "削除"
+ },
+ "SAVE": "変更を保存"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "ポータルが正常に作成されました",
diff --git a/app/javascript/dashboard/i18n/locale/ja/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ja/inboxMgmt.json
index 5ae18a793..34834bf90 100644
--- a/app/javascript/dashboard/i18n/locale/ja/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ja/inboxMgmt.json
@@ -308,6 +308,7 @@
"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!",
@@ -317,7 +318,8 @@
"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"
+ "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": "WhatsAppチャンネルを保存できませんでした"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "Support your customers on WhatsApp"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "Eメール",
"DESCRIPTION": "Connect with Gmail, Outlook, or other providers"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "ボット設定",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "顧客満足度",
- "VOICE": "Voice"
+ "VOICE": "Voice",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "プレチャットフォーム設定を更新する"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/ja/integrations.json b/app/javascript/dashboard/i18n/locale/ja/integrations.json
index 4074a8d5a..27a67a84b 100644
--- a/app/javascript/dashboard/i18n/locale/ja/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ja/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "連絡先が作成されました",
"CONTACT_UPDATED": "連絡先が更新されました",
"CONVERSATION_TYPING_ON": "Conversation Typing On",
- "CONVERSATION_TYPING_OFF": "Conversation Typing Off"
+ "CONVERSATION_TYPING_OFF": "Conversation Typing Off",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/ka/bulkActions.json b/app/javascript/dashboard/i18n/locale/ka/bulkActions.json
index 2472a9288..6b922bc7b 100644
--- a/app/javascript/dashboard/i18n/locale/ka/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/ka/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} conversations selected",
- "AGENT_SELECT_LABEL": "Select agent",
- "ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign {conversationCount} {conversationLabel} to",
- "UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Go back",
- "ASSIGN_LABEL": "Assign",
"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}?",
@@ -20,7 +15,6 @@
"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.",
- "AGENT_LIST_LOADING": "Loading agents",
"UPDATE": {
"CHANGE_STATUS": "Change status",
"SNOOZE_UNTIL": "Snooze",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assign labels",
- "NO_LABELS_FOUND": "No labels found",
+ "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."
+ "ASSIGN_FAILED": "Failed to assign labels. Please try again.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Select team",
"NONE": "None",
- "NO_TEAMS_AVAILABLE": "There are no teams added to this account yet.",
- "ASSIGN_SELECTED_TEAMS": "Assign selected team.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/ka/campaign.json b/app/javascript/dashboard/i18n/locale/ka/campaign.json
index 10366e79e..4977afe06 100644
--- a/app/javascript/dashboard/i18n/locale/ka/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/ka/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "მუშავდება",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "მუშავდება",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/ka/components.json b/app/javascript/dashboard/i18n/locale/ka/components.json
index a75d35b08..3ee865a89 100644
--- a/app/javascript/dashboard/i18n/locale/ka/components.json
+++ b/app/javascript/dashboard/i18n/locale/ka/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ka/contact.json b/app/javascript/dashboard/i18n/locale/ka/contact.json
index 0f1af9ccf..6658c299f 100644
--- a/app/javascript/dashboard/i18n/locale/ka/contact.json
+++ b/app/javascript/dashboard/i18n/locale/ka/contact.json
@@ -20,6 +20,8 @@
"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": "აირჩიეთ ხმოვანი საფოსტო ყუთი"
@@ -583,8 +585,11 @@
},
"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",
diff --git a/app/javascript/dashboard/i18n/locale/ka/conversation.json b/app/javascript/dashboard/i18n/locale/ka/conversation.json
index 6b699292e..fbb860750 100644
--- a/app/javascript/dashboard/i18n/locale/ka/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ka/conversation.json
@@ -62,6 +62,7 @@
"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",
@@ -79,13 +80,22 @@
"OUTGOING_CALL": "გამავალი ზარი",
"CALL_IN_PROGRESS": "ზარი მიმდინარეობს",
"NO_ANSWER": "პასუხი არ არის",
+ "NO_ANSWER_OUTBOUND_LABEL": "პასუხი არ არის",
+ "NO_ANSWER_OUTBOUND_SUBTEXT": "Contact didn't pick up",
"MISSED_CALL": "გამოტოვებული ზარი",
+ "MISSED_CALL_INBOUND_SUBTEXT": "No agent picked up",
+ "MISSED_CALL_DECLINED_BY": "Declined by {agentName}",
"CALL_ENDED": "ზარი დასრულდა",
+ "HANDLED_BY": "Handled by {agentName}",
"NOT_ANSWERED_YET": "ჯერ არ უპასუხიათ",
+ "CALLING": "Calling…",
"THEY_ANSWERED": "მათ უპასუხეს",
"YOU_ANSWERED": "თქვენ უპასუხეთ",
"AGENT_ANSWERED": "{agentName} answered",
- "JOIN_CALL": "Join call"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Resolve",
@@ -100,6 +110,12 @@
"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}",
@@ -215,6 +231,7 @@
"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",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
@@ -299,8 +316,13 @@
"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"
+ "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": {
diff --git a/app/javascript/dashboard/i18n/locale/ka/helpCenter.json b/app/javascript/dashboard/i18n/locale/ka/helpCenter.json
index c4797cdca..6b885b115 100644
--- a/app/javascript/dashboard/i18n/locale/ka/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/ka/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "სავარაუდო",
"ARCHIVE": "არქივი",
"TRANSLATE": "Translate",
+ "MOVE_TO_CATEGORY": "Category",
"DELETE": "Delete",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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",
@@ -866,6 +869,28 @@
},
"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": "წაშლა"
+ },
+ "SAVE": "ცვლილებების შენახვა"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "პორტალი წარმატებით შეიქმნა",
diff --git a/app/javascript/dashboard/i18n/locale/ka/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ka/inboxMgmt.json
index 00458729b..2aa0ad39e 100644
--- a/app/javascript/dashboard/i18n/locale/ka/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ka/inboxMgmt.json
@@ -308,6 +308,7 @@
"AUTH_PROCESSING": "ავტორიზაცია Meta-სთან",
"WAITING_FOR_BUSINESS_INFO": "გთხოვთ დაასრულოთ ბიზნესის დაყენება Meta ფანჯარაში...",
"PROCESSING": "თქვენი WhatsApp Business ანგარიშის დაყენება",
+ "ENABLING_CALLING": "Enabling WhatsApp Calling on your number…",
"LOADING_SDK": "Facebook SDK-ის ჩატვირთვა...",
"CANCELLED": "WhatsApp რეგისტრაცია გაუქმდა",
"SUCCESS_TITLE": "WhatsApp ბიზნეს ანგარიში დაკავშირებულია!",
@@ -317,7 +318,8 @@
"AUTH_NOT_COMPLETED": "ავტორიზაცია არ დასრულებულა. გთხოვთ, დაიწყეთ პროცესი თავიდან.",
"SUCCESS_FALLBACK": "WhatsApp Business ანგარიში წარმატებით კონფიგურირებულია",
"MANUAL_FALLBACK": "თუ თქვენი ნომერი უკვე დაკავშირებულია WhatsApp Business Platform (API)-სთან, ან თუ თქვენ ტექნიკური მიმწოდებელი ხართ და საკუთარ ნომერს ამატებთ, გთხოვთ გამოიყენოთ {link} პროცესი",
- "MANUAL_LINK_TEXT": "მანუალური დაყენების პროცესი"
+ "MANUAL_LINK_TEXT": "მანუალური დაყენების პროცესი",
+ "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": "ვერ შევძელით WhatsApp არხის შენახვა"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "მხარდაჭერა თქვენი მომხმარებლებისთვის WhatsApp-ზე"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "Email",
"DESCRIPTION": "დაკავშირება Gmail, Outlook ან სხვა მიმწოდებლებთან"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "ბოტის კონფიგურაცია",
"ACCOUNT_HEALTH": "ანგარიშის ჯანმრთელობა",
"CSAT": "CSAT",
- "VOICE": "ხმოვანი"
+ "VOICE": "ხმოვანი",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "არხის პარამეტრები",
"WIDGET_FEATURES": "ვიჯეტის ფუნქციები",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"WHATSAPP_TEMPLATES_SYNC_SUBHEADER": "ხელით სინქრონიზაცია WhatsApp-ისგან, რათა განაახლოთ ხელმისაწვდომი შაბლონები.",
"WHATSAPP_TEMPLATES_SYNC_BUTTON": "შაბლონების სინქრონიზაცია",
"WHATSAPP_TEMPLATES_SYNC_SUCCESS": "შაბლონების სინქრონიზაცია წარმატებით დაიწყო. განახლება შეიძლება რამდენიმე წუთი გაგრძელდეს.",
+ "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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "განაახლეთ წინასწარი ჩატის ფორმის პარამეტრები"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/ka/integrations.json b/app/javascript/dashboard/i18n/locale/ka/integrations.json
index 74b2cdd83..78471d977 100644
--- a/app/javascript/dashboard/i18n/locale/ka/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ka/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "კონტაქტი შექმნილია",
"CONTACT_UPDATED": "კონტაქტი განახლებულია",
"CONVERSATION_TYPING_ON": "ჩეთის აკრეფის ჩართვა",
- "CONVERSATION_TYPING_OFF": "ჩეთის აკრეფის გამორთვა"
+ "CONVERSATION_TYPING_OFF": "ჩეთის აკრეფის გამორთვა",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/ko/bulkActions.json b/app/javascript/dashboard/i18n/locale/ko/bulkActions.json
index b72c87b86..84f61e22d 100644
--- a/app/javascript/dashboard/i18n/locale/ko/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/ko/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount}개의 대화가 선택되었습니다",
- "AGENT_SELECT_LABEL": "에이전트 선택",
- "ASSIGN_CONFIRMATION_LABEL": "{conversationCount}개의 {conversationLabel}을(를) 배정하시겠습니까?",
- "UNASSIGN_CONFIRMATION_LABEL": "{conversationCount}개의 {conversationLabel} 배정을 해제하시겠습니까?",
- "GO_BACK_LABEL": "뒤로 가기",
- "ASSIGN_LABEL": "배정",
"NONE": "없음",
"CLEAR_SELECTION": "초기화",
"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}?",
@@ -20,7 +15,6 @@
"RESOLVE_SUCCESFUL": "대화가 성공적으로 해결되었습니다.",
"RESOLVE_FAILED": "대화 해결에 실패했습니다. 다시 시도하십시오.",
"ALL_CONVERSATIONS_SELECTED_ALERT": "이 페이지에 표시된 대화만 선택되었습니다.",
- "AGENT_LIST_LOADING": "에이전트 로딩 중",
"UPDATE": {
"CHANGE_STATUS": "상태 변경",
"SNOOZE_UNTIL": "일시 중지",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "라벨 배정",
- "NO_LABELS_FOUND": "라벨을 찾을 수 없습니다",
+ "REMOVE_LABELS": "Remove labels",
"ASSIGN_SELECTED_LABELS": "선택한 라벨 배정",
+ "REMOVE_SELECTED_LABELS": "Remove selected labels",
"ASSIGN_SUCCESFUL": "라벨이 성공적으로 배정되었습니다.",
- "ASSIGN_FAILED": "라벨 배정에 실패했습니다. 다시 시도하십시오."
+ "ASSIGN_FAILED": "라벨 배정에 실패했습니다. 다시 시도하십시오.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "팀 선택",
"NONE": "없음",
- "NO_TEAMS_AVAILABLE": "이 계정에 추가된 팀이 없습니다.",
- "ASSIGN_SELECTED_TEAMS": "선택한 팀 배정",
"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": "팀이 성공적으로 배정되었습니다.",
diff --git a/app/javascript/dashboard/i18n/locale/ko/campaign.json b/app/javascript/dashboard/i18n/locale/ko/campaign.json
index f6680d01a..5ab9ebf83 100644
--- a/app/javascript/dashboard/i18n/locale/ko/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/ko/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "처리 중",
"COMPLETED": "완료됨",
"SCHEDULED": "예약됨"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "처리 중",
"COMPLETED": "완료됨",
"SCHEDULED": "예약됨"
},
diff --git a/app/javascript/dashboard/i18n/locale/ko/components.json b/app/javascript/dashboard/i18n/locale/ko/components.json
index d25d205fd..ebe221409 100644
--- a/app/javascript/dashboard/i18n/locale/ko/components.json
+++ b/app/javascript/dashboard/i18n/locale/ko/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ko/contact.json b/app/javascript/dashboard/i18n/locale/ko/contact.json
index d4a9c8c27..aee9df6c3 100644
--- a/app/javascript/dashboard/i18n/locale/ko/contact.json
+++ b/app/javascript/dashboard/i18n/locale/ko/contact.json
@@ -20,6 +20,8 @@
"CALL": "통화",
"CALL_INITIATED": "연락처에 전화 거는 중...",
"CALL_FAILED": "통화를 시작할 수 없습니다. 다시 시도하십시오.",
+ "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": "음성 받은 메시지함 선택"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "라벨 배정",
+ "REMOVE_LABELS": "Remove Labels",
"ASSIGN_LABELS_SUCCESS": "라벨이 성공적으로 배정되었습니다.",
"ASSIGN_LABELS_FAILED": "라벨 배정에 실패했습니다",
+ "REMOVE_LABELS_SUCCESS": "Labels removed successfully.",
+ "REMOVE_LABELS_FAILED": "Failed to remove labels",
"DESCRIPTION": "선택한 연락처에 추가할 라벨을 선택하십시오.",
"NO_LABELS_FOUND": "사용 가능한 라벨이 없습니다.",
"SELECTED_COUNT": "{count}개 선택됨",
diff --git a/app/javascript/dashboard/i18n/locale/ko/conversation.json b/app/javascript/dashboard/i18n/locale/ko/conversation.json
index 00ec0ed52..3f61ebf6c 100644
--- a/app/javascript/dashboard/i18n/locale/ko/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ko/conversation.json
@@ -62,6 +62,7 @@
"UNSUPPORTED_MESSAGE_FACEBOOK": "이 메시지는 지원되지 않습니다. Facebook Messenger 앱에서 이 메시지를 확인할 수 있습니다.",
"UNSUPPORTED_MESSAGE_INSTAGRAM": "이 메시지는 지원되지 않습니다. Instagram 앱에서 이 메시지를 확인할 수 있습니다.",
"UNSUPPORTED_MESSAGE_TIKTOK": "이 메시지는 지원되지 않습니다. TikTok 앱에서 이 메시지를 확인할 수 있습니다.",
+ "UNSUPPORTED_MESSAGE_WHATSAPP": "This message is unsupported. You can view this message on the WhatsApp app.",
"SUCCESS_DELETE_MESSAGE": "메시지가 성공적으로 삭제되었습니다",
"FAIL_DELETE_MESSSAGE": "메시지를 삭제할 수 없습니다! 다시 시도해 주십시오.",
"NO_RESPONSE": "응답 없음",
@@ -79,13 +80,22 @@
"OUTGOING_CALL": "발신 전화",
"CALL_IN_PROGRESS": "통화 중",
"NO_ANSWER": "응답 없음",
+ "NO_ANSWER_OUTBOUND_LABEL": "응답 없음",
+ "NO_ANSWER_OUTBOUND_SUBTEXT": "Contact didn't pick up",
"MISSED_CALL": "부재중 전화",
+ "MISSED_CALL_INBOUND_SUBTEXT": "No agent picked up",
+ "MISSED_CALL_DECLINED_BY": "Declined by {agentName}",
"CALL_ENDED": "통화 종료",
+ "HANDLED_BY": "Handled by {agentName}",
"NOT_ANSWERED_YET": "아직 응답하지 않았습니다",
+ "CALLING": "Calling…",
"THEY_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": "해결함",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "내일까지 일시 중지",
"SNOOZED_UNTIL_NEXT_WEEK": "다음 주까지 일시 중지",
"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}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "오디오 녹음",
"TIP_AUDIORECORDER_PERMISSION": "오디오 접근 허용",
"TIP_AUDIORECORDER_ERROR": "오디오를 열 수 없습니다",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "여기에 드래그 앤 드롭하여 첨부하십시오",
"START_AUDIO_RECORDING": "오디오 녹음 시작",
"STOP_AUDIO_RECORDING": "오디오 녹음 중지",
@@ -299,8 +316,13 @@
"NOT_ANSWERED_YET": "아직 응답하지 않았습니다",
"HANDLED_IN_ANOTHER_TAB": "다른 탭에서 처리 중입니다",
"REJECT_CALL": "거부",
+ "DISMISS_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": {
diff --git a/app/javascript/dashboard/i18n/locale/ko/helpCenter.json b/app/javascript/dashboard/i18n/locale/ko/helpCenter.json
index 99b7ce3a2..3e2499f48 100644
--- a/app/javascript/dashboard/i18n/locale/ko/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/ko/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "임시 저장",
"ARCHIVE": "보관",
"TRANSLATE": "번역",
+ "MOVE_TO_CATEGORY": "카테고리",
"DELETE": "삭제",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "삭제",
@@ -866,6 +869,28 @@
},
"EDIT_CONFIGURATION": "설정 수정"
},
+ "LAYOUT_CONTENT": {
+ "HEADER": "외관",
+ "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": "제거"
+ },
+ "SAVE": "변경사항 저장"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "포털이 성공적으로 생성되었습니다",
diff --git a/app/javascript/dashboard/i18n/locale/ko/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ko/inboxMgmt.json
index f0e5d3b7a..798ec0cc2 100644
--- a/app/javascript/dashboard/i18n/locale/ko/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ko/inboxMgmt.json
@@ -308,6 +308,7 @@
"AUTH_PROCESSING": "Meta로 인증 중",
"WAITING_FOR_BUSINESS_INFO": "Meta 창에서 비즈니스 설정을 완료하십시오...",
"PROCESSING": "WhatsApp Business 계정을 설정하는 중",
+ "ENABLING_CALLING": "Enabling WhatsApp Calling on your number…",
"LOADING_SDK": "Facebook SDK를 로드하는 중...",
"CANCELLED": "WhatsApp 가입이 취소되었습니다",
"SUCCESS_TITLE": "WhatsApp Business 계정이 연결되었습니다!",
@@ -317,7 +318,8 @@
"AUTH_NOT_COMPLETED": "인증이 완료되지 않았습니다. 프로세스를 다시 시작하십시오.",
"SUCCESS_FALLBACK": "WhatsApp Business 계정이 성공적으로 구성되었습니다",
"MANUAL_FALLBACK": "번호가 이미 WhatsApp Business Platform (API)에 연결되어 있거나, 자체 번호를 온보딩하는 기술 공급자인 경우 {link}을 사용하십시오",
- "MANUAL_LINK_TEXT": "수동 설정 플로우"
+ "MANUAL_LINK_TEXT": "수동 설정 플로우",
+ "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": "WhatsApp 채널을 저장할 수 없습니다."
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "WhatsApp으로 고객 지원"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "이메일",
"DESCRIPTION": "Gmail, Outlook 또는 기타 공급자와 연결"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "봇 구성",
"ACCOUNT_HEALTH": "계정 상태",
"CSAT": "CSAT",
- "VOICE": "음성"
+ "VOICE": "음성",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "채널 환경설정",
"WIDGET_FEATURES": "위젯 기능",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"WHATSAPP_TEMPLATES_SYNC_SUBHEADER": "WhatsApp에서 메시지 템플릿을 수동으로 동기화하여 사용 가능한 템플릿을 업데이트하십시오.",
"WHATSAPP_TEMPLATES_SYNC_BUTTON": "템플릿 동기화",
"WHATSAPP_TEMPLATES_SYNC_SUCCESS": "템플릿 동기화가 성공적으로 시작되었습니다. 업데이트되기까지 몇 분 정도 걸릴 수 있습니다.",
+ "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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "대화 전 설문 설정 업데이트"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/ko/integrations.json b/app/javascript/dashboard/i18n/locale/ko/integrations.json
index 3bbbe0c01..03cae815a 100644
--- a/app/javascript/dashboard/i18n/locale/ko/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ko/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "연락처 생성됨",
"CONTACT_UPDATED": "연락처 업데이트됨",
"CONVERSATION_TYPING_ON": "대화 입력 중",
- "CONVERSATION_TYPING_OFF": "대화 입력 중지"
+ "CONVERSATION_TYPING_OFF": "대화 입력 중지",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/lt/bulkActions.json b/app/javascript/dashboard/i18n/locale/lt/bulkActions.json
index 058de8470..f901d9b4e 100644
--- a/app/javascript/dashboard/i18n/locale/lt/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/lt/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "Pasirinkta pokalbių: {conversationCount}",
- "AGENT_SELECT_LABEL": "Pasirinkti agentą",
- "ASSIGN_CONFIRMATION_LABEL": "Ar tikrai priskirsite {conversationCount} {conversationLabel}",
- "UNASSIGN_CONFIRMATION_LABEL": "Ar tikrai atšauksite priskyrimą {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Grįžti",
- "ASSIGN_LABEL": "Priskirti",
"NONE": "Nėra",
"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}?",
@@ -20,7 +15,6 @@
"RESOLVE_SUCCESFUL": "Pokalbio išspręstas sėkmingai.",
"RESOLVE_FAILED": "Nepavyko išspręsti pokalbių. Bandykite dar kartą.",
"ALL_CONVERSATIONS_SELECTED_ALERT": "Pasirinkti šiame puslapyje matomi pokalbiai.",
- "AGENT_LIST_LOADING": "Agentai užkraunami",
"UPDATE": {
"CHANGE_STATUS": "Pakeisti būseną",
"SNOOZE_UNTIL": "Atidėti",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Priskirti etiketes",
- "NO_LABELS_FOUND": "Etikečių nerasta",
+ "REMOVE_LABELS": "Remove labels",
"ASSIGN_SELECTED_LABELS": "Priskirti pažymėtas etiketes",
+ "REMOVE_SELECTED_LABELS": "Remove selected labels",
"ASSIGN_SUCCESFUL": "Etiketės sėkmingai priskirtos.",
- "ASSIGN_FAILED": "Nepavyko priskirti etikečių. Prašau, pabandykite dar kartą."
+ "ASSIGN_FAILED": "Nepavyko priskirti etikečių. Prašau, pabandykite dar kartą.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Pasirinkite komandą",
"NONE": "Nėra",
- "NO_TEAMS_AVAILABLE": "Šioje paskyroje nėra pridėtų komandų.",
- "ASSIGN_SELECTED_TEAMS": "Priskirti pažymėtą komandą.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/lt/campaign.json b/app/javascript/dashboard/i18n/locale/lt/campaign.json
index 5df017718..b0d0158ea 100644
--- a/app/javascript/dashboard/i18n/locale/lt/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/lt/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Užbaigta",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Užbaigta",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/lt/components.json b/app/javascript/dashboard/i18n/locale/lt/components.json
index 9fbe67cba..ee0f021e6 100644
--- a/app/javascript/dashboard/i18n/locale/lt/components.json
+++ b/app/javascript/dashboard/i18n/locale/lt/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/lt/contact.json b/app/javascript/dashboard/i18n/locale/lt/contact.json
index 79c593828..0e1d8b2b9 100644
--- a/app/javascript/dashboard/i18n/locale/lt/contact.json
+++ b/app/javascript/dashboard/i18n/locale/lt/contact.json
@@ -20,6 +20,8 @@
"CALL": "Call",
"CALL_INITIATED": "Skambinama kontaktui...",
"CALL_FAILED": "Nepavyko pradėti skambučio. Bandykite dar kartą.",
+ "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"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "Priskirti etiketes",
+ "REMOVE_LABELS": "Remove Labels",
"ASSIGN_LABELS_SUCCESS": "Etiketės sėkmingai priskirtos.",
"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",
diff --git a/app/javascript/dashboard/i18n/locale/lt/conversation.json b/app/javascript/dashboard/i18n/locale/lt/conversation.json
index 515597bd4..8ad1059c1 100644
--- a/app/javascript/dashboard/i18n/locale/lt/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/lt/conversation.json
@@ -62,6 +62,7 @@
"UNSUPPORTED_MESSAGE_FACEBOOK": "Ši žinutė nepalaikoma. Jūs galite peržiūrėti šią žinutę Facebook Messenger programėlėje.",
"UNSUPPORTED_MESSAGE_INSTAGRAM": "Ši žinutė nepalaikoma. Jūs galite peržiūrėti šią žinutę Instagram programėlėje.",
"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": "Pranešimas ištrintas sėkmingai",
"FAIL_DELETE_MESSSAGE": "Nepavyko ištrinti pranešimo! Bandykite dar kartą",
"NO_RESPONSE": "Nėra atsakymo",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Išspręsti",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "Atidėta iki rytojaus",
"SNOOZED_UNTIL_NEXT_WEEK": "Atidėta iki kitos savaitės",
"SNOOZED_UNTIL_NEXT_REPLY": "Atidėta iki kito atsakymo",
+ "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}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "Įrašyti audio",
"TIP_AUDIORECORDER_PERMISSION": "Leisti prieiti prie audio",
"TIP_AUDIORECORDER_ERROR": "Nepavyko atidaryti audio",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "Norėdami pridėti, vilkite ir numeskite čia",
"START_AUDIO_RECORDING": "Pradėti audio įrašymą",
"STOP_AUDIO_RECORDING": "Baigti audio įrašymą",
@@ -299,8 +316,13 @@
"NOT_ANSWERED_YET": "Not answered yet",
"HANDLED_IN_ANOTHER_TAB": "Being handled in another tab",
"REJECT_CALL": "Reject",
+ "DISMISS_CALL": "Atsisakyti",
"JOIN_CALL": "Join call",
- "END_CALL": "End 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": {
diff --git a/app/javascript/dashboard/i18n/locale/lt/helpCenter.json b/app/javascript/dashboard/i18n/locale/lt/helpCenter.json
index f777a14e5..8c3cadefd 100644
--- a/app/javascript/dashboard/i18n/locale/lt/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/lt/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Ruošinys",
"ARCHIVE": "Archive",
"TRANSLATE": "Išversti",
+ "MOVE_TO_CATEGORY": "Kategorija",
"DELETE": "Ištrinti",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "Ištrinti",
@@ -866,6 +869,28 @@
},
"EDIT_CONFIGURATION": "Edit configuration"
},
+ "LAYOUT_CONTENT": {
+ "HEADER": "Išvaizda",
+ "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": "Pašalinti"
+ },
+ "SAVE": "Save changes"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Portalas sukurtas sėkmingai",
diff --git a/app/javascript/dashboard/i18n/locale/lt/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/lt/inboxMgmt.json
index 80bacc325..a43cd2152 100644
--- a/app/javascript/dashboard/i18n/locale/lt/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/lt/inboxMgmt.json
@@ -308,6 +308,7 @@
"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!",
@@ -317,7 +318,8 @@
"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"
+ "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": "Mes negalėjome išsaugoti WhatsApp kanalo"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "Support your customers on WhatsApp"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "El. paštas",
"DESCRIPTION": "Connect with Gmail, Outlook, or other providers"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Boto konfiguracija",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT",
- "VOICE": "Voice"
+ "VOICE": "Voice",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Atnaujinkite išankstinio pokalbio internetu formos nustatymus"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/lt/integrations.json b/app/javascript/dashboard/i18n/locale/lt/integrations.json
index ee9bd0a1b..96e53d997 100644
--- a/app/javascript/dashboard/i18n/locale/lt/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/lt/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Sukurtas kontaktas",
"CONTACT_UPDATED": "Kontaktas atnaujintas",
"CONVERSATION_TYPING_ON": "Conversation Typing On",
- "CONVERSATION_TYPING_OFF": "Conversation Typing Off"
+ "CONVERSATION_TYPING_OFF": "Conversation Typing Off",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/lv/bulkActions.json b/app/javascript/dashboard/i18n/locale/lv/bulkActions.json
index 792648295..536d79877 100644
--- a/app/javascript/dashboard/i18n/locale/lv/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/lv/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "Izvēlētas {conversationCount} sarunas",
- "AGENT_SELECT_LABEL": "Izvēlieties aģentu",
- "ASSIGN_CONFIRMATION_LABEL": "Vai patiešām vēlaties piesaistīt {conversationCount} {conversationLabel} pie",
- "UNASSIGN_CONFIRMATION_LABEL": "Vai patiešām vēlaties atsaistīt {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Atgriezties",
- "ASSIGN_LABEL": "Piešķirt",
"NONE": "Nav",
"CLEAR_SELECTION": "Notīrīt",
"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}?",
@@ -20,7 +15,6 @@
"RESOLVE_SUCCESFUL": "Sarunas ir veiksmīgi atrisinātas.",
"RESOLVE_FAILED": "Neizdevās atrisināt sarunas. Lūdzu mēģiniet vēlreiz.",
"ALL_CONVERSATIONS_SELECTED_ALERT": "Šajā lapā redzamās sarunas ir tikai izvēlētas.",
- "AGENT_LIST_LOADING": "Notiek aģentu ielāde",
"UPDATE": {
"CHANGE_STATUS": "Mainīt statusu",
"SNOOZE_UNTIL": "Atlikt",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Piešķirt etiķetes",
- "NO_LABELS_FOUND": "Etiķetes nav atrastas",
+ "REMOVE_LABELS": "Remove labels",
"ASSIGN_SELECTED_LABELS": "Piešķirt izvēlētās etiķetes",
+ "REMOVE_SELECTED_LABELS": "Remove selected labels",
"ASSIGN_SUCCESFUL": "Etiķetes ir veiksmīgi piešķirtas.",
- "ASSIGN_FAILED": "Neizdevās piešķirt etiķetes. Lūdzu mēģiniet vēlreiz."
+ "ASSIGN_FAILED": "Neizdevās piešķirt etiķetes. Lūdzu mēģiniet vēlreiz.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Izvēlieties komandu",
"NONE": "Nav",
- "NO_TEAMS_AVAILABLE": "Šim kontam vēl nav pievienota neviena komanda.",
- "ASSIGN_SELECTED_TEAMS": "Piešķirt izvēlēto komandu.",
"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": "Komandas ir veiksmīgi piešķirtas.",
diff --git a/app/javascript/dashboard/i18n/locale/lv/campaign.json b/app/javascript/dashboard/i18n/locale/lv/campaign.json
index ed0189250..e9cf6309b 100644
--- a/app/javascript/dashboard/i18n/locale/lv/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/lv/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Pabeigts",
"SCHEDULED": "Plānots"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Pabeigts",
"SCHEDULED": "Plānots"
},
diff --git a/app/javascript/dashboard/i18n/locale/lv/components.json b/app/javascript/dashboard/i18n/locale/lv/components.json
index 869838135..df6244948 100644
--- a/app/javascript/dashboard/i18n/locale/lv/components.json
+++ b/app/javascript/dashboard/i18n/locale/lv/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/lv/contact.json b/app/javascript/dashboard/i18n/locale/lv/contact.json
index 4c9e37cfe..07ff92143 100644
--- a/app/javascript/dashboard/i18n/locale/lv/contact.json
+++ b/app/javascript/dashboard/i18n/locale/lv/contact.json
@@ -20,6 +20,8 @@
"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"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "Piešķirt Etiķetes",
+ "REMOVE_LABELS": "Remove Labels",
"ASSIGN_LABELS_SUCCESS": "Etiķetes ir veiksmīgi piešķirtas.",
"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": "Atlasīti {count}",
diff --git a/app/javascript/dashboard/i18n/locale/lv/conversation.json b/app/javascript/dashboard/i18n/locale/lv/conversation.json
index 3998f71ac..8d1e4ed8e 100644
--- a/app/javascript/dashboard/i18n/locale/lv/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/lv/conversation.json
@@ -62,6 +62,7 @@
"UNSUPPORTED_MESSAGE_FACEBOOK": "Šis ziņojums netiek atbalstīts. Šo ziņojumu Jūs varat apskatīt lietotnē Facebook Messenger.",
"UNSUPPORTED_MESSAGE_INSTAGRAM": "Šis ziņojums netiek atbalstīts. Šo ziņojumu Jūs varat apskatīt lietotnē Instagram.",
"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": "Ziņojums veiksmīgi izdzēsts",
"FAIL_DELETE_MESSSAGE": "Nevarēja izdzēst ziņojumu! Mēģiniet vēlreiz",
"NO_RESPONSE": "Nav atbildes",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Atrisināt",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "Atlikts līdz rītdienai",
"SNOOZED_UNTIL_NEXT_WEEK": "Atlikts līdz nākamajai nedēļai",
"SNOOZED_UNTIL_NEXT_REPLY": "Atlikts līdz nākamajai atbildei",
+ "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}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "Ierakstīt audio",
"TIP_AUDIORECORDER_PERMISSION": "Atļaut piekļuvi pie audio",
"TIP_AUDIORECORDER_ERROR": "Nevarēja atvērt audio",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "Velciet un nometiet šeit, lai pievienotu",
"START_AUDIO_RECORDING": "Sākt audio ierakstīšanu",
"STOP_AUDIO_RECORDING": "Apturēt audio ierakstīšanu",
@@ -299,8 +316,13 @@
"NOT_ANSWERED_YET": "Not answered yet",
"HANDLED_IN_ANOTHER_TAB": "Being handled in another tab",
"REJECT_CALL": "Reject",
+ "DISMISS_CALL": "Atcelt",
"JOIN_CALL": "Join call",
- "END_CALL": "End 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": {
diff --git a/app/javascript/dashboard/i18n/locale/lv/helpCenter.json b/app/javascript/dashboard/i18n/locale/lv/helpCenter.json
index 97d06ab92..818994fd0 100644
--- a/app/javascript/dashboard/i18n/locale/lv/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/lv/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Melnraksts",
"ARCHIVE": "Arhīvs",
"TRANSLATE": "Tulkot",
+ "MOVE_TO_CATEGORY": "Kategorija",
"DELETE": "Dzēst",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "Dzēst",
@@ -866,6 +869,28 @@
},
"EDIT_CONFIGURATION": "Rediģēt konfigurāciju"
},
+ "LAYOUT_CONTENT": {
+ "HEADER": "Izskats",
+ "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": "Noņemt"
+ },
+ "SAVE": "Saglabāt izmaiņas"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Portāls ir veiksmīgi izveidots",
diff --git a/app/javascript/dashboard/i18n/locale/lv/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/lv/inboxMgmt.json
index b3a5807e9..5eaa00103 100644
--- a/app/javascript/dashboard/i18n/locale/lv/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/lv/inboxMgmt.json
@@ -308,6 +308,7 @@
"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!",
@@ -317,7 +318,8 @@
"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"
+ "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": "Mēs nevarējām saglabāt WhatsApp kanālu"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "Support your customers on WhatsApp"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "E-pasts",
"DESCRIPTION": "Connect with Gmail, Outlook, or other providers"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Robota Konfigurācija",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT",
- "VOICE": "Voice"
+ "VOICE": "Voice",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Atjaunināt pirms-tērzēšanas veidlapas iestatījumus"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/lv/integrations.json b/app/javascript/dashboard/i18n/locale/lv/integrations.json
index 64676ee3c..0ea682111 100644
--- a/app/javascript/dashboard/i18n/locale/lv/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/lv/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Kontaktpersona izveidota",
"CONTACT_UPDATED": "Kontaktpersona atjaunināta",
"CONVERSATION_TYPING_ON": "Conversation Typing On",
- "CONVERSATION_TYPING_OFF": "Conversation Typing Off"
+ "CONVERSATION_TYPING_OFF": "Conversation Typing Off",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/ml/bulkActions.json b/app/javascript/dashboard/i18n/locale/ml/bulkActions.json
index 5dad22415..47c6c7a73 100644
--- a/app/javascript/dashboard/i18n/locale/ml/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/ml/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} conversations selected",
- "AGENT_SELECT_LABEL": "ഏജന്റിനെ തിരഞ്ഞെടുക്കുക",
- "ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign {conversationCount} {conversationLabel} to",
- "UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Go back",
- "ASSIGN_LABEL": "നിയോഗിക്കുക",
"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}?",
@@ -20,7 +15,6 @@
"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.",
- "AGENT_LIST_LOADING": "Loading agents",
"UPDATE": {
"CHANGE_STATUS": "Change status",
"SNOOZE_UNTIL": "Snooze",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assign labels",
- "NO_LABELS_FOUND": "ലേബലുകളൊന്നും കണ്ടെത്തിയില്ല",
+ "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."
+ "ASSIGN_FAILED": "Failed to assign labels. Please try again.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "ടീം തിരഞ്ഞെടുക്കുക",
"NONE": "ഒന്നുമില്ല",
- "NO_TEAMS_AVAILABLE": "There are no teams added to this account yet.",
- "ASSIGN_SELECTED_TEAMS": "Assign selected team.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/ml/campaign.json b/app/javascript/dashboard/i18n/locale/ml/campaign.json
index 492ce80ff..d2cec0e86 100644
--- a/app/javascript/dashboard/i18n/locale/ml/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/ml/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "പൂർത്തിയാക്കി",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "പൂർത്തിയാക്കി",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/ml/components.json b/app/javascript/dashboard/i18n/locale/ml/components.json
index 262dec2fe..54177eb35 100644
--- a/app/javascript/dashboard/i18n/locale/ml/components.json
+++ b/app/javascript/dashboard/i18n/locale/ml/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ml/contact.json b/app/javascript/dashboard/i18n/locale/ml/contact.json
index 9240a4cdc..54cd3b7ad 100644
--- a/app/javascript/dashboard/i18n/locale/ml/contact.json
+++ b/app/javascript/dashboard/i18n/locale/ml/contact.json
@@ -20,6 +20,8 @@
"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"
@@ -583,8 +585,11 @@
},
"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",
diff --git a/app/javascript/dashboard/i18n/locale/ml/conversation.json b/app/javascript/dashboard/i18n/locale/ml/conversation.json
index 89b65cd53..d4cd56854 100644
--- a/app/javascript/dashboard/i18n/locale/ml/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ml/conversation.json
@@ -62,6 +62,7 @@
"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",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "പരിഹരിക്കുക",
@@ -100,6 +110,12 @@
"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}",
@@ -215,6 +231,7 @@
"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",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
@@ -299,8 +316,13 @@
"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"
+ "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": {
diff --git a/app/javascript/dashboard/i18n/locale/ml/helpCenter.json b/app/javascript/dashboard/i18n/locale/ml/helpCenter.json
index 2ad6fdb6e..b4594ce6b 100644
--- a/app/javascript/dashboard/i18n/locale/ml/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/ml/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Draft",
"ARCHIVE": "Archive",
"TRANSLATE": "Translate",
+ "MOVE_TO_CATEGORY": "Category",
"DELETE": "ഇല്ലാതാക്കുക",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "ഇല്ലാതാക്കുക",
@@ -866,6 +869,28 @@
},
"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": "നീക്കം ചെയ്യുക"
+ },
+ "SAVE": "Save changes"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Portal created successfully",
diff --git a/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json
index c483970eb..3869e919e 100644
--- a/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json
@@ -308,6 +308,7 @@
"AUTH_PROCESSING": "Meta-യുമായി പ്രാമാണീകരിക്കുന്നു",
"WAITING_FOR_BUSINESS_INFO": "ദയവായി Meta വിൻഡോയിൽ ബിസിനസ് ക്രമീകരണം പൂർത്തിയാക്കുക...",
"PROCESSING": "നിങ്ങളുടെ WhatsApp ബിസിനസ് അക്കൗണ്ട് ക്രമീകരിക്കുന്നു",
+ "ENABLING_CALLING": "Enabling WhatsApp Calling on your number…",
"LOADING_SDK": "Facebook SDK ലോഡിംഗ്...",
"CANCELLED": "WhatsApp സൈൻഅപ്പ് റദ്ദാക്കി",
"SUCCESS_TITLE": "WhatsApp ബിസിനസ് അക്കൗണ്ട് ബന്ധിപ്പിച്ചു!",
@@ -317,7 +318,8 @@
"AUTH_NOT_COMPLETED": "അധികാരപത്രം പൂർത്തിയാക്കിയിട്ടില്ല. ദയവായി പ്രക്രിയ വീണ്ടും ആരംഭിക്കുക.",
"SUCCESS_FALLBACK": "WhatsApp ബിസിനസ് അക്കൗണ്ട് വിജയകരമായി ക്രമീകരിച്ചു",
"MANUAL_FALLBACK": "നിങ്ങളുടെ നമ്പർ ഇതിനകം WhatsApp ബിസിനസ് പ്ലാറ്റ്ഫോം (API) യുമായി ബന്ധിപ്പിച്ചിട്ടുണ്ടെങ്കിൽ, അല്ലെങ്കിൽ നിങ്ങൾ ഒരു ടെക് പ്രൊവൈഡറായി നിങ്ങളുടെ സ്വന്തം നമ്പർ ഓൺബോർഡ് ചെയ്യുകയാണെങ്കിൽ, ദയവായി {link} ഫ്ലോ ഉപയോഗിക്കുക",
- "MANUAL_LINK_TEXT": "മാനുവൽ സെറ്റപ്പ് ഫ്ലോ"
+ "MANUAL_LINK_TEXT": "മാനുവൽ സെറ്റപ്പ് ഫ്ലോ",
+ "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": "ഞങ്ങൾ WhatsApp ചാനൽ സേവ് ചെയ്യാൻ കഴിഞ്ഞില്ല"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "WhatsApp-ൽ നിങ്ങളുടെ ഉപഭോക്താക്കളെ പിന്തുണയ്ക്കുക"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "ഇമെയിൽ",
"DESCRIPTION": "Gmail, Outlook, അല്ലെങ്കിൽ മറ്റ് പ്രൊവൈഡർമാരുമായി കണക്ട് ചെയ്യുക"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "ബോട്ട് ക്രമീകരണം",
"ACCOUNT_HEALTH": "അക്കൗണ്ട് ആരോഗ്യ നില",
"CSAT": "CSAT",
- "VOICE": "വോയ്സ്"
+ "VOICE": "വോയ്സ്",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "ചാനൽ മുൻഗണനകൾ",
"WIDGET_FEATURES": "വിഡ്ജറ്റ് സവിശേഷതകൾ",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"WHATSAPP_TEMPLATES_SYNC_SUBHEADER": "നിങ്ങളുടെ ലഭ്യമായ ടെംപ്ലേറ്റുകൾ അപ്ഡേറ്റ് ചെയ്യാൻ WhatsApp-ൽ നിന്ന് സന്ദേശ ടെംപ്ലേറ്റുകൾ മാനുവലായി സമന്വയിപ്പിക്കുക.",
"WHATSAPP_TEMPLATES_SYNC_BUTTON": "ടെംപ്ലേറ്റുകൾ സമന്വയിപ്പിക്കുക",
"WHATSAPP_TEMPLATES_SYNC_SUCCESS": "ടെംപ്ലേറ്റുകൾ സമന്വയം വിജയകരമായി ആരംഭിച്ചു. അപ്ഡേറ്റ് ചെയ്യാൻ കുറച്ച് മിനിറ്റുകൾ എടുക്കാം.",
+ "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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "പ്രീ ചാറ്റ് ഫോമിന്റെ ക്രമീകരണങ്ങൾ അപ്ഡേറ്റ് ചെയ്യുക"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/ml/integrations.json b/app/javascript/dashboard/i18n/locale/ml/integrations.json
index 711959a0f..f862e89ab 100644
--- a/app/javascript/dashboard/i18n/locale/ml/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ml/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "ബന്ധപ്പെടൽ സൃഷ്ടിച്ചു",
"CONTACT_UPDATED": "ബന്ധപ്പെടൽ അപ്ഡേറ്റ് ചെയ്തു",
"CONVERSATION_TYPING_ON": "സംഭാഷണം ടൈപ്പിംഗ് ഓൺ",
- "CONVERSATION_TYPING_OFF": "സംവാദം ടൈപ്പിംഗ് ഓഫ്"
+ "CONVERSATION_TYPING_OFF": "സംവാദം ടൈപ്പിംഗ് ഓഫ്",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/ms/bulkActions.json b/app/javascript/dashboard/i18n/locale/ms/bulkActions.json
index 95b313287..08f2c63ec 100644
--- a/app/javascript/dashboard/i18n/locale/ms/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/ms/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} conversations selected",
- "AGENT_SELECT_LABEL": "Pilih ejen",
- "ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign {conversationCount} {conversationLabel} to",
- "UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Go back",
- "ASSIGN_LABEL": "Assign",
"NONE": "Tiada",
"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}?",
@@ -20,7 +15,6 @@
"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.",
- "AGENT_LIST_LOADING": "Loading agents",
"UPDATE": {
"CHANGE_STATUS": "Change status",
"SNOOZE_UNTIL": "Snooze",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assign labels",
- "NO_LABELS_FOUND": "No labels found",
+ "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."
+ "ASSIGN_FAILED": "Failed to assign labels. Please try again.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Pilih pasukan",
"NONE": "Tiada",
- "NO_TEAMS_AVAILABLE": "There are no teams added to this account yet.",
- "ASSIGN_SELECTED_TEAMS": "Assign selected team.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/ms/campaign.json b/app/javascript/dashboard/i18n/locale/ms/campaign.json
index d73da4622..6e925ff36 100644
--- a/app/javascript/dashboard/i18n/locale/ms/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/ms/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Sedang Diproses",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Sedang Diproses",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/ms/components.json b/app/javascript/dashboard/i18n/locale/ms/components.json
index cae53a75c..815db3f80 100644
--- a/app/javascript/dashboard/i18n/locale/ms/components.json
+++ b/app/javascript/dashboard/i18n/locale/ms/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ms/contact.json b/app/javascript/dashboard/i18n/locale/ms/contact.json
index d004a6e3c..161429452 100644
--- a/app/javascript/dashboard/i18n/locale/ms/contact.json
+++ b/app/javascript/dashboard/i18n/locale/ms/contact.json
@@ -20,6 +20,8 @@
"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"
@@ -583,8 +585,11 @@
},
"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",
diff --git a/app/javascript/dashboard/i18n/locale/ms/conversation.json b/app/javascript/dashboard/i18n/locale/ms/conversation.json
index 052de0559..450f1d88c 100644
--- a/app/javascript/dashboard/i18n/locale/ms/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ms/conversation.json
@@ -62,6 +62,7 @@
"UNSUPPORTED_MESSAGE_FACEBOOK": "Mesej ini tidak disokong. Anda boleh melihat mesej ini di aplikasi Facebook Messenger.",
"UNSUPPORTED_MESSAGE_INSTAGRAM": "Mesej ini tidak disokong. Anda boleh melihat mesej ini di aplikasi Instagram.",
"UNSUPPORTED_MESSAGE_TIKTOK": "Mesej ini tidak disokong. Anda boleh melihat mesej ini di aplikasi TikTok.",
+ "UNSUPPORTED_MESSAGE_WHATSAPP": "This message is unsupported. You can view this message on the WhatsApp app.",
"SUCCESS_DELETE_MESSAGE": "Mesej berjaya dipadam",
"FAIL_DELETE_MESSSAGE": "Tidak dapat memadam mesej! Sila cuba lagi",
"NO_RESPONSE": "Tiada respons",
@@ -79,13 +80,22 @@
"OUTGOING_CALL": "Panggilan keluar",
"CALL_IN_PROGRESS": "Panggilan sedang berlangsung",
"NO_ANSWER": "Tiada jawapan",
+ "NO_ANSWER_OUTBOUND_LABEL": "Tiada jawapan",
+ "NO_ANSWER_OUTBOUND_SUBTEXT": "Contact didn't pick up",
"MISSED_CALL": "Panggilan terlepas",
+ "MISSED_CALL_INBOUND_SUBTEXT": "No agent picked up",
+ "MISSED_CALL_DECLINED_BY": "Declined by {agentName}",
"CALL_ENDED": "Panggilan tamat",
+ "HANDLED_BY": "Handled by {agentName}",
"NOT_ANSWERED_YET": "Belum dijawab",
+ "CALLING": "Calling…",
"THEY_ANSWERED": "Mereka menjawab",
"YOU_ANSWERED": "Anda menjawab",
"AGENT_ANSWERED": "{agentName} answered",
- "JOIN_CALL": "Sertai panggilan"
+ "JOIN_CALL": "Sertai panggilan",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Selesaikan",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "Ditangguhkan sehingga esok",
"SNOOZED_UNTIL_NEXT_WEEK": "Ditangguhkan sehingga minggu depan",
"SNOOZED_UNTIL_NEXT_REPLY": "Ditangguhkan sehingga balasan seterusnya",
+ "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}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "Rakam audio",
"TIP_AUDIORECORDER_PERMISSION": "Benarkan akses ke audio",
"TIP_AUDIORECORDER_ERROR": "Tidak dapat membuka audio",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "Seret dan lepaskan di sini untuk melampirkan",
"START_AUDIO_RECORDING": "Mula rakaman audio",
"STOP_AUDIO_RECORDING": "Hentikan rakaman audio",
@@ -299,8 +316,13 @@
"NOT_ANSWERED_YET": "Belum dijawab",
"HANDLED_IN_ANOTHER_TAB": "Sedang diuruskan di tab lain",
"REJECT_CALL": "Tolak",
+ "DISMISS_CALL": "Dismiss",
"JOIN_CALL": "Sertai panggilan",
- "END_CALL": "Tamatkan panggilan"
+ "END_CALL": "Tamatkan panggilan",
+ "MUTE": "Mute mic",
+ "UNMUTE": "Unmute mic",
+ "VIEW_CHAT_HISTORY": "View chat history",
+ "GO_TO_CONVERSATION": "Go to conversation thread"
}
},
"EMAIL_TRANSCRIPT": {
diff --git a/app/javascript/dashboard/i18n/locale/ms/helpCenter.json b/app/javascript/dashboard/i18n/locale/ms/helpCenter.json
index 13e893119..4b1da6590 100644
--- a/app/javascript/dashboard/i18n/locale/ms/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/ms/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Draf",
"ARCHIVE": "Arkib",
"TRANSLATE": "Terjemah",
+ "MOVE_TO_CATEGORY": "Category",
"DELETE": "Padamkan",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "Padamkan",
@@ -866,6 +869,28 @@
},
"EDIT_CONFIGURATION": "Sunting konfigurasi"
},
+ "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": "Padam"
+ },
+ "SAVE": "Simpan perubahan"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Portal berjaya dibuat",
diff --git a/app/javascript/dashboard/i18n/locale/ms/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ms/inboxMgmt.json
index d459b814c..dfd586a29 100644
--- a/app/javascript/dashboard/i18n/locale/ms/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ms/inboxMgmt.json
@@ -308,6 +308,7 @@
"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!",
@@ -317,7 +318,8 @@
"AUTH_NOT_COMPLETED": "Pengesahan tidak selesai. Sila mulakan semula proses.",
"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": "aliran tetapan manual"
+ "MANUAL_LINK_TEXT": "aliran tetapan manual",
+ "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"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "Support your customers on WhatsApp"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "Emel",
"DESCRIPTION": "Connect with Gmail, Outlook, or other providers"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Konfigurasi Bot",
"ACCOUNT_HEALTH": "Kesihatan Akaun",
"CSAT": "CSAT",
- "VOICE": "Suara"
+ "VOICE": "Suara",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Keutamaan Saluran",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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": "Penyelarasan templat berjaya dimulakan. Ia mungkin mengambil masa beberapa minit untuk dikemas kini.",
+ "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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Kemas kini Tetapan Borang Pra Sembang"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/ms/integrations.json b/app/javascript/dashboard/i18n/locale/ms/integrations.json
index 99b6d1580..3cca29ddb 100644
--- a/app/javascript/dashboard/i18n/locale/ms/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ms/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Kenalan dicipta",
"CONTACT_UPDATED": "Kenalan dikemas kini",
"CONVERSATION_TYPING_ON": "Perbualan Mengetik Aktif",
- "CONVERSATION_TYPING_OFF": "Perbualan Mengetik Tidak Aktif"
+ "CONVERSATION_TYPING_OFF": "Perbualan Mengetik Tidak Aktif",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/ne/bulkActions.json b/app/javascript/dashboard/i18n/locale/ne/bulkActions.json
index 77d41d9b3..7002ff610 100644
--- a/app/javascript/dashboard/i18n/locale/ne/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/ne/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} conversations selected",
- "AGENT_SELECT_LABEL": "Select agent",
- "ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign {conversationCount} {conversationLabel} to",
- "UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Go back",
- "ASSIGN_LABEL": "Assign",
"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}?",
@@ -20,7 +15,6 @@
"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.",
- "AGENT_LIST_LOADING": "Loading agents",
"UPDATE": {
"CHANGE_STATUS": "Change status",
"SNOOZE_UNTIL": "Snooze",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assign labels",
- "NO_LABELS_FOUND": "No labels found",
+ "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."
+ "ASSIGN_FAILED": "Failed to assign labels. Please try again.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Select team",
"NONE": "None",
- "NO_TEAMS_AVAILABLE": "There are no teams added to this account yet.",
- "ASSIGN_SELECTED_TEAMS": "Assign selected team.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/ne/campaign.json b/app/javascript/dashboard/i18n/locale/ne/campaign.json
index 10366e79e..d7e5dfe3f 100644
--- a/app/javascript/dashboard/i18n/locale/ne/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/ne/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "प्रक्रिया हुँदैछ",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "प्रक्रिया हुँदैछ",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/ne/components.json b/app/javascript/dashboard/i18n/locale/ne/components.json
index a75d35b08..3ee865a89 100644
--- a/app/javascript/dashboard/i18n/locale/ne/components.json
+++ b/app/javascript/dashboard/i18n/locale/ne/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ne/contact.json b/app/javascript/dashboard/i18n/locale/ne/contact.json
index 2d7821199..566a2161e 100644
--- a/app/javascript/dashboard/i18n/locale/ne/contact.json
+++ b/app/javascript/dashboard/i18n/locale/ne/contact.json
@@ -20,6 +20,8 @@
"CALL": "कल गर्नुहोस्",
"CALL_INITIATED": "सम्पर्कलाई कल गर्दै…",
"CALL_FAILED": "फोन कल सुरु गर्न सकिएन। कृपया फेरि प्रयास गर्नुहोस्।",
+ "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": "भ्वाइस इन्बक्स छान्नुहोस्"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "लेबलहरू तोक्नुहोस्",
+ "REMOVE_LABELS": "Remove Labels",
"ASSIGN_LABELS_SUCCESS": "लेबलहरू सफलतापूर्वक असाइन गरियो।",
"ASSIGN_LABELS_FAILED": "लेबलहरू तोक्न असफल भयो",
+ "REMOVE_LABELS_SUCCESS": "Labels removed successfully.",
+ "REMOVE_LABELS_FAILED": "Failed to remove labels",
"DESCRIPTION": "चयनित सम्पर्कहरूमा थप्न चाहनुभएको लेबलहरू छान्नुहोस्।",
"NO_LABELS_FOUND": "अहिलेसम्म कुनै लेबलहरू उपलब्ध छैनन्।",
"SELECTED_COUNT": "{count} चयन गरियो",
diff --git a/app/javascript/dashboard/i18n/locale/ne/conversation.json b/app/javascript/dashboard/i18n/locale/ne/conversation.json
index e4e25a554..706834290 100644
--- a/app/javascript/dashboard/i18n/locale/ne/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ne/conversation.json
@@ -62,6 +62,7 @@
"UNSUPPORTED_MESSAGE_FACEBOOK": "यो सन्देश समर्थन गरिएको छैन। तपाईं यो सन्देश Facebook Messenger एपमा हेर्न सक्नुहुन्छ।",
"UNSUPPORTED_MESSAGE_INSTAGRAM": "यो सन्देश समर्थन गरिएको छैन। तपाईं यो सन्देश Instagram एपमा हेर्न सक्नुहुन्छ।",
"UNSUPPORTED_MESSAGE_TIKTOK": "यो सन्देश समर्थन गरिएको छैन। तपाईंले यो सन्देश TikTok एपमा हेर्न सक्नुहुन्छ।",
+ "UNSUPPORTED_MESSAGE_WHATSAPP": "This message is unsupported. You can view this message on the WhatsApp app.",
"SUCCESS_DELETE_MESSAGE": "सन्देश सफलतापूर्वक मेटाइयो",
"FAIL_DELETE_MESSSAGE": "सन्देश मेटाउन सकिएन! फेरि प्रयास गर्नुहोस्",
"NO_RESPONSE": "कुनै प्रतिक्रिया छैन",
@@ -79,13 +80,22 @@
"OUTGOING_CALL": "जाने कल",
"CALL_IN_PROGRESS": "कल जारी छ",
"NO_ANSWER": "उत्तर छैन",
+ "NO_ANSWER_OUTBOUND_LABEL": "उत्तर छैन",
+ "NO_ANSWER_OUTBOUND_SUBTEXT": "Contact didn't pick up",
"MISSED_CALL": "छुटेको कल",
+ "MISSED_CALL_INBOUND_SUBTEXT": "No agent picked up",
+ "MISSED_CALL_DECLINED_BY": "Declined by {agentName}",
"CALL_ENDED": "कल समाप्त भयो",
+ "HANDLED_BY": "Handled by {agentName}",
"NOT_ANSWERED_YET": "अझै जवाफ दिइएको छैन",
+ "CALLING": "Calling…",
"THEY_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": "समाधान गर्नुहोस्",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "भोलिसम्म सुताइएको",
"SNOOZED_UNTIL_NEXT_WEEK": "अर्को हप्ता सम्म सुताइएको",
"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}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "अडियो रेकर्ड गर्नुहोस्",
"TIP_AUDIORECORDER_PERMISSION": "अडियो पहुँच अनुमति दिनुहोस्",
"TIP_AUDIORECORDER_ERROR": "अडियो खोल्न सकिएन",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "यहाँ तान्नुहोस् र छोड्नुहोस् संलग्न गर्न",
"START_AUDIO_RECORDING": "अडियो रेकर्डिङ सुरु गर्नुहोस्",
"STOP_AUDIO_RECORDING": "अडियो रेकर्डिङ रोक्नुहोस्",
@@ -299,8 +316,13 @@
"NOT_ANSWERED_YET": "अझै जवाफ दिइएको छैन",
"HANDLED_IN_ANOTHER_TAB": "अर्को ट्याबमा ह्यान्डल भइरहेको छ",
"REJECT_CALL": "अस्वीकार गर्नुहोस्",
+ "DISMISS_CALL": "Dismiss",
"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": {
diff --git a/app/javascript/dashboard/i18n/locale/ne/helpCenter.json b/app/javascript/dashboard/i18n/locale/ne/helpCenter.json
index 2da7108b9..c0bac7a54 100644
--- a/app/javascript/dashboard/i18n/locale/ne/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/ne/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "ड्राफ्ट",
"ARCHIVE": "अभिलेख",
"TRANSLATE": "अनुवाद गर्नुहोस्",
+ "MOVE_TO_CATEGORY": "Category",
"DELETE": "Delete",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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",
@@ -866,6 +869,28 @@
},
"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": "हटाउनुहोस्"
+ },
+ "SAVE": "परिवर्तनहरू बचत गर्नुहोस्"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "पोर्टल सफलतापूर्वक सिर्जना गरियो",
diff --git a/app/javascript/dashboard/i18n/locale/ne/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ne/inboxMgmt.json
index dd29826c2..65c1c2719 100644
--- a/app/javascript/dashboard/i18n/locale/ne/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ne/inboxMgmt.json
@@ -308,6 +308,7 @@
"AUTH_PROCESSING": "Meta सँग प्रमाणिकरण हुँदैछ",
"WAITING_FOR_BUSINESS_INFO": "कृपया Meta विन्डोमा व्यवसाय सेटअप पूरा गर्नुहोस्...",
"PROCESSING": "तपाईंको WhatsApp व्यवसाय खाता सेटअप गर्दै",
+ "ENABLING_CALLING": "Enabling WhatsApp Calling on your number…",
"LOADING_SDK": "Facebook SDK लोड हुँदैछ...",
"CANCELLED": "WhatsApp साइनअप रद्द गरियो",
"SUCCESS_TITLE": "WhatsApp व्यवसाय खाता जडान भयो!",
@@ -317,7 +318,8 @@
"AUTH_NOT_COMPLETED": "प्रमाणिकरण पूरा भएन। कृपया प्रक्रिया पुनः सुरु गर्नुहोस्।",
"SUCCESS_FALLBACK": "WhatsApp व्यवसाय खाता सफलतापूर्वक कन्फिगर गरियो",
"MANUAL_FALLBACK": "यदि तपाईंको नम्बर पहिले नै WhatsApp व्यवसाय प्लेटफर्म (API) सँग जडान गरिएको छ, वा तपाईं प्रविधि प्रदायक हुनुहुन्छ र आफ्नो नम्बर अनबोर्ड गर्दै हुनुहुन्छ भने, कृपया {link} प्रवाह प्रयोग गर्नुहोस्",
- "MANUAL_LINK_TEXT": "म्यानुअल सेटअप प्रवाह"
+ "MANUAL_LINK_TEXT": "म्यानुअल सेटअप प्रवाह",
+ "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": "हामी WhatsApp च्यानल सुरक्षित गर्न सकेनौं"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "WhatsApp मा तपाईंका ग्राहकहरूलाई समर्थन गर्नुहोस्"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "इमेल",
"DESCRIPTION": "Gmail, Outlook वा अन्य प्रदायकहरूसँग जडान गर्नुहोस्"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "बोट कन्फिगरेसन",
"ACCOUNT_HEALTH": "खाता स्वास्थ्य",
"CSAT": "CSAT",
- "VOICE": "भ्वाइस"
+ "VOICE": "भ्वाइस",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "च्यानल प्राथमिकता",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"WHATSAPP_TEMPLATES_SYNC_SUBHEADER": "तपाईंका उपलब्ध टेम्प्लेटहरू अपडेट गर्न WhatsApp बाट म्यानुअली सन्देश टेम्प्लेटहरू समक्रमण गर्नुहोस्।",
"WHATSAPP_TEMPLATES_SYNC_BUTTON": "टेम्प्लेटहरू समक्रमण गर्नुहोस्",
"WHATSAPP_TEMPLATES_SYNC_SUCCESS": "टेम्प्लेटहरू समक्रमण सफलतापूर्वक सुरु भयो। अपडेट हुन केही मिनेट लाग्न सक्छ।",
+ "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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "पूर्व-च्याट फारम सेटिङहरू अपडेट गर्नुहोस्।"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/ne/integrations.json b/app/javascript/dashboard/i18n/locale/ne/integrations.json
index d369fd8db..8838fa3eb 100644
--- a/app/javascript/dashboard/i18n/locale/ne/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ne/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "सम्पर्क सिर्जना भयो",
"CONTACT_UPDATED": "सम्पर्क अपडेट गरियो",
"CONVERSATION_TYPING_ON": "कुराकानी टाइप गर्दै छ",
- "CONVERSATION_TYPING_OFF": "कुराकानी टाइप गर्दै छैन"
+ "CONVERSATION_TYPING_OFF": "कुराकानी टाइप गर्दै छैन",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/nl/bulkActions.json b/app/javascript/dashboard/i18n/locale/nl/bulkActions.json
index 9ce607cac..93942db0f 100644
--- a/app/javascript/dashboard/i18n/locale/nl/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/nl/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} gesprekken geselecteerd",
- "AGENT_SELECT_LABEL": "Selecteer agent",
- "ASSIGN_CONFIRMATION_LABEL": "Weet u zeker dat u {conversationCount} {conversationLabel} wilt toewijzen aan",
- "UNASSIGN_CONFIRMATION_LABEL": "Weet u zeker dat u {conversationCount} {conversationLabel} wilt ontkoppelen?",
- "GO_BACK_LABEL": "Ga terug",
- "ASSIGN_LABEL": "Toewijzen",
"NONE": "Geen",
"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}?",
@@ -20,7 +15,6 @@
"RESOLVE_SUCCESFUL": "Gesprekken succesvol opgehaald.",
"RESOLVE_FAILED": "Failed to resolve conversations. Please try again.",
"ALL_CONVERSATIONS_SELECTED_ALERT": "Gesprekken die op deze pagina zichtbaar zijn, zijn alleen geselecteerd.",
- "AGENT_LIST_LOADING": "Agents worden geladen",
"UPDATE": {
"CHANGE_STATUS": "Status wijzigen",
"SNOOZE_UNTIL": "Sluimeren",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Labels toewijzen",
- "NO_LABELS_FOUND": "Geen labels gevonden",
+ "REMOVE_LABELS": "Remove labels",
"ASSIGN_SELECTED_LABELS": "Geselecteerde labels toewijzen",
+ "REMOVE_SELECTED_LABELS": "Remove selected labels",
"ASSIGN_SUCCESFUL": "Labels met succes toegewezen.",
- "ASSIGN_FAILED": "Toewijzen van labels mislukt, probeer het opnieuw."
+ "ASSIGN_FAILED": "Toewijzen van labels mislukt, probeer het opnieuw.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Selecteer team",
"NONE": "Geen",
- "NO_TEAMS_AVAILABLE": "Er zijn nog geen teams toegevoegd aan dit account.",
- "ASSIGN_SELECTED_TEAMS": "Geselecteerde team toewijzen.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/nl/campaign.json b/app/javascript/dashboard/i18n/locale/nl/campaign.json
index dec753f13..d30786560 100644
--- a/app/javascript/dashboard/i18n/locale/nl/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/nl/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/nl/components.json b/app/javascript/dashboard/i18n/locale/nl/components.json
index 1dcb747e2..23bbe0d26 100644
--- a/app/javascript/dashboard/i18n/locale/nl/components.json
+++ b/app/javascript/dashboard/i18n/locale/nl/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/nl/contact.json b/app/javascript/dashboard/i18n/locale/nl/contact.json
index b1aa25574..07f5139c5 100644
--- a/app/javascript/dashboard/i18n/locale/nl/contact.json
+++ b/app/javascript/dashboard/i18n/locale/nl/contact.json
@@ -20,6 +20,8 @@
"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"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "Label toewijzen",
+ "REMOVE_LABELS": "Remove Labels",
"ASSIGN_LABELS_SUCCESS": "Labels met succes toegewezen.",
"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",
diff --git a/app/javascript/dashboard/i18n/locale/nl/conversation.json b/app/javascript/dashboard/i18n/locale/nl/conversation.json
index 83553e320..31aeb37a7 100644
--- a/app/javascript/dashboard/i18n/locale/nl/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/nl/conversation.json
@@ -62,6 +62,7 @@
"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": "Bericht succesvol verwijderd",
"FAIL_DELETE_MESSSAGE": "Kon bericht niet verwijderen! Probeer het opnieuw",
"NO_RESPONSE": "Geen reactie",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Oplossen",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "Snoozed tot morgen",
"SNOOZED_UNTIL_NEXT_WEEK": "Snoozed tot volgende week",
"SNOOZED_UNTIL_NEXT_REPLY": "Snoozed tot volgende antwoord",
+ "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}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "Audio opnemen",
"TIP_AUDIORECORDER_PERMISSION": "Sta toegang tot audio toe",
"TIP_AUDIORECORDER_ERROR": "Geluid kon niet worden geopend",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "Sleep hierheen om toe te voegen",
"START_AUDIO_RECORDING": "Start audio-opname",
"STOP_AUDIO_RECORDING": "Stop audio-opname",
@@ -299,8 +316,13 @@
"NOT_ANSWERED_YET": "Not answered yet",
"HANDLED_IN_ANOTHER_TAB": "Being handled in another tab",
"REJECT_CALL": "Reject",
+ "DISMISS_CALL": "Negeer",
"JOIN_CALL": "Join call",
- "END_CALL": "End 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": {
diff --git a/app/javascript/dashboard/i18n/locale/nl/helpCenter.json b/app/javascript/dashboard/i18n/locale/nl/helpCenter.json
index e14763f34..0cb2a8342 100644
--- a/app/javascript/dashboard/i18n/locale/nl/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/nl/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Draft",
"ARCHIVE": "Archive",
"TRANSLATE": "Vertaal",
+ "MOVE_TO_CATEGORY": "Categorie",
"DELETE": "Verwijderen",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "Verwijderen",
@@ -866,6 +869,28 @@
},
"EDIT_CONFIGURATION": "Edit configuration"
},
+ "LAYOUT_CONTENT": {
+ "HEADER": "Weergave",
+ "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": "Verwijderen"
+ },
+ "SAVE": "Save changes"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Portal created successfully",
diff --git a/app/javascript/dashboard/i18n/locale/nl/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/nl/inboxMgmt.json
index abdbb47ee..5e901d3b9 100644
--- a/app/javascript/dashboard/i18n/locale/nl/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/nl/inboxMgmt.json
@@ -308,6 +308,7 @@
"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!",
@@ -317,7 +318,8 @@
"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"
+ "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"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "Support your customers on WhatsApp"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "E-mailadres",
"DESCRIPTION": "Connect with Gmail, Outlook, or other providers"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Bot Configuration",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT",
- "VOICE": "Voice"
+ "VOICE": "Voice",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Update Pre Chat Form Settings"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/nl/integrations.json b/app/javascript/dashboard/i18n/locale/nl/integrations.json
index 05766e58e..ad144e284 100644
--- a/app/javascript/dashboard/i18n/locale/nl/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/nl/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Contact aangemaakt",
"CONTACT_UPDATED": "Contact aangemaakt",
"CONVERSATION_TYPING_ON": "Conversation Typing On",
- "CONVERSATION_TYPING_OFF": "Conversation Typing Off"
+ "CONVERSATION_TYPING_OFF": "Conversation Typing Off",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/no/bulkActions.json b/app/javascript/dashboard/i18n/locale/no/bulkActions.json
index 9aea1df66..b73d23f16 100644
--- a/app/javascript/dashboard/i18n/locale/no/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/no/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} conversations selected",
- "AGENT_SELECT_LABEL": "Velg agent",
- "ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign {conversationCount} {conversationLabel} to",
- "UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Go back",
- "ASSIGN_LABEL": "Tildel",
"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}?",
@@ -20,7 +15,6 @@
"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.",
- "AGENT_LIST_LOADING": "Loading agents",
"UPDATE": {
"CHANGE_STATUS": "Change status",
"SNOOZE_UNTIL": "Snooze",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assign labels",
- "NO_LABELS_FOUND": "No labels found",
+ "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."
+ "ASSIGN_FAILED": "Failed to assign labels. Please try again.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Velg gruppe",
"NONE": "None",
- "NO_TEAMS_AVAILABLE": "There are no teams added to this account yet.",
- "ASSIGN_SELECTED_TEAMS": "Assign selected team.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/no/campaign.json b/app/javascript/dashboard/i18n/locale/no/campaign.json
index b0ac970f0..d0665209a 100644
--- a/app/javascript/dashboard/i18n/locale/no/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/no/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/no/components.json b/app/javascript/dashboard/i18n/locale/no/components.json
index d8ecb89ab..bbee4d708 100644
--- a/app/javascript/dashboard/i18n/locale/no/components.json
+++ b/app/javascript/dashboard/i18n/locale/no/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/no/contact.json b/app/javascript/dashboard/i18n/locale/no/contact.json
index 205ab67b8..36b0c84c1 100644
--- a/app/javascript/dashboard/i18n/locale/no/contact.json
+++ b/app/javascript/dashboard/i18n/locale/no/contact.json
@@ -20,6 +20,8 @@
"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"
@@ -583,8 +585,11 @@
},
"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",
diff --git a/app/javascript/dashboard/i18n/locale/no/conversation.json b/app/javascript/dashboard/i18n/locale/no/conversation.json
index a973a0c84..cb6b2f431 100644
--- a/app/javascript/dashboard/i18n/locale/no/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/no/conversation.json
@@ -62,6 +62,7 @@
"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",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Løs",
@@ -100,6 +110,12 @@
"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}",
@@ -215,6 +231,7 @@
"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",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
@@ -299,8 +316,13 @@
"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"
+ "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": {
diff --git a/app/javascript/dashboard/i18n/locale/no/helpCenter.json b/app/javascript/dashboard/i18n/locale/no/helpCenter.json
index c39867e15..0ed9ed17a 100644
--- a/app/javascript/dashboard/i18n/locale/no/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/no/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Draft",
"ARCHIVE": "Archive",
"TRANSLATE": "Translate",
+ "MOVE_TO_CATEGORY": "Category",
"DELETE": "Slett",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "Slett",
@@ -866,6 +869,28 @@
},
"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": "Fjern"
+ },
+ "SAVE": "Save changes"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Portal created successfully",
diff --git a/app/javascript/dashboard/i18n/locale/no/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/no/inboxMgmt.json
index b59a61dcb..3bc48e51d 100644
--- a/app/javascript/dashboard/i18n/locale/no/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/no/inboxMgmt.json
@@ -308,6 +308,7 @@
"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!",
@@ -317,7 +318,8 @@
"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"
+ "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"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "Support your customers on WhatsApp"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "E-post",
"DESCRIPTION": "Connect with Gmail, Outlook, or other providers"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Bot Configuration",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT",
- "VOICE": "Voice"
+ "VOICE": "Voice",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Update Pre Chat Form Settings"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/no/integrations.json b/app/javascript/dashboard/i18n/locale/no/integrations.json
index 190f0ad4c..07a8fc085 100644
--- a/app/javascript/dashboard/i18n/locale/no/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/no/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Contact created",
"CONTACT_UPDATED": "Contact updated",
"CONVERSATION_TYPING_ON": "Conversation Typing On",
- "CONVERSATION_TYPING_OFF": "Conversation Typing Off"
+ "CONVERSATION_TYPING_OFF": "Conversation Typing Off",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/pl/bulkActions.json b/app/javascript/dashboard/i18n/locale/pl/bulkActions.json
index 11de057a2..c2cdd7df9 100644
--- a/app/javascript/dashboard/i18n/locale/pl/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/pl/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} wybranych rozmów",
- "AGENT_SELECT_LABEL": "Wybierz konsultanta",
- "ASSIGN_CONFIRMATION_LABEL": "Czy na pewno chcesz przypisać {conversationCount} {conversationLabel} do",
- "UNASSIGN_CONFIRMATION_LABEL": "Czy na pewno chcesz odwołać przypisanie {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Powróć",
- "ASSIGN_LABEL": "Przypisz",
"NONE": "Brak",
"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}?",
@@ -20,7 +15,6 @@
"RESOLVE_SUCCESFUL": "Rozmowy zostały pomyślnie zakończone.",
"RESOLVE_FAILED": "Failed to resolve conversations. Please try again.",
"ALL_CONVERSATIONS_SELECTED_ALERT": "Zaznaczone rozmowy widoczne na tej stronie.",
- "AGENT_LIST_LOADING": "Ładowanie agentów",
"UPDATE": {
"CHANGE_STATUS": "Zmień status",
"SNOOZE_UNTIL": "Uśpij",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assign labels",
- "NO_LABELS_FOUND": "Brak wyników",
+ "REMOVE_LABELS": "Remove labels",
"ASSIGN_SELECTED_LABELS": "Przypisz wybrane etykiety",
+ "REMOVE_SELECTED_LABELS": "Remove selected labels",
"ASSIGN_SUCCESFUL": "Etykiety zostały pomyślnie przypisane.",
- "ASSIGN_FAILED": "Failed to assign labels. Please try again."
+ "ASSIGN_FAILED": "Failed to assign labels. Please try again.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Wybierz zespół",
"NONE": "Brak",
- "NO_TEAMS_AVAILABLE": "Na tym koncie nie dodano jeszcze żadnych zespołów.",
- "ASSIGN_SELECTED_TEAMS": "Przypisz wybrany zespół.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/pl/campaign.json b/app/javascript/dashboard/i18n/locale/pl/campaign.json
index 657223244..122099cde 100644
--- a/app/javascript/dashboard/i18n/locale/pl/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/pl/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Zakończone",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Zakończone",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/pl/components.json b/app/javascript/dashboard/i18n/locale/pl/components.json
index 053a2bf54..8ba2c3668 100644
--- a/app/javascript/dashboard/i18n/locale/pl/components.json
+++ b/app/javascript/dashboard/i18n/locale/pl/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/pl/contact.json b/app/javascript/dashboard/i18n/locale/pl/contact.json
index 78333d35d..128ffb4ff 100644
--- a/app/javascript/dashboard/i18n/locale/pl/contact.json
+++ b/app/javascript/dashboard/i18n/locale/pl/contact.json
@@ -20,6 +20,8 @@
"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"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "Przypisz etykiety",
+ "REMOVE_LABELS": "Remove Labels",
"ASSIGN_LABELS_SUCCESS": "Etykiety zostały pomyślnie przypisane.",
"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",
diff --git a/app/javascript/dashboard/i18n/locale/pl/conversation.json b/app/javascript/dashboard/i18n/locale/pl/conversation.json
index d8bafa0e9..d7767fcdf 100644
--- a/app/javascript/dashboard/i18n/locale/pl/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/pl/conversation.json
@@ -62,6 +62,7 @@
"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": "Wiadomość usunięta pomyślnie",
"FAIL_DELETE_MESSSAGE": "Nie można usunąć wiadomości! Spróbuj ponownie",
"NO_RESPONSE": "Brak odpowiedzi",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Rozwiąż",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "Uśpij do jutra",
"SNOOZED_UNTIL_NEXT_WEEK": "Uśpione do następnego tygodnia",
"SNOOZED_UNTIL_NEXT_REPLY": "Uśpione do następnej odpowiedzi",
+ "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}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "Nagrywaj audio",
"TIP_AUDIORECORDER_PERMISSION": "Zezwól na dostęp do dźwięku",
"TIP_AUDIORECORDER_ERROR": "Nie można otworzyć dźwięku",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "Przeciągnij i upuść tutaj, aby dołączyć",
"START_AUDIO_RECORDING": "Rozpocznij nagrywanie audio",
"STOP_AUDIO_RECORDING": "Zatrzymaj nagrywanie audio",
@@ -299,8 +316,13 @@
"NOT_ANSWERED_YET": "Not answered yet",
"HANDLED_IN_ANOTHER_TAB": "Being handled in another tab",
"REJECT_CALL": "Reject",
+ "DISMISS_CALL": "Odrzuć",
"JOIN_CALL": "Join call",
- "END_CALL": "End 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": {
diff --git a/app/javascript/dashboard/i18n/locale/pl/helpCenter.json b/app/javascript/dashboard/i18n/locale/pl/helpCenter.json
index 1f81b2fa4..b775a08b8 100644
--- a/app/javascript/dashboard/i18n/locale/pl/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/pl/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Szkic",
"ARCHIVE": "Archive",
"TRANSLATE": "Przetłumacz",
+ "MOVE_TO_CATEGORY": "Kategoria",
"DELETE": "Usuń",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "Usuń",
@@ -866,6 +869,28 @@
},
"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": "Usuń"
+ },
+ "SAVE": "Save changes"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Portal utworzony pomyślnie",
diff --git a/app/javascript/dashboard/i18n/locale/pl/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/pl/inboxMgmt.json
index 3006452c1..0602b35c1 100644
--- a/app/javascript/dashboard/i18n/locale/pl/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/pl/inboxMgmt.json
@@ -308,6 +308,7 @@
"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!",
@@ -317,7 +318,8 @@
"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"
+ "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": "Nie udało się zapisać kanału WhatsApp"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "Support your customers on WhatsApp"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "E-mail",
"DESCRIPTION": "Connect with Gmail, Outlook, or other providers"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Konfiguracja bota",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT",
- "VOICE": "Voice"
+ "VOICE": "Voice",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Aktualizacja ustawień formularza czatu wstępnego"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/pl/integrations.json b/app/javascript/dashboard/i18n/locale/pl/integrations.json
index 2a9b55026..6ab571321 100644
--- a/app/javascript/dashboard/i18n/locale/pl/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/pl/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Utworzenie kontaktu",
"CONTACT_UPDATED": "Aktualizacja kontaktu",
"CONVERSATION_TYPING_ON": "Conversation Typing On",
- "CONVERSATION_TYPING_OFF": "Conversation Typing Off"
+ "CONVERSATION_TYPING_OFF": "Conversation Typing Off",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/pt/bulkActions.json b/app/javascript/dashboard/i18n/locale/pt/bulkActions.json
index 12ad9423a..f6289e1c1 100644
--- a/app/javascript/dashboard/i18n/locale/pt/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/pt/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} conversas selecionadas",
- "AGENT_SELECT_LABEL": "Escolher agente",
- "ASSIGN_CONFIRMATION_LABEL": "Tem a certeza que pretende atribuir {conversationCount} {conversationLabel} a",
- "UNASSIGN_CONFIRMATION_LABEL": "Tem a certeza que pretende remover a atribuição de {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Voltar",
- "ASSIGN_LABEL": "Atribuir",
"NONE": "Nenhuma",
"CLEAR_SELECTION": "Limpar",
"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}?",
@@ -20,7 +15,6 @@
"RESOLVE_SUCCESFUL": "Conversas resolvidas com sucesso.",
"RESOLVE_FAILED": "Falha ao resolver conversas. Por favor, tente novamente.",
"ALL_CONVERSATIONS_SELECTED_ALERT": "As conversas visíveis nesta página estão apenas selecionadas.",
- "AGENT_LIST_LOADING": "A carregar agentes",
"UPDATE": {
"CHANGE_STATUS": "Alterar estado",
"SNOOZE_UNTIL": "Adiar",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Atribuir etiquetas",
- "NO_LABELS_FOUND": "Nenhuma etiqueta encontrada",
+ "REMOVE_LABELS": "Remove labels",
"ASSIGN_SELECTED_LABELS": "Atribuir etiquetas selecionadas",
+ "REMOVE_SELECTED_LABELS": "Remove selected labels",
"ASSIGN_SUCCESFUL": "Etiquetas atribuídas com sucesso.",
- "ASSIGN_FAILED": "Falha ao atribuir etiquetas. Por favor, tente novamente."
+ "ASSIGN_FAILED": "Falha ao atribuir etiquetas. Por favor, tente novamente.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Escolher equipa",
"NONE": "Nenhuma",
- "NO_TEAMS_AVAILABLE": "Não há equipas nesta conta.",
- "ASSIGN_SELECTED_TEAMS": "Atribuir equipa selecionada.",
"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": "Equipas atribuídas.",
diff --git a/app/javascript/dashboard/i18n/locale/pt/campaign.json b/app/javascript/dashboard/i18n/locale/pt/campaign.json
index 6a007e9b7..25e8cc065 100644
--- a/app/javascript/dashboard/i18n/locale/pt/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/pt/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Concluída",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Concluída",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/pt/components.json b/app/javascript/dashboard/i18n/locale/pt/components.json
index 396df5d48..9565bd6b2 100644
--- a/app/javascript/dashboard/i18n/locale/pt/components.json
+++ b/app/javascript/dashboard/i18n/locale/pt/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/pt/contact.json b/app/javascript/dashboard/i18n/locale/pt/contact.json
index 09d66b265..8f1320b67 100644
--- a/app/javascript/dashboard/i18n/locale/pt/contact.json
+++ b/app/javascript/dashboard/i18n/locale/pt/contact.json
@@ -20,6 +20,8 @@
"CALL": "Chamada",
"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"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "Atribuir etiquetas",
+ "REMOVE_LABELS": "Remove Labels",
"ASSIGN_LABELS_SUCCESS": "Etiquetas atribuídas com sucesso.",
"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",
diff --git a/app/javascript/dashboard/i18n/locale/pt/conversation.json b/app/javascript/dashboard/i18n/locale/pt/conversation.json
index 578adb793..3d9c0a44b 100644
--- a/app/javascript/dashboard/i18n/locale/pt/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/pt/conversation.json
@@ -62,6 +62,7 @@
"UNSUPPORTED_MESSAGE_FACEBOOK": "Esta mensagem não é suportada. Pode ver esta mensagem na app Facebook Messenger.",
"UNSUPPORTED_MESSAGE_INSTAGRAM": "Esta mensagem não é suportada. Pode ver esta mensagem na app do Instagram.",
"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": "Mensagem apagada com sucesso",
"FAIL_DELETE_MESSSAGE": "Não foi possível apagar a mensagem! Por favor, tente novamente",
"NO_RESPONSE": "Sem resposta",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Resolver",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "Adiada até amanhã",
"SNOOZED_UNTIL_NEXT_WEEK": "Adiada até a próxima semana",
"SNOOZED_UNTIL_NEXT_REPLY": "Adiada até à próxima resposta",
+ "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}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "Gravar áudio",
"TIP_AUDIORECORDER_PERMISSION": "Permitir acesso ao áudio",
"TIP_AUDIORECORDER_ERROR": "Não foi possível abrir o áudio",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "Arrastar e soltar aqui para anexar",
"START_AUDIO_RECORDING": "Iniciar gravação de áudio",
"STOP_AUDIO_RECORDING": "Parar gravação de áudio",
@@ -299,8 +316,13 @@
"NOT_ANSWERED_YET": "Not answered yet",
"HANDLED_IN_ANOTHER_TAB": "Being handled in another tab",
"REJECT_CALL": "Reject",
+ "DISMISS_CALL": "Descartar",
"JOIN_CALL": "Join call",
- "END_CALL": "End 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": {
diff --git a/app/javascript/dashboard/i18n/locale/pt/helpCenter.json b/app/javascript/dashboard/i18n/locale/pt/helpCenter.json
index 269c91738..f7a08aa54 100644
--- a/app/javascript/dashboard/i18n/locale/pt/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/pt/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Rascunho",
"ARCHIVE": "Archive",
"TRANSLATE": "Traduzir",
+ "MOVE_TO_CATEGORY": "Categoria",
"DELETE": "Excluir",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "Excluir",
@@ -866,6 +869,28 @@
},
"EDIT_CONFIGURATION": "Edit configuration"
},
+ "LAYOUT_CONTENT": {
+ "HEADER": "Aparência",
+ "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": "Excluir"
+ },
+ "SAVE": "Save changes"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Portal criado com sucesso",
diff --git a/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json
index 58bfefaa5..a76b2acfa 100644
--- a/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json
@@ -308,6 +308,7 @@
"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!",
@@ -317,7 +318,8 @@
"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"
+ "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": "Não foi possível gravar o canal do WhatsApp"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "Support your customers on WhatsApp"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "E-mail",
"DESCRIPTION": "Connect with Gmail, Outlook, or other providers"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Configuração do bot",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT",
- "VOICE": "Voz"
+ "VOICE": "Voz",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Atualizar configurações do formulário pré-chat"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/pt/integrations.json b/app/javascript/dashboard/i18n/locale/pt/integrations.json
index 41fe0cf5a..3db1d60af 100644
--- a/app/javascript/dashboard/i18n/locale/pt/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/pt/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Contacto criado",
"CONTACT_UPDATED": "Contacto atualizado",
"CONVERSATION_TYPING_ON": "Conversa: a escrever",
- "CONVERSATION_TYPING_OFF": "Conversa: a escrever desligada"
+ "CONVERSATION_TYPING_OFF": "Conversa: a escrever desligada",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/bulkActions.json b/app/javascript/dashboard/i18n/locale/pt_BR/bulkActions.json
index d8c372466..0ec37a322 100644
--- a/app/javascript/dashboard/i18n/locale/pt_BR/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/pt_BR/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} conversas selecionadas",
- "AGENT_SELECT_LABEL": "Selecionar agente",
- "ASSIGN_CONFIRMATION_LABEL": "Você tem certeza que quer atribuir {conversationCount} {conversationLabel} para",
- "UNASSIGN_CONFIRMATION_LABEL": "Você tem certeza que quer remover a atribuição de {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Voltar atrás",
- "ASSIGN_LABEL": "Atribua",
"NONE": "Nenhuma",
"CLEAR_SELECTION": "Limpar",
"ASSIGN_AGENT_CONFIRMATION_LABEL": "Tem certeza de que deseja atribuir {n} conversa para {agentName}? | Tem certeza de que deseja atribuir {n} conversas para {agentName}?",
@@ -20,7 +15,6 @@
"RESOLVE_SUCCESFUL": "Conversas resolvidas com sucesso.",
"RESOLVE_FAILED": "Falha ao resolver conversas. Por favor, tente novamente.",
"ALL_CONVERSATIONS_SELECTED_ALERT": "Conversas visíveis nesta página só estão selecionadas.",
- "AGENT_LIST_LOADING": "Carregando agentes",
"UPDATE": {
"CHANGE_STATUS": "Alterar status",
"SNOOZE_UNTIL": "Adiar",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Atribuir rótulo",
- "NO_LABELS_FOUND": "Nenhuma etiqueta encontrada",
+ "REMOVE_LABELS": "Remover etiquetas",
"ASSIGN_SELECTED_LABELS": "Atribuir etiquetas selecionadas",
+ "REMOVE_SELECTED_LABELS": "Remover etiquetas selecionadas",
"ASSIGN_SUCCESFUL": "Rótulos atribuídos com sucesso.",
- "ASSIGN_FAILED": "Falha ao atribuir etiquetas. Por favor, tente novamente."
+ "ASSIGN_FAILED": "Falha ao atribuir etiquetas. Por favor, tente novamente.",
+ "REMOVE_SUCCESFUL": "Etiquetas removidas com sucesso.",
+ "REMOVE_FAILED": "Falha ao remover etiquetas. Por favor, tente novamente."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Selecionar time",
"NONE": "Nenhum",
- "NO_TEAMS_AVAILABLE": "Ainda não há times adicionados a esta conta.",
- "ASSIGN_SELECTED_TEAMS": "Atribuir time selecionado.",
"ASSIGN_TEAM_CONFIRMATION_LABEL": "Tem certeza de que deseja atribuir {n} conversa ao time {teamName}? | Tem certeza de que deseja atribuir {n} conversas ao time {teamName}?",
"UNASSIGN_TEAM_CONFIRMATION_LABEL": "Tem certeza de que deseja remover a atribuição de {n} conversa? | Tem certeza de que deseja remover a atribuição de {n} conversas?",
"ASSIGN_SUCCESFUL": "Times atribuídos com sucesso.",
diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/campaign.json b/app/javascript/dashboard/i18n/locale/pt_BR/campaign.json
index c1637a4d4..740cb2545 100644
--- a/app/javascript/dashboard/i18n/locale/pt_BR/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/pt_BR/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processando",
"COMPLETED": "Concluído",
"SCHEDULED": "Agendada"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processando",
"COMPLETED": "Concluído",
"SCHEDULED": "Agendada"
},
diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/components.json b/app/javascript/dashboard/i18n/locale/pt_BR/components.json
index 485cf6ad0..bcc44413b 100644
--- a/app/javascript/dashboard/i18n/locale/pt_BR/components.json
+++ b/app/javascript/dashboard/i18n/locale/pt_BR/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Imagem"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/contact.json b/app/javascript/dashboard/i18n/locale/pt_BR/contact.json
index c9b5cd942..a4b168805 100644
--- a/app/javascript/dashboard/i18n/locale/pt_BR/contact.json
+++ b/app/javascript/dashboard/i18n/locale/pt_BR/contact.json
@@ -20,6 +20,8 @@
"CALL": "Chamada",
"CALL_INITIATED": "Efetuando chamada…",
"CALL_FAILED": "Não foi possível iniciar a chamada. Tente novamente.",
+ "WHATSAPP_CALL_PERMISSION_REQUESTED": "Solicitação de permissão de chamada enviada ao contato. Tente novamente após a aceitação.",
+ "WHATSAPP_CALL_PERMISSION_PENDING": "Uma solicitação de permissão de chamada já foi enviada recentemente. Tente novamente após o contato aceitar.",
"CLICK_TO_EDIT": "Click to edit",
"VOICE_INBOX_PICKER": {
"TITLE": "Escolha uma caixa de entrada de voz"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "Atribuir rótulo",
+ "REMOVE_LABELS": "Remover Etiquetas",
"ASSIGN_LABELS_SUCCESS": "Rótulos atribuídos com sucesso.",
"ASSIGN_LABELS_FAILED": "Falha ao atribuir etiquetas",
+ "REMOVE_LABELS_SUCCESS": "Etiquetas removidas com sucesso.",
+ "REMOVE_LABELS_FAILED": "Falha ao remover etiquetas",
"DESCRIPTION": "Selecione as etiquetas que deseja adicionar aos contatos selecionados.",
"NO_LABELS_FOUND": "Nenhuma etiqueta disponível ainda.",
"SELECTED_COUNT": "{count} selecionado",
diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/conversation.json b/app/javascript/dashboard/i18n/locale/pt_BR/conversation.json
index ecd158e16..8a6702eaa 100644
--- a/app/javascript/dashboard/i18n/locale/pt_BR/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/pt_BR/conversation.json
@@ -62,6 +62,7 @@
"UNSUPPORTED_MESSAGE_FACEBOOK": "Esta mensagem não é suportada. Você pode ver esta mensagem no aplicativo Facebook Messenger.",
"UNSUPPORTED_MESSAGE_INSTAGRAM": "Esta mensagem não é suportada. Você pode ver esta mensagem no aplicativo do Instagram.",
"UNSUPPORTED_MESSAGE_TIKTOK": "Esta mensagem não é compatível. Você pode visualizá-la no aplicativo do TikTok.",
+ "UNSUPPORTED_MESSAGE_WHATSAPP": "Esta mensagem não é suportada. Você pode visualizar esta mensagem no aplicativo do WhatsApp.",
"SUCCESS_DELETE_MESSAGE": "Mensagem excluída com sucesso",
"FAIL_DELETE_MESSSAGE": "Não foi possível excluir a mensagem! Tente novamente",
"NO_RESPONSE": "Sem resposta",
@@ -79,13 +80,22 @@
"OUTGOING_CALL": "Chamada realizada",
"CALL_IN_PROGRESS": "Chamada em andamento",
"NO_ANSWER": "Sem resposta",
+ "NO_ANSWER_OUTBOUND_LABEL": "Sem resposta",
+ "NO_ANSWER_OUTBOUND_SUBTEXT": "O contato não atendeu",
"MISSED_CALL": "Chamada perdida",
+ "MISSED_CALL_INBOUND_SUBTEXT": "Nenhum atendente atendeu",
+ "MISSED_CALL_DECLINED_BY": "Recusado por {agentName}",
"CALL_ENDED": "Chamada encerrada",
+ "HANDLED_BY": "Atendido por {agentName}",
"NOT_ANSWERED_YET": "Ainda não respondido",
+ "CALLING": "Chamando…",
"THEY_ANSWERED": "Eles responderam",
"YOU_ANSWERED": "Você respondeu",
"AGENT_ANSWERED": "{agentName} respondeu",
- "JOIN_CALL": "Entrar na chamada"
+ "JOIN_CALL": "Entrar na chamada",
+ "CALL_BACK": "Retornar chamada",
+ "TRANSCRIPT_SHOW_MORE": "Ver mais",
+ "TRANSCRIPT_SHOW_LESS": "Mostrar menos"
},
"HEADER": {
"RESOLVE_ACTION": "Resolver",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "Adiado até amanhã",
"SNOOZED_UNTIL_NEXT_WEEK": "Adiada até a próxima semana",
"SNOOZED_UNTIL_NEXT_REPLY": "Adiado até a próxima resposta",
+ "WHATSAPP_CALL": "Iniciar chamada no WhatsApp",
+ "WHATSAPP_CALL_FAILED": "Não foi possível iniciar a chamada no WhatsApp.",
+ "VOICE_CALL": "Iniciar chamada",
+ "VOICE_CALL_FAILED": "Não foi possível iniciar a chamada.",
+ "WHATSAPP_CALL_PERMISSION_REQUESTED": "Solicitação de permissão de chamada enviada ao contato. Tente novamente após a aceitação.",
+ "WHATSAPP_CALL_PERMISSION_PENDING": "Uma solicitação de permissão de chamada já foi enviada recentemente. Tente novamente após o contato aceitar.",
"SLA_STATUS": {
"FRT": "FRT {status}",
"NRT": "NRT {status}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "Gravar áudio",
"TIP_AUDIORECORDER_PERMISSION": "Permitir acesso ao áudio",
"TIP_AUDIORECORDER_ERROR": "Não foi possível abrir o áudio",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "Arraste e solte aqui para anexar",
"START_AUDIO_RECORDING": "Iniciar gravação de áudio",
"STOP_AUDIO_RECORDING": "Parar gravação de áudio",
@@ -299,8 +316,13 @@
"NOT_ANSWERED_YET": "Ainda não respondido",
"HANDLED_IN_ANOTHER_TAB": "Sendo atendida em outra aba",
"REJECT_CALL": "Recusar",
+ "DISMISS_CALL": "Recusar",
"JOIN_CALL": "Entrar na chamada",
- "END_CALL": "Encerrar chamada"
+ "END_CALL": "Encerrar chamada",
+ "MUTE": "Silenciar microfone",
+ "UNMUTE": "Desilenciar microfone",
+ "VIEW_CHAT_HISTORY": "Ver histórico da conversa",
+ "GO_TO_CONVERSATION": "Ir para a conversa"
}
},
"EMAIL_TRANSCRIPT": {
diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/helpCenter.json b/app/javascript/dashboard/i18n/locale/pt_BR/helpCenter.json
index 6448cf209..558651b9f 100644
--- a/app/javascript/dashboard/i18n/locale/pt_BR/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/pt_BR/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Rascunho",
"ARCHIVE": "Arquivar",
"TRANSLATE": "Traduzir",
+ "MOVE_TO_CATEGORY": "Categoria",
"DELETE": "Excluir",
"STATUS_SUCCESS": "Artigos atualizados com sucesso",
"STATUS_ERROR": "Falha ao atualizar artigos",
+ "CATEGORY_SUCCESS": "Artigos movidos com sucesso",
+ "CATEGORY_ERROR": "Falha ao mover artigos",
"DELETE_CONFIRM_TITLE": "Excluir artigo | Excluir {count} artigos",
"DELETE_CONFIRM_DESCRIPTION": "Isto irá apagar o artigo selecionado permanentemente. Esta ação não pode ser desfeita. | Isso irá apagar permanentemente {count} artigos selecionados. Esta ação não pode ser desfeita.",
"DELETE_CONFIRM": "Excluir",
@@ -866,6 +869,28 @@
},
"EDIT_CONFIGURATION": "Alterar configuração"
},
+ "LAYOUT_CONTENT": {
+ "HEADER": "Tema",
+ "DESCRIPTION": "Escolha o leiaute adequado à leitura de seus visitantes.",
+ "LAYOUT": {
+ "CLASSIC": {
+ "TITLE": "Clássico",
+ "DESCRIPTION": "Uma página inicial acolhedora com busca e tópicos em destaque."
+ },
+ "SIDEBAR": {
+ "TITLE": "Documentação",
+ "DESCRIPTION": "Navegação lado a lado que mantém todos os guias a um clique de distância."
+ }
+ },
+ "SOCIAL_LINKS": {
+ "HEADER": "Links sociais",
+ "DESCRIPTION": "Adicione o identificador de cada rede e sua central de ajuda criará o link completo automaticamente. Exibido no rodapé do leiaute da documentação.",
+ "PLACEHOLDER": "@usuario",
+ "ADD": "Adicionar link social",
+ "REMOVE": "Excluir"
+ },
+ "SAVE": "Salvar Alterações"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Portal criado com sucesso",
diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json
index d8ab81b0c..4331fade0 100644
--- a/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json
@@ -308,6 +308,7 @@
"AUTH_PROCESSING": "Autenticando com Meta",
"WAITING_FOR_BUSINESS_INFO": "Por favor, complete a configuração do negócio na janela da Meta...",
"PROCESSING": "Configurando sua conta do WhatsApp Business",
+ "ENABLING_CALLING": "Ativando chamadas do WhatsApp no seu número…",
"LOADING_SDK": "Carregando SDK do Facebook...",
"CANCELLED": "O cadastro do WhatsApp foi cancelado",
"SUCCESS_TITLE": "Conta do WhatsApp Business conectada!",
@@ -317,7 +318,8 @@
"AUTH_NOT_COMPLETED": "Autenticação não concluída. Por favor, reinicie o processo.",
"SUCCESS_FALLBACK": "A conta do WhatsApp Business foi configurada com sucesso",
"MANUAL_FALLBACK": "Se o seu número já estiver conectado à Plataforma WhatsApp Business (API) ou se você for um provedor de tecnologia integrando o seu próprio número, use o fluxo de {link}",
- "MANUAL_LINK_TEXT": "fluxo de configuração manual"
+ "MANUAL_LINK_TEXT": "fluxo de configuração manual",
+ "CALLING_ENABLE_FAILED": "Sua caixa de entrada do WhatsApp está pronta, mas as chamadas de voz não puderam ser ativadas — este número ainda não está cadastrado na API de Chamadas do WhatsApp Business. Entre em contato com a Meta ou com seu provedor de soluções WhatsApp Business para realizar o cadastro e, depois, ative as chamadas nas configurações de Chamadas da caixa de entrada."
},
"API": {
"ERROR_MESSAGE": "Não foi possível salvar o canal do WhatsApp"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "Atenda seus clientes no WhatsApp"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "Chamada do WhatsApp",
+ "DESCRIPTION": "Receba chamadas de voz no seu número do WhatsApp"
+ },
"EMAIL": {
"TITLE": "E-mail",
"DESCRIPTION": "Conectar com Gmail, Outlook ou outros provedores"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Configuração do Bot",
"ACCOUNT_HEALTH": "Saúde da conta",
"CSAT": "CSAT",
- "VOICE": "Voz"
+ "VOICE": "Voz",
+ "CALLS": "Chamadas"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Chamada de voz requer credenciais de chave da API Twilio. Elas são usadas para gerar tokens para conexões de voz do agente."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Ativar chamadas do WhatsApp",
+ "DESCRIPTION": "Permita que os atendentes recebam e realizem chamadas do WhatsApp Cloud nesta caixa de entrada. Os clientes poderão ligar diretamente para este número comercial pelo WhatsApp."
+ },
+ "ENABLE_FAILED": "As chamadas de voz não puderam ser ativadas para este número — ele ainda não está cadastrado na API de Chamadas do WhatsApp Business. Entre em contato com a Meta ou com seu provedor de soluções WhatsApp Business para realizar o cadastro e tente novamente depois.",
+ "PHONE_NUMBER": {
+ "LABEL": "Número de telefone comercial",
+ "HELP_TEXT": "Número do WhatsApp para o qual os clientes poderão ligar."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "Como funciona",
+ "DESCRIPTION": "As chamadas são realizadas ponto a ponto entre o navegador do atendente e a Meta — nenhuma credencial adicional é necessária. Certifique-se de que o navegador do atendente tenha permissão para usar o microfone neste site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Mensagem de solicitação de permissão de chamada",
+ "HELP_TEXT": "Exibido ao contato quando ele ainda não consentiu em receber chamadas. Deixe em branco para usar a mensagem padrão.",
+ "PLACEHOLDER": "Gostaríamos de ligar para você em relação à sua conversa."
+ }
+ },
"CHANNEL_PREFERENCES": "Preferências do Canal",
"WIDGET_FEATURES": "Recursos do widget",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"WHATSAPP_TEMPLATES_SYNC_SUBHEADER": "Sincronize manualmente os modelos de mensagens do WhatsApp para atualizar seus modelos disponíveis.",
"WHATSAPP_TEMPLATES_SYNC_BUTTON": "Sincronizar Modelos",
"WHATSAPP_TEMPLATES_SYNC_SUCCESS": "Sincronização de modelos iniciada com sucesso. Pode demorar alguns minutos para atualizar.",
+ "WHATSAPP_CALLING_ENABLED": {
+ "LABEL": "Ativar chamadas de voz",
+ "DESCRIPTION": "Permita que os atendentes iniciem e recebam chamadas de voz do WhatsApp nesta caixa de entrada. Disponível apenas para canais do WhatsApp Cloud com cadastro incorporado e permissão de chamadas concedida pela Meta."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Atualizar configurações do Formulário Pre Chat"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/integrationApps.json b/app/javascript/dashboard/i18n/locale/pt_BR/integrationApps.json
index a42b3be4f..6fb63c738 100644
--- a/app/javascript/dashboard/i18n/locale/pt_BR/integrationApps.json
+++ b/app/javascript/dashboard/i18n/locale/pt_BR/integrationApps.json
@@ -46,7 +46,7 @@
"PLACEHOLDER": "Selecionar caixa de entrada"
},
"SUBMIT": "Criar",
- "VALIDATING_OPENAI": "Validating with OpenAI...",
+ "VALIDATING_OPENAI": "Validando com a OpenAI...",
"CANCEL": "Cancelar"
},
"API": {
diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/integrations.json b/app/javascript/dashboard/i18n/locale/pt_BR/integrations.json
index b08d05c5a..900c4cce3 100644
--- a/app/javascript/dashboard/i18n/locale/pt_BR/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/pt_BR/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Contato criado",
"CONTACT_UPDATED": "Contato atualizado",
"CONVERSATION_TYPING_ON": "Status de Digitação ativado",
- "CONVERSATION_TYPING_OFF": "Status de Digitação desativado"
+ "CONVERSATION_TYPING_OFF": "Status de Digitação desativado",
+ "INBOX_UPDATED": "Caixa de entrada atualizada"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/ro/bulkActions.json b/app/javascript/dashboard/i18n/locale/ro/bulkActions.json
index 396b5b5b0..c4d2d45f3 100644
--- a/app/javascript/dashboard/i18n/locale/ro/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/ro/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} conversații selectate",
- "AGENT_SELECT_LABEL": "Selectați agentul",
- "ASSIGN_CONFIRMATION_LABEL": "Sigur doriți să atribuiți {conversationCount} {conversationLabel} la",
- "UNASSIGN_CONFIRMATION_LABEL": "Sigur doriți să anulați atribuirea a {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Mergeți înapoi",
- "ASSIGN_LABEL": "Atribuiți",
"NONE": "Nimic",
"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}?",
@@ -20,7 +15,6 @@
"RESOLVE_SUCCESFUL": "Conversațiile au fost rezolvate.",
"RESOLVE_FAILED": "Failed to resolve conversations. Please try again.",
"ALL_CONVERSATIONS_SELECTED_ALERT": "Conversațiile vizibile pe această pagină sunt doar selectate.",
- "AGENT_LIST_LOADING": "Se încarcă agenții",
"UPDATE": {
"CHANGE_STATUS": "Schimbați statusul",
"SNOOZE_UNTIL": "Amânați",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assign labels",
- "NO_LABELS_FOUND": "Nu s-au găsit etichete",
+ "REMOVE_LABELS": "Remove labels",
"ASSIGN_SELECTED_LABELS": "Atribuiți etichetele selectate",
+ "REMOVE_SELECTED_LABELS": "Remove selected labels",
"ASSIGN_SUCCESFUL": "Etichete atribuite cu succes.",
- "ASSIGN_FAILED": "Failed to assign labels. Please try again."
+ "ASSIGN_FAILED": "Failed to assign labels. Please try again.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Selectați echipa",
"NONE": "Nimic",
- "NO_TEAMS_AVAILABLE": "Nu există încă echipe adăugate la acest cont.",
- "ASSIGN_SELECTED_TEAMS": "Atribuirea echipei selectate.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/ro/campaign.json b/app/javascript/dashboard/i18n/locale/ro/campaign.json
index 0508e042b..09111f1fe 100644
--- a/app/javascript/dashboard/i18n/locale/ro/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/ro/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Finalizată",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Finalizată",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/ro/components.json b/app/javascript/dashboard/i18n/locale/ro/components.json
index 324ee7cfc..13bfe1930 100644
--- a/app/javascript/dashboard/i18n/locale/ro/components.json
+++ b/app/javascript/dashboard/i18n/locale/ro/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ro/contact.json b/app/javascript/dashboard/i18n/locale/ro/contact.json
index 4c2c842b6..5ceb50f26 100644
--- a/app/javascript/dashboard/i18n/locale/ro/contact.json
+++ b/app/javascript/dashboard/i18n/locale/ro/contact.json
@@ -20,6 +20,8 @@
"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"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "Atribuiți etichete",
+ "REMOVE_LABELS": "Remove Labels",
"ASSIGN_LABELS_SUCCESS": "Etichete atribuite cu succes.",
"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",
diff --git a/app/javascript/dashboard/i18n/locale/ro/conversation.json b/app/javascript/dashboard/i18n/locale/ro/conversation.json
index ac6def97c..a2679e6ac 100644
--- a/app/javascript/dashboard/i18n/locale/ro/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ro/conversation.json
@@ -62,6 +62,7 @@
"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": "Mesaj şters cu succes",
"FAIL_DELETE_MESSSAGE": "Mesajul nu a putut fi șters! Încercați din nou",
"NO_RESPONSE": "Niciun răspuns",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Rezolvă",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "Amânat până mâine",
"SNOOZED_UNTIL_NEXT_WEEK": "Amânat până săptămâna viitoare",
"SNOOZED_UNTIL_NEXT_REPLY": "Amânat până la următorul răspuns",
+ "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}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "Înregistrare audio",
"TIP_AUDIORECORDER_PERMISSION": "Permiteți accesul la audio",
"TIP_AUDIORECORDER_ERROR": "Nu s-a putut deschide audio",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "Trageți și plasați aici pentru atașare",
"START_AUDIO_RECORDING": "Pornirea înregistrării audio",
"STOP_AUDIO_RECORDING": "Mesaj audio",
@@ -299,8 +316,13 @@
"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"
+ "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": {
diff --git a/app/javascript/dashboard/i18n/locale/ro/helpCenter.json b/app/javascript/dashboard/i18n/locale/ro/helpCenter.json
index 85771bfb6..a2f04e3d6 100644
--- a/app/javascript/dashboard/i18n/locale/ro/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/ro/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Ciornă",
"ARCHIVE": "Archive",
"TRANSLATE": "Traduceți",
+ "MOVE_TO_CATEGORY": "Categorie",
"DELETE": "Şterge",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "Şterge",
@@ -866,6 +869,28 @@
},
"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": "Elimină"
+ },
+ "SAVE": "Save changes"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Portalul a fost creat",
diff --git a/app/javascript/dashboard/i18n/locale/ro/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ro/inboxMgmt.json
index 94a6ab812..4919eb398 100644
--- a/app/javascript/dashboard/i18n/locale/ro/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ro/inboxMgmt.json
@@ -308,6 +308,7 @@
"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!",
@@ -317,7 +318,8 @@
"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"
+ "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": "Nu am reușit să salvăm canalul WhatsApp"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "Support your customers on WhatsApp"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "E-mail",
"DESCRIPTION": "Connect with Gmail, Outlook, or other providers"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Configurarea botului",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT",
- "VOICE": "Voice"
+ "VOICE": "Voice",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Actualizarea setărilor formularului pre-chat"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/ro/integrations.json b/app/javascript/dashboard/i18n/locale/ro/integrations.json
index c1426486d..c74eddd30 100644
--- a/app/javascript/dashboard/i18n/locale/ro/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ro/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Persoană de contact creată",
"CONTACT_UPDATED": "Persoană de contact actualizată",
"CONVERSATION_TYPING_ON": "Conversation Typing On",
- "CONVERSATION_TYPING_OFF": "Conversation Typing Off"
+ "CONVERSATION_TYPING_OFF": "Conversation Typing Off",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/ru/bulkActions.json b/app/javascript/dashboard/i18n/locale/ru/bulkActions.json
index da44dc3a0..cf105278c 100644
--- a/app/javascript/dashboard/i18n/locale/ru/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/ru/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} бесед выбрано",
- "AGENT_SELECT_LABEL": "Выбрать агента",
- "ASSIGN_CONFIRMATION_LABEL": "Вы уверены, что хотите назначить {conversationCount} {conversationLabel}",
- "UNASSIGN_CONFIRMATION_LABEL": "Вы уверены, что хотите отменить назначение {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Вернуться",
- "ASSIGN_LABEL": "Назначить",
"NONE": "Ничего",
"CLEAR_SELECTION": "Сбросить",
"ASSIGN_AGENT_CONFIRMATION_LABEL": "Вы уверены, что вы хотите назначить разговор {n} для {agentName}? | Вы уверены, что хотите назначить {n} разговоры {agentName}?",
@@ -20,7 +15,6 @@
"RESOLVE_SUCCESFUL": "Беседы успешно завершены.",
"RESOLVE_FAILED": "Не удалось завершить диалоги, попробуйте еще раз.",
"ALL_CONVERSATIONS_SELECTED_ALERT": "Выбраны только беседы, видимые на этой странице.",
- "AGENT_LIST_LOADING": "Загрузка агентов",
"UPDATE": {
"CHANGE_STATUS": "Изменить статус",
"SNOOZE_UNTIL": "Отложено",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Назначить метки",
- "NO_LABELS_FOUND": "Метки не найдены",
+ "REMOVE_LABELS": "Remove labels",
"ASSIGN_SELECTED_LABELS": "Назначить выбранные метки",
+ "REMOVE_SELECTED_LABELS": "Remove selected labels",
"ASSIGN_SUCCESFUL": "Метки успешно назначены.",
- "ASSIGN_FAILED": "Не удалось назначить метки, пожалуйста, попробуйте снова."
+ "ASSIGN_FAILED": "Не удалось назначить метки, пожалуйста, попробуйте снова.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Выберите команду",
"NONE": "Ничего",
- "NO_TEAMS_AVAILABLE": "Нет команд, добавленных в этот аккаунт.",
- "ASSIGN_SELECTED_TEAMS": "Назначить выбранную команду.",
"ASSIGN_TEAM_CONFIRMATION_LABEL": "Вы уверены, что вы хотите назначить разговор {n} для {teamName}? | Вы уверены, что хотите назначить {n} разговоры {teamName}?",
"UNASSIGN_TEAM_CONFIRMATION_LABEL": "Вы уверены, что хотите отменить назначение разговора {n}? | Вы уверены, что хотите отменить назначение разговоров {n}?",
"ASSIGN_SUCCESFUL": "Команды успешно назначены.",
diff --git a/app/javascript/dashboard/i18n/locale/ru/campaign.json b/app/javascript/dashboard/i18n/locale/ru/campaign.json
index 68671933d..4d76c5abc 100644
--- a/app/javascript/dashboard/i18n/locale/ru/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/ru/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Обрабатывается",
"COMPLETED": "Выполнено",
"SCHEDULED": "Запланировано"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Обрабатывается",
"COMPLETED": "Выполнено",
"SCHEDULED": "Запланировано"
},
diff --git a/app/javascript/dashboard/i18n/locale/ru/components.json b/app/javascript/dashboard/i18n/locale/ru/components.json
index e6970f6ba..398276901 100644
--- a/app/javascript/dashboard/i18n/locale/ru/components.json
+++ b/app/javascript/dashboard/i18n/locale/ru/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ru/contact.json b/app/javascript/dashboard/i18n/locale/ru/contact.json
index 10c51cf98..49645ea4b 100644
--- a/app/javascript/dashboard/i18n/locale/ru/contact.json
+++ b/app/javascript/dashboard/i18n/locale/ru/contact.json
@@ -20,6 +20,8 @@
"CALL": "Вызов",
"CALL_INITIATED": "Вызов контакта…",
"CALL_FAILED": "Не удалось начать вызов. Повторите попытку.",
+ "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": "Выберите голосовую почту"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "Назначить метки",
+ "REMOVE_LABELS": "Remove Labels",
"ASSIGN_LABELS_SUCCESS": "Метки успешно назначены.",
"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}",
diff --git a/app/javascript/dashboard/i18n/locale/ru/conversation.json b/app/javascript/dashboard/i18n/locale/ru/conversation.json
index 88faa9870..a868b746d 100644
--- a/app/javascript/dashboard/i18n/locale/ru/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ru/conversation.json
@@ -62,6 +62,7 @@
"UNSUPPORTED_MESSAGE_FACEBOOK": "Это сообщение не поддерживается. Вы можете просмотреть это сообщение в приложении Facebook Messenger.",
"UNSUPPORTED_MESSAGE_INSTAGRAM": "Это сообщение не поддерживается. Вы можете просмотреть это сообщение в приложении Instagram.",
"UNSUPPORTED_MESSAGE_TIKTOK": "Это сообщение не поддерживается. Вы можете просмотреть это сообщение в приложении TikTok.",
+ "UNSUPPORTED_MESSAGE_WHATSAPP": "This message is unsupported. You can view this message on the WhatsApp app.",
"SUCCESS_DELETE_MESSAGE": "Сообщение успешно удалено",
"FAIL_DELETE_MESSSAGE": "Не удалось удалить сообщение! Попробуйте еще раз",
"NO_RESPONSE": "Нет ответа",
@@ -79,13 +80,22 @@
"OUTGOING_CALL": "Исходящий звонок",
"CALL_IN_PROGRESS": "Идёт звонок",
"NO_ANSWER": "Нет ответа",
+ "NO_ANSWER_OUTBOUND_LABEL": "Нет ответа",
+ "NO_ANSWER_OUTBOUND_SUBTEXT": "Контакт не взял трубку",
"MISSED_CALL": "Пропущенный звонок",
+ "MISSED_CALL_INBOUND_SUBTEXT": "Агенты не взяли трубку",
+ "MISSED_CALL_DECLINED_BY": "Агент {agentName} отменил звонок",
"CALL_ENDED": "Звонок завершен",
+ "HANDLED_BY": "Handled by {agentName}",
"NOT_ANSWERED_YET": "Пока нет ответа",
+ "CALLING": "Звонок…",
"THEY_ANSWERED": "Они ответили",
"YOU_ANSWERED": "Вы ответили",
"AGENT_ANSWERED": "{agentName} ответил",
- "JOIN_CALL": "Присоединиться к звонку"
+ "JOIN_CALL": "Присоединиться к звонку",
+ "CALL_BACK": "Перезвонить",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Показать меньше"
},
"HEADER": {
"RESOLVE_ACTION": "Завершить",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "Отложено до завтра",
"SNOOZED_UNTIL_NEXT_WEEK": "Отложено до следующей недели",
"SNOOZED_UNTIL_NEXT_REPLY": "Отложить до следующего ответа",
+ "WHATSAPP_CALL": "Начать звонок WhatsApp",
+ "WHATSAPP_CALL_FAILED": "Не удалось начать вызов Whatsapp.",
+ "VOICE_CALL": "Начать звонок",
+ "VOICE_CALL_FAILED": "Не получается начать звонок.",
+ "WHATSAPP_CALL_PERMISSION_REQUESTED": "Запросите разрешение на звонок у контакта. Попробуйте снова после получения разрешения.",
+ "WHATSAPP_CALL_PERMISSION_PENDING": "Запросите разрешение на звонок у контакта. Попробуйте снова после получения разрешения.",
"SLA_STATUS": {
"FRT": "FRT {status}",
"NRT": "NRT {status}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "Записать аудио",
"TIP_AUDIORECORDER_PERMISSION": "Разрешить доступ к аудио",
"TIP_AUDIORECORDER_ERROR": "Не удалось открыть аудио",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "Перетащите сюда, чтобы прикрепить",
"START_AUDIO_RECORDING": "Начать запись аудио",
"STOP_AUDIO_RECORDING": "Остановить запись аудио",
@@ -299,8 +316,13 @@
"NOT_ANSWERED_YET": "Пока нет ответа",
"HANDLED_IN_ANOTHER_TAB": "Обрабатывается в другой вкладке",
"REJECT_CALL": "Отклонить",
+ "DISMISS_CALL": "Отклонить",
"JOIN_CALL": "Присоединиться к звонку",
- "END_CALL": "Завершить звонок"
+ "END_CALL": "Завершить звонок",
+ "MUTE": "Выключить микрофон",
+ "UNMUTE": "Включить микрофон",
+ "VIEW_CHAT_HISTORY": "Посмотреть историю чата",
+ "GO_TO_CONVERSATION": "Go to conversation thread"
}
},
"EMAIL_TRANSCRIPT": {
diff --git a/app/javascript/dashboard/i18n/locale/ru/helpCenter.json b/app/javascript/dashboard/i18n/locale/ru/helpCenter.json
index 34fffd4a7..25f82d516 100644
--- a/app/javascript/dashboard/i18n/locale/ru/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/ru/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Черновик",
"ARCHIVE": "Архив",
"TRANSLATE": "Перевести",
+ "MOVE_TO_CATEGORY": "Категория",
"DELETE": "Удалить",
"STATUS_SUCCESS": "Статьи успешно обновлены",
"STATUS_ERROR": "Ошибка обновления статей",
+ "CATEGORY_SUCCESS": "Articles moved successfully",
+ "CATEGORY_ERROR": "Failed to move articles",
"DELETE_CONFIRM_TITLE": "Удаление статьи | Удалить статьи {count}",
"DELETE_CONFIRM_DESCRIPTION": "Это действие будет окончательно удалено выбранной статьи. Это действие не может быть отменено. | Это действие будет окончательно удалено {count} выбранных статей. Это действие нельзя отменить.",
"DELETE_CONFIRM": "Удалить",
@@ -866,6 +869,28 @@
},
"EDIT_CONFIGURATION": "Изменить конфигурацию"
},
+ "LAYOUT_CONTENT": {
+ "HEADER": "Образец",
+ "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": "Удалить"
+ },
+ "SAVE": "Сохранить изменения"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Портал создан успешно",
diff --git a/app/javascript/dashboard/i18n/locale/ru/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ru/inboxMgmt.json
index 2aede55ea..0f10f4684 100644
--- a/app/javascript/dashboard/i18n/locale/ru/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ru/inboxMgmt.json
@@ -308,6 +308,7 @@
"AUTH_PROCESSING": "Аутентификация с помощью Meta",
"WAITING_FOR_BUSINESS_INFO": "Пожалуйста, завершите настройку бизнеса в окне Meta...",
"PROCESSING": "Настройте свой WhatsApp Business аккаунт",
+ "ENABLING_CALLING": "Enabling WhatsApp Calling on your number…",
"LOADING_SDK": "Загрузка Facebook SDK...",
"CANCELLED": "Регистрация WhatsApp была отменена",
"SUCCESS_TITLE": "Аккаунт WhatsApp Business был подключен!",
@@ -317,7 +318,8 @@
"AUTH_NOT_COMPLETED": "Аутентификация не завершена. Пожалуйста, перезапустите процесс.",
"SUCCESS_FALLBACK": "Аккаунт WhatsApp Business был успешно настроен",
"MANUAL_FALLBACK": "Если ваш номер уже подключен к WhatsApp Business Platform (API), или, если вы используете технологический провайдер, используйте ссылку {link} ",
- "MANUAL_LINK_TEXT": "для ручной настройки"
+ "MANUAL_LINK_TEXT": "для ручной настройки",
+ "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": "Не удалось сохранить канал WhatsApp"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "Поддержка ваших клиентов через WhatsApp"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp звонок",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "Email",
"DESCRIPTION": "Подключить Gmail, Outlook, или других провайдеров"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Конфигурация бота",
"ACCOUNT_HEALTH": "Здоровье аккаунта",
"CSAT": "CSAT",
- "VOICE": "Голосовая связь"
+ "VOICE": "Голосовая связь",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Голосовой вызов требует учетные данные Twilio API Key. Они используются для генерации токенов для голосовых подключений агентов."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "Мы хотели бы позвонить Вам по поводу Вашего разговора."
+ }
+ },
"CHANNEL_PREFERENCES": "Настройки канала",
"WIDGET_FEATURES": "Функции виджета",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"WHATSAPP_TEMPLATES_SYNC_SUBHEADER": "Вручную синхронизируйте шаблоны сообщений из WhatsApp, чтобы обновить доступные шаблоны.",
"WHATSAPP_TEMPLATES_SYNC_BUTTON": "Синхронизировать шаблоны",
"WHATSAPP_TEMPLATES_SYNC_SUCCESS": "Синхронизация шаблонов успешно запущена. Обновление может занять несколько минут.",
+ "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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Обновить настройки формы для чата"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/ru/integrations.json b/app/javascript/dashboard/i18n/locale/ru/integrations.json
index 297b87453..c58f87d1c 100644
--- a/app/javascript/dashboard/i18n/locale/ru/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ru/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Контакт создан",
"CONTACT_UPDATED": "Контакт обновлен",
"CONVERSATION_TYPING_ON": "Печатание во время разговора включено",
- "CONVERSATION_TYPING_OFF": "Печатание во время разговора выключено"
+ "CONVERSATION_TYPING_OFF": "Печатание во время разговора выключено",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/sh/bulkActions.json b/app/javascript/dashboard/i18n/locale/sh/bulkActions.json
index 58bac30cb..35d913852 100644
--- a/app/javascript/dashboard/i18n/locale/sh/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/sh/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} conversations selected",
- "AGENT_SELECT_LABEL": "Select agent",
- "ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign {conversationCount} {conversationLabel} to",
- "UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Go back",
- "ASSIGN_LABEL": "Assign",
"NONE": "Nijedan",
"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}?",
@@ -20,7 +15,6 @@
"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.",
- "AGENT_LIST_LOADING": "Loading agents",
"UPDATE": {
"CHANGE_STATUS": "Change status",
"SNOOZE_UNTIL": "Snooze",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assign labels",
- "NO_LABELS_FOUND": "No labels found",
+ "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."
+ "ASSIGN_FAILED": "Failed to assign labels. Please try again.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Select team",
"NONE": "None",
- "NO_TEAMS_AVAILABLE": "There are no teams added to this account yet.",
- "ASSIGN_SELECTED_TEAMS": "Assign selected team.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/sh/campaign.json b/app/javascript/dashboard/i18n/locale/sh/campaign.json
index 10366e79e..78db922d1 100644
--- a/app/javascript/dashboard/i18n/locale/sh/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/sh/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/sh/components.json b/app/javascript/dashboard/i18n/locale/sh/components.json
index a75d35b08..3ee865a89 100644
--- a/app/javascript/dashboard/i18n/locale/sh/components.json
+++ b/app/javascript/dashboard/i18n/locale/sh/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/sh/contact.json b/app/javascript/dashboard/i18n/locale/sh/contact.json
index aedc7728c..79bd872b9 100644
--- a/app/javascript/dashboard/i18n/locale/sh/contact.json
+++ b/app/javascript/dashboard/i18n/locale/sh/contact.json
@@ -20,6 +20,8 @@
"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"
@@ -583,8 +585,11 @@
},
"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",
diff --git a/app/javascript/dashboard/i18n/locale/sh/conversation.json b/app/javascript/dashboard/i18n/locale/sh/conversation.json
index 3d4f2573b..0fdac9cd5 100644
--- a/app/javascript/dashboard/i18n/locale/sh/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/sh/conversation.json
@@ -62,6 +62,7 @@
"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": "Poruka uspešno obrisana",
"FAIL_DELETE_MESSSAGE": "Nije moguće obrisati poruku! Pokušajte ponovo",
"NO_RESPONSE": "Nema odgovora",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Reši",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "Odloženo do sutra",
"SNOOZED_UNTIL_NEXT_WEEK": "Odloženo do sledeće nedelje",
"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}",
@@ -215,6 +231,7 @@
"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": "Prevucite ovde za dodavanje",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
@@ -299,8 +316,13 @@
"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"
+ "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": {
diff --git a/app/javascript/dashboard/i18n/locale/sh/helpCenter.json b/app/javascript/dashboard/i18n/locale/sh/helpCenter.json
index e555aac69..2afac34aa 100644
--- a/app/javascript/dashboard/i18n/locale/sh/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/sh/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Nacrt",
"ARCHIVE": "Arhiviraj",
"TRANSLATE": "Translate",
+ "MOVE_TO_CATEGORY": "Category",
"DELETE": "Delete",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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",
@@ -866,6 +869,28 @@
},
"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": "Ukloni"
+ },
+ "SAVE": "Save changes"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Portal created successfully",
diff --git a/app/javascript/dashboard/i18n/locale/sh/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/sh/inboxMgmt.json
index c4c5cc769..bdee453dc 100644
--- a/app/javascript/dashboard/i18n/locale/sh/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/sh/inboxMgmt.json
@@ -308,6 +308,7 @@
"AUTH_PROCESSING": "Autentifikacija s Meta",
"WAITING_FOR_BUSINESS_INFO": "Molimo dovršite postavljanje poslovanja u Meta prozoru...",
"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!",
@@ -317,7 +318,8 @@
"AUTH_NOT_COMPLETED": "Autentifikacija nije dovršena. Molimo ponovno pokrenite proces.",
"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": "postupak ručne postavke"
+ "MANUAL_LINK_TEXT": "postupak ručne postavke",
+ "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"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "Support your customers on WhatsApp"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "E-pošta",
"DESCRIPTION": "Connect with Gmail, Outlook, or other providers"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Konfiguracija bota",
"ACCOUNT_HEALTH": "Zdravlje računa",
"CSAT": "CSAT",
- "VOICE": "Glas"
+ "VOICE": "Glas",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Postavke kanala",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Update Pre Chat Form Settings"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/sh/integrations.json b/app/javascript/dashboard/i18n/locale/sh/integrations.json
index d8fe9fa2f..788ef8e5a 100644
--- a/app/javascript/dashboard/i18n/locale/sh/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/sh/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Kontakt kreiran",
"CONTACT_UPDATED": "Kontakt ažuriran",
"CONVERSATION_TYPING_ON": "Tipkanje u razgovoru uključeno",
- "CONVERSATION_TYPING_OFF": "Tipkanje u razgovoru isključeno"
+ "CONVERSATION_TYPING_OFF": "Tipkanje u razgovoru isključeno",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/sk/bulkActions.json b/app/javascript/dashboard/i18n/locale/sk/bulkActions.json
index 45e2b9fc2..d181aa2fc 100644
--- a/app/javascript/dashboard/i18n/locale/sk/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/sk/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} conversations selected",
- "AGENT_SELECT_LABEL": "Vybrať agenta",
- "ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign {conversationCount} {conversationLabel} to",
- "UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Go back",
- "ASSIGN_LABEL": "Assign",
"NONE": "Žiadne",
"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}?",
@@ -20,7 +15,6 @@
"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.",
- "AGENT_LIST_LOADING": "Loading agents",
"UPDATE": {
"CHANGE_STATUS": "Change status",
"SNOOZE_UNTIL": "Snooze",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assign labels",
- "NO_LABELS_FOUND": "Žiadne označenia neboli nájdené",
+ "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."
+ "ASSIGN_FAILED": "Failed to assign labels. Please try again.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Vybrať tím",
"NONE": "Žiadne",
- "NO_TEAMS_AVAILABLE": "There are no teams added to this account yet.",
- "ASSIGN_SELECTED_TEAMS": "Assign selected team.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/sk/campaign.json b/app/javascript/dashboard/i18n/locale/sk/campaign.json
index 93742a3c6..de2ec67dd 100644
--- a/app/javascript/dashboard/i18n/locale/sk/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/sk/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/sk/components.json b/app/javascript/dashboard/i18n/locale/sk/components.json
index 1e6f15a8f..745fbcc13 100644
--- a/app/javascript/dashboard/i18n/locale/sk/components.json
+++ b/app/javascript/dashboard/i18n/locale/sk/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/sk/contact.json b/app/javascript/dashboard/i18n/locale/sk/contact.json
index d2cbf5d42..b8efbaaca 100644
--- a/app/javascript/dashboard/i18n/locale/sk/contact.json
+++ b/app/javascript/dashboard/i18n/locale/sk/contact.json
@@ -20,6 +20,8 @@
"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"
@@ -583,8 +585,11 @@
},
"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",
diff --git a/app/javascript/dashboard/i18n/locale/sk/conversation.json b/app/javascript/dashboard/i18n/locale/sk/conversation.json
index 8607defca..8010f662d 100644
--- a/app/javascript/dashboard/i18n/locale/sk/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/sk/conversation.json
@@ -62,6 +62,7 @@
"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": "Správa bola úspešne odstránená",
"FAIL_DELETE_MESSSAGE": "Správu sa nepodarilo vymazať! Skúste to znova",
"NO_RESPONSE": "Žiadna odpoveď",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Vyriešiť",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "Odložené do zajtra",
"SNOOZED_UNTIL_NEXT_WEEK": "Odložené do ďalšieho týždňa",
"SNOOZED_UNTIL_NEXT_REPLY": "Odložené do ďalšej odpovede",
+ "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}",
@@ -215,6 +231,7 @@
"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": "Potiahnite sem na pripojenie",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
@@ -299,8 +316,13 @@
"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"
+ "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": {
diff --git a/app/javascript/dashboard/i18n/locale/sk/helpCenter.json b/app/javascript/dashboard/i18n/locale/sk/helpCenter.json
index add2d5e48..b2a0d3f9b 100644
--- a/app/javascript/dashboard/i18n/locale/sk/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/sk/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Draft",
"ARCHIVE": "Archive",
"TRANSLATE": "Translate",
+ "MOVE_TO_CATEGORY": "Category",
"DELETE": "Vymazať",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "Vymazať",
@@ -866,6 +869,28 @@
},
"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",
diff --git a/app/javascript/dashboard/i18n/locale/sk/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/sk/inboxMgmt.json
index 6bedff0ac..9c13e2903 100644
--- a/app/javascript/dashboard/i18n/locale/sk/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/sk/inboxMgmt.json
@@ -308,6 +308,7 @@
"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!",
@@ -317,7 +318,8 @@
"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"
+ "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"
@@ -465,6 +467,10 @@
"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"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Bot Configuration",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT",
- "VOICE": "Voice"
+ "VOICE": "Voice",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Update Pre Chat Form Settings"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/sk/integrations.json b/app/javascript/dashboard/i18n/locale/sk/integrations.json
index 20e07960d..23f8b1acf 100644
--- a/app/javascript/dashboard/i18n/locale/sk/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/sk/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Contact created",
"CONTACT_UPDATED": "Contact updated",
"CONVERSATION_TYPING_ON": "Conversation Typing On",
- "CONVERSATION_TYPING_OFF": "Conversation Typing Off"
+ "CONVERSATION_TYPING_OFF": "Conversation Typing Off",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/sl/bulkActions.json b/app/javascript/dashboard/i18n/locale/sl/bulkActions.json
index 2472a9288..6b922bc7b 100644
--- a/app/javascript/dashboard/i18n/locale/sl/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/sl/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} conversations selected",
- "AGENT_SELECT_LABEL": "Select agent",
- "ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign {conversationCount} {conversationLabel} to",
- "UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Go back",
- "ASSIGN_LABEL": "Assign",
"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}?",
@@ -20,7 +15,6 @@
"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.",
- "AGENT_LIST_LOADING": "Loading agents",
"UPDATE": {
"CHANGE_STATUS": "Change status",
"SNOOZE_UNTIL": "Snooze",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assign labels",
- "NO_LABELS_FOUND": "No labels found",
+ "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."
+ "ASSIGN_FAILED": "Failed to assign labels. Please try again.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Select team",
"NONE": "None",
- "NO_TEAMS_AVAILABLE": "There are no teams added to this account yet.",
- "ASSIGN_SELECTED_TEAMS": "Assign selected team.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/sl/campaign.json b/app/javascript/dashboard/i18n/locale/sl/campaign.json
index 3c1294a86..cc14ec839 100644
--- a/app/javascript/dashboard/i18n/locale/sl/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/sl/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Obdelava",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Obdelava",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/sl/components.json b/app/javascript/dashboard/i18n/locale/sl/components.json
index e330bd328..3f07c73f5 100644
--- a/app/javascript/dashboard/i18n/locale/sl/components.json
+++ b/app/javascript/dashboard/i18n/locale/sl/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/sl/contact.json b/app/javascript/dashboard/i18n/locale/sl/contact.json
index 63b9a388a..268130bc3 100644
--- a/app/javascript/dashboard/i18n/locale/sl/contact.json
+++ b/app/javascript/dashboard/i18n/locale/sl/contact.json
@@ -20,6 +20,8 @@
"CALL": "Pokliči",
"CALL_INITIATED": "Calling the contact…",
"CALL_FAILED": "Klica ni bilo mogoče začeti. Poskusite znova.",
+ "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": "Izberi glasovni predal"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "Dodeli oznake",
+ "REMOVE_LABELS": "Remove Labels",
"ASSIGN_LABELS_SUCCESS": "Oznake so bile uspešno dodeljene.",
"ASSIGN_LABELS_FAILED": "Dodeljevanje oznak ni uspelo",
+ "REMOVE_LABELS_SUCCESS": "Labels removed successfully.",
+ "REMOVE_LABELS_FAILED": "Failed to remove labels",
"DESCRIPTION": "Izberite oznake, ki jih želite dodati izbranim stikom.",
"NO_LABELS_FOUND": "Še ni na voljo nobenih oznak.",
"SELECTED_COUNT": "{count} izbranih",
diff --git a/app/javascript/dashboard/i18n/locale/sl/conversation.json b/app/javascript/dashboard/i18n/locale/sl/conversation.json
index 31c410270..ee8ab9116 100644
--- a/app/javascript/dashboard/i18n/locale/sl/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/sl/conversation.json
@@ -62,6 +62,7 @@
"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",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Resolve",
@@ -100,6 +110,12 @@
"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}",
@@ -215,6 +231,7 @@
"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",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
@@ -299,8 +316,13 @@
"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"
+ "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": {
diff --git a/app/javascript/dashboard/i18n/locale/sl/helpCenter.json b/app/javascript/dashboard/i18n/locale/sl/helpCenter.json
index b32e9e99d..61e1b5ba2 100644
--- a/app/javascript/dashboard/i18n/locale/sl/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/sl/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Osnutek",
"ARCHIVE": "Arhiviraj",
"TRANSLATE": "Translate",
+ "MOVE_TO_CATEGORY": "Kategorija",
"DELETE": "Delete",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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",
@@ -866,6 +869,28 @@
},
"EDIT_CONFIGURATION": "Uredi konfiguracijo"
},
+ "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": "Odstrani"
+ },
+ "SAVE": "Shrani spremembe"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Portal je bil uspešno ustvarjen",
diff --git a/app/javascript/dashboard/i18n/locale/sl/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/sl/inboxMgmt.json
index 4285f543d..9b5579c29 100644
--- a/app/javascript/dashboard/i18n/locale/sl/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/sl/inboxMgmt.json
@@ -308,6 +308,7 @@
"AUTH_PROCESSING": "Avtorizacija pri Meta",
"WAITING_FOR_BUSINESS_INFO": "Please complete business setup in the Meta window...",
"PROCESSING": "Nastavljam vaš WhatsApp poslovni račun",
+ "ENABLING_CALLING": "Enabling WhatsApp Calling on your number…",
"LOADING_SDK": "Loading Facebook SDK...",
"CANCELLED": "Registracija WhatsApp je bila preklicana",
"SUCCESS_TITLE": "Poslovni račun WhatsApp je povezan!",
@@ -317,7 +318,8 @@
"AUTH_NOT_COMPLETED": "Authentication not completed. Please restart the process.",
"SUCCESS_FALLBACK": "WhatsApp Business Account has been successfully configured",
"MANUAL_FALLBACK": "Če je vaša številka že povezana s platformo WhatsApp Business (API), ali če ste tehnični ponudnik, ki vključuje svojo številko, uporabite {link} postopek",
- "MANUAL_LINK_TEXT": "ročni postopek nastavitve"
+ "MANUAL_LINK_TEXT": "ročni postopek nastavitve",
+ "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": "Nismo mogli shraniti WhatsApp kanala"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "Podprite svoje stranke na WhatsAppu"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "E-pošta",
"DESCRIPTION": "Connect with Gmail, Outlook, or other providers"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Bot Configuration",
"ACCOUNT_HEALTH": "Zdravje računa",
"CSAT": "CSAT",
- "VOICE": "Glas"
+ "VOICE": "Glas",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Nastavitve kanala",
"WIDGET_FEATURES": "Funkcije pripomočka",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"WHATSAPP_TEMPLATES_SYNC_SUBHEADER": "Ročno sinhronizirajte predloge sporočil iz WhatsApp, da posodobite razpoložljive predloge.",
"WHATSAPP_TEMPLATES_SYNC_BUTTON": "Sinhroniziraj predloge",
"WHATSAPP_TEMPLATES_SYNC_SUCCESS": "Sinhronizacija predlog uspešno začeta. Posodobitev lahko traja nekaj minut.",
+ "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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Posodobi nastavitve obrazca pred klepetom"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/sl/integrations.json b/app/javascript/dashboard/i18n/locale/sl/integrations.json
index 5f43707c2..245860920 100644
--- a/app/javascript/dashboard/i18n/locale/sl/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/sl/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Kontakt ustvarjen",
"CONTACT_UPDATED": "Kontakt posodobljen",
"CONVERSATION_TYPING_ON": "Conversation Typing On",
- "CONVERSATION_TYPING_OFF": "Conversation Typing Off"
+ "CONVERSATION_TYPING_OFF": "Conversation Typing Off",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/sq/bulkActions.json b/app/javascript/dashboard/i18n/locale/sq/bulkActions.json
index 2472a9288..6b922bc7b 100644
--- a/app/javascript/dashboard/i18n/locale/sq/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/sq/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} conversations selected",
- "AGENT_SELECT_LABEL": "Select agent",
- "ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign {conversationCount} {conversationLabel} to",
- "UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Go back",
- "ASSIGN_LABEL": "Assign",
"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}?",
@@ -20,7 +15,6 @@
"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.",
- "AGENT_LIST_LOADING": "Loading agents",
"UPDATE": {
"CHANGE_STATUS": "Change status",
"SNOOZE_UNTIL": "Snooze",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assign labels",
- "NO_LABELS_FOUND": "No labels found",
+ "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."
+ "ASSIGN_FAILED": "Failed to assign labels. Please try again.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Select team",
"NONE": "None",
- "NO_TEAMS_AVAILABLE": "There are no teams added to this account yet.",
- "ASSIGN_SELECTED_TEAMS": "Assign selected team.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/sq/campaign.json b/app/javascript/dashboard/i18n/locale/sq/campaign.json
index d4785a15e..f975f37a3 100644
--- a/app/javascript/dashboard/i18n/locale/sq/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/sq/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Në përpunim",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Në përpunim",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/sq/components.json b/app/javascript/dashboard/i18n/locale/sq/components.json
index 2ca971a95..e34fb408a 100644
--- a/app/javascript/dashboard/i18n/locale/sq/components.json
+++ b/app/javascript/dashboard/i18n/locale/sq/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/sq/contact.json b/app/javascript/dashboard/i18n/locale/sq/contact.json
index 97ca50b75..521d69672 100644
--- a/app/javascript/dashboard/i18n/locale/sq/contact.json
+++ b/app/javascript/dashboard/i18n/locale/sq/contact.json
@@ -20,6 +20,8 @@
"CALL": "Telefono",
"CALL_INITIATED": "Duke thirrur kontaktin…",
"CALL_FAILED": "Nuk mund të fillohet thirrja. Ju lutemi provoni përsëri.",
+ "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": "Zgjidhni një inbox të zërit"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "Cakto Etiketa",
+ "REMOVE_LABELS": "Remove Labels",
"ASSIGN_LABELS_SUCCESS": "Etiketat u caktuan me sukses.",
"ASSIGN_LABELS_FAILED": "Dështoi caktimi i etiketave",
+ "REMOVE_LABELS_SUCCESS": "Labels removed successfully.",
+ "REMOVE_LABELS_FAILED": "Failed to remove labels",
"DESCRIPTION": "Zgjidhni etiketat që dëshironi të shtoni te kontaktet e zgjedhura.",
"NO_LABELS_FOUND": "Nuk ka etiketa të disponueshme ende.",
"SELECTED_COUNT": "{count} i/e zgjedhur",
diff --git a/app/javascript/dashboard/i18n/locale/sq/conversation.json b/app/javascript/dashboard/i18n/locale/sq/conversation.json
index 8c9d27da0..593b6413b 100644
--- a/app/javascript/dashboard/i18n/locale/sq/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/sq/conversation.json
@@ -62,6 +62,7 @@
"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",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Zgjidh",
@@ -100,6 +110,12 @@
"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}",
@@ -215,6 +231,7 @@
"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",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
@@ -299,8 +316,13 @@
"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"
+ "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": {
diff --git a/app/javascript/dashboard/i18n/locale/sq/helpCenter.json b/app/javascript/dashboard/i18n/locale/sq/helpCenter.json
index 28dc8b141..507ee7945 100644
--- a/app/javascript/dashboard/i18n/locale/sq/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/sq/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Draft",
"ARCHIVE": "Arkivo",
"TRANSLATE": "Translate",
+ "MOVE_TO_CATEGORY": "Category",
"DELETE": "Delete",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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",
@@ -866,6 +869,28 @@
},
"EDIT_CONFIGURATION": "Ndrysho konfigurimin"
},
+ "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": "Hiq"
+ },
+ "SAVE": "Ruaj ndryshimet"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Portali u krijua me sukses",
diff --git a/app/javascript/dashboard/i18n/locale/sq/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/sq/inboxMgmt.json
index d460526c3..d28896636 100644
--- a/app/javascript/dashboard/i18n/locale/sq/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/sq/inboxMgmt.json
@@ -308,6 +308,7 @@
"AUTH_PROCESSING": "Authenticating with Meta",
"WAITING_FOR_BUSINESS_INFO": "Ju lutem përfundoni konfigurimin e biznesit në dritaren Meta...",
"PROCESSING": "Po konfigurohet llogaria juaj e biznesit në WhatsApp",
+ "ENABLING_CALLING": "Enabling WhatsApp Calling on your number…",
"LOADING_SDK": "Loading Facebook SDK...",
"CANCELLED": "WhatsApp Signup was cancelled",
"SUCCESS_TITLE": "WhatsApp Business Account Connected!",
@@ -317,7 +318,8 @@
"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": "procesi i konfigurimit manual"
+ "MANUAL_LINK_TEXT": "procesi i konfigurimit manual",
+ "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"
@@ -465,6 +467,10 @@
"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"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Konfigurimi i Botit",
"ACCOUNT_HEALTH": "Shëndeti i Llogarisë",
"CSAT": "CSAT",
- "VOICE": "Zë"
+ "VOICE": "Zë",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Preferencat e kanalit",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"WHATSAPP_TEMPLATES_SYNC_SUBHEADER": "Manually sync message templates from WhatsApp to update your available templates.",
"WHATSAPP_TEMPLATES_SYNC_BUTTON": "Sinkronizo shabllonet",
"WHATSAPP_TEMPLATES_SYNC_SUCCESS": "Sinkronizimi i modeleve u nis me sukses. Mund të duhen disa minuta për t'u përditësuar.",
+ "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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Përditëso Cilësimet e Formularit Para Bisedës"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/sq/integrations.json b/app/javascript/dashboard/i18n/locale/sq/integrations.json
index 0140c428b..21eac5300 100644
--- a/app/javascript/dashboard/i18n/locale/sq/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/sq/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Kontakti u krijua",
"CONTACT_UPDATED": "Kontakti u përditësua",
"CONVERSATION_TYPING_ON": "Shkrimi në bisedë aktiv",
- "CONVERSATION_TYPING_OFF": "Shkrimi në bisedë i çaktivizuar"
+ "CONVERSATION_TYPING_OFF": "Shkrimi në bisedë i çaktivizuar",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/sr/bulkActions.json b/app/javascript/dashboard/i18n/locale/sr/bulkActions.json
index 216988dd9..2d07d490f 100644
--- a/app/javascript/dashboard/i18n/locale/sr/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/sr/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} razgovora je izabrano",
- "AGENT_SELECT_LABEL": "Izaberite agenta",
- "ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign {conversationCount} {conversationLabel} to",
- "UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Povratak",
- "ASSIGN_LABEL": "Dodeli",
"NONE": "Niko",
"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}?",
@@ -20,7 +15,6 @@
"RESOLVE_SUCCESFUL": "Razgovor je uspešno rešen.",
"RESOLVE_FAILED": "Failed to resolve conversations. Please try again.",
"ALL_CONVERSATIONS_SELECTED_ALERT": "Jedino razgovori na ovoj stranici su izabrani.",
- "AGENT_LIST_LOADING": "Učitavanje agenata",
"UPDATE": {
"CHANGE_STATUS": "Promeni status",
"SNOOZE_UNTIL": "Odloži",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assign labels",
- "NO_LABELS_FOUND": "Oznake nisu pronađene",
+ "REMOVE_LABELS": "Remove labels",
"ASSIGN_SELECTED_LABELS": "Dodeli izabrane oznake",
+ "REMOVE_SELECTED_LABELS": "Remove selected labels",
"ASSIGN_SUCCESFUL": "Oznake su uspešno dodeljene.",
- "ASSIGN_FAILED": "Failed to assign labels. Please try again."
+ "ASSIGN_FAILED": "Failed to assign labels. Please try again.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Izaberite tim",
"NONE": "Niko",
- "NO_TEAMS_AVAILABLE": "There are no teams added to this account yet.",
- "ASSIGN_SELECTED_TEAMS": "Assign selected team.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/sr/campaign.json b/app/javascript/dashboard/i18n/locale/sr/campaign.json
index 29771b645..f54200b25 100644
--- a/app/javascript/dashboard/i18n/locale/sr/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/sr/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Završeno",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Završeno",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/sr/components.json b/app/javascript/dashboard/i18n/locale/sr/components.json
index 9d0c49978..e56bc100d 100644
--- a/app/javascript/dashboard/i18n/locale/sr/components.json
+++ b/app/javascript/dashboard/i18n/locale/sr/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/sr/contact.json b/app/javascript/dashboard/i18n/locale/sr/contact.json
index c07b3d008..734ee43a3 100644
--- a/app/javascript/dashboard/i18n/locale/sr/contact.json
+++ b/app/javascript/dashboard/i18n/locale/sr/contact.json
@@ -20,6 +20,8 @@
"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"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "Dodeli oznake",
+ "REMOVE_LABELS": "Remove Labels",
"ASSIGN_LABELS_SUCCESS": "Oznake su uspešno dodeljene.",
"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",
diff --git a/app/javascript/dashboard/i18n/locale/sr/conversation.json b/app/javascript/dashboard/i18n/locale/sr/conversation.json
index 571b96db3..c1e8dc3b5 100644
--- a/app/javascript/dashboard/i18n/locale/sr/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/sr/conversation.json
@@ -62,6 +62,7 @@
"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": "Poruka je uspešno obrisana",
"FAIL_DELETE_MESSSAGE": "Nije bilo moguće obrisati poruku! Pokušajte ponovo",
"NO_RESPONSE": "Nema odgovora",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Reši",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "Odloženo do sutra",
"SNOOZED_UNTIL_NEXT_WEEK": "Odloženo do sledeće nedelje",
"SNOOZED_UNTIL_NEXT_REPLY": "Odloženo do sledećeg odgovora",
+ "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}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "Snimi zvuk",
"TIP_AUDIORECORDER_PERMISSION": "Dozvoli pristup zvuku",
"TIP_AUDIORECORDER_ERROR": "Nije moguće pristupiti zvuku",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "Prevuci i pusti za dodavanje",
"START_AUDIO_RECORDING": "Pokreni snimanje zvuka",
"STOP_AUDIO_RECORDING": "Zaustavi snimanje zvuka",
@@ -299,8 +316,13 @@
"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"
+ "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": {
diff --git a/app/javascript/dashboard/i18n/locale/sr/helpCenter.json b/app/javascript/dashboard/i18n/locale/sr/helpCenter.json
index ccedf07f6..698732737 100644
--- a/app/javascript/dashboard/i18n/locale/sr/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/sr/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Nacrt",
"ARCHIVE": "Archive",
"TRANSLATE": "Prevedi",
+ "MOVE_TO_CATEGORY": "Kategorija",
"DELETE": "Izbriši",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "Izbriši",
@@ -866,6 +869,28 @@
},
"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": "Ukloni"
+ },
+ "SAVE": "Save changes"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Portal je uspešno napravljen",
diff --git a/app/javascript/dashboard/i18n/locale/sr/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/sr/inboxMgmt.json
index a237f2498..b0e2bb5b3 100644
--- a/app/javascript/dashboard/i18n/locale/sr/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/sr/inboxMgmt.json
@@ -308,6 +308,7 @@
"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!",
@@ -317,7 +318,8 @@
"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"
+ "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": "Nisamo uspeli da sačuvamo WhatsApp kanal"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "Support your customers on WhatsApp"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "E-pošta",
"DESCRIPTION": "Connect with Gmail, Outlook, or other providers"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Bot Configuration",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "Izveštaj o zadovoljstvu",
- "VOICE": "Voice"
+ "VOICE": "Voice",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Update Pre Chat Form Settings"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/sr/integrations.json b/app/javascript/dashboard/i18n/locale/sr/integrations.json
index 657873708..e6008c006 100644
--- a/app/javascript/dashboard/i18n/locale/sr/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/sr/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Contact created",
"CONTACT_UPDATED": "Contact updated",
"CONVERSATION_TYPING_ON": "Conversation Typing On",
- "CONVERSATION_TYPING_OFF": "Conversation Typing Off"
+ "CONVERSATION_TYPING_OFF": "Conversation Typing Off",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/sv/bulkActions.json b/app/javascript/dashboard/i18n/locale/sv/bulkActions.json
index 96331b821..871c0b15b 100644
--- a/app/javascript/dashboard/i18n/locale/sv/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/sv/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} conversations selected",
- "AGENT_SELECT_LABEL": "Välj agent",
- "ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign {conversationCount} {conversationLabel} to",
- "UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Go back",
- "ASSIGN_LABEL": "Tilldela",
"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}?",
@@ -20,7 +15,6 @@
"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.",
- "AGENT_LIST_LOADING": "Laddar agenter",
"UPDATE": {
"CHANGE_STATUS": "Change status",
"SNOOZE_UNTIL": "Snooza",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assign labels",
- "NO_LABELS_FOUND": "Inga etiketter hittades",
+ "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."
+ "ASSIGN_FAILED": "Failed to assign labels. Please try again.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Välj team",
"NONE": "Inget",
- "NO_TEAMS_AVAILABLE": "There are no teams added to this account yet.",
- "ASSIGN_SELECTED_TEAMS": "Assign selected team.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/sv/campaign.json b/app/javascript/dashboard/i18n/locale/sv/campaign.json
index aee8889d3..6fa6f7da1 100644
--- a/app/javascript/dashboard/i18n/locale/sv/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/sv/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/sv/components.json b/app/javascript/dashboard/i18n/locale/sv/components.json
index b39180a8c..3b1812c65 100644
--- a/app/javascript/dashboard/i18n/locale/sv/components.json
+++ b/app/javascript/dashboard/i18n/locale/sv/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/sv/contact.json b/app/javascript/dashboard/i18n/locale/sv/contact.json
index 99e96c3ca..0479bb741 100644
--- a/app/javascript/dashboard/i18n/locale/sv/contact.json
+++ b/app/javascript/dashboard/i18n/locale/sv/contact.json
@@ -20,6 +20,8 @@
"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"
@@ -583,8 +585,11 @@
},
"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",
diff --git a/app/javascript/dashboard/i18n/locale/sv/conversation.json b/app/javascript/dashboard/i18n/locale/sv/conversation.json
index ff9b46845..479b23707 100644
--- a/app/javascript/dashboard/i18n/locale/sv/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/sv/conversation.json
@@ -62,6 +62,7 @@
"UNSUPPORTED_MESSAGE_FACEBOOK": "Detta meddelande stöds inte. Du kan se detta meddelande på Facebook Messenger-appen.",
"UNSUPPORTED_MESSAGE_INSTAGRAM": "Detta meddelande stöds inte. Du kan se detta meddelande på Instagram-appen.",
"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": "Meddelandet har tagits bort",
"FAIL_DELETE_MESSSAGE": "Det gick inte att ta bort meddelande! Försök igen",
"NO_RESPONSE": "Inget svar",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Lös",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "Snoozad till imorgon",
"SNOOZED_UNTIL_NEXT_WEEK": "Snoozad till nästa vecka",
"SNOOZED_UNTIL_NEXT_REPLY": "Snoozad till nästa svar",
+ "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}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "Spela in ljud",
"TIP_AUDIORECORDER_PERMISSION": "Tillåt åtkomst till ljud",
"TIP_AUDIORECORDER_ERROR": "Kunde inte öppna ljudet",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "Dra och släpp hit för att bifoga",
"START_AUDIO_RECORDING": "Starta ljudinspelning",
"STOP_AUDIO_RECORDING": "Stop audio recording",
@@ -299,8 +316,13 @@
"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"
+ "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": {
diff --git a/app/javascript/dashboard/i18n/locale/sv/helpCenter.json b/app/javascript/dashboard/i18n/locale/sv/helpCenter.json
index ff65f5e76..cd66d0342 100644
--- a/app/javascript/dashboard/i18n/locale/sv/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/sv/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Draft",
"ARCHIVE": "Archive",
"TRANSLATE": "Translate",
+ "MOVE_TO_CATEGORY": "Category",
"DELETE": "Radera",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "Radera",
@@ -866,6 +869,28 @@
},
"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": "Radera"
+ },
+ "SAVE": "Save changes"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Portal created successfully",
diff --git a/app/javascript/dashboard/i18n/locale/sv/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/sv/inboxMgmt.json
index 141d0840d..c14066d02 100644
--- a/app/javascript/dashboard/i18n/locale/sv/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/sv/inboxMgmt.json
@@ -308,6 +308,7 @@
"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!",
@@ -317,7 +318,8 @@
"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"
+ "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": "Vi kunde inte spara WhatsApp-kanalen"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "Support your customers on WhatsApp"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "E-post",
"DESCRIPTION": "Connect with Gmail, Outlook, or other providers"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Bot Configuration",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT",
- "VOICE": "Voice"
+ "VOICE": "Voice",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Update Pre Chat Form Settings"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/sv/integrations.json b/app/javascript/dashboard/i18n/locale/sv/integrations.json
index 7a4853244..e3043a81f 100644
--- a/app/javascript/dashboard/i18n/locale/sv/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/sv/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Contact created",
"CONTACT_UPDATED": "Contact updated",
"CONVERSATION_TYPING_ON": "Conversation Typing On",
- "CONVERSATION_TYPING_OFF": "Conversation Typing Off"
+ "CONVERSATION_TYPING_OFF": "Conversation Typing Off",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/ta/bulkActions.json b/app/javascript/dashboard/i18n/locale/ta/bulkActions.json
index cdea2cfd6..b81bb2d9f 100644
--- a/app/javascript/dashboard/i18n/locale/ta/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/ta/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} conversations selected",
- "AGENT_SELECT_LABEL": "Select agent",
- "ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign {conversationCount} {conversationLabel} to",
- "UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Go back",
- "ASSIGN_LABEL": "Assign",
"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}?",
@@ -20,7 +15,6 @@
"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.",
- "AGENT_LIST_LOADING": "Loading agents",
"UPDATE": {
"CHANGE_STATUS": "Change status",
"SNOOZE_UNTIL": "Snooze",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assign labels",
- "NO_LABELS_FOUND": "No labels found",
+ "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."
+ "ASSIGN_FAILED": "Failed to assign labels. Please try again.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Select team",
"NONE": "None",
- "NO_TEAMS_AVAILABLE": "There are no teams added to this account yet.",
- "ASSIGN_SELECTED_TEAMS": "Assign selected team.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/ta/campaign.json b/app/javascript/dashboard/i18n/locale/ta/campaign.json
index 98a6844f9..e67aced19 100644
--- a/app/javascript/dashboard/i18n/locale/ta/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/ta/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/ta/components.json b/app/javascript/dashboard/i18n/locale/ta/components.json
index 25fc68896..6cb105c26 100644
--- a/app/javascript/dashboard/i18n/locale/ta/components.json
+++ b/app/javascript/dashboard/i18n/locale/ta/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ta/contact.json b/app/javascript/dashboard/i18n/locale/ta/contact.json
index b94d18cee..2521f0c04 100644
--- a/app/javascript/dashboard/i18n/locale/ta/contact.json
+++ b/app/javascript/dashboard/i18n/locale/ta/contact.json
@@ -20,6 +20,8 @@
"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"
@@ -583,8 +585,11 @@
},
"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",
diff --git a/app/javascript/dashboard/i18n/locale/ta/conversation.json b/app/javascript/dashboard/i18n/locale/ta/conversation.json
index 1a0061fbf..43c7937d0 100644
--- a/app/javascript/dashboard/i18n/locale/ta/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ta/conversation.json
@@ -62,6 +62,7 @@
"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",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "தீர்",
@@ -100,6 +110,12 @@
"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}",
@@ -215,6 +231,7 @@
"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",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
@@ -299,8 +316,13 @@
"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"
+ "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": {
diff --git a/app/javascript/dashboard/i18n/locale/ta/helpCenter.json b/app/javascript/dashboard/i18n/locale/ta/helpCenter.json
index 825348f9f..91537b04c 100644
--- a/app/javascript/dashboard/i18n/locale/ta/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/ta/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Draft",
"ARCHIVE": "Archive",
"TRANSLATE": "Translate",
+ "MOVE_TO_CATEGORY": "Category",
"DELETE": "Delete",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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",
@@ -866,6 +869,28 @@
},
"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": "நீக்கு"
+ },
+ "SAVE": "Save changes"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Portal created successfully",
diff --git a/app/javascript/dashboard/i18n/locale/ta/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ta/inboxMgmt.json
index ee4d87f6e..c3fcf92ef 100644
--- a/app/javascript/dashboard/i18n/locale/ta/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ta/inboxMgmt.json
@@ -308,6 +308,7 @@
"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!",
@@ -317,7 +318,8 @@
"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"
+ "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": "WhatsApp சேனல் சேமிக்க முடியவில்லை"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "Support your customers on WhatsApp"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "இமெயில்",
"DESCRIPTION": "Connect with Gmail, Outlook, or other providers"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "பாட் அமைப்பு",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT",
- "VOICE": "Voice"
+ "VOICE": "Voice",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "முன் உரையாடல் படிவ அமைப்புகளை புதுப்பிக்கவும்"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/ta/integrations.json b/app/javascript/dashboard/i18n/locale/ta/integrations.json
index a5d2e5131..33909fe59 100644
--- a/app/javascript/dashboard/i18n/locale/ta/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ta/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "தொடர்பு உருவாக்கப்பட்டது",
"CONTACT_UPDATED": "தொடர்பு புதுப்பிக்கப்பட்டது",
"CONVERSATION_TYPING_ON": "உரையாடல் தட்டச்சு செய்கிறது",
- "CONVERSATION_TYPING_OFF": "உரையாடல் தட்டச்சு நிறுத்தப்பட்டது"
+ "CONVERSATION_TYPING_OFF": "உரையாடல் தட்டச்சு நிறுத்தப்பட்டது",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/th/bulkActions.json b/app/javascript/dashboard/i18n/locale/th/bulkActions.json
index 45ea549ad..b38995c02 100644
--- a/app/javascript/dashboard/i18n/locale/th/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/th/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} conversations selected",
- "AGENT_SELECT_LABEL": "เลือกพนักงาน",
- "ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign {conversationCount} {conversationLabel} to",
- "UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Go back",
- "ASSIGN_LABEL": "มอบหมาย",
"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}?",
@@ -20,7 +15,6 @@
"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.",
- "AGENT_LIST_LOADING": "Loading agents",
"UPDATE": {
"CHANGE_STATUS": "Change status",
"SNOOZE_UNTIL": "Snooze",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assign labels",
- "NO_LABELS_FOUND": "ไม่พบหัวข้อ",
+ "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."
+ "ASSIGN_FAILED": "Failed to assign labels. Please try again.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "เลือกทีม",
"NONE": "ไม่มี",
- "NO_TEAMS_AVAILABLE": "There are no teams added to this account yet.",
- "ASSIGN_SELECTED_TEAMS": "Assign selected team.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/th/campaign.json b/app/javascript/dashboard/i18n/locale/th/campaign.json
index 8f3156023..cdd373e50 100644
--- a/app/javascript/dashboard/i18n/locale/th/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/th/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "เสร็จสิ้น",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "เสร็จสิ้น",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/th/components.json b/app/javascript/dashboard/i18n/locale/th/components.json
index 56ab9c8a8..9676ff802 100644
--- a/app/javascript/dashboard/i18n/locale/th/components.json
+++ b/app/javascript/dashboard/i18n/locale/th/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/th/contact.json b/app/javascript/dashboard/i18n/locale/th/contact.json
index ddfe7705a..da9b4d480 100644
--- a/app/javascript/dashboard/i18n/locale/th/contact.json
+++ b/app/javascript/dashboard/i18n/locale/th/contact.json
@@ -20,6 +20,8 @@
"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"
@@ -583,8 +585,11 @@
},
"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",
diff --git a/app/javascript/dashboard/i18n/locale/th/conversation.json b/app/javascript/dashboard/i18n/locale/th/conversation.json
index 508b03c04..e0bb4d12e 100644
--- a/app/javascript/dashboard/i18n/locale/th/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/th/conversation.json
@@ -62,6 +62,7 @@
"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": "ลบข้อความสำเร็จเเล้ว",
"FAIL_DELETE_MESSSAGE": "ไม่สามารถลบข้อความได้ โปรดลองใหม่อีกครั้ง",
"NO_RESPONSE": "ไม่มีการตอบกลับ",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "เสร็จสิ้น",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "พักการสนทนาจนถึงพรุ่งนี้",
"SNOOZED_UNTIL_NEXT_WEEK": "พักการสนทนาจนถึงสัปดาห์หน้า",
"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}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "บันทึกเสียง",
"TIP_AUDIORECORDER_PERMISSION": "ให้สิทธิ์เข้าถึงการใช้งานเสียง",
"TIP_AUDIORECORDER_ERROR": "ไม่สามารถเปิดการใช้งานเสียงได้",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "ลากเเละปล่อยที่นี่เพื่อเพิ่ม",
"START_AUDIO_RECORDING": "เริ่มบันทึกเสียง",
"STOP_AUDIO_RECORDING": "หยุดบันทึกเสียง",
@@ -299,8 +316,13 @@
"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"
+ "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": {
diff --git a/app/javascript/dashboard/i18n/locale/th/helpCenter.json b/app/javascript/dashboard/i18n/locale/th/helpCenter.json
index 5d1004d82..2a30dd993 100644
--- a/app/javascript/dashboard/i18n/locale/th/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/th/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "โครงร่าง",
"ARCHIVE": "Archive",
"TRANSLATE": "Translate",
+ "MOVE_TO_CATEGORY": "Category",
"DELETE": "ลบ",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "ลบ",
@@ -866,6 +869,28 @@
},
"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": "ลบรูปภาพ"
+ },
+ "SAVE": "Save changes"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Portal created successfully",
diff --git a/app/javascript/dashboard/i18n/locale/th/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/th/inboxMgmt.json
index 20e77be9e..89660ba78 100644
--- a/app/javascript/dashboard/i18n/locale/th/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/th/inboxMgmt.json
@@ -308,6 +308,7 @@
"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!",
@@ -317,7 +318,8 @@
"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"
+ "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": "เราไม่สามารถบันทึกช่องทาง WhatsApp ได้"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "Support your customers on WhatsApp"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "อีเมล์",
"DESCRIPTION": "Connect with Gmail, Outlook, or other providers"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Bot Configuration",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT",
- "VOICE": "Voice"
+ "VOICE": "Voice",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Update Pre Chat Form Settings"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/th/integrations.json b/app/javascript/dashboard/i18n/locale/th/integrations.json
index 9ab2c2f21..ef4dd7a8c 100644
--- a/app/javascript/dashboard/i18n/locale/th/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/th/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Contact created",
"CONTACT_UPDATED": "Contact updated",
"CONVERSATION_TYPING_ON": "Conversation Typing On",
- "CONVERSATION_TYPING_OFF": "Conversation Typing Off"
+ "CONVERSATION_TYPING_OFF": "Conversation Typing Off",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/tl/bulkActions.json b/app/javascript/dashboard/i18n/locale/tl/bulkActions.json
index 2472a9288..6b922bc7b 100644
--- a/app/javascript/dashboard/i18n/locale/tl/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/tl/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} conversations selected",
- "AGENT_SELECT_LABEL": "Select agent",
- "ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign {conversationCount} {conversationLabel} to",
- "UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Go back",
- "ASSIGN_LABEL": "Assign",
"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}?",
@@ -20,7 +15,6 @@
"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.",
- "AGENT_LIST_LOADING": "Loading agents",
"UPDATE": {
"CHANGE_STATUS": "Change status",
"SNOOZE_UNTIL": "Snooze",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assign labels",
- "NO_LABELS_FOUND": "No labels found",
+ "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."
+ "ASSIGN_FAILED": "Failed to assign labels. Please try again.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Select team",
"NONE": "None",
- "NO_TEAMS_AVAILABLE": "There are no teams added to this account yet.",
- "ASSIGN_SELECTED_TEAMS": "Assign selected team.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/tl/campaign.json b/app/javascript/dashboard/i18n/locale/tl/campaign.json
index 10366e79e..afbc9423d 100644
--- a/app/javascript/dashboard/i18n/locale/tl/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/tl/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Pinoproseso",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Pinoproseso",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/tl/components.json b/app/javascript/dashboard/i18n/locale/tl/components.json
index a75d35b08..3ee865a89 100644
--- a/app/javascript/dashboard/i18n/locale/tl/components.json
+++ b/app/javascript/dashboard/i18n/locale/tl/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/tl/contact.json b/app/javascript/dashboard/i18n/locale/tl/contact.json
index 59d189bdb..398a1e751 100644
--- a/app/javascript/dashboard/i18n/locale/tl/contact.json
+++ b/app/javascript/dashboard/i18n/locale/tl/contact.json
@@ -20,6 +20,8 @@
"CALL": "Tawagan",
"CALL_INITIATED": "Tinutawagan ang kontak…",
"CALL_FAILED": "Hindi masimulan ang tawag. Pakisubukang muli.",
+ "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": "Pumili ng voice inbox"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "Magtalaga ng mga label",
+ "REMOVE_LABELS": "Remove Labels",
"ASSIGN_LABELS_SUCCESS": "Matagumpay na naitalaga ang mga label.",
"ASSIGN_LABELS_FAILED": "Nabigong italaga ang mga label",
+ "REMOVE_LABELS_SUCCESS": "Labels removed successfully.",
+ "REMOVE_LABELS_FAILED": "Failed to remove labels",
"DESCRIPTION": "Piliin ang mga label na nais mong idagdag sa mga napiling contact.",
"NO_LABELS_FOUND": "Walang magagamit na mga label pa.",
"SELECTED_COUNT": "{count} napili",
diff --git a/app/javascript/dashboard/i18n/locale/tl/conversation.json b/app/javascript/dashboard/i18n/locale/tl/conversation.json
index bce62180c..b8dd7852f 100644
--- a/app/javascript/dashboard/i18n/locale/tl/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/tl/conversation.json
@@ -62,6 +62,7 @@
"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": "Walang tugon",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Tapusin",
@@ -100,6 +110,12 @@
"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}",
@@ -215,6 +231,7 @@
"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",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
@@ -299,8 +316,13 @@
"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"
+ "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": {
diff --git a/app/javascript/dashboard/i18n/locale/tl/helpCenter.json b/app/javascript/dashboard/i18n/locale/tl/helpCenter.json
index c0b43025f..744e14c70 100644
--- a/app/javascript/dashboard/i18n/locale/tl/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/tl/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Burador",
"ARCHIVE": "I-archive",
"TRANSLATE": "Translate",
+ "MOVE_TO_CATEGORY": "Category",
"DELETE": "Delete",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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",
@@ -866,6 +869,28 @@
},
"EDIT_CONFIGURATION": "I-edit ang 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": "Alisin"
+ },
+ "SAVE": "I-save ang mga pagbabago"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Matagumpay na nalikha ang portal",
diff --git a/app/javascript/dashboard/i18n/locale/tl/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/tl/inboxMgmt.json
index 3c4981932..8cb35d098 100644
--- a/app/javascript/dashboard/i18n/locale/tl/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/tl/inboxMgmt.json
@@ -308,6 +308,7 @@
"AUTH_PROCESSING": "Nag-a-authenticate sa Meta",
"WAITING_FOR_BUSINESS_INFO": "Pakipunan ang setup ng negosyo sa Meta window...",
"PROCESSING": "Isinasagawa ang pagsasaayos ng iyong WhatsApp Business Account",
+ "ENABLING_CALLING": "Enabling WhatsApp Calling on your number…",
"LOADING_SDK": "Naglo-load ng Facebook SDK...",
"CANCELLED": "Kinansela ang WhatsApp Signup",
"SUCCESS_TITLE": "Nakakonekta na ang WhatsApp Business Account!",
@@ -317,7 +318,8 @@
"AUTH_NOT_COMPLETED": "Hindi natapos ang authentication. Pakisubukang muli ang proseso.",
"SUCCESS_FALLBACK": "Matagumpay na na-configure ang WhatsApp Business Account",
"MANUAL_FALLBACK": "Kung ang iyong numero ay konektado na sa WhatsApp Business Platform (API), o kung ikaw ay isang tech provider na nag-o-onboard ng sarili mong numero, mangyaring gamitin ang {link} flow",
- "MANUAL_LINK_TEXT": "manwal na setup flow"
+ "MANUAL_LINK_TEXT": "manwal na 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": "Hindi namin naisave ang WhatsApp channel"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "Suportahan ang iyong mga customer sa WhatsApp"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "Email",
"DESCRIPTION": "Ikonekta gamit ang Gmail, Outlook, o iba pang provider"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Pag-configure ng Bot",
"ACCOUNT_HEALTH": "Kalusugan ng Account",
"CSAT": "CSAT",
- "VOICE": "Boses"
+ "VOICE": "Boses",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Mga Kagustuhan sa Channel",
"WIDGET_FEATURES": "Mga tampok ng widget",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"WHATSAPP_TEMPLATES_SYNC_SUBHEADER": "Manu-manong i-sync ang mga message template mula sa WhatsApp upang i-update ang iyong mga available na template.",
"WHATSAPP_TEMPLATES_SYNC_BUTTON": "I-sync ang Mga Template",
"WHATSAPP_TEMPLATES_SYNC_SUCCESS": "Matagumpay na sinimulan ang pag-sync ng mga template. Maaaring tumagal ng ilang minuto bago ma-update.",
+ "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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "I-update ang Mga Setting ng Pre Chat Form"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/tl/integrations.json b/app/javascript/dashboard/i18n/locale/tl/integrations.json
index a65d144d6..1306dd923 100644
--- a/app/javascript/dashboard/i18n/locale/tl/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/tl/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Nalikha ang kontak",
"CONTACT_UPDATED": "Na-update ang contact",
"CONVERSATION_TYPING_ON": "Nagsusulat sa Pag-uusap On",
- "CONVERSATION_TYPING_OFF": "Nagsusulat sa Pag-uusap Off"
+ "CONVERSATION_TYPING_OFF": "Nagsusulat sa Pag-uusap Off",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/tr/bulkActions.json b/app/javascript/dashboard/i18n/locale/tr/bulkActions.json
index 9c63f1b8a..3b8d4ad7a 100644
--- a/app/javascript/dashboard/i18n/locale/tr/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/tr/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} konuşma seçildi",
- "AGENT_SELECT_LABEL": "Temsilci seçin",
- "ASSIGN_CONFIRMATION_LABEL": "{conversationCount} {conversationLabel} atanacak. Emin misiniz?",
- "UNASSIGN_CONFIRMATION_LABEL": "{conversationCount} {conversationLabel} atanmamış yapılacak. Emin misiniz?",
- "GO_BACK_LABEL": "Geri git",
- "ASSIGN_LABEL": "Atama yap",
"NONE": "Hiç",
"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}?",
@@ -20,7 +15,6 @@
"RESOLVE_SUCCESFUL": "Görüşmeler başarıyla çözüldü.",
"RESOLVE_FAILED": "Görüşmeler çözülürken bir hata oluştu. Lütfen tekrar deneyin.",
"ALL_CONVERSATIONS_SELECTED_ALERT": "Bu sayfada yalnızca seçili konuşmalar gösterilmektedir.",
- "AGENT_LIST_LOADING": "Temsilciler Yükleniyor",
"UPDATE": {
"CHANGE_STATUS": "Durumu değiştir",
"SNOOZE_UNTIL": "Sustur",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Etiket atama",
- "NO_LABELS_FOUND": "Etiket bulunamadı",
+ "REMOVE_LABELS": "Remove labels",
"ASSIGN_SELECTED_LABELS": "Seçili etiketleri atama",
+ "REMOVE_SELECTED_LABELS": "Remove selected labels",
"ASSIGN_SUCCESFUL": "Etiketler başarıyla atandı.",
- "ASSIGN_FAILED": "Etiketler atanırken bir hata oluştu. Lütfen tekrar deneyin."
+ "ASSIGN_FAILED": "Etiketler atanırken bir hata oluştu. Lütfen tekrar deneyin.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Takım seçin",
"NONE": "Hiçbiri",
- "NO_TEAMS_AVAILABLE": "Bu hesaba henüz eklenmiş takımlar yok.",
- "ASSIGN_SELECTED_TEAMS": "Seçili takımları atama",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/tr/campaign.json b/app/javascript/dashboard/i18n/locale/tr/campaign.json
index 58f9100e6..2e52a88a3 100644
--- a/app/javascript/dashboard/i18n/locale/tr/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/tr/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "İşleniyor",
"COMPLETED": "Tamamlandı",
"SCHEDULED": "Planlanmış"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "İşleniyor",
"COMPLETED": "Tamamlandı",
"SCHEDULED": "Planlanmış"
},
diff --git a/app/javascript/dashboard/i18n/locale/tr/components.json b/app/javascript/dashboard/i18n/locale/tr/components.json
index f9fcb5680..ff66b351b 100644
--- a/app/javascript/dashboard/i18n/locale/tr/components.json
+++ b/app/javascript/dashboard/i18n/locale/tr/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/tr/contact.json b/app/javascript/dashboard/i18n/locale/tr/contact.json
index acabd8a54..481e09958 100644
--- a/app/javascript/dashboard/i18n/locale/tr/contact.json
+++ b/app/javascript/dashboard/i18n/locale/tr/contact.json
@@ -20,6 +20,8 @@
"CALL": "Ara",
"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": "Sesli gelen kutusu seçin"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "Assign Labels",
+ "REMOVE_LABELS": "Remove Labels",
"ASSIGN_LABELS_SUCCESS": "Etiketler başarıyla atandı.",
"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",
diff --git a/app/javascript/dashboard/i18n/locale/tr/conversation.json b/app/javascript/dashboard/i18n/locale/tr/conversation.json
index 0ddb7f6c2..9ed15c840 100644
--- a/app/javascript/dashboard/i18n/locale/tr/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/tr/conversation.json
@@ -62,6 +62,7 @@
"UNSUPPORTED_MESSAGE_FACEBOOK": "Bu mesaj desteklenmiyor. Bu mesajı Facebook Messenger uygulamasında görüntüleyebilirsiniz.",
"UNSUPPORTED_MESSAGE_INSTAGRAM": "Bu mesaj desteklenmiyor. Bu mesajı Instagram uygulamasında görüntüleyebilirsiniz.",
"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": "Mesaj başarıyla silindi",
"FAIL_DELETE_MESSSAGE": "Mesaj silinemiyor. Tekrar deneyin",
"NO_RESPONSE": "Cevap Yok",
@@ -79,13 +80,22 @@
"OUTGOING_CALL": "Giden arama",
"CALL_IN_PROGRESS": "Arama devam ediyor",
"NO_ANSWER": "Yanıt yok",
+ "NO_ANSWER_OUTBOUND_LABEL": "Yanıt yok",
+ "NO_ANSWER_OUTBOUND_SUBTEXT": "Contact didn't pick up",
"MISSED_CALL": "Cevapsız arama",
+ "MISSED_CALL_INBOUND_SUBTEXT": "No agent picked up",
+ "MISSED_CALL_DECLINED_BY": "Declined by {agentName}",
"CALL_ENDED": "Arama sona erdi",
+ "HANDLED_BY": "Handled by {agentName}",
"NOT_ANSWERED_YET": "Henüz yanıtlanmadı",
+ "CALLING": "Calling…",
"THEY_ANSWERED": "Onlar yanıtladı",
"YOU_ANSWERED": "Siz yanıtladınız",
"AGENT_ANSWERED": "{agentName} answered",
- "JOIN_CALL": "Join call"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Çözüldü",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "yarına ertelendi",
"SNOOZED_UNTIL_NEXT_WEEK": "Önümüzdeki haftaya ertelendi",
"SNOOZED_UNTIL_NEXT_REPLY": "Bir sonraki yanıta kadar ertelendi",
+ "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}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "Ses kaydet",
"TIP_AUDIORECORDER_PERMISSION": "Mikrofon erişimine izin ver",
"TIP_AUDIORECORDER_ERROR": "Mikrofon açılamadı",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "Eklemek için buraya sürükleyip bırakın",
"START_AUDIO_RECORDING": "Ses kaydına başla",
"STOP_AUDIO_RECORDING": "Ses kaydını durdur",
@@ -299,8 +316,13 @@
"NOT_ANSWERED_YET": "Henüz yanıtlanmadı",
"HANDLED_IN_ANOTHER_TAB": "Being handled in another tab",
"REJECT_CALL": "Reject",
+ "DISMISS_CALL": "Kapat",
"JOIN_CALL": "Join call",
- "END_CALL": "End 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": {
diff --git a/app/javascript/dashboard/i18n/locale/tr/helpCenter.json b/app/javascript/dashboard/i18n/locale/tr/helpCenter.json
index 7acf118f8..d962faee8 100644
--- a/app/javascript/dashboard/i18n/locale/tr/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/tr/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Taslak",
"ARCHIVE": "Arşiv",
"TRANSLATE": "Çevir",
+ "MOVE_TO_CATEGORY": "Kategori",
"DELETE": "Sil",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "Sil",
@@ -866,6 +869,28 @@
},
"EDIT_CONFIGURATION": "Edit configuration"
},
+ "LAYOUT_CONTENT": {
+ "HEADER": "Görünüm",
+ "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": "Kaldır"
+ },
+ "SAVE": "Değişiklikleri Kaydet"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Portal başarıyla oluşturuldu",
diff --git a/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json
index 8515fdddb..b22148386 100644
--- a/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json
@@ -308,6 +308,7 @@
"AUTH_PROCESSING": "Meta ile kimlik doğrulama",
"WAITING_FOR_BUSINESS_INFO": "Lütfen Meta penceresinde işletme kurulumunu tamamlayın...",
"PROCESSING": "WhatsApp Business Hesabınızı kurma",
+ "ENABLING_CALLING": "Enabling WhatsApp Calling on your number…",
"LOADING_SDK": "Facebook SDK yükleniyor...",
"CANCELLED": "WhatsApp Kaydı iptal edildi",
"SUCCESS_TITLE": "WhatsApp Business Hesabı Bağlandı!",
@@ -317,7 +318,8 @@
"AUTH_NOT_COMPLETED": "Kimlik doğrulama tamamlanmadı. Lütfen işlemi yeniden başlatın.",
"SUCCESS_FALLBACK": "WhatsApp Business Hesabı başarıyla yapılandırıldı",
"MANUAL_FALLBACK": "Numaranız zaten WhatsApp Business Platformuna (API) bağlıysa veya kendi numaranızı ekleyen bir teknoloji sağlayıcısıysanız, lütfen {link} akışını kullanın",
- "MANUAL_LINK_TEXT": "manuel kurulum akışı"
+ "MANUAL_LINK_TEXT": "manuel kurulum akışı",
+ "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": "WhatsApp kanalını kaydedemedik"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "Müşterilerinize WhatsApp üzerinden destek sağlayın"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "E-Posta",
"DESCRIPTION": "Gmail, Outlook veya diğer sağlayıcılarla bağlantı kurun"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Bot Yapılandırma",
"ACCOUNT_HEALTH": "Hesap Sağlığı",
"CSAT": "CSAT",
- "VOICE": "Ses"
+ "VOICE": "Ses",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"WHATSAPP_TEMPLATES_SYNC_SUBHEADER": "WhatsApp'tan mesaj şablonlarını manuel olarak senkronize ederek mevcut şablonlarınızı güncelleyin.",
"WHATSAPP_TEMPLATES_SYNC_BUTTON": "Şablonları Senkronize Et",
"WHATSAPP_TEMPLATES_SYNC_SUCCESS": "Şablon senkronizasyonu başarıyla başlatıldı. Güncellenmesi birkaç dakika sürebilir.",
+ "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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Sohbet Öncesi Form Ayarlarını Güncelleme"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/tr/integrations.json b/app/javascript/dashboard/i18n/locale/tr/integrations.json
index 5e8214448..483bf0ae4 100644
--- a/app/javascript/dashboard/i18n/locale/tr/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/tr/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Kişi Oluşturuldu",
"CONTACT_UPDATED": "Kişi Güncellendi",
"CONVERSATION_TYPING_ON": "Konuşmada Yazıyor Açık",
- "CONVERSATION_TYPING_OFF": "Konuşmada Yazıyor Kapalı"
+ "CONVERSATION_TYPING_OFF": "Konuşmada Yazıyor Kapalı",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/uk/bulkActions.json b/app/javascript/dashboard/i18n/locale/uk/bulkActions.json
index 7d52b4336..425847d6a 100644
--- a/app/javascript/dashboard/i18n/locale/uk/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/uk/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "Обрано {conversationCount} розмов",
- "AGENT_SELECT_LABEL": "Виберіть агента",
- "ASSIGN_CONFIRMATION_LABEL": "Ви впевнені, що хочете призначити {conversationCount} {conversationLabel} до",
- "UNASSIGN_CONFIRMATION_LABEL": "Ви впевнені, що хочете скасувати призначення {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Повернутися назад",
- "ASSIGN_LABEL": "Призначити",
"NONE": "Нічого",
"CLEAR_SELECTION": "Очистити",
"ASSIGN_AGENT_CONFIRMATION_LABEL": "Ви впевнені, що хочете призначити {n} діалог агенту {agentName}? | Ви впевнені, що хочете призначити {n} діалогів агенту {agentName}?",
@@ -20,7 +15,6 @@
"RESOLVE_SUCCESFUL": "Розмови успішно закриті.",
"RESOLVE_FAILED": "Не вдалося закрити розмови, будь ласка, спробуйте ще раз.",
"ALL_CONVERSATIONS_SELECTED_ALERT": "Розмови, які відображаються на цій сторінці, обрані.",
- "AGENT_LIST_LOADING": "Завантаження агентів",
"UPDATE": {
"CHANGE_STATUS": "Змінити статус",
"SNOOZE_UNTIL": "Відкласти",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Призначити мітки",
- "NO_LABELS_FOUND": "Міток не знайдено",
+ "REMOVE_LABELS": "Remove labels",
"ASSIGN_SELECTED_LABELS": "Призначити вибрані мітки",
+ "REMOVE_SELECTED_LABELS": "Remove selected labels",
"ASSIGN_SUCCESFUL": "Мітки додано успішно.",
- "ASSIGN_FAILED": "Не вдалося призначити мітки, будь ласка, спробуйте ще раз."
+ "ASSIGN_FAILED": "Не вдалося призначити мітки, будь ласка, спробуйте ще раз.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Виберіть команду",
"NONE": "Нiчого",
- "NO_TEAMS_AVAILABLE": "Цей акаунт ще не доданий до жодної команди.",
- "ASSIGN_SELECTED_TEAMS": "Призначити обрану команду.",
"ASSIGN_TEAM_CONFIRMATION_LABEL": "Ви впевнені, що хочете призначити {n} діалог команді {teamName}? | Ви впевнені, що хочете призначити {n} діалогів команді {teamName}?",
"UNASSIGN_TEAM_CONFIRMATION_LABEL": "Ви впевнені, що хочете відкріпити {n} діалог? | Ви впевнені, що хочете відкріпити {n} діалогів?",
"ASSIGN_SUCCESFUL": "Teams assigned successfully.",
diff --git a/app/javascript/dashboard/i18n/locale/uk/campaign.json b/app/javascript/dashboard/i18n/locale/uk/campaign.json
index 77a5cb6b5..fc382830e 100644
--- a/app/javascript/dashboard/i18n/locale/uk/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/uk/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Завершено",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Завершено",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/uk/components.json b/app/javascript/dashboard/i18n/locale/uk/components.json
index b6be5d520..7725b1d7c 100644
--- a/app/javascript/dashboard/i18n/locale/uk/components.json
+++ b/app/javascript/dashboard/i18n/locale/uk/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/uk/contact.json b/app/javascript/dashboard/i18n/locale/uk/contact.json
index bcf717055..6b3e14fce 100644
--- a/app/javascript/dashboard/i18n/locale/uk/contact.json
+++ b/app/javascript/dashboard/i18n/locale/uk/contact.json
@@ -20,6 +20,8 @@
"CALL": "Дзвінок",
"CALL_INITIATED": "Викликаємо контакт…",
"CALL_FAILED": "Не можливо розпочати виклик. Будь ласка, спробуйте пізніше.",
+ "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": "Оберіть голосову теку"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "Призначити мітки",
+ "REMOVE_LABELS": "Remove Labels",
"ASSIGN_LABELS_SUCCESS": "Мітки додано успішно.",
"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",
diff --git a/app/javascript/dashboard/i18n/locale/uk/conversation.json b/app/javascript/dashboard/i18n/locale/uk/conversation.json
index 67078b5ef..d73463852 100644
--- a/app/javascript/dashboard/i18n/locale/uk/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/uk/conversation.json
@@ -62,6 +62,7 @@
"UNSUPPORTED_MESSAGE_FACEBOOK": "Це повідомлення не підтримується. Ви можете переглянути це повідомлення у додатку Facebook Messenger",
"UNSUPPORTED_MESSAGE_INSTAGRAM": "Це повідомлення не підтримується. Ви можете переглянути це повідомлення у додатку Instagram.",
"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": "Повідомлення успішно видалено",
"FAIL_DELETE_MESSSAGE": "Не вдалося видалити повідомлення! Спробуйте ще раз",
"NO_RESPONSE": "Немає відповіді",
@@ -79,13 +80,22 @@
"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": "Вирішити",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "Відкладено до завтра",
"SNOOZED_UNTIL_NEXT_WEEK": "Відкладено до наступного тижня",
"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}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "Записати аудіо",
"TIP_AUDIORECORDER_PERMISSION": "Надати доступ до аудіо",
"TIP_AUDIORECORDER_ERROR": "Не вдалося відкрити аудіо",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "Перетягніть сюди, щоб прикріпити",
"START_AUDIO_RECORDING": "Почати аудіозапис",
"STOP_AUDIO_RECORDING": "Зупинити аудіозапис",
@@ -299,8 +316,13 @@
"NOT_ANSWERED_YET": "Not answered yet",
"HANDLED_IN_ANOTHER_TAB": "Оброблюється в іншій вкладці",
"REJECT_CALL": "Відхилити",
+ "DISMISS_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": {
diff --git a/app/javascript/dashboard/i18n/locale/uk/helpCenter.json b/app/javascript/dashboard/i18n/locale/uk/helpCenter.json
index 481633b52..afdaf5429 100644
--- a/app/javascript/dashboard/i18n/locale/uk/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/uk/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Чернетка",
"ARCHIVE": "Archive",
"TRANSLATE": "Перекласти",
+ "MOVE_TO_CATEGORY": "Категорія",
"DELETE": "Видалити",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "Видалити",
@@ -866,6 +869,28 @@
},
"EDIT_CONFIGURATION": "Edit configuration"
},
+ "LAYOUT_CONTENT": {
+ "HEADER": "Оформлення",
+ "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": "Видалити"
+ },
+ "SAVE": "Save changes"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Портал успішно створено",
diff --git a/app/javascript/dashboard/i18n/locale/uk/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/uk/inboxMgmt.json
index 1095cc585..7744f4086 100644
--- a/app/javascript/dashboard/i18n/locale/uk/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/uk/inboxMgmt.json
@@ -308,6 +308,7 @@
"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!",
@@ -317,7 +318,8 @@
"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"
+ "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": "Ми не змогли зберегти канал WhatsApp"
@@ -465,6 +467,10 @@
"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"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Налаштування бота",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT",
- "VOICE": "Voice"
+ "VOICE": "Voice",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Оновити параметри форми чату"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/uk/integrations.json b/app/javascript/dashboard/i18n/locale/uk/integrations.json
index e757374e7..47dbe3596 100644
--- a/app/javascript/dashboard/i18n/locale/uk/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/uk/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Контакт створено",
"CONTACT_UPDATED": "Контакт оновлено",
"CONVERSATION_TYPING_ON": "Conversation Typing On",
- "CONVERSATION_TYPING_OFF": "Conversation Typing Off"
+ "CONVERSATION_TYPING_OFF": "Conversation Typing Off",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/ur/bulkActions.json b/app/javascript/dashboard/i18n/locale/ur/bulkActions.json
index 4c0b3c814..b29f61328 100644
--- a/app/javascript/dashboard/i18n/locale/ur/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/ur/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} conversations selected",
- "AGENT_SELECT_LABEL": "ایجنٹ منتخب کریں۔",
- "ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign {conversationCount} {conversationLabel} to",
- "UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Go back",
- "ASSIGN_LABEL": "Assign",
"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}?",
@@ -20,7 +15,6 @@
"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.",
- "AGENT_LIST_LOADING": "Loading agents",
"UPDATE": {
"CHANGE_STATUS": "Change status",
"SNOOZE_UNTIL": "Snooze",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assign labels",
- "NO_LABELS_FOUND": "کوئی لیبل نہیں ملے",
+ "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."
+ "ASSIGN_FAILED": "Failed to assign labels. Please try again.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "ٹیم منتخب کریں۔",
"NONE": "کوئی نہیں۔",
- "NO_TEAMS_AVAILABLE": "There are no teams added to this account yet.",
- "ASSIGN_SELECTED_TEAMS": "Assign selected team.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/ur/campaign.json b/app/javascript/dashboard/i18n/locale/ur/campaign.json
index 19ce5145d..20b61806c 100644
--- a/app/javascript/dashboard/i18n/locale/ur/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/ur/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/ur/components.json b/app/javascript/dashboard/i18n/locale/ur/components.json
index f4e30558b..3e2cf157a 100644
--- a/app/javascript/dashboard/i18n/locale/ur/components.json
+++ b/app/javascript/dashboard/i18n/locale/ur/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ur/contact.json b/app/javascript/dashboard/i18n/locale/ur/contact.json
index bc5c59ec0..332eb01a4 100644
--- a/app/javascript/dashboard/i18n/locale/ur/contact.json
+++ b/app/javascript/dashboard/i18n/locale/ur/contact.json
@@ -20,6 +20,8 @@
"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"
@@ -583,8 +585,11 @@
},
"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",
diff --git a/app/javascript/dashboard/i18n/locale/ur/conversation.json b/app/javascript/dashboard/i18n/locale/ur/conversation.json
index 5c99eb959..4be843ba0 100644
--- a/app/javascript/dashboard/i18n/locale/ur/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ur/conversation.json
@@ -62,6 +62,7 @@
"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": "پیغام کامیابی سے حذف ہو گیا۔",
"FAIL_DELETE_MESSSAGE": "پیغام کو حذف نہیں کیا جا سکا! دوبارہ کوشش کریں",
"NO_RESPONSE": "کوئی ردعمل نہیں",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "حل کریں۔",
@@ -100,6 +110,12 @@
"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}",
@@ -215,6 +231,7 @@
"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",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
@@ -299,8 +316,13 @@
"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"
+ "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": {
diff --git a/app/javascript/dashboard/i18n/locale/ur/helpCenter.json b/app/javascript/dashboard/i18n/locale/ur/helpCenter.json
index cc0aa10a1..529f4983f 100644
--- a/app/javascript/dashboard/i18n/locale/ur/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/ur/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Draft",
"ARCHIVE": "Archive",
"TRANSLATE": "Translate",
+ "MOVE_TO_CATEGORY": "Category",
"DELETE": "حذف کریں۔",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "حذف کریں۔",
@@ -866,6 +869,28 @@
},
"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",
diff --git a/app/javascript/dashboard/i18n/locale/ur/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ur/inboxMgmt.json
index 5d27e5a6a..592705323 100644
--- a/app/javascript/dashboard/i18n/locale/ur/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ur/inboxMgmt.json
@@ -308,6 +308,7 @@
"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!",
@@ -317,7 +318,8 @@
"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"
+ "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"
@@ -465,6 +467,10 @@
"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"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Bot Configuration",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT",
- "VOICE": "Voice"
+ "VOICE": "Voice",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Update Pre Chat Form Settings"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/ur/integrations.json b/app/javascript/dashboard/i18n/locale/ur/integrations.json
index 48ecc3941..00294e4e7 100644
--- a/app/javascript/dashboard/i18n/locale/ur/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ur/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Contact created",
"CONTACT_UPDATED": "Contact updated",
"CONVERSATION_TYPING_ON": "Conversation Typing On",
- "CONVERSATION_TYPING_OFF": "Conversation Typing Off"
+ "CONVERSATION_TYPING_OFF": "Conversation Typing Off",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/ur_IN/bulkActions.json b/app/javascript/dashboard/i18n/locale/ur_IN/bulkActions.json
index 2472a9288..6b922bc7b 100644
--- a/app/javascript/dashboard/i18n/locale/ur_IN/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/ur_IN/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} conversations selected",
- "AGENT_SELECT_LABEL": "Select agent",
- "ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign {conversationCount} {conversationLabel} to",
- "UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Go back",
- "ASSIGN_LABEL": "Assign",
"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}?",
@@ -20,7 +15,6 @@
"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.",
- "AGENT_LIST_LOADING": "Loading agents",
"UPDATE": {
"CHANGE_STATUS": "Change status",
"SNOOZE_UNTIL": "Snooze",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assign labels",
- "NO_LABELS_FOUND": "No labels found",
+ "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."
+ "ASSIGN_FAILED": "Failed to assign labels. Please try again.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Select team",
"NONE": "None",
- "NO_TEAMS_AVAILABLE": "There are no teams added to this account yet.",
- "ASSIGN_SELECTED_TEAMS": "Assign selected team.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/ur_IN/campaign.json b/app/javascript/dashboard/i18n/locale/ur_IN/campaign.json
index 10366e79e..71615e4a2 100644
--- a/app/javascript/dashboard/i18n/locale/ur_IN/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/ur_IN/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "عملدرآمد ہو رہا ہے",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "عملدرآمد ہو رہا ہے",
"COMPLETED": "Completed",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/ur_IN/components.json b/app/javascript/dashboard/i18n/locale/ur_IN/components.json
index a75d35b08..3ee865a89 100644
--- a/app/javascript/dashboard/i18n/locale/ur_IN/components.json
+++ b/app/javascript/dashboard/i18n/locale/ur_IN/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ur_IN/contact.json b/app/javascript/dashboard/i18n/locale/ur_IN/contact.json
index 36074609c..a45e3518d 100644
--- a/app/javascript/dashboard/i18n/locale/ur_IN/contact.json
+++ b/app/javascript/dashboard/i18n/locale/ur_IN/contact.json
@@ -20,6 +20,8 @@
"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"
@@ -583,8 +585,11 @@
},
"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",
diff --git a/app/javascript/dashboard/i18n/locale/ur_IN/conversation.json b/app/javascript/dashboard/i18n/locale/ur_IN/conversation.json
index e28213805..740d1aedb 100644
--- a/app/javascript/dashboard/i18n/locale/ur_IN/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ur_IN/conversation.json
@@ -62,6 +62,7 @@
"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",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Resolve",
@@ -100,6 +110,12 @@
"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}",
@@ -215,6 +231,7 @@
"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",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
@@ -299,8 +316,13 @@
"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"
+ "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": {
diff --git a/app/javascript/dashboard/i18n/locale/ur_IN/helpCenter.json b/app/javascript/dashboard/i18n/locale/ur_IN/helpCenter.json
index 817b3347d..9f1c8c03d 100644
--- a/app/javascript/dashboard/i18n/locale/ur_IN/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/ur_IN/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "مسودہ",
"ARCHIVE": "محفوظ کریں",
"TRANSLATE": "Translate",
+ "MOVE_TO_CATEGORY": "Category",
"DELETE": "Delete",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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",
@@ -866,6 +869,28 @@
},
"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": "ہٹائیں"
+ },
+ "SAVE": "تبدیلیاں محفوظ کریں"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "پورٹل کامیابی سے بنایا گیا",
diff --git a/app/javascript/dashboard/i18n/locale/ur_IN/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ur_IN/inboxMgmt.json
index 18a18c3a1..a6f9ead24 100644
--- a/app/javascript/dashboard/i18n/locale/ur_IN/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ur_IN/inboxMgmt.json
@@ -308,6 +308,7 @@
"AUTH_PROCESSING": "میٹا کے ساتھ تصدیق ہو رہی ہے",
"WAITING_FOR_BUSINESS_INFO": "براہ کرم میٹا ونڈو میں بزنس سیٹ اپ مکمل کریں...",
"PROCESSING": "آپ کا واٹس ایپ بزنس اکاؤنٹ سیٹ اپ کیا جا رہا ہے",
+ "ENABLING_CALLING": "Enabling WhatsApp Calling on your number…",
"LOADING_SDK": "Facebook SDK لوڈ ہو رہا ہے...",
"CANCELLED": "واٹس ایپ سائن اپ منسوخ کر دیا گیا",
"SUCCESS_TITLE": "واٹس ایپ بزنس اکاؤنٹ کنیکٹ ہو گیا!",
@@ -317,7 +318,8 @@
"AUTH_NOT_COMPLETED": "تصدیق مکمل نہیں ہوئی۔ براہ کرم عمل دوبارہ شروع کریں۔",
"SUCCESS_FALLBACK": "واٹس ایپ بزنس اکاؤنٹ کامیابی سے ترتیب دیا گیا ہے",
"MANUAL_FALLBACK": "اگر آپ کا نمبر پہلے ہی واٹس ایپ بزنس پلیٹ فارم (API) سے منسلک ہے، یا اگر آپ ایک ٹیک فراہم کنندہ ہیں جو اپنا نمبر آن بورڈ کر رہے ہیں، تو براہ کرم {link} فلو استعمال کریں",
- "MANUAL_LINK_TEXT": "دستی سیٹ اپ کا عمل"
+ "MANUAL_LINK_TEXT": "دستی سیٹ اپ کا عمل",
+ "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": "ہم WhatsApp چینل محفوظ کرنے میں ناکام رہے"
@@ -465,6 +467,10 @@
"TITLE": "واٹس ایپ",
"DESCRIPTION": "اپنے صارفین کی واٹس ایپ پر مدد کریں"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "ای میل",
"DESCRIPTION": "Gmail، Outlook، یا دیگر فراہم کنندگان کے ساتھ کنیکٹ کریں"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "بوٹ کی ترتیب",
"ACCOUNT_HEALTH": "اکاؤنٹ کی صحت",
"CSAT": "CSAT",
- "VOICE": "وائس"
+ "VOICE": "وائس",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"WHATSAPP_TEMPLATES_SYNC_SUBHEADER": "اپنے دستیاب ٹیمپلیٹس کو اپ ڈیٹ کرنے کے لیے واٹس ایپ سے میسج ٹیمپلیٹس کو دستی طور پر ہم آہنگ کریں۔",
"WHATSAPP_TEMPLATES_SYNC_BUTTON": "ٹیمپلیٹس کو ہم آہنگ کریں",
"WHATSAPP_TEMPLATES_SYNC_SUCCESS": "ٹیمپلیٹس کی ہم آہنگی کامیابی سے شروع ہو گئی ہے۔ اپ ڈیٹ ہونے میں چند منٹ لگ سکتے ہیں۔",
+ "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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "پری چیٹ فارم کی ترتیبات کو اپ ڈیٹ کریں"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/ur_IN/integrations.json b/app/javascript/dashboard/i18n/locale/ur_IN/integrations.json
index 30e847011..2b1e36338 100644
--- a/app/javascript/dashboard/i18n/locale/ur_IN/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ur_IN/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "رابطہ بنایا گیا",
"CONTACT_UPDATED": "رابطہ اپ ڈیٹ ہوا",
"CONVERSATION_TYPING_ON": "گفتگو میں ٹائپنگ آن",
- "CONVERSATION_TYPING_OFF": "گفتگو میں ٹائپنگ آف"
+ "CONVERSATION_TYPING_OFF": "گفتگو میں ٹائپنگ آف",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/vi/bulkActions.json b/app/javascript/dashboard/i18n/locale/vi/bulkActions.json
index 2a00f8304..e5f4b49b6 100644
--- a/app/javascript/dashboard/i18n/locale/vi/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/vi/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "{conversationCount} cuộc hội thoại đã được chọn",
- "AGENT_SELECT_LABEL": "Chọn thành viên",
- "ASSIGN_CONFIRMATION_LABEL": "Bạn có chắc chắn để chỉ định {conversationCount} {conversationLabel} tới",
- "UNASSIGN_CONFIRMATION_LABEL": "Bạn có chắc chắn hủy chỉ định {conversationCount} {conversationLabel}?",
- "GO_BACK_LABEL": "Trở về",
- "ASSIGN_LABEL": "Gán",
"NONE": "Không có",
"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}?",
@@ -20,7 +15,6 @@
"RESOLVE_SUCCESFUL": "Cuộc hội thoại đã được giải quyết thành công.",
"RESOLVE_FAILED": "Failed to resolve conversations. Please try again.",
"ALL_CONVERSATIONS_SELECTED_ALERT": "Chỉ những cuộc hội thoại hiển thị trên trang này mới có thể được chọn.",
- "AGENT_LIST_LOADING": "Đang tải điện thoại viên",
"UPDATE": {
"CHANGE_STATUS": "Thay đổi trạng thái",
"SNOOZE_UNTIL": "Báo lại",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "Assign labels",
- "NO_LABELS_FOUND": "Không tìm thấy nhãn",
+ "REMOVE_LABELS": "Remove labels",
"ASSIGN_SELECTED_LABELS": "Gán các nhãn đã chọn",
+ "REMOVE_SELECTED_LABELS": "Remove selected labels",
"ASSIGN_SUCCESFUL": "Các nhãn được gán thành công.",
- "ASSIGN_FAILED": "Failed to assign labels. Please try again."
+ "ASSIGN_FAILED": "Failed to assign labels. Please try again.",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "Chọn nhóm",
"NONE": "Không có",
- "NO_TEAMS_AVAILABLE": "Chưa có nhóm nào được thêm vào tài khoản này.",
- "ASSIGN_SELECTED_TEAMS": "Chỉ định nhóm đã chọn.",
"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.",
diff --git a/app/javascript/dashboard/i18n/locale/vi/campaign.json b/app/javascript/dashboard/i18n/locale/vi/campaign.json
index 4db98e679..1fe5c47ad 100644
--- a/app/javascript/dashboard/i18n/locale/vi/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/vi/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Hoàn tất",
"SCHEDULED": "Scheduled"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "Processing",
"COMPLETED": "Hoàn tất",
"SCHEDULED": "Scheduled"
},
diff --git a/app/javascript/dashboard/i18n/locale/vi/components.json b/app/javascript/dashboard/i18n/locale/vi/components.json
index 53dfdd0cc..b972cbb27 100644
--- a/app/javascript/dashboard/i18n/locale/vi/components.json
+++ b/app/javascript/dashboard/i18n/locale/vi/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/vi/contact.json b/app/javascript/dashboard/i18n/locale/vi/contact.json
index ef1825b41..aaaaaae94 100644
--- a/app/javascript/dashboard/i18n/locale/vi/contact.json
+++ b/app/javascript/dashboard/i18n/locale/vi/contact.json
@@ -20,6 +20,8 @@
"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"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "Gán nhãn",
+ "REMOVE_LABELS": "Remove Labels",
"ASSIGN_LABELS_SUCCESS": "Các nhãn được gán thành công.",
"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",
diff --git a/app/javascript/dashboard/i18n/locale/vi/conversation.json b/app/javascript/dashboard/i18n/locale/vi/conversation.json
index 5318c3979..ca100bb22 100644
--- a/app/javascript/dashboard/i18n/locale/vi/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/vi/conversation.json
@@ -62,6 +62,7 @@
"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": "Tin nhắn được xoá thành công",
"FAIL_DELETE_MESSSAGE": "Không thể xoá tin nhắn! Thử lại",
"NO_RESPONSE": "Không có phản hồi",
@@ -79,13 +80,22 @@
"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"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "Giải quyết",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "Tạm dừng đến ngày mai",
"SNOOZED_UNTIL_NEXT_WEEK": "Tạm dừng đến tuần sau",
"SNOOZED_UNTIL_NEXT_REPLY": "Tạm dừng đến khi có phản hồi",
+ "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}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "Ghi âm thanh",
"TIP_AUDIORECORDER_PERMISSION": "Cho phép truy cập ghi âm",
"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",
"START_AUDIO_RECORDING": "Bắt đầu ghi âm",
"STOP_AUDIO_RECORDING": "Dừng ghi âm",
@@ -299,8 +316,13 @@
"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"
+ "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": {
diff --git a/app/javascript/dashboard/i18n/locale/vi/helpCenter.json b/app/javascript/dashboard/i18n/locale/vi/helpCenter.json
index 75bf9d415..944d5ede7 100644
--- a/app/javascript/dashboard/i18n/locale/vi/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/vi/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "Nháp",
"ARCHIVE": "Archive",
"TRANSLATE": "Translate",
+ "MOVE_TO_CATEGORY": "Loại",
"DELETE": "Xoá",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "Xoá",
@@ -866,6 +869,28 @@
},
"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": "Xoá"
+ },
+ "SAVE": "Save changes"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "Cổng thông tin được tạo thành công",
diff --git a/app/javascript/dashboard/i18n/locale/vi/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/vi/inboxMgmt.json
index 564b76168..00e15289a 100644
--- a/app/javascript/dashboard/i18n/locale/vi/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/vi/inboxMgmt.json
@@ -308,6 +308,7 @@
"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!",
@@ -317,7 +318,8 @@
"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"
+ "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": "Chúng tôi không thể lưu kênh WhatsApp"
@@ -465,6 +467,10 @@
"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"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "Cấu hình Bot",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT",
- "VOICE": "Voice"
+ "VOICE": "Voice",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Update Pre Chat Form Settings"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/vi/integrations.json b/app/javascript/dashboard/i18n/locale/vi/integrations.json
index 48c1e236f..816b6d328 100644
--- a/app/javascript/dashboard/i18n/locale/vi/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/vi/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "Contact created",
"CONTACT_UPDATED": "Contact updated",
"CONVERSATION_TYPING_ON": "Conversation Typing On",
- "CONVERSATION_TYPING_OFF": "Conversation Typing Off"
+ "CONVERSATION_TYPING_OFF": "Conversation Typing Off",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/bulkActions.json b/app/javascript/dashboard/i18n/locale/zh_CN/bulkActions.json
index 14adf13b6..63b92acbe 100644
--- a/app/javascript/dashboard/i18n/locale/zh_CN/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/zh_CN/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "已选择 {conversationCount} 个对话",
- "AGENT_SELECT_LABEL": "选择客服代表",
- "ASSIGN_CONFIRMATION_LABEL": "您确定要将 {conversationCount} 个 {conversationLabel} 分配给",
- "UNASSIGN_CONFIRMATION_LABEL": "您确定要取消分配 {conversationCount} 个 {conversationLabel} 吗?",
- "GO_BACK_LABEL": "返回",
- "ASSIGN_LABEL": "分配",
"NONE": "啥都没有",
"CLEAR_SELECTION": "清除",
"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}?",
@@ -20,7 +15,6 @@
"RESOLVE_SUCCESFUL": "成功将对话标记为已解决.",
"RESOLVE_FAILED": "解决对话失败。请再试一次。",
"ALL_CONVERSATIONS_SELECTED_ALERT": "仅选择了此页面上可见的对话。",
- "AGENT_LIST_LOADING": "正在加载客服代表",
"UPDATE": {
"CHANGE_STATUS": "更改状态",
"SNOOZE_UNTIL": "推迟",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "分配标签",
- "NO_LABELS_FOUND": "未找到标签",
+ "REMOVE_LABELS": "Remove labels",
"ASSIGN_SELECTED_LABELS": "分配指定的标签",
+ "REMOVE_SELECTED_LABELS": "Remove selected labels",
"ASSIGN_SUCCESFUL": "已成功分配标签.",
- "ASSIGN_FAILED": "分配标签失败。请再试一次。"
+ "ASSIGN_FAILED": "分配标签失败。请再试一次。",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "选择团队",
"NONE": "啥都没有",
- "NO_TEAMS_AVAILABLE": "此帐户尚未添加团队。",
- "ASSIGN_SELECTED_TEAMS": "分配选定的团队。",
"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": "团队分配成功。",
diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/campaign.json b/app/javascript/dashboard/i18n/locale/zh_CN/campaign.json
index 8e7527f36..96fdd5cc3 100644
--- a/app/javascript/dashboard/i18n/locale/zh_CN/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/zh_CN/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "处理中",
"COMPLETED": "已完成",
"SCHEDULED": "已计划"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "处理中",
"COMPLETED": "已完成",
"SCHEDULED": "已计划"
},
diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/components.json b/app/javascript/dashboard/i18n/locale/zh_CN/components.json
index 1546eb740..fd09cdb84 100644
--- a/app/javascript/dashboard/i18n/locale/zh_CN/components.json
+++ b/app/javascript/dashboard/i18n/locale/zh_CN/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/contact.json b/app/javascript/dashboard/i18n/locale/zh_CN/contact.json
index 478878853..8508692d5 100644
--- a/app/javascript/dashboard/i18n/locale/zh_CN/contact.json
+++ b/app/javascript/dashboard/i18n/locale/zh_CN/contact.json
@@ -20,6 +20,8 @@
"CALL": "呼叫",
"CALL_INITIATED": "正在接通…",
"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": "选择一个语音收件箱"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "分配标签",
+ "REMOVE_LABELS": "Remove Labels",
"ASSIGN_LABELS_SUCCESS": "已成功分配标签.",
"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} 已选择",
diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/conversation.json b/app/javascript/dashboard/i18n/locale/zh_CN/conversation.json
index d5a2c792d..3ff4fdd2e 100644
--- a/app/javascript/dashboard/i18n/locale/zh_CN/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/zh_CN/conversation.json
@@ -62,6 +62,7 @@
"UNSUPPORTED_MESSAGE_FACEBOOK": "不支持此消息。您可以在 Facebook Messenger 应用上查看此消息。",
"UNSUPPORTED_MESSAGE_INSTAGRAM": "不支持此消息。您可以在 Instagram 应用上查看此消息。",
"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": "已成功删除消息",
"FAIL_DELETE_MESSSAGE": "无法删除消息,请重试!",
"NO_RESPONSE": "无响应",
@@ -79,13 +80,22 @@
"OUTGOING_CALL": "已拨出电话",
"CALL_IN_PROGRESS": "呼叫进行中",
"NO_ANSWER": "无应答",
+ "NO_ANSWER_OUTBOUND_LABEL": "无应答",
+ "NO_ANSWER_OUTBOUND_SUBTEXT": "Contact didn't pick up",
"MISSED_CALL": "未接来电",
+ "MISSED_CALL_INBOUND_SUBTEXT": "No agent picked up",
+ "MISSED_CALL_DECLINED_BY": "Declined by {agentName}",
"CALL_ENDED": "通话结束",
+ "HANDLED_BY": "Handled by {agentName}",
"NOT_ANSWERED_YET": "尚未回复",
+ "CALLING": "Calling…",
"THEY_ANSWERED": "对方已回复",
"YOU_ANSWERED": "你已回复",
"AGENT_ANSWERED": "{agentName} answered",
- "JOIN_CALL": "Join call"
+ "JOIN_CALL": "Join call",
+ "CALL_BACK": "Call back",
+ "TRANSCRIPT_SHOW_MORE": "Show more",
+ "TRANSCRIPT_SHOW_LESS": "Show less"
},
"HEADER": {
"RESOLVE_ACTION": "已解决",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "推迟到明天",
"SNOOZED_UNTIL_NEXT_WEEK": "推迟到下周",
"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": "第一响应时间 {status}",
"NRT": "净响应时间 {status}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "录制音频",
"TIP_AUDIORECORDER_PERMISSION": "允许访问音频",
"TIP_AUDIORECORDER_ERROR": "无法打开音频",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "拖放到此处添加附件",
"START_AUDIO_RECORDING": "开始录音",
"STOP_AUDIO_RECORDING": "停止录音",
@@ -299,8 +316,13 @@
"NOT_ANSWERED_YET": "尚未回复",
"HANDLED_IN_ANOTHER_TAB": "Being handled in another tab",
"REJECT_CALL": "Reject",
+ "DISMISS_CALL": "取消",
"JOIN_CALL": "Join call",
- "END_CALL": "End 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": {
diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/helpCenter.json b/app/javascript/dashboard/i18n/locale/zh_CN/helpCenter.json
index 95700269f..adf8bdf07 100644
--- a/app/javascript/dashboard/i18n/locale/zh_CN/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/zh_CN/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "草稿",
"ARCHIVE": "归档",
"TRANSLATE": "翻译",
+ "MOVE_TO_CATEGORY": "类别",
"DELETE": "删除",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "删除",
@@ -866,6 +869,28 @@
},
"EDIT_CONFIGURATION": "编辑配置"
},
+ "LAYOUT_CONTENT": {
+ "HEADER": "外观",
+ "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": "删除"
+ },
+ "SAVE": "保存更改"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "门户创建成功",
diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/zh_CN/inboxMgmt.json
index 08ba76bfb..e29dd5cb9 100644
--- a/app/javascript/dashboard/i18n/locale/zh_CN/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/zh_CN/inboxMgmt.json
@@ -308,6 +308,7 @@
"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": "加载 Facebook SDK...",
"CANCELLED": "WhatsApp 注册已取消",
"SUCCESS_TITLE": "WhatsApp Business Account Connected!",
@@ -317,7 +318,8 @@
"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_LINK_TEXT": "手动设置流程",
+ "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": "我们无法保存 WhatsApp 通道"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "在 WhatsApp 上回应您的客户"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "Email",
"DESCRIPTION": "连接到 Gmail、Outlook,或其他提供商"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "机器人配置",
"ACCOUNT_HEALTH": "Account Health",
"CSAT": "客户满意度",
- "VOICE": "语音"
+ "VOICE": "语音",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "Channel Preferences",
"WIDGET_FEATURES": "Widget features",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"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_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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "更新预聊天表单设置"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/integrations.json b/app/javascript/dashboard/i18n/locale/zh_CN/integrations.json
index 8d40ea6ae..66191b450 100644
--- a/app/javascript/dashboard/i18n/locale/zh_CN/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/zh_CN/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "联系人已创建",
"CONTACT_UPDATED": "联系人已更新",
"CONVERSATION_TYPING_ON": "对话输入开启",
- "CONVERSATION_TYPING_OFF": "对话输入关闭"
+ "CONVERSATION_TYPING_OFF": "对话输入关闭",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/bulkActions.json b/app/javascript/dashboard/i18n/locale/zh_TW/bulkActions.json
index 8600e1453..378f331c5 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/bulkActions.json
@@ -1,11 +1,6 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "已選擇 {conversationCount} 個對話",
- "AGENT_SELECT_LABEL": "選擇客服",
- "ASSIGN_CONFIRMATION_LABEL": "您確定要將 {conversationCount} 個{conversationLabel}指派給",
- "UNASSIGN_CONFIRMATION_LABEL": "您確定要取消指派 {conversationCount} 個{conversationLabel}嗎?",
- "GO_BACK_LABEL": "返回",
- "ASSIGN_LABEL": "指派",
"NONE": "無",
"CLEAR_SELECTION": "清除",
"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}?",
@@ -20,7 +15,6 @@
"RESOLVE_SUCCESFUL": "對話已成功標記為已解決。",
"RESOLVE_FAILED": "解決對話失敗,請再試一次。",
"ALL_CONVERSATIONS_SELECTED_ALERT": "僅選擇了此頁面上可見的對話。",
- "AGENT_LIST_LOADING": "正在載入客服列表",
"UPDATE": {
"CHANGE_STATUS": "變更狀態",
"SNOOZE_UNTIL": "擱置",
@@ -33,16 +27,16 @@
},
"LABELS": {
"ASSIGN_LABELS": "指派標籤",
- "NO_LABELS_FOUND": "找不到標籤",
+ "REMOVE_LABELS": "Remove labels",
"ASSIGN_SELECTED_LABELS": "指派已選標籤",
+ "REMOVE_SELECTED_LABELS": "Remove selected labels",
"ASSIGN_SUCCESFUL": "標籤指派成功。",
- "ASSIGN_FAILED": "指派標籤失敗,請再試一次。"
+ "ASSIGN_FAILED": "指派標籤失敗,請再試一次。",
+ "REMOVE_SUCCESFUL": "Labels removed successfully.",
+ "REMOVE_FAILED": "Failed to remove labels. Please try again."
},
"TEAMS": {
- "TEAM_SELECT_LABEL": "選擇團隊",
"NONE": "無",
- "NO_TEAMS_AVAILABLE": "此帳戶尚未新增任何團隊。",
- "ASSIGN_SELECTED_TEAMS": "指派已選團隊。",
"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": "團隊指派成功。",
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/campaign.json b/app/javascript/dashboard/i18n/locale/zh_TW/campaign.json
index 427bd03ee..1a3cb96b6 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/campaign.json
@@ -88,6 +88,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "處理中",
"COMPLETED": "已完成",
"SCHEDULED": "已排程"
},
@@ -146,6 +147,7 @@
},
"CARD": {
"STATUS": {
+ "PROCESSING": "處理中",
"COMPLETED": "已完成",
"SCHEDULED": "已排程"
},
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/components.json b/app/javascript/dashboard/i18n/locale/zh_TW/components.json
index 14834a200..1f5f39050 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/components.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/components.json
@@ -63,6 +63,7 @@
"CODE": "Code",
"BULLET_LIST": "Bullet List",
"ORDERED_LIST": "Ordered List",
- "TABLE": "Table"
+ "TABLE": "Table",
+ "IMAGE": "Image"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/contact.json b/app/javascript/dashboard/i18n/locale/zh_TW/contact.json
index 9b02b785b..a7848de4c 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/contact.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/contact.json
@@ -20,6 +20,8 @@
"CALL": "通話",
"CALL_INITIATED": "正在撥打聯絡人電話…",
"CALL_FAILED": "無法撥打電話,請稍後再試。",
+ "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": "點擊以編輯",
"VOICE_INBOX_PICKER": {
"TITLE": "選擇語音收件匣"
@@ -583,8 +585,11 @@
},
"CONTACTS_BULK_ACTIONS": {
"ASSIGN_LABELS": "指派標籤",
+ "REMOVE_LABELS": "Remove Labels",
"ASSIGN_LABELS_SUCCESS": "標籤已成功指派。",
"ASSIGN_LABELS_FAILED": "指派標籤失敗",
+ "REMOVE_LABELS_SUCCESS": "Labels removed successfully.",
+ "REMOVE_LABELS_FAILED": "Failed to remove labels",
"DESCRIPTION": "選擇您要新增到所選聯絡人的標籤。",
"NO_LABELS_FOUND": "尚無可用的標籤。",
"SELECTED_COUNT": "已選取 {count} 個",
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json b/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json
index 783c9a541..9501312d7 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json
@@ -62,6 +62,7 @@
"UNSUPPORTED_MESSAGE_FACEBOOK": "此訊息不受支援。您可以在 Facebook Messenger 應用程式中檢視此訊息。",
"UNSUPPORTED_MESSAGE_INSTAGRAM": "此訊息不受支援。您可以在 Instagram 應用程式中檢視此訊息。",
"UNSUPPORTED_MESSAGE_TIKTOK": "此訊息不受支援。您可以在 TikTok 應用程式中檢視此訊息。",
+ "UNSUPPORTED_MESSAGE_WHATSAPP": "This message is unsupported. You can view this message on the WhatsApp app.",
"SUCCESS_DELETE_MESSAGE": "已成功刪除訊息",
"FAIL_DELETE_MESSSAGE": "無法刪除訊息!請再試一次",
"NO_RESPONSE": "無回應",
@@ -79,13 +80,22 @@
"OUTGOING_CALL": "撥出電話",
"CALL_IN_PROGRESS": "通話中",
"NO_ANSWER": "未接聽",
+ "NO_ANSWER_OUTBOUND_LABEL": "未接聽",
+ "NO_ANSWER_OUTBOUND_SUBTEXT": "Contact didn't pick up",
"MISSED_CALL": "未接來電",
+ "MISSED_CALL_INBOUND_SUBTEXT": "No agent picked up",
+ "MISSED_CALL_DECLINED_BY": "Declined by {agentName}",
"CALL_ENDED": "通話結束",
+ "HANDLED_BY": "Handled by {agentName}",
"NOT_ANSWERED_YET": "尚未接聽",
+ "CALLING": "Calling…",
"THEY_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": "解決",
@@ -100,6 +110,12 @@
"SNOOZED_UNTIL_TOMORROW": "延後至明天",
"SNOOZED_UNTIL_NEXT_WEEK": "延後至下週",
"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}",
@@ -215,6 +231,7 @@
"TIP_AUDIORECORDER_ICON": "錄製音訊",
"TIP_AUDIORECORDER_PERMISSION": "允許存取音訊",
"TIP_AUDIORECORDER_ERROR": "無法開啟音訊",
+ "AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
"DRAG_DROP": "拖放至此處以附加檔案",
"START_AUDIO_RECORDING": "開始錄音",
"STOP_AUDIO_RECORDING": "停止錄音",
@@ -299,8 +316,13 @@
"NOT_ANSWERED_YET": "尚未接聽",
"HANDLED_IN_ANOTHER_TAB": "正在另一個分頁中處理",
"REJECT_CALL": "拒接",
+ "DISMISS_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": {
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/helpCenter.json b/app/javascript/dashboard/i18n/locale/zh_TW/helpCenter.json
index 5d68d982f..ca899905c 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/helpCenter.json
@@ -607,9 +607,12 @@
"DRAFT": "草稿",
"ARCHIVE": "封存",
"TRANSLATE": "翻譯",
+ "MOVE_TO_CATEGORY": "類別",
"DELETE": "刪除",
"STATUS_SUCCESS": "Articles updated successfully",
"STATUS_ERROR": "Failed to update articles",
+ "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": "刪除",
@@ -866,6 +869,28 @@
},
"EDIT_CONFIGURATION": "編輯設定"
},
+ "LAYOUT_CONTENT": {
+ "HEADER": "外觀",
+ "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": "移除"
+ },
+ "SAVE": "儲存變更"
+ },
"API": {
"CREATE_PORTAL": {
"SUCCESS_MESSAGE": "入口建立成功",
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json
index 49d0a5081..c21756e36 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json
@@ -308,6 +308,7 @@
"AUTH_PROCESSING": "正在透過 Meta 進行驗證",
"WAITING_FOR_BUSINESS_INFO": "請在 Meta 視窗中完成商業設定...",
"PROCESSING": "正在設定您的 WhatsApp Business 帳號",
+ "ENABLING_CALLING": "Enabling WhatsApp Calling on your number…",
"LOADING_SDK": "正在載入 Facebook SDK...",
"CANCELLED": "WhatsApp 註冊已取消",
"SUCCESS_TITLE": "WhatsApp Business 帳號已連接!",
@@ -317,7 +318,8 @@
"AUTH_NOT_COMPLETED": "驗證未完成。請重新開始流程。",
"SUCCESS_FALLBACK": "WhatsApp Business 帳號已成功設定",
"MANUAL_FALLBACK": "如果您的號碼已連接到 WhatsApp Business Platform(API),或者您是正在接入自己號碼的技術供應商,請使用 {link}",
- "MANUAL_LINK_TEXT": "手動設定流程"
+ "MANUAL_LINK_TEXT": "手動設定流程",
+ "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": "無法儲存 WhatsApp 頻道"
@@ -465,6 +467,10 @@
"TITLE": "WhatsApp",
"DESCRIPTION": "透過 WhatsApp 為客戶提供支援"
},
+ "WHATSAPP_CALL": {
+ "TITLE": "WhatsApp Call",
+ "DESCRIPTION": "Take voice calls on your WhatsApp number"
+ },
"EMAIL": {
"TITLE": "Email",
"DESCRIPTION": "連結 Gmail、Outlook 或其他供應商"
@@ -637,7 +643,8 @@
"BOT_CONFIGURATION": "機器人設定",
"ACCOUNT_HEALTH": "帳號健康狀態",
"CSAT": "CSAT",
- "VOICE": "語音"
+ "VOICE": "語音",
+ "CALLS": "Calls"
},
"VOICE_CONFIGURATION": {
"ENABLE_VOICE": {
@@ -648,6 +655,26 @@
"DESCRIPTION": "Voice calling requires Twilio API Key credentials. These are used to generate tokens for agent voice connections."
}
},
+ "WHATSAPP_CALLING": {
+ "ENABLE": {
+ "LABEL": "Enable WhatsApp Calling",
+ "DESCRIPTION": "Allow agents to receive and place WhatsApp Cloud calls on this inbox. Customers can call this business number directly from WhatsApp."
+ },
+ "ENABLE_FAILED": "Voice calling couldn't be turned on for this number — it isn't enrolled in the WhatsApp Business Calling API yet. Reach out to Meta or your WhatsApp Business Solution Provider to onboard it, then try again.",
+ "PHONE_NUMBER": {
+ "LABEL": "Business phone number",
+ "HELP_TEXT": "WhatsApp number that customers will call."
+ },
+ "HOW_IT_WORKS": {
+ "LABEL": "How it works",
+ "DESCRIPTION": "Calls are placed peer-to-peer between the agent's browser and Meta — no extra credentials are required. Make sure the agent's browser has microphone permission for this site."
+ },
+ "PERMISSION_REQUEST_BODY": {
+ "LABEL": "Call permission request message",
+ "HELP_TEXT": "Shown to the contact when they haven't yet consented to receive calls. Leave blank to use the default.",
+ "PLACEHOLDER": "We would like to call you regarding your conversation."
+ }
+ },
"CHANNEL_PREFERENCES": "頻道偏好設定",
"WIDGET_FEATURES": "小工具功能",
"ACCOUNT_HEALTH": {
@@ -800,6 +827,10 @@
"WHATSAPP_TEMPLATES_SYNC_SUBHEADER": "手動從 WhatsApp 同步訊息範本以更新可用範本。",
"WHATSAPP_TEMPLATES_SYNC_BUTTON": "同步範本",
"WHATSAPP_TEMPLATES_SYNC_SUCCESS": "範本同步已啟動。可能需要幾分鐘才能更新完成。",
+ "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."
+ },
"UPDATE_PRE_CHAT_FORM_SETTINGS": "更新聊天前表單設定"
},
"HELP_CENTER": {
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json b/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json
index 213268f07..ff9422d88 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json
@@ -57,7 +57,8 @@
"CONTACT_CREATED": "聯絡人已建立",
"CONTACT_UPDATED": "聯絡人已更新",
"CONVERSATION_TYPING_ON": "對話正在輸入",
- "CONVERSATION_TYPING_OFF": "對話停止輸入"
+ "CONVERSATION_TYPING_OFF": "對話停止輸入",
+ "INBOX_UPDATED": "Inbox updated"
}
},
"NAME": {
diff --git a/config/locales/am.yml b/config/locales/am.yml
index a42e45ab3..70c1310af 100644
--- a/config/locales/am.yml
+++ b/config/locales/am.yml
@@ -241,6 +241,7 @@ am:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,30 @@ am:
empty_placeholder: No results found.
loading_placeholder: Searching...
results_title: Search results
+ results: Search Results
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ other: 'Found %{count} results'
+ submit: ፈልግ
toc_header: 'On this page'
+ sidebar:
+ help_center: የእርዳታ ማዕከል
+ categories: ምድቦች
+ language: Language
+ theme: Theme
+ open_sidebar: አጠገብ በር ክፈት
+ close_sidebar: አጠገብ በር ዝጋ
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Search for the articles here or browse the categories below.
common:
@@ -427,12 +451,21 @@ am:
others: others
by: By
no_articles: There are no articles here
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Made with
header:
go_to_homepage: Website
visit_website: Visit website
appearance:
+ title: Appearance
system: System
light: Light
dark: Dark
diff --git a/config/locales/ar.yml b/config/locales/ar.yml
index a7bf0234b..3882666eb 100644
--- a/config/locales/ar.yml
+++ b/config/locales/ar.yml
@@ -241,6 +241,7 @@ ar:
whatsapp:
list_button_label: 'اختر عنصر'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,6 +413,17 @@ ar:
empty_placeholder: لم يتم العثور على النتائج.
loading_placeholder: جاري البحث...
results_title: نتائج البحث
+ results: نتائج البحث
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ zero: 'Found %{count} results'
+ one: Found 1 result
+ two: 'Found %{count} results'
+ few: 'Found %{count} results'
+ many: 'Found %{count} results'
+ other: 'Found %{count} results'
+ submit: بحث
toc_header: 'في هذه الصفحة'
sidebar:
help_center: مركز المساعدة
@@ -443,6 +455,8 @@ ar:
others: الآخرين
by: بواسطة
no_articles: لا توجد مقالات
+ previous: السابق
+ next: التالي
article_actions:
label: فتح في
view_markdown: عرض كـ Markdown
@@ -455,6 +469,7 @@ ar:
go_to_homepage: الموقع الإلكتروني
visit_website: Visit website
appearance:
+ title: المظهر
system: النظام
light: فاتح
dark: مظلم
diff --git a/config/locales/az.yml b/config/locales/az.yml
index 5632d143e..fe51b907d 100644
--- a/config/locales/az.yml
+++ b/config/locales/az.yml
@@ -241,6 +241,7 @@ az:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,30 @@ az:
empty_placeholder: No results found.
loading_placeholder: Searching...
results_title: Search results
+ results: Axtarış Nəticələri
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ other: 'Found %{count} results'
+ submit: Axtar
toc_header: 'On this page'
+ sidebar:
+ help_center: Kömək Mərkəzi
+ categories: Kateqoriyalar
+ language: Language
+ theme: Theme
+ open_sidebar: Yan paneli aç
+ close_sidebar: Yan paneli bağla
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Search for the articles here or browse the categories below.
common:
@@ -427,12 +451,21 @@ az:
others: others
by: By
no_articles: There are no articles here
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Made with
header:
go_to_homepage: Website
visit_website: Visit website
appearance:
+ title: Appearance
system: System
light: Light
dark: Dark
diff --git a/config/locales/bg.yml b/config/locales/bg.yml
index ca2fe620a..e2674edda 100644
--- a/config/locales/bg.yml
+++ b/config/locales/bg.yml
@@ -241,6 +241,7 @@ bg:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,30 @@ bg:
empty_placeholder: Няма намерени резултати.
loading_placeholder: Searching...
results_title: Search results
+ results: Search Results
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ other: 'Found %{count} results'
+ submit: Търсене
toc_header: 'On this page'
+ sidebar:
+ help_center: Help Center
+ categories: Categories
+ language: Language
+ theme: Theme
+ open_sidebar: Open sidebar
+ close_sidebar: Close sidebar
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Search for the articles here or browse the categories below.
common:
@@ -427,12 +451,21 @@ bg:
others: others
by: By
no_articles: There are no articles here
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Made with
header:
go_to_homepage: Website
visit_website: Visit website
appearance:
+ title: Appearance
system: System
light: Light
dark: Dark
diff --git a/config/locales/bn.yml b/config/locales/bn.yml
index 1a7b02b1b..fb88cd27b 100644
--- a/config/locales/bn.yml
+++ b/config/locales/bn.yml
@@ -241,6 +241,7 @@ bn:
whatsapp:
list_button_label: 'একটি আইটেম নির্বাচন করুন'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,30 @@ bn:
empty_placeholder: কোনো ফলাফল পাওয়া যায়নি।.
loading_placeholder: অনুসন্ধান চলছে...
results_title: অনুসন্ধানের ফলাফল
+ results: অনুসন্ধান ফলাফল
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ other: 'Found %{count} results'
+ submit: অনুসন্ধান
toc_header: 'এই পাতায়'
+ sidebar:
+ help_center: সহায়তা কেন্দ্র
+ categories: বিভাগসমূহ
+ language: Language
+ theme: Theme
+ open_sidebar: সাইডবার খুলুন
+ close_sidebar: সাইডবার বন্ধ করুন
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: এখানে প্রবন্ধগুলি খুঁজুন অথবা নিচের বিভাগগুলো ব্রাউজ করুন।.
common:
@@ -427,12 +451,21 @@ bn:
others: অন্যান্যরা
by: দ্বারা
no_articles: এখানে কোনো প্রবন্ধ নেই
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: নির্মিত
header:
go_to_homepage: ওয়েবসাইট
visit_website: ওয়েবসাইট দেখুন
appearance:
+ title: Appearance
system: সিস্টেম
light: হালকা
dark: গাঢ়
diff --git a/config/locales/ca.yml b/config/locales/ca.yml
index 920ba2ec0..ebf894da2 100644
--- a/config/locales/ca.yml
+++ b/config/locales/ca.yml
@@ -241,6 +241,7 @@ ca:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,30 @@ ca:
empty_placeholder: No s'ha trobat agents.
loading_placeholder: S'està cercant...
results_title: Resultats de la cerca
+ results: Resultats de la cerca
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ other: 'Found %{count} results'
+ submit: Cercar
toc_header: 'En aquesta pàgina'
+ sidebar:
+ help_center: Centre d'ajuda
+ categories: Categories
+ language: Idioma
+ theme: Theme
+ open_sidebar: Obre la barra lateral
+ close_sidebar: Tanca la barra lateral
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Cerca els articles aquí o navega per les categories següents.
common:
@@ -427,12 +451,21 @@ ca:
others: altres
by: Per
no_articles: No hi ha articles aquí
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Fet amb
header:
go_to_homepage: Lloc web
visit_website: Visit website
appearance:
+ title: Aparença
system: Sistema
light: Clar
dark: Fosc
diff --git a/config/locales/cs.yml b/config/locales/cs.yml
index 2fe9bfe41..5e6315000 100644
--- a/config/locales/cs.yml
+++ b/config/locales/cs.yml
@@ -241,6 +241,7 @@ cs:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,32 @@ cs:
empty_placeholder: Žádné výsledky.
loading_placeholder: Searching...
results_title: Search results
+ results: Výsledky hledání
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ few: 'Found %{count} results'
+ many: 'Found %{count} results'
+ other: 'Found %{count} results'
+ submit: Hledat
toc_header: 'On this page'
+ sidebar:
+ help_center: Help Center
+ categories: Categories
+ language: Language
+ theme: Theme
+ open_sidebar: Otevřít postranní panel
+ close_sidebar: Zavřít postranní panel
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Search for the articles here or browse the categories below.
common:
@@ -427,12 +453,21 @@ cs:
others: others
by: By
no_articles: There are no articles here
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Made with
header:
go_to_homepage: Website
visit_website: Visit website
appearance:
+ title: Appearance
system: System
light: Light
dark: Dark
diff --git a/config/locales/da.yml b/config/locales/da.yml
index 5af6c9ccd..43d291bfc 100644
--- a/config/locales/da.yml
+++ b/config/locales/da.yml
@@ -241,6 +241,7 @@ da:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,30 @@ da:
empty_placeholder: Ingen resultater fundet.
loading_placeholder: Søger...
results_title: Søgeresultater
+ results: Søgeresultater
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ other: 'Found %{count} results'
+ submit: Søg
toc_header: 'On this page'
+ sidebar:
+ help_center: Help Center
+ categories: Kategorier
+ language: Sprog
+ theme: Theme
+ open_sidebar: Åbn sidepanel
+ close_sidebar: Luk sidepanel
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Søg efter artiklerne her eller gennemse kategorierne nedenfor.
common:
@@ -427,12 +451,21 @@ da:
others: others
by: By
no_articles: There are no articles here
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Made with
header:
go_to_homepage: Website
visit_website: Visit website
appearance:
+ title: Appearance
system: System
light: Light
dark: Dark
diff --git a/config/locales/de.yml b/config/locales/de.yml
index f9156ece1..ddf1ad052 100644
--- a/config/locales/de.yml
+++ b/config/locales/de.yml
@@ -241,6 +241,7 @@ de:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,30 @@ de:
empty_placeholder: Keine Ergebnisse gefunden.
loading_placeholder: Suchen...
results_title: Suchergebnisse
+ results: Suchergebnisse
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ other: 'Found %{count} results'
+ submit: Suchen
toc_header: 'Auf dieser Seite'
+ sidebar:
+ help_center: Hilfezentrum
+ categories: Kategorien
+ language: Sprache
+ theme: Theme
+ open_sidebar: Seitenleiste öffnen
+ close_sidebar: Seitenleiste schließen
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Suchen Sie hier nach den Artikeln oder stöbern Sie in den unten stehenden Kategorien.
common:
@@ -427,12 +451,21 @@ de:
others: andere
by: Von
no_articles: Keine Artikel vorhanden
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Erstellt mit
header:
go_to_homepage: Webseite
visit_website: Visit website
appearance:
+ title: Darstellung
system: System
light: Hell
dark: Dunkel
diff --git a/config/locales/el.yml b/config/locales/el.yml
index ae45f7518..153bb5c89 100644
--- a/config/locales/el.yml
+++ b/config/locales/el.yml
@@ -241,6 +241,7 @@ el:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,30 @@ el:
empty_placeholder: Δεν βρέθηκαν αποτελέσματα.
loading_placeholder: Αναζήτηση...
results_title: Αποτελέσματα Αναζήτησης
+ results: Αποτελέσματα Αναζήτησης
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ other: 'Found %{count} results'
+ submit: Αναζήτηση
toc_header: 'On this page'
+ sidebar:
+ help_center: Help Center
+ categories: Κατηγορίες
+ language: Γλώσσα
+ theme: Theme
+ open_sidebar: Άνοιγμα πλευρικής μπάρας
+ close_sidebar: Κλείσιμο πλευρικής μπάρας
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Αναζητήστε τα άρθρα εδώ ή περιηγηθείτε στις κατηγορίες παρακάτω.
common:
@@ -427,12 +451,21 @@ el:
others: others
by: By
no_articles: There are no articles here
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Made with
header:
go_to_homepage: Website
visit_website: Visit website
appearance:
+ title: Appearance
system: System
light: Light
dark: Dark
diff --git a/config/locales/es.yml b/config/locales/es.yml
index 24166770a..c5a17fc79 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -241,6 +241,7 @@ es:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,30 @@ es:
empty_placeholder: No se encontraron resultados.
loading_placeholder: Buscando...
results_title: Buscar resultados
+ results: Buscar resultados
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ other: 'Found %{count} results'
+ submit: Buscar
toc_header: 'En esta página'
+ sidebar:
+ help_center: Centro de ayuda
+ categories: Categorías
+ language: Idioma
+ theme: Theme
+ open_sidebar: Abrir barra lateral
+ close_sidebar: Cerrar barra lateral
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Busque aquí los artículos o busque las categorías de abajo.
common:
@@ -427,12 +451,21 @@ es:
others: otros
by: Por
no_articles: No hay artículos aquí
+ previous: Anterior
+ next: Siguiente
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Hecho con
header:
go_to_homepage: Sitio web
visit_website: Visit website
appearance:
+ title: Apariencia
system: Sistema
light: Claro
dark: Oscuro
diff --git a/config/locales/et.yml b/config/locales/et.yml
index f5a0a6229..4a846374e 100644
--- a/config/locales/et.yml
+++ b/config/locales/et.yml
@@ -241,6 +241,7 @@ et:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,30 @@ et:
empty_placeholder: Tulemusi ei leitud.
loading_placeholder: Otsin...
results_title: Otsingutulemused
+ results: Otsingutulemused
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ other: 'Found %{count} results'
+ submit: Otsi
toc_header: 'On this page'
+ sidebar:
+ help_center: Abi keskus
+ categories: Kategooriad
+ language: Language
+ theme: Theme
+ open_sidebar: Ava külgriba
+ close_sidebar: Sulge külgriba
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Search for the articles here or browse the categories below.
common:
@@ -427,12 +451,21 @@ et:
others: others
by: By
no_articles: There are no articles here
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Made with
header:
go_to_homepage: Website
visit_website: Visit website
appearance:
+ title: Appearance
system: System
light: Light
dark: Dark
diff --git a/config/locales/fa.yml b/config/locales/fa.yml
index b48f5ffaa..4e6e2e492 100644
--- a/config/locales/fa.yml
+++ b/config/locales/fa.yml
@@ -241,6 +241,7 @@ fa:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,30 @@ fa:
empty_placeholder: نتیجهای یافت نشد.
loading_placeholder: در حال جستجو...
results_title: نتایج جستجو
+ results: نتایج جستجو
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ other: 'Found %{count} results'
+ submit: جستجو
toc_header: 'در این صفحه'
+ sidebar:
+ help_center: مرکز راهنما
+ categories: دستهبندیها
+ language: زبان
+ theme: Theme
+ open_sidebar: نوار کناری را باز کنید
+ close_sidebar: نوار کناری را ببندید
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: مقالات را در اینجا جستجو کنید یا دستهبندیهای زیر را مرور کنید.
common:
@@ -427,12 +451,21 @@ fa:
others: دیگران
by: توسط
no_articles: هنوز هیچ مقالهای در اینجا وجود ندارد
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: ساخته شده با
header:
go_to_homepage: وب سایت
visit_website: Visit website
appearance:
+ title: ظاهری
system: سیستم
light: روشن
dark: تیره
diff --git a/config/locales/fi.yml b/config/locales/fi.yml
index ed9925caf..3317f547e 100644
--- a/config/locales/fi.yml
+++ b/config/locales/fi.yml
@@ -241,6 +241,7 @@ fi:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,30 @@ fi:
empty_placeholder: No results found.
loading_placeholder: Searching...
results_title: Search results
+ results: Search Results
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ other: 'Found %{count} results'
+ submit: Etsi
toc_header: 'On this page'
+ sidebar:
+ help_center: Help Center
+ categories: Categories
+ language: Language
+ theme: Theme
+ open_sidebar: Open sidebar
+ close_sidebar: Close sidebar
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Search for the articles here or browse the categories below.
common:
@@ -427,12 +451,21 @@ fi:
others: others
by: By
no_articles: There are no articles here
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Made with
header:
go_to_homepage: Website
visit_website: Visit website
appearance:
+ title: Appearance
system: System
light: Light
dark: Dark
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index 8564a7154..b63c46cd6 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -51,7 +51,7 @@ fr:
invalid_params: 'Invalid, please check the signup paramters and try again'
failed: L'inscription a échoué
voice:
- call_already_accepted: '%{agent_name} is already handling the call.'
+ call_already_accepted: '%{agent_name} traite déjà l''appel.'
assignment_policy:
not_found: Assignment policy not found
attachments:
@@ -106,11 +106,11 @@ fr:
not_enabled: 'Calling is not enabled for this inbox'
no_recording: 'No recording file provided'
no_message: 'Call has no associated message'
- sdp_offer_required: 'sdp_offer is required'
- contact_phone_required: 'Contact phone number is required'
- permission_request_failed: 'Failed to send call permission request'
+ sdp_offer_required: 'sdp_offer est requis'
+ contact_phone_required: 'Le numéro de téléphone du contact est requis'
+ permission_request_failed: 'Échec de l''envoi de la demande d''autorisation d''appel'
openai:
- invalid_api_key: 'OpenAI API key is invalid or revoked. Please check your key in your OpenAI dashboard.'
+ invalid_api_key: 'La clé API OpenAI est invalide ou révoquée. Veuillez vérifier votre clé dans votre tableau de bord OpenAI.'
inboxes:
imap:
socket_error: Veuillez vérifier la connexion, l'adresse IMAP et réessayez.
@@ -241,9 +241,10 @@ fr:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
- twilio: 'Voice Call'
- whatsapp: 'WhatsApp Call'
+ twilio: 'Appel vocal'
+ whatsapp: 'Appel WhatsApp'
delivery_status:
error_code: 'Code d''erreur : %{error_code}'
activity:
@@ -289,8 +290,8 @@ fr:
issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}'
issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}'
whatsapp_call:
- permission_requested: 'Sent a call permission request to %{contact_name}.'
- permission_granted: '%{contact_name} accepted the call permission request.'
+ permission_requested: 'A envoyé une demande d''autorisation d''appel à %{contact_name}.'
+ permission_granted: '%{contact_name} a accepté la demande d''autorisation d''appel.'
csat:
not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions'
auto_resolve:
@@ -355,7 +356,7 @@ fr:
name: 'Linear'
short_description: 'Create and link Linear issues directly from conversations.'
description: 'Create issues in Linear directly from your conversation window. Alternatively, link existing Linear issues for a more streamlined and efficient issue tracking process.'
- attachment_link_title: 'Conversation (#%{conversation_id}) with %{name}'
+ attachment_link_title: 'Conversation (#%{conversation_id}) avec %{name}'
notion:
name: 'Notion'
short_description: 'Integrate databases, documents and pages directly with Captain.'
@@ -386,7 +387,7 @@ fr:
pdf_size_error: 'must be less than 10MB'
sync_not_supported_for_pdf: 'Sync is not supported for PDF documents'
sync_only_available_documents: 'Sync is only available for processed documents'
- sync_already_in_progress: 'Document sync is already in progress'
+ sync_already_in_progress: 'La synchronisation du document est déjà en cours'
pdf_upload_failed: 'Failed to upload PDF to OpenAI'
pdf_upload_success: 'PDF uploaded successfully with file_id: %{file_id}'
pdf_processing_failed: 'Failed to process PDF document %{document_id}: %{error}'
@@ -412,9 +413,16 @@ fr:
empty_placeholder: Aucun résultat trouvé.
loading_placeholder: Recherche en cours...
results_title: Résultats de recherche
+ results: Résultats de recherche
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ other: 'Found %{count} results'
+ submit: Rechercher
toc_header: 'Sur cette page'
sidebar:
- help_center: "Centre d'aide"
+ help_center: Centre d'aide
categories: Catégories
language: Langue
theme: Thème
@@ -443,6 +451,8 @@ fr:
others: autres
by: Par
no_articles: Il n'y a pas d'articles ici
+ previous: Précédent
+ next: Suivant
article_actions:
label: Ouvrir dans
view_markdown: Voir en Markdown
@@ -455,6 +465,7 @@ fr:
go_to_homepage: Site internet
visit_website: Visit website
appearance:
+ title: Apparence
system: Système
light: Clair
dark: Sombre
@@ -521,9 +532,9 @@ fr:
articles:
captain_not_available: 'Translation requires Captain to be enabled for this account'
locale_not_available: 'Locale not available in this portal'
- category_not_found: 'Category not found in this portal'
- no_articles_found: 'No articles found to process'
- invalid_status: 'Invalid status value'
+ category_not_found: 'Catégorie introuvable dans ce portail'
+ no_articles_found: 'Aucun article à traiter'
+ invalid_status: 'Valeur de statut invalide'
send_instructions:
email_required: 'L''e-mail est requis'
invalid_email_format: 'Invalid email format'
@@ -534,7 +545,7 @@ fr:
custom_domain_not_configured: 'Custom domain is not configured'
super_admin:
push_diagnostics:
- user_not_found: 'User not found.'
+ user_not_found: 'Utilisateur introuvable.'
no_subscriptions_to_test: 'Select at least one subscription to test.'
no_subscriptions_to_delete: 'Select at least one subscription to delete.'
subscriptions_deleted: "Deleted %{count} subscription(s). The user's device(s) will re-register on next app launch."
diff --git a/config/locales/he.yml b/config/locales/he.yml
index 7f6439e6d..39ad787fc 100644
--- a/config/locales/he.yml
+++ b/config/locales/he.yml
@@ -241,6 +241,7 @@ he:
whatsapp:
list_button_label: 'בחר פריט'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,32 @@ he:
empty_placeholder: לא נמצאו תוצאות.
loading_placeholder: מחפש...
results_title: תוצאות חיפוש
+ results: תוצאות חיפוש
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ two: 'Found %{count} results'
+ many: 'Found %{count} results'
+ other: 'Found %{count} results'
+ submit: חפש
toc_header: 'בעמוד זה'
+ sidebar:
+ help_center: מרכז עזרה
+ categories: קטגוריות
+ language: שפה
+ theme: Theme
+ open_sidebar: פתח סרגל צד
+ close_sidebar: סגור סרגל צד
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: חפש את המאמרים כאן או עיין בקטגוריות למטה.
common:
@@ -427,12 +453,21 @@ he:
others: אחרים
by: על ידי
no_articles: אין כאן מאמרים
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: נוצר עם
header:
go_to_homepage: אתר
visit_website: בקר באתר
appearance:
+ title: מראה
system: מערכת
light: בהיר
dark: כהה
diff --git a/config/locales/hi.yml b/config/locales/hi.yml
index 6f9a44e7c..06fabd7d5 100644
--- a/config/locales/hi.yml
+++ b/config/locales/hi.yml
@@ -241,6 +241,7 @@ hi:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,30 @@ hi:
empty_placeholder: No results found.
loading_placeholder: Searching...
results_title: Search results
+ results: Search Results
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ other: 'Found %{count} results'
+ submit: Search
toc_header: 'On this page'
+ sidebar:
+ help_center: Help Center
+ categories: Categories
+ language: Language
+ theme: Theme
+ open_sidebar: Open sidebar
+ close_sidebar: Close sidebar
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Search for the articles here or browse the categories below.
common:
@@ -427,12 +451,21 @@ hi:
others: others
by: By
no_articles: There are no articles here
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Made with
header:
go_to_homepage: Website
visit_website: Visit website
appearance:
+ title: Appearance
system: System
light: Light
dark: Dark
diff --git a/config/locales/hr.yml b/config/locales/hr.yml
index ea2a83880..2cbae5b61 100644
--- a/config/locales/hr.yml
+++ b/config/locales/hr.yml
@@ -241,6 +241,7 @@ hr:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,31 @@ hr:
empty_placeholder: No results found.
loading_placeholder: Searching...
results_title: Search results
+ results: Search Results
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ few: 'Found %{count} results'
+ other: 'Found %{count} results'
+ submit: Search
toc_header: 'On this page'
+ sidebar:
+ help_center: Centar za pomoć
+ categories: Categories
+ language: Jezik
+ theme: Theme
+ open_sidebar: Open sidebar
+ close_sidebar: Close sidebar
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Search for the articles here or browse the categories below.
common:
@@ -427,12 +452,21 @@ hr:
others: others
by: By
no_articles: There are no articles here
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Made with
header:
go_to_homepage: Website
visit_website: Visit website
appearance:
+ title: Appearance
system: System
light: Light
dark: Dark
diff --git a/config/locales/hu.yml b/config/locales/hu.yml
index 2de754354..64133fab1 100644
--- a/config/locales/hu.yml
+++ b/config/locales/hu.yml
@@ -241,6 +241,7 @@ hu:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,30 @@ hu:
empty_placeholder: Nincs találat.
loading_placeholder: Keresés...
results_title: Keresés eredménye
+ results: Keresés eredménye
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ other: 'Found %{count} results'
+ submit: Keresés
toc_header: 'Ezen az oldalon'
+ sidebar:
+ help_center: Súgóközpont
+ categories: Kategóriák
+ language: Nyelv
+ theme: Theme
+ open_sidebar: Oldalsáv megnyitása
+ close_sidebar: Oldalsáv becsukás
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Keress bejegyzéseket, vagy válassz a kategóriákból lejjebb.
common:
@@ -427,12 +451,21 @@ hu:
others: egyebek
by: Által
no_articles: Nincsenek bejegyzések
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: 'Ezzel készítve: '
header:
go_to_homepage: Honlap
visit_website: Visit website
appearance:
+ title: Megjelenés
system: Rendszer
light: Világos mód
dark: Sötét mód
diff --git a/config/locales/hy.yml b/config/locales/hy.yml
index 28845eaf3..664459655 100644
--- a/config/locales/hy.yml
+++ b/config/locales/hy.yml
@@ -241,6 +241,7 @@ hy:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,30 @@ hy:
empty_placeholder: Արդյունքներ չեն գտնվել։
loading_placeholder: Որոնում...
results_title: Որոնման արդյունքներ
+ results: Որոնման արդյունքներ
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ other: 'Found %{count} results'
+ submit: Որոնել
toc_header: 'Այս էջում'
+ sidebar:
+ help_center: Օգնության կենտրոն
+ categories: Կատեգորիաներ
+ language: Language
+ theme: Theme
+ open_sidebar: Բացել կողային վահանակը
+ close_sidebar: Փակել կողային վահանակը
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Որոնեք հոդվածներ այստեղ կամ դիտեք ստորև ներկայացված կատեգորիաները։
common:
@@ -427,12 +451,21 @@ hy:
others: այլք
by: Ըստ
no_articles: Այստեղ հոդվածներ չկան
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Ստեղծված է
header:
go_to_homepage: Կայք
visit_website: Visit website
appearance:
+ title: Appearance
system: Համակարգ
light: Լուսավոր
dark: Մութ
diff --git a/config/locales/id.yml b/config/locales/id.yml
index 246c7e1c3..f465157a5 100644
--- a/config/locales/id.yml
+++ b/config/locales/id.yml
@@ -241,6 +241,7 @@ id:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,29 @@ id:
empty_placeholder: Tidak ada hasil ditemukan.
loading_placeholder: Sedang mencari...
results_title: Hasil pencarian
+ results: Hasil Pencarian
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ other: 'Found %{count} results'
+ submit: Cari
toc_header: 'Di halaman ini'
+ sidebar:
+ help_center: Pusat Bantuan
+ categories: Kategori
+ language: Bahasa
+ theme: Theme
+ open_sidebar: Buka sidebar
+ close_sidebar: Tutup sidebar
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Cari artikel di sini atau jelajahi kategori di bawah ini.
common:
@@ -427,12 +450,21 @@ id:
others: others
by: By
no_articles: Tidak ada artikel di sini
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Dibuat oleh
header:
go_to_homepage: Website
visit_website: Visit website
appearance:
+ title: Appearance
system: Sistem
light: Light
dark: Dark
diff --git a/config/locales/is.yml b/config/locales/is.yml
index c20c24820..840ac4f4f 100644
--- a/config/locales/is.yml
+++ b/config/locales/is.yml
@@ -241,6 +241,7 @@ is:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,30 @@ is:
empty_placeholder: Engar niðurstöður fundust.
loading_placeholder: Searching...
results_title: Search results
+ results: Leitarniðurstöður
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ other: 'Found %{count} results'
+ submit: Leit
toc_header: 'On this page'
+ sidebar:
+ help_center: Help Center
+ categories: Categories
+ language: Language
+ theme: Theme
+ open_sidebar: Open sidebar
+ close_sidebar: Close sidebar
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Leitaðu að greinunum hér eða skoðaðu flokkana hér að neðan.
common:
@@ -427,12 +451,21 @@ is:
others: others
by: By
no_articles: There are no articles here
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Made with
header:
go_to_homepage: Website
visit_website: Visit website
appearance:
+ title: Appearance
system: System
light: Light
dark: Dark
diff --git a/config/locales/it.yml b/config/locales/it.yml
index 3b132a9d7..54e2c218f 100644
--- a/config/locales/it.yml
+++ b/config/locales/it.yml
@@ -241,6 +241,7 @@ it:
whatsapp:
list_button_label: 'Scegli un elemento'
call_permission_request_body: 'Vorremmo chiamarti riguardo alla tua conversazione.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Chiamata Vocale'
whatsapp: 'Chiamata WhatsApp'
@@ -412,7 +413,30 @@ it:
empty_placeholder: Nessun risultato trovato.
loading_placeholder: Ricerca...
results_title: Risultati di ricerca
+ results: Risultati di Ricerca
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ other: 'Found %{count} results'
+ submit: Cerca
toc_header: 'Su questa pagina'
+ sidebar:
+ help_center: Help Center
+ categories: Categorie
+ language: Lingua
+ theme: Theme
+ open_sidebar: Apri barra laterale
+ close_sidebar: Chiudi barra laterale
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Cerca gli articoli qui oppure sfoglia le categorie qui sotto.
common:
@@ -427,12 +451,21 @@ it:
others: altri
by: Da
no_articles: Non ci sono articoli qui
+ previous: Precedente
+ next: Successivo
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Realizzato con
header:
go_to_homepage: Sito Web
visit_website: Visita sito
appearance:
+ title: Aspetto
system: Sistema
light: Chiaro
dark: Scuro
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index f1409a55d..e6a0fbaa2 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -241,6 +241,7 @@ ja:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,29 @@ ja:
empty_placeholder: 該当結果が見つかりませんでした。
loading_placeholder: 検索中...
results_title: 検索結果
+ results: 検索結果
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ other: 'Found %{count} results'
+ submit: 検索
toc_header: 'このページで'
+ sidebar:
+ help_center: ヘルプセンター
+ categories: カテゴリー
+ language: 言語
+ theme: Theme
+ open_sidebar: サイドバーを開く
+ close_sidebar: サイドバーを閉じる
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: ここで記事を検索するか、以下のカテゴリを参照してください。
common:
@@ -427,12 +450,21 @@ ja:
others: その他
by: 作成者
no_articles: ここには記事がありません
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: 作成
header:
go_to_homepage: ウェブサイト
visit_website: Visit website
appearance:
+ title: 外観
system: システム
light: ライト
dark: ダーク
diff --git a/config/locales/ka.yml b/config/locales/ka.yml
index 8272e6eda..81f2921f7 100644
--- a/config/locales/ka.yml
+++ b/config/locales/ka.yml
@@ -241,6 +241,7 @@ ka:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,30 @@ ka:
empty_placeholder: No results found.
loading_placeholder: Searching...
results_title: Search results
+ results: Search Results
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ other: 'Found %{count} results'
+ submit: ძებნა
toc_header: 'On this page'
+ sidebar:
+ help_center: დახმარების ცენტრი
+ categories: კატეგორიები
+ language: Language
+ theme: Theme
+ open_sidebar: გვერდითი პანელის გახსნა
+ close_sidebar: გვერდითი პანელის დახურვა
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Search for the articles here or browse the categories below.
common:
@@ -427,12 +451,21 @@ ka:
others: others
by: By
no_articles: There are no articles here
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Made with
header:
go_to_homepage: Website
visit_website: Visit website
appearance:
+ title: Appearance
system: System
light: Light
dark: Dark
diff --git a/config/locales/ko.yml b/config/locales/ko.yml
index c52f3525b..e50dac85a 100644
--- a/config/locales/ko.yml
+++ b/config/locales/ko.yml
@@ -241,6 +241,7 @@ ko:
whatsapp:
list_button_label: '항목 선택'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,29 @@ ko:
empty_placeholder: 검색 결과가 없습니다.
loading_placeholder: 검색중...
results_title: 검색 결과
+ results: 검색 결과
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ other: 'Found %{count} results'
+ submit: 검색
toc_header: '이 페이지에서'
+ sidebar:
+ help_center: 도움말 센터
+ categories: 카테고리
+ language: 언어
+ theme: Theme
+ open_sidebar: 사이드바 열기
+ close_sidebar: 사이드바 닫기
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: 게시물을 여기서 검색하거나 아래에서 카테고리를 탐색해보세요.
common:
@@ -427,12 +450,21 @@ ko:
others: 기타
by: 작성자
no_articles: 게시물이 없습니다.
+ previous: 이전
+ next: 다음
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: 제작 도구
header:
go_to_homepage: 홈페이지
visit_website: 웹사이트 방문
appearance:
+ title: 외관
system: 시스템
light: 밝게
dark: 어둡게
diff --git a/config/locales/lt.yml b/config/locales/lt.yml
index 8e78bccf8..eaf3ff8ff 100644
--- a/config/locales/lt.yml
+++ b/config/locales/lt.yml
@@ -241,6 +241,7 @@ lt:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,32 @@ lt:
empty_placeholder: Nieko nerasta.
loading_placeholder: Ieškoma...
results_title: Paieškos rezultatai
+ results: Rezultatų Paieška
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ few: 'Found %{count} results'
+ many: 'Found %{count} results'
+ other: 'Found %{count} results'
+ submit: Ieškoti
toc_header: 'Šitame puslapyje'
+ sidebar:
+ help_center: Palaikymo centras
+ categories: Kategorijos
+ language: Kalba
+ theme: Theme
+ open_sidebar: Atidaryti šoninę juostą
+ close_sidebar: Uždaryti šoninę juostą
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Ieškokite straipsnių čia arba naršykite toliau pateiktose kategorijose.
common:
@@ -427,12 +453,21 @@ lt:
others: kiti
by: Autorius
no_articles: Čia nėra straipsnių
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Padaryta su
header:
go_to_homepage: Internetinis puslapis
visit_website: Visit website
appearance:
+ title: Išvaizda
system: Sistema
light: Šviesus
dark: Tamsus
diff --git a/config/locales/lv.yml b/config/locales/lv.yml
index 7f28dbca0..c8e45b2a4 100644
--- a/config/locales/lv.yml
+++ b/config/locales/lv.yml
@@ -241,6 +241,7 @@ lv:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,31 @@ lv:
empty_placeholder: Nav atrasts.
loading_placeholder: Meklēšana...
results_title: Meklēšanas rezultāti
+ results: Meklēšanas Rezultāti
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ zero: 'Found %{count} results'
+ one: Found 1 result
+ other: 'Found %{count} results'
+ submit: Meklēt
toc_header: 'Šajā lapā'
+ sidebar:
+ help_center: Palīdzības centrs
+ categories: Kategorijas
+ language: Valoda
+ theme: Theme
+ open_sidebar: Atvērt sānjoslu
+ close_sidebar: Aizvērt sānjoslu
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Meklējiet rakstus šeit, vai pārlūkojiet tālāk norādītās kategorijas.
common:
@@ -427,12 +452,21 @@ lv:
others: citi
by: autors
no_articles: Šeit nav neviena raksta
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Veidots ar
header:
go_to_homepage: Tīmekļa vietne
visit_website: Visit website
appearance:
+ title: Izskats
system: Sistēma
light: Gaišs
dark: Tumšs
diff --git a/config/locales/ml.yml b/config/locales/ml.yml
index 583e033b2..7dee9f525 100644
--- a/config/locales/ml.yml
+++ b/config/locales/ml.yml
@@ -241,6 +241,7 @@ ml:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,30 @@ ml:
empty_placeholder: ഒരു ഫലവും കണ്ടെത്താനായില്ല.
loading_placeholder: Searching...
results_title: Search results
+ results: Search Results
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ other: 'Found %{count} results'
+ submit: തിരയുക
toc_header: 'On this page'
+ sidebar:
+ help_center: സഹായ കേന്ദ്രം
+ categories: Categories
+ language: Language
+ theme: Theme
+ open_sidebar: Open sidebar
+ close_sidebar: Close sidebar
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Search for the articles here or browse the categories below.
common:
@@ -427,12 +451,21 @@ ml:
others: others
by: By
no_articles: There are no articles here
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Made with
header:
go_to_homepage: Website
visit_website: Visit website
appearance:
+ title: Appearance
system: System
light: Light
dark: Dark
diff --git a/config/locales/ms.yml b/config/locales/ms.yml
index e506a8825..095c8b9e3 100644
--- a/config/locales/ms.yml
+++ b/config/locales/ms.yml
@@ -241,6 +241,7 @@ ms:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,29 @@ ms:
empty_placeholder: Tiada dijumpa.
loading_placeholder: Searching...
results_title: Search results
+ results: Keputusan Carian
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ other: 'Found %{count} results'
+ submit: Cari
toc_header: 'On this page'
+ sidebar:
+ help_center: Pusat Bantuan
+ categories: Kategori
+ language: Language
+ theme: Theme
+ open_sidebar: Buka bar sisi
+ close_sidebar: Tutup bar sisi
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Search for the articles here or browse the categories below.
common:
@@ -427,12 +450,21 @@ ms:
others: others
by: By
no_articles: There are no articles here
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Made with
header:
go_to_homepage: Website
visit_website: Visit website
appearance:
+ title: Appearance
system: System
light: Light
dark: Dark
diff --git a/config/locales/ne.yml b/config/locales/ne.yml
index 3dc7731ce..cbc3d624f 100644
--- a/config/locales/ne.yml
+++ b/config/locales/ne.yml
@@ -241,6 +241,7 @@ ne:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,30 @@ ne:
empty_placeholder: कुनै परिणाम फेला परेन.
loading_placeholder: खोज्दै...
results_title: खोज परिणामहरू
+ results: खोज परिणामहरू
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ other: 'Found %{count} results'
+ submit: खोज्नुहोस्
toc_header: 'यस पृष्ठमा'
+ sidebar:
+ help_center: मद्दत केन्द्र
+ categories: श्रेणीहरू
+ language: Language
+ theme: Theme
+ open_sidebar: साइडबार खोल्नु
+ close_sidebar: साइडबार बन्द गर्नु
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: यहाँ लेखहरू खोज्नुहोस् वा तलका श्रेणीहरू हेर्नुहोस्।.
common:
@@ -427,12 +451,21 @@ ne:
others: others
by: द्वारा
no_articles: यहाँ कुनै लेखहरू छैनन्
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Made with
header:
go_to_homepage: वेबसाइट
visit_website: Visit website
appearance:
+ title: Appearance
system: प्रणाली
light: हल्का
dark: गाढा
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index 97a5ae9a4..7d872bcab 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -241,6 +241,7 @@ nl:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,30 @@ nl:
empty_placeholder: Geen resultaten gevonden.
loading_placeholder: Zoeken...
results_title: Zoekresultaten
+ results: Zoekresultaten
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ other: 'Found %{count} results'
+ submit: Zoeken
toc_header: 'Op deze pagina'
+ sidebar:
+ help_center: Help Center
+ categories: Categories
+ language: Taal
+ theme: Theme
+ open_sidebar: Open sidebar
+ close_sidebar: Close sidebar
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Zoek hier naar de artikelen of blader door de onderstaande categorieën.
common:
@@ -427,12 +451,21 @@ nl:
others: others
by: By
no_articles: There are no articles here
+ previous: Previous
+ next: Volgende
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Mogelijk gemaakt door
header:
go_to_homepage: Website
visit_website: Visit website
appearance:
+ title: Weergave
system: Systeem
light: Light
dark: Dark
diff --git a/config/locales/no.yml b/config/locales/no.yml
index c311ae85e..5a9caa60c 100644
--- a/config/locales/no.yml
+++ b/config/locales/no.yml
@@ -241,6 +241,7 @@
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,30 @@
empty_placeholder: No results found.
loading_placeholder: Searching...
results_title: Search results
+ results: Search Results
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ other: 'Found %{count} results'
+ submit: Søk
toc_header: 'On this page'
+ sidebar:
+ help_center: Help Center
+ categories: Categories
+ language: Language
+ theme: Theme
+ open_sidebar: Open sidebar
+ close_sidebar: Close sidebar
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Search for the articles here or browse the categories below.
common:
@@ -427,12 +451,21 @@
others: others
by: By
no_articles: There are no articles here
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Made with
header:
go_to_homepage: Website
visit_website: Visit website
appearance:
+ title: Appearance
system: System
light: Light
dark: Dark
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index 3c3c0c1be..f4368c230 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -241,6 +241,7 @@ pl:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,32 @@ pl:
empty_placeholder: Brak wyników.
loading_placeholder: Wyszukiwanie...
results_title: Wyniki wyszukiwania
+ results: Wyniki wyszukiwania
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ few: 'Found %{count} results'
+ many: 'Found %{count} results'
+ other: 'Found %{count} results'
+ submit: Szukaj
toc_header: 'Na tej stronie'
+ sidebar:
+ help_center: Centrum pomocy
+ categories: Kategorie
+ language: Język
+ theme: Theme
+ open_sidebar: Otwórz panel boczny
+ close_sidebar: Zamknij panel boczny
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Szukaj artykułów tutaj lub przeglądaj kategorie poniżej.
common:
@@ -427,12 +453,21 @@ pl:
others: others
by: By
no_articles: Nie ma tu żadnych artykułów
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Wykonane z
header:
go_to_homepage: Website
visit_website: Visit website
appearance:
+ title: Appearance
system: System
light: Light
dark: Dark
diff --git a/config/locales/pt.yml b/config/locales/pt.yml
index 1cec41f9d..e5cf9e883 100644
--- a/config/locales/pt.yml
+++ b/config/locales/pt.yml
@@ -241,6 +241,7 @@ pt:
whatsapp:
list_button_label: 'Escolha um item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,30 @@ pt:
empty_placeholder: Nenhum resultado encontrado.
loading_placeholder: A pesquisar...
results_title: Resultados da pesquisa
+ results: Resultados da pesquisa
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ other: 'Found %{count} results'
+ submit: Procurar
toc_header: 'Nesta página'
+ sidebar:
+ help_center: Centro de suporte
+ categories: Categorias
+ language: Idioma
+ theme: Theme
+ open_sidebar: Abrir barra lateral
+ close_sidebar: Fechar barra lateral
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Pesquise aqui os artigos ou procure as categorias abaixo.
common:
@@ -427,12 +451,21 @@ pt:
others: outros
by: Por
no_articles: Não há artigos aqui
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Feito com
header:
go_to_homepage: Website
visit_website: Visitar website
appearance:
+ title: Aparência
system: Sistema
light: Claro
dark: Escuro
diff --git a/config/locales/pt_BR.yml b/config/locales/pt_BR.yml
index 73dd356a7..f647c2c9a 100644
--- a/config/locales/pt_BR.yml
+++ b/config/locales/pt_BR.yml
@@ -110,7 +110,7 @@ pt_BR:
contact_phone_required: 'Número de telefone do contato é obrigatório'
permission_request_failed: 'Falha ao enviar solicitação de permissão de chamada'
openai:
- invalid_api_key: 'OpenAI API key is invalid or revoked. Please check your key in your OpenAI dashboard.'
+ invalid_api_key: 'A chave da API da OpenAI é inválida ou revogada. Por favor, verifique sua chave no seu painel da OpenAI.'
inboxes:
imap:
socket_error: Por favor, verifique a conexão de rede, endereço IMAP e tente novamente.
@@ -241,6 +241,7 @@ pt_BR:
whatsapp:
list_button_label: 'Escolha um item'
call_permission_request_body: 'Gostaríamos de ligar para você em relação à sua conversa.'
+ unsupported_message: 'Esta mensagem não está disponível.'
voice_call:
twilio: 'Chamada de Voz'
whatsapp: 'Chamada do WhatsApp'
@@ -412,6 +413,13 @@ pt_BR:
empty_placeholder: Nenhum resultado encontrado.
loading_placeholder: Procurando...
results_title: Resultados de pesquisa
+ results: Resultados da Pesquisa
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Um resultado encontrado
+ other: 'Found %{count} results'
+ submit: Pesquisar
toc_header: 'Nesta página'
sidebar:
help_center: Central de Ajuda
@@ -427,8 +435,8 @@ pt_BR:
popular_articles: Artigos populares
popular_articles_subtitle: O que outras pessoas estão lendo agora.
popular_label: 'Tópicos populares:'
- authors_others: "%{names} e mais %{count}"
- primary_nav: Navegação principal
+ authors_others: "%{names} e %{count} outros"
+ primary_nav: Primário
hero:
sub_title: Pesquise os artigos aqui ou navegue pelas categorias abaixo.
common:
@@ -443,6 +451,8 @@ pt_BR:
others: outros
by: Por
no_articles: Não há artigos aqui
+ previous: Anterior
+ next: Próximo
article_actions:
label: Abrir em
view_markdown: Ver como Markdown
@@ -455,6 +465,7 @@ pt_BR:
go_to_homepage: Site
visit_website: Visite o site
appearance:
+ title: Tema
system: Sistema
light: Claro
dark: Escuro
diff --git a/config/locales/ro.yml b/config/locales/ro.yml
index 89f8ea497..5b5772b41 100644
--- a/config/locales/ro.yml
+++ b/config/locales/ro.yml
@@ -241,6 +241,7 @@ ro:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,31 @@ ro:
empty_placeholder: Niciun rezultat găsit.
loading_placeholder: In căutare...
results_title: Rezultate căutare pentru
+ results: Rezultate căutare
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ few: 'Found %{count} results'
+ other: 'Found %{count} results'
+ submit: Caută
toc_header: 'Pe această pagină'
+ sidebar:
+ help_center: Asistenta
+ categories: Categorii
+ language: Limbă
+ theme: Theme
+ open_sidebar: Deschideți bara laterală
+ close_sidebar: Închideți bara laterală
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Căutați articolele aici sau răsfoiți categoriile de mai jos.
common:
@@ -427,12 +452,21 @@ ro:
others: others
by: By
no_articles: Nu există articole aici
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Realizat cu
header:
go_to_homepage: Website
visit_website: Visit website
appearance:
+ title: Appearance
system: Sistem
light: Light
dark: Dark
diff --git a/config/locales/ru.yml b/config/locales/ru.yml
index c5884b521..ff7ac7980 100644
--- a/config/locales/ru.yml
+++ b/config/locales/ru.yml
@@ -241,6 +241,7 @@ ru:
whatsapp:
list_button_label: 'Выберите элемент'
call_permission_request_body: 'Мы хотели бы позвонить Вам по поводу Вашего разговора.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Голосовой звонок'
whatsapp: 'WhatsApp звонок'
@@ -412,7 +413,32 @@ ru:
empty_placeholder: Результаты не найдены.
loading_placeholder: Идёт поиск...
results_title: Результаты поиска
+ results: Результаты поиска
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ few: 'Found %{count} results'
+ many: 'Found %{count} results'
+ other: 'Found %{count} results'
+ submit: Поиск
toc_header: 'На этой странице'
+ sidebar:
+ help_center: Центр поддержки
+ categories: Категории
+ language: Язык
+ theme: Theme
+ open_sidebar: Открыть боковую панель
+ close_sidebar: Закрыть боковую панель
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Ищите здесь статьи или выберите категории, указанные ниже.
common:
@@ -427,12 +453,21 @@ ru:
others: другие
by: От
no_articles: Здесь нет статей
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Сделано с
header:
go_to_homepage: Сайт
visit_website: Посетить сайт
appearance:
+ title: Образец
system: Система
light: Светлая
dark: Тёмная
diff --git a/config/locales/sh.yml b/config/locales/sh.yml
index 749490e19..37588e130 100644
--- a/config/locales/sh.yml
+++ b/config/locales/sh.yml
@@ -241,6 +241,7 @@ sh:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,32 @@ sh:
empty_placeholder: Nema pronađenih rezultata.
loading_placeholder: Pretraga...
results_title: Rezultati pretrage
+ results: Rezultati pretrage
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ few: 'Found %{count} results'
+ many: 'Found %{count} results'
+ other: 'Found %{count} results'
+ submit: Pretraži
toc_header: 'On this page'
+ sidebar:
+ help_center: Centar za pomoć
+ categories: Kategorije
+ language: Language
+ theme: Theme
+ open_sidebar: Otvori bočnu traku
+ close_sidebar: Zatvori bočnu traku
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Ovde pretražite članke ili pregledajte kategorije ispod.
common:
@@ -427,12 +453,21 @@ sh:
others: others
by: By
no_articles: There are no articles here
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Made with
header:
go_to_homepage: Website
visit_website: Visit website
appearance:
+ title: Appearance
system: System
light: Light
dark: Dark
diff --git a/config/locales/sk.yml b/config/locales/sk.yml
index 55256f38a..2a5c9d917 100644
--- a/config/locales/sk.yml
+++ b/config/locales/sk.yml
@@ -241,6 +241,7 @@ sk:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,32 @@ sk:
empty_placeholder: Žiadne výsledky neboli nájdené.
loading_placeholder: Searching...
results_title: Search results
+ results: Search Results
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ few: 'Found %{count} results'
+ many: 'Found %{count} results'
+ other: 'Found %{count} results'
+ submit: Hľadať
toc_header: 'On this page'
+ sidebar:
+ help_center: Help Center
+ categories: Categories
+ language: Language
+ theme: Theme
+ open_sidebar: Open sidebar
+ close_sidebar: Close sidebar
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Search for the articles here or browse the categories below.
common:
@@ -427,12 +453,21 @@ sk:
others: others
by: By
no_articles: There are no articles here
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Made with
header:
go_to_homepage: Website
visit_website: Visit website
appearance:
+ title: Appearance
system: System
light: Light
dark: Dark
diff --git a/config/locales/sl.yml b/config/locales/sl.yml
index 6182643c3..0cb87bfbb 100644
--- a/config/locales/sl.yml
+++ b/config/locales/sl.yml
@@ -241,6 +241,7 @@ sl:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,32 @@ sl:
empty_placeholder: Ni rezultatov.
loading_placeholder: Iskanje ...
results_title: Rezultati iskanja
+ results: Search Results
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ two: 'Found %{count} results'
+ few: 'Found %{count} results'
+ other: 'Found %{count} results'
+ submit: Išči
toc_header: 'Na tej strani'
+ sidebar:
+ help_center: Pomoč
+ categories: Kategorije
+ language: Jezik
+ theme: Theme
+ open_sidebar: Odpri stransko vrstico
+ close_sidebar: Zapri stransko vrstico
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Poiščite članke tukaj ali prebrskajte spodnje kategorije.
common:
@@ -427,12 +453,21 @@ sl:
others: ostali
by: Od
no_articles: Tukaj ni člankov
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Narejeno z
header:
go_to_homepage: Spletna stran
visit_website: Visit website
appearance:
+ title: Appearance
system: Sistem
light: Svetlo
dark: Temno
diff --git a/config/locales/sq.yml b/config/locales/sq.yml
index 35c5f6911..59e98e325 100644
--- a/config/locales/sq.yml
+++ b/config/locales/sq.yml
@@ -241,6 +241,7 @@ sq:
whatsapp:
list_button_label: 'Zgjidhni një element'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,30 @@ sq:
empty_placeholder: No results found.
loading_placeholder: Searching...
results_title: Search results
+ results: Search Results
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ other: 'Found %{count} results'
+ submit: Kërko
toc_header: 'On this page'
+ sidebar:
+ help_center: Qendra e Ndihmës
+ categories: Kategoritë
+ language: Language
+ theme: Theme
+ open_sidebar: Hap shiritin anësor
+ close_sidebar: Mbyll shiritin anësor
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Search for the articles here or browse the categories below.
common:
@@ -427,12 +451,21 @@ sq:
others: others
by: By
no_articles: There are no articles here
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Made with
header:
go_to_homepage: Website
visit_website: Vizitoni faqen e internetit
appearance:
+ title: Appearance
system: System
light: Light
dark: Dark
diff --git a/config/locales/sr.yml b/config/locales/sr.yml
index c220b5437..5120a1066 100644
--- a/config/locales/sr.yml
+++ b/config/locales/sr.yml
@@ -241,6 +241,7 @@ sr-Latn:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,31 @@ sr-Latn:
empty_placeholder: Ništa nije pronađeno.
loading_placeholder: Searching...
results_title: Search results
+ results: Rezultat pretrage
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ few: 'Found %{count} results'
+ other: 'Found %{count} results'
+ submit: Traži
toc_header: 'On this page'
+ sidebar:
+ help_center: Help Center
+ categories: Categories
+ language: Jezik
+ theme: Theme
+ open_sidebar: Otvorite bočnu traku
+ close_sidebar: Zatvorite bočnu traku
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Search for the articles here or browse the categories below.
common:
@@ -427,12 +452,21 @@ sr-Latn:
others: others
by: By
no_articles: There are no articles here
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Made with
header:
go_to_homepage: Website
visit_website: Visit website
appearance:
+ title: Appearance
system: System
light: Light
dark: Dark
diff --git a/config/locales/sv.yml b/config/locales/sv.yml
index ba1d82c77..94c0ba3cb 100644
--- a/config/locales/sv.yml
+++ b/config/locales/sv.yml
@@ -241,6 +241,7 @@ sv:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,30 @@ sv:
empty_placeholder: Inga resultat hittades.
loading_placeholder: Searching...
results_title: Search results
+ results: Sökresultat
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ other: 'Found %{count} results'
+ submit: Sök
toc_header: 'På denna sida'
+ sidebar:
+ help_center: Help Center
+ categories: Categories
+ language: Language
+ theme: Theme
+ open_sidebar: Open sidebar
+ close_sidebar: Close sidebar
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Sök efter artiklarna här eller bläddra i kategorierna nedan.
common:
@@ -427,12 +451,21 @@ sv:
others: andra
by: Av
no_articles: Det finns inga artiklar här
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Gjord med
header:
go_to_homepage: Hemsida
visit_website: Visit website
appearance:
+ title: Appearance
system: System
light: Ljus
dark: Mörk
diff --git a/config/locales/ta.yml b/config/locales/ta.yml
index c1faba784..0915cdabd 100644
--- a/config/locales/ta.yml
+++ b/config/locales/ta.yml
@@ -241,6 +241,7 @@ ta:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,30 @@ ta:
empty_placeholder: No results found.
loading_placeholder: Searching...
results_title: Search results
+ results: Search Results
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ other: 'Found %{count} results'
+ submit: Search
toc_header: 'On this page'
+ sidebar:
+ help_center: உதவி மையம்
+ categories: Categories
+ language: Language
+ theme: Theme
+ open_sidebar: Open sidebar
+ close_sidebar: Close sidebar
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Search for the articles here or browse the categories below.
common:
@@ -427,12 +451,21 @@ ta:
others: others
by: By
no_articles: There are no articles here
+ previous: Previous
+ next: அடுத்து
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Made with
header:
go_to_homepage: Website
visit_website: Visit website
appearance:
+ title: Appearance
system: System
light: Light
dark: Dark
diff --git a/config/locales/th.yml b/config/locales/th.yml
index 1f3420af2..3131e5918 100644
--- a/config/locales/th.yml
+++ b/config/locales/th.yml
@@ -241,6 +241,7 @@ th:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,29 @@ th:
empty_placeholder: ไม่พบผลการค้นหา
loading_placeholder: Searching...
results_title: Search results
+ results: ผลการค้นหา
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ other: 'Found %{count} results'
+ submit: ค้นหา
toc_header: 'On this page'
+ sidebar:
+ help_center: Help Center
+ categories: Categories
+ language: Language
+ theme: Theme
+ open_sidebar: Open sidebar
+ close_sidebar: Close sidebar
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Search for the articles here or browse the categories below.
common:
@@ -427,12 +450,21 @@ th:
others: others
by: By
no_articles: There are no articles here
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Made with
header:
go_to_homepage: Website
visit_website: Visit website
appearance:
+ title: Appearance
system: System
light: Light
dark: Dark
diff --git a/config/locales/tl.yml b/config/locales/tl.yml
index 64ea7e0b9..e95be4794 100644
--- a/config/locales/tl.yml
+++ b/config/locales/tl.yml
@@ -241,6 +241,7 @@ tl:
whatsapp:
list_button_label: 'Pumili ng isang item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,30 @@ tl:
empty_placeholder: Walang nahanap na resulta.
loading_placeholder: Naghahanap...
results_title: Mga resulta ng paghahanap
+ results: Search Results
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ other: 'Found %{count} results'
+ submit: Hanapin
toc_header: 'Sa pahinang ito'
+ sidebar:
+ help_center: Help Center
+ categories: Mga kategorya
+ language: Language
+ theme: Theme
+ open_sidebar: Buksan ang sidebar
+ close_sidebar: Isara ang sidebar
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Maghanap ng mga artikulo dito o tingnan ang mga kategorya sa ibaba.
common:
@@ -427,12 +451,21 @@ tl:
others: mga iba
by: Ni
no_articles: Walang mga artikulo dito
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Ginawa gamit ang
header:
go_to_homepage: Website
visit_website: Bisitahin ang website
appearance:
+ title: Appearance
system: Sistema
light: Maliwanag
dark: Madilim
diff --git a/config/locales/tr.yml b/config/locales/tr.yml
index f3e72a41e..fdeb50341 100644
--- a/config/locales/tr.yml
+++ b/config/locales/tr.yml
@@ -241,6 +241,7 @@ tr:
whatsapp:
list_button_label: 'Bir öğe seçin'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,30 @@ tr:
empty_placeholder: Sonuç bulunamadı.
loading_placeholder: Aranıyor...
results_title: Arama sonuçları
+ results: Arama Sonucu
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ other: 'Found %{count} results'
+ submit: Ara
toc_header: 'Bu sayfada'
+ sidebar:
+ help_center: Yardım Merkezi
+ categories: Kategoriler
+ language: Dil
+ theme: Theme
+ open_sidebar: Kenar Çubuğunu Aç
+ close_sidebar: Kenar Çubuğunu Kapat
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Makaleleri buradan arayın veya aşağıdaki kategorilere göz atın.
common:
@@ -427,12 +451,21 @@ tr:
others: diğerleri
by: Tarafından
no_articles: Burada makale bulunmuyor
+ previous: Önceki
+ next: Sonraki
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: İle yapılmıştır
header:
go_to_homepage: Website
visit_website: Siteyi ziyaret et
appearance:
+ title: Görünüm
system: Sistem
light: Açık Mod
dark: Koyu Mod
diff --git a/config/locales/uk.yml b/config/locales/uk.yml
index 9ba280726..7cef7561a 100644
--- a/config/locales/uk.yml
+++ b/config/locales/uk.yml
@@ -241,6 +241,7 @@ uk:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,32 @@ uk:
empty_placeholder: Результатів не знайдено.
loading_placeholder: Шукаємо...
results_title: Результати пошуку
+ results: Результати пошуку
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ few: 'Found %{count} results'
+ many: 'Found %{count} results'
+ other: 'Found %{count} results'
+ submit: Пошук
toc_header: 'На цій сторінці'
+ sidebar:
+ help_center: Довідковий центр
+ categories: Категорії
+ language: Мова
+ theme: Theme
+ open_sidebar: Відкрити бічну панель
+ close_sidebar: Закрити бічну панель
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Шукайте тут або перегляньте категорії нижче.
common:
@@ -427,12 +453,21 @@ uk:
others: інші
by: Від
no_articles: Тут немає статей
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Зроблено з
header:
go_to_homepage: Вебсайт
visit_website: Visit website
appearance:
+ title: Оформлення
system: Системна
light: Світла
dark: Темна
diff --git a/config/locales/ur.yml b/config/locales/ur.yml
index 1ec17a447..0a3d9c705 100644
--- a/config/locales/ur.yml
+++ b/config/locales/ur.yml
@@ -241,6 +241,7 @@ ur:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,30 @@ ur:
empty_placeholder: کوئی نتیجہ نہیں.
loading_placeholder: Searching...
results_title: Search results
+ results: تلاش کے نتائج
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ other: 'Found %{count} results'
+ submit: تلاش کریں۔
toc_header: 'On this page'
+ sidebar:
+ help_center: Help Center
+ categories: Categories
+ language: Language
+ theme: Theme
+ open_sidebar: Open sidebar
+ close_sidebar: Close sidebar
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Search for the articles here or browse the categories below.
common:
@@ -427,12 +451,21 @@ ur:
others: others
by: By
no_articles: There are no articles here
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Made with
header:
go_to_homepage: Website
visit_website: Visit website
appearance:
+ title: Appearance
system: System
light: Light
dark: Dark
diff --git a/config/locales/ur_IN.yml b/config/locales/ur_IN.yml
index f3c26d1c8..f3cfab8b1 100644
--- a/config/locales/ur_IN.yml
+++ b/config/locales/ur_IN.yml
@@ -241,6 +241,7 @@ ur:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,30 @@ ur:
empty_placeholder: No results found.
loading_placeholder: Searching...
results_title: Search results
+ results: Search Results
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ one: Found 1 result
+ other: 'Found %{count} results'
+ submit: تلاش کریں
toc_header: 'On this page'
+ sidebar:
+ help_center: مدد مرکز
+ categories: زمرہ جات
+ language: Language
+ theme: Theme
+ open_sidebar: سائڈبار کھولیں
+ close_sidebar: سائڈبار بند کریں
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Search for the articles here or browse the categories below.
common:
@@ -427,12 +451,21 @@ ur:
others: others
by: By
no_articles: There are no articles here
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Made with
header:
go_to_homepage: Website
visit_website: Visit website
appearance:
+ title: Appearance
system: System
light: Light
dark: Dark
diff --git a/config/locales/vi.yml b/config/locales/vi.yml
index fa827806f..b6430287e 100644
--- a/config/locales/vi.yml
+++ b/config/locales/vi.yml
@@ -241,6 +241,7 @@ vi:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,29 @@ vi:
empty_placeholder: Không tìm thấy kết quả.
loading_placeholder: Đang tìm kiếm...
results_title: Các kết quả tìm kiếm
+ results: Các kết quả tìm kiếm
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ other: 'Found %{count} results'
+ submit: Tìm kiếm
toc_header: 'Trên trang này'
+ sidebar:
+ help_center: Help Center
+ categories: Danh mục
+ language: Ngôn ngữ
+ theme: Theme
+ open_sidebar: Mở thanh bên
+ close_sidebar: Đóng thanh bên
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: Tìm trong bài viết hoặc xem danh mục dưới đây.
common:
@@ -427,12 +450,21 @@ vi:
others: others
by: By
no_articles: Không tìm thấy bài viết
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: Tạo bởi
header:
go_to_homepage: Website
visit_website: Visit website
appearance:
+ title: Appearance
system: System
light: Light
dark: Dark
diff --git a/config/locales/zh_CN.yml b/config/locales/zh_CN.yml
index 89ebf755d..5d1bdef9f 100644
--- a/config/locales/zh_CN.yml
+++ b/config/locales/zh_CN.yml
@@ -241,6 +241,7 @@ zh_CN:
whatsapp:
list_button_label: 'Choose an item'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,29 @@ zh_CN:
empty_placeholder: 未找到结果。
loading_placeholder: 搜索中...
results_title: 搜索结果
+ results: 搜索结果
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ other: 'Found %{count} results'
+ submit: 搜索
toc_header: '在此页面'
+ sidebar:
+ help_center: 帮助中心
+ categories: 类别
+ language: 语言
+ theme: Theme
+ open_sidebar: 打开侧边栏
+ close_sidebar: 关闭侧边栏
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: 在这里搜索文章或浏览下面的分类
common:
@@ -427,12 +450,21 @@ zh_CN:
others: 其他
by: 作者:
no_articles: 没有文章在这里
+ previous: Previous
+ next: Next
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: 制作于
header:
go_to_homepage: 网站
visit_website: Visit website
appearance:
+ title: 外观
system: 系统
light: 浅色
dark: 暗色
diff --git a/config/locales/zh_TW.yml b/config/locales/zh_TW.yml
index 6e8055c51..d51d86f29 100644
--- a/config/locales/zh_TW.yml
+++ b/config/locales/zh_TW.yml
@@ -241,6 +241,7 @@ zh_TW:
whatsapp:
list_button_label: '選擇一個項目'
call_permission_request_body: 'We would like to call you regarding your conversation.'
+ unsupported_message: 'This message is unavailable.'
voice_call:
twilio: 'Voice Call'
whatsapp: 'WhatsApp Call'
@@ -412,7 +413,29 @@ zh_TW:
empty_placeholder: 查無結果。
loading_placeholder: 搜尋中...
results_title: 搜尋結果
+ results: 搜尋結果
+ results_for: "Search Results for '%{query}'"
+ no_results: "No results found for '%{query}'"
+ found_results:
+ other: 'Found %{count} results'
+ submit: 搜尋
toc_header: '本頁內容'
+ sidebar:
+ help_center: 幫助中心
+ categories: 分類
+ language: 語言
+ theme: Theme
+ open_sidebar: 開啟側邊欄
+ close_sidebar: 關閉側邊欄
+ browse: Browse
+ back_to_category: Back to %{name}
+ browse_by_topic: Browse by topic
+ browse_by_topic_subtitle: Find guides, tutorials, and answers organised by category.
+ popular_articles: Popular articles
+ popular_articles_subtitle: What other people are reading right now.
+ popular_label: 'Popular topics:'
+ authors_others: "%{names} and %{count} others"
+ primary_nav: Primary
hero:
sub_title: 在此搜尋文章或瀏覽以下分類。
common:
@@ -423,16 +446,25 @@ zh_TW:
articles: 篇文章
author: 位作者
authors: 位作者
- other: 其他
+ other: other
others: 其他
by: 作者:
no_articles: 這裡還沒有文章
+ previous: 上一頁
+ next: 下一頁
+ article_actions:
+ label: Open in
+ view_markdown: View as Markdown
+ open_in_chatgpt: Open in ChatGPT
+ open_in_claude: Open in Claude
+ llm_prompt: "Read the following article and help me understand it: %{url}"
footer:
made_with: 由以下技術製作
header:
go_to_homepage: 網站首頁
visit_website: 前往網站
appearance:
+ title: 外觀
system: 系統
light: 淺色
dark: 深色
From 36a05097fa44b716a8d489d0aa40e188c5d4cc30 Mon Sep 17 00:00:00 2001
From: ramalau <71857041+ramalau0@users.noreply.github.com>
Date: Tue, 2 Jun 2026 19:58:13 +0200
Subject: [PATCH 21/34] fix(webhooks): strip trailing newlines from webhook
message content (#14272)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The TipTap/ProseMirror editor stores agent messages with trailing
paragraph nodes that produce trailing newlines (e.g. \`\n\n\n\`) in the
\`content\` field. While Chatwoot's native channel delivery already
handles this, webhook payloads and API responses were returning raw
content with trailing whitespace — causing visible blank space below
messages in every external integration that consumes Chatwoot webhooks
(WhatsApp via Evolution API, Telegram bots, custom webhook consumers).
Closes #13459
## Root cause
\`Messages::WebhookContentNormalizer\` already strips CommonMark hard
line breaks (\`\\\` + newline) for webhook consumers, but it did not
strip trailing whitespace. All webhook and API responses flow through
this normaliser, so it is the single correct place to apply the fix
without touching stored data.
## What changed
Added \`.rstrip\` to \`Messages::WebhookContentNormalizer.normalize\`:
\`\`\`ruby
# before
text.gsub(/\\\r?\n/, "\n")
# after
text.gsub(/\\\r?\n/, "\n").rstrip
\`\`\`
## Trade-offs considered
| Option | Decision |
|---|---|
| \`before_save\` on \`Message\` model | Would clean stored data but is
a broader change affecting all message creation paths and would require
a data migration for existing records. Out of scope for this bug. |
| Trim in each channel's send path | DRY violation — many channels, each
would need the same patch. |
| Fix at normaliser level (chosen) | Single location, only affects
webhook/API output, zero risk to stored data or native channel delivery.
|
**Known limitation:** existing messages in the database still have
trailing newlines in storage. They will be delivered correctly through
webhooks after this fix, but a follow-up migration could clean stored
content if needed.
## How to reproduce
1. Send an agent reply from the Chatwoot UI
2. Inspect the \`content\` field of the outgoing \`message_created\`
webhook payload
3. Observe trailing \`\n\n\n\` after the message text
After this fix, the \`content\` field is trimmed before delivery.
---------
Co-authored-by: Ramalau Debeila
Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
---
.../messages/webhook_content_normalizer.rb | 3 +-
.../webhook_content_normalizer_spec.rb | 41 +++++++++++++++++++
2 files changed, 43 insertions(+), 1 deletion(-)
create mode 100644 spec/services/messages/webhook_content_normalizer_spec.rb
diff --git a/app/services/messages/webhook_content_normalizer.rb b/app/services/messages/webhook_content_normalizer.rb
index b45f83ad0..5fa66fe9c 100644
--- a/app/services/messages/webhook_content_normalizer.rb
+++ b/app/services/messages/webhook_content_normalizer.rb
@@ -1,10 +1,11 @@
# Strips CommonMark hard line breaks from stored markdown source (backslash before newline).
# ProseMirror / the dashboard editor emits this form so soft breaks survive as markdown;
# webhook consumers expect plain newlines without a visible backslash (e.g. WhatsApp gateways).
+# Also strips trailing newlines introduced by TipTap/ProseMirror trailing paragraph nodes.
class Messages::WebhookContentNormalizer
def self.normalize(text)
return text if text.blank?
- text.gsub(/\\\r?\n/, "\n")
+ text.gsub(/\\\r?\n/, "\n").sub(/(\r?\n)+\z/, '')
end
end
diff --git a/spec/services/messages/webhook_content_normalizer_spec.rb b/spec/services/messages/webhook_content_normalizer_spec.rb
new file mode 100644
index 000000000..ca5023b9d
--- /dev/null
+++ b/spec/services/messages/webhook_content_normalizer_spec.rb
@@ -0,0 +1,41 @@
+require 'rails_helper'
+
+RSpec.describe Messages::WebhookContentNormalizer do
+ describe '.normalize' do
+ it 'returns nil unchanged' do
+ expect(described_class.normalize(nil)).to be_nil
+ end
+
+ it 'returns blank string unchanged' do
+ expect(described_class.normalize('')).to eq('')
+ end
+
+ it 'strips trailing newlines added by TipTap/ProseMirror' do
+ expect(described_class.normalize("hello\n\n\n")).to eq('hello')
+ end
+
+ it 'preserves intentional trailing spaces' do
+ expect(described_class.normalize("hello \n\n")).to eq('hello ')
+ end
+
+ it 'replaces CommonMark hard line breaks (backslash-newline) with plain newlines' do
+ expect(described_class.normalize("hello\\\nworld")).to eq("hello\nworld")
+ end
+
+ it 'replaces CommonMark hard line breaks with CRLF with plain newlines' do
+ expect(described_class.normalize("hello\\\r\nworld")).to eq("hello\nworld")
+ end
+
+ it 'preserves intentional internal newlines' do
+ expect(described_class.normalize("line one\nline two")).to eq("line one\nline two")
+ end
+
+ it 'strips trailing CRLF newlines without leaving dangling carriage returns' do
+ expect(described_class.normalize("hello\r\n\r\n")).to eq('hello')
+ end
+
+ it 'handles both hard line breaks and trailing newlines together' do
+ expect(described_class.normalize("hello\\\nworld\n\n\n")).to eq("hello\nworld")
+ end
+ end
+end
From b791d75b30dc6478faed54b7f65939dc0ee85ec2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Vin=C3=ADcius=20Fitzner?=
Date: Wed, 3 Jun 2026 03:35:25 -0300
Subject: [PATCH 22/34] fix(microsoft): prevent OAuth admin consent loop
(#13962)
Fixes #9775
## Description
This fixes a repeated admin consent loop in the Microsoft OAuth flow
when connecting a Microsoft email inbox.
Chatwoot was always sending `prompt=consent` in the Microsoft
authorization URL. In the current code path, this parameter is only used
when building the authorization URL and is not required by the callback,
token exchange, token persistence, or refresh flow.
By removing the forced consent prompt, the OAuth flow can proceed
normally without repeatedly sending users back through the admin consent
screen.
## What changed
- removed `prompt: 'consent'` from the Microsoft authorization URL
- added a regression assertion to ensure `prompt` is not included in the
generated URL
## Why this is safe
- `redirect_uri`, `scope`, and `state` remain unchanged
- callback and token exchange flow remain unchanged
- refresh token flow remains unchanged
- no other part of the current Microsoft inbox flow depends on forcing a
consent screen
## Testing
- updated controller spec to assert that the generated authorization URL
does not include `prompt`
---
.../api/v1/accounts/microsoft/authorizations_controller.rb | 3 +--
.../api/v1/accounts/microsoft/authorization_controller_spec.rb | 1 +
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/app/controllers/api/v1/accounts/microsoft/authorizations_controller.rb b/app/controllers/api/v1/accounts/microsoft/authorizations_controller.rb
index a300b5f59..c65a3031d 100644
--- a/app/controllers/api/v1/accounts/microsoft/authorizations_controller.rb
+++ b/app/controllers/api/v1/accounts/microsoft/authorizations_controller.rb
@@ -6,8 +6,7 @@ class Api::V1::Accounts::Microsoft::AuthorizationsController < Api::V1::Accounts
{
redirect_uri: "#{base_url}/microsoft/callback",
scope: scope,
- state: state,
- prompt: 'consent'
+ state: state
}
)
if redirect_url
diff --git a/spec/controllers/api/v1/accounts/microsoft/authorization_controller_spec.rb b/spec/controllers/api/v1/accounts/microsoft/authorization_controller_spec.rb
index 60b05b36c..18a26a393 100644
--- a/spec/controllers/api/v1/accounts/microsoft/authorization_controller_spec.rb
+++ b/spec/controllers/api/v1/accounts/microsoft/authorization_controller_spec.rb
@@ -43,6 +43,7 @@ RSpec.describe 'Microsoft Authorization API', type: :request do
]
expect(params['scope']).to eq(expected_scope)
expect(params['redirect_uri']).to eq(["#{ENV.fetch('FRONTEND_URL', 'http://localhost:3000')}/microsoft/callback"])
+ expect(url).not_to match(/(?:\?|&)prompt=/)
# Validate state parameter exists and can be decoded back to the account
expect(params['state']).to be_present
From 7acbe8b3ff154ceee410462cf25c213501747c27 Mon Sep 17 00:00:00 2001
From: JoseGrdar <168092473+JoseGrdar@users.noreply.github.com>
Date: Wed, 3 Jun 2026 09:20:21 +0200
Subject: [PATCH 23/34] fix(whatsapp): truncate location fallback_title to 255
chars to avoid silent message drop (#14517)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
## Summary
`Whatsapp::IncomingMessageBaseService#attach_location` builds a
`fallback_title` by concatenating `location['name']` and
`location['address']` with no length cap, then stores it directly into
`Attachment#fallback_title`. `ApplicationRecord` enforces a generic
255-character limit on string columns, so any WhatsApp location whose
`"#{name}, #{address}"` exceeds 255 chars (a common case for Google
Places that include a long full address) raises
`ActiveRecord::RecordInvalid` deep inside the Sidekiq job. The message
and attachment INSERTs are part of the same transaction, so the whole
thing rolls back. Sidekiq retries once; the retry dedup-skips the wamid
silently and exits without an error. **Result: the message is
irrecoverably lost — no row in `messages`, no entry in the UI, no
outgoing webhook, no clue for the operator.**
Confirmed in `v4.13.0`, `v4.14.0`, and `develop` (commit `f33e469`,
2026-05-20). No upstream issue found before opening this PR.
## How to reproduce
1. From WhatsApp, share a Google Place whose `name + ", " + address` is
> 255 chars. The Spanish business address `Gremi de Fusters, 33,
Edificio VIP Asima, Piso 2, Local 2, Norte, 07009 Polígon industrial de
Son Castelló, Illes Balears, España` (132 chars) used as both `name` and
`address` is enough.
2. Sidekiq logs:
```
ERROR ActiveRecord::RecordInvalid: Validation failed:
Attachments fallback title is too long (maximum is 255 characters)
```
3. The `messages` table has no row. The conversation UI shows nothing
for that timestamp.
4. The first retry "Performed" successfully but creates nothing — the
dedup-by-source-id silently swallows the failure.
## Fix
Cap the existing concatenated title at 255 chars via `.first(255)`.
Minimal change, no behavioural difference for any message shorter than
the limit, prevents the silent data loss for any longer ones.
```diff
- location_name = location['name'] ? "#{location['name']}, #{location['address']}" : ''
+ location_name = (location['name'] ? "#{location['name']}, #{location['address']}" : '').first(255)
```
## Alternatives considered
- **Increase the validation limit on `Attachment#fallback_title`**: more
invasive; would touch other inbound channels and possibly require a DB
column change.
- **Use `name` alone (no concat)**: cleaner semantically (in many real
payloads `name == address`), but changes user-visible behaviour. Left as
a follow-up if desired.
- **Truncate with ellipsis**: cosmetic only; deferred.
This PR is intentionally minimal so it can be merged on its own.
---------
Co-authored-by: Sony Mathew
Co-authored-by: Sony Mathew <2040199+sony-mathew@users.noreply.github.com>
---
.../whatsapp/incoming_message_base_service.rb | 2 +-
.../whatsapp/incoming_message_service_spec.rb | 26 +++++++++++++++++++
2 files changed, 27 insertions(+), 1 deletion(-)
diff --git a/app/services/whatsapp/incoming_message_base_service.rb b/app/services/whatsapp/incoming_message_base_service.rb
index 722ac3e4d..9e0720f74 100644
--- a/app/services/whatsapp/incoming_message_base_service.rb
+++ b/app/services/whatsapp/incoming_message_base_service.rb
@@ -147,7 +147,7 @@ class Whatsapp::IncomingMessageBaseService
def attach_location
location = messages_data.first['location']
- location_name = location['name'] ? "#{location['name']}, #{location['address']}" : ''
+ location_name = (location['name'] ? "#{location['name']}, #{location['address']}" : '').first(255)
@message.attachments.new(
account_id: @message.account_id,
file_type: file_content_type(message_type),
diff --git a/spec/services/whatsapp/incoming_message_service_spec.rb b/spec/services/whatsapp/incoming_message_service_spec.rb
index fe6b179c1..430aa1561 100644
--- a/spec/services/whatsapp/incoming_message_service_spec.rb
+++ b/spec/services/whatsapp/incoming_message_service_spec.rb
@@ -381,6 +381,32 @@ describe Whatsapp::IncomingMessageService do
expect(location_attachment.coordinates_long).to eq(-122.3895553)
expect(location_attachment.external_url).to eq('http://location_url.test')
end
+
+ it 'truncates long fallback titles to avoid dropping location messages' do
+ long_place_name = [
+ 'Gremi de Fusters, 33, Edificio VIP Asima, Piso 2, Local 2, Norte',
+ '07009 Poligon industrial de Son Castello, Illes Balears, Espana'
+ ].join(', ')
+ source_id = 'wamid.long-location-fallback-title'
+ params = {
+ 'contacts' => [{ 'profile' => { 'name' => 'Sojan Jose' }, 'wa_id' => '2423423243' }],
+ 'messages' => [{ 'from' => '2423423243', 'id' => source_id,
+ 'location' => { 'id' => 'b1c68f38-8734-4ad3-b4a1-ef0c10d683',
+ :address => long_place_name,
+ :latitude => 37.7893768,
+ :longitude => -122.3895553,
+ :name => long_place_name,
+ :url => 'http://location_url.test' },
+ 'timestamp' => '1633034394', 'type' => 'location' }]
+ }.with_indifferent_access
+
+ expect { described_class.new(inbox: whatsapp_channel.inbox, params: params).perform }
+ .to change { Message.where(source_id: source_id).count }.from(0).to(1)
+
+ location_attachment = Message.find_by!(source_id: source_id).attachments.first
+ expect(location_attachment.fallback_title).to eq("#{long_place_name}, #{long_place_name}".first(255))
+ expect(location_attachment.fallback_title.length).to eq(255)
+ end
end
context 'when valid contact message params' do
From 0d59fb44590b61d1b19d3366d03a765c98f5c423 Mon Sep 17 00:00:00 2001
From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Date: Wed, 3 Jun 2026 14:18:19 +0530
Subject: [PATCH 24/34] fix: validate portal color format (#14632)
---
app/models/portal.rb | 1 +
1 file changed, 1 insertion(+)
diff --git a/app/models/portal.rb b/app/models/portal.rb
index 41c4d3edd..37665a15c 100644
--- a/app/models/portal.rb
+++ b/app/models/portal.rb
@@ -42,6 +42,7 @@ class Portal < ApplicationRecord
validates :name, presence: true
validates :slug, presence: true, uniqueness: true
validates :custom_domain, uniqueness: true, allow_nil: true
+ validates :color, format: { with: /\A#(?:\h{3}|\h{6})\z/ }, allow_blank: true
validate :config_json_format
scope :active, -> { where(archived: false) }
From d028cc1984e57d18c54d90e3e940ef64f76c2feb Mon Sep 17 00:00:00 2001
From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Date: Wed, 3 Jun 2026 14:18:48 +0530
Subject: [PATCH 25/34] fix: prevent list marker overflow in messages (#14618)
---
app/javascript/widget/assets/scss/woot.scss | 19 ++++++++++---
tailwind.config.js | 30 ++++++++++++---------
2 files changed, 33 insertions(+), 16 deletions(-)
diff --git a/app/javascript/widget/assets/scss/woot.scss b/app/javascript/widget/assets/scss/woot.scss
index b47179d29..c42273215 100755
--- a/app/javascript/widget/assets/scss/woot.scss
+++ b/app/javascript/widget/assets/scss/woot.scss
@@ -34,13 +34,24 @@ body {
.message-content {
ul {
- list-style: disc;
- @apply ltr:pl-3 rtl:pr-3;
+ @apply list-disc list-inside;
}
ol {
- list-style: decimal;
- @apply ltr:pl-4 rtl:pr-4;
+ @apply list-decimal list-inside;
+ }
+
+ li {
+ padding-inline-start: 1.5em;
+ text-indent: -1.5em;
+
+ > p:first-child {
+ @apply inline;
+ }
+
+ > * {
+ text-indent: 0;
+ }
}
}
diff --git a/tailwind.config.js b/tailwind.config.js
index b4c4b9078..cc2aebb63 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -106,24 +106,30 @@ const tailwindConfig = {
textDecoration: 'underline',
},
ul: {
- paddingInlineStart: '0.625em',
+ paddingInlineStart: '0',
+ listStylePosition: 'inside',
},
ol: {
- paddingInlineStart: '0.625em',
+ paddingInlineStart: '0',
+ listStylePosition: 'inside',
},
- 'ul li': {
- margin: '0 0 0.5em 1em',
+ 'ul > li': {
+ marginBlockEnd: '0.5em',
listStyleType: 'disc',
- '[dir="rtl"] &': {
- margin: '0 1em 0.5em 0',
- },
+ paddingInlineStart: '1.5em',
+ textIndent: '-1.5em',
},
- 'ol li': {
- margin: '0 0 0.5em 1em',
+ 'ol > li': {
+ marginBlockEnd: '0.5em',
listStyleType: 'decimal',
- '[dir="rtl"] &': {
- margin: '0 1em 0.5em 0',
- },
+ paddingInlineStart: '1.5em',
+ textIndent: '-1.5em',
+ },
+ 'li > p:first-child': {
+ display: 'inline',
+ },
+ 'li > *': {
+ textIndent: '0',
},
blockquote: {
color: 'rgb(var(--slate-11))',
From 1beaa284c60d2ae0313e4ca1cda70871e18a2d15 Mon Sep 17 00:00:00 2001
From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Date: Wed, 3 Jun 2026 15:05:17 +0530
Subject: [PATCH 26/34] feat: inline images in website and email channels
(#14516)
# Pull Request Template
## Description
This PR adds support for inline image uploads in the reply editor for
Email and Website (chat widget) channels.
Agents can now insert images inline between text and resize them
directly in the editor by dragging the bottom corner, similar to the
help center editor experience.
Image sizes are preserved through markdown using the `cw_image_width`
URL param and render correctly in both outgoing emails and chat widget
messages.
Agents can also paste copied images directly into Email or Website
replies using **Shift+Cmd+V** (Shift+Ctrl+V on Windows/Linux). The image
gets inserted inline at the cursor position and supports resizing just
like uploaded images. Regular **Cmd+V / Ctrl+V** behavior remains
unchanged and continues to add images as attachments, so both inline and
attachment flows are supported.
### Prosemirror repo PR:
https://github.com/chatwoot/prosemirror-schema/pull/48
Fixes
https://linear.app/chatwoot/issue/CW-7133/inline-images-in-live-chat-and-email
https://linear.app/chatwoot/issue/CW-7225/ghsa-8j9w-jppp-xcfc-html-attribute-injection-via-unvalidated-cw-image
## Type of change
- [x] New feature (non-breaking change which adds functionality)
## How Has This Been Tested?
### Screencast
https://github.com/user-attachments/assets/a928f852-ab15-413a-9d35-6ea69b718ecf
## Checklist:
- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules
---------
Co-authored-by: Muhsin Keloth
---
.../components/widgets/WootWriter/Editor.vue | 164 ++++++++----------
app/javascript/dashboard/constants/editor.js | 22 +--
.../dashboard/helper/editorHelper.js | 25 ---
.../helper/specs/editorHelper.spec.js | 66 -------
.../i18n/locale/en/conversation.json | 1 +
.../settings/profile/MessageSignature.vue | 1 -
.../shared/helpers/MessageFormatter.js | 25 ++-
lib/base_markdown_renderer.rb | 32 +++-
package.json | 2 +-
pnpm-lock.yaml | 10 +-
spec/lib/base_markdown_renderer_spec.rb | 29 +++-
11 files changed, 150 insertions(+), 227 deletions(-)
diff --git a/app/javascript/dashboard/components/widgets/WootWriter/Editor.vue b/app/javascript/dashboard/components/widgets/WootWriter/Editor.vue
index 3da526fc0..a8f2d0a2c 100644
--- a/app/javascript/dashboard/components/widgets/WootWriter/Editor.vue
+++ b/app/javascript/dashboard/components/widgets/WootWriter/Editor.vue
@@ -32,7 +32,6 @@ import {
CONVERSATION_EVENTS,
CAPTAIN_EVENTS,
} from 'dashboard/helper/AnalyticsHelper/events';
-import { MESSAGE_EDITOR_IMAGE_RESIZES } from 'dashboard/constants/editor';
import {
messageSchema,
@@ -43,6 +42,7 @@ import {
MessageMarkdownSerializer,
EditorState,
Selection,
+ imageResizeView,
} from '@chatwoot/prosemirror-schema';
import {
suggestionsPlugin,
@@ -57,7 +57,6 @@ import {
insertAtCursor,
removeSignature as removeSignatureHelper,
scrollCursorIntoView,
- setURLWithQueryAndSize,
getFormattingForEditor,
getSelectionCoords,
calculateMenuPosition,
@@ -72,6 +71,7 @@ import {
import { createTypingIndicator } from '@chatwoot/utils';
import { checkFileSizeLimit } from 'shared/helpers/FileHelper';
import { uploadFile } from 'dashboard/helper/uploadHelper';
+import { INBOX_TYPES } from 'dashboard/helper/inbox';
const props = defineProps({
modelValue: { type: String, default: '' },
@@ -93,7 +93,6 @@ const props = defineProps({
channelType: { type: String, default: '' },
conversationId: { type: Number, default: null },
medium: { type: String, default: '' },
- showImageResizeToolbar: { type: Boolean, default: false }, // A kill switch to show or hide the image toolbar
focusOnMount: { type: Boolean, default: true },
});
@@ -119,6 +118,14 @@ const TYPING_INDICATOR_IDLE_TIME = 4000;
const MAXIMUM_FILE_UPLOAD_SIZE = 4; // in MB
const DEFAULT_FORMATTING = 'Context::Default';
const PRIVATE_NOTE_FORMATTING = 'Context::PrivateNote';
+const MESSAGE_SIGNATURE_FORMATTING = 'Context::MessageSignature';
+const INLINE_IMAGE_PASTE_TYPES = [
+ 'image/png',
+ 'image/jpeg',
+ 'image/jpg',
+ 'image/gif',
+ 'image/webp',
+];
const effectiveChannelType = computed(() =>
getEffectiveChannelType(props.channelType, props.medium)
@@ -192,12 +199,8 @@ const cannedSearchTerm = ref('');
const variableSearchTerm = ref('');
const emojiSearchTerm = ref('');
const range = ref(null);
-const isImageNodeSelected = ref(false);
-const toolbarPosition = ref({ top: 0, left: 0 });
-const selectedImageNode = ref(null);
const isTextSelected = ref(false); // Tracks text selection and prevents unnecessary re-renders on mouse selection
const showSelectionMenu = ref(false);
-const sizes = MESSAGE_EDITOR_IMAGE_RESIZES;
// element ref
const editorRoot = useTemplateRef('editorRoot');
@@ -475,16 +478,6 @@ function removeSignature() {
reloadState(content);
}
-function setToolbarPosition() {
- const editorRect = editorRoot.value.getBoundingClientRect();
- const rect = selectedImageNode.value.getBoundingClientRect();
-
- toolbarPosition.value = {
- top: `${rect.top - editorRect.top - 30}px`,
- left: `${rect.left - editorRect.left - 4}px`,
- };
-}
-
function setMenubarPosition({ selection } = {}) {
const wrapper = editorRoot.value;
if (!selection || !wrapper) return;
@@ -520,30 +513,6 @@ function checkSelection(editorState) {
if (hasSelection) setMenubarPosition(editorState);
}
-function setURLWithQueryAndImageSize(size) {
- if (!props.showImageResizeToolbar) {
- return;
- }
- setURLWithQueryAndSize(selectedImageNode.value, size, editorView);
- isImageNodeSelected.value = false;
-}
-
-function isEditorMouseFocusedOnAnImage() {
- if (!props.showImageResizeToolbar) {
- return;
- }
- selectedImageNode.value = document.querySelector(
- 'img.ProseMirror-selectednode'
- );
- if (selectedImageNode.value) {
- isImageNodeSelected.value = !!selectedImageNode.value;
- // Get the position of the selected node
- setToolbarPosition();
- } else {
- isImageNodeSelected.value = false;
- }
-}
-
function emitOnChange() {
emit('input', contentFromEditor());
emit('update:modelValue', contentFromEditor());
@@ -563,21 +532,6 @@ function toggleSignatureInEditor(signatureEnabled) {
emitOnChange();
}
-function updateImgToolbarOnDelete() {
- // check if the selected node is present or not on keyup
- // this is needed because the user can select an image and then delete it
- // in that case, the selected node will be null and we need to hide the toolbar
- // otherwise, the toolbar will be visible even when the image is deleted and cause some errors
- if (selectedImageNode.value) {
- const hasImgSelectedNode = document.querySelector(
- 'img.ProseMirror-selectednode'
- );
- if (!hasImgSelectedNode) {
- isImageNodeSelected.value = false;
- }
- }
-}
-
function isEnterToSendEnabled() {
return isEditorHotKeyEnabled('enter');
}
@@ -586,17 +540,6 @@ function isCmdPlusEnterToSendEnabled() {
return isEditorHotKeyEnabled('cmd_enter');
}
-useKeyboardEvents({
- 'Alt+KeyP': {
- action: focusEditorInputField,
- allowOnFocusedInput: false,
- },
- 'Alt+KeyL': {
- action: focusEditorInputField,
- allowOnFocusedInput: false,
- },
-});
-
function onImageInsertInEditor(fileUrl) {
const { tr } = editorView.state;
@@ -617,7 +560,11 @@ async function uploadImageToStorage(file) {
onImageInsertInEditor(fileUrl);
}
useAlert(
- t('PROFILE_SETTINGS.FORM.MESSAGE_SIGNATURE_SECTION.IMAGE_UPLOAD_SUCCESS')
+ props.channelType === MESSAGE_SIGNATURE_FORMATTING
+ ? t(
+ 'PROFILE_SETTINGS.FORM.MESSAGE_SIGNATURE_SECTION.IMAGE_UPLOAD_SUCCESS'
+ )
+ : t('CONVERSATION.REPLYBOX.IMAGE_UPLOAD_SUCCESS')
);
} catch (error) {
useAlert(
@@ -626,8 +573,8 @@ async function uploadImageToStorage(file) {
}
}
-function onFileChange() {
- const file = imageUpload.value.files[0];
+function uploadImageIfWithinSizeLimit(file) {
+ if (!file) return;
if (checkFileSizeLimit(file, MAXIMUM_FILE_UPLOAD_SIZE)) {
uploadImageToStorage(file);
} else {
@@ -640,10 +587,61 @@ function onFileChange() {
)
);
}
-
- imageUpload.value = '';
}
+function onFileChange() {
+ const input = imageUpload.value;
+ uploadImageIfWithinSizeLimit(input.files[0]);
+ input.value = '';
+}
+
+const allowsInlineImagePaste = computed(
+ () =>
+ !props.isPrivate &&
+ (props.channelType === INBOX_TYPES.EMAIL ||
+ props.channelType === INBOX_TYPES.WEB)
+);
+
+// Shift+Cmd/Ctrl+V on email/website: upload a clipboard image inline. This
+// gesture's native paste event carries no image, so clipboard.read() is the
+// only way to get the bytes. No preventDefault: text still pastes natively.
+async function pasteInlineImageFromClipboard() {
+ if (!editorView?.hasFocus()) return;
+ if (!allowsInlineImagePaste.value || !navigator.clipboard?.read) return;
+ try {
+ const items = await navigator.clipboard.read();
+ const imageItem = items.find(item =>
+ item.types.some(type => INLINE_IMAGE_PASTE_TYPES.includes(type))
+ );
+ if (!imageItem) return;
+ const imageType = imageItem.types.find(type =>
+ INLINE_IMAGE_PASTE_TYPES.includes(type)
+ );
+ const blob = await imageItem.getType(imageType);
+ uploadImageIfWithinSizeLimit(
+ new File([blob], 'pasted-image', { type: imageType })
+ );
+ } catch (error) {
+ // clipboard-read denied/unfocused (NotAllowedError): image can't be read.
+ // Text paste is unaffected — ProseMirror handles it from the native event.
+ }
+}
+
+useKeyboardEvents({
+ 'Alt+KeyP': {
+ action: focusEditorInputField,
+ allowOnFocusedInput: false,
+ },
+ 'Alt+KeyL': {
+ action: focusEditorInputField,
+ allowOnFocusedInput: false,
+ },
+ '$mod+Shift+KeyV': {
+ action: pasteInlineImageFromClipboard,
+ allowOnFocusedInput: true,
+ },
+});
+
function handleLineBreakWhenEnterToSendEnabled(event) {
if (
hasPressedEnterAndNotCmdOrShift(event) &&
@@ -736,6 +734,9 @@ function createEditorView() {
editorView = new EditorView(editor.value, {
state: state,
editable: () => !props.disabled,
+ nodeViews: {
+ image: imageResizeView,
+ },
dispatchTransaction: tx => {
state = state.apply(tx);
editorView.updateState(state);
@@ -748,12 +749,10 @@ function createEditorView() {
keyup: () => {
if (!props.disabled) {
typingIndicator.start();
- updateImgToolbarOnDelete();
}
},
keydown: (view, event) => !props.disabled && onKeydown(event),
focus: () => !props.disabled && emit('focus'),
- click: () => !props.disabled && isEditorMouseFocusedOnAnImage(),
blur: () => {
if (props.disabled) return;
typingIndicator.stop();
@@ -918,23 +917,6 @@ useEmitter(BUS_EVENTS.INSERT_INTO_RICH_EDITOR, insertContentIntoEditor);
@change="onFileChange"
/>
-
-
-