From b4ce59eea8f749190980a98e84e52f7ad96a9ded Mon Sep 17 00:00:00 2001
From: Aakash Bakhle <48802744+aakashb95@users.noreply.github.com>
Date: Tue, 31 Mar 2026 10:35:50 +0530
Subject: [PATCH 01/53] feat: reclaim response_bot flag for custom_tools
(#13897)
Repurpose the deprecated response_bot feature flag slot for
custom_tools.
Migration disables the flag on any accounts that had response_bot
enabled so the repurposed slot starts in its default-off state.
Pre-deploy: run the disable script on production using the old flag name
(response_bot) before deploying this migration.
---
config/features.yml | 6 ++---
...pose_response_bot_flag_for_custom_tools.rb | 22 +++++++++++++++++++
db/schema.rb | 2 +-
3 files changed, 26 insertions(+), 4 deletions(-)
create mode 100644 db/migrate/20260324102005_repurpose_response_bot_flag_for_custom_tools.rb
diff --git a/config/features.yml b/config/features.yml
index 41515ff64..00f9321b8 100644
--- a/config/features.yml
+++ b/config/features.yml
@@ -104,10 +104,10 @@
display_name: Audit Logs
enabled: false
premium: true
-- name: response_bot
- display_name: Response Bot
+- name: custom_tools
+ display_name: Custom Tools
enabled: false
- deprecated: true
+ premium: true
- name: message_reply_to
display_name: Message Reply To
enabled: false
diff --git a/db/migrate/20260324102005_repurpose_response_bot_flag_for_custom_tools.rb b/db/migrate/20260324102005_repurpose_response_bot_flag_for_custom_tools.rb
new file mode 100644
index 000000000..d6a3199b4
--- /dev/null
+++ b/db/migrate/20260324102005_repurpose_response_bot_flag_for_custom_tools.rb
@@ -0,0 +1,22 @@
+class RepurposeResponseBotFlagForCustomTools < ActiveRecord::Migration[7.1]
+ def up
+ # The response_bot flag (deprecated) has been renamed to custom_tools.
+ # Disable it on any accounts that had response_bot enabled so the repurposed
+ # flag starts in its intended default-off state.
+ Account.feature_custom_tools.find_each(batch_size: 100) do |account|
+ account.disable_features(:custom_tools)
+ account.save!(validate: false)
+ end
+
+ # Remove the stale response_bot entry from ACCOUNT_LEVEL_FEATURE_DEFAULTS.
+ # ConfigLoader only adds new flags; it never removes renamed ones.
+ # Leaving it would cause NoMethodError in enable_default_features when
+ # creating new accounts (feature_response_bot= no longer exists).
+ config = InstallationConfig.find_by(name: 'ACCOUNT_LEVEL_FEATURE_DEFAULTS')
+ return if config&.value.blank?
+
+ config.value = config.value.reject { |f| f['name'] == 'response_bot' }
+ config.save!
+ GlobalConfig.clear_cache
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 81f1dfbdd..c8af2be3e 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema[7.1].define(version: 2026_03_20_074636) do
+ActiveRecord::Schema[7.1].define(version: 2026_03_24_102005) do
# These extensions should be enabled to support this database
enable_extension "pg_stat_statements"
enable_extension "pg_trgm"
From 0012fa2c3573690390cd1c54f1e6bd770e1db005 Mon Sep 17 00:00:00 2001
From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Date: Tue, 31 Mar 2026 10:39:54 +0530
Subject: [PATCH 02/53] fix: align message trimming with configured maxLength
(#13947)
# Pull Request Template
## Description
This PR fixes
1. Messages being trimmed to the default 1024 limit in `trimContent`
method, instead of channel-specific limits for drafts and AI tasks.
2. Telegram messages are allowed up to 10,000 characters in config, but
the API supports only 4096, causing failures for oversized messages.
Fixes
https://linear.app/chatwoot/issue/CW-6694/captain-ai-rewrite-tasks-truncate-draft-to-1024-chars-trimcontent
https://github.com/chatwoot/chatwoot/issues/13919
## Type of change
- [x] Bug fix (non-breaking change which fixes an issue)
## How Has This Been Tested?
### Loom video
**Before**
https://www.loom.com/share/00e9d6b4d19247febf35dffa99da3805
**After**
https://www.loom.com/share/c4900e9effc345c79bcd8a5aa1ee277b
## Checklist:
- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [ ] 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
---
.../components/widgets/conversation/ReplyBox.vue | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/app/javascript/dashboard/components/widgets/conversation/ReplyBox.vue b/app/javascript/dashboard/components/widgets/conversation/ReplyBox.vue
index dd2e7a607..ef6fa03d6 100644
--- a/app/javascript/dashboard/components/widgets/conversation/ReplyBox.vue
+++ b/app/javascript/dashboard/components/widgets/conversation/ReplyBox.vue
@@ -253,6 +253,9 @@ export default {
if (this.isAnInstagramChannel) {
return MESSAGE_MAX_LENGTH.INSTAGRAM;
}
+ if (this.isATelegramChannel) {
+ return MESSAGE_MAX_LENGTH.TELEGRAM;
+ }
if (this.isATiktokChannel) {
return MESSAGE_MAX_LENGTH.TIKTOK;
}
@@ -545,7 +548,10 @@ export default {
},
setCopilotAcceptedMessage(message, replyType = this.replyType) {
const key = this.getDraftKey(this.conversationIdByRoute, replyType);
- this.copilotAcceptedMessages[key] = trimContent(message || '');
+ this.copilotAcceptedMessages[key] = trimContent(
+ message || '',
+ this.maxLength
+ );
},
clearCopilotAcceptedMessage(replyType = this.replyType) {
const key = this.getDraftKey(this.conversationIdByRoute, replyType);
@@ -603,7 +609,7 @@ export default {
saveDraft(conversationId, replyType) {
if (this.message || this.message === '') {
const key = this.getDraftKey(conversationId, replyType);
- const draftToSave = trimContent(this.message || '');
+ const draftToSave = trimContent(this.message || '', this.maxLength);
this.$store.dispatch('draftMessages/set', {
key,
From 1987ac3d97e4690e94c523f87e4f9f7662a18047 Mon Sep 17 00:00:00 2001
From: Tanmay Deep Sharma <32020192+tds-1@users.noreply.github.com>
Date: Tue, 31 Mar 2026 10:56:59 +0530
Subject: [PATCH 03/53] fix: remove bulk_auto_assignment_job cron schedule
(#13877)
---
app/jobs/inboxes/bulk_auto_assignment_job.rb | 47 ----------
config/initializers/sidekiq.rb | 17 +++-
config/schedule.yml | 8 --
.../inboxes/bulk_auto_assignment_job_spec.rb | 93 -------------------
4 files changed, 14 insertions(+), 151 deletions(-)
delete mode 100644 app/jobs/inboxes/bulk_auto_assignment_job.rb
delete mode 100644 spec/jobs/inboxes/bulk_auto_assignment_job_spec.rb
diff --git a/app/jobs/inboxes/bulk_auto_assignment_job.rb b/app/jobs/inboxes/bulk_auto_assignment_job.rb
deleted file mode 100644
index 9e808648b..000000000
--- a/app/jobs/inboxes/bulk_auto_assignment_job.rb
+++ /dev/null
@@ -1,47 +0,0 @@
-class Inboxes::BulkAutoAssignmentJob < ApplicationJob
- queue_as :scheduled_jobs
- include BillingHelper
-
- def perform
- Account.feature_assignment_v2.find_each do |account|
- if should_skip_auto_assignment?(account)
- Rails.logger.info("Skipping auto assignment for account #{account.id}")
- next
- end
-
- account.inboxes.where(enable_auto_assignment: true).find_each do |inbox|
- process_assignment(inbox)
- end
- end
- end
-
- private
-
- def process_assignment(inbox)
- allowed_agent_ids = inbox.member_ids_with_assignment_capacity
-
- if allowed_agent_ids.blank?
- Rails.logger.info("No agents available to assign conversation to inbox #{inbox.id}")
- return
- end
-
- assign_conversations(inbox, allowed_agent_ids)
- end
-
- def assign_conversations(inbox, allowed_agent_ids)
- unassigned_conversations = inbox.conversations.unassigned.open.limit(Limits::AUTO_ASSIGNMENT_BULK_LIMIT)
- unassigned_conversations.find_each do |conversation|
- ::AutoAssignment::AgentAssignmentService.new(
- conversation: conversation,
- allowed_agent_ids: allowed_agent_ids
- ).perform
- Rails.logger.info("Assigned conversation #{conversation.id} to agent #{allowed_agent_ids.first}")
- end
- end
-
- def should_skip_auto_assignment?(account)
- return false unless ChatwootApp.chatwoot_cloud?
-
- default_plan?(account)
- end
-end
diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb
index 9511ae68e..7b78b466a 100644
--- a/config/initializers/sidekiq.rb
+++ b/config/initializers/sidekiq.rb
@@ -34,7 +34,18 @@ end
# https://github.com/ondrejbartas/sidekiq-cron
Rails.application.reloader.to_prepare do
- # TODO: Switch to `load_from_hash!(..., source: 'schedule')` once we have a
- # safe cleanup path for YAML-backed cron jobs already persisted in Redis.
- Sidekiq::Cron::Job.load_from_hash YAML.load_file(schedule_file) if File.exist?(schedule_file) && Sidekiq.server?
+ # load_from_hash! upserts jobs from the YAML and removes any Redis-persisted
+ # jobs that share the same source tag but are no longer in the file.
+ # This ensures deleted schedule entries are cleaned up on deploy.
+ if File.exist?(schedule_file) && Sidekiq.server?
+ schedule = YAML.load_file(schedule_file)
+
+ # Cron entries removed from schedule.yml but possibly still in Redis
+ # with source:'dynamic' (predating the source tag). load_from_hash!
+ # only cleans up source:'schedule' entries, so these need explicit removal.
+ # Remove names from this list once they've been through a deploy cycle.
+ %w[bulk_auto_assignment_job].each { |name| Sidekiq::Cron::Job.destroy(name) }
+
+ Sidekiq::Cron::Job.load_from_hash!(schedule, source: 'schedule')
+ end
end
diff --git a/config/schedule.yml b/config/schedule.yml
index 153724c25..f1054ad68 100644
--- a/config/schedule.yml
+++ b/config/schedule.yml
@@ -4,7 +4,6 @@
# executed daily at 0000 UTC
# schedules daily deferred jobs at stable times for each installation
-# keep the existing schedule key while the cron loader still uses load_from_hash
internal_check_new_versions_job:
cron: '0 0 * * *'
class: 'Internal::TriggerDailyScheduledItemsJob'
@@ -50,13 +49,6 @@ delete_accounts_job:
class: 'Internal::DeleteAccountsJob'
queue: scheduled_jobs
-# executed every 15 minutes
-# to assign unassigned conversations for all inboxes
-bulk_auto_assignment_job:
- cron: '*/15 * * * *'
- class: 'Inboxes::BulkAutoAssignmentJob'
- queue: scheduled_jobs
-
# executed every 30 minutes for assignment_v2
periodic_assignment_job:
cron: '*/30 * * * *'
diff --git a/spec/jobs/inboxes/bulk_auto_assignment_job_spec.rb b/spec/jobs/inboxes/bulk_auto_assignment_job_spec.rb
deleted file mode 100644
index 5e7e3d7cc..000000000
--- a/spec/jobs/inboxes/bulk_auto_assignment_job_spec.rb
+++ /dev/null
@@ -1,93 +0,0 @@
-require 'rails_helper'
-
-RSpec.describe Inboxes::BulkAutoAssignmentJob do
- let(:account) { create(:account, custom_attributes: { 'plan_name' => 'Startups' }) }
- let(:agent) { create(:user, account: account, role: :agent, auto_offline: false) }
- let(:inbox) { create(:inbox, account: account) }
- let!(:conversation) { create(:conversation, account: account, inbox: inbox, assignee: nil, status: :open) }
- let(:assignment_service) { double }
-
- describe '#perform' do
- before do
- allow(assignment_service).to receive(:perform)
- end
-
- context 'when inbox has inbox members' do
- before do
- create(:inbox_member, user: agent, inbox: inbox)
- account.enable_features!('assignment_v2')
- inbox.update!(enable_auto_assignment: true)
- end
-
- it 'assigns unassigned conversations in enabled inboxes' do
- allow(AutoAssignment::AgentAssignmentService).to receive(:new).with(
- conversation: conversation,
- allowed_agent_ids: [agent.id]
- ).and_return(assignment_service)
-
- described_class.perform_now
- expect(AutoAssignment::AgentAssignmentService).to have_received(:new).with(
- conversation: conversation,
- allowed_agent_ids: [agent.id]
- )
- end
-
- it 'skips inboxes with auto assignment disabled' do
- inbox.update!(enable_auto_assignment: false)
- allow(AutoAssignment::AgentAssignmentService).to receive(:new)
-
- described_class.perform_now
-
- expect(AutoAssignment::AgentAssignmentService).not_to have_received(:new).with(
- conversation: conversation,
- allowed_agent_ids: [agent.id]
- )
- end
-
- context 'when account is on default plan in chatwoot cloud' do
- before do
- account.update!(custom_attributes: {})
- InstallationConfig.create(name: 'CHATWOOT_CLOUD_PLANS', value: [{ 'name' => 'default' }])
- allow(ChatwootApp).to receive(:chatwoot_cloud?).and_return(true)
- end
-
- it 'skips auto assignment' do
- allow(Rails.logger).to receive(:info)
- expect(Rails.logger).to receive(:info).with("Skipping auto assignment for account #{account.id}")
-
- allow(AutoAssignment::AgentAssignmentService).to receive(:new)
- expect(AutoAssignment::AgentAssignmentService).not_to receive(:new)
-
- described_class.perform_now
- end
- end
- end
-
- context 'when inbox has no members' do
- before do
- account.enable_features!('assignment_v2')
- inbox.update!(enable_auto_assignment: true)
- end
-
- it 'does not assign conversations' do
- allow(Rails.logger).to receive(:info)
- expect(Rails.logger).to receive(:info).with("No agents available to assign conversation to inbox #{inbox.id}")
-
- described_class.perform_now
- end
- end
-
- context 'when assignment_v2 feature is disabled' do
- before do
- account.disable_features!('assignment_v2')
- end
-
- it 'skips auto assignment' do
- allow(AutoAssignment::AgentAssignmentService).to receive(:new)
- expect(AutoAssignment::AgentAssignmentService).not_to receive(:new)
-
- described_class.perform_now
- end
- end
- end
-end
From b4b5de9b46f1ccfbacb35be6bcf5a71572843779 Mon Sep 17 00:00:00 2001
From: Aakash Bakhle <48802744+aakashb95@users.noreply.github.com>
Date: Tue, 31 Mar 2026 11:10:12 +0530
Subject: [PATCH 04/53] fix: conservative hand_off prompt on auto-resolution
(#13953)
# Pull Request Template
## Description
The initial version of prompt deciding to resolve or hand-off to human
agents was too conservative especially in cases where a link or an
action was told to customer. If the customer didn't respond, Captain was
told to hand it off to the agent, but customer may actually have solved
the issue. If not, they can come back and continue the conversation.
Removed two lines about the same and now we should not see needless
handoffs.
## Type of change
- [x] Bug fix (non-breaking change which fixes an issue)
## How Has This Been Tested?
Please describe the tests that you ran to verify your changes. Provide
instructions so we can reproduce. Please also list any relevant details
for your test configuration.
locally
## 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
- [x] 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
- [x] Any dependent changes have been merged and published in downstream
modules
---
enterprise/lib/captain/prompts/conversation_completion.liquid | 2 --
1 file changed, 2 deletions(-)
diff --git a/enterprise/lib/captain/prompts/conversation_completion.liquid b/enterprise/lib/captain/prompts/conversation_completion.liquid
index f6f8cd58a..ed81039af 100644
--- a/enterprise/lib/captain/prompts/conversation_completion.liquid
+++ b/enterprise/lib/captain/prompts/conversation_completion.liquid
@@ -3,8 +3,6 @@ You are evaluating whether a customer support conversation is complete and can b
The conversation may be in any language. Apply these criteria based on the intent and meaning of messages, regardless of language.
A conversation is INCOMPLETE (keep open) if ANY of these apply:
-- The assistant suggested the customer try something or take an action — they may still be attempting it
-- The assistant directed the customer to an external resource, link, or contact — they may still be following up
- The assistant asked a question or requested information that the customer hasn't provided
- The customer asked a question that wasn't fully answered
- The customer asked for something the assistant couldn't do — even if the assistant explained why, the customer's need is unmet
From 5de7ae492cd7ccac1deea0664da2e2860f403daf Mon Sep 17 00:00:00 2001
From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Date: Tue, 31 Mar 2026 16:55:21 +0530
Subject: [PATCH 05/53] fix: html/body background not applied in appearance
mode (#13955)
# Pull Request Template
## Description
This PR fixes the white background bleed visible in the widget, widget
article viewer and help center when dark mode is active.
**What was happening**
While scrolling, the `
` element retained a white background in
dark mode. This occurred because dark mode classes were only applied to
inner container elements, not the root.
**What changed**
* **Widget:** Updated the `useDarkMode` composable to sync the `dark`
class to `` using `watchEffect`, allowing `` to inherit dark
theme variables. Also added background styles to `html`, `body`, and
`#app` in `woot.scss`.
* **Help center portal:** Moved `bg-white dark:bg-slate-900` from
`` to `` in the portal layout so the entire page background
responds correctly to dark mode, including within the widget iframe.
* **ArticleViewer:** Replaced hardcoded `bg-white` with `bg-n-solid-1`
to ensure better theming.
Fixes
https://linear.app/chatwoot/issue/CW-6704/widget-body-colour-not-implemented
## Type of change
- [x] Bug fix (non-breaking change which fixes an issue)
## How Has This Been Tested?
### Screencasts
### Before
**Widget**
https://github.com/user-attachments/assets/e0224ad1-81a6-440a-a824-e115fb806728
**Help center**
https://github.com/user-attachments/assets/40a8ded5-5360-474d-9ec5-fd23e037c845
### After
**Widget**
https://github.com/user-attachments/assets/dd37cc68-99fc-4d60-b2ae-cf41f9d4d38c
**Help center**
https://github.com/user-attachments/assets/bc998c4e-ef77-46fa-ac7f-4ea16d912ce3
## Checklist:
- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [ ] 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
---
app/javascript/widget/assets/scss/woot.scss | 2 +-
app/javascript/widget/composables/useDarkMode.js | 6 +++++-
app/javascript/widget/views/ArticleViewer.vue | 2 +-
app/views/layouts/portal.html.erb | 4 ++--
4 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/app/javascript/widget/assets/scss/woot.scss b/app/javascript/widget/assets/scss/woot.scss
index 07aa6a0e3..0044ccdfc 100755
--- a/app/javascript/widget/assets/scss/woot.scss
+++ b/app/javascript/widget/assets/scss/woot.scss
@@ -7,7 +7,7 @@
html,
body {
- @apply antialiased h-full;
+ @apply antialiased h-full bg-n-slate-2 dark:bg-n-solid-1;
}
.is-mobile {
diff --git a/app/javascript/widget/composables/useDarkMode.js b/app/javascript/widget/composables/useDarkMode.js
index bc19c456b..407d90980 100644
--- a/app/javascript/widget/composables/useDarkMode.js
+++ b/app/javascript/widget/composables/useDarkMode.js
@@ -1,4 +1,4 @@
-import { computed } from 'vue';
+import { computed, watchEffect } from 'vue';
import { useMapGetter } from 'dashboard/composables/store';
const isDarkModeAuto = mode => mode === 'auto';
@@ -23,6 +23,10 @@ export function useDarkMode() {
calculatePrefersDarkMode(darkMode.value, systemPreference.value)
);
+ watchEffect(() => {
+ document.documentElement.classList.toggle('dark', prefersDarkMode.value);
+ });
+
return {
darkMode,
prefersDarkMode,
diff --git a/app/javascript/widget/views/ArticleViewer.vue b/app/javascript/widget/views/ArticleViewer.vue
index 9289d0546..bc4cf775c 100644
--- a/app/javascript/widget/views/ArticleViewer.vue
+++ b/app/javascript/widget/views/ArticleViewer.vue
@@ -10,7 +10,7 @@ export default {
-
+
diff --git a/app/views/layouts/portal.html.erb b/app/views/layouts/portal.html.erb
index 78418881a..52d8e2789 100644
--- a/app/views/layouts/portal.html.erb
+++ b/app/views/layouts/portal.html.erb
@@ -58,9 +58,9 @@ By default, it renders:
}
-
+
-
+
<% if !@is_plain_layout_enabled %>
<%= render "public/api/v1/portals/header", portal: @portal %>
<% end %>
From 8824efe0e1767bafb007e5a946df78eab14c8bc7 Mon Sep 17 00:00:00 2001
From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Date: Tue, 31 Mar 2026 21:09:02 +0530
Subject: [PATCH 06/53] fix(sentry): syntaxError: No error message (#13954)
---
app/javascript/dashboard/App.vue | 4 +++-
.../routes/dashboard/settings/account/Index.vue | 13 +++++++------
app/javascript/v3/App.vue | 4 +++-
3 files changed, 13 insertions(+), 8 deletions(-)
diff --git a/app/javascript/dashboard/App.vue b/app/javascript/dashboard/App.vue
index 8912c03d1..a706e2df5 100644
--- a/app/javascript/dashboard/App.vue
+++ b/app/javascript/dashboard/App.vue
@@ -98,7 +98,9 @@ export default {
mql.onchange = e => setColorTheme(e.matches);
},
setLocale(locale) {
- this.$root.$i18n.locale = locale;
+ if (locale) {
+ this.$root.$i18n.locale = locale;
+ }
},
async initializeAccount() {
await this.$store.dispatch('accounts/get');
diff --git a/app/javascript/dashboard/routes/dashboard/settings/account/Index.vue b/app/javascript/dashboard/routes/dashboard/settings/account/Index.vue
index 5be704c24..0502ebc1b 100644
--- a/app/javascript/dashboard/routes/dashboard/settings/account/Index.vue
+++ b/app/javascript/dashboard/routes/dashboard/settings/account/Index.vue
@@ -103,7 +103,10 @@ export default {
const { name, locale, id, domain, support_email, features } =
this.getAccount(this.accountId);
- this.$root.$i18n.locale = this.uiSettings?.locale || locale;
+ const effectiveLocale = this.uiSettings?.locale || locale;
+ if (effectiveLocale) {
+ this.$root.$i18n.locale = effectiveLocale;
+ }
this.name = name;
this.locale = locale;
this.id = id;
@@ -129,11 +132,9 @@ export default {
support_email: this.supportEmail,
});
// If user locale is set, update the locale with user locale
- if (this.uiSettings?.locale) {
- this.$root.$i18n.locale = this.uiSettings?.locale;
- } else {
- // If user locale is not set, update the locale with account locale
- this.$root.$i18n.locale = this.locale;
+ const updatedLocale = this.uiSettings?.locale || this.locale;
+ if (updatedLocale) {
+ this.$root.$i18n.locale = updatedLocale;
}
this.getAccount(this.id).locale = this.locale;
useAlert(this.$t('GENERAL_SETTINGS.UPDATE.SUCCESS'));
diff --git a/app/javascript/v3/App.vue b/app/javascript/v3/App.vue
index ef7107beb..c3f9b1734 100644
--- a/app/javascript/v3/App.vue
+++ b/app/javascript/v3/App.vue
@@ -35,7 +35,9 @@ export default {
};
},
setLocale(locale) {
- this.$root.$i18n.locale = locale;
+ if (locale) {
+ this.$root.$i18n.locale = locale;
+ }
},
},
};
From f2cb23d6e90c7ce00f486a02b8c6727a53648057 Mon Sep 17 00:00:00 2001
From: Tanmay Deep Sharma <32020192+tds-1@users.noreply.github.com>
Date: Wed, 1 Apr 2026 16:55:49 +0530
Subject: [PATCH 07/53] fix: handle Socket::ResolutionError in browser push
notifications (#13957)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
## Linear Ticket
https://linear.app/chatwoot/issue/CW-6707/socketresolutionerror-failed-to-open-tcp-connection-to-permanently
https://linear.app/chatwoot/issue/CW-6707/socketresolutionerror-failed-to-open-tcp-connection-to-permanently#comment-14e0f9ff
## Description
Browser push notifications fail with Socket::ResolutionError when the
push subscription endpoint's domain can't be resolved via DNS (e.g.,
defunct push service, transient DNS failure). This error wasn't handled
in handle_browser_push_error, so it fell through to the catch-all else
branch and got reported to Sentry on every notification attempt — 1,637
times in the last 7 days.
The dead subscription was never cleaned up or the error suppressed, so
every subsequent notification for the affected user triggered the same
Sentry alert.
Added Socket::ResolutionError to the existing transient network error
handler alongside Errno::ECONNRESET, Net::OpenTimeout, and
Net::ReadTimeout. The error is logged but not reported to Sentry, and
the subscription is kept intact in case it's a temporary DNS blip.
## Type of change
- [ ] Bug fix (non-breaking change which fixes an issue)
## How Has This Been Tested?
- Verified that Socket::ResolutionError is a subclass of StandardError
and matches the when clause
## Checklist:
- [ ] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules
Co-authored-by: Vishnu Narayanan
---
app/services/notification/push_notification_service.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/services/notification/push_notification_service.rb b/app/services/notification/push_notification_service.rb
index 125ad9113..90f835ecb 100644
--- a/app/services/notification/push_notification_service.rb
+++ b/app/services/notification/push_notification_service.rb
@@ -79,7 +79,7 @@ class Notification::PushNotificationService
subscription.destroy!
when WebPush::TooManyRequests
Rails.logger.warn "WebPush rate limited for #{user.email} on account #{notification.account.id}: #{error.message}"
- when Errno::ECONNRESET, Net::OpenTimeout, Net::ReadTimeout
+ when Errno::ECONNRESET, Net::OpenTimeout, Net::ReadTimeout, Socket::ResolutionError
Rails.logger.error "WebPush operation error: #{error.message}"
else
ChatwootExceptionTracker.new(error, account: notification.account).capture_exception
From 4cce7f6ad89a6e3e0d967c0e6c7aae34d67fbef0 Mon Sep 17 00:00:00 2001
From: Muhsin Keloth
Date: Wed, 1 Apr 2026 15:59:12 +0400
Subject: [PATCH 08/53] fix(line): Use non-expiring URLs for image and video
messages (#13949)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Images and videos sent from Chatwoot to LINE inboxes fail to display on
the LINE mobile app — users see expired markers, broken thumbnails, or
missing images. This happens because LINE mobile lazy-loads images
rather than downloading them immediately, and the ActiveStorage signed
URLs expire after 5 minutes.
Closes
https://linear.app/chatwoot/issue/CW-6696/line-messaging-with-image-or-video-may-not-show-when-client-inactive
## How to reproduce
1. Create a LINE inbox and start a chat from the LINE mobile app
2. Close the LINE mobile app
3. Send an image from Chatwoot to that chat
4. Wait 7-8 minutes (past the 5-minute URL expiration)
5. Open the LINE mobile app — the image is broken/expired
## What changed
- **`originalContentUrl`**: switched from `download_url` (signed, 5-min
expiry) to `file_url` (permanent redirect-based URL)
- **`previewImageUrl`**: switched to `thumb_url` (250px resized
thumbnail meeting LINE's 1MB/240x240 recommendation), with fallback to
`file_url` for non-image attachments like video
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 4.6 (1M context)
Co-authored-by: Sojan Jose
---
app/services/line/send_on_line_service.rb | 9 +++++++--
spec/services/line/send_on_line_service_spec.rb | 16 ++++++++++------
2 files changed, 17 insertions(+), 8 deletions(-)
diff --git a/app/services/line/send_on_line_service.rb b/app/services/line/send_on_line_service.rb
index b0b6d828d..3c9d6cf17 100644
--- a/app/services/line/send_on_line_service.rb
+++ b/app/services/line/send_on_line_service.rb
@@ -44,10 +44,15 @@ class Line::SendOnLineService < Base::SendOnChannelService
# Support only image and video for now, https://developers.line.biz/en/reference/messaging-api/#image-message
next unless attachment.file_type == 'image' || attachment.file_type == 'video'
+ # Use file_url (permanent redirect-based URL) instead of download_url (signed URL that expires in 5 minutes).
+ # LINE mobile app lazy-loads images and may fetch them well after the message is sent.
+ original_url = attachment.file_url
+ preview_url = attachment.thumb_url.presence || original_url
+
{
type: attachment.file_type,
- originalContentUrl: attachment.download_url,
- previewImageUrl: attachment.download_url
+ originalContentUrl: original_url,
+ previewImageUrl: preview_url
}
end
end
diff --git a/spec/services/line/send_on_line_service_spec.rb b/spec/services/line/send_on_line_service_spec.rb
index a7520b8d8..4451a53b9 100644
--- a/spec/services/line/send_on_line_service_spec.rb
+++ b/spec/services/line/send_on_line_service_spec.rb
@@ -161,7 +161,9 @@ describe Line::SendOnLineService do
it 'sends the message with text and attachments' 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')
- expected_url_regex = %r{rails/active_storage/disk/[a-zA-Z0-9=_\-+]+/avatar\.png}
+ attachment.save!
+ expected_original_url_regex = %r{rails/active_storage/blobs/redirect/[a-zA-Z0-9=_\-+]+/avatar\.png}
+ expected_preview_url_regex = %r{rails/active_storage/representations/redirect/[a-zA-Z0-9=_\-+]+/[a-zA-Z0-9=_\-+]+/avatar\.png}
expect(line_client).to receive(:push_message).with(
message.conversation.contact_inbox.source_id,
@@ -169,8 +171,8 @@ describe Line::SendOnLineService do
{ type: 'text', text: message.content },
{
type: 'image',
- originalContentUrl: match(expected_url_regex),
- previewImageUrl: match(expected_url_regex)
+ originalContentUrl: match(expected_original_url_regex),
+ previewImageUrl: match(expected_preview_url_regex)
}
]
)
@@ -181,16 +183,18 @@ describe Line::SendOnLineService do
it 'sends the message with attachments only' 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')
+ attachment.save!
message.update!(content: nil)
- expected_url_regex = %r{rails/active_storage/disk/[a-zA-Z0-9=_\-+]+/avatar\.png}
+ expected_original_url_regex = %r{rails/active_storage/blobs/redirect/[a-zA-Z0-9=_\-+]+/avatar\.png}
+ expected_preview_url_regex = %r{rails/active_storage/representations/redirect/[a-zA-Z0-9=_\-+]+/[a-zA-Z0-9=_\-+]+/avatar\.png}
expect(line_client).to receive(:push_message).with(
message.conversation.contact_inbox.source_id,
[
{
type: 'image',
- originalContentUrl: match(expected_url_regex),
- previewImageUrl: match(expected_url_regex)
+ originalContentUrl: match(expected_original_url_regex),
+ previewImageUrl: match(expected_preview_url_regex)
}
]
)
From 65867b8b36bdeffa630d8db00e53ebd62d9af10e Mon Sep 17 00:00:00 2001
From: Vishnu Narayanan
Date: Wed, 1 Apr 2026 18:02:19 +0530
Subject: [PATCH 09/53] fix: exclude MutexApplicationJob::LockAcquisitionError
from Sentry (#13965)
## Summary
- Add `MutexApplicationJob::LockAcquisitionError` to Sentry's
`excluded_exceptions`
- This error is expected control flow (mutex lock contention during
webhook processing), not a bug
- Generated ~131K Sentry events in March 2026, 100% from
`InstagramEventsJob`
Fixes https://linear.app/chatwoot/issue/INF-58
---
config/initializers/sentry.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/config/initializers/sentry.rb b/config/initializers/sentry.rb
index ae21d7f61..eff36bfc5 100644
--- a/config/initializers/sentry.rb
+++ b/config/initializers/sentry.rb
@@ -7,7 +7,7 @@ if ENV['SENTRY_DSN'].present?
# We recommend adjusting the value in production:
config.traces_sample_rate = 0.1 if ENV['ENABLE_SENTRY_TRANSACTIONS']
- config.excluded_exceptions += ['Rack::Timeout::RequestTimeoutException']
+ config.excluded_exceptions += ['Rack::Timeout::RequestTimeoutException', 'MutexApplicationJob::LockAcquisitionError']
# to track post data in sentry
config.send_default_pii = true unless ENV['DISABLE_SENTRY_PII']
From 7b09b033ef2f82801b633dd1869fd91a3428a4b1 Mon Sep 17 00:00:00 2001
From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Date: Thu, 2 Apr 2026 11:02:21 +0530
Subject: [PATCH 10/53] fix: Markdown tables don't render properly in help
centre (#13971)
# Pull Request Template
## Description
This PR fixes an issue where markdown tables were not rendering
correctly in the Help Center.
The issue was caused by a backslash `(\)` being appended after table row
separators `(|)`, which breaks the markdown table parsing.
The issue was introduced after recent editor changes made to preserve
new lines, which unintentionally affected how table markdown is parsed
and displayed.
### https://github.com/chatwoot/prosemirror-schema/pull/44
Fixes
https://linear.app/chatwoot/issue/CW-6714/markdown-tables-dont-render-properly-in-help-centre-preview
## Type of change
- [x] Bug fix (non-breaking change which fixes an issue)
## How Has This Been Tested?
**Before**
```
| Type | What you provide |\
|--------------|-------------------------------|\
| None | No authentication |\
| Bearer Token | A token string |\
| Basic Auth | Username and password |\
| API Key | A custom header name and value|
```
**After**
```
| Type | What you provide |
|--------------|-------------------------------|
| None | No authentication |
| Bearer Token | A token string |
| Basic Auth | Username and password |
| API Key | A custom header name and value|
```
## Checklist:
- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [ ] 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
---
package.json | 2 +-
pnpm-lock.yaml | 10 +++++-----
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/package.json b/package.json
index c8a1b7fdf..ddb6c09cc 100644
--- a/package.json
+++ b/package.json
@@ -34,7 +34,7 @@
"@amplitude/analytics-browser": "^2.11.10",
"@breezystack/lamejs": "^1.2.7",
"@chatwoot/ninja-keys": "1.2.3",
- "@chatwoot/prosemirror-schema": "1.3.8",
+ "@chatwoot/prosemirror-schema": "1.3.9",
"@chatwoot/utils": "^0.0.52",
"@formkit/core": "^1.7.2",
"@formkit/vue": "^1.7.2",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 48edce442..cb4b2b148 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -26,8 +26,8 @@ importers:
specifier: 1.2.3
version: 1.2.3
'@chatwoot/prosemirror-schema':
- specifier: 1.3.8
- version: 1.3.8
+ specifier: 1.3.9
+ version: 1.3.9
'@chatwoot/utils':
specifier: ^0.0.52
version: 0.0.52
@@ -454,8 +454,8 @@ packages:
'@chatwoot/ninja-keys@1.2.3':
resolution: {integrity: sha512-xM8d9P5ikDMZm2WbaCTk/TW5HFauylrU3cJ75fq5je6ixKwyhl/0kZbVN/vbbZN4+AUX/OaSIn6IJbtCgIF67g==}
- '@chatwoot/prosemirror-schema@1.3.8':
- resolution: {integrity: sha512-Vr8eUdydmVr7iRnNky4jXKX3XD4z5HAS4bV7zJXxA4av4ig5qjTldDOg7c/C8rqYNKGR5UEOEu9CQfGcjfKVXg==}
+ '@chatwoot/prosemirror-schema@1.3.9':
+ resolution: {integrity: sha512-nbzvW4Rfe7EC+tHF/wWJK5pIxRzfQj/DDAtZI7pwM9uJfv9yQz6bAUCA7kz7Vq1NF29XOisZaT5W0005ygk1pg==}
'@chatwoot/utils@0.0.52':
resolution: {integrity: sha512-e57uVqyVW4tj1gql4YJPNMykqMJPkETn5Y9AmHdhc6Y7oxDXfRXBq27fZrrDadLkZdn5RYVCZjfIhXOumyYv2Q==}
@@ -4966,7 +4966,7 @@ snapshots:
hotkeys-js: 3.8.7
lit: 2.2.6
- '@chatwoot/prosemirror-schema@1.3.8':
+ '@chatwoot/prosemirror-schema@1.3.9':
dependencies:
markdown-it-sup: 2.0.0
prosemirror-commands: 1.6.0
From 211fb1102dd208daee414cff1b8d71ea27ac5ebf Mon Sep 17 00:00:00 2001
From: Shivam Mishra
Date: Thu, 2 Apr 2026 11:26:29 +0530
Subject: [PATCH 11/53] chore: rotate oauth password if unconfirmed (#13878)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
When a user signs up with an email they don't own and sets a password,
that password remains valid even after the real owner later signs in via
OAuth. This means the original registrant — who never proved ownership
of the email — retains working credentials on the account. This change
closes that gap by rotating the password to a random value whenever an
unconfirmed user completes an OAuth sign-in.
The check (`oauth_user_needs_password_reset?`) is evaluated before
`skip_confirmation!` runs, since confirmation would flip `confirmed_at`
and mask the condition. If the user was unconfirmed, the stored password
is replaced with a secure random string that satisfies the password
policy. This applies to both the web and mobile OAuth callback paths, as
well as the sign-up path where the password is rotated before the reset
token is generated.
Users who lose access to password-based login as a side effect can
recover through the standard "Forgot password" flow at any time. Since
they've already proven email ownership via OAuth, this is a low-friction
recovery path
---
.../omniauth_callbacks_controller.rb | 18 ++++++++++++++++++
.../omniauth_callbacks_controller_spec.rb | 16 ++++++++++++++++
2 files changed, 34 insertions(+)
diff --git a/app/controllers/devise_overrides/omniauth_callbacks_controller.rb b/app/controllers/devise_overrides/omniauth_callbacks_controller.rb
index af759af54..2c8387142 100644
--- a/app/controllers/devise_overrides/omniauth_callbacks_controller.rb
+++ b/app/controllers/devise_overrides/omniauth_callbacks_controller.rb
@@ -10,7 +10,12 @@ class DeviseOverrides::OmniauthCallbacksController < DeviseTokenAuth::OmniauthCa
private
def sign_in_user
+ # Capture before skip_confirmation! sets confirmed_at, which would
+ # make oauth_user_needs_password_reset? return false and skip the
+ # password reset for persisted unconfirmed users.
+ needs_password_reset = oauth_user_needs_password_reset?
@resource.skip_confirmation! if confirmable_enabled?
+ set_random_password_if_oauth_user if needs_password_reset
# once the resource is found and verified
# we can just send them to the login page again with the SSO params
@@ -20,7 +25,10 @@ class DeviseOverrides::OmniauthCallbacksController < DeviseTokenAuth::OmniauthCa
end
def sign_in_user_on_mobile
+ # See comment in sign_in_user for why this is captured before skip_confirmation!
+ needs_password_reset = oauth_user_needs_password_reset?
@resource.skip_confirmation! if confirmable_enabled?
+ set_random_password_if_oauth_user if needs_password_reset
# once the resource is found and verified
# we can just send them to the login page again with the SSO params
@@ -37,6 +45,7 @@ class DeviseOverrides::OmniauthCallbacksController < DeviseTokenAuth::OmniauthCa
return redirect_to login_page_url(error: 'business-account-only') unless validate_signup_email_is_business_domain?
create_account_for_user
+ set_random_password_if_oauth_user
token = @resource.send(:set_reset_password_token)
frontend_url = ENV.fetch('FRONTEND_URL', nil)
redirect_to "#{frontend_url}/app/auth/password/edit?config=default&reset_password_token=#{token}"
@@ -81,6 +90,15 @@ class DeviseOverrides::OmniauthCallbacksController < DeviseTokenAuth::OmniauthCa
Avatar::AvatarFromUrlJob.perform_later(@resource, auth_hash['info']['image'])
end
+ def oauth_user_needs_password_reset?
+ @resource.present? && (@resource.new_record? || !@resource.confirmed?)
+ end
+
+ def set_random_password_if_oauth_user
+ # Password must satisfy secure_password requirements (uppercase, lowercase, number, special char)
+ @resource.update(password: "#{SecureRandom.hex(16)}aA1!") if @resource.persisted?
+ end
+
def default_devise_mapping
'user'
end
diff --git a/spec/controllers/devise/omniauth_callbacks_controller_spec.rb b/spec/controllers/devise/omniauth_callbacks_controller_spec.rb
index 603458a01..35bae8e0b 100644
--- a/spec/controllers/devise/omniauth_callbacks_controller_spec.rb
+++ b/spec/controllers/devise/omniauth_callbacks_controller_spec.rb
@@ -164,5 +164,21 @@ RSpec.describe 'DeviseOverrides::OmniauthCallbacksController', type: :request do
expect(response).to have_http_status(:ok)
end
end
+
+ it 'resets password for an unconfirmed persisted user on OAuth login' do
+ with_modified_env FRONTEND_URL: 'http://www.example.com' do
+ user = create(:user, email: 'unconfirmed-oauth@example.com', skip_confirmation: false)
+ original_password_digest = user.encrypted_password
+ set_omniauth_config('unconfirmed-oauth@example.com')
+
+ get '/omniauth/google_oauth2/callback'
+ expect(response).to redirect_to('http://www.example.com/auth/google_oauth2/callback')
+ follow_redirect!
+
+ user.reload
+ expect(user).to be_confirmed
+ expect(user.encrypted_password).not_to eq(original_password_digest)
+ end
+ end
end
end
From 8daf6cf6cbba1246f98a59ce474b6bd633646f46 Mon Sep 17 00:00:00 2001
From: Aakash Bakhle <48802744+aakashb95@users.noreply.github.com>
Date: Thu, 2 Apr 2026 12:40:11 +0530
Subject: [PATCH 12/53] feat: captain custom tools v1 (#13890)
# Pull Request Template
## Description
Adds custom tool support to v1
## Type of change
- [x] New feature (non-breaking change which adds functionality)
## How Has This Been Tested?
Please describe the tests that you ran to verify your changes. Provide
instructions so we can reproduce. Please also list any relevant details
for your test configuration.
## Checklist:
- [x] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules
---------
Co-authored-by: Claude Opus 4.6 (1M context)
Co-authored-by: Shivam Mishra
---
.../dashboard/api/captain/customTools.js | 6 ++
.../customTool/CustomToolCard.vue | 9 +-
.../customTool/CustomToolForm.vue | 86 +++++++++++++++++--
.../emptyStates/CustomToolsPageEmptyState.vue | 12 +++
.../components-next/sidebar/Sidebar.vue | 30 +++++--
app/javascript/dashboard/featureFlags.js | 1 +
.../i18n/locale/en/integrations.json | 10 ++-
.../dashboard/captain/captain.routes.js | 2 +-
.../routes/dashboard/captain/tools/Index.vue | 22 +++--
config/locales/en.yml | 1 +
config/routes.rb | 4 +-
.../captain/custom_tools_controller.rb | 24 +++++-
enterprise/app/models/captain/custom_tool.rb | 27 ++++--
enterprise/app/models/concerns/toolable.rb | 31 ++++---
.../policies/captain/custom_tool_policy.rb | 4 +
.../captain/llm/assistant_chat_service.rb | 22 ++++-
.../captain/llm/system_prompts_service.rb | 15 +++-
.../captain/tools/custom_http_tool.rb | 47 ++++++++++
.../reconcile_plan_features_service.rb | 2 +-
.../models/captain/_custom_tool.json.jbuilder | 2 +-
.../captain/custom_tools_controller_spec.rb | 7 +-
21 files changed, 307 insertions(+), 57 deletions(-)
create mode 100644 enterprise/app/services/captain/tools/custom_http_tool.rb
diff --git a/app/javascript/dashboard/api/captain/customTools.js b/app/javascript/dashboard/api/captain/customTools.js
index d0818d941..471c2846b 100644
--- a/app/javascript/dashboard/api/captain/customTools.js
+++ b/app/javascript/dashboard/api/captain/customTools.js
@@ -31,6 +31,12 @@ class CaptainCustomTools extends ApiClient {
delete(id) {
return axios.delete(`${this.url}/${id}`);
}
+
+ test(data = {}) {
+ return axios.post(`${this.url}/test`, {
+ custom_tool: data,
+ });
+ }
}
export default new CaptainCustomTools();
diff --git a/app/javascript/dashboard/components-next/captain/pageComponents/customTool/CustomToolCard.vue b/app/javascript/dashboard/components-next/captain/pageComponents/customTool/CustomToolCard.vue
index d1d1dd011..d5f1e3e52 100644
--- a/app/javascript/dashboard/components-next/captain/pageComponents/customTool/CustomToolCard.vue
+++ b/app/javascript/dashboard/components-next/captain/pageComponents/customTool/CustomToolCard.vue
@@ -101,12 +101,9 @@ const authTypeLabel = computed(() => {
-
-
-
+
+
+
{{ description }}
-import { reactive, computed, useTemplateRef, watch } from 'vue';
+import { reactive, computed, ref, useTemplateRef, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import { useVuelidate } from '@vuelidate/core';
-import { required } from '@vuelidate/validators';
+import { required, maxLength } from '@vuelidate/validators';
import { useMapGetter } from 'dashboard/composables/store';
+import CustomToolsAPI from 'dashboard/api/captain/customTools';
import Input from 'dashboard/components-next/input/Input.vue';
import TextArea from 'dashboard/components-next/textarea/TextArea.vue';
@@ -72,8 +73,12 @@ const DEFAULT_PARAM = {
required: false,
};
+// OpenAI enforces a 64-char limit on function names. The backend slug is
+// "custom_" (7 chars) + parameterized title, so cap the title conservatively.
+const MAX_TOOL_NAME_LENGTH = 55;
+
const validationRules = {
- title: { required },
+ title: { required, maxLength: maxLength(MAX_TOOL_NAME_LENGTH) },
endpoint_url: { required },
http_method: { required },
auth_type: { required },
@@ -103,9 +108,15 @@ const isLoading = computed(() =>
);
const getErrorMessage = (field, errorKey) => {
- return v$.value[field].$error
- ? t(`CAPTAIN.CUSTOM_TOOLS.FORM.${errorKey}.ERROR`)
- : '';
+ if (!v$.value[field].$error) return '';
+
+ const failedRule = v$.value[field].$errors[0]?.$validator;
+ if (failedRule === 'maxLength') {
+ return t(`CAPTAIN.CUSTOM_TOOLS.FORM.${errorKey}.MAX_LENGTH_ERROR`, {
+ max: MAX_TOOL_NAME_LENGTH,
+ });
+ }
+ return t(`CAPTAIN.CUSTOM_TOOLS.FORM.${errorKey}.ERROR`);
};
const formErrors = computed(() => ({
@@ -140,6 +151,30 @@ const handleSubmit = async () => {
emit('submit', state);
};
+
+const isTesting = ref(false);
+const testResult = ref(null);
+const isTestDisabled = computed(
+ () => state.endpoint_url.includes('{{') || !!state.request_template
+);
+
+const handleTest = async () => {
+ if (!state.endpoint_url) return;
+
+ isTesting.value = true;
+ testResult.value = null;
+ try {
+ const { data } = await CustomToolsAPI.test(state);
+ const isOk = data.status >= 200 && data.status < 300;
+ testResult.value = { success: isOk, status: data.status };
+ } catch (e) {
+ const message =
+ e.response?.data?.error || t('CAPTAIN.CUSTOM_TOOLS.TEST.ERROR');
+ testResult.value = { success: false, message };
+ } finally {
+ isTesting.value = false;
+ }
+};
@@ -248,6 +283,45 @@ const handleSubmit = async () => {
class="[&_textarea]:font-mono"
/>
+
+
+
+ {{ t('CAPTAIN.CUSTOM_TOOLS.TEST.DISABLED_HINT') }}
+
+
+
+ {{
+ testResult.status
+ ? t('CAPTAIN.CUSTOM_TOOLS.TEST.SUCCESS', {
+ status: testResult.status,
+ })
+ : testResult.message
+ }}
+
+
+
+import { useAccount } from 'dashboard/composables/useAccount';
import EmptyStateLayout from 'dashboard/components-next/EmptyStateLayout.vue';
+import FeatureSpotlight from 'dashboard/components-next/feature-spotlight/FeatureSpotlight.vue';
import Button from 'dashboard/components-next/button/Button.vue';
const emit = defineEmits(['click']);
+const { isOnChatwootCloud } = useAccount();
const onClick = () => {
emit('click');
@@ -10,6 +13,15 @@ const onClick = () => {
+
{
);
});
+const hasCustomTools = computed(() => {
+ return (
+ isFeatureEnabledonAccount.value(
+ accountId.value,
+ FEATURE_FLAGS.CAPTAIN_CUSTOM_TOOLS
+ ) ||
+ isFeatureEnabledonAccount.value(accountId.value, FEATURE_FLAGS.CAPTAIN_V2)
+ );
+});
+
const toggleShortcutModalFn = show => {
if (show) {
emit('openKeyShortcutModal');
@@ -364,14 +374,18 @@ const menuItems = computed(() => {
navigationPath: 'captain_assistants_inboxes_index',
}),
},
- {
- name: 'Tools',
- label: t('SIDEBAR.CAPTAIN_TOOLS'),
- activeOn: ['captain_tools_index'],
- to: accountScopedRoute('captain_assistants_index', {
- navigationPath: 'captain_tools_index',
- }),
- },
+ ...(hasCustomTools.value
+ ? [
+ {
+ name: 'Tools',
+ label: t('SIDEBAR.CAPTAIN_TOOLS'),
+ activeOn: ['captain_tools_index'],
+ to: accountScopedRoute('captain_assistants_index', {
+ navigationPath: 'captain_tools_index',
+ }),
+ },
+ ]
+ : []),
{
name: 'Settings',
label: t('SIDEBAR.CAPTAIN_SETTINGS'),
diff --git a/app/javascript/dashboard/featureFlags.js b/app/javascript/dashboard/featureFlags.js
index 858c0ecbc..b4aa34f88 100644
--- a/app/javascript/dashboard/featureFlags.js
+++ b/app/javascript/dashboard/featureFlags.js
@@ -37,6 +37,7 @@ export const FEATURE_FLAGS = {
CHANNEL_INSTAGRAM: 'channel_instagram',
CHANNEL_TIKTOK: 'channel_tiktok',
CONTACT_CHATWOOT_SUPPORT_TEAM: 'contact_chatwoot_support_team',
+ CAPTAIN_CUSTOM_TOOLS: 'custom_tools',
CAPTAIN_V2: 'captain_integration_v2',
CAPTAIN_TASKS: 'captain_tasks',
SAML: 'saml',
diff --git a/app/javascript/dashboard/i18n/locale/en/integrations.json b/app/javascript/dashboard/i18n/locale/en/integrations.json
index 70d9a271c..1b9caf02f 100644
--- a/app/javascript/dashboard/i18n/locale/en/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/en/integrations.json
@@ -807,6 +807,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -837,11 +838,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Description",
diff --git a/app/javascript/dashboard/routes/dashboard/captain/captain.routes.js b/app/javascript/dashboard/routes/dashboard/captain/captain.routes.js
index 4bc11ba1c..9fd87ccba 100644
--- a/app/javascript/dashboard/routes/dashboard/captain/captain.routes.js
+++ b/app/javascript/dashboard/routes/dashboard/captain/captain.routes.js
@@ -46,7 +46,7 @@ const assistantRoutes = [
path: frontendURL('accounts/:accountId/captain/:assistantId/tools'),
component: CustomToolsIndex,
name: 'captain_tools_index',
- meta: metaV2,
+ meta,
},
{
path: frontendURL('accounts/:accountId/captain/:assistantId/scenarios'),
diff --git a/app/javascript/dashboard/routes/dashboard/captain/tools/Index.vue b/app/javascript/dashboard/routes/dashboard/captain/tools/Index.vue
index c350e76f3..ea331dcaf 100644
--- a/app/javascript/dashboard/routes/dashboard/captain/tools/Index.vue
+++ b/app/javascript/dashboard/routes/dashboard/captain/tools/Index.vue
@@ -2,21 +2,29 @@
import { computed, onMounted, ref, nextTick } from 'vue';
import { useMapGetter, useStore } from 'dashboard/composables/store';
import { FEATURE_FLAGS } from 'dashboard/featureFlags';
+import { usePolicy } from 'dashboard/composables/usePolicy';
import PageLayout from 'dashboard/components-next/captain/PageLayout.vue';
-import CaptainPaywall from 'dashboard/components-next/captain/pageComponents/Paywall.vue';
import CustomToolsPageEmptyState from 'dashboard/components-next/captain/pageComponents/emptyStates/CustomToolsPageEmptyState.vue';
import CreateCustomToolDialog from 'dashboard/components-next/captain/pageComponents/customTool/CreateCustomToolDialog.vue';
import CustomToolCard from 'dashboard/components-next/captain/pageComponents/customTool/CustomToolCard.vue';
import DeleteDialog from 'dashboard/components-next/captain/pageComponents/DeleteDialog.vue';
const store = useStore();
+const { isFeatureFlagEnabled } = usePolicy();
+
+const SOFT_LIMIT = 10;
+const isV2 = computed(() => isFeatureFlagEnabled(FEATURE_FLAGS.CAPTAIN_V2));
const uiFlags = useMapGetter('captainCustomTools/getUIFlags');
const customTools = useMapGetter('captainCustomTools/getRecords');
const isFetching = computed(() => uiFlags.value.fetchingList);
const customToolsMeta = useMapGetter('captainCustomTools/getMeta');
+const showSoftLimitWarning = computed(
+ () => !isV2.value && customToolsMeta.value.totalCount > SOFT_LIMIT
+);
+
const createDialogRef = ref(null);
const deleteDialogRef = ref(null);
const selectedTool = ref(null);
@@ -86,21 +94,23 @@ onMounted(() => {
:show-pagination-footer="!isFetching && !!customTools.length"
:is-fetching="isFetching"
:is-empty="!customTools.length"
- :feature-flag="FEATURE_FLAGS.CAPTAIN_V2"
:show-know-more="false"
@update:current-page="onPageChange"
@click="openCreateDialog"
>
-
-
-
-
+
+
+ {{ $t('CAPTAIN.CUSTOM_TOOLS.SOFT_LIMIT_WARNING') }}
+
{ check_authorization(Captain::CustomTool) }
before_action :set_custom_tool, only: [:show, :update, :destroy]
def index
- @custom_tools = account_custom_tools.enabled
+ @custom_tools = account_custom_tools
end
def show; end
def create
@custom_tool = account_custom_tools.create!(custom_tool_params)
+ rescue Captain::CustomTool::LimitExceededError => e
+ render_could_not_create_error(e.message)
end
def update
@@ -22,8 +25,22 @@ class Api::V1::Accounts::Captain::CustomToolsController < Api::V1::Accounts::Bas
head :no_content
end
+ def test
+ tool = account_custom_tools.new(custom_tool_params)
+ result = execute_test_request(tool)
+ render json: { status: result.code.to_i, body: result.body.to_s.truncate(500) }
+ rescue StandardError => e
+ render json: { error: e.message }, status: :unprocessable_content
+ end
+
private
+ def ensure_custom_tools_enabled
+ return if Current.account.feature_enabled?('custom_tools') || Current.account.feature_enabled?('captain_integration_v2')
+
+ render json: { error: 'Custom tools are not enabled for this account' }, status: :forbidden
+ end
+
def set_custom_tool
@custom_tool = account_custom_tools.find(params[:id])
end
@@ -32,6 +49,11 @@ class Api::V1::Accounts::Captain::CustomToolsController < Api::V1::Accounts::Bas
@account_custom_tools ||= Current.account.captain_custom_tools
end
+ def execute_test_request(tool)
+ http_tool = Captain::Tools::HttpTool.new(nil, tool)
+ http_tool.send(:execute_http_request, tool.endpoint_url, nil, nil)
+ end
+
def custom_tool_params
params.require(:custom_tool).permit(
:title,
diff --git a/enterprise/app/models/captain/custom_tool.rb b/enterprise/app/models/captain/custom_tool.rb
index bf3f351dd..27d54d308 100644
--- a/enterprise/app/models/captain/custom_tool.rb
+++ b/enterprise/app/models/captain/custom_tool.rb
@@ -24,6 +24,10 @@
# index_captain_custom_tools_on_account_id_and_slug (account_id,slug) UNIQUE
#
class Captain::CustomTool < ApplicationRecord
+ class LimitExceededError < StandardError; end
+
+ MAX_PER_ACCOUNT = 15
+
include Concerns::Toolable
include Concerns::SafeEndpointValidatable
@@ -31,6 +35,10 @@ class Captain::CustomTool < ApplicationRecord
NAME_PREFIX = 'custom'.freeze
NAME_SEPARATOR = '_'.freeze
+ # OpenAI enforces a 64-char limit on function names. The slug is used
+ # verbatim as the tool name in LLM requests, so it must fit within this limit.
+ MAX_SLUG_LENGTH = 64
+ COLLISION_SUFFIX_LENGTH = 7 # "_" + 6 random alphanumeric chars
PARAM_SCHEMA_VALIDATION = {
'type': 'array',
'items': {
@@ -52,8 +60,9 @@ class Captain::CustomTool < ApplicationRecord
enum :auth_type, %w[none bearer basic api_key].index_by(&:itself), default: :none, validate: true, prefix: :auth
before_validation :generate_slug
+ before_create :ensure_within_limit
- validates :slug, presence: true, uniqueness: { scope: :account_id }
+ validates :slug, presence: true, uniqueness: { scope: :account_id }, length: { maximum: MAX_SLUG_LENGTH }
validates :title, presence: true
validates :endpoint_url, presence: true
validates_with JsonSchemaValidator,
@@ -73,21 +82,29 @@ class Captain::CustomTool < ApplicationRecord
private
+ def ensure_within_limit
+ # Lock the account row to serialize concurrent creates and prevent exceeding the cap
+ Account.lock.find(account_id)
+ return if account.captain_custom_tools.count < MAX_PER_ACCOUNT
+
+ raise LimitExceededError, I18n.t('captain.custom_tool.limit_exceeded', limit: MAX_PER_ACCOUNT)
+ end
+
def generate_slug
return if slug.present?
return if title.blank?
- paramterized_title = title.parameterize(separator: NAME_SEPARATOR)
-
- base_slug = "#{NAME_PREFIX}#{NAME_SEPARATOR}#{paramterized_title}"
+ parameterized_title = title.parameterize(separator: NAME_SEPARATOR)
+ base_slug = "#{NAME_PREFIX}#{NAME_SEPARATOR}#{parameterized_title}".truncate(MAX_SLUG_LENGTH, omission: '')
self.slug = find_unique_slug(base_slug)
end
def find_unique_slug(base_slug)
return base_slug unless slug_exists?(base_slug)
+ truncated = base_slug.truncate(MAX_SLUG_LENGTH - COLLISION_SUFFIX_LENGTH, omission: '')
5.times do
- slug_candidate = "#{base_slug}#{NAME_SEPARATOR}#{SecureRandom.alphanumeric(6).downcase}"
+ slug_candidate = "#{truncated}#{NAME_SEPARATOR}#{SecureRandom.alphanumeric(6).downcase}"
return slug_candidate unless slug_exists?(slug_candidate)
end
diff --git a/enterprise/app/models/concerns/toolable.rb b/enterprise/app/models/concerns/toolable.rb
index f40ac4a65..828cd50c5 100644
--- a/enterprise/app/models/concerns/toolable.rb
+++ b/enterprise/app/models/concerns/toolable.rb
@@ -1,15 +1,23 @@
module Concerns::Toolable
extend ActiveSupport::Concern
- def tool(assistant)
+ # Isolated namespace for user-defined custom tool classes.
+ # Keeps them separate from built-in classes in Captain::Tools (e.g., HttpTool, CustomHttpTool).
+ module CustomTools; end
+
+ def tool(assistant, base_class: Captain::Tools::HttpTool, **)
custom_tool_record = self
- # Convert slug to valid Ruby constant name (replace hyphens with underscores, then camelize)
class_name = custom_tool_record.slug.underscore.camelize
# Always create a fresh class to reflect current metadata
- tool_class = Class.new(Captain::Tools::HttpTool) do
+ tool_slug = custom_tool_record.slug
+ tool_class = Class.new(base_class) do
description custom_tool_record.description
+ # Override name to use the slug directly, avoiding the namespace prefix
+ # that RubyLLM's default normalization would produce (e.g., "captain--tools--custom_dog_facts").
+ define_method(:name) { tool_slug }
+
custom_tool_record.param_schema.each do |param_def|
param param_def['name'].to_sym,
type: param_def['type'],
@@ -18,17 +26,14 @@ module Concerns::Toolable
end
end
- # Register the dynamically created class as a constant in the Captain::Tools namespace.
- # This is required because RubyLLM's Tool base class derives the tool name from the class name
- # (via Class#name). Anonymous classes created with Class.new have no name and return empty strings,
- # which causes "Invalid 'tools[].function.name': empty string" errors from the LLM API.
- # By setting it as a constant, the class gets a proper name (e.g., "Captain::Tools::CatFactLookup")
- # which RubyLLM extracts and normalizes to "cat-fact-lookup" for the LLM API.
- # We refresh the constant on each call to ensure tool metadata changes are reflected.
- Captain::Tools.send(:remove_const, class_name) if Captain::Tools.const_defined?(class_name, false)
- Captain::Tools.const_set(class_name, tool_class)
+ # Register as a constant so the class gets a proper name (Class#name).
+ # Anonymous classes return nil for #name, which causes "Invalid 'tools[].function.name':
+ # empty string" errors from the LLM API. We use CustomTools as the namespace to avoid
+ # collisions with real classes in Captain::Tools.
+ CustomTools.send(:remove_const, class_name) if CustomTools.const_defined?(class_name, false)
+ CustomTools.const_set(class_name, tool_class)
- tool_class.new(assistant, self)
+ tool_class.new(assistant, self, **)
end
def build_request_url(params)
diff --git a/enterprise/app/policies/captain/custom_tool_policy.rb b/enterprise/app/policies/captain/custom_tool_policy.rb
index b88a23860..297ecbb99 100644
--- a/enterprise/app/policies/captain/custom_tool_policy.rb
+++ b/enterprise/app/policies/captain/custom_tool_policy.rb
@@ -11,6 +11,10 @@ class Captain::CustomToolPolicy < ApplicationPolicy
@account_user.administrator?
end
+ def test?
+ @account_user.administrator?
+ end
+
def update?
@account_user.administrator?
end
diff --git a/enterprise/app/services/captain/llm/assistant_chat_service.rb b/enterprise/app/services/captain/llm/assistant_chat_service.rb
index 57bbe0c96..2dba3af16 100644
--- a/enterprise/app/services/captain/llm/assistant_chat_service.rb
+++ b/enterprise/app/services/captain/llm/assistant_chat_service.rb
@@ -30,7 +30,12 @@ class Captain::Llm::AssistantChatService < Llm::BaseAiService
private
def build_tools
- [Captain::Tools::SearchDocumentationService.new(@assistant, user: nil)]
+ tools = [Captain::Tools::SearchDocumentationService.new(@assistant, user: nil)]
+ return tools unless custom_tools_enabled?
+
+ tools + @assistant.account.captain_custom_tools.enabled.map do |ct|
+ ct.tool(@assistant, base_class: Captain::Tools::CustomHttpTool, conversation: @conversation)
+ end
end
def system_message
@@ -38,11 +43,24 @@ class Captain::Llm::AssistantChatService < Llm::BaseAiService
role: 'system',
content: Captain::Llm::SystemPromptsService.assistant_response_generator(
@assistant.name, @assistant.config['product_name'], @assistant.config,
- contact: contact_attributes
+ contact: contact_attributes,
+ custom_tools: custom_tools_metadata
)
}
end
+ def custom_tools_metadata
+ return [] unless custom_tools_enabled?
+
+ @assistant.account.captain_custom_tools.enabled.map do |ct|
+ { name: ct.slug, description: ct.description }
+ end
+ end
+
+ def custom_tools_enabled?
+ @assistant.account.feature_enabled?('custom_tools')
+ end
+
def contact_attributes
return nil unless @conversation&.contact
return nil unless @assistant&.feature_contact_attributes
diff --git a/enterprise/app/services/captain/llm/system_prompts_service.rb b/enterprise/app/services/captain/llm/system_prompts_service.rb
index 69db203ac..9868f0360 100644
--- a/enterprise/app/services/captain/llm/system_prompts_service.rb
+++ b/enterprise/app/services/captain/llm/system_prompts_service.rb
@@ -152,7 +152,7 @@ class Captain::Llm::SystemPromptsService
# rubocop:enable Metrics/MethodLength
# rubocop:disable Metrics/MethodLength
- def assistant_response_generator(assistant_name, product_name, config = {}, contact: nil)
+ def assistant_response_generator(assistant_name, product_name, config = {}, contact: nil, custom_tools: [])
assistant_citation_guidelines = if config['feature_citation']
<<~CITATION_TEXT
- Always include citations for any information provided, referencing the specific source (document only - skip if it was derived from a conversation).
@@ -187,7 +187,7 @@ class Captain::Llm::SystemPromptsService
#{assistant_citation_guidelines}
#{build_contact_context(contact)}[Task]
- Start by introducing yourself. Then, ask the user to share their question. When they answer, call the search_documentation function. Give a helpful response based on the steps written below.
+ Start by introducing yourself. Then, ask the user to share their question. When they answer, use the most appropriate tool to find information. Give a helpful response based on the steps written below.
- Provide the user with the steps required to complete the action one by one.
- Do not return list numbers in the steps, just the plain text is enough.
@@ -203,6 +203,8 @@ class Captain::Llm::SystemPromptsService
```
- If the answer is not provided in context sections, Respond to the customer and ask whether they want to talk to another support agent . If they ask to Chat with another agent, return `conversation_handoff' as the response in JSON response
#{'- You MUST provide numbered citations at the appropriate places in the text.' if config['feature_citation']}
+
+ #{build_tools_section(custom_tools)}
SYSTEM_PROMPT_MESSAGE
end
@@ -291,6 +293,15 @@ class Captain::Llm::SystemPromptsService
private
+ def build_tools_section(custom_tools)
+ tools_list = custom_tools.map { |t| "- #{t[:name]}: #{t[:description]}" }.join("\n")
+ <<~TOOLS.strip
+ [Available Tools]
+ - search_documentation: Search and retrieve documentation from knowledge base
+ #{tools_list}
+ TOOLS
+ end
+
def build_contact_context(contact)
return '' if contact.nil?
diff --git a/enterprise/app/services/captain/tools/custom_http_tool.rb b/enterprise/app/services/captain/tools/custom_http_tool.rb
new file mode 100644
index 000000000..45e5245bf
--- /dev/null
+++ b/enterprise/app/services/captain/tools/custom_http_tool.rb
@@ -0,0 +1,47 @@
+# V1-compatible wrapper for custom HTTP tools.
+#
+# V2's HttpTool inherits from Agents::Tool which overrides execute(tool_context, **params),
+# making it incompatible with V1's RubyLLM pipeline that calls execute(**keyword_args).
+#
+# This class bridges the gap: it inherits from BaseTool (RubyLLM::Tool) for V1 compatibility
+# and delegates the actual HTTP execution to HttpTool#perform.
+class Captain::Tools::CustomHttpTool < Captain::Tools::BaseTool
+ # BaseTool prepends Instrumentation, but our execute() shadows it in the MRO.
+ # Re-prepend so Langfuse captures tool call input/output/timing.
+ prepend Captain::Tools::Instrumentation
+
+ attr_reader :custom_tool
+
+ def initialize(assistant, custom_tool, conversation: nil)
+ @custom_tool = custom_tool
+ @conversation = conversation
+ super(assistant)
+ end
+
+ def active?
+ @custom_tool.enabled?
+ end
+
+ def execute(**params)
+ http_tool = Captain::Tools::HttpTool.new(assistant, @custom_tool)
+ http_tool.perform(build_tool_context, **params)
+ end
+
+ private
+
+ def build_tool_context
+ state = { account_id: assistant.account_id, assistant_id: assistant.id }
+ add_conversation_state(state) if @conversation
+ OpenStruct.new(state: state)
+ end
+
+ def add_conversation_state(state)
+ state[:conversation] = { id: @conversation.id, display_id: @conversation.display_id }
+ state[:contact] = slice_record_attrs(@conversation.contact, :id, :email, :phone_number)
+ state[:contact_inbox] = slice_record_attrs(@conversation.contact_inbox, :id, :hmac_verified)
+ end
+
+ def slice_record_attrs(record, *keys)
+ record&.attributes&.symbolize_keys&.slice(*keys)
+ end
+end
diff --git a/enterprise/app/services/enterprise/billing/reconcile_plan_features_service.rb b/enterprise/app/services/enterprise/billing/reconcile_plan_features_service.rb
index 953ef0326..932cee661 100644
--- a/enterprise/app/services/enterprise/billing/reconcile_plan_features_service.rb
+++ b/enterprise/app/services/enterprise/billing/reconcile_plan_features_service.rb
@@ -17,7 +17,7 @@ class Enterprise::Billing::ReconcilePlanFeaturesService
linear_integration
].freeze
- BUSINESS_PLAN_FEATURES = %w[sla custom_roles csat_review_notes conversation_required_attributes advanced_assignment].freeze
+ BUSINESS_PLAN_FEATURES = %w[sla custom_roles csat_review_notes conversation_required_attributes advanced_assignment custom_tools].freeze
ENTERPRISE_PLAN_FEATURES = %w[audit_logs disable_branding saml].freeze
PREMIUM_PLAN_FEATURES = (STARTUP_PLAN_FEATURES + BUSINESS_PLAN_FEATURES + ENTERPRISE_PLAN_FEATURES).freeze
diff --git a/enterprise/app/views/api/v1/models/captain/_custom_tool.json.jbuilder b/enterprise/app/views/api/v1/models/captain/_custom_tool.json.jbuilder
index 778b30061..ba9d8e3eb 100644
--- a/enterprise/app/views/api/v1/models/captain/_custom_tool.json.jbuilder
+++ b/enterprise/app/views/api/v1/models/captain/_custom_tool.json.jbuilder
@@ -7,7 +7,7 @@ json.http_method custom_tool.http_method
json.request_template custom_tool.request_template
json.response_template custom_tool.response_template
json.auth_type custom_tool.auth_type
-json.auth_config custom_tool.auth_config
+json.auth_config custom_tool.auth_config if Current.user&.administrator?
json.param_schema custom_tool.param_schema
json.enabled custom_tool.enabled
json.account_id custom_tool.account_id
diff --git a/spec/enterprise/controllers/api/v1/accounts/captain/custom_tools_controller_spec.rb b/spec/enterprise/controllers/api/v1/accounts/captain/custom_tools_controller_spec.rb
index 7a1526995..8f4e406f1 100644
--- a/spec/enterprise/controllers/api/v1/accounts/captain/custom_tools_controller_spec.rb
+++ b/spec/enterprise/controllers/api/v1/accounts/captain/custom_tools_controller_spec.rb
@@ -5,6 +5,8 @@ RSpec.describe 'Api::V1::Accounts::Captain::CustomTools', type: :request do
let(:admin) { create(:user, account: account, role: :administrator) }
let(:agent) { create(:user, account: account, role: :agent) }
+ before { account.enable_features!('custom_tools') }
+
def json_response
JSON.parse(response.body, symbolize_names: true)
end
@@ -40,7 +42,7 @@ RSpec.describe 'Api::V1::Accounts::Captain::CustomTools', type: :request do
expect(json_response[:payload].length).to eq(5)
end
- it 'returns only enabled custom tools' do
+ it 'returns all custom tools including disabled' do
create(:captain_custom_tool, account: account, enabled: true)
create(:captain_custom_tool, account: account, enabled: false)
get "/api/v1/accounts/#{account.id}/captain/custom_tools",
@@ -48,8 +50,7 @@ RSpec.describe 'Api::V1::Accounts::Captain::CustomTools', type: :request do
as: :json
expect(response).to have_http_status(:success)
- expect(json_response[:payload].length).to eq(1)
- expect(json_response[:payload].first[:enabled]).to be(true)
+ expect(json_response[:payload].length).to eq(2)
end
end
end
From d83beb2148ee079bdd7701c3f4c6d51638dd7383 Mon Sep 17 00:00:00 2001
From: Muhsin Keloth
Date: Thu, 2 Apr 2026 11:13:11 +0400
Subject: [PATCH 13/53] fix: Populate `extension` and include `content_type`
in attachment webhook payload (#13945)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Attachment webhook event payloads (`message_created`) were missing the
file extension and content type. The `extension` column existed but was
never populated, and `content_type` was not included in the payload at
all.
## What changed
- Added `before_save :set_extension` callback to extract file extension
from the filename when saving an attachment.
- Added `content_type` (from ActiveStorage) to the `file_metadata` used
in `push_event_data`.
### Before
```json
{
"extension": null,
"data_url": "...",
"file_size": 11960
}
```
### After
```json
{
"extension": "pdf",
"content_type": "application/pdf",
"data_url": "...",
"file_size": 11960
}
```
## How to reproduce
1. Send a message with a file attachment (e.g., PDF) via any channel
2. Inspect the `message_created` webhook payload
3. Observe `extension` is `null` and `content_type` is missing
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Opus 4.6 (1M context)
---
app/models/attachment.rb | 9 ++++++++
spec/models/attachment_spec.rb | 38 ++++++++++++++++++++++++++++++++++
2 files changed, 47 insertions(+)
diff --git a/app/models/attachment.rb b/app/models/attachment.rb
index a1cc062a0..c6b4e1d80 100644
--- a/app/models/attachment.rb
+++ b/app/models/attachment.rb
@@ -37,6 +37,7 @@ class Attachment < ApplicationRecord
belongs_to :account
belongs_to :message
has_one_attached :file
+ before_save :set_extension
validate :acceptable_file
validates :external_url, length: { maximum: Limits::URL_LENGTH_LIMIT }
enum file_type: { :image => 0, :audio => 1, :video => 2, :file => 3, :location => 4, :fallback => 5, :share => 6, :story_mention => 7,
@@ -111,6 +112,7 @@ class Attachment < ApplicationRecord
def file_metadata
metadata = {
extension: extension,
+ content_type: file.content_type,
data_url: file_url,
thumb_url: thumb_url,
file_size: file.byte_size,
@@ -154,6 +156,13 @@ class Attachment < ApplicationRecord
}
end
+ def set_extension
+ return unless file.attached?
+ return if extension.present?
+
+ self.extension = File.extname(file.filename.to_s).delete_prefix('.').presence
+ end
+
def should_validate_file?
return unless file.attached?
# we are only limiting attachment types in case of website widget
diff --git a/spec/models/attachment_spec.rb b/spec/models/attachment_spec.rb
index a17839174..5e1dd2107 100644
--- a/spec/models/attachment_spec.rb
+++ b/spec/models/attachment_spec.rb
@@ -187,6 +187,44 @@ RSpec.describe Attachment do
end
end
+ describe 'set_extension' do
+ it 'sets extension from filename on save' do
+ attachment = message.attachments.new(account_id: message.account_id, file_type: :file)
+ attachment.file.attach(io: StringIO.new('fake pdf'), filename: 'test.pdf', content_type: 'application/pdf')
+ attachment.save!
+
+ expect(attachment.extension).to eq('pdf')
+ end
+
+ it 'does not overwrite extension if already set' do
+ attachment = message.attachments.new(account_id: message.account_id, file_type: :file, extension: 'doc')
+ attachment.file.attach(io: StringIO.new('fake pdf'), filename: 'test.pdf', content_type: 'application/pdf')
+ attachment.save!
+
+ expect(attachment.extension).to eq('doc')
+ end
+
+ it 'handles filenames without extension' do
+ attachment = message.attachments.new(account_id: message.account_id, file_type: :file)
+ attachment.file.attach(io: StringIO.new('fake data'), filename: 'README', content_type: 'text/plain')
+ attachment.save!
+
+ expect(attachment.extension).to be_nil
+ end
+ end
+
+ describe 'push_event_data includes extension and content_type' do
+ it 'returns extension and content_type for file attachments' do
+ attachment = message.attachments.new(account_id: message.account_id, file_type: :file)
+ attachment.file.attach(io: StringIO.new('fake pdf'), filename: 'test.pdf', content_type: 'application/pdf')
+ attachment.save!
+
+ event_data = attachment.push_event_data
+ expect(event_data[:extension]).to eq('pdf')
+ expect(event_data[:content_type]).to eq('application/pdf')
+ end
+ end
+
describe 'file size validation' do
let(:attachment) { message.attachments.new(account_id: message.account_id, file_type: :image) }
From b3d0af84c4fa439f9397cd4ae57f39b7d50872b0 Mon Sep 17 00:00:00 2001
From: Muhsin Keloth
Date: Thu, 2 Apr 2026 12:09:24 +0400
Subject: [PATCH 14/53] fix(widget): Queue SDK-set conversation attributes and
labels for first message (#13912)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
### Description
When integrating the web widget via the JS SDK, customers call
setConversationCustomAttributes and setLabel on chatwoot:ready — before
any conversation exists. These API calls silently fail because the
backend endpoints require an existing conversation. When the visitor
sends their first message, the conversation is created without those
attributes/labels, so the message_created webhook payload is missing the
expected metadata.
This change queues SDK-set conversation custom attributes and labels in
the widget store when no conversation exists yet, and includes them in
the API request when the first message (or attachment) creates the
conversation. The backend now permits and applies these params during
conversation creation — before the message is saved and webhooks fire.
### How to test
1. Configure a web widget without a pre-chat form.
2. Open the widget on a test page and run the following in the browser
console after chatwoot:ready:
`window.$chatwoot.setConversationCustomAttributes({ plan: 'enterprise'
});`
`window.$chatwoot.setLabel('vip');` // must be a label that exists in
the account
3. Send the first message from the widget.
4. Verify in the Chatwoot dashboard that the conversation has plan:
enterprise in custom attributes and the vip label applied.
5. Set up a webhook subscriber for `message_created` confirm the first
payload includes the conversation metadata.
6. Verify that calling `setConversationCustomAttributes` / `setLabel` on
an existing conversation still works as before (direct API path, no
regression).
7. Verify the pre-chat form flow still works as expected.
---
.../api/v1/widget/messages_controller.rb | 19 +++-
app/javascript/widget/api/conversation.js | 21 +++-
app/javascript/widget/api/endPoints.js | 39 +++++---
.../widget/api/specs/endPoints.spec.js | 44 +++++++++
.../widget/components/UserMessage.vue | 7 +-
.../store/modules/conversation/actions.js | 59 ++++++++++--
.../store/modules/conversation/getters.js | 2 +
.../store/modules/conversation/index.js | 2 +
.../store/modules/conversation/mutations.js | 29 ++++++
.../store/modules/conversationLabels.js | 12 ++-
.../specs/conversation/actions.spec.js | 96 +++++++++++++++++--
.../specs/conversation/mutations.spec.js | 71 +++++++++++++-
.../api/v1/widget/messages_controller_spec.rb | 59 ++++++++++++
13 files changed, 418 insertions(+), 42 deletions(-)
diff --git a/app/controllers/api/v1/widget/messages_controller.rb b/app/controllers/api/v1/widget/messages_controller.rb
index a51b4c2d6..83b3dc8b1 100644
--- a/app/controllers/api/v1/widget/messages_controller.rb
+++ b/app/controllers/api/v1/widget/messages_controller.rb
@@ -43,7 +43,15 @@ class Api::V1::Widget::MessagesController < Api::V1::Widget::BaseController
end
def set_conversation
- @conversation = create_conversation if conversation.nil?
+ return unless conversation.nil?
+
+ @conversation = create_conversation
+ apply_labels if permitted_params[:labels].present?
+ end
+
+ def apply_labels
+ valid_labels = inbox.account.labels.where(title: permitted_params[:labels]).pluck(:title)
+ @conversation.update_labels(valid_labels) if valid_labels.present?
end
def message_finder_params
@@ -64,7 +72,14 @@ class Api::V1::Widget::MessagesController < Api::V1::Widget::BaseController
def permitted_params
# timestamp parameter is used in create conversation method
- params.permit(:id, :before, :after, :website_token, contact: [:name, :email], message: [:content, :referer_url, :timestamp, :echo_id, :reply_to])
+ # custom_attributes and labels are applied when a new conversation is created alongside the first message
+ params.permit(
+ :id, :before, :after, :website_token,
+ contact: [:name, :email],
+ message: [:content, :referer_url, :timestamp, :echo_id, :reply_to],
+ custom_attributes: {},
+ labels: []
+ )
end
def set_message
diff --git a/app/javascript/widget/api/conversation.js b/app/javascript/widget/api/conversation.js
index 1060b285d..05e81ff9f 100755
--- a/app/javascript/widget/api/conversation.js
+++ b/app/javascript/widget/api/conversation.js
@@ -6,13 +6,26 @@ const createConversationAPI = async content => {
return API.post(urlData.url, urlData.params);
};
-const sendMessageAPI = async (content, replyTo = null) => {
- const urlData = endPoints.sendMessage(content, replyTo);
+const sendMessageAPI = async (
+ content,
+ replyTo = null,
+ { customAttributes, labels } = {}
+) => {
+ const urlData = endPoints.sendMessage(content, replyTo, {
+ customAttributes,
+ labels,
+ });
return API.post(urlData.url, urlData.params);
};
-const sendAttachmentAPI = async (attachment, replyTo = null) => {
- const urlData = endPoints.sendAttachment(attachment, replyTo);
+const sendAttachmentAPI = async (
+ attachment,
+ { customAttributes, labels } = {}
+) => {
+ const urlData = endPoints.sendAttachment(attachment, {
+ customAttributes,
+ labels,
+ });
return API.post(urlData.url, urlData.params);
};
diff --git a/app/javascript/widget/api/endPoints.js b/app/javascript/widget/api/endPoints.js
index b595fdf00..713de56f1 100755
--- a/app/javascript/widget/api/endPoints.js
+++ b/app/javascript/widget/api/endPoints.js
@@ -22,23 +22,30 @@ const createConversation = params => {
};
};
-const sendMessage = (content, replyTo) => {
+const sendMessage = (content, replyTo, { customAttributes, labels } = {}) => {
const referrerURL = window.referrerURL || '';
const search = buildSearchParamsWithLocale(window.location.search);
- return {
- url: `/api/v1/widget/messages${search}`,
- params: {
- message: {
- content,
- reply_to: replyTo,
- timestamp: new Date().toString(),
- referer_url: referrerURL,
- },
+ const params = {
+ message: {
+ content,
+ reply_to: replyTo,
+ timestamp: new Date().toString(),
+ referer_url: referrerURL,
},
};
+ if (customAttributes && Object.keys(customAttributes).length > 0) {
+ params.custom_attributes = customAttributes;
+ }
+ if (labels && labels.length > 0) {
+ params.labels = labels;
+ }
+ return { url: `/api/v1/widget/messages${search}`, params };
};
-const sendAttachment = ({ attachment, replyTo = null }) => {
+const sendAttachment = (
+ { attachment, replyTo = null },
+ { customAttributes, labels } = {}
+) => {
const { referrerURL = '' } = window;
const timestamp = new Date().toString();
const { file } = attachment;
@@ -55,6 +62,16 @@ const sendAttachment = ({ attachment, replyTo = null }) => {
if (replyTo !== null) {
formData.append('message[reply_to]', replyTo);
}
+ if (customAttributes && Object.keys(customAttributes).length > 0) {
+ Object.entries(customAttributes).forEach(([key, value]) => {
+ formData.append(`custom_attributes[${key}]`, value);
+ });
+ }
+ if (labels && labels.length > 0) {
+ labels.forEach(label => {
+ formData.append('labels[]', label);
+ });
+ }
return {
url: `/api/v1/widget/messages${window.location.search}`,
params: formData,
diff --git a/app/javascript/widget/api/specs/endPoints.spec.js b/app/javascript/widget/api/specs/endPoints.spec.js
index 0216caed9..b95b2f659 100644
--- a/app/javascript/widget/api/specs/endPoints.spec.js
+++ b/app/javascript/widget/api/specs/endPoints.spec.js
@@ -32,6 +32,50 @@ describe('#sendMessage', () => {
});
});
+describe('#sendMessage with pending metadata', () => {
+ it('includes custom_attributes and labels in payload', () => {
+ const spy = vi.spyOn(global, 'Date').mockImplementation(() => ({
+ toString: () => 'mock date',
+ }));
+ vi.spyOn(window, 'location', 'get').mockReturnValue({
+ ...window.location,
+ search: '?param=1',
+ });
+
+ window.WOOT_WIDGET = {
+ $root: { $i18n: { locale: 'ar' } },
+ };
+
+ const result = endPoints.sendMessage('hello', null, {
+ customAttributes: { plan: 'enterprise' },
+ labels: ['vip'],
+ });
+
+ expect(result.params.custom_attributes).toEqual({ plan: 'enterprise' });
+ expect(result.params.labels).toEqual(['vip']);
+ spy.mockRestore();
+ });
+
+ it('does not include metadata keys when not provided', () => {
+ const spy = vi.spyOn(global, 'Date').mockImplementation(() => ({
+ toString: () => 'mock date',
+ }));
+ vi.spyOn(window, 'location', 'get').mockReturnValue({
+ ...window.location,
+ search: '?param=1',
+ });
+
+ window.WOOT_WIDGET = {
+ $root: { $i18n: { locale: 'ar' } },
+ };
+
+ const result = endPoints.sendMessage('hello');
+ expect(result.params.custom_attributes).toBeUndefined();
+ expect(result.params.labels).toBeUndefined();
+ spy.mockRestore();
+ });
+});
+
describe('#getConversation', () => {
it('returns correct payload', () => {
vi.spyOn(window, 'location', 'get').mockReturnValue({
diff --git a/app/javascript/widget/components/UserMessage.vue b/app/javascript/widget/components/UserMessage.vue
index a920c508d..25e119140 100755
--- a/app/javascript/widget/components/UserMessage.vue
+++ b/app/javascript/widget/components/UserMessage.vue
@@ -85,10 +85,9 @@ export default {
},
methods: {
async retrySendMessage() {
- await this.$store.dispatch(
- 'conversation/sendMessageWithData',
- this.message
- );
+ await this.$store.dispatch('conversation/sendMessageWithData', {
+ message: this.message,
+ });
},
onImageLoadError() {
this.hasImageError = true;
diff --git a/app/javascript/widget/store/modules/conversation/actions.js b/app/javascript/widget/store/modules/conversation/actions.js
index 6d4c26610..aa08af615 100644
--- a/app/javascript/widget/store/modules/conversation/actions.js
+++ b/app/javascript/widget/store/modules/conversation/actions.js
@@ -30,18 +30,37 @@ export const actions = {
commit('setConversationUIFlag', { isCreating: false });
}
},
- sendMessage: async ({ dispatch }, params) => {
+ sendMessage: async ({ dispatch, state: conversationState }, params) => {
const { content, replyTo } = params;
const message = createTemporaryMessage({ content, replyTo });
- dispatch('sendMessageWithData', message);
+ const { pendingCustomAttributes, pendingLabels } = conversationState;
+ dispatch('sendMessageWithData', {
+ message,
+ pendingCustomAttributes,
+ pendingLabels,
+ });
},
- sendMessageWithData: async ({ commit }, message) => {
+ sendMessageWithData: async (
+ { commit },
+ { message, pendingCustomAttributes = {}, pendingLabels = [] }
+ ) => {
const { id, content, replyTo, meta = {} } = message;
+ const hasPendingMetadata =
+ Object.keys(pendingCustomAttributes).length > 0 ||
+ pendingLabels.length > 0;
commit('pushMessageToConversation', message);
commit('updateMessageMeta', { id, meta: { ...meta, error: '' } });
try {
- const { data } = await sendMessageAPI(content, replyTo);
+ const { data } = await sendMessageAPI(content, replyTo, {
+ customAttributes: hasPendingMetadata
+ ? pendingCustomAttributes
+ : undefined,
+ labels: hasPendingMetadata ? pendingLabels : undefined,
+ });
+ if (hasPendingMetadata) {
+ commit('clearPendingConversationMetadata');
+ }
// [VITE] Don't delete this manually, since `pushMessageToConversation` does the replacement for us anyway
// commit('deleteMessage', message.id);
@@ -59,7 +78,7 @@ export const actions = {
commit('setLastMessageId');
},
- sendAttachment: async ({ commit }, params) => {
+ sendAttachment: async ({ commit, state: conversationState }, params) => {
const {
attachment: { thumbUrl, fileType },
meta = {},
@@ -74,9 +93,22 @@ export const actions = {
attachments: [attachment],
replyTo: params.replyTo,
});
+ const { pendingCustomAttributes, pendingLabels } = conversationState;
+ const hasPendingMetadata =
+ Object.keys(pendingCustomAttributes).length > 0 ||
+ pendingLabels.length > 0;
+
commit('pushMessageToConversation', tempMessage);
try {
- const { data } = await sendAttachmentAPI(params);
+ const { data } = await sendAttachmentAPI(params, {
+ customAttributes: hasPendingMetadata
+ ? pendingCustomAttributes
+ : undefined,
+ labels: hasPendingMetadata ? pendingLabels : undefined,
+ });
+ if (hasPendingMetadata) {
+ commit('clearPendingConversationMetadata');
+ }
commit('updateAttachmentMessageStatus', {
message: data,
tempId: tempMessage.id,
@@ -180,7 +212,14 @@ export const actions = {
await toggleStatus();
},
- setCustomAttributes: async (_, customAttributes = {}) => {
+ setCustomAttributes: async (
+ { commit, rootGetters },
+ customAttributes = {}
+ ) => {
+ if (!rootGetters['conversationAttributes/getConversationParams']?.id) {
+ commit('setPendingCustomAttributes', customAttributes);
+ return;
+ }
try {
await setCustomAttributes(customAttributes);
} catch (error) {
@@ -188,7 +227,11 @@ export const actions = {
}
},
- deleteCustomAttribute: async (_, customAttribute) => {
+ deleteCustomAttribute: async ({ commit, rootGetters }, customAttribute) => {
+ if (!rootGetters['conversationAttributes/getConversationParams']?.id) {
+ commit('removePendingCustomAttribute', customAttribute);
+ return;
+ }
try {
await deleteCustomAttribute(customAttribute);
} catch (error) {
diff --git a/app/javascript/widget/store/modules/conversation/getters.js b/app/javascript/widget/store/modules/conversation/getters.js
index 151694b86..ef1cd1cc3 100644
--- a/app/javascript/widget/store/modules/conversation/getters.js
+++ b/app/javascript/widget/store/modules/conversation/getters.js
@@ -33,6 +33,8 @@ export const getters = {
messages: groupConversationBySender(conversationGroupedByDate[date]),
}));
},
+ getPendingCustomAttributes: _state => _state.pendingCustomAttributes,
+ getPendingLabels: _state => _state.pendingLabels,
getIsFetchingList: _state => _state.uiFlags.isFetchingList,
getMessageCount: _state => {
return Object.values(_state.conversations).length;
diff --git a/app/javascript/widget/store/modules/conversation/index.js b/app/javascript/widget/store/modules/conversation/index.js
index 9869b6a87..077a16a04 100755
--- a/app/javascript/widget/store/modules/conversation/index.js
+++ b/app/javascript/widget/store/modules/conversation/index.js
@@ -14,6 +14,8 @@ const state = {
isCreating: false,
},
lastMessageId: null,
+ pendingCustomAttributes: {},
+ pendingLabels: [],
};
export default {
diff --git a/app/javascript/widget/store/modules/conversation/mutations.js b/app/javascript/widget/store/modules/conversation/mutations.js
index 781dcd67b..1c23e008d 100644
--- a/app/javascript/widget/store/modules/conversation/mutations.js
+++ b/app/javascript/widget/store/modules/conversation/mutations.js
@@ -4,6 +4,8 @@ import { findUndeliveredMessage } from './helpers';
export const mutations = {
clearConversations($state) {
$state.conversations = {};
+ $state.pendingCustomAttributes = {};
+ $state.pendingLabels = [];
},
pushMessageToConversation($state, message) {
const { id, status, message_type: type } = message;
@@ -113,4 +115,31 @@ export const mutations = {
const { id } = lastMessage;
$state.lastMessageId = id;
},
+
+ setPendingCustomAttributes($state, data) {
+ $state.pendingCustomAttributes = {
+ ...$state.pendingCustomAttributes,
+ ...data,
+ };
+ },
+
+ setPendingLabels($state, label) {
+ if (!$state.pendingLabels.includes(label)) {
+ $state.pendingLabels.push(label);
+ }
+ },
+
+ removePendingCustomAttribute($state, key) {
+ const { [key]: _, ...rest } = $state.pendingCustomAttributes;
+ $state.pendingCustomAttributes = rest;
+ },
+
+ removePendingLabel($state, label) {
+ $state.pendingLabels = $state.pendingLabels.filter(l => l !== label);
+ },
+
+ clearPendingConversationMetadata($state) {
+ $state.pendingCustomAttributes = {};
+ $state.pendingLabels = [];
+ },
};
diff --git a/app/javascript/widget/store/modules/conversationLabels.js b/app/javascript/widget/store/modules/conversationLabels.js
index 3ae600082..ec3fc9fa4 100644
--- a/app/javascript/widget/store/modules/conversationLabels.js
+++ b/app/javascript/widget/store/modules/conversationLabels.js
@@ -5,14 +5,22 @@ const state = {};
export const getters = {};
export const actions = {
- create: async (_, label) => {
+ create: async ({ commit, rootGetters }, label) => {
+ if (!rootGetters['conversationAttributes/getConversationParams']?.id) {
+ commit('conversation/setPendingLabels', label, { root: true });
+ return;
+ }
try {
await conversationLabels.create(label);
} catch (error) {
// Ignore error
}
},
- destroy: async (_, label) => {
+ destroy: async ({ commit, rootGetters }, label) => {
+ if (!rootGetters['conversationAttributes/getConversationParams']?.id) {
+ commit('conversation/removePendingLabel', label, { root: true });
+ return;
+ }
try {
await conversationLabels.destroy(label);
} catch (error) {
diff --git a/app/javascript/widget/store/modules/specs/conversation/actions.spec.js b/app/javascript/widget/store/modules/specs/conversation/actions.spec.js
index 39b8afe1a..2ab17cb37 100644
--- a/app/javascript/widget/store/modules/specs/conversation/actions.spec.js
+++ b/app/javascript/widget/store/modules/specs/conversation/actions.spec.js
@@ -111,20 +111,45 @@ describe('#actions', () => {
search: '?param=1',
},
}));
+ const state = { pendingCustomAttributes: {}, pendingLabels: [] };
await actions.sendMessage(
- { commit, dispatch },
+ { commit, dispatch, state },
{ content: 'hello', replyTo: 124 }
);
spy.mockRestore();
windowSpy.mockRestore();
expect(dispatch).toBeCalledWith('sendMessageWithData', {
- attachments: undefined,
- content: 'hello',
- created_at: 1466424490,
- id: '1111',
- message_type: 0,
- replyTo: 124,
- status: 'in_progress',
+ message: {
+ attachments: undefined,
+ content: 'hello',
+ created_at: 1466424490,
+ id: '1111',
+ message_type: 0,
+ replyTo: 124,
+ status: 'in_progress',
+ },
+ pendingCustomAttributes: {},
+ pendingLabels: [],
+ });
+ });
+
+ it('includes pending metadata when available', async () => {
+ const mockDate = new Date(1466424490000);
+ getUuid.mockImplementationOnce(() => '2222');
+ const spy = vi.spyOn(global, 'Date').mockImplementation(() => mockDate);
+ const state = {
+ pendingCustomAttributes: { plan: 'enterprise' },
+ pendingLabels: ['vip'],
+ };
+ await actions.sendMessage(
+ { commit, dispatch, state },
+ { content: 'hello' }
+ );
+ spy.mockRestore();
+ expect(dispatch).toBeCalledWith('sendMessageWithData', {
+ message: expect.objectContaining({ content: 'hello' }),
+ pendingCustomAttributes: { plan: 'enterprise' },
+ pendingLabels: ['vip'],
});
});
});
@@ -136,9 +161,10 @@ describe('#actions', () => {
const spy = vi.spyOn(global, 'Date').mockImplementation(() => mockDate);
const thumbUrl = '';
const attachment = { thumbUrl, fileType: 'file' };
+ const state = { pendingCustomAttributes: {}, pendingLabels: [] };
actions.sendAttachment(
- { commit, dispatch },
+ { commit, dispatch, state },
{ attachment, replyTo: 135 }
);
spy.mockRestore();
@@ -180,6 +206,58 @@ describe('#actions', () => {
});
});
+ describe('#setCustomAttributes', () => {
+ it('queues to pending state when no conversation exists', async () => {
+ const rootGetters = {
+ 'conversationAttributes/getConversationParams': { id: '' },
+ };
+ await actions.setCustomAttributes(
+ { commit, rootGetters },
+ { plan: 'enterprise' }
+ );
+ expect(commit).toBeCalledWith('setPendingCustomAttributes', {
+ plan: 'enterprise',
+ });
+ });
+
+ it('calls API when conversation exists', async () => {
+ API.post.mockResolvedValue({ data: {} });
+ const rootGetters = {
+ 'conversationAttributes/getConversationParams': { id: 123 },
+ };
+ await actions.setCustomAttributes(
+ { commit, rootGetters },
+ { plan: 'enterprise' }
+ );
+ expect(commit).not.toBeCalledWith(
+ 'setPendingCustomAttributes',
+ expect.anything()
+ );
+ });
+ });
+
+ describe('#deleteCustomAttribute', () => {
+ it('removes from pending state when no conversation exists', async () => {
+ const rootGetters = {
+ 'conversationAttributes/getConversationParams': { id: '' },
+ };
+ await actions.deleteCustomAttribute({ commit, rootGetters }, 'plan');
+ expect(commit).toBeCalledWith('removePendingCustomAttribute', 'plan');
+ });
+
+ it('calls API when conversation exists', async () => {
+ API.post.mockResolvedValue({ data: {} });
+ const rootGetters = {
+ 'conversationAttributes/getConversationParams': { id: 123 },
+ };
+ await actions.deleteCustomAttribute({ commit, rootGetters }, 'plan');
+ expect(commit).not.toBeCalledWith(
+ 'removePendingCustomAttribute',
+ expect.anything()
+ );
+ });
+ });
+
describe('#clearConversations', () => {
it('sends correct mutations', () => {
actions.clearConversations({ commit });
diff --git a/app/javascript/widget/store/modules/specs/conversation/mutations.spec.js b/app/javascript/widget/store/modules/specs/conversation/mutations.spec.js
index bc6b6bd29..0894c5b52 100644
--- a/app/javascript/widget/store/modules/specs/conversation/mutations.spec.js
+++ b/app/javascript/widget/store/modules/specs/conversation/mutations.spec.js
@@ -169,10 +169,77 @@ describe('#mutations', () => {
});
describe('#clearConversations', () => {
- it('clears the state', () => {
- const state = { conversations: { 1: { id: 1 } } };
+ it('clears conversations and pending metadata', () => {
+ const state = {
+ conversations: { 1: { id: 1 } },
+ pendingCustomAttributes: { plan: 'enterprise' },
+ pendingLabels: ['vip'],
+ };
mutations.clearConversations(state);
expect(state.conversations).toEqual({});
+ expect(state.pendingCustomAttributes).toEqual({});
+ expect(state.pendingLabels).toEqual([]);
+ });
+ });
+
+ describe('#setPendingCustomAttributes', () => {
+ it('merges custom attributes into pending state', () => {
+ const state = { pendingCustomAttributes: { existing: 'value' } };
+ mutations.setPendingCustomAttributes(state, { plan: 'enterprise' });
+ expect(state.pendingCustomAttributes).toEqual({
+ existing: 'value',
+ plan: 'enterprise',
+ });
+ });
+ });
+
+ describe('#setPendingLabels', () => {
+ it('adds label to pending state', () => {
+ const state = { pendingLabels: [] };
+ mutations.setPendingLabels(state, 'vip');
+ expect(state.pendingLabels).toEqual(['vip']);
+ });
+
+ it('does not add duplicate labels', () => {
+ const state = { pendingLabels: ['vip'] };
+ mutations.setPendingLabels(state, 'vip');
+ expect(state.pendingLabels).toEqual(['vip']);
+ });
+ });
+
+ describe('#removePendingCustomAttribute', () => {
+ it('removes a single key from pending custom attributes', () => {
+ const state = {
+ pendingCustomAttributes: { plan: 'enterprise', region: 'us' },
+ };
+ mutations.removePendingCustomAttribute(state, 'plan');
+ expect(state.pendingCustomAttributes).toEqual({ region: 'us' });
+ });
+ });
+
+ describe('#removePendingLabel', () => {
+ it('removes a label from pending labels', () => {
+ const state = { pendingLabels: ['vip', 'premium'] };
+ mutations.removePendingLabel(state, 'vip');
+ expect(state.pendingLabels).toEqual(['premium']);
+ });
+
+ it('does nothing if label not present', () => {
+ const state = { pendingLabels: ['vip'] };
+ mutations.removePendingLabel(state, 'premium');
+ expect(state.pendingLabels).toEqual(['vip']);
+ });
+ });
+
+ describe('#clearPendingConversationMetadata', () => {
+ it('clears pending custom attributes and labels', () => {
+ const state = {
+ pendingCustomAttributes: { plan: 'enterprise' },
+ pendingLabels: ['vip'],
+ };
+ mutations.clearPendingConversationMetadata(state);
+ expect(state.pendingCustomAttributes).toEqual({});
+ expect(state.pendingLabels).toEqual([]);
});
});
diff --git a/spec/controllers/api/v1/widget/messages_controller_spec.rb b/spec/controllers/api/v1/widget/messages_controller_spec.rb
index 11c916514..902b4ec01 100644
--- a/spec/controllers/api/v1/widget/messages_controller_spec.rb
+++ b/spec/controllers/api/v1/widget/messages_controller_spec.rb
@@ -56,6 +56,65 @@ RSpec.describe '/api/v1/widget/messages', type: :request do
expect(json_response['content']).to eq(message_params[:content])
end
+ it 'creates conversation with custom_attributes when first message is sent' do
+ conversation.destroy!
+ message_params = { content: 'hello world', timestamp: Time.current }
+ custom_attributes = { plan: 'enterprise', source: 'website' }
+ post api_v1_widget_messages_url,
+ params: { website_token: web_widget.website_token, message: message_params, custom_attributes: custom_attributes },
+ headers: { 'X-Auth-Token' => token },
+ as: :json
+
+ expect(response).to have_http_status(:success)
+ new_conversation = contact.conversations.last
+ expect(new_conversation.custom_attributes).to include('plan' => 'enterprise', 'source' => 'website')
+ end
+
+ it 'creates conversation with labels when first message is sent' do
+ conversation.destroy!
+ label = create(:label, title: 'vip', account: account)
+ message_params = { content: 'hello world', timestamp: Time.current }
+ post api_v1_widget_messages_url,
+ params: { website_token: web_widget.website_token, message: message_params, labels: [label.title] },
+ headers: { 'X-Auth-Token' => token },
+ as: :json
+
+ expect(response).to have_http_status(:success)
+ new_conversation = contact.conversations.last
+ expect(new_conversation.label_list).to include('vip')
+ end
+
+ it 'ignores invalid labels when creating conversation with first message' do
+ conversation.destroy!
+ create(:label, title: 'valid-label', account: account)
+ message_params = { content: 'hello world', timestamp: Time.current }
+ post api_v1_widget_messages_url,
+ params: { website_token: web_widget.website_token, message: message_params, labels: %w[valid-label nonexistent] },
+ headers: { 'X-Auth-Token' => token },
+ as: :json
+
+ expect(response).to have_http_status(:success)
+ new_conversation = contact.conversations.last
+ expect(new_conversation.label_list).to include('valid-label')
+ expect(new_conversation.label_list).not_to include('nonexistent')
+ end
+
+ it 'does not apply labels or custom_attributes when conversation already exists' do
+ create(:label, title: 'vip', account: account)
+ message_params = { content: 'hello world', timestamp: Time.current }
+ custom_attributes = { plan: 'enterprise' }
+ post api_v1_widget_messages_url,
+ params: { website_token: web_widget.website_token, message: message_params,
+ custom_attributes: custom_attributes, labels: ['vip'] },
+ headers: { 'X-Auth-Token' => token },
+ as: :json
+
+ expect(response).to have_http_status(:success)
+ conversation.reload
+ expect(conversation.custom_attributes).not_to include('plan' => 'enterprise')
+ expect(conversation.label_list).not_to include('vip')
+ end
+
it 'does not create the message' do
conversation.destroy! # Test all params
message_params = { content: "#{'h' * 150 * 1000}a", timestamp: Time.current }
From b815eb9ce0e3cf26c1716f8f62a90f1891d03995 Mon Sep 17 00:00:00 2001
From: Muhsin Keloth
Date: Thu, 2 Apr 2026 13:55:05 +0400
Subject: [PATCH 15/53] fix(agent-bot): Dispatch webhook event on agent bot
assignment (#13975)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
When an AgentBot is assigned to a conversation after the first message
has already been received, the bot does not respond because it never
receives any event. The `message_created` event fires before the bot is
assigned, and the bot has no way to know it was assigned.
Chatwoot already dispatches a `CONVERSATION_UPDATED` event when
`assignee_agent_bot_id` changes, but `AgentBotListener` wasn't listening
for it. This fix adds a `conversation_updated` handler so the bot
receives a webhook with the conversation context when assigned.
## How to reproduce
1. Customer sends a message → conversation created, `message_created`
fires
2. System processes the message (adds labels, custom attributes)
3. System assigns an AgentBot to the conversation via API
4. **Before fix:** Bot receives no event and never responds
5. **After fix:** Bot receives `conversation_updated` event with
conversation payload
## What changed
- **`AgentBotListener`**: Added `conversation_updated` handler that
sends the conversation webhook payload to the assigned bot when the
conversation is updated
## How to test
1. Create an AgentBot with an `outgoing_url` pointing to a webhook
inspector (e.g. webhook.site)
2. Send a message to create a conversation
3. Assign the AgentBot to the conversation via API:
```
POST /api/v1/accounts/{id}/conversations/{id}/assignments
{ "assignee_id": , "assignee_type": "AgentBot" }
```
4. Verify the bot receives a `conversation_updated` event at its webhook
URL
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Opus 4.6 (1M context)
---
app/listeners/agent_bot_listener.rb | 8 ++++++
spec/listeners/agent_bot_listener_spec.rb | 33 +++++++++++++++++++++++
2 files changed, 41 insertions(+)
diff --git a/app/listeners/agent_bot_listener.rb b/app/listeners/agent_bot_listener.rb
index ccac8005f..8fdf964fb 100644
--- a/app/listeners/agent_bot_listener.rb
+++ b/app/listeners/agent_bot_listener.rb
@@ -15,6 +15,14 @@ class AgentBotListener < BaseListener
agent_bots_for(inbox, conversation).each { |agent_bot| process_webhook_bot_event(agent_bot, payload) }
end
+ def conversation_updated(event)
+ conversation = extract_conversation_and_account(event)[0]
+ inbox = conversation.inbox
+ event_name = __method__.to_s
+ payload = conversation.webhook_data.merge(event: event_name)
+ agent_bots_for(inbox, conversation).each { |agent_bot| process_webhook_bot_event(agent_bot, payload) }
+ end
+
def message_created(event)
message = extract_message_and_account(event)[0]
inbox = message.inbox
diff --git a/spec/listeners/agent_bot_listener_spec.rb b/spec/listeners/agent_bot_listener_spec.rb
index 56c478a1b..24af37383 100644
--- a/spec/listeners/agent_bot_listener_spec.rb
+++ b/spec/listeners/agent_bot_listener_spec.rb
@@ -57,6 +57,39 @@ describe AgentBotListener do
end
end
+ describe '#conversation_updated' do
+ let(:event_name) { 'conversation.updated' }
+ let!(:event) { Events::Base.new(event_name, Time.zone.now, conversation: conversation) }
+
+ context 'when agent bot is not configured' do
+ it 'does not send webhook' do
+ expect(AgentBots::WebhookJob).not_to receive(:perform_later)
+ listener.conversation_updated(event)
+ end
+ end
+
+ context 'when agent bot is configured on inbox' do
+ it 'sends webhook to the inbox agent bot' do
+ create(:agent_bot_inbox, inbox: inbox, agent_bot: agent_bot)
+ expect(AgentBots::WebhookJob).to receive(:perform_later).with(agent_bot.outgoing_url,
+ conversation.webhook_data.merge(event: 'conversation_updated')).once
+ listener.conversation_updated(event)
+ end
+ end
+
+ context 'when conversation is assigned to an agent bot' do
+ before do
+ conversation.update!(assignee_agent_bot: agent_bot, assignee: nil)
+ end
+
+ it 'sends webhook to the assigned agent bot' do
+ expect(AgentBots::WebhookJob).to receive(:perform_later).with(agent_bot.outgoing_url,
+ conversation.webhook_data.merge(event: 'conversation_updated')).once
+ listener.conversation_updated(event)
+ end
+ end
+ end
+
describe '#webwidget_triggered' do
let(:event_name) { 'webwidget.triggered' }
From b9b5a187672a5b925f4333fecb387f9bd491082a Mon Sep 17 00:00:00 2001
From: Shivam Mishra
Date: Thu, 2 Apr 2026 16:02:22 +0530
Subject: [PATCH 16/53] revert: html background for widget (#13981)
Reverts chatwoot/chatwoot#13955
---
app/javascript/widget/assets/scss/woot.scss | 2 +-
app/javascript/widget/composables/useDarkMode.js | 6 +-----
app/javascript/widget/views/ArticleViewer.vue | 2 +-
app/views/layouts/portal.html.erb | 4 ++--
4 files changed, 5 insertions(+), 9 deletions(-)
diff --git a/app/javascript/widget/assets/scss/woot.scss b/app/javascript/widget/assets/scss/woot.scss
index 0044ccdfc..07aa6a0e3 100755
--- a/app/javascript/widget/assets/scss/woot.scss
+++ b/app/javascript/widget/assets/scss/woot.scss
@@ -7,7 +7,7 @@
html,
body {
- @apply antialiased h-full bg-n-slate-2 dark:bg-n-solid-1;
+ @apply antialiased h-full;
}
.is-mobile {
diff --git a/app/javascript/widget/composables/useDarkMode.js b/app/javascript/widget/composables/useDarkMode.js
index 407d90980..bc19c456b 100644
--- a/app/javascript/widget/composables/useDarkMode.js
+++ b/app/javascript/widget/composables/useDarkMode.js
@@ -1,4 +1,4 @@
-import { computed, watchEffect } from 'vue';
+import { computed } from 'vue';
import { useMapGetter } from 'dashboard/composables/store';
const isDarkModeAuto = mode => mode === 'auto';
@@ -23,10 +23,6 @@ export function useDarkMode() {
calculatePrefersDarkMode(darkMode.value, systemPreference.value)
);
- watchEffect(() => {
- document.documentElement.classList.toggle('dark', prefersDarkMode.value);
- });
-
return {
darkMode,
prefersDarkMode,
diff --git a/app/javascript/widget/views/ArticleViewer.vue b/app/javascript/widget/views/ArticleViewer.vue
index bc4cf775c..9289d0546 100644
--- a/app/javascript/widget/views/ArticleViewer.vue
+++ b/app/javascript/widget/views/ArticleViewer.vue
@@ -10,7 +10,7 @@ export default {
-
+
diff --git a/app/views/layouts/portal.html.erb b/app/views/layouts/portal.html.erb
index 52d8e2789..78418881a 100644
--- a/app/views/layouts/portal.html.erb
+++ b/app/views/layouts/portal.html.erb
@@ -58,9 +58,9 @@ By default, it renders:
}
-
+
-
+
<% if !@is_plain_layout_enabled %>
<%= render "public/api/v1/portals/header", portal: @portal %>
<% end %>
From 441fe4db1147c4392e0e026c6a97c3d4d5de75ef Mon Sep 17 00:00:00 2001
From: Pranav
Date: Thu, 2 Apr 2026 07:26:23 -0700
Subject: [PATCH 17/53] fix: scope external_url override to Instagram DM
conversations only (#13982)
Previously, all incoming messages from Facebook channel with
instagram_id had their attachment data_url and thumb_url overridden with
external_url. This caused issues for non-Instagram conversations
originating from Facebook Message where the file URL should be used
instead.
Narrows the override to only apply when the conversation type is
instagram_direct_message, which is the only case where Instagram's CDN
URLs need to be used directly.
Fixes
https://linear.app/chatwoot/issue/CW-6722/videos-are-missing-in-facebook-conversation
---------
Co-authored-by: Muhsin <12408980+muhsin-k@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context)
---
app/models/attachment.rb | 10 ++++-
spec/models/attachment_spec.rb | 82 +++++++++++++++++++++++++++++++---
2 files changed, 86 insertions(+), 6 deletions(-)
diff --git a/app/models/attachment.rb b/app/models/attachment.rb
index c6b4e1d80..769e134be 100644
--- a/app/models/attachment.rb
+++ b/app/models/attachment.rb
@@ -120,7 +120,7 @@ class Attachment < ApplicationRecord
height: file.metadata[:height]
}
- metadata[:data_url] = metadata[:thumb_url] = external_url if message.inbox.instagram? && message.incoming?
+ metadata[:data_url] = metadata[:thumb_url] = external_url if instagram_incoming_message?
metadata
end
@@ -156,6 +156,14 @@ class Attachment < ApplicationRecord
}
end
+ def instagram_incoming_message?
+ return false unless message.incoming?
+
+ return true if message.inbox.instagram_direct?
+
+ message.inbox.instagram? && message.conversation&.additional_attributes&.dig('type') == 'instagram_direct_message'
+ end
+
def set_extension
return unless file.attached?
return if extension.present?
diff --git a/spec/models/attachment_spec.rb b/spec/models/attachment_spec.rb
index 5e1dd2107..82fb51bf1 100644
--- a/spec/models/attachment_spec.rb
+++ b/spec/models/attachment_spec.rb
@@ -57,11 +57,6 @@ RSpec.describe Attachment do
}.to_json, headers: {})
end
- it 'returns external url as data and thumb urls when message is incoming' do
- external_url = instagram_message.attachments.first.external_url
- expect(instagram_message.attachments.first.push_event_data[:data_url]).to eq external_url
- end
-
it 'returns original attachment url as data url if the message is outgoing' do
message = create(:message, :instagram_story_mention, message_type: :outgoing)
expect(message.attachments.first.push_event_data[:data_url]).not_to eq message.attachments.first.external_url
@@ -155,6 +150,83 @@ RSpec.describe Attachment do
end
end
+ describe 'push_event_data for instagram direct message attachments' do
+ let(:account) { create(:account) }
+ let(:instagram_inbox) do
+ create(:inbox, account: account,
+ channel: create(:channel_instagram_fb_page, account: account, instagram_id: 'instagram-dm-test'))
+ end
+
+ context 'when conversation type is instagram_direct_message' do
+ let(:conversation) do
+ create(:conversation, account: account, inbox: instagram_inbox,
+ additional_attributes: { 'type' => 'instagram_direct_message' })
+ end
+ let(:instagram_message) { create(:message, account: account, inbox: instagram_inbox, conversation: conversation, message_type: :incoming) }
+
+ it 'uses external_url for data_url and thumb_url' do
+ attachment = instagram_message.attachments.new(account_id: account.id, file_type: :image, external_url: 'https://instagram.com/image.jpg')
+ attachment.file.attach(io: Rails.root.join('spec/assets/avatar.png').open, filename: 'avatar.png', content_type: 'image/png')
+ attachment.save!
+
+ event_data = attachment.push_event_data
+ expect(event_data[:data_url]).to eq('https://instagram.com/image.jpg')
+ expect(event_data[:thumb_url]).to eq('https://instagram.com/image.jpg')
+ end
+ end
+
+ context 'when conversation type is not instagram_direct_message' do
+ let(:conversation) do
+ create(:conversation, account: account, inbox: instagram_inbox,
+ additional_attributes: { 'type' => 'other_type' })
+ end
+ let(:instagram_message) { create(:message, account: account, inbox: instagram_inbox, conversation: conversation, message_type: :incoming) }
+
+ it 'uses file_url for data_url instead of external_url' do
+ attachment = instagram_message.attachments.new(account_id: account.id, file_type: :image, external_url: 'https://instagram.com/image.jpg')
+ attachment.file.attach(io: Rails.root.join('spec/assets/avatar.png').open, filename: 'avatar.png', content_type: 'image/png')
+ attachment.save!
+
+ event_data = attachment.push_event_data
+ expect(event_data[:data_url]).not_to eq('https://instagram.com/image.jpg')
+ end
+ end
+
+ context 'when message is outgoing on instagram DM conversation' do
+ let(:conversation) do
+ create(:conversation, account: account, inbox: instagram_inbox,
+ additional_attributes: { 'type' => 'instagram_direct_message' })
+ end
+ let(:outgoing_message) { create(:message, account: account, inbox: instagram_inbox, conversation: conversation, message_type: :outgoing) }
+
+ it 'does not override data_url with external_url' do
+ attachment = outgoing_message.attachments.new(account_id: account.id, file_type: :image, external_url: 'https://instagram.com/image.jpg')
+ attachment.file.attach(io: Rails.root.join('spec/assets/avatar.png').open, filename: 'avatar.png', content_type: 'image/png')
+ attachment.save!
+
+ event_data = attachment.push_event_data
+ expect(event_data[:data_url]).not_to eq('https://instagram.com/image.jpg')
+ end
+ end
+
+ context 'when inbox is Channel::Instagram (direct login)' do
+ let(:instagram_channel) { create(:channel_instagram, account: account) }
+ let(:direct_inbox) { instagram_channel.inbox }
+ let(:conversation) { create(:conversation, account: account, inbox: direct_inbox) }
+ let(:incoming_message) { create(:message, account: account, inbox: direct_inbox, conversation: conversation, message_type: :incoming) }
+
+ it 'uses external_url for data_url and thumb_url' do
+ attachment = incoming_message.attachments.new(account_id: account.id, file_type: :image, external_url: 'https://instagram.com/image.jpg')
+ attachment.file.attach(io: Rails.root.join('spec/assets/avatar.png').open, filename: 'avatar.png', content_type: 'image/png')
+ attachment.save!
+
+ event_data = attachment.push_event_data
+ expect(event_data[:data_url]).to eq('https://instagram.com/image.jpg')
+ expect(event_data[:thumb_url]).to eq('https://instagram.com/image.jpg')
+ end
+ end
+ end
+
describe 'push_event_data for ig_reel attachments' do
it 'returns external_url as data_url when no file is attached' do
attachment = message.attachments.create!(
From 6f5ad8f3724b68fec3780b22047c539c06520fb2 Mon Sep 17 00:00:00 2001
From: Tanmay Deep Sharma <32020192+tds-1@users.noreply.github.com>
Date: Thu, 2 Apr 2026 19:58:43 +0530
Subject: [PATCH 18/53] fix: strip manually_managed_features from params in
super admin account create (#13983)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
## Summary
When a Super Admin creates a new account via the Administrate dashboard,
the `manually_managed_features` field (a virtual attribute stored in
`internal_attributes` JSON) is passed to `Account.new(...)`, raising
`ActiveModel::UnknownAttributeError`. The existing `update` action
already strips this param — this fix adds the same handling to `create`.
Closes -> https://linear.app/chatwoot/issue/INF-66
Related Sentry ->
https://chatwoot-p3.sentry.io/issues/7168237533/?project=6382945&referrer=Linear
## Type of change
- [x] Bug fix (non-breaking change which fixes an issue)
## How to reproduce
1. Log in as Super Admin
2. Navigate to Accounts → New
3. Fill in the form (with or without manually managed features selected)
4. Submit → `ActiveModel::UnknownAttributeError: unknown attribute
'manually_managed_features' for Account`
## What changed
- Added a `create` override in
`Enterprise::SuperAdmin::AccountsController` that strips
`manually_managed_features` from params before calling `super`, then
persists them via `InternalAttributesService` after the account is
saved.
---
.../enterprise/super_admin/accounts_controller.rb | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/enterprise/app/controllers/enterprise/super_admin/accounts_controller.rb b/enterprise/app/controllers/enterprise/super_admin/accounts_controller.rb
index 305699dcb..23a8cc5de 100644
--- a/enterprise/app/controllers/enterprise/super_admin/accounts_controller.rb
+++ b/enterprise/app/controllers/enterprise/super_admin/accounts_controller.rb
@@ -1,4 +1,15 @@
module Enterprise::SuperAdmin::AccountsController
+ def create
+ manually_managed = params[:account]&.delete(:manually_managed_features)
+
+ super do |resource|
+ if manually_managed.present?
+ service = ::Internal::Accounts::InternalAttributesService.new(resource)
+ service.manually_managed_features = manually_managed
+ end
+ end
+ end
+
def update
# Handle manually managed features from form submission
if params[:account] && params[:account][:manually_managed_features].present?
From 5fd3d5e036c6b4fe3e3beb164c59b6dc9bd830b3 Mon Sep 17 00:00:00 2001
From: Tanmay Deep Sharma <32020192+tds-1@users.noreply.github.com>
Date: Mon, 6 Apr 2026 11:39:14 +0530
Subject: [PATCH 19/53] feat: allow zero conversation limit capacity policy
(#13964)
## Description
Two improvements to Agent Capacity Policy:
**1. Support exclusion via zero conversation limit**
Allow `conversation_limit` to be `0` on inbox capacity limits. Agents
with a zero limit are excluded from auto-assignment for that inbox while
remaining members for manual assignment.
**2. Fix exclusion rules duration input**
- Default changed from `10` to `null` so time-based exclusion isn't
applied unless explicitly set.
- Minimum lowered from 10 to 1 minute.
- `DurationInput` updated to handle `null` values correctly.
## Type of change
Please delete options that are not relevant.
- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
## How Has This Been Tested?
- Added model and capacity service specs for zero-limit exclusion
behavior.
- Tested manually via UI flows
## Checklist:
- [ ] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] 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/ExclusionRules.vue | 6 +--
.../components/InboxCapacityLimits.vue | 3 +-
.../components-next/input/DurationInput.vue | 6 +++
.../pages/AgentCapacityEditPage.vue | 2 +-
.../components/AgentCapacityPolicyForm.vue | 6 +--
enterprise/app/models/inbox_capacity_limit.rb | 2 +-
.../models/inbox_capacity_limit_spec.rb | 14 +++++-
.../auto_assignment/capacity_service_spec.rb | 49 +++++++++++++++++++
8 files changed, 78 insertions(+), 10 deletions(-)
diff --git a/app/javascript/dashboard/components-next/AssignmentPolicy/components/ExclusionRules.vue b/app/javascript/dashboard/components-next/AssignmentPolicy/components/ExclusionRules.vue
index 3ac7dfd5f..2aafec45b 100644
--- a/app/javascript/dashboard/components-next/AssignmentPolicy/components/ExclusionRules.vue
+++ b/app/javascript/dashboard/components-next/AssignmentPolicy/components/ExclusionRules.vue
@@ -20,11 +20,11 @@ const excludedLabels = defineModel('excludedLabels', {
const excludeOlderThanMinutes = defineModel('excludeOlderThanMinutes', {
type: Number,
- default: 10,
+ default: null,
});
-// Duration limits: 10 minutes to 999 days (in minutes)
-const MIN_DURATION_MINUTES = 10;
+// Duration limits: 1 minute to 999 days (in minutes)
+const MIN_DURATION_MINUTES = 1;
const MAX_DURATION_MINUTES = 1438560; // 999 days * 24 hours * 60 minutes
const { t } = useI18n();
diff --git a/app/javascript/dashboard/components-next/AssignmentPolicy/components/InboxCapacityLimits.vue b/app/javascript/dashboard/components-next/AssignmentPolicy/components/InboxCapacityLimits.vue
index b31248653..7b79e5280 100644
--- a/app/javascript/dashboard/components-next/AssignmentPolicy/components/InboxCapacityLimits.vue
+++ b/app/javascript/dashboard/components-next/AssignmentPolicy/components/InboxCapacityLimits.vue
@@ -27,7 +27,7 @@ const { t } = useI18n();
const BASE_KEY = 'ASSIGNMENT_POLICY.AGENT_CAPACITY_POLICY';
const DEFAULT_CONVERSATION_LIMIT = 10;
-const MIN_CONVERSATION_LIMIT = 1;
+const MIN_CONVERSATION_LIMIT = 0;
const MAX_CONVERSATION_LIMIT = 100000;
const selectedInboxIds = computed(
@@ -42,6 +42,7 @@ const availableInboxes = computed(() =>
const isLimitValid = limit => {
return (
+ Number.isInteger(limit.conversationLimit) &&
limit.conversationLimit >= MIN_CONVERSATION_LIMIT &&
limit.conversationLimit <= MAX_CONVERSATION_LIMIT
);
diff --git a/app/javascript/dashboard/components-next/input/DurationInput.vue b/app/javascript/dashboard/components-next/input/DurationInput.vue
index 7a9fbc12d..b0597648a 100644
--- a/app/javascript/dashboard/components-next/input/DurationInput.vue
+++ b/app/javascript/dashboard/components-next/input/DurationInput.vue
@@ -32,6 +32,7 @@ const convertToMinutes = newValue => {
const transformedValue = computed({
get() {
+ if (duration.value == null) return null;
if (unit.value === DURATION_UNITS.MINUTES) return duration.value;
if (unit.value === DURATION_UNITS.HOURS)
return Math.floor(duration.value / 60);
@@ -41,6 +42,10 @@ const transformedValue = computed({
return 0;
},
set(newValue) {
+ if (newValue == null || newValue === '') {
+ duration.value = null;
+ return;
+ }
let minuteValue = convertToMinutes(newValue);
duration.value = Math.min(Math.max(minuteValue, props.min), props.max);
@@ -53,6 +58,7 @@ const transformedValue = computed({
// this might create some confusion, especially when saving
// this watcher fixes it by rounding the duration basically, to the nearest unit value
watch(unit, () => {
+ if (duration.value == null) return;
let adjustedValue = convertToMinutes(transformedValue.value);
duration.value = Math.min(Math.max(adjustedValue, props.min), props.max);
});
diff --git a/app/javascript/dashboard/routes/dashboard/settings/assignmentPolicy/pages/AgentCapacityEditPage.vue b/app/javascript/dashboard/routes/dashboard/settings/assignmentPolicy/pages/AgentCapacityEditPage.vue
index 390608733..31d0fa3e1 100644
--- a/app/javascript/dashboard/routes/dashboard/settings/assignmentPolicy/pages/AgentCapacityEditPage.vue
+++ b/app/javascript/dashboard/routes/dashboard/settings/assignmentPolicy/pages/AgentCapacityEditPage.vue
@@ -81,7 +81,7 @@ const formData = computed(() => ({
...(selectedPolicy.value?.exclusionRules?.excludedLabels || []),
],
excludeOlderThanHours:
- selectedPolicy.value?.exclusionRules?.excludeOlderThanHours || 10,
+ selectedPolicy.value?.exclusionRules?.excludeOlderThanHours ?? null,
},
inboxCapacityLimits:
selectedPolicy.value?.inboxCapacityLimits?.map(limit => ({
diff --git a/app/javascript/dashboard/routes/dashboard/settings/assignmentPolicy/pages/components/AgentCapacityPolicyForm.vue b/app/javascript/dashboard/routes/dashboard/settings/assignmentPolicy/pages/components/AgentCapacityPolicyForm.vue
index 24c4f0a38..ec82e0c16 100644
--- a/app/javascript/dashboard/routes/dashboard/settings/assignmentPolicy/pages/components/AgentCapacityPolicyForm.vue
+++ b/app/javascript/dashboard/routes/dashboard/settings/assignmentPolicy/pages/components/AgentCapacityPolicyForm.vue
@@ -17,7 +17,7 @@ const props = defineProps({
enabled: false,
exclusionRules: {
excludedLabels: [],
- excludeOlderThanHours: 10,
+ excludeOlderThanHours: null,
},
inboxCapacityLimits: [],
}),
@@ -84,7 +84,7 @@ const state = reactive({
description: '',
exclusionRules: {
excludedLabels: [],
- excludeOlderThanHours: 10,
+ excludeOlderThanHours: null,
},
inboxCapacityLimits: [],
});
@@ -120,7 +120,7 @@ const resetForm = () => {
description: '',
exclusionRules: {
excludedLabels: [],
- excludeOlderThanHours: 10,
+ excludeOlderThanHours: null,
},
inboxCapacityLimits: [],
});
diff --git a/enterprise/app/models/inbox_capacity_limit.rb b/enterprise/app/models/inbox_capacity_limit.rb
index 709dd809f..7ae74d427 100644
--- a/enterprise/app/models/inbox_capacity_limit.rb
+++ b/enterprise/app/models/inbox_capacity_limit.rb
@@ -19,6 +19,6 @@ class InboxCapacityLimit < ApplicationRecord
belongs_to :agent_capacity_policy
belongs_to :inbox
- validates :conversation_limit, presence: true, numericality: { greater_than: 0, only_integer: true }
+ validates :conversation_limit, presence: true, numericality: { greater_than_or_equal_to: 0, only_integer: true }
validates :inbox_id, uniqueness: { scope: :agent_capacity_policy_id }
end
diff --git a/spec/enterprise/models/inbox_capacity_limit_spec.rb b/spec/enterprise/models/inbox_capacity_limit_spec.rb
index 8c3f76dc4..64d9b08a0 100644
--- a/spec/enterprise/models/inbox_capacity_limit_spec.rb
+++ b/spec/enterprise/models/inbox_capacity_limit_spec.rb
@@ -9,10 +9,22 @@ RSpec.describe InboxCapacityLimit, type: :model do
subject { create(:inbox_capacity_limit, agent_capacity_policy: policy, inbox: inbox) }
it { is_expected.to validate_presence_of(:conversation_limit) }
- it { is_expected.to validate_numericality_of(:conversation_limit).is_greater_than(0).only_integer }
+ it { is_expected.to validate_numericality_of(:conversation_limit).is_greater_than_or_equal_to(0).only_integer }
it { is_expected.to validate_uniqueness_of(:inbox_id).scoped_to(:agent_capacity_policy_id) }
end
+ describe 'zero conversation limit (exclusion policy)' do
+ it 'allows conversation_limit of 0' do
+ limit = build(:inbox_capacity_limit, agent_capacity_policy: policy, inbox: inbox, conversation_limit: 0)
+ expect(limit).to be_valid
+ end
+
+ it 'rejects negative conversation_limit' do
+ limit = build(:inbox_capacity_limit, agent_capacity_policy: policy, inbox: inbox, conversation_limit: -1)
+ expect(limit).not_to be_valid
+ end
+ end
+
describe 'uniqueness constraint' do
it 'prevents duplicate inbox limits for the same policy' do
create(:inbox_capacity_limit, agent_capacity_policy: policy, inbox: inbox)
diff --git a/spec/enterprise/services/enterprise/auto_assignment/capacity_service_spec.rb b/spec/enterprise/services/enterprise/auto_assignment/capacity_service_spec.rb
index c34eaad64..f1a7cfe49 100644
--- a/spec/enterprise/services/enterprise/auto_assignment/capacity_service_spec.rb
+++ b/spec/enterprise/services/enterprise/auto_assignment/capacity_service_spec.rb
@@ -86,6 +86,55 @@ RSpec.describe Enterprise::AutoAssignment::CapacityService, type: :service do
end
end
+ describe 'exclusion policy (zero conversation limit)' do
+ let(:excluded_agent) { create(:user, account: account, role: :agent, availability: :online) }
+ let(:exclusion_policy) { create(:agent_capacity_policy, account: account, name: 'Exclusion Policy') }
+
+ before do
+ create(:inbox_capacity_limit,
+ agent_capacity_policy: exclusion_policy,
+ inbox: inbox,
+ conversation_limit: 0)
+
+ excluded_agent.account_users.find_by(account: account)
+ .update!(agent_capacity_policy: exclusion_policy)
+
+ create(:inbox_member, inbox: inbox, user: excluded_agent)
+
+ allow(OnlineStatusTracker).to receive(:get_available_users).and_return({
+ excluded_agent.id.to_s => 'online',
+ agent_with_capacity.id.to_s => 'online',
+ agent_without_capacity.id.to_s => 'online',
+ agent_at_capacity.id.to_s => 'online'
+ })
+ end
+
+ it 'always denies capacity for agents with zero limit' do
+ capacity_service = described_class.new
+ expect(capacity_service.agent_has_capacity?(excluded_agent, inbox)).to be false
+ end
+
+ it 'denies capacity even when agent has no existing conversations' do
+ capacity_service = described_class.new
+ # Agent has 0 open conversations but limit is 0, so 0 < 0 is false
+ expect(excluded_agent.assigned_conversations.where(inbox: inbox, status: :open).count).to eq(0)
+ expect(capacity_service.agent_has_capacity?(excluded_agent, inbox)).to be false
+ end
+
+ it 'excludes zero-limit agents from available agents list' do
+ capacity_service = described_class.new
+ online_agents = inbox.available_agents
+ filtered_agents = online_agents.select do |inbox_member|
+ capacity_service.agent_has_capacity?(inbox_member.user, inbox)
+ end
+ available_users = filtered_agents.map(&:user)
+
+ expect(available_users).not_to include(excluded_agent)
+ expect(available_users).to include(agent_with_capacity)
+ expect(available_users).to include(agent_without_capacity)
+ end
+ end
+
describe 'assignment with capacity' do
let(:service) { AutoAssignment::AssignmentService.new(inbox: inbox) }
From f4d66566d0c80a7ae19de51abae5afead666c6cb Mon Sep 17 00:00:00 2001
From: Muhsin Keloth
Date: Mon, 6 Apr 2026 11:14:09 +0400
Subject: [PATCH 20/53] fix(agent-bot): Include `changed_attributes` in
conversation_updated webhook (#14001)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The `conversation_updated` webhook sent to AgentBots did not include
`changed_attributes`, making it impossible for bots to distinguish
between different types of conversation updates (e.g. bot assignment vs
label change vs status change).
This aligns the AgentBot webhook payload with the existing
`WebhookListener` behavior, which already includes `changed_attributes`.
## How to reproduce
1. Assign an AgentBot to a conversation
2. Then update the conversation (e.g. add a label)
3. **Before fix:** Both events arrive with identical payload structure —
bot cannot tell them apart
4. **After fix:** Each event includes `changed_attributes` showing
exactly what changed
## What changed
- **`AgentBotListener#conversation_updated`**: Added
`changed_attributes` to the webhook payload using
`extract_changed_attributes` (same pattern as `WebhookListener`)
## How to test
1. Assign an AgentBot to a conversation via API
2. Check the webhook payload — should include:
```json
"changed_attributes": [
{ "assignee_agent_bot_id": { "previous_value": null, "current_value": 7
} }
]
```
3. Update the conversation (e.g. add a label)
4. Check the webhook payload — `changed_attributes` should reflect the
label change, not bot assignment
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Muhsin <12408980+muhsin-k@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context)
---
app/listeners/agent_bot_listener.rb | 3 ++-
spec/listeners/agent_bot_listener_spec.rb | 23 ++++++++++++++++++-----
2 files changed, 20 insertions(+), 6 deletions(-)
diff --git a/app/listeners/agent_bot_listener.rb b/app/listeners/agent_bot_listener.rb
index 8fdf964fb..08ee563af 100644
--- a/app/listeners/agent_bot_listener.rb
+++ b/app/listeners/agent_bot_listener.rb
@@ -17,9 +17,10 @@ class AgentBotListener < BaseListener
def conversation_updated(event)
conversation = extract_conversation_and_account(event)[0]
+ changed_attributes = extract_changed_attributes(event)
inbox = conversation.inbox
event_name = __method__.to_s
- payload = conversation.webhook_data.merge(event: event_name)
+ payload = conversation.webhook_data.merge(event: event_name, changed_attributes: changed_attributes)
agent_bots_for(inbox, conversation).each { |agent_bot| process_webhook_bot_event(agent_bot, payload) }
end
diff --git a/spec/listeners/agent_bot_listener_spec.rb b/spec/listeners/agent_bot_listener_spec.rb
index 24af37383..a9721f9c7 100644
--- a/spec/listeners/agent_bot_listener_spec.rb
+++ b/spec/listeners/agent_bot_listener_spec.rb
@@ -59,9 +59,10 @@ describe AgentBotListener do
describe '#conversation_updated' do
let(:event_name) { 'conversation.updated' }
- let!(:event) { Events::Base.new(event_name, Time.zone.now, conversation: conversation) }
context 'when agent bot is not configured' do
+ let!(:event) { Events::Base.new(event_name, Time.zone.now, conversation: conversation) }
+
it 'does not send webhook' do
expect(AgentBots::WebhookJob).not_to receive(:perform_later)
listener.conversation_updated(event)
@@ -69,22 +70,34 @@ describe AgentBotListener do
end
context 'when agent bot is configured on inbox' do
- it 'sends webhook to the inbox agent bot' do
+ let!(:event) { Events::Base.new(event_name, Time.zone.now, conversation: conversation) }
+
+ it 'sends webhook to the inbox agent bot with changed_attributes' do
create(:agent_bot_inbox, inbox: inbox, agent_bot: agent_bot)
expect(AgentBots::WebhookJob).to receive(:perform_later).with(agent_bot.outgoing_url,
- conversation.webhook_data.merge(event: 'conversation_updated')).once
+ conversation.webhook_data.merge(event: 'conversation_updated',
+ changed_attributes: nil)).once
listener.conversation_updated(event)
end
end
context 'when conversation is assigned to an agent bot' do
+ let!(:event) do
+ Events::Base.new(event_name, Time.zone.now, conversation: conversation,
+ changed_attributes: { 'assignee_agent_bot_id' => [nil, agent_bot.id] })
+ end
+
before do
conversation.update!(assignee_agent_bot: agent_bot, assignee: nil)
end
- it 'sends webhook to the assigned agent bot' do
+ it 'sends webhook with changed_attributes to the assigned agent bot' do
+ expected_changed_attributes = [{ 'assignee_agent_bot_id' => { previous_value: nil, current_value: agent_bot.id } }]
expect(AgentBots::WebhookJob).to receive(:perform_later).with(agent_bot.outgoing_url,
- conversation.webhook_data.merge(event: 'conversation_updated')).once
+ conversation.webhook_data.merge(
+ event: 'conversation_updated',
+ changed_attributes: expected_changed_attributes
+ )).once
listener.conversation_updated(event)
end
end
From 95463230cbc32833e0fcedcc7f82d0cc096c96a2 Mon Sep 17 00:00:00 2001
From: Shivam Mishra
Date: Mon, 6 Apr 2026 15:28:25 +0530
Subject: [PATCH 21/53] feat: sign webhooks for API channel and agentbots
(#13892)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Account webhooks sign outgoing payloads with HMAC-SHA256, but agent bot
and API inbox webhooks were delivered unsigned. This PR adds the same
signing to both.
Each model gets a dedicated `secret` column rather than reusing the
agent bot's `access_token` (for API auth back into Chatwoot) or the API
inbox's `hmac_token` (for inbound contact identity verification). These
serve different trust boundaries and shouldn't be coupled — rotating a
signing secret shouldn't invalidate API access or contact verification.
The existing `Webhooks::Trigger` already signs when a secret is present,
so the backend change is just passing `secret:` through to the jobs.
Shared token logic is extracted into a `WebhookSecretable` concern
included by `Webhook`, `AgentBot`, and `Channel::Api`. The frontend
reuses the existing `AccessToken` component for secret display. Secrets
are admin-only and excluded from enterprise audit logs.
### How to test
Point an agent bot or API inbox webhook URL at a request inspector. Send
a message and verify `X-Chatwoot-Signature` and `X-Chatwoot-Timestamp`
headers are present. Reset the secret from settings and confirm
subsequent deliveries use the new value.
---------
Co-authored-by: Sojan Jose
---
.../api/v1/accounts/agent_bots_controller.rb | 4 ++
.../api/v1/accounts/inboxes_controller.rb | 6 ++
app/javascript/dashboard/api/agentBots.js | 4 ++
app/javascript/dashboard/api/inboxes.js | 4 ++
.../dashboard/i18n/locale/en/agentBots.json | 10 +++
.../dashboard/i18n/locale/en/inboxMgmt.json | 8 +++
.../agentBots/components/AgentBotModal.vue | 67 +++++++++++++++++--
.../dashboard/settings/inbox/Settings.vue | 45 +++++++++++++
.../dashboard/store/modules/agentBots.js | 11 +++
.../dashboard/store/modules/inboxes.js | 10 +++
app/jobs/agent_bots/webhook_job.rb | 8 ++-
app/listeners/agent_bot_listener.rb | 3 +-
app/listeners/webhook_listener.rb | 2 +-
app/models/agent_bot.rb | 5 ++
app/models/channel/api.rb | 2 +
app/models/concerns/webhook_secretable.rb | 13 ++++
app/models/webhook.rb | 3 +-
app/policies/agent_bot_policy.rb | 4 ++
app/policies/inbox_policy.rb | 4 ++
.../agent_bots/reset_secret.json.jbuilder | 1 +
.../inboxes/reset_secret.json.jbuilder | 1 +
.../api/v1/models/_agent_bot.json.jbuilder | 1 +
app/views/api/v1/models/_inbox.json.jbuilder | 1 +
config/routes.rb | 2 +
...20260324070820_add_secret_to_agent_bots.rb | 5 ++
...0260324070828_add_secret_to_channel_api.rb | 5 ++
...kfill_agent_bot_and_channel_api_secrets.rb | 15 +++++
db/schema.rb | 2 +
.../app/models/enterprise/audit/agent_bot.rb | 7 ++
.../app/models/enterprise/channelable.rb | 2 +-
spec/listeners/agent_bot_listener_spec.rb | 40 +++++++----
spec/listeners/webhook_listener_spec.rb | 6 +-
32 files changed, 273 insertions(+), 28 deletions(-)
create mode 100644 app/models/concerns/webhook_secretable.rb
create mode 100644 app/views/api/v1/accounts/agent_bots/reset_secret.json.jbuilder
create mode 100644 app/views/api/v1/accounts/inboxes/reset_secret.json.jbuilder
create mode 100644 db/migrate/20260324070820_add_secret_to_agent_bots.rb
create mode 100644 db/migrate/20260324070828_add_secret_to_channel_api.rb
create mode 100644 db/migrate/20260324070835_backfill_agent_bot_and_channel_api_secrets.rb
create mode 100644 enterprise/app/models/enterprise/audit/agent_bot.rb
diff --git a/app/controllers/api/v1/accounts/agent_bots_controller.rb b/app/controllers/api/v1/accounts/agent_bots_controller.rb
index c2f919659..de3d10081 100644
--- a/app/controllers/api/v1/accounts/agent_bots_controller.rb
+++ b/app/controllers/api/v1/accounts/agent_bots_controller.rb
@@ -34,6 +34,10 @@ class Api::V1::Accounts::AgentBotsController < Api::V1::Accounts::BaseController
@agent_bot.reload
end
+ def reset_secret
+ @agent_bot.reset_secret!
+ end
+
private
def agent_bot
diff --git a/app/controllers/api/v1/accounts/inboxes_controller.rb b/app/controllers/api/v1/accounts/inboxes_controller.rb
index 4ca9a6af8..c7d3e2737 100644
--- a/app/controllers/api/v1/accounts/inboxes_controller.rb
+++ b/app/controllers/api/v1/accounts/inboxes_controller.rb
@@ -66,6 +66,12 @@ class Api::V1::Accounts::InboxesController < Api::V1::Accounts::BaseController
head :ok
end
+ def reset_secret
+ return head :not_found unless @inbox.api?
+
+ @inbox.channel.reset_secret!
+ end
+
def destroy
::DeleteObjectJob.perform_later(@inbox, Current.user, request.ip) if @inbox.present?
render status: :ok, json: { message: I18n.t('messages.inbox_deletetion_response') }
diff --git a/app/javascript/dashboard/api/agentBots.js b/app/javascript/dashboard/api/agentBots.js
index de887f415..a16b252de 100644
--- a/app/javascript/dashboard/api/agentBots.js
+++ b/app/javascript/dashboard/api/agentBots.js
@@ -25,6 +25,10 @@ class AgentBotsAPI extends ApiClient {
resetAccessToken(botId) {
return axios.post(`${this.url}/${botId}/reset_access_token`);
}
+
+ resetSecret(botId) {
+ return axios.post(`${this.url}/${botId}/reset_secret`);
+ }
}
export default new AgentBotsAPI();
diff --git a/app/javascript/dashboard/api/inboxes.js b/app/javascript/dashboard/api/inboxes.js
index 079f21815..cc564fe96 100644
--- a/app/javascript/dashboard/api/inboxes.js
+++ b/app/javascript/dashboard/api/inboxes.js
@@ -48,6 +48,10 @@ class Inboxes extends CacheEnabledApiClient {
template,
});
}
+
+ resetSecret(inboxId) {
+ return axios.post(`${this.url}/${inboxId}/reset_secret`);
+ }
}
export default new Inboxes();
diff --git a/app/javascript/dashboard/i18n/locale/en/agentBots.json b/app/javascript/dashboard/i18n/locale/en/agentBots.json
index dc92016ab..c17ec60d0 100644
--- a/app/javascript/dashboard/i18n/locale/en/agentBots.json
+++ b/app/javascript/dashboard/i18n/locale/en/agentBots.json
@@ -63,6 +63,16 @@
"ERROR_MESSAGE": "Could not update bot. Please try again."
}
},
+ "SECRET": {
+ "LABEL": "Webhook Secret",
+ "COPY": "Copy secret to clipboard",
+ "COPY_SUCCESS": "Secret copied to clipboard",
+ "TOGGLE": "Toggle secret visibility",
+ "CREATED_DESC": "Use the secret below to verify webhook signatures. Please copy it now, you can also find it later in the bot settings.",
+ "DONE": "Done",
+ "RESET_SUCCESS": "Webhook secret regenerated successfully",
+ "RESET_ERROR": "Unable to regenerate webhook secret. Please try again"
+ },
"ACCESS_TOKEN": {
"TITLE": "Access Token",
"DESCRIPTION": "Copy the access token and save it securely",
diff --git a/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json
index d0d1573b3..51f855689 100644
--- a/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json
@@ -86,6 +86,14 @@
"PLACEHOLDER": "Please enter your Webhook URL",
"ERROR": "Please enter a valid URL"
},
+ "CHANNEL_WEBHOOK_SECRET": {
+ "LABEL": "Webhook Secret",
+ "COPY": "Copy secret to clipboard",
+ "COPY_SUCCESS": "Secret copied to clipboard",
+ "TOGGLE": "Toggle secret visibility",
+ "RESET_SUCCESS": "Webhook secret regenerated successfully",
+ "RESET_ERROR": "Unable to regenerate webhook secret. Please try again"
+ },
"CHANNEL_DOMAIN": {
"LABEL": "Website Domain",
"PLACEHOLDER": "Enter your website domain (eg: acme.com)"
diff --git a/app/javascript/dashboard/routes/dashboard/settings/agentBots/components/AgentBotModal.vue b/app/javascript/dashboard/routes/dashboard/settings/agentBots/components/AgentBotModal.vue
index be4deb337..50baafc6a 100644
--- a/app/javascript/dashboard/routes/dashboard/settings/agentBots/components/AgentBotModal.vue
+++ b/app/javascript/dashboard/routes/dashboard/settings/agentBots/components/AgentBotModal.vue
@@ -47,6 +47,7 @@ const formState = reactive({
const [showAccessToken, toggleAccessToken] = useToggle();
const accessToken = ref('');
+const botSecret = ref('');
const v$ = useVuelidate(
{
@@ -179,15 +180,21 @@ const handleSubmit = async () => {
: t('AGENT_BOTS.EDIT.API.SUCCESS_MESSAGE');
useAlert(alertKey);
- // Show access token after creation
+ // Show access token and secret after creation
if (isCreate) {
- const { access_token: responseAccessToken, id } = response || {};
+ const {
+ access_token: responseAccessToken,
+ secret: responseSecret,
+ id,
+ } = response || {};
if (id && responseAccessToken) {
accessToken.value = responseAccessToken;
+ botSecret.value = responseSecret || '';
toggleAccessToken(true);
} else {
accessToken.value = '';
+ botSecret.value = '';
dialogRef.value.close();
}
} else {
@@ -212,14 +219,16 @@ const initializeForm = () => {
thumbnail,
bot_config: botConfig,
access_token: botAccessToken,
+ secret: botSecretValue,
} = props.selectedBot;
formState.botName = name || '';
formState.botDescription = description || '';
formState.botUrl = botUrl || botConfig?.webhook_url || '';
formState.botAvatarUrl = thumbnail || '';
- if (botAccessToken && props.type === MODAL_TYPES.EDIT) {
- accessToken.value = botAccessToken;
+ if (props.type === MODAL_TYPES.EDIT) {
+ if (botAccessToken) accessToken.value = botAccessToken;
+ if (botSecretValue) botSecret.value = botSecretValue;
}
} else {
resetForm();
@@ -231,6 +240,24 @@ const onCopyToken = async value => {
useAlert(t('AGENT_BOTS.ACCESS_TOKEN.COPY_SUCCESSFUL'));
};
+const onCopySecret = async value => {
+ await copyTextToClipboard(value || botSecret.value);
+ useAlert(t('AGENT_BOTS.SECRET.COPY_SUCCESS'));
+};
+
+const onResetSecret = async () => {
+ const response = await store.dispatch(
+ 'agentBots/resetSecret',
+ props.selectedBot.id
+ );
+ if (response) {
+ botSecret.value = response.secret;
+ useAlert(t('AGENT_BOTS.SECRET.RESET_SUCCESS'));
+ } else {
+ useAlert(t('AGENT_BOTS.SECRET.RESET_ERROR'));
+ }
+};
+
const onResetToken = async () => {
const response = await store.dispatch(
'agentBots/resetAccessToken',
@@ -247,6 +274,7 @@ const onResetToken = async () => {
const closeModal = () => {
if (!showAccessToken.value) v$.value?.$reset();
accessToken.value = '';
+ botSecret.value = '';
toggleAccessToken(false);
};
@@ -318,6 +346,20 @@ defineExpose({ dialogRef });
/>
+
+
+ {{ $t('AGENT_BOTS.SECRET.LABEL') }}
+
+
+
+
+
+
+ {{ $t('AGENT_BOTS.SECRET.CREATED_DESC') }}
+
+
+ {{ $t('AGENT_BOTS.SECRET.LABEL') }}
+
+
+
+
+
+
+
+
{
+ try {
+ const response = await AgentBotsAPI.resetSecret(botId);
+ commit(types.EDIT_AGENT_BOT, response.data);
+ return response.data;
+ } catch (error) {
+ throwErrorMessage(error);
+ return null;
+ }
+ },
};
export const mutations = {
diff --git a/app/javascript/dashboard/store/modules/inboxes.js b/app/javascript/dashboard/store/modules/inboxes.js
index 3f374dce2..ce24ef653 100644
--- a/app/javascript/dashboard/store/modules/inboxes.js
+++ b/app/javascript/dashboard/store/modules/inboxes.js
@@ -366,6 +366,16 @@ export const actions = {
);
return response.data;
},
+ resetSecret: async ({ commit }, inboxId) => {
+ try {
+ const response = await InboxesAPI.resetSecret(inboxId);
+ commit(types.default.EDIT_INBOXES, response.data);
+ return response.data;
+ } catch (error) {
+ throwErrorMessage(error);
+ return null;
+ }
+ },
};
export const mutations = {
diff --git a/app/jobs/agent_bots/webhook_job.rb b/app/jobs/agent_bots/webhook_job.rb
index d752034a7..4ba67c9bf 100644
--- a/app/jobs/agent_bots/webhook_job.rb
+++ b/app/jobs/agent_bots/webhook_job.rb
@@ -2,11 +2,13 @@ class AgentBots::WebhookJob < WebhookJob
queue_as :high
retry_on RestClient::TooManyRequests, RestClient::InternalServerError, wait: 3.seconds, attempts: 3 do |job, error|
url, payload, webhook_type = job.arguments
- Webhooks::Trigger.new(url, payload, webhook_type || :agent_bot_webhook).handle_failure(error)
+ kwargs = job.arguments.last.is_a?(Hash) ? job.arguments.last : {}
+ Webhooks::Trigger.new(url, payload, webhook_type || :agent_bot_webhook, secret: kwargs[:secret],
+ delivery_id: kwargs[:delivery_id]).handle_failure(error)
end
- def perform(url, payload, webhook_type = :agent_bot_webhook)
- super(url, payload, webhook_type)
+ def perform(url, payload, webhook_type = :agent_bot_webhook, secret: nil, delivery_id: nil)
+ super(url, payload, webhook_type, secret: secret, delivery_id: delivery_id)
rescue RestClient::TooManyRequests, RestClient::InternalServerError => e
Rails.logger.warn("[AgentBots::WebhookJob] attempt #{executions} failed #{e.class.name} payload=#{payload.to_json}")
raise
diff --git a/app/listeners/agent_bot_listener.rb b/app/listeners/agent_bot_listener.rb
index 08ee563af..1492f50ac 100644
--- a/app/listeners/agent_bot_listener.rb
+++ b/app/listeners/agent_bot_listener.rb
@@ -76,6 +76,7 @@ class AgentBotListener < BaseListener
def process_webhook_bot_event(agent_bot, payload)
return if agent_bot.outgoing_url.blank?
- AgentBots::WebhookJob.perform_later(agent_bot.outgoing_url, payload)
+ AgentBots::WebhookJob.perform_later(agent_bot.outgoing_url, payload, :agent_bot_webhook,
+ secret: agent_bot.secret, delivery_id: SecureRandom.uuid)
end
end
diff --git a/app/listeners/webhook_listener.rb b/app/listeners/webhook_listener.rb
index 762eaa6ee..835d03661 100644
--- a/app/listeners/webhook_listener.rb
+++ b/app/listeners/webhook_listener.rb
@@ -122,7 +122,7 @@ class WebhookListener < BaseListener
return if inbox.channel.webhook_url.blank?
WebhookJob.perform_later(inbox.channel.webhook_url, payload, :api_inbox_webhook,
- delivery_id: SecureRandom.uuid)
+ secret: inbox.channel.secret, delivery_id: SecureRandom.uuid)
end
def deliver_webhook_payloads(payload, inbox)
diff --git a/app/models/agent_bot.rb b/app/models/agent_bot.rb
index b839f21b4..63f71615d 100644
--- a/app/models/agent_bot.rb
+++ b/app/models/agent_bot.rb
@@ -8,6 +8,7 @@
# description :string
# name :string
# outgoing_url :string
+# secret :string
# created_at :datetime not null
# updated_at :datetime not null
# account_id :bigint
@@ -21,6 +22,8 @@ class AgentBot < ApplicationRecord
include AccessTokenable
include Avatarable
+ include WebhookSecretable
+
scope :accessible_to, lambda { |account|
account_id = account&.id
where(account_id: [nil, account_id])
@@ -63,3 +66,5 @@ class AgentBot < ApplicationRecord
account.nil?
end
end
+
+AgentBot.include_mod_with('Audit::AgentBot')
diff --git a/app/models/channel/api.rb b/app/models/channel/api.rb
index 17270e560..96d0eb8a5 100644
--- a/app/models/channel/api.rb
+++ b/app/models/channel/api.rb
@@ -7,6 +7,7 @@
# hmac_mandatory :boolean default(FALSE)
# hmac_token :string
# identifier :string
+# secret :string
# webhook_url :string
# created_at :datetime not null
# updated_at :datetime not null
@@ -26,6 +27,7 @@ class Channel::Api < ApplicationRecord
has_secure_token :identifier
has_secure_token :hmac_token
+ include WebhookSecretable
validate :ensure_valid_agent_reply_time_window
validates :webhook_url, length: { maximum: Limits::URL_LENGTH_LIMIT }
diff --git a/app/models/concerns/webhook_secretable.rb b/app/models/concerns/webhook_secretable.rb
new file mode 100644
index 000000000..b60c9b825
--- /dev/null
+++ b/app/models/concerns/webhook_secretable.rb
@@ -0,0 +1,13 @@
+module WebhookSecretable
+ extend ActiveSupport::Concern
+
+ included do
+ has_secure_token :secret
+ encrypts :secret if Chatwoot.encryption_configured?
+ end
+
+ def reset_secret!
+ regenerate_secret
+ reload
+ end
+end
diff --git a/app/models/webhook.rb b/app/models/webhook.rb
index 9586e1053..9ee62f11e 100644
--- a/app/models/webhook.rb
+++ b/app/models/webhook.rb
@@ -22,8 +22,7 @@ class Webhook < ApplicationRecord
belongs_to :account
belongs_to :inbox, optional: true
- has_secure_token :secret
- encrypts :secret if Chatwoot.encryption_configured?
+ include WebhookSecretable
validates :account_id, presence: true
validates :url, uniqueness: { scope: [:account_id] }, format: URI::DEFAULT_PARSER.make_regexp(%w[http https])
diff --git a/app/policies/agent_bot_policy.rb b/app/policies/agent_bot_policy.rb
index 7461f6b2d..516f8dee8 100644
--- a/app/policies/agent_bot_policy.rb
+++ b/app/policies/agent_bot_policy.rb
@@ -26,4 +26,8 @@ class AgentBotPolicy < ApplicationPolicy
def reset_access_token?
@account_user.administrator?
end
+
+ def reset_secret?
+ @account_user.administrator?
+ end
end
diff --git a/app/policies/inbox_policy.rb b/app/policies/inbox_policy.rb
index cace85e5e..d77b183ee 100644
--- a/app/policies/inbox_policy.rb
+++ b/app/policies/inbox_policy.rb
@@ -65,4 +65,8 @@ class InboxPolicy < ApplicationPolicy
def health?
@account_user.administrator?
end
+
+ def reset_secret?
+ @account_user.administrator?
+ end
end
diff --git a/app/views/api/v1/accounts/agent_bots/reset_secret.json.jbuilder b/app/views/api/v1/accounts/agent_bots/reset_secret.json.jbuilder
new file mode 100644
index 000000000..f647ac383
--- /dev/null
+++ b/app/views/api/v1/accounts/agent_bots/reset_secret.json.jbuilder
@@ -0,0 +1 @@
+json.partial! 'api/v1/models/agent_bot', formats: [:json], resource: AgentBotPresenter.new(@agent_bot)
diff --git a/app/views/api/v1/accounts/inboxes/reset_secret.json.jbuilder b/app/views/api/v1/accounts/inboxes/reset_secret.json.jbuilder
new file mode 100644
index 000000000..2ad94ff82
--- /dev/null
+++ b/app/views/api/v1/accounts/inboxes/reset_secret.json.jbuilder
@@ -0,0 +1 @@
+json.partial! 'api/v1/models/inbox', formats: [:json], resource: @inbox
diff --git a/app/views/api/v1/models/_agent_bot.json.jbuilder b/app/views/api/v1/models/_agent_bot.json.jbuilder
index 2547bb2a8..d5dbc91b4 100644
--- a/app/views/api/v1/models/_agent_bot.json.jbuilder
+++ b/app/views/api/v1/models/_agent_bot.json.jbuilder
@@ -7,4 +7,5 @@ json.bot_type resource.bot_type
json.bot_config resource.bot_config
json.account_id resource.account_id
json.access_token resource.access_token if resource.access_token.present?
+json.secret resource.secret if !resource.system_bot? && Current.account_user&.administrator?
json.system_bot resource.system_bot?
diff --git a/app/views/api/v1/models/_inbox.json.jbuilder b/app/views/api/v1/models/_inbox.json.jbuilder
index f0b5b1ea8..619e6a28c 100644
--- a/app/views/api/v1/models/_inbox.json.jbuilder
+++ b/app/views/api/v1/models/_inbox.json.jbuilder
@@ -113,6 +113,7 @@ end
## API Channel Attributes
if resource.api?
json.hmac_token resource.channel.try(:hmac_token) if Current.account_user&.administrator?
+ json.secret resource.channel.try(:secret) if Current.account_user&.administrator?
json.webhook_url resource.channel.try(:webhook_url)
json.inbox_identifier resource.channel.try(:identifier)
json.additional_attributes resource.channel.try(:additional_attributes)
diff --git a/config/routes.rb b/config/routes.rb
index 58c574efe..3e868d6d8 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -88,6 +88,7 @@ Rails.application.routes.draw do
resources :agent_bots, only: [:index, :create, :show, :update, :destroy] do
delete :avatar, on: :member
post :reset_access_token, on: :member
+ post :reset_secret, on: :member
end
resources :contact_inboxes, only: [] do
collection do
@@ -221,6 +222,7 @@ Rails.application.routes.draw do
post :sync_templates, on: :member
get :health, on: :member
post :register_webhook, on: :member
+ post :reset_secret, on: :member
if ChatwootApp.enterprise?
resource :conference, only: %i[create destroy], controller: 'conference' do
get :token, on: :member
diff --git a/db/migrate/20260324070820_add_secret_to_agent_bots.rb b/db/migrate/20260324070820_add_secret_to_agent_bots.rb
new file mode 100644
index 000000000..69e1bb314
--- /dev/null
+++ b/db/migrate/20260324070820_add_secret_to_agent_bots.rb
@@ -0,0 +1,5 @@
+class AddSecretToAgentBots < ActiveRecord::Migration[7.1]
+ def change
+ add_column :agent_bots, :secret, :string
+ end
+end
diff --git a/db/migrate/20260324070828_add_secret_to_channel_api.rb b/db/migrate/20260324070828_add_secret_to_channel_api.rb
new file mode 100644
index 000000000..217e4f1c8
--- /dev/null
+++ b/db/migrate/20260324070828_add_secret_to_channel_api.rb
@@ -0,0 +1,5 @@
+class AddSecretToChannelApi < ActiveRecord::Migration[7.1]
+ def change
+ add_column :channel_api, :secret, :string
+ end
+end
diff --git a/db/migrate/20260324070835_backfill_agent_bot_and_channel_api_secrets.rb b/db/migrate/20260324070835_backfill_agent_bot_and_channel_api_secrets.rb
new file mode 100644
index 000000000..ee89b8c02
--- /dev/null
+++ b/db/migrate/20260324070835_backfill_agent_bot_and_channel_api_secrets.rb
@@ -0,0 +1,15 @@
+class BackfillAgentBotAndChannelApiSecrets < ActiveRecord::Migration[7.1]
+ def up
+ AgentBot.where(secret: nil).find_each do |agent_bot|
+ agent_bot.update!(secret: SecureRandom.urlsafe_base64(24))
+ end
+
+ Channel::Api.where(secret: nil).find_each do |channel|
+ channel.update!(secret: SecureRandom.urlsafe_base64(24))
+ end
+ end
+
+ def down
+ # no-op: removing the columns in the previous migrations handles cleanup
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index c8af2be3e..d0993a55b 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -131,6 +131,7 @@ ActiveRecord::Schema[7.1].define(version: 2026_03_24_102005) do
t.bigint "account_id"
t.integer "bot_type", default: 0
t.jsonb "bot_config", default: {}
+ t.string "secret"
t.index ["account_id"], name: "index_agent_bots_on_account_id"
end
@@ -413,6 +414,7 @@ ActiveRecord::Schema[7.1].define(version: 2026_03_24_102005) do
t.string "hmac_token"
t.boolean "hmac_mandatory", default: false
t.jsonb "additional_attributes", default: {}
+ t.string "secret"
t.index ["hmac_token"], name: "index_channel_api_on_hmac_token", unique: true
t.index ["identifier"], name: "index_channel_api_on_identifier", unique: true
end
diff --git a/enterprise/app/models/enterprise/audit/agent_bot.rb b/enterprise/app/models/enterprise/audit/agent_bot.rb
new file mode 100644
index 000000000..255af7fa1
--- /dev/null
+++ b/enterprise/app/models/enterprise/audit/agent_bot.rb
@@ -0,0 +1,7 @@
+module Enterprise::Audit::AgentBot
+ extend ActiveSupport::Concern
+
+ included do
+ audited associated_with: :account, except: [:secret]
+ end
+end
diff --git a/enterprise/app/models/enterprise/channelable.rb b/enterprise/app/models/enterprise/channelable.rb
index 6fcae73d8..100f1024d 100644
--- a/enterprise/app/models/enterprise/channelable.rb
+++ b/enterprise/app/models/enterprise/channelable.rb
@@ -17,7 +17,7 @@ module Enterprise::Channelable
auditable_id = inbox.id
auditable_type = 'Inbox'
- audited_changes = saved_changes.except('updated_at')
+ audited_changes = saved_changes.except('updated_at', 'secret')
return if audited_changes.blank?
diff --git a/spec/listeners/agent_bot_listener_spec.rb b/spec/listeners/agent_bot_listener_spec.rb
index a9721f9c7..6ab4d3b84 100644
--- a/spec/listeners/agent_bot_listener_spec.rb
+++ b/spec/listeners/agent_bot_listener_spec.rb
@@ -25,8 +25,10 @@ describe AgentBotListener do
context 'when agent bot is configured' do
it 'sends message to agent bot' do
create(:agent_bot_inbox, inbox: inbox, agent_bot: agent_bot)
- expect(AgentBots::WebhookJob).to receive(:perform_later).with(agent_bot.outgoing_url,
- message.webhook_data.merge(event: 'message_created')).once
+ expect(AgentBots::WebhookJob).to receive(:perform_later).with(
+ agent_bot.outgoing_url, message.webhook_data.merge(event: 'message_created'),
+ :agent_bot_webhook, secret: agent_bot.secret, delivery_id: instance_of(String)
+ ).once
listener.message_created(event)
end
@@ -48,8 +50,14 @@ describe AgentBotListener do
it 'sends message to both bots exactly once' do
payload = message.webhook_data.merge(event: 'message_created')
- expect(AgentBots::WebhookJob).to receive(:perform_later).with(agent_bot.outgoing_url, payload).once
- expect(AgentBots::WebhookJob).to receive(:perform_later).with(conversation_bot.outgoing_url, payload).once
+ expect(AgentBots::WebhookJob).to receive(:perform_later).with(
+ agent_bot.outgoing_url, payload, :agent_bot_webhook,
+ secret: agent_bot.secret, delivery_id: instance_of(String)
+ ).once
+ expect(AgentBots::WebhookJob).to receive(:perform_later).with(
+ conversation_bot.outgoing_url, payload, :agent_bot_webhook,
+ secret: conversation_bot.secret, delivery_id: instance_of(String)
+ ).once
listener.message_created(event)
end
@@ -74,9 +82,11 @@ describe AgentBotListener do
it 'sends webhook to the inbox agent bot with changed_attributes' do
create(:agent_bot_inbox, inbox: inbox, agent_bot: agent_bot)
- expect(AgentBots::WebhookJob).to receive(:perform_later).with(agent_bot.outgoing_url,
- conversation.webhook_data.merge(event: 'conversation_updated',
- changed_attributes: nil)).once
+ expect(AgentBots::WebhookJob).to receive(:perform_later).with(
+ agent_bot.outgoing_url,
+ conversation.webhook_data.merge(event: 'conversation_updated', changed_attributes: nil),
+ :agent_bot_webhook, secret: agent_bot.secret, delivery_id: instance_of(String)
+ ).once
listener.conversation_updated(event)
end
end
@@ -93,11 +103,14 @@ describe AgentBotListener do
it 'sends webhook with changed_attributes to the assigned agent bot' do
expected_changed_attributes = [{ 'assignee_agent_bot_id' => { previous_value: nil, current_value: agent_bot.id } }]
- expect(AgentBots::WebhookJob).to receive(:perform_later).with(agent_bot.outgoing_url,
- conversation.webhook_data.merge(
- event: 'conversation_updated',
- changed_attributes: expected_changed_attributes
- )).once
+ expect(AgentBots::WebhookJob).to receive(:perform_later).with(
+ agent_bot.outgoing_url,
+ conversation.webhook_data.merge(
+ event: 'conversation_updated',
+ changed_attributes: expected_changed_attributes
+ ),
+ :agent_bot_webhook, secret: agent_bot.secret, delivery_id: instance_of(String)
+ ).once
listener.conversation_updated(event)
end
end
@@ -121,7 +134,8 @@ describe AgentBotListener do
expect(AgentBots::WebhookJob).to receive(:perform_later)
.with(
agent_bot.outgoing_url,
- conversation.contact_inbox.webhook_data.merge(event: 'webwidget_triggered', event_info: { country: 'US' })
+ conversation.contact_inbox.webhook_data.merge(event: 'webwidget_triggered', event_info: { country: 'US' }),
+ :agent_bot_webhook, secret: agent_bot.secret, delivery_id: instance_of(String)
).once
listener.webwidget_triggered(event)
diff --git a/spec/listeners/webhook_listener_spec.rb b/spec/listeners/webhook_listener_spec.rb
index 51dae239b..a7a64f175 100644
--- a/spec/listeners/webhook_listener_spec.rb
+++ b/spec/listeners/webhook_listener_spec.rb
@@ -59,7 +59,7 @@ describe WebhookListener do
api_event = Events::Base.new(event_name, Time.zone.now, message: api_message)
expect(WebhookJob).to receive(:perform_later).with(
channel_api.webhook_url, api_message.webhook_data.merge(event: 'message_created'),
- :api_inbox_webhook, delivery_id: instance_of(String)
+ :api_inbox_webhook, secret: channel_api.secret, delivery_id: instance_of(String)
).once
listener.message_created(api_event)
end
@@ -112,7 +112,7 @@ describe WebhookListener do
expect(WebhookJob).to receive(:perform_later).with(
channel_api.webhook_url,
api_conversation.webhook_data.merge(event: 'conversation_created'),
- :api_inbox_webhook, delivery_id: instance_of(String)
+ :api_inbox_webhook, secret: channel_api.secret, delivery_id: instance_of(String)
).once
listener.conversation_created(api_event)
end
@@ -348,7 +348,7 @@ describe WebhookListener do
expect(WebhookJob).to receive(:perform_later).with(
channel_api.webhook_url, payload, :api_inbox_webhook,
- delivery_id: instance_of(String)
+ secret: channel_api.secret, delivery_id: instance_of(String)
).once
listener.conversation_typing_on(api_event)
end
From 50d6ebaaca9c23803877bf8e4affe7d419edc55b Mon Sep 17 00:00:00 2001
From: Muhsin Keloth
Date: Mon, 6 Apr 2026 14:05:50 +0400
Subject: [PATCH 22/53] fix(agent-bot): Dispatch `conversation_status_changed`
event to agent bots (#14002)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Agent bots assigned to a conversation were not receiving
`conversation_status_changed` webhook events. This meant bots could not
react to status transitions like moving a conversation to **pending**.
The deprecated `conversation_opened` and `conversation_resolved` events
were still being delivered, but the newer unified
`conversation_status_changed` event was silently dropped because
`AgentBotListener` had no handler for it.
## What changed
- Added `conversation_status_changed` handler to `AgentBotListener`,
matching the pattern already used by `WebhookListener`. The payload
includes `changed_attributes` so bots know which status transition
occurred.
## How to test
1. Configure an agent bot with an `outgoing_url` (e.g. a webhook.site
endpoint).
2. Assign the bot to an inbox or conversation.
3. Change a conversation's status to **pending** (or any other status).
4. Verify the bot receives a `conversation_status_changed` event with
the correct `changed_attributes`.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Muhsin <12408980+muhsin-k@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context)
---
app/listeners/agent_bot_listener.rb | 9 ++++++
spec/listeners/agent_bot_listener_spec.rb | 38 +++++++++++++++++++++++
2 files changed, 47 insertions(+)
diff --git a/app/listeners/agent_bot_listener.rb b/app/listeners/agent_bot_listener.rb
index 1492f50ac..1dc600013 100644
--- a/app/listeners/agent_bot_listener.rb
+++ b/app/listeners/agent_bot_listener.rb
@@ -15,6 +15,15 @@ class AgentBotListener < BaseListener
agent_bots_for(inbox, conversation).each { |agent_bot| process_webhook_bot_event(agent_bot, payload) }
end
+ def conversation_status_changed(event)
+ conversation = extract_conversation_and_account(event)[0]
+ changed_attributes = extract_changed_attributes(event)
+ inbox = conversation.inbox
+ event_name = __method__.to_s
+ payload = conversation.webhook_data.merge(event: event_name, changed_attributes: changed_attributes)
+ agent_bots_for(inbox, conversation).each { |agent_bot| process_webhook_bot_event(agent_bot, payload) }
+ end
+
def conversation_updated(event)
conversation = extract_conversation_and_account(event)[0]
changed_attributes = extract_changed_attributes(event)
diff --git a/spec/listeners/agent_bot_listener_spec.rb b/spec/listeners/agent_bot_listener_spec.rb
index 6ab4d3b84..c74ca450c 100644
--- a/spec/listeners/agent_bot_listener_spec.rb
+++ b/spec/listeners/agent_bot_listener_spec.rb
@@ -65,6 +65,44 @@ describe AgentBotListener do
end
end
+ describe '#conversation_status_changed' do
+ let(:event_name) { 'conversation.status_changed' }
+ let(:changed_attributes) { { status: %w[open pending] } }
+ let!(:event) { Events::Base.new(event_name, Time.zone.now, conversation: conversation, changed_attributes: changed_attributes) }
+
+ context 'when agent bot is not configured' do
+ it 'does not send webhook' do
+ expect(AgentBots::WebhookJob).not_to receive(:perform_later)
+ listener.conversation_status_changed(event)
+ end
+ end
+
+ context 'when agent bot is configured on inbox' do
+ it 'sends webhook with changed_attributes' do
+ create(:agent_bot_inbox, inbox: inbox, agent_bot: agent_bot)
+ expect(AgentBots::WebhookJob).to receive(:perform_later).with(
+ agent_bot.outgoing_url,
+ hash_including(event: 'conversation_status_changed', changed_attributes: anything)
+ ).once
+ listener.conversation_status_changed(event)
+ end
+ end
+
+ context 'when conversation is assigned to an agent bot' do
+ before do
+ conversation.update!(assignee_agent_bot: agent_bot, assignee: nil)
+ end
+
+ it 'sends webhook to the assigned agent bot' do
+ expect(AgentBots::WebhookJob).to receive(:perform_later).with(
+ agent_bot.outgoing_url,
+ hash_including(event: 'conversation_status_changed', changed_attributes: anything)
+ ).once
+ listener.conversation_status_changed(event)
+ end
+ end
+ end
+
describe '#conversation_updated' do
let(:event_name) { 'conversation.updated' }
From 8c0c0fd32c82cb347ed7d391d03a94651831a0e9 Mon Sep 17 00:00:00 2001
From: Captain <92152627+chatwoot-bot@users.noreply.github.com>
Date: Mon, 6 Apr 2026 15:35:59 +0530
Subject: [PATCH 23/53] chore: Update translations (#13990)
Co-authored-by: Sojan Jose
Co-authored-by: Sojan Jose
---
.../i18n/locale/am/conversation.json | 84 +-
.../dashboard/i18n/locale/am/helpCenter.json | 22 +
.../dashboard/i18n/locale/am/inboxMgmt.json | 62 +-
.../i18n/locale/am/integrations.json | 21 +-
.../dashboard/i18n/locale/am/report.json | 80 +-
.../dashboard/i18n/locale/ar/helpCenter.json | 22 +
.../dashboard/i18n/locale/ar/inboxMgmt.json | 2 +-
.../i18n/locale/ar/integrations.json | 89 +-
.../dashboard/i18n/locale/az/helpCenter.json | 22 +
.../i18n/locale/az/integrations.json | 653 ++++++-----
.../i18n/locale/bg/conversation.json | 4 +-
.../dashboard/i18n/locale/bg/helpCenter.json | 22 +
.../i18n/locale/bg/integrations.json | 89 +-
.../dashboard/i18n/locale/bn/helpCenter.json | 22 +
.../i18n/locale/bn/integrations.json | 21 +-
.../i18n/locale/ca/conversation.json | 4 +-
.../dashboard/i18n/locale/ca/helpCenter.json | 22 +
.../i18n/locale/ca/integrations.json | 89 +-
.../i18n/locale/cs/conversation.json | 4 +-
.../dashboard/i18n/locale/cs/helpCenter.json | 22 +
.../i18n/locale/cs/integrations.json | 89 +-
.../i18n/locale/da/conversation.json | 4 +-
.../dashboard/i18n/locale/da/helpCenter.json | 22 +
.../i18n/locale/da/integrations.json | 89 +-
.../i18n/locale/de/conversation.json | 4 +-
.../dashboard/i18n/locale/de/helpCenter.json | 22 +
.../i18n/locale/de/integrations.json | 73 +-
.../i18n/locale/el/conversation.json | 4 +-
.../dashboard/i18n/locale/el/helpCenter.json | 22 +
.../i18n/locale/el/integrations.json | 89 +-
.../i18n/locale/es/conversation.json | 4 +-
.../dashboard/i18n/locale/es/helpCenter.json | 22 +
.../i18n/locale/es/integrations.json | 89 +-
.../dashboard/i18n/locale/et/contact.json | 48 +-
.../i18n/locale/et/conversation.json | 2 +-
.../dashboard/i18n/locale/et/helpCenter.json | 22 +
.../dashboard/i18n/locale/et/inboxMgmt.json | 180 +--
.../i18n/locale/et/integrations.json | 31 +-
.../i18n/locale/fa/conversation.json | 4 +-
.../dashboard/i18n/locale/fa/helpCenter.json | 22 +
.../i18n/locale/fa/integrations.json | 89 +-
.../i18n/locale/fi/conversation.json | 4 +-
.../dashboard/i18n/locale/fi/helpCenter.json | 22 +
.../i18n/locale/fi/integrations.json | 89 +-
.../i18n/locale/fr/conversation.json | 4 +-
.../dashboard/i18n/locale/fr/helpCenter.json | 22 +
.../i18n/locale/fr/integrations.json | 69 +-
.../i18n/locale/he/conversation.json | 4 +-
.../dashboard/i18n/locale/he/helpCenter.json | 22 +
.../i18n/locale/he/integrations.json | 27 +-
.../i18n/locale/hi/conversation.json | 4 +-
.../dashboard/i18n/locale/hi/helpCenter.json | 22 +
.../i18n/locale/hi/integrations.json | 89 +-
.../i18n/locale/hr/conversation.json | 4 +-
.../dashboard/i18n/locale/hr/helpCenter.json | 22 +
.../i18n/locale/hr/integrations.json | 89 +-
.../i18n/locale/hu/conversation.json | 4 +-
.../dashboard/i18n/locale/hu/helpCenter.json | 22 +
.../i18n/locale/hu/integrations.json | 89 +-
.../i18n/locale/hy/conversation.json | 204 ++--
.../dashboard/i18n/locale/hy/helpCenter.json | 22 +
.../i18n/locale/hy/integrations.json | 29 +-
.../i18n/locale/id/conversation.json | 4 +-
.../dashboard/i18n/locale/id/helpCenter.json | 22 +
.../i18n/locale/id/integrations.json | 89 +-
.../i18n/locale/is/conversation.json | 4 +-
.../dashboard/i18n/locale/is/helpCenter.json | 22 +
.../i18n/locale/is/integrations.json | 89 +-
.../dashboard/i18n/locale/it/helpCenter.json | 22 +
.../i18n/locale/it/integrations.json | 27 +-
.../i18n/locale/ja/conversation.json | 4 +-
.../dashboard/i18n/locale/ja/helpCenter.json | 22 +
.../i18n/locale/ja/integrations.json | 67 +-
.../dashboard/i18n/locale/ka/contact.json | 112 +-
.../i18n/locale/ka/conversation.json | 4 +-
.../dashboard/i18n/locale/ka/helpCenter.json | 22 +
.../i18n/locale/ka/integrations.json | 27 +-
.../dashboard/i18n/locale/ka/report.json | 136 +--
.../dashboard/i18n/locale/ka/settings.json | 158 +--
.../dashboard/i18n/locale/ko/helpCenter.json | 22 +
.../i18n/locale/ko/integrations.json | 21 +-
.../i18n/locale/lt/conversation.json | 4 +-
.../dashboard/i18n/locale/lt/helpCenter.json | 22 +
.../i18n/locale/lt/integrations.json | 89 +-
.../i18n/locale/lv/conversation.json | 4 +-
.../dashboard/i18n/locale/lv/helpCenter.json | 22 +
.../i18n/locale/lv/integrations.json | 65 +-
.../i18n/locale/ml/conversation.json | 4 +-
.../dashboard/i18n/locale/ml/helpCenter.json | 22 +
.../i18n/locale/ml/integrations.json | 21 +-
.../dashboard/i18n/locale/ml/settings.json | 8 +-
.../i18n/locale/ms/conversation.json | 546 ++++-----
.../dashboard/i18n/locale/ms/helpCenter.json | 908 +++++++-------
.../i18n/locale/ms/integrations.json | 261 +++--
.../dashboard/i18n/locale/ms/labelsMgmt.json | 84 +-
.../dashboard/i18n/locale/ms/settings.json | 1040 ++++++++---------
.../dashboard/i18n/locale/ne/agentMgmt.json | 6 +-
.../dashboard/i18n/locale/ne/contact.json | 428 +++----
.../dashboard/i18n/locale/ne/helpCenter.json | 22 +
.../i18n/locale/ne/integrations.json | 45 +-
.../i18n/locale/nl/conversation.json | 4 +-
.../dashboard/i18n/locale/nl/helpCenter.json | 22 +
.../i18n/locale/nl/integrations.json | 89 +-
.../i18n/locale/no/conversation.json | 4 +-
.../dashboard/i18n/locale/no/helpCenter.json | 22 +
.../i18n/locale/no/integrations.json | 89 +-
.../i18n/locale/pl/conversation.json | 4 +-
.../dashboard/i18n/locale/pl/helpCenter.json | 22 +
.../i18n/locale/pl/integrations.json | 89 +-
.../i18n/locale/pt/conversation.json | 4 +-
.../dashboard/i18n/locale/pt/helpCenter.json | 22 +
.../i18n/locale/pt/integrations.json | 57 +-
.../i18n/locale/pt_BR/auditLogs.json | 2 +-
.../dashboard/i18n/locale/pt_BR/chatlist.json | 2 +-
.../i18n/locale/pt_BR/helpCenter.json | 22 +
.../i18n/locale/pt_BR/integrations.json | 27 +-
.../i18n/locale/ro/conversation.json | 4 +-
.../dashboard/i18n/locale/ro/helpCenter.json | 22 +
.../i18n/locale/ro/integrations.json | 89 +-
.../dashboard/i18n/locale/ru/helpCenter.json | 22 +
.../i18n/locale/ru/integrations.json | 31 +-
.../dashboard/i18n/locale/sh/contact.json | 6 +-
.../i18n/locale/sh/conversation.json | 4 +-
.../dashboard/i18n/locale/sh/helpCenter.json | 744 ++++++------
.../dashboard/i18n/locale/sh/inboxMgmt.json | 4 +-
.../i18n/locale/sh/integrations.json | 41 +-
.../dashboard/i18n/locale/sh/settings.json | 2 +-
.../i18n/locale/sk/conversation.json | 4 +-
.../dashboard/i18n/locale/sk/helpCenter.json | 22 +
.../i18n/locale/sk/integrations.json | 89 +-
.../dashboard/i18n/locale/sl/contact.json | 6 +-
.../i18n/locale/sl/conversation.json | 4 +-
.../dashboard/i18n/locale/sl/helpCenter.json | 22 +
.../i18n/locale/sl/integrations.json | 85 +-
.../dashboard/i18n/locale/sl/report.json | 24 +-
.../dashboard/i18n/locale/sl/settings.json | 20 +-
.../i18n/locale/sq/conversation.json | 4 +-
.../dashboard/i18n/locale/sq/helpCenter.json | 22 +
.../i18n/locale/sq/integrations.json | 23 +-
.../i18n/locale/sr/conversation.json | 4 +-
.../dashboard/i18n/locale/sr/helpCenter.json | 22 +
.../i18n/locale/sr/integrations.json | 89 +-
.../i18n/locale/sv/conversation.json | 4 +-
.../dashboard/i18n/locale/sv/helpCenter.json | 22 +
.../i18n/locale/sv/integrations.json | 89 +-
.../i18n/locale/ta/conversation.json | 4 +-
.../dashboard/i18n/locale/ta/helpCenter.json | 22 +
.../i18n/locale/ta/integrations.json | 39 +-
.../i18n/locale/th/conversation.json | 4 +-
.../dashboard/i18n/locale/th/helpCenter.json | 22 +
.../i18n/locale/th/integrations.json | 89 +-
.../dashboard/i18n/locale/tl/agentMgmt.json | 6 +-
.../dashboard/i18n/locale/tl/contact.json | 6 +-
.../i18n/locale/tl/conversation.json | 22 +-
.../dashboard/i18n/locale/tl/helpCenter.json | 22 +
.../i18n/locale/tl/integrations.json | 29 +-
.../dashboard/i18n/locale/tl/report.json | 396 +++----
.../dashboard/i18n/locale/tr/automation.json | 10 +-
.../i18n/locale/tr/conversation.json | 4 +-
.../dashboard/i18n/locale/tr/helpCenter.json | 22 +
.../dashboard/i18n/locale/tr/inboxMgmt.json | 16 +-
.../i18n/locale/tr/integrations.json | 45 +-
.../dashboard/i18n/locale/tr/settings.json | 18 +-
.../i18n/locale/uk/conversation.json | 4 +-
.../dashboard/i18n/locale/uk/helpCenter.json | 22 +
.../i18n/locale/uk/integrations.json | 87 +-
.../i18n/locale/ur/conversation.json | 4 +-
.../dashboard/i18n/locale/ur/helpCenter.json | 22 +
.../i18n/locale/ur/integrations.json | 89 +-
.../i18n/locale/ur_IN/conversation.json | 4 +-
.../i18n/locale/ur_IN/helpCenter.json | 22 +
.../i18n/locale/ur_IN/integrations.json | 31 +-
.../i18n/locale/vi/conversation.json | 4 +-
.../dashboard/i18n/locale/vi/helpCenter.json | 22 +
.../i18n/locale/vi/integrations.json | 89 +-
.../i18n/locale/zh_CN/conversation.json | 4 +-
.../i18n/locale/zh_CN/helpCenter.json | 22 +
.../i18n/locale/zh_CN/integrations.json | 29 +-
.../i18n/locale/zh_TW/conversation.json | 4 +-
.../i18n/locale/zh_TW/helpCenter.json | 22 +
.../i18n/locale/zh_TW/integrations.json | 89 +-
app/javascript/widget/i18n/locale/it.json | 6 +-
config/locales/am.yml | 19 +-
config/locales/ar.yml | 19 +-
config/locales/az.yml | 19 +-
config/locales/bg.yml | 19 +-
config/locales/bn.yml | 5 +
config/locales/ca.yml | 19 +-
config/locales/cs.yml | 19 +-
config/locales/da.yml | 19 +-
config/locales/de.yml | 19 +-
config/locales/el.yml | 19 +-
config/locales/es.yml | 19 +-
config/locales/et.yml | 19 +-
config/locales/fa.yml | 19 +-
config/locales/fi.yml | 19 +-
config/locales/fr.yml | 19 +-
config/locales/he.yml | 11 +-
config/locales/hi.yml | 19 +-
config/locales/hr.yml | 19 +-
config/locales/hu.yml | 19 +-
config/locales/hy.yml | 201 ++--
config/locales/id.yml | 19 +-
config/locales/is.yml | 19 +-
config/locales/it.yml | 7 +-
config/locales/ja.yml | 19 +-
config/locales/ka.yml | 19 +-
config/locales/ko.yml | 5 +
config/locales/lt.yml | 19 +-
config/locales/lv.yml | 19 +-
config/locales/ml.yml | 19 +-
config/locales/ms.yml | 19 +-
config/locales/ne.yml | 9 +-
config/locales/nl.yml | 19 +-
config/locales/no.yml | 19 +-
config/locales/pl.yml | 19 +-
config/locales/pt.yml | 11 +-
config/locales/pt_BR.yml | 7 +-
config/locales/ro.yml | 19 +-
config/locales/ru.yml | 5 +
config/locales/sh.yml | 19 +-
config/locales/sk.yml | 19 +-
config/locales/sl.yml | 19 +-
config/locales/sq.yml | 11 +-
config/locales/sr.yml | 19 +-
config/locales/sv.yml | 19 +-
config/locales/ta.yml | 19 +-
config/locales/th.yml | 19 +-
config/locales/tl.yml | 463 ++++----
config/locales/tr.yml | 13 +-
config/locales/uk.yml | 19 +-
config/locales/ur.yml | 19 +-
config/locales/ur_IN.yml | 19 +-
config/locales/vi.yml | 19 +-
config/locales/zh_CN.yml | 11 +-
config/locales/zh_TW.yml | 19 +-
236 files changed, 7502 insertions(+), 5018 deletions(-)
diff --git a/app/javascript/dashboard/i18n/locale/am/conversation.json b/app/javascript/dashboard/i18n/locale/am/conversation.json
index 5e417a884..c059090d1 100644
--- a/app/javascript/dashboard/i18n/locale/am/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/am/conversation.json
@@ -6,12 +6,12 @@
"SWITCH_VIEW_LAYOUT": "Switch the layout",
"DASHBOARD_APP_TAB_MESSAGES": "Messages",
"UNVERIFIED_SESSION": "The identity of this user is not verified",
- "NO_MESSAGE_1": "Uh oh! Looks like there are no messages from customers in your inbox.",
- "NO_MESSAGE_2": " to send a message to your page!",
- "NO_INBOX_1": "Hola! Looks like you haven't added any inboxes yet.",
- "NO_INBOX_2": " to get started",
- "NO_INBOX_AGENT": "Uh Oh! Looks like you are not part of any inbox. Please contact your administrator",
- "SEARCH_MESSAGES": "Search for messages in conversations",
+ "NO_MESSAGE_1": "የደንበኞች መልእክቶች በኢንቦክስዎ አልተገኙም።",
+ "NO_MESSAGE_2": " ወደ ገፅዎ መልእክት ለመላክ!",
+ "NO_INBOX_1": "እሺ! አሁን ምንም ኢንቦክስ አልጨመሩም።",
+ "NO_INBOX_2": " ለመጀመር",
+ "NO_INBOX_AGENT": "ወይ! ምንም ኢንቦክስ አባል አይደለህም። እባክዎ አስተዳዳሪዎን ያነጋግሩ",
+ "SEARCH_MESSAGES": "መልእክቶችን በውይይቶች ውስጥ ይፈልጉ",
"VIEW_ORIGINAL": "View original",
"VIEW_TRANSLATED": "View translated",
"EMPTY_STATE": {
@@ -19,19 +19,19 @@
"KEYBOARD_SHORTCUTS": "to view keyboard shortcuts"
},
"SEARCH": {
- "TITLE": "Search messages",
+ "TITLE": "መልእክቶችን ይፈልጉ",
"RESULT_TITLE": "Search Results",
- "LOADING_MESSAGE": "Crunching data...",
+ "LOADING_MESSAGE": "መረጃ በማስተናገድ ላይ...",
"PLACEHOLDER": "Type any text to search messages",
"NO_MATCHING_RESULTS": "No results found."
},
"UNREAD_MESSAGES": "Unread Messages",
"UNREAD_MESSAGE": "Unread Message",
- "CLICK_HERE": "Click here",
- "LOADING_INBOXES": "Loading inboxes",
- "LOADING_CONVERSATIONS": "Loading Conversations",
- "CANNOT_REPLY": "You cannot reply due to",
- "24_HOURS_WINDOW": "24 hour message window restriction",
+ "CLICK_HERE": "እዚህ ጠቅ ያድርጉ",
+ "LOADING_INBOXES": "ኢንቦክሶች በመጫን ላይ",
+ "LOADING_CONVERSATIONS": "ውይይቶች በመጫን ላይ",
+ "CANNOT_REPLY": "ምክንያቱን በመነሳት መልስ ማድረግ አይችሉም",
+ "24_HOURS_WINDOW": "የ24 ሰዓት መልእክት ጊዜ ገደብ",
"48_HOURS_WINDOW": "48 hour message window restriction",
"API_HOURS_WINDOW": "ለዚህ ውይይት መመለስ በ{hours} ሰአታት ውስጥ ብቻ ይቻላል",
"NOT_ASSIGNED_TO_YOU": "This conversation is not assigned to you. Would you like to assign this conversation to yourself?",
@@ -44,9 +44,9 @@
"TWILIO_WHATSAPP_CAN_REPLY": "You can only reply to this conversation using a template message due to",
"TWILIO_WHATSAPP_24_HOURS_WINDOW": "24 hour message window restriction",
"OLD_INSTAGRAM_INBOX_REPLY_BANNER": "ይህ የInstagram መለያ ወደ አዲሱ የInstagram ቻናል ገቢ ሳጥን ተዛውሯል። ሁሉም አዲስ መልዕክቶች በዚያ ይታያሉ። ከአሁን ጀምሮ ከዚህ ውይይት መልዕክቶች መላክ አትችሉም።",
- "REPLYING_TO": "You are replying to:",
- "REMOVE_SELECTION": "Remove Selection",
- "DOWNLOAD": "Download",
+ "REPLYING_TO": "ለዚህ ትመልሳለህ፦",
+ "REMOVE_SELECTION": "ምርጫ አስወግድ",
+ "DOWNLOAD": "አውርድ",
"UNKNOWN_FILE_TYPE": "Unknown File",
"SAVE_CONTACT": "Save Contact",
"NO_CONTENT": "No content to display",
@@ -85,13 +85,13 @@
"YOU_ANSWERED": "You answered"
},
"HEADER": {
- "RESOLVE_ACTION": "Resolve",
- "REOPEN_ACTION": "Reopen",
+ "RESOLVE_ACTION": "ተፈትኗል",
+ "REOPEN_ACTION": "እንደገና ክፈት",
"OPEN_ACTION": "Open",
"MORE_ACTIONS": "ተጨማሪ እርምጃዎች",
- "OPEN": "More",
- "CLOSE": "Close",
- "DETAILS": "details",
+ "OPEN": "ተጨማሪ",
+ "CLOSE": "ዝጋ",
+ "DETAILS": "ዝርዝሮች",
"SNOOZED_UNTIL": "Snoozed until",
"SNOOZED_UNTIL_TOMORROW": "Snoozed until tomorrow",
"SNOOZED_UNTIL_NEXT_WEEK": "Snoozed until next week",
@@ -188,21 +188,21 @@
"MESSAGE_SIGN_TOOLTIP": "Message signature",
"ENABLE_SIGN_TOOLTIP": "Enable signature",
"DISABLE_SIGN_TOOLTIP": "Disable signature",
- "MSG_INPUT": "Shift + enter for new line. Start with '/' to select a Canned Response.",
- "PRIVATE_MSG_INPUT": "Shift + enter for new line. This will be visible only to Agents",
+ "MSG_INPUT": "አዲስ መስመር ለማስገባት Shift + enter ይጠቀሙ። '/' በመጀመር የተዘጋጀ ምላሽ ይምረጡ።",
+ "PRIVATE_MSG_INPUT": "አዲስ መስመር ለማስገባት Shift + enter ይጠቀሙ። ይህ ለወኪሎች ብቻ ይታያል",
"MESSAGING_RESTRICTED": "You cannot reply to this conversation",
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Message signature is not configured, please configure it in profile settings.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "ኮፒሎት ተጨማሪ እባብነቶች ስጡው, ወይም ሌላ ማንኛውንም ጥያቄ ያቀርቡ... ተከትሎ ለማስተላለፊያ ኤንተር ይጫኑ።",
"CLICK_HERE": "Click here to update",
"WHATSAPP_TEMPLATES": "Whatsapp Templates"
},
"REPLYBOX": {
- "REPLY": "Reply",
- "PRIVATE_NOTE": "Private Note",
- "SEND": "Send",
- "CREATE": "Add Note",
+ "REPLY": "መልስ",
+ "PRIVATE_NOTE": "የግል ማስታወሻ",
+ "SEND": "ላክ",
+ "CREATE": "ማስታወሻ አክል",
"INSERT_READ_MORE": "Read more",
"DISMISS_REPLY": "Dismiss reply",
"REPLYING_TO": "Replying to:",
@@ -214,7 +214,7 @@
"DRAG_DROP": "Drag and drop here to attach",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "ኮፒሎት እየሰማራ ነው",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Add bcc",
@@ -245,10 +245,10 @@
"EXPAND": "Expand preview"
}
},
- "VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team",
- "CHANGE_STATUS": "Conversation status changed",
+ "VISIBLE_TO_AGENTS": "የግል ማስታወሻ፡ ለአንተና ቡድንህ ብቻ ይታያል",
+ "CHANGE_STATUS": "የውይይቱ ሁኔታ ተቀይሯል",
"CHANGE_STATUS_FAILED": "Conversation status change failed",
- "CHANGE_AGENT": "Conversation Assignee changed",
+ "CHANGE_AGENT": "የውይይቱ ተመድብ ተቀይሯል",
"CHANGE_AGENT_FAILED": "Assignee change failed",
"ASSIGN_LABEL_SUCCESFUL": "Label assigned successfully",
"ASSIGN_LABEL_FAILED": "Label assignment failed",
@@ -300,20 +300,20 @@
}
},
"EMAIL_TRANSCRIPT": {
- "TITLE": "Send conversation transcript",
- "DESC": "Send a copy of the conversation transcript to the specified email address",
- "SUBMIT": "Submit",
- "CANCEL": "Cancel",
- "SEND_EMAIL_SUCCESS": "The chat transcript was sent successfully",
- "SEND_EMAIL_ERROR": "There was an error, please try again",
+ "TITLE": "የውይይት ጽሑፍ ላክ",
+ "DESC": "የውይይቱን ጽሑፍ ቅጂ ወደ ተጠቃሚው ኢሜይል ላክ",
+ "SUBMIT": "አስገባ",
+ "CANCEL": "ይቅር",
+ "SEND_EMAIL_SUCCESS": "የቻት አጭር መግለጫው በተሳካ ሁኔታ ተልኳል",
+ "SEND_EMAIL_ERROR": "ስህተት ተፈጥሯል፣ እባክዎ ደግመው ይሞክሩ",
"SEND_EMAIL_PAYMENT_REQUIRED": "Email transcript is not available on your current plan. Please upgrade to use this feature.",
"FORM": {
- "SEND_TO_CONTACT": "Send the transcript to the customer",
+ "SEND_TO_CONTACT": "መግለጫውን ለደንበኛው ይላኩ",
"SEND_TO_AGENT": "Send the transcript to the assigned agent",
- "SEND_TO_OTHER_EMAIL_ADDRESS": "Send the transcript to another email address",
+ "SEND_TO_OTHER_EMAIL_ADDRESS": "መግለጫውን ወደ ሌላ ኢሜይል አድራሻ ይላኩ",
"EMAIL": {
- "PLACEHOLDER": "Enter an email address",
- "ERROR": "Please enter a valid email address"
+ "PLACEHOLDER": "ኢሜይል አድራሻ ያስገቡ",
+ "ERROR": "ትክክለኛ ኢሜይል አድራሻ ያስገቡ"
}
}
},
diff --git a/app/javascript/dashboard/i18n/locale/am/helpCenter.json b/app/javascript/dashboard/i18n/locale/am/helpCenter.json
index c87a1cfd7..0d98c6316 100644
--- a/app/javascript/dashboard/i18n/locale/am/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/am/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "ቋንቋው ከፖርታል በተሳካ ሁኔታ ተሰርዟል",
"ERROR_MESSAGE": "ከፖርታሉ ቋንቋ ማስወገድ አልተቻለም። እባክዎ ደግመው ይሞክሩ።."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} ጽሑፍ | {count} ጽሑፎች",
"CATEGORIES_COUNT": "{count} ምድብ | {count} ምድቦች",
"DEFAULT": "ነባሪ",
+ "DRAFT": "እቅድ",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "እንደ ነባሪ አድርግ",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "ሰርዝ"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "ቋንቋ ይምረጡ..."
},
+ "STATUS": {
+ "LABEL": "Status",
+ "OPTIONS": {
+ "LIVE": "ተለቀቀ",
+ "DRAFT": "እቅድ"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "ቋንቋ በተሳካ ሁኔታ ተጨምሯል",
"ERROR_MESSAGE": "ቋንቋውን ማክሰኞ አልተቻለም። እባክዎ ደግመው ይሞክሩ።."
diff --git a/app/javascript/dashboard/i18n/locale/am/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/am/inboxMgmt.json
index eba38473f..aea8e4578 100644
--- a/app/javascript/dashboard/i18n/locale/am/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/am/inboxMgmt.json
@@ -11,7 +11,7 @@
"WHATSAPP_REGISTRATION_INCOMPLETE": "የWhatsApp ንግድ ምዝገባዎ አልተጠናቀቀም። እባክዎ ከመገናኛ ባለሥልጣን ጋር በMeta Business Manager ውስጥ የሚታይ ስም ሁኔታዎን ያረጋግጡ።.",
"COMPLETE_REGISTRATION": "ምዝገባ አሟልት",
"LIST": {
- "404": "Այս հաշվի հետ կապված մուտքային արկղեր չկան։"
+ "404": "ወደዚህ መለያ የተያዙ ኢንቦክሶች የሉም።"
},
"CREATE_FLOW": {
"CHANNEL": {
@@ -42,7 +42,7 @@
"PLACEHOLDER": "የድር ጣቢያ ስምዎን ያስገቡ (ለምሳሌ፡ Acme Inc)"
},
"FB": {
- "HELP": "Հիշեցում․ Մուտք գործելով մենք միայն հասանելիություն ենք ստանում Ձեր էջի հաղորդագրություններին։ Ձեր անձնական հաղորդագրություններին Chatwoot-ը երբեք չի կարող հասանելիություն ունենալ։",
+ "HELP": "ማስታወሻ፡ በመግባት ብቻ የገጹ መልእክቶችን ብቻ እንደምንያዝ ነው። የግል መልእክቶችዎን በChatwoot ማድረስ አይቻልም።",
"CHOOSE_PAGE": "ገጽ ይምረጡ",
"CHOOSE_PLACEHOLDER": "ከዝርዝር ገጽ ይምረጡ",
"INBOX_NAME": "የኢንቦክስ ስም",
@@ -76,7 +76,7 @@
},
"WEBSITE_CHANNEL": {
"TITLE": "የድር ጣቢያ ቻናል",
- "DESC": "Ստեղծեք ալիք Ձեր կայքի համար և սկսեք աջակցել Ձեր հաճախորդներին մեր կայքի վիջեթի միջոցով։",
+ "DESC": "ለድህረ ገጹ ቻናል ይፍጠሩ እና በድህረ ገጻችን ዊጅት ደንበኞቻችሁን ይደግፉ።",
"LOADING_MESSAGE": "የድር ጣቢያ ድጋፍ ቻናል እየተፈጠረ ነው",
"CHANNEL_AVATAR": {
"LABEL": "የቻናል ፎቶ"
@@ -96,11 +96,11 @@
},
"CHANNEL_WELCOME_TAGLINE": {
"LABEL": "የእንኳን ደህና መጡ መልዕክት",
- "PLACEHOLDER": "Մենք հեշտացնում ենք կապվել մեզ հետ։ Հարցրեք ցանկացած բան կամ կիսվեք Ձեր կարծիքով։"
+ "PLACEHOLDER": "ከእኛ ጋር ቀላል መገናኘት እንደምንሠራ ነው። ማንኛውንም ጥያቄ ያቀርቡ ወይም አስተያየትዎን ያጋሩ።"
},
"CHANNEL_GREETING_MESSAGE": {
"LABEL": "የቻናል ደስታ መልእክት",
- "PLACEHOLDER": "Acme Inc սովորաբար պատասխանում է մի քանի ժամվա ընթացքում։"
+ "PLACEHOLDER": "Acme Inc በተለምዶ በጥቂት ሰዓታት ውስጥ ይመልሳል።"
},
"CHANNEL_GREETING_TOGGLE": {
"LABEL": "የቻናል ደስታ አንቀሳቅስ",
@@ -126,7 +126,7 @@
},
"TWILIO": {
"TITLE": "Twilio SMS/WhatsApp ቻናል",
- "DESC": "Միացրեք Twilio-ն և սկսեք աջակցել Ձեր հաճախորդներին SMS կամ WhatsApp միջոցով։",
+ "DESC": "Twilio ያገናኙ እና በSMS ወይም WhatsApp ደንበኞቻችሁን ይደግፉ።",
"ACCOUNT_SID": {
"LABEL": "አካውንት SID",
"PLACEHOLDER": "እባክዎ የTwilio መለያ መለያዎን ያስገቡ",
@@ -165,12 +165,12 @@
},
"PHONE_NUMBER": {
"LABEL": "ስልክ ቁጥር",
- "PLACEHOLDER": "Խնդրում ենք մուտքագրել այն հեռախոսահամարը, որտեղից կուղարկվի հաղորդագրությունը։",
+ "PLACEHOLDER": "ከዚህ መልእክት የሚልከው የስልክ ቁጥር እባክዎ ያስገቡ።",
"ERROR": "እባክዎ በ`+` ምልክት የሚጀምር እና ቦታ ያልያዘ ትክክለኛ የስልክ ቁጥር ያቀርቡ።."
},
"API_CALLBACK": {
"TITLE": "ካልባክ URL",
- "SUBTITLE": "Twilio-ում պետք է կարգավորեք հաղորդագրության պատասխան URL-ը՝ օգտագործելով այստեղ նշված հասցեն։"
+ "SUBTITLE": "በTwilio ውስጥ የመልእክት እንደገና መግባት አድራሻን ከዚህ በተጠቀሰው አድራሻ ጋር መቀነባበር አለብዎት።"
},
"SUBMIT_BUTTON": "የTwilio ቻናል ይፍጠሩ",
"API": {
@@ -179,7 +179,7 @@
},
"SMS": {
"TITLE": "SMS ቻናል",
- "DESC": "Սկսեք աջակցել Ձեր հաճախորդներին SMS-ի միջոցով։",
+ "DESC": "በSMS ደንበኞቻችሁን ይደግፉ።",
"PROVIDERS": {
"LABEL": "API አቅራቢ",
"TWILIO": "Twilio",
@@ -231,7 +231,7 @@
},
"WHATSAPP": {
"TITLE": "WhatsApp ቻናል",
- "DESC": "Սկսեք աջակցել Ձեր հաճախորդներին WhatsApp-ի միջոցով։",
+ "DESC": "በWhatsApp ደንበኞቻችሁን ይደግፉ።",
"PROVIDERS": {
"LABEL": "API አቅራቢ",
"WHATSAPP_EMBEDDED": "WhatsApp ቢዝነስ",
@@ -252,7 +252,7 @@
},
"PHONE_NUMBER": {
"LABEL": "የስልክ ቁጥር",
- "PLACEHOLDER": "Խնդրում ենք մուտքագրել այն հեռախոսահամարը, որտեղից կուղարկվի հաղորդագրությունը։",
+ "PLACEHOLDER": "ከዚህ መልእክት የሚልከው የስልክ ቁጥር እባክዎ ያስገቡ።",
"ERROR": "እባክዎ በ`+` ምልክት የሚጀምር እና ቦታ ያልያዘ ትክክለኛ የስልክ ቁጥር ያቀርቡ።."
},
"PHONE_NUMBER_ID": {
@@ -272,9 +272,9 @@
},
"API_KEY": {
"LABEL": "API ቁልፍ",
- "SUBTITLE": "Կարգավորեք WhatsApp API բանալին։",
+ "SUBTITLE": "የWhatsApp API ቁልፍን ያቀናብሩ።",
"PLACEHOLDER": "API ቁልፍ",
- "ERROR": "Խնդրում ենք մուտքագրել վավեր արժեք։"
+ "ERROR": "እባክዎ ትክክለኛ እሴት ያስገቡ።"
},
"API_CALLBACK": {
"TITLE": "የተመለሰ አድራሻ URL",
@@ -358,7 +358,7 @@
},
"API_CHANNEL": {
"TITLE": "የAPI ቻናል",
- "DESC": "Միացրեք API ալիքը և սկսեք աջակցել Ձեր հաճախորդներին։",
+ "DESC": "ከAPI ቻናል ጋር ያገናኙ እና ደንበኞቻችሁን ይደግፉ።",
"CHANNEL_NAME": {
"LABEL": "የቻናል ስም",
"PLACEHOLDER": "እባክዎ የቻናል ስም ያስገቡ",
@@ -371,7 +371,7 @@
},
"SUBMIT_BUTTON": "API ቻናል ፍጠር",
"API": {
- "ERROR_MESSAGE": "Չհաջողվեց պահպանել API ալիքը"
+ "ERROR_MESSAGE": "API ቻናሉን ማስቀመጥ አልተቻለንም"
}
},
"EMAIL_CHANNEL": {
@@ -399,7 +399,7 @@
},
"LINE_CHANNEL": {
"TITLE": "LINE ቻናል",
- "DESC": "Միացրեք LINE ալիքը և սկսեք աջակցել Ձեր հաճախորդներին։",
+ "DESC": "ከLINE ቻናል ጋር ያገናኙ እና ደንበኞቻችሁን ይደግፉ።",
"CHANNEL_NAME": {
"LABEL": "የቻናል ስም",
"PLACEHOLDER": "እባክዎ የቻናል ስም ያስገቡ",
@@ -423,15 +423,15 @@
},
"API_CALLBACK": {
"TITLE": "የእንደገና ጥሪ አድራሻ",
- "SUBTITLE": "LINE հավելվածում պետք է կարգավորեք webhook URL-ը՝ օգտագործելով այստեղ նշված հասցեն։"
+ "SUBTITLE": "በLINE መተግበሪያ ውስጥ የwebhook አድራሻን ከዚህ በተጠቀሰው አድራሻ ጋር መቀነባበር አለብዎት።"
}
},
"TELEGRAM_CHANNEL": {
"TITLE": "Telegram ቻናል",
- "DESC": "Միացրեք Telegram ալիքը և սկսեք աջակցել Ձեր հաճախորդներին։",
+ "DESC": "ከTelegram ቻናል ጋር ያገናኙ እና ደንበኞቻችሁን ይደግፉ።",
"BOT_TOKEN": {
"LABEL": "የቦት ቶክን",
- "SUBTITLE": "Կարգավորեք Telegram BotFather-ից ստացած բոտի տոկենը։",
+ "SUBTITLE": "ከTelegram BotFather ያገኙትን የቦት ቶክን ያቀናብሩ።",
"PLACEHOLDER": "የቦት ቶክን"
},
"SUBMIT_BUTTON": "Telegram ቻናል ፍጠር",
@@ -493,13 +493,13 @@
},
"AGENTS": {
"TITLE": "Agent-ዎች",
- "DESC": "Այստեղ կարող եք ավելացնել գործակալներ՝ նոր ստեղծված մուտքային արկղը կառավարելու համար։ Միայն այս ընտրված գործակալները կունենան մուտք դեպի Ձեր մուտքային արկղը։ Գործակալները, որոնք չեն պատկանում այս մուտքային արկղին, չեն կարողանա տեսնել կամ պատասխանել հաղորդագրություններին մուտք գործելիս։ Հիշեցում․ Որպես ադմինիստրատոր, եթե Ձեզ անհրաժեշտ է մուտք բոլոր մուտքային արկղերին, պետք է ինքներդ Ձեզ ավելացնեք որպես գործակալ բոլոր ստեղծած մուտքային արկղերում։",
+ "DESC": "እዚህ አዲስ የተፈጠረውን ኢንቦክስ ለመቆጣጠር ወኪሎችን ማከል ይችላሉ። እነዚህ የተመረጡ ወኪሎች ብቻ ወደ ኢንቦክስዎ መዳረሻ አላቸው። ከዚህ ኢንቦክስ አካል ያልሆኑ ወኪሎች ሲግቡ መልእክቶችን ማየት ወይም መልስ ማድረግ አይችሉም። ማስታወሻ፡ እንደ አስተዳደር ባለስልጣን ሁሉንም ኢንቦክሶች ለመዳረሻ ከፈለጉ ራስዎን እንደ ወኪል ወደ ሁሉም የሚፈጥሩት ኢንቦክሶች መጨመር አለብዎት።",
"VALIDATION_ERROR": "ከአዲሱ ኢንቦክስዎ ቢያንስ አንድ ወኪል ያክሉ",
"PICK_AGENTS": "ለኢንቦክሱ ወኪሎችን ይምረጡ"
},
"DETAILS": {
"TITLE": "የኢንቦክስ ዝርዝሮች",
- "DESC": "Ընտրեք ներքևի բացվող ցանկից այն Facebook էջը, որը ցանկանում եք կապել Chatwoot-ի հետ։ Կարող եք նաև մուտքային արկղին տալ հատուկ անուն՝ ավելի լավ ճանաչման համար։"
+ "DESC": "ከታች ያለው ከዝርዝር ማስተካከያ በተጠቃሚው ፌስቡክ ገጽ ወደ Chatwoot ለመገናኘት ይምረጡ። ለምርጥ መለያየት የእርስዎን ኢንቦክስ በተለየ ስም ማቅረብ ይችላሉ።"
},
"FINISH": {
"TITLE": "ተሳክቷል!",
@@ -543,7 +543,7 @@
"MESSAGE": "ከአዲሱ ቻናልዎ ጋር ከደንበኞችዎ ጋር እንዲገናኙ አሁን ትችላላችሁ። ደስታ ያለው ድጋፍ",
"BUTTON_TEXT": "ወደ እዚያ ይውሰዱኝ",
"MORE_SETTINGS": "ተጨማሪ ቅንብሮች",
- "WEBSITE_SUCCESS": "Դուք հաջողությամբ ստեղծել եք կայքի ալիք։ Նշված կոդը պատճենեք և տեղադրեք Ձեր կայքում։ Հաջորդ անգամ, երբ հաճախորդը օգտագործի ուղիղ զրույցը, հաղորդակցությունը ավտոմատ կհայտնվի Ձեր մուտքային արկղում։",
+ "WEBSITE_SUCCESS": "የድር ጣቢያ ቻናል መፍጠር በተሳካ ሁኔታ ተጠናቋል። ከታች የተሳየውን ኮድ ቅዳት እና በድር ጣቢያዎ ያስገቡ። ቀጣዩ ጊዜ ደንበኛ በላይቭ ቻት ሲጠቀም ውይይቱ በራሱ በኢንቦክስዎ ይታያል።",
"WHATSAPP_QR_INSTRUCTION": "ለፈጣን ሙከራ የ WhatsApp ጥቅል ላይ ከላይ ያለውን QR ኮድ ይስካን ያድርጉ",
"MESSENGER_QR_INSTRUCTION": "ለፈጣን ሙከራ የ Facebook Messenger ጥቅል ላይ ከላይ ያለውን QR ኮድ ይስካን ያድርጉ",
"TELEGRAM_QR_INSTRUCTION": "ለፈጣን ሙከራ የ Telegram ጥቅል ላይ ከላይ ያለውን QR ኮድ ይስካን ያድርጉ"
@@ -613,9 +613,9 @@
},
"API": {
"SUCCESS_MESSAGE": "ኢንቦክስ በተሳካ ሁኔታ ተሰርዟል",
- "ERROR_MESSAGE": "Չհաջողվեց ջնջել մուտքային արկղը։ Խնդրում ենք փորձել ավելի ուշ։",
+ "ERROR_MESSAGE": "ኢንቦክስ ማጥፋት አልተቻለም። እባክዎ በኋላ ደግመው ይሞክሩ።",
"AVATAR_SUCCESS_MESSAGE": "የኢንቦክስ አቫታር በተሳካ ሁኔታ ተሰርዟል",
- "AVATAR_ERROR_MESSAGE": "Չհաջողվեց ջնջել մուտքային արկղի պատկերակը։ Խնդրում ենք փորձել ավելի ուշ։"
+ "AVATAR_ERROR_MESSAGE": "የኢንቦክስ አቫታር ማጥፋት አልተቻለም። እባክዎ በኋላ ደግመው ይሞክሩ።"
}
},
"TABS": {
@@ -736,24 +736,24 @@
"SENDER_NAME_SECTION": "በኢሜይል ውስጥ የAgent ስም አርግ",
"SENDER_NAME_SECTION_TEXT": "በኢሜይል ውስጥ የAgent ስም እንዲታይ/እንዳይታይ አርግ፣ ካልተከናወነ የንግድ ስም ይታያል",
"ENABLE_CONTINUITY_VIA_EMAIL": "በኢሜል የውይይት ቀጥታነት አንቀሳቅስ",
- "ENABLE_CONTINUITY_VIA_EMAIL_SUB_TEXT": "Եթե կոնտակտի էլ.փոստի հասցեն հասանելի է, զրույցները կշարունակվեն էլ.փոստով։",
+ "ENABLE_CONTINUITY_VIA_EMAIL_SUB_TEXT": "ከኮንታክት ኢሜይል አድራሻ ካለ ውይይቶች በኢሜይል ይቀጥላሉ።",
"LOCK_TO_SINGLE_CONVERSATION": "የውይይት መላኪያ",
"LOCK_TO_SINGLE_CONVERSATION_SUB_TEXT": "ለአሁን ያሉ እውቂያዎች ውይይት ፍጠራ ያስተካክሉ",
"INBOX_UPDATE_TITLE": "የኢንቦክስ ቅንብሮች",
"INBOX_UPDATE_SUB_TEXT": "የኢንቦክስዎን ቅንብሮች ያዘምኑ",
- "AUTO_ASSIGNMENT_SUB_TEXT": "Միացրեք կամ անջատեք նոր հաղորդակցությունները ավտոմատ նշանակումը այս մուտքային արկղին ավելացված գործակալներին։",
+ "AUTO_ASSIGNMENT_SUB_TEXT": "አዲስ ውይይቶችን ወደ ይህ ኢንቦክስ የተጨመሩ ወኪሎች በራስሰር ማድረግን አቅርቦ ወይም አቋርጦ ያድርጉ።",
"HMAC_VERIFICATION": "የተጠቃሚ መለያ ማረጋገጫ",
"HMAC_DESCRIPTION": "በዚህ ቁልፍ የተለየ ቶክን ማመንጨት ይችላሉ ይህም የተጠቃሚዎችዎን መለያ ለማረጋገጥ ይጠቅማል።.",
"HMAC_LINK_TO_DOCS": "እንደ ተጨማሪ መረጃ እዚህ ማንበብ ይችላሉ።.",
"HMAC_MANDATORY_VERIFICATION": "የተጠቃሚ መለያ ማረጋገጫን አጽድቅ",
"HMAC_MANDATORY_DESCRIPTION": "ከተከፈተ ግምገማዎች ካልተረጋገጡ ጥያቄዎች ይተንቀሳቀሳሉ።.",
"INBOX_IDENTIFIER": "የኢንቦክስ መለያ",
- "INBOX_IDENTIFIER_SUB_TEXT": "Օգտագործեք այստեղ նշված `inbox_identifier` տոկենը՝ Ձեր API հաճախորդների վավերացման համար։",
+ "INBOX_IDENTIFIER_SUB_TEXT": "የ API ደንበኞችዎን ማረጋገጫ ለማድረግ እዚህ የተሳየውን `inbox_identifier` ቶክን ይጠቀሙ።",
"FORWARD_EMAIL_TITLE": "ወደ ኢሜይል አስቀምጥ",
- "FORWARD_EMAIL_SUB_TEXT": "Սկսեք Ձեր էլ.փոստերը ուղարկել հետևյալ էլ.փոստի հասցեին։",
+ "FORWARD_EMAIL_SUB_TEXT": "ኢሜይሎችዎን ወደ ቀጣዩ ኢሜይል አድራሻ መላክ ይጀምሩ።",
"FORWARD_EMAIL_NOT_CONFIGURED": "ኢሜይሎችን ወደ ኢንቦክስዎ መቀላቀል በዚህ መገናኛ አሁን አልተፈቀደም። ይህን ባህሪ ለመጠቀም ከአስተዳደሩ መፍቀድ አለቦት። እባክዎ ለመቀጠል ከእነርሱ ጋር ያገናኙ።.",
"ALLOW_MESSAGES_AFTER_RESOLVED": "ከውይይት መፍታት በኋላ መልእክቶችን እንዲፈቀድ",
- "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Թույլ տվեք վերջնական օգտատերերին ուղարկել հաղորդագրություններ նույնիսկ զրույցի լուծումից հետո։",
+ "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "ውይይቱ ከተፈታ በኋላም እንደገና መልእክቶችን ለመላክ ለመጠቀሚያ ተጠቃሚዎች ፈቃድ ይስጡ።",
"WHATSAPP_SECTION_SUBHEADER": "ይህ የAPI ቁልፍ ለWhatsApp API ጋር ለመያዝ ይጠቅማል።.",
"WHATSAPP_SECTION_UPDATE_SUBHEADER": "ለWhatsApp API ጋር ለመያዝ አዲሱን የAPI ቁልፍ ያስገቡ።.",
"WHATSAPP_SECTION_TITLE": "API ቁልፍ",
@@ -850,7 +850,7 @@
"MESSAGE_ERROR": "ስህተት አጋጥሟል፣ እባክዎ እንደገና ይሞክሩ"
},
"PRE_CHAT_FORM": {
- "DESCRIPTION": "Նախնական զրույցի ձևերը թույլ են տալիս հավաքել օգտատիրոջ տեղեկությունները նախքան զրույցի սկսելը։",
+ "DESCRIPTION": "የቀድሞ ቻት ቅጥያዎች ተጠቃሚ መረጃ ከመደምደሚያ በፊት ለመሰብሰብ ይፈቅዳሉ።",
"SET_FIELDS": "የቀደም የውይይት ቅጽ መስኮች",
"SET_FIELDS_HEADER": {
"FIELDS": "መስኮች",
@@ -960,7 +960,7 @@
"HOURS": "ሰዓታት",
"ENABLE": "ለዚህ ቀን እንደሚገኙ አንቀሳቅስ",
"UNAVAILABLE": "አይገኝም",
- "VALIDATION_ERROR": "Սկիզբի ժամանակը պետք է լինի փակման ժամանակից առաջ։",
+ "VALIDATION_ERROR": "የመጀመሪያ ሰዓት ከመዝጊያ ሰዓት በፊት መሆን አለበት።",
"CHOOSE": "ይምረጡ"
},
"ALL_DAY": "ቀኑን ሙሉ"
diff --git a/app/javascript/dashboard/i18n/locale/am/integrations.json b/app/javascript/dashboard/i18n/locale/am/integrations.json
index ac0b2564f..978721642 100644
--- a/app/javascript/dashboard/i18n/locale/am/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/am/integrations.json
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "ሰነዶች",
"ADD_NEW": "አዲስ ሰነድ ፍጠር",
+ "SELECTED": "{count} ተመረጡ",
+ "SELECT_ALL": "ሁሉንም ይምረጡ ({count})",
+ "UNSELECT_ALL": "ሁሉንም አልምረጥም ({count})",
+ "BULK_DELETE_BUTTON": "Delete",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "አዎን፣ ሁሉንም አጥፋ",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "ተዛማጅ የFAQ ጥያቄዎች",
"DESCRIPTION": "እነዚህ የFAQ ጥያቄዎች ቀጥተኛ ከሰነዱ ተፈጥረዋል።"
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "መሣሪያዎች",
"ADD_NEW": "አዲስ መሣሪያ ይፍጠሩ",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "ምንም የተለየ መሣሪያዎች አልተገኙም",
"SUBTITLE": "እርስዎን ከውጭ ኤፒአይዎችና አገልግሎቶች ጋር ለማገናኘት የተለየ መሣሪያዎችን ይፍጠሩ፣ እንዲሁም እርስዎን በአካል ውስጥ መረጃ ለማግኘትና ለማከናወን ይፈቅዱ።",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "ብልጽግና ተጠቃሚ መሣሪያ ተሰርዟል",
"ERROR_MESSAGE": "ብልጽግና መሣሪያውን ማስወገድ አልተሳካም"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "የመሣሪያ ስም",
"PLACEHOLDER": "የትዕዛዝ ፍለጋ",
- "ERROR": "የመሣሪያ ስም አስፈላጊ ነው"
+ "ERROR": "የመሣሪያ ስም አስፈላጊ ነው",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "መግለጫ",
diff --git a/app/javascript/dashboard/i18n/locale/am/report.json b/app/javascript/dashboard/i18n/locale/am/report.json
index b8c4cd0aa..20f61f618 100644
--- a/app/javascript/dashboard/i18n/locale/am/report.json
+++ b/app/javascript/dashboard/i18n/locale/am/report.json
@@ -158,54 +158,54 @@
"TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)"
},
"RESOLUTION_TIME": {
- "NAME": "Resolution Time",
- "DESC": "( Avg )",
+ "NAME": "የመፍትሄ ጊዜ",
+ "DESC": "( አማካይ )",
"INFO_TEXT": "Total number of conversations used for computation:",
"TOOLTIP_TEXT": "Resolution Time is {metricValue} (based on {conversationCount} conversations)"
},
"RESOLUTION_COUNT": {
- "NAME": "Resolution Count",
- "DESC": "( Total )"
+ "NAME": "የተፈታ ብዛት",
+ "DESC": "( ጠቅላላ )"
}
},
"DATE_RANGE": [
{
"id": 0,
- "name": "Last 7 days"
+ "name": "ያለፉት 7 ቀናት"
},
{
"id": 1,
- "name": "Last 30 days"
+ "name": "ያለፉት 30 ቀናት"
},
{
"id": 2,
- "name": "Last 3 months"
+ "name": "ያለፉት 3 ወራት"
},
{
"id": 3,
- "name": "Last 6 months"
+ "name": "ያለፉት 6 ወራት"
},
{
"id": 4,
- "name": "Last year"
+ "name": "ያለፈው ዓመት"
},
{
"id": 5,
- "name": "Custom date range"
+ "name": "በተለይ የተመረጠ ቀን ክልል"
}
],
"CUSTOM_DATE_RANGE": {
- "CONFIRM": "Apply",
- "PLACEHOLDER": "Select date range"
+ "CONFIRM": "ተግባሩን ተፈጽም",
+ "PLACEHOLDER": "የቀን ክልል ይምረጡ"
}
},
"LABEL_REPORTS": {
- "HEADER": "Labels Overview",
+ "HEADER": "የመለያ አጠቃላይ እይታ",
"DESCRIPTION": "Track label performance with key metrics including conversations, response times, resolution times, and resolved cases. Click a label name for detailed insights.",
- "LOADING_CHART": "Loading chart data...",
- "NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
- "DOWNLOAD_LABEL_REPORTS": "Download label reports",
- "FILTER_DROPDOWN_LABEL": "Select Label",
+ "LOADING_CHART": "የገበታ ውሂብ በመጫን ላይ...",
+ "NO_ENOUGH_DATA": "የበቂ ውሂብ አልተሰበሰበም፣ እባክዎ በኋላ ይሞክሩ።",
+ "DOWNLOAD_LABEL_REPORTS": "የመለያ ሪፖርቶችን ይውሰዱ",
+ "FILTER_DROPDOWN_LABEL": "መለያ ይምረጡ",
"FILTERS": {
"INPUT_PLACEHOLDER": {
"LABELS": "Search labels"
@@ -213,71 +213,71 @@
},
"METRICS": {
"CONVERSATIONS": {
- "NAME": "Conversations",
- "DESC": "( Total )"
+ "NAME": "ውይይቶች",
+ "DESC": "( ድምር )"
},
"INCOMING_MESSAGES": {
- "NAME": "Incoming Messages",
- "DESC": "( Total )"
+ "NAME": "የሚገቡ መልእክቶች",
+ "DESC": "( ድምር )"
},
"OUTGOING_MESSAGES": {
- "NAME": "Outgoing Messages",
- "DESC": "( Total )"
+ "NAME": "የወጪ መልእክቶች",
+ "DESC": "( ድምር )"
},
"FIRST_RESPONSE_TIME": {
"NAME": "First Response Time",
- "DESC": "( Avg )",
+ "DESC": "( አማካይ )",
"INFO_TEXT": "Total number of conversations used for computation:",
"TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)"
},
"RESOLUTION_TIME": {
- "NAME": "Resolution Time",
- "DESC": "( Avg )",
+ "NAME": "የመፍትሄ ጊዜ",
+ "DESC": "( አማካይ )",
"INFO_TEXT": "Total number of conversations used for computation:",
"TOOLTIP_TEXT": "Resolution Time is {metricValue} (based on {conversationCount} conversations)"
},
"RESOLUTION_COUNT": {
- "NAME": "Resolution Count",
- "DESC": "( Total )"
+ "NAME": "የመፍትሄ ብዛት",
+ "DESC": "( ድምር )"
}
},
"DATE_RANGE": [
{
"id": 0,
- "name": "Last 7 days"
+ "name": "ያለፉ 7 ቀናት"
},
{
"id": 1,
- "name": "Last 30 days"
+ "name": "ያለፉ 30 ቀናት"
},
{
"id": 2,
- "name": "Last 3 months"
+ "name": "ያለፉት 3 ወራት"
},
{
"id": 3,
- "name": "Last 6 months"
+ "name": "ያለፉት 6 ወራት"
},
{
"id": 4,
- "name": "Last year"
+ "name": "ያለፈው ዓመት"
},
{
"id": 5,
- "name": "Custom date range"
+ "name": "በተፈጥሮ የተመረጠ የቀን ክልል"
}
],
"CUSTOM_DATE_RANGE": {
- "CONFIRM": "Apply",
- "PLACEHOLDER": "Select date range"
+ "CONFIRM": "ተግባር አድርግ",
+ "PLACEHOLDER": "የቀን ክልል ይምረጡ"
}
},
"INBOX_REPORTS": {
- "HEADER": "Inbox Overview",
+ "HEADER": "የኢንቦክስ አጠቃላይ እይታ",
"DESCRIPTION": "Quickly view your inbox performance with key metrics like conversations, response times, resolution times, and resolved cases—all in one place. Click an inbox name for more details.",
- "LOADING_CHART": "Loading chart data...",
- "NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
- "DOWNLOAD_INBOX_REPORTS": "Download inbox reports",
+ "LOADING_CHART": "የገቢ ግምገማ መረጃ በመጫን ላይ...",
+ "NO_ENOUGH_DATA": "ሪፖርት ለማዘጋጀት በቂ መረጃ አልተደረሰም። እባክዎ በኋላ ይሞክሩ።",
+ "DOWNLOAD_INBOX_REPORTS": "የኢንቦክስ ሪፖርቶችን ይውሰዱ",
"FILTER_DROPDOWN_LABEL": "Select Inbox",
"ALL_INBOXES": "All Inboxes",
"SEARCH_INBOX": "Search Inbox",
diff --git a/app/javascript/dashboard/i18n/locale/ar/helpCenter.json b/app/javascript/dashboard/i18n/locale/ar/helpCenter.json
index 29ae64c9b..b19a3970a 100644
--- a/app/javascript/dashboard/i18n/locale/ar/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/ar/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "تم إزالة اللغة من البوابة بنجاح",
"ERROR_MESSAGE": "غير قادر على إزالة اللغة من البوابة. حاول مرة أخرى."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "افتراضي",
+ "DRAFT": "مسودة",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "حذف"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "حدد اللغة..."
},
+ "STATUS": {
+ "LABEL": "الحالة",
+ "OPTIONS": {
+ "LIVE": "نُشرت",
+ "DRAFT": "مسودة"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "تمت إضافة اللغة بنجاح",
"ERROR_MESSAGE": "غير قادر على إضافة اللغة . حاول مرة أخرى."
diff --git a/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json
index eb56d9ded..f0f5f3383 100644
--- a/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json
@@ -715,7 +715,7 @@
},
"ALLOW_MOBILE_WEBVIEW": {
"LABEL": "Enable widget in mobile apps",
- "SUBTITLE": "Check this if you embed the widget in iOS or Android apps. Mobile apps don't send domain information, so they would be blocked by domain restrictions unless this is enabled."
+ "SUBTITLE": "حدد هذا الخيار إذا كنت تقوم بتضمين الأداة في تطبيقات iOS أو Android. لا ترسل تطبيقات الجوال معلومات النطاق، لذا سيتم حظرها بسبب قيود النطاق ما لم يتم تفعيل هذا الخيار."
},
"IDENTITY_VALIDATION": {
"TITLE": "Identity Validation",
diff --git a/app/javascript/dashboard/i18n/locale/ar/integrations.json b/app/javascript/dashboard/i18n/locale/ar/integrations.json
index 66f8f7f40..31d17d0d4 100644
--- a/app/javascript/dashboard/i18n/locale/ar/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ar/integrations.json
@@ -126,7 +126,7 @@
},
"HELP_TEXT": {
"TITLE": "استخدام تكامل Slack",
- "BODY": "With this integration, all of your incoming conversations will be synced to the ***{selectedChannelName}*** channel in your Slack workspace. You can manage all your customer conversations right within the channel and never miss a message.\n\nHere are the main features of the integration:\n\n**Respond to conversations from within Slack:** To respond to a conversation in the ***{selectedChannelName}*** Slack channel, simply type out your message and send it as a thread. This will create a response back to the customer through Chatwoot. It's that simple!\n\n **Create private notes:** If you want to create private notes instead of replies, start your message with ***`note:`***. This ensures that your message is kept private and won't be visible to the customer.\n\n**Associate an agent profile:** If the person who replied on Slack has an agent profile in Chatwoot under the same email, the replies will be associated with that agent profile automatically. This means you can easily track who said what and when. On the other hand, when the replier doesn't have an associated agent profile, the replies will appear from the bot profile to the customer.",
+ "BODY": "باستخدام هذا التكامل، ستتم مزامنة جميع محادثاتك الواردة مع قناة ***{selectedChannelName}*** في مساحة عمل Slack الخاصة بك. يمكنك إدارة جميع محادثات عملائك مباشرة من داخل القناة ولن تفوّت أي رسالة.\n\nفيما يلي الميزات الرئيسية لهذا التكامل:\n\n**الرد على المحادثات من داخل Slack:** للرد على محادثة في قناة Slack ***{selectedChannelName}***، ما عليك سوى كتابة رسالتك وإرسالها كسلسلة رسائل. سيؤدي ذلك إلى إنشاء رد للعميل عبر Chatwoot. الأمر بهذه البساطة!\n\n **إنشاء ملاحظات خاصة:** إذا كنت تريد إنشاء ملاحظات خاصة بدلاً من الردود، فابدأ رسالتك بـ ***`note:`***. يضمن ذلك بقاء رسالتك خاصة وعدم ظهورها للعميل.\n\n**ربط ملف وكيل:** إذا كان الشخص الذي ردّ في Slack لديه ملف وكيل في Chatwoot تحت البريد الإلكتروني نفسه، فسيتم ربط الردود تلقائيًا بذلك الملف. وهذا يعني أنه يمكنك بسهولة تتبع من قال ماذا ومتى. من ناحية أخرى، إذا لم يكن لدى الشخص الذي ردّ ملف وكيل مرتبط، فستظهر الردود للعميل على أنها صادرة من ملف البوت.",
"SELECTED": "selected"
},
"SELECT_CHANNEL": {
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "قائد",
- "HEADER_KNOW_MORE": "Know more",
+ "HEADER_KNOW_MORE": "اعرف المزيد",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "ASSISTANTS": "المساعدون",
+ "SWITCH_ASSISTANT": "التبديل بين المساعدين",
+ "NEW_ASSISTANT": "إنشاء مساعد",
+ "EMPTY_LIST": "لم يتم العثور على مساعدين، يرجى إنشاء واحد للبدء"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "PANEL_TITLE": "ابدأ مع Copilot",
+ "KICK_OFF_MESSAGE": "هل تحتاج إلى ملخص سريع، ترغب في مراجعة المحادثات السابقة، أو صياغة رد أفضل؟ Copilot هنا لتسريع الأمور.",
"SEND_MESSAGE": "إرسال الرسالة...",
- "EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
- "LOADER": "Captain is thinking",
+ "EMPTY_MESSAGE": "حدث خطأ أثناء توليد الاستجابة. يرجى المحاولة مرة أخرى.",
+ "LOADER": "يقوم Captain بالتفكير",
"YOU": "أنت",
- "USE": "Use this",
- "RESET": "Reset",
- "SHOW_STEPS": "Show steps",
- "SELECT_ASSISTANT": "Select Assistant",
+ "USE": "استخدام هذا",
+ "RESET": "إعادة تعيين",
+ "SHOW_STEPS": "عرض الخطوات",
+ "SELECT_ASSISTANT": "اختر المساعد",
"PROMPTS": {
"SUMMARIZE": {
- "LABEL": "Summarize this conversation",
- "CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
+ "LABEL": "لخص هذه المحادثة",
+ "CONTENT": "لخص النقاط الرئيسية التي نوقشت بين العميل ووكيل الدعم، بما في ذلك مخاوف العميل، أسئلته، والحلول أو الردود المقدمة من الوكيل."
},
"SUGGEST": {
- "LABEL": "Suggest an answer",
- "CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
+ "LABEL": "اقترح إجابة",
+ "CONTENT": "حلل استفسار العميل وقم بصياغة رد يعالج مخاوفه أو أسئلته بفعالية. تأكد من أن الرد واضح، موجز، ويوفر معلومات مفيدة."
},
"RATE": {
- "LABEL": "Rate this conversation",
- "CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
+ "LABEL": "قم بتقييم هذه المحادثة",
+ "CONTENT": "راجع المحادثة لترى مدى تلبيتها لاحتياجات العميل. شارك تقييمًا من 5 بناءً على النغمة، الوضوح، والفعالية."
},
"HIGH_PRIORITY": {
- "LABEL": "High priority conversations",
- "CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
+ "LABEL": "المحادثات ذات الأولوية العالية",
+ "CONTENT": "اعطني ملخصًا لجميع المحادثات المفتوحة ذات الأولوية العالية. تضمّن معرف المحادثة، اسم العميل (إن وُجد)، محتوى آخر رسالة، والوكيل المعين. قم بالتجميع حسب الحالة إذا كان ذلك مناسبًا."
},
"LIST_CONTACTS": {
- "LABEL": "List contacts",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "LABEL": "قائمة جهات الاتصال",
+ "CONTENT": "اعرض لي قائمة بأفضل 10 جهات اتصال. تضمّن الاسم، البريد الإلكتروني أو رقم الهاتف (إن وُجد)، آخر وقت مشاهدة، العلامات (إن وجدت)."
}
}
},
"PLAYGROUND": {
"USER": "أنت",
- "ASSISTANT": "Assistant",
+ "ASSISTANT": "مساعد",
"MESSAGE_PLACEHOLDER": "أكتب رسالتك...",
- "HEADER": "Playground",
- "DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
- "CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
+ "HEADER": "ساحة اللعب",
+ "DESCRIPTION": "استخدم هذه الساحة لإرسال رسائل إلى مساعدك والتحقق مما إذا كان يرد بدقة وسرعة وبالنغمة التي تتوقعها.",
+ "CREDIT_NOTE": "الرسائل المرسلة هنا ستُحتسب ضمن رصيد Captain الخاص بك."
},
"PAYWALL": {
- "TITLE": "Upgrade to use Captain AI",
- "AVAILABLE_ON": "Captain is not available on the free plan.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "TITLE": "قم بالترقية لاستخدام Captain AI",
+ "AVAILABLE_ON": "Captain غير متاح على الخطة المجانية.",
+ "UPGRADE_PROMPT": "قم بترقية خطتك للحصول على الوصول إلى مساعدينا، وcopilot، والمزيد.",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
"AVAILABLE_ON": "ولا يتوفر الكابتن AI إلا في خطط المؤسسة.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "UPGRADE_PROMPT": "قم بترقية خطتك للحصول على الوصول إلى مساعدينا، وcopilot، والمزيد.",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"BANNER": {
- "RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
- "DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
+ "RESPONSES": "لقد استخدمت أكثر من 80٪ من حد الاستجابات الخاص بك. للاستمرار في استخدام Captain AI، يرجى الترقية.",
+ "DOCUMENTS": "تم الوصول إلى حد المستندات. قم بالترقية للاستمرار في استخدام Captain AI."
},
"FORM": {
"CANCEL": "إلغاء",
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
+ "SELECTED": "{count} selected",
+ "SELECT_ALL": "Select all ({count})",
+ "UNSELECT_ALL": "Unselect all ({count})",
+ "BULK_DELETE_BUTTON": "حذف",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Yes, delete all",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "الوصف",
diff --git a/app/javascript/dashboard/i18n/locale/az/helpCenter.json b/app/javascript/dashboard/i18n/locale/az/helpCenter.json
index 0b3e37374..fc6f3c86a 100644
--- a/app/javascript/dashboard/i18n/locale/az/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/az/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Dil portaldan uğurla silindi",
"ERROR_MESSAGE": "Dili portaldan silmək mümkün olmadı. Yenidən cəhd edin."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Default",
+ "DRAFT": "Qaralama",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Delete"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Select locale..."
},
+ "STATUS": {
+ "LABEL": "Status",
+ "OPTIONS": {
+ "LIVE": "Yayımlanıb",
+ "DRAFT": "Qaralama"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Locale added successfully",
"ERROR_MESSAGE": "Unable to add locale. Try again."
diff --git a/app/javascript/dashboard/i18n/locale/az/integrations.json b/app/javascript/dashboard/i18n/locale/az/integrations.json
index 29fef96fe..8fb31cd00 100644
--- a/app/javascript/dashboard/i18n/locale/az/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/az/integrations.json
@@ -3,18 +3,18 @@
"SHOPIFY": {
"HEADER": "Shopify",
"DELETE": {
- "TITLE": "Delete Shopify Integration",
- "MESSAGE": "Are you sure you want to delete the Shopify integration?"
+ "TITLE": "Shopify İnteqrasiyasını Sil",
+ "MESSAGE": "Shopify inteqrasiyasını silmək istədiyinizə əminsiniz?"
},
"STORE_URL": {
- "TITLE": "Connect Shopify Store",
- "LABEL": "Store URL",
+ "TITLE": "Shopify Mağazasını Bağla",
+ "LABEL": "Mağaza URL-i",
"PLACEHOLDER": "your-store.myshopify.com",
- "HELP": "Enter your Shopify store's myshopify.com URL",
+ "HELP": "Shopify mağazanızın myshopify.com URL-ni daxil edin",
"CANCEL": "Ləğv et",
- "SUBMIT": "Connect Store"
+ "SUBMIT": "Mağazanı Bağla"
},
- "ERROR": "There was an error connecting to Shopify. Please try again or contact support if the issue persists."
+ "ERROR": "Shopify-a qoşularkən xəta baş verdi. Zəhmət olmasa yenidən cəhd edin və ya problem davam edərsə dəstək xidməti ilə əlaqə saxlayın."
},
"HEADER": "İnteqrasiyalar",
"DESCRIPTION": "Chatwoot komandamızın səmərəliliyini artırmaq üçün bir neçə alət və xidmətlə inteqrasiya olunur. Sevdiyiniz tətbiqləri konfiqurasiya etmək üçün aşağıdakı siyahını araşdırın.",
@@ -126,7 +126,7 @@
},
"HELP_TEXT": {
"TITLE": "Slack inteqrasiyasından necə istifadə etmək olar?",
- "BODY": "With this integration, all of your incoming conversations will be synced to the ***{selectedChannelName}*** channel in your Slack workspace. You can manage all your customer conversations right within the channel and never miss a message.\n\nHere are the main features of the integration:\n\n**Respond to conversations from within Slack:** To respond to a conversation in the ***{selectedChannelName}*** Slack channel, simply type out your message and send it as a thread. This will create a response back to the customer through Chatwoot. It's that simple!\n\n **Create private notes:** If you want to create private notes instead of replies, start your message with ***`note:`***. This ensures that your message is kept private and won't be visible to the customer.\n\n**Associate an agent profile:** If the person who replied on Slack has an agent profile in Chatwoot under the same email, the replies will be associated with that agent profile automatically. This means you can easily track who said what and when. On the other hand, when the replier doesn't have an associated agent profile, the replies will appear from the bot profile to the customer.",
+ "BODY": "Bu inteqrasiya ilə bütün gələn söhbətləriniz Slack iş sahənizdəki ***{selectedChannelName}*** kanalına sinxronlaşdırılacaq. Müştəri söhbətlərinizə birbaşa həmin kanalda nəzarət edə və heç bir mesajı qaçırmazsınız.\n\nİnteqrasiyanın əsas xüsusiyyətləri bunlardır:\n\n**Slack daxilində söhbətlərə cavab verin:** ***{selectedChannelName}*** Slack kanalında söhbətə cavab vermək üçün sadəcə mesajınızı yazıb thread kimi göndərin. Bu, Chatwoot vasitəsilə müştəriyə cavab göndərəcək. Çox sadədir!\n\n**Şəxsi qeydlər yaradın:** Əgər cavab əvəzinə şəxsi qeyd əlavə etmək istəyirsinizsə, mesajınıza ***`note:`*** ilə başlayın. Bu halda mesajınız şəxsi qalacaq və müştəriyə görünməyəcək.\n\n**Agent profilini əlaqələndirin:** Əgər Slack-də cavab verən şəxsin Chatwoot-da eyni e-poçt ünvanı ilə agent profili varsa, cavablar avtomatik olaraq həmin agent profili ilə əlaqələndiriləcək. Bu, kim nə vaxt nə yazıb asanlıqla izləməyə imkan verir. Əks halda, agent profili əlaqələndirilməyibsə, cavablar müştəriyə bot profili adından göndəriləcək.",
"SELECTED": "seçilmiş"
},
"SELECT_CHANNEL": {
@@ -364,389 +364,400 @@
"SUCCESS": "Məsələ uğurla bağlantısı kəsildi",
"ERROR": "Məsələnin bağlantısını kəsməkdə xəta baş verdi, zəhmət olmasa yenidən cəhd edin"
},
- "NO_LINKED_ISSUES": "No linked issues found",
+ "NO_LINKED_ISSUES": "Bağlı məsələ tapılmadı",
"DELETE": {
- "TITLE": "Are you sure you want to delete the integration?",
- "MESSAGE": "Are you sure you want to delete the integration?",
- "CONFIRM": "Yes, delete",
+ "TITLE": "İnteqrasiyanı silmək istədiyinizə əminsiniz?",
+ "MESSAGE": "İnteqrasiyanı silmək istədiyinizə əminsiniz?",
+ "CONFIRM": "Bəli, sil",
"CANCEL": "Ləğv et"
},
"CTA": {
- "TITLE": "Connect to Linear",
- "AGENT_DESCRIPTION": "Linear workspace is not connected. Request your administrator to connect a workspace to use this integration.",
- "DESCRIPTION": "Linear workspace is not connected. Click the button below to connect your workspace to use this integration.",
- "BUTTON_TEXT": "Connect Linear workspace"
+ "TITLE": "Linear-a qoşul",
+ "AGENT_DESCRIPTION": "Linear iş sahəsi qoşulmayıb. Bu inteqrasiyadan istifadə etmək üçün administratorunuzdan bir iş sahəsi qoşmasını xahiş edin.",
+ "DESCRIPTION": "Linear iş sahəsi qoşulmayıb. Bu inteqrasiyadan istifadə etmək üçün iş sahənizi qoşmaq məqsədilə aşağıdakı düyməyə klikləyin.",
+ "BUTTON_TEXT": "Linear iş sahəsini qoşun"
}
},
"NOTION": {
"HEADER": "Notion",
"DELETE": {
- "TITLE": "Are you sure you want to delete the Notion integration?",
+ "TITLE": "Notion inteqrasiyasını silmək istədiyinizə əminsiniz?",
"MESSAGE": "Bu inteqrasiyanı silmək Notion iş sahənizə girişinizi itirəcək və bütün əlaqəli funksionallığı dayandıracaq.",
- "CONFIRM": "Yes, delete",
+ "CONFIRM": "Bəli, sil",
"CANCEL": "Ləğv et"
}
}
},
"CAPTAIN": {
- "NAME": "Kapitan",
- "HEADER_KNOW_MORE": "Daha çox məlumat",
+ "NAME": "Captain",
+ "HEADER_KNOW_MORE": "Daha ətraflı",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
+ "ASSISTANTS": "Köməkçilər",
+ "SWITCH_ASSISTANT": "Köməkçilər arasında keçid edin",
"NEW_ASSISTANT": "Köməkçi yaradın",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "EMPTY_LIST": "Assistent tapılmadı, başlamaq üçün birini yaradın"
},
"COPILOT": {
"TITLE": "Copilot",
- "TRY_THESE_PROMPTS": "Bu təklifləri sınayın",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
- "SEND_MESSAGE": "Mesaj göndər...",
- "EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
+ "TRY_THESE_PROMPTS": "Bu təklifləri yoxlayın",
+ "PANEL_TITLE": "Copilot ilə başlayın",
+ "KICK_OFF_MESSAGE": "Qısa xülasəyə ehtiyacınız var, əvvəlki söhbətlərə baxmaq istəyirsiniz, yoxsa daha yaxşı cavab hazırlamaq istəyirsiniz? Copilot işləri sürətləndirmək üçün buradadır.",
+ "SEND_MESSAGE": "Mesaj göndərin...",
+ "EMPTY_MESSAGE": "Cavab yaradılarkən xəta baş verdi. Zəhmət olmasa yenidən cəhd edin.",
"LOADER": "Captain düşünür",
"YOU": "Siz",
"USE": "Bunu istifadə et",
- "RESET": "Reset",
+ "RESET": "Sıfırla",
"SHOW_STEPS": "Addımları göstər",
- "SELECT_ASSISTANT": "Select Assistant",
+ "SELECT_ASSISTANT": "Köməkçini seçin",
"PROMPTS": {
"SUMMARIZE": {
- "LABEL": "Summarize this conversation",
- "CONTENT": "Müştəri ilə dəstək agenti arasında müzakirə olunan əsas məqamları ümumiləşdirin, o cümlədən müştərinin narahatlıqları, sualları və dəstək agentinin təqdim etdiyi həllər və ya cavablar"
+ "LABEL": "Bu söhbəti xülasə et",
+ "CONTENT": "Müştəri və dəstək agenti arasında müzakirə olunan əsas məqamları xülasə et, müştərinin narahatlıqları, sualları və agentin verdiyi həll və ya cavabları daxil et"
},
"SUGGEST": {
- "LABEL": "Cavab təklif edin",
- "CONTENT": "Müştərinin sorğusunu təhlil edin və narahatlıqlarını və ya suallarını effektiv şəkildə əhatə edən cavab layihələndirin. Cavabın aydın, qısa və faydalı məlumat verdiyinə əmin olun."
+ "LABEL": "Cavab təklif et",
+ "CONTENT": "Müştərinin sorğusunu analiz et və onların narahatlıqlarını və ya suallarını effektiv şəkildə cavablandıran bir cavab hazırla. Cavabın aydın, qısa və faydalı məlumat verdiyinə əmin ol."
},
"RATE": {
- "LABEL": "Rate this conversation",
- "CONTENT": "Müştərinin ehtiyaclarını nə dərəcədə qarşıladığını görmək üçün söhbəti nəzərdən keçirin. Ton, aydınlıq və effektivlik əsasında 5 ballıq qiymətləndirmə paylaşın."
+ "LABEL": "Bu söhbəti qiymətləndir",
+ "CONTENT": "Söhbəti nəzərdən keçir və müştərinin ehtiyaclarını nə dərəcədə qarşıladığını yoxla. Ton, aydınlıq və effektivliyə əsaslanaraq 5 üzərindən qiymət ver."
},
"HIGH_PRIORITY": {
- "LABEL": "High priority conversations",
- "CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
+ "LABEL": "Yüksək prioritetli söhbətlər",
+ "CONTENT": "Bütün yüksək prioritetli açıq söhbətlərin xülasəsini ver. Söhbət ID-si, müştərinin adı (əgər varsa), son mesajın məzmunu və təyin olunmuş agenti daxil et. Əgər uyğun olarsa, statusa görə qrupla."
},
"LIST_CONTACTS": {
- "LABEL": "List contacts",
- "CONTENT": "Mənə ən yaxşı 10 əlaqə siyahısını göstərin. Ad, e-poçt və ya telefon nömrəsi (mövcuddursa), son görülmə vaxtı, etiketlər (əgər varsa) daxil edin."
+ "LABEL": "Əlaqələri siyahıla",
+ "CONTENT": "Ən yaxşı 10 əlaqənin siyahısını göstər. Ad, e-poçt və ya telefon nömrəsi (əgər varsa), son görülmə vaxtı, etiketlər (əgər varsa) daxil et."
}
}
},
"PLAYGROUND": {
"USER": "Siz",
- "ASSISTANT": "Köməkçi",
- "MESSAGE_PLACEHOLDER": "Type your message...",
- "HEADER": "Oyun Sahəsi",
- "DESCRIPTION": "Bu meydançadan köməkçinizə mesajlar göndərmək və onun dəqiq, sürətli və gözlədiyiniz tonda cavab verib-vermədiyini yoxlamaq üçün istifadə edin.",
- "CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
+ "ASSISTANT": "Assistent",
+ "MESSAGE_PLACEHOLDER": "Mesajınızı yazın...",
+ "HEADER": "Sınaq sahəsi",
+ "DESCRIPTION": "Bu sınaq sahəsində köməkçinizə mesaj göndərin və cavabların dəqiq, sürətli və istədiyiniz tonda olub-olmadığını yoxlayın.",
+ "CREDIT_NOTE": "Burada göndərilən mesajlar Captain kreditlərinizdən çıxılacaq."
},
"PAYWALL": {
- "TITLE": "Upgrade to use Captain AI",
- "AVAILABLE_ON": "Captain is not available on the free plan.",
- "UPGRADE_PROMPT": "Köməkçilərimizə, copilot və daha çoxuna giriş üçün planınızı yüksəldin.",
- "UPGRADE_NOW": "Upgrade now",
- "CANCEL_ANYTIME": "You can change or cancel your plan anytime"
+ "TITLE": "Captain AI istifadə etmək üçün yüksəldin",
+ "AVAILABLE_ON": "Captain pulsuz planda mövcud deyil.",
+ "UPGRADE_PROMPT": "Assistentlərimizə, copilot və daha çoxuna çıxış əldə etmək üçün planınızı yüksəldin.",
+ "UPGRADE_NOW": "İndi yüksəlt",
+ "CANCEL_ANYTIME": "Planınızı istənilən vaxt dəyişə və ya ləğv edə bilərsiniz"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
- "UPGRADE_PROMPT": "Köməkçilərimizə, copilot və daha çoxuna giriş üçün planınızı yüksəldin.",
- "ASK_ADMIN": "Please reach out to your administrator for the upgrade."
+ "AVAILABLE_ON": "Captain AI yalnız Enterprise planlarında mövcuddur.",
+ "UPGRADE_PROMPT": "Assistentlərimizə, copilot və daha çoxuna çıxış əldə etmək üçün planınızı yüksəldin.",
+ "ASK_ADMIN": "Təkmilləşdirmə üçün administratorunuzla əlaqə saxlayın."
},
"BANNER": {
- "RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
- "DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
+ "RESPONSES": "Cavab limitinizin 80%-dən çoxunu istifadə etmisiniz. Captain AI-dan istifadə etməyə davam etmək üçün zəhmət olmasa tarifinizi yüksəldin.",
+ "DOCUMENTS": "Sənəd limiti çatdı. Captain AI-dan istifadəni davam etdirmək üçün yüksəldin."
},
"FORM": {
"CANCEL": "Ləğv et",
- "CREATE": "Create",
+ "CREATE": "Yarat",
"EDIT": "Yenilə"
},
"ASSISTANTS": {
- "HEADER": "Assistants",
- "NO_ASSISTANTS_AVAILABLE": "There are no assistants available in your account.",
+ "HEADER": "Köməkçilər",
+ "NO_ASSISTANTS_AVAILABLE": "Hesabınızda heç bir köməkçi yoxdur.",
"ADD_NEW": "Yeni köməkçi yaradın",
"DELETE": {
- "TITLE": "Are you sure to delete the assistant?",
- "DESCRIPTION": "Bu əməliyyat geri dönməzdir. Bu köməkçi silindikdə, o, bütün əlaqəli qutulardan silinəcək və yaradılmış bütün biliklər daimi olaraq silinəcək.",
- "CONFIRM": "Yes, delete",
- "SUCCESS_MESSAGE": "The assistant has been successfully deleted",
- "ERROR_MESSAGE": "There was an error deleting the assistant, please try again."
+ "TITLE": "Assistent silinsin?",
+ "DESCRIPTION": "Bu əməliyyat geri qaytarıla bilməz. Bu assistenti silmək onu bütün bağlı poçt qutularından siləcək və yaradılmış bütün bilikləri daimi olaraq siləcək.",
+ "CONFIRM": "Bəli, sil",
+ "SUCCESS_MESSAGE": "Assistent uğurla silindi",
+ "ERROR_MESSAGE": "Köməkçi silinərkən xəta baş verdi, zəhmət olmasa yenidən cəhd edin."
},
- "FORM_DESCRIPTION": "Fill out the details below to name your assistant, describe its purpose, and specify the product it will support.",
+ "FORM_DESCRIPTION": "Aşağıdakı detalları doldurun: assistentinizin adını, məqsədini və dəstək verəcəyi məhsulu qeyd edin.",
"CREATE": {
- "TITLE": "Köməkçi yaradın",
- "SUCCESS_MESSAGE": "Köməkçi uğurla yaradıldı",
- "ERROR_MESSAGE": "There was an error creating the assistant, please try again."
+ "TITLE": "Assistent yarat",
+ "SUCCESS_MESSAGE": "Assistent uğurla yaradıldı",
+ "ERROR_MESSAGE": "Köməkçi yaradılarkən xəta baş verdi, zəhmət olmasa yenidən cəhd edin."
},
"FORM": {
"UPDATE": "Yenilə",
"SECTIONS": {
"BASIC_INFO": "Əsas Məlumat",
- "SYSTEM_MESSAGES": "System Messages",
- "INSTRUCTIONS": "Instructions",
+ "SYSTEM_MESSAGES": "Sistem Mesajları",
+ "INSTRUCTIONS": "Təlimatlar",
"FEATURES": "Xüsusiyyətlər",
- "TOOLS": "Alətlər "
+ "TOOLS": "Alətlər"
},
"NAME": {
"LABEL": "Ad",
- "PLACEHOLDER": "Köməkçi adını daxil edin",
+ "PLACEHOLDER": "Assistent adını daxil edin",
"ERROR": "Ad tələb olunur"
},
"TEMPERATURE": {
- "LABEL": "Cavabın Temperaturu",
- "DESCRIPTION": "Adjust how creative or restrictive the assistant's responses should be. Lower values produce more focused and deterministic responses, while higher values allow for more creative and varied outputs."
+ "LABEL": "Cavab Temperaturu",
+ "DESCRIPTION": "Assistentin cavablarının nə qədər yaradıcı və ya məhdud olacağını tənzimləyin. Aşağı dəyərlər daha fokuslanmış və deterministik cavablar verir, yüksək dəyərlər isə daha yaradıcı və müxtəlif nəticələr verir."
},
"DESCRIPTION": {
"LABEL": "Təsvir",
- "PLACEHOLDER": "Enter assistant description",
+ "PLACEHOLDER": "Assistent təsvirini daxil edin",
"ERROR": "Təsvir tələb olunur"
},
"PRODUCT_NAME": {
- "LABEL": "Product Name",
+ "LABEL": "Məhsulun Adı",
"PLACEHOLDER": "Məhsul adını daxil edin",
- "ERROR": "The product name is required"
+ "ERROR": "Məhsulun adı tələb olunur"
},
"WELCOME_MESSAGE": {
- "LABEL": "Welcome Message",
- "PLACEHOLDER": "Enter welcome message"
+ "LABEL": "Salamlaşma Mesajı",
+ "PLACEHOLDER": "Salamlaşma mesajını daxil edin"
},
"HANDOFF_MESSAGE": {
- "LABEL": "Handoff Message",
- "PLACEHOLDER": "Enter handoff message"
+ "LABEL": "Transfer Mesajı",
+ "PLACEHOLDER": "Transfer mesajını daxil edin"
},
"RESOLUTION_MESSAGE": {
- "LABEL": "Resolution Message",
- "PLACEHOLDER": "Enter resolution message"
+ "LABEL": "Həll mesajı",
+ "PLACEHOLDER": "Həll mesajını daxil edin"
},
"INSTRUCTIONS": {
- "LABEL": "Instructions",
- "PLACEHOLDER": "Enter instructions for the assistant"
+ "LABEL": "Təlimatlar",
+ "PLACEHOLDER": "Assistent üçün təlimatları daxil edin"
},
"FEATURES": {
"TITLE": "Xüsusiyyətlər",
- "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations",
- "ALLOW_MEMORIES": "Müştəri qarşılıqlı əlaqələrindən əsas detalları yaddaş kimi tutun.",
- "ALLOW_CITATIONS": "Include source citations in responses",
- "ALLOW_CONTACT_ATTRIBUTES": "Allow access to contact information"
+ "ALLOW_CONVERSATION_FAQS": "Həll olunmuş söhbətlərdən FAQ yaradın",
+ "ALLOW_MEMORIES": "Müştəri ilə ünsiyyətdən əsas detalları yadda saxla.",
+ "ALLOW_CITATIONS": "Cavablarda mənbə istinadlarını daxil et",
+ "ALLOW_CONTACT_ATTRIBUTES": "Əlaqə məlumatlarına çıxışa icazə ver"
}
},
"EDIT": {
- "TITLE": "Update the assistant",
- "SUCCESS_MESSAGE": "The assistant has been successfully updated",
- "ERROR_MESSAGE": "There was an error updating the assistant, please try again.",
- "NOT_FOUND": "Could not find the assistant. Please try again."
+ "TITLE": "Assistenti yenilə",
+ "SUCCESS_MESSAGE": "Assistent uğurla yeniləndi",
+ "ERROR_MESSAGE": "Köməkçi yenilənərkən xəta baş verdi, zəhmət olmasa yenidən cəhd edin.",
+ "NOT_FOUND": "Köməkçi tapılmadı. Zəhmət olmasa yenidən cəhd edin."
},
"SETTINGS": {
- "HEADER": "Parametrlər",
+ "HEADER": "Ayarlar",
"BASIC_SETTINGS": {
- "TITLE": "Basic settings",
- "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human."
+ "TITLE": "Əsas ayarlar",
+ "DESCRIPTION": "Assistentin söhbəti bitirərkən və ya insana ötürərkən nə deyəcəyini fərdiləşdirin."
},
"SYSTEM_SETTINGS": {
- "TITLE": "System settings",
- "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human."
+ "TITLE": "Sistem ayarları",
+ "DESCRIPTION": "Assistentin söhbəti bitirərkən və ya insana ötürərkən nə deyəcəyini fərdiləşdirin."
},
"CONTROL_ITEMS": {
- "TITLE": "The Fun Stuff",
- "DESCRIPTION": "Köməkçiyə daha çox nəzarət əlavə edin. (bir az daha vizual, məsələn, hekayə kimi: Sorğu qoruyucusu → ssenarilər → çıxış) İstifadəçini bunlardan istifadə etməyə təşviq edir.",
+ "TITLE": "Əyləncəli Hissə",
+ "DESCRIPTION": "Assistentə daha çox nəzarət əlavə edin. (vizual olaraq bir hekayə kimi: Sorğu məhdudiyyəti → ssenarilər → nəticə) İstifadəçini bunlardan istifadə etməyə təşviq edir.",
"OPTIONS": {
"GUARDRAILS": {
- "TITLE": "Guardrails",
- "DESCRIPTION": "İşləri yolunda saxlayır — yalnız köməkçinizin cavablandırmasını istədiyiniz sual növləri, mövzudan kənar və ya qadağan olunmuş heç nə yoxdur."
+ "TITLE": "Məhdudiyyətlər",
+ "DESCRIPTION": "Hər şeyin nəzarətdə qalmasını təmin edir—assistentinizin yalnız istədiyiniz suallara cavab verməsini təmin edir, mövzudan kənar və ya icazəsiz heç nə yoxdur."
},
"RESPONSE_GUIDELINES": {
"TITLE": "Cavab qaydaları",
- "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?"
+ "DESCRIPTION": "Assistentinizin cavablarının tərzi və quruluşu—aydın və dostcasına? Qısa və yığcam? Ətraflı və rəsmi?"
}
}
},
"DELETE": {
- "TITLE": "Delete Assistant",
- "DESCRIPTION": "Bu əməliyyat geri dönməzdir. Bu köməkçi silindikdə, o, bütün əlaqəli qutulardan silinəcək və yaradılmış bütün biliklər daimi olaraq silinəcək.",
- "BUTTON_TEXT": "Delete {assistantName}"
+ "TITLE": "Assistenti Sil",
+ "DESCRIPTION": "Bu əməliyyat geri qaytarıla bilməz. Bu assistenti silmək onu bütün bağlı poçt qutularından siləcək və yaradılmış bütün bilikləri daimi olaraq siləcək.",
+ "BUTTON_TEXT": "{assistantName} sil"
}
},
"OPTIONS": {
- "EDIT_ASSISTANT": "Edit Assistant",
- "DELETE_ASSISTANT": "Delete Assistant",
- "VIEW_CONNECTED_INBOXES": "Əlaqəli qutuları göstər"
+ "EDIT_ASSISTANT": "Assistenti redaktə et",
+ "DELETE_ASSISTANT": "Assistenti sil",
+ "VIEW_CONNECTED_INBOXES": "Bağlı poçt qutularına bax"
},
"EMPTY_STATE": {
- "TITLE": "Heç bir köməkçi mövcud deyil",
- "SUBTITLE": "Create an assistant to provide quick and accurate responses to your users. It can learn from your help articles and past conversations.",
+ "TITLE": "Assistent yoxdur",
+ "SUBTITLE": "İstifadəçilərinizə sürətli və dəqiq cavablar vermək üçün köməkçi yaradın. O, yardım məqalələrinizdən və əvvəlki söhbətlərdən öyrənə bilər.",
"FEATURE_SPOTLIGHT": {
- "TITLE": "Captain Assistant",
- "NOTE": "Captain Assistant engages directly with customers, learns from your help docs and past conversations, and delivers instant, accurate responses. It handles the initial queries, providing quick resolutions before transferring to an agent when needed."
+ "TITLE": "Captain Assistent",
+ "NOTE": "Captain Assistent birbaşa müştərilərlə ünsiyyət qurur, kömək sənədlərinizdən və keçmiş söhbətlərdən öyrənir və dərhal, dəqiq cavablar verir. O, ilkin sorğuları idarə edir və lazım olduqda agentə ötürür."
}
},
"GUARDRAILS": {
- "TITLE": "Guardrails",
- "DESCRIPTION": "İşləri yolunda saxlayır — yalnız köməkçinizin cavablandırmasını istədiyiniz sual növləri, mövzudan kənar və ya qadağan olunmuş heç nə yoxdur.",
+ "TITLE": "Məhdudiyyətlər",
+ "DESCRIPTION": "Hər şeyin nəzarətdə qalmasını təmin edir—assistentinizin yalnız istədiyiniz suallara cavab verməsini təmin edir, mövzudan kənar və ya icazəsiz heç nə yoxdur.",
"BULK_ACTION": {
"SELECTED": "{count} element seçildi | {count} element seçildi",
- "SELECT_ALL": "Select all ({count})",
- "UNSELECT_ALL": "Hamısının seçimini ləğv et ({count})",
- "BULK_DELETE_BUTTON": "Delete"
+ "SELECT_ALL": "Hamısını seç ({count})",
+ "UNSELECT_ALL": "Hamısını seçmə ({count})",
+ "BULK_DELETE_BUTTON": "Sil"
},
"ADD": {
"SUGGESTED": {
- "TITLE": "Example guardrails",
+ "TITLE": "Məhdudiyyət nümunələri",
"ADD": "Hamısını əlavə et",
"ADD_SINGLE": "Bunu əlavə et",
"SAVE": "Əlavə et və yadda saxla (↵)",
- "PLACEHOLDER": "Type in another guardrail..."
+ "PLACEHOLDER": "Başqa bir məhdudiyyət yazın..."
},
"NEW": {
- "TITLE": "Add a guardrail",
- "CREATE": "Create",
+ "TITLE": "Məhdudiyyət əlavə et",
+ "CREATE": "Yarat",
"CANCEL": "Ləğv et",
- "PLACEHOLDER": "Type in another guardrail...",
- "TEST_ALL": "Test all"
- }
- },
- "LIST": {
- "SEARCH_PLACEHOLDER": "Axtarış..."
- },
- "EMPTY_MESSAGE": "No guardrails found. Create or add examples to begin.",
- "SEARCH_EMPTY_MESSAGE": "No guardrails found for this search.",
- "API": {
- "ADD": {
- "SUCCESS": "Guardrails added successfully",
- "ERROR": "There was an error adding guardrails, please try again."
- },
- "UPDATE": {
- "SUCCESS": "Guardrails updated successfully",
- "ERROR": "There was an error updating guardrails, please try again."
- },
- "DELETE": {
- "SUCCESS": "Guardrails deleted successfully",
- "ERROR": "There was an error deleting guardrails, please try again."
- }
- }
- },
- "RESPONSE_GUIDELINES": {
- "TITLE": "Response Guidelines",
- "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?",
- "BULK_ACTION": {
- "SELECTED": "{count} element seçildi | {count} element seçildi",
- "SELECT_ALL": "Select all ({count})",
- "UNSELECT_ALL": "Hamısının seçimini götür ({count})",
- "BULK_DELETE_BUTTON": "Delete"
- },
- "ADD": {
- "SUGGESTED": {
- "TITLE": "Nümunə cavab qaydaları",
- "ADD": "Hamısını əlavə et",
- "ADD_SINGLE": "Bunu əlavə et",
- "SAVE": "Əlavə et və yadda saxla (↵)",
- "PLACEHOLDER": "Başqa cavab qaydasını yazın..."
- },
- "NEW": {
- "TITLE": "Cavab qaydası əlavə et",
- "CREATE": "Create",
- "CANCEL": "Ləğv et",
- "PLACEHOLDER": "Başqa cavab qaydasını yazın...",
- "TEST_ALL": "Test all"
+ "PLACEHOLDER": "Başqa bir məhdudiyyət yazın...",
+ "TEST_ALL": "Hamısını yoxla"
}
},
"LIST": {
"SEARCH_PLACEHOLDER": "Axtar..."
},
- "EMPTY_MESSAGE": "No response guidelines found. Create or add examples to begin.",
- "SEARCH_EMPTY_MESSAGE": "No response guidelines found for this search.",
+ "EMPTY_MESSAGE": "Məhdudiyyət tapılmadı. Başlamaq üçün yaradın və ya nümunələr əlavə edin.",
+ "SEARCH_EMPTY_MESSAGE": "Axtarış üçün məhdudiyyət tapılmadı.",
"API": {
"ADD": {
- "SUCCESS": "Cavab qaydaları uğurla əlavə edildi",
- "ERROR": "There was an error adding response guidelines, please try again."
+ "SUCCESS": "Məhdudiyyətlər uğurla əlavə olundu",
+ "ERROR": "Məhdudiyyətlər əlavə olunarkən xəta baş verdi, yenidən cəhd edin."
},
"UPDATE": {
- "SUCCESS": "Response Guidelines updated successfully",
- "ERROR": "There was an error updating response guidelines, please try again."
+ "SUCCESS": "Məhdudiyyətlər uğurla yeniləndi",
+ "ERROR": "Məhdudiyyətlər yenilənərkən xəta baş verdi, yenidən cəhd edin."
},
"DELETE": {
- "SUCCESS": "Response Guidelines deleted successfully",
- "ERROR": "There was an error deleting response guidelines, please try again."
+ "SUCCESS": "Məhdudiyyətlər uğurla silindi",
+ "ERROR": "Məhdudiyyətlər silinərkən xəta baş verdi, yenidən cəhd edin."
+ }
+ }
+ },
+ "RESPONSE_GUIDELINES": {
+ "TITLE": "Cavab qaydaları",
+ "DESCRIPTION": "Assistentinizin cavablarının tərzi və quruluşu—aydın və dostcasına? Qısa və yığcam? Ətraflı və rəsmi?",
+ "BULK_ACTION": {
+ "SELECTED": "{count} element seçildi | {count} element seçildi",
+ "SELECT_ALL": "Hamısını seç ({count})",
+ "UNSELECT_ALL": "Hamısını seçmə ({count})",
+ "BULK_DELETE_BUTTON": "Sil"
+ },
+ "ADD": {
+ "SUGGESTED": {
+ "TITLE": "Cavab qaydası nümunələri",
+ "ADD": "Hamısını əlavə et",
+ "ADD_SINGLE": "Bunu əlavə et",
+ "SAVE": "Əlavə et və yadda saxla (↵)",
+ "PLACEHOLDER": "Başqa bir cavab qaydası yazın..."
+ },
+ "NEW": {
+ "TITLE": "Cavab qaydası əlavə et",
+ "CREATE": "Yarat",
+ "CANCEL": "Ləğv et",
+ "PLACEHOLDER": "Başqa bir cavab qaydası yazın...",
+ "TEST_ALL": "Hamısını yoxla"
+ }
+ },
+ "LIST": {
+ "SEARCH_PLACEHOLDER": "Axtar..."
+ },
+ "EMPTY_MESSAGE": "Cavab qaydası tapılmadı. Başlamaq üçün yaradın və ya nümunələr əlavə edin.",
+ "SEARCH_EMPTY_MESSAGE": "Axtarış üçün cavab qaydası tapılmadı.",
+ "API": {
+ "ADD": {
+ "SUCCESS": "Cavab qaydaları uğurla əlavə olundu",
+ "ERROR": "Cavab qaydaları əlavə olunarkən xəta baş verdi, yenidən cəhd edin."
+ },
+ "UPDATE": {
+ "SUCCESS": "Cavab qaydaları uğurla yeniləndi",
+ "ERROR": "Cavab qaydaları yenilənərkən xəta baş verdi, yenidən cəhd edin."
+ },
+ "DELETE": {
+ "SUCCESS": "Cavab qaydaları uğurla silindi",
+ "ERROR": "Cavab qaydaları silinərkən xəta baş verdi, yenidən cəhd edin."
}
}
},
"SCENARIOS": {
- "TITLE": "Scenarios",
- "DESCRIPTION": "Köməkçinizə müəyyən kontekst verin — məsələn, “istifadəçi qaldıqda nə etməli” və ya “geri ödəmə tələbi zamanı necə davranmalı.”",
+ "TITLE": "Ssenarilər",
+ "DESCRIPTION": "Assistentinizə bir az kontekst verin—məsələn, “istifadəçi ilişibsə nə etməli”, ya da “geri qaytarma sorğusu zamanı necə davranmalı.”",
"BULK_ACTION": {
"SELECTED": "{count} element seçildi | {count} element seçildi",
- "SELECT_ALL": "Select all ({count})",
- "UNSELECT_ALL": "Hamısının seçimini ləğv et ({count})",
- "BULK_DELETE_BUTTON": "Delete"
+ "SELECT_ALL": "Hamısını seç ({count})",
+ "UNSELECT_ALL": "Hamısını seçmə ({count})",
+ "BULK_DELETE_BUTTON": "Sil"
},
"ADD": {
"SUGGESTED": {
- "TITLE": "Example scenarios",
+ "TITLE": "Ssenari nümunələri",
"ADD": "Hamısını əlavə et",
"ADD_SINGLE": "Bunu əlavə et",
"TOOLS_USED": "İstifadə olunan alətlər :"
},
"NEW": {
- "CREATE": "Add a scenario",
- "TITLE": "Create a scenario",
+ "CREATE": "Ssenari əlavə et",
+ "TITLE": "Ssenari yarat",
"FORM": {
"TITLE": {
"LABEL": "Başlıq",
- "PLACEHOLDER": "Enter a name for the scenario",
- "ERROR": "Scenario name is required"
+ "PLACEHOLDER": "Ssenari üçün ad daxil edin",
+ "ERROR": "Ssenari adı tələb olunur"
},
"DESCRIPTION": {
"LABEL": "Təsvir",
- "PLACEHOLDER": "Describe how and where this scenario will be used",
- "ERROR": "Scenario description is required"
+ "PLACEHOLDER": "Bu ssenarinin necə və harada istifadə olunacağını təsvir edin",
+ "ERROR": "Ssenari təsviri tələb olunur"
},
"INSTRUCTION": {
"LABEL": "Necə idarə olunacaq",
- "PLACEHOLDER": "Describe how and where this scenario will be handled",
- "ERROR": "Scenario content is required"
+ "PLACEHOLDER": "Bu ssenarinin necə və harada idarə olunacağını təsvir edin",
+ "ERROR": "Ssenari məzmunu tələb olunur"
},
- "CREATE": "Create",
+ "CREATE": "Yarat",
"CANCEL": "Ləğv et"
}
}
},
"UPDATE": {
"CANCEL": "Ləğv et",
- "UPDATE": "Update changes"
+ "UPDATE": "Dəyişiklikləri yenilə"
},
"LIST": {
"SEARCH_PLACEHOLDER": "Axtar..."
},
- "EMPTY_MESSAGE": "No scenarios found. Create or add examples to begin.",
- "SEARCH_EMPTY_MESSAGE": "No scenarios found for this search.",
+ "EMPTY_MESSAGE": "Ssenari tapılmadı. Başlamaq üçün yaradın və ya nümunələr əlavə edin.",
+ "SEARCH_EMPTY_MESSAGE": "Axtarış üçün ssenari tapılmadı.",
"API": {
"ADD": {
- "SUCCESS": "Scenarios added successfully",
- "ERROR": "There was an error adding scenarios, please try again."
+ "SUCCESS": "Ssenarilər uğurla əlavə olundu",
+ "ERROR": "Ssenarilər əlavə olunarkən xəta baş verdi, yenidən cəhd edin."
},
"UPDATE": {
- "SUCCESS": "Scenarios updated successfully",
- "ERROR": "There was an error updating scenarios, please try again."
+ "SUCCESS": "Ssenarilər uğurla yeniləndi",
+ "ERROR": "Ssenarilər yenilənərkən xəta baş verdi, yenidən cəhd edin."
},
"DELETE": {
- "SUCCESS": "Scenarios deleted successfully",
- "ERROR": "There was an error deleting scenarios, please try again."
+ "SUCCESS": "Ssenarilər uğurla silindi",
+ "ERROR": "Ssenarilər silinərkən xəta baş verdi, yenidən cəhd edin."
}
}
}
},
"DOCUMENTS": {
"HEADER": "Sənədlər",
- "ADD_NEW": "Yeni sənəd yaradın",
- "RELATED_RESPONSES": {
- "TITLE": "Related FAQs",
- "DESCRIPTION": "These FAQs are generated directly from the document."
+ "ADD_NEW": "Yeni sənəd yarat",
+ "SELECTED": "{count} seçildi",
+ "SELECT_ALL": "Hamısını seç ({count})",
+ "UNSELECT_ALL": "Hamısını seçmə ({count})",
+ "BULK_DELETE_BUTTON": "Sil",
+ "BULK_DELETE": {
+ "TITLE": "Sənədlər silinsin?",
+ "DESCRIPTION": "Seçilmiş sənədləri silmək istədiyinizə əminsiniz? Bu əməliyyat geri qaytarıla bilməz.",
+ "CONFIRM": "Bəli, hamısını sil",
+ "SUCCESS_MESSAGE": "Sənədlər uğurla silindi",
+ "ERROR_MESSAGE": "Sənədlər silinərkən xəta baş verdi, yenidən cəhd edin."
},
- "FORM_DESCRIPTION": "Sənədi bilik mənbəyi kimi əlavə etmək üçün URL-ni daxil edin və onu əlaqələndirmək istədiyiniz köməkçini seçin.",
+ "RELATED_RESPONSES": {
+ "TITLE": "Əlaqəli FAQ-lar",
+ "DESCRIPTION": "Bu FAQ-lar birbaşa sənəddən yaradılıb."
+ },
+ "FORM_DESCRIPTION": "Sənədi bilik mənbəyi kimi əlavə etmək üçün onun URL-ni daxil edin və əlaqələndiriləcək assistenti seçin.",
"CREATE": {
"TITLE": "Sənəd əlavə et",
"SUCCESS_MESSAGE": "Sənəd uğurla yaradıldı",
- "ERROR_MESSAGE": "There was an error creating the document, please try again."
+ "ERROR_MESSAGE": "Sənəd yaradılarkən xəta baş verdi, zəhmət olmasa yenidən cəhd edin."
},
"FORM": {
"TYPE": {
@@ -756,84 +767,92 @@
},
"URL": {
"LABEL": "URL",
- "PLACEHOLDER": "Sənədin URL ünvanını daxil edin",
- "ERROR": "Zəhmət olmasa sənəd üçün düzgün URL təqdim edin"
+ "PLACEHOLDER": "Sənədin URL-ni daxil edin",
+ "ERROR": "Sənəd üçün düzgün URL daxil edin"
},
"PDF_FILE": {
"LABEL": "PDF Faylı",
- "CHOOSE_FILE": "Choose PDF file",
- "ERROR": "Zəhmət olmasa PDF faylı seçin",
- "HELP_TEXT": "Maximum file size: 10MB",
- "INVALID_TYPE": "Zəhmət olmasa, düzgün PDF faylı seçin",
- "TOO_LARGE": "File size exceeds 10MB limit"
+ "CHOOSE_FILE": "PDF faylını seçin",
+ "ERROR": "PDF fayl seçin",
+ "HELP_TEXT": "Maksimum fayl ölçüsü: 10MB",
+ "INVALID_TYPE": "Düzgün PDF fayl seçin",
+ "TOO_LARGE": "Fayl ölçüsü 10MB limiti aşır"
},
"NAME": {
- "LABEL": "Document Name (Optional)",
+ "LABEL": "Sənədin Adı (İstəyə bağlı)",
"PLACEHOLDER": "Sənəd üçün ad daxil edin"
}
},
"DELETE": {
- "TITLE": "Are you sure to delete the document?",
- "DESCRIPTION": "Bu əməliyyat geri dönməzdir. Bu sənəd silindikdə, yaradılmış bütün biliklər daimi olaraq silinəcək.",
- "CONFIRM": "Yes, delete",
- "SUCCESS_MESSAGE": "The document has been successfully deleted",
- "ERROR_MESSAGE": "There was an error deleting the document, please try again."
+ "TITLE": "Sənəd silinsin?",
+ "DESCRIPTION": "Bu əməliyyat geri qaytarıla bilməz. Bu sənədi silmək bütün yaradılmış bilikləri daimi olaraq siləcək.",
+ "CONFIRM": "Bəli, sil",
+ "SUCCESS_MESSAGE": "Sənəd uğurla silindi",
+ "ERROR_MESSAGE": "Sənəd silinərkən xəta baş verdi, zəhmət olmasa yenidən cəhd edin."
},
"OPTIONS": {
- "VIEW_RELATED_RESPONSES": "Əlaqəli cavabları göstər",
- "DELETE_DOCUMENT": "Delete Document"
+ "VIEW_RELATED_RESPONSES": "Əlaqəli cavablara bax",
+ "DELETE_DOCUMENT": "Sənədi sil"
},
"EMPTY_STATE": {
- "TITLE": "Heç bir sənəd mövcud deyil",
- "SUBTITLE": "Documents are used by your assistant to generate FAQs. You can import documents to provide context for your assistant.",
+ "TITLE": "Sənəd yoxdur",
+ "SUBTITLE": "Sənədlər assistentiniz tərəfindən FAQ-lar yaratmaq üçün istifadə olunur. Assistentinizə kontekst vermək üçün sənədləri əlavə edə bilərsiniz.",
"FEATURE_SPOTLIGHT": {
- "TITLE": "Captain Document",
- "NOTE": "Captain-da sənəd köməkçi üçün bilik mənbəyi kimi xidmət edir. Köməkçi yardım mərkəzinizə və ya bələdçilərinizə qoşularaq məzmunu təhlil edə və müştəri sorğularına dəqiq cavablar verə bilər."
+ "TITLE": "Captain Sənəd",
+ "NOTE": "Captain-da sənəd assistent üçün bilik mənbəyi rolunu oynayır. Kömək mərkəzinizi və ya təlimatları bağlayaraq, Captain məzmunu analiz edə və müştəri sorğuları üçün dəqiq cavablar verə bilər."
}
}
},
"CUSTOM_TOOLS": {
"HEADER": "Alətlər",
- "ADD_NEW": "Yeni alət yaradın",
+ "ADD_NEW": "Yeni alət yarat",
+ "SOFT_LIMIT_WARNING": "10-dan çox alət olması assistentin düzgün alət seçmə ehtimalını azalda bilər. Daha yaxşı nəticə üçün istifadə olunmayan alətləri silməyi düşünün.",
"EMPTY_STATE": {
- "TITLE": "Fərdi alətlər mövcud deyil",
- "SUBTITLE": "Köməkçinizi xarici API-lər və xidmətlərlə qoşmaq üçün xüsusi alətlər yaradın, beləliklə o, məlumatları əldə edə və sizin adınıza əməliyyatlar apara bilsin.",
+ "TITLE": "Xüsusi alət yoxdur",
+ "SUBTITLE": "Assistentinizi xarici API və servislərlə birləşdirmək üçün xüsusi alətlər yaradın, beləliklə məlumat əldə edə və sizin adınızdan əməliyyatlar yerinə yetirə bilər.",
"FEATURE_SPOTLIGHT": {
"TITLE": "Xüsusi Alətlər",
- "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ "NOTE": "Xüsusi alətlər assistentinizə xarici API və servislərlə qarşılıqlı əlaqə qurmağa imkan verir. Məlumat əldə etmək, əməliyyatlar yerinə yetirmək və ya mövcud sistemlərinizlə inteqrasiya etmək üçün alətlər yaradın və assistentin imkanlarını artırın."
}
},
- "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "FORM_DESCRIPTION": "Xüsusi alətinizi xarici API-lərlə birləşdirmək üçün konfiqurasiya edin",
"OPTIONS": {
"EDIT_TOOL": "Aləti redaktə et",
- "DELETE_TOOL": "Delete tool"
+ "DELETE_TOOL": "Aləti sil"
},
"CREATE": {
- "TITLE": "Create Custom Tool",
+ "TITLE": "Xüsusi Alət Yarat",
"SUCCESS_MESSAGE": "Xüsusi alət uğurla yaradıldı",
- "ERROR_MESSAGE": "Xüsusi alət yaratmaq mümkün olmadı"
+ "ERROR_MESSAGE": "Xüsusi alət yaradılmadı"
},
"EDIT": {
"TITLE": "Xüsusi Aləti Redaktə Et",
- "SUCCESS_MESSAGE": "Custom tool updated successfully",
- "ERROR_MESSAGE": "Failed to update custom tool"
+ "SUCCESS_MESSAGE": "Xüsusi alət uğurla yeniləndi",
+ "ERROR_MESSAGE": "Xüsusi alət yenilənmədi"
},
"DELETE": {
- "TITLE": "Delete Custom Tool",
- "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
- "CONFIRM": "Yes, delete",
- "SUCCESS_MESSAGE": "Custom tool deleted successfully",
- "ERROR_MESSAGE": "Xüsusi aləti silmək mümkün olmadı"
+ "TITLE": "Xüsusi Aləti Sil",
+ "DESCRIPTION": "Bu xüsusi aləti silmək istədiyinizə əminsiniz? Bu əməliyyat geri qaytarıla bilməz.",
+ "CONFIRM": "Bəli, sil",
+ "SUCCESS_MESSAGE": "Xüsusi alət uğurla silindi",
+ "ERROR_MESSAGE": "Xüsusi alət silinmədi"
+ },
+ "TEST": {
+ "BUTTON": "Bağlantını yoxla",
+ "SUCCESS": "Endpoint HTTP {status} qaytardı",
+ "ERROR": "Bağlantı uğursuz oldu",
+ "DISABLED_HINT": "Test yalnız şablonsuz və ya sorğu gövdəsi olmayan endpoint-lər üçün mümkündür."
},
"FORM": {
"TITLE": {
- "LABEL": "Tool Name",
- "PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "LABEL": "Alətin Adı",
+ "PLACEHOLDER": "Sifariş axtarışı",
+ "ERROR": "Alət adı tələb olunur",
+ "MAX_LENGTH_ERROR": "Alət adı maksimum {max} simvol olmalıdır"
},
"DESCRIPTION": {
"LABEL": "Təsvir",
- "PLACEHOLDER": "Looks up order details by order ID"
+ "PLACEHOLDER": "Sifariş ID-si ilə sifariş detalları axtarılır"
},
"HTTP_METHOD": {
"LABEL": "Metod"
@@ -844,7 +863,7 @@
"ERROR": "Düzgün URL tələb olunur"
},
"AUTH_TYPE": {
- "LABEL": "Authentication Type"
+ "LABEL": "Avtorizasiya növü"
},
"AUTH_TYPES": {
"NONE": "Heç biri",
@@ -854,23 +873,23 @@
},
"AUTH_CONFIG": {
"BEARER_TOKEN": "Bearer Token",
- "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
- "USERNAME": "Username",
+ "BEARER_TOKEN_PLACEHOLDER": "Bearer tokeninizi daxil edin",
+ "USERNAME": "İstifadəçi adı",
"USERNAME_PLACEHOLDER": "İstifadəçi adını daxil edin",
- "PASSWORD": "Password",
- "PASSWORD_PLACEHOLDER": "Enter password",
- "API_KEY": "Header Name",
+ "PASSWORD": "Şifrə",
+ "PASSWORD_PLACEHOLDER": "Şifrəni daxil edin",
+ "API_KEY": "Başlıq Adı",
"API_KEY_PLACEHOLDER": "X-API-Key",
- "API_VALUE": "Başlıq dəyəri",
+ "API_VALUE": "Başlıq Dəyəri",
"API_VALUE_PLACEHOLDER": "API açar dəyərini daxil edin"
},
"PARAMETERS": {
- "LABEL": "Parameters",
- "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ "LABEL": "Parametrlər",
+ "HELP_TEXT": "İstifadəçi sorğularından çıxarılacaq parametrləri müəyyən edin"
},
- "ADD_PARAMETER": "Add Parameter",
+ "ADD_PARAMETER": "Parametr əlavə et",
"PARAM_NAME": {
- "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ "PLACEHOLDER": "Parametr adı (məs., order_id)"
},
"PARAM_TYPE": {
"PLACEHOLDER": "Növ"
@@ -883,139 +902,139 @@
"OBJECT": "Obyekt"
},
"PARAM_DESCRIPTION": {
- "PLACEHOLDER": "Description of the parameter"
+ "PLACEHOLDER": "Parametrin təsviri"
},
"PARAM_REQUIRED": {
"LABEL": "Tələb olunur"
},
"REQUEST_TEMPLATE": {
- "LABEL": "Sorğu Bədəninin Şablonu (İxtiyari)",
+ "LABEL": "Sorğu Gövdəsi Şablonu (İstəyə bağlı)",
"PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
},
"RESPONSE_TEMPLATE": {
- "LABEL": "Response Template (Optional)",
- "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ "LABEL": "Cavab Şablonu (İstəyə bağlı)",
+ "PLACEHOLDER": "Sifariş {'{{'} order_id {'}}'} statusu: {'{{'} status {'}}'}"
},
"ERRORS": {
- "PARAM_NAME_REQUIRED": "Parameter name is required"
+ "PARAM_NAME_REQUIRED": "Parametr adı tələb olunur"
}
}
},
"RESPONSES": {
- "HEADER": "Tez-tez verilən suallar",
- "PENDING_FAQS": "Gözləyən tez-tez verilən suallar",
- "ADD_NEW": "Yeni FAQ yaradın",
+ "HEADER": "FAQ-lar",
+ "PENDING_FAQS": "Gözləyən FAQ-lar",
+ "ADD_NEW": "Yeni FAQ yarat",
"DOCUMENTABLE": {
"CONVERSATION": "Söhbət #{id}"
},
"SELECTED": "{count} seçildi",
- "SELECT_ALL": "Select all ({count})",
- "UNSELECT_ALL": "Hamısının seçimini götür ({count})",
- "SEARCH_PLACEHOLDER": "Search FAQs...",
- "BULK_APPROVE_BUTTON": "Approve",
- "BULK_DELETE_BUTTON": "Delete",
+ "SELECT_ALL": "Hamısını seç ({count})",
+ "UNSELECT_ALL": "Hamısını seçmə ({count})",
+ "SEARCH_PLACEHOLDER": "FAQ-larda axtar...",
+ "BULK_APPROVE_BUTTON": "Təsdiqlə",
+ "BULK_DELETE_BUTTON": "Sil",
"BULK_APPROVE": {
- "SUCCESS_MESSAGE": "FAQs approved successfully",
- "ERROR_MESSAGE": "There was an error approving the FAQs, please try again."
+ "SUCCESS_MESSAGE": "FAQ-lar uğurla təsdiqləndi",
+ "ERROR_MESSAGE": "FAQ-lar təsdiqlənərkən xəta baş verdi, zəhmət olmasa yenidən cəhd edin."
},
"BULK_DELETE": {
- "TITLE": "Tez-tez verilən sualları silmək?",
- "DESCRIPTION": "Are you sure you want to delete the selected FAQs? This action cannot be undone.",
- "CONFIRM": "Yes, delete all",
- "SUCCESS_MESSAGE": "FAQs deleted successfully",
- "ERROR_MESSAGE": "There was an error deleting the FAQs, please try again."
+ "TITLE": "FAQ-lar silinsin?",
+ "DESCRIPTION": "Seçilmiş FAQ-ları silmək istədiyinizə əminsiniz? Bu əməliyyat geri qaytarıla bilməz.",
+ "CONFIRM": "Bəli, hamısını sil",
+ "SUCCESS_MESSAGE": "FAQ-lar uğurla silindi",
+ "ERROR_MESSAGE": "FAQ-lar silinərkən xəta baş verdi, zəhmət olmasa yenidən cəhd edin."
},
"DELETE": {
- "TITLE": "Are you sure to delete the FAQ?",
+ "TITLE": "FAQ silinsin?",
"DESCRIPTION": "",
- "CONFIRM": "Yes, delete",
- "SUCCESS_MESSAGE": "FAQ deleted successfully",
- "ERROR_MESSAGE": "There was an error deleting the FAQ, please try again."
+ "CONFIRM": "Bəli, sil",
+ "SUCCESS_MESSAGE": "FAQ uğurla silindi",
+ "ERROR_MESSAGE": "FAQ silinərkən xəta baş verdi, zəhmət olmasa yenidən cəhd edin."
},
"FILTER": {
- "ASSISTANT": "Köməkçi: {selected}",
- "STATUS": "Vəziyyət: {selected}",
+ "ASSISTANT": "Assistent: {selected}",
+ "STATUS": "Status: {selected}",
"ALL_ASSISTANTS": "Hamısı"
},
"STATUS": {
- "TITLE": "Vəziyyət",
+ "TITLE": "Status",
"PENDING": "Gözləyir",
"APPROVED": "Təsdiqlənib",
"ALL": "Hamısı"
},
"PENDING_BANNER": {
- "TITLE": "Captain has found some FAQs your customers were looking for.",
- "ACTION": "Nəzərdən keçirmək üçün buraya klikləyin"
+ "TITLE": "Captain müştərilərinizin axtardığı bəzi FAQ-ları tapdı.",
+ "ACTION": "Baxmaq üçün bura klikləyin"
},
- "FORM_DESCRIPTION": "Add a question and its corresponding answer to the knowledge base and select the assistant it should be associated with.",
+ "FORM_DESCRIPTION": "Bilik bazasına sual və ona uyğun cavabı əlavə edin, sonra onun əlaqələndiriləcəyi köməkçini seçin.",
"CREATE": {
- "TITLE": "Tez-tez verilən sual əlavə et",
- "SUCCESS_MESSAGE": "Cavab uğurla əlavə edildi.",
- "ERROR_MESSAGE": "Cavab əlavə edilərkən xəta baş verdi. Zəhmət olmasa, yenidən cəhd edin."
+ "TITLE": "FAQ əlavə et",
+ "SUCCESS_MESSAGE": "Cavab uğurla əlavə olundu.",
+ "ERROR_MESSAGE": "Cavab əlavə olunarkən xəta baş verdi. Yenidən cəhd edin."
},
"FORM": {
"QUESTION": {
"LABEL": "Sual",
"PLACEHOLDER": "Sualı buraya daxil edin",
- "ERROR": "Zəhmət olmasa, düzgün sual daxil edin."
+ "ERROR": "Düzgün sual daxil edin."
},
"ANSWER": {
"LABEL": "Cavab",
"PLACEHOLDER": "Cavabı buraya daxil edin",
- "ERROR": "Zəhmət olmasa, düzgün cavab daxil edin."
+ "ERROR": "Düzgün cavab daxil edin."
}
},
"EDIT": {
- "TITLE": "Update the FAQ",
- "SUCCESS_MESSAGE": "The FAQ has been successfully updated",
- "ERROR_MESSAGE": "There was an error updating the FAQ, please try again",
- "APPROVE_SUCCESS_MESSAGE": "The FAQ was marked as approved"
+ "TITLE": "FAQ-ı yenilə",
+ "SUCCESS_MESSAGE": "FAQ uğurla yeniləndi",
+ "ERROR_MESSAGE": "FAQ yenilənərkən xəta baş verdi, zəhmət olmasa yenidən cəhd edin.",
+ "APPROVE_SUCCESS_MESSAGE": "FAQ təsdiqləndi"
},
"OPTIONS": {
- "APPROVE": "Approve",
+ "APPROVE": "Təsdiqlə",
"EDIT_RESPONSE": "Redaktə et",
- "DELETE_RESPONSE": "Delete"
+ "DELETE_RESPONSE": "Sil"
},
"EMPTY_STATE": {
- "TITLE": "No FAQs Found",
- "NO_PENDING_TITLE": "Yoxlanılacaq daha çox gözləyən FAQ yoxdur",
- "SUBTITLE": "FAQs help your assistant provide quick and accurate answers to questions from your customers. They can be generated automatically from your content or can be added manually.",
- "CLEAR_SEARCH": "Clear active filters",
+ "TITLE": "FAQ tapılmadı",
+ "NO_PENDING_TITLE": "Baxılacaq başqa gözləyən FAQ yoxdur",
+ "SUBTITLE": "FAQ-lar köməkçinizə müştərilərinizdən gələn suallara sürətli və dəqiq cavablar verməyə kömək edir. Onlar məzmununuzdan avtomatik yaradına və ya əl ilə əlavə edilə bilər.",
+ "CLEAR_SEARCH": "Aktiv filtrləri təmizlə",
"FEATURE_SPOTLIGHT": {
"TITLE": "Captain FAQ",
- "NOTE": "Captain FAQ-ları ümumi müştəri suallarını aşkar edir — bilik bazanızda olmayan və ya tez-tez verilən — və dəstəyi yaxşılaşdırmaq üçün müvafiq FAQ-lar yaradır. Hər təklifi nəzərdən keçirə və təsdiqləyib-təsdiqləməməyə qərar verə bilərsiniz."
+ "NOTE": "Captain FAQ tez-tez verilən və ya bilik bazasında olmayan müştəri suallarını aşkar edir və uyğun FAQ-lar yaradır. Hər təklifi nəzərdən keçirə və təsdiqləyə və ya rədd edə bilərsiniz."
}
}
},
"INBOXES": {
- "HEADER": "Qoşulmuş poçt qutuları",
- "ADD_NEW": "Yeni qutu qoşun",
+ "HEADER": "Bağlı Poçt Qutuları",
+ "ADD_NEW": "Yeni gələn qutu qoşun",
"OPTIONS": {
- "DISCONNECT": "Disconnect"
+ "DISCONNECT": "Bağlantını kəs"
},
"DELETE": {
- "TITLE": "Are you sure to disconnect the inbox?",
+ "TITLE": "Gələn qutunu ayırmaq istədiyinizə əminsiniz?",
"DESCRIPTION": "",
- "CONFIRM": "Yes, delete",
- "SUCCESS_MESSAGE": "Qutu uğurla qoşulması kəsildi.",
- "ERROR_MESSAGE": "There was an error disconnecting the inbox, please try again."
+ "CONFIRM": "Bəli, sil",
+ "SUCCESS_MESSAGE": "Poçt qutusu uğurla bağlantıdan çıxarıldı.",
+ "ERROR_MESSAGE": "Gələn qutu ayrılarkən xəta baş verdi, zəhmət olmasa yenidən cəhd edin."
},
- "FORM_DESCRIPTION": "Köməkçi ilə əlaqələndirmək üçün qutu seçin.",
+ "FORM_DESCRIPTION": "Köməkçi ilə əlaqələndirmək üçün gələn qutunu seçin.",
"CREATE": {
- "TITLE": "Qutu qoşun",
- "SUCCESS_MESSAGE": "Qutu uğurla qoşuldu.",
- "ERROR_MESSAGE": "An error occurred while connecting the inbox. Please try again."
+ "TITLE": "Poçt qutusu qoş",
+ "SUCCESS_MESSAGE": "Poçt qutusu uğurla qoşuldu.",
+ "ERROR_MESSAGE": "Gələn qutu qoşularkən xəta baş verdi. Zəhmət olmasa yenidən cəhd edin."
},
"FORM": {
"INBOX": {
- "LABEL": "Qutu",
- "PLACEHOLDER": "Choose the inbox to deploy the assistant.",
- "ERROR": "Qutu seçimi tələb olunur."
+ "LABEL": "Gələn qutu",
+ "PLACEHOLDER": "Köməkçini yerləşdirmək üçün gələn qutunu seçin.",
+ "ERROR": "Poçt qutusu seçimi tələb olunur."
}
},
"EMPTY_STATE": {
- "TITLE": "Əlaqəli qutular tapılmadı",
- "SUBTITLE": "Qutu qoşmaq köməkçiyə müştərilərinizdən gələn ilkin sualları cavablandırmağa və onları sizə yönləndirmədən əvvəl idarə etməyə imkan verir."
+ "TITLE": "Bağlı poçt qutusu yoxdur",
+ "SUBTITLE": "Poçt qutusu qoşmaq assistentin müştərilərinizin ilkin suallarını idarə etməsinə imkan verir və sonra sizi işə cəlb edir."
}
}
}
diff --git a/app/javascript/dashboard/i18n/locale/bg/conversation.json b/app/javascript/dashboard/i18n/locale/bg/conversation.json
index d655068da..4661db64e 100644
--- a/app/javascript/dashboard/i18n/locale/bg/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/bg/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Message signature is not configured, please configure it in profile settings.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "Дайте на copilot допълнителни инструкции или питайте нещо друго... Натиснете enter, за да изпратите последващо съобщение",
"CLICK_HERE": "Click here to update",
"WHATSAPP_TEMPLATES": "Whatsapp Templates"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Drag and drop here to attach",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot мисли",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Add bcc",
diff --git a/app/javascript/dashboard/i18n/locale/bg/helpCenter.json b/app/javascript/dashboard/i18n/locale/bg/helpCenter.json
index af512d278..796d72853 100644
--- a/app/javascript/dashboard/i18n/locale/bg/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/bg/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Locale removed from portal successfully",
"ERROR_MESSAGE": "Unable to remove locale from portal. Try again."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Default",
+ "DRAFT": "Draft",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Изтрий"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Select locale..."
},
+ "STATUS": {
+ "LABEL": "Статус",
+ "OPTIONS": {
+ "LIVE": "Published",
+ "DRAFT": "Draft"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Locale added successfully",
"ERROR_MESSAGE": "Unable to add locale. Try again."
diff --git a/app/javascript/dashboard/i18n/locale/bg/integrations.json b/app/javascript/dashboard/i18n/locale/bg/integrations.json
index baea368bb..fd3d12e15 100644
--- a/app/javascript/dashboard/i18n/locale/bg/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/bg/integrations.json
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Captain",
- "HEADER_KNOW_MORE": "Know more",
+ "HEADER_KNOW_MORE": "Научете повече",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "ASSISTANTS": "Асистенти",
+ "SWITCH_ASSISTANT": "Превключване между асистенти",
+ "NEW_ASSISTANT": "Създайте асистент",
+ "EMPTY_LIST": "Не са намерени асистенти, моля създайте един, за да започнете"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "PANEL_TITLE": "Започнете с Copilot",
+ "KICK_OFF_MESSAGE": "Имате нужда от бързо резюме, искате да проверите минали разговори или да създадете по-добър отговор? Copilot е тук, за да ускори нещата.",
"SEND_MESSAGE": "Изпрати съобщение...",
- "EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
- "LOADER": "Captain is thinking",
+ "EMPTY_MESSAGE": "Възникна грешка при генериране на отговора. Моля, опитайте отново.",
+ "LOADER": "Captain мисли",
"YOU": "You",
- "USE": "Use this",
- "RESET": "Reset",
- "SHOW_STEPS": "Show steps",
- "SELECT_ASSISTANT": "Select Assistant",
+ "USE": "Използвай това",
+ "RESET": "Нулиране",
+ "SHOW_STEPS": "Покажи стъпки",
+ "SELECT_ASSISTANT": "Изберете асистент",
"PROMPTS": {
"SUMMARIZE": {
- "LABEL": "Summarize this conversation",
- "CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
+ "LABEL": "Обобщете този разговор",
+ "CONTENT": "Обобщете основните точки, обсъдени между клиента и поддържащия агент, включително притесненията на клиента, въпросите и решенията или отговорите, предоставени от агента."
},
"SUGGEST": {
- "LABEL": "Suggest an answer",
- "CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
+ "LABEL": "Предложете отговор",
+ "CONTENT": "Анализирайте запитването на клиента и създайте отговор, който ефективно адресира техните притеснения или въпроси. Уверете се, че отговорът е ясен, кратък и предоставя полезна информация."
},
"RATE": {
- "LABEL": "Rate this conversation",
- "CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
+ "LABEL": "Оценете този разговор",
+ "CONTENT": "Прегледайте разговора, за да видите доколко отговаря на нуждите на клиента. Споделете оценка от 5 въз основа на тон, яснота и ефективност."
},
"HIGH_PRIORITY": {
- "LABEL": "High priority conversations",
- "CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
+ "LABEL": "Разговори с висок приоритет",
+ "CONTENT": "Дайте ми резюме на всички отворени разговори с висок приоритет. Включете ID на разговора, името на клиента (ако е налично), съдържанието на последното съобщение и назначен агент. Групирайте по статус, ако е приложимо."
},
"LIST_CONTACTS": {
- "LABEL": "List contacts",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "LABEL": "Списък с контакти",
+ "CONTENT": "Покажете ми списък с топ 10 контакта. Включете име, имейл или телефонен номер (ако е наличен), време на последно виждане, етикети (ако има такива)."
}
}
},
"PLAYGROUND": {
"USER": "You",
- "ASSISTANT": "Assistant",
+ "ASSISTANT": "Асистент",
"MESSAGE_PLACEHOLDER": "Напишете вашето съобщение...",
- "HEADER": "Playground",
- "DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
- "CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
+ "HEADER": "Площадка",
+ "DESCRIPTION": "Използвайте тази площадка, за да изпращате съобщения до вашия асистент и да проверите дали отговаря точно, бързо и в очаквания тон.",
+ "CREDIT_NOTE": "Изпратените съобщения тук ще се броят към вашите кредити на Captain."
},
"PAYWALL": {
- "TITLE": "Upgrade to use Captain AI",
- "AVAILABLE_ON": "Captain is not available on the free plan.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "TITLE": "Надградете, за да използвате Captain AI",
+ "AVAILABLE_ON": "Captain не е наличен в безплатния план.",
+ "UPGRADE_PROMPT": "Надградете вашия план, за да получите достъп до нашите асистенти, copilot и още.",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "AVAILABLE_ON": "Captain AI е наличен само в Enterprise плановете.",
+ "UPGRADE_PROMPT": "Надградете вашия план, за да получите достъп до нашите асистенти, copilot и още.",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"BANNER": {
- "RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
- "DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
+ "RESPONSES": "Използвали сте над 80% от лимита си за отговори. За да продължите да използвате Captain AI, моля надградете.",
+ "DOCUMENTS": "Достигнат е лимитът за документи. Надградете, за да продължите да използвате Captain AI."
},
"FORM": {
"CANCEL": "Отмени",
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
+ "SELECTED": "{count} selected",
+ "SELECT_ALL": "Select all ({count})",
+ "UNSELECT_ALL": "Unselect all ({count})",
+ "BULK_DELETE_BUTTON": "Изтрий",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Yes, delete all",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Описание",
diff --git a/app/javascript/dashboard/i18n/locale/bn/helpCenter.json b/app/javascript/dashboard/i18n/locale/bn/helpCenter.json
index 70580ab92..761ddd536 100644
--- a/app/javascript/dashboard/i18n/locale/bn/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/bn/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "লোকেল সফলভাবে পোর্টাল থেকে সরানো হয়েছে",
"ERROR_MESSAGE": "লোকেল পোর্টাল থেকে সরানো যায়নি। আবার চেষ্টা করুন।."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} নিবন্ধ | {count} নিবন্ধসমূহ",
"CATEGORIES_COUNT": "{count} বিভাগ | {count} বিভাগসমূহ",
"DEFAULT": "ডিফল্ট",
+ "DRAFT": "খসড়া",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "ডিফল্ট করুন",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "মুছে ফেলুন"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "লোকেল নির্বাচন করুন..."
},
+ "STATUS": {
+ "LABEL": "অবস্থা",
+ "OPTIONS": {
+ "LIVE": "প্রকাশিত",
+ "DRAFT": "খসড়া"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "লোকেল সফলভাবে যোগ করা হয়েছে",
"ERROR_MESSAGE": "লোকেল যোগ করা যায়নি. আবার চেষ্টা করুন."
diff --git a/app/javascript/dashboard/i18n/locale/bn/integrations.json b/app/javascript/dashboard/i18n/locale/bn/integrations.json
index 3cfc00828..dbdf6b663 100644
--- a/app/javascript/dashboard/i18n/locale/bn/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/bn/integrations.json
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "নথিপত্র",
"ADD_NEW": "নতুন নথি তৈরি করুন",
+ "SELECTED": "{count} নির্বাচিত",
+ "SELECT_ALL": "সব নির্বাচন করুন ({count})",
+ "UNSELECT_ALL": "সব নির্বাচন বাতিল করুন ({count})",
+ "BULK_DELETE_BUTTON": "মুছে ফেলুন",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "হ্যাঁ, সব মুছে ফেলুন",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "সম্পর্কিত FAQ",
"DESCRIPTION": "এই FAQ গুলো সরাসরি ডকুমেন্ট থেকে তৈরি হয়েছে।"
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "টুলস",
"ADD_NEW": "নতুন টুল তৈরি করুন",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "কোনো কাস্টম টুল নেই",
"SUBTITLE": "আপনার অ্যাসিস্ট্যান্টকে বাহ্যিক API ও সার্ভিসের সাথে সংযুক্ত করতে কাস্টম টুল তৈরি করুন, যাতে এটি আপনার পক্ষ থেকে ডেটা সংগ্রহ ও বিভিন্ন কাজ করতে পারে।.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "কাস্টম টুল সফলভাবে মুছে ফেলা হয়েছে",
"ERROR_MESSAGE": "কাস্টম টুল মুছে ফেলা যায়নি"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "টুলের নাম",
"PLACEHOLDER": "অর্ডার অনুসন্ধান",
- "ERROR": "টুলের নাম আবশ্যক"
+ "ERROR": "টুলের নাম আবশ্যক",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "বর্ণনা",
diff --git a/app/javascript/dashboard/i18n/locale/ca/conversation.json b/app/javascript/dashboard/i18n/locale/ca/conversation.json
index e37174518..29a529a5d 100644
--- a/app/javascript/dashboard/i18n/locale/ca/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ca/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "La signatura del missatge no està configurada, configura-la a la configuració del perfil.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "Dóna instruccions addicionals a copilot o pregunta qualsevol altra cosa... Prem enter per enviar un seguiment",
"CLICK_HERE": "Fes clic aquí per actualitzar",
"WHATSAPP_TEMPLATES": "Plantilles de Whatsapp"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Arrossega i deixa anar aquí per adjuntar-lo",
"START_AUDIO_RECORDING": "Inicia la gravació d'àudio",
"STOP_AUDIO_RECORDING": "Atura la gravació d'àudio",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot està pensant",
"EMAIL_HEAD": {
"TO": "A",
"ADD_BCC": "Afegeix cco",
diff --git a/app/javascript/dashboard/i18n/locale/ca/helpCenter.json b/app/javascript/dashboard/i18n/locale/ca/helpCenter.json
index 631ebd6b0..570d56faa 100644
--- a/app/javascript/dashboard/i18n/locale/ca/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/ca/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "La localització s'ha eliminat del portal correctament",
"ERROR_MESSAGE": "No es pot eliminar la localització del portal. Torna-ho a provar."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Per defecte",
+ "DRAFT": "Esborrany",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Esborrar"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Selecciona localització..."
},
+ "STATUS": {
+ "LABEL": "Estat",
+ "OPTIONS": {
+ "LIVE": "Publicat",
+ "DRAFT": "Esborrany"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "La localització s'ha afegit correctament",
"ERROR_MESSAGE": "No es pot afegir la localització. Torna-ho a provar."
diff --git a/app/javascript/dashboard/i18n/locale/ca/integrations.json b/app/javascript/dashboard/i18n/locale/ca/integrations.json
index 00cc344b6..3aac7094f 100644
--- a/app/javascript/dashboard/i18n/locale/ca/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ca/integrations.json
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Captain",
- "HEADER_KNOW_MORE": "Know more",
+ "HEADER_KNOW_MORE": "Saber més",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "ASSISTANTS": "Assistents",
+ "SWITCH_ASSISTANT": "Canvia entre assistents",
+ "NEW_ASSISTANT": "Crea un assistent",
+ "EMPTY_LIST": "No s'ha trobat cap assistent, si us plau crea'n un per començar"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "PANEL_TITLE": "Comença amb Copilot",
+ "KICK_OFF_MESSAGE": "Necessites un resum ràpid, vols revisar converses anteriors o redactar una resposta millor? Copilot és aquí per accelerar-ho.",
"SEND_MESSAGE": "Envia missatge...",
- "EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
- "LOADER": "Captain is thinking",
+ "EMPTY_MESSAGE": "Hi ha hagut un error generant la resposta. Torna-ho a provar.",
+ "LOADER": "Captain està pensant",
"YOU": "Tu",
- "USE": "Use this",
- "RESET": "Reset",
- "SHOW_STEPS": "Show steps",
- "SELECT_ASSISTANT": "Select Assistant",
+ "USE": "Utilitza això",
+ "RESET": "Reinicia",
+ "SHOW_STEPS": "Mostra passos",
+ "SELECT_ASSISTANT": "Selecciona Assistente",
"PROMPTS": {
"SUMMARIZE": {
- "LABEL": "Summarize this conversation",
- "CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
+ "LABEL": "Resumeix aquesta conversa",
+ "CONTENT": "Resumeix els punts claus que s'han discutit entre el client i l'agent de suport, incloent les preocupacions, preguntes del client i les solucions o respostes aportades per l'agent."
},
"SUGGEST": {
- "LABEL": "Suggest an answer",
- "CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
+ "LABEL": "Suggerir una resposta",
+ "CONTENT": "Analitza la consulta del client i redacta una resposta que atiqui eficaçment les seves preocupacions o preguntes. Assegura que la resposta sigui clara, concisa i ofereixi informació útil."
},
"RATE": {
- "LABEL": "Rate this conversation",
- "CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
+ "LABEL": "Valora aquesta conversa",
+ "CONTENT": "Revisa la conversa per veure com de bé s'adapta a les necessitats del client. Comparteix una valoració de 5 punts basada en to, claredat i efectivitat."
},
"HIGH_PRIORITY": {
- "LABEL": "High priority conversations",
- "CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
+ "LABEL": "Converses d'alta prioritat",
+ "CONTENT": "Dóna'm un resum de totes les converses obertes d'alta prioritat. Inclou la ID de la conversa, nom del client (si està disponible), contingut de l'últim missatge i agent assignat. Agrupa per estat si és rellevant."
},
"LIST_CONTACTS": {
- "LABEL": "List contacts",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "LABEL": "Llista de contactes",
+ "CONTENT": "Mostra'm la llista dels 10 contactes principals. Inclou nom, correu electrònic o telèfon (si està disponible), última vegada que es va veure, etiquetes (si n'hi ha)."
}
}
},
"PLAYGROUND": {
"USER": "Tu",
- "ASSISTANT": "Assistant",
+ "ASSISTANT": "Assistent",
"MESSAGE_PLACEHOLDER": "Escriu el missatge...",
- "HEADER": "Playground",
- "DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
- "CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
+ "HEADER": "Zona de proves",
+ "DESCRIPTION": "Utilitza aquest espai de proves per enviar missatges al teu assistent i comprovar si respon de manera precisa, ràpida i amb el to que esperes.",
+ "CREDIT_NOTE": "Els missatges enviats aquí comptaran per als teus crèdits de Captain."
},
"PAYWALL": {
- "TITLE": "Upgrade to use Captain AI",
- "AVAILABLE_ON": "Captain is not available on the free plan.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "TITLE": "Actualitza per usar Captain AI",
+ "AVAILABLE_ON": "Captain no està disponible en el pla gratuït.",
+ "UPGRADE_PROMPT": "Actualitza el teu pla per accedir als nostres assistents, copilot i més.",
"UPGRADE_NOW": "Actualitza ara",
"CANCEL_ANYTIME": "Pots canviar o cancel·lar el teu pla en qualsevol moment"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "AVAILABLE_ON": "Captain AI només està disponible en els plans Enterprise.",
+ "UPGRADE_PROMPT": "Actualitza el teu pla per accedir als nostres assistents, copilot i més.",
"ASK_ADMIN": "Posa't en contacte amb el vostre administrador per obtenir l'actualització."
},
"BANNER": {
- "RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
- "DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
+ "RESPONSES": "Has utilitzat més del 80% del teu límit de respostes. Per continuar utilitzant Captain AI, si us plau actualitza.",
+ "DOCUMENTS": "S'ha arribat al límit de documents. Actualitza per continuar utilitzant Captain AI."
},
"FORM": {
"CANCEL": "Cancel·la",
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
+ "SELECTED": "{count} selected",
+ "SELECT_ALL": "Select all ({count})",
+ "UNSELECT_ALL": "Unselect all ({count})",
+ "BULK_DELETE_BUTTON": "Esborrar",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Yes, delete all",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Descripció",
diff --git a/app/javascript/dashboard/i18n/locale/cs/conversation.json b/app/javascript/dashboard/i18n/locale/cs/conversation.json
index de341bb51..eb1d80278 100644
--- a/app/javascript/dashboard/i18n/locale/cs/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/cs/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Podpis zprávy není nakonfigurován, prosím nakonfigurujte jej v nastavení profilu.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "Dejte copilotu další podněty nebo se zeptejte na cokoliv dalšího... Stiskněte Enter pro odeslání pokračování",
"CLICK_HERE": "Klikněte zde pro aktualizaci",
"WHATSAPP_TEMPLATES": "Whatsapp Templates"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Přetažením sem připojíte",
"START_AUDIO_RECORDING": "Spustit nahrávání zvuku",
"STOP_AUDIO_RECORDING": "Zastavit nahrávání zvuku",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot přemýšlí",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Přidat bcc",
diff --git a/app/javascript/dashboard/i18n/locale/cs/helpCenter.json b/app/javascript/dashboard/i18n/locale/cs/helpCenter.json
index d58f88a20..d30125cda 100644
--- a/app/javascript/dashboard/i18n/locale/cs/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/cs/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Locale removed from portal successfully",
"ERROR_MESSAGE": "Unable to remove locale from portal. Try again."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Default",
+ "DRAFT": "Koncept",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Vymazat"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Select locale..."
},
+ "STATUS": {
+ "LABEL": "Stav",
+ "OPTIONS": {
+ "LIVE": "Publikované",
+ "DRAFT": "Koncept"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Locale added successfully",
"ERROR_MESSAGE": "Unable to add locale. Try again."
diff --git a/app/javascript/dashboard/i18n/locale/cs/integrations.json b/app/javascript/dashboard/i18n/locale/cs/integrations.json
index a19209203..49fcede3a 100644
--- a/app/javascript/dashboard/i18n/locale/cs/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/cs/integrations.json
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Captain",
- "HEADER_KNOW_MORE": "Know more",
+ "HEADER_KNOW_MORE": "Zjistit více",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "ASSISTANTS": "Asistenti",
+ "SWITCH_ASSISTANT": "Přepínání mezi asistenty",
+ "NEW_ASSISTANT": "Vytvořit asistenta",
+ "EMPTY_LIST": "Nebyli nalezeni žádní asistenti, prosím vytvořte si jednoho pro začátek"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "PANEL_TITLE": "Začněte s Copilotem",
+ "KICK_OFF_MESSAGE": "Potřebujete rychlý přehled, chcete zkontrolovat předchozí rozhovory, nebo vytvořit lepší odpověď? Copilot je tu, aby to zrychlil.",
"SEND_MESSAGE": "Send message...",
- "EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
- "LOADER": "Captain is thinking",
+ "EMPTY_MESSAGE": "Při generování odpovědi došlo k chybě. Zkuste to prosím znovu.",
+ "LOADER": "Captain přemýšlí",
"YOU": "Vy",
- "USE": "Use this",
- "RESET": "Reset",
- "SHOW_STEPS": "Show steps",
- "SELECT_ASSISTANT": "Select Assistant",
+ "USE": "Použít toto",
+ "RESET": "Resetovat",
+ "SHOW_STEPS": "Zobrazit kroky",
+ "SELECT_ASSISTANT": "Vybrat asistenta",
"PROMPTS": {
"SUMMARIZE": {
- "LABEL": "Summarize this conversation",
- "CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
+ "LABEL": "Shrň tuto konverzaci",
+ "CONTENT": "Shrň klíčové body diskutované mezi zákazníkem a podpůrným agentem, včetně obav zákazníka, otázek a řešení nebo odpovědí poskytnutých agentem podpory"
},
"SUGGEST": {
- "LABEL": "Suggest an answer",
- "CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
+ "LABEL": "Navrhni odpověď",
+ "CONTENT": "Analyzuj dotaz zákazníka a vytvoř odpověď, která efektivně řeší jeho obavy nebo otázky. Zajisti, aby byla odpověď jasná, stručná a poskytovala užitečné informace."
},
"RATE": {
- "LABEL": "Rate this conversation",
- "CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
+ "LABEL": "Ohodnoť tuto konverzaci",
+ "CONTENT": "Prohlédni konverzaci a zhodnoť, jak dobře odpovídá potřebám zákazníka. Sdílej hodnocení od 1 do 5 na základě tónu, srozumitelnosti a efektivity."
},
"HIGH_PRIORITY": {
- "LABEL": "High priority conversations",
- "CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
+ "LABEL": "Konverzace s vysokou prioritou",
+ "CONTENT": "Dej mi shrnutí všech otevřených konverzací s vysokou prioritou. Uveď ID konverzace, jméno zákazníka (pokud je k dispozici), obsah poslední zprávy a přiděleného agenta. Pokud je relevantní, seskup je podle stavu."
},
"LIST_CONTACTS": {
- "LABEL": "List contacts",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "LABEL": "Seznam kontaktů",
+ "CONTENT": "Ukázat seznam 10 nejlepších kontaktů. Uveď jméno, email nebo telefonní číslo (pokud je k dispozici), čas posledního přístupu, štítky (pokud jsou)."
}
}
},
"PLAYGROUND": {
"USER": "Vy",
- "ASSISTANT": "Assistant",
+ "ASSISTANT": "Asistent",
"MESSAGE_PLACEHOLDER": "Zde začněte psát...",
- "HEADER": "Playground",
- "DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
- "CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
+ "HEADER": "Hřiště",
+ "DESCRIPTION": "Použijte toto hřiště pro odesílání zpráv vašemu asistentovi a ověřte, zda odpovídá přesně, rychle a v očekávaném tónu.",
+ "CREDIT_NOTE": "Zprávy odeslané zde se budou počítat do vašich kreditů Captain."
},
"PAYWALL": {
- "TITLE": "Upgrade to use Captain AI",
- "AVAILABLE_ON": "Captain is not available on the free plan.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "TITLE": "Upgradujte pro používání Captain AI",
+ "AVAILABLE_ON": "Captain není dostupný v bezplatném plánu.",
+ "UPGRADE_PROMPT": "Upgradujte svůj plán, abyste získali přístup k našim asistentům, copilotu a dalším funkcím.",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "AVAILABLE_ON": "Captain AI je dostupný pouze v podnicích plánech.",
+ "UPGRADE_PROMPT": "Upgradujte svůj plán, abyste získali přístup k našim asistentům, copilotu a dalším funkcím.",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"BANNER": {
- "RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
- "DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
+ "RESPONSES": "Vyčerpali jste více než 80 % svého limitu odpovědí. Pro pokračování v používání Captain AI upgradujte.",
+ "DOCUMENTS": "Limit dokumentů byl dosažen. Pro pokračování v používání Captain AI upgradujte."
},
"FORM": {
"CANCEL": "Zrušit",
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
+ "SELECTED": "{count} selected",
+ "SELECT_ALL": "Select all ({count})",
+ "UNSELECT_ALL": "Unselect all ({count})",
+ "BULK_DELETE_BUTTON": "Vymazat",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Yes, delete all",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Description",
diff --git a/app/javascript/dashboard/i18n/locale/da/conversation.json b/app/javascript/dashboard/i18n/locale/da/conversation.json
index 2e5d34a7b..13fdc950e 100644
--- a/app/javascript/dashboard/i18n/locale/da/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/da/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Beskedsignatur er ikke konfigureret, konfigurer den i profilindstillinger.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "Giv copilot yderligere prompts, eller spørg om noget andet... Tryk enter for at sende opfølgning",
"CLICK_HERE": "Klik her for at opdatere",
"WHATSAPP_TEMPLATES": "Whatsapp Skabeloner"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Træk og slip her for at vedhæfte",
"START_AUDIO_RECORDING": "Start lydoptagelse",
"STOP_AUDIO_RECORDING": "Stop lydoptagelse",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot tænker",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Tilføj bcc",
diff --git a/app/javascript/dashboard/i18n/locale/da/helpCenter.json b/app/javascript/dashboard/i18n/locale/da/helpCenter.json
index 0cc945e86..510e84218 100644
--- a/app/javascript/dashboard/i18n/locale/da/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/da/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Landestandard fjernet fra portal",
"ERROR_MESSAGE": "Kan ikke fjerne landestandard fra portalen. Prøv igen."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Standard",
+ "DRAFT": "Kladde",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Slet"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Select locale..."
},
+ "STATUS": {
+ "LABEL": "Status",
+ "OPTIONS": {
+ "LIVE": "Publiceret",
+ "DRAFT": "Kladde"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Landestandard tilføjet",
"ERROR_MESSAGE": "Kan ikke tilføje locale. Prøv igen."
diff --git a/app/javascript/dashboard/i18n/locale/da/integrations.json b/app/javascript/dashboard/i18n/locale/da/integrations.json
index 6675538b9..0729227a5 100644
--- a/app/javascript/dashboard/i18n/locale/da/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/da/integrations.json
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Captain",
- "HEADER_KNOW_MORE": "Know more",
+ "HEADER_KNOW_MORE": "Få mere at vide",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "ASSISTANTS": "Assistenter",
+ "SWITCH_ASSISTANT": "Skift mellem assistenter",
+ "NEW_ASSISTANT": "Opret assistent",
+ "EMPTY_LIST": "Ingen assistenter fundet, opret en for at komme i gang"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "PANEL_TITLE": "Kom godt i gang med Copilot",
+ "KICK_OFF_MESSAGE": "Brug for et hurtigt sammendrag, vil du tjekke tidligere samtaler eller udarbejde et bedre svar? Copilot er her for at fremskynde processen.",
"SEND_MESSAGE": "Send besked...",
- "EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
- "LOADER": "Captain is thinking",
+ "EMPTY_MESSAGE": "Der opstod en fejl ved generering af svaret. Prøv igen.",
+ "LOADER": "Captain tænker",
"YOU": "Dig",
- "USE": "Use this",
- "RESET": "Reset",
- "SHOW_STEPS": "Show steps",
- "SELECT_ASSISTANT": "Select Assistant",
+ "USE": "Brug dette",
+ "RESET": "Nulstil",
+ "SHOW_STEPS": "Vis trin",
+ "SELECT_ASSISTANT": "Vælg assistent",
"PROMPTS": {
"SUMMARIZE": {
- "LABEL": "Summarize this conversation",
- "CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
+ "LABEL": "Sammenfat denne samtale",
+ "CONTENT": "Sammenfat hovedpunkterne diskuteret mellem kunden og supportagenten, inklusive kundens bekymringer, spørgsmål og de løsninger eller svar, supportagenten har givet"
},
"SUGGEST": {
- "LABEL": "Suggest an answer",
- "CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
+ "LABEL": "Foreslå et svar",
+ "CONTENT": "Analyser kundens forespørgsel, og udarbejd et svar, der effektivt imødekommer deres bekymringer eller spørgsmål. Sørg for, at svaret er klart, præcist og giver nyttige oplysninger."
},
"RATE": {
- "LABEL": "Rate this conversation",
- "CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
+ "LABEL": "Vurder denne samtale",
+ "CONTENT": "Gennemgå samtalen for at se, hvor godt den opfylder kundens behov. Del en vurdering ud af 5 baseret på tone, klarhed og effektivitet."
},
"HIGH_PRIORITY": {
- "LABEL": "High priority conversations",
- "CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
+ "LABEL": "Samtaler med høj prioritet",
+ "CONTENT": "Giv mig et sammendrag af alle åbne samtaler med høj prioritet. Inkluder samtale-ID, kundens navn (hvis tilgængeligt), indholdet af sidste besked og tildelt agent. Grupper efter status, hvis relevant."
},
"LIST_CONTACTS": {
- "LABEL": "List contacts",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "LABEL": "Liste over kontakter",
+ "CONTENT": "Vis mig listen over de 10 bedste kontakter. Inkluder navn, e-mail eller telefonnummer (hvis tilgængeligt), sidst set tidspunkt, tags (hvis nogen)."
}
}
},
"PLAYGROUND": {
"USER": "Dig",
- "ASSISTANT": "Assistant",
+ "ASSISTANT": "Assistent",
"MESSAGE_PLACEHOLDER": "Skriv din besked...",
- "HEADER": "Playground",
- "DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
- "CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
+ "HEADER": "Legeplads",
+ "DESCRIPTION": "Brug denne legeplads til at sende beskeder til din assistent og tjekke, om den svarer korrekt, hurtigt og i den tone, du forventer.",
+ "CREDIT_NOTE": "Beskeder sendt her tæller mod dine Captain-kreditter."
},
"PAYWALL": {
- "TITLE": "Upgrade to use Captain AI",
- "AVAILABLE_ON": "Captain is not available on the free plan.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "TITLE": "Opgrader for at bruge Captain AI",
+ "AVAILABLE_ON": "Captain er ikke tilgængelig på gratisplanen.",
+ "UPGRADE_PROMPT": "Opgrader din plan for at få adgang til vores assistenter, copilot og mere.",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "AVAILABLE_ON": "Captain AI er kun tilgængelig i Enterprise-planerne.",
+ "UPGRADE_PROMPT": "Opgrader din plan for at få adgang til vores assistenter, copilot og mere.",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"BANNER": {
- "RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
- "DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
+ "RESPONSES": "Du har brugt over 80 % af din svargrænse. For at fortsætte med at bruge Captain AI skal du opgradere.",
+ "DOCUMENTS": "Dokumentgrænse nået. Opgrader for at fortsætte med at bruge Captain AI."
},
"FORM": {
"CANCEL": "Annuller",
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
+ "SELECTED": "{count} selected",
+ "SELECT_ALL": "Select all ({count})",
+ "UNSELECT_ALL": "Unselect all ({count})",
+ "BULK_DELETE_BUTTON": "Slet",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Yes, delete all",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Beskrivelse",
diff --git a/app/javascript/dashboard/i18n/locale/de/conversation.json b/app/javascript/dashboard/i18n/locale/de/conversation.json
index 091120b1d..6126e561d 100644
--- a/app/javascript/dashboard/i18n/locale/de/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/de/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Die Nachrichtensignatur ist nicht konfiguriert, bitte konfigurieren Sie sie in den Profileinstellungen.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "Geben Sie Copilot zusätzliche Aufforderungen oder fragen Sie etwas anderes ... Drücken Sie Enter, um eine Folgefrage zu senden",
"CLICK_HERE": "Klicken Sie hier, um zu aktualisieren",
"WHATSAPP_TEMPLATES": "WhatsApp-Vorlagen"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Zum Anhängen hierher ziehen und ablegen",
"START_AUDIO_RECORDING": "Audioaufzeichnung starten",
"STOP_AUDIO_RECORDING": "Audioaufzeichnung stoppen",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot denkt",
"EMAIL_HEAD": {
"TO": "An",
"ADD_BCC": "BCC hinzufügen",
diff --git a/app/javascript/dashboard/i18n/locale/de/helpCenter.json b/app/javascript/dashboard/i18n/locale/de/helpCenter.json
index 4a2cc23a2..39363ba8f 100644
--- a/app/javascript/dashboard/i18n/locale/de/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/de/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Sprache wurde erfolgreich aus dem Portal entfernt",
"ERROR_MESSAGE": "Sprache kann nicht aus dem Portal entfernt werden. Versuchen Sie es nochmal."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Standard",
+ "DRAFT": "Entwürfe",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Löschen"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Sprache auswählen..."
},
+ "STATUS": {
+ "LABEL": "Status",
+ "OPTIONS": {
+ "LIVE": "Veröffentlicht",
+ "DRAFT": "Entwürfe"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Sprache erfolgreich hinzugefügt",
"ERROR_MESSAGE": "Sprache kann nicht hinzugefügt werden. Versuchen Sie es nochmal."
diff --git a/app/javascript/dashboard/i18n/locale/de/integrations.json b/app/javascript/dashboard/i18n/locale/de/integrations.json
index 7c643d93c..789e292bb 100644
--- a/app/javascript/dashboard/i18n/locale/de/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/de/integrations.json
@@ -390,71 +390,71 @@
},
"CAPTAIN": {
"NAME": "Kapitän",
- "HEADER_KNOW_MORE": "Know more",
+ "HEADER_KNOW_MORE": "Mehr erfahren",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "ASSISTANTS": "Assistenten",
+ "SWITCH_ASSISTANT": "Zwischen Assistenten wechseln",
+ "NEW_ASSISTANT": "Assistent erstellen",
+ "EMPTY_LIST": "Keine Assistenten gefunden, bitte erstellen Sie einen, um zu beginnen"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Probiere diese Prompts",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "PANEL_TITLE": "Starten Sie mit Copilot",
+ "KICK_OFF_MESSAGE": "Brauchen Sie eine schnelle Zusammenfassung, möchten Sie vergangene Gespräche prüfen oder eine bessere Antwort entwerfen? Copilot hilft Ihnen, schneller voranzukommen.",
"SEND_MESSAGE": "Nachricht senden...",
- "EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
+ "EMPTY_MESSAGE": "Beim Generieren der Antwort ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.",
"LOADER": "Captain denkt nach",
"YOU": "Sie",
"USE": "Verwenden",
"RESET": "Zurücksetzen",
- "SHOW_STEPS": "Show steps",
+ "SHOW_STEPS": "Schritte anzeigen",
"SELECT_ASSISTANT": "Assistent auswählen",
"PROMPTS": {
"SUMMARIZE": {
- "LABEL": "Summarize this conversation",
- "CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
+ "LABEL": "Dieses Gespräch zusammenfassen",
+ "CONTENT": "Fassen Sie die wichtigsten Punkte zusammen, die zwischen dem Kunden und dem Supportmitarbeiter besprochen wurden, einschließlich der Anliegen, Fragen des Kunden sowie der vom Supportmitarbeiter gegebenen Lösungen oder Antworten"
},
"SUGGEST": {
- "LABEL": "Suggest an answer",
- "CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
+ "LABEL": "Antwort vorschlagen",
+ "CONTENT": "Analysiere die Anfrage des Kunden und entwerfe eine Antwort, die seine Anliegen oder Fragen effektiv beantwortet. Stelle sicher, dass die Antwort klar, prägnant und hilfreich ist."
},
"RATE": {
- "LABEL": "Rate this conversation",
- "CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
+ "LABEL": "Bewerten Sie dieses Gespräch",
+ "CONTENT": "Bewerten Sie das Gespräch, um zu sehen, wie gut es die Bedürfnisse des Kunden erfüllt. Geben Sie eine Bewertung von 1 bis 5 basierend auf Ton, Klarheit und Effektivität ab."
},
"HIGH_PRIORITY": {
- "LABEL": "High priority conversations",
- "CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
+ "LABEL": "Gespräche mit hoher Priorität",
+ "CONTENT": "Gib mir eine Zusammenfassung aller offenen Gespräche mit hoher Priorität. Bitte die Gesprächs-ID, den Kundennamen (falls vorhanden), den Inhalt der letzten Nachricht und den zugewiesenen Mitarbeiter einschließen. Gruppiere nach Status, wenn relevant."
},
"LIST_CONTACTS": {
- "LABEL": "List contacts",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "LABEL": "Kontakte auflisten",
+ "CONTENT": "Zeige mir die Liste der Top 10 Kontakte. Bitte Name, E-Mail oder Telefonnummer (falls vorhanden), zuletzt gesehen Zeit, Tags (falls vorhanden) einschließen."
}
}
},
"PLAYGROUND": {
"USER": "Sie",
- "ASSISTANT": "Assistant",
+ "ASSISTANT": "Assistent",
"MESSAGE_PLACEHOLDER": "Schreiben Sie Ihre Nachricht...",
- "HEADER": "Playground",
- "DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
- "CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
+ "HEADER": "Spielwiese",
+ "DESCRIPTION": "Nutzen Sie diesen Playground, um Nachrichten an Ihren Assistenten zu senden und zu prüfen, ob dieser genau, schnell und im erwarteten Ton antwortet.",
+ "CREDIT_NOTE": "Hier gesendete Nachrichten werden auf Ihre Captain-Guthaben angerechnet."
},
"PAYWALL": {
"TITLE": "Upgrade auf Captain AI",
- "AVAILABLE_ON": "Captain is not available on the free plan.",
+ "AVAILABLE_ON": "Captain ist im kostenlosen Tarif nicht verfügbar.",
"UPGRADE_PROMPT": "Tarif upgraden, um Zugang zu unseren Assistenten, Copilot und mehr zu erhalten.",
"UPGRADE_NOW": "Jetzt upgraden",
"CANCEL_ANYTIME": "Sie können Ihr Paket jederzeit ändern oder kündigen"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
+ "AVAILABLE_ON": "Captain AI ist nur in den Enterprise-Tarifen verfügbar.",
"UPGRADE_PROMPT": "Tarif upgraden, um Zugang zu unseren Assistenten, Copilot und mehr zu erhalten.",
"ASK_ADMIN": "Bitte kontaktieren Sie Ihren Administrator für das Upgrade."
},
"BANNER": {
- "RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
+ "RESPONSES": "Sie haben über 80 % Ihres Antwortlimits verbraucht. Um Captain AI weiterhin zu nutzen, bitte upgraden.",
"DOCUMENTS": "Dokumentenlimit erreicht. Upgraden um Cpatain AI weiter zu verwenden."
},
"FORM": {
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
+ "SELECTED": "{count} selected",
+ "SELECT_ALL": "Select all ({count})",
+ "UNSELECT_ALL": "Unselect all ({count})",
+ "BULK_DELETE_BUTTON": "Löschen",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Yes, delete all",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Beschreibung",
diff --git a/app/javascript/dashboard/i18n/locale/el/conversation.json b/app/javascript/dashboard/i18n/locale/el/conversation.json
index 42e633acf..4fa001c0d 100644
--- a/app/javascript/dashboard/i18n/locale/el/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/el/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Δεν έχει ρυθμιστεί η υπογραφή μηνύματος, παρακαλώ ρυθμίστε την στις ρυθμίσεις προφίλ.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "Δώστε στον copilot επιπλέον εντολές ή ρωτήστε οτιδήποτε άλλο... Πατήστε enter για να στείλετε συνέχεια",
"CLICK_HERE": "Πατήστε εδώ για ενημέρωση",
"WHATSAPP_TEMPLATES": "Πρότυπα Whatsapp"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Σύρετε και αφήστε εδώ για επισύναψη",
"START_AUDIO_RECORDING": "Έναρξη ηχογράφησης",
"STOP_AUDIO_RECORDING": "Διακοπή ηχογράφησης",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Ο Copilot σκέφτεται",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Προσθήκη bcc",
diff --git a/app/javascript/dashboard/i18n/locale/el/helpCenter.json b/app/javascript/dashboard/i18n/locale/el/helpCenter.json
index dce621f00..27664f085 100644
--- a/app/javascript/dashboard/i18n/locale/el/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/el/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Η γλώσσα αφαιρέθηκε επιτυχώς από την πύλη",
"ERROR_MESSAGE": "Δεν είναι δυνατή η αφαίρεση γλώσσας από την πύλη. Δοκιμάστε ξανά."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Προεπιλογή",
+ "DRAFT": "Πρόχειρο",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Διαγραφή"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Select locale..."
},
+ "STATUS": {
+ "LABEL": "Κατάσταση",
+ "OPTIONS": {
+ "LIVE": "Δημοσιευμένο",
+ "DRAFT": "Πρόχειρο"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Η γλώσσα προστέθηκε επιτυχώς",
"ERROR_MESSAGE": "Δεν είναι δυνατή η προσθήκη γλώσσας. Δοκιμάστε ξανά."
diff --git a/app/javascript/dashboard/i18n/locale/el/integrations.json b/app/javascript/dashboard/i18n/locale/el/integrations.json
index 01cf1a240..811f68aac 100644
--- a/app/javascript/dashboard/i18n/locale/el/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/el/integrations.json
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Captain",
- "HEADER_KNOW_MORE": "Know more",
+ "HEADER_KNOW_MORE": "Μάθετε περισσότερα",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "ASSISTANTS": "Βοηθοί",
+ "SWITCH_ASSISTANT": "Εναλλαγή μεταξύ βοηθών",
+ "NEW_ASSISTANT": "Δημιουργία Βοηθού",
+ "EMPTY_LIST": "Δεν βρέθηκαν βοηθοί, παρακαλώ δημιουργήστε έναν για να ξεκινήσετε"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "PANEL_TITLE": "Ξεκινήστε με τον Copilot",
+ "KICK_OFF_MESSAGE": "Χρειάζεστε μια γρήγορη περίληψη, θέλετε να ελέγξετε παλιές συνομιλίες ή να συντάξετε μια καλύτερη απάντηση; Ο Copilot είναι εδώ για να επιταχύνει τα πράγματα.",
"SEND_MESSAGE": "Αποστολή μηνύματος...",
- "EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
- "LOADER": "Captain is thinking",
+ "EMPTY_MESSAGE": "Παρουσιάστηκε σφάλμα κατά τη δημιουργία της απάντησης. Προσπαθήστε ξανά.",
+ "LOADER": "Ο Captain σκέφτεται",
"YOU": "You",
- "USE": "Use this",
- "RESET": "Reset",
- "SHOW_STEPS": "Show steps",
- "SELECT_ASSISTANT": "Select Assistant",
+ "USE": "Χρησιμοποίησε αυτό",
+ "RESET": "Επαναφορά",
+ "SHOW_STEPS": "Εμφάνιση βημάτων",
+ "SELECT_ASSISTANT": "Επιλογή Βοηθού",
"PROMPTS": {
"SUMMARIZE": {
- "LABEL": "Summarize this conversation",
- "CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
+ "LABEL": "Συνοψίστε αυτή τη συνομιλία",
+ "CONTENT": "Συνοψίστε τα βασικά σημεία που συζητήθηκαν μεταξύ του πελάτη και του εκπροσώπου υποστήριξης, συμπεριλαμβανομένων των ανησυχιών, των ερωτήσεων του πελάτη και των λύσεων ή απαντήσεων που παρείχε ο εκπρόσωπος υποστήριξης"
},
"SUGGEST": {
- "LABEL": "Suggest an answer",
- "CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
+ "LABEL": "Προτείνετε μια απάντηση",
+ "CONTENT": "Αναλύστε το ερώτημα του πελάτη και φτιάξτε μια απάντηση που αντιμετωπίζει αποτελεσματικά τις ανησυχίες ή ερωτήσεις του. Βεβαιωθείτε ότι η απάντηση είναι σαφής, συνοπτική και παρέχει χρήσιμες πληροφορίες."
},
"RATE": {
- "LABEL": "Rate this conversation",
- "CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
+ "LABEL": "Βαθμολογήστε αυτή τη συνομιλία",
+ "CONTENT": "Αξιολογήστε τη συνομιλία για το πόσο καλά ικανοποιεί τις ανάγκες του πελάτη. Μοιραστείτε μια βαθμολογία από 5 βασιζόμενοι στον τόνο, την καθαρότητα και την αποτελεσματικότητα."
},
"HIGH_PRIORITY": {
- "LABEL": "High priority conversations",
- "CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
+ "LABEL": "Συνομιλίες υψηλής προτεραιότητας",
+ "CONTENT": "Δώστε μου μια περίληψη όλων των ανοιχτών συνομιλιών υψηλής προτεραιότητας. Συμπεριλάβετε τον ID συνομιλίας, το όνομα πελάτη (αν είναι διαθέσιμο), το περιεχόμενο του τελευταίου μηνύματος και τον ανατεθέντα πράκτορα. Ομαδοποιήστε κατά κατάσταση εάν είναι σχετικό."
},
"LIST_CONTACTS": {
- "LABEL": "List contacts",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "LABEL": "Καταχώρηση επαφών",
+ "CONTENT": "Δείξε μου τη λίστα με τις 10 κορυφαίες επαφές. Συμπεριλάβετε όνομα, email ή αριθμό τηλεφώνου (αν είναι διαθέσιμο), τελευταία φορά που εμφανίστηκαν, ετικέτες (αν υπάρχουν)."
}
}
},
"PLAYGROUND": {
"USER": "You",
- "ASSISTANT": "Assistant",
+ "ASSISTANT": "Βοηθός",
"MESSAGE_PLACEHOLDER": "Πληκτρολογήστε το μήνυμά σας...",
- "HEADER": "Playground",
- "DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
- "CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
+ "HEADER": "Παιδική Χαρά",
+ "DESCRIPTION": "Χρησιμοποιήστε αυτήν την παιδική χαρά για να στείλετε μηνύματα στον βοηθό σας και να ελέγξετε αν ανταποκρίνεται με ακρίβεια, γρήγορα και με τον τόνο που περιμένετε.",
+ "CREDIT_NOTE": "Τα μηνύματα που στέλνονται εδώ θα μετρήσουν στα credits του Captain σας."
},
"PAYWALL": {
- "TITLE": "Upgrade to use Captain AI",
- "AVAILABLE_ON": "Captain is not available on the free plan.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "TITLE": "Αναβαθμίστε για να χρησιμοποιήσετε το Captain AI",
+ "AVAILABLE_ON": "Ο Captain δεν είναι διαθέσιμος στο δωρεάν πακέτο.",
+ "UPGRADE_PROMPT": "Αναβαθμίστε το πακέτο σας για να αποκτήσετε πρόσβαση στους βοηθούς μας, τον copilot και άλλα.",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "AVAILABLE_ON": "Το Captain AI είναι διαθέσιμο μόνο στα Enterprise πακέτα.",
+ "UPGRADE_PROMPT": "Αναβαθμίστε το πακέτο σας για να αποκτήσετε πρόσβαση στους βοηθούς μας, τον copilot και άλλα.",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"BANNER": {
- "RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
- "DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
+ "RESPONSES": "Έχετε χρησιμοποιήσει πάνω από το 80% του ορίου απαντήσεών σας. Για να συνεχίσετε να χρησιμοποιείτε το Captain AI, παρακαλώ αναβαθμίστε.",
+ "DOCUMENTS": "Έχετε φτάσει στο όριο εγγράφων. Αναβαθμίστε για να συνεχίσετε να χρησιμοποιείτε το Captain AI."
},
"FORM": {
"CANCEL": "Άκυρο",
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
+ "SELECTED": "{count} selected",
+ "SELECT_ALL": "Select all ({count})",
+ "UNSELECT_ALL": "Unselect all ({count})",
+ "BULK_DELETE_BUTTON": "Διαγραφή",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Yes, delete all",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Περιγραφή",
diff --git a/app/javascript/dashboard/i18n/locale/es/conversation.json b/app/javascript/dashboard/i18n/locale/es/conversation.json
index d15ee29bc..8e6757f2e 100644
--- a/app/javascript/dashboard/i18n/locale/es/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/es/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "La firma del mensaje no está configurada, por favor configúrela en la configuración del perfil.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "Dale instrucciones adicionales a Copilot o pregúntale cualquier otra cosa... Pulsa Enter para enviar el seguimiento",
"CLICK_HERE": "Haga clic aquí para actualizar",
"WHATSAPP_TEMPLATES": "Plantillas de Whatsapp"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Arrastra y suelta aquí para adjuntar",
"START_AUDIO_RECORDING": "Iniciar grabación de audio",
"STOP_AUDIO_RECORDING": "Detener grabación de audio",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot está pensando",
"EMAIL_HEAD": {
"TO": "A",
"ADD_BCC": "Añadir bcc",
diff --git a/app/javascript/dashboard/i18n/locale/es/helpCenter.json b/app/javascript/dashboard/i18n/locale/es/helpCenter.json
index aa141ca5c..c9565ecf1 100644
--- a/app/javascript/dashboard/i18n/locale/es/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/es/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Idioma eliminado del portal correctamente",
"ERROR_MESSAGE": "No se puede eliminar el idioma del portal. Vuelve a intentarlo."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Predeterminado",
+ "DRAFT": "Borrador",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Eliminar"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Seleccionar idioma..."
},
+ "STATUS": {
+ "LABEL": "Estado",
+ "OPTIONS": {
+ "LIVE": "Publicado",
+ "DRAFT": "Borrador"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Idioma añadido correctamente",
"ERROR_MESSAGE": "No se puede añadir el idioma. Vuelve a intentarlo."
diff --git a/app/javascript/dashboard/i18n/locale/es/integrations.json b/app/javascript/dashboard/i18n/locale/es/integrations.json
index b2f435c37..4c2c9737a 100644
--- a/app/javascript/dashboard/i18n/locale/es/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/es/integrations.json
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Capitán",
- "HEADER_KNOW_MORE": "Know more",
+ "HEADER_KNOW_MORE": "Más información",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "ASSISTANTS": "Asistentes",
+ "SWITCH_ASSISTANT": "Cambiar entre asistentes",
+ "NEW_ASSISTANT": "Crear asistente",
+ "EMPTY_LIST": "No se encontraron asistentes. Crea uno para comenzar"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Prueba estas sugerencias",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "PANEL_TITLE": "Comienza con Copilot",
+ "KICK_OFF_MESSAGE": "¿Necesitas un resumen rápido, revisar conversaciones anteriores o redactar una mejor respuesta? Copilot está aquí para agilizarlo.",
"SEND_MESSAGE": "Enviar mensaje...",
- "EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
- "LOADER": "Captain is thinking",
+ "EMPTY_MESSAGE": "Se produjo un error al generar la respuesta. Inténtalo de nuevo.",
+ "LOADER": "Captain está pensando",
"YOU": "Tú",
- "USE": "Use this",
- "RESET": "Reset",
- "SHOW_STEPS": "Show steps",
- "SELECT_ASSISTANT": "Select Assistant",
+ "USE": "Usar esto",
+ "RESET": "Restablecer",
+ "SHOW_STEPS": "Mostrar pasos",
+ "SELECT_ASSISTANT": "Seleccionar asistente",
"PROMPTS": {
"SUMMARIZE": {
- "LABEL": "Summarize this conversation",
- "CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
+ "LABEL": "Resume esta conversación",
+ "CONTENT": "Resume los puntos clave tratados entre el cliente y el agente de soporte, incluidas las inquietudes y preguntas del cliente, así como las soluciones o respuestas proporcionadas por el agente de soporte."
},
"SUGGEST": {
- "LABEL": "Suggest an answer",
- "CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
+ "LABEL": "Sugerir una respuesta",
+ "CONTENT": "Analiza la consulta del cliente y redacta una respuesta que aborde eficazmente sus dudas o preguntas. Asegúrate de que la respuesta sea clara, concisa y útil."
},
"RATE": {
- "LABEL": "Rate this conversation",
- "CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
+ "LABEL": "Califica esta conversación",
+ "CONTENT": "Revisa la conversación para evaluar qué tan bien satisface las necesidades del cliente. Comparte una calificación sobre 5 basada en el tono, la claridad y la eficacia."
},
"HIGH_PRIORITY": {
- "LABEL": "High priority conversations",
- "CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
+ "LABEL": "Conversaciones de alta prioridad",
+ "CONTENT": "Dame un resumen de todas las conversaciones abiertas de alta prioridad. Incluye el ID de la conversación, el nombre del cliente (si está disponible), el contenido del último mensaje y el agente asignado. Agrupa por estado si es relevante."
},
"LIST_CONTACTS": {
- "LABEL": "List contacts",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "LABEL": "Listar contactos",
+ "CONTENT": "Muéstrame la lista de los 10 contactos principales. Incluye el nombre, el correo electrónico o número de teléfono (si está disponible), la hora de la última actividad y las etiquetas (si las hay)."
}
}
},
"PLAYGROUND": {
"USER": "Tú",
- "ASSISTANT": "Assistant",
+ "ASSISTANT": "Asistente",
"MESSAGE_PLACEHOLDER": "Escribe tu mensaje...",
- "HEADER": "Playground",
- "DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
- "CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
+ "HEADER": "Zona de pruebas",
+ "DESCRIPTION": "Usa esta zona de pruebas para enviar mensajes a tu asistente y comprobar si responde con precisión, rapidez y con el tono que esperas.",
+ "CREDIT_NOTE": "Los mensajes enviados aquí contarán para tus créditos de Captain."
},
"PAYWALL": {
- "TITLE": "Upgrade to use Captain AI",
- "AVAILABLE_ON": "Captain is not available on the free plan.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "TITLE": "Actualiza para usar Captain AI",
+ "AVAILABLE_ON": "Captain no está disponible en el plan gratuito.",
+ "UPGRADE_PROMPT": "Actualiza tu plan para obtener acceso a nuestros asistentes, Copilot y más.",
"UPGRADE_NOW": "Actualizar ahora",
"CANCEL_ANYTIME": "Puede cambiar o cancelar su plan en cualquier momento"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "AVAILABLE_ON": "Captain AI solo está disponible en los planes Enterprise.",
+ "UPGRADE_PROMPT": "Actualiza tu plan para obtener acceso a nuestros asistentes, Copilot y más.",
"ASK_ADMIN": "Por favor, comuníquese con su administrador para la actualización."
},
"BANNER": {
- "RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
- "DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
+ "RESPONSES": "Has usado más del 80 % de tu límite de respuestas. Para seguir usando Captain AI, actualiza tu plan.",
+ "DOCUMENTS": "Se alcanzó el límite de documentos. Actualiza para seguir usando Captain AI."
},
"FORM": {
"CANCEL": "Cancelar",
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
+ "SELECTED": "{count} selected",
+ "SELECT_ALL": "Select all ({count})",
+ "UNSELECT_ALL": "Unselect all ({count})",
+ "BULK_DELETE_BUTTON": "Eliminar",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Yes, delete all",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Descripción",
diff --git a/app/javascript/dashboard/i18n/locale/et/contact.json b/app/javascript/dashboard/i18n/locale/et/contact.json
index 44d205ed2..5bacfd708 100644
--- a/app/javascript/dashboard/i18n/locale/et/contact.json
+++ b/app/javascript/dashboard/i18n/locale/et/contact.json
@@ -7,14 +7,14 @@
"COPY_SUCCESSFUL": "Kopeerimine lõikelauale õnnestus",
"COMPANY": "Ettevõte",
"LOCATION": "Asukoht",
- "BROWSER_LANGUAGE": "Browser Language",
+ "BROWSER_LANGUAGE": "Brauseri keel",
"CONVERSATION_TITLE": "Vestluse üksikasjad",
"VIEW_PROFILE": "Vaata profiili",
"BROWSER": "Brauser",
"OS": "Operatsioonisüsteem",
"INITIATED_FROM": "Algatatud kohast",
"INITIATED_AT": "Algatatud ajal",
- "IP_ADDRESS": "IP Address",
+ "IP_ADDRESS": "IP-aadress",
"CREATED_AT_LABEL": "Loodud",
"NEW_MESSAGE": "Uus sõnum",
"CALL": "Helista",
@@ -91,7 +91,7 @@
},
"BIO": {
"PLACEHOLDER": "Sisesta kontakti elulugu",
- "LABEL": "Bio"
+ "LABEL": "Tutvustus"
},
"EMAIL_ADDRESS": {
"PLACEHOLDER": "Sisesta kontakti e-posti aadress",
@@ -128,19 +128,19 @@
},
"SOCIAL_PROFILES": {
"FACEBOOK": {
- "PLACEHOLDER": "Enter the Facebook username",
+ "PLACEHOLDER": "Sisesta Facebooki kasutajanimi",
"LABEL": "Facebook"
},
"TWITTER": {
- "PLACEHOLDER": "Enter the Twitter username",
+ "PLACEHOLDER": "Sisesta Twitteri kasutajanimi",
"LABEL": "Twitter"
},
"LINKEDIN": {
- "PLACEHOLDER": "Enter the LinkedIn username",
+ "PLACEHOLDER": "Sisesta LinkedIni kasutajanimi",
"LABEL": "LinkedIn"
},
"GITHUB": {
- "PLACEHOLDER": "Enter the Github username",
+ "PLACEHOLDER": "Sisesta GitHubi kasutajanimi",
"LABEL": "Github"
}
}
@@ -192,7 +192,7 @@
"CONTACTS_PAGE": {
"LIST": {
"TABLE_HEADER": {
- "SOCIAL_PROFILES": "Social Profiles"
+ "SOCIAL_PROFILES": "Sotsiaalmeedia profiilid"
}
}
},
@@ -215,7 +215,7 @@
"CANCEL": "Tühista",
"NAME": {
"LABEL": "Kohandatud atribuudi nimi",
- "PLACEHOLDER": "Eg: shopify id",
+ "PLACEHOLDER": "Nt: Shopify ID",
"ERROR": "Vigane kohandatud atribuudi nimi"
},
"VALUE": {
@@ -317,9 +317,9 @@
"UNBLOCK_ERROR_MESSAGE": "Kontakti blokeeringust vabaks tegemine ebaõnnestus. Palun proovi hiljem uuesti.",
"IMPORT_CONTACT": {
"TITLE": "Impordi kontaktid",
- "DESCRIPTION": "Import contacts through a CSV file.",
- "DOWNLOAD_LABEL": "Download a sample csv.",
- "LABEL": "CSV File:",
+ "DESCRIPTION": "Impordi kontaktid CSV-faili kaudu.",
+ "DOWNLOAD_LABEL": "Laadi alla näidis-CSV.",
+ "LABEL": "CSV-fail:",
"CHOOSE_FILE": "Vali fail",
"CHANGE": "Muuda",
"CANCEL": "Tühista",
@@ -435,7 +435,7 @@
"PLACEHOLDER": "Vali riik"
},
"BIO": {
- "PLACEHOLDER": "Enter the bio"
+ "PLACEHOLDER": "Sisesta tutvustus"
},
"COMPANY_NAME": {
"PLACEHOLDER": "Sisesta ettevõtte nimi"
@@ -446,28 +446,28 @@
"ERROR_MESSAGE": "Kontakti ei õnnestunud uuendada. Palun proovi hiljem uuesti."
},
"SOCIAL_MEDIA": {
- "TITLE": "Edit social links",
+ "TITLE": "Muuda sotsiaalmeedia linke",
"FORM": {
"FACEBOOK": {
- "PLACEHOLDER": "Add Facebook"
+ "PLACEHOLDER": "Lisa Facebook"
},
"GITHUB": {
- "PLACEHOLDER": "Add Github"
+ "PLACEHOLDER": "Lisa GitHub"
},
"INSTAGRAM": {
- "PLACEHOLDER": "Add Instagram"
+ "PLACEHOLDER": "Lisa Instagram"
},
"TELEGRAM": {
- "PLACEHOLDER": "Add Telegram"
+ "PLACEHOLDER": "Lisa Telegram"
},
"TIKTOK": {
- "PLACEHOLDER": "Add TikTok"
+ "PLACEHOLDER": "Lisa TikTok"
},
"LINKEDIN": {
- "PLACEHOLDER": "Add LinkedIn"
+ "PLACEHOLDER": "Lisa LinkedIn"
},
"TWITTER": {
- "PLACEHOLDER": "Add Twitter"
+ "PLACEHOLDER": "Lisa Twitter"
}
}
},
@@ -492,12 +492,12 @@
},
"AVATAR": {
"UPLOAD": {
- "ERROR_MESSAGE": "Could not upload avatar. Please try again later.",
+ "ERROR_MESSAGE": "Avatari üleslaadimine ebaõnnestus. Palun proovi hiljem uuesti.",
"SUCCESS_MESSAGE": "Avatar üles laaditud edukalt"
},
"DELETE": {
"SUCCESS_MESSAGE": "Avatar kustutatud edukalt",
- "ERROR_MESSAGE": "Could not delete avatar. Please try again later."
+ "ERROR_MESSAGE": "Avatari kustutamine ebaõnnestus. Palun proovi hiljem uuesti."
}
}
},
@@ -538,7 +538,7 @@
},
"MERGE": {
"TITLE": "Ühenda kontakt",
- "DESCRIPTION": "Combine two profiles into one, including all attributes and conversations. In case of conflict, the primary contact’s attributes will take precedence.",
+ "DESCRIPTION": "Ühenda kaks profiili üheks, sealhulgas kõik atribuudid ja vestlused. Vastuolu korral eelistatakse peamise kontakti atribuute.",
"PRIMARY": "Peamine kontakt",
"PRIMARY_HELP_LABEL": "Salvestamiseks",
"PRIMARY_REQUIRED_ERROR": "Palun valige ühendamiseks kontakt enne jätkamist",
diff --git a/app/javascript/dashboard/i18n/locale/et/conversation.json b/app/javascript/dashboard/i18n/locale/et/conversation.json
index d13527451..d220e4801 100644
--- a/app/javascript/dashboard/i18n/locale/et/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/et/conversation.json
@@ -214,7 +214,7 @@
"DRAG_DROP": "Lohista siia manusena lisamiseks",
"START_AUDIO_RECORDING": "Alusta heli salvestamist",
"STOP_AUDIO_RECORDING": "Peata heli salvestamine",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot mõtleb",
"EMAIL_HEAD": {
"TO": "SAJALE",
"ADD_BCC": "Add bcc",
diff --git a/app/javascript/dashboard/i18n/locale/et/helpCenter.json b/app/javascript/dashboard/i18n/locale/et/helpCenter.json
index d43b39bb8..757886844 100644
--- a/app/javascript/dashboard/i18n/locale/et/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/et/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Keel on portaalist edukalt eemaldatud",
"ERROR_MESSAGE": "Keelt ei õnnestunud portaalist eemaldada. Proovi uuesti."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} artikkel | {count} artiklit",
"CATEGORIES_COUNT": "{count} kategooria | {count} kategooriat",
"DEFAULT": "Vaikimisi",
+ "DRAFT": "Mustand",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Määra vaikimisi",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Kustuta"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Vali keel..."
},
+ "STATUS": {
+ "LABEL": "Status",
+ "OPTIONS": {
+ "LIVE": "Avaldatud",
+ "DRAFT": "Mustand"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Keel lisatud edukalt",
"ERROR_MESSAGE": "Keelt ei õnnestunud lisada. Proovi uuesti."
diff --git a/app/javascript/dashboard/i18n/locale/et/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/et/inboxMgmt.json
index 9568ab1cb..4a84bf948 100644
--- a/app/javascript/dashboard/i18n/locale/et/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/et/inboxMgmt.json
@@ -1,13 +1,13 @@
{
"INBOX_MGMT": {
"HEADER": "Postkastid",
- "DESCRIPTION": "A channel is the mode of communication your customer chooses to interact with you. An inbox is where you manage interactions for a specific channel. It can include communications from various sources such as email, live chat, and social media.",
- "LEARN_MORE": "Learn more about inboxes",
+ "DESCRIPTION": "Kanal on suhtlusviis, mille teie klient valib teiega suhtlemiseks. Postkast on koht, kus haldate konkreetse kanali suhtlusi. See võib sisaldada suhtlust eri allikatest, nagu e-post, reaalajas vestlus ja sotsiaalmeedia.",
+ "LEARN_MORE": "Lisateave postkastide kohta",
"COUNT": "{n} inbox | {n} inboxes",
"SEARCH_PLACEHOLDER": "Search inboxes...",
"NO_RESULTS": "No inboxes found matching your search",
- "RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
- "CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "RECONNECTION_REQUIRED": "Teie postkast on lahti ühendatud. Te ei saa uusi sõnumeid enne, kui volitate selle uuesti.",
+ "CLICK_TO_RECONNECT": "Taasühendamiseks klõpsake siin.",
"WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
"COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
@@ -15,20 +15,20 @@
},
"CREATE_FLOW": {
"CHANNEL": {
- "TITLE": "Choose Channel",
- "BODY": "Choose the provider you want to integrate with Chatwoot."
+ "TITLE": "Vali kanal",
+ "BODY": "Valige teenusepakkuja, mille soovite Chatwootiga siduda."
},
"INBOX": {
- "TITLE": "Create Inbox",
- "BODY": "Authenticate your account and create an inbox."
+ "TITLE": "Loo postkast",
+ "BODY": "Autentige oma konto ja looge postkast."
},
"AGENT": {
- "TITLE": "Add Agents",
- "BODY": "Add agents to the created inbox."
+ "TITLE": "Lisa agendid",
+ "BODY": "Lisage loodud postkasti agendid."
},
"FINISH": {
- "TITLE": "Voilà!",
- "BODY": "You are all set to go!"
+ "TITLE": "Valmis!",
+ "BODY": "Kõik on valmis!"
}
},
"ADD": {
@@ -47,18 +47,18 @@
"CHOOSE_PLACEHOLDER": "Valige nimekirjast leht",
"INBOX_NAME": "Postkasti nimi",
"ADD_NAME": "Lisa oma postkastile nimi",
- "PICK_NAME": "Pick a Name for your Inbox",
+ "PICK_NAME": "Valige oma postkastile nimi",
"PICK_A_VALUE": "Vali väärtus",
- "CREATE_INBOX": "Create Inbox"
+ "CREATE_INBOX": "Loo postkast"
},
"INSTAGRAM": {
- "CONTINUE_WITH_INSTAGRAM": "Continue with Instagram",
- "CONNECT_YOUR_INSTAGRAM_PROFILE": "Connect your Instagram Profile",
- "HELP": "To add your Instagram profile as a channel, you need to authenticate your Instagram Profile by clicking on 'Continue with Instagram' ",
- "ERROR_MESSAGE": "There was an error connecting to Instagram, please try again",
- "ERROR_AUTH": "There was an error connecting to Instagram, please try again",
- "NEW_INBOX_SUGGESTION": "This Instagram account was previously linked to a different inbox and has now been migrated here. All new messages will appear here. The old inbox will no longer be able to send or receive messages for this account.",
- "DUPLICATE_INBOX_BANNER": "This Instagram account was migrated to the new Instagram channel inbox. You won’t be able to send/receive Instagram messages from this inbox anymore."
+ "CONTINUE_WITH_INSTAGRAM": "Jätka Instagramiga",
+ "CONNECT_YOUR_INSTAGRAM_PROFILE": "Ühenda oma Instagrami profiil",
+ "HELP": "Instagrami profiili kanali lisamiseks peate autentima oma Instagrami profiili, klõpsates nupul 'Jätka Instagramiga'.",
+ "ERROR_MESSAGE": "Instagramiga ühendamisel tekkis viga, palun proovige uuesti",
+ "ERROR_AUTH": "Instagramiga ühendamisel tekkis viga, palun proovige uuesti",
+ "NEW_INBOX_SUGGESTION": "See Instagrami konto oli varem seotud teise postkastiga ja on nüüd siia üle viidud. Kõik uued sõnumid kuvatakse siin. Vana postkast ei saa selle konto jaoks enam sõnumeid saata ega vastu võtta.",
+ "DUPLICATE_INBOX_BANNER": "See Instagrami konto viidi üle uue Instagrami kanali postkasti. Sellest postkastist ei saa te enam Instagrami sõnumeid saata ega vastu võtta."
},
"TIKTOK": {
"CONTINUE_WITH_TIKTOK": "Continue with TikTok",
@@ -83,7 +83,7 @@
},
"CHANNEL_WEBHOOK_URL": {
"LABEL": "Veebikonksu URL",
- "PLACEHOLDER": "Please enter your Webhook URL",
+ "PLACEHOLDER": "Palun sisestage oma webhooki URL",
"ERROR": "Palun sisesta kehtiv URL"
},
"CHANNEL_DOMAIN": {
@@ -164,7 +164,7 @@
"ERROR": "See väli on kohustuslik"
},
"PHONE_NUMBER": {
- "LABEL": "Phone Number",
+ "LABEL": "Telefoninumber",
"PLACEHOLDER": "Palun sisestage telefoninumber, millest sõnum saadetakse.",
"ERROR": "Palun sisestage kehtiv telefoninumber, mis algab märgiga `+` ja ei sisalda tühikuid."
},
@@ -196,12 +196,12 @@
},
"API_KEY": {
"LABEL": "API võti",
- "PLACEHOLDER": "Please enter your Bandwidth API Key",
+ "PLACEHOLDER": "Palun sisestage oma Bandwidth API võti",
"ERROR": "See väli on kohustuslik"
},
"API_SECRET": {
"LABEL": "API saladus",
- "PLACEHOLDER": "Please enter your Bandwidth API Secret",
+ "PLACEHOLDER": "Palun sisestage oma Bandwidth API saladus",
"ERROR": "See väli on kohustuslik"
},
"APPLICATION_ID": {
@@ -237,13 +237,13 @@
"WHATSAPP_EMBEDDED": "WhatsApp Business",
"TWILIO": "Twilio",
"WHATSAPP_CLOUD": "WhatsApp Cloud",
- "WHATSAPP_CLOUD_DESC": "Quick setup through Meta",
- "TWILIO_DESC": "Connect via Twilio credentials",
+ "WHATSAPP_CLOUD_DESC": "Kiire seadistus Meta kaudu",
+ "TWILIO_DESC": "Ühenda Twilio andmetega",
"360_DIALOG": "360Dialog"
},
"SELECT_PROVIDER": {
- "TITLE": "Select your API provider",
- "DESCRIPTION": "Choose your WhatsApp provider. You can connect directly through Meta which requires no setup, or connect through Twilio using your account credentials."
+ "TITLE": "Vali API pakkuja",
+ "DESCRIPTION": "Vali oma WhatsAppi pakkuja. Saad ühendada otse Meta kaudu ilma seadistamiseta või kasutada Twilio kontotunnuseid."
},
"INBOX_NAME": {
"LABEL": "Sissetuleva postkasti nimi",
@@ -267,7 +267,7 @@
},
"WEBHOOK_VERIFY_TOKEN": {
"LABEL": "Webhook kinnituse token",
- "PLACEHOLDER": "Enter a verify token which you want to configure for Facebook webhooks.",
+ "PLACEHOLDER": "Sisestage kinnitustoken, mida soovite Facebooki webhookide jaoks seadistada.",
"ERROR": "Palun sisesta kehtiv väärtus."
},
"API_KEY": {
@@ -287,16 +287,16 @@
"TITLE": "Quick setup with Meta",
"DESC": "Use the WhatsApp Embedded Signup flow to quickly connect new numbers. You will be redirected to Meta to log into your WhatsApp Business account. Having admin access will help make the setup smooth and easy.",
"BENEFITS": {
- "TITLE": "Benefits of Embedded Signup:",
- "EASY_SETUP": "No manual configuration required",
- "SECURE_AUTH": "Secure OAuth based authentication",
- "AUTO_CONFIG": "Automatic webhook and phone number configuration"
+ "TITLE": "Sisseehitatud registreerimise eelised:",
+ "EASY_SETUP": "Käsitsi seadistamine pole vajalik",
+ "SECURE_AUTH": "Turvaline OAuth-põhine autentimine",
+ "AUTO_CONFIG": "Automaatne webhooki ja telefoninumbri seadistus"
},
"LEARN_MORE": {
"TEXT": "To learn more about integrated signup, pricing, and limitations, visit {link}.",
"LINK_TEXT": "this link"
},
- "SUBMIT_BUTTON": "Connect with WhatsApp Business",
+ "SUBMIT_BUTTON": "Ühenda WhatsApp Businessiga",
"AUTH_PROCESSING": "Authenticating with Meta",
"WAITING_FOR_BUSINESS_INFO": "Please complete business setup in the Meta window...",
"PROCESSING": "Setting up your WhatsApp Business Account",
@@ -316,33 +316,33 @@
}
},
"VOICE": {
- "TITLE": "Voice Channel",
- "DESC": "Integrate Twilio Voice and start supporting your customers via phone calls.",
+ "TITLE": "Kõnekanal",
+ "DESC": "Integreeri Twilio Voice ja alusta klientide toetamist telefonikõnede kaudu.",
"PHONE_NUMBER": {
- "LABEL": "Phone Number",
- "PLACEHOLDER": "Enter your phone number (e.g. +1234567890)",
- "ERROR": "Please provide a valid phone number in E.164 format (e.g. +1234567890)"
+ "LABEL": "Telefoninumber",
+ "PLACEHOLDER": "Sisesta oma telefoninumber (nt +1234567890)",
+ "ERROR": "Palun sisesta kehtiv telefoninumber E.164 formaadis (nt +1234567890)"
},
"TWILIO": {
"ACCOUNT_SID": {
- "LABEL": "Account SID",
- "PLACEHOLDER": "Enter your Twilio Account SID",
- "REQUIRED": "Account SID is required"
+ "LABEL": "Konto SID",
+ "PLACEHOLDER": "Sisesta oma Twilio Account SID",
+ "REQUIRED": "Account SID on kohustuslik"
},
"AUTH_TOKEN": {
- "LABEL": "Auth Token",
- "PLACEHOLDER": "Enter your Twilio Auth Token",
- "REQUIRED": "Auth Token is required"
+ "LABEL": "Autentimismärgis",
+ "PLACEHOLDER": "Sisesta oma Twilio autentimismärgis",
+ "REQUIRED": "Autentimismärgis on kohustuslik"
},
"API_KEY_SID": {
- "LABEL": "API Key SID",
- "PLACEHOLDER": "Enter your Twilio API Key SID",
- "REQUIRED": "API Key SID is required"
+ "LABEL": "API võtme SID",
+ "PLACEHOLDER": "Sisesta oma Twilio API võtme SID",
+ "REQUIRED": "API Key SID on kohustuslik"
},
"API_KEY_SECRET": {
- "LABEL": "API Key Secret",
- "PLACEHOLDER": "Enter your Twilio API Key Secret",
- "REQUIRED": "API Key Secret is required"
+ "LABEL": "API võtme saladus",
+ "PLACEHOLDER": "Sisesta oma Twilio API Key Secret",
+ "REQUIRED": "API Key Secret on kohustuslik"
}
},
"CONFIGURATION": {
@@ -351,9 +351,9 @@
"TWILIO_STATUS_URL_TITLE": "Twilio Status Callback URL",
"TWILIO_STATUS_URL_SUBTITLE": "Configure this URL as the Status Callback URL on your Twilio phone number."
},
- "SUBMIT_BUTTON": "Create Voice Channel",
+ "SUBMIT_BUTTON": "Loo kõnekanal",
"API": {
- "ERROR_MESSAGE": "We were not able to create the voice channel"
+ "ERROR_MESSAGE": "Häälekanalit ei õnnestunud luua"
}
},
"API_CHANNEL": {
@@ -365,9 +365,9 @@
"ERROR": "See väli on kohustuslik"
},
"WEBHOOK_URL": {
- "LABEL": "Webhook URL",
- "SUBTITLE": "Configure the URL where you want to receive callbacks on events.",
- "PLACEHOLDER": "Webhook URL"
+ "LABEL": "Veebikonksu URL",
+ "SUBTITLE": "Seadistage URL, kuhu soovite sündmuste tagasikutsed vastu võtta.",
+ "PLACEHOLDER": "Veebikonksu URL"
},
"SUBMIT_BUTTON": "Loo API kanal",
"API": {
@@ -376,7 +376,7 @@
},
"EMAIL_CHANNEL": {
"TITLE": "E-posti kanal",
- "DESC": "Integrate your email inbox.",
+ "DESC": "Ühendage oma e-posti postkast.",
"CHANNEL_NAME": {
"LABEL": "Kanali nimi",
"PLACEHOLDER": "Palun sisesta kanali nimi",
@@ -494,7 +494,7 @@
"AGENTS": {
"TITLE": "Agendid",
"DESC": "Siin saate lisada agente, kes haldavad teie äsja loodud postkasti. Ainult valitud agendid pääsevad teie postkastile ligi. Agendid, kes ei kuulu sellesse postkasti, ei näe ega saa vastata selle postkasti sõnumitele, kui nad sisse logivad. PS: Administraatorina, kui vajate ligipääsu kõigile postkastidele, peaksite lisama end agentideks kõigisse loodud postkastidesse.",
- "VALIDATION_ERROR": "Add at least one agent to your new Inbox",
+ "VALIDATION_ERROR": "Lisage oma uude postkasti vähemalt üks agent",
"PICK_AGENTS": "Vali postkasti agendid"
},
"DETAILS": {
@@ -513,23 +513,23 @@
"TITLE": "Microsofti e-post",
"DESCRIPTION": "Alustamiseks klõpsake nuppu Logi sisse Microsoftiga. Teid suunatakse e-posti sisselogimise lehele. Kui aktsepteerite nõutud õigused, suunatakse teid tagasi postkasti loomise sammu juurde.",
"EMAIL_PLACEHOLDER": "Sisestage e-posti aadress",
- "SIGN_IN": "Sign in with Microsoft",
+ "SIGN_IN": "Logi sisse Microsoftiga",
"ERROR_MESSAGE": "Microsoftiga ühendamisel tekkis viga, palun proovige uuesti"
},
"GOOGLE": {
- "TITLE": "Google Email",
- "DESCRIPTION": "Click on the Sign in with Google button to get started. You will redirected to the email sign in page. Once you accept the requested permissions, you would be redirected back to the inbox creation step.",
- "SIGN_IN": "Sign in with Google",
- "EMAIL_PLACEHOLDER": "Enter email address",
- "ERROR_MESSAGE": "There was an error connecting to Google, please try again"
+ "TITLE": "Google'i e-post",
+ "DESCRIPTION": "Alustamiseks klõpsake nuppu 'Logi sisse Google'iga'. Teid suunatakse e-posti sisselogimislehele. Kui olete nõutud õigused kinnitanud, suunatakse teid tagasi postkasti loomise sammu juurde.",
+ "SIGN_IN": "Logi sisse Google'iga",
+ "EMAIL_PLACEHOLDER": "Sisesta e-posti aadress",
+ "ERROR_MESSAGE": "Google'iga ühendamisel tekkis viga, palun proovige uuesti"
}
},
"DETAILS": {
"LOADING_FB": "Autendime teid Facebookiga...",
- "ERROR_FB_LOADING": "Error loading Facebook SDK. Please disable any ad-blockers and try again from a different browser.",
+ "ERROR_FB_LOADING": "Facebooki SDK laadimisel tekkis viga. Palun keelake reklaamiblokeerijad ja proovige uuesti mõne teise brauseriga.",
"ERROR_FB_AUTH": "Midagi läks valesti, palun värskendage lehte...",
"ERROR_FB_UNAUTHORIZED": "Teil ei ole selle toimingu tegemiseks õigusi. ",
- "ERROR_FB_UNAUTHORIZED_HELP": "Please ensure you have access to the Facebook page with full control. You can read more about Facebook roles here .",
+ "ERROR_FB_UNAUTHORIZED_HELP": "Veenduge, et teil oleks täieliku juhtimisõigusega juurdepääs Facebooki lehele. Facebooki rollide kohta saate rohkem lugeda siit .",
"CREATING_CHANNEL": "Loomas teie postkasti...",
"TITLE": "Seadista postkasti üksikasjad",
"DESC": ""
@@ -566,7 +566,7 @@
},
"SENDER_NAME_SECTION": {
"TITLE": "Saatja nimi",
- "SUB_TEXT": "Select the name shown to your customer when they receive emails from your agents.",
+ "SUB_TEXT": "Valige nimi, mida teie klient näeb, kui ta saab teie agentidelt e-kirju.",
"FOR_EG": "Näiteks:",
"FRIENDLY": {
"TITLE": "Sõbralik",
@@ -755,7 +755,7 @@
"ALLOW_MESSAGES_AFTER_RESOLVED": "Luba sõnumid pärast vestluse lahendamist",
"ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Luba lõppkasutajatel saata sõnumeid ka pärast vestluse lahendamist.",
"WHATSAPP_SECTION_SUBHEADER": "Seda API võtit kasutatakse WhatsApp API-dega integreerimiseks.",
- "WHATSAPP_SECTION_UPDATE_SUBHEADER": "Enter the new API key to be used for the integration with the WhatsApp APIs.",
+ "WHATSAPP_SECTION_UPDATE_SUBHEADER": "Sisestage uus API võti, mida kasutatakse WhatsAppi API-dega integreerimiseks.",
"WHATSAPP_SECTION_TITLE": "API võti",
"WHATSAPP_SECTION_UPDATE_TITLE": "Uuenda API-võtit",
"WHATSAPP_SECTION_UPDATE_PLACEHOLDER": "Sisesta siia uus API-võti",
@@ -775,7 +775,7 @@
"WHATSAPP_APP_ID_MISSING": "WhatsApp App ID is not configured. Please contact your administrator.",
"WHATSAPP_CONFIG_ID_MISSING": "WhatsApp Configuration ID is not configured. Please contact your administrator.",
"WHATSAPP_LOGIN_CANCELLED": "WhatsApp login was cancelled. Please try again.",
- "WHATSAPP_WEBHOOK_TITLE": "Webhook Verification Token",
+ "WHATSAPP_WEBHOOK_TITLE": "Webhooki kinnitustoken",
"WHATSAPP_WEBHOOK_SUBHEADER": "Seda märki kasutatakse veebikonksu lõpp-punkti autentsuse kontrollimiseks.",
"WHATSAPP_TEMPLATES_SYNC_TITLE": "Sync Templates",
"WHATSAPP_TEMPLATES_SYNC_SUBHEADER": "Manually sync message templates from WhatsApp to update your available templates.",
@@ -876,14 +876,14 @@
}
},
"CSAT": {
- "TITLE": "Enable CSAT",
- "SUBTITLE": "Automatically trigger CSAT surveys at the end of conversations to understand how customers feel about their support experience. Track satisfaction trends and identify areas for improvement over time.",
+ "TITLE": "Luba CSAT",
+ "SUBTITLE": "Käivitage vestluste lõpus automaatselt CSAT-küsitlused, et mõista, kuidas kliendid oma toe kogemust tajuvad. Jälgige rahulolu trende ja leidke aja jooksul parenduskohti.",
"DISPLAY_TYPE": {
- "LABEL": "Display type"
+ "LABEL": "Kuvamisviis"
},
"MESSAGE": {
- "LABEL": "Message",
- "PLACEHOLDER": "Please enter a message to show users with the form"
+ "LABEL": "Sõnum",
+ "PLACEHOLDER": "Palun sisestage sõnum, mida vormiga kasutajatele kuvada"
},
"BUTTON_TEXT": {
"LABEL": "Button text",
@@ -929,20 +929,20 @@
}
},
"SURVEY_RULE": {
- "LABEL": "Survey rule",
- "DESCRIPTION_PREFIX": "Send the survey if the conversation",
- "DESCRIPTION_SUFFIX": "any of the labels",
+ "LABEL": "Küsitluse reegel",
+ "DESCRIPTION_PREFIX": "Saada küsitlus, kui vestlus",
+ "DESCRIPTION_SUFFIX": "mõnda silti",
"OPERATOR": {
- "CONTAINS": "contains",
- "DOES_NOT_CONTAINS": "does not contain"
+ "CONTAINS": "sisaldab",
+ "DOES_NOT_CONTAINS": "ei sisalda"
},
- "SELECT_PLACEHOLDER": "select labels"
+ "SELECT_PLACEHOLDER": "vali sildid"
},
- "NOTE": "Note: CSAT surveys are sent only once per conversation",
+ "NOTE": "Märkus: CSAT-küsitlused saadetakse iga vestluse kohta vaid korra",
"WHATSAPP_NOTE": "Note: When you save, the system creates a dedicated CSAT template in WhatsApp (used to capture rating and feedback in reports) and submits it as Utility for approval. Meta may still classify it as Marketing based on content. After approval, surveys are sent only once per conversation as per the survey rule.",
"API": {
- "SUCCESS_MESSAGE": "CSAT settings updated successfully",
- "ERROR_MESSAGE": "We couldn't update CSAT settings. Please try again later."
+ "SUCCESS_MESSAGE": "CSAT-i seaded on edukalt uuendatud",
+ "ERROR_MESSAGE": "CSAT-i seadeid ei õnnestunud uuendada. Palun proovi hiljem uuesti."
}
},
"BUSINESS_HOURS": {
@@ -953,7 +953,7 @@
"UPDATE": "Uuenda tööaja seadeid",
"TOGGLE_AVAILABILITY": "Luba selle postkasti tööaja kättesaadavus",
"UNAVAILABLE_MESSAGE_LABEL": "Külastajatele saadetav teade, kui pole saadaval",
- "TOGGLE_HELP": "Enabling business availability will show the available hours on live chat widget even if all the agents are offline. Outside available hours visitors can be warned with a message and a pre-chat form.",
+ "TOGGLE_HELP": "Tööaja kättesaadavuse lubamine kuvab reaalajas vestluse vidinas saadaval olevad ajad isegi siis, kui kõik agendid on võrguühenduseta. Väljaspool saadaolevaid aegu saab külastajaid hoiatada sõnumi ja vestluseelse vormiga.",
"DAY": {
"DAY": "Day",
"AVAILABILITY": "Availability",
@@ -971,7 +971,7 @@
"NOTE_TEXT": "SMTP lubamiseks seadistage palun IMAP.",
"UPDATE": "Uuenda IMAP seadeid",
"TOGGLE_AVAILABILITY": "Luba IMAP konfiguratsioon selle sissetuleva postkasti jaoks",
- "TOGGLE_HELP": "Enabling IMAP will help the user to receive email",
+ "TOGGLE_HELP": "IMAP-i lubamine aitab kasutajal e-kirju vastu võtta",
"EDIT": {
"SUCCESS_MESSAGE": "IMAP seaded uuendati edukalt",
"ERROR_MESSAGE": "IMAP seadete uuendamine ebaõnnestus"
@@ -1134,18 +1134,18 @@
},
"CHANNELS": {
"MESSENGER": "Messenger",
- "WEB_WIDGET": "Website",
+ "WEB_WIDGET": "Veebisait",
"TWITTER_PROFILE": "Twitter",
"TWILIO_SMS": "Twilio SMS",
"WHATSAPP": "WhatsApp",
"SMS": "SMS",
- "EMAIL": "Email",
+ "EMAIL": "E-post",
"TELEGRAM": "Telegram",
"LINE": "Line",
- "API": "API Channel",
+ "API": "API kanal",
"INSTAGRAM": "Instagram",
"TIKTOK": "TikTok",
- "VOICE": "Voice"
+ "VOICE": "Hääl"
}
}
}
diff --git a/app/javascript/dashboard/i18n/locale/et/integrations.json b/app/javascript/dashboard/i18n/locale/et/integrations.json
index 848c099c7..e84e65737 100644
--- a/app/javascript/dashboard/i18n/locale/et/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/et/integrations.json
@@ -392,10 +392,10 @@
"NAME": "Kapten",
"HEADER_KNOW_MORE": "Lisateave",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "ASSISTANTS": "Abilised",
+ "SWITCH_ASSISTANT": "Vaheta assistentide vahel",
+ "NEW_ASSISTANT": "Loo assistent",
+ "EMPTY_LIST": "Assistentide leidmine ebaõnnestus, alustamiseks loo palun üks."
},
"COPILOT": {
"TITLE": "Kaaslane",
@@ -449,7 +449,7 @@
"CANCEL_ANYTIME": "Saate oma plaani igal ajal muuta või tühistada"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
+ "AVAILABLE_ON": "Captain AI on saadaval ainult ettevõtte plaanides.",
"UPGRADE_PROMPT": "Uuendage oma plaani, et saada ligipääs meie assistentidele, copiloti ja muule.",
"ASK_ADMIN": "Palun pöörduge uuenduse saamiseks oma administraatori poole."
},
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Dokumendid",
"ADD_NEW": "Loo uus dokument",
+ "SELECTED": "{count} valitud",
+ "SELECT_ALL": "Select all ({count})",
+ "UNSELECT_ALL": "Unselect all ({count})",
+ "BULK_DELETE_BUTTON": "Delete",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Jah, kustuta kõik",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Seotud KKK-d",
"DESCRIPTION": "Need KKK-d on loodud otse dokumendist."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Description",
diff --git a/app/javascript/dashboard/i18n/locale/fa/conversation.json b/app/javascript/dashboard/i18n/locale/fa/conversation.json
index dbf199ba4..5ce6b8a43 100644
--- a/app/javascript/dashboard/i18n/locale/fa/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/fa/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "امضای پیام پیکربندی نشده است، لطفاً آن را در تنظیمات نمایه پیکربندی کنید.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "دستورهای اضافی به Copilot بدهید، یا هر سوال دیگری بپرسید... برای ارسال پاسخ بعدی اینتر بزنید",
"CLICK_HERE": "برای به روز رسانی اینجا را کلیک کنید",
"WHATSAPP_TEMPLATES": "قالب های واتساپ"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "برای ضمیمه کردن درگ و درآپ کنید",
"START_AUDIO_RECORDING": "در حال شروع ضبط صدا",
"STOP_AUDIO_RECORDING": "در حال توقف ضبط صدا",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot در حال فکر کردن است",
"EMAIL_HEAD": {
"TO": "به",
"ADD_BCC": "افزودن رونوشت",
diff --git a/app/javascript/dashboard/i18n/locale/fa/helpCenter.json b/app/javascript/dashboard/i18n/locale/fa/helpCenter.json
index 710943eee..7b211d718 100644
--- a/app/javascript/dashboard/i18n/locale/fa/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/fa/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "زبان محلی با موفقیت از پورتال حذف شد",
"ERROR_MESSAGE": "حذف زبان محلی از پورتال ممکن نیست. دوباره امتحان کنید."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "پیشفرض",
+ "DRAFT": "پیشنویس",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "حذف"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "انتخاب زبان..."
},
+ "STATUS": {
+ "LABEL": "وضعیت",
+ "OPTIONS": {
+ "LIVE": "منتشر شد",
+ "DRAFT": "پیشنویس"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "زبان محلی با موفقیت اضافه شد",
"ERROR_MESSAGE": "امکان افزودن زبان محلی وجود ندارد. دوباره امتحان کنید."
diff --git a/app/javascript/dashboard/i18n/locale/fa/integrations.json b/app/javascript/dashboard/i18n/locale/fa/integrations.json
index bee40520e..492563c8d 100644
--- a/app/javascript/dashboard/i18n/locale/fa/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/fa/integrations.json
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Captain",
- "HEADER_KNOW_MORE": "Know more",
+ "HEADER_KNOW_MORE": "اطلاعات بیشتر",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "ASSISTANTS": "دستیارها",
+ "SWITCH_ASSISTANT": "جابهجایی بین دستیارها",
+ "NEW_ASSISTANT": "ایجاد دستیار",
+ "EMPTY_LIST": "هیچ دستیار یافت نشد، لطفاً یکی ایجاد کنید تا شروع کنید"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "PANEL_TITLE": "شروع به کار با Copilot",
+ "KICK_OFF_MESSAGE": "نیاز به خلاصه سریع، چک کردن مکالمات گذشته یا نوشتن پاسخ بهتر دارید؟ Copilot اینجا است تا سرعت کار را افزایش دهد.",
"SEND_MESSAGE": "ارسال پیام...",
- "EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
- "LOADER": "Captain is thinking",
+ "EMPTY_MESSAGE": "خطا در تولید پاسخ رخ داد. لطفاً دوباره تلاش کنید.",
+ "LOADER": "Captain در حال فکر کردن است",
"YOU": "شما",
- "USE": "Use this",
- "RESET": "Reset",
- "SHOW_STEPS": "Show steps",
- "SELECT_ASSISTANT": "Select Assistant",
+ "USE": "استفاده از این",
+ "RESET": "تنظیم مجدد",
+ "SHOW_STEPS": "نمایش مراحل",
+ "SELECT_ASSISTANT": "انتخاب دستیار",
"PROMPTS": {
"SUMMARIZE": {
- "LABEL": "Summarize this conversation",
- "CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
+ "LABEL": "خلاصه این مکالمه",
+ "CONTENT": "نکات کلیدی مطرح شده بین مشتری و نماینده پشتیبانی شامل نگرانیها، سوالات و راهحلها یا پاسخهای ارائه شده را خلاصه کن"
},
"SUGGEST": {
- "LABEL": "Suggest an answer",
- "CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
+ "LABEL": "پیشنهاد پاسخ",
+ "CONTENT": "درخواست مشتری را تحلیل کن و پاسخی بنویس که به طور مؤثر نگرانیها یا سوالاتش را برطرف کند. مطمئن شو پاسخ واضح، مختصر و مفید باشد."
},
"RATE": {
- "LABEL": "Rate this conversation",
- "CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
+ "LABEL": "امتیاز دادن به این مکالمه",
+ "CONTENT": "مکالمه را بررسی کن تا ببینی چقدر نیازهای مشتری را پاسخ داده است. امتیازی از ۵ بر اساس لحن، وضوح و اثربخشی بده."
},
"HIGH_PRIORITY": {
- "LABEL": "High priority conversations",
- "CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
+ "LABEL": "مکالمات با اولویت بالا",
+ "CONTENT": "خلاصهای از همه مکالمات با اولویت بالا که باز هستند بدهید. شامل شناسه مکالمه، نام مشتری (در صورت موجود بودن)، محتوای پیام آخر و نماینده اختصاص داده شده. در صورت لزوم بر اساس وضعیت گروهبندی کنید."
},
"LIST_CONTACTS": {
- "LABEL": "List contacts",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "LABEL": "فهرست مخاطبین",
+ "CONTENT": "فهرست ۱۰ مخاطب برتر را نشان بده. شامل نام، ایمیل یا شماره تلفن (در صورت موجود بودن)، زمان آخرین حضور، برچسبها (در صورت وجود)."
}
}
},
"PLAYGROUND": {
"USER": "شما",
- "ASSISTANT": "Assistant",
+ "ASSISTANT": "دستیار",
"MESSAGE_PLACEHOLDER": "پیام خود را وارد کنید...",
- "HEADER": "Playground",
- "DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
- "CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
+ "HEADER": "زمین بازی",
+ "DESCRIPTION": "از این زمین بازی استفاده کنید تا پیامهایی به دستیار خود بفرستید و بررسی کنید که پاسخها دقیق، سریع و با لحن مورد انتظار شما باشند.",
+ "CREDIT_NOTE": "پیامهای ارسال شده اینجا، از اعتبارهای Captain شما کسر خواهد شد."
},
"PAYWALL": {
- "TITLE": "Upgrade to use Captain AI",
- "AVAILABLE_ON": "Captain is not available on the free plan.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "TITLE": "برای استفاده از Captain AI ارتقا دهید",
+ "AVAILABLE_ON": "Captain در پلن رایگان در دسترس نیست.",
+ "UPGRADE_PROMPT": "پلن خود را ارتقا دهید تا به دستیارها، Copilot و امکانات بیشتر دسترسی پیدا کنید.",
"UPGRADE_NOW": "حالا ارتقا دهید",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "AVAILABLE_ON": "Captain AI فقط در طرحهای Enterprise در دسترس است.",
+ "UPGRADE_PROMPT": "پلن خود را ارتقا دهید تا به دستیارها، Copilot و امکانات بیشتر دسترسی پیدا کنید.",
"ASK_ADMIN": "لطفاً برای ارتقا با ادمین خود تماس بگیرید."
},
"BANNER": {
- "RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
- "DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
+ "RESPONSES": "بیش از ۸۰٪ از حد پاسخهای خود را استفاده کردهاید. برای ادامه استفاده از Captain AI لطفاً ارتقا دهید.",
+ "DOCUMENTS": "حد سندها به پایان رسید. برای ادامه استفاده از Captain AI پلن خود را ارتقا دهید."
},
"FORM": {
"CANCEL": "انصراف",
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
+ "SELECTED": "{count} selected",
+ "SELECT_ALL": "Select all ({count})",
+ "UNSELECT_ALL": "Unselect all ({count})",
+ "BULK_DELETE_BUTTON": "حذف",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Yes, delete all",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "توضیحات",
diff --git a/app/javascript/dashboard/i18n/locale/fi/conversation.json b/app/javascript/dashboard/i18n/locale/fi/conversation.json
index 54cc45b93..7aa774aec 100644
--- a/app/javascript/dashboard/i18n/locale/fi/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/fi/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Message signature is not configured, please configure it in profile settings.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "Anna copilottiin lisäkehotteita tai kysy mitä tahansa... Paina Enter lähettääksesi jatkokysymyksen",
"CLICK_HERE": "Click here to update",
"WHATSAPP_TEMPLATES": "WhatsApp-pohjat"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Drag and drop here to attach",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot ajattelee",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Add bcc",
diff --git a/app/javascript/dashboard/i18n/locale/fi/helpCenter.json b/app/javascript/dashboard/i18n/locale/fi/helpCenter.json
index 7f5370936..26dbb291c 100644
--- a/app/javascript/dashboard/i18n/locale/fi/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/fi/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Locale removed from portal successfully",
"ERROR_MESSAGE": "Unable to remove locale from portal. Try again."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Default",
+ "DRAFT": "Draft",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Poista"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Select locale..."
},
+ "STATUS": {
+ "LABEL": "Tila",
+ "OPTIONS": {
+ "LIVE": "Published",
+ "DRAFT": "Draft"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Locale added successfully",
"ERROR_MESSAGE": "Unable to add locale. Try again."
diff --git a/app/javascript/dashboard/i18n/locale/fi/integrations.json b/app/javascript/dashboard/i18n/locale/fi/integrations.json
index c5e7224cb..2696dee05 100644
--- a/app/javascript/dashboard/i18n/locale/fi/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/fi/integrations.json
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Captain",
- "HEADER_KNOW_MORE": "Know more",
+ "HEADER_KNOW_MORE": "Lisätietoja",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "ASSISTANTS": "Assistentit",
+ "SWITCH_ASSISTANT": "Vaihda assistenttien välillä",
+ "NEW_ASSISTANT": "Luo assistentti",
+ "EMPTY_LIST": "Assistentteja ei löytynyt, luo yksi aloittaaksesi"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "PANEL_TITLE": "Aloita Copilotin kanssa",
+ "KICK_OFF_MESSAGE": "Tarvitsetko nopean yhteenvedon, haluatko tarkastella aiempia keskusteluja tai laatia paremman vastauksen? Copilot nopeuttaa asioita.",
"SEND_MESSAGE": "Lähetä viesti...",
- "EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
- "LOADER": "Captain is thinking",
+ "EMPTY_MESSAGE": "Vastetta ei voitu luoda, yritä uudelleen.",
+ "LOADER": "Captain ajattelee",
"YOU": "Sinä",
- "USE": "Use this",
- "RESET": "Reset",
- "SHOW_STEPS": "Show steps",
- "SELECT_ASSISTANT": "Select Assistant",
+ "USE": "Käytä tätä",
+ "RESET": "Nollaa",
+ "SHOW_STEPS": "Näytä vaiheet",
+ "SELECT_ASSISTANT": "Valitse assistentti",
"PROMPTS": {
"SUMMARIZE": {
- "LABEL": "Summarize this conversation",
- "CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
+ "LABEL": "Yhteenveto tästä keskustelusta",
+ "CONTENT": "Tee yhteenveto asiakkaan ja tukihenkilön välillä käydyn keskustelun keskeisistä kohdista, mukaan lukien asiakkaan huolet, kysymykset sekä tukihenkilön tarjoamat ratkaisut tai vastaukset."
},
"SUGGEST": {
- "LABEL": "Suggest an answer",
- "CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
+ "LABEL": "Ehdota vastausta",
+ "CONTENT": "Analysoi asiakkaan kysely ja laadi vastaus, joka käsittelee heidän huolensa tai kysymyksensä tehokkaasti. Varmista, että vastaus on selkeä, ytimekäs ja tarjoaa hyödyllistä tietoa."
},
"RATE": {
- "LABEL": "Rate this conversation",
- "CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
+ "LABEL": "Arvioi tämä keskustelu",
+ "CONTENT": "Arvioi keskustelu sen perusteella, kuinka hyvin se täyttää asiakkaan tarpeet. Anna arvio 1–5 sävyn, selkeyden ja tehokkuuden perusteella."
},
"HIGH_PRIORITY": {
- "LABEL": "High priority conversations",
- "CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
+ "LABEL": "Korkean prioriteetin keskustelut",
+ "CONTENT": "Anna yhteenveto kaikista korkean prioriteetin avoimista keskusteluista. Sisällytä keskustelun tunnus, asiakkaan nimi (jos saatavilla), viimeisen viestin sisältö ja nimetty agentti. Ryhmittele tilan mukaan, jos se on oleellista."
},
"LIST_CONTACTS": {
- "LABEL": "List contacts",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "LABEL": "Näytä kontaktit",
+ "CONTENT": "Näytä minulle 10 parhaan kontaktin lista. Sisällytä nimi, sähköposti tai puhelinnumero (jos saatavilla), viimeinen nähty aika ja tagit (jos sellaisia on)."
}
}
},
"PLAYGROUND": {
"USER": "Sinä",
- "ASSISTANT": "Assistant",
+ "ASSISTANT": "Assistentti",
"MESSAGE_PLACEHOLDER": "Kirjoita viestisi...",
- "HEADER": "Playground",
- "DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
- "CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
+ "HEADER": "Leikkikenttä",
+ "DESCRIPTION": "Käytä tätä leikkikenttää lähettääksesi viestejä assistentillesi ja tarkistaaksesi, vastaako se täsmällisesti, nopeasti ja odotetulla sävyllä.",
+ "CREDIT_NOTE": "Täällä lähetetyt viestit lasketaan Captain-krediitteihisi."
},
"PAYWALL": {
- "TITLE": "Upgrade to use Captain AI",
- "AVAILABLE_ON": "Captain is not available on the free plan.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "TITLE": "Päivitä käyttääksesi Captain AI:ta",
+ "AVAILABLE_ON": "Captain ei ole saatavilla ilmaisessa suunnitelmassa.",
+ "UPGRADE_PROMPT": "Päivitä tilauksesi saadaksesi pääsyn assistentteihimme, Copilotiin ja muihin ominaisuuksiin.",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "AVAILABLE_ON": "Captain AI on saatavilla vain Enterprise-suunnitelmissa.",
+ "UPGRADE_PROMPT": "Päivitä tilauksesi saadaksesi pääsyn assistentteihimme, Copilotiin ja muihin ominaisuuksiin.",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"BANNER": {
- "RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
- "DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
+ "RESPONSES": "Olet käyttänyt yli 80 % vastausrajastasi. Jatkaaksesi Captain AI:n käyttöä, päivitä tilauksesi.",
+ "DOCUMENTS": "Dokumenttiraja saavutettu. Päivitä jatkaaksesi Captain AI:n käyttöä."
},
"FORM": {
"CANCEL": "Peruuta",
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
+ "SELECTED": "{count} selected",
+ "SELECT_ALL": "Select all ({count})",
+ "UNSELECT_ALL": "Unselect all ({count})",
+ "BULK_DELETE_BUTTON": "Poista",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Yes, delete all",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Kuvaus",
diff --git a/app/javascript/dashboard/i18n/locale/fr/conversation.json b/app/javascript/dashboard/i18n/locale/fr/conversation.json
index f1c87af24..38d95de5a 100644
--- a/app/javascript/dashboard/i18n/locale/fr/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/fr/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "La signature du message n'est pas configurée, veuillez le configurer dans les paramètres du profil.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "Donnez à Copilot des consignes supplémentaires ou posez toute autre question... Appuyez sur Entrée pour envoyer un message de suivi",
"CLICK_HERE": "Cliquez ici pour mettre à jour",
"WHATSAPP_TEMPLATES": "Modèles WhatsApp"
},
@@ -214,7 +214,7 @@
"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",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot réfléchit",
"EMAIL_HEAD": {
"TO": "À",
"ADD_BCC": "Ajouter cci",
diff --git a/app/javascript/dashboard/i18n/locale/fr/helpCenter.json b/app/javascript/dashboard/i18n/locale/fr/helpCenter.json
index 95996ce4d..e20668ef2 100644
--- a/app/javascript/dashboard/i18n/locale/fr/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/fr/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "La langue a été supprimée du portail avec succès",
"ERROR_MESSAGE": "Impossible de supprimer la langue du portail. Réessayez."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Par défaut",
+ "DRAFT": "Brouillon",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Supprimer"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Choisir un paramètre régional..."
},
+ "STATUS": {
+ "LABEL": "État",
+ "OPTIONS": {
+ "LIVE": "Publié",
+ "DRAFT": "Brouillon"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Langue ajoutée avec succès",
"ERROR_MESSAGE": "Impossible d'ajouter la langue. Veuillez réessayer."
diff --git a/app/javascript/dashboard/i18n/locale/fr/integrations.json b/app/javascript/dashboard/i18n/locale/fr/integrations.json
index f5ffc198a..4bbc1b94b 100644
--- a/app/javascript/dashboard/i18n/locale/fr/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/fr/integrations.json
@@ -390,26 +390,26 @@
},
"CAPTAIN": {
"NAME": "Captain",
- "HEADER_KNOW_MORE": "Know more",
+ "HEADER_KNOW_MORE": "En savoir plus",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "ASSISTANTS": "Assistants IA",
+ "SWITCH_ASSISTANT": "Changer d’assistant",
+ "NEW_ASSISTANT": "Créer un assistant",
+ "EMPTY_LIST": "Aucun assistant trouvé, veuillez en créer un pour commencer"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "PANEL_TITLE": "Commencez avec Copilot",
+ "KICK_OFF_MESSAGE": "Besoin d’un résumé rapide, de consulter les conversations passées ou de rédiger une meilleure réponse ? Copilot est là pour accélérer les choses.",
"SEND_MESSAGE": "Envoyer un message...",
"EMPTY_MESSAGE": "Une erreur s'est produite lors de la génération de la réponse. Veuillez réessayer.",
- "LOADER": "Captain is thinking",
+ "LOADER": "Captain réfléchit",
"YOU": "Vous",
- "USE": "Use this",
- "RESET": "Reset",
- "SHOW_STEPS": "Show steps",
- "SELECT_ASSISTANT": "Select Assistant",
+ "USE": "Utiliser ceci",
+ "RESET": "Réinitialiser",
+ "SHOW_STEPS": "Afficher les étapes",
+ "SELECT_ASSISTANT": "Sélectionner un assistant",
"PROMPTS": {
"SUMMARIZE": {
"LABEL": "Résumer cette conversation",
@@ -424,38 +424,38 @@
"CONTENT": "Revue de la conversation pour évaluer dans quelle mesure elle répond aux besoins du client. Partagez une note sur 5 en fonction du ton, de la clarté et de l'efficacité."
},
"HIGH_PRIORITY": {
- "LABEL": "High priority conversations",
- "CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
+ "LABEL": "Conversations à haute priorité",
+ "CONTENT": "Fournissez-moi un résumé de toutes les conversations ouvertes à haute priorité. Incluez l’ID de la conversation, le nom du client (si disponible), le contenu du dernier message et l’agent assigné. Regroupez par statut si pertinent."
},
"LIST_CONTACTS": {
- "LABEL": "List contacts",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "LABEL": "Lister les contacts",
+ "CONTENT": "Montrez-moi la liste des 10 contacts principaux. Incluez nom, email ou numéro de téléphone (si disponible), dernière connexion, étiquettes (le cas échéant)."
}
}
},
"PLAYGROUND": {
"USER": "Vous",
- "ASSISTANT": "Assistant",
+ "ASSISTANT": "Assistant IA",
"MESSAGE_PLACEHOLDER": "Tapez votre message...",
"HEADER": "Terrain de jeu",
"DESCRIPTION": "Utilisez ce terrain de jeu pour envoyer des messages à votre assistant et vérifier s'il répond de manière précise, rapide et dans le ton que vous attendez.",
"CREDIT_NOTE": "Les messages envoyés ici compteront pour vos crédits Captain."
},
"PAYWALL": {
- "TITLE": "Upgrade to use Captain AI",
- "AVAILABLE_ON": "Captain is not available on the free plan.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "TITLE": "Passez à la version supérieure pour utiliser Captain AI",
+ "AVAILABLE_ON": "Captain n’est pas disponible avec le plan gratuit.",
+ "UPGRADE_PROMPT": "Passez à un plan supérieur pour accéder à nos assistants, Copilot et plus encore.",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "AVAILABLE_ON": "Captain AI est uniquement disponible dans les plans Entreprise.",
+ "UPGRADE_PROMPT": "Passez à un plan supérieur pour accéder à nos assistants, Copilot et plus encore.",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"BANNER": {
- "RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
- "DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
+ "RESPONSES": "Vous avez utilisé plus de 80 % de votre quota de réponses. Pour continuer à utiliser Captain AI, veuillez passer à la version supérieure.",
+ "DOCUMENTS": "Limite de documents atteinte. Passez à la version supérieure pour continuer à utiliser Captain AI."
},
"FORM": {
"CANCEL": "Annuler",
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
+ "SELECTED": "{count} selected",
+ "SELECT_ALL": "Select all ({count})",
+ "UNSELECT_ALL": "Unselect all ({count})",
+ "BULK_DELETE_BUTTON": "Supprimer",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Yes, delete all",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Outils",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Description",
diff --git a/app/javascript/dashboard/i18n/locale/he/conversation.json b/app/javascript/dashboard/i18n/locale/he/conversation.json
index 1bd688522..a93f63e8b 100644
--- a/app/javascript/dashboard/i18n/locale/he/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/he/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "חתימת הודעה אינה מוגדרת, נא הגדר אותה בהגדרות הפרופיל.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "תן ל-Copilot הנחיות נוספות, או שאל משהו נוסף... לחץ אנטר כדי לשלוח המשך",
"CLICK_HERE": "לחץ כאן כדי לעדכן",
"WHATSAPP_TEMPLATES": "תבניות וואטסאפ"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "גרור ושחרר כאן להוספת קובץ מצורף",
"START_AUDIO_RECORDING": "התחל הקלטת אודיו",
"STOP_AUDIO_RECORDING": "עצור הקלטת אודיו",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot חושב",
"EMAIL_HEAD": {
"TO": "אל",
"ADD_BCC": "הוסף bcc",
diff --git a/app/javascript/dashboard/i18n/locale/he/helpCenter.json b/app/javascript/dashboard/i18n/locale/he/helpCenter.json
index fedc6ab6f..57448684d 100644
--- a/app/javascript/dashboard/i18n/locale/he/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/he/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "המקום הוסר מהפורטל בהצלחה",
"ERROR_MESSAGE": "לא ניתן להסיר את המקום מהפורטל. נסה שוב."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} מאמר | {count} מאמרים",
"CATEGORIES_COUNT": "{count} קטגוריה | {count} קטגוריות",
"DEFAULT": "ברירת מחדל",
+ "DRAFT": "טיוטה",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "הפוך לברירת מחדל",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "מחק"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "בחר אזור..."
},
+ "STATUS": {
+ "LABEL": "מצב",
+ "OPTIONS": {
+ "LIVE": "יצא לאור",
+ "DRAFT": "טיוטה"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "האזור נוסף בהצלחה",
"ERROR_MESSAGE": "לא ניתן להוסיף אזור. נסה שוב."
diff --git a/app/javascript/dashboard/i18n/locale/he/integrations.json b/app/javascript/dashboard/i18n/locale/he/integrations.json
index 09b45e1c9..3bc992b0f 100644
--- a/app/javascript/dashboard/i18n/locale/he/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/he/integrations.json
@@ -395,13 +395,13 @@
"ASSISTANTS": "עוזרים",
"SWITCH_ASSISTANT": "החלף בין עוזרים",
"NEW_ASSISTANT": "צור עוזר",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "EMPTY_LIST": "לא נמצאו עוזרים, אנא צור אחד כדי להתחיל"
},
"COPILOT": {
"TITLE": "טייס משנה",
"TRY_THESE_PROMPTS": "נסה הנחיות אלה",
"PANEL_TITLE": "התחל עם Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "KICK_OFF_MESSAGE": "צריך סיכום מהיר, רוצה לבדוק שיחות קודמות, או לנסח תשובה טובה יותר? Copilot כאן כדי להאיץ את הדברים.",
"SEND_MESSAGE": "שלח הודעה...",
"EMPTY_MESSAGE": "אירעה שגיאה ביצירת התגובה. אנא נסה שוב.",
"LOADER": "קפטן חושב",
@@ -449,7 +449,7 @@
"CANCEL_ANYTIME": "תוכל לשנות או לבטל את התוכנית שלך בכל עת"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
+ "AVAILABLE_ON": "Captain AI זמין רק בתכניות הארגוניות.",
"UPGRADE_PROMPT": "שדרג את התוכנית שלך כדי לקבל גישה לעוזרים שלנו, ל-Copilot ועוד.",
"ASK_ADMIN": "אנא פנה למנהל המערכת שלך לצורך השדרוג."
},
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "מסמכים",
"ADD_NEW": "צור מסמך חדש",
+ "SELECTED": "{count} נבחרו",
+ "SELECT_ALL": "בחר הכל ({count})",
+ "UNSELECT_ALL": "בטל בחירת הכל ({count})",
+ "BULK_DELETE_BUTTON": "מחק",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "כן, מחק הכל",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "שאלות נפוצות קשורות",
"DESCRIPTION": "שאלות נפוצות אלה נוצרו ישירות מהמסמך."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "כלים",
"ADD_NEW": "צור כלי חדש",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "אין כלים מותאמים אישית זמינים",
"SUBTITLE": "צור כלים מותאמים אישית כדי לחבר את העוזר שלך לממשקי API ושירותים חיצוניים, מה שמאפשר לו לאחזר נתונים ולבצע פעולות בשמך.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "הכלי המותאם אישית נמחק בהצלחה",
"ERROR_MESSAGE": "מחיקת הכלי המותאם אישית נכשלה"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "שם כלי",
"PLACEHOLDER": "בדיקת הזמנה",
- "ERROR": "שם הכלי נדרש"
+ "ERROR": "שם הכלי נדרש",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "תיאור",
diff --git a/app/javascript/dashboard/i18n/locale/hi/conversation.json b/app/javascript/dashboard/i18n/locale/hi/conversation.json
index 7b7e325ab..695ab1ae4 100644
--- a/app/javascript/dashboard/i18n/locale/hi/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/hi/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Message signature is not configured, please configure it in profile settings.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "Copilot को अतिरिक्त प्रांप्ट दें, या कुछ और पूछें… फॉलो-अप भेजने के लिए एंटर दबाएँ",
"CLICK_HERE": "Click here to update",
"WHATSAPP_TEMPLATES": "Whatsapp Templates"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Drag and drop here to attach",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot सोच रहा है",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Add bcc",
diff --git a/app/javascript/dashboard/i18n/locale/hi/helpCenter.json b/app/javascript/dashboard/i18n/locale/hi/helpCenter.json
index e7384d963..16ffbc4ca 100644
--- a/app/javascript/dashboard/i18n/locale/hi/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/hi/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Locale removed from portal successfully",
"ERROR_MESSAGE": "Unable to remove locale from portal. Try again."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Default",
+ "DRAFT": "Draft",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Delete"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Select locale..."
},
+ "STATUS": {
+ "LABEL": "Status",
+ "OPTIONS": {
+ "LIVE": "Published",
+ "DRAFT": "Draft"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Locale added successfully",
"ERROR_MESSAGE": "Unable to add locale. Try again."
diff --git a/app/javascript/dashboard/i18n/locale/hi/integrations.json b/app/javascript/dashboard/i18n/locale/hi/integrations.json
index de9946bb4..2e88278c6 100644
--- a/app/javascript/dashboard/i18n/locale/hi/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/hi/integrations.json
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Captain",
- "HEADER_KNOW_MORE": "Know more",
+ "HEADER_KNOW_MORE": "और जानें",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "ASSISTANTS": "सहायक",
+ "SWITCH_ASSISTANT": "सहायकों के बीच स्विच करें",
+ "NEW_ASSISTANT": "सहायक बनाएँ",
+ "EMPTY_LIST": "कोई सहायक नहीं मिला, कृपया शुरुआत करने के लिए एक बनाएँ"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "PANEL_TITLE": "Copilot के साथ शुरुआत करें",
+ "KICK_OFF_MESSAGE": "क्या आपको तेज़ सारांश चाहिए, पिछले संवाद देखना है, या बेहतर उत्तर ड्राफ्ट करना है? Copilot यहाँ आपके काम को तेजी से करने के लिए है।",
"SEND_MESSAGE": "Send message...",
- "EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
- "LOADER": "Captain is thinking",
+ "EMPTY_MESSAGE": "प्रतिक्रिया उत्पन्न करने में त्रुटि हुई। कृपया पुनः प्रयास करें।",
+ "LOADER": "Captain सोच रहा है",
"YOU": "You",
- "USE": "Use this",
- "RESET": "Reset",
- "SHOW_STEPS": "Show steps",
- "SELECT_ASSISTANT": "Select Assistant",
+ "USE": "इसे उपयोग करें",
+ "RESET": "रीसेट करें",
+ "SHOW_STEPS": "कदम दिखाएं",
+ "SELECT_ASSISTANT": "सहायक चुनें",
"PROMPTS": {
"SUMMARIZE": {
- "LABEL": "Summarize this conversation",
- "CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
+ "LABEL": "इस वार्तालाप का सारांश बनाएं",
+ "CONTENT": "ग्राहक और सपोर्ट एजेंट के बीच चर्चा किए गए मुख्य बिंदुओं का सारांश बनाएं, जिसमें ग्राहक की चिंताएं, प्रश्न, और सपोर्ट एजेंट द्वारा प्रदान किए गए समाधान या उत्तर शामिल हों।"
},
"SUGGEST": {
- "LABEL": "Suggest an answer",
- "CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
+ "LABEL": "उत्तर सुझाएं",
+ "CONTENT": "ग्राहक की पूछताछ का विश्लेषण करें, और एक उत्तर ड्राफ्ट करें जो उनकी चिंताओं या प्रश्नों को प्रभावी रूप से संबोधित करता हो। उत्तर स्पष्ट, संक्षिप्त, और सहायक जानकारी प्रदान करे।"
},
"RATE": {
- "LABEL": "Rate this conversation",
- "CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
+ "LABEL": "इस वार्तालाप को रेट करें",
+ "CONTENT": "वार्तालाप की समीक्षा करें कि यह ग्राहक की आवश्यकताओं को कितना अच्छी तरह पूरा करता है। टोन, स्पष्टता, और प्रभावशीलता के आधार पर 5 में से रेटिंग साझा करें।"
},
"HIGH_PRIORITY": {
- "LABEL": "High priority conversations",
- "CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
+ "LABEL": "उच्च प्राथमिकता वाले वार्तालाप",
+ "CONTENT": "मुझे सभी उच्च प्राथमिकता खुले वार्तालापों का सारांश दें। वार्तालाप आईडी, ग्राहक का नाम (यदि उपलब्ध हो), अंतिम संदेश की सामग्री, और नियुक्त एजेंट शामिल करें। यदि प्रासंगिक हो तो स्थिति के अनुसार समूह बनाएं।"
},
"LIST_CONTACTS": {
- "LABEL": "List contacts",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "LABEL": "संपर्क सूचीबद्ध करें",
+ "CONTENT": "मुझे शीर्ष 10 संपर्कों की सूची दिखाएं। नाम, ईमेल या फोन नंबर (यदि उपलब्ध हो), अंतिम बार देखा गया समय, टैग (यदि कोई हो) शामिल करें।"
}
}
},
"PLAYGROUND": {
"USER": "You",
- "ASSISTANT": "Assistant",
+ "ASSISTANT": "सहायक",
"MESSAGE_PLACEHOLDER": "Type your message...",
- "HEADER": "Playground",
- "DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
- "CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
+ "HEADER": "परीक्षण क्षेत्र",
+ "DESCRIPTION": "इस.Playground का उपयोग अपने सहायक को संदेश भेजने के लिए करें और जांचें कि वह सटीक, तेज़ और आपकी अपेक्षित टोन में प्रतिक्रिया देता है।",
+ "CREDIT_NOTE": "यहाँ भेजे गए संदेश आपके Captain क्रेडिट्स में गिने जाएंगे।"
},
"PAYWALL": {
- "TITLE": "Upgrade to use Captain AI",
- "AVAILABLE_ON": "Captain is not available on the free plan.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "TITLE": "Captain AI उपयोग करने के लिए अपग्रेड करें",
+ "AVAILABLE_ON": "Captain मुफ्त योजना पर उपलब्ध नहीं है।",
+ "UPGRADE_PROMPT": "हमारे सहायकों, Copilot और अधिक तक पहुंच पाने के लिए अपनी योजना अपग्रेड करें।",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "AVAILABLE_ON": "Captain AI केवल एंटरप्राइज योजनाओं में उपलब्ध है।",
+ "UPGRADE_PROMPT": "हमारे सहायकों, Copilot और अधिक तक पहुंच पाने के लिए अपनी योजना अपग्रेड करें।",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"BANNER": {
- "RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
- "DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
+ "RESPONSES": "आपने अपनी प्रतिक्रिया सीमा का 80% से अधिक उपयोग कर लिया है। Captain AI का उपयोग जारी रखने के लिए कृपया अपग्रेड करें।",
+ "DOCUMENTS": "दस्तावेज़ सीमा पूरी हो गई है। Captain AI का उपयोग जारी रखने के लिए अपग्रेड करें।"
},
"FORM": {
"CANCEL": "रद्द करें",
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
+ "SELECTED": "{count} selected",
+ "SELECT_ALL": "Select all ({count})",
+ "UNSELECT_ALL": "Unselect all ({count})",
+ "BULK_DELETE_BUTTON": "Delete",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Yes, delete all",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Description",
diff --git a/app/javascript/dashboard/i18n/locale/hr/conversation.json b/app/javascript/dashboard/i18n/locale/hr/conversation.json
index 4a5e6cdde..afd068b54 100644
--- a/app/javascript/dashboard/i18n/locale/hr/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/hr/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Message signature is not configured, please configure it in profile settings.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "Dajte copilotu dodatne upute ili pitajte bilo što drugo... Pritisnite Enter za slanje nastavka",
"CLICK_HERE": "Click here to update",
"WHATSAPP_TEMPLATES": "Whatsapp Predlošci"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Drag and drop here to attach",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot razmišlja",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Add bcc",
diff --git a/app/javascript/dashboard/i18n/locale/hr/helpCenter.json b/app/javascript/dashboard/i18n/locale/hr/helpCenter.json
index bb66783bf..8291dee6e 100644
--- a/app/javascript/dashboard/i18n/locale/hr/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/hr/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Locale removed from portal successfully",
"ERROR_MESSAGE": "Unable to remove locale from portal. Try again."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Default",
+ "DRAFT": "Skica",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Izbriši"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Select locale..."
},
+ "STATUS": {
+ "LABEL": "Status",
+ "OPTIONS": {
+ "LIVE": "Published",
+ "DRAFT": "Skica"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Locale added successfully",
"ERROR_MESSAGE": "Unable to add locale. Try again."
diff --git a/app/javascript/dashboard/i18n/locale/hr/integrations.json b/app/javascript/dashboard/i18n/locale/hr/integrations.json
index 4d901f799..81ee3b28a 100644
--- a/app/javascript/dashboard/i18n/locale/hr/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/hr/integrations.json
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Captain",
- "HEADER_KNOW_MORE": "Know more",
+ "HEADER_KNOW_MORE": "Saznaj više",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "ASSISTANTS": "Asistenti",
+ "SWITCH_ASSISTANT": "Prebaci se između asistenata",
+ "NEW_ASSISTANT": "Kreiraj asistenta",
+ "EMPTY_LIST": "Nema pronađenih asistenata, molimo stvorite jednog za početak"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "PANEL_TITLE": "Započnite s Copilotom",
+ "KICK_OFF_MESSAGE": "Trebate brzi sažetak, želite provjeriti prethodne razgovore ili nacrtati bolji odgovor? Copilot je tu da ubrza stvari.",
"SEND_MESSAGE": "Send message...",
- "EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
- "LOADER": "Captain is thinking",
+ "EMPTY_MESSAGE": "Došlo je do pogreške pri generiranju odgovora. Molimo pokušajte ponovno.",
+ "LOADER": "Captain razmišlja",
"YOU": "Vi",
- "USE": "Use this",
- "RESET": "Reset",
- "SHOW_STEPS": "Show steps",
- "SELECT_ASSISTANT": "Select Assistant",
+ "USE": "Koristi ovo",
+ "RESET": "Poništi",
+ "SHOW_STEPS": "Prikaži korake",
+ "SELECT_ASSISTANT": "Odaberi asistenta",
"PROMPTS": {
"SUMMARIZE": {
- "LABEL": "Summarize this conversation",
- "CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
+ "LABEL": "Sažmi ovaj razgovor",
+ "CONTENT": "Sažmi ključne točke raspravljene između kupca i agenata za podršku, uključujući brige kupca, pitanja i rješenja ili odgovore koje je dao agent za podršku."
},
"SUGGEST": {
- "LABEL": "Suggest an answer",
- "CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
+ "LABEL": "Predloži odgovor",
+ "CONTENT": "Analiziraj upit kupca i nacrtaj odgovor koji učinkovito rješava njihove brige ili pitanja. Osiguraj da je odgovor jasan, sažet i pruža korisne informacije."
},
"RATE": {
- "LABEL": "Rate this conversation",
- "CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
+ "LABEL": "Ocijeni ovaj razgovor",
+ "CONTENT": "Pregledajte razgovor kako biste vidjeli koliko dobro zadovoljava potrebe kupca. Podijelite ocjenu od 1 do 5 na temelju tona, jasnoće i učinkovitosti."
},
"HIGH_PRIORITY": {
- "LABEL": "High priority conversations",
- "CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
+ "LABEL": "Razgovori visokog prioriteta",
+ "CONTENT": "Dajte mi sažetak svih otvorenih razgovora visokog prioriteta. Uključite ID razgovora, ime kupca (ako je dostupno), sadržaj posljednje poruke i dodijeljenog agenta. Grupirajte po statusu ako je relevantno."
},
"LIST_CONTACTS": {
- "LABEL": "List contacts",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "LABEL": "Popis kontakata",
+ "CONTENT": "Pokaži mi popis top 10 kontakata. Uključi ime, e-mail ili broj telefona (ako je dostupno), vrijeme posljednjeg viđenja, oznake (ako ih ima)."
}
}
},
"PLAYGROUND": {
"USER": "Vi",
- "ASSISTANT": "Assistant",
+ "ASSISTANT": "Asistent",
"MESSAGE_PLACEHOLDER": "Unesite svoju poruku...",
- "HEADER": "Playground",
- "DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
- "CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
+ "HEADER": "Poligon",
+ "DESCRIPTION": "Koristite ovaj poligon za slanje poruka svom asistentu i provjerite odgovara li točno, brzo i u očekivanom tonu.",
+ "CREDIT_NOTE": "Poruke poslane ovdje računaju se u vaše Captain kredite."
},
"PAYWALL": {
- "TITLE": "Upgrade to use Captain AI",
- "AVAILABLE_ON": "Captain is not available on the free plan.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "TITLE": "Nadogradite za korištenje Captain AI",
+ "AVAILABLE_ON": "Captain nije dostupan na besplatnom planu.",
+ "UPGRADE_PROMPT": "Nadogradite svoj plan da biste dobili pristup našim asistentima, copilotu i još mnogo toga.",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "AVAILABLE_ON": "Captain AI dostupan je samo u Enterprise planovima.",
+ "UPGRADE_PROMPT": "Nadogradite svoj plan da biste dobili pristup našim asistentima, copilotu i još mnogo toga.",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"BANNER": {
- "RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
- "DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
+ "RESPONSES": "Iskoristili ste preko 80 % svog limita odgovora. Da biste nastavili koristiti Captain AI, nadogradite plan.",
+ "DOCUMENTS": "Dosegnut je limit dokumenata. Nadogradite kako biste nastavili koristiti Captain AI."
},
"FORM": {
"CANCEL": "Odustani",
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
+ "SELECTED": "{count} selected",
+ "SELECT_ALL": "Select all ({count})",
+ "UNSELECT_ALL": "Unselect all ({count})",
+ "BULK_DELETE_BUTTON": "Izbriši",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Yes, delete all",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Description",
diff --git a/app/javascript/dashboard/i18n/locale/hu/conversation.json b/app/javascript/dashboard/i18n/locale/hu/conversation.json
index 38ab00906..0db92db18 100644
--- a/app/javascript/dashboard/i18n/locale/hu/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/hu/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Üzenet aláírása nem változott, kérlek, változtasd meg a profilod beállításaiban. ",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "Adj további promptokat a copilothoz, vagy kérdezz bármi mást... Nyomd meg az Entert a folytatáshoz",
"CLICK_HERE": "Frissítéshez kattints ide",
"WHATSAPP_TEMPLATES": "Whatsapp sablonok"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Helyezd ide a csatolmányt",
"START_AUDIO_RECORDING": "Hangfelvétel indítása",
"STOP_AUDIO_RECORDING": "Hangfelvétel leállítása",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot gondolkodik",
"EMAIL_HEAD": {
"TO": "Címzett",
"ADD_BCC": "Titkos másolat hozzáadása",
diff --git a/app/javascript/dashboard/i18n/locale/hu/helpCenter.json b/app/javascript/dashboard/i18n/locale/hu/helpCenter.json
index 2f06635db..8e0eb885f 100644
--- a/app/javascript/dashboard/i18n/locale/hu/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/hu/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Terület sikeresen eltávolítva a portálról",
"ERROR_MESSAGE": "Nem sikerült eltávolítani a területet a portálról. Kérlek, próbáld újra."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Alapértelmezett",
+ "DRAFT": "Vázlat",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Törlés"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Nyelv kiválasztása..."
},
+ "STATUS": {
+ "LABEL": "Státusz",
+ "OPTIONS": {
+ "LIVE": "Publikált",
+ "DRAFT": "Vázlat"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Terület sikeresen hozzáadva",
"ERROR_MESSAGE": "Nem sikerült területet hozzáadni. Kérlek, próbáld újra."
diff --git a/app/javascript/dashboard/i18n/locale/hu/integrations.json b/app/javascript/dashboard/i18n/locale/hu/integrations.json
index 6a4f0dc39..bed8f4dd1 100644
--- a/app/javascript/dashboard/i18n/locale/hu/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/hu/integrations.json
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Captain",
- "HEADER_KNOW_MORE": "Know more",
+ "HEADER_KNOW_MORE": "Tudjon meg többet",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "ASSISTANTS": "Asszisztensek",
+ "SWITCH_ASSISTANT": "Váltás az asszisztensek között",
+ "NEW_ASSISTANT": "Asszisztens létrehozása",
+ "EMPTY_LIST": "Nem található asszisztens, kérjük, hozzon létre egyet a kezdéshez"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "PANEL_TITLE": "Kezdje el a Copilottal",
+ "KICK_OFF_MESSAGE": "Gyors összefoglalóra van szüksége, szeretné áttekinteni a korábbi beszélgetéseket, vagy jobb választ megfogalmazni? A Copilot gyorsítja a folyamatot.",
"SEND_MESSAGE": "Üzenet elküldése...",
- "EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
- "LOADER": "Captain is thinking",
+ "EMPTY_MESSAGE": "Hiba történt a válasz elkészítésekor. Kérjük, próbálja újra.",
+ "LOADER": "Captain gondolkodik",
"YOU": "Ön",
- "USE": "Use this",
- "RESET": "Reset",
- "SHOW_STEPS": "Show steps",
- "SELECT_ASSISTANT": "Select Assistant",
+ "USE": "Használja ezt",
+ "RESET": "Alaphelyzetbe állítás",
+ "SHOW_STEPS": "Mutassa a lépéseket",
+ "SELECT_ASSISTANT": "Asszisztens kiválasztása",
"PROMPTS": {
"SUMMARIZE": {
- "LABEL": "Summarize this conversation",
- "CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
+ "LABEL": "Foglalja össze ezt a beszélgetést",
+ "CONTENT": "Foglalja össze a kulcspontokat az ügyfél és az ügyfélszolgálati ügynök között folytatott beszélgetésben, beleértve az ügyfél aggályait, kérdéseit és az ügyfélszolgálati ügynök által adott megoldásokat vagy válaszokat."
},
"SUGGEST": {
- "LABEL": "Suggest an answer",
- "CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
+ "LABEL": "Javasoljon választ",
+ "CONTENT": "Elemezze az ügyfél kérdését, és készítsen egy választ, amely hatékonyan kezeli az aggályokat vagy kérdéseket. Biztosítsa, hogy a válasz világos, tömör és hasznos információkat tartalmazzon."
},
"RATE": {
- "LABEL": "Rate this conversation",
- "CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
+ "LABEL": "Értékelje ezt a beszélgetést",
+ "CONTENT": "Vizsgálja felül a beszélgetést, hogy mennyire felel meg az ügyfél igényeinek. Osszon meg egy értékelést 5 pontból a hangnem, világosság és hatékonyság alapján."
},
"HIGH_PRIORITY": {
- "LABEL": "High priority conversations",
- "CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
+ "LABEL": "Nagy prioritású beszélgetések",
+ "CONTENT": "Adjon egy összefoglalót az összes nagy prioritású nyitott beszélgetésről. Tartalmazza a beszélgetés azonosítóját, az ügyfél nevét (ha elérhető), az utolsó üzenet tartalmát és a kijelölt ügynököt. Ha releváns, csoportosítsa státusz szerint."
},
"LIST_CONTACTS": {
- "LABEL": "List contacts",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "LABEL": "Kapcsolatok listázása",
+ "CONTENT": "Mutassa meg a 10 legfontosabb kapcsolat listáját. Tartalmazza a nevet, e-mailt vagy telefonszámot (ha elérhető), az utolsó megtekintés idejét, címkéket (ha vannak)."
}
}
},
"PLAYGROUND": {
"USER": "Ön",
- "ASSISTANT": "Assistant",
+ "ASSISTANT": "Asszisztens",
"MESSAGE_PLACEHOLDER": "Gépeld be üzeneted...",
- "HEADER": "Playground",
- "DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
- "CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
+ "HEADER": "Játszótér",
+ "DESCRIPTION": "Használja ezt a játszóteret üzenetek küldéséhez az asszisztensnek, és ellenőrizze, hogy pontosan, gyorsan és a várt hangnemben válaszol-e.",
+ "CREDIT_NOTE": "Itt küldött üzenetek a Captain kreditjeit csökkentik."
},
"PAYWALL": {
- "TITLE": "Upgrade to use Captain AI",
- "AVAILABLE_ON": "Captain is not available on the free plan.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "TITLE": "Frissítsen a Captain AI használatához",
+ "AVAILABLE_ON": "A Captain nem érhető el az ingyenes csomagban.",
+ "UPGRADE_PROMPT": "Frissítse csomagját, hogy hozzáférjen asszisztenseinkhez, copilothoz és egyebekhez.",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "AVAILABLE_ON": "A Captain AI csak az Enterprise csomagokban érhető el.",
+ "UPGRADE_PROMPT": "Frissítse csomagját, hogy hozzáférjen asszisztenseinkhez, copilothoz és egyebekhez.",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"BANNER": {
- "RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
- "DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
+ "RESPONSES": "A válaszlimit több mint 80%-át felhasználta. A Captain AI további használatához kérjük, frissítsen.",
+ "DOCUMENTS": "Elérte a dokumentumok korlátját. Frissítsen a Captain AI használat folytatásához."
},
"FORM": {
"CANCEL": "Mégse",
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
+ "SELECTED": "{count} selected",
+ "SELECT_ALL": "Select all ({count})",
+ "UNSELECT_ALL": "Unselect all ({count})",
+ "BULK_DELETE_BUTTON": "Törlés",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Yes, delete all",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Leírás",
diff --git a/app/javascript/dashboard/i18n/locale/hy/conversation.json b/app/javascript/dashboard/i18n/locale/hy/conversation.json
index 7b7e325ab..e3f04fed8 100644
--- a/app/javascript/dashboard/i18n/locale/hy/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/hy/conversation.json
@@ -6,12 +6,12 @@
"SWITCH_VIEW_LAYOUT": "Switch the layout",
"DASHBOARD_APP_TAB_MESSAGES": "Messages",
"UNVERIFIED_SESSION": "The identity of this user is not verified",
- "NO_MESSAGE_1": "Uh oh! Looks like there are no messages from customers in your inbox.",
- "NO_MESSAGE_2": " to send a message to your page!",
- "NO_INBOX_1": "Hola! Looks like you haven't added any inboxes yet.",
- "NO_INBOX_2": " to get started",
- "NO_INBOX_AGENT": "Uh Oh! Looks like you are not part of any inbox. Please contact your administrator",
- "SEARCH_MESSAGES": "Search for messages in conversations",
+ "NO_MESSAGE_1": "Վայ, ձեր մուտքի արկղում հաճախորդներից հաղորդագրություններ չկան։",
+ "NO_MESSAGE_2": " ՝ ձեր էջին հաղորդագրություն ուղարկելու համար։",
+ "NO_INBOX_1": "Բարև, դուք դեռ մուտքի արկղեր չեք ավելացրել։",
+ "NO_INBOX_2": " ՝ սկսելու համար",
+ "NO_INBOX_AGENT": "Վայ, դուք որևէ մուտքի արկղի մաս չեք կազմում։ Խնդրում ենք կապ հաստատել ձեր ադմինիստրատորի հետ։",
+ "SEARCH_MESSAGES": "Որոնել հաղորդագրություններ զրույցներում",
"VIEW_ORIGINAL": "View original",
"VIEW_TRANSLATED": "View translated",
"EMPTY_STATE": {
@@ -19,19 +19,19 @@
"KEYBOARD_SHORTCUTS": "to view keyboard shortcuts"
},
"SEARCH": {
- "TITLE": "Search messages",
- "RESULT_TITLE": "Search Results",
- "LOADING_MESSAGE": "Crunching data...",
- "PLACEHOLDER": "Type any text to search messages",
- "NO_MATCHING_RESULTS": "No results found."
+ "TITLE": "Որոնել հաղորդագրություններ",
+ "RESULT_TITLE": "Որոնման արդյունքներ",
+ "LOADING_MESSAGE": "Տվյալները մշակվում են...",
+ "PLACEHOLDER": "Մուտքագրեք տեքստ՝ հաղորդագրություններում որոնելու համար",
+ "NO_MATCHING_RESULTS": "Արդյունքներ չեն գտնվել։"
},
- "UNREAD_MESSAGES": "Unread Messages",
- "UNREAD_MESSAGE": "Unread Message",
- "CLICK_HERE": "Click here",
- "LOADING_INBOXES": "Loading inboxes",
- "LOADING_CONVERSATIONS": "Loading Conversations",
- "CANNOT_REPLY": "You cannot reply due to",
- "24_HOURS_WINDOW": "24 hour message window restriction",
+ "UNREAD_MESSAGES": "Չկարդացված հաղորդագրություններ",
+ "UNREAD_MESSAGE": "Չկարդացված հաղորդագրություն",
+ "CLICK_HERE": "Սեղմեք այստեղ",
+ "LOADING_INBOXES": "Մուտքի արկղերի բեռնում",
+ "LOADING_CONVERSATIONS": "Զրույցների բեռնում",
+ "CANNOT_REPLY": "Չեք կարող պատասխանել, քանի որ",
+ "24_HOURS_WINDOW": "24-ժամյա հաղորդագրության սահմանափակում",
"48_HOURS_WINDOW": "48 hour message window restriction",
"API_HOURS_WINDOW": "You can only reply to this conversation within {hours} hours",
"NOT_ASSIGNED_TO_YOU": "This conversation is not assigned to you. Would you like to assign this conversation to yourself?",
@@ -41,12 +41,12 @@
"BOT_HANDOFF_REOPEN_ACTION": "Mark conversation open",
"BOT_HANDOFF_SUCCESS": "Conversation has been handed over to you",
"BOT_HANDOFF_ERROR": "Failed to take over the conversation. Please try again.",
- "TWILIO_WHATSAPP_CAN_REPLY": "You can only reply to this conversation using a template message due to",
- "TWILIO_WHATSAPP_24_HOURS_WINDOW": "24 hour message window restriction",
+ "TWILIO_WHATSAPP_CAN_REPLY": "Այս զրույցին կարող եք պատասխանել միայն կաղապար հաղորդագրությամբ՝",
+ "TWILIO_WHATSAPP_24_HOURS_WINDOW": "24-ժամյա պատուհանի սահմանափակում",
"OLD_INSTAGRAM_INBOX_REPLY_BANNER": "This Instagram account was migrated to the new Instagram channel inbox. All new messages will show up there. You won’t be able to send messages from this conversation anymore.",
- "REPLYING_TO": "You are replying to:",
- "REMOVE_SELECTION": "Remove Selection",
- "DOWNLOAD": "Download",
+ "REPLYING_TO": "Դուք պատասխանում եք՝",
+ "REMOVE_SELECTION": "Հեռացնել ընտրությունը",
+ "DOWNLOAD": "Ներբեռնել",
"UNKNOWN_FILE_TYPE": "Unknown File",
"SAVE_CONTACT": "Save Contact",
"NO_CONTENT": "No content to display",
@@ -56,18 +56,18 @@
"FILE": "{sender} has shared a file",
"MEETING": "{sender} has started a meeting"
},
- "UPLOADING_ATTACHMENTS": "Uploading attachments...",
+ "UPLOADING_ATTACHMENTS": "Կցորդների բեռնում...",
"REPLIED_TO_STORY": "Replied to your story",
"UNSUPPORTED_MESSAGE": "This message is unsupported. You can view this message on the Facebook / Instagram app.",
"UNSUPPORTED_MESSAGE_FACEBOOK": "This message is unsupported. You can view this message on the Facebook Messenger app.",
"UNSUPPORTED_MESSAGE_INSTAGRAM": "This message is unsupported. You can view this message on the Instagram app.",
"UNSUPPORTED_MESSAGE_TIKTOK": "This message is unsupported. You can view this message on the TikTok app.",
- "SUCCESS_DELETE_MESSAGE": "Message deleted successfully",
- "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again",
- "NO_RESPONSE": "No response",
+ "SUCCESS_DELETE_MESSAGE": "Հաղորդագրությունը հաջողությամբ ջնջվեց",
+ "FAIL_DELETE_MESSSAGE": "Չհաջողվեց ջնջել հաղորդագրությունը։ Փորձեք կրկին",
+ "NO_RESPONSE": "Պատասխան չկա",
"RESPONSE": "Response",
- "RATING_TITLE": "Rating",
- "FEEDBACK_TITLE": "Feedback",
+ "RATING_TITLE": "Գնահատական",
+ "FEEDBACK_TITLE": "Կարծիք",
"REPLY_MESSAGE_NOT_FOUND": "Message not available",
"CARD": {
"SHOW_LABELS": "Show labels",
@@ -85,16 +85,16 @@
"YOU_ANSWERED": "You answered"
},
"HEADER": {
- "RESOLVE_ACTION": "Resolve",
- "REOPEN_ACTION": "Reopen",
- "OPEN_ACTION": "Open",
+ "RESOLVE_ACTION": "Փակել",
+ "REOPEN_ACTION": "Վերաբացել",
+ "OPEN_ACTION": "Բացել",
"MORE_ACTIONS": "More actions",
- "OPEN": "More",
- "CLOSE": "Close",
- "DETAILS": "details",
+ "OPEN": "Ավելին",
+ "CLOSE": "Փակել",
+ "DETAILS": "մանրամասներ",
"SNOOZED_UNTIL": "Snoozed until",
- "SNOOZED_UNTIL_TOMORROW": "Snoozed until tomorrow",
- "SNOOZED_UNTIL_NEXT_WEEK": "Snoozed until next week",
+ "SNOOZED_UNTIL_TOMORROW": "Հետաձգված է մինչև վաղը",
+ "SNOOZED_UNTIL_NEXT_WEEK": "Հետաձգված է մինչև հաջորդ շաբաթ",
"SNOOZED_UNTIL_NEXT_REPLY": "Snoozed until next reply",
"SLA_STATUS": {
"FRT": "FRT {status}",
@@ -105,13 +105,13 @@
}
},
"RESOLVE_DROPDOWN": {
- "MARK_PENDING": "Mark as pending",
+ "MARK_PENDING": "Նշել որպես սպասվող",
"SNOOZE_UNTIL": "Snooze",
"SNOOZE": {
- "TITLE": "Snooze until",
- "NEXT_REPLY": "Next reply",
- "TOMORROW": "Tomorrow",
- "NEXT_WEEK": "Next week"
+ "TITLE": "Հետաձգել մինչև",
+ "NEXT_REPLY": "Հաջորդ պատասխան",
+ "TOMORROW": "Վաղը",
+ "NEXT_WEEK": "Հաջորդ շաբաթ"
}
},
"MENTION": {
@@ -188,45 +188,45 @@
"MESSAGE_SIGN_TOOLTIP": "Message signature",
"ENABLE_SIGN_TOOLTIP": "Enable signature",
"DISABLE_SIGN_TOOLTIP": "Disable signature",
- "MSG_INPUT": "Shift + enter for new line. Start with '/' to select a Canned Response.",
- "PRIVATE_MSG_INPUT": "Shift + enter for new line. This will be visible only to Agents",
+ "MSG_INPUT": "Shift + enter՝ նոր տողի համար։ Սկսեք '/'-ով՝ պատրաստի պատասխան ընտրելու համար։",
+ "PRIVATE_MSG_INPUT": "Shift + enter՝ նոր տողի համար։ Սա տեսանելի կլինի միայն գործակալներին",
"MESSAGING_RESTRICTED": "You cannot reply to this conversation",
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Message signature is not configured, please configure it in profile settings.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "Նվիրեք Copilot-ին լրացուցիչ հրահանգներ կամ հարցրեք բան ավել... Սեղմեք enter՝ շարունակական ուղարկելու համար",
"CLICK_HERE": "Click here to update",
"WHATSAPP_TEMPLATES": "Whatsapp Templates"
},
"REPLYBOX": {
- "REPLY": "Reply",
- "PRIVATE_NOTE": "Private Note",
- "SEND": "Send",
- "CREATE": "Add Note",
+ "REPLY": "Պատասխանել",
+ "PRIVATE_NOTE": "Գաղտնի նշում",
+ "SEND": "Ուղարկել",
+ "CREATE": "Ավելացնել նշում",
"INSERT_READ_MORE": "Read more",
"DISMISS_REPLY": "Dismiss reply",
"REPLYING_TO": "Replying to:",
- "TIP_EMOJI_ICON": "Show emoji selector",
- "TIP_ATTACH_ICON": "Attach files",
+ "TIP_EMOJI_ICON": "Ցուցադրել էմոջի ընտրիչը",
+ "TIP_ATTACH_ICON": "Կցել ֆայլեր",
"TIP_AUDIORECORDER_ICON": "Record audio",
"TIP_AUDIORECORDER_PERMISSION": "Allow access to audio",
"TIP_AUDIORECORDER_ERROR": "Could not open the audio",
- "DRAG_DROP": "Drag and drop here to attach",
+ "DRAG_DROP": "Քաշեք և գցեք այստեղ կցելու համար",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot-ը մտածում է",
"EMAIL_HEAD": {
"TO": "TO",
- "ADD_BCC": "Add bcc",
+ "ADD_BCC": "Ավելացնել թաքն. պատճեն",
"CC": {
"LABEL": "CC",
- "PLACEHOLDER": "Emails separated by commas",
- "ERROR": "Please enter valid email addresses"
+ "PLACEHOLDER": "Էլ. հասցեները՝ ստորակետերով բաժանված",
+ "ERROR": "Մուտքագրեք վավեր էլ. հասցեներ"
},
"BCC": {
"LABEL": "BCC",
- "PLACEHOLDER": "Emails separated by commas",
- "ERROR": "Please enter valid email addresses"
+ "PLACEHOLDER": "Էլ. հասցեները՝ ստորակետերով բաժանված",
+ "ERROR": "Մուտքագրեք վավեր էլ. հասցեներ"
}
},
"UNDEFINED_VARIABLES": {
@@ -245,34 +245,34 @@
"EXPAND": "Expand preview"
}
},
- "VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team",
- "CHANGE_STATUS": "Conversation status changed",
+ "VISIBLE_TO_AGENTS": "Գաղտնի նշում․ տեսանելի է միայն ձեզ և ձեր թիմին",
+ "CHANGE_STATUS": "Զրույցի կարգավիճակը փոխվեց",
"CHANGE_STATUS_FAILED": "Conversation status change failed",
- "CHANGE_AGENT": "Conversation Assignee changed",
+ "CHANGE_AGENT": "Զրույցի պատասխանատուն փոխվեց",
"CHANGE_AGENT_FAILED": "Assignee change failed",
"ASSIGN_LABEL_SUCCESFUL": "Label assigned successfully",
"ASSIGN_LABEL_FAILED": "Label assignment failed",
- "CHANGE_TEAM": "Conversation team changed",
+ "CHANGE_TEAM": "Խմբի փոփոխություն կատարվեց",
"SUCCESS_DELETE_CONVERSATION": "Conversation deleted successfully",
"FAIL_DELETE_CONVERSATION": "Couldn't delete conversation! Try again",
"FILE_SIZE_LIMIT": "File exceeds the {MAXIMUM_SUPPORTED_FILE_UPLOAD_SIZE} MB attachment limit",
"FILE_TYPE_NOT_SUPPORTED": "This {fileName} file type is not supported in this conversation",
- "MESSAGE_ERROR": "Unable to send this message, please try again later",
- "SENT_BY": "Sent by:",
+ "MESSAGE_ERROR": "Հնարավոր չէ ուղարկել այս հաղորդագրությունը, փորձեք ավելի ուշ",
+ "SENT_BY": "Ուղարկողը՝",
"BOT": "Bot",
"NATIVE_APP": "Native app",
"NATIVE_APP_ADVISORY": "This message was sent from the native app. Reply from Chatwoot to maintain the message window.",
"SEND_FAILED": "Couldn't send message! Try again",
"TRY_AGAIN": "retry",
"ASSIGNMENT": {
- "SELECT_AGENT": "Select Agent",
- "REMOVE": "Remove",
- "ASSIGN": "Assign"
+ "SELECT_AGENT": "Ընտրել գործակալին",
+ "REMOVE": "Հեռացնել",
+ "ASSIGN": "Նշանակել"
},
"CONTEXT_MENU": {
- "COPY": "Copy",
+ "COPY": "Պատճենել",
"REPLY_TO": "Reply to this message",
- "DELETE": "Delete",
+ "DELETE": "Ջնջել",
"CREATE_A_CANNED_RESPONSE": "Add to canned responses",
"TRANSLATE": "Translate",
"COPY_PERMALINK": "Copy link to the message",
@@ -300,20 +300,20 @@
}
},
"EMAIL_TRANSCRIPT": {
- "TITLE": "Send conversation transcript",
- "DESC": "Send a copy of the conversation transcript to the specified email address",
- "SUBMIT": "Submit",
- "CANCEL": "Cancel",
- "SEND_EMAIL_SUCCESS": "The chat transcript was sent successfully",
- "SEND_EMAIL_ERROR": "There was an error, please try again",
+ "TITLE": "Ուղարկել զրույցի արձանագրությունը",
+ "DESC": "Ուղարկել զրույցի արձանագրության պատճենը նշված էլ. հասցեին",
+ "SUBMIT": "Ուղարկել",
+ "CANCEL": "Չեղարկել",
+ "SEND_EMAIL_SUCCESS": "Զրույցի արձանագրությունը հաջողությամբ ուղարկվեց",
+ "SEND_EMAIL_ERROR": "Սխալ տեղի ունեցավ, խնդրում ենք փորձել կրկին",
"SEND_EMAIL_PAYMENT_REQUIRED": "Email transcript is not available on your current plan. Please upgrade to use this feature.",
"FORM": {
- "SEND_TO_CONTACT": "Send the transcript to the customer",
- "SEND_TO_AGENT": "Send the transcript to the assigned agent",
- "SEND_TO_OTHER_EMAIL_ADDRESS": "Send the transcript to another email address",
+ "SEND_TO_CONTACT": "Ուղարկել արձանագրությունը հաճախորդին",
+ "SEND_TO_AGENT": "Ուղարկել արձանագրությունը նշանակված գործակալին",
+ "SEND_TO_OTHER_EMAIL_ADDRESS": "Ուղարկել արձանագրությունը այլ էլ. հասցե",
"EMAIL": {
- "PLACEHOLDER": "Enter an email address",
- "ERROR": "Please enter a valid email address"
+ "PLACEHOLDER": "Մուտքագրեք էլ. հասցե",
+ "ERROR": "Մուտքագրեք վավեր էլ. հասցե"
}
}
},
@@ -323,21 +323,21 @@
"GREETING_MORNING": "👋 Good morning, {name}. Welcome to {installationName}.",
"GREETING_AFTERNOON": "👋 Good afternoon, {name}. Welcome to {installationName}.",
"GREETING_EVENING": "👋 Good evening, {name}. Welcome to {installationName}.",
- "READ_LATEST_UPDATES": "Read our latest updates",
+ "READ_LATEST_UPDATES": "Կարդացեք մեր վերջին նորությունները",
"ALL_CONVERSATION": {
- "TITLE": "All your conversations in one place",
- "DESCRIPTION": "View all the conversations from your customers in one single dashboard. You can filter the conversations by the incoming channel, label and status.",
+ "TITLE": "Ձեր բոլոր զրույցները մեկ տեղում",
+ "DESCRIPTION": "Տեսեք ձեր հաճախորդների բոլոր զրույցները մեկ վահանակում։ Կարող եք զտել զրույցները մուտքային ալիքով, պիտակով և կարգավիճակով։",
"NEW_LINK": "Click here to create an inbox"
},
"TEAM_MEMBERS": {
- "TITLE": "Invite your team members",
+ "TITLE": "Հրավիրեք թիմի անդամներին",
"DESCRIPTION": "Since you are getting ready to talk to your customer, bring in your teammates to assist you. You can invite your teammates by adding their email addresses to the agent list.",
- "NEW_LINK": "Click here to invite a team member"
+ "NEW_LINK": "Սեղմեք այստեղ՝ թիմի անդամ հրավիրելու համար"
},
"LABELS": {
- "TITLE": "Organize conversations with labels",
- "DESCRIPTION": "Labels provide an easier way to categorize your conversation. Create some labels like #support-enquiry, #billing-question etc., so that you can use them in a conversation later.",
- "NEW_LINK": "Click here to create tags"
+ "TITLE": "Կազմակերպեք զրույցները պիտակներով",
+ "DESCRIPTION": "Պիտակները հեշտացնում են զրույցների դասակարգումը։ Ստեղծեք օրինակ՝ #support-enquiry, #billing-question և այլն, որպեսզի հետագայում օգտագործեք զրույցներում։",
+ "NEW_LINK": "Սեղմեք այստեղ՝ պիտակներ ստեղծելու համար"
},
"CANNED_RESPONSES": {
"TITLE": "Create canned responses",
@@ -346,20 +346,20 @@
}
},
"CONVERSATION_SIDEBAR": {
- "ASSIGNEE_LABEL": "Assigned Agent",
- "SELF_ASSIGN": "Assign to me",
- "TEAM_LABEL": "Assigned Team",
+ "ASSIGNEE_LABEL": "Նշանակված գործակալ",
+ "SELF_ASSIGN": "Նշանակել ինձ",
+ "TEAM_LABEL": "Նշանակված թիմ",
"SELECT": {
- "PLACEHOLDER": "None"
+ "PLACEHOLDER": "Չկա"
},
"ACCORDION": {
- "CONTACT_DETAILS": "Contact Details",
- "CONVERSATION_ACTIONS": "Conversation Actions",
- "CONVERSATION_LABELS": "Conversation Labels",
- "CONVERSATION_INFO": "Conversation Information",
+ "CONTACT_DETAILS": "Կոնտակտի տվյալներ",
+ "CONVERSATION_ACTIONS": "Զրույցի գործողություններ",
+ "CONVERSATION_LABELS": "Զրույցի պիտակներ",
+ "CONVERSATION_INFO": "Զրույցի տեղեկություն",
"CONTACT_NOTES": "Contact Notes",
- "CONTACT_ATTRIBUTES": "Contact Attributes",
- "PREVIOUS_CONVERSATION": "Previous Conversations",
+ "CONTACT_ATTRIBUTES": "Կոնտակտի հատկություններ",
+ "PREVIOUS_CONVERSATION": "Նախորդ զրույցներ",
"MACROS": "Macros",
"LINEAR_ISSUES": "Linked Linear Issues",
"SHOPIFY_ORDERS": "Shopify Orders"
@@ -408,10 +408,10 @@
},
"EMAIL_HEADER": {
"FROM": "From",
- "TO": "To",
- "BCC": "Bcc",
- "CC": "Cc",
- "SUBJECT": "Subject",
+ "TO": "Ում",
+ "BCC": "Թաքն. պատճեն",
+ "CC": "Պատճեն",
+ "SUBJECT": "Վերնագիր",
"EXPAND": "Expand email"
},
"CONVERSATION_PARTICIPANTS": {
diff --git a/app/javascript/dashboard/i18n/locale/hy/helpCenter.json b/app/javascript/dashboard/i18n/locale/hy/helpCenter.json
index d8ad78cc1..7c7b58f5d 100644
--- a/app/javascript/dashboard/i18n/locale/hy/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/hy/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Լեզուն հաջողությամբ հեռացվեց պորտալից։",
"ERROR_MESSAGE": "Չհաջողվեց հեռացնել լեզուն պորտալից։ Փորձեք կրկին։"
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} հոդված | {count} հոդվածներ",
"CATEGORIES_COUNT": "{count} կատեգորիա | {count} կատեգորիաներ",
"DEFAULT": "Նախնական",
+ "DRAFT": "Սևագիր",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Դարձնել նախնական",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Ջնջել"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Ընտրեք լեզու..."
},
+ "STATUS": {
+ "LABEL": "Status",
+ "OPTIONS": {
+ "LIVE": "Հրապարակված",
+ "DRAFT": "Սևագիր"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Լեզուն հաջողությամբ ավելացվեց",
"ERROR_MESSAGE": "Չհաջողվեց ավելացնել լեզուն։ Փորձեք կրկին։"
diff --git a/app/javascript/dashboard/i18n/locale/hy/integrations.json b/app/javascript/dashboard/i18n/locale/hy/integrations.json
index d9494749f..4ba0d04ed 100644
--- a/app/javascript/dashboard/i18n/locale/hy/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/hy/integrations.json
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Փաստաթղթեր",
"ADD_NEW": "Ստեղծել նոր փաստաթուղթ",
+ "SELECTED": "{count} ընտրված",
+ "SELECT_ALL": "Ընտրել բոլորը ({count})",
+ "UNSELECT_ALL": "Չընտրել բոլորը ({count})",
+ "BULK_DELETE_BUTTON": "Delete",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Այո, ջնջել բոլորը",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Համապատասխան ՀՏՀ-ներ",
"DESCRIPTION": "Այս ՀՏՀ-ները ստեղծվել են ուղղակիորեն փաստաթղթից։"
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Alat",
"ADD_NEW": "Cipta alat baru",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "Tiada alat khusus tersedia",
"SUBTITLE": "Ստեղծեք անհատական գործիքներ՝ ձեր օգնականին արտաքին API-ների և ծառայությունների հետ կապելու համար՝ հնարավորություն տալով նրան ստանալ տվյալներ և կատարել գործողություններ ձեր անունից։",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Alat tersuai berjaya dipadam",
"ERROR_MESSAGE": "Gagal memadam alat tersuai"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Nama Alat",
"PLACEHOLDER": "Carian Pesanan",
- "ERROR": "Nama alat diperlukan"
+ "ERROR": "Nama alat diperlukan",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Penerangan",
@@ -991,14 +1010,14 @@
"HEADER": "Կապված մուտքային արկղեր",
"ADD_NEW": "Կապել նոր մուտքային արկղ",
"OPTIONS": {
- "DISCONNECT": "Կապը قطعել"
+ "DISCONNECT": "Դադարեցնել կապը"
},
"DELETE": {
- "TITLE": "Համոզվա՞ծ եք, որ ցանկանում եք قطعել մուտքային արկղի կապը։",
+ "TITLE": "Համոզվա՞ծ եք, որ ցանկանում եք դադարեցնել կապը այս նամակապանակի հետ։",
"DESCRIPTION": "",
"CONFIRM": "Այո, ջնջել",
- "SUCCESS_MESSAGE": "Մուտքային արկղի կապը հաջողությամբ قطعվեց։",
- "ERROR_MESSAGE": "Մուտքային արկղի կապը قطعելիս սխալ է տեղի ունեցել, խնդրում ենք փորձել կրկին։"
+ "SUCCESS_MESSAGE": "Նամակապանակի կապը հաջողությամբ դադարեցվեց։",
+ "ERROR_MESSAGE": "Նամակապանակի կապը դադարեցնելու ընթացքում սխալ տեղի ունեցավ, խնդրում ենք փորձել կրկին։"
},
"FORM_DESCRIPTION": "Ընտրեք մուտքային արկղը, որը կապվելու է օգնականի հետ։",
"CREATE": {
diff --git a/app/javascript/dashboard/i18n/locale/id/conversation.json b/app/javascript/dashboard/i18n/locale/id/conversation.json
index db4bd4c89..46e0f3902 100644
--- a/app/javascript/dashboard/i18n/locale/id/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/id/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Tanda tangan pesan tidak dikonfigurasi, harap konfigurasikan di pengaturan profil.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "Berikan copilot perintah tambahan, atau tanyakan hal lain... Tekan enter untuk mengirim tindak lanjut",
"CLICK_HERE": "Klik di sini untuk memperbarui",
"WHATSAPP_TEMPLATES": "Templat Whatsapp"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Seret dan letakkan di sini untuk melampirkan",
"START_AUDIO_RECORDING": "Mulai merekam audio",
"STOP_AUDIO_RECORDING": "Berhenti merekam audio",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot sedang berpikir",
"EMAIL_HEAD": {
"TO": "KEPADA",
"ADD_BCC": "Tambahkan bcc",
diff --git a/app/javascript/dashboard/i18n/locale/id/helpCenter.json b/app/javascript/dashboard/i18n/locale/id/helpCenter.json
index 40e1f1a9d..90daf4180 100644
--- a/app/javascript/dashboard/i18n/locale/id/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/id/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Bahasa dihapus dari portal berhasil",
"ERROR_MESSAGE": "Tidak dapat menghapus bahasa dari portal. Coba lagi."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Default",
+ "DRAFT": "Draf",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Hapus"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Select locale..."
},
+ "STATUS": {
+ "LABEL": "Status",
+ "OPTIONS": {
+ "LIVE": "Diterbitkan",
+ "DRAFT": "Draf"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Bahasa berhasil ditambahkan",
"ERROR_MESSAGE": "Tidak dapat menambahkan bahasa. Coba lagi."
diff --git a/app/javascript/dashboard/i18n/locale/id/integrations.json b/app/javascript/dashboard/i18n/locale/id/integrations.json
index 36deb612f..523de64e1 100644
--- a/app/javascript/dashboard/i18n/locale/id/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/id/integrations.json
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Captain",
- "HEADER_KNOW_MORE": "Know more",
+ "HEADER_KNOW_MORE": "Pelajari lebih lanjut",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "ASSISTANTS": "Asisten",
+ "SWITCH_ASSISTANT": "Beralih antar asisten",
+ "NEW_ASSISTANT": "Buat Asisten",
+ "EMPTY_LIST": "Tidak ada asisten ditemukan, silakan buat satu untuk memulai"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "PANEL_TITLE": "Mulai dengan Copilot",
+ "KICK_OFF_MESSAGE": "Butuh ringkasan cepat, ingin memeriksa percakapan sebelumnya, atau menyusun balasan yang lebih baik? Copilot hadir untuk mempercepat semuanya.",
"SEND_MESSAGE": "Kirim Pesan...",
- "EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
- "LOADER": "Captain is thinking",
+ "EMPTY_MESSAGE": "Terjadi kesalahan saat menghasilkan respons. Silakan coba lagi.",
+ "LOADER": "Captain sedang berpikir",
"YOU": "Anda",
- "USE": "Use this",
- "RESET": "Reset",
- "SHOW_STEPS": "Show steps",
- "SELECT_ASSISTANT": "Select Assistant",
+ "USE": "Gunakan ini",
+ "RESET": "Setel ulang",
+ "SHOW_STEPS": "Tampilkan langkah-langkah",
+ "SELECT_ASSISTANT": "Pilih Asisten",
"PROMPTS": {
"SUMMARIZE": {
- "LABEL": "Summarize this conversation",
- "CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
+ "LABEL": "Ringkas percakapan ini",
+ "CONTENT": "Ringkas poin-poin utama yang dibahas antara pelanggan dan agen dukungan, termasuk kekhawatiran, pertanyaan pelanggan, dan solusi atau tanggapan yang diberikan oleh agen dukungan"
},
"SUGGEST": {
- "LABEL": "Suggest an answer",
- "CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
+ "LABEL": "Sarankan jawaban",
+ "CONTENT": "Analisis pertanyaan pelanggan, dan buat draf jawaban yang secara efektif menangani kekhawatiran atau pertanyaan mereka. Pastikan balasan jelas, singkat, dan memberikan informasi yang berguna."
},
"RATE": {
- "LABEL": "Rate this conversation",
- "CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
+ "LABEL": "Nilai percakapan ini",
+ "CONTENT": "Tinjau percakapan untuk melihat seberapa baik memenuhi kebutuhan pelanggan. Berikan penilaian dari 5 berdasarkan nada, kejelasan, dan efektivitas."
},
"HIGH_PRIORITY": {
- "LABEL": "High priority conversations",
- "CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
+ "LABEL": "Percakapan prioritas tinggi",
+ "CONTENT": "Beri saya ringkasan semua percakapan terbuka prioritas tinggi. Sertakan ID percakapan, nama pelanggan (jika tersedia), isi pesan terakhir, dan agen yang ditugaskan. Kelompokkan berdasarkan status jika relevan."
},
"LIST_CONTACTS": {
- "LABEL": "List contacts",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "LABEL": "Daftar kontak",
+ "CONTENT": "Tampilkan daftar 10 kontak teratas. Sertakan nama, email atau nomor telepon (jika tersedia), waktu terakhir terlihat, tag (jika ada)."
}
}
},
"PLAYGROUND": {
"USER": "Anda",
- "ASSISTANT": "Assistant",
+ "ASSISTANT": "Asisten",
"MESSAGE_PLACEHOLDER": "Ketik pesan Anda...",
- "HEADER": "Playground",
- "DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
- "CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
+ "HEADER": "Area pengujian",
+ "DESCRIPTION": "Gunakan playground ini untuk mengirim pesan ke asisten Anda dan periksa apakah ia merespons dengan akurat, cepat, dan dengan nada yang Anda harapkan.",
+ "CREDIT_NOTE": "Pesan yang dikirim di sini akan dihitung sebagai kredit Captain Anda."
},
"PAYWALL": {
- "TITLE": "Upgrade to use Captain AI",
- "AVAILABLE_ON": "Captain is not available on the free plan.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "TITLE": "Tingkatkan untuk menggunakan Captain AI",
+ "AVAILABLE_ON": "Captain tidak tersedia di paket gratis.",
+ "UPGRADE_PROMPT": "Tingkatkan paket Anda untuk mendapatkan akses ke asisten kami, copilot, dan lainnya.",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "AVAILABLE_ON": "Captain AI hanya tersedia di paket Enterprise.",
+ "UPGRADE_PROMPT": "Tingkatkan paket Anda untuk mendapatkan akses ke asisten kami, copilot, dan lainnya.",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"BANNER": {
- "RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
- "DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
+ "RESPONSES": "Anda telah menggunakan lebih dari 80% batas respons Anda. Untuk terus menggunakan Captain AI, silakan tingkatkan.",
+ "DOCUMENTS": "Batas dokumen telah tercapai. Tingkatkan untuk terus menggunakan Captain AI."
},
"FORM": {
"CANCEL": "Batalkan",
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
+ "SELECTED": "{count} selected",
+ "SELECT_ALL": "Select all ({count})",
+ "UNSELECT_ALL": "Unselect all ({count})",
+ "BULK_DELETE_BUTTON": "Hapus",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Yes, delete all",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Deskripsi",
diff --git a/app/javascript/dashboard/i18n/locale/is/conversation.json b/app/javascript/dashboard/i18n/locale/is/conversation.json
index bb130ae2e..13b87a96f 100644
--- a/app/javascript/dashboard/i18n/locale/is/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/is/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Skilaboðundirskrift er ekki stillt, vinsamlegast stilltu hana í prófílstillingum.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "Gefðu copilot viðbótarspurningar, eða spurðu hvað sem er annað... Ýttu á enter til að senda framhaldsskilaboð",
"CLICK_HERE": "Click here to update",
"WHATSAPP_TEMPLATES": "Whatsapp Templates"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Dragðu og slepptu viðhenginu hingað",
"START_AUDIO_RECORDING": "Hefja hljóðupptöku",
"STOP_AUDIO_RECORDING": "Stoppa hljóðupptöku",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot er að hugsa",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Bæta við bcc",
diff --git a/app/javascript/dashboard/i18n/locale/is/helpCenter.json b/app/javascript/dashboard/i18n/locale/is/helpCenter.json
index 8026a3816..d68670cd4 100644
--- a/app/javascript/dashboard/i18n/locale/is/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/is/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Locale removed from portal successfully",
"ERROR_MESSAGE": "Ekki tókst að fjarlægja landstaðli úr gáttinni. Reyndu aftur."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Default",
+ "DRAFT": "Draft",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Eyða"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Select locale..."
},
+ "STATUS": {
+ "LABEL": "Staða",
+ "OPTIONS": {
+ "LIVE": "Published",
+ "DRAFT": "Draft"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Locale added successfully",
"ERROR_MESSAGE": "Unable to add locale. Try again."
diff --git a/app/javascript/dashboard/i18n/locale/is/integrations.json b/app/javascript/dashboard/i18n/locale/is/integrations.json
index fa4339f11..74181313d 100644
--- a/app/javascript/dashboard/i18n/locale/is/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/is/integrations.json
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Captain",
- "HEADER_KNOW_MORE": "Know more",
+ "HEADER_KNOW_MORE": "Fáðu meiri upplýsingar",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "ASSISTANTS": "Aðstoðarmenn",
+ "SWITCH_ASSISTANT": "Skiptu á milli aðstoðarmanna",
+ "NEW_ASSISTANT": "Búa til aðstoðarmann",
+ "EMPTY_LIST": "Engir aðstoðarmenn fundust, vinsamlegast búðu til einn til að byrja"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "PANEL_TITLE": "Byrjaðu með Copilot",
+ "KICK_OFF_MESSAGE": "Vantar stutta yfirlit, viltu athuga fyrri samtöl eða semja betri svar? Copilot er hér til að flýta fyrir.",
"SEND_MESSAGE": "Senda skilaboð...",
- "EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
- "LOADER": "Captain is thinking",
+ "EMPTY_MESSAGE": "Villa við að búa til svar. Reyndu aftur.",
+ "LOADER": "Captain er að hugsa",
"YOU": "You",
- "USE": "Use this",
- "RESET": "Reset",
- "SHOW_STEPS": "Show steps",
- "SELECT_ASSISTANT": "Select Assistant",
+ "USE": "Nota þetta",
+ "RESET": "Endurstilla",
+ "SHOW_STEPS": "Sýna skref",
+ "SELECT_ASSISTANT": "Veldu aðstoðarmann",
"PROMPTS": {
"SUMMARIZE": {
- "LABEL": "Summarize this conversation",
- "CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
+ "LABEL": "Yfirlit yfir þetta samtal",
+ "CONTENT": "Yfirlit yfir lykilatriði sem rædd voru milli viðskiptavinar og þjónustumanns, þar með talin áhyggjur, spurningar og lausnir eða svör frá þjónustumanninum"
},
"SUGGEST": {
- "LABEL": "Suggest an answer",
- "CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
+ "LABEL": "Leggðu til svar",
+ "CONTENT": "Greindu fyrirspurn viðskiptavinarins og semdu svar sem tekur á áhyggjum eða spurningum þeirra. Gakktu úr skugga um að svarið sé skýrt, hnitmiðað og veiti gagnlegar upplýsingar."
},
"RATE": {
- "LABEL": "Rate this conversation",
- "CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
+ "LABEL": "Gefðu einkunn fyrir þetta samtal",
+ "CONTENT": "Skoðaðu samtalið til að meta hversu vel það uppfyllir þarfir viðskiptavinarins. Gefðu einkunn frá 1 til 5 byggða á tóni, skýrleika og árangri."
},
"HIGH_PRIORITY": {
- "LABEL": "High priority conversations",
- "CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
+ "LABEL": "Samtöl með háum forgangi",
+ "CONTENT": "Gefðu mér yfirlit yfir öll opnu samtöl með háum forgang. Hafðu með samtalsnúmerið, nafn viðskiptavinar (ef fáanlegt er), síðasta skilaboð og úthlutaða umboðsmanninn. Flokkaðu eftir stöðu ef við á."
},
"LIST_CONTACTS": {
- "LABEL": "List contacts",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "LABEL": "Listi yfir tengiliði",
+ "CONTENT": "Sýndu mér lista yfir 10 efstu tengiliði. Hafðu með nafn, netfang eða símanúmer (ef fáanlegt), síðasta sýnnt tímabil, merki (ef einhver eru)."
}
}
},
"PLAYGROUND": {
"USER": "You",
- "ASSISTANT": "Assistant",
+ "ASSISTANT": "Aðstoðarmaður",
"MESSAGE_PLACEHOLDER": "Skrifaðu skilaboðin hér...",
- "HEADER": "Playground",
- "DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
- "CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
+ "HEADER": "Leikvöllur",
+ "DESCRIPTION": "Notaðu þennan leikvöll til að senda skilaboð til aðstoðarmannsins þíns og athuga hvort hann svarar rétt, fljótt og í þeirri stemmingu sem þú væntir.",
+ "CREDIT_NOTE": "Skilaboð sem send eru hér munu teljast til Captain inneigna þinna."
},
"PAYWALL": {
- "TITLE": "Upgrade to use Captain AI",
- "AVAILABLE_ON": "Captain is not available on the free plan.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "TITLE": "Uppfærðu til að nota Captain AI",
+ "AVAILABLE_ON": "Captain er ekki fáanlegur á ókeypis áætlun.",
+ "UPGRADE_PROMPT": "Uppfærðu áætlun þína til að fá aðgang að aðstoðarmönnum, copilot og fleiru.",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "AVAILABLE_ON": "Captain AI er aðeins fáanlegt í Enterprise áætlunum.",
+ "UPGRADE_PROMPT": "Uppfærðu áætlun þína til að fá aðgang að aðstoðarmönnum, copilot og fleiru.",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"BANNER": {
- "RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
- "DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
+ "RESPONSES": "Þú hefur notað yfir 80% af svörunarmörkum þínum. Til að halda áfram að nota Captain AI, vinsamlegast uppfærðu.",
+ "DOCUMENTS": "Skjalið miðað hámark náð. Uppfærðu til að halda áfram að nota Captain AI."
},
"FORM": {
"CANCEL": "Hætta við",
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
+ "SELECTED": "{count} selected",
+ "SELECT_ALL": "Select all ({count})",
+ "UNSELECT_ALL": "Unselect all ({count})",
+ "BULK_DELETE_BUTTON": "Eyða",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Yes, delete all",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Description",
diff --git a/app/javascript/dashboard/i18n/locale/it/helpCenter.json b/app/javascript/dashboard/i18n/locale/it/helpCenter.json
index 78add9aaa..3931be677 100644
--- a/app/javascript/dashboard/i18n/locale/it/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/it/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Lingua rimossa dal portale con successo",
"ERROR_MESSAGE": "Impossibile rimuovere la lingua dal portale. Riprova."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} articolo | {count} articoli",
"CATEGORIES_COUNT": "{count} categoria | {count} categorie",
"DEFAULT": "Predefinito",
+ "DRAFT": "Bozza",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Imposta predefinito",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Elimina"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Seleziona lingua..."
},
+ "STATUS": {
+ "LABEL": "Stato",
+ "OPTIONS": {
+ "LIVE": "Pubblicato",
+ "DRAFT": "Bozza"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Lingua aggiunta con successo",
"ERROR_MESSAGE": "Impossibile aggiungere la lingua. Riprova."
diff --git a/app/javascript/dashboard/i18n/locale/it/integrations.json b/app/javascript/dashboard/i18n/locale/it/integrations.json
index 6414f7cb1..523de2d32 100644
--- a/app/javascript/dashboard/i18n/locale/it/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/it/integrations.json
@@ -395,7 +395,7 @@
"ASSISTANTS": "Assistenti",
"SWITCH_ASSISTANT": "Cambia assistenti",
"NEW_ASSISTANT": "Crea Assistente",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "EMPTY_LIST": "Nessun assistente trovato, creane uno per iniziare"
},
"COPILOT": {
"TITLE": "Copilot",
@@ -407,7 +407,7 @@
"LOADER": "Captain sta pensando",
"YOU": "Tu",
"USE": "Usa questo",
- "RESET": "Reset",
+ "RESET": "Reimposta",
"SHOW_STEPS": "Mostra i passaggi",
"SELECT_ASSISTANT": "Seleziona Assistente",
"PROMPTS": {
@@ -437,7 +437,7 @@
"USER": "Tu",
"ASSISTANT": "Assistente",
"MESSAGE_PLACEHOLDER": "Scrivi il tuo messaggio...",
- "HEADER": "Playground",
+ "HEADER": "Area di prova",
"DESCRIPTION": "Usa questo playground per inviare messaggi al tuo assistente e controllare se risponde correttamente, rapidamente e con il tono che ti aspetti.",
"CREDIT_NOTE": "I messaggi inviati qui vengono scalati dai crediti Captain."
},
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documenti",
"ADD_NEW": "Crea un nuovo documento",
+ "SELECTED": "{count} selezionate",
+ "SELECT_ALL": "Seleziona tutto ({count})",
+ "UNSELECT_ALL": "Deseleziona tutto ({count})",
+ "BULK_DELETE_BUTTON": "Elimina",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Sì, elimina tutte",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "FAQ Correlate",
"DESCRIPTION": "Queste FAQ vengono generate direttamente dai Documenti."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Strumenti",
"ADD_NEW": "Crea un nuovo strumento",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "Nessuno strumento personalizzato disponibile",
"SUBTITLE": "Crea strumenti personalizzati per collegare il tuo assistente con API e servizi esterni, consentendogli di recuperare dati ed eseguire azioni per tuo conto.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Strumento personalizzato eliminato correttamente",
"ERROR_MESSAGE": "Impossibile eliminare lo strumento personalizzato"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Nome Strumento",
"PLACEHOLDER": "Ricerca Ordini",
- "ERROR": "Nome strumento richiesto"
+ "ERROR": "Nome strumento richiesto",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Descrizione",
diff --git a/app/javascript/dashboard/i18n/locale/ja/conversation.json b/app/javascript/dashboard/i18n/locale/ja/conversation.json
index 25a3d01fc..6aeeeedc4 100644
--- a/app/javascript/dashboard/i18n/locale/ja/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ja/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "メッセージ署名が構成されていません。プロフィール設定で構成してください。",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "Copilot に追加のプロンプトを送るか、ほかの質問をしてください… Enter キーでフォローアップを送信",
"CLICK_HERE": "ここをクリックして更新",
"WHATSAPP_TEMPLATES": "Whatsapp テンプレート"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "添付するにはここにドラッグ&ドロップ",
"START_AUDIO_RECORDING": "音声録音を開始",
"STOP_AUDIO_RECORDING": "音声録音を停止",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilotが考え中",
"EMAIL_HEAD": {
"TO": "宛先",
"ADD_BCC": "Bcc を追加",
diff --git a/app/javascript/dashboard/i18n/locale/ja/helpCenter.json b/app/javascript/dashboard/i18n/locale/ja/helpCenter.json
index 022d15038..f6e5ce9ba 100644
--- a/app/javascript/dashboard/i18n/locale/ja/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/ja/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "ロケールがポータルから正常に削除されました",
"ERROR_MESSAGE": "ロケールをポータルから削除できませんでした。再試行してください。"
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} 記事 | {count} 記事",
"CATEGORIES_COUNT": "{count} カテゴリー | {count} カテゴリー",
"DEFAULT": "デフォルト",
+ "DRAFT": "下書き",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "デフォルトに設定",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "削除"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "ロケールを選択..."
},
+ "STATUS": {
+ "LABEL": "状況",
+ "OPTIONS": {
+ "LIVE": "公開済み",
+ "DRAFT": "下書き"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "ロケールが正常に追加されました",
"ERROR_MESSAGE": "ロケールを追加できませんでした。再試行してください。"
diff --git a/app/javascript/dashboard/i18n/locale/ja/integrations.json b/app/javascript/dashboard/i18n/locale/ja/integrations.json
index 9e9b3b616..0df440e47 100644
--- a/app/javascript/dashboard/i18n/locale/ja/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ja/integrations.json
@@ -390,46 +390,46 @@
},
"CAPTAIN": {
"NAME": "キャプテン",
- "HEADER_KNOW_MORE": "Know more",
+ "HEADER_KNOW_MORE": "詳細を見る",
"ASSISTANT_SWITCHER": {
"ASSISTANTS": "アシスタント",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "SWITCH_ASSISTANT": "アシスタントを切り替える",
+ "NEW_ASSISTANT": "アシスタントを作成",
+ "EMPTY_LIST": "アシスタントが見つかりません。始めるにはアシスタントを作成してください。"
},
"COPILOT": {
"TITLE": "コパイロット",
"TRY_THESE_PROMPTS": "これらのプロンプトを試してください",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "PANEL_TITLE": "Copilotの使い始め",
+ "KICK_OFF_MESSAGE": "簡単な要約が欲しい、過去の会話を確認したい、より良い返信を作成したい?Copilotが処理をスピードアップします。",
"SEND_MESSAGE": "メッセージを送信...",
- "EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
+ "EMPTY_MESSAGE": "回答の生成中にエラーが発生しました。もう一度お試しください。",
"LOADER": "Captainが考え中",
"YOU": "あなた",
"USE": "これを使用",
"RESET": "リセット",
- "SHOW_STEPS": "Show steps",
- "SELECT_ASSISTANT": "Select Assistant",
+ "SHOW_STEPS": "手順を表示",
+ "SELECT_ASSISTANT": "アシスタントを選択",
"PROMPTS": {
"SUMMARIZE": {
- "LABEL": "Summarize this conversation",
- "CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
+ "LABEL": "この会話を要約する",
+ "CONTENT": "顧客とサポートエージェントとの間で話し合われた重要なポイント、顧客の懸念や質問、サポートエージェントによる解決策や回答を要約してください。"
},
"SUGGEST": {
- "LABEL": "Suggest an answer",
- "CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
+ "LABEL": "回答を提案する",
+ "CONTENT": "顧客の問い合わせを分析し、顧客の懸念や質問に効果的に対応する回答案を作成してください。返信は明確で簡潔かつ役立つ情報を提供するようにしてください。"
},
"RATE": {
- "LABEL": "Rate this conversation",
- "CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
+ "LABEL": "この会話を評価する",
+ "CONTENT": "会話を確認して、顧客のニーズにどの程度応えているか評価してください。トーン、明確さ、有効性に基づき5点満点で評価を共有してください。"
},
"HIGH_PRIORITY": {
- "LABEL": "High priority conversations",
- "CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
+ "LABEL": "高優先度の会話",
+ "CONTENT": "すべての高優先度の未解決会話の要約を教えてください。会話ID、顧客名(あれば)、最新メッセージの内容、および担当エージェントを含めてください。該当する場合はステータス別にグループ化してください。"
},
"LIST_CONTACTS": {
- "LABEL": "List contacts",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "LABEL": "連絡先リスト",
+ "CONTENT": "上位10件の連絡先リストを表示してください。名前、メールまたは電話番号(あれば)、最終アクセス時間、タグ(あれば)を含めてください。"
}
}
},
@@ -437,9 +437,9 @@
"USER": "あなた",
"ASSISTANT": "アシスタント",
"MESSAGE_PLACEHOLDER": "Type your message...",
- "HEADER": "Playground",
- "DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
- "CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
+ "HEADER": "プレイグラウンド",
+ "DESCRIPTION": "このプレイグラウンドを使ってアシスタントへメッセージを送り、正確かつ迅速に、期待したトーンで応答するかを確認してください。",
+ "CREDIT_NOTE": "ここで送信したメッセージはCaptainのクレジットにカウントされます。"
},
"PAYWALL": {
"TITLE": "アップグレードしてCaptain AIを利用する",
@@ -449,7 +449,7 @@
"CANCEL_ANYTIME": "プランはいつでも変更またはキャンセルできます"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
+ "AVAILABLE_ON": "Captain AIはEnterpriseプランでのみ利用可能です。",
"UPGRADE_PROMPT": "アシスタント、Copilotなどにアクセスするには、プランをアップグレードしてください。",
"ASK_ADMIN": "管理者にアップグレードを依頼してください。"
},
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "ドキュメント",
"ADD_NEW": "新しいドキュメントを作成",
+ "SELECTED": "{count} selected",
+ "SELECT_ALL": "Select all ({count})",
+ "UNSELECT_ALL": "Unselect all ({count})",
+ "BULK_DELETE_BUTTON": "削除",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Yes, delete all",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "関連するFAQ",
"DESCRIPTION": "これらのFAQはドキュメントから直接生成されます。"
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "説明",
diff --git a/app/javascript/dashboard/i18n/locale/ka/contact.json b/app/javascript/dashboard/i18n/locale/ka/contact.json
index 2bdbc7ad3..bf80c5567 100644
--- a/app/javascript/dashboard/i18n/locale/ka/contact.json
+++ b/app/javascript/dashboard/i18n/locale/ka/contact.json
@@ -1,22 +1,22 @@
{
"CONTACT_PANEL": {
- "NOT_AVAILABLE": "Not Available",
- "EMAIL_ADDRESS": "Email Address",
- "PHONE_NUMBER": "Phone number",
+ "NOT_AVAILABLE": "მიუწვდომელია",
+ "EMAIL_ADDRESS": "ელ. ფოსტის მისამართი",
+ "PHONE_NUMBER": "ტელეფონის ნომერი",
"IDENTIFIER": "Identifier",
- "COPY_SUCCESSFUL": "Copied to clipboard successfully",
- "COMPANY": "Company",
- "LOCATION": "Location",
+ "COPY_SUCCESSFUL": "კლიპბორდზე წარმატებით დაკოპირდა",
+ "COMPANY": "კომპანია",
+ "LOCATION": "ლოკაცია",
"BROWSER_LANGUAGE": "Browser Language",
- "CONVERSATION_TITLE": "Conversation Details",
+ "CONVERSATION_TITLE": "საუბრის დეტალები",
"VIEW_PROFILE": "View Profile",
- "BROWSER": "Browser",
- "OS": "Operating System",
- "INITIATED_FROM": "Initiated from",
- "INITIATED_AT": "Initiated at",
- "IP_ADDRESS": "IP Address",
+ "BROWSER": "ბრაუზერი",
+ "OS": "ოპერაციული სისტემა",
+ "INITIATED_FROM": "დაწყებულია",
+ "INITIATED_AT": "დაწყების დრო",
+ "IP_ADDRESS": "IP მისამართი",
"CREATED_AT_LABEL": "Created",
- "NEW_MESSAGE": "New message",
+ "NEW_MESSAGE": "ახალი შეტყობინება",
"CALL": "დარეკვა",
"CALL_INITIATED": "Calling the contact…",
"CALL_FAILED": "Unable to start the call. Please try again.",
@@ -24,8 +24,8 @@
"TITLE": "აირჩიეთ ხმოვანი საფოსტო ყუთი"
},
"CONVERSATIONS": {
- "NO_RECORDS_FOUND": "There are no previous conversations associated to this contact.",
- "TITLE": "Previous Conversations"
+ "NO_RECORDS_FOUND": "ამ კონტაქტთან დაკავშირებული წინა საუბრები არ მოიძებნა.",
+ "TITLE": "წინა საუბრები"
},
"LABELS": {
"CONTACT": {
@@ -49,8 +49,8 @@
"UNMUTE_CONTACT": "Unblock Contact",
"MUTED_SUCCESS": "This contact is blocked successfully. You will not be notified of any future conversations.",
"UNMUTED_SUCCESS": "This contact is unblocked successfully.",
- "SEND_TRANSCRIPT": "Send Transcript",
- "EDIT_LABEL": "Edit",
+ "SEND_TRANSCRIPT": "ტრანსკრიპტის გაგზავნა",
+ "EDIT_LABEL": "რედაქტირება",
"SIDEBAR_SECTIONS": {
"CUSTOM_ATTRIBUTES": "Custom Attributes",
"CONTACT_LABELS": "Contact Labels",
@@ -59,9 +59,9 @@
}
},
"EDIT_CONTACT": {
- "BUTTON_LABEL": "Edit Contact",
- "TITLE": "Edit contact",
- "DESC": "Edit contact details"
+ "BUTTON_LABEL": "კონტაქტის რედაქტირება",
+ "TITLE": "კონტაქტის რედაქტირება",
+ "DESC": "კონტაქტის დეტალების რედაქტირება"
},
"DELETE_CONTACT": {
"BUTTON_LABEL": "Delete Contact",
@@ -80,40 +80,40 @@
},
"CONTACT_FORM": {
"FORM": {
- "SUBMIT": "Submit",
- "CANCEL": "Cancel",
+ "SUBMIT": "გაგზავნა",
+ "CANCEL": "გაუქმება",
"AVATAR": {
- "LABEL": "Contact Avatar"
+ "LABEL": "კონტაქტის ავატარი"
},
"NAME": {
- "PLACEHOLDER": "Enter the full name of the contact",
- "LABEL": "Full Name"
+ "PLACEHOLDER": "შეიყვანეთ კონტაქტის სრული სახელი",
+ "LABEL": "სრული სახელი"
},
"BIO": {
- "PLACEHOLDER": "Enter the bio of the contact",
- "LABEL": "Bio"
+ "PLACEHOLDER": "შეიყვანეთ კონტაქტის ბიო",
+ "LABEL": "ბიო"
},
"EMAIL_ADDRESS": {
- "PLACEHOLDER": "Enter the email address of the contact",
- "LABEL": "Email Address",
+ "PLACEHOLDER": "შეიყვანეთ კონტაქტის ელ. ფოსტის მისამართი",
+ "LABEL": "ელ. ფოსტის მისამართი",
"DUPLICATE": "This email address is in use for another contact.",
"ERROR": "Please enter a valid email address."
},
"PHONE_NUMBER": {
- "PLACEHOLDER": "Enter the phone number of the contact",
- "LABEL": "Phone Number",
+ "PLACEHOLDER": "შეიყვანეთ კონტაქტის ტელეფონის ნომერი",
+ "LABEL": "ტელეფონის ნომერი",
"HELP": "Phone number should be of E.164 format eg: +1415555555 [+][country code][area code][local phone number]",
- "ERROR": "Phone number should be either empty or of E.164 format",
+ "ERROR": "ტელეფონის ნომერი უნდა იყოს ან ცარიელი, ან E.164 ფორმატის",
"DIAL_CODE_ERROR": "Please select a dial code from the list",
"DUPLICATE": "This phone number is in use for another contact."
},
"LOCATION": {
- "PLACEHOLDER": "Enter the location of the contact",
- "LABEL": "Location"
+ "PLACEHOLDER": "შეიყვანეთ კონტაქტის მდებარეობა",
+ "LABEL": "მდებარეობა"
},
"COMPANY_NAME": {
- "PLACEHOLDER": "Enter the company name",
- "LABEL": "Company Name"
+ "PLACEHOLDER": "შეიყვანეთ კომპანიის სახელი",
+ "LABEL": "კომპანიის სახელი"
},
"COUNTRY": {
"PLACEHOLDER": "Enter the country name",
@@ -128,19 +128,19 @@
},
"SOCIAL_PROFILES": {
"FACEBOOK": {
- "PLACEHOLDER": "Enter the Facebook username",
+ "PLACEHOLDER": "შეიყვანეთ Facebook-ის მომხმარებლის სახელი",
"LABEL": "Facebook"
},
"TWITTER": {
- "PLACEHOLDER": "Enter the Twitter username",
+ "PLACEHOLDER": "შეიყვანეთ Twitter-ის მომხმარებლის სახელი",
"LABEL": "Twitter"
},
"LINKEDIN": {
- "PLACEHOLDER": "Enter the LinkedIn username",
+ "PLACEHOLDER": "შეიყვანეთ LinkedIn-ის მომხმარებლის სახელი",
"LABEL": "LinkedIn"
},
"GITHUB": {
- "PLACEHOLDER": "Enter the Github username",
+ "PLACEHOLDER": "შეიყვანეთ Github-ის მომხმარებლის სახელი",
"LABEL": "Github"
}
}
@@ -151,22 +151,22 @@
"ERROR_MESSAGE": "Could not delete the contact avatar. Please try again later."
}
},
- "SUCCESS_MESSAGE": "Contact saved successfully",
- "ERROR_MESSAGE": "There was an error, please try again"
+ "SUCCESS_MESSAGE": "კონტაქტი წარმატებით შენახულია",
+ "ERROR_MESSAGE": "დაფიქსირდა შეცდომა, გთხოვთ, სცადეთ თავიდან"
},
"NEW_CONVERSATION": {
- "BUTTON_LABEL": "Start conversation",
- "TITLE": "New conversation",
- "DESC": "Start a new conversation by sending a new message.",
- "NO_INBOX": "Couldn't find an inbox to initiate a new conversation with this contact.",
+ "BUTTON_LABEL": "საუბრის დაწყება",
+ "TITLE": "ახალი საუბარი",
+ "DESC": "დაიწყეთ ახალი საუბარი ახალი შეტყობინების გაგზავნით.",
+ "NO_INBOX": "ამ კონტაქტთან ახალი საუბრის დასაწყებად ვერ მოიძებნა ინბოქსი.",
"FORM": {
"TO": {
- "LABEL": "To"
+ "LABEL": "სად"
},
"INBOX": {
"LABEL": "Inbox",
"PLACEHOLDER": "Choose source inbox",
- "ERROR": "Select an inbox"
+ "ERROR": "აირჩიეთ ინბოქსი"
},
"SUBJECT": {
"LABEL": "Subject",
@@ -174,25 +174,25 @@
"ERROR": "Subject can't be empty"
},
"MESSAGE": {
- "LABEL": "Message",
- "PLACEHOLDER": "Write your message here",
- "ERROR": "Message can't be empty"
+ "LABEL": "მესიჯი",
+ "PLACEHOLDER": "დაწერეთ თქვენი მესიჯი აქ",
+ "ERROR": "მესიჯი არ შეიძლება იყოს ცარიელი"
},
"ATTACHMENTS": {
"SELECT": "Choose files",
"HELP_TEXT": "Drag and drop files here or choose files to attach"
},
- "SUBMIT": "Send message",
- "CANCEL": "Cancel",
- "SUCCESS_MESSAGE": "Message sent!",
+ "SUBMIT": "გაგზავნე მესიჯი",
+ "CANCEL": "გაუქმება",
+ "SUCCESS_MESSAGE": "მესიჯი გაგზავნილია!",
"GO_TO_CONVERSATION": "View",
- "ERROR_MESSAGE": "Couldn't send! try again"
+ "ERROR_MESSAGE": "გაგზავნა ვერ მოხერხდა! სცადეთ თავიდან"
}
},
"CONTACTS_PAGE": {
"LIST": {
"TABLE_HEADER": {
- "SOCIAL_PROFILES": "Social Profiles"
+ "SOCIAL_PROFILES": "სოციალური პროფილები"
}
}
},
diff --git a/app/javascript/dashboard/i18n/locale/ka/conversation.json b/app/javascript/dashboard/i18n/locale/ka/conversation.json
index 25ccc42ce..a7fa5e43c 100644
--- a/app/javascript/dashboard/i18n/locale/ka/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ka/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Message signature is not configured, please configure it in profile settings.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "მოდიე კოპილოტს დამატებითი ბრძნულობები, ან მკითხე რამე კიდევ... დაწექი Enter-მდე გამოგზავნა დასასრულებლად",
"CLICK_HERE": "Click here to update",
"WHATSAPP_TEMPLATES": "Whatsapp Templates"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Drag and drop here to attach",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "კოპილოტი ფიქრობს",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Add bcc",
diff --git a/app/javascript/dashboard/i18n/locale/ka/helpCenter.json b/app/javascript/dashboard/i18n/locale/ka/helpCenter.json
index 7f97b3495..1d838f636 100644
--- a/app/javascript/dashboard/i18n/locale/ka/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/ka/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "ლოკალი პორტალიდან წარმატებით წაიშალა",
"ERROR_MESSAGE": "ლოკალის პორტალიდან წაშლა ვერ მოხერხდა. სცადეთ ისევ."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} სტატია | {count} სტატიები",
"CATEGORIES_COUNT": "{count} კატეგორია | {count} კატეგორიები",
"DEFAULT": "ნაგულისხმები",
+ "DRAFT": "სავარაუდო",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "დაყენება როგორც ნაგულისხმები",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "წაშლა"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "აირჩიეთ ლოკალი..."
},
+ "STATUS": {
+ "LABEL": "Status",
+ "OPTIONS": {
+ "LIVE": "გამოქვეყნებული",
+ "DRAFT": "სავარაუდო"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "ლოკალი წარმატებით დაემატა",
"ERROR_MESSAGE": "ლოკალის დამატება ვერ მოხერხდა. სცადეთ თავიდან."
diff --git a/app/javascript/dashboard/i18n/locale/ka/integrations.json b/app/javascript/dashboard/i18n/locale/ka/integrations.json
index 45b2a6ca4..df76bfabc 100644
--- a/app/javascript/dashboard/i18n/locale/ka/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ka/integrations.json
@@ -429,7 +429,7 @@
},
"LIST_CONTACTS": {
"LABEL": "კონტაქტების სია",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "CONTENT": "აჩვენე მოწონებული 10 კონტაქტის სია. ჩათვალე სახელი, ელ.ფოსტა ან ტელეფონის ნომერი (თუ გვაქვს), ბოლო აქტივობის დრო, ტეგები (თუ არის)."
}
}
},
@@ -697,12 +697,12 @@
},
"DESCRIPTION": {
"LABEL": "აღწერა",
- "PLACEHOLDER": "Опишите, როგორ და სად გამოიყენება ეს სცენარი",
+ "PLACEHOLDER": "აღწერეთ, როგორ და სად იქნება გამოყენებული ეს სცენარი",
"ERROR": "სცენარის აღწერა აუცილებელია"
},
"INSTRUCTION": {
"LABEL": "როგორ მოვაგვაროთ",
- "PLACEHOLDER": "Опишите, როგორ და სად იქნება ამ სცენარის მართვა",
+ "PLACEHOLDER": "აღწერეთ, როგორ და სად დამუშავდება ეს სცენარი",
"ERROR": "სცენარის შინაარსი აუცილებელია"
},
"CREATE": "შექმნა",
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "დოკუმენტები",
"ADD_NEW": "ახალი დოკუმენტის შექმნა",
+ "SELECTED": "{count} არჩეული",
+ "SELECT_ALL": "ყველას არჩევა ({count})",
+ "UNSELECT_ALL": "ყველას არჩევის გაუქმება ({count})",
+ "BULK_DELETE_BUTTON": "Delete",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "დიახ, წაშალე ყველა",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "მიმართებული ხშირად დასმული კითხვები",
"DESCRIPTION": "ეს ხშირად დასმული კითხვები პირდაპირ დოკუმენტიდან არის გენერირებული."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "ინსტრუმენტები",
"ADD_NEW": "შექმენი ახალი ხელსაწყო",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "არ არის ხელმისაწვდომი მორგებული ხელსაწყოები",
"SUBTITLE": "შექმენი მორგებული ხელსაწყოები, რომ დაკავშირება მოახდინოს შენმა ასისტენტმა გარე API-ებთან და სერვისებთან, რაც საშუალებას მისცემს მას მონაცემების მიღებას და ქმედებების შესრულებას შენს სახელზე.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "კასტომური ხელსაწყო წარმატებით წაიშალა",
"ERROR_MESSAGE": "კასტომური ხელსაწყოს წაშლა ვერ მოხერხდა"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "ხელისაწვდომობის სახელი",
"PLACEHOLDER": "შეკვეთის მოძებნა",
- "ERROR": "ინსტრუმენტის სახელი აუცილებელია"
+ "ERROR": "ინსტრუმენტის სახელი აუცილებელია",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "აღწერა",
diff --git a/app/javascript/dashboard/i18n/locale/ka/report.json b/app/javascript/dashboard/i18n/locale/ka/report.json
index 45c40de58..5c5351f9f 100644
--- a/app/javascript/dashboard/i18n/locale/ka/report.json
+++ b/app/javascript/dashboard/i18n/locale/ka/report.json
@@ -1,39 +1,39 @@
{
"REPORT": {
"HEADER": "Conversations",
- "LOADING_CHART": "Loading chart data...",
- "NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
+ "LOADING_CHART": "ჩატვირთვა დიაგრამის მონაცემები...",
+ "NO_ENOUGH_DATA": "რეპორტის გენერირებისთვის საკმარისი მონაცემები არ გვაქვს მიღებული, გთხოვთ, სცადეთ მოგვიანებით.",
"DOWNLOAD_CONVERSATION_REPORTS": "Download conversation reports",
"DATA_FETCHING_FAILED": "Failed to fetch data, please try again later.",
"SUMMARY_FETCHING_FAILED": "Failed to fetch summary, please try again later.",
"METRICS": {
"CONVERSATIONS": {
- "NAME": "Conversations",
- "DESC": "( Total )"
+ "NAME": "შეხვედრები",
+ "DESC": "( ჯამში )"
},
"INCOMING_MESSAGES": {
"NAME": "Incoming Messages",
- "DESC": "( Total )"
+ "DESC": "( ჯამში )"
},
"OUTGOING_MESSAGES": {
"NAME": "Outgoing Messages",
- "DESC": "( Total )"
+ "DESC": "( ჯამში )"
},
"FIRST_RESPONSE_TIME": {
"NAME": "First Response Time",
- "DESC": "( Avg )",
+ "DESC": "( საშუალოდ )",
"INFO_TEXT": "Total number of conversations used for computation:",
"TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)"
},
"RESOLUTION_TIME": {
- "NAME": "Resolution Time",
- "DESC": "( Avg )",
+ "NAME": "გადაწყვეტის დრო",
+ "DESC": "( საშუალოდ )",
"INFO_TEXT": "Total number of conversations used for computation:",
"TOOLTIP_TEXT": "Resolution Time is {metricValue} (based on {conversationCount} conversations)"
},
"RESOLUTION_COUNT": {
- "NAME": "Resolution Count",
- "DESC": "( Total )"
+ "NAME": "გადაწყვეტის რაოდენობა",
+ "DESC": "( ჯამში )"
},
"BOT_RESOLUTION_COUNT": {
"NAME": "Resolution Count",
@@ -61,8 +61,8 @@
"CUSTOM_DATE_RANGE": "Custom date range"
},
"CUSTOM_DATE_RANGE": {
- "CONFIRM": "Apply",
- "PLACEHOLDER": "Select date range"
+ "CONFIRM": "გამოყენება",
+ "PLACEHOLDER": "აირჩიეთ თარიღის დიაპაზონი"
},
"GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By",
"DURATION_FILTER_LABEL": "Duration",
@@ -127,12 +127,12 @@
}
},
"AGENT_REPORTS": {
- "HEADER": "Agents Overview",
+ "HEADER": "აგენტების მიმოხილვა",
"DESCRIPTION": "Easily track agent performance with key metrics such as conversations, response times, resolution times, and resolved cases. Click an agent's name to learn more.",
- "LOADING_CHART": "Loading chart data...",
- "NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
- "DOWNLOAD_AGENT_REPORTS": "Download agent reports",
- "FILTER_DROPDOWN_LABEL": "Select Agent",
+ "LOADING_CHART": "გრაფიკის მონაცემების ჩატვირთვა...",
+ "NO_ENOUGH_DATA": "რეპორტის გენერირებისთვის საკმარისი მონაცემები არ გვაქვს, გთხოვთ, სცადეთ მოგვიანებით.",
+ "DOWNLOAD_AGENT_REPORTS": "აგენტების ანგარიშების ჩამოტვირთვა",
+ "FILTER_DROPDOWN_LABEL": "აირჩიეთ აგენტი",
"FILTERS": {
"INPUT_PLACEHOLDER": {
"AGENTS": "Search agents"
@@ -140,72 +140,72 @@
},
"METRICS": {
"CONVERSATIONS": {
- "NAME": "Conversations",
- "DESC": "( Total )"
+ "NAME": "შეტყობინებები",
+ "DESC": "(სულ)"
},
"INCOMING_MESSAGES": {
- "NAME": "Incoming Messages",
- "DESC": "( Total )"
+ "NAME": "მომავალი შეტყობინებები",
+ "DESC": "( ჯამში )"
},
"OUTGOING_MESSAGES": {
- "NAME": "Outgoing Messages",
- "DESC": "( Total )"
+ "NAME": "გამავალი შეტყობინებები",
+ "DESC": "( ჯამში )"
},
"FIRST_RESPONSE_TIME": {
"NAME": "First Response Time",
- "DESC": "( Avg )",
+ "DESC": "( საშუალოდ )",
"INFO_TEXT": "Total number of conversations used for computation:",
"TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)"
},
"RESOLUTION_TIME": {
- "NAME": "Resolution Time",
- "DESC": "( Avg )",
+ "NAME": "გადაჭრის დრო",
+ "DESC": "(საშუალო)",
"INFO_TEXT": "Total number of conversations used for computation:",
"TOOLTIP_TEXT": "Resolution Time is {metricValue} (based on {conversationCount} conversations)"
},
"RESOLUTION_COUNT": {
- "NAME": "Resolution Count",
- "DESC": "( Total )"
+ "NAME": "გადაჭრის რაოდენობა",
+ "DESC": "(სულ)"
}
},
"DATE_RANGE": [
{
"id": 0,
- "name": "Last 7 days"
+ "name": "ბოლო 7 დღე"
},
{
"id": 1,
- "name": "Last 30 days"
+ "name": "ბოლო 30 დღე"
},
{
"id": 2,
- "name": "Last 3 months"
+ "name": "ბოლო 3 თვე"
},
{
"id": 3,
- "name": "Last 6 months"
+ "name": "ბოლო 6 თვე"
},
{
"id": 4,
- "name": "Last year"
+ "name": "ბოლო წელი"
},
{
"id": 5,
- "name": "Custom date range"
+ "name": "მორგებული თარიღის დიაპაზონი"
}
],
"CUSTOM_DATE_RANGE": {
- "CONFIRM": "Apply",
- "PLACEHOLDER": "Select date range"
+ "CONFIRM": "გამოყენება",
+ "PLACEHOLDER": "აირჩიეთ თარიღის დიაპაზონი"
}
},
"LABEL_REPORTS": {
- "HEADER": "Labels Overview",
+ "HEADER": "ლეიბლების მიმოხილვა",
"DESCRIPTION": "Track label performance with key metrics including conversations, response times, resolution times, and resolved cases. Click a label name for detailed insights.",
- "LOADING_CHART": "Loading chart data...",
- "NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
- "DOWNLOAD_LABEL_REPORTS": "Download label reports",
- "FILTER_DROPDOWN_LABEL": "Select Label",
+ "LOADING_CHART": "გრაფიკის მონაცემების ჩატვირთვა...",
+ "NO_ENOUGH_DATA": "რეპორტის გენერირებისთვის საკმარისი მონაცემები არ გვაქვს, გთხოვთ, სცადეთ მოგვიანებით.",
+ "DOWNLOAD_LABEL_REPORTS": "ლეიბლების რეპორტების ჩამოტვირთვა",
+ "FILTER_DROPDOWN_LABEL": "ლეიბლის არჩევა",
"FILTERS": {
"INPUT_PLACEHOLDER": {
"LABELS": "Search labels"
@@ -213,54 +213,54 @@
},
"METRICS": {
"CONVERSATIONS": {
- "NAME": "Conversations",
- "DESC": "( Total )"
+ "NAME": "შეტყობინებები",
+ "DESC": "( ჯამში )"
},
"INCOMING_MESSAGES": {
- "NAME": "Incoming Messages",
- "DESC": "( Total )"
+ "NAME": "მომავალი შეტყობინებები",
+ "DESC": "( ჯამში )"
},
"OUTGOING_MESSAGES": {
- "NAME": "Outgoing Messages",
- "DESC": "( Total )"
+ "NAME": "გამავალი შეტყობინებები",
+ "DESC": "( ჯამში )"
},
"FIRST_RESPONSE_TIME": {
"NAME": "First Response Time",
- "DESC": "( Avg )",
+ "DESC": "( საშუალოდ )",
"INFO_TEXT": "Total number of conversations used for computation:",
"TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)"
},
"RESOLUTION_TIME": {
- "NAME": "Resolution Time",
- "DESC": "( Avg )",
+ "NAME": "გადაჭრის დრო",
+ "DESC": "(საშუალო)",
"INFO_TEXT": "Total number of conversations used for computation:",
"TOOLTIP_TEXT": "Resolution Time is {metricValue} (based on {conversationCount} conversations)"
},
"RESOLUTION_COUNT": {
- "NAME": "Resolution Count",
- "DESC": "( Total )"
+ "NAME": "გადაჭრის რაოდენობა",
+ "DESC": "(სულ)"
}
},
"DATE_RANGE": [
{
"id": 0,
- "name": "Last 7 days"
+ "name": "ბოლო 7 დღე"
},
{
"id": 1,
- "name": "Last 30 days"
+ "name": "ბოლო 30 დღე"
},
{
"id": 2,
- "name": "Last 3 months"
+ "name": "ბოლო 3 თვე"
},
{
"id": 3,
- "name": "Last 6 months"
+ "name": "ბოლო 6 თვე"
},
{
"id": 4,
- "name": "Last year"
+ "name": "ბოლო წელი"
},
{
"id": 5,
@@ -424,7 +424,7 @@
}
},
"CSAT_REPORTS": {
- "HEADER": "CSAT Reports",
+ "HEADER": "CSAT ანგარიშები",
"NO_RECORDS": "No responses yet",
"NO_RECORDS_DESCRIPTION": "CSAT survey responses will appear here once customers start providing feedback.",
"DOWNLOAD": "Download CSAT Reports",
@@ -454,10 +454,10 @@
},
"TABLE": {
"HEADER": {
- "CONTACT_NAME": "Contact",
+ "CONTACT_NAME": "კონტაქტი",
"AGENT_NAME": "Agent",
- "RATING": "Rating",
- "FEEDBACK_TEXT": "Feedback comment",
+ "RATING": "რეიტინგი",
+ "FEEDBACK_TEXT": "მიმოხილვის კომენტარი",
"CONVERSATION": "Conversation",
"CUSTOMER": "Customer",
"RESPONSE": "Response",
@@ -469,16 +469,16 @@
"NO_FEEDBACK": "No feedback provided",
"METRIC": {
"TOTAL_RESPONSES": {
- "LABEL": "Total responses",
- "TOOLTIP": "Total number of responses collected"
+ "LABEL": "საერთო პასუხები",
+ "TOOLTIP": "შეგროვებული პასუხების საერთო რაოდენობა"
},
"SATISFACTION_SCORE": {
- "LABEL": "Satisfaction score",
- "TOOLTIP": "Total number of positive responses / Total number of responses * 100"
+ "LABEL": "კმაყოფილების ქულა",
+ "TOOLTIP": "დადებითი პასუხების საერთო რაოდენობა / პასუხების საერთო რაოდენობა * 100"
},
"RESPONSE_RATE": {
- "LABEL": "Response rate",
- "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100"
+ "LABEL": "პასუხის მაჩვენებელი",
+ "TOOLTIP": "პასუხების საერთო რაოდენობა / გაგზავნილი CSAT გამოკითხვის შეტყობინებების საერთო რაოდენობა * 100"
},
"RATING_DISTRIBUTION": "Rating distribution"
},
diff --git a/app/javascript/dashboard/i18n/locale/ka/settings.json b/app/javascript/dashboard/i18n/locale/ka/settings.json
index 9d19150e7..2333f765a 100644
--- a/app/javascript/dashboard/i18n/locale/ka/settings.json
+++ b/app/javascript/dashboard/i18n/locale/ka/settings.json
@@ -3,11 +3,11 @@
"LINK": "პროფილის პარამეტრები",
"TITLE": "პროფილის პარამეტრები",
"BTN_TEXT": "პროფილის განახლება",
- "DELETE_AVATAR": "Delete Avatar",
- "AVATAR_DELETE_SUCCESS": "Avatar has been deleted successfully",
- "AVATAR_DELETE_FAILED": "There is an error while deleting avatar, please try again",
- "UPDATE_SUCCESS": "Your profile has been updated successfully",
- "PASSWORD_UPDATE_SUCCESS": "Your password has been changed successfully",
+ "DELETE_AVATAR": "ავატარის წაშლა",
+ "AVATAR_DELETE_SUCCESS": "ავატარი წარმატებით წაიშალა",
+ "AVATAR_DELETE_FAILED": "ავატარის წაშლისას მოხდა შეცდომა, გთხოვთ, სცადეთ თავიდან",
+ "UPDATE_SUCCESS": "თქვენი პროფილი წარმატებით განახლდა",
+ "PASSWORD_UPDATE_SUCCESS": "თქვენი პაროლი წარმატებით შეიცვალა",
"AFTER_EMAIL_CHANGED": "თქვენი პროფილი წარმატებით განახლდა, გთხოვთ, ხელახლა შეხვიდეთ სისტემაში, რადგან თქვენი შესვლის მონაცემები შეიცვალა",
"FORM": {
"PICTURE": "Profile Picture",
@@ -61,24 +61,24 @@
}
},
"MESSAGE_SIGNATURE_SECTION": {
- "TITLE": "Personal message signature",
+ "TITLE": "პირადი შეტყობინების ხელმოწერა",
"NOTE": "Create a unique message signature to appear at the end of every message you send from any inbox. You can also include an inline image, which is supported in live-chat, email, and API inboxes.",
- "BTN_TEXT": "Save message signature",
- "API_ERROR": "Couldn't save signature! Try again",
- "API_SUCCESS": "Signature saved successfully",
+ "BTN_TEXT": "შეტყობინების ხელმოწერის შენახვა",
+ "API_ERROR": "ხელმოწერა ვერ შენახა! სცადეთ თავიდან",
+ "API_SUCCESS": "ხელმოწერა წარმატებით შენახულია",
"IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again",
"IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save to save the signature",
"IMAGE_UPLOAD_SIZE_ERROR": "Image size should be less than {size}MB"
},
"MESSAGE_SIGNATURE": {
- "LABEL": "Message Signature",
- "ERROR": "Message Signature cannot be empty",
- "PLACEHOLDER": "Insert your personal message signature here."
+ "LABEL": "მესიჯის ხელმოწერა",
+ "ERROR": "მესიჯის ხელმოწერა არ შეიძლება იყოს ცარიელი",
+ "PLACEHOLDER": "ჩაწერეთ თქვენი პირადი მესიჯის ხელმოწერა აქ."
},
"PASSWORD_SECTION": {
"TITLE": "პაროლი",
"NOTE": "პაროლის განახლება ყველა მოწყობილობაზე გამოგასვლევინებთ სისტემიდან.",
- "BTN_TEXT": "Change password"
+ "BTN_TEXT": "პაროლის შეცვლა"
},
"SECURITY_SECTION": {
"TITLE": "უსაფრთხოება",
@@ -139,8 +139,8 @@
"NOTE": "აქ შეგიძლიათ შეცვალოთ ელფოსტის შეტყობინებების პარამეტრები",
"CONVERSATION_ASSIGNMENT": "გამოგიგზავნოთ ელფოსტის შეტყობინება, როცა საუბარი ჩემზე გადანაწილდება",
"CONVERSATION_CREATION": "გამოგიგზავნოთ ელფოსტის შეტყობინება, როცა ახალი საუბარი შეიქმნება",
- "CONVERSATION_MENTION": "Send email notifications when you are mentioned in a conversation",
- "ASSIGNED_CONVERSATION_NEW_MESSAGE": "Send email notifications when a new message is created in an assigned conversation",
+ "CONVERSATION_MENTION": "გაგზავნეთ ელ. ფოსტის შეტყობინებები, როდესაც საუბარში მოხსენიებთ",
+ "ASSIGNED_CONVERSATION_NEW_MESSAGE": "გაგზავნეთ ელ. ფოსტის შეტყობინებები, როდესაც ახალი შეტყობინება იქმნება დანიშნულ საუბარში",
"PARTICIPATING_CONVERSATION_NEW_MESSAGE": "Send email notifications when a new message is created in a participating conversation",
"SLA_MISSED_FIRST_RESPONSE": "Send email notifications when a conversation misses first response SLA",
"SLA_MISSED_NEXT_RESPONSE": "Send email notifications when a conversation misses next response SLA",
@@ -172,8 +172,8 @@
"NOTE": "აქ შეცვალეთ push-შეტყობინებების პარამეტრები",
"CONVERSATION_ASSIGNMENT": "გამოგიგზავნოთ push-შეტყობინება, როცა საუბარი ჩემზე გადანაწილდება",
"CONVERSATION_CREATION": "გამოგიგზავნოთ push-შეტყობინება, როცა ახალი საუბარი შეიქმნება",
- "CONVERSATION_MENTION": "Send push notifications when you are mentioned in a conversation",
- "ASSIGNED_CONVERSATION_NEW_MESSAGE": "Send push notifications when a new message is created in an assigned conversation",
+ "CONVERSATION_MENTION": "გაგზავნეთ push შეტყობინებები, როდესაც საუბარში მოხსენიებთ",
+ "ASSIGNED_CONVERSATION_NEW_MESSAGE": "გაგზავნეთ push შეტყობინებები, როდესაც ახალი შეტყობინება იქმნება დანიშნულ საუბარში",
"PARTICIPATING_CONVERSATION_NEW_MESSAGE": "Send push notifications when a new message is created in a participating conversation",
"HAS_ENABLED_PUSH": "ამ ბრაუზერში push-შეტყობინებები ჩართული გაქვთ.",
"REQUEST_PUSH": "ჩართეთ push-შეტყობინებები",
@@ -185,14 +185,14 @@
"LABEL": "პროფილის სურათი"
},
"NAME": {
- "LABEL": "Your full name",
- "ERROR": "Please enter a valid full name",
- "PLACEHOLDER": "Please enter your full name"
+ "LABEL": "თქვენი სრული სახელი",
+ "ERROR": "გთხოვთ, შეიყვანეთ ვალიდური სრული სახელი",
+ "PLACEHOLDER": "გთხოვთ, შეიყვანეთ თქვენი სრული სახელი"
},
"DISPLAY_NAME": {
- "LABEL": "Display name",
- "ERROR": "Please enter a valid display name",
- "PLACEHOLDER": "Please enter a display name, this would be displayed in conversations"
+ "LABEL": "გამოსახულების სახელი",
+ "ERROR": "გთხოვთ, შეიყვანეთ ვალიდური გამოსახულების სახელი",
+ "PLACEHOLDER": "გთხოვთ, შეიყვანეთ გამოსახულების სახელი, რომელიც გამოჩნდება საუბრებში"
},
"AVAILABILITY": {
"LABEL": "ხელმისაწვდომობა",
@@ -211,24 +211,24 @@
"PLACEHOLDER": "შეიყვანეთ თქვენი ელფოსტის მისამართი, ის გამოჩნდება საუბარში"
},
"CURRENT_PASSWORD": {
- "LABEL": "Current password",
- "ERROR": "Please enter the current password",
- "PLACEHOLDER": "Please enter the current password"
+ "LABEL": "მიმდინარე პაროლი",
+ "ERROR": "გთხოვთ, შეიყვანეთ მიმდინარე პაროლი",
+ "PLACEHOLDER": "გთხოვთ, შეიყვანეთ მიმდინარე პაროლი"
},
"PASSWORD": {
- "LABEL": "New password",
+ "LABEL": "ახალი პაროლი",
"ERROR": "შეიყვანეთ პაროლი მინიმუმ 6 სიმბოლოთი",
"PLACEHOLDER": "შეიყვანეთ ახალი პაროლი"
},
"PASSWORD_CONFIRMATION": {
"LABEL": "დაადასტურეთ ახალი პაროლი",
"ERROR": "პაროლის დადასტურება უნდა ემთხვეოდეს პაროლს",
- "PLACEHOLDER": "Please re-enter your new password"
+ "PLACEHOLDER": "გთხოვთ, ხელახლა შეიყვანეთ ახალი პაროლი"
}
}
},
"SIDEBAR_ITEMS": {
- "CHANGE_AVAILABILITY_STATUS": "Change",
+ "CHANGE_AVAILABILITY_STATUS": "შეცვლა",
"CHANGE_ACCOUNTS": "Switch account",
"SWITCH_ACCOUNT": "Switch account",
"CONTACT_SUPPORT": "Contact support",
@@ -245,7 +245,7 @@
"APP_GLOBAL": {
"TRIAL_MESSAGE": "დღე დარჩა საცდელი ვერსიიდან.",
"TRAIL_BUTTON": "შეიძინეთ",
- "DELETED_USER": "Deleted User",
+ "DELETED_USER": "წაშლილი მომხმარებელი",
"EMAIL_VERIFICATION_PENDING": "It seems that you haven't verified your email address yet. Please check your inbox for the verification email.",
"RESEND_VERIFICATION_MAIL": "Resend verification email",
"EMAIL_VERIFICATION_SENT": "Verification email has been sent. Please check your inbox.",
@@ -267,8 +267,8 @@
"COPY_SUCCESSFUL": "Code copied to clipboard successfully"
},
"SHOW_MORE_BLOCK": {
- "SHOW_MORE": "Show More",
- "SHOW_LESS": "Show Less"
+ "SHOW_MORE": "მეტი ნახვა",
+ "SHOW_LESS": "ნაკლები ნახვა"
},
"FILE_BUBBLE": {
"DOWNLOAD": "გადმოწერა",
@@ -295,18 +295,18 @@
},
"SIDEBAR": {
"NO_ITEMS": "No items",
- "CURRENTLY_VIEWING_ACCOUNT": "Currently viewing:",
- "SWITCH": "Switch",
+ "CURRENTLY_VIEWING_ACCOUNT": "ამჟამად ნახვა:",
+ "SWITCH": "გადართვა",
"INBOX_VIEW": "Inbox View",
"CONVERSATIONS": "საუბრები",
"INBOX": "My Inbox",
- "ALL_CONVERSATIONS": "All Conversations",
- "MENTIONED_CONVERSATIONS": "Mentions",
+ "ALL_CONVERSATIONS": "ყველა საუბარი",
+ "MENTIONED_CONVERSATIONS": "შეხსენებები",
"PARTICIPATING_CONVERSATIONS": "Participating",
"UNATTENDED_CONVERSATIONS": "Unattended",
"REPORTS": "ანგარიშები",
"SETTINGS": "პარამეტრები",
- "CONTACTS": "Contacts",
+ "CONTACTS": "კონტაქტები",
"ACTIVE": "Active",
"COMPANIES": "Companies",
"ALL_COMPANIES": "All Companies",
@@ -324,46 +324,46 @@
"AGENT_BOTS": "Bots",
"AUDIT_LOGS": "Audit Logs",
"INBOXES": "ინბოქსები",
- "NOTIFICATIONS": "Notifications",
+ "NOTIFICATIONS": "შეტყობინებები",
"CANNED_RESPONSES": "შენახული პასუხები",
"INTEGRATIONS": "ინტეგრაციები",
- "PROFILE_SETTINGS": "Profile Settings",
+ "PROFILE_SETTINGS": "პროფილის პარამეტრები",
"ACCOUNT_SETTINGS": "ანგარიშის პარამეტრები",
- "APPLICATIONS": "Applications",
+ "APPLICATIONS": "აპლიკაციები",
"LABELS": "ჭდეები",
- "CUSTOM_ATTRIBUTES": "Custom Attributes",
- "AUTOMATION": "Automation",
+ "CUSTOM_ATTRIBUTES": "მორგებული ატრიბუტები",
+ "AUTOMATION": "ავტომატიზაცია",
"MACROS": "Macros",
- "TEAMS": "Teams",
- "BILLING": "Billing",
- "CUSTOM_VIEWS_FOLDER": "Folders",
- "CUSTOM_VIEWS_SEGMENTS": "Segments",
- "ALL_CONTACTS": "All Contacts",
- "TAGGED_WITH": "Tagged with",
- "NEW_LABEL": "New label",
- "NEW_TEAM": "New team",
- "NEW_INBOX": "New inbox",
- "REPORTS_CONVERSATION": "Conversations",
+ "TEAMS": "გუნდები",
+ "BILLING": "გადახდები",
+ "CUSTOM_VIEWS_FOLDER": "ფოლდერები",
+ "CUSTOM_VIEWS_SEGMENTS": "სეგმენტები",
+ "ALL_CONTACTS": "ყველა კონტაქტი",
+ "TAGGED_WITH": "ნიშნულია შემდეგით",
+ "NEW_LABEL": "ახალი ლეიბლი",
+ "NEW_TEAM": "ახალი გუნდი",
+ "NEW_INBOX": "ახალი ინბოქსი",
+ "REPORTS_CONVERSATION": "საუბრები",
"CSAT": "CSAT",
"LIVE_CHAT": "Live Chat",
"SMS": "SMS",
"WHATSAPP": "WhatsApp",
- "CAMPAIGNS": "Campaigns",
- "ONGOING": "Ongoing",
- "ONE_OFF": "One off",
+ "CAMPAIGNS": "კამპანიები",
+ "ONGOING": "მიმდინარე",
+ "ONE_OFF": "ერთჯერადი",
"REPORTS_SLA": "SLA",
"REPORTS_BOT": "Bot",
- "REPORTS_AGENT": "Agents",
- "REPORTS_LABEL": "Labels",
- "REPORTS_INBOX": "Inbox",
- "REPORTS_TEAM": "Team",
+ "REPORTS_AGENT": "მომხმარებლები",
+ "REPORTS_LABEL": "ლეიბლები",
+ "REPORTS_INBOX": "ინბოქსი",
+ "REPORTS_TEAM": "გუნდია",
"AGENT_ASSIGNMENT": "აგენტების მინიჭება",
- "SET_AVAILABILITY_TITLE": "Set yourself as",
+ "SET_AVAILABILITY_TITLE": "დააყენეთ თავი როგორც",
"SET_YOUR_AVAILABILITY": "Set your availability",
"SLA": "SLA",
"CUSTOM_ROLES": "Custom Roles",
- "BETA": "Beta",
- "REPORTS_OVERVIEW": "Overview",
+ "BETA": "ბეტა",
+ "REPORTS_OVERVIEW": "მიმოხილვა",
"REAUTHORIZE": "Your inbox connection has expired, please reconnect\n to continue receiving and sending messages",
"HELP_CENTER": {
"TITLE": "Help Center",
@@ -610,7 +610,7 @@
}
},
"CREATE_ACCOUNT": {
- "NO_ACCOUNT_WARNING": "Uh oh! We could not find any Chatwoot accounts. Please create a new account to continue.",
+ "NO_ACCOUNT_WARNING": "უი! ვერ ვიპოვეთ არცერთი Chatwoot ანგარიში. გთხოვთ, შექმნათ ახალი ანგარიში გაგრძელებისთვის.",
"NEW_ACCOUNT": "ახალი ანგარიში",
"SELECTOR_SUBTITLE": "ახალი ანგარიშის შექმნა",
"API": {
@@ -621,29 +621,29 @@
"FORM": {
"NAME": {
"LABEL": "Company Name",
- "PLACEHOLDER": "Wayne Enterprises"
+ "PLACEHOLDER": "უეინის საწარმოები"
},
- "SUBMIT": "Submit",
+ "SUBMIT": "გაგზავნა",
"CANCEL": "Cancel"
}
},
"KEYBOARD_SHORTCUTS": {
"TOGGLE_MODAL": "View all shortcuts",
"TITLE": {
- "OPEN_CONVERSATION": "Open conversation",
- "RESOLVE_AND_NEXT": "Resolve and move to next",
- "NAVIGATE_DROPDOWN": "Navigate dropdown items",
- "RESOLVE_CONVERSATION": "Resolve Conversation",
- "GO_TO_CONVERSATION_DASHBOARD": "Go to Conversation Dashboard",
- "ADD_ATTACHMENT": "Add Attachment",
- "GO_TO_CONTACTS_DASHBOARD": "Go to Contacts Dashboard",
- "TOGGLE_SIDEBAR": "Toggle Sidebar",
- "GO_TO_REPORTS_SIDEBAR": "Go to Reports sidebar",
- "MOVE_TO_NEXT_TAB": "Move to next tab in conversation list",
- "GO_TO_SETTINGS": "Go to Settings",
- "SWITCH_TO_PRIVATE_NOTE": "Switch to Private Note",
- "SWITCH_TO_REPLY": "Switch to Reply",
- "TOGGLE_SNOOZE_DROPDOWN": "Toggle snooze dropdown"
+ "OPEN_CONVERSATION": "გაახილეთ საუბარი",
+ "RESOLVE_AND_NEXT": "გადაჭრა და გადასვლა შემდეგზე",
+ "NAVIGATE_DROPDOWN": "გადაიარეთ ჩამოსაშლელი ელემენტები",
+ "RESOLVE_CONVERSATION": "შეასრულეთ საუბრის დასრულება",
+ "GO_TO_CONVERSATION_DASHBOARD": "გადადი საუბრის დაფაზე",
+ "ADD_ATTACHMENT": "დამატება დანართი",
+ "GO_TO_CONTACTS_DASHBOARD": "გადადი კონტაქტების დაფაზე",
+ "TOGGLE_SIDEBAR": "გვერდითი პანელის გადართვა",
+ "GO_TO_REPORTS_SIDEBAR": "გადადი ანგარიშების გვერდით პანელზე",
+ "MOVE_TO_NEXT_TAB": "გადადი შემდეგ ჩანართზე საუბრის სიაში",
+ "GO_TO_SETTINGS": "გადადი პარამეტრებზე",
+ "SWITCH_TO_PRIVATE_NOTE": "გადართე პირად ჩანაწერზე",
+ "SWITCH_TO_REPLY": "პასუხზე გადართვა",
+ "TOGGLE_SNOOZE_DROPDOWN": "დროებით შეჩერების ჩამოსაშლელი მენიუს გადართვა"
}
},
"ASSIGNMENT_POLICY": {
diff --git a/app/javascript/dashboard/i18n/locale/ko/helpCenter.json b/app/javascript/dashboard/i18n/locale/ko/helpCenter.json
index 53d9e7358..1b8f16775 100644
--- a/app/javascript/dashboard/i18n/locale/ko/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/ko/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "포털에서 로케일이 성공적으로 제거되었습니다",
"ERROR_MESSAGE": "포털에서 로케일을 제거할 수 없습니다. 다시 시도하십시오."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count}개 게시물 | {count}개 게시물",
"CATEGORIES_COUNT": "{count}개 카테고리 | {count}개 카테고리",
"DEFAULT": "기본값",
+ "DRAFT": "임시 저장",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "기본값으로 설정",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "삭제"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "로케일 선택..."
},
+ "STATUS": {
+ "LABEL": "상태",
+ "OPTIONS": {
+ "LIVE": "게시됨",
+ "DRAFT": "임시 저장"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "로케일이 성공적으로 추가되었습니다",
"ERROR_MESSAGE": "로케일을 추가할 수 없습니다. 다시 시도하십시오."
diff --git a/app/javascript/dashboard/i18n/locale/ko/integrations.json b/app/javascript/dashboard/i18n/locale/ko/integrations.json
index 3fb90fa39..a7b91f18a 100644
--- a/app/javascript/dashboard/i18n/locale/ko/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ko/integrations.json
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "문서",
"ADD_NEW": "새 문서 만들기",
+ "SELECTED": "{count}개 선택됨",
+ "SELECT_ALL": "전체 선택 ({count})",
+ "UNSELECT_ALL": "전체 선택 해제 ({count})",
+ "BULK_DELETE_BUTTON": "삭제",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "예, 모두 삭제합니다",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "관련 FAQ",
"DESCRIPTION": "이 FAQ는 문서에서 직접 생성되었습니다."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "도구",
"ADD_NEW": "새 도구 만들기",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "사용 가능한 사용자 정의 도구가 없습니다",
"SUBTITLE": "사용자 정의 도구를 만들어 어시스턴트를 외부 API 및 서비스와 연결하고, 데이터를 가져오거나 사용자를 대신하여 작업을 수행할 수 있도록 하십시오.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "사용자 정의 도구가 성공적으로 삭제되었습니다",
"ERROR_MESSAGE": "사용자 정의 도구를 삭제하지 못했습니다"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "도구 이름",
"PLACEHOLDER": "주문 조회",
- "ERROR": "도구 이름은 필수입니다"
+ "ERROR": "도구 이름은 필수입니다",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "설명",
diff --git a/app/javascript/dashboard/i18n/locale/lt/conversation.json b/app/javascript/dashboard/i18n/locale/lt/conversation.json
index 96ff486bf..b63cca7cc 100644
--- a/app/javascript/dashboard/i18n/locale/lt/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/lt/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Pranešimo parašas nesukonfigūruotas, sukonfigūruokite jį profilio nustatymuose.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "Duokite copiloto papildomų nurodymų arba klauskite dar ko nors... Paspauskite Enter, kad išsiųstumėte papildomą žinutę",
"CLICK_HERE": "Spausti čia kad atnaujinti",
"WHATSAPP_TEMPLATES": "Whatsapp Šablonai"
},
@@ -214,7 +214,7 @@
"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ą",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot galvoja",
"EMAIL_HEAD": {
"TO": "Kam",
"ADD_BCC": "Pridėti bcc",
diff --git a/app/javascript/dashboard/i18n/locale/lt/helpCenter.json b/app/javascript/dashboard/i18n/locale/lt/helpCenter.json
index e418a2cd9..8ddb2dc62 100644
--- a/app/javascript/dashboard/i18n/locale/lt/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/lt/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Lokalizacija sėkmingai pašalinta iš portalo",
"ERROR_MESSAGE": "Nepavyko pašalinti lokalizacijos iš portalo. Bandykite dar kartą."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Pagal nutylėjimą",
+ "DRAFT": "Ruošinys",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Ištrinti"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Select locale..."
},
+ "STATUS": {
+ "LABEL": "Būsena",
+ "OPTIONS": {
+ "LIVE": "Paskelbta",
+ "DRAFT": "Ruošinys"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Lokalizacija sėkmingai pridėta",
"ERROR_MESSAGE": "Nepavyko pridėti lokalizacijos. Bandykite dar kartą."
diff --git a/app/javascript/dashboard/i18n/locale/lt/integrations.json b/app/javascript/dashboard/i18n/locale/lt/integrations.json
index fe3d927be..0fc5f490f 100644
--- a/app/javascript/dashboard/i18n/locale/lt/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/lt/integrations.json
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Captain",
- "HEADER_KNOW_MORE": "Know more",
+ "HEADER_KNOW_MORE": "Sužinoti daugiau",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "ASSISTANTS": "Asistentai",
+ "SWITCH_ASSISTANT": "Perjungti asistentus",
+ "NEW_ASSISTANT": "Sukurti asistentą",
+ "EMPTY_LIST": "Asistentų nerasta, sukurkite vieną, kad pradėtumėte"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "PANEL_TITLE": "Pradėkite naudotis Copilot",
+ "KICK_OFF_MESSAGE": "Reikia greitos santraukos, norite peržiūrėti ankstesnius pokalbius arba parengti geresnį atsakymą? Copilot padės pagreitinti procesą.",
"SEND_MESSAGE": "Išsiųsti pranešimą...",
- "EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
- "LOADER": "Captain is thinking",
+ "EMPTY_MESSAGE": "Įvyko klaida generuojant atsakymą. Bandykite dar kartą.",
+ "LOADER": "Captain galvoja",
"YOU": "Jūs",
- "USE": "Use this",
- "RESET": "Reset",
- "SHOW_STEPS": "Show steps",
- "SELECT_ASSISTANT": "Select Assistant",
+ "USE": "Naudoti šį",
+ "RESET": "Atstatyti",
+ "SHOW_STEPS": "Rodyti žingsnius",
+ "SELECT_ASSISTANT": "Pasirinkti asistentą",
"PROMPTS": {
"SUMMARIZE": {
- "LABEL": "Summarize this conversation",
- "CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
+ "LABEL": "Apibendrinti šį pokalbį",
+ "CONTENT": "Apibendrinkite pagrindines temas, aptartas tarp kliento ir palaikymo agento, įskaitant kliento rūpesčius, klausimus ir pateiktus sprendimus ar atsakymus."
},
"SUGGEST": {
- "LABEL": "Suggest an answer",
- "CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
+ "LABEL": "Pasiūlyti atsakymą",
+ "CONTENT": "Analizuokite kliento užklausą ir parengkite atsakymą, kuris veiksmingai sprendžia jų rūpesčius ar klausimus. Įsitikinkite, kad atsakymas yra aiškus, glaustas ir pateikia naudingą informaciją."
},
"RATE": {
- "LABEL": "Rate this conversation",
- "CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
+ "LABEL": "Įvertinkite šį pokalbį",
+ "CONTENT": "Peržiūrėkite pokalbį ir įvertinkite, kaip gerai jis atitinka kliento poreikius. Pasidalinkite įvertinimu iš 5, atsižvelgdami į toną, aiškumą ir efektyvumą."
},
"HIGH_PRIORITY": {
- "LABEL": "High priority conversations",
- "CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
+ "LABEL": "Aukšto prioriteto pokalbiai",
+ "CONTENT": "Pateikite man santrauką apie visas aukšto prioriteto atviras pokalbių temas. Įtraukite pokalbio ID, kliento vardą (jei yra), paskutinio pranešimo turinį ir priskirtą agentą. Jei aktualu, grupuokite pagal būseną."
},
"LIST_CONTACTS": {
- "LABEL": "List contacts",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "LABEL": "Rodyti kontaktus",
+ "CONTENT": "Rodykite top 10 kontaktų sąrašą. Įtraukite vardą, el. paštą arba telefono numerį (jei yra), paskutinio matymo laiką, žymas (jei yra)."
}
}
},
"PLAYGROUND": {
"USER": "Jūs",
- "ASSISTANT": "Assistant",
+ "ASSISTANT": "Asistentas",
"MESSAGE_PLACEHOLDER": "Parašykite pranešimą...",
- "HEADER": "Playground",
- "DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
- "CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
+ "HEADER": "Žaidimų aikštelė",
+ "DESCRIPTION": "Naudokite šią aikštelę, kad siųstumėte pranešimus savo asistentui ir patikrintumėte, ar jis atsako tiksliai, greitai ir tokiu tonu, kokio tikitės.",
+ "CREDIT_NOTE": "Pranešimai, išsiųsti čia, bus įskaityti į jūsų Captain kreditus."
},
"PAYWALL": {
- "TITLE": "Upgrade to use Captain AI",
- "AVAILABLE_ON": "Captain is not available on the free plan.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "TITLE": "Atnaujinkite, kad naudotumėte Captain AI",
+ "AVAILABLE_ON": "Captain nėra prieinamas nemokamame plane.",
+ "UPGRADE_PROMPT": "Atnaujinkite savo planą, kad gautumėte prieigą prie mūsų asistentų, copiloto ir kitų funkcijų.",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "AVAILABLE_ON": "Captain AI yra prieinamas tik Enterprise planuose.",
+ "UPGRADE_PROMPT": "Atnaujinkite savo planą, kad gautumėte prieigą prie mūsų asistentų, copiloto ir kitų funkcijų.",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"BANNER": {
- "RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
- "DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
+ "RESPONSES": "Naudojote daugiau nei 80 % savo atsakymų limito. Norėdami toliau naudotis Captain AI, prašome atnaujinti planą.",
+ "DOCUMENTS": "Pasiektas dokumentų limitas. Atnaujinkite, kad toliau naudotumėte Captain AI."
},
"FORM": {
"CANCEL": "Atšaukti",
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
+ "SELECTED": "{count} selected",
+ "SELECT_ALL": "Select all ({count})",
+ "UNSELECT_ALL": "Unselect all ({count})",
+ "BULK_DELETE_BUTTON": "Ištrinti",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Yes, delete all",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Aprašymas",
diff --git a/app/javascript/dashboard/i18n/locale/lv/conversation.json b/app/javascript/dashboard/i18n/locale/lv/conversation.json
index c59a0e7a7..ebc96dc7e 100644
--- a/app/javascript/dashboard/i18n/locale/lv/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/lv/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Ziņojuma paraksts nav nokonfigurēts. Lūdzu, nokonfigurējiet to profila iestatījumos.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "Dodiet copilota papildu ierosinājumus vai uzdodiet jebko citu... Nospiediet Enter, lai nosūtītu turpinājumu",
"CLICK_HERE": "Noklikšķiniet šeit, lai atjauninātu",
"WHATSAPP_TEMPLATES": "WhatsApp Veidnes"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Velciet un nometiet šeit, lai pievienotu",
"START_AUDIO_RECORDING": "Sākt audio ierakstīšanu",
"STOP_AUDIO_RECORDING": "Apturēt audio ierakstīšanu",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot domā",
"EMAIL_HEAD": {
"TO": "KAM",
"ADD_BCC": "Pievienot bcc",
diff --git a/app/javascript/dashboard/i18n/locale/lv/helpCenter.json b/app/javascript/dashboard/i18n/locale/lv/helpCenter.json
index e13b42c50..1c61d5cb5 100644
--- a/app/javascript/dashboard/i18n/locale/lv/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/lv/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Lokalizācija veiksmīgi noņemta no portāla",
"ERROR_MESSAGE": "Nevar noņemt lokalizāciju no portāla. Mēģiniet vēlreiz."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} raksts | {count} raksti",
"CATEGORIES_COUNT": "{count} kategorija | {count} kategorijas",
"DEFAULT": "Noklusējums",
+ "DRAFT": "Melnraksts",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Padarīt par noklusēto",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Dzēst"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Izvēlieties lokalizāciju..."
},
+ "STATUS": {
+ "LABEL": "Statuss",
+ "OPTIONS": {
+ "LIVE": "Publicēts",
+ "DRAFT": "Melnraksts"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Lokalizācija ir veiksmīgi pievienota",
"ERROR_MESSAGE": "Nevar pievienot lokalizāciju. Mēģiniet vēlreiz."
diff --git a/app/javascript/dashboard/i18n/locale/lv/integrations.json b/app/javascript/dashboard/i18n/locale/lv/integrations.json
index ef6c7b36b..589ce259b 100644
--- a/app/javascript/dashboard/i18n/locale/lv/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/lv/integrations.json
@@ -390,46 +390,46 @@
},
"CAPTAIN": {
"NAME": "Kapteinis",
- "HEADER_KNOW_MORE": "Know more",
+ "HEADER_KNOW_MORE": "Uzzināt vairāk",
"ASSISTANT_SWITCHER": {
"ASSISTANTS": "Asistenti",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "SWITCH_ASSISTANT": "Pārslēgties starp palīgiem",
+ "NEW_ASSISTANT": "Izveidot palīgu",
+ "EMPTY_LIST": "Palīgu nav atrasts, lūdzu, izveidojiet kādu, lai sāktu darbu"
},
"COPILOT": {
"TITLE": "Kopilots",
"TRY_THESE_PROMPTS": "Pamēģiniet",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "PANEL_TITLE": "Sāciet darbu ar Copilot",
+ "KICK_OFF_MESSAGE": "Vai nepieciešams ātrs kopsavilkums, pārbaudīt iepriekšējās sarunas vai sagatavot labāku atbildi? Copilot ir šeit, lai paātrinātu lietas.",
"SEND_MESSAGE": "Sūtīt ziņojumu...",
- "EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
+ "EMPTY_MESSAGE": "Radās kļūda, ģenerējot atbildi. Lūdzu, mēģiniet vēlreiz.",
"LOADER": "Kapteinis domā",
"YOU": "Jūs",
"USE": "Izmantot šo",
"RESET": "Atiestatīt",
- "SHOW_STEPS": "Show steps",
+ "SHOW_STEPS": "Rādīt soļus",
"SELECT_ASSISTANT": "Izvēlēties Asistentu",
"PROMPTS": {
"SUMMARIZE": {
- "LABEL": "Summarize this conversation",
- "CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
+ "LABEL": "Apkopot šo sarunu",
+ "CONTENT": "Apkopojiet galvenos punktus, kas apspriesti starp klientu un atbalsta aģentu, tostarp klienta bažas, jautājumus un risinājumus vai atbildes, ko sniedzis atbalsta aģents"
},
"SUGGEST": {
- "LABEL": "Suggest an answer",
- "CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
+ "LABEL": "Ieteikt atbildi",
+ "CONTENT": "Analizējiet klienta pieprasījumu un sagatavojiet atbildi, kas efektīvi risina viņu bažas vai jautājumus. Pārliecinieties, ka atbilde ir skaidra, kodolīga un sniedz noderīgu informāciju."
},
"RATE": {
- "LABEL": "Rate this conversation",
- "CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
+ "LABEL": "Novērtēt šo sarunu",
+ "CONTENT": "Pārskatiet sarunu, lai redzētu, cik labi tā atbilst klienta vajadzībām. Sniedziet vērtējumu no 5, balstoties uz toni, skaidrību un efektivitāti."
},
"HIGH_PRIORITY": {
- "LABEL": "High priority conversations",
- "CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
+ "LABEL": "Augstas prioritātes sarunas",
+ "CONTENT": "Dodiet man kopsavilkumu par visām augstas prioritātes atvērtajām sarunām. Iekļaujiet sarunas ID, klienta vārdu (ja pieejams), pēdējā ziņojuma saturu un piešķirto aģentu. Ja nepieciešams, grupējiet pēc statusa."
},
"LIST_CONTACTS": {
- "LABEL": "List contacts",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "LABEL": "Kontaktpersonu saraksts",
+ "CONTENT": "Parādiet man top 10 kontaktu sarakstu. Iekļaujiet vārdu, e-pastu vai tālruņa numuru (ja pieejams), pēdējās redzamības laiku, tagus (ja kādi ir)."
}
}
},
@@ -437,9 +437,9 @@
"USER": "Jūs",
"ASSISTANT": "Asistents",
"MESSAGE_PLACEHOLDER": "Rakstiet savu ziņojumu...",
- "HEADER": "Playground",
- "DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
- "CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
+ "HEADER": "Izmēģinājuma laukums",
+ "DESCRIPTION": "Izmantojiet šo izmēģinājuma laukumu, lai sūtītu ziņojumus savam palīgam un pārbaudītu, vai tas atbild precīzi, ātri un ar gaidīto toni.",
+ "CREDIT_NOTE": "Šeit nosūtītie ziņojumi tiks ieskaitīti jūsu Captain kredītos."
},
"PAYWALL": {
"TITLE": "Modernizējiet abonementu, lai izmantotu Captain AI",
@@ -449,7 +449,7 @@
"CANCEL_ANYTIME": "Jūs varat jebkurā laikā mainīt vai atcelt savu versiju"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
+ "AVAILABLE_ON": "Captain AI ir pieejams tikai Enterprise plānos.",
"UPGRADE_PROMPT": "Modernizējiet savu abonementu, lai iegūtu piekļuvi viruālajiem asistentiem un copilot.",
"ASK_ADMIN": "Lai pārietu uz maksas versiju, lūdzu sazinieties ar savu administratoru."
},
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Dokumenti",
"ADD_NEW": "Izveidot jaunu dokumentu",
+ "SELECTED": "Atlasīti {count}",
+ "SELECT_ALL": "Select all ({count})",
+ "UNSELECT_ALL": "Unselect all ({count})",
+ "BULK_DELETE_BUTTON": "Dzēst",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Jā, dzēst visu",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Saistītie bieži uzdotie jautājumi",
"DESCRIPTION": "Šie bieži uzdotie jautājumi tiek ģenerēti tieši no dokumenta."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Apraksts",
diff --git a/app/javascript/dashboard/i18n/locale/ml/conversation.json b/app/javascript/dashboard/i18n/locale/ml/conversation.json
index 4508078aa..4d89ce40b 100644
--- a/app/javascript/dashboard/i18n/locale/ml/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ml/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Message signature is not configured, please configure it in profile settings.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "കോപ്പൈലറ്റിന് അധിക പ്രോംപ്റ്റുകൾ നൽകുക, അല്ലെങ്കിൽ എന്തെങ്കിലും ചോദിക്കാം... ഫോളോ-അപ്പ് അയയ്ക്കാൻ എൻറർ അമർത്തുക",
"CLICK_HERE": "Click here to update",
"WHATSAPP_TEMPLATES": "Whatsapp Templates"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Drag and drop here to attach",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "കോപ്പൈലറ്റ് ചിന്തിക്കുന്നു",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Add bcc",
diff --git a/app/javascript/dashboard/i18n/locale/ml/helpCenter.json b/app/javascript/dashboard/i18n/locale/ml/helpCenter.json
index 686b60185..09732a975 100644
--- a/app/javascript/dashboard/i18n/locale/ml/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/ml/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Locale removed from portal successfully",
"ERROR_MESSAGE": "Unable to remove locale from portal. Try again."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Default",
+ "DRAFT": "Draft",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "ഇല്ലാതാക്കുക"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Select locale..."
},
+ "STATUS": {
+ "LABEL": "സ്റ്റാറ്റസ്",
+ "OPTIONS": {
+ "LIVE": "Published",
+ "DRAFT": "Draft"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Locale added successfully",
"ERROR_MESSAGE": "Unable to add locale. Try again."
diff --git a/app/javascript/dashboard/i18n/locale/ml/integrations.json b/app/javascript/dashboard/i18n/locale/ml/integrations.json
index 47e6e01c9..eb4af99db 100644
--- a/app/javascript/dashboard/i18n/locale/ml/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ml/integrations.json
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "ഡോക്യുമെന്റുകൾ",
"ADD_NEW": "ഒരു പുതിയ ഡോക്യുമെന്റ് സൃഷ്ടിക്കുക",
+ "SELECTED": "{count} തിരഞ്ഞെടുക്കപ്പെട്ടത്",
+ "SELECT_ALL": "എല്ലാം തിരഞ്ഞെടുക്കുക ({count})",
+ "UNSELECT_ALL": "എല്ലാം തിരഞ്ഞെടുക്കൽ ഒഴിവാക്കുക ({count})",
+ "BULK_DELETE_BUTTON": "ഇല്ലാതാക്കുക",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "അതെ, എല്ലാം ഇല്ലാതാക്കുക",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "ബന്ധപ്പെട്ട സാധാരണ ചോദിക്കപ്പെടുന്ന ചോദ്യങ്ങൾ",
"DESCRIPTION": "ഈ സാധാരണ ചോദിക്കപ്പെടുന്ന ചോദ്യങ്ങൾ രേഖയിൽ നിന്നു നേരിട്ട് സൃഷ്ടിച്ചവയാണ്."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "ഉപകരണങ്ങൾ",
"ADD_NEW": "പുതിയ ഉപകരണം സൃഷ്ടിക്കുക",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "ഇവിടെ ഇഷ്ടാനുസൃത ഉപകരണങ്ങൾ ലഭ്യമല്ല",
"SUBTITLE": "നിങ്ങളുടെ അസിസ്റ്റന്റിനെ ബാഹ്യ API-കളുമായി സേവനങ്ങളുമായി ബന്ധിപ്പിക്കാൻ ഇഷ്ടാനുസൃത ഉപകരണങ്ങൾ സൃഷ്ടിക്കുക, അതിലൂടെ അത് നിങ്ങളുടെ പക്കൽ നിന്ന് ഡാറ്റ എടുക്കുകയും പ്രവർത്തനങ്ങൾ നടത്തുകയും ചെയ്യാൻ കഴിയും.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "കസ്റ്റം ടൂൾ വിജയകരമായി ഇല്ലാതാക്കി",
"ERROR_MESSAGE": "കസ്റ്റം ടൂൾ ഇല്ലാതാക്കാൻ പരാജയപ്പെട്ടു"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "ഉപകരണത്തിന്റെ പേര്",
"PLACEHOLDER": "ഓർഡർ ലുക്കപ്പ്",
- "ERROR": "ടൂൾ നാമം ആവശ്യമാണ്"
+ "ERROR": "ടൂൾ നാമം ആവശ്യമാണ്",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "വിവരണം",
diff --git a/app/javascript/dashboard/i18n/locale/ml/settings.json b/app/javascript/dashboard/i18n/locale/ml/settings.json
index 3a383c3f2..40b0cb605 100644
--- a/app/javascript/dashboard/i18n/locale/ml/settings.json
+++ b/app/javascript/dashboard/i18n/locale/ml/settings.json
@@ -129,7 +129,7 @@
"CONDITIONS": {
"TITLE": "അലർട്ട് നിബന്ധനകൾ:",
"CONDITION_ONE": "ബ്രൗസർ വിൻഡോ സജീവമല്ലെങ്കിൽ മാത്രമേ ഓഡിയോ അലർട്ടുകൾ അയയ്ക്കൂ",
- "CONDITION_TWO": "എല്ലാ നിയോഗിച്ച സംഭാഷണങ്ങളും വായിച്ചെടുക്കുന്നത് വരെ 30s마다 അലർട്ടുകൾ അയയ്ക്കുക"
+ "CONDITION_TWO": "എല്ലാ നിയോഗിച്ച സംഭാഷണങ്ങളും വായിച്ചെടുക്കുന്നത് വരെ ഓരോ 30 സെക്കന്റിലും അലർട്ടുകൾ അയയ്ക്കുക"
},
"SOUND_PERMISSION_ERROR": "നിങ്ങളുടെ ബ്രൗസറിൽ ഓട്ടോപ്ലേ അപ്രാപ്തമാണ്. അലർട്ടുകൾ സ്വയം കേൾക്കാൻ, നിങ്ങളുടെ ബ്രൗസർ ക്രമീകരണങ്ങളിൽ ശബ്ദാനുമതി സജീവമാക്കുക അല്ലെങ്കിൽ പേജുമായി ഇടപെടുക.",
"READ_MORE": "കൂടുതൽ വായിക്കുക"
@@ -313,7 +313,7 @@
"CAPTAIN": "ക്യാപ്റ്റൻ",
"CAPTAIN_ASSISTANTS": "അസിസ്റ്റന്റുകൾ",
"CAPTAIN_DOCUMENTS": "ഡോക്യുമെന്റുകൾ",
- "CAPTAIN_RESPONSES": "അक्सर ചോദിക്കുന്ന ചോദ്യങ്ങൾ",
+ "CAPTAIN_RESPONSES": "അടിക്കുറിപ്പുകൾ",
"CAPTAIN_TOOLS": "ഉപകരണങ്ങൾ",
"CAPTAIN_SCENARIOS": "സന്നിവേശങ്ങൾ",
"CAPTAIN_PLAYGROUND": "പ്ലേഗ്രൗണ്ട്",
@@ -405,7 +405,7 @@
},
"COPILOT": {
"TITLE": "കോ-പൈലറ്റ്",
- "DESCRIPTION": "സംഭാഷണങ്ങൾക്കിടയിൽ യഥാർത്ഥ സമയ സാന്ദർഭിക നിർദ്ദേശങ്ങൾ, നോളജ് ബേസ് ശുപാർശകൾ, പ്രോആക്റ്റീവ്洞察ങ്ങൾ എന്നിവ നൽകുന്നു."
+ "DESCRIPTION": "സംഭാഷണങ്ങളുടെ സമയത്ത് യാഥാർത്ഥ്യപരമായ സാന്ദർഭിക നിർദ്ദേശങ്ങൾ, അറിവ് അടിസ്ഥാന ശുപാർശകൾ, പ്രോആക്റ്റീവ് ഉൾക്കാഴ്ചകൾ നൽകുന്നു."
}
},
"FEATURES": {
@@ -666,7 +666,7 @@
"DESCRIPTION": "ഏജന്റുമാർക്ക് ജോലി ഭാരം നിയന്ത്രിക്കുക.",
"FEATURES": [
"ഇൻബോക്സിന് പരമാവധി സംഭാഷണങ്ങൾ നിർവചിക്കുക",
- "ലേബലുകളും സമയവും അടിസ്ഥാനമാക്കി исключения സൃഷ്ടിക്കുക",
+ "ലേബലുകളും സമയവും അടിസ്ഥാനമാക്കി വ്യത്യാസങ്ങൾ സൃഷ്ടിക്കുക",
"ഒരു നയത്തിലേക്ക് ഏജന്റുമാർ ചേർക്കുക - ഓരോ ഏജന്റിനും ഒരു നയം"
]
}
diff --git a/app/javascript/dashboard/i18n/locale/ms/conversation.json b/app/javascript/dashboard/i18n/locale/ms/conversation.json
index b61f9d9d0..b2a2df10a 100644
--- a/app/javascript/dashboard/i18n/locale/ms/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ms/conversation.json
@@ -1,319 +1,319 @@
{
"CONVERSATION": {
- "SELECT_A_CONVERSATION": "Please select a conversation from left pane",
- "CSAT_REPLY_MESSAGE": "Please rate the conversation",
- "404": "Sorry, we cannot find the conversation. Please try again",
- "SWITCH_VIEW_LAYOUT": "Switch the layout",
- "DASHBOARD_APP_TAB_MESSAGES": "Messages",
- "UNVERIFIED_SESSION": "The identity of this user is not verified",
- "NO_MESSAGE_1": "Uh oh! Looks like there are no messages from customers in your inbox.",
- "NO_MESSAGE_2": " to send a message to your page!",
- "NO_INBOX_1": "Hola! Looks like you haven't added any inboxes yet.",
- "NO_INBOX_2": " to get started",
- "NO_INBOX_AGENT": "Uh Oh! Looks like you are not part of any inbox. Please contact your administrator",
- "SEARCH_MESSAGES": "Search for messages in conversations",
- "VIEW_ORIGINAL": "View original",
- "VIEW_TRANSLATED": "View translated",
+ "SELECT_A_CONVERSATION": "Sila pilih perbualan dari panel kiri",
+ "CSAT_REPLY_MESSAGE": "Sila nilai perbualan ini",
+ "404": "Maaf, kami tidak dapat menemui perbualan tersebut. Sila cuba lagi",
+ "SWITCH_VIEW_LAYOUT": "Tukar susun atur",
+ "DASHBOARD_APP_TAB_MESSAGES": "Mesej",
+ "UNVERIFIED_SESSION": "Identiti pengguna ini belum disahkan",
+ "NO_MESSAGE_1": "Uh oh! Nampaknya tiada mesej daripada pelanggan dalam peti masuk anda.",
+ "NO_MESSAGE_2": " untuk menghantar mesej ke halaman anda!",
+ "NO_INBOX_1": "Hola! Nampaknya anda belum menambah sebarang peti masuk lagi.",
+ "NO_INBOX_2": " untuk bermula",
+ "NO_INBOX_AGENT": "Uh Oh! Nampaknya anda bukan sebahagian daripada mana-mana peti masuk. Sila hubungi pentadbir anda",
+ "SEARCH_MESSAGES": "Cari mesej dalam perbualan",
+ "VIEW_ORIGINAL": "Lihat asal",
+ "VIEW_TRANSLATED": "Lihat terjemahan",
"EMPTY_STATE": {
- "CMD_BAR": "to open command menu",
- "KEYBOARD_SHORTCUTS": "to view keyboard shortcuts"
+ "CMD_BAR": "untuk buka menu arahan",
+ "KEYBOARD_SHORTCUTS": "untuk lihat pintasan papan kekunci"
},
"SEARCH": {
- "TITLE": "Search messages",
- "RESULT_TITLE": "Search Results",
- "LOADING_MESSAGE": "Crunching data...",
- "PLACEHOLDER": "Type any text to search messages",
- "NO_MATCHING_RESULTS": "No results found."
+ "TITLE": "Cari mesej",
+ "RESULT_TITLE": "Keputusan Carian",
+ "LOADING_MESSAGE": "Memproses data...",
+ "PLACEHOLDER": "Taip sebarang teks untuk cari mesej",
+ "NO_MATCHING_RESULTS": "Tiada keputusan dijumpai."
},
- "UNREAD_MESSAGES": "Unread Messages",
- "UNREAD_MESSAGE": "Unread Message",
- "CLICK_HERE": "Click here",
- "LOADING_INBOXES": "Loading inboxes",
- "LOADING_CONVERSATIONS": "Loading Conversations",
- "CANNOT_REPLY": "You cannot reply due to",
- "24_HOURS_WINDOW": "24 hour message window restriction",
- "48_HOURS_WINDOW": "48 hour message window restriction",
+ "UNREAD_MESSAGES": "Mesej Belum Dibaca",
+ "UNREAD_MESSAGE": "Mesej Belum Dibaca",
+ "CLICK_HERE": "Klik di sini",
+ "LOADING_INBOXES": "Memuatkan peti masuk",
+ "LOADING_CONVERSATIONS": "Memuatkan Perbualan",
+ "CANNOT_REPLY": "Anda tidak boleh membalas kerana",
+ "24_HOURS_WINDOW": "Sekatan tetingkap mesej 24 jam",
+ "48_HOURS_WINDOW": "Sekatan tetingkap mesej 48 jam",
"API_HOURS_WINDOW": "You can only reply to this conversation within {hours} hours",
- "NOT_ASSIGNED_TO_YOU": "This conversation is not assigned to you. Would you like to assign this conversation to yourself?",
- "ASSIGN_TO_ME": "Assign to me",
- "BOT_HANDOFF_MESSAGE": "You are responding to a conversation which is currently handled by an assistant or a bot.",
- "BOT_HANDOFF_ACTION": "Mark open and assign to you",
- "BOT_HANDOFF_REOPEN_ACTION": "Mark conversation open",
- "BOT_HANDOFF_SUCCESS": "Conversation has been handed over to you",
- "BOT_HANDOFF_ERROR": "Failed to take over the conversation. Please try again.",
- "TWILIO_WHATSAPP_CAN_REPLY": "You can only reply to this conversation using a template message due to",
- "TWILIO_WHATSAPP_24_HOURS_WINDOW": "24 hour message window restriction",
- "OLD_INSTAGRAM_INBOX_REPLY_BANNER": "This Instagram account was migrated to the new Instagram channel inbox. All new messages will show up there. You won’t be able to send messages from this conversation anymore.",
- "REPLYING_TO": "You are replying to:",
- "REMOVE_SELECTION": "Remove Selection",
- "DOWNLOAD": "Download",
- "UNKNOWN_FILE_TYPE": "Unknown File",
- "SAVE_CONTACT": "Save Contact",
- "NO_CONTENT": "No content to display",
+ "NOT_ASSIGNED_TO_YOU": "Perbualan ini tidak ditugaskan kepada anda. Adakah anda ingin menugaskan perbualan ini kepada diri anda?",
+ "ASSIGN_TO_ME": "Tugaskan kepada saya",
+ "BOT_HANDOFF_MESSAGE": "Anda sedang membalas perbualan yang kini dikendalikan oleh pembantu atau bot.",
+ "BOT_HANDOFF_ACTION": "Tandakan terbuka dan tugaskan kepada anda",
+ "BOT_HANDOFF_REOPEN_ACTION": "Tandakan perbualan terbuka",
+ "BOT_HANDOFF_SUCCESS": "Perbualan telah diserahkan kepada anda",
+ "BOT_HANDOFF_ERROR": "Gagal mengambil alih perbualan. Sila cuba lagi.",
+ "TWILIO_WHATSAPP_CAN_REPLY": "Anda hanya boleh membalas perbualan ini menggunakan mesej templat kerana",
+ "TWILIO_WHATSAPP_24_HOURS_WINDOW": "Sekatan tetingkap mesej 24 jam",
+ "OLD_INSTAGRAM_INBOX_REPLY_BANNER": "Akaun Instagram ini telah dipindahkan ke peti masuk saluran Instagram baru. Semua mesej baru akan dipaparkan di sana. Anda tidak akan dapat menghantar mesej dari perbualan ini lagi.",
+ "REPLYING_TO": "Anda sedang membalas kepada:",
+ "REMOVE_SELECTION": "Buang Pilihan",
+ "DOWNLOAD": "Muat Turun",
+ "UNKNOWN_FILE_TYPE": "Fail Tidak Dikenali",
+ "SAVE_CONTACT": "Simpan Kenalan",
+ "NO_CONTENT": "Tiada kandungan untuk dipaparkan",
"SHARED_ATTACHMENT": {
"CONTACT": "{sender} has shared a contact",
"LOCATION": "{sender} has shared a location",
"FILE": "{sender} has shared a file",
"MEETING": "{sender} has started a meeting"
},
- "UPLOADING_ATTACHMENTS": "Uploading attachments...",
- "REPLIED_TO_STORY": "Replied to your story",
+ "UPLOADING_ATTACHMENTS": "Memuat naik lampiran...",
+ "REPLIED_TO_STORY": "Membalas cerita anda",
"UNSUPPORTED_MESSAGE": "This message is unsupported. You can view this message on the Facebook / Instagram app.",
- "UNSUPPORTED_MESSAGE_FACEBOOK": "This message is unsupported. You can view this message on the Facebook Messenger app.",
- "UNSUPPORTED_MESSAGE_INSTAGRAM": "This message is unsupported. You can view this message on the Instagram app.",
- "UNSUPPORTED_MESSAGE_TIKTOK": "This message is unsupported. You can view this message on the TikTok app.",
- "SUCCESS_DELETE_MESSAGE": "Message deleted successfully",
- "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again",
- "NO_RESPONSE": "No response",
- "RESPONSE": "Response",
- "RATING_TITLE": "Rating",
- "FEEDBACK_TITLE": "Feedback",
- "REPLY_MESSAGE_NOT_FOUND": "Message not available",
+ "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.",
+ "SUCCESS_DELETE_MESSAGE": "Mesej berjaya dipadam",
+ "FAIL_DELETE_MESSSAGE": "Tidak dapat memadam mesej! Sila cuba lagi",
+ "NO_RESPONSE": "Tiada respons",
+ "RESPONSE": "Respons",
+ "RATING_TITLE": "Penilaian",
+ "FEEDBACK_TITLE": "Maklum Balas",
+ "REPLY_MESSAGE_NOT_FOUND": "Mesej tidak tersedia",
"CARD": {
- "SHOW_LABELS": "Show labels",
- "HIDE_LABELS": "Hide labels"
+ "SHOW_LABELS": "Tunjukkan label",
+ "HIDE_LABELS": "Sembunyikan label"
},
"VOICE_CALL": {
- "INCOMING_CALL": "Incoming call",
- "OUTGOING_CALL": "Outgoing call",
- "CALL_IN_PROGRESS": "Call in progress",
- "NO_ANSWER": "No answer",
- "MISSED_CALL": "Missed call",
- "CALL_ENDED": "Call ended",
- "NOT_ANSWERED_YET": "Not answered yet",
- "THEY_ANSWERED": "They answered",
- "YOU_ANSWERED": "You answered"
+ "INCOMING_CALL": "Panggilan masuk",
+ "OUTGOING_CALL": "Panggilan keluar",
+ "CALL_IN_PROGRESS": "Panggilan sedang berlangsung",
+ "NO_ANSWER": "Tiada jawapan",
+ "MISSED_CALL": "Panggilan terlepas",
+ "CALL_ENDED": "Panggilan tamat",
+ "NOT_ANSWERED_YET": "Belum dijawab",
+ "THEY_ANSWERED": "Mereka menjawab",
+ "YOU_ANSWERED": "Anda menjawab"
},
"HEADER": {
- "RESOLVE_ACTION": "Resolve",
- "REOPEN_ACTION": "Reopen",
- "OPEN_ACTION": "Open",
- "MORE_ACTIONS": "More actions",
- "OPEN": "More",
- "CLOSE": "Close",
- "DETAILS": "details",
- "SNOOZED_UNTIL": "Snoozed until",
- "SNOOZED_UNTIL_TOMORROW": "Snoozed until tomorrow",
- "SNOOZED_UNTIL_NEXT_WEEK": "Snoozed until next week",
- "SNOOZED_UNTIL_NEXT_REPLY": "Snoozed until next reply",
+ "RESOLVE_ACTION": "Selesaikan",
+ "REOPEN_ACTION": "Buka semula",
+ "OPEN_ACTION": "Buka",
+ "MORE_ACTIONS": "Tindakan lain",
+ "OPEN": "Lagi",
+ "CLOSE": "Tutup",
+ "DETAILS": "butiran",
+ "SNOOZED_UNTIL": "Ditangguhkan sehingga",
+ "SNOOZED_UNTIL_TOMORROW": "Ditangguhkan sehingga esok",
+ "SNOOZED_UNTIL_NEXT_WEEK": "Ditangguhkan sehingga minggu depan",
+ "SNOOZED_UNTIL_NEXT_REPLY": "Ditangguhkan sehingga balasan seterusnya",
"SLA_STATUS": {
"FRT": "FRT {status}",
"NRT": "NRT {status}",
"RT": "RT {status}",
- "MISSED": "missed",
- "DUE": "due"
+ "MISSED": "terlepas",
+ "DUE": "tertunggak"
}
},
"RESOLVE_DROPDOWN": {
- "MARK_PENDING": "Mark as pending",
- "SNOOZE_UNTIL": "Snooze",
+ "MARK_PENDING": "Tandakan sebagai tertunda",
+ "SNOOZE_UNTIL": "Tangguhkan",
"SNOOZE": {
- "TITLE": "Snooze until",
- "NEXT_REPLY": "Next reply",
- "TOMORROW": "Tomorrow",
- "NEXT_WEEK": "Next week"
+ "TITLE": "Tangguhkan sehingga",
+ "NEXT_REPLY": "Balasan seterusnya",
+ "TOMORROW": "Esok",
+ "NEXT_WEEK": "Minggu depan"
}
},
"MENTION": {
"AGENTS": "Ejen",
- "TEAMS": "Teams"
+ "TEAMS": "Pasukan"
},
"CUSTOM_SNOOZE": {
- "TITLE": "Snooze until",
- "APPLY": "Snooze",
+ "TITLE": "Tangguhkan sehingga",
+ "APPLY": "Tangguhkan",
"CANCEL": "Batalkan"
},
"PRIORITY": {
- "TITLE": "Priority",
+ "TITLE": "Keutamaan",
"OPTIONS": {
"NONE": "Tiada",
- "URGENT": "Urgent",
- "HIGH": "High",
- "MEDIUM": "Medium",
- "LOW": "Low"
+ "URGENT": "Segera",
+ "HIGH": "Tinggi",
+ "MEDIUM": "Sederhana",
+ "LOW": "Rendah"
},
"CHANGE_PRIORITY": {
"SELECT_PLACEHOLDER": "Tiada",
- "INPUT_PLACEHOLDER": "Select priority",
+ "INPUT_PLACEHOLDER": "Pilih keutamaan",
"NO_RESULTS": "Tiada dijumpa",
"SUCCESSFUL": "Changed priority of conversation id {conversationId} to {priority}",
- "FAILED": "Couldn't change priority. Please try again."
+ "FAILED": "Gagal menukar keutamaan. Sila cuba lagi."
}
},
"DELETE_CONVERSATION": {
"TITLE": "Delete conversation #{conversationId}",
- "DESCRIPTION": "Are you sure you want to delete this conversation?",
+ "DESCRIPTION": "Adakah anda pasti mahu memadam perbualan ini?",
"CONFIRM": "Padamkan"
},
"CARD_CONTEXT_MENU": {
- "PENDING": "Mark as pending",
- "RESOLVED": "Mark as resolved",
- "MARK_AS_UNREAD": "Mark as unread",
- "MARK_AS_READ": "Mark as read",
- "REOPEN": "Reopen conversation",
+ "PENDING": "Tandakan sebagai tertunda",
+ "RESOLVED": "Tandakan sebagai selesai",
+ "MARK_AS_UNREAD": "Tandakan sebagai belum dibaca",
+ "MARK_AS_READ": "Tandakan sebagai sudah dibaca",
+ "REOPEN": "Buka semula perbualan",
"SNOOZE": {
- "TITLE": "Snooze",
- "NEXT_REPLY": "Until next reply",
- "TOMORROW": "Until tomorrow",
- "NEXT_WEEK": "Until next week"
+ "TITLE": "Tangguhkan",
+ "NEXT_REPLY": "Sehingga balasan seterusnya",
+ "TOMORROW": "Sehingga esok",
+ "NEXT_WEEK": "Sehingga minggu depan"
},
- "ASSIGN_AGENT": "Assign agent",
- "ASSIGN_LABEL": "Assign label",
- "AGENTS_LOADING": "Loading agents...",
- "ASSIGN_TEAM": "Assign team",
- "DELETE": "Delete conversation",
- "OPEN_IN_NEW_TAB": "Open in new tab",
- "COPY_LINK": "Copy conversation link",
- "COPY_LINK_SUCCESS": "Conversation link copied to clipboard",
+ "ASSIGN_AGENT": "Tugaskan ejen",
+ "ASSIGN_LABEL": "Tugaskan label",
+ "AGENTS_LOADING": "Memuatkan ejen...",
+ "ASSIGN_TEAM": "Tugaskan pasukan",
+ "DELETE": "Padam perbualan",
+ "OPEN_IN_NEW_TAB": "Buka dalam tab baru",
+ "COPY_LINK": "Salin pautan perbualan",
+ "COPY_LINK_SUCCESS": "Pautan perbualan disalin ke papan klip",
"API": {
"AGENT_ASSIGNMENT": {
"SUCCESFUL": "Conversation id {conversationId} assigned to \"{agentName}\"",
- "FAILED": "Couldn't assign agent. Please try again."
+ "FAILED": "Gagal menugaskan ejen. Sila cuba lagi."
},
"LABEL_ASSIGNMENT": {
"SUCCESFUL": "Assigned label #{labelName} to conversation id {conversationId}",
- "FAILED": "Couldn't assign label. Please try again."
+ "FAILED": "Gagal menugaskan label. Sila cuba lagi."
},
"LABEL_REMOVAL": {
"SUCCESFUL": "Removed label #{labelName} from conversation id {conversationId}",
- "FAILED": "Couldn't remove label. Please try again."
+ "FAILED": "Gagal mengeluarkan label. Sila cuba lagi."
},
"TEAM_ASSIGNMENT": {
"SUCCESFUL": "Assigned team \"{team}\" to conversation id {conversationId}",
- "FAILED": "Couldn't assign team. Please try again."
+ "FAILED": "Gagal menugaskan pasukan. Sila cuba lagi."
}
}
},
"FOOTER": {
- "MESSAGE_SIGN_TOOLTIP": "Message signature",
- "ENABLE_SIGN_TOOLTIP": "Enable signature",
- "DISABLE_SIGN_TOOLTIP": "Disable signature",
- "MSG_INPUT": "Shift + enter for new line. Start with '/' to select a Canned Response.",
- "PRIVATE_MSG_INPUT": "Shift + enter for new line. This will be visible only to Agents",
- "MESSAGING_RESTRICTED": "You cannot reply to this conversation",
- "MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
- "MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
- "MESSAGE_SIGNATURE_NOT_CONFIGURED": "Message signature is not configured, please configure it in profile settings.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
- "CLICK_HERE": "Click here to update",
- "WHATSAPP_TEMPLATES": "Whatsapp Templates"
+ "MESSAGE_SIGN_TOOLTIP": "Tandatangan mesej",
+ "ENABLE_SIGN_TOOLTIP": "Dayakan tandatangan",
+ "DISABLE_SIGN_TOOLTIP": "Nyahdayakan tandatangan",
+ "MSG_INPUT": "Shift + enter untuk baris baru. Mula dengan '/' untuk memilih Respons Sedia Ada.",
+ "PRIVATE_MSG_INPUT": "Shift + enter untuk baris baru. Ini hanya akan kelihatan kepada Ejen",
+ "MESSAGING_RESTRICTED": "Anda tidak boleh membalas perbualan ini",
+ "MESSAGING_RESTRICTED_WHATSAPP": "Anda hanya boleh membalas menggunakan mesej templat disebabkan had tetingkap mesej 24 jam",
+ "MESSAGING_RESTRICTED_API": "Anda hanya boleh membalas menggunakan mesej templat disebabkan had tetingkap mesej",
+ "MESSAGE_SIGNATURE_NOT_CONFIGURED": "Tandatangan mesej belum dikonfigurasikan, sila konfigurasikan dalam tetapan profil.",
+ "COPILOT_MSG_INPUT": "Berikan arahan tambahan kepada copilot, atau tanya apa-apa lagi... Tekan enter untuk hantar susulan",
+ "CLICK_HERE": "Klik di sini untuk kemas kini",
+ "WHATSAPP_TEMPLATES": "Templat Whatsapp"
},
"REPLYBOX": {
- "REPLY": "Reply",
- "PRIVATE_NOTE": "Private Note",
- "SEND": "Send",
- "CREATE": "Add Note",
- "INSERT_READ_MORE": "Read more",
- "DISMISS_REPLY": "Dismiss reply",
- "REPLYING_TO": "Replying to:",
- "TIP_EMOJI_ICON": "Show emoji selector",
- "TIP_ATTACH_ICON": "Attach files",
- "TIP_AUDIORECORDER_ICON": "Record audio",
- "TIP_AUDIORECORDER_PERMISSION": "Allow access to audio",
- "TIP_AUDIORECORDER_ERROR": "Could not open the audio",
- "DRAG_DROP": "Drag and drop here to attach",
- "START_AUDIO_RECORDING": "Start audio recording",
- "STOP_AUDIO_RECORDING": "Stop audio recording",
- "COPILOT_THINKING": "Copilot is thinking",
+ "REPLY": "Balas",
+ "PRIVATE_NOTE": "Nota Peribadi",
+ "SEND": "Hantar",
+ "CREATE": "Tambah Nota",
+ "INSERT_READ_MORE": "Baca lagi",
+ "DISMISS_REPLY": "Tutup balasan",
+ "REPLYING_TO": "Membalas kepada:",
+ "TIP_EMOJI_ICON": "Tunjukkan pemilih emoji",
+ "TIP_ATTACH_ICON": "Lampirkan fail",
+ "TIP_AUDIORECORDER_ICON": "Rakam audio",
+ "TIP_AUDIORECORDER_PERMISSION": "Benarkan akses ke audio",
+ "TIP_AUDIORECORDER_ERROR": "Tidak dapat membuka audio",
+ "DRAG_DROP": "Seret dan lepaskan di sini untuk melampirkan",
+ "START_AUDIO_RECORDING": "Mula rakaman audio",
+ "STOP_AUDIO_RECORDING": "Hentikan rakaman audio",
+ "COPILOT_THINKING": "Copilot sedang berfikir",
"EMAIL_HEAD": {
"TO": "TO",
- "ADD_BCC": "Add bcc",
+ "ADD_BCC": "Tambah bcc",
"CC": {
"LABEL": "CC",
- "PLACEHOLDER": "Emails separated by commas",
- "ERROR": "Please enter valid email addresses"
+ "PLACEHOLDER": "Emel dipisahkan dengan koma",
+ "ERROR": "Sila masukkan alamat emel yang sah"
},
"BCC": {
"LABEL": "BCC",
- "PLACEHOLDER": "Emails separated by commas",
- "ERROR": "Please enter valid email addresses"
+ "PLACEHOLDER": "Emel dipisahkan dengan koma",
+ "ERROR": "Sila masukkan alamat emel yang sah"
}
},
"UNDEFINED_VARIABLES": {
- "TITLE": "Undefined variables",
+ "TITLE": "Pembolehubah tidak ditakrifkan",
"MESSAGE": "You have {undefinedVariablesCount} undefined variables in your message: {undefinedVariables}. Would you like to send the message anyway?",
"CONFIRM": {
- "YES": "Send",
+ "YES": "Hantar",
"CANCEL": "Batalkan"
}
},
"QUOTED_REPLY": {
- "ENABLE_TOOLTIP": "Include quoted email thread",
- "DISABLE_TOOLTIP": "Don't include quoted email thread",
- "REMOVE_PREVIEW": "Remove quoted email thread",
- "COLLAPSE": "Collapse preview",
- "EXPAND": "Expand preview"
+ "ENABLE_TOOLTIP": "Sertakan benang emel yang dipetik",
+ "DISABLE_TOOLTIP": "Jangan sertakan benang emel yang dipetik",
+ "REMOVE_PREVIEW": "Alih keluar benang emel yang dipetik",
+ "COLLAPSE": "Kuncupkan pratonton",
+ "EXPAND": "Kembangkan pratonton"
}
},
- "VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team",
- "CHANGE_STATUS": "Conversation status changed",
- "CHANGE_STATUS_FAILED": "Conversation status change failed",
- "CHANGE_AGENT": "Conversation Assignee changed",
- "CHANGE_AGENT_FAILED": "Assignee change failed",
- "ASSIGN_LABEL_SUCCESFUL": "Label assigned successfully",
- "ASSIGN_LABEL_FAILED": "Label assignment failed",
- "CHANGE_TEAM": "Conversation team changed",
- "SUCCESS_DELETE_CONVERSATION": "Conversation deleted successfully",
- "FAIL_DELETE_CONVERSATION": "Couldn't delete conversation! Try again",
+ "VISIBLE_TO_AGENTS": "Nota Peribadi: Hanya boleh dilihat oleh anda dan pasukan anda",
+ "CHANGE_STATUS": "Status perbualan telah diubah",
+ "CHANGE_STATUS_FAILED": "Perubahan status perbualan gagal",
+ "CHANGE_AGENT": "Penugas Perbualan telah diubah",
+ "CHANGE_AGENT_FAILED": "Penukaran penugas gagal",
+ "ASSIGN_LABEL_SUCCESFUL": "Label berjaya ditetapkan",
+ "ASSIGN_LABEL_FAILED": "Penetapan label gagal",
+ "CHANGE_TEAM": "Pasukan perbualan telah diubah",
+ "SUCCESS_DELETE_CONVERSATION": "Perbualan berjaya dipadam",
+ "FAIL_DELETE_CONVERSATION": "Tidak dapat memadam perbualan! Sila cuba lagi",
"FILE_SIZE_LIMIT": "File exceeds the {MAXIMUM_SUPPORTED_FILE_UPLOAD_SIZE} MB attachment limit",
"FILE_TYPE_NOT_SUPPORTED": "This {fileName} file type is not supported in this conversation",
- "MESSAGE_ERROR": "Unable to send this message, please try again later",
- "SENT_BY": "Sent by:",
+ "MESSAGE_ERROR": "Tidak dapat menghantar mesej ini, sila cuba lagi kemudian",
+ "SENT_BY": "Dihantar oleh:",
"BOT": "Bot",
- "NATIVE_APP": "Native app",
- "NATIVE_APP_ADVISORY": "This message was sent from the native app. Reply from Chatwoot to maintain the message window.",
- "SEND_FAILED": "Couldn't send message! Try again",
- "TRY_AGAIN": "retry",
+ "NATIVE_APP": "Aplikasi asli",
+ "NATIVE_APP_ADVISORY": "Mesej ini dihantar dari aplikasi asli. Balas dari Chatwoot untuk mengekalkan tetingkap mesej.",
+ "SEND_FAILED": "Tidak dapat menghantar mesej! Sila cuba lagi",
+ "TRY_AGAIN": "cuba lagi",
"ASSIGNMENT": {
- "SELECT_AGENT": "Select Agent",
- "REMOVE": "Remove",
- "ASSIGN": "Assign"
+ "SELECT_AGENT": "Pilih Ejen",
+ "REMOVE": "Alih keluar",
+ "ASSIGN": "Tugaskan"
},
"CONTEXT_MENU": {
- "COPY": "Copy",
- "REPLY_TO": "Reply to this message",
+ "COPY": "Salin",
+ "REPLY_TO": "Balas mesej ini",
"DELETE": "Padamkan",
- "CREATE_A_CANNED_RESPONSE": "Add to canned responses",
- "TRANSLATE": "Translate",
- "COPY_PERMALINK": "Copy link to the message",
- "LINK_COPIED": "Message URL copied to the clipboard",
+ "CREATE_A_CANNED_RESPONSE": "Tambah ke balasan sedia ada",
+ "TRANSLATE": "Terjemah",
+ "COPY_PERMALINK": "Salin pautan ke mesej",
+ "LINK_COPIED": "URL mesej telah disalin ke papan klip",
"DELETE_CONFIRMATION": {
- "TITLE": "Are you sure you want to delete this message?",
- "MESSAGE": "You cannot undo this action",
+ "TITLE": "Adakah anda pasti mahu memadam mesej ini?",
+ "MESSAGE": "Anda tidak boleh membatalkan tindakan ini",
"DELETE": "Padamkan",
"CANCEL": "Batalkan"
}
},
"SIDEBAR": {
- "CONTACT": "Contact",
+ "CONTACT": "Hubungi",
"COPILOT": "Copilot"
},
"VOICE_WIDGET": {
- "INCOMING_CALL": "Incoming call",
- "OUTGOING_CALL": "Outgoing call",
- "CALL_IN_PROGRESS": "Call in progress",
- "NOT_ANSWERED_YET": "Not answered yet",
- "HANDLED_IN_ANOTHER_TAB": "Being handled in another tab",
- "REJECT_CALL": "Reject",
- "JOIN_CALL": "Join call",
- "END_CALL": "End call"
+ "INCOMING_CALL": "Panggilan masuk",
+ "OUTGOING_CALL": "Panggilan keluar",
+ "CALL_IN_PROGRESS": "Panggilan sedang berlangsung",
+ "NOT_ANSWERED_YET": "Belum dijawab",
+ "HANDLED_IN_ANOTHER_TAB": "Sedang diuruskan di tab lain",
+ "REJECT_CALL": "Tolak",
+ "JOIN_CALL": "Sertai panggilan",
+ "END_CALL": "Tamatkan panggilan"
}
},
"EMAIL_TRANSCRIPT": {
- "TITLE": "Send conversation transcript",
- "DESC": "Send a copy of the conversation transcript to the specified email address",
- "SUBMIT": "Submit",
+ "TITLE": "Hantar transkrip perbualan",
+ "DESC": "Hantar salinan transkrip perbualan ke alamat emel yang ditetapkan",
+ "SUBMIT": "Hantar",
"CANCEL": "Batalkan",
- "SEND_EMAIL_SUCCESS": "The chat transcript was sent successfully",
- "SEND_EMAIL_ERROR": "There was an error, please try again",
- "SEND_EMAIL_PAYMENT_REQUIRED": "Email transcript is not available on your current plan. Please upgrade to use this feature.",
+ "SEND_EMAIL_SUCCESS": "Transkrip perbualan berjaya dihantar",
+ "SEND_EMAIL_ERROR": "Terdapat ralat, sila cuba lagi",
+ "SEND_EMAIL_PAYMENT_REQUIRED": "Transkrip emel tidak tersedia pada pelan anda sekarang. Sila naik taraf untuk menggunakan ciri ini.",
"FORM": {
- "SEND_TO_CONTACT": "Send the transcript to the customer",
- "SEND_TO_AGENT": "Send the transcript to the assigned agent",
- "SEND_TO_OTHER_EMAIL_ADDRESS": "Send the transcript to another email address",
+ "SEND_TO_CONTACT": "Hantar transkrip kepada pelanggan",
+ "SEND_TO_AGENT": "Hantar transkrip kepada ejen yang ditugaskan",
+ "SEND_TO_OTHER_EMAIL_ADDRESS": "Hantar transkrip ke alamat emel lain",
"EMAIL": {
- "PLACEHOLDER": "Enter an email address",
- "ERROR": "Please enter a valid email address"
+ "PLACEHOLDER": "Masukkan alamat emel",
+ "ERROR": "Sila masukkan alamat emel yang sah"
}
}
},
@@ -323,120 +323,120 @@
"GREETING_MORNING": "👋 Good morning, {name}. Welcome to {installationName}.",
"GREETING_AFTERNOON": "👋 Good afternoon, {name}. Welcome to {installationName}.",
"GREETING_EVENING": "👋 Good evening, {name}. Welcome to {installationName}.",
- "READ_LATEST_UPDATES": "Read our latest updates",
+ "READ_LATEST_UPDATES": "Baca kemas kini terkini kami",
"ALL_CONVERSATION": {
- "TITLE": "All your conversations in one place",
- "DESCRIPTION": "View all the conversations from your customers in one single dashboard. You can filter the conversations by the incoming channel, label and status.",
- "NEW_LINK": "Click here to create an inbox"
+ "TITLE": "Semua perbualan anda di satu tempat",
+ "DESCRIPTION": "Lihat semua perbualan daripada pelanggan anda dalam satu papan pemuka. Anda boleh menapis perbualan mengikut saluran masuk, label dan status.",
+ "NEW_LINK": "Klik di sini untuk mencipta peti masuk"
},
"TEAM_MEMBERS": {
- "TITLE": "Invite your team members",
- "DESCRIPTION": "Since you are getting ready to talk to your customer, bring in your teammates to assist you. You can invite your teammates by adding their email addresses to the agent list.",
- "NEW_LINK": "Click here to invite a team member"
+ "TITLE": "Jemput ahli pasukan anda",
+ "DESCRIPTION": "Oleh kerana anda sedang bersedia untuk bercakap dengan pelanggan anda, bawa rakan sepasukan anda untuk membantu. Anda boleh menjemput rakan sepasukan dengan menambah alamat emel mereka ke senarai ejen.",
+ "NEW_LINK": "Klik di sini untuk menjemput ahli pasukan"
},
"LABELS": {
- "TITLE": "Organize conversations with labels",
- "DESCRIPTION": "Labels provide an easier way to categorize your conversation. Create some labels like #support-enquiry, #billing-question etc., so that you can use them in a conversation later.",
- "NEW_LINK": "Click here to create tags"
+ "TITLE": "Susun perbualan dengan label",
+ "DESCRIPTION": "Label memudahkan anda mengkategorikan perbualan anda. Cipta beberapa label seperti #support-enquiry, #billing-question dan lain-lain, supaya anda boleh menggunakannya dalam perbualan kemudian.",
+ "NEW_LINK": "Klik di sini untuk mencipta tag"
},
"CANNED_RESPONSES": {
- "TITLE": "Create canned responses",
- "DESCRIPTION": "Pre-written quick reply templates help you quickly respond to a conversation. Agents can type the '/' character followed by the shortcode to insert a response.",
- "NEW_LINK": "Click here to create a canned response"
+ "TITLE": "Cipta respons siap",
+ "DESCRIPTION": "Templat balasan pantas yang telah ditulis membantu anda membalas perbualan dengan cepat. Ejen boleh menaip aksara '/' diikuti dengan kod pendek untuk memasukkan respons.",
+ "NEW_LINK": "Klik di sini untuk mencipta respons siap"
}
},
"CONVERSATION_SIDEBAR": {
- "ASSIGNEE_LABEL": "Assigned Agent",
- "SELF_ASSIGN": "Assign to me",
- "TEAM_LABEL": "Assigned Team",
+ "ASSIGNEE_LABEL": "Ejen Ditugaskan",
+ "SELF_ASSIGN": "Tugaskan kepada saya",
+ "TEAM_LABEL": "Pasukan Ditugaskan",
"SELECT": {
- "PLACEHOLDER": "None"
+ "PLACEHOLDER": "Tiada"
},
"ACCORDION": {
- "CONTACT_DETAILS": "Contact Details",
- "CONVERSATION_ACTIONS": "Conversation Actions",
- "CONVERSATION_LABELS": "Conversation Labels",
- "CONVERSATION_INFO": "Conversation Information",
- "CONTACT_NOTES": "Contact Notes",
- "CONTACT_ATTRIBUTES": "Contact Attributes",
- "PREVIOUS_CONVERSATION": "Previous Conversations",
- "MACROS": "Macros",
- "LINEAR_ISSUES": "Linked Linear Issues",
+ "CONTACT_DETAILS": "Butiran Kenalan",
+ "CONVERSATION_ACTIONS": "Tindakan Perbualan",
+ "CONVERSATION_LABELS": "Label Perbualan",
+ "CONVERSATION_INFO": "Maklumat Perbualan",
+ "CONTACT_NOTES": "Nota Kenalan",
+ "CONTACT_ATTRIBUTES": "Atribut Kenalan",
+ "PREVIOUS_CONVERSATION": "Perbualan Sebelumnya",
+ "MACROS": "Makro",
+ "LINEAR_ISSUES": "Isu Linear Berkaitan",
"SHOPIFY_ORDERS": "Shopify Orders"
},
"SHOPIFY": {
"ORDER_ID": "Order #{id}",
- "ERROR": "Error loading orders",
- "NO_SHOPIFY_ORDERS": "No orders found",
+ "ERROR": "Ralat memuatkan pesanan",
+ "NO_SHOPIFY_ORDERS": "Tiada pesanan ditemui",
"FINANCIAL_STATUS": {
- "PENDING": "Pending",
- "AUTHORIZED": "Authorized",
- "PARTIALLY_PAID": "Partially Paid",
- "PAID": "Paid",
- "PARTIALLY_REFUNDED": "Partially Refunded",
- "REFUNDED": "Refunded",
- "VOIDED": "Voided"
+ "PENDING": "Dalam Proses",
+ "AUTHORIZED": "Dibenarkan",
+ "PARTIALLY_PAID": "Dibayar Sebahagian",
+ "PAID": "Dibayar",
+ "PARTIALLY_REFUNDED": "Dikembalikan Sebahagian",
+ "REFUNDED": "Dikembalikan",
+ "VOIDED": "Dibatalkan"
},
"FULFILLMENT_STATUS": {
- "FULFILLED": "Fulfilled",
- "PARTIALLY_FULFILLED": "Partially Fulfilled",
- "UNFULFILLED": "Unfulfilled"
+ "FULFILLED": "Telah Dipenuhi",
+ "PARTIALLY_FULFILLED": "Sebahagiannya Dipenuhi",
+ "UNFULFILLED": "Belum Dipenuhi"
}
}
},
"CONVERSATION_CUSTOM_ATTRIBUTES": {
- "ADD_BUTTON_TEXT": "Create attribute",
- "NO_RECORDS_FOUND": "No attributes found",
+ "ADD_BUTTON_TEXT": "Cipta atribut",
+ "NO_RECORDS_FOUND": "Tiada atribut ditemui",
"UPDATE": {
- "SUCCESS": "Attribute updated successfully",
- "ERROR": "Unable to update attribute. Please try again later"
+ "SUCCESS": "Atribut berjaya dikemas kini",
+ "ERROR": "Tidak dapat mengemas kini atribut. Sila cuba lagi kemudian"
},
"ADD": {
- "TITLE": "Add",
- "SUCCESS": "Attribute added successfully",
- "ERROR": "Unable to add attribute. Please try again later"
+ "TITLE": "Tambah",
+ "SUCCESS": "Atribut berjaya ditambah",
+ "ERROR": "Tidak dapat menambah atribut. Sila cuba lagi kemudian"
},
"DELETE": {
- "SUCCESS": "Attribute deleted successfully",
- "ERROR": "Unable to delete attribute. Please try again later"
+ "SUCCESS": "Atribut berjaya dipadam",
+ "ERROR": "Tidak dapat memadam atribut. Sila cuba lagi kemudian"
},
"ATTRIBUTE_SELECT": {
- "TITLE": "Add attributes",
- "PLACEHOLDER": "Search attributes",
- "NO_RESULT": "No attributes found"
+ "TITLE": "Tambah atribut",
+ "PLACEHOLDER": "Cari atribut",
+ "NO_RESULT": "Tiada atribut ditemui"
}
},
"EMAIL_HEADER": {
- "FROM": "From",
- "TO": "To",
+ "FROM": "Daripada",
+ "TO": "Kepada",
"BCC": "Bcc",
"CC": "Cc",
- "SUBJECT": "Subject",
- "EXPAND": "Expand email"
+ "SUBJECT": "Subjek",
+ "EXPAND": "Kembangkan emel"
},
"CONVERSATION_PARTICIPANTS": {
- "SIDEBAR_MENU_TITLE": "Participating",
- "SIDEBAR_TITLE": "Conversation participants",
+ "SIDEBAR_MENU_TITLE": "Peserta",
+ "SIDEBAR_TITLE": "Peserta perbualan",
"NO_RECORDS_FOUND": "Tiada dijumpa",
- "ADD_PARTICIPANTS": "Select participants",
+ "ADD_PARTICIPANTS": "Pilih peserta",
"REMANING_PARTICIPANTS_TEXT": "+{count} others",
"REMANING_PARTICIPANT_TEXT": "+{count} other",
"TOTAL_PARTICIPANTS_TEXT": "{count} people are participating.",
"TOTAL_PARTICIPANT_TEXT": "{count} person is participating.",
"NO_PARTICIPANTS_TEXT": "No one is participating!.",
- "WATCH_CONVERSATION": "Join conversation",
- "YOU_ARE_WATCHING": "You are participating",
+ "WATCH_CONVERSATION": "Sertai perbualan",
+ "YOU_ARE_WATCHING": "Anda sedang menyertai",
"API": {
- "ERROR_MESSAGE": "Could not update, try again!",
- "SUCCESS_MESSAGE": "Participants updated!"
+ "ERROR_MESSAGE": "Tidak dapat mengemas kini, sila cuba lagi!",
+ "SUCCESS_MESSAGE": "Peserta dikemas kini!"
}
},
"TRANSLATE_MODAL": {
- "TITLE": "View translated content",
+ "TITLE": "Lihat kandungan yang diterjemah",
"DESC": "You can view the translated content in each langauge.",
- "ORIGINAL_CONTENT": "Original Content",
- "TRANSLATED_CONTENT": "Translated Content",
- "NO_TRANSLATIONS_AVAILABLE": "No translations are available for this content"
+ "ORIGINAL_CONTENT": "Kandungan Asal",
+ "TRANSLATED_CONTENT": "Kandungan Terjemahan",
+ "NO_TRANSLATIONS_AVAILABLE": "Tiada terjemahan tersedia untuk kandungan ini"
},
"TYPING": {
"ONE": "{user} is typing",
@@ -444,9 +444,9 @@
"MULTIPLE": "{user} and {count} others are typing"
},
"COPILOT": {
- "TRY_THESE_PROMPTS": "Try these prompts"
+ "TRY_THESE_PROMPTS": "Cuba arahan ini"
},
"GALLERY_VIEW": {
- "ERROR_DOWNLOADING": "Unable to download attachment. Please try again"
+ "ERROR_DOWNLOADING": "Tidak dapat memuat turun lampiran. Sila cuba lagi"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ms/helpCenter.json b/app/javascript/dashboard/i18n/locale/ms/helpCenter.json
index 745b0c6ad..03672d0d2 100644
--- a/app/javascript/dashboard/i18n/locale/ms/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/ms/helpCenter.json
@@ -1,875 +1,897 @@
{
"HELP_CENTER": {
- "TITLE": "Help Center",
+ "TITLE": "Pusat Bantuan",
"NEW_PAGE": {
- "DESCRIPTION": "Create self-service help center portals for your customers. Help them find answers quickly, without waiting. Streamline inquiries, boost agent efficiency, and elevate customer support.",
- "CREATE_PORTAL_BUTTON": "Create Portal"
+ "DESCRIPTION": "Cipta portal pusat bantuan layan diri untuk pelanggan anda. Bantu mereka mencari jawapan dengan cepat, tanpa perlu menunggu. Permudahkan pertanyaan, tingkatkan kecekapan ejen, dan tingkatkan sokongan pelanggan.",
+ "CREATE_PORTAL_BUTTON": "Cipta Portal"
},
"HEADER": {
"FILTER": "Tapis mengikut",
"SORT": "Susun mengikut",
- "LOCALE": "Locale",
+ "LOCALE": "Lokal",
"SETTINGS_BUTTON": "Tetapan",
"NEW_BUTTON": "Artikel Baru",
"DROPDOWN_OPTIONS": {
- "PUBLISHED": "Published",
- "DRAFT": "Draft",
- "ARCHIVED": "Archived"
+ "PUBLISHED": "Diterbitkan",
+ "DRAFT": "Draf",
+ "ARCHIVED": "Diarkibkan"
},
"TITLES": {
- "ALL_ARTICLES": "All Articles",
- "MINE": "My Articles",
- "DRAFT": "Draft Articles",
- "ARCHIVED": "Archived Articles"
+ "ALL_ARTICLES": "Semua Artikel",
+ "MINE": "Artikel Saya",
+ "DRAFT": "Artikel Draf",
+ "ARCHIVED": "Artikel Arkib"
},
"LOCALE_SELECT": {
- "TITLE": "Select locale",
- "PLACEHOLDER": "Select locale",
- "NO_RESULT": "No locale found",
- "SEARCH_PLACEHOLDER": "Search locale"
+ "TITLE": "Pilih lokal",
+ "PLACEHOLDER": "Pilih lokal",
+ "NO_RESULT": "Tiada lokal ditemui",
+ "SEARCH_PLACEHOLDER": "Cari lokal"
}
},
"EDIT_HEADER": {
- "ALL_ARTICLES": "All Articles",
+ "ALL_ARTICLES": "Semua Artikel",
"PUBLISH_BUTTON": "Terbitkan",
- "MOVE_TO_ARCHIVE_BUTTON": "Move to archived",
+ "MOVE_TO_ARCHIVE_BUTTON": "Pindah ke arkib",
"PREVIEW": "Pratonton",
"ADD_TRANSLATION": "Tambah terjemahan",
"OPEN_SIDEBAR": "Buka bar sisi",
"CLOSE_SIDEBAR": "Tutup bar sisi",
- "SAVING": "Saving...",
- "SAVED": "Saved"
+ "SAVING": "Menyimpan...",
+ "SAVED": "Telah Disimpan"
},
"ARTICLE_EDITOR": {
"IMAGE_UPLOAD": {
- "TITLE": "Upload image",
- "UPLOADING": "Uploading...",
- "SUCCESS": "Image uploaded successfully",
- "ERROR": "Error while uploading image",
- "UN_AUTHORIZED_ERROR": "You are not authorized to upload images",
- "ERROR_FILE_SIZE": "Image size should be less than {size}MB",
- "ERROR_FILE_FORMAT": "Image format should be jpg, jpeg or png",
- "ERROR_FILE_DIMENSIONS": "Image dimensions should be less than 2000 x 2000"
+ "TITLE": "Muat naik imej",
+ "UPLOADING": "Sedang memuat naik...",
+ "SUCCESS": "Imej berjaya dimuat naik",
+ "ERROR": "Ralat semasa memuat naik imej",
+ "UN_AUTHORIZED_ERROR": "Anda tidak dibenarkan memuat naik imej",
+ "ERROR_FILE_SIZE": "Saiz imej harus kurang daripada {size}MB",
+ "ERROR_FILE_FORMAT": "Format imej harus jpg, jpeg atau png",
+ "ERROR_FILE_DIMENSIONS": "Dimensi imej harus kurang daripada 2000 x 2000"
}
},
"ARTICLE_SETTINGS": {
- "TITLE": "Article Settings",
+ "TITLE": "Tetapan Artikel",
"FORM": {
"CATEGORY": {
- "LABEL": "Category",
- "TITLE": "Select category",
- "PLACEHOLDER": "Select category",
- "NO_RESULT": "No category found",
- "SEARCH_PLACEHOLDER": "Search category"
+ "LABEL": "Kategori",
+ "TITLE": "Pilih kategori",
+ "PLACEHOLDER": "Pilih kategori",
+ "NO_RESULT": "Tiada kategori ditemui",
+ "SEARCH_PLACEHOLDER": "Cari kategori"
},
"AUTHOR": {
- "LABEL": "Author",
- "TITLE": "Select author",
- "PLACEHOLDER": "Select author",
- "NO_RESULT": "No authors found",
- "SEARCH_PLACEHOLDER": "Search author"
+ "LABEL": "Pengarang",
+ "TITLE": "Pilih pengarang",
+ "PLACEHOLDER": "Pilih pengarang",
+ "NO_RESULT": "Tiada pengarang ditemui",
+ "SEARCH_PLACEHOLDER": "Cari pengarang"
},
"META_TITLE": {
- "LABEL": "Meta title",
- "PLACEHOLDER": "Add a meta title"
+ "LABEL": "Tajuk meta",
+ "PLACEHOLDER": "Tambah tajuk meta"
},
"META_DESCRIPTION": {
- "LABEL": "Meta description",
- "PLACEHOLDER": "Add your meta description for better SEO results..."
+ "LABEL": "Deskripsi meta",
+ "PLACEHOLDER": "Tambah penerangan meta anda untuk hasil SEO yang lebih baik..."
},
"META_TAGS": {
- "LABEL": "Meta tags",
- "PLACEHOLDER": "Add meta tags separated by comma..."
+ "LABEL": "Tag meta",
+ "PLACEHOLDER": "Tambah tag meta yang dipisahkan dengan koma..."
}
},
"BUTTONS": {
- "ARCHIVE": "Archive article",
- "DELETE": "Delete article"
+ "ARCHIVE": "Arkibkan artikel",
+ "DELETE": "Padam artikel"
}
},
"ARTICLE_SEARCH_RESULT": {
- "UNCATEGORIZED": "Uncategorized",
- "SEARCH_RESULTS": "Search results for {query}",
- "EMPTY_TEXT": "Search for articles to insert into replies.",
- "SEARCH_LOADER": "Searching...",
- "INSERT_ARTICLE": "Insert",
- "NO_RESULT": "No articles found",
- "COPY_LINK": "Copy article link to clipboard",
- "OPEN_LINK": "Open article in new tab",
- "PREVIEW_LINK": "Preview article"
+ "UNCATEGORIZED": "Tidak Dikategorikan",
+ "SEARCH_RESULTS": "Keputusan carian untuk {query}",
+ "EMPTY_TEXT": "Cari artikel untuk dimasukkan ke dalam balasan.",
+ "SEARCH_LOADER": "Sedang mencari...",
+ "INSERT_ARTICLE": "Sisipkan",
+ "NO_RESULT": "Tiada artikel dijumpai",
+ "COPY_LINK": "Salin pautan artikel ke papan klip",
+ "OPEN_LINK": "Buka artikel dalam tab baru",
+ "PREVIEW_LINK": "Pratonton artikel"
},
"PORTAL": {
- "HEADER": "Portals",
- "DEFAULT": "Default",
- "NEW_BUTTON": "New Portal",
+ "HEADER": "Portal",
+ "DEFAULT": "Lalai",
+ "NEW_BUTTON": "Portal Baru",
"ACTIVE_BADGE": "aktif",
- "CHOOSE_LOCALE_LABEL": "Choose a locale",
- "LOADING_MESSAGE": "Loading portals...",
- "ARTICLES_LABEL": "articles",
- "NO_PORTALS_MESSAGE": "There are no available portals",
- "ADD_NEW_LOCALE": "Add a new locale",
+ "CHOOSE_LOCALE_LABEL": "Pilih lokal",
+ "LOADING_MESSAGE": "Memuatkan portal...",
+ "ARTICLES_LABEL": "artikel",
+ "NO_PORTALS_MESSAGE": "Tiada portal yang tersedia",
+ "ADD_NEW_LOCALE": "Tambah lokal baru",
"POPOVER": {
- "TITLE": "Portals",
- "PORTAL_SETTINGS": "Portal settings",
- "SUBTITLE": "You have multiple portals and can have different locales for each portal.",
+ "TITLE": "Portal",
+ "PORTAL_SETTINGS": "Tetapan portal",
+ "SUBTITLE": "Anda mempunyai pelbagai portal dan boleh mempunyai lokal berbeza untuk setiap portal.",
"CANCEL_BUTTON_LABEL": "Batalkan",
- "CHOOSE_LOCALE_BUTTON": "Choose Locale"
+ "CHOOSE_LOCALE_BUTTON": "Pilih Lokasi"
},
"PORTAL_SETTINGS": {
"LIST_ITEM": {
"HEADER": {
- "COUNT_LABEL": "articles",
- "ADD": "Add locale",
- "VISIT": "Visit site",
- "SETTINGS": "Settings",
+ "COUNT_LABEL": "artikel",
+ "ADD": "Tambah lokal",
+ "VISIT": "Lawati laman",
+ "SETTINGS": "Tetapan",
"DELETE": "Padamkan"
},
"PORTAL_CONFIG": {
- "TITLE": "Portal Configurations",
+ "TITLE": "Konfigurasi Portal",
"ITEMS": {
"NAME": "Nama",
- "DOMAIN": "Custom domain",
+ "DOMAIN": "Domain tersuai",
"SLUG": "Slug",
- "TITLE": "Portal title",
- "THEME": "Theme color",
- "SUB_TEXT": "Portal sub text"
+ "TITLE": "Tajuk portal",
+ "THEME": "Warna tema",
+ "SUB_TEXT": "Teks sub portal"
}
},
"AVAILABLE_LOCALES": {
- "TITLE": "Available locales",
+ "TITLE": "Tempat setempat tersedia",
"TABLE": {
- "NAME": "Locale name",
- "CODE": "Locale code",
- "ARTICLE_COUNT": "No. of articles",
- "CATEGORIES": "No. of categories",
- "SWAP": "Swap",
+ "NAME": "Nama tempat setempat",
+ "CODE": "Kod tempat setempat",
+ "ARTICLE_COUNT": "Bilangan artikel",
+ "CATEGORIES": "Bilangan kategori",
+ "SWAP": "Tukar",
"DELETE": "Padamkan",
- "DEFAULT_LOCALE": "Default"
+ "DEFAULT_LOCALE": "Lalai"
}
}
},
"DELETE_PORTAL": {
- "TITLE": "Delete portal",
- "MESSAGE": "Are you sure you want to delete this portal",
- "YES": "Yes, delete portal",
- "NO": "No, keep portal",
+ "TITLE": "Padam portal",
+ "MESSAGE": "Adakah anda pasti mahu memadam portal ini",
+ "YES": "Ya, padam portal",
+ "NO": "Tidak, simpan portal",
"API": {
- "DELETE_SUCCESS": "Portal deleted successfully",
- "DELETE_ERROR": "Error while deleting portal"
+ "DELETE_SUCCESS": "Portal berjaya dipadam",
+ "DELETE_ERROR": "Ralat semasa memadam portal"
}
},
"SEND_CNAME_INSTRUCTIONS": {
"API": {
- "SUCCESS_MESSAGE": "CNAME instructions sent successfully",
- "ERROR_MESSAGE": "Error while sending CNAME instructions"
+ "SUCCESS_MESSAGE": "Arahan CNAME berjaya dihantar",
+ "ERROR_MESSAGE": "Ralat semasa menghantar arahan CNAME"
}
}
},
"EDIT": {
- "HEADER_TEXT": "Edit portal",
+ "HEADER_TEXT": "Sunting portal",
"TABS": {
"BASIC_SETTINGS": {
- "TITLE": "Basic information"
+ "TITLE": "Maklumat asas"
},
"CUSTOMIZATION_SETTINGS": {
- "TITLE": "Portal customization"
+ "TITLE": "Penyesuaian portal"
},
"CATEGORY_SETTINGS": {
- "TITLE": "Categories"
+ "TITLE": "Kategori"
},
"LOCALE_SETTINGS": {
- "TITLE": "Locales"
+ "TITLE": "Lokal"
}
},
"CATEGORIES": {
- "TITLE": "Categories in",
- "NEW_CATEGORY": "New category",
+ "TITLE": "Kategori dalam",
+ "NEW_CATEGORY": "Kategori baru",
"TABLE": {
"NAME": "Nama",
- "DESCRIPTION": "Description",
- "LOCALE": "Locale",
- "ARTICLE_COUNT": "No. of articles",
+ "DESCRIPTION": "Penerangan",
+ "LOCALE": "Lokal",
+ "ARTICLE_COUNT": "Bilangan artikel",
"ACTION_BUTTON": {
- "EDIT": "Edit category",
- "DELETE": "Delete category"
+ "EDIT": "Sunting kategori",
+ "DELETE": "Padam kategori"
},
- "EMPTY_TEXT": "No categories found"
+ "EMPTY_TEXT": "Tiada kategori ditemui"
}
},
"EDIT_BASIC_INFO": {
- "BUTTON_TEXT": "Update basic settings"
+ "BUTTON_TEXT": "Kemas kini tetapan asas"
}
},
"ADD": {
"CREATE_FLOW": {
"BASIC": {
- "TITLE": "Help center information",
- "BODY": "Basic information about portal"
+ "TITLE": "Maklumat pusat bantuan",
+ "BODY": "Maklumat asas tentang portal"
},
"CUSTOMIZATION": {
- "TITLE": "Help center customization",
- "BODY": "Customize portal"
+ "TITLE": "Penyesuaian pusat bantuan",
+ "BODY": "Sesuaikan portal"
},
"FINISH": {
"TITLE": "Voila! 🎉",
- "BODY": "You're all set!"
+ "BODY": "Anda sudah bersedia!"
}
},
"CREATE_FLOW_PAGE": {
- "BACK_BUTTON": "Back",
+ "BACK_BUTTON": "Kembali",
"BASIC_SETTINGS_PAGE": {
- "HEADER": "Create Portal",
- "TITLE": "Help center information",
- "CREATE_BASIC_SETTING_BUTTON": "Create portal basic settings"
+ "HEADER": "Buat Portal",
+ "TITLE": "Maklumat pusat bantuan",
+ "CREATE_BASIC_SETTING_BUTTON": "Buat tetapan asas portal"
},
"CUSTOMIZATION_PAGE": {
- "HEADER": "Portal customisation",
- "TITLE": "Help center customization",
- "UPDATE_PORTAL_BUTTON": "Update portal settings"
+ "HEADER": "Penyesuaian portal",
+ "TITLE": "Penyesuaian pusat bantuan",
+ "UPDATE_PORTAL_BUTTON": "Kemas kini tetapan portal"
},
"FINISH_PAGE": {
- "TITLE": "Voila!🎉 You're all set up!",
- "MESSAGE": "You can now see this created portal on your all portals page.",
- "FINISH": "Go to all portals page"
+ "TITLE": "Voila!🎉 Anda sudah bersedia!",
+ "MESSAGE": "Anda kini boleh melihat portal yang telah dibuat ini di halaman semua portal anda.",
+ "FINISH": "Pergi ke halaman semua portal"
}
},
"LOGO": {
"LABEL": "Logo",
- "UPLOAD_BUTTON": "Upload logo",
- "HELP_TEXT": "This logo will be displayed on the portal header.",
- "IMAGE_UPLOAD_SUCCESS": "Logo uploaded successfully",
- "IMAGE_UPLOAD_ERROR": "Logo deleted successfully",
- "IMAGE_DELETE_ERROR": "Error while deleting logo"
+ "UPLOAD_BUTTON": "Muat naik logo",
+ "HELP_TEXT": "Logo ini akan dipaparkan pada tajuk portal.",
+ "IMAGE_UPLOAD_SUCCESS": "Logo berjaya dimuat naik",
+ "IMAGE_UPLOAD_ERROR": "Logo berjaya dipadam",
+ "IMAGE_DELETE_ERROR": "Ralat semasa memadam logo"
},
"NAME": {
"LABEL": "Nama",
- "PLACEHOLDER": "Portal name",
- "HELP_TEXT": "The name will be used in the public facing portal internally.",
- "ERROR": "Name is required"
+ "PLACEHOLDER": "Nama portal",
+ "HELP_TEXT": "Nama ini akan digunakan dalam portal yang dihadapi oleh umum secara dalaman.",
+ "ERROR": "Nama diperlukan"
},
"SLUG": {
"LABEL": "Slug",
- "PLACEHOLDER": "Portal slug for urls",
- "ERROR": "Slug is required"
+ "PLACEHOLDER": "Slug portal untuk url",
+ "ERROR": "Slug diperlukan"
},
"DOMAIN": {
- "LABEL": "Custom Domain",
- "PLACEHOLDER": "Portal custom domain",
- "HELP_TEXT": "Add only If you want to use a custom domain for your portals. Eg: {exampleURL}",
- "ERROR": "Enter a valid domain URL"
+ "LABEL": "Domain Tersuai",
+ "PLACEHOLDER": "Domain tersuai portal",
+ "HELP_TEXT": "Tambah hanya jika anda ingin menggunakan domain tersuai untuk portal anda. Contoh: {exampleURL}",
+ "ERROR": "Masukkan URL domain yang sah"
},
"HOME_PAGE_LINK": {
- "LABEL": "Home Page Link",
- "PLACEHOLDER": "Portal home page link",
- "HELP_TEXT": "The link used to return from the portal to the home page. Eg: {exampleURL}",
- "ERROR": "Enter a valid home page URL"
+ "LABEL": "Pautan Halaman Utama",
+ "PLACEHOLDER": "Pautan halaman utama portal",
+ "HELP_TEXT": "Pautan yang digunakan untuk kembali dari portal ke halaman utama. Contoh: {exampleURL}",
+ "ERROR": "Masukkan URL halaman utama yang sah"
},
"THEME_COLOR": {
- "LABEL": "Portal theme color",
- "HELP_TEXT": "This color will show as the theme color for the portal."
+ "LABEL": "Warna tema portal",
+ "HELP_TEXT": "Warna ini akan dipaparkan sebagai warna tema untuk portal."
},
"PAGE_TITLE": {
- "LABEL": "Page Title",
- "PLACEHOLDER": "Portal page title",
- "HELP_TEXT": "The page title will be used in the public facing portal.",
- "ERROR": "Page title is required"
+ "LABEL": "Tajuk Halaman",
+ "PLACEHOLDER": "Tajuk halaman portal",
+ "HELP_TEXT": "Tajuk halaman akan digunakan dalam portal yang dihadapi oleh orang awam.",
+ "ERROR": "Tajuk halaman diperlukan"
},
"HEADER_TEXT": {
- "LABEL": "Header Text",
- "PLACEHOLDER": "Portal header text",
- "HELP_TEXT": "The Portal header text will be used in the public facing portal.",
- "ERROR": "Portal header text is required"
+ "LABEL": "Teks Tajuk",
+ "PLACEHOLDER": "Teks tajuk portal",
+ "HELP_TEXT": "Teks tajuk Portal akan digunakan dalam portal yang dihadapi oleh orang awam.",
+ "ERROR": "Teks tajuk portal diperlukan"
},
"API": {
- "SUCCESS_MESSAGE_FOR_BASIC": "Portal created successfully.",
- "ERROR_MESSAGE_FOR_BASIC": "Couldn't create the portal. Try again.",
- "SUCCESS_MESSAGE_FOR_UPDATE": "Portal updated successfully.",
- "ERROR_MESSAGE_FOR_UPDATE": "Couldn't update the portal. Try again."
+ "SUCCESS_MESSAGE_FOR_BASIC": "Portal berjaya dibuat.",
+ "ERROR_MESSAGE_FOR_BASIC": "Tidak dapat membuat portal. Sila cuba lagi.",
+ "SUCCESS_MESSAGE_FOR_UPDATE": "Portal berjaya dikemas kini.",
+ "ERROR_MESSAGE_FOR_UPDATE": "Tidak dapat mengemas kini portal. Sila cuba lagi."
}
},
"ADD_LOCALE": {
- "TITLE": "Add a new locale",
- "SUB_TITLE": "This adds a new locale to your available translation list.",
+ "TITLE": "Tambah lokal baru",
+ "SUB_TITLE": "Ini menambah locale baru ke dalam senarai terjemahan yang tersedia.",
"PORTAL": "Portal",
"LOCALE": {
- "LABEL": "Locale",
- "PLACEHOLDER": "Choose a locale",
- "ERROR": "Locale is required"
+ "LABEL": "Lokal",
+ "PLACEHOLDER": "Pilih locale",
+ "ERROR": "Locale diperlukan"
},
"BUTTONS": {
- "CREATE": "Create locale",
+ "CREATE": "Cipta lokal",
"CANCEL": "Batalkan"
},
"API": {
- "SUCCESS_MESSAGE": "Locale added successfully",
- "ERROR_MESSAGE": "Unable to add locale. Try again."
+ "SUCCESS_MESSAGE": "Lokal berjaya ditambah",
+ "ERROR_MESSAGE": "Tidak dapat menambah lokal. Sila cuba lagi."
}
},
"CHANGE_DEFAULT_LOCALE": {
"API": {
- "SUCCESS_MESSAGE": "Default locale updated successfully",
- "ERROR_MESSAGE": "Unable to update default locale. Try again."
+ "SUCCESS_MESSAGE": "Lokal lalai berjaya dikemas kini",
+ "ERROR_MESSAGE": "Tidak dapat mengemas kini lokal lalai. Sila cuba lagi."
}
},
"DELETE_LOCALE": {
"API": {
- "SUCCESS_MESSAGE": "Locale removed from portal successfully",
- "ERROR_MESSAGE": "Unable to remove locale from portal. Try again."
+ "SUCCESS_MESSAGE": "Lokal berjaya dikeluarkan dari portal",
+ "ERROR_MESSAGE": "Tidak dapat mengeluarkan lokal dari portal. Sila cuba lagi."
+ }
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
}
}
},
"TABLE": {
- "LOADING_MESSAGE": "Loading articles...",
- "404": "No articles matches your search 🔍",
- "NO_ARTICLES": "There are no available articles",
+ "LOADING_MESSAGE": "Memuatkan artikel...",
+ "404": "Tiada artikel yang sepadan dengan carian anda 🔍",
+ "NO_ARTICLES": "Tiada artikel yang tersedia",
"HEADERS": {
- "TITLE": "Title",
- "CATEGORY": "Category",
- "READ_COUNT": "Views",
+ "TITLE": "Tajuk",
+ "CATEGORY": "Kategori",
+ "READ_COUNT": "Tontonan",
"STATUS": "Status",
- "LAST_EDITED": "Last edited"
+ "LAST_EDITED": "Terakhir disunting"
},
"COLUMNS": {
- "BY": "by",
- "AUTHOR_NOT_AVAILABLE": "Author is not available"
+ "BY": "oleh",
+ "AUTHOR_NOT_AVAILABLE": "Pengarang tidak tersedia"
}
},
"EDIT_ARTICLE": {
- "LOADING": "Loading article...",
- "TITLE_PLACEHOLDER": "Article title goes here",
- "CONTENT_PLACEHOLDER": "Write your article here",
+ "LOADING": "Memuatkan artikel...",
+ "TITLE_PLACEHOLDER": "Tajuk artikel di sini",
+ "CONTENT_PLACEHOLDER": "Tulis artikel anda di sini",
"API": {
- "ERROR": "Error while saving article"
+ "ERROR": "Ralat semasa menyimpan artikel"
}
},
"PUBLISH_ARTICLE": {
"API": {
- "ERROR": "Error while publishing article",
- "SUCCESS": "Article published successfully"
+ "ERROR": "Ralat semasa menerbitkan artikel",
+ "SUCCESS": "Artikel berjaya diterbitkan"
}
},
"ARCHIVE_ARTICLE": {
"API": {
- "ERROR": "Error while archiving article",
- "SUCCESS": "Article archived successfully"
+ "ERROR": "Ralat semasa mengarkibkan artikel",
+ "SUCCESS": "Artikel berjaya diarkibkan"
}
},
"DRAFT_ARTICLE": {
"API": {
- "ERROR": "Error while drafting article",
- "SUCCESS": "Article drafted successfully"
+ "ERROR": "Ralat semasa merangka artikel",
+ "SUCCESS": "Artikel berjaya dirangka"
}
},
"DELETE_ARTICLE": {
"MODAL": {
"CONFIRM": {
"TITLE": "Pasti Padamkan",
- "MESSAGE": "Are you sure to delete the article?",
- "YES": "Yes, Delete",
- "NO": "No, Keep it"
+ "MESSAGE": "Adakah anda pasti mahu memadam artikel ini?",
+ "YES": "Ya, Padam",
+ "NO": "Tidak, Simpan"
}
},
"API": {
- "SUCCESS_MESSAGE": "Article deleted successfully",
- "ERROR_MESSAGE": "Error while deleting article"
+ "SUCCESS_MESSAGE": "Artikel berjaya dipadam",
+ "ERROR_MESSAGE": "Ralat semasa memadam artikel"
}
},
"REORDER_ARTICLE": {
"API": {
- "ERROR_MESSAGE": "Unable to reorder articles. Please try again."
+ "ERROR_MESSAGE": "Tidak dapat menyusun semula artikel. Sila cuba lagi."
}
},
"REORDER_CATEGORY": {
"API": {
- "ERROR_MESSAGE": "Unable to reorder categories. Please try again."
+ "ERROR_MESSAGE": "Tidak dapat menyusun semula kategori. Sila cuba lagi."
}
},
"CREATE_ARTICLE": {
- "ERROR_MESSAGE": "Please add the article heading and content then only you can update the settings"
+ "ERROR_MESSAGE": "Sila tambah tajuk dan kandungan artikel sebelum anda boleh mengemas kini tetapan"
},
"SIDEBAR": {
"SEARCH": {
- "PLACEHOLDER": "Search for articles"
+ "PLACEHOLDER": "Cari artikel"
}
},
"CATEGORY": {
"ADD": {
- "TITLE": "Create a category",
- "SUB_TITLE": "The category will be used in the public facing portal to categorize articles.",
+ "TITLE": "Buat kategori",
+ "SUB_TITLE": "Kategori ini akan digunakan dalam portal yang dihadapi umum untuk mengkategorikan artikel.",
"PORTAL": "Portal",
- "LOCALE": "Locale",
+ "LOCALE": "Lokal",
"NAME": {
"LABEL": "Nama",
- "PLACEHOLDER": "Category name",
- "HELP_TEXT": "The category name and icon will be used in the public facing portal to categorize articles.",
- "ERROR": "Name is required"
+ "PLACEHOLDER": "Nama kategori",
+ "HELP_TEXT": "Nama kategori dan ikon akan digunakan dalam portal yang dihadapi umum untuk mengkategorikan artikel.",
+ "ERROR": "Nama diperlukan"
},
"SLUG": {
"LABEL": "Slug",
- "PLACEHOLDER": "Category slug for urls",
+ "PLACEHOLDER": "Slug kategori untuk url",
"HELP_TEXT": "app.chatwoot.com/hc/my-portal/en-US/categories/my-slug",
- "ERROR": "Slug is required"
+ "ERROR": "Slug diperlukan"
},
"DESCRIPTION": {
- "LABEL": "Description",
- "PLACEHOLDER": "Give a short description about the category.",
- "ERROR": "Description is required"
+ "LABEL": "Penerangan",
+ "PLACEHOLDER": "Berikan penerangan ringkas tentang kategori.",
+ "ERROR": "Penerangan diperlukan"
},
"BUTTONS": {
- "CREATE": "Create category",
+ "CREATE": "Cipta kategori",
"CANCEL": "Batalkan"
},
"API": {
- "SUCCESS_MESSAGE": "Category created successfully",
- "ERROR_MESSAGE": "Unable to create category"
+ "SUCCESS_MESSAGE": "Kategori berjaya dibuat",
+ "ERROR_MESSAGE": "Tidak dapat membuat kategori"
}
},
"EDIT": {
- "TITLE": "Edit a category",
- "SUB_TITLE": "Editing a category will update the category in the public facing portal.",
+ "TITLE": "Sunting kategori",
+ "SUB_TITLE": "Menyunting kategori akan mengemas kini kategori dalam portal yang dihadapi umum.",
"PORTAL": "Portal",
- "LOCALE": "Locale",
+ "LOCALE": "Lokal",
"NAME": {
"LABEL": "Nama",
- "PLACEHOLDER": "Category name",
- "HELP_TEXT": "The category name and icon will be used in the public facing portal to categorize articles.",
- "ERROR": "Name is required"
+ "PLACEHOLDER": "Nama kategori",
+ "HELP_TEXT": "Nama kategori dan ikon akan digunakan dalam portal awam untuk mengkategorikan artikel.",
+ "ERROR": "Nama diperlukan"
},
"SLUG": {
"LABEL": "Slug",
- "PLACEHOLDER": "Category slug for urls",
+ "PLACEHOLDER": "Slug kategori untuk url",
"HELP_TEXT": "app.chatwoot.com/hc/my-portal/en-US/categories/my-slug",
- "ERROR": "Slug is required"
+ "ERROR": "Slug diperlukan"
},
"DESCRIPTION": {
- "LABEL": "Description",
- "PLACEHOLDER": "Give a short description about the category.",
- "ERROR": "Description is required"
+ "LABEL": "Penerangan",
+ "PLACEHOLDER": "Berikan penerangan ringkas tentang kategori tersebut.",
+ "ERROR": "Penerangan diperlukan"
},
"BUTTONS": {
- "CREATE": "Update category",
+ "CREATE": "Kemas kini kategori",
"CANCEL": "Batalkan"
},
"API": {
- "SUCCESS_MESSAGE": "Category updated successfully",
- "ERROR_MESSAGE": "Unable to update category"
+ "SUCCESS_MESSAGE": "Kategori berjaya dikemas kini",
+ "ERROR_MESSAGE": "Tidak dapat mengemas kini kategori"
}
},
"DELETE": {
"API": {
- "SUCCESS_MESSAGE": "Category deleted successfully",
- "ERROR_MESSAGE": "Unable to delete category"
+ "SUCCESS_MESSAGE": "Kategori berjaya dipadam",
+ "ERROR_MESSAGE": "Tidak dapat memadam kategori"
}
}
},
"ARTICLE_SEARCH": {
- "TITLE": "Search articles",
- "PLACEHOLDER": "Search articles",
- "NO_RESULT": "No articles found",
- "SEARCHING": "Searching...",
- "SEARCH_BUTTON": "Search",
- "INSERT_ARTICLE": "Insert link",
- "IFRAME_ERROR": "URL is empty or invalid. Unable to display content.",
- "OPEN_ARTICLE_SEARCH": "Insert article from Help Center",
- "SUCCESS_ARTICLE_INSERTED": "Article inserted successfully",
- "PREVIEW_LINK": "Preview article",
- "CANCEL": "Close",
- "BACK": "Back",
- "BACK_RESULTS": "Back to results"
+ "TITLE": "Cari artikel",
+ "PLACEHOLDER": "Cari artikel",
+ "NO_RESULT": "Tiada artikel dijumpai",
+ "SEARCHING": "Sedang mencari...",
+ "SEARCH_BUTTON": "Cari",
+ "INSERT_ARTICLE": "Masukkan pautan",
+ "IFRAME_ERROR": "URL kosong atau tidak sah. Tidak dapat memaparkan kandungan.",
+ "OPEN_ARTICLE_SEARCH": "Masukkan artikel dari Pusat Bantuan",
+ "SUCCESS_ARTICLE_INSERTED": "Artikel berjaya dimasukkan",
+ "PREVIEW_LINK": "Pratonton artikel",
+ "CANCEL": "Tutup",
+ "BACK": "Kembali",
+ "BACK_RESULTS": "Kembali ke keputusan"
},
"UPGRADE_PAGE": {
- "TITLE": "Help Center",
- "DESCRIPTION": "Create user-friendly self-service portals. Help your users to access the articles and get support 24/7. Upgrade your subscription to enable this feature.",
- "SELF_HOSTED_DESCRIPTION": "Create user-friendly self-service portals. Help your users to access the articles and get support 24/7. Please contact your administrator to enable this feature.",
+ "TITLE": "Pusat Bantuan",
+ "DESCRIPTION": "Cipta portal layan diri mesra pengguna. Bantu pengguna anda mengakses artikel dan mendapatkan sokongan 24/7. Tingkatkan langganan anda untuk mengaktifkan ciri ini.",
+ "SELF_HOSTED_DESCRIPTION": "Cipta portal layan diri mesra pengguna. Bantu pengguna anda mengakses artikel dan mendapatkan sokongan 24/7. Sila hubungi pentadbir anda untuk mengaktifkan ciri ini.",
"BUTTON": {
- "LEARN_MORE": "Learn more",
- "UPGRADE": "Upgrade"
+ "LEARN_MORE": "Ketahui lebih lanjut",
+ "UPGRADE": "Tingkatkan"
},
"FEATURES": {
"PORTALS": {
- "TITLE": "Multiple portals",
- "DESCRIPTION": "Create multiple help center portals for different products using the same account."
+ "TITLE": "Pelbagai portal",
+ "DESCRIPTION": "Cipta pelbagai portal pusat bantuan untuk produk yang berbeza menggunakan akaun yang sama."
},
"LOCALES": {
- "TITLE": "Full support for locales",
- "DESCRIPTION": "Localize the portal in your language. We support all locales and allow translations for every article."
+ "TITLE": "Sokongan penuh untuk lokal",
+ "DESCRIPTION": "Lokalkan portal dalam bahasa anda. Kami menyokong semua lokal dan membenarkan terjemahan untuk setiap artikel."
},
"SEO": {
- "TITLE": "SEO-friendly design",
- "DESCRIPTION": "Customize your meta tags to improve your visibility on search engines with our SEO-friendly pages."
+ "TITLE": "Reka bentuk mesra SEO",
+ "DESCRIPTION": "Sesuaikan tag meta anda untuk meningkatkan keterlihatan anda di enjin carian dengan halaman mesra SEO kami."
},
"API": {
- "TITLE": "Full API support",
- "DESCRIPTION": "Use the portal as a headless CMS with third party front-end frameworks using our APIs."
+ "TITLE": "Sokongan API penuh",
+ "DESCRIPTION": "Gunakan portal sebagai CMS tanpa kepala dengan rangka kerja front-end pihak ketiga menggunakan API kami."
}
}
},
- "LOADING": "Loading...",
+ "LOADING": "Memuatkan...",
"ARTICLES_PAGE": {
"ARTICLE_CARD": {
"CARD": {
- "VIEWS": "{count} view | {count} views",
+ "VIEWS": "{count} tontonan | {count} tontonan",
"DROPDOWN_MENU": {
- "PUBLISH": "Publish",
- "DRAFT": "Draft",
- "ARCHIVE": "Archive",
+ "PUBLISH": "Terbitkan",
+ "DRAFT": "Draf",
+ "ARCHIVE": "Arkib",
"DELETE": "Padamkan"
},
"STATUS": {
- "DRAFT": "Draft",
- "PUBLISHED": "Published",
- "ARCHIVED": "Archived"
+ "DRAFT": "Draf",
+ "PUBLISHED": "Diterbitkan",
+ "ARCHIVED": "Diarkibkan"
},
"CATEGORY": {
- "UNCATEGORISED": "Uncategorised"
+ "UNCATEGORISED": "Tidak Dikategorikan"
}
}
},
"ARTICLES_HEADER": {
"TABS": {
- "ALL": "All articles",
- "MINE": "Mine",
- "DRAFT": "Draft",
- "PUBLISHED": "Published",
- "ARCHIVED": "Archived"
+ "ALL": "Semua artikel",
+ "MINE": "Milik saya",
+ "DRAFT": "Draf",
+ "PUBLISHED": "Diterbitkan",
+ "ARCHIVED": "Diarkibkan"
},
"CATEGORY": {
- "ALL": "All categories"
+ "ALL": "Semua kategori"
},
"LOCALE": {
- "ALL": "All locales"
+ "ALL": "Semua lokasi"
},
- "NEW_ARTICLE": "New article"
+ "NEW_ARTICLE": "Artikel baru"
},
"EMPTY_STATE": {
"ALL": {
- "TITLE": "Write an article",
- "SUBTITLE": "Write a rich article, let’s get started!",
- "BUTTON_LABEL": "New article"
+ "TITLE": "Tulis artikel",
+ "SUBTITLE": "Tulis artikel yang kaya, mari kita mulakan!",
+ "BUTTON_LABEL": "Artikel baru"
},
"MINE": {
- "TITLE": "You haven't written any articles here",
- "SUBTITLE": "All articles written by you show up here for quick access."
+ "TITLE": "Anda belum menulis sebarang artikel di sini",
+ "SUBTITLE": "Semua artikel yang anda tulis akan dipaparkan di sini untuk akses cepat."
},
"DRAFT": {
- "TITLE": "There are no articles in drafts",
- "SUBTITLE": "Draft articles will appear here"
+ "TITLE": "Tiada artikel dalam draf",
+ "SUBTITLE": "Artikel draf akan muncul di sini"
},
"PUBLISHED": {
- "TITLE": "There are no published articles",
- "SUBTITLE": "Published articles will appear here"
+ "TITLE": "Tiada artikel yang diterbitkan",
+ "SUBTITLE": "Artikel yang diterbitkan akan muncul di sini"
},
"ARCHIVED": {
- "TITLE": "There are no articles in the archive",
- "SUBTITLE": "Archived articles don't show up on the portal, you can use it to mark deprecated or outdated pages"
+ "TITLE": "Tiada artikel dalam arkib",
+ "SUBTITLE": "Artikel yang diarkibkan tidak dipaparkan di portal, anda boleh menggunakannya untuk menandakan halaman yang usang atau tidak lagi digunakan"
},
"CATEGORY": {
- "TITLE": "There are no articles in this category",
- "SUBTITLE": "Articles in this category will appear here"
+ "TITLE": "Tiada artikel dalam kategori ini",
+ "SUBTITLE": "Artikel dalam kategori ini akan dipaparkan di sini"
}
}
},
"CATEGORY_PAGE": {
"CATEGORY_HEADER": {
- "NEW_CATEGORY": "New category",
- "EDIT_CATEGORY": "Edit category",
- "CATEGORIES_COUNT": "{n} category | {n} categories",
+ "NEW_CATEGORY": "Kategori baru",
+ "EDIT_CATEGORY": "Sunting kategori",
+ "CATEGORIES_COUNT": "{n} kategori | {n} kategori",
"BREADCRUMB": {
- "CATEGORY_LOCALE": "Categories ({localeCode})",
- "ACTIVE_CATEGORY": "{categoryName} ({categoryCount} articles) | {categoryName} ({categoryCount} article)"
+ "CATEGORY_LOCALE": "Kategori ({localeCode})",
+ "ACTIVE_CATEGORY": "{categoryName} ({categoryCount} artikel) | {categoryName} ({categoryCount} artikel)"
}
},
"CATEGORY_EMPTY_STATE": {
- "TITLE": "No categories found",
- "SUBTITLE": "Categories will appear here. You can add a category by clicking the 'New Category' button."
+ "TITLE": "Tiada kategori ditemui",
+ "SUBTITLE": "Kategori akan dipaparkan di sini. Anda boleh menambah kategori dengan mengklik butang 'Kategori Baru'."
},
"CATEGORY_CARD": {
- "ARTICLES_COUNT": "{count} article | {count} articles"
+ "ARTICLES_COUNT": "{count} artikel | {count} artikel"
},
"CATEGORY_DIALOG": {
"CREATE": {
"API": {
- "SUCCESS_MESSAGE": "Category created successfully",
- "ERROR_MESSAGE": "Unable to create category"
+ "SUCCESS_MESSAGE": "Kategori berjaya dibuat",
+ "ERROR_MESSAGE": "Tidak dapat membuat kategori"
}
},
"EDIT": {
"API": {
- "SUCCESS_MESSAGE": "Category updated successfully",
- "ERROR_MESSAGE": "Unable to update category"
+ "SUCCESS_MESSAGE": "Kategori berjaya dikemas kini",
+ "ERROR_MESSAGE": "Tidak dapat mengemas kini kategori"
}
},
"DELETE": {
"API": {
- "SUCCESS_MESSAGE": "Category deleted successfully",
- "ERROR_MESSAGE": "Unable to delete category"
+ "SUCCESS_MESSAGE": "Kategori berjaya dipadam",
+ "ERROR_MESSAGE": "Tidak dapat memadam kategori"
}
},
"HEADER": {
- "CREATE": "Create category",
- "EDIT": "Edit category",
- "DESCRIPTION": "Editing a category will update the category in the public facing portal.",
+ "CREATE": "Buat kategori",
+ "EDIT": "Sunting kategori",
+ "DESCRIPTION": "Menyunting kategori akan mengemas kini kategori di portal yang dihadapi umum.",
"PORTAL": "Portal",
- "LOCALE": "Locale"
+ "LOCALE": "Lokal"
},
"FORM": {
"NAME": {
"LABEL": "Nama",
- "PLACEHOLDER": "Category name",
+ "PLACEHOLDER": "Nama kategori",
"ERROR": "Nama diperlukan"
},
"SLUG": {
"LABEL": "Slug",
- "PLACEHOLDER": "Category slug for urls",
- "ERROR": "Slug is required",
+ "PLACEHOLDER": "Slug kategori untuk url",
+ "ERROR": "Slug diperlukan",
"HELP_TEXT": "app.chatwoot.com/hc/{portalSlug}/{localeCode}/categories/{categorySlug}"
},
"DESCRIPTION": {
- "LABEL": "Description",
- "PLACEHOLDER": "Give a short description about the category.",
- "ERROR": "Description is required"
+ "LABEL": "Penerangan",
+ "PLACEHOLDER": "Berikan penerangan ringkas tentang kategori.",
+ "ERROR": "Penerangan diperlukan"
}
},
"BUTTONS": {
- "CREATE": "Create",
- "EDIT": "Update",
+ "CREATE": "Cipta",
+ "EDIT": "Kemas kini",
"CANCEL": "Batalkan"
}
}
},
"LOCALES_PAGE": {
- "LOCALES_COUNT": "No locales available | {n} locale | {n} locales",
- "NEW_LOCALE_BUTTON_TEXT": "New locale",
+ "LOCALES_COUNT": "Tiada lokal tersedia | {n} lokal | {n} lokal",
+ "NEW_LOCALE_BUTTON_TEXT": "Lokal baru",
"LOCALE_CARD": {
- "ARTICLES_COUNT": "{count} article | {count} articles",
- "CATEGORIES_COUNT": "{count} category | {count} categories",
- "DEFAULT": "Default",
+ "ARTICLES_COUNT": "{count} artikel | {count} artikel",
+ "CATEGORIES_COUNT": "{count} kategori | {count} kategori",
+ "DEFAULT": "Lalai",
+ "DRAFT": "Draf",
"DROPDOWN_MENU": {
- "MAKE_DEFAULT": "Make default",
+ "MAKE_DEFAULT": "Jadikan lalai",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Padamkan"
}
},
"ADD_LOCALE_DIALOG": {
- "TITLE": "Add a new locale",
- "DESCRIPTION": "Select the language in which this article will be written. This will be added to your list of translations, and you can add more later.",
+ "TITLE": "Tambah lokal baru",
+ "DESCRIPTION": "Pilih bahasa di mana artikel ini akan ditulis. Ini akan ditambah ke senarai terjemahan anda, dan anda boleh menambah lebih banyak kemudian.",
"COMBOBOX": {
- "PLACEHOLDER": "Select locale..."
+ "PLACEHOLDER": "Pilih lokal..."
+ },
+ "STATUS": {
+ "LABEL": "Status",
+ "OPTIONS": {
+ "LIVE": "Diterbitkan",
+ "DRAFT": "Draf"
+ }
},
"API": {
- "SUCCESS_MESSAGE": "Locale added successfully",
- "ERROR_MESSAGE": "Unable to add locale. Try again."
+ "SUCCESS_MESSAGE": "Lokal berjaya ditambah",
+ "ERROR_MESSAGE": "Tidak dapat menambah lokal. Sila cuba lagi."
}
}
},
"EDIT_ARTICLE_PAGE": {
"HEADER": {
"STATUS": {
- "SAVING": "Saving...",
- "SAVED": "Saved"
+ "SAVING": "Menyimpan...",
+ "SAVED": "Disimpan"
},
- "PREVIEW": "Preview",
- "PUBLISH": "Publish",
- "DRAFT": "Draft",
- "ARCHIVE": "Archive",
- "BACK_TO_ARTICLES": "Back to articles"
+ "PREVIEW": "Pratonton",
+ "PUBLISH": "Terbitkan",
+ "DRAFT": "Draf",
+ "ARCHIVE": "Arkib",
+ "BACK_TO_ARTICLES": "Kembali ke artikel"
},
"EDIT_ARTICLE": {
- "MORE_PROPERTIES": "More properties",
- "UNCATEGORIZED": "Uncategorized",
- "EDITOR_PLACEHOLDER": "Write something..."
+ "MORE_PROPERTIES": "Lebih banyak sifat",
+ "UNCATEGORIZED": "Tidak dikategorikan",
+ "EDITOR_PLACEHOLDER": "Tulis sesuatu..."
},
"ARTICLE_PROPERTIES": {
- "ARTICLE_PROPERTIES": "Article properties",
- "META_DESCRIPTION": "Meta description",
- "META_DESCRIPTION_PLACEHOLDER": "Add meta description",
- "META_TITLE": "Meta title",
- "META_TITLE_PLACEHOLDER": "Add meta title",
- "META_TAGS": "Meta tags",
- "META_TAGS_PLACEHOLDER": "Add meta tags"
+ "ARTICLE_PROPERTIES": "Sifat artikel",
+ "META_DESCRIPTION": "Penerangan meta",
+ "META_DESCRIPTION_PLACEHOLDER": "Tambah penerangan meta",
+ "META_TITLE": "Tajuk meta",
+ "META_TITLE_PLACEHOLDER": "Tambah tajuk meta",
+ "META_TAGS": "Tag meta",
+ "META_TAGS_PLACEHOLDER": "Tambah tag meta"
},
"API": {
- "ERROR": "Error while saving article"
+ "ERROR": "Ralat semasa menyimpan artikel"
}
},
"PORTAL_SWITCHER": {
- "NEW_PORTAL": "New portal",
- "PORTALS": "Portals",
- "CREATE_PORTAL": "Create and manage multiple portals",
- "ARTICLES": "articles",
+ "NEW_PORTAL": "Portal baru",
+ "PORTALS": "Portal",
+ "CREATE_PORTAL": "Cipta dan uruskan pelbagai portal",
+ "ARTICLES": "artikel",
"DOMAIN": "domain",
- "PORTAL_NAME": "Portal name"
+ "PORTAL_NAME": "Nama portal"
},
"CREATE_PORTAL_DIALOG": {
- "TITLE": "Create new portal",
- "DESCRIPTION": "Give your portal a name and create a user-friendly URL slug. You can modify both later in the settings.",
- "CONFIRM_BUTTON_LABEL": "Create",
+ "TITLE": "Cipta portal baru",
+ "DESCRIPTION": "Berikan nama kepada portal anda dan cipta URL slug yang mesra pengguna. Anda boleh mengubah kedua-duanya kemudian dalam tetapan.",
+ "CONFIRM_BUTTON_LABEL": "Cipta",
"NAME": {
"LABEL": "Nama",
- "PLACEHOLDER": "User Guide | Chatwoot",
- "MESSAGE": "Choose an name for your portal.",
+ "PLACEHOLDER": "Panduan Pengguna | Chatwoot",
+ "MESSAGE": "Pilih nama untuk portal anda.",
"ERROR": "Nama diperlukan"
},
"SLUG": {
"LABEL": "Slug",
- "PLACEHOLDER": "user-guide",
- "ERROR": "Slug is required",
- "FORMAT_ERROR": "Please enter a valid slug, for eg: user-guide"
+ "PLACEHOLDER": "panduan-pengguna",
+ "ERROR": "Slug diperlukan",
+ "FORMAT_ERROR": "Sila masukkan slug yang sah, contohnya: user-guide"
}
},
"PORTAL_SETTINGS": {
"FORM": {
"AVATAR": {
"LABEL": "Logo",
- "IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again",
- "IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save changes to save the logo",
- "IMAGE_DELETE_SUCCESS": "Logo deleted successfully",
- "IMAGE_DELETE_ERROR": "Unable to delete logo",
- "IMAGE_UPLOAD_SIZE_ERROR": "Image size should be less than {size}MB"
+ "IMAGE_UPLOAD_ERROR": "Gagal memuat naik imej! Sila cuba lagi",
+ "IMAGE_UPLOAD_SUCCESS": "Imej berjaya ditambah. Sila klik simpan perubahan untuk menyimpan logo",
+ "IMAGE_DELETE_SUCCESS": "Logo berjaya dipadam",
+ "IMAGE_DELETE_ERROR": "Tidak dapat memadam logo",
+ "IMAGE_UPLOAD_SIZE_ERROR": "Saiz imej harus kurang daripada {size}MB"
},
"NAME": {
"LABEL": "Nama",
- "PLACEHOLDER": "Portal name",
+ "PLACEHOLDER": "Nama portal",
"ERROR": "Nama diperlukan"
},
"HEADER_TEXT": {
- "LABEL": "Header text",
- "PLACEHOLDER": "Portal header text"
+ "LABEL": "Teks tajuk",
+ "PLACEHOLDER": "Teks pengepala portal"
},
"PAGE_TITLE": {
- "LABEL": "Page title",
- "PLACEHOLDER": "Portal page title"
+ "LABEL": "Tajuk halaman",
+ "PLACEHOLDER": "Tajuk halaman portal"
},
"HOME_PAGE_LINK": {
- "LABEL": "Home page link",
- "PLACEHOLDER": "Portal home page link",
- "ERROR": "Enter a valid URL. The Home page link must start with 'http://' or 'https://'."
+ "LABEL": "Pautan halaman utama",
+ "PLACEHOLDER": "Pautan halaman utama portal",
+ "ERROR": "Masukkan URL yang sah. Pautan Halaman Utama mesti bermula dengan 'http://' atau 'https://'."
},
"SLUG": {
"LABEL": "Slug",
- "PLACEHOLDER": "Portal slug"
+ "PLACEHOLDER": "Slug portal"
},
"LIVE_CHAT_WIDGET": {
- "LABEL": "Live chat widget",
- "PLACEHOLDER": "Select live chat widget",
- "HELP_TEXT": "Select a live chat widget that will appear on your help center",
- "NONE_OPTION": "No widget"
+ "LABEL": "Widget sembang langsung",
+ "PLACEHOLDER": "Pilih widget sembang langsung",
+ "HELP_TEXT": "Pilih widget sembang langsung yang akan muncul di pusat bantuan anda",
+ "NONE_OPTION": "Tiada widget"
},
"BRAND_COLOR": {
- "LABEL": "Brand color"
+ "LABEL": "Warna jenama"
},
- "SAVE_CHANGES": "Save changes"
+ "SAVE_CHANGES": "Simpan perubahan"
},
"CONFIGURATION_FORM": {
"CUSTOM_DOMAIN": {
- "HEADER": "Custom domain",
- "LABEL": "Custom domain:",
- "DESCRIPTION": "You can host your portal on a custom domain. For instance, if your website is yourdomain.com and you want your portal available at docs.yourdomain.com, simply enter that in this field.",
- "STATUS_DESCRIPTION": "Your custom portal will start working as soon as it is verified.",
- "PLACEHOLDER": "Portal custom domain",
- "EDIT_BUTTON": "Edit",
- "ADD_BUTTON": "Add custom domain",
+ "HEADER": "Domain tersuai",
+ "LABEL": "Domain tersuai:",
+ "DESCRIPTION": "Anda boleh menghoskan portal anda pada domain tersuai. Contohnya, jika laman web anda adalah yourdomain.com dan anda mahu portal anda tersedia di docs.yourdomain.com, masukkan sahaja alamat itu dalam medan ini.",
+ "STATUS_DESCRIPTION": "Portal khusus anda akan mula berfungsi sebaik sahaja ia disahkan.",
+ "PLACEHOLDER": "Domain khusus portal",
+ "EDIT_BUTTON": "Sunting",
+ "ADD_BUTTON": "Tambah domain khusus",
"STATUS": {
- "LIVE": "Live",
- "PENDING": "Awaiting verification",
- "ERROR": "Verification failed"
+ "LIVE": "Aktif",
+ "PENDING": "Menunggu pengesahan",
+ "ERROR": "Pengesahan gagal"
},
"DIALOG": {
- "ADD_HEADER": "Add custom domain",
- "EDIT_HEADER": "Edit custom domain",
- "ADD_CONFIRM_BUTTON_LABEL": "Add domain",
- "EDIT_CONFIRM_BUTTON_LABEL": "Update domain",
- "LABEL": "Custom domain",
- "PLACEHOLDER": "Portal custom domain",
- "ERROR": "Custom domain is required",
- "FORMAT_ERROR": "Please enter a valid domain URL e.g. docs.yourdomain.com"
+ "ADD_HEADER": "Tambah domain khusus",
+ "EDIT_HEADER": "Sunting domain khusus",
+ "ADD_CONFIRM_BUTTON_LABEL": "Tambah domain",
+ "EDIT_CONFIRM_BUTTON_LABEL": "Kemas kini domain",
+ "LABEL": "Domain tersuai",
+ "PLACEHOLDER": "Domain tersuai portal",
+ "ERROR": "Domain tersuai diperlukan",
+ "FORMAT_ERROR": "Sila masukkan URL domain yang sah contohnya docs.yourdomain.com"
},
"DNS_CONFIGURATION_DIALOG": {
- "HEADER": "DNS configuration",
- "DESCRIPTION": "Log in to the account you have with your DNS provider, and add a CNAME record for subdomain pointing to chatwoot.help",
- "COPY": "Successfully copied CNAME",
+ "HEADER": "Konfigurasi DNS",
+ "DESCRIPTION": "Log masuk ke akaun anda dengan penyedia DNS anda, dan tambah rekod CNAME untuk subdomain yang menunjuk ke chatwoot.help",
+ "COPY": "Berjaya menyalin CNAME",
"SEND_INSTRUCTIONS": {
- "HEADER": "Send instructions",
- "DESCRIPTION": "If you would prefer to have someone from your development team to handle this step, you can enter email address below, and we will send them the required instructions.",
- "PLACEHOLDER": "Enter their email",
- "ERROR": "Enter a valid email address",
- "SEND_BUTTON": "Send"
+ "HEADER": "Hantar arahan",
+ "DESCRIPTION": "Jika anda lebih suka seseorang dari pasukan pembangunan anda mengendalikan langkah ini, anda boleh masukkan alamat emel di bawah, dan kami akan menghantar arahan yang diperlukan kepada mereka.",
+ "PLACEHOLDER": "Masukkan emel mereka",
+ "ERROR": "Masukkan alamat emel yang sah",
+ "SEND_BUTTON": "Hantar"
}
}
},
"DELETE_PORTAL": {
- "BUTTON": "Delete {portalName}",
- "HEADER": "Delete portal",
- "DESCRIPTION": "Permanently delete this portal. This action is irreversible",
+ "BUTTON": "Padam {portalName}",
+ "HEADER": "Padam portal",
+ "DESCRIPTION": "Padam portal ini secara kekal. Tindakan ini tidak boleh dibatalkan",
"DIALOG": {
- "HEADER": "Sure you want to delete {portalName}?",
- "DESCRIPTION": "This is a permanent action that cannot be reversed.",
+ "HEADER": "Anda pasti mahu memadam {portalName}?",
+ "DESCRIPTION": "Ini adalah tindakan kekal yang tidak boleh dibatalkan.",
"CONFIRM_BUTTON_LABEL": "Padamkan"
}
},
- "EDIT_CONFIGURATION": "Edit configuration"
+ "EDIT_CONFIGURATION": "Sunting konfigurasi"
},
"API": {
"CREATE_PORTAL": {
- "SUCCESS_MESSAGE": "Portal created successfully",
- "ERROR_MESSAGE": "Unable to create portal"
+ "SUCCESS_MESSAGE": "Portal berjaya dibuat",
+ "ERROR_MESSAGE": "Tidak dapat membuat portal"
},
"UPDATE_PORTAL": {
- "SUCCESS_MESSAGE": "Portal updated successfully",
- "ERROR_MESSAGE": "Unable to update portal"
+ "SUCCESS_MESSAGE": "Portal berjaya dikemas kini",
+ "ERROR_MESSAGE": "Tidak dapat mengemas kini portal"
}
}
},
"PDF_UPLOAD": {
- "TITLE": "Upload PDF Document",
- "DESCRIPTION": "Upload a PDF document to automatically generate FAQs using AI",
- "DRAG_DROP_TEXT": "Drag and drop your PDF file here, or click to select",
- "SELECT_FILE": "Select PDF File",
- "ADDITIONAL_CONTEXT_LABEL": "Additional Context (Optional)",
- "ADDITIONAL_CONTEXT_PLACEHOLDER": "Provide any additional context or instructions for FAQ generation...",
- "UPLOADING": "Uploading...",
- "UPLOAD": "Upload & Process",
+ "TITLE": "Muat Naik Dokumen PDF",
+ "DESCRIPTION": "Muat naik dokumen PDF untuk menjana Soalan Lazim secara automatik menggunakan AI",
+ "DRAG_DROP_TEXT": "Seret dan lepaskan fail PDF anda di sini, atau klik untuk memilih",
+ "SELECT_FILE": "Pilih Fail PDF",
+ "ADDITIONAL_CONTEXT_LABEL": "Konteks Tambahan (Pilihan)",
+ "ADDITIONAL_CONTEXT_PLACEHOLDER": "Berikan sebarang konteks tambahan atau arahan untuk penjanaan FAQ...",
+ "UPLOADING": "Memuat naik...",
+ "UPLOAD": "Muat Naik & Proses",
"CANCEL": "Batalkan",
- "ERROR_INVALID_TYPE": "Please select a valid PDF file",
- "ERROR_FILE_TOO_LARGE": "File size must be less than 512MB",
- "ERROR_UPLOAD_FAILED": "Failed to upload PDF. Please try again."
+ "ERROR_INVALID_TYPE": "Sila pilih fail PDF yang sah",
+ "ERROR_FILE_TOO_LARGE": "Saiz fail mesti kurang daripada 512MB",
+ "ERROR_UPLOAD_FAILED": "Gagal memuat naik PDF. Sila cuba lagi."
},
"PDF_DOCUMENTS": {
- "TITLE": "PDF Documents",
- "DESCRIPTION": "Manage uploaded PDF documents and generate FAQs from them",
- "UPLOAD_PDF": "Upload PDF",
- "UPLOAD_FIRST_PDF": "Upload your first PDF",
- "UPLOADED_BY": "Uploaded by",
- "GENERATE_FAQS": "Generate FAQs",
- "GENERATING": "Generating...",
- "CONFIRM_DELETE": "Are you sure you want to delete {filename}?",
+ "TITLE": "Dokumen PDF",
+ "DESCRIPTION": "Urus dokumen PDF yang dimuat naik dan jana Soalan Lazim daripadanya",
+ "UPLOAD_PDF": "Muat naik PDF",
+ "UPLOAD_FIRST_PDF": "Muat naik PDF pertama anda",
+ "UPLOADED_BY": "Dimuat naik oleh",
+ "GENERATE_FAQS": "Jana Soalan Lazim",
+ "GENERATING": "Sedang menjana...",
+ "CONFIRM_DELETE": "Adakah anda pasti mahu memadam {filename}?",
"EMPTY_STATE": {
- "TITLE": "No PDF documents yet",
- "DESCRIPTION": "Upload PDF documents to automatically generate FAQs using AI"
+ "TITLE": "Tiada dokumen PDF lagi",
+ "DESCRIPTION": "Muat naik dokumen PDF untuk menjana FAQ secara automatik menggunakan AI"
},
"STATUS": {
- "UPLOADED": "Ready",
- "PROCESSING": "Processing",
- "PROCESSED": "Completed",
- "FAILED": "Failed"
+ "UPLOADED": "Sedia",
+ "PROCESSING": "Sedang Diproses",
+ "PROCESSED": "Selesai",
+ "FAILED": "Gagal"
}
},
"CONTENT_GENERATION": {
- "TITLE": "Content Generation",
- "DESCRIPTION": "Upload PDF documents to automatically generate FAQ content using AI",
- "UPLOAD_TITLE": "Upload PDF Document",
- "DRAG_DROP": "Drag and drop your PDF file here, or click to select",
- "SELECT_FILE": "Select PDF File",
- "UPLOADING": "Processing document...",
- "UPLOAD_SUCCESS": "Document processed successfully!",
- "UPLOAD_ERROR": "Failed to upload document. Please try again.",
- "INVALID_FILE_TYPE": "Please select a valid PDF file",
- "FILE_TOO_LARGE": "File size must be less than 512MB",
- "GENERATED_CONTENT": "Generated FAQ Content",
- "PUBLISH_SELECTED": "Publish Selected",
- "PUBLISHING": "Publishing...",
- "FROM_DOCUMENT": "From document",
- "NO_CONTENT": "No generated content available. Upload a PDF document to get started.",
- "LOADING": "Loading generated content..."
+ "TITLE": "Penjanaan Kandungan",
+ "DESCRIPTION": "Muat naik dokumen PDF untuk menjana kandungan FAQ secara automatik menggunakan AI",
+ "UPLOAD_TITLE": "Muat Naik Dokumen PDF",
+ "DRAG_DROP": "Seret dan lepaskan fail PDF anda di sini, atau klik untuk memilih",
+ "SELECT_FILE": "Pilih Fail PDF",
+ "UPLOADING": "Memproses dokumen...",
+ "UPLOAD_SUCCESS": "Dokumen berjaya diproses!",
+ "UPLOAD_ERROR": "Gagal memuat naik dokumen. Sila cuba lagi.",
+ "INVALID_FILE_TYPE": "Sila pilih fail PDF yang sah",
+ "FILE_TOO_LARGE": "Saiz fail mesti kurang daripada 512MB",
+ "GENERATED_CONTENT": "Kandungan FAQ yang Dijana",
+ "PUBLISH_SELECTED": "Terbitkan Yang Dipilih",
+ "PUBLISHING": "Menerbitkan...",
+ "FROM_DOCUMENT": "Daripada dokumen",
+ "NO_CONTENT": "Tiada kandungan yang dijana tersedia. Muat naik dokumen PDF untuk memulakan.",
+ "LOADING": "Memuatkan kandungan yang dijana..."
}
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ms/integrations.json b/app/javascript/dashboard/i18n/locale/ms/integrations.json
index fa3ef266d..4998b467f 100644
--- a/app/javascript/dashboard/i18n/locale/ms/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ms/integrations.json
@@ -3,45 +3,45 @@
"SHOPIFY": {
"HEADER": "Shopify",
"DELETE": {
- "TITLE": "Delete Shopify Integration",
- "MESSAGE": "Are you sure you want to delete the Shopify integration?"
+ "TITLE": "Padam Integrasi Shopify",
+ "MESSAGE": "Adakah anda pasti ingin memadam integrasi Shopify?"
},
"STORE_URL": {
- "TITLE": "Connect Shopify Store",
+ "TITLE": "Sambungkan Kedai Shopify",
"LABEL": "URL Kedai",
"PLACEHOLDER": "kedai-anda.myshopify.com",
- "HELP": "Enter your Shopify store's myshopify.com URL",
+ "HELP": "Masukkan URL myshopify.com kedai Shopify anda",
"CANCEL": "Batalkan",
"SUBMIT": "Sambungkan Kedai"
},
- "ERROR": "There was an error connecting to Shopify. Please try again or contact support if the issue persists."
+ "ERROR": "Terdapat ralat semasa menyambung ke Shopify. Sila cuba lagi atau hubungi sokongan jika masalah berterusan."
},
"HEADER": "Integrasi",
- "DESCRIPTION": "Chatwoot integrates with multiple tools and services to improve your team's efficiency. Explore the list below to configure your favorite apps.",
+ "DESCRIPTION": "Chatwoot berintegrasi dengan pelbagai alat dan perkhidmatan untuk meningkatkan kecekapan pasukan anda. Terokai senarai di bawah untuk mengkonfigurasi aplikasi kegemaran anda.",
"LEARN_MORE": "Ketahui lebih lanjut mengenai integrasi",
"LOADING": "Mengambil integrasi",
"SEARCH_PLACEHOLDER": "Cari integrasi...",
"NO_RESULTS": "Tiada integrasi ditemui yang sepadan dengan carian anda",
"CAPTAIN": {
- "DISABLED": "Captain is not enabled on your account.",
+ "DISABLED": "Captain tidak diaktifkan pada akaun anda.",
"CLICK_HERE_TO_CONFIGURE": "Klik di sini untuk konfigurasi",
- "LOADING_CONSOLE": "Loading Captain Console...",
- "FAILED_TO_LOAD_CONSOLE": "Failed to load Captain Console. Please refresh and try again."
+ "LOADING_CONSOLE": "Memuatkan Konsol Captain...",
+ "FAILED_TO_LOAD_CONSOLE": "Gagal memuatkan Konsol Captain. Sila muat semula dan cuba lagi."
},
"WEBHOOK": {
- "SUBSCRIBED_EVENTS": "Subscribed Events",
- "LEARN_MORE": "Learn more about webhooks",
+ "SUBSCRIBED_EVENTS": "Acara Langganan",
+ "LEARN_MORE": "Ketahui lebih lanjut tentang webhook",
"SECRET": {
"LABEL": "Rahsia",
"COPY": "Salin rahsia ke papan klip",
"COPY_SUCCESS": "Rahsia disalin ke papan klip",
- "TOGGLE": "Toggle secret visibility",
- "CREATED_DESC": "Your webhook has been created. Use the secret below to verify webhook signatures. Please copy it now — you can also find it later in the webhook edit form.",
+ "TOGGLE": "Togol keterlihatan rahsia",
+ "CREATED_DESC": "Webhook anda telah dibuat. Gunakan rahsia di bawah untuk mengesahkan tandatangan webhook. Sila salin sekarang — anda juga boleh menemuinya kemudian dalam borang suntingan webhook.",
"DONE": "Selesai"
},
"COUNT": "{n} webhook | {n} webhooks",
- "SEARCH_PLACEHOLDER": "Search webhooks...",
- "NO_RESULTS": "No webhooks found matching your search",
+ "SEARCH_PLACEHOLDER": "Cari webhook...",
+ "NO_RESULTS": "Tiada webhook ditemui yang sepadan dengan carian anda",
"FORM": {
"CANCEL": "Batalkan",
"DESC": "Peristiwa webhook memberikan anda maklumat masa nyata tentang apa yang berlaku dalam akaun Chatwoot anda. Sila masukkan URL yang sah untuk mengkonfigurasi panggilan balik.",
@@ -53,7 +53,7 @@
"CONVERSATION_UPDATED": "Perbualan Dikemas Kini",
"MESSAGE_CREATED": "Mesej dicipta",
"MESSAGE_UPDATED": "Mesej dikemas kini",
- "WEBWIDGET_TRIGGERED": "Live chat widget opened by the user",
+ "WEBWIDGET_TRIGGERED": "Widget sembang langsung dibuka oleh pengguna",
"CONTACT_CREATED": "Kenalan dicipta",
"CONTACT_UPDATED": "Kenalan dikemas kini",
"CONVERSATION_TYPING_ON": "Perbualan Mengetik Aktif",
@@ -61,52 +61,52 @@
}
},
"NAME": {
- "LABEL": "Webhook Name",
- "PLACEHOLDER": "Enter the name of the webhook"
+ "LABEL": "Nama webhook",
+ "PLACEHOLDER": "Masukkan nama webhook"
},
"END_POINT": {
"LABEL": "Webhook URL",
"PLACEHOLDER": "Contoh: {webhookExampleURL}",
"ERROR": "Sila masukkan URL yang sah"
},
- "EDIT_SUBMIT": "Update webhook",
- "ADD_SUBMIT": "Create webhook"
+ "EDIT_SUBMIT": "Kemas kini webhook",
+ "ADD_SUBMIT": "Buat webhook"
},
"TITLE": "Webhook",
- "CONFIGURE": "Configure",
- "HEADER": "Webhook settings",
- "HEADER_BTN_TXT": "Add new webhook",
- "LOADING": "Fetching attached webhooks",
- "SEARCH_404": "There are no items matching this query",
+ "CONFIGURE": "Konfigurasi",
+ "HEADER": "Tetapan webhook",
+ "HEADER_BTN_TXT": "Tambah webhook baharu",
+ "LOADING": "Mengambil webhook yang dilampirkan",
+ "SEARCH_404": "Tiada item yang sepadan dengan carian ini",
"SIDEBAR_TXT": "Webhooks
Webhooks adalah panggilan balik HTTP yang boleh ditetapkan untuk setiap akaun. Ia dicetuskan oleh peristiwa seperti penciptaan mesej dalam Chatwoot. Anda boleh mencipta lebih daripada satu webhook untuk akaun ini. Untuk mencipta webhook , klik pada butang Tambah webhook baru . Anda juga boleh memadam mana-mana webhook sedia ada dengan mengklik butang Padam.
",
"LIST": {
- "404": "There are no webhooks configured for this account.",
- "TITLE": "Manage webhooks",
+ "404": "Tiada webhook dikonfigurasikan untuk akaun ini.",
+ "TITLE": "Urus webhook",
"TABLE_HEADER": {
- "WEBHOOK_ENDPOINT": "Webhook endpoint",
+ "WEBHOOK_ENDPOINT": "Titik akhir webhook",
"ACTIONS": "Tindakan-tindakan"
}
},
"EDIT": {
"BUTTON_TEXT": "Sunting",
- "TITLE": "Edit webhook",
+ "TITLE": "Sunting webhook",
"API": {
- "SUCCESS_MESSAGE": "Webhook configuration updated successfully",
+ "SUCCESS_MESSAGE": "Konfigurasi webhook berjaya dikemas kini",
"ERROR_MESSAGE": "Masalah untuk hubungi Woot Server, Sila cuba sebentar lagi"
}
},
"ADD": {
"CANCEL": "Batalkan",
- "TITLE": "Add new webhook",
+ "TITLE": "Tambah webhook baharu",
"API": {
- "SUCCESS_MESSAGE": "Webhook configuration added successfully",
+ "SUCCESS_MESSAGE": "Konfigurasi webhook berjaya ditambah",
"ERROR_MESSAGE": "Masalah untuk hubungi Woot Server, Sila cuba sebentar lagi"
}
},
"DELETE": {
"BUTTON_TEXT": "Padamkan",
"API": {
- "SUCCESS_MESSAGE": "Webhook deleted successfully",
+ "SUCCESS_MESSAGE": "Webhook berjaya dipadamkan",
"ERROR_MESSAGE": "Masalah untuk hubungi Woot Server, Sila cuba sebentar lagi"
},
"CONFIRM": {
@@ -122,11 +122,11 @@
"DELETE": "Padamkan",
"DELETE_CONFIRMATION": {
"TITLE": "Padam integrasi",
- "MESSAGE": "Are you sure you want to delete the integration? Doing so will result in the loss of access to conversations on your Slack workspace."
+ "MESSAGE": "Adakah anda pasti mahu memadam integrasi ini? Melakukannya akan menyebabkan kehilangan akses ke perbualan di ruang kerja Slack anda."
},
"HELP_TEXT": {
"TITLE": "Using Slack Integration",
- "BODY": "With this integration, all of your incoming conversations will be synced to the ***{selectedChannelName}*** channel in your Slack workspace. You can manage all your customer conversations right within the channel and never miss a message.\n\nHere are the main features of the integration:\n\n**Respond to conversations from within Slack:** To respond to a conversation in the ***{selectedChannelName}*** Slack channel, simply type out your message and send it as a thread. This will create a response back to the customer through Chatwoot. It's that simple!\n\n **Create private notes:** If you want to create private notes instead of replies, start your message with ***`note:`***. This ensures that your message is kept private and won't be visible to the customer.\n\n**Associate an agent profile:** If the person who replied on Slack has an agent profile in Chatwoot under the same email, the replies will be associated with that agent profile automatically. This means you can easily track who said what and when. On the other hand, when the replier doesn't have an associated agent profile, the replies will appear from the bot profile to the customer.",
+ "BODY": "Dengan integrasi ini, semua perbualan masuk anda akan diselaraskan ke saluran ***{selectedChannelName}*** di ruang kerja Slack anda. Anda boleh mengurus semua perbualan pelanggan anda terus dalam saluran tersebut dan tidak akan terlepas sebarang mesej.\n\nBerikut adalah ciri utama integrasi ini:\n\n**Balas perbualan dari dalam Slack:** Untuk membalas perbualan di saluran Slack ***{selectedChannelName}***, hanya taip mesej anda dan hantar sebagai thread. Ini akan mencipta balasan kepada pelanggan melalui Chatwoot. Mudah sahaja!\n\n**Cipta nota peribadi:** Jika anda ingin mencipta nota peribadi dan bukannya balasan, mulakan mesej anda dengan ***`note:`***. Ini memastikan mesej anda kekal peribadi dan tidak akan kelihatan kepada pelanggan.\n\n**Kaitkan profil ejen:** Jika individu yang membalas di Slack mempunyai profil ejen di Chatwoot dengan emel yang sama, balasan akan dikaitkan secara automatik dengan profil ejen tersebut. Ini membolehkan anda menjejak siapa yang berkata apa dan bila. Jika pembalas tidak mempunyai profil ejen yang dikaitkan, balasan akan dipaparkan daripada profil bot kepada pelanggan.",
"SELECTED": "dipilih"
},
"SELECT_CHANNEL": {
@@ -135,11 +135,11 @@
"BUTTON_TEXT": "Sambungkan saluran",
"DESCRIPTION": "Your Slack workspace is now linked with Chatwoot. However, the integration is currently inactive. To activate the integration and connect a channel to Chatwoot, please click the button below.\n\n**Note:** If you are attempting to connect a private channel, add the Chatwoot app to the Slack channel before proceeding with this step.",
"ATTENTION_REQUIRED": "Perhatian diperlukan",
- "EXPIRED": "Your Slack integration has expired. To continue receiving messages on Slack, please delete the integration and connect your workspace again."
+ "EXPIRED": "Integrasi Slack anda telah tamat tempoh. Untuk terus menerima mesej di Slack, sila padam integrasi dan sambungkan ruang kerja anda semula."
},
"UPDATE_ERROR": "Terdapat ralat semasa mengemas kini integrasi, sila cuba lagi",
"UPDATE_SUCCESS": "Saluran berjaya disambungkan",
- "FAILED_TO_FETCH_CHANNELS": "There was an error fetching the channels from Slack, please try again"
+ "FAILED_TO_FETCH_CHANNELS": "Terdapat ralat semasa mendapatkan saluran dari Slack, sila cuba lagi"
},
"DYTE": {
"CLICK_HERE_TO_JOIN": "Klik di sini untuk sertai",
@@ -154,7 +154,7 @@
"OPTIONS": {
"REPLY_SUGGESTION": "Cadangan Balasan",
"SUMMARIZE": "Ringkaskan",
- "REPHRASE": "Improve Writing",
+ "REPHRASE": "Perbaiki Penulisan",
"FIX_SPELLING_GRAMMAR": "Betulkan Ejaan dan Tatabahasa",
"SHORTEN": "Pendekkan",
"EXPAND": "Kembangkan",
@@ -167,8 +167,8 @@
"STRAIGHTFORWARD": "Gunakan nada terus-terang"
},
"REPLY_OPTIONS": {
- "IMPROVE_REPLY": "Improve reply",
- "IMPROVE_REPLY_SELECTION": "Improve the selection",
+ "IMPROVE_REPLY": "Perbaiki balasan",
+ "IMPROVE_REPLY_SELECTION": "Perbaiki pilihan",
"CHANGE_TONE": {
"TITLE": "Tukar nada",
"OPTIONS": {
@@ -182,7 +182,7 @@
"GRAMMAR": "Betulkan tatabahasa & ejaan",
"SUGGESTION": "Cadangkan balasan",
"SUMMARIZE": "Ringkaskan perbualan",
- "ASK_COPILOT": "Ask Copilot"
+ "ASK_COPILOT": "Tanya Copilot"
},
"ASSISTANCE_MODAL": {
"DRAFT_TITLE": "Draf kandungan",
@@ -194,16 +194,16 @@
}
},
"CTA_MODAL": {
- "TITLE": "Integrate with OpenAI",
- "DESC": "Bring advanced AI features to your dashboard with OpenAI's GPT models. To begin, enter the API key from your OpenAI account.",
- "KEY_PLACEHOLDER": "Enter your OpenAI API key",
+ "TITLE": "Integrasi dengan OpenAI",
+ "DESC": "Bawa ciri AI canggih ke papan pemuka anda dengan model GPT OpenAI. Untuk memulakan, masukkan kunci API dari akaun OpenAI anda.",
+ "KEY_PLACEHOLDER": "Masukkan kunci API OpenAI anda",
"BUTTONS": {
"NEED_HELP": "Perlukan bantuan?",
"DISMISS": "Tutup",
"FINISH": "Selesai Persediaan"
},
- "DISMISS_MESSAGE": "You can setup OpenAI integration later Whenever you want.",
- "SUCCESS_MESSAGE": "OpenAI integration setup successfully"
+ "DISMISS_MESSAGE": "Anda boleh menyediakan integrasi OpenAI kemudian bila-bila masa anda mahu.",
+ "SUCCESS_MESSAGE": "Integrasi OpenAI berjaya disediakan"
},
"TITLE": "Tingkatkan Dengan AI",
"SUMMARY_TITLE": "Ringkasan dengan AI",
@@ -233,8 +233,8 @@
"BUTTON_TEXT": "Sambung"
},
"DASHBOARD_APPS": {
- "TITLE": "Dashboard Apps",
- "HEADER_BTN_TXT": "Add a new dashboard app",
+ "TITLE": "Apl Papan Pemuka",
+ "HEADER_BTN_TXT": "Tambah apl papan pemuka baru",
"SIDEBAR_TXT": "Aplikasi Papan Pemuka
Aplikasi Papan Pemuka membolehkan organisasi menyematkan aplikasi di dalam papan pemuka Chatwoot untuk menyediakan konteks bagi ejen sokongan pelanggan. Ciri ini membolehkan anda mencipta aplikasi secara bebas dan menyematkannya di dalam papan pemuka untuk menyediakan maklumat pengguna, pesanan mereka, atau sejarah pembayaran mereka sebelum ini.
Apabila anda menyematkan aplikasi anda menggunakan papan pemuka dalam Chatwoot, aplikasi anda akan menerima konteks perbualan dan kenalan sebagai acara tetingkap. Laksanakan pendengar untuk acara mesej pada halaman anda untuk menerima konteks tersebut.
Untuk menambah aplikasi papan pemuka baru, klik pada butang 'Tambah aplikasi papan pemuka baru'.
",
"DESCRIPTION": "Aplikasi Papan Pemuka membolehkan organisasi menyematkan aplikasi di dalam papan pemuka untuk menyediakan konteks bagi ejen sokongan pelanggan. Ciri ini membolehkan anda mencipta aplikasi secara bebas dan menyematkannya untuk menyediakan maklumat pengguna, pesanan mereka, atau sejarah pembayaran mereka sebelum ini.",
"LEARN_MORE": "Ketahui lebih lanjut mengenai Aplikasi Papan Pemuka",
@@ -242,7 +242,7 @@
"SEARCH_PLACEHOLDER": "Cari aplikasi papan pemuka...",
"NO_RESULTS": "Tiada aplikasi papan pemuka ditemui yang sepadan dengan carian anda",
"LIST": {
- "404": "There are no dashboard apps configured on this account yet",
+ "404": "Tiada apl papan pemuka yang dikonfigurasikan pada akaun ini lagi",
"LOADING": "Sedang mengambil aplikasi papan pemuka...",
"TABLE_HEADER": {
"NAME": "Nama",
@@ -257,14 +257,14 @@
"TITLE_PLACEHOLDER": "Masukkan nama untuk aplikasi papan pemuka anda",
"TITLE_ERROR": "Nama untuk aplikasi papan pemuka diperlukan",
"URL_LABEL": "Titik akhir",
- "URL_PLACEHOLDER": "Enter the endpoint URL where your app is hosted",
+ "URL_PLACEHOLDER": "Masukkan URL titik akhir di mana apl anda dihoskan",
"URL_ERROR": "URL yang sah diperlukan"
},
"CREATE": {
"HEADER": "Tambah aplikasi papan pemuka baru",
"FORM_SUBMIT": "Hantar",
"FORM_CANCEL": "Batalkan",
- "API_SUCCESS": "Dashboard app configured successfully",
+ "API_SUCCESS": "Apl papan pemuka berjaya dikonfigurasikan",
"API_ERROR": "Kami tidak dapat mencipta aplikasi. Sila cuba lagi kemudian"
},
"UPDATE": {
@@ -296,13 +296,13 @@
"EMPTY_LIST": "Tiada isu linear ditemui",
"LOADING": "Memuat",
"ERROR": "Terdapat ralat semasa mendapatkan isu linear, sila cuba lagi",
- "LINK_SUCCESS": "Issue linked successfully",
+ "LINK_SUCCESS": "Isu berjaya dipautkan",
"LINK_ERROR": "Terdapat ralat semasa memautkan isu, sila cuba lagi",
"LINK_TITLE": "Perbualan (#{conversationId}) dengan {name}"
},
"ADD_OR_LINK": {
"TITLE": "Cipta/pautkan isu linear",
- "DESCRIPTION": "Create Linear issues from conversations, or link existing ones for seamless tracking.",
+ "DESCRIPTION": "Cipta isu Linear dari perbualan, atau pautkan yang sedia ada untuk penjejakan yang lancar.",
"FORM": {
"TITLE": {
"LABEL": "Tajuk",
@@ -360,9 +360,9 @@
"CREATED_AT": "Dicipta pada {createdAt}"
},
"UNLINK": {
- "TITLE": "Unlink",
- "SUCCESS": "Issue unlinked successfully",
- "ERROR": "There was an error unlinking the issue, please try again"
+ "TITLE": "Nyahpaut",
+ "SUCCESS": "Isu berjaya dinyahpaut",
+ "ERROR": "Terdapat ralat semasa menyahpaut isu, sila cuba lagi"
},
"NO_LINKED_ISSUES": "Tiada isu berkaitan ditemui",
"DELETE": {
@@ -381,8 +381,8 @@
"NOTION": {
"HEADER": "Notion",
"DELETE": {
- "TITLE": "Are you sure you want to delete the Notion integration?",
- "MESSAGE": "Deleting this integration will remove access to your Notion workspace and stop all related functionality.",
+ "TITLE": "Adakah anda pasti mahu memadam integrasi Notion?",
+ "MESSAGE": "Memadam integrasi ini akan mengalih keluar akses ke ruang kerja Notion anda dan menghentikan semua fungsi berkaitan.",
"CONFIRM": "Ya, padam",
"CANCEL": "Batalkan"
}
@@ -400,10 +400,10 @@
"COPILOT": {
"TITLE": "Kopilot",
"TRY_THESE_PROMPTS": "Cuba arahan ini",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "PANEL_TITLE": "Mulakan dengan Copilot",
+ "KICK_OFF_MESSAGE": "Perlukan ringkasan cepat, mahu semak perbualan lalu, atau draf balasan yang lebih baik? Copilot di sini untuk mempercepatkan semuanya.",
"SEND_MESSAGE": "Hantar mesej...",
- "EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
+ "EMPTY_MESSAGE": "Terdapat ralat semasa menjana respons. Sila cuba lagi.",
"LOADER": "Kapten sedang berfikir",
"YOU": "Anda",
"USE": "Gunakan ini",
@@ -429,7 +429,7 @@
},
"LIST_CONTACTS": {
"LABEL": "Senaraikan kenalan",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "CONTENT": "Tunjukkan saya senarai 10 kenalan teratas. Sertakan nama, emel atau nombor telefon (jika ada), masa terakhir dilihat, tag (jika ada)."
}
}
},
@@ -439,23 +439,23 @@
"MESSAGE_PLACEHOLDER": "Taip mesej anda...",
"HEADER": "Tempat Permainan",
"DESCRIPTION": "Gunakan ruang ujian ini untuk menghantar mesej kepada pembantu anda dan periksa sama ada ia memberi respons dengan tepat, pantas, dan dalam nada yang anda jangkakan.",
- "CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
+ "CREDIT_NOTE": "Mesej yang dihantar di sini akan dikira ke arah kredit Captain anda."
},
"PAYWALL": {
- "TITLE": "Upgrade to use Captain AI",
- "AVAILABLE_ON": "Captain is not available on the free plan.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "TITLE": "Tingkat taraf untuk menggunakan Captain AI",
+ "AVAILABLE_ON": "Captain tidak tersedia pada pelan percuma.",
+ "UPGRADE_PROMPT": "Tingkatkan pelan anda untuk mendapatkan akses kepada pembantu kami, copilot dan banyak lagi.",
"UPGRADE_NOW": "Tingkatkan sekarang",
"CANCEL_ANYTIME": "Anda boleh menukar atau membatalkan pelan anda bila-bila masa"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "AVAILABLE_ON": "Captain AI hanya tersedia dalam pelan Enterprise.",
+ "UPGRADE_PROMPT": "Tingkatkan pelan anda untuk mendapatkan akses kepada pembantu kami, copilot dan banyak lagi.",
"ASK_ADMIN": "Sila hubungi pentadbir anda untuk peningkatan."
},
"BANNER": {
- "RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
- "DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
+ "RESPONSES": "Anda telah menggunakan lebih daripada 80% had respons anda. Untuk terus menggunakan Captain AI, sila tingkatkan pelan anda.",
+ "DOCUMENTS": "Had dokumen telah dicapai. Tingkatkan pelan untuk terus menggunakan Captain AI."
},
"FORM": {
"CANCEL": "Batalkan",
@@ -494,8 +494,8 @@
"ERROR": "Nama diperlukan"
},
"TEMPERATURE": {
- "LABEL": "Response Temperature",
- "DESCRIPTION": "Adjust how creative or restrictive the assistant's responses should be. Lower values produce more focused and deterministic responses, while higher values allow for more creative and varied outputs."
+ "LABEL": "Suhu Respons",
+ "DESCRIPTION": "Laraskan sejauh mana kreativiti atau kekangan dalam respons pembantu. Nilai yang lebih rendah menghasilkan respons yang lebih fokus dan deterministik, manakala nilai yang lebih tinggi membenarkan output yang lebih kreatif dan pelbagai."
},
"DESCRIPTION": {
"LABEL": "Penerangan",
@@ -528,7 +528,7 @@
"ALLOW_CONVERSATION_FAQS": "Hasilkan Soalan Lazim daripada perbualan yang diselesaikan",
"ALLOW_MEMORIES": "Tangkap butiran penting sebagai memori daripada interaksi pelanggan.",
"ALLOW_CITATIONS": "Sertakan petikan sumber dalam jawapan",
- "ALLOW_CONTACT_ATTRIBUTES": "Allow access to contact information"
+ "ALLOW_CONTACT_ATTRIBUTES": "Benarkan akses kepada maklumat kenalan"
}
},
"EDIT": {
@@ -549,14 +549,14 @@
},
"CONTROL_ITEMS": {
"TITLE": "Perkara yang Menghiburkan",
- "DESCRIPTION": "Add more control to the assistant. (a bit more visual like a story : Query guardrail → scenarios → output) Nudges user to actually utilise these.",
+ "DESCRIPTION": "Tambah lebih kawalan kepada pembantu. (sedikit lebih visual seperti cerita: Kawalan pertanyaan → senario → output) Menggalakkan pengguna untuk benar-benar menggunakan ini.",
"OPTIONS": {
"GUARDRAILS": {
"TITLE": "Panduan keselamatan",
"DESCRIPTION": "Menjaga agar semuanya berjalan lancar—hanya jenis soalan yang anda mahu pembantu anda jawab, tiada yang terlarang atau di luar topik."
},
"RESPONSE_GUIDELINES": {
- "TITLE": "Response guidelines",
+ "TITLE": "Garis panduan respons",
"DESCRIPTION": "Gaya dan struktur balasan pembantu anda—jelas dan mesra? Pendek dan padat? Terperinci dan formal?"
}
}
@@ -574,7 +574,7 @@
},
"EMPTY_STATE": {
"TITLE": "Tiada pembantu tersedia",
- "SUBTITLE": "Create an assistant to provide quick and accurate responses to your users. It can learn from your help articles and past conversations.",
+ "SUBTITLE": "Cipta pembantu untuk memberikan respons yang pantas dan tepat kepada pengguna anda. Ia boleh belajar daripada artikel bantuan dan perbualan lalu anda.",
"FEATURE_SPOTLIGHT": {
"TITLE": "Captain Assistant",
"NOTE": "Pembantu Captain berinteraksi terus dengan pelanggan, belajar dari dokumen bantuan dan perbualan lalu anda, dan memberikan respons segera dan tepat. Ia mengendalikan pertanyaan awal, menyediakan penyelesaian pantas sebelum menyerahkan kepada ejen jika perlu."
@@ -609,24 +609,24 @@
"SEARCH_PLACEHOLDER": "Cari..."
},
"EMPTY_MESSAGE": "Tiada garispanduan ditemui. Cipta atau tambah contoh untuk bermula.",
- "SEARCH_EMPTY_MESSAGE": "No guardrails found for this search.",
+ "SEARCH_EMPTY_MESSAGE": "Tiada kawalan ditemui untuk carian ini.",
"API": {
"ADD": {
- "SUCCESS": "Guardrails added successfully",
- "ERROR": "There was an error adding guardrails, please try again."
+ "SUCCESS": "Kawalan berjaya ditambah",
+ "ERROR": "Ralat berlaku semasa menambah kawalan, sila cuba lagi."
},
"UPDATE": {
- "SUCCESS": "Guardrails updated successfully",
- "ERROR": "There was an error updating guardrails, please try again."
+ "SUCCESS": "Kawalan berjaya dikemas kini",
+ "ERROR": "Ralat berlaku semasa mengemas kini kawalan, sila cuba lagi."
},
"DELETE": {
- "SUCCESS": "Guardrails deleted successfully",
- "ERROR": "There was an error deleting guardrails, please try again."
+ "SUCCESS": "Kawalan berjaya dipadam",
+ "ERROR": "Ralat berlaku semasa memadam kawalan, sila cuba lagi."
}
}
},
"RESPONSE_GUIDELINES": {
- "TITLE": "Response Guidelines",
+ "TITLE": "Garis Panduan Respons",
"DESCRIPTION": "Suasana dan struktur balasan pembantu anda—jelas dan mesra? Pendek dan padat? Terperinci dan formal?",
"BULK_ACTION": {
"SELECTED": "{count} item selected | {count} items selected",
@@ -636,37 +636,37 @@
},
"ADD": {
"SUGGESTED": {
- "TITLE": "Example response guidelines",
+ "TITLE": "Contoh garis panduan respons",
"ADD": "Tambah semua",
"ADD_SINGLE": "Tambah ini",
"SAVE": "Tambah dan simpan (↵)",
- "PLACEHOLDER": "Type in another response guideline..."
+ "PLACEHOLDER": "Taip panduan respons lain..."
},
"NEW": {
- "TITLE": "Add a response guideline",
+ "TITLE": "Tambah panduan respons",
"CREATE": "Cipta",
"CANCEL": "Batalkan",
- "PLACEHOLDER": "Type in another response guideline...",
+ "PLACEHOLDER": "Taip panduan respons lain...",
"TEST_ALL": "Uji semua"
}
},
"LIST": {
"SEARCH_PLACEHOLDER": "Cari..."
},
- "EMPTY_MESSAGE": "No response guidelines found. Create or add examples to begin.",
- "SEARCH_EMPTY_MESSAGE": "No response guidelines found for this search.",
+ "EMPTY_MESSAGE": "Tiada panduan respons dijumpai. Cipta atau tambah contoh untuk mula.",
+ "SEARCH_EMPTY_MESSAGE": "Tiada panduan respons dijumpai untuk carian ini.",
"API": {
"ADD": {
- "SUCCESS": "Response Guidelines added successfully",
- "ERROR": "There was an error adding response guidelines, please try again."
+ "SUCCESS": "Panduan Respons berjaya ditambah",
+ "ERROR": "Ralat berlaku semasa menambah panduan respons, sila cuba lagi."
},
"UPDATE": {
- "SUCCESS": "Response Guidelines updated successfully",
- "ERROR": "There was an error updating response guidelines, please try again."
+ "SUCCESS": "Panduan Respons berjaya dikemas kini",
+ "ERROR": "Ralat berlaku semasa mengemas kini panduan respons, sila cuba lagi."
},
"DELETE": {
- "SUCCESS": "Response Guidelines deleted successfully",
- "ERROR": "There was an error deleting response guidelines, please try again."
+ "SUCCESS": "Panduan Respons berjaya dipadam",
+ "ERROR": "Ralat berlaku semasa memadam panduan respons, sila cuba lagi."
}
}
},
@@ -738,11 +738,22 @@
"DOCUMENTS": {
"HEADER": "Dokumen",
"ADD_NEW": "Cipta dokumen baru",
+ "SELECTED": "{count} dipilih",
+ "SELECT_ALL": "Pilih semua ({count})",
+ "UNSELECT_ALL": "Unselect all ({count})",
+ "BULK_DELETE_BUTTON": "Padamkan",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Ya, padam semua",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Soalan Lazim Berkaitan",
"DESCRIPTION": "Soalan Lazim ini dijana terus daripada dokumen."
},
- "FORM_DESCRIPTION": "Enter the URL of the document to add it as a knowledge source and choose the assistant to associate it with.",
+ "FORM_DESCRIPTION": "Masukkan URL dokumen untuk menambahnya sebagai sumber pengetahuan dan pilih pembantu untuk dikaitkan dengannya.",
"CREATE": {
"TITLE": "Tambah dokumen",
"SUCCESS_MESSAGE": "Dokumen telah berjaya dicipta",
@@ -780,7 +791,7 @@
"ERROR_MESSAGE": "Terdapat ralat semasa memadam dokumen, sila cuba lagi."
},
"OPTIONS": {
- "VIEW_RELATED_RESPONSES": "View Related Responses",
+ "VIEW_RELATED_RESPONSES": "Lihat Respons Berkaitan",
"DELETE_DOCUMENT": "Padam Dokumen"
},
"EMPTY_STATE": {
@@ -795,41 +806,49 @@
"CUSTOM_TOOLS": {
"HEADER": "Alat",
"ADD_NEW": "Cipta alat baru",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
- "TITLE": "No custom tools available",
+ "TITLE": "Tiada alat tersuai tersedia",
"SUBTITLE": "Cipta alat khusus untuk menyambungkan pembantu anda dengan API dan perkhidmatan luaran, membolehkannya mendapatkan data dan melaksanakan tindakan bagi pihak anda.",
"FEATURE_SPOTLIGHT": {
- "TITLE": "Custom Tools",
+ "TITLE": "Alat Tersuai",
"NOTE": "Alat khusus membolehkan pembantu anda berinteraksi dengan API dan perkhidmatan luaran. Cipta alat untuk mendapatkan data, melaksanakan tindakan, atau mengintegrasi dengan sistem sedia ada anda untuk meningkatkan keupayaan pembantu anda."
}
},
- "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "FORM_DESCRIPTION": "Konfigurasikan alat tersuai anda untuk berhubung dengan API luaran",
"OPTIONS": {
"EDIT_TOOL": "Sunting alat",
"DELETE_TOOL": "Padam alat"
},
"CREATE": {
- "TITLE": "Create Custom Tool",
- "SUCCESS_MESSAGE": "Custom tool created successfully",
- "ERROR_MESSAGE": "Failed to create custom tool"
+ "TITLE": "Cipta Alat Tersuai",
+ "SUCCESS_MESSAGE": "Alat tersuai berjaya dicipta",
+ "ERROR_MESSAGE": "Gagal mencipta alat tersuai"
},
"EDIT": {
- "TITLE": "Edit Custom Tool",
- "SUCCESS_MESSAGE": "Custom tool updated successfully",
- "ERROR_MESSAGE": "Failed to update custom tool"
+ "TITLE": "Sunting Alat Tersuai",
+ "SUCCESS_MESSAGE": "Alat tersuai berjaya dikemas kini",
+ "ERROR_MESSAGE": "Gagal mengemas kini alat tersuai"
},
"DELETE": {
- "TITLE": "Delete Custom Tool",
- "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "TITLE": "Padam Alat Tersuai",
+ "DESCRIPTION": "Adakah anda pasti mahu memadam alat tersuai ini? Tindakan ini tidak boleh dibatalkan.",
"CONFIRM": "Ya, padam",
- "SUCCESS_MESSAGE": "Custom tool deleted successfully",
- "ERROR_MESSAGE": "Failed to delete custom tool"
+ "SUCCESS_MESSAGE": "Alat tersuai berjaya dipadam",
+ "ERROR_MESSAGE": "Gagal memadam alat tersuai"
+ },
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
},
"FORM": {
"TITLE": {
"LABEL": "Nama Alat",
"PLACEHOLDER": "Semak Pesanan",
- "ERROR": "Nama alat diperlukan"
+ "ERROR": "Nama alat diperlukan",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Penerangan",
@@ -854,14 +873,14 @@
},
"AUTH_CONFIG": {
"BEARER_TOKEN": "Bearer Token",
- "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "BEARER_TOKEN_PLACEHOLDER": "Masukkan token bearer anda",
"USERNAME": "Nama pengguna",
"USERNAME_PLACEHOLDER": "Masukkan nama pengguna",
"PASSWORD": "Kata laluan",
"PASSWORD_PLACEHOLDER": "Masukkan kata laluan",
- "API_KEY": "Header Name",
+ "API_KEY": "Nama Header",
"API_KEY_PLACEHOLDER": "X-API-Key",
- "API_VALUE": "Header Value",
+ "API_VALUE": "Nilai Header",
"API_VALUE_PLACEHOLDER": "Masukkan nilai kunci API"
},
"PARAMETERS": {
@@ -889,11 +908,11 @@
"LABEL": "Diperlukan"
},
"REQUEST_TEMPLATE": {
- "LABEL": "Request Body Template (Optional)",
+ "LABEL": "Templat Badan Permintaan (Pilihan)",
"PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
},
"RESPONSE_TEMPLATE": {
- "LABEL": "Response Template (Optional)",
+ "LABEL": "Templat Respons (Pilihan)",
"PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
},
"ERRORS": {
@@ -944,14 +963,14 @@
"ALL": "Semua"
},
"PENDING_BANNER": {
- "TITLE": "Captain has found some FAQs your customers were looking for.",
+ "TITLE": "Captain telah menemui beberapa FAQ yang dicari oleh pelanggan anda.",
"ACTION": "Klik di sini untuk semak"
},
"FORM_DESCRIPTION": "Tambah soalan dan jawapan yang sepadan ke dalam pangkalan pengetahuan dan pilih pembantu yang sepatutnya dikaitkan dengannya.",
"CREATE": {
"TITLE": "Tambah Soalan Lazim",
- "SUCCESS_MESSAGE": "The response has been added successfully.",
- "ERROR_MESSAGE": "An error occurred while adding the response. Please try again."
+ "SUCCESS_MESSAGE": "Respons telah berjaya ditambah.",
+ "ERROR_MESSAGE": "Ralat berlaku semasa menambah respons. Sila cuba lagi."
},
"FORM": {
"QUESTION": {
@@ -988,7 +1007,7 @@
}
},
"INBOXES": {
- "HEADER": "Connected Inboxes",
+ "HEADER": "Petibek Bersambung",
"ADD_NEW": "Sambungkan peti masuk baru",
"OPTIONS": {
"DISCONNECT": "Putuskan sambungan"
diff --git a/app/javascript/dashboard/i18n/locale/ms/labelsMgmt.json b/app/javascript/dashboard/i18n/locale/ms/labelsMgmt.json
index c90decd96..b4f42d7c2 100644
--- a/app/javascript/dashboard/i18n/locale/ms/labelsMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ms/labelsMgmt.json
@@ -1,82 +1,82 @@
{
"LABEL_MGMT": {
- "HEADER": "Labels",
- "HEADER_BTN_TXT": "Add label",
- "LOADING": "Fetching labels",
- "DESCRIPTION": "Labels help you categorize and prioritize conversations and leads. You can assign a label to a conversation or contact using the side panel.",
- "LEARN_MORE": "Learn more about labels",
+ "HEADER": "Label",
+ "HEADER_BTN_TXT": "Tambah label",
+ "LOADING": "Memuatkan label",
+ "DESCRIPTION": "Label membantu anda mengkategorikan dan mengutamakan perbualan dan prospek. Anda boleh menetapkan label kepada perbualan atau kenalan menggunakan panel sisi.",
+ "LEARN_MORE": "Ketahui lebih lanjut tentang label",
"COUNT": "{n} label | {n} labels",
- "SEARCH_PLACEHOLDER": "Search labels...",
- "NO_RESULTS": "No labels found matching your search",
- "SEARCH_404": "There are no items matching this query",
+ "SEARCH_PLACEHOLDER": "Cari label...",
+ "NO_RESULTS": "Tiada label ditemui yang sepadan dengan carian anda",
+ "SEARCH_404": "Tiada item yang sepadan dengan pertanyaan ini",
"LIST": {
- "404": "There are no labels available in this account.",
- "TITLE": "Manage labels",
- "DESC": "Labels let you group the conversations together.",
+ "404": "Tiada label tersedia dalam akaun ini.",
+ "TITLE": "Urus label",
+ "DESC": "Label membolehkan anda mengumpulkan perbualan bersama-sama.",
"TABLE_HEADER": {
"NAME": "Nama",
- "DESCRIPTION": "Description",
- "COLOR": "Color",
+ "DESCRIPTION": "Penerangan",
+ "COLOR": "Warna",
"ACTION": "Tindakan-tindakan"
}
},
"FORM": {
"NAME": {
- "LABEL": "Label Name",
- "PLACEHOLDER": "Label name",
- "REQUIRED_ERROR": "Label name is required",
- "MINIMUM_LENGTH_ERROR": "Minimum length 2 is required",
- "VALID_ERROR": "Only Alphabets, Numbers, Hyphen and Underscore are allowed"
+ "LABEL": "Nama Label",
+ "PLACEHOLDER": "Nama label",
+ "REQUIRED_ERROR": "Nama label diperlukan",
+ "MINIMUM_LENGTH_ERROR": "Panjang minimum 2 diperlukan",
+ "VALID_ERROR": "Hanya Alfabet, Nombor, Tanda Hubung dan Garis Bawah dibenarkan"
},
"DESCRIPTION": {
- "LABEL": "Description",
- "PLACEHOLDER": "Label Description"
+ "LABEL": "Penerangan",
+ "PLACEHOLDER": "Penerangan Label"
},
"COLOR": {
- "LABEL": "Color"
+ "LABEL": "Warna"
},
"SHOW_ON_SIDEBAR": {
- "LABEL": "Show label on sidebar"
+ "LABEL": "Tunjukkan label pada bar sisi"
},
- "EDIT": "Edit",
- "CREATE": "Create",
+ "EDIT": "Sunting",
+ "CREATE": "Cipta",
"DELETE": "Padamkan",
"CANCEL": "Batalkan"
},
"SUGGESTIONS": {
"TOOLTIP": {
- "SINGLE_SUGGESTION": "Add label to conversation",
- "MULTIPLE_SUGGESTION": "Select this label",
- "DESELECT": "Deselect label",
- "DISMISS": "Dismiss suggestion"
+ "SINGLE_SUGGESTION": "Tambah label ke perbualan",
+ "MULTIPLE_SUGGESTION": "Pilih label ini",
+ "DESELECT": "Nyahpilih label",
+ "DISMISS": "Tolak cadangan"
},
"POWERED_BY": "Chatwoot AI",
- "DISMISS": "Dismiss",
- "ADD_SELECTED_LABELS": "Add selected labels",
- "ADD_SELECTED_LABEL": "Add selected label",
- "ADD_ALL_LABELS": "Add all labels",
- "SUGGESTED_LABELS": "Suggested labels"
+ "DISMISS": "Tolak",
+ "ADD_SELECTED_LABELS": "Tambah label yang dipilih",
+ "ADD_SELECTED_LABEL": "Tambah label yang dipilih",
+ "ADD_ALL_LABELS": "Tambah semua label",
+ "SUGGESTED_LABELS": "Label yang dicadangkan"
},
"ADD": {
- "TITLE": "Add label",
- "DESC": "Labels let you group the conversations together.",
+ "TITLE": "Tambah label",
+ "DESC": "Label membolehkan anda mengelompokkan perbualan bersama-sama.",
"API": {
- "SUCCESS_MESSAGE": "Label added successfully",
- "ERROR_MESSAGE": "There was an error, please try again"
+ "SUCCESS_MESSAGE": "Label berjaya ditambah",
+ "ERROR_MESSAGE": "Terdapat ralat, sila cuba lagi"
}
},
"EDIT": {
- "TITLE": "Edit label",
+ "TITLE": "Sunting label",
"API": {
- "SUCCESS_MESSAGE": "Label updated successfully",
- "ERROR_MESSAGE": "There was an error, please try again"
+ "SUCCESS_MESSAGE": "Label berjaya dikemas kini",
+ "ERROR_MESSAGE": "Terdapat ralat, sila cuba lagi"
}
},
"DELETE": {
"BUTTON_TEXT": "Padamkan",
"API": {
- "SUCCESS_MESSAGE": "Label deleted successfully",
- "ERROR_MESSAGE": "There was an error, please try again"
+ "SUCCESS_MESSAGE": "Label berjaya dipadam",
+ "ERROR_MESSAGE": "Terdapat ralat, sila cuba lagi"
},
"CONFIRM": {
"TITLE": "Pasti Padamkan",
diff --git a/app/javascript/dashboard/i18n/locale/ms/settings.json b/app/javascript/dashboard/i18n/locale/ms/settings.json
index d03bf2cd1..4c6c46f22 100644
--- a/app/javascript/dashboard/i18n/locale/ms/settings.json
+++ b/app/javascript/dashboard/i18n/locale/ms/settings.json
@@ -3,918 +3,918 @@
"LINK": "Tetapan akaun profil",
"TITLE": "Tetapan profil pengguna",
"BTN_TEXT": "Kemas kini profil",
- "DELETE_AVATAR": "Delete Avatar",
- "AVATAR_DELETE_SUCCESS": "Avatar has been deleted successfully",
- "AVATAR_DELETE_FAILED": "There is an error while deleting avatar, please try again",
- "UPDATE_SUCCESS": "Your profile has been updated successfully",
- "PASSWORD_UPDATE_SUCCESS": "Your password has been changed successfully",
+ "DELETE_AVATAR": "Padam Avatar",
+ "AVATAR_DELETE_SUCCESS": "Avatar telah berjaya dipadam",
+ "AVATAR_DELETE_FAILED": "Terdapat ralat semasa memadam avatar, sila cuba lagi",
+ "UPDATE_SUCCESS": "Profil anda telah berjaya dikemas kini",
+ "PASSWORD_UPDATE_SUCCESS": "Katalaluan anda telah berjaya ditukar",
"AFTER_EMAIL_CHANGED": "Profil anda telah berjaya dikemas kini. Sila log masuk semula kerana kelayakan log masuk anda telah berubah.",
"FORM": {
- "PICTURE": "Profile Picture",
+ "PICTURE": "Gambar Profil",
"AVATAR": "Imej profil",
"ERROR": "Sila baiki ralat borang",
"REMOVE_IMAGE": "Padam",
- "UPLOAD_IMAGE": "Upload image",
- "UPDATE_IMAGE": "Update image",
+ "UPLOAD_IMAGE": "Muat naik imej",
+ "UPDATE_IMAGE": "Kemas kini imej",
"PROFILE_SECTION": {
- "TITLE": "Profile",
- "NOTE": "Your email address is your identity and is used to log in."
+ "TITLE": "Profil",
+ "NOTE": "Alamat emel anda adalah identiti anda dan digunakan untuk log masuk."
},
"SEND_MESSAGE": {
- "TITLE": "Hotkey to send messages",
- "NOTE": "You can select a hotkey (either Enter or Cmd/Ctrl+Enter) based on your preference of writing.",
- "UPDATE_SUCCESS": "Your settings have been updated successfully",
+ "TITLE": "Kekunci pintas untuk hantar mesej",
+ "NOTE": "Anda boleh memilih kekunci pintas (sama ada Enter atau Cmd/Ctrl+Enter) berdasarkan keutamaan menulis anda.",
+ "UPDATE_SUCCESS": "Tetapan anda telah berjaya dikemas kini",
"CARD": {
"ENTER_KEY": {
"HEADING": "Enter (↵)",
- "CONTENT": "Send messages by pressing Enter key instead of clicking the send button."
+ "CONTENT": "Hantar mesej dengan menekan kekunci Enter dan bukannya klik butang hantar."
},
"CMD_ENTER_KEY": {
"HEADING": "Cmd/Ctrl + Enter (⌘ + ↵)",
- "CONTENT": "Send messages by pressing Cmd/Ctrl + enter key instead of clicking the send button."
+ "CONTENT": "Hantar mesej dengan menekan kekunci Cmd/Ctrl + Enter dan bukannya klik butang hantar."
}
}
},
"INTERFACE_SECTION": {
- "TITLE": "Interface",
+ "TITLE": "Antara Muka",
"NOTE": "Sesuaikan rupa dan rasa papan pemuka Chatwoot anda.",
"FONT_SIZE": {
- "TITLE": "Font size",
- "NOTE": "Adjust the text size across the dashboard based on your preference.",
+ "TITLE": "Saiz fon",
+ "NOTE": "Laraskan saiz teks di seluruh papan pemuka mengikut keutamaan anda.",
"UPDATE_SUCCESS": "Your font settings have been updated successfully",
"UPDATE_ERROR": "There is an error while updating the font settings, please try again",
"OPTIONS": {
- "SMALLER": "Smaller",
- "SMALL": "Small",
- "DEFAULT": "Default",
- "LARGE": "Large",
- "LARGER": "Larger",
- "EXTRA_LARGE": "Extra Large"
+ "SMALLER": "Lebih Kecil",
+ "SMALL": "Kecil",
+ "DEFAULT": "Lalai",
+ "LARGE": "Besar",
+ "LARGER": "Lebih Besar",
+ "EXTRA_LARGE": "Sangat Besar"
}
},
"LANGUAGE": {
- "TITLE": "Preferred Language",
- "NOTE": "Choose the language you want to use.",
- "UPDATE_SUCCESS": "Your Language settings have been updated successfully",
- "UPDATE_ERROR": "There is an error while updating the language settings, please try again",
- "USE_ACCOUNT_DEFAULT": "Use account default"
+ "TITLE": "Bahasa Pilihan",
+ "NOTE": "Pilih bahasa yang anda ingin gunakan.",
+ "UPDATE_SUCCESS": "Tetapan Bahasa anda telah berjaya dikemas kini",
+ "UPDATE_ERROR": "Terdapat ralat semasa mengemas kini tetapan bahasa, sila cuba lagi",
+ "USE_ACCOUNT_DEFAULT": "Gunakan tetapan akaun lalai"
}
},
"MESSAGE_SIGNATURE_SECTION": {
- "TITLE": "Personal message signature",
- "NOTE": "Create a unique message signature to appear at the end of every message you send from any inbox. You can also include an inline image, which is supported in live-chat, email, and API inboxes.",
- "BTN_TEXT": "Save message signature",
- "API_ERROR": "Couldn't save signature! Try again",
- "API_SUCCESS": "Signature saved successfully",
- "IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again",
- "IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save to save the signature",
+ "TITLE": "Tandatangan mesej peribadi",
+ "NOTE": "Cipta tandatangan mesej unik yang akan muncul di akhir setiap mesej yang anda hantar dari mana-mana peti masuk. Anda juga boleh memasukkan imej sebaris, yang disokong dalam peti masuk sembang langsung, e-mel, dan API.",
+ "BTN_TEXT": "Simpan tandatangan mesej",
+ "API_ERROR": "Tidak dapat menyimpan tandatangan! Sila cuba lagi",
+ "API_SUCCESS": "Tandatangan berjaya disimpan",
+ "IMAGE_UPLOAD_ERROR": "Tidak dapat memuat naik imej! Sila cuba lagi",
+ "IMAGE_UPLOAD_SUCCESS": "Imej berjaya ditambah. Sila klik simpan untuk menyimpan tandatangan",
"IMAGE_UPLOAD_SIZE_ERROR": "Image size should be less than {size}MB"
},
"MESSAGE_SIGNATURE": {
- "LABEL": "Message Signature",
- "ERROR": "Message Signature cannot be empty",
- "PLACEHOLDER": "Insert your personal message signature here."
+ "LABEL": "Tandatangan Mesej",
+ "ERROR": "Tandatangan Mesej tidak boleh kosong",
+ "PLACEHOLDER": "Masukkan tandatangan mesej peribadi anda di sini."
},
"PASSWORD_SECTION": {
- "TITLE": "Password",
- "NOTE": "Updating your password would reset your logins in multiple devices.",
- "BTN_TEXT": "Change password"
+ "TITLE": "Kata Laluan",
+ "NOTE": "Mengemas kini kata laluan anda akan menetapkan semula log masuk anda pada pelbagai peranti.",
+ "BTN_TEXT": "Tukar kata laluan"
},
"SECURITY_SECTION": {
- "TITLE": "Security",
- "NOTE": "Manage additional security features for your account.",
- "MFA_BUTTON": "Manage Two-Factor Authentication"
+ "TITLE": "Keselamatan",
+ "NOTE": "Urus ciri keselamatan tambahan untuk akaun anda.",
+ "MFA_BUTTON": "Urus Pengesahan Dua Faktor"
},
"ACCESS_TOKEN": {
"TITLE": "Access Token",
- "NOTE": "This token can be used if you are building an API based integration",
- "COPY": "Copy",
- "RESET": "Reset",
- "CONFIRM_RESET": "Are you sure?",
- "CONFIRM_HINT": "Click again to confirm",
- "RESET_SUCCESS": "Access token regenerated successfully",
- "RESET_ERROR": "Unable to regenerate access token. Please try again"
+ "NOTE": "Token ini boleh digunakan jika anda membina integrasi berasaskan API",
+ "COPY": "Salin",
+ "RESET": "Tetapkan Semula",
+ "CONFIRM_RESET": "Adakah anda pasti?",
+ "CONFIRM_HINT": "Klik sekali lagi untuk mengesahkan",
+ "RESET_SUCCESS": "Token akses berjaya dijana semula",
+ "RESET_ERROR": "Tidak dapat menjana semula token akses. Sila cuba lagi"
},
"AUDIO_NOTIFICATIONS_SECTION": {
- "TITLE": "Audio Alerts",
- "NOTE": "Enable audio alerts in dashboard for new messages and conversations.",
- "PLAY": "Play sound",
+ "TITLE": "Amaran Audio",
+ "NOTE": "Dayakan amaran audio di papan pemuka untuk mesej dan perbualan baru.",
+ "PLAY": "Mainkan bunyi",
"ALERT_TYPES": {
"NONE": "Tiada",
- "MINE": "Assigned",
- "ALL": "All",
- "ASSIGNED": "My assigned conversations",
- "UNASSIGNED": "Unassigned conversations",
- "NOTME": "Open conversations assigned to others"
+ "MINE": "Ditugaskan",
+ "ALL": "Semua",
+ "ASSIGNED": "Perbualan yang ditugaskan kepada saya",
+ "UNASSIGNED": "Perbualan yang tidak ditugaskan",
+ "NOTME": "Perbualan terbuka yang ditugaskan kepada orang lain"
},
"ALERT_COMBINATIONS": {
- "NONE": "You haven't selected any options, you won't receive any audio alerts.",
- "ASSIGNED": "You'll receive alerts for conversations assigned to you.",
- "UNASSIGNED": "You'll receive alerts for any unassigned conversations.",
- "NOTME": "You'll receive alerts for conversations assigned to others.",
- "ASSIGNED+UNASSIGNED": "You'll receive alerts for your assigned conversations and any unattended ones.",
- "ASSIGNED+NOTME": "You'll receive alerts for conversations assigned to you and to others, but not for unassigned ones.",
- "NOTME+UNASSIGNED": "You'll receive alerts for unattended conversations and those assigned to others.",
- "ASSIGNED+NOTME+UNASSIGNED": "You'll receive alerts for all conversations."
+ "NONE": "Anda belum memilih sebarang pilihan, anda tidak akan menerima sebarang amaran audio.",
+ "ASSIGNED": "Anda akan menerima amaran untuk perbualan yang ditugaskan kepada anda.",
+ "UNASSIGNED": "Anda akan menerima amaran untuk sebarang perbualan yang tidak ditugaskan.",
+ "NOTME": "Anda akan menerima amaran untuk perbualan yang ditugaskan kepada orang lain.",
+ "ASSIGNED+UNASSIGNED": "Anda akan menerima amaran untuk perbualan yang ditugaskan kepada anda dan juga yang tidak dihadiri.",
+ "ASSIGNED+NOTME": "Anda akan menerima amaran untuk perbualan yang ditugaskan kepada anda dan orang lain, tetapi tidak untuk yang tidak ditugaskan.",
+ "NOTME+UNASSIGNED": "Anda akan menerima amaran untuk perbualan yang tidak dijaga dan yang ditugaskan kepada orang lain.",
+ "ASSIGNED+NOTME+UNASSIGNED": "Anda akan menerima amaran untuk semua perbualan."
},
"ALERT_TYPE": {
- "TITLE": "Alert events for conversations",
+ "TITLE": "Peristiwa amaran untuk perbualan",
"NONE": "Tiada",
- "ASSIGNED": "Assigned Conversations",
- "ALL_CONVERSATIONS": "All Conversations"
+ "ASSIGNED": "Perbualan Ditugaskan",
+ "ALL_CONVERSATIONS": "Semua Perbualan"
},
"DEFAULT_TONE": {
- "TITLE": "Alert tone:"
+ "TITLE": "Nada amaran:"
},
"CONDITIONS": {
- "TITLE": "Alert conditions:",
- "CONDITION_ONE": "Send audio alerts only if the browser window is not active",
- "CONDITION_TWO": "Send alerts every 30s until all the assigned conversations are read"
+ "TITLE": "Syarat amaran:",
+ "CONDITION_ONE": "Hantar amaran audio hanya jika tetingkap pelayar tidak aktif",
+ "CONDITION_TWO": "Hantar amaran setiap 30 saat sehingga semua perbualan yang ditugaskan dibaca"
},
- "SOUND_PERMISSION_ERROR": "Autoplay is disabled in your browser. To hear alerts automatically, enable sound permission in your browser settings or interact with the page.",
- "READ_MORE": "Read more"
+ "SOUND_PERMISSION_ERROR": "Autoplay dinyahaktifkan dalam pelayar anda. Untuk mendengar amaran secara automatik, aktifkan kebenaran bunyi dalam tetapan pelayar anda atau berinteraksi dengan halaman.",
+ "READ_MORE": "Baca lebih lanjut"
},
"EMAIL_NOTIFICATIONS_SECTION": {
- "TITLE": "Email Notifications",
- "NOTE": "Update your email notification preferences here",
- "CONVERSATION_ASSIGNMENT": "Send email notifications when a conversation is assigned to me",
- "CONVERSATION_CREATION": "Send email notifications when a new conversation is created",
- "CONVERSATION_MENTION": "Send email notifications when you are mentioned in a conversation",
- "ASSIGNED_CONVERSATION_NEW_MESSAGE": "Send email notifications when a new message is created in an assigned conversation",
- "PARTICIPATING_CONVERSATION_NEW_MESSAGE": "Send email notifications when a new message is created in a participating conversation",
- "SLA_MISSED_FIRST_RESPONSE": "Send email notifications when a conversation misses first response SLA",
- "SLA_MISSED_NEXT_RESPONSE": "Send email notifications when a conversation misses next response SLA",
- "SLA_MISSED_RESOLUTION": "Send email notifications when a conversation misses resolution SLA"
+ "TITLE": "Pemberitahuan Emel",
+ "NOTE": "Kemas kini pilihan pemberitahuan emel anda di sini",
+ "CONVERSATION_ASSIGNMENT": "Hantar pemberitahuan emel apabila perbualan ditugaskan kepada saya",
+ "CONVERSATION_CREATION": "Hantar pemberitahuan emel apabila perbualan baru dibuat",
+ "CONVERSATION_MENTION": "Hantar pemberitahuan emel apabila anda disebut dalam perbualan",
+ "ASSIGNED_CONVERSATION_NEW_MESSAGE": "Hantar pemberitahuan emel apabila mesej baru dibuat dalam perbualan yang ditugaskan",
+ "PARTICIPATING_CONVERSATION_NEW_MESSAGE": "Hantar pemberitahuan emel apabila mesej baru dibuat dalam perbualan yang disertai",
+ "SLA_MISSED_FIRST_RESPONSE": "Hantar pemberitahuan emel apabila perbualan terlepas SLA tindak balas pertama",
+ "SLA_MISSED_NEXT_RESPONSE": "Hantar notifikasi emel apabila perbualan terlepas SLA tindak balas seterusnya",
+ "SLA_MISSED_RESOLUTION": "Hantar notifikasi emel apabila perbualan terlepas SLA penyelesaian"
},
"NOTIFICATIONS": {
- "TITLE": "Notification preferences",
- "TYPE_TITLE": "Notification type",
- "EMAIL": "Email",
- "PUSH": "Push notification",
+ "TITLE": "Keutamaan notifikasi",
+ "TYPE_TITLE": "Jenis notifikasi",
+ "EMAIL": "Emel",
+ "PUSH": "Notifikasi tolak",
"TYPES": {
- "CONVERSATION_CREATED": "A new conversation is created",
- "CONVERSATION_ASSIGNED": "A conversation is assigned to you",
- "CONVERSATION_MENTION": "You are mentioned in a conversation",
- "ASSIGNED_CONVERSATION_NEW_MESSAGE": "A new message is created in an assigned conversation",
- "PARTICIPATING_CONVERSATION_NEW_MESSAGE": "A new message is created in a participating conversation",
- "SLA_MISSED_FIRST_RESPONSE": "A conversation misses first response SLA",
- "SLA_MISSED_NEXT_RESPONSE": "A conversation misses next response SLA",
- "SLA_MISSED_RESOLUTION": "A conversation misses resolution SLA"
+ "CONVERSATION_CREATED": "Perbualan baru telah dibuat",
+ "CONVERSATION_ASSIGNED": "Perbualan telah ditugaskan kepada anda",
+ "CONVERSATION_MENTION": "Anda disebut dalam perbualan",
+ "ASSIGNED_CONVERSATION_NEW_MESSAGE": "Mesej baru telah dibuat dalam perbualan yang ditugaskan",
+ "PARTICIPATING_CONVERSATION_NEW_MESSAGE": "Mesej baru telah dibuat dalam perbualan yang anda sertai",
+ "SLA_MISSED_FIRST_RESPONSE": "Perbualan terlepas SLA tindak balas pertama",
+ "SLA_MISSED_NEXT_RESPONSE": "Perbualan terlepas SLA tindak balas seterusnya",
+ "SLA_MISSED_RESOLUTION": "Perbualan terlepas SLA penyelesaian"
},
- "BROWSER_PERMISSION": "Enable push notifications for your browser so you’re able to receive them"
+ "BROWSER_PERMISSION": "Dayakan notifikasi tolak untuk pelayar anda supaya anda boleh menerimanya"
},
"API": {
- "UPDATE_SUCCESS": "Your notification preferences are updated successfully",
- "UPDATE_ERROR": "There is an error while updating the preferences, please try again"
+ "UPDATE_SUCCESS": "Keutamaan notifikasi anda berjaya dikemas kini",
+ "UPDATE_ERROR": "Terdapat ralat semasa mengemas kini keutamaan, sila cuba lagi"
},
"PUSH_NOTIFICATIONS_SECTION": {
- "TITLE": "Push Notifications",
- "NOTE": "Update your push notification preferences here",
- "CONVERSATION_ASSIGNMENT": "Send push notifications when a conversation is assigned to me",
- "CONVERSATION_CREATION": "Send push notifications when a new conversation is created",
- "CONVERSATION_MENTION": "Send push notifications when you are mentioned in a conversation",
- "ASSIGNED_CONVERSATION_NEW_MESSAGE": "Send push notifications when a new message is created in an assigned conversation",
- "PARTICIPATING_CONVERSATION_NEW_MESSAGE": "Send push notifications when a new message is created in a participating conversation",
- "HAS_ENABLED_PUSH": "You have enabled push for this browser.",
- "REQUEST_PUSH": "Enable push notifications",
- "SLA_MISSED_FIRST_RESPONSE": "Send push notifications when a conversation misses first response SLA",
- "SLA_MISSED_NEXT_RESPONSE": "Send push notifications when a conversation misses next response SLA",
- "SLA_MISSED_RESOLUTION": "Send push notifications when a conversation misses resolution SLA"
+ "TITLE": "Notifikasi Tolak",
+ "NOTE": "Kemas kini keutamaan notifikasi tolak anda di sini",
+ "CONVERSATION_ASSIGNMENT": "Hantar notifikasi tolak apabila perbualan ditugaskan kepada saya",
+ "CONVERSATION_CREATION": "Hantar pemberitahuan push apabila perbualan baru dibuat",
+ "CONVERSATION_MENTION": "Hantar pemberitahuan push apabila anda disebut dalam perbualan",
+ "ASSIGNED_CONVERSATION_NEW_MESSAGE": "Hantar pemberitahuan push apabila mesej baru dibuat dalam perbualan yang ditugaskan",
+ "PARTICIPATING_CONVERSATION_NEW_MESSAGE": "Hantar pemberitahuan push apabila mesej baru dibuat dalam perbualan yang disertai",
+ "HAS_ENABLED_PUSH": "Anda telah mengaktifkan push untuk pelayar ini.",
+ "REQUEST_PUSH": "Aktifkan pemberitahuan push",
+ "SLA_MISSED_FIRST_RESPONSE": "Hantar pemberitahuan push apabila perbualan terlepas SLA respons pertama",
+ "SLA_MISSED_NEXT_RESPONSE": "Hantar pemberitahuan push apabila perbualan terlepas SLA respons seterusnya",
+ "SLA_MISSED_RESOLUTION": "Hantar pemberitahuan push apabila perbualan terlepas SLA penyelesaian"
},
"PROFILE_IMAGE": {
- "LABEL": "Profile Image"
+ "LABEL": "Imej Profil"
},
"NAME": {
- "LABEL": "Your full name",
- "ERROR": "Please enter a valid full name",
- "PLACEHOLDER": "Please enter your full name"
+ "LABEL": "Nama penuh anda",
+ "ERROR": "Sila masukkan nama penuh yang sah",
+ "PLACEHOLDER": "Sila masukkan nama penuh anda"
},
"DISPLAY_NAME": {
- "LABEL": "Display name",
- "ERROR": "Please enter a valid display name",
- "PLACEHOLDER": "Please enter a display name, this would be displayed in conversations"
+ "LABEL": "Nama paparan",
+ "ERROR": "Sila masukkan nama paparan yang sah",
+ "PLACEHOLDER": "Sila masukkan nama paparan, ini akan dipaparkan dalam perbualan"
},
"AVAILABILITY": {
- "LABEL": "Availability",
+ "LABEL": "Ketersediaan",
"STATUS": {
- "ONLINE": "Online",
- "BUSY": "Busy",
- "OFFLINE": "Offline"
+ "ONLINE": "Dalam Talian",
+ "BUSY": "Bersibuk",
+ "OFFLINE": "Luar Talian"
},
- "SET_AVAILABILITY_SUCCESS": "Availability has been set successfully",
- "SET_AVAILABILITY_ERROR": "Couldn't set availability, please try again",
- "IMPERSONATING_ERROR": "Cannot change availability while impersonating a user"
+ "SET_AVAILABILITY_SUCCESS": "Ketersediaan telah ditetapkan dengan jayanya",
+ "SET_AVAILABILITY_ERROR": "Tidak dapat menetapkan ketersediaan, sila cuba lagi",
+ "IMPERSONATING_ERROR": "Tidak boleh menukar ketersediaan semasa menyamar sebagai pengguna"
},
"EMAIL": {
- "LABEL": "Your email address",
- "ERROR": "Please enter a valid email address",
- "PLACEHOLDER": "Please enter your email address, this would be displayed in conversations"
+ "LABEL": "Alamat emel anda",
+ "ERROR": "Sila masukkan alamat emel yang sah",
+ "PLACEHOLDER": "Sila masukkan alamat emel anda, ini akan dipaparkan dalam perbualan"
},
"CURRENT_PASSWORD": {
- "LABEL": "Current password",
- "ERROR": "Please enter the current password",
- "PLACEHOLDER": "Please enter the current password"
+ "LABEL": "Kata laluan semasa",
+ "ERROR": "Sila masukkan kata laluan semasa",
+ "PLACEHOLDER": "Sila masukkan kata laluan semasa"
},
"PASSWORD": {
- "LABEL": "New password",
- "ERROR": "Please enter a password of length 6 or more",
- "PLACEHOLDER": "Please enter a new password"
+ "LABEL": "Kata laluan baru",
+ "ERROR": "Sila masukkan kata laluan dengan panjang 6 atau lebih",
+ "PLACEHOLDER": "Sila masukkan kata laluan baru"
},
"PASSWORD_CONFIRMATION": {
- "LABEL": "Confirm new password",
- "ERROR": "Confirm password should match the password",
- "PLACEHOLDER": "Please re-enter your new password"
+ "LABEL": "Sahkan kata laluan baru",
+ "ERROR": "Sahkan kata laluan mesti sama dengan kata laluan",
+ "PLACEHOLDER": "Sila masukkan semula kata laluan baru anda"
}
}
},
"SIDEBAR_ITEMS": {
- "CHANGE_AVAILABILITY_STATUS": "Change",
- "CHANGE_ACCOUNTS": "Switch account",
- "SWITCH_ACCOUNT": "Switch account",
- "CONTACT_SUPPORT": "Contact support",
- "SELECTOR_SUBTITLE": "Select an account from the following list",
- "PROFILE_SETTINGS": "Profile settings",
- "YEAR_IN_REVIEW": "Year in Review",
- "KEYBOARD_SHORTCUTS": "Keyboard shortcuts",
- "APPEARANCE": "Change appearance",
- "SUPER_ADMIN_CONSOLE": "SuperAdmin console",
- "DOCS": "Read documentation",
+ "CHANGE_AVAILABILITY_STATUS": "Tukar",
+ "CHANGE_ACCOUNTS": "Tukar akaun",
+ "SWITCH_ACCOUNT": "Tukar akaun",
+ "CONTACT_SUPPORT": "Hubungi sokongan",
+ "SELECTOR_SUBTITLE": "Pilih akaun dari senarai berikut",
+ "PROFILE_SETTINGS": "Tetapan profil",
+ "YEAR_IN_REVIEW": "Tahun dalam Ulasan",
+ "KEYBOARD_SHORTCUTS": "Pintasan papan kekunci",
+ "APPEARANCE": "Tukar penampilan",
+ "SUPER_ADMIN_CONSOLE": "Konsol SuperAdmin",
+ "DOCS": "Baca dokumentasi",
"CHANGELOG": "Changelog",
- "LOGOUT": "Log out"
+ "LOGOUT": "Log keluar"
},
"APP_GLOBAL": {
- "TRIAL_MESSAGE": "days trial remaining.",
- "TRAIL_BUTTON": "Buy Now",
- "DELETED_USER": "Deleted User",
- "EMAIL_VERIFICATION_PENDING": "It seems that you haven't verified your email address yet. Please check your inbox for the verification email.",
- "RESEND_VERIFICATION_MAIL": "Resend verification email",
- "EMAIL_VERIFICATION_SENT": "Verification email has been sent. Please check your inbox.",
+ "TRIAL_MESSAGE": "hari percubaan tinggal.",
+ "TRAIL_BUTTON": "Beli Sekarang",
+ "DELETED_USER": "Pengguna Dipadam",
+ "EMAIL_VERIFICATION_PENDING": "Nampaknya anda belum mengesahkan alamat emel anda. Sila semak peti masuk anda untuk emel pengesahan.",
+ "RESEND_VERIFICATION_MAIL": "Hantar semula emel pengesahan",
+ "EMAIL_VERIFICATION_SENT": "Emel pengesahan telah dihantar. Sila semak peti masuk anda.",
"ACCOUNT_SUSPENDED": {
- "TITLE": "Account Suspended",
- "MESSAGE": "Your account is suspended. Please reach out to the support team for more information."
+ "TITLE": "Akaun Digantung",
+ "MESSAGE": "Akaun anda digantung. Sila hubungi pasukan sokongan untuk maklumat lanjut."
},
"NO_ACCOUNTS": {
- "TITLE": "No account found",
- "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.",
- "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.",
- "LOGOUT": "Log out"
+ "TITLE": "Tiada akaun ditemui",
+ "MESSAGE_CLOUD": "Anda tidak tergolong dalam mana-mana akaun sekarang. Jika anda rasa ini satu kesilapan, sila hubungi pasukan sokongan kami.",
+ "MESSAGE_SELF_HOSTED": "Anda tidak tergolong dalam mana-mana akaun sekarang. Sila hubungi pentadbir anda.",
+ "LOGOUT": "Log keluar"
}
},
"COMPONENTS": {
"CODE": {
- "BUTTON_TEXT": "Copy",
- "CODEPEN": "Open in CodePen",
+ "BUTTON_TEXT": "Salin",
+ "CODEPEN": "Buka di CodePen",
"COPY_SUCCESSFUL": "Code copied to clipboard successfully"
},
"SHOW_MORE_BLOCK": {
- "SHOW_MORE": "Show More",
- "SHOW_LESS": "Show Less"
+ "SHOW_MORE": "Tunjukkan Lagi",
+ "SHOW_LESS": "Tunjukkan Kurang"
},
"FILE_BUBBLE": {
- "DOWNLOAD": "Download",
- "UPLOADING": "Uploading...",
- "INSTAGRAM_STORY_UNAVAILABLE": "This story is no longer available.",
- "INSTAGRAM_STORY_REPLY": "Replied to your story:"
+ "DOWNLOAD": "Muat Turun",
+ "UPLOADING": "Memuat naik...",
+ "INSTAGRAM_STORY_UNAVAILABLE": "Cerita ini tidak lagi tersedia.",
+ "INSTAGRAM_STORY_REPLY": "Membalas cerita anda:"
},
"LOCATION_BUBBLE": {
- "SEE_ON_MAP": "See on map"
+ "SEE_ON_MAP": "Lihat pada peta"
},
"FORM_BUBBLE": {
- "SUBMIT": "Submit"
+ "SUBMIT": "Hantar"
},
"MEDIA": {
- "IMAGE_UNAVAILABLE": "This image is no longer available.",
- "LOADING_FAILED": "Loading failed"
+ "IMAGE_UNAVAILABLE": "Imej ini tidak lagi tersedia.",
+ "LOADING_FAILED": "Muat turun gagal"
}
},
- "CONFIRM_EMAIL": "Verifying...",
+ "CONFIRM_EMAIL": "Mengesahkan...",
"SETTINGS": {
"INBOXES": {
- "NEW_INBOX": "Add Inbox"
+ "NEW_INBOX": "Tambah Peti Masuk"
}
},
"SIDEBAR": {
- "NO_ITEMS": "No items",
- "CURRENTLY_VIEWING_ACCOUNT": "Currently viewing:",
- "SWITCH": "Switch",
- "INBOX_VIEW": "Inbox View",
- "CONVERSATIONS": "Conversations",
- "INBOX": "My Inbox",
- "ALL_CONVERSATIONS": "All Conversations",
- "MENTIONED_CONVERSATIONS": "Mentions",
- "PARTICIPATING_CONVERSATIONS": "Participating",
- "UNATTENDED_CONVERSATIONS": "Unattended",
- "REPORTS": "Reports",
- "SETTINGS": "Settings",
- "CONTACTS": "Contacts",
- "ACTIVE": "Active",
- "COMPANIES": "Companies",
- "ALL_COMPANIES": "All Companies",
+ "NO_ITEMS": "Tiada item",
+ "CURRENTLY_VIEWING_ACCOUNT": "Sedang melihat:",
+ "SWITCH": "Tukar",
+ "INBOX_VIEW": "Paparan Peti Masuk",
+ "CONVERSATIONS": "Perbualan",
+ "INBOX": "Peti Masuk Saya",
+ "ALL_CONVERSATIONS": "Semua Perbualan",
+ "MENTIONED_CONVERSATIONS": "Sebutan",
+ "PARTICIPATING_CONVERSATIONS": "Menyertai",
+ "UNATTENDED_CONVERSATIONS": "Tidak Dijaga",
+ "REPORTS": "Laporan",
+ "SETTINGS": "Tetapan",
+ "CONTACTS": "Kenalan",
+ "ACTIVE": "Aktif",
+ "COMPANIES": "Syarikat",
+ "ALL_COMPANIES": "Semua Syarikat",
"CAPTAIN": "Captain",
- "CAPTAIN_ASSISTANTS": "Assistants",
- "CAPTAIN_DOCUMENTS": "Documents",
- "CAPTAIN_RESPONSES": "FAQs",
- "CAPTAIN_TOOLS": "Tools",
- "CAPTAIN_SCENARIOS": "Scenarios",
- "CAPTAIN_PLAYGROUND": "Playground",
- "CAPTAIN_INBOXES": "Inboxes",
- "CAPTAIN_SETTINGS": "Settings",
- "HOME": "Home",
+ "CAPTAIN_ASSISTANTS": "Pembantu",
+ "CAPTAIN_DOCUMENTS": "Dokumen",
+ "CAPTAIN_RESPONSES": "Soalan Lazim",
+ "CAPTAIN_TOOLS": "Alat",
+ "CAPTAIN_SCENARIOS": "Senario",
+ "CAPTAIN_PLAYGROUND": "Padang Permainan",
+ "CAPTAIN_INBOXES": "Petak Masuk",
+ "CAPTAIN_SETTINGS": "Tetapan",
+ "HOME": "Laman Utama",
"AGENTS": "Ejen",
- "AGENT_BOTS": "Bots",
- "AUDIT_LOGS": "Audit Logs",
- "INBOXES": "Inboxes",
- "NOTIFICATIONS": "Notifications",
- "CANNED_RESPONSES": "Canned Responses",
- "INTEGRATIONS": "Integrations",
- "PROFILE_SETTINGS": "Profile Settings",
- "ACCOUNT_SETTINGS": "Account Settings",
- "APPLICATIONS": "Applications",
- "LABELS": "Labels",
- "CUSTOM_ATTRIBUTES": "Custom Attributes",
- "AUTOMATION": "Automation",
- "MACROS": "Macros",
- "TEAMS": "Teams",
- "BILLING": "Billing",
- "CUSTOM_VIEWS_FOLDER": "Folders",
- "CUSTOM_VIEWS_SEGMENTS": "Segments",
- "ALL_CONTACTS": "All Contacts",
- "TAGGED_WITH": "Tagged with",
- "NEW_LABEL": "New label",
- "NEW_TEAM": "New team",
- "NEW_INBOX": "New inbox",
- "REPORTS_CONVERSATION": "Conversations",
+ "AGENT_BOTS": "Bot",
+ "AUDIT_LOGS": "Log Audit",
+ "INBOXES": "Peti Masuk",
+ "NOTIFICATIONS": "Pemberitahuan",
+ "CANNED_RESPONSES": "Respons Sedia Ada",
+ "INTEGRATIONS": "Integrasi",
+ "PROFILE_SETTINGS": "Tetapan Profil",
+ "ACCOUNT_SETTINGS": "Tetapan Akaun",
+ "APPLICATIONS": "Aplikasi",
+ "LABELS": "Label",
+ "CUSTOM_ATTRIBUTES": "Atribut Tersuai",
+ "AUTOMATION": "Automasi",
+ "MACROS": "Makro",
+ "TEAMS": "Pasukan",
+ "BILLING": "Pengebilan",
+ "CUSTOM_VIEWS_FOLDER": "Folder",
+ "CUSTOM_VIEWS_SEGMENTS": "Segmen",
+ "ALL_CONTACTS": "Semua Kenalan",
+ "TAGGED_WITH": "Ditandai dengan",
+ "NEW_LABEL": "Label baru",
+ "NEW_TEAM": "Pasukan baru",
+ "NEW_INBOX": "Peti masuk baru",
+ "REPORTS_CONVERSATION": "Perbualan",
"CSAT": "CSAT",
- "LIVE_CHAT": "Live Chat",
+ "LIVE_CHAT": "Sembang Langsung",
"SMS": "SMS",
"WHATSAPP": "WhatsApp",
- "CAMPAIGNS": "Campaigns",
- "ONGOING": "Ongoing",
- "ONE_OFF": "One off",
+ "CAMPAIGNS": "Kempen",
+ "ONGOING": "Sedang Berlangsung",
+ "ONE_OFF": "Sekali sahaja",
"REPORTS_SLA": "SLA",
"REPORTS_BOT": "Bot",
"REPORTS_AGENT": "Ejen",
- "REPORTS_LABEL": "Labels",
- "REPORTS_INBOX": "Inbox",
- "REPORTS_TEAM": "Team",
- "AGENT_ASSIGNMENT": "Agent Assignment",
- "SET_AVAILABILITY_TITLE": "Set yourself as",
- "SET_YOUR_AVAILABILITY": "Set your availability",
+ "REPORTS_LABEL": "Label",
+ "REPORTS_INBOX": "Petibek",
+ "REPORTS_TEAM": "Pasukan",
+ "AGENT_ASSIGNMENT": "Penugasan Ejen",
+ "SET_AVAILABILITY_TITLE": "Tetapkan diri anda sebagai",
+ "SET_YOUR_AVAILABILITY": "Tetapkan ketersediaan anda",
"SLA": "SLA",
- "CUSTOM_ROLES": "Custom Roles",
+ "CUSTOM_ROLES": "Peranan Tersuai",
"BETA": "Beta",
- "REPORTS_OVERVIEW": "Overview",
+ "REPORTS_OVERVIEW": "Gambaran Keseluruhan",
"REAUTHORIZE": "Your inbox connection has expired, please reconnect\n to continue receiving and sending messages",
"HELP_CENTER": {
- "TITLE": "Help Center",
- "ARTICLES": "Articles",
- "CATEGORIES": "Categories",
- "LOCALES": "Locales",
- "SETTINGS": "Settings"
+ "TITLE": "Pusat Bantuan",
+ "ARTICLES": "Artikel",
+ "CATEGORIES": "Kategori",
+ "LOCALES": "Lokal",
+ "SETTINGS": "Tetapan"
},
- "CHANNELS": "Channels",
+ "CHANNELS": "Saluran",
"SET_AUTO_OFFLINE": {
- "TEXT": "Mark offline automatically",
- "INFO_TEXT": "Let the system automatically mark you offline when you aren't using the app or dashboard.",
- "INFO_SHORT": "Automatically mark offline when you aren't using the app."
+ "TEXT": "Tandakan luar talian secara automatik",
+ "INFO_TEXT": "Biarkan sistem menandakan anda luar talian secara automatik apabila anda tidak menggunakan aplikasi atau papan pemuka.",
+ "INFO_SHORT": "Tandakan luar talian secara automatik apabila anda tidak menggunakan aplikasi."
},
- "DOCS": "Read docs",
- "SECURITY": "Security",
+ "DOCS": "Baca dokumen",
+ "SECURITY": "Keselamatan",
"CAPTAIN_AI": "Captain",
- "CONVERSATION_WORKFLOW": "Conversation Workflow"
+ "CONVERSATION_WORKFLOW": "Aliran Kerja Perbualan"
},
"CAPTAIN_SETTINGS": {
- "TITLE": "Captain Settings",
- "DESCRIPTION": "Configure your AI models and features for Captain. Captain follows a credit based billing, you will be charged credits for every action Captain takes based on the model selected.",
- "LOADING": "Loading Captain configuration...",
- "LINK_TEXT": "Learn more about Captain Credits",
- "NOT_ENABLED": "Captain is not enabled for your account. Please upgrade your plan to access Captain features.",
+ "TITLE": "Tetapan Captain",
+ "DESCRIPTION": "Konfigurasikan model AI dan ciri untuk Captain anda. Captain menggunakan pengebilan berasaskan kredit, anda akan dikenakan kredit untuk setiap tindakan yang diambil Captain berdasarkan model yang dipilih.",
+ "LOADING": "Memuatkan konfigurasi Captain...",
+ "LINK_TEXT": "Ketahui lebih lanjut tentang Kredit Captain",
+ "NOT_ENABLED": "Captain tidak diaktifkan untuk akaun anda. Sila naik taraf pelan anda untuk mengakses ciri Captain.",
"MODEL_CONFIG": {
- "TITLE": "Model Configuration",
- "DESCRIPTION": "Select AI models for different features.",
- "SELECT_MODEL": "Select model",
+ "TITLE": "Konfigurasi Model",
+ "DESCRIPTION": "Pilih model AI untuk ciri yang berbeza.",
+ "SELECT_MODEL": "Pilih model",
"CREDITS_PER_MESSAGE": "{credits} credit/message",
- "COMING_SOON": "Coming soon",
+ "COMING_SOON": "Akan datang",
"EDITOR": {
- "TITLE": "Editor Features",
- "DESCRIPTION": "Powers smart compose, grammar corrections, tone adjustments, and content enhancement in your message editor."
+ "TITLE": "Ciri Penyunting",
+ "DESCRIPTION": "Menguatkuasakan penulisan pintar, pembetulan tatabahasa, pelarasan nada, dan penambahbaikan kandungan dalam penyunting mesej anda."
},
"ASSISTANT": {
- "TITLE": "Assistant",
- "DESCRIPTION": "Handles automated responses, conversation summaries, and intelligent reply suggestions for customer interactions."
+ "TITLE": "Pembantu",
+ "DESCRIPTION": "Mengendalikan respons automatik, ringkasan perbualan, dan cadangan balasan pintar untuk interaksi pelanggan."
},
"COPILOT": {
"TITLE": "Co-pilot",
- "DESCRIPTION": "Provides real-time contextual suggestions, knowledge base recommendations, and proactive insights during conversations."
+ "DESCRIPTION": "Menyediakan cadangan kontekstual masa nyata, saranan pangkalan pengetahuan, dan pandangan proaktif semasa perbualan."
}
},
"FEATURES": {
- "TITLE": "Features",
- "DESCRIPTION": "Enable or disable AI-powered features.",
+ "TITLE": "Ciri-ciri",
+ "DESCRIPTION": "Dayakan atau nyahdayakan ciri yang dikuasakan AI.",
"AUDIO_TRANSCRIPTION": {
- "TITLE": "Audio Transcription",
- "DESCRIPTION": "Automatically convert voice messages and call recordings into searchable text transcripts."
+ "TITLE": "Transkripsi Audio",
+ "DESCRIPTION": "Secara automatik menukar mesej suara dan rakaman panggilan kepada transkrip teks yang boleh dicari."
},
"HELP_CENTER_SEARCH": {
- "TITLE": "Help Center Search Indexing",
- "DESCRIPTION": "Use AI for context aware search inside your help center articles."
+ "TITLE": "Pengindeksan Carian Pusat Bantuan",
+ "DESCRIPTION": "Gunakan AI untuk carian yang peka konteks dalam artikel pusat bantuan anda."
},
"LABEL_SUGGESTION": {
- "TITLE": "Label Suggestion",
- "DESCRIPTION": "Automatically suggest relevant labels and tags for conversations based on content analysis and context.",
- "MODEL_TITLE": "Label Suggestion Model",
- "MODEL_DESCRIPTION": "Select the AI model to use for analyzing conversations and suggesting appropriate labels"
+ "TITLE": "Cadangan Label",
+ "DESCRIPTION": "Secara automatik mencadangkan label dan tag yang relevan untuk perbualan berdasarkan analisis kandungan dan konteks.",
+ "MODEL_TITLE": "Model Cadangan Label",
+ "MODEL_DESCRIPTION": "Pilih model AI untuk menganalisis perbualan dan mencadangkan label yang sesuai"
}
},
"API": {
- "SUCCESS": "Captain settings updated successfully.",
- "ERROR": "Failed to update Captain settings. Please try again."
+ "SUCCESS": "Tetapan Captain berjaya dikemas kini.",
+ "ERROR": "Gagal mengemas kini tetapan Captain. Sila cuba lagi."
}
},
"BILLING_SETTINGS": {
- "TITLE": "Billing",
- "DESCRIPTION": "Manage your subscription here, upgrade your plan and get more for your team.",
+ "TITLE": "Pengebilan",
+ "DESCRIPTION": "Urus langganan anda di sini, naik taraf pelan anda dan dapatkan lebih untuk pasukan anda.",
"CURRENT_PLAN": {
- "TITLE": "Current Plan",
+ "TITLE": "Pelan Semasa",
"PLAN_NOTE": "You are currently subscribed to the **{plan}** plan with **{quantity}** licenses",
- "SEAT_COUNT": "Number of seats",
- "RENEWS_ON": "Renews on"
+ "SEAT_COUNT": "Bilangan tempat duduk",
+ "RENEWS_ON": "Diperbaharui pada"
},
- "VIEW_PRICING": "View Pricing",
+ "VIEW_PRICING": "Lihat Harga",
"MANAGE_SUBSCRIPTION": {
- "TITLE": "Manage your subscription",
- "DESCRIPTION": "View your previous invoices, edit your billing details, or cancel your subscription.",
- "BUTTON_TXT": "Go to the billing portal"
+ "TITLE": "Urus langganan anda",
+ "DESCRIPTION": "Lihat invois anda sebelum ini, sunting butiran bil anda, atau batalkan langganan anda.",
+ "BUTTON_TXT": "Pergi ke portal bil"
},
"CAPTAIN": {
"TITLE": "Captain",
- "DESCRIPTION": "Manage usage and credits for Captain AI.",
- "BUTTON_TXT": "Buy more credits",
- "DOCUMENTS": "Documents",
+ "DESCRIPTION": "Urus penggunaan dan kredit untuk Captain AI.",
+ "BUTTON_TXT": "Beli lebih banyak kredit",
+ "DOCUMENTS": "Dokumen",
"RESPONSES": "Responses",
- "UPGRADE": "Captain is not available on the free plan, upgrade now to get access to assistants, copilot and more.",
- "REFRESH_CREDITS": "Refresh"
+ "UPGRADE": "Captain tidak tersedia dalam pelan percuma, naik taraf sekarang untuk mendapatkan akses kepada pembantu, copilot dan lain-lain.",
+ "REFRESH_CREDITS": "Segarkan"
},
"CHAT_WITH_US": {
- "TITLE": "Need help?",
- "DESCRIPTION": "Do you face any issues in billing? We are here to help.",
- "BUTTON_TXT": "Chat with us"
+ "TITLE": "Perlukan bantuan?",
+ "DESCRIPTION": "Adakah anda menghadapi sebarang masalah dalam pengebilan? Kami sedia membantu.",
+ "BUTTON_TXT": "Bual dengan kami"
},
- "NO_BILLING_USER": "Your billing account is being configured. Please refresh the page and try again.",
+ "NO_BILLING_USER": "Akaun pengebilan anda sedang dikonfigurasikan. Sila segarkan halaman dan cuba lagi.",
"TOPUP": {
- "BUY_CREDITS": "Buy more credits",
- "MODAL_TITLE": "Buy AI Credits",
- "MODAL_DESCRIPTION": "Purchase additional credits for Captain AI.",
+ "BUY_CREDITS": "Beli lebih banyak kredit",
+ "MODAL_TITLE": "Beli Kredit AI",
+ "MODAL_DESCRIPTION": "Beli kredit tambahan untuk Captain AI.",
"CREDITS": "CREDITS",
- "ONE_TIME": "one-time",
- "POPULAR": "Most Popular",
- "NOTE_TITLE": "Note:",
- "NOTE_DESCRIPTION": "Credits are added immediately and expire in 6 months. An active subscription is required to use credits. Purchased credits are consumed after your monthly plan credits.",
+ "ONE_TIME": "sekali sahaja",
+ "POPULAR": "Paling Popular",
+ "NOTE_TITLE": "Nota:",
+ "NOTE_DESCRIPTION": "Kredit ditambah serta-merta dan tamat tempoh dalam 6 bulan. Langganan aktif diperlukan untuk menggunakan kredit. Kredit yang dibeli akan digunakan selepas kredit pelan bulanan anda.",
"CANCEL": "Batalkan",
- "PURCHASE": "Purchase Credits",
- "LOADING": "Loading options...",
- "FETCH_ERROR": "Failed to load credit options. Please try again.",
- "PURCHASE_ERROR": "Failed to process purchase. Please try again.",
+ "PURCHASE": "Beli Kredit",
+ "LOADING": "Memuatkan pilihan...",
+ "FETCH_ERROR": "Gagal memuatkan pilihan kredit. Sila cuba lagi.",
+ "PURCHASE_ERROR": "Gagal memproses pembelian. Sila cuba lagi.",
"PURCHASE_SUCCESS": "Successfully added {credits} credits to your account",
"CONFIRM": {
- "TITLE": "Confirm Purchase",
+ "TITLE": "Sahkan Pembelian",
"DESCRIPTION": "You are about to purchase {credits} credits for {amount}.",
- "INSTANT_DEDUCTION_NOTE": "Your saved card will be charged immediately upon confirmation.",
- "GO_BACK": "Go Back",
- "CONFIRM_PURCHASE": "Confirm Purchase"
+ "INSTANT_DEDUCTION_NOTE": "Kad yang disimpan akan dikenakan caj serta-merta selepas pengesahan.",
+ "GO_BACK": "Kembali",
+ "CONFIRM_PURCHASE": "Sahkan Pembelian"
}
}
},
"SECURITY_SETTINGS": {
- "TITLE": "Security",
- "DESCRIPTION": "Manage your account security settings.",
- "LINK_TEXT": "Learn more about SAML SSO",
- "SAML_DISABLED_MESSAGE": "SAML SSO is currently disabled. Please contact your administrator to enable this feature.",
+ "TITLE": "Keselamatan",
+ "DESCRIPTION": "Urus tetapan keselamatan akaun anda.",
+ "LINK_TEXT": "Ketahui lebih lanjut tentang SAML SSO",
+ "SAML_DISABLED_MESSAGE": "SAML SSO kini dinyahaktifkan. Sila hubungi pentadbir anda untuk mengaktifkan ciri ini.",
"SAML": {
"TITLE": "SAML SSO",
- "NOTE": "Configure SAML single sign-on for your account. Users will authenticate through your identity provider instead of using email/password.",
+ "NOTE": "Konfigurasikan log masuk tunggal SAML untuk akaun anda. Pengguna akan mengesahkan identiti melalui penyedia identiti anda dan bukannya menggunakan emel/kata laluan.",
"ACS_URL": {
"LABEL": "ACS URL",
- "TOOLTIP": "Assertion Consumer Service URL - Configure this URL in your IdP as the destination for SAML responses"
+ "TOOLTIP": "URL Perkhidmatan Pengguna Pengesahan - Konfigurasikan URL ini dalam IdP anda sebagai destinasi untuk respons SAML"
},
"SSO_URL": {
"LABEL": "SSO URL",
- "HELP": "The URL where SAML authentication requests will be sent",
+ "HELP": "URL di mana permintaan pengesahan SAML akan dihantar",
"PLACEHOLDER": "https://your-idp.com/saml/sso"
},
"CERTIFICATE": {
- "LABEL": "Signing certificate in PEM format",
- "HELP": "The public certificate from your identity provider used to verify SAML responses",
+ "LABEL": "Sijil tandatangan dalam format PEM",
+ "HELP": "Sijil awam dari penyedia identiti anda yang digunakan untuk mengesahkan respons SAML",
"PLACEHOLDER": "-----BEGIN CERTIFICATE-----\nMIIC..."
},
"FINGERPRINT": {
- "LABEL": "Fingerprint",
- "TOOLTIP": "SHA-1 fingerprint of the certificate - Use this to verify the certificate in your IdP configuration"
+ "LABEL": "Cap jari",
+ "TOOLTIP": "Cap jari SHA-1 sijil - Gunakan ini untuk mengesahkan sijil dalam konfigurasi IdP anda"
},
"COPY_SUCCESS": "Code copied to clipboard successfully",
"SP_ENTITY_ID": {
"LABEL": "SP Entity ID",
- "HELP": "Unique identifier for this application as a service provider (auto-generated).",
- "TOOLTIP": "Unique identifier for Chatwoot as the Service Provider - Configure this in your IdP settings"
+ "HELP": "Pengecam unik untuk aplikasi ini sebagai penyedia perkhidmatan (auto-dihasilkan).",
+ "TOOLTIP": "Pengecam unik untuk Chatwoot sebagai Penyedia Perkhidmatan - Konfigurasikan ini dalam tetapan IdP anda"
},
"IDP_ENTITY_ID": {
- "LABEL": "Identity Provider Entity ID",
- "HELP": "Unique identifier for your identity provider (usually found in IdP configuration)",
+ "LABEL": "ID Entiti Penyedia Identiti",
+ "HELP": "Pengenal unik untuk penyedia identiti anda (biasanya ditemui dalam konfigurasi IdP)",
"PLACEHOLDER": "https://your-idp.com/saml"
},
- "UPDATE_BUTTON": "Update SAML Settings",
+ "UPDATE_BUTTON": "Kemas kini Tetapan SAML",
"API": {
- "SUCCESS": "SAML settings updated successfully",
- "ERROR": "Failed to update SAML settings",
- "ERROR_LOADING": "Failed to load SAML settings",
- "DISABLED": "SAML settings disabled successfully"
+ "SUCCESS": "Tetapan SAML berjaya dikemas kini",
+ "ERROR": "Gagal mengemas kini tetapan SAML",
+ "ERROR_LOADING": "Gagal memuatkan tetapan SAML",
+ "DISABLED": "Tetapan SAML berjaya dinyahaktifkan"
},
"VALIDATION": {
- "REQUIRED_FIELDS": "SSO URL, Identity Provider Entity ID, and Certificate are required fields",
- "SSO_URL_ERROR": "Please enter a valid SSO URL",
- "CERTIFICATE_ERROR": "Certificate is required",
- "IDP_ENTITY_ID_ERROR": "Identity Provider Entity ID is required"
+ "REQUIRED_FIELDS": "URL SSO, ID Entiti Penyedia Identiti, dan Sijil adalah medan wajib",
+ "SSO_URL_ERROR": "Sila masukkan URL SSO yang sah",
+ "CERTIFICATE_ERROR": "Sijil diperlukan",
+ "IDP_ENTITY_ID_ERROR": "ID Entiti Penyedia Identiti diperlukan"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "The SAML SSO feature is only available in the Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade to an Enterprise plan to access SAML single sign-on and other advanced security features.",
- "ASK_ADMIN": "Please reach out to your administrator for the upgrade."
+ "AVAILABLE_ON": "Ciri SAML SSO hanya tersedia dalam pelan Enterprise.",
+ "UPGRADE_PROMPT": "Tingkatkan ke pelan Enterprise untuk mengakses SAML single sign-on dan ciri keselamatan lanjutan lain.",
+ "ASK_ADMIN": "Sila hubungi pentadbir anda untuk peningkatan."
},
"PAYWALL": {
- "TITLE": "Upgrade to enable SAML SSO",
- "AVAILABLE_ON": "The SAML SSO feature is only available in the Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to SAML single sign-on and other advanced features.",
- "UPGRADE_NOW": "Upgrade now",
- "CANCEL_ANYTIME": "You can change or cancel your plan anytime"
+ "TITLE": "Tingkatkan untuk mengaktifkan SAML SSO",
+ "AVAILABLE_ON": "Ciri SAML SSO hanya tersedia dalam pelan Enterprise.",
+ "UPGRADE_PROMPT": "Tingkatkan pelan anda untuk mendapatkan akses kepada SAML single sign-on dan ciri lanjutan lain.",
+ "UPGRADE_NOW": "Tingkatkan sekarang",
+ "CANCEL_ANYTIME": "Anda boleh menukar atau membatalkan pelan anda bila-bila masa"
},
"ATTRIBUTE_MAPPING": {
- "TITLE": "SAML Attribute Setup",
- "DESCRIPTION": "The following attribute mappings must be configured in your identity provider"
+ "TITLE": "Tetapan Atribut SAML",
+ "DESCRIPTION": "Pemetaan atribut berikut mesti dikonfigurasikan dalam penyedia identiti anda"
},
"INFO_SECTION": {
- "TITLE": "Service Provider Information",
- "TOOLTIP": "Copy these values and configure them in your Identity Provider to establish the SAML connection"
+ "TITLE": "Maklumat Penyedia Perkhidmatan",
+ "TOOLTIP": "Salin nilai ini dan konfigurasikan dalam Penyedia Identiti anda untuk mewujudkan sambungan SAML"
}
}
},
"CONVERSATION_WORKFLOW": {
"INDEX": {
"HEADER": {
- "TITLE": "Conversation Workflows",
- "DESCRIPTION": "Configure rules and required fields for conversation resolution."
+ "TITLE": "Aliran Kerja Perbualan",
+ "DESCRIPTION": "Konfigurasikan peraturan dan medan yang diperlukan untuk penyelesaian perbualan."
}
},
"REQUIRED_ATTRIBUTES": {
- "TITLE": "Attributes required on resolution",
- "DESCRIPTION": "When resolving a conversation, agents will be prompted to fill these attributes if they haven't yet.",
- "NO_ATTRIBUTES": "No attributes added yet",
+ "TITLE": "Atribut yang diperlukan semasa penyelesaian",
+ "DESCRIPTION": "Apabila menyelesaikan perbualan, ejen akan diminta untuk mengisi atribut ini jika belum diisi.",
+ "NO_ATTRIBUTES": "Tiada atribut ditambah lagi",
"ADD": {
- "TITLE": "Add Attributes",
- "SEARCH_PLACEHOLDER": "Search attributes"
+ "TITLE": "Tambah Atribut",
+ "SEARCH_PLACEHOLDER": "Cari atribut"
},
"SAVE": {
- "SUCCESS": "Required attributes updated",
- "ERROR": "Could not update required attributes, please try again"
+ "SUCCESS": "Atribut yang diperlukan telah dikemas kini",
+ "ERROR": "Tidak dapat mengemas kini atribut yang diperlukan, sila cuba lagi"
},
"MODAL": {
- "TITLE": "Resolve conversation",
- "DESCRIPTION": "Please fill in the following custom attributes before resolving this conversation",
+ "TITLE": "Selesaikan perbualan",
+ "DESCRIPTION": "Sila isi atribut tersuai berikut sebelum menyelesaikan perbualan ini",
"ACTIONS": {
- "RESOLVE": "Resolve conversation",
+ "RESOLVE": "Selesaikan perbualan",
"CANCEL": "Batalkan"
},
"PLACEHOLDERS": {
- "TEXT": "Write a note...",
- "NUMBER": "Enter a number",
- "LINK": "Add a link",
- "DATE": "Pick a date",
- "LIST": "Select an option"
+ "TEXT": "Tulis nota...",
+ "NUMBER": "Masukkan nombor",
+ "LINK": "Tambah pautan",
+ "DATE": "Pilih tarikh",
+ "LIST": "Pilih pilihan"
},
"CHECKBOX": {
- "YES": "Yes",
- "NO": "No"
+ "YES": "Ya",
+ "NO": "Tidak"
}
},
"PAYWALL": {
- "TITLE": "Upgrade to use required attributes",
- "AVAILABLE_ON": "The required conversation attributes feature is available on the Business and Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to prompt agents to fill required attributes before conversation resolution.",
- "UPGRADE_NOW": "Upgrade now",
- "CANCEL_ANYTIME": "You can change or cancel your plan anytime"
+ "TITLE": "Tingkatkan untuk menggunakan atribut wajib",
+ "AVAILABLE_ON": "Ciri atribut perbualan wajib tersedia pada pelan Perniagaan dan Perusahaan.",
+ "UPGRADE_PROMPT": "Tingkatkan pelan anda untuk menggesa ejen mengisi atribut wajib sebelum penyelesaian perbualan.",
+ "UPGRADE_NOW": "Tingkatkan sekarang",
+ "CANCEL_ANYTIME": "Anda boleh menukar atau membatalkan pelan anda bila-bila masa"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "The required conversation attributes feature is available on the paid plans.",
- "UPGRADE_PROMPT": "Upgrade to a paid plan to enforce required attributes before conversation resolution.",
- "ASK_ADMIN": "Please reach out to your administrator for the upgrade."
+ "AVAILABLE_ON": "Ciri atribut perbualan wajib tersedia pada pelan berbayar.",
+ "UPGRADE_PROMPT": "Tingkatkan ke pelan berbayar untuk menguatkuasakan atribut wajib sebelum penyelesaian perbualan.",
+ "ASK_ADMIN": "Sila hubungi pentadbir anda untuk peningkatan."
}
}
},
"CREATE_ACCOUNT": {
- "NO_ACCOUNT_WARNING": "Uh oh! We could not find any Chatwoot accounts. Please create a new account to continue.",
- "NEW_ACCOUNT": "New Account",
- "SELECTOR_SUBTITLE": "Create a new account",
+ "NO_ACCOUNT_WARNING": "Uh oh! Kami tidak dapat menemui sebarang akaun Chatwoot. Sila buat akaun baru untuk meneruskan.",
+ "NEW_ACCOUNT": "Akaun Baru",
+ "SELECTOR_SUBTITLE": "Buat akaun baru",
"API": {
- "SUCCESS_MESSAGE": "Account created successfully",
- "EXIST_MESSAGE": "Account already exists",
+ "SUCCESS_MESSAGE": "Akaun berjaya dibuat",
+ "EXIST_MESSAGE": "Akaun sudah wujud",
"ERROR_MESSAGE": "Masalah untuk hubungi Woot Server, Sila cuba sebentar lagi"
},
"FORM": {
"NAME": {
- "LABEL": "Company Name",
+ "LABEL": "Nama Syarikat",
"PLACEHOLDER": "Wayne Enterprises"
},
- "SUBMIT": "Submit",
+ "SUBMIT": "Hantar",
"CANCEL": "Batalkan"
}
},
"KEYBOARD_SHORTCUTS": {
- "TOGGLE_MODAL": "View all shortcuts",
+ "TOGGLE_MODAL": "Lihat semua pintasan",
"TITLE": {
- "OPEN_CONVERSATION": "Open conversation",
- "RESOLVE_AND_NEXT": "Resolve and move to next",
- "NAVIGATE_DROPDOWN": "Navigate dropdown items",
- "RESOLVE_CONVERSATION": "Resolve Conversation",
- "GO_TO_CONVERSATION_DASHBOARD": "Go to Conversation Dashboard",
- "ADD_ATTACHMENT": "Add Attachment",
- "GO_TO_CONTACTS_DASHBOARD": "Go to Contacts Dashboard",
- "TOGGLE_SIDEBAR": "Toggle Sidebar",
- "GO_TO_REPORTS_SIDEBAR": "Go to Reports sidebar",
- "MOVE_TO_NEXT_TAB": "Move to next tab in conversation list",
- "GO_TO_SETTINGS": "Go to Settings",
- "SWITCH_TO_PRIVATE_NOTE": "Switch to Private Note",
- "SWITCH_TO_REPLY": "Switch to Reply",
- "TOGGLE_SNOOZE_DROPDOWN": "Toggle snooze dropdown"
+ "OPEN_CONVERSATION": "Buka perbualan",
+ "RESOLVE_AND_NEXT": "Selesaikan dan terus ke seterusnya",
+ "NAVIGATE_DROPDOWN": "Navigasi item dropdown",
+ "RESOLVE_CONVERSATION": "Selesaikan Perbualan",
+ "GO_TO_CONVERSATION_DASHBOARD": "Pergi ke Papan Pemuka Perbualan",
+ "ADD_ATTACHMENT": "Tambah Lampiran",
+ "GO_TO_CONTACTS_DASHBOARD": "Pergi ke Papan Pemuka Kenalan",
+ "TOGGLE_SIDEBAR": "Togol Bar Sisi",
+ "GO_TO_REPORTS_SIDEBAR": "Pergi ke bar sisi Laporan",
+ "MOVE_TO_NEXT_TAB": "Berpindah ke tab seterusnya dalam senarai perbualan",
+ "GO_TO_SETTINGS": "Pergi ke Tetapan",
+ "SWITCH_TO_PRIVATE_NOTE": "Beralih ke Nota Peribadi",
+ "SWITCH_TO_REPLY": "Beralih ke Balasan",
+ "TOGGLE_SNOOZE_DROPDOWN": "Togol menu lungsur snooze"
}
},
"ASSIGNMENT_POLICY": {
"INDEX": {
"HEADER": {
- "TITLE": "Agent assignment",
- "DESCRIPTION": "Define policies to effectively manage workload and route conversations based on the needs of inboxes and agents. Learn more here"
+ "TITLE": "Penugasan ejen",
+ "DESCRIPTION": "Tentukan polisi untuk menguruskan beban kerja dengan berkesan dan menghala perbualan berdasarkan keperluan peti masuk dan ejen. Ketahui lebih lanjut di sini"
},
"ASSIGNMENT_POLICY": {
- "TITLE": "Assignment policy",
- "DESCRIPTION": "Manage how conversations get assigned in inboxes.",
+ "TITLE": "Polisi penugasan",
+ "DESCRIPTION": "Urus cara perbualan ditugaskan dalam peti masuk.",
"FEATURES": [
- "Assign by conversations evenly or by available capacity",
- "Add fair distribution rules to avoid overloading any agent",
- "Add inboxes to a policy - one policy per inbox"
+ "Tugaskan mengikut perbualan secara seimbang atau mengikut kapasiti tersedia",
+ "Tambah peraturan pengagihan adil untuk mengelakkan beban berlebihan pada mana-mana ejen",
+ "Tambah peti masuk ke dalam polisi - satu polisi bagi setiap peti masuk"
]
},
"AGENT_CAPACITY_POLICY": {
- "TITLE": "Agent capacity policy",
- "DESCRIPTION": "Manage workload for agents.",
+ "TITLE": "Polisi kapasiti ejen",
+ "DESCRIPTION": "Urus beban kerja untuk ejen.",
"FEATURES": [
- "Define maximum conversations per inbox",
- "Create exceptions based on labels and time",
- "Add agents to a policy - one policy per agent"
+ "Tentukan maksimum perbualan setiap peti masuk",
+ "Buat pengecualian berdasarkan label dan masa",
+ "Tambah ejen ke polisi - satu polisi setiap ejen"
]
}
},
"AGENT_ASSIGNMENT_POLICY": {
"INDEX": {
"HEADER": {
- "TITLE": "Assignment policy",
- "CREATE_POLICY": "New policy"
+ "TITLE": "Polisi penugasan",
+ "CREATE_POLICY": "Polisi baru"
},
"CARD": {
- "ORDER": "Order",
- "PRIORITY": "Priority",
- "ACTIVE": "Active",
- "INACTIVE": "Inactive",
- "POPOVER": "Added inboxes",
- "EDIT": "Edit"
+ "ORDER": "Susunan",
+ "PRIORITY": "Keutamaan",
+ "ACTIVE": "Aktif",
+ "INACTIVE": "Tidak aktif",
+ "POPOVER": "Peti masuk yang ditambah",
+ "EDIT": "Sunting"
},
- "NO_RECORDS_FOUND": "No assignment policies found"
+ "NO_RECORDS_FOUND": "Tiada polisi penugasan ditemui"
},
"CREATE": {
"HEADER": {
- "TITLE": "Create assignment policy"
+ "TITLE": "Buat polisi penugasan"
},
- "CREATE_BUTTON": "Create policy",
+ "CREATE_BUTTON": "Buat polisi",
"API": {
- "SUCCESS_MESSAGE": "Assignment policy created successfully",
- "ERROR_MESSAGE": "Failed to create assignment policy",
- "INBOX_LINKED": "Inbox has been linked to the policy"
+ "SUCCESS_MESSAGE": "Polisi penugasan berjaya dibuat",
+ "ERROR_MESSAGE": "Gagal membuat polisi penugasan",
+ "INBOX_LINKED": "Peti masuk telah dipautkan ke polisi"
}
},
"EDIT": {
"HEADER": {
- "TITLE": "Edit assignment policy"
+ "TITLE": "Sunting polisi penugasan"
},
- "EDIT_BUTTON": "Update policy",
+ "EDIT_BUTTON": "Kemas kini polisi",
"CONFIRM_ADD_INBOX_DIALOG": {
- "TITLE": "Add inbox",
+ "TITLE": "Tambah peti masuk",
"DESCRIPTION": "{inboxName} inbox is already linked to another policy. Are you sure you want to link it to this policy? It will be unlinked from the other policy.",
- "CONFIRM_BUTTON_LABEL": "Continue",
+ "CONFIRM_BUTTON_LABEL": "Teruskan",
"CANCEL_BUTTON_LABEL": "Batalkan"
},
"INBOX_LINK_PROMPT": {
- "TITLE": "Link inbox to policy",
- "DESCRIPTION": "Would you like to link this inbox to the assignment policy?",
- "LINK_BUTTON": "Link inbox",
- "CANCEL_BUTTON": "Skip"
+ "TITLE": "Pautkan peti masuk ke polisi",
+ "DESCRIPTION": "Adakah anda ingin pautkan peti masuk ini ke polisi tugasan?",
+ "LINK_BUTTON": "Pautkan peti masuk",
+ "CANCEL_BUTTON": "Langkau"
},
"API": {
- "SUCCESS_MESSAGE": "Assignment policy updated successfully",
- "ERROR_MESSAGE": "Failed to update assignment policy"
+ "SUCCESS_MESSAGE": "Polisi tugasan berjaya dikemas kini",
+ "ERROR_MESSAGE": "Gagal mengemas kini polisi tugasan"
},
"INBOX_API": {
"ADD": {
- "SUCCESS_MESSAGE": "Inbox added to policy successfully",
- "ERROR_MESSAGE": "Failed to add inbox to policy"
+ "SUCCESS_MESSAGE": "Peti masuk berjaya ditambah ke polisi",
+ "ERROR_MESSAGE": "Gagal menambah peti masuk ke polisi"
},
"REMOVE": {
- "SUCCESS_MESSAGE": "Inbox removed from policy successfully",
- "ERROR_MESSAGE": "Failed to remove inbox from policy"
+ "SUCCESS_MESSAGE": "Peti masuk berjaya dikeluarkan dari polisi",
+ "ERROR_MESSAGE": "Gagal mengeluarkan peti masuk dari polisi"
}
}
},
"FORM": {
"NAME": {
- "LABEL": "Policy name:",
- "PLACEHOLDER": "Enter policy name"
+ "LABEL": "Nama polisi:",
+ "PLACEHOLDER": "Masukkan nama polisi"
},
"DESCRIPTION": {
- "LABEL": "Description:",
- "PLACEHOLDER": "Enter description"
+ "LABEL": "Penerangan:",
+ "PLACEHOLDER": "Masukkan penerangan"
},
"STATUS": {
"LABEL": "Status:",
- "PLACEHOLDER": "Select status",
- "ACTIVE": "Policy is active",
- "INACTIVE": "Policy is inactive"
+ "PLACEHOLDER": "Pilih status",
+ "ACTIVE": "Polisi aktif",
+ "INACTIVE": "Polisi tidak aktif"
},
"ASSIGNMENT_ORDER": {
- "LABEL": "Assignment order",
+ "LABEL": "Susunan tugasan",
"ROUND_ROBIN": {
"LABEL": "Round robin",
- "DESCRIPTION": "Assign conversations evenly among agents."
+ "DESCRIPTION": "Agihkan perbualan secara sama rata antara ejen."
},
"BALANCED": {
- "LABEL": "Balanced",
- "DESCRIPTION": "Assign conversations based on available capacity.",
- "PREMIUM_MESSAGE": "Upgrade to access balanced assignment and agent capacity management.",
+ "LABEL": "Seimbang",
+ "DESCRIPTION": "Agihkan perbualan berdasarkan kapasiti yang tersedia.",
+ "PREMIUM_MESSAGE": "Tingkatkan untuk mengakses pengagihan seimbang dan pengurusan kapasiti ejen.",
"PREMIUM_BADGE": "Premium"
}
},
"ASSIGNMENT_PRIORITY": {
- "LABEL": "Assignment priority",
+ "LABEL": "Keutamaan penugasan",
"EARLIEST_CREATED": {
- "LABEL": "Earliest created",
- "DESCRIPTION": "The conversation that was created first gets assigned first."
+ "LABEL": "Dicipta paling awal",
+ "DESCRIPTION": "Perbualan yang dicipta terlebih dahulu akan diberikan tugasan terlebih dahulu."
},
"LONGEST_WAITING": {
- "LABEL": "Longest waiting",
- "DESCRIPTION": "The conversation waiting the longest gets assigned first."
+ "LABEL": "Menunggu paling lama",
+ "DESCRIPTION": "Perbualan yang menunggu paling lama akan diberikan tugasan terlebih dahulu."
}
},
"FAIR_DISTRIBUTION": {
- "LABEL": "Fair distribution policy",
- "DESCRIPTION": "Set the maximum number of conversations that can be assigned per agent within a time window to avoid overloading any one agent. This required field defaults to 100 conversations per hour.",
- "INPUT_MAX": "Assign max",
- "DURATION": "Conversations per agent in every"
+ "LABEL": "Polisi pengagihan adil",
+ "DESCRIPTION": "Tetapkan bilangan maksimum perbualan yang boleh diberikan kepada setiap ejen dalam jangka masa tertentu untuk mengelakkan beban berlebihan pada mana-mana ejen. Medan wajib ini ditetapkan secara lalai kepada 100 perbualan setiap jam.",
+ "INPUT_MAX": "Agihkan maksima",
+ "DURATION": "Perbualan setiap ejen dalam setiap"
},
"INBOXES": {
- "LABEL": "Added inboxes",
- "DESCRIPTION": "Add inboxes for which this policy will be applicable.",
- "ADD_BUTTON": "Add inbox",
+ "LABEL": "Petibuk yang ditambah",
+ "DESCRIPTION": "Tambah petibuk yang mana polisi ini akan digunakan.",
+ "ADD_BUTTON": "Tambah petibuk",
"DROPDOWN": {
- "SEARCH_PLACEHOLDER": "Search and select inboxes to add",
- "ADD_BUTTON": "Add"
+ "SEARCH_PLACEHOLDER": "Cari dan pilih petibuk untuk ditambah",
+ "ADD_BUTTON": "Tambah"
},
- "EMPTY_STATE": "No inboxes added to this policy, add an inbox to get started",
+ "EMPTY_STATE": "Tiada peti masuk ditambah ke dasar ini, tambah peti masuk untuk memulakan",
"API": {
- "SUCCESS_MESSAGE": "Inbox successfully added to policy",
- "ERROR_MESSAGE": "Failed to add inbox to policy"
+ "SUCCESS_MESSAGE": "Peti masuk berjaya ditambah ke dasar",
+ "ERROR_MESSAGE": "Gagal menambah peti masuk ke dasar"
}
}
},
"DELETE_POLICY": {
- "SUCCESS_MESSAGE": "Assignment policy deleted successfully",
- "ERROR_MESSAGE": "Failed to delete assignment policy"
+ "SUCCESS_MESSAGE": "Dasar penugasan berjaya dipadam",
+ "ERROR_MESSAGE": "Gagal memadam dasar penugasan"
}
},
"AGENT_CAPACITY_POLICY": {
"INDEX": {
"HEADER": {
- "TITLE": "Agent capacity",
- "CREATE_POLICY": "New policy"
+ "TITLE": "Kapasiti ejen",
+ "CREATE_POLICY": "Dasar baru"
},
"CARD": {
- "POPOVER": "Added agents",
- "EDIT": "Edit"
+ "POPOVER": "Ejen yang ditambah",
+ "EDIT": "Sunting"
},
- "NO_RECORDS_FOUND": "No agent capacity policies found"
+ "NO_RECORDS_FOUND": "Tiada dasar kapasiti ejen ditemui"
},
"CREATE": {
"HEADER": {
- "TITLE": "Create agent capacity policy"
+ "TITLE": "Cipta dasar kapasiti ejen"
},
- "CREATE_BUTTON": "Create policy",
+ "CREATE_BUTTON": "Cipta dasar",
"API": {
- "SUCCESS_MESSAGE": "Agent capacity policy created successfully",
- "ERROR_MESSAGE": "Failed to create agent capacity policy"
+ "SUCCESS_MESSAGE": "Dasar kapasiti ejen berjaya dicipta",
+ "ERROR_MESSAGE": "Gagal mencipta dasar kapasiti ejen"
}
},
"EDIT": {
"HEADER": {
- "TITLE": "Edit agent capacity policy"
+ "TITLE": "Sunting dasar kapasiti ejen"
},
- "EDIT_BUTTON": "Update policy",
+ "EDIT_BUTTON": "Kemas kini dasar",
"CONFIRM_ADD_AGENT_DIALOG": {
- "TITLE": "Add agent",
+ "TITLE": "Tambah ejen",
"DESCRIPTION": "{agentName} is already linked to another policy. Are you sure you want to link it to this policy? It will be unlinked from the other policy.",
- "CONFIRM_BUTTON_LABEL": "Continue",
+ "CONFIRM_BUTTON_LABEL": "Teruskan",
"CANCEL_BUTTON_LABEL": "Batalkan"
},
"API": {
- "SUCCESS_MESSAGE": "Agent capacity policy updated successfully",
- "ERROR_MESSAGE": "Failed to update agent capacity policy"
+ "SUCCESS_MESSAGE": "Dasar kapasiti ejen berjaya dikemas kini",
+ "ERROR_MESSAGE": "Gagal mengemas kini dasar kapasiti ejen"
},
"AGENT_API": {
"ADD": {
- "SUCCESS_MESSAGE": "Agent added to policy successfully",
- "ERROR_MESSAGE": "Failed to add agent to policy"
+ "SUCCESS_MESSAGE": "Ejen berjaya ditambah ke polisi",
+ "ERROR_MESSAGE": "Gagal menambah ejen ke polisi"
},
"REMOVE": {
- "SUCCESS_MESSAGE": "Agent removed from policy successfully",
- "ERROR_MESSAGE": "Failed to remove agent from policy"
+ "SUCCESS_MESSAGE": "Ejen berjaya dikeluarkan dari polisi",
+ "ERROR_MESSAGE": "Gagal mengeluarkan ejen dari polisi"
}
},
"INBOX_LIMIT_API": {
"ADD": {
- "SUCCESS_MESSAGE": "Inbox limit added successfully",
- "ERROR_MESSAGE": "Failed to add inbox limit"
+ "SUCCESS_MESSAGE": "Had peti masuk berjaya ditambah",
+ "ERROR_MESSAGE": "Gagal menambah had peti masuk"
},
"UPDATE": {
- "SUCCESS_MESSAGE": "Inbox limit updated successfully",
- "ERROR_MESSAGE": "Failed to update inbox limit"
+ "SUCCESS_MESSAGE": "Had peti masuk berjaya dikemas kini",
+ "ERROR_MESSAGE": "Gagal mengemas kini had peti masuk"
},
"DELETE": {
- "SUCCESS_MESSAGE": "Inbox limit deleted successfully",
- "ERROR_MESSAGE": "Failed to delete inbox limit"
+ "SUCCESS_MESSAGE": "Had peti masuk berjaya dipadam",
+ "ERROR_MESSAGE": "Gagal memadam had peti masuk"
}
}
},
"FORM": {
"NAME": {
- "LABEL": "Policy name:",
- "PLACEHOLDER": "Enter policy name"
+ "LABEL": "Nama polisi:",
+ "PLACEHOLDER": "Masukkan nama polisi"
},
"DESCRIPTION": {
- "LABEL": "Description:",
- "PLACEHOLDER": "Enter description"
+ "LABEL": "Penerangan:",
+ "PLACEHOLDER": "Masukkan penerangan"
},
"INBOX_CAPACITY_LIMIT": {
- "LABEL": "Inbox capacity limits",
- "ADD_BUTTON": "Add inbox",
+ "LABEL": "Had kapasiti peti masuk",
+ "ADD_BUTTON": "Tambah peti masuk",
"FIELD": {
- "SELECT_INBOX": "Select inbox",
- "MAX_CONVERSATIONS": "Max conversations",
- "SET_LIMIT": "Set limit"
+ "SELECT_INBOX": "Pilih peti masuk",
+ "MAX_CONVERSATIONS": "Perbualan maksimum",
+ "SET_LIMIT": "Tetapkan had"
},
- "EMPTY_STATE": "No inbox limit set"
+ "EMPTY_STATE": "Tiada had peti masuk ditetapkan"
},
"EXCLUSION_RULES": {
- "LABEL": "Exclusion rules",
- "DESCRIPTION": "Conversations that satisfy the following conditions would not count towards agent capacity",
+ "LABEL": "Peraturan pengecualian",
+ "DESCRIPTION": "Perbualan yang memenuhi syarat berikut tidak akan dikira dalam kapasiti ejen",
"TAGS": {
- "LABEL": "Exclude conversations tagged with specific labels",
- "ADD_TAG": "add tag",
+ "LABEL": "Kecualikan perbualan yang ditandai dengan label tertentu",
+ "ADD_TAG": "tambah tag",
"DROPDOWN": {
- "SEARCH_PLACEHOLDER": "Search and select tags to add"
+ "SEARCH_PLACEHOLDER": "Cari dan pilih tag untuk ditambah"
},
- "EMPTY_STATE": "No tags added to this policy."
+ "EMPTY_STATE": "Tiada tag ditambah pada polisi ini."
},
"DURATION": {
- "LABEL": "Exclude conversations older than a specified duration",
- "PLACEHOLDER": "Set time"
+ "LABEL": "Kecualikan perbualan yang lebih lama daripada tempoh yang ditetapkan",
+ "PLACEHOLDER": "Tetapkan masa"
}
},
"USERS": {
- "LABEL": "Assigned agents",
- "DESCRIPTION": "Add agents for which this policy will be applicable.",
- "ADD_BUTTON": "Add agent",
+ "LABEL": "Ejen yang ditugaskan",
+ "DESCRIPTION": "Tambah ejen yang polisi ini akan digunakan.",
+ "ADD_BUTTON": "Tambah ejen",
"DROPDOWN": {
- "SEARCH_PLACEHOLDER": "Search and select agents to add",
- "ADD_BUTTON": "Add"
+ "SEARCH_PLACEHOLDER": "Cari dan pilih ejen untuk ditambah",
+ "ADD_BUTTON": "Tambah"
},
- "EMPTY_STATE": "No agents added",
+ "EMPTY_STATE": "Tiada ejen ditambah",
"API": {
- "SUCCESS_MESSAGE": "Agent successfully added to policy",
- "ERROR_MESSAGE": "Failed to add agent to policy"
+ "SUCCESS_MESSAGE": "Ejen berjaya ditambah ke polisi",
+ "ERROR_MESSAGE": "Gagal menambah ejen ke polisi"
}
}
},
"DELETE_POLICY": {
- "SUCCESS_MESSAGE": "Agent capacity policy deleted successfully",
- "ERROR_MESSAGE": "Failed to delete agent capacity policy"
+ "SUCCESS_MESSAGE": "Polisi kapasiti ejen berjaya dipadam",
+ "ERROR_MESSAGE": "Gagal memadam polisi kapasiti ejen"
}
},
"DELETE_POLICY": {
- "TITLE": "Delete policy",
- "DESCRIPTION": "Are you sure you want to delete this policy? This action cannot be undone.",
+ "TITLE": "Padam polisi",
+ "DESCRIPTION": "Adakah anda pasti mahu memadam polisi ini? Tindakan ini tidak boleh dibatalkan.",
"CONFIRM_BUTTON_LABEL": "Padamkan",
"CANCEL_BUTTON_LABEL": "Batalkan"
}
diff --git a/app/javascript/dashboard/i18n/locale/ne/agentMgmt.json b/app/javascript/dashboard/i18n/locale/ne/agentMgmt.json
index 4b66fe864..24cd59e37 100644
--- a/app/javascript/dashboard/i18n/locale/ne/agentMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ne/agentMgmt.json
@@ -1,8 +1,8 @@
{
"AGENT_MGMT": {
- "HEADER": "Agents",
- "HEADER_BTN_TXT": "Add Agent",
- "LOADING": "Fetching Agent List",
+ "HEADER": "एजेन्टहरू",
+ "HEADER_BTN_TXT": "एजेन्ट थप गर्नुहोस्",
+ "LOADING": "एजेन्ट सूची ल्याउँदैछ",
"DESCRIPTION": "An agent is a member of your customer support team who can view and respond to user messages. The list below shows all the agents in your account.",
"LEARN_MORE": "Learn about user roles",
"AGENT_TYPES": {
diff --git a/app/javascript/dashboard/i18n/locale/ne/contact.json b/app/javascript/dashboard/i18n/locale/ne/contact.json
index 481951353..e3a3bf445 100644
--- a/app/javascript/dashboard/i18n/locale/ne/contact.json
+++ b/app/javascript/dashboard/i18n/locale/ne/contact.json
@@ -2,14 +2,14 @@
"CONTACT_PANEL": {
"NOT_AVAILABLE": "उपलब्ध छैन",
"EMAIL_ADDRESS": "इमेल ठेगाना",
- "PHONE_NUMBER": "Phone number",
- "IDENTIFIER": "Identifier",
- "COPY_SUCCESSFUL": "Copied to clipboard successfully",
+ "PHONE_NUMBER": "फोन नम्बर",
+ "IDENTIFIER": "पहिचानकर्ता",
+ "COPY_SUCCESSFUL": "क्लिपबोर्डमा सफलतापूर्वक प्रतिलिपि गरियो",
"COMPANY": "कम्पनी",
"LOCATION": "स्थान",
"BROWSER_LANGUAGE": "ब्राउजर भाषा",
"CONVERSATION_TITLE": "संवाद विवरण",
- "VIEW_PROFILE": "View Profile",
+ "VIEW_PROFILE": "प्रोफाइल हेर्नुहोस्",
"BROWSER": "ब्राउजर",
"OS": "अपरेटिङ सिस्टम",
"INITIATED_FROM": "बाट सुरु गरिएको",
@@ -17,11 +17,11 @@
"IP_ADDRESS": "IP ठेगाना",
"CREATED_AT_LABEL": "सिर्जना गरिएको",
"NEW_MESSAGE": "नयाँ सन्देश",
- "CALL": "Call",
+ "CALL": "कल गर्नुहोस्",
"CALL_INITIATED": "सम्पर्कलाई कल गर्दै…",
"CALL_FAILED": "फोन कल सुरु गर्न सकिएन। कृपया फेरि प्रयास गर्नुहोस्।",
"VOICE_INBOX_PICKER": {
- "TITLE": "Choose a voice inbox"
+ "TITLE": "भ्वाइस इन्बक्स छान्नुहोस्"
},
"CONVERSATIONS": {
"NO_RECORDS_FOUND": "यस सम्पर्कसँग सम्बन्धित कुनै अघिल्लो कुराकानीहरू छैनन्।",
@@ -29,133 +29,133 @@
},
"LABELS": {
"CONTACT": {
- "TITLE": "Contact Labels",
- "ERROR": "Couldn't update labels"
+ "TITLE": "सम्पर्क लेबलहरू",
+ "ERROR": "लेबलहरू अपडेट गर्न सकिएन"
},
"CONVERSATION": {
- "TITLE": "Conversation Labels",
- "ADD_BUTTON": "Add Labels"
+ "TITLE": "संवाद लेबलहरू",
+ "ADD_BUTTON": "लेबलहरू थप्नुहोस्"
},
"LABEL_SELECT": {
- "TITLE": "Add Labels",
- "PLACEHOLDER": "Search labels",
+ "TITLE": "लेबलहरू थप्नुहोस्",
+ "PLACEHOLDER": "लेबलहरू खोज्नुहोस्",
"NO_RESULT": "कुनै लेबल फेला परेन",
- "CREATE_LABEL": "Create new label"
+ "CREATE_LABEL": "नयाँ लेबल सिर्जना गर्नुहोस्"
}
},
- "MERGE_CONTACT": "Merge contact",
- "CONTACT_ACTIONS": "Contact actions",
- "MUTE_CONTACT": "Block Contact",
- "UNMUTE_CONTACT": "Unblock Contact",
+ "MERGE_CONTACT": "सम्पर्क मर्ज गर्नुहोस्",
+ "CONTACT_ACTIONS": "सम्पर्क कार्यहरू",
+ "MUTE_CONTACT": "सम्पर्क ब्लक गर्नुहोस्",
+ "UNMUTE_CONTACT": "सम्पर्क अनब्लक गर्नुहोस्",
"MUTED_SUCCESS": "यो सम्पर्क सफलतापूर्वक ब्लक गरियो। तपाईंलाई भविष्यका कुनै पनि कुराकानीको सूचना दिइने छैन।",
"UNMUTED_SUCCESS": "यो सम्पर्क सफलतापूर्वक अनब्लक गरियो।",
- "SEND_TRANSCRIPT": "Send Transcript",
- "EDIT_LABEL": "Edit",
+ "SEND_TRANSCRIPT": "प्रतिलिपि पठाउनुहोस्",
+ "EDIT_LABEL": "सम्पादन गर्नुहोस्",
"SIDEBAR_SECTIONS": {
"CUSTOM_ATTRIBUTES": "अनुकूलित विशेषताहरू",
- "CONTACT_LABELS": "Contact Labels",
+ "CONTACT_LABELS": "सम्पर्क लेबलहरू",
"PREVIOUS_CONVERSATIONS": "अघिल्लो कुराकानीहरू",
"NO_RECORDS_FOUND": "कुनै विशेषता फेला परेन"
}
},
"EDIT_CONTACT": {
- "BUTTON_LABEL": "Edit Contact",
- "TITLE": "Edit contact",
- "DESC": "Edit contact details"
+ "BUTTON_LABEL": "सम्पर्क सम्पादन गर्नुहोस्",
+ "TITLE": "सम्पर्क सम्पादन गर्नुहोस्",
+ "DESC": "सम्पर्क विवरण सम्पादन गर्नुहोस्"
},
"DELETE_CONTACT": {
- "BUTTON_LABEL": "Delete Contact",
- "TITLE": "Delete contact",
- "DESC": "Delete contact details",
+ "BUTTON_LABEL": "सम्पर्क मेटाउनुहोस्",
+ "TITLE": "सम्पर्क मेटाउनुहोस्",
+ "DESC": "सम्पर्क विवरण मेटाउनुहोस्",
"CONFIRM": {
- "TITLE": "Confirm Deletion",
+ "TITLE": "मेटाउने पुष्टि गर्नुहोस्",
"MESSAGE": "के तपाईं यो मेटाउन निश्चित हुनुहुन्छ ",
- "YES": "Yes, Delete",
- "NO": "No, Keep"
+ "YES": "हो, मेटाउनुहोस्",
+ "NO": "होइन, राख्नुहोस्"
},
"API": {
- "SUCCESS_MESSAGE": "Contact deleted successfully",
+ "SUCCESS_MESSAGE": "सम्पर्क सफलतापूर्वक मेटाइयो",
"ERROR_MESSAGE": "सम्पर्क मेटाउन सकिएन। कृपया पछि फेरि प्रयास गर्नुहोस्।"
}
},
"CONTACT_FORM": {
"FORM": {
"SUBMIT": "बुझाउनुहोस्",
- "CANCEL": "Cancel",
+ "CANCEL": "रद्द गर्नुहोस्",
"AVATAR": {
"LABEL": "सम्पर्क अवतार"
},
"NAME": {
- "PLACEHOLDER": "Enter the full name of the contact",
+ "PLACEHOLDER": "सम्पर्कको पूरा नाम प्रविष्ट गर्नुहोस्",
"LABEL": "पूरा नाम"
},
"BIO": {
- "PLACEHOLDER": "Enter the bio of the contact",
+ "PLACEHOLDER": "सम्पर्कको बायो प्रविष्ट गर्नुहोस्",
"LABEL": "परिचय"
},
"EMAIL_ADDRESS": {
- "PLACEHOLDER": "Enter the email address of the contact",
+ "PLACEHOLDER": "सम्पर्कको इमेल ठेगाना प्रविष्ट गर्नुहोस्",
"LABEL": "इमेल ठेगाना",
"DUPLICATE": "यो इमेल ठेगाना अर्को सम्पर्कका लागि प्रयोग भइरहेको छ।",
"ERROR": "कृपया मान्य इमेल ठेगाना प्रविष्ट गर्नुहोस्।"
},
"PHONE_NUMBER": {
- "PLACEHOLDER": "Enter the phone number of the contact",
- "LABEL": "Phone Number",
+ "PLACEHOLDER": "सम्पर्कको फोन नम्बर प्रविष्ट गर्नुहोस्",
+ "LABEL": "फोन नम्बर",
"HELP": "Phone number should be of E.164 format eg: +1415555555 [+][country code][area code][local phone number]",
"ERROR": "फोन नम्बर खाली वा E.164 ढाँचामा हुनुपर्छ",
- "DIAL_CODE_ERROR": "Please select a dial code from the list",
+ "DIAL_CODE_ERROR": "कृपया सूचीबाट डायल कोड चयन गर्नुहोस्",
"DUPLICATE": "यो फोन नम्बर अर्को सम्पर्कका लागि प्रयोग भइरहेको छ।"
},
"LOCATION": {
- "PLACEHOLDER": "Enter the location of the contact",
+ "PLACEHOLDER": "सम्पर्कको स्थान प्रविष्ट गर्नुहोस्",
"LABEL": "स्थान"
},
"COMPANY_NAME": {
- "PLACEHOLDER": "Enter the company name",
+ "PLACEHOLDER": "कम्पनीको नाम प्रविष्ट गर्नुहोस्",
"LABEL": "कम्पनी नाम"
},
"COUNTRY": {
- "PLACEHOLDER": "Enter the country name",
+ "PLACEHOLDER": "देशको नाम प्रविष्ट गर्नुहोस्",
"LABEL": "देशको नाम",
- "SELECT_PLACEHOLDER": "Select",
+ "SELECT_PLACEHOLDER": "छान्नुहोस्",
"REMOVE": "हटाउनुहोस्",
- "SELECT_COUNTRY": "Select Country"
+ "SELECT_COUNTRY": "देश छान्नुहोस्"
},
"CITY": {
- "PLACEHOLDER": "Enter the city name",
- "LABEL": "City Name"
+ "PLACEHOLDER": "सहरको नाम लेख्नुहोस्",
+ "LABEL": "सहरको नाम"
},
"SOCIAL_PROFILES": {
"FACEBOOK": {
- "PLACEHOLDER": "Enter the Facebook username",
+ "PLACEHOLDER": "Facebook प्रयोगकर्ता नाम लेख्नुहोस्",
"LABEL": "Facebook"
},
"TWITTER": {
- "PLACEHOLDER": "Enter the Twitter username",
+ "PLACEHOLDER": "Twitter प्रयोगकर्ता नाम लेख्नुहोस्",
"LABEL": "Twitter"
},
"LINKEDIN": {
- "PLACEHOLDER": "Enter the LinkedIn username",
+ "PLACEHOLDER": "LinkedIn प्रयोगकर्ता नाम लेख्नुहोस्",
"LABEL": "LinkedIn"
},
"GITHUB": {
- "PLACEHOLDER": "Enter the Github username",
+ "PLACEHOLDER": "Github प्रयोगकर्ता नाम लेख्नुहोस्",
"LABEL": "Github"
}
}
},
"DELETE_AVATAR": {
"API": {
- "SUCCESS_MESSAGE": "Contact avatar deleted successfully",
+ "SUCCESS_MESSAGE": "सम्पर्क अवतार सफलतापूर्वक मेटाइयो",
"ERROR_MESSAGE": "सम्पर्कको अवतार मेटाउन सकिएन। कृपया पछि फेरि प्रयास गर्नुहोस्।"
}
},
- "SUCCESS_MESSAGE": "Contact saved successfully",
- "ERROR_MESSAGE": "There was an error, please try again"
+ "SUCCESS_MESSAGE": "सम्पर्क सफलतापूर्वक सुरक्षित गरियो",
+ "ERROR_MESSAGE": "त्रुटि भयो, कृपया फेरि प्रयास गर्नुहोस्"
},
"NEW_CONVERSATION": {
- "BUTTON_LABEL": "Start conversation",
+ "BUTTON_LABEL": "संवाद सुरु गर्नुहोस्",
"TITLE": "नयाँ संवाद",
"DESC": "नयाँ सन्देश पठाएर नयाँ कुराकानी सुरु गर्नुहोस्।",
"NO_INBOX": "यस सम्पर्कसँग नयाँ कुराकानी सुरु गर्न इनबक्स फेला परेन।",
@@ -165,8 +165,8 @@
},
"INBOX": {
"LABEL": "Inbox",
- "PLACEHOLDER": "Choose source inbox",
- "ERROR": "Select an inbox"
+ "PLACEHOLDER": "स्रोत इनबक्स छान्नुहोस्",
+ "ERROR": "इनबक्स छान्नुहोस्"
},
"SUBJECT": {
"LABEL": "विषय",
@@ -175,18 +175,18 @@
},
"MESSAGE": {
"LABEL": "सन्देश",
- "PLACEHOLDER": "Write your message here",
+ "PLACEHOLDER": "यहाँ तपाईंको सन्देश लेख्नुहोस्",
"ERROR": "सन्देश खाली हुन सक्दैन"
},
"ATTACHMENTS": {
- "SELECT": "Choose files",
- "HELP_TEXT": "Drag and drop files here or choose files to attach"
+ "SELECT": "फाइलहरू छान्नुहोस्",
+ "HELP_TEXT": "यहाँ फाइलहरू तान्नुहोस् वा संलग्न गर्न फाइलहरू छान्नुहोस्"
},
- "SUBMIT": "Send message",
- "CANCEL": "Cancel",
+ "SUBMIT": "सन्देश पठाउनुहोस्",
+ "CANCEL": "रद्द गर्नुहोस्",
"SUCCESS_MESSAGE": "सन्देश पठाइयो!",
"GO_TO_CONVERSATION": "हेर्नुहोस्",
- "ERROR_MESSAGE": "Couldn't send! try again"
+ "ERROR_MESSAGE": "पठाउन सकिएन! कृपया फेरि प्रयास गर्नुहोस्"
}
},
"CONTACTS_PAGE": {
@@ -197,25 +197,25 @@
}
},
"CUSTOM_ATTRIBUTES": {
- "BUTTON": "Add custom attribute",
- "COPY_SUCCESSFUL": "Copied to clipboard successfully",
- "SHOW_MORE": "Show all attributes",
- "SHOW_LESS": "Show less attributes",
+ "BUTTON": "अनुकूलित विशेषता थप्नुहोस्",
+ "COPY_SUCCESSFUL": "क्लिपबोर्डमा सफलतापूर्वक प्रतिलिपि गरियो",
+ "SHOW_MORE": "सबै विशेषताहरू देखाउनुहोस्",
+ "SHOW_LESS": "कम विशेषताहरू देखाउनुहोस्",
"ACTIONS": {
- "COPY": "Copy attribute",
- "DELETE": "Delete attribute",
- "EDIT": "Edit attribute"
+ "COPY": "विशेषता प्रतिलिपि गर्नुहोस्",
+ "DELETE": "विशेषता मेटाउनुहोस्",
+ "EDIT": "विशेषता सम्पादन गर्नुहोस्"
},
"ADD": {
- "TITLE": "Create custom attribute",
+ "TITLE": "अनुकूलित विशेषता सिर्जना गर्नुहोस्",
"DESC": "यस सम्पर्कमा कस्टम जानकारी थप्नुहोस्।"
},
"FORM": {
- "CREATE": "Add attribute",
- "CANCEL": "Cancel",
+ "CREATE": "विशेषता थप्नुहोस्",
+ "CANCEL": "रद्द गर्नुहोस्",
"NAME": {
"LABEL": "अनुकूलित गुण नाम",
- "PLACEHOLDER": "Eg: shopify id",
+ "PLACEHOLDER": "जस्तै: shopify id",
"ERROR": "अवैध अनुकूलित गुण नाम"
},
"VALUE": {
@@ -223,27 +223,27 @@
"PLACEHOLDER": "जस्तै: 11901 "
},
"ADD": {
- "TITLE": "Create new attribute ",
- "SUCCESS": "Attribute added successfully",
- "ERROR": "Unable to add attribute. Please try again later"
+ "TITLE": "नयाँ विशेषता सिर्जना गर्नुहोस्",
+ "SUCCESS": "विशेषता सफलतापूर्वक थपियो",
+ "ERROR": "विशेषता थप्न सकिएन। कृपया पछि पुन: प्रयास गर्नुहोस्"
},
"UPDATE": {
- "SUCCESS": "Attribute updated successfully",
- "ERROR": "Unable to update attribute. Please try again later"
+ "SUCCESS": "विशेषता सफलतापूर्वक अपडेट गरियो",
+ "ERROR": "विशेषता अपडेट गर्न सकिएन। कृपया पछि पुन: प्रयास गर्नुहोस्"
},
"DELETE": {
- "SUCCESS": "Attribute deleted successfully",
- "ERROR": "Unable to delete attribute. Please try again later"
+ "SUCCESS": "विशेषता सफलतापूर्वक मेटाइयो",
+ "ERROR": "विशेषता मेटाउन सकिएन। कृपया पछि पुन: प्रयास गर्नुहोस्"
},
"ATTRIBUTE_SELECT": {
- "TITLE": "Add attributes",
- "PLACEHOLDER": "Search attributes",
+ "TITLE": "विशेषताहरू थप्नुहोस्",
+ "PLACEHOLDER": "विशेषताहरू खोज्नुहोस्",
"NO_RESULT": "कुनै गुण फेला परेन"
},
"ATTRIBUTE_TYPE": {
"LIST": {
- "PLACEHOLDER": "Select value",
- "SEARCH_INPUT_PLACEHOLDER": "Search value",
+ "PLACEHOLDER": "मान चयन गर्नुहोस्",
+ "SEARCH_INPUT_PLACEHOLDER": "मान खोज्नुहोस्",
"NO_RESULT": "कुनै परिणाम फेला परेन"
}
}
@@ -255,16 +255,16 @@
}
},
"MERGE_CONTACTS": {
- "TITLE": "Merge contacts",
+ "TITLE": "सम्पर्कहरू मर्ज गर्नुहोस्",
"DESCRIPTION": "Merge contacts to combine two profiles into one, including all attributes and conversations. In case of conflict, the Primary contact’ s attributes will take precedence.",
"PRIMARY": {
"TITLE": "प्राथमिक सम्पर्क",
- "HELP_LABEL": "To be deleted"
+ "HELP_LABEL": "मेटाउनुपर्ने"
},
"PARENT": {
- "TITLE": "Contact to merge",
- "PLACEHOLDER": "Search for a contact",
- "HELP_LABEL": "To be kept"
+ "TITLE": "मर्ज गर्नुपर्ने सम्पर्क",
+ "PLACEHOLDER": "सम्पर्क खोज्नुहोस्",
+ "HELP_LABEL": "राख्नुपर्ने"
},
"SUMMARY": {
"TITLE": "सारांश",
@@ -275,13 +275,13 @@
"ERROR_MESSAGE": "केही समस्या भयो। कृपया पछि फेरि प्रयास गर्नुहोस्।"
},
"FORM": {
- "SUBMIT": " Merge contacts",
- "CANCEL": "Cancel",
+ "SUBMIT": "सम्पर्कहरू मर्ज गर्नुहोस्",
+ "CANCEL": "रद्द गर्नुहोस्",
"CHILD_CONTACT": {
"ERROR": "मर्ज गर्नका लागि चाइल्ड सम्पर्क छान्नुहोस्"
},
- "SUCCESS_MESSAGE": "Contact merged successfully",
- "ERROR_MESSAGE": "Could not merge contacts, try again!"
+ "SUCCESS_MESSAGE": "सम्पर्क सफलतापूर्वक मर्ज गरियो",
+ "ERROR_MESSAGE": "सम्पर्कहरू मर्ज गर्न सकिएन, पुन: प्रयास गर्नुहोस्!"
},
"DROPDOWN_ITEM": {
"ID": "(पहिचान: {identifier})"
@@ -290,56 +290,56 @@
"CONTACTS_LAYOUT": {
"HEADER": {
"TITLE": "सम्पर्कहरू",
- "SEARCH_TITLE": "Search contacts",
- "ACTIVE_TITLE": "Active contacts",
- "SEARCH_PLACEHOLDER": "Search...",
+ "SEARCH_TITLE": "सम्पर्कहरू खोज्नुहोस्",
+ "ACTIVE_TITLE": "सक्रिय सम्पर्कहरू",
+ "SEARCH_PLACEHOLDER": "खोज्नुहोस्...",
"MESSAGE_BUTTON": "सन्देश",
- "SEND_MESSAGE": "Send message",
- "BLOCK_CONTACT": "Block contact",
- "UNBLOCK_CONTACT": "Unblock contact",
+ "SEND_MESSAGE": "सन्देश पठाउनुहोस्",
+ "BLOCK_CONTACT": "सम्पर्क ब्लक गर्नुहोस्",
+ "UNBLOCK_CONTACT": "सम्पर्क अनब्लक गर्नुहोस्",
"BREADCRUMB": {
"CONTACTS": "सम्पर्कहरू"
},
"ACTIONS": {
"CONTACT_CREATION": {
- "ADD_CONTACT": "Add contact",
- "EXPORT_CONTACT": "Export contacts",
- "IMPORT_CONTACT": "Import contacts",
- "SAVE_CONTACT": "Save contact",
+ "ADD_CONTACT": "सम्पर्क थप्नुहोस्",
+ "EXPORT_CONTACT": "सम्पर्कहरू निर्यात गर्नुहोस्",
+ "IMPORT_CONTACT": "सम्पर्कहरू आयात गर्नुहोस्",
+ "SAVE_CONTACT": "सम्पर्क सुरक्षित गर्नुहोस्",
"EMAIL_ADDRESS_DUPLICATE": "यो इमेल ठेगाना अर्को सम्पर्कका लागि प्रयोग भइरहेको छ।",
"PHONE_NUMBER_DUPLICATE": "यो फोन नम्बर अर्को सम्पर्कका लागि प्रयोग भइरहेको छ।",
- "SUCCESS_MESSAGE": "Contact saved successfully",
+ "SUCCESS_MESSAGE": "सम्पर्क सफलतापूर्वक सुरक्षित गरियो",
"ERROR_MESSAGE": "सम्पर्क बचत गर्न सकिएन। कृपया पछि फेरि प्रयास गर्नुहोस्।"
},
- "BLOCK_SUCCESS_MESSAGE": "This contact is blocked successfully",
+ "BLOCK_SUCCESS_MESSAGE": "यो सम्पर्क सफलतापूर्वक ब्लक गरियो",
"BLOCK_ERROR_MESSAGE": "सम्पर्क ब्लक गर्न सकिएन। कृपया पछि फेरि प्रयास गर्नुहोस्।",
- "UNBLOCK_SUCCESS_MESSAGE": "This contact is unblocked successfully",
+ "UNBLOCK_SUCCESS_MESSAGE": "यो सम्पर्क सफलतापूर्वक अनब्लक गरियो",
"UNBLOCK_ERROR_MESSAGE": "सम्पर्क अनब्लक गर्न सकिएन। कृपया पछि फेरि प्रयास गर्नुहोस्।",
"IMPORT_CONTACT": {
- "TITLE": "Import contacts",
+ "TITLE": "सम्पर्कहरू आयात गर्नुहोस्",
"DESCRIPTION": "CSV फाइल मार्फत सम्पर्कहरू आयात गर्नुहोस्।",
"DOWNLOAD_LABEL": "नमूना CSV डाउनलोड गर्नुहोस्।",
"LABEL": "CSV फाइल:",
- "CHOOSE_FILE": "Choose file",
+ "CHOOSE_FILE": "फाइल छान्नुहोस्",
"CHANGE": "परिवर्तन गर्नुहोस्",
- "CANCEL": "Cancel",
- "IMPORT": "Import",
+ "CANCEL": "रद्द गर्नुहोस्",
+ "IMPORT": "आयात गर्नुहोस्",
"SUCCESS_MESSAGE": "आयात पूरा भएपछि तपाईंलाई इमेलमार्फत सूचित गरिनेछ।",
- "ERROR_MESSAGE": "There was an error, please try again"
+ "ERROR_MESSAGE": "त्रुटि भयो, कृपया फेरि प्रयास गर्नुहोस्"
},
"EXPORT_CONTACT": {
- "TITLE": "Export contacts",
- "DESCRIPTION": "Quickly export a csv file with comprehensive details of your contacts",
- "CONFIRM": "Export",
+ "TITLE": "सम्पर्कहरू निर्यात गर्नुहोस्",
+ "DESCRIPTION": "तपाईंका सम्पर्कहरूको विस्तृत विवरण सहित छिटो csv फाइल निर्यात गर्नुहोस्",
+ "CONFIRM": "निर्यात गर्नुहोस्",
"SUCCESS_MESSAGE": "Export is in progress, You will be notified via email when export file is ready to dowanlod.",
- "ERROR_MESSAGE": "There was an error, please try again"
+ "ERROR_MESSAGE": "त्रुटि भयो, कृपया फेरि प्रयास गर्नुहोस्"
},
"SORT_BY": {
"LABEL": "द्वारा क्रमबद्ध गर्नुहोस्",
"OPTIONS": {
"NAME": "नाम",
"EMAIL": "इमेल",
- "PHONE_NUMBER": "Phone number",
+ "PHONE_NUMBER": "फोन नम्बर",
"COMPANY": "कम्पनी",
"COUNTRY": "देश",
"CITY": "सहर",
@@ -356,20 +356,20 @@
},
"FILTERS": {
"CREATE_SEGMENT": {
- "TITLE": "Do you want to save this filter?",
- "CONFIRM": "Save filter",
+ "TITLE": "के तपाईं यो फिल्टर सुरक्षित गर्न चाहनुहुन्छ?",
+ "CONFIRM": "फिल्टर सुरक्षित गर्नुहोस्",
"LABEL": "नाम",
- "PLACEHOLDER": "Enter the name of the filter",
- "ERROR": "Enter a valid name",
- "SUCCESS_MESSAGE": "Filter saved successfully",
+ "PLACEHOLDER": "फिल्टरको नाम प्रविष्ट गर्नुहोस्",
+ "ERROR": "वैध नाम प्रविष्ट गर्नुहोस्",
+ "SUCCESS_MESSAGE": "फिल्टर सफलतापूर्वक सुरक्षित गरियो",
"ERROR_MESSAGE": "फिल्टर बचत गर्न सकिएन। कृपया पछि फेरि प्रयास गर्नुहोस्।"
},
"DELETE_SEGMENT": {
- "TITLE": "Confirm Deletion",
- "DESCRIPTION": "Are you sure you want to delete this filter?",
- "CONFIRM": "Yes, Delete",
- "CANCEL": "No, Cancel",
- "SUCCESS_MESSAGE": "Filter deleted successfully",
+ "TITLE": "मेटाउने पुष्टि गर्नुहोस्",
+ "DESCRIPTION": "के तपाईं साँच्चिकै यो फिल्टर मेटाउन चाहनुहुन्छ?",
+ "CONFIRM": "हो, मेटाउनुहोस्",
+ "CANCEL": "होइन, रद्द गर्नुहोस्",
+ "SUCCESS_MESSAGE": "फिल्टर सफलतापूर्वक मेटाइयो",
"ERROR_MESSAGE": "फिल्टर मेटाउन सकिएन। कृपया पछि फेरि प्रयास गर्नुहोस्।"
}
}
@@ -381,119 +381,119 @@
"FILTER": {
"NAME": "नाम",
"EMAIL": "इमेल",
- "PHONE_NUMBER": "Phone number",
- "IDENTIFIER": "Identifier",
+ "PHONE_NUMBER": "फोन नम्बर",
+ "IDENTIFIER": "पहिचानकर्ता",
"COUNTRY": "देश",
"CITY": "सहर",
"CREATED_AT": "सिर्जना मिति",
"LAST_ACTIVITY": "अन्तिम क्रियाकलाप",
- "REFERER_LINK": "Referer link",
+ "REFERER_LINK": "रेफरर लिंक",
"BLOCKED": "ब्लक गरिएको",
"BLOCKED_TRUE": "साँचो",
- "BLOCKED_FALSE": "False",
+ "BLOCKED_FALSE": "गलत",
"BUTTONS": {
- "CLEAR_FILTERS": "Clear filters",
- "UPDATE_SEGMENT": "Update segment",
- "APPLY_FILTERS": "Apply filters",
- "ADD_FILTER": "Add filter"
+ "CLEAR_FILTERS": "फिल्टरहरू खाली गर्नुहोस्",
+ "UPDATE_SEGMENT": "सेगमेन्ट अपडेट गर्नुहोस्",
+ "APPLY_FILTERS": "फिल्टरहरू लागू गर्नुहोस्",
+ "ADD_FILTER": "फिल्टर थप्नुहोस्"
},
- "TITLE": "Filter contacts",
- "EDIT_SEGMENT": "Edit segment",
+ "TITLE": "सम्पर्कहरू फिल्टर गर्नुहोस्",
+ "EDIT_SEGMENT": "सेगमेन्ट सम्पादन गर्नुहोस्",
"SEGMENT": {
- "LABEL": "Segment name",
- "INPUT_PLACEHOLDER": "Enter the name of the segment"
+ "LABEL": "सेगमेन्ट नाम",
+ "INPUT_PLACEHOLDER": "सेगमेन्टको नाम प्रविष्ट गर्नुहोस्"
},
"ACTIVE_FILTERS": {
"MORE_FILTERS": "+ {count} थप फिल्टरहरू",
- "CLEAR_FILTERS": "Clear filters"
+ "CLEAR_FILTERS": "फिल्टरहरू खाली गर्नुहोस्"
}
},
"CARD": {
"OF": "को",
- "VIEW_DETAILS": "View details",
+ "VIEW_DETAILS": "विवरण हेर्नुहोस्",
"EDIT_DETAILS_FORM": {
- "TITLE": "Edit contact details",
+ "TITLE": "सम्पर्क विवरण सम्पादन गर्नुहोस्",
"FORM": {
"FIRST_NAME": {
- "PLACEHOLDER": "Enter the first name"
+ "PLACEHOLDER": "पहिलो नाम प्रविष्ट गर्नुहोस्"
},
"LAST_NAME": {
- "PLACEHOLDER": "Enter the last name"
+ "PLACEHOLDER": "थर प्रविष्ट गर्नुहोस्"
},
"EMAIL_ADDRESS": {
- "PLACEHOLDER": "Enter the email address",
+ "PLACEHOLDER": "इमेल ठेगाना प्रविष्ट गर्नुहोस्",
"DUPLICATE": "यो इमेल ठेगाना अर्को सम्पर्कका लागि प्रयोग भइरहेको छ।"
},
"PHONE_NUMBER": {
- "PLACEHOLDER": "Enter the phone number",
+ "PLACEHOLDER": "फोन नम्बर प्रविष्ट गर्नुहोस्",
"DUPLICATE": "यो फोन नम्बर अर्को सम्पर्कका लागि प्रयोग भइरहेको छ।"
},
"CITY": {
- "PLACEHOLDER": "Enter the city name"
+ "PLACEHOLDER": "सहरको नाम प्रविष्ट गर्नुहोस्"
},
"COUNTRY": {
- "PLACEHOLDER": "Select country"
+ "PLACEHOLDER": "देश चयन गर्नुहोस्"
},
"BIO": {
- "PLACEHOLDER": "Enter the bio"
+ "PLACEHOLDER": "बायो प्रविष्ट गर्नुहोस्"
},
"COMPANY_NAME": {
- "PLACEHOLDER": "Enter the company name"
+ "PLACEHOLDER": "कम्पनीको नाम प्रविष्ट गर्नुहोस्"
}
},
- "UPDATE_BUTTON": "Update contact",
- "SUCCESS_MESSAGE": "Contact updated successfully",
+ "UPDATE_BUTTON": "सम्पर्क अद्यावधिक गर्नुहोस्",
+ "SUCCESS_MESSAGE": "सम्पर्क सफलतापूर्वक अद्यावधिक गरियो",
"ERROR_MESSAGE": "सम्पर्क अपडेट गर्न सकिएन। कृपया पछि फेरि प्रयास गर्नुहोस्।"
},
"SOCIAL_MEDIA": {
- "TITLE": "Edit social links",
+ "TITLE": "सामाजिक लिंकहरू सम्पादन गर्नुहोस्",
"FORM": {
"FACEBOOK": {
- "PLACEHOLDER": "Add Facebook"
+ "PLACEHOLDER": "Facebook थप्नुहोस्"
},
"GITHUB": {
- "PLACEHOLDER": "Add Github"
+ "PLACEHOLDER": "Github थप्नुहोस्"
},
"INSTAGRAM": {
- "PLACEHOLDER": "Add Instagram"
+ "PLACEHOLDER": "Instagram थप्नुहोस्"
},
"TELEGRAM": {
- "PLACEHOLDER": "Add Telegram"
+ "PLACEHOLDER": "Telegram थप्नुहोस्"
},
"TIKTOK": {
- "PLACEHOLDER": "Add TikTok"
+ "PLACEHOLDER": "TikTok थप्नुहोस्"
},
"LINKEDIN": {
- "PLACEHOLDER": "Add LinkedIn"
+ "PLACEHOLDER": "LinkedIn थप्नुहोस्"
},
"TWITTER": {
- "PLACEHOLDER": "Add Twitter"
+ "PLACEHOLDER": "Twitter थप्नुहोस्"
}
}
},
"DELETE_CONTACT": {
"MESSAGE": "यो क्रिया स्थायी र उल्ट्याउन सकिँदैन।",
- "BUTTON": "Delete now"
+ "BUTTON": "अहिले मेटाउनुहोस्"
}
},
"DETAILS": {
"CREATED_AT": "सिर्जना गरिएको {date}",
"LAST_ACTIVITY": "अन्तिम सक्रिय {date}",
"DELETE_CONTACT_DESCRIPTION": "यो सम्पर्क स्थायी रूपमा मेटाइनेछ। यो क्रिया उल्ट्याउन सकिँदैन।",
- "DELETE_CONTACT": "Delete contact",
+ "DELETE_CONTACT": "सम्पर्क मेटाउनुहोस्",
"DELETE_DIALOG": {
- "TITLE": "Confirm Deletion",
- "DESCRIPTION": "Are you sure you want to delete this contact?",
- "CONFIRM": "Yes, Delete",
+ "TITLE": "मेटाउने पुष्टि गर्नुहोस्",
+ "DESCRIPTION": "के तपाईं यो सम्पर्क मेटाउन निश्चित हुनुहुन्छ?",
+ "CONFIRM": "हो, मेटाउनुहोस्",
"API": {
- "SUCCESS_MESSAGE": "Contact deleted successfully",
+ "SUCCESS_MESSAGE": "सम्पर्क सफलतापूर्वक मेटाइयो",
"ERROR_MESSAGE": "सम्पर्क मेटाउन सकिएन। कृपया पछि फेरि प्रयास गर्नुहोस्।"
}
},
"AVATAR": {
"UPLOAD": {
"ERROR_MESSAGE": "अवतार अपलोड गर्न सकिएन। कृपया पछि फेरि प्रयास गर्नुहोस्।",
- "SUCCESS_MESSAGE": "Avatar uploaded successfully"
+ "SUCCESS_MESSAGE": "अवतार सफलतापूर्वक अपलोड गरियो"
},
"DELETE": {
"SUCCESS_MESSAGE": "अवतार सफलतापूर्वक मेटाइयो",
@@ -506,23 +506,23 @@
"ATTRIBUTES": "गुणहरू",
"HISTORY": "इतिहास",
"NOTES": "टिप्पणीहरू",
- "MERGE": "Merge"
+ "MERGE": "मर्ज गर्नुहोस्"
},
"HISTORY": {
"EMPTY_STATE": "यस सम्पर्कसँग सम्बन्धित कुनै अघिल्लो कुराकानीहरू छैनन्"
},
"ATTRIBUTES": {
- "SEARCH_PLACEHOLDER": "Search for attributes",
+ "SEARCH_PLACEHOLDER": "गुणहरू खोज्नुहोस्",
"UNUSED_ATTRIBUTES": "{count} प्रयोग गरिएको गुण | {count} प्रयोग नगरिएको गुणहरू",
"EMPTY_STATE": "यस खातामा कुनै कस्टम सम्पर्क विशेषताहरू उपलब्ध छैनन्। तपाईं सेटिङहरूमा कस्टम विशेषता सिर्जना गर्न सक्नुहुन्छ।",
"YES": "हो",
"NO": "होइन",
"TRIGGER": {
- "SELECT": "Select value",
- "INPUT": "Enter value"
+ "SELECT": "मान चयन गर्नुहोस्",
+ "INPUT": "मान प्रविष्ट गर्नुहोस्"
},
"VALIDATIONS": {
- "INVALID_NUMBER": "Invalid number",
+ "INVALID_NUMBER": "अवैध नम्बर",
"REQUIRED": "वैध मान आवश्यक छ",
"INVALID_INPUT": "अवैध इनपुट",
"INVALID_URL": "अवैध URL",
@@ -530,40 +530,40 @@
},
"NO_ATTRIBUTES": "कुनै विशेषता फेला परेन",
"API": {
- "SUCCESS_MESSAGE": "Attribute updated successfully",
- "DELETE_SUCCESS_MESSAGE": "Attribute deleted successfully",
- "UPDATE_ERROR": "Unable to update attribute. Please try again later",
- "DELETE_ERROR": "Unable to delete attribute. Please try again later"
+ "SUCCESS_MESSAGE": "गुण सफलतापूर्वक अपडेट गरियो",
+ "DELETE_SUCCESS_MESSAGE": "गुण सफलतापूर्वक मेटाइयो",
+ "UPDATE_ERROR": "गुण अपडेट गर्न सकिएन। कृपया पछि पुन: प्रयास गर्नुहोस्",
+ "DELETE_ERROR": "गुण मेटाउन सकिएन। कृपया पछि पुन: प्रयास गर्नुहोस्"
}
},
"MERGE": {
- "TITLE": "Merge contact",
+ "TITLE": "सम्पर्क मर्ज गर्नुहोस्",
"DESCRIPTION": "दुई प्रोफाइलहरूलाई सबै विशेषता र कुराकानीहरू सहित एकमा मिलाउनुहोस्। विवाद भएमा, प्राथमिक सम्पर्कका विशेषताहरू प्राथमिकता पाउनेछन्।",
"PRIMARY": "प्राथमिक सम्पर्क",
- "PRIMARY_HELP_LABEL": "To be saved",
- "PRIMARY_REQUIRED_ERROR": "Please select a contact to merge with before proceeding",
- "PARENT": "To be merged",
+ "PRIMARY_HELP_LABEL": "सेभ गर्नुपर्ने",
+ "PRIMARY_REQUIRED_ERROR": "अगाडि बढ्नुअघि मर्ज गर्नुपर्ने सम्पर्क चयन गर्नुहोस्",
+ "PARENT": "मर्ज गर्नुपर्ने",
"PARENT_HELP_LABEL": "मेटाइनेछ",
"EMPTY_STATE": "कुनै सम्पर्क फेला परेन",
- "PLACEHOLDER": "Search for primary contact",
- "SEARCH_PLACEHOLDER": "Search for a contact",
+ "PLACEHOLDER": "प्राथमिक सम्पर्क खोज्नुहोस्",
+ "SEARCH_PLACEHOLDER": "सम्पर्क खोज्नुहोस्",
"SEARCH_ERROR_MESSAGE": "सम्पर्कहरू खोज्न सकिएन। कृपया पछि फेरि प्रयास गर्नुहोस्।",
- "SUCCESS_MESSAGE": "Contact merged successfully",
- "ERROR_MESSAGE": "Could not merge contacts, try again!",
+ "SUCCESS_MESSAGE": "सम्पर्क सफलतापूर्वक मर्ज गरियो",
+ "ERROR_MESSAGE": "सम्पर्कहरू मर्ज गर्न सकिएन, कृपया फेरि प्रयास गर्नुहोस्!",
"IS_SEARCHING": "खोज्दै...",
"BUTTONS": {
- "CANCEL": "Cancel",
- "CONFIRM": "Merge contact"
+ "CANCEL": "रद्द गर्नुहोस्",
+ "CONFIRM": "सम्पर्क मर्ज गर्नुहोस्"
}
},
"NOTES": {
- "PLACEHOLDER": "Add a note",
+ "PLACEHOLDER": "टिप्पणी थप्नुहोस्",
"WROTE": "लेख्यो",
- "YOU": "You",
- "SAVE": "Save note",
- "ADD_NOTE": "Add contact note",
+ "YOU": "तपाईं",
+ "SAVE": "टिप्पणी सुरक्षित गर्नुहोस्",
+ "ADD_NOTE": "सम्पर्क टिप्पणी थप्नुहोस्",
"EXPAND": "विस्तार गर्नुहोस्",
- "COLLAPSE": "Collapse",
+ "COLLAPSE": "सङ्कुचन गर्नुहोस्",
"NO_NOTES": "कुनै नोटहरू छैनन्, तपाईं सम्पर्क विवरण पृष्ठबाट नोटहरू थप्न सक्नुहुन्छ।",
"EMPTY_STATE": "यस सम्पर्कसँग सम्बन्धित कुनै नोटहरू छैनन्। माथि रहेको बाकसमा टाइप गरेर नोट थप्न सक्नुहुन्छ।",
"CONVERSATION_EMPTY_STATE": "अहिलेसम्म कुनै नोटहरू छैनन्। एउटा नोट सिर्जना गर्न Add note बटन प्रयोग गर्नुहोस्।"
@@ -571,33 +571,33 @@
},
"EMPTY_STATE": {
"TITLE": "यस खातामा कुनै सम्पर्क फेला परेन",
- "SUBTITLE": "Start adding new contacts by clicking on the button below",
- "BUTTON_LABEL": "Add contact",
+ "SUBTITLE": "तलको बटनमा क्लिक गरेर नयाँ सम्पर्कहरू थप्न सुरु गर्नुहोस्",
+ "BUTTON_LABEL": "सम्पर्क थप्नुहोस्",
"SEARCH_EMPTY_STATE_TITLE": "तपाईंको खोजीमा कुनै सम्पर्क मेल खाँदैन 🔍",
"LIST_EMPTY_STATE_TITLE": "यस दृश्यमा कुनै सम्पर्क उपलब्ध छैन 📋",
"ACTIVE_EMPTY_STATE_TITLE": "हाल कुनै सम्पर्क सक्रिय छैन 🌙"
},
- "LOAD_MORE": "Load more"
+ "LOAD_MORE": "थप लोड गर्नुहोस्"
},
"CONTACTS_BULK_ACTIONS": {
- "ASSIGN_LABELS": "Assign Labels",
+ "ASSIGN_LABELS": "लेबलहरू तोक्नुहोस्",
"ASSIGN_LABELS_SUCCESS": "लेबलहरू सफलतापूर्वक असाइन गरियो।",
- "ASSIGN_LABELS_FAILED": "Failed to assign labels",
+ "ASSIGN_LABELS_FAILED": "लेबलहरू तोक्न असफल भयो",
"DESCRIPTION": "चयनित सम्पर्कहरूमा थप्न चाहनुभएको लेबलहरू छान्नुहोस्।",
"NO_LABELS_FOUND": "अहिलेसम्म कुनै लेबलहरू उपलब्ध छैनन्।",
"SELECTED_COUNT": "{count} चयन गरियो",
- "CLEAR_SELECTION": "Clear selection",
+ "CLEAR_SELECTION": "चयन सफा गर्नुहोस्",
"SELECT_ALL": "सबै चयन गर्नुहोस् ({count})",
- "DELETE_CONTACTS": "Delete",
+ "DELETE_CONTACTS": "मेटाउनुहोस्",
"DELETE_SUCCESS": "सम्पर्कहरू सफलतापूर्वक मेटाइयो।",
"DELETE_FAILED": "सम्पर्कहरू मेटाउन असफल।",
"DELETE_DIALOG": {
- "TITLE": "Delete selected contacts",
- "SINGULAR_TITLE": "Delete selected contact",
+ "TITLE": "छानिएका सम्पर्कहरू मेटाउनुहोस्",
+ "SINGULAR_TITLE": "छानिएको सम्पर्क मेटाउनुहोस्",
"DESCRIPTION": "यसले चयनित {count} सम्पर्कहरू स्थायी रूपमा मेटाउनेछ। यो क्रिया उल्ट्याउन सकिँदैन।",
"SINGULAR_DESCRIPTION": "यसले चयनित सम्पर्क स्थायी रूपमा मेटाउनेछ। यो क्रिया उल्ट्याउन सकिँदैन।",
- "CONFIRM_MULTIPLE": "Delete contacts",
- "CONFIRM_SINGLE": "Delete contact"
+ "CONFIRM_MULTIPLE": "सम्पर्कहरू मेटाउनुहोस्",
+ "CONFIRM_SINGLE": "सम्पर्क मेटाउनुहोस्"
}
},
"COMPOSE_NEW_CONVERSATION": {
@@ -606,7 +606,7 @@
},
"FORM": {
"GO_TO_CONVERSATION": "हेर्नुहोस्",
- "SUCCESS_MESSAGE": "The message was sent successfully!",
+ "SUCCESS_MESSAGE": "सन्देश सफलतापूर्वक पठाइयो!",
"ERROR_MESSAGE": "कुराकानी सिर्जना गर्दा त्रुटि भयो। कृपया पछि फेरि प्रयास गर्नुहोस्।",
"NO_INBOX_ALERT": "यस सम्पर्कसँग कुराकानी सुरु गर्न उपलब्ध कुनै इनबक्सहरू छैनन्।",
"CONTACT_SELECTOR": {
@@ -616,11 +616,11 @@
},
"INBOX_SELECTOR": {
"LABEL": "मार्फत:",
- "BUTTON": "Show inboxes"
+ "BUTTON": "इनबक्सहरू देखाउनुहोस्"
},
"EMAIL_OPTIONS": {
"SUBJECT_LABEL": "विषय :",
- "SUBJECT_PLACEHOLDER": "Enter your email subject here",
+ "SUBJECT_PLACEHOLDER": "यहाँ तपाईंको इमेल विषय प्रविष्ट गर्नुहोस्",
"CC_LABEL": "Cc:",
"CC_PLACEHOLDER": "इमेलले खोज्न कम्तिमा 2 अक्षर प्रविष्ट गर्नुहोस्",
"BCC_LABEL": "Bcc:",
@@ -628,30 +628,30 @@
"BCC_BUTTON": "Bcc"
},
"MESSAGE_EDITOR": {
- "PLACEHOLDER": "Write your message here..."
+ "PLACEHOLDER": "यहाँ तपाईंको सन्देश लेख्नुहोस्..."
},
"WHATSAPP_OPTIONS": {
- "LABEL": "Select template",
- "SEARCH_PLACEHOLDER": "Search templates",
- "EMPTY_STATE": "No templates found",
+ "LABEL": "टेम्प्लेट चयन गर्नुहोस्",
+ "SEARCH_PLACEHOLDER": "टेम्प्लेटहरू खोज्नुहोस्",
+ "EMPTY_STATE": "टेम्प्लेटहरू फेला परेनन्",
"TEMPLATE_PARSER": {
"TEMPLATE_NAME": "WhatsApp template: {templateName}",
- "VARIABLES": "Variables",
- "BACK": "Go back",
- "SEND_MESSAGE": "Send message"
+ "VARIABLES": "परिवर्तनीयहरू",
+ "BACK": "फिर्ता जानुहोस्",
+ "SEND_MESSAGE": "सन्देश पठाउनुहोस्"
}
},
"TWILIO_OPTIONS": {
- "LABEL": "Select template",
- "SEARCH_PLACEHOLDER": "Search templates",
+ "LABEL": "टेम्प्लेट चयन गर्नुहोस्",
+ "SEARCH_PLACEHOLDER": "टेम्प्लेटहरू खोज्नुहोस्",
"EMPTY_STATE": "कुनै ढाँचा फेला परेन",
"TEMPLATE_PARSER": {
- "BACK": "Go back",
- "SEND_MESSAGE": "Send message"
+ "BACK": "फिर्ता जानुहोस्",
+ "SEND_MESSAGE": "सन्देश पठाउनुहोस्"
}
},
"ACTION_BUTTONS": {
- "DISCARD": "Discard",
+ "DISCARD": "रद्द गर्नुहोस्",
"SEND": "Send ({keyCode})"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ne/helpCenter.json b/app/javascript/dashboard/i18n/locale/ne/helpCenter.json
index 863608081..acff43fd8 100644
--- a/app/javascript/dashboard/i18n/locale/ne/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/ne/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "भाषा पोर्टलबाट सफलतापूर्वक हटाइयो।",
"ERROR_MESSAGE": "भाषा पोर्टलबाट हटाउन सकिएन। फेरि प्रयास गर्नुहोस्।"
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} लेख | {count} लेखहरू",
"CATEGORIES_COUNT": "{count} श्रेणी | {count} श्रेणीहरू",
"DEFAULT": "पूर्वनिर्धारित",
+ "DRAFT": "ड्राफ्ट",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "पूर्वनिर्धारित बनाउनुहोस्",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "मेटाउनुहोस्"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "स्थान चयन गर्नुहोस्..."
},
+ "STATUS": {
+ "LABEL": "Status",
+ "OPTIONS": {
+ "LIVE": "प्रकाशित",
+ "DRAFT": "ड्राफ्ट"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "स्थान सफलतापूर्वक थपियो",
"ERROR_MESSAGE": "स्थान थप्न सकिएन। फेरि प्रयास गर्नुहोस्।"
diff --git a/app/javascript/dashboard/i18n/locale/ne/integrations.json b/app/javascript/dashboard/i18n/locale/ne/integrations.json
index f09eb56ae..dc7f06c05 100644
--- a/app/javascript/dashboard/i18n/locale/ne/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ne/integrations.json
@@ -126,7 +126,7 @@
},
"HELP_TEXT": {
"TITLE": "Using Slack Integration",
- "BODY": "With this integration, all of your incoming conversations will be synced to the ***{selectedChannelName}*** channel in your Slack workspace. You can manage all your customer conversations right within the channel and never miss a message.\n\nHere are the main features of the integration:\n\n**Respond to conversations from within Slack:** To respond to a conversation in the ***{selectedChannelName}*** Slack channel, simply type out your message and send it as a thread. This will create a response back to the customer through Chatwoot. It's that simple!\n\n **Create private notes:** If you want to create private notes instead of replies, start your message with ***`note:`***. This ensures that your message is kept private and won't be visible to the customer.\n\n**Associate an agent profile:** If the person who replied on Slack has an agent profile in Chatwoot under the same email, the replies will be associated with that agent profile automatically. This means you can easily track who said what and when. On the other hand, when the replier doesn't have an associated agent profile, the replies will appear from the bot profile to the customer.",
+ "BODY": "यस एकीकरणसँग, तपाईंका सबै आउने कुराकानीहरू तपाईंको Slack workspace भित्रको ***{selectedChannelName}*** च्यानलमा sync हुनेछन्। तपाईं च्यानलमै बसेर आफ्ना सबै ग्राहक कुराकानीहरू व्यवस्थापन गर्न सक्नुहुन्छ र कहिल्यै कुनै सन्देश छुटाउनु पर्दैन।\n\nयस एकीकरणका मुख्य सुविधाहरू यस्ता छन्:\n\n**Slack भित्रैबाट कुराकानीहरूलाई जवाफ दिनुहोस्:** ***{selectedChannelName}*** Slack च्यानलमा रहेको कुनै कुराकानीलाई जवाफ दिन, आफ्नो सन्देश टाइप गर्नुहोस् र यसलाई thread को रूपमा पठाउनुहोस्। यसले Chatwoot मार्फत ग्राहकलाई जवाफ सिर्जना गर्नेछ। यति नै सजिलो!\n\n **निजी नोटहरू सिर्जना गर्नुहोस्:** यदि तपाईं reply को सट्टा निजी नोटहरू सिर्जना गर्न चाहनुहुन्छ भने, आफ्नो सन्देशको सुरुमा ***`note:`*** लेख्नुहोस्। यसले तपाईंको सन्देश निजी नै रहन्छ र ग्राहकलाई देखिँदैन भन्ने सुनिश्चित गर्छ।\n\n**एजेन्ट प्रोफाइललाई associate गर्नुहोस्:** यदि Slack मा reply गर्ने व्यक्तिको Chatwoot मा उही email अन्तर्गत एजेन्ट प्रोफाइल छ भने, reply हरू स्वतः त्यही एजेन्ट प्रोफाइलसँग associate हुनेछन्। यसको अर्थ तपाईंले कसले के भन्यो र कहिले भन्यो भनेर सजिलै ट्र्याक गर्न सक्नुहुन्छ। अर्कोतर्फ, reply गर्ने व्यक्तिसँग कुनै associated एजेन्ट प्रोफाइल छैन भने, ग्राहकलाई reply हरू bot profile बाट आएको रूपमा देखिनेछन्.",
"SELECTED": "छानिएको"
},
"SELECT_CHANNEL": {
@@ -392,10 +392,10 @@
"NAME": "कप्तान",
"HEADER_KNOW_MORE": "थप जान्नु",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "ASSISTANTS": "सहायकहरू",
+ "SWITCH_ASSISTANT": "सहायकहरू बीच साट्नुस्",
+ "NEW_ASSISTANT": "सहायक सिर्जना गर्नुहोस्",
+ "EMPTY_LIST": "कुनै सहायक फेला परेन, सुरु गर्न कृपया एउटा सिर्जना गर्नुहोस्"
},
"COPILOT": {
"TITLE": "कोपाइलट",
@@ -449,7 +449,7 @@
"CANCEL_ANYTIME": "तपाईं आफ्नो योजना कुनै पनि समयमा परिवर्तन वा रद्द गर्न सक्नुहुन्छ"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
+ "AVAILABLE_ON": "Captain AI केवल Enterprise योजनाहरूमा उपलब्ध छ।",
"UPGRADE_PROMPT": "हाम्रो सहायकहरू, कोपाइलट र थप सुविधाहरू पहुँच गर्न आफ्नो योजना अपग्रेड गर्नुहोस्।",
"ASK_ADMIN": "कृपया अपग्रेडका लागि आफ्नो प्रशासकलाई सम्पर्क गर्नुहोस्।"
},
@@ -584,8 +584,8 @@
"TITLE": "सीमाहरू",
"DESCRIPTION": "सबै कुरा ट्र्याकमा राख्छ—सहायकले तपाईंले चाहेका प्रश्नहरू मात्र जवाफ दिन्छ, अरू कुनै विषय वा सीमा बाहिर जाँदैन।",
"BULK_ACTION": {
- "SELECTED": "{count} item selected | {count} items selected",
- "SELECT_ALL": "Select all ({count})",
+ "SELECTED": "{count} वस्तु चयन गरियो | {count} वस्तुहरू चयन गरियो",
+ "SELECT_ALL": "सबै चयन गर्नुहोस् ({count})",
"UNSELECT_ALL": "Unselect all ({count})",
"BULK_DELETE_BUTTON": "हटाउनुहोस्"
},
@@ -629,8 +629,8 @@
"TITLE": "उत्तर दिने निर्देशिका",
"DESCRIPTION": "तपाईंको सहायकका उत्तरहरूको शैली र संरचना—स्पष्ट र मैत्रीपूर्ण? छोटो र छरितो? विस्तृत र औपचारिक?",
"BULK_ACTION": {
- "SELECTED": "{count} item selected | {count} items selected",
- "SELECT_ALL": "Select all ({count})",
+ "SELECTED": "{count} वस्तु चयन गरियो | {count} वस्तुहरू चयन गरियो",
+ "SELECT_ALL": "सबै चयन गर्नुहोस् ({count})",
"UNSELECT_ALL": "Unselect all ({count})",
"BULK_DELETE_BUTTON": "हटाउनुहोस्"
},
@@ -674,8 +674,8 @@
"TITLE": "परिदृश्यहरू",
"DESCRIPTION": "आफ्नो सहायकलाई केही सन्दर्भ दिनुहोस्—जस्तै “प्रयोगकर्ता अल्झिएको बेला के गर्ने”, वा “रिफन्ड अनुरोधमा कसरी व्यवहार गर्ने।”",
"BULK_ACTION": {
- "SELECTED": "{count} item selected | {count} items selected",
- "SELECT_ALL": "Select all ({count})",
+ "SELECTED": "{count} वस्तु चयन गरियो | {count} वस्तुहरू चयन गरियो",
+ "SELECT_ALL": "सबै चयन गर्नुहोस् ({count})",
"UNSELECT_ALL": "Unselect all ({count})",
"BULK_DELETE_BUTTON": "हटाउनुहोस्"
},
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "कागजातहरू",
"ADD_NEW": "नयाँ कागजात सिर्जना गर्नुहोस्",
+ "SELECTED": "{count} चयन गरियो",
+ "SELECT_ALL": "सबै चयन गर्नुहोस् ({count})",
+ "UNSELECT_ALL": "सबै चयन हटाउनुहोस् ({count})",
+ "BULK_DELETE_BUTTON": "Delete",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "हो, सबै मेटाउनु",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "सम्बन्धित FAQ",
"DESCRIPTION": "यी FAQ सिधा कागजातबाट उत्पन्न भएका हुन्।"
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "उपकरणहरू",
"ADD_NEW": "नयाँ उपकरण बनाउनुहोस्",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "कुनै कस्टम उपकरण उपलब्ध छैन",
"SUBTITLE": "आफ्नो सहायकलाई बाह्य API र सेवासँग जडान गर्न कस्टम उपकरणहरू बनाउनुहोस्, जसले तपाईंको लागि डेटा ल्याउन र कार्यहरू गर्न सक्षम बनाउँछ।",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "कस्टम टुल सफलतापूर्वक मेटाइयो",
"ERROR_MESSAGE": "कस्टम टुल मेटाउन असफल भयो"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "टुलको नाम",
"PLACEHOLDER": "अर्डर खोज्नुहोस्",
- "ERROR": "टुलको नाम आवश्यक छ"
+ "ERROR": "टुलको नाम आवश्यक छ",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "विवरण",
diff --git a/app/javascript/dashboard/i18n/locale/nl/conversation.json b/app/javascript/dashboard/i18n/locale/nl/conversation.json
index afda6332e..776e73a2b 100644
--- a/app/javascript/dashboard/i18n/locale/nl/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/nl/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Berichtondertekening is niet geconfigureerd, configureer deze in de profielinstellingen.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "Geef copilot extra opdrachten, of vraag iets anders... Druk op enter om vervolgvraag te sturen",
"CLICK_HERE": "Klik hier om bij te werken",
"WHATSAPP_TEMPLATES": "Whatsapp Templates"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Sleep hierheen om toe te voegen",
"START_AUDIO_RECORDING": "Start audio-opname",
"STOP_AUDIO_RECORDING": "Stop audio-opname",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot is aan het denken",
"EMAIL_HEAD": {
"TO": "AAN",
"ADD_BCC": "Voeg bcc toe",
diff --git a/app/javascript/dashboard/i18n/locale/nl/helpCenter.json b/app/javascript/dashboard/i18n/locale/nl/helpCenter.json
index 12e9ee530..bc98f4d6b 100644
--- a/app/javascript/dashboard/i18n/locale/nl/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/nl/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Locale removed from portal successfully",
"ERROR_MESSAGE": "Unable to remove locale from portal. Try again."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Default",
+ "DRAFT": "Draft",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Verwijderen"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Select locale..."
},
+ "STATUS": {
+ "LABEL": "Status",
+ "OPTIONS": {
+ "LIVE": "Published",
+ "DRAFT": "Draft"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Locale added successfully",
"ERROR_MESSAGE": "Unable to add locale. Try again."
diff --git a/app/javascript/dashboard/i18n/locale/nl/integrations.json b/app/javascript/dashboard/i18n/locale/nl/integrations.json
index 8f2855379..d2237f0b1 100644
--- a/app/javascript/dashboard/i18n/locale/nl/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/nl/integrations.json
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Captain",
- "HEADER_KNOW_MORE": "Know more",
+ "HEADER_KNOW_MORE": "Meer weten",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "ASSISTANTS": "Assistenten",
+ "SWITCH_ASSISTANT": "Wissel tussen assistenten",
+ "NEW_ASSISTANT": "Assistent aanmaken",
+ "EMPTY_LIST": "Geen assistenten gevonden, maak er een aan om te beginnen"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "PANEL_TITLE": "Aan de slag met Copilot",
+ "KICK_OFF_MESSAGE": "Snelle samenvatting nodig, eerdere gesprekken bekijken of een beter antwoord opstellen? Copilot helpt je sneller.",
"SEND_MESSAGE": "Verstuur bericht...",
- "EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
- "LOADER": "Captain is thinking",
+ "EMPTY_MESSAGE": "Er is een fout opgetreden bij het genereren van het antwoord. Probeer het opnieuw.",
+ "LOADER": "Captain is aan het denken",
"YOU": "Jij",
- "USE": "Use this",
- "RESET": "Reset",
- "SHOW_STEPS": "Show steps",
- "SELECT_ASSISTANT": "Select Assistant",
+ "USE": "Gebruik dit",
+ "RESET": "Resetten",
+ "SHOW_STEPS": "Toon stappen",
+ "SELECT_ASSISTANT": "Assistent selecteren",
"PROMPTS": {
"SUMMARIZE": {
- "LABEL": "Summarize this conversation",
- "CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
+ "LABEL": "Vat dit gesprek samen",
+ "CONTENT": "Vat de belangrijkste punten samen die besproken zijn tussen de klant en de ondersteuningsmedewerker, inclusief de zorgen, vragen van de klant en de oplossingen of antwoorden die de medewerker heeft gegeven"
},
"SUGGEST": {
- "LABEL": "Suggest an answer",
- "CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
+ "LABEL": "Stel een antwoord voor",
+ "CONTENT": "Analyseer de vraag van de klant en stel een antwoord op dat hun zorgen of vragen effectief behandelt. Zorg dat het antwoord duidelijk, beknopt is en nuttige informatie biedt."
},
"RATE": {
- "LABEL": "Rate this conversation",
- "CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
+ "LABEL": "Beoordeel dit gesprek",
+ "CONTENT": "Beoordeel het gesprek om te zien hoe goed aan de behoeften van de klant wordt voldaan. Geef een beoordeling tot 5 op basis van toon, duidelijkheid en effectiviteit."
},
"HIGH_PRIORITY": {
- "LABEL": "High priority conversations",
- "CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
+ "LABEL": "Gesprekken met hoge prioriteit",
+ "CONTENT": "Geef me een samenvatting van alle open gesprekken met hoge prioriteit. Vermeld het gesprek-ID, klantnaam (indien beschikbaar), laatste berichtinhoud en toegewezen agent. Groepeer indien relevant op status."
},
"LIST_CONTACTS": {
- "LABEL": "List contacts",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "LABEL": "Contacten weergeven",
+ "CONTENT": "Toon mij de lijst van top 10 contacten. Vermeld naam, e-mail of telefoonnummer (indien beschikbaar), laatst gezien tijd, tags (indien aanwezig)."
}
}
},
"PLAYGROUND": {
"USER": "Jij",
- "ASSISTANT": "Assistant",
+ "ASSISTANT": "Assistent",
"MESSAGE_PLACEHOLDER": "Typ uw bericht...",
- "HEADER": "Playground",
- "DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
- "CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
+ "HEADER": "Speelplaats",
+ "DESCRIPTION": "Gebruik deze speelplaats om berichten naar je assistent te sturen en te controleren of deze nauwkeurig, snel en in de verwachte toon reageert.",
+ "CREDIT_NOTE": "Berichten die hier worden verzonden, tellen mee voor je Captain-tegoed."
},
"PAYWALL": {
- "TITLE": "Upgrade to use Captain AI",
- "AVAILABLE_ON": "Captain is not available on the free plan.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "TITLE": "Upgrade om Captain AI te gebruiken",
+ "AVAILABLE_ON": "Captain is niet beschikbaar op het gratis abonnement.",
+ "UPGRADE_PROMPT": "Upgrade je abonnement om toegang te krijgen tot onze assistenten, copilot en meer.",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "AVAILABLE_ON": "Captain AI is alleen beschikbaar in de Enterprise-abonnementen.",
+ "UPGRADE_PROMPT": "Upgrade je abonnement om toegang te krijgen tot onze assistenten, copilot en meer.",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"BANNER": {
- "RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
- "DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
+ "RESPONSES": "Je hebt meer dan 80% van je antwoordlimiet gebruikt. Om Captain AI te blijven gebruiken, upgrade je jouw plan.",
+ "DOCUMENTS": "Documentlimiet bereikt. Upgrade om Captain AI te blijven gebruiken."
},
"FORM": {
"CANCEL": "Annuleren",
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
+ "SELECTED": "{count} selected",
+ "SELECT_ALL": "Select all ({count})",
+ "UNSELECT_ALL": "Unselect all ({count})",
+ "BULK_DELETE_BUTTON": "Verwijderen",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Yes, delete all",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Beschrijving",
diff --git a/app/javascript/dashboard/i18n/locale/no/conversation.json b/app/javascript/dashboard/i18n/locale/no/conversation.json
index 65b4d4fb9..1687a4fb8 100644
--- a/app/javascript/dashboard/i18n/locale/no/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/no/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Message signature is not configured, please configure it in profile settings.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "Gi copilot flere forslag, eller spør om noe annet... Trykk enter for å sende oppfølgingsmelding",
"CLICK_HERE": "Click here to update",
"WHATSAPP_TEMPLATES": "Whatsapp Templates"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Drag and drop here to attach",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot tenker",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Add bcc",
diff --git a/app/javascript/dashboard/i18n/locale/no/helpCenter.json b/app/javascript/dashboard/i18n/locale/no/helpCenter.json
index 08a3bd4da..f6ae638ed 100644
--- a/app/javascript/dashboard/i18n/locale/no/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/no/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Locale removed from portal successfully",
"ERROR_MESSAGE": "Unable to remove locale from portal. Try again."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Default",
+ "DRAFT": "Draft",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Slett"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Select locale..."
},
+ "STATUS": {
+ "LABEL": "Satus",
+ "OPTIONS": {
+ "LIVE": "Published",
+ "DRAFT": "Draft"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Locale added successfully",
"ERROR_MESSAGE": "Unable to add locale. Try again."
diff --git a/app/javascript/dashboard/i18n/locale/no/integrations.json b/app/javascript/dashboard/i18n/locale/no/integrations.json
index cfcda61a8..80a3090de 100644
--- a/app/javascript/dashboard/i18n/locale/no/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/no/integrations.json
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Captain",
- "HEADER_KNOW_MORE": "Know more",
+ "HEADER_KNOW_MORE": "Lær mer",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "ASSISTANTS": "Assistenter",
+ "SWITCH_ASSISTANT": "Bytt mellom assistenter",
+ "NEW_ASSISTANT": "Opprett assistent",
+ "EMPTY_LIST": "Ingen assistenter funnet, vennligst opprett en for å komme i gang"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "PANEL_TITLE": "Kom i gang med Copilot",
+ "KICK_OFF_MESSAGE": "Trenger du en rask oppsummering, vil du sjekke tidligere samtaler, eller utarbeide et bedre svar? Copilot er her for å hjelpe deg raskere.",
"SEND_MESSAGE": "Send message...",
- "EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
- "LOADER": "Captain is thinking",
+ "EMPTY_MESSAGE": "Det oppstod en feil ved generering av svaret. Vennligst prøv igjen.",
+ "LOADER": "Captain tenker",
"YOU": "Du",
- "USE": "Use this",
- "RESET": "Reset",
- "SHOW_STEPS": "Show steps",
- "SELECT_ASSISTANT": "Select Assistant",
+ "USE": "Bruk dette",
+ "RESET": "Nullstill",
+ "SHOW_STEPS": "Vis trinn",
+ "SELECT_ASSISTANT": "Velg assistent",
"PROMPTS": {
"SUMMARIZE": {
- "LABEL": "Summarize this conversation",
- "CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
+ "LABEL": "Oppsummer denne samtalen",
+ "CONTENT": "Oppsummer hovedpunktene som ble diskutert mellom kunden og kundestøtteagenten, inkludert kundens bekymringer, spørsmål og løsninger eller svar gitt av agenten"
},
"SUGGEST": {
- "LABEL": "Suggest an answer",
- "CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
+ "LABEL": "Foreslå et svar",
+ "CONTENT": "Analyser kundens henvendelse, og utarbeid et svar som effektivt tar opp deres bekymringer eller spørsmål. Sørg for at svaret er klart, konsist og gir nyttig informasjon."
},
"RATE": {
- "LABEL": "Rate this conversation",
- "CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
+ "LABEL": "Vurder denne samtalen",
+ "CONTENT": "Gå gjennom samtalen for å se hvor godt den imøtekommer kundens behov. Del en vurdering fra 1 til 5 basert på tone, klarhet og effektivitet."
},
"HIGH_PRIORITY": {
- "LABEL": "High priority conversations",
- "CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
+ "LABEL": "Samtaler med høy prioritet",
+ "CONTENT": "Gi meg en oppsummering av alle åpne samtaler med høy prioritet. Inkluder samtale-ID, kundenavn (hvis tilgjengelig), innholdet i siste melding og tildelt agent. Grupper etter status hvis relevant."
},
"LIST_CONTACTS": {
- "LABEL": "List contacts",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "LABEL": "Liste over kontakter",
+ "CONTENT": "Vis meg listen over de 10 viktigste kontaktene. Inkluder navn, e-post eller telefonnummer (hvis tilgjengelig), sist sett tid, etiketter (hvis noen)."
}
}
},
"PLAYGROUND": {
"USER": "Du",
- "ASSISTANT": "Assistant",
+ "ASSISTANT": "Assistent",
"MESSAGE_PLACEHOLDER": "Skriv inn meldingen...",
- "HEADER": "Playground",
- "DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
- "CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
+ "HEADER": "Lekeplass",
+ "DESCRIPTION": "Bruk denne lekeplassen for å sende meldinger til assistenten din og sjekke om den svarer nøyaktig, raskt og i forventet tone.",
+ "CREDIT_NOTE": "Meldinger sendt her vil telle mot dine Captain-kreditter."
},
"PAYWALL": {
- "TITLE": "Upgrade to use Captain AI",
- "AVAILABLE_ON": "Captain is not available on the free plan.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "TITLE": "Oppgrader for å bruke Captain AI",
+ "AVAILABLE_ON": "Captain er ikke tilgjengelig på gratisplanen.",
+ "UPGRADE_PROMPT": "Oppgrader planen din for å få tilgang til våre assistenter, copilot og mer.",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "AVAILABLE_ON": "Captain AI er kun tilgjengelig i Enterprise-planene.",
+ "UPGRADE_PROMPT": "Oppgrader planen din for å få tilgang til våre assistenter, copilot og mer.",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"BANNER": {
- "RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
- "DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
+ "RESPONSES": "Du har brukt over 80 % av svargrensen din. For å fortsette å bruke Captain AI, vennligst oppgrader.",
+ "DOCUMENTS": "Begrensning for dokumenter nådd. Oppgrader for å fortsette å bruke Captain AI."
},
"FORM": {
"CANCEL": "Avbryt",
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
+ "SELECTED": "{count} selected",
+ "SELECT_ALL": "Select all ({count})",
+ "UNSELECT_ALL": "Unselect all ({count})",
+ "BULK_DELETE_BUTTON": "Slett",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Yes, delete all",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Beskrivelse",
diff --git a/app/javascript/dashboard/i18n/locale/pl/conversation.json b/app/javascript/dashboard/i18n/locale/pl/conversation.json
index 499bbe5d7..b15c07d96 100644
--- a/app/javascript/dashboard/i18n/locale/pl/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/pl/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Podpis wiadomości nie jest skonfigurowany, należy go skonfigurować w ustawieniach profilu.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "Podaj copilota dodatkowe wskazówki lub zapytaj o cokolwiek... Naciśnij Enter, aby wysłać odpowiedź uzupełniającą",
"CLICK_HERE": "Kliknij tutaj, aby zaktualizować",
"WHATSAPP_TEMPLATES": "Szablony WhatsApp"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Przeciągnij i upuść tutaj, aby dołączyć",
"START_AUDIO_RECORDING": "Rozpocznij nagrywanie audio",
"STOP_AUDIO_RECORDING": "Zatrzymaj nagrywanie audio",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot myśli",
"EMAIL_HEAD": {
"TO": "DO",
"ADD_BCC": "Dodaj Bcc",
diff --git a/app/javascript/dashboard/i18n/locale/pl/helpCenter.json b/app/javascript/dashboard/i18n/locale/pl/helpCenter.json
index 46884b314..fa452e0a3 100644
--- a/app/javascript/dashboard/i18n/locale/pl/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/pl/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Język usunięty z portalu pomyślnie",
"ERROR_MESSAGE": "Nie można usunąć języka z portalu. Spróbuj ponownie."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Domyślny",
+ "DRAFT": "Szkic",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Usuń"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Select locale..."
},
+ "STATUS": {
+ "LABEL": "Status",
+ "OPTIONS": {
+ "LIVE": "Opublikowane",
+ "DRAFT": "Szkic"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Język dodany pomyślnie",
"ERROR_MESSAGE": "Nie można dodać języka. Spróbuj ponownie."
diff --git a/app/javascript/dashboard/i18n/locale/pl/integrations.json b/app/javascript/dashboard/i18n/locale/pl/integrations.json
index 814ce13de..67990d4b7 100644
--- a/app/javascript/dashboard/i18n/locale/pl/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/pl/integrations.json
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Captain",
- "HEADER_KNOW_MORE": "Know more",
+ "HEADER_KNOW_MORE": "Dowiedz się więcej",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "ASSISTANTS": "Asystenci",
+ "SWITCH_ASSISTANT": "Przełącz się między asystentami",
+ "NEW_ASSISTANT": "Utwórz asystenta",
+ "EMPTY_LIST": "Nie znaleziono asystentów, utwórz jednego, aby zacząć"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "PANEL_TITLE": "Rozpocznij z Copilotem",
+ "KICK_OFF_MESSAGE": "Potrzebujesz szybkiego podsumowania, chcesz sprawdzić wcześniejsze rozmowy lub napisać lepszą odpowiedź? Copilot jest tutaj, aby przyspieszyć pracę.",
"SEND_MESSAGE": "Wyślij wiadomość...",
- "EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
- "LOADER": "Captain is thinking",
+ "EMPTY_MESSAGE": "Wystąpił błąd podczas generowania odpowiedzi. Spróbuj ponownie.",
+ "LOADER": "Captain myśli",
"YOU": "You",
- "USE": "Use this",
- "RESET": "Reset",
- "SHOW_STEPS": "Show steps",
- "SELECT_ASSISTANT": "Select Assistant",
+ "USE": "Użyj tego",
+ "RESET": "Resetuj",
+ "SHOW_STEPS": "Pokaż kroki",
+ "SELECT_ASSISTANT": "Wybierz asystenta",
"PROMPTS": {
"SUMMARIZE": {
- "LABEL": "Summarize this conversation",
- "CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
+ "LABEL": "Podsumuj tę rozmowę",
+ "CONTENT": "Podsumuj kluczowe punkty omówione pomiędzy klientem a agentem wsparcia, w tym obawy klienta, pytania oraz rozwiązania lub odpowiedzi udzielone przez agenta."
},
"SUGGEST": {
- "LABEL": "Suggest an answer",
- "CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
+ "LABEL": "Zaproponuj odpowiedź",
+ "CONTENT": "Analizuj zapytanie klienta i przygotuj odpowiedź, która skutecznie odnosi się do jego obaw lub pytań. Upewnij się, że odpowiedź jest jasna, zwięzła i dostarcza pomocnych informacji."
},
"RATE": {
- "LABEL": "Rate this conversation",
- "CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
+ "LABEL": "Oceń tę rozmowę",
+ "CONTENT": "Przejrzyj rozmowę, aby ocenić, jak dobrze spełnia potrzeby klienta. Podaj ocenę w skali od 1 do 5 na podstawie tonu, jasności i skuteczności."
},
"HIGH_PRIORITY": {
- "LABEL": "High priority conversations",
- "CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
+ "LABEL": "Rozmowy o wysokim priorytecie",
+ "CONTENT": "Podaj podsumowanie wszystkich otwartych rozmów o wysokim priorytecie. Uwzględnij ID rozmowy, nazwę klienta (jeśli dostępna), zawartość ostatniej wiadomości oraz przypisanego agenta. Pogrupuj według statusu, jeśli to istotne."
},
"LIST_CONTACTS": {
- "LABEL": "List contacts",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "LABEL": "Lista kontaktów",
+ "CONTENT": "Pokaż listę 10 najważniejszych kontaktów. Uwzględnij nazwę, email lub numer telefonu (jeśli dostępny), czas ostatniego widoku, tagi (jeśli są)."
}
}
},
"PLAYGROUND": {
"USER": "You",
- "ASSISTANT": "Assistant",
+ "ASSISTANT": "Asystent",
"MESSAGE_PLACEHOLDER": "Wpisz treść wiadomości...",
- "HEADER": "Playground",
- "DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
- "CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
+ "HEADER": "Pole zabaw",
+ "DESCRIPTION": "Użyj tego pola zabaw, aby wysyłać wiadomości do swojego asystenta i sprawdzić, czy odpowiada dokładnie, szybko i w oczekiwanym tonie.",
+ "CREDIT_NOTE": "Wiadomości wysłane tutaj będą naliczane do twoich kredytów Captain."
},
"PAYWALL": {
- "TITLE": "Upgrade to use Captain AI",
- "AVAILABLE_ON": "Captain is not available on the free plan.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "TITLE": "Uaktualnij, aby korzystać z Captain AI",
+ "AVAILABLE_ON": "Captain nie jest dostępny w darmowym planie.",
+ "UPGRADE_PROMPT": "Zaktualizuj swój plan, aby uzyskać dostęp do naszych asystentów, copilota i innych funkcji.",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "AVAILABLE_ON": "Captain AI jest dostępny tylko w planach Enterprise.",
+ "UPGRADE_PROMPT": "Zaktualizuj swój plan, aby uzyskać dostęp do naszych asystentów, copilota i innych funkcji.",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"BANNER": {
- "RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
- "DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
+ "RESPONSES": "Wykorzystałeś ponad 80% limitu odpowiedzi. Aby nadal korzystać z Captain AI, proszę przeprowadź aktualizację.",
+ "DOCUMENTS": "Osiągnięto limit dokumentów. Aby kontynuować korzystanie z Captain AI, przeprowadź aktualizację."
},
"FORM": {
"CANCEL": "Anuluj",
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
+ "SELECTED": "{count} selected",
+ "SELECT_ALL": "Select all ({count})",
+ "UNSELECT_ALL": "Unselect all ({count})",
+ "BULK_DELETE_BUTTON": "Usuń",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Yes, delete all",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Opis",
diff --git a/app/javascript/dashboard/i18n/locale/pt/conversation.json b/app/javascript/dashboard/i18n/locale/pt/conversation.json
index a48bfd83f..165bc9ab9 100644
--- a/app/javascript/dashboard/i18n/locale/pt/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/pt/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "A assinatura da mensagem não está configurada. Por favor, configure-a nas configurações do perfil.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "Dê comandos adicionais ao copiloto ou pergunte qualquer outra coisa... Pressione enter para enviar o acompanhamento",
"CLICK_HERE": "Clique aqui para atualizar",
"WHATSAPP_TEMPLATES": "Template do WhatsApp"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Arrastar e soltar aqui para anexar",
"START_AUDIO_RECORDING": "Iniciar gravação de áudio",
"STOP_AUDIO_RECORDING": "Parar gravação de áudio",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copiloto está pensando",
"EMAIL_HEAD": {
"TO": "PARA",
"ADD_BCC": "Adicionar Bcc",
diff --git a/app/javascript/dashboard/i18n/locale/pt/helpCenter.json b/app/javascript/dashboard/i18n/locale/pt/helpCenter.json
index c723d178f..a3dbbf2fd 100644
--- a/app/javascript/dashboard/i18n/locale/pt/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/pt/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Local removido do portal com sucesso",
"ERROR_MESSAGE": "Não foi possível remover o local do portal. Por favor, tente novamente."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Padrão",
+ "DRAFT": "Rascunho",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Excluir"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Selecionar linguagem..."
},
+ "STATUS": {
+ "LABEL": "Situação",
+ "OPTIONS": {
+ "LIVE": "Publicado",
+ "DRAFT": "Rascunho"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Local adicionado com sucesso",
"ERROR_MESSAGE": "Não foi possível adicionar o local. Por favor, tente novamente."
diff --git a/app/javascript/dashboard/i18n/locale/pt/integrations.json b/app/javascript/dashboard/i18n/locale/pt/integrations.json
index 2b7523bf9..e255fc467 100644
--- a/app/javascript/dashboard/i18n/locale/pt/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/pt/integrations.json
@@ -390,12 +390,12 @@
},
"CAPTAIN": {
"NAME": "Captain",
- "HEADER_KNOW_MORE": "Know more",
+ "HEADER_KNOW_MORE": "Saiba mais",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "ASSISTANTS": "Assistentes",
+ "SWITCH_ASSISTANT": "Alternar entre assistentes",
+ "NEW_ASSISTANT": "Criar Assistente",
+ "EMPTY_LIST": "Nenhum assistente encontrado, por favor crie um para começar"
},
"COPILOT": {
"TITLE": "Copilot",
@@ -404,12 +404,12 @@
"KICK_OFF_MESSAGE": "Precisa de um resumo rápido, quer consultar conversas anteriores ou redigir uma resposta melhor? O Copilot está aqui para acelerar o processo.",
"SEND_MESSAGE": "Enviar mensagem...",
"EMPTY_MESSAGE": "Ocorreu um erro ao gerar a resposta. Por favor, tente novamente.",
- "LOADER": "Captain is thinking",
+ "LOADER": "Captain está pensando",
"YOU": "Você",
- "USE": "Use this",
- "RESET": "Reset",
+ "USE": "Usar isto",
+ "RESET": "Resetar",
"SHOW_STEPS": "Mostrar passos",
- "SELECT_ASSISTANT": "Select Assistant",
+ "SELECT_ASSISTANT": "Selecionar Assistente",
"PROMPTS": {
"SUMMARIZE": {
"LABEL": "Resumir esta conversa",
@@ -435,27 +435,27 @@
},
"PLAYGROUND": {
"USER": "Você",
- "ASSISTANT": "Assistant",
+ "ASSISTANT": "Assistente",
"MESSAGE_PLACEHOLDER": "Escreva a sua mensagem...",
- "HEADER": "Playground",
+ "HEADER": "Área de testes",
"DESCRIPTION": "Use este playground para enviar mensagens para o seu assistente e verificar se ele responde com precisão, rápido e no tom esperado.",
"CREDIT_NOTE": "As mensagens aqui enviadas vão contar para os créditos do seu Captain."
},
"PAYWALL": {
- "TITLE": "Upgrade to use Captain AI",
- "AVAILABLE_ON": "Captain is not available on the free plan.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "TITLE": "Faça upgrade para usar o Captain AI",
+ "AVAILABLE_ON": "Captain não está disponível no plano gratuito.",
+ "UPGRADE_PROMPT": "Faça upgrade do seu plano para ter acesso aos nossos assistentes, copiloto e mais.",
"UPGRADE_NOW": "Fazer upgrade agora",
"CANCEL_ANYTIME": "Pode alterar ou cancelar o plano a qualquer momento"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "AVAILABLE_ON": "Captain AI está disponível apenas nos planos Enterprise.",
+ "UPGRADE_PROMPT": "Faça upgrade do seu plano para ter acesso aos nossos assistentes, copiloto e mais.",
"ASK_ADMIN": "Por favor, entre em contato com o administrador para atualização."
},
"BANNER": {
- "RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
- "DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
+ "RESPONSES": "Você usou mais de 80% do seu limite de respostas. Para continuar usando o Captain AI, por favor faça upgrade.",
+ "DOCUMENTS": "Limite de documentos atingido. Faça upgrade para continuar utilizando o Captain AI."
},
"FORM": {
"CANCEL": "Cancelar",
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
+ "SELECTED": "{count} selected",
+ "SELECT_ALL": "Selecionar todas ({count})",
+ "UNSELECT_ALL": "Desmarcar todas ({count})",
+ "BULK_DELETE_BUTTON": "Excluir",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Yes, delete all",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Ferramentas",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Descrição",
diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/auditLogs.json b/app/javascript/dashboard/i18n/locale/pt_BR/auditLogs.json
index 7c71eed03..9112729c4 100644
--- a/app/javascript/dashboard/i18n/locale/pt_BR/auditLogs.json
+++ b/app/javascript/dashboard/i18n/locale/pt_BR/auditLogs.json
@@ -18,7 +18,7 @@
}
},
"API": {
- "SUCCESS_MESSAGE": "AuditLogs recuperados com sucesso",
+ "SUCCESS_MESSAGE": "Logs de auditoria recuperados com sucesso",
"ERROR_MESSAGE": "Não foi possível conectar ao servidor Woot, por favor tente novamente mais tarde"
},
"DEFAULT_USER": "Sistema",
diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/chatlist.json b/app/javascript/dashboard/i18n/locale/pt_BR/chatlist.json
index ff4711143..1afef7efe 100644
--- a/app/javascript/dashboard/i18n/locale/pt_BR/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/pt_BR/chatlist.json
@@ -131,7 +131,7 @@
"RECEIVED_VIA_EMAIL": "Recebido por e-mail",
"VIEW_TWEET_IN_TWITTER": "Ver tweet no Twitter",
"REPLY_TO_TWEET": "Responder a este tweet",
- "LINK_TO_STORY": "Vá para o Story do Instagram",
+ "LINK_TO_STORY": "Ir para o Story do Instagram",
"SENT": "Enviado com sucesso",
"READ": "Lido com sucesso",
"DELIVERED": "Entregue com sucesso",
diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/helpCenter.json b/app/javascript/dashboard/i18n/locale/pt_BR/helpCenter.json
index 40f2f7941..89da93b62 100644
--- a/app/javascript/dashboard/i18n/locale/pt_BR/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/pt_BR/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Localização removida do portal com sucesso",
"ERROR_MESSAGE": "Não é possível remover a localidade do portal. Tente novamente."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Localidade movida para rascunho com sucesso",
+ "ERROR_MESSAGE": "Não foi possível mover a localidade para rascunho. Tente novamente."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Localidade publicada com sucesso",
+ "ERROR_MESSAGE": "Não foi possível publicar a localidade. Tente novamente."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "artigo {count} | {count} artigos",
"CATEGORIES_COUNT": "categoria {count} | {count} categorias",
"DEFAULT": "Padrão",
+ "DRAFT": "Rascunho",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Tornar padrão",
+ "MOVE_TO_DRAFT": "Mover para rascunho",
+ "PUBLISH_LOCALE": "Publicar localidade",
"DELETE": "Excluir"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Selecionar local..."
},
+ "STATUS": {
+ "LABEL": "Status",
+ "OPTIONS": {
+ "LIVE": "Publicado",
+ "DRAFT": "Rascunho"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Localidade adicionada com sucesso",
"ERROR_MESSAGE": "Não foi possível adicionar a localidade. Tente novamente."
diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/integrations.json b/app/javascript/dashboard/i18n/locale/pt_BR/integrations.json
index 15a995d98..3ffadb1d9 100644
--- a/app/javascript/dashboard/i18n/locale/pt_BR/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/pt_BR/integrations.json
@@ -126,7 +126,7 @@
},
"HELP_TEXT": {
"TITLE": "Usando a integração com Slack",
- "BODY": "Com essa integração, todas as suas conversas recebidas serão sincronizadas com o canal ***{selectedChannelName}*** em seu espaço de trabalho Slack. Você pode gerenciar todas as suas conversas com clientes diretamente no canal e nunca perder uma mensagem.\n\nAqui estão os principais recursos da integração:\n\n**Responda a conversas de dentro do Slack:** Para responder a uma conversa no canal ***{selectedChannelName}*** Slack, simplesmente digite a sua mensagem e envie-a como um tópico. Isso criará uma resposta ao cliente através do Chatwoot. É tão simples!\n\n **Crie notas privadas:** Se você quiser criar notas privadas em vez de respostas, inicie sua mensagem com ***`nota:`***. Isso garante que sua mensagem seja privada e não seja visível para o cliente.\n\n**Associar um perfil de agente:** Se a pessoa que respondeu no Slack tem um perfil de agente no Chatwoot sob o mesmo e-mail, as respostas serão associadas automaticamente com esse perfil de agente. Isso significa que você pode facilmente controlar quem disse o quê e quando. Por outro lado, quando o respondente não tiver um perfil de agente associado, as respostas aparecerão do perfil do bot para o cliente.",
+ "BODY": "Com essa integração, todas as suas conversas recebidas serão sincronizadas com o canal ***{selectedChannelName}*** em seu espaço de trabalho Slack. Você pode gerenciar todas as suas conversas com clientes diretamente no canal e nunca perder uma mensagem.\n\nAqui estão os principais recursos da integração:\n\n**Responda a conversas de dentro do Slack:** Para responder a uma conversa no canal ***{selectedChannelName}*** Slack, simplesmente digite a sua mensagem e envie-a como um tópico. Isso criará uma resposta ao cliente por meio do Chatwoot. Simples assim!\n\n **Crie notas privadas:** Se você quiser criar notas privadas em vez de respostas, inicie sua mensagem com ***`nota:`***. Isso garante que sua mensagem seja privada e não seja visível para o cliente.\n\n**Associar um perfil de agente:** Se a pessoa que respondeu no Slack tem um perfil de agente no Chatwoot sob o mesmo e-mail, as respostas serão associadas automaticamente com esse perfil de agente. Isso significa que você pode facilmente controlar quem disse o quê e quando. Por outro lado, quando o respondente não tiver um perfil de agente associado, as respostas aparecerão do perfil do bot para o cliente.",
"SELECTED": "selecionar"
},
"SELECT_CHANNEL": {
@@ -437,7 +437,7 @@
"USER": "Você",
"ASSISTANT": "Assistente",
"MESSAGE_PLACEHOLDER": "Digite sua mensagem...",
- "HEADER": "Playground",
+ "HEADER": "Área de testes",
"DESCRIPTION": "Use este playground para enviar mensagens para seu assistente e verificar se ele responde com precisão, rápido e no tom que você espera.",
"CREDIT_NOTE": "As mensagens enviadas aqui usam os créditos do seu Capitão."
},
@@ -528,7 +528,7 @@
"ALLOW_CONVERSATION_FAQS": "Gerar perguntas frequentes a partir de conversas resolvidas",
"ALLOW_MEMORIES": "Capture os principais detalhes como memórias de interações do cliente.",
"ALLOW_CITATIONS": "Incluir fonte de citações nas respostas",
- "ALLOW_CONTACT_ATTRIBUTES": "Allow access to contact information"
+ "ALLOW_CONTACT_ATTRIBUTES": "Permitir acesso às informações do contato"
}
},
"EDIT": {
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documentos",
"ADD_NEW": "Criar um novo documento",
+ "SELECTED": "{count} selecionado",
+ "SELECT_ALL": "Selecionar todos ({count})",
+ "UNSELECT_ALL": "Desmarcar todos ({count})",
+ "BULK_DELETE_BUTTON": "Excluir",
+ "BULK_DELETE": {
+ "TITLE": "Excluir documentos?",
+ "DESCRIPTION": "Você tem certeza que deseja excluir os documentos selecionados? Esta ação não pode ser desfeita.",
+ "CONFIRM": "Sim, excluir todas",
+ "SUCCESS_MESSAGE": "Documentos excluídos com sucesso",
+ "ERROR_MESSAGE": "Ocorreu um erro ao excluir os documentos, por favor novamente."
+ },
"RELATED_RESPONSES": {
"TITLE": "FAQs Relacionadas",
"DESCRIPTION": "Estes FAQs são gerados diretamente a partir do documento."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Ferramentas",
"ADD_NEW": "Criar ferramenta",
+ "SOFT_LIMIT_WARNING": "Ter mais de 10 ferramentas pode reduzir a confiabilidade do assistente na seleção da ferramenta certa. Considere remover ferramentas não utilizadas para melhores resultados.",
"EMPTY_STATE": {
"TITLE": "Não há ferramentas personalizadas disponíveis",
"SUBTITLE": "Crie ferramentas personalizadas para conectar com APIs e serviços externos, permitindo obter dados e agir por você.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Ferramenta personalizada excluída com sucesso",
"ERROR_MESSAGE": "Falha ao excluir a ferramenta personalizada"
},
+ "TEST": {
+ "BUTTON": "Testar conexão",
+ "SUCCESS": "Endpoint retornou HTTP {status}",
+ "ERROR": "Conexão falhou",
+ "DISABLED_HINT": "Testes estão disponíveis apenas para endpoints que não possuem modelos ou corpos de requisição."
+ },
"FORM": {
"TITLE": {
"LABEL": "Nome da Ferramenta",
"PLACEHOLDER": "Consulta de pedido",
- "ERROR": "Nome da ferramente obrigatória"
+ "ERROR": "Nome da ferramente obrigatória",
+ "MAX_LENGTH_ERROR": "O nome da ferramenta deve ter {max} caracteres ou menos"
},
"DESCRIPTION": {
"LABEL": "Descrição",
diff --git a/app/javascript/dashboard/i18n/locale/ro/conversation.json b/app/javascript/dashboard/i18n/locale/ro/conversation.json
index a6d388dca..f203c430c 100644
--- a/app/javascript/dashboard/i18n/locale/ro/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ro/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Semnătura mesajului nu este configurată, vă rugăm să o configurați în setările profilului.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "Oferă-i copilotului instrucțiuni suplimentare sau întreabă altceva... Apasă Enter pentru a trimite un mesaj ulterior",
"CLICK_HERE": "Click aici pentru a actualiza",
"WHATSAPP_TEMPLATES": "Șabloane WhatsApp"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Trageți și plasați aici pentru atașare",
"START_AUDIO_RECORDING": "Pornirea înregistrării audio",
"STOP_AUDIO_RECORDING": "Mesaj audio",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot se gândește",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Adaugă bcc",
diff --git a/app/javascript/dashboard/i18n/locale/ro/helpCenter.json b/app/javascript/dashboard/i18n/locale/ro/helpCenter.json
index 9a2c2ab2b..a33428b57 100644
--- a/app/javascript/dashboard/i18n/locale/ro/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/ro/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Limbă ștearsă din portal cu succes",
"ERROR_MESSAGE": "Nu s-a putut elimina limba din portal. Încercați din nou."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Implicit",
+ "DRAFT": "Ciornă",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Şterge"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Select locale..."
},
+ "STATUS": {
+ "LABEL": "Status",
+ "OPTIONS": {
+ "LIVE": "Publicat",
+ "DRAFT": "Ciornă"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Limbă adăugata cu succes",
"ERROR_MESSAGE": "Nu se poate adăuga limba. Încercați din nou."
diff --git a/app/javascript/dashboard/i18n/locale/ro/integrations.json b/app/javascript/dashboard/i18n/locale/ro/integrations.json
index bf92f0992..717d29899 100644
--- a/app/javascript/dashboard/i18n/locale/ro/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ro/integrations.json
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Captain",
- "HEADER_KNOW_MORE": "Know more",
+ "HEADER_KNOW_MORE": "Aflați mai multe",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "ASSISTANTS": "Asistenți",
+ "SWITCH_ASSISTANT": "Comutați între asistenți",
+ "NEW_ASSISTANT": "Creați un asistent",
+ "EMPTY_LIST": "Nu s-au găsit asistenți. Creați unul pentru a începe"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "PANEL_TITLE": "Începeți cu Copilot",
+ "KICK_OFF_MESSAGE": "Aveți nevoie de un rezumat rapid, doriți să verificați conversațiile anterioare sau să redactați un răspuns mai bun? Copilot este aici pentru a accelera lucrurile.",
"SEND_MESSAGE": "Trimite mesaj...",
- "EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
- "LOADER": "Captain is thinking",
+ "EMPTY_MESSAGE": "A apărut o eroare la generarea răspunsului. Vă rugăm să încercați din nou.",
+ "LOADER": "Captain se gândește",
"YOU": "You",
- "USE": "Use this",
- "RESET": "Reset",
- "SHOW_STEPS": "Show steps",
- "SELECT_ASSISTANT": "Select Assistant",
+ "USE": "Utilizați acest lucru",
+ "RESET": "Resetați",
+ "SHOW_STEPS": "Afișați pașii",
+ "SELECT_ASSISTANT": "Selectați asistentul",
"PROMPTS": {
"SUMMARIZE": {
- "LABEL": "Summarize this conversation",
- "CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
+ "LABEL": "Rezumați această conversație",
+ "CONTENT": "Rezumați punctele-cheie discutate între client și agentul de suport, incluzând preocupările și întrebările clientului, precum și soluțiile sau răspunsurile oferite de agentul de suport"
},
"SUGGEST": {
- "LABEL": "Suggest an answer",
- "CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
+ "LABEL": "Sugerați un răspuns",
+ "CONTENT": "Analizați solicitarea clientului și redactați un răspuns care abordează eficient preocupările sau întrebările acestuia. Asigurați-vă că răspunsul este clar, concis și oferă informații utile."
},
"RATE": {
- "LABEL": "Rate this conversation",
- "CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
+ "LABEL": "Evaluați această conversație",
+ "CONTENT": "Analizați conversația pentru a vedea cât de bine răspunde nevoilor clientului. Oferiți o evaluare din 5 pe baza tonului, clarității și eficacității."
},
"HIGH_PRIORITY": {
- "LABEL": "High priority conversations",
- "CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
+ "LABEL": "Conversații cu prioritate ridicată",
+ "CONTENT": "Oferă-mi un rezumat al tuturor conversațiilor deschise cu prioritate ridicată. Include ID-ul conversației, numele clientului (dacă este disponibil), conținutul ultimului mesaj și agentul atribuit. Grupează după stare, dacă este relevant."
},
"LIST_CONTACTS": {
- "LABEL": "List contacts",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "LABEL": "Listați contactele",
+ "CONTENT": "Arată-mi lista primelor 10 contacte. Include numele, e-mailul sau numărul de telefon (dacă sunt disponibile), ora ultimei activități și etichetele (dacă există)."
}
}
},
"PLAYGROUND": {
"USER": "You",
- "ASSISTANT": "Assistant",
+ "ASSISTANT": "Asistent",
"MESSAGE_PLACEHOLDER": "Scrie mesajul tău...",
- "HEADER": "Playground",
- "DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
- "CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
+ "HEADER": "Mediu de testare",
+ "DESCRIPTION": "Utilizați acest Playground pentru a trimite mesaje asistentului și pentru a verifica dacă răspunde corect, rapid și în tonul pe care îl așteptați.",
+ "CREDIT_NOTE": "Mesajele trimise aici se vor deduce din creditele Captain."
},
"PAYWALL": {
- "TITLE": "Upgrade to use Captain AI",
- "AVAILABLE_ON": "Captain is not available on the free plan.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "TITLE": "Faceți upgrade pentru a utiliza Captain AI",
+ "AVAILABLE_ON": "Captain nu este disponibil în planul gratuit.",
+ "UPGRADE_PROMPT": "Faceți upgrade la plan pentru a avea acces la asistenții noștri, Copilot și altele.",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "AVAILABLE_ON": "Captain AI este disponibil doar în planurile Enterprise.",
+ "UPGRADE_PROMPT": "Faceți upgrade la plan pentru a avea acces la asistenții noștri, Copilot și altele.",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"BANNER": {
- "RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
- "DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
+ "RESPONSES": "Ați utilizat peste 80% din limita de răspunsuri. Pentru a continua să utilizați Captain AI, faceți upgrade.",
+ "DOCUMENTS": "Limita de documente a fost atinsă. Faceți upgrade pentru a continua să utilizați Captain AI."
},
"FORM": {
"CANCEL": "Renunță",
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
+ "SELECTED": "{count} selected",
+ "SELECT_ALL": "Select all ({count})",
+ "UNSELECT_ALL": "Unselect all ({count})",
+ "BULK_DELETE_BUTTON": "Şterge",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Yes, delete all",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Descriere",
diff --git a/app/javascript/dashboard/i18n/locale/ru/helpCenter.json b/app/javascript/dashboard/i18n/locale/ru/helpCenter.json
index 8f88b2b7f..fd94877c8 100644
--- a/app/javascript/dashboard/i18n/locale/ru/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/ru/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Локаль успешно удалена из портала",
"ERROR_MESSAGE": "Невозможно удалить локаль из портала. Повторите попытку."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} статьи | {count} статьи",
"CATEGORIES_COUNT": "{count} категория | {count} категории",
"DEFAULT": "По умолчанию",
+ "DRAFT": "Черновик",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Сделать по умолчанию",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Удалить"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Выберите язык..."
},
+ "STATUS": {
+ "LABEL": "Статус",
+ "OPTIONS": {
+ "LIVE": "Опубликовано",
+ "DRAFT": "Черновик"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Локаль успешно добавлен",
"ERROR_MESSAGE": "Не удалось добавить локаль. Попробуйте еще раз."
diff --git a/app/javascript/dashboard/i18n/locale/ru/integrations.json b/app/javascript/dashboard/i18n/locale/ru/integrations.json
index fd472051f..fd6654a7a 100644
--- a/app/javascript/dashboard/i18n/locale/ru/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ru/integrations.json
@@ -390,12 +390,12 @@
},
"CAPTAIN": {
"NAME": "Капитан",
- "HEADER_KNOW_MORE": "Know more",
+ "HEADER_KNOW_MORE": "Узнать больше",
"ASSISTANT_SWITCHER": {
"ASSISTANTS": "Ассистенты",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "SWITCH_ASSISTANT": "Переключиться между помощниками",
+ "NEW_ASSISTANT": "Создать помощника",
+ "EMPTY_LIST": "Список помощников пуст, пожалуйста, создайте помощника, чтобы начать работу"
},
"COPILOT": {
"TITLE": "Copilot",
@@ -449,7 +449,7 @@
"CANCEL_ANYTIME": "Вы можете изменить или отменить ваш тарифный план в любое время"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
+ "AVAILABLE_ON": "Captain AI доступен только в тарифных планах Enterprise.",
"UPGRADE_PROMPT": "Обновите тарифный план, чтобы получить доступ к нашим ассистентам, copilot и другим функциям.",
"ASK_ADMIN": "Пожалуйста, обратитесь к вашему администратору для обновления."
},
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Документы",
"ADD_NEW": "Создать новый документ",
+ "SELECTED": "Выбрано {count}",
+ "SELECT_ALL": "Выбрать все ({count})",
+ "UNSELECT_ALL": "Сбросить все ({count})",
+ "BULK_DELETE_BUTTON": "Удалить",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Да, удалить всё",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Связанные FAQ",
"DESCRIPTION": "Эти FAQ генерируются напрямую из документа."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Инструменты",
"ADD_NEW": "Создать новый инструмент",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "Нет доступных пользовательских инструментов",
"SUBTITLE": "Создавайте пользовательские инструменты, чтобы подключить ассистента к внешним API и сервисам, позволяя получать данные и выполнять действия от вашего имени.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Пользовательский инструмент успешно удален",
"ERROR_MESSAGE": "Не удалось удалить пользовательский инструмент"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Название инструмента",
"PLACEHOLDER": "Поиск заказа",
- "ERROR": "Название инструмента обязательно"
+ "ERROR": "Название инструмента обязательно",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Описание",
diff --git a/app/javascript/dashboard/i18n/locale/sh/contact.json b/app/javascript/dashboard/i18n/locale/sh/contact.json
index 48d45d737..13214db58 100644
--- a/app/javascript/dashboard/i18n/locale/sh/contact.json
+++ b/app/javascript/dashboard/i18n/locale/sh/contact.json
@@ -256,7 +256,7 @@
},
"MERGE_CONTACTS": {
"TITLE": "Merge contacts",
- "DESCRIPTION": "Merge contacts to combine two profiles into one, including all attributes and conversations. In case of conflict, the Primary contact’ s attributes will take precedence.",
+ "DESCRIPTION": "Merge contacts to combine two profiles into one, including all attributes and conversations. In case of conflict, the Primary contact’s attributes will take precedence.",
"PRIMARY": {
"TITLE": "Primary contact",
"HELP_LABEL": "To be deleted"
@@ -331,7 +331,7 @@
"TITLE": "Export contacts",
"DESCRIPTION": "Quickly export a csv file with comprehensive details of your contacts",
"CONFIRM": "Export",
- "SUCCESS_MESSAGE": "Export is in progress, You will be notified via email when export file is ready to dowanlod.",
+ "SUCCESS_MESSAGE": "Export is in progress. You will be notified on email when the export file is ready to download.",
"ERROR_MESSAGE": "There was an error, please try again"
},
"SORT_BY": {
@@ -376,7 +376,7 @@
}
},
"PAGINATION_FOOTER": {
- "SHOWING": "Showing {startItem} - {endItem} of {totalItems} contacts"
+ "SHOWING": "Showing {startItem} - {endItem} of {totalItems} contact | Showing {startItem} - {endItem} of {totalItems} contacts"
},
"FILTER": {
"NAME": "Name",
diff --git a/app/javascript/dashboard/i18n/locale/sh/conversation.json b/app/javascript/dashboard/i18n/locale/sh/conversation.json
index 6e59720a5..0b93ec39e 100644
--- a/app/javascript/dashboard/i18n/locale/sh/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/sh/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Message signature is not configured, please configure it in profile settings.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "Dajte copilotu dodatne upite ili pitajte bilo šta... Pritisnite enter za slanje nastavka",
"CLICK_HERE": "Click here to update",
"WHATSAPP_TEMPLATES": "Whatsapp Templates"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Prevucite ovde za dodavanje",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot razmišlja",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Dodaj bcc",
diff --git a/app/javascript/dashboard/i18n/locale/sh/helpCenter.json b/app/javascript/dashboard/i18n/locale/sh/helpCenter.json
index 69a72f163..09fefffb6 100644
--- a/app/javascript/dashboard/i18n/locale/sh/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/sh/helpCenter.json
@@ -1,20 +1,20 @@
{
"HELP_CENTER": {
- "TITLE": "Help Center",
+ "TITLE": "Centar za pomoć",
"NEW_PAGE": {
- "DESCRIPTION": "Create self-service help center portals for your customers. Help them find answers quickly, without waiting. Streamline inquiries, boost agent efficiency, and elevate customer support.",
- "CREATE_PORTAL_BUTTON": "Create Portal"
+ "DESCRIPTION": "Kreiraj portale za samopomoć korisnicima. Omogući im da brzo pronađu odgovore, bez čekanja. Pojednostavi upite, poboljšaj efikasnost agenata i unapredi korisničku podršku.",
+ "CREATE_PORTAL_BUTTON": "Kreiraj portal"
},
"HEADER": {
- "FILTER": "Filter by",
- "SORT": "Sort by",
- "LOCALE": "Locale",
- "SETTINGS_BUTTON": "Settings",
- "NEW_BUTTON": "New Article",
+ "FILTER": "Filtrovanje po",
+ "SORT": "Sortiraj po",
+ "LOCALE": "Jezik",
+ "SETTINGS_BUTTON": "Podešavanja",
+ "NEW_BUTTON": "Novi članak",
"DROPDOWN_OPTIONS": {
- "PUBLISHED": "Published",
- "DRAFT": "Draft",
- "ARCHIVED": "Archived"
+ "PUBLISHED": "Objavljeno",
+ "DRAFT": "Nacrt",
+ "ARCHIVED": "Arhivirano"
},
"TITLES": {
"ALL_ARTICLES": "All Articles",
@@ -23,139 +23,139 @@
"ARCHIVED": "Archived Articles"
},
"LOCALE_SELECT": {
- "TITLE": "Select locale",
- "PLACEHOLDER": "Select locale",
- "NO_RESULT": "No locale found",
- "SEARCH_PLACEHOLDER": "Search locale"
+ "TITLE": "Izaberi jezik",
+ "PLACEHOLDER": "Izaberi jezik",
+ "NO_RESULT": "Nije pronađen jezik",
+ "SEARCH_PLACEHOLDER": "Pretraži jezik"
}
},
"EDIT_HEADER": {
"ALL_ARTICLES": "All Articles",
- "PUBLISH_BUTTON": "Publish",
- "MOVE_TO_ARCHIVE_BUTTON": "Move to archived",
- "PREVIEW": "Preview",
- "ADD_TRANSLATION": "Add translation",
- "OPEN_SIDEBAR": "Open sidebar",
- "CLOSE_SIDEBAR": "Close sidebar",
- "SAVING": "Saving...",
- "SAVED": "Saved"
+ "PUBLISH_BUTTON": "Objavi",
+ "MOVE_TO_ARCHIVE_BUTTON": "Premesti u arhivu",
+ "PREVIEW": "Pregled",
+ "ADD_TRANSLATION": "Dodaj prevod",
+ "OPEN_SIDEBAR": "Otvori bočnu traku",
+ "CLOSE_SIDEBAR": "Zatvori bočnu traku",
+ "SAVING": "Čuvanje...",
+ "SAVED": "Sačuvano"
},
"ARTICLE_EDITOR": {
"IMAGE_UPLOAD": {
- "TITLE": "Upload image",
- "UPLOADING": "Uploading...",
- "SUCCESS": "Image uploaded successfully",
- "ERROR": "Error while uploading image",
- "UN_AUTHORIZED_ERROR": "You are not authorized to upload images",
+ "TITLE": "Otpremi sliku",
+ "UPLOADING": "Otpremanje...",
+ "SUCCESS": "Slika je uspešno otpremljena",
+ "ERROR": "Greška pri otpremanju slike",
+ "UN_AUTHORIZED_ERROR": "Nemate dozvolu za otpremanje slika",
"ERROR_FILE_SIZE": "Image size should be less than {size}MB",
- "ERROR_FILE_FORMAT": "Image format should be jpg, jpeg or png",
- "ERROR_FILE_DIMENSIONS": "Image dimensions should be less than 2000 x 2000"
+ "ERROR_FILE_FORMAT": "Format slike mora biti jpg, jpeg ili png",
+ "ERROR_FILE_DIMENSIONS": "Dimenzije slike moraju biti manje od 2000 x 2000"
}
},
"ARTICLE_SETTINGS": {
- "TITLE": "Article Settings",
+ "TITLE": "Cilësimet e artikullit",
"FORM": {
"CATEGORY": {
- "LABEL": "Category",
- "TITLE": "Select category",
- "PLACEHOLDER": "Select category",
- "NO_RESULT": "No category found",
- "SEARCH_PLACEHOLDER": "Search category"
+ "LABEL": "Kategorija",
+ "TITLE": "Izaberite kategoriju",
+ "PLACEHOLDER": "Izaberite kategoriju",
+ "NO_RESULT": "Kategorija nije pronađena",
+ "SEARCH_PLACEHOLDER": "Pretraži kategoriju"
},
"AUTHOR": {
- "LABEL": "Author",
- "TITLE": "Select author",
- "PLACEHOLDER": "Select author",
- "NO_RESULT": "No authors found",
- "SEARCH_PLACEHOLDER": "Search author"
+ "LABEL": "Autor",
+ "TITLE": "Izaberite autora",
+ "PLACEHOLDER": "Izaberite autora",
+ "NO_RESULT": "Nuk u gjetën autori",
+ "SEARCH_PLACEHOLDER": "Pretraži autora"
},
"META_TITLE": {
- "LABEL": "Meta title",
- "PLACEHOLDER": "Add a meta title"
+ "LABEL": "Meta titulli",
+ "PLACEHOLDER": "Shto meta titull"
},
"META_DESCRIPTION": {
- "LABEL": "Meta description",
- "PLACEHOLDER": "Add your meta description for better SEO results..."
+ "LABEL": "Meta përshkrimi",
+ "PLACEHOLDER": "Shto përshkrimin tënd meta për rezultate më të mira SEO..."
},
"META_TAGS": {
- "LABEL": "Meta tags",
- "PLACEHOLDER": "Add meta tags separated by comma..."
+ "LABEL": "Meta etiketat",
+ "PLACEHOLDER": "Shto meta etiketat të ndara me presje..."
}
},
"BUTTONS": {
- "ARCHIVE": "Archive article",
- "DELETE": "Delete article"
+ "ARCHIVE": "Arkivo artikullin",
+ "DELETE": "Fshi artikullin"
}
},
"ARTICLE_SEARCH_RESULT": {
- "UNCATEGORIZED": "Uncategorized",
+ "UNCATEGORIZED": "Nekategorizovano",
"SEARCH_RESULTS": "Search results for {query}",
- "EMPTY_TEXT": "Search for articles to insert into replies.",
- "SEARCH_LOADER": "Searching...",
- "INSERT_ARTICLE": "Insert",
- "NO_RESULT": "No articles found",
- "COPY_LINK": "Copy article link to clipboard",
- "OPEN_LINK": "Open article in new tab",
- "PREVIEW_LINK": "Preview article"
+ "EMPTY_TEXT": "Pretražite članke za ubacivanje u odgovore.",
+ "SEARCH_LOADER": "Pretraga...",
+ "INSERT_ARTICLE": "Ubaci",
+ "NO_RESULT": "Nema pronađenih članaka",
+ "COPY_LINK": "Kopiraj link članka",
+ "OPEN_LINK": "Otvori članak u novoj kartici",
+ "PREVIEW_LINK": "Pregledaj članak"
},
"PORTAL": {
- "HEADER": "Portals",
- "DEFAULT": "Default",
- "NEW_BUTTON": "New Portal",
- "ACTIVE_BADGE": "active",
- "CHOOSE_LOCALE_LABEL": "Choose a locale",
- "LOADING_MESSAGE": "Loading portals...",
- "ARTICLES_LABEL": "articles",
- "NO_PORTALS_MESSAGE": "There are no available portals",
- "ADD_NEW_LOCALE": "Add a new locale",
+ "HEADER": "Portale",
+ "DEFAULT": "Podrazumevano",
+ "NEW_BUTTON": "Portal i ri",
+ "ACTIVE_BADGE": "aktivan",
+ "CHOOSE_LOCALE_LABEL": "Izaberi lokalizaciju",
+ "LOADING_MESSAGE": "Učitavanje portala...",
+ "ARTICLES_LABEL": "članci",
+ "NO_PORTALS_MESSAGE": "Nema dostupnih portala",
+ "ADD_NEW_LOCALE": "Dodaj novu lokalizaciju",
"POPOVER": {
- "TITLE": "Portals",
- "PORTAL_SETTINGS": "Portal settings",
- "SUBTITLE": "You have multiple portals and can have different locales for each portal.",
- "CANCEL_BUTTON_LABEL": "Cancel",
- "CHOOSE_LOCALE_BUTTON": "Choose Locale"
+ "TITLE": "Portali",
+ "PORTAL_SETTINGS": "Cilësimet e portalit",
+ "SUBTITLE": "Imate više portala i možete imati različite lokalizacije za svaki portal.",
+ "CANCEL_BUTTON_LABEL": "Otkaži",
+ "CHOOSE_LOCALE_BUTTON": "Izaberi lokalizaciju"
},
"PORTAL_SETTINGS": {
"LIST_ITEM": {
"HEADER": {
- "COUNT_LABEL": "articles",
- "ADD": "Add locale",
- "VISIT": "Visit site",
- "SETTINGS": "Settings",
- "DELETE": "Delete"
+ "COUNT_LABEL": "artikuj",
+ "ADD": "Shto gjuhë",
+ "VISIT": "Vizito faqen",
+ "SETTINGS": "Cilësimet",
+ "DELETE": "Obriši"
},
"PORTAL_CONFIG": {
- "TITLE": "Portal Configurations",
+ "TITLE": "Konfigurimet e portalit",
"ITEMS": {
- "NAME": "Name",
- "DOMAIN": "Custom domain",
+ "NAME": "Emri",
+ "DOMAIN": "Domain i personalizuar",
"SLUG": "Slug",
- "TITLE": "Portal title",
- "THEME": "Theme color",
- "SUB_TEXT": "Portal sub text"
+ "TITLE": "Titulli i portalit",
+ "THEME": "Ngjyra e temës",
+ "SUB_TEXT": "Nëntitulli i portalit"
}
},
"AVAILABLE_LOCALES": {
- "TITLE": "Available locales",
+ "TITLE": "Gjuhët në dispozicion",
"TABLE": {
- "NAME": "Locale name",
- "CODE": "Locale code",
- "ARTICLE_COUNT": "No. of articles",
- "CATEGORIES": "No. of categories",
- "SWAP": "Swap",
- "DELETE": "Delete",
- "DEFAULT_LOCALE": "Default"
+ "NAME": "Emri i gjuhës",
+ "CODE": "Kodi i gjuhës",
+ "ARTICLE_COUNT": "Numri i artikujve",
+ "CATEGORIES": "Numri i kategorive",
+ "SWAP": "Ndërrim",
+ "DELETE": "Fshi",
+ "DEFAULT_LOCALE": "Parazgjedhur"
}
}
},
"DELETE_PORTAL": {
- "TITLE": "Delete portal",
- "MESSAGE": "Are you sure you want to delete this portal",
- "YES": "Yes, delete portal",
- "NO": "No, keep portal",
+ "TITLE": "Obriši portal",
+ "MESSAGE": "Da li ste sigurni da želite da obrišete ovaj portal?",
+ "YES": "Da, obriši portal",
+ "NO": "Ne, zadrži portal",
"API": {
- "DELETE_SUCCESS": "Portal deleted successfully",
- "DELETE_ERROR": "Error while deleting portal"
+ "DELETE_SUCCESS": "Portal je uspešno obrisan",
+ "DELETE_ERROR": "Greška pri brisanju portala"
}
},
"SEND_CNAME_INSTRUCTIONS": {
@@ -166,212 +166,224 @@
}
},
"EDIT": {
- "HEADER_TEXT": "Edit portal",
+ "HEADER_TEXT": "Izmeni portal",
"TABS": {
"BASIC_SETTINGS": {
- "TITLE": "Basic information"
+ "TITLE": "Osnovne informacije"
},
"CUSTOMIZATION_SETTINGS": {
- "TITLE": "Portal customization"
+ "TITLE": "Prilagođavanje portala"
},
"CATEGORY_SETTINGS": {
- "TITLE": "Categories"
+ "TITLE": "Kategorije"
},
"LOCALE_SETTINGS": {
- "TITLE": "Locales"
+ "TITLE": "Jezici"
}
},
"CATEGORIES": {
- "TITLE": "Categories in",
- "NEW_CATEGORY": "New category",
+ "TITLE": "Kategorije u",
+ "NEW_CATEGORY": "Nova kategorija",
"TABLE": {
- "NAME": "Name",
- "DESCRIPTION": "Description",
- "LOCALE": "Locale",
- "ARTICLE_COUNT": "No. of articles",
+ "NAME": "Naziv",
+ "DESCRIPTION": "Opis",
+ "LOCALE": "Jezik",
+ "ARTICLE_COUNT": "Broj članaka",
"ACTION_BUTTON": {
- "EDIT": "Edit category",
- "DELETE": "Delete category"
+ "EDIT": "Izmeni kategoriju",
+ "DELETE": "Obriši kategoriju"
},
- "EMPTY_TEXT": "No categories found"
+ "EMPTY_TEXT": "Nema pronađenih kategorija"
}
},
"EDIT_BASIC_INFO": {
- "BUTTON_TEXT": "Update basic settings"
+ "BUTTON_TEXT": "Ažuriraj osnovna podešavanja"
}
},
"ADD": {
"CREATE_FLOW": {
"BASIC": {
- "TITLE": "Help center information",
- "BODY": "Basic information about portal"
+ "TITLE": "Informacije o centru za pomoć",
+ "BODY": "Osnovne informacije o portalu"
},
"CUSTOMIZATION": {
- "TITLE": "Help center customization",
- "BODY": "Customize portal"
+ "TITLE": "Prilagođavanje centra za pomoć",
+ "BODY": "Prilagodi portal"
},
"FINISH": {
"TITLE": "Voila! 🎉",
- "BODY": "You're all set!"
+ "BODY": "Sve je spremno!"
}
},
"CREATE_FLOW_PAGE": {
- "BACK_BUTTON": "Back",
+ "BACK_BUTTON": "Nazad",
"BASIC_SETTINGS_PAGE": {
- "HEADER": "Create Portal",
- "TITLE": "Help center information",
- "CREATE_BASIC_SETTING_BUTTON": "Create portal basic settings"
+ "HEADER": "Kreiraj portal",
+ "TITLE": "Informacioni centar za pomoć",
+ "CREATE_BASIC_SETTING_BUTTON": "Kreiraj osnovna podešavanja portala"
},
"CUSTOMIZATION_PAGE": {
- "HEADER": "Portal customisation",
- "TITLE": "Help center customization",
- "UPDATE_PORTAL_BUTTON": "Update portal settings"
+ "HEADER": "Prilagođavanje portala",
+ "TITLE": "Prilagođavanje centra za pomoć",
+ "UPDATE_PORTAL_BUTTON": "Ažuriraj postavke portala"
},
"FINISH_PAGE": {
- "TITLE": "Voila!🎉 You're all set up!",
- "MESSAGE": "You can now see this created portal on your all portals page.",
- "FINISH": "Go to all portals page"
+ "TITLE": "Voila!🎉 Sve je spremno!",
+ "MESSAGE": "Sada možete videti ovaj kreirani portal na stranici svih portala.",
+ "FINISH": "Idi na stranicu svih portala"
}
},
"LOGO": {
"LABEL": "Logo",
- "UPLOAD_BUTTON": "Upload logo",
- "HELP_TEXT": "This logo will be displayed on the portal header.",
- "IMAGE_UPLOAD_SUCCESS": "Logo uploaded successfully",
- "IMAGE_UPLOAD_ERROR": "Logo deleted successfully",
- "IMAGE_DELETE_ERROR": "Error while deleting logo"
+ "UPLOAD_BUTTON": "Otpremi logo",
+ "HELP_TEXT": "Ovaj logo će biti prikazan u zaglavlju portala.",
+ "IMAGE_UPLOAD_SUCCESS": "Logo uspešno otpremljen",
+ "IMAGE_UPLOAD_ERROR": "Logo uspešno obrisan",
+ "IMAGE_DELETE_ERROR": "Greška pri brisanju logotipa"
},
"NAME": {
- "LABEL": "Name",
- "PLACEHOLDER": "Portal name",
- "HELP_TEXT": "The name will be used in the public facing portal internally.",
- "ERROR": "Name is required"
+ "LABEL": "Emri",
+ "PLACEHOLDER": "Emri i portalit",
+ "HELP_TEXT": "Ime će se koristiti interno u javnom portalu.",
+ "ERROR": "Emri është i nevojshëm"
},
"SLUG": {
"LABEL": "Slug",
- "PLACEHOLDER": "Portal slug for urls",
- "ERROR": "Slug is required"
+ "PLACEHOLDER": "Slug portali për URL-të",
+ "ERROR": "Slug është i nevojshëm"
},
"DOMAIN": {
- "LABEL": "Custom Domain",
- "PLACEHOLDER": "Portal custom domain",
+ "LABEL": "Domain i personalizuar",
+ "PLACEHOLDER": "Domain i personalizuar i portalit",
"HELP_TEXT": "Add only If you want to use a custom domain for your portals. Eg: {exampleURL}",
- "ERROR": "Enter a valid domain URL"
+ "ERROR": "Unesite ispravan URL domena"
},
"HOME_PAGE_LINK": {
- "LABEL": "Home Page Link",
- "PLACEHOLDER": "Portal home page link",
+ "LABEL": "Lidhja e faqes kryesore",
+ "PLACEHOLDER": "Lidhja e faqes kryesore të portalit",
"HELP_TEXT": "The link used to return from the portal to the home page. Eg: {exampleURL}",
- "ERROR": "Enter a valid home page URL"
+ "ERROR": "Unesite ispravan URL početne stranice"
},
"THEME_COLOR": {
- "LABEL": "Portal theme color",
- "HELP_TEXT": "This color will show as the theme color for the portal."
+ "LABEL": "Boja teme portala",
+ "HELP_TEXT": "Ova boja će biti prikazana kao tema portala."
},
"PAGE_TITLE": {
- "LABEL": "Page Title",
- "PLACEHOLDER": "Portal page title",
- "HELP_TEXT": "The page title will be used in the public facing portal.",
- "ERROR": "Page title is required"
+ "LABEL": "Titulli i faqes",
+ "PLACEHOLDER": "Titulli i faqes së portalit",
+ "HELP_TEXT": "Naslov stranice će biti prikazan na javnom portalu.",
+ "ERROR": "Titulli i faqes është i nevojshëm"
},
"HEADER_TEXT": {
- "LABEL": "Header Text",
- "PLACEHOLDER": "Portal header text",
- "HELP_TEXT": "The Portal header text will be used in the public facing portal.",
- "ERROR": "Portal header text is required"
+ "LABEL": "Teksti i kokës",
+ "PLACEHOLDER": "Teksti i kokës së portalit",
+ "HELP_TEXT": "Tekst zaglavlja portala će biti prikazan na javnom portalu.",
+ "ERROR": "Teksti i kokës së portalit është i nevojshëm"
},
"API": {
- "SUCCESS_MESSAGE_FOR_BASIC": "Portal created successfully.",
- "ERROR_MESSAGE_FOR_BASIC": "Couldn't create the portal. Try again.",
- "SUCCESS_MESSAGE_FOR_UPDATE": "Portal updated successfully.",
- "ERROR_MESSAGE_FOR_UPDATE": "Couldn't update the portal. Try again."
+ "SUCCESS_MESSAGE_FOR_BASIC": "Portal je uspešno kreiran.",
+ "ERROR_MESSAGE_FOR_BASIC": "Nije moguće kreirati portal. Pokušajte ponovo.",
+ "SUCCESS_MESSAGE_FOR_UPDATE": "Portal je uspešno ažuriran.",
+ "ERROR_MESSAGE_FOR_UPDATE": "Nije moguće ažurirati portal. Pokušajte ponovo."
}
},
"ADD_LOCALE": {
- "TITLE": "Add a new locale",
- "SUB_TITLE": "This adds a new locale to your available translation list.",
+ "TITLE": "Dodaj novu lokalizaciju",
+ "SUB_TITLE": "Ovim dodajete novu lokalizaciju na listu dostupnih prevoda.",
"PORTAL": "Portal",
"LOCALE": {
- "LABEL": "Locale",
- "PLACEHOLDER": "Choose a locale",
- "ERROR": "Locale is required"
+ "LABEL": "Lokalizacija",
+ "PLACEHOLDER": "Izaberite lokalizaciju",
+ "ERROR": "Jezik je obavezan"
},
"BUTTONS": {
- "CREATE": "Create locale",
- "CANCEL": "Cancel"
+ "CREATE": "Dodaj jezik",
+ "CANCEL": "Otkaži"
},
"API": {
- "SUCCESS_MESSAGE": "Locale added successfully",
- "ERROR_MESSAGE": "Unable to add locale. Try again."
+ "SUCCESS_MESSAGE": "Jezik je uspešno dodat",
+ "ERROR_MESSAGE": "Ne može se dodati jezik. Pokušajte ponovo."
}
},
"CHANGE_DEFAULT_LOCALE": {
"API": {
- "SUCCESS_MESSAGE": "Default locale updated successfully",
- "ERROR_MESSAGE": "Unable to update default locale. Try again."
+ "SUCCESS_MESSAGE": "Podrazumevani jezik je uspešno ažuriran",
+ "ERROR_MESSAGE": "Ne može se ažurirati podrazumevani jezik. Pokušajte ponovo."
}
},
"DELETE_LOCALE": {
"API": {
- "SUCCESS_MESSAGE": "Locale removed from portal successfully",
- "ERROR_MESSAGE": "Unable to remove locale from portal. Try again."
+ "SUCCESS_MESSAGE": "Jezik je uspešno uklonjen sa portala",
+ "ERROR_MESSAGE": "Ne može se ukloniti jezik sa portala. Pokušajte ponovo."
+ }
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
}
}
},
"TABLE": {
- "LOADING_MESSAGE": "Loading articles...",
- "404": "No articles matches your search 🔍",
- "NO_ARTICLES": "There are no available articles",
+ "LOADING_MESSAGE": "Duke ngarkuar artikuj...",
+ "404": "Asnjë artikull nuk përputhet me kërkimin tuaj 🔍",
+ "NO_ARTICLES": "Nuk ka artikuj të disponueshëm",
"HEADERS": {
- "TITLE": "Title",
- "CATEGORY": "Category",
- "READ_COUNT": "Views",
- "STATUS": "Status",
- "LAST_EDITED": "Last edited"
+ "TITLE": "Titulli",
+ "CATEGORY": "Kategorija",
+ "READ_COUNT": "Pregledi",
+ "STATUS": "Statusi",
+ "LAST_EDITED": "I redaktuar së fundmi"
},
"COLUMNS": {
- "BY": "by",
- "AUTHOR_NOT_AVAILABLE": "Author is not available"
+ "BY": "nga",
+ "AUTHOR_NOT_AVAILABLE": "Autor nije dostupan"
}
},
"EDIT_ARTICLE": {
- "LOADING": "Loading article...",
- "TITLE_PLACEHOLDER": "Article title goes here",
- "CONTENT_PLACEHOLDER": "Write your article here",
+ "LOADING": "Učitavanje članka...",
+ "TITLE_PLACEHOLDER": "Titulli i artikullit shkruhet këtu",
+ "CONTENT_PLACEHOLDER": "Napišite svoj članak ovde",
"API": {
- "ERROR": "Error while saving article"
+ "ERROR": "Greška prilikom čuvanja članka"
}
},
"PUBLISH_ARTICLE": {
"API": {
- "ERROR": "Error while publishing article",
- "SUCCESS": "Article published successfully"
+ "ERROR": "Greška pri objavljivanju članka",
+ "SUCCESS": "Članak je uspešno objavljen"
}
},
"ARCHIVE_ARTICLE": {
"API": {
- "ERROR": "Error while archiving article",
- "SUCCESS": "Article archived successfully"
+ "ERROR": "Greška pri arhiviranju članka",
+ "SUCCESS": "Članak uspešno arhiviran"
}
},
"DRAFT_ARTICLE": {
"API": {
- "ERROR": "Error while drafting article",
- "SUCCESS": "Article drafted successfully"
+ "ERROR": "Greška pri kreiranju nacrta članka",
+ "SUCCESS": "Članak uspešno sačuvan kao nacrt"
}
},
"DELETE_ARTICLE": {
"MODAL": {
"CONFIRM": {
- "TITLE": "Confirm Deletion",
- "MESSAGE": "Are you sure to delete the article?",
- "YES": "Yes, Delete",
- "NO": "No, Keep it"
+ "TITLE": "Potvrdi brisanje",
+ "MESSAGE": "Da li ste sigurni da želite da obrišete članak?",
+ "YES": "Da, obriši",
+ "NO": "Ne, zadrži"
}
},
"API": {
- "SUCCESS_MESSAGE": "Article deleted successfully",
- "ERROR_MESSAGE": "Error while deleting article"
+ "SUCCESS_MESSAGE": "Članak uspešno obrisan",
+ "ERROR_MESSAGE": "Greška pri brisanju članka"
}
},
"REORDER_ARTICLE": {
@@ -385,167 +397,167 @@
}
},
"CREATE_ARTICLE": {
- "ERROR_MESSAGE": "Please add the article heading and content then only you can update the settings"
+ "ERROR_MESSAGE": "Dodajte naslov i sadržaj članka da biste mogli da ažurirate podešavanja."
},
"SIDEBAR": {
"SEARCH": {
- "PLACEHOLDER": "Search for articles"
+ "PLACEHOLDER": "Kërko për artikuj"
}
},
"CATEGORY": {
"ADD": {
- "TITLE": "Create a category",
- "SUB_TITLE": "The category will be used in the public facing portal to categorize articles.",
- "PORTAL": "Portal",
- "LOCALE": "Locale",
+ "TITLE": "Kreiraj kategoriju",
+ "SUB_TITLE": "Kategorija će se koristiti na javnom portalu za kategorizaciju članaka.",
+ "PORTAL": "Portali",
+ "LOCALE": "Gjuha",
"NAME": {
- "LABEL": "Name",
- "PLACEHOLDER": "Category name",
- "HELP_TEXT": "The category name and icon will be used in the public facing portal to categorize articles.",
- "ERROR": "Name is required"
+ "LABEL": "Emri",
+ "PLACEHOLDER": "Emri i kategorisë",
+ "HELP_TEXT": "Naziv i ikonica kategorije biće prikazani u javnom portalu za kategorizaciju članaka.",
+ "ERROR": "Emri është i nevojshëm"
},
"SLUG": {
"LABEL": "Slug",
- "PLACEHOLDER": "Category slug for urls",
+ "PLACEHOLDER": "Slug i kategorisë për url-të",
"HELP_TEXT": "app.chatwoot.com/hc/my-portal/en-US/categories/my-slug",
- "ERROR": "Slug is required"
+ "ERROR": "Slug është i nevojshëm"
},
"DESCRIPTION": {
- "LABEL": "Description",
- "PLACEHOLDER": "Give a short description about the category.",
- "ERROR": "Description is required"
+ "LABEL": "Përshkrimi",
+ "PLACEHOLDER": "Jepni një përshkrim të shkurtër për kategorinë.",
+ "ERROR": "Përshkrimi është i nevojshëm"
},
"BUTTONS": {
- "CREATE": "Create category",
- "CANCEL": "Cancel"
+ "CREATE": "Kreiraj kategoriju",
+ "CANCEL": "Anulo"
},
"API": {
- "SUCCESS_MESSAGE": "Category created successfully",
- "ERROR_MESSAGE": "Unable to create category"
+ "SUCCESS_MESSAGE": "Kategorija je uspešno kreirana",
+ "ERROR_MESSAGE": "Nije moguće kreirati kategoriju"
}
},
"EDIT": {
- "TITLE": "Edit a category",
- "SUB_TITLE": "Editing a category will update the category in the public facing portal.",
+ "TITLE": "Izmeni kategoriju",
+ "SUB_TITLE": "Izmena kategorije će ažurirati kategoriju na javnom portalu.",
"PORTAL": "Portal",
- "LOCALE": "Locale",
+ "LOCALE": "Jezik",
"NAME": {
- "LABEL": "Name",
- "PLACEHOLDER": "Category name",
- "HELP_TEXT": "The category name and icon will be used in the public facing portal to categorize articles.",
- "ERROR": "Name is required"
+ "LABEL": "Naziv",
+ "PLACEHOLDER": "Naziv kategorije",
+ "HELP_TEXT": "Naziv i ikonica kategorije biće prikazani u javnom portalu za kategorizaciju članaka.",
+ "ERROR": "Naziv je obavezan"
},
"SLUG": {
"LABEL": "Slug",
- "PLACEHOLDER": "Category slug for urls",
+ "PLACEHOLDER": "Slug kategorije za URL",
"HELP_TEXT": "app.chatwoot.com/hc/my-portal/en-US/categories/my-slug",
- "ERROR": "Slug is required"
+ "ERROR": "Slug je obavezan"
},
"DESCRIPTION": {
- "LABEL": "Description",
- "PLACEHOLDER": "Give a short description about the category.",
- "ERROR": "Description is required"
+ "LABEL": "Opis",
+ "PLACEHOLDER": "Unesite kratak opis kategorije.",
+ "ERROR": "Opis je obavezan"
},
"BUTTONS": {
- "CREATE": "Update category",
- "CANCEL": "Cancel"
+ "CREATE": "Ažuriraj kategoriju",
+ "CANCEL": "Otkaži"
},
"API": {
- "SUCCESS_MESSAGE": "Category updated successfully",
- "ERROR_MESSAGE": "Unable to update category"
+ "SUCCESS_MESSAGE": "Kategorija uspešno ažurirana",
+ "ERROR_MESSAGE": "Ne može se ažurirati kategorija"
}
},
"DELETE": {
"API": {
- "SUCCESS_MESSAGE": "Category deleted successfully",
- "ERROR_MESSAGE": "Unable to delete category"
+ "SUCCESS_MESSAGE": "Kategorija uspešno obrisana",
+ "ERROR_MESSAGE": "Ne može se obrisati kategorija"
}
}
},
"ARTICLE_SEARCH": {
- "TITLE": "Search articles",
- "PLACEHOLDER": "Search articles",
- "NO_RESULT": "No articles found",
- "SEARCHING": "Searching...",
- "SEARCH_BUTTON": "Search",
- "INSERT_ARTICLE": "Insert link",
- "IFRAME_ERROR": "URL is empty or invalid. Unable to display content.",
- "OPEN_ARTICLE_SEARCH": "Insert article from Help Center",
- "SUCCESS_ARTICLE_INSERTED": "Article inserted successfully",
- "PREVIEW_LINK": "Preview article",
- "CANCEL": "Close",
- "BACK": "Back",
- "BACK_RESULTS": "Back to results"
+ "TITLE": "Pretraži članke",
+ "PLACEHOLDER": "Pretraži članke",
+ "NO_RESULT": "Nema pronađenih članaka",
+ "SEARCHING": "Pretraga...",
+ "SEARCH_BUTTON": "Pretraži",
+ "INSERT_ARTICLE": "Ubaci link",
+ "IFRAME_ERROR": "URL je prazan ili nevažeći. Nije moguće prikazati sadržaj.",
+ "OPEN_ARTICLE_SEARCH": "Ubaci članak iz Help Centra",
+ "SUCCESS_ARTICLE_INSERTED": "Članak uspešno dodat",
+ "PREVIEW_LINK": "Pregledaj članak",
+ "CANCEL": "Zatvori",
+ "BACK": "Nazad",
+ "BACK_RESULTS": "Nazad na rezultate"
},
"UPGRADE_PAGE": {
- "TITLE": "Help Center",
- "DESCRIPTION": "Create user-friendly self-service portals. Help your users to access the articles and get support 24/7. Upgrade your subscription to enable this feature.",
- "SELF_HOSTED_DESCRIPTION": "Create user-friendly self-service portals. Help your users to access the articles and get support 24/7. Please contact your administrator to enable this feature.",
+ "TITLE": "Centar za pomoć",
+ "DESCRIPTION": "Kreirajte korisnički pristupačne portale za samopomoć. Omogućite korisnicima pristup člancima i podršci 24/7. Nadogradite pretplatu da biste omogućili ovu funkciju.",
+ "SELF_HOSTED_DESCRIPTION": "Kreirajte korisnički pristupačne portale za samopomoć. Omogućite korisnicima pristup člancima i podršci 24/7. Kontaktirajte administratora da biste omogućili ovu funkciju.",
"BUTTON": {
- "LEARN_MORE": "Learn more",
- "UPGRADE": "Upgrade"
+ "LEARN_MORE": "Saznajte više",
+ "UPGRADE": "Nadogradite"
},
"FEATURES": {
"PORTALS": {
- "TITLE": "Multiple portals",
- "DESCRIPTION": "Create multiple help center portals for different products using the same account."
+ "TITLE": "Više portala",
+ "DESCRIPTION": "Kreirajte više help centar portala za različite proizvode koristeći isti nalog."
},
"LOCALES": {
- "TITLE": "Full support for locales",
- "DESCRIPTION": "Localize the portal in your language. We support all locales and allow translations for every article."
+ "TITLE": "Puna podrška za jezike",
+ "DESCRIPTION": "Prilagodite portal na svom jeziku. Podržavamo sve jezike i omogućavamo prevod svakog članka."
},
"SEO": {
- "TITLE": "SEO-friendly design",
- "DESCRIPTION": "Customize your meta tags to improve your visibility on search engines with our SEO-friendly pages."
+ "TITLE": "SEO-prijatan dizajn",
+ "DESCRIPTION": "Prilagodite meta tagove i poboljšajte vidljivost na pretraživačima uz naše SEO-prijateljske stranice."
},
"API": {
- "TITLE": "Full API support",
- "DESCRIPTION": "Use the portal as a headless CMS with third party front-end frameworks using our APIs."
+ "TITLE": "Puna API podrška",
+ "DESCRIPTION": "Koristite portal kao headless CMS sa eksternim front-end okvirima putem naših API-ja."
}
}
},
- "LOADING": "Loading...",
+ "LOADING": "Učitavanje...",
"ARTICLES_PAGE": {
"ARTICLE_CARD": {
"CARD": {
"VIEWS": "{count} view | {count} views",
"DROPDOWN_MENU": {
- "PUBLISH": "Publish",
- "DRAFT": "Draft",
- "ARCHIVE": "Archive",
- "DELETE": "Delete"
+ "PUBLISH": "Objavi",
+ "DRAFT": "Nacrt",
+ "ARCHIVE": "Arhiviraj",
+ "DELETE": "Obriši"
},
"STATUS": {
- "DRAFT": "Draft",
- "PUBLISHED": "Published",
- "ARCHIVED": "Archived"
+ "DRAFT": "Nacrt",
+ "PUBLISHED": "Objavljeno",
+ "ARCHIVED": "Arhivirano"
},
"CATEGORY": {
- "UNCATEGORISED": "Uncategorised"
+ "UNCATEGORISED": "Bez kategorije"
}
}
},
"ARTICLES_HEADER": {
"TABS": {
- "ALL": "All articles",
- "MINE": "Mine",
- "DRAFT": "Draft",
- "PUBLISHED": "Published",
- "ARCHIVED": "Archived"
+ "ALL": "Svi članci",
+ "MINE": "Moji",
+ "DRAFT": "Nacrti",
+ "PUBLISHED": "Objavljeni",
+ "ARCHIVED": "Arhivirani"
},
"CATEGORY": {
- "ALL": "All categories"
+ "ALL": "Sve kategorije"
},
"LOCALE": {
- "ALL": "All locales"
+ "ALL": "Svi jezici"
},
- "NEW_ARTICLE": "New article"
+ "NEW_ARTICLE": "Novi članak"
},
"EMPTY_STATE": {
"ALL": {
- "TITLE": "Write an article",
- "SUBTITLE": "Write a rich article, let’s get started!",
- "BUTTON_LABEL": "New article"
+ "TITLE": "Napiši članak",
+ "SUBTITLE": "Napiši detaljan članak, hajde da počnemo!",
+ "BUTTON_LABEL": "Novi članak"
},
"MINE": {
"TITLE": "You haven't written any articles here",
@@ -553,26 +565,26 @@
},
"DRAFT": {
"TITLE": "There are no articles in drafts",
- "SUBTITLE": "Draft articles will appear here"
+ "SUBTITLE": "Nacrti članaka će se pojaviti ovde"
},
"PUBLISHED": {
"TITLE": "There are no published articles",
- "SUBTITLE": "Published articles will appear here"
+ "SUBTITLE": "Objavljeni članci će se pojaviti ovde"
},
"ARCHIVED": {
"TITLE": "There are no articles in the archive",
"SUBTITLE": "Archived articles don't show up on the portal, you can use it to mark deprecated or outdated pages"
},
"CATEGORY": {
- "TITLE": "There are no articles in this category",
- "SUBTITLE": "Articles in this category will appear here"
+ "TITLE": "Nema članaka u ovoj kategoriji",
+ "SUBTITLE": "Članci iz ove kategorije će se pojaviti ovde"
}
}
},
"CATEGORY_PAGE": {
"CATEGORY_HEADER": {
- "NEW_CATEGORY": "New category",
- "EDIT_CATEGORY": "Edit category",
+ "NEW_CATEGORY": "Nova kategorija",
+ "EDIT_CATEGORY": "Izmeni kategoriju",
"CATEGORIES_COUNT": "{n} category | {n} categories",
"BREADCRUMB": {
"CATEGORY_LOCALE": "Categories ({localeCode})",
@@ -580,8 +592,8 @@
}
},
"CATEGORY_EMPTY_STATE": {
- "TITLE": "No categories found",
- "SUBTITLE": "Categories will appear here. You can add a category by clicking the 'New Category' button."
+ "TITLE": "Nema pronađenih kategorija",
+ "SUBTITLE": "Kategorije će se pojaviti ovde. Možete dodati kategoriju klikom na dugme 'Nova kategorija'."
},
"CATEGORY_CARD": {
"ARTICLES_COUNT": "{count} article | {count} articles"
@@ -589,130 +601,140 @@
"CATEGORY_DIALOG": {
"CREATE": {
"API": {
- "SUCCESS_MESSAGE": "Category created successfully",
- "ERROR_MESSAGE": "Unable to create category"
+ "SUCCESS_MESSAGE": "Kategorija je uspešno kreirana",
+ "ERROR_MESSAGE": "Ne može se kreirati kategorija"
}
},
"EDIT": {
"API": {
- "SUCCESS_MESSAGE": "Category updated successfully",
- "ERROR_MESSAGE": "Unable to update category"
+ "SUCCESS_MESSAGE": "Kategorija je uspešno izmenjena",
+ "ERROR_MESSAGE": "Ne može se izmeniti kategorija"
}
},
"DELETE": {
"API": {
- "SUCCESS_MESSAGE": "Category deleted successfully",
- "ERROR_MESSAGE": "Unable to delete category"
+ "SUCCESS_MESSAGE": "Kategorija uspešno obrisana",
+ "ERROR_MESSAGE": "Nije moguće obrisati kategoriju"
}
},
"HEADER": {
- "CREATE": "Create category",
- "EDIT": "Edit category",
- "DESCRIPTION": "Editing a category will update the category in the public facing portal.",
+ "CREATE": "Kreiraj kategoriju",
+ "EDIT": "Izmeni kategoriju",
+ "DESCRIPTION": "Izmena kategorije će ažurirati kategoriju na javnom portalu.",
"PORTAL": "Portal",
- "LOCALE": "Locale"
+ "LOCALE": "Jezik"
},
"FORM": {
"NAME": {
- "LABEL": "Name",
- "PLACEHOLDER": "Category name",
- "ERROR": "Name is required"
+ "LABEL": "Naziv",
+ "PLACEHOLDER": "Naziv kategorije",
+ "ERROR": "Naziv je obavezan"
},
"SLUG": {
"LABEL": "Slug",
- "PLACEHOLDER": "Category slug for urls",
- "ERROR": "Slug is required",
+ "PLACEHOLDER": "Slug kategorije za URL-ove",
+ "ERROR": "Slug je obavezan",
"HELP_TEXT": "app.chatwoot.com/hc/{portalSlug}/{localeCode}/categories/{categorySlug}"
},
"DESCRIPTION": {
- "LABEL": "Description",
- "PLACEHOLDER": "Give a short description about the category.",
- "ERROR": "Description is required"
+ "LABEL": "Opis",
+ "PLACEHOLDER": "Unesite kratak opis kategorije.",
+ "ERROR": "Opis je obavezan"
}
},
"BUTTONS": {
- "CREATE": "Create",
- "EDIT": "Update",
- "CANCEL": "Cancel"
+ "CREATE": "Kreiraj",
+ "EDIT": "Ažuriraj",
+ "CANCEL": "Otkaži"
}
}
},
"LOCALES_PAGE": {
"LOCALES_COUNT": "No locales available | {n} locale | {n} locales",
- "NEW_LOCALE_BUTTON_TEXT": "New locale",
+ "NEW_LOCALE_BUTTON_TEXT": "Novi jezik",
"LOCALE_CARD": {
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
- "DEFAULT": "Default",
+ "DEFAULT": "Podrazumevano",
+ "DRAFT": "Nacrt",
"DROPDOWN_MENU": {
- "MAKE_DEFAULT": "Make default",
- "DELETE": "Delete"
+ "MAKE_DEFAULT": "Postavi kao podrazumevano",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
+ "DELETE": "Obriši"
}
},
"ADD_LOCALE_DIALOG": {
- "TITLE": "Add a new locale",
- "DESCRIPTION": "Select the language in which this article will be written. This will be added to your list of translations, and you can add more later.",
+ "TITLE": "Dodaj novu lokalizaciju",
+ "DESCRIPTION": "Izaberite jezik na kojem će ovaj članak biti napisan. Ovo će biti dodato na vašu listu prevoda, a kasnije možete dodati još jezika.",
"COMBOBOX": {
- "PLACEHOLDER": "Select locale..."
+ "PLACEHOLDER": "Izaberite lokalizaciju..."
+ },
+ "STATUS": {
+ "LABEL": "Status",
+ "OPTIONS": {
+ "LIVE": "Objavljeno",
+ "DRAFT": "Nacrt"
+ }
},
"API": {
- "SUCCESS_MESSAGE": "Locale added successfully",
- "ERROR_MESSAGE": "Unable to add locale. Try again."
+ "SUCCESS_MESSAGE": "Lokalizacija uspešno dodata",
+ "ERROR_MESSAGE": "Ne može se dodati lokalizacija. Pokušajte ponovo."
}
}
},
"EDIT_ARTICLE_PAGE": {
"HEADER": {
"STATUS": {
- "SAVING": "Saving...",
- "SAVED": "Saved"
+ "SAVING": "Čuvanje...",
+ "SAVED": "Sačuvano"
},
- "PREVIEW": "Preview",
- "PUBLISH": "Publish",
- "DRAFT": "Draft",
- "ARCHIVE": "Archive",
- "BACK_TO_ARTICLES": "Back to articles"
+ "PREVIEW": "Pregled",
+ "PUBLISH": "Objavi",
+ "DRAFT": "Nacrt",
+ "ARCHIVE": "Arhiviraj",
+ "BACK_TO_ARTICLES": "Nazad na članke"
},
"EDIT_ARTICLE": {
- "MORE_PROPERTIES": "More properties",
- "UNCATEGORIZED": "Uncategorized",
- "EDITOR_PLACEHOLDER": "Write something..."
+ "MORE_PROPERTIES": "Više opcija",
+ "UNCATEGORIZED": "Bez kategorije",
+ "EDITOR_PLACEHOLDER": "Napišite nešto..."
},
"ARTICLE_PROPERTIES": {
- "ARTICLE_PROPERTIES": "Article properties",
- "META_DESCRIPTION": "Meta description",
+ "ARTICLE_PROPERTIES": "Svojstva članka",
+ "META_DESCRIPTION": "Meta opis",
"META_DESCRIPTION_PLACEHOLDER": "Add meta description",
- "META_TITLE": "Meta title",
- "META_TITLE_PLACEHOLDER": "Add meta title",
- "META_TAGS": "Meta tags",
- "META_TAGS_PLACEHOLDER": "Add meta tags"
+ "META_TITLE": "Meta naslov",
+ "META_TITLE_PLACEHOLDER": "Dodaj meta naslov",
+ "META_TAGS": "Meta oznake",
+ "META_TAGS_PLACEHOLDER": "Dodaj meta oznake"
},
"API": {
- "ERROR": "Error while saving article"
+ "ERROR": "Greška pri čuvanju članka"
}
},
"PORTAL_SWITCHER": {
- "NEW_PORTAL": "New portal",
- "PORTALS": "Portals",
- "CREATE_PORTAL": "Create and manage multiple portals",
- "ARTICLES": "articles",
- "DOMAIN": "domain",
- "PORTAL_NAME": "Portal name"
+ "NEW_PORTAL": "Novi portal",
+ "PORTALS": "Portali",
+ "CREATE_PORTAL": "Kreiraj i upravljaj više portala",
+ "ARTICLES": "članci",
+ "DOMAIN": "domen",
+ "PORTAL_NAME": "Naziv portala"
},
"CREATE_PORTAL_DIALOG": {
- "TITLE": "Create new portal",
- "DESCRIPTION": "Give your portal a name and create a user-friendly URL slug. You can modify both later in the settings.",
- "CONFIRM_BUTTON_LABEL": "Create",
+ "TITLE": "Kreiraj novi portal",
+ "DESCRIPTION": "Dajte portalu ime i kreirajte jednostavan URL. Oboje možete kasnije izmeniti u podešavanjima.",
+ "CONFIRM_BUTTON_LABEL": "Kreiraj",
"NAME": {
- "LABEL": "Name",
+ "LABEL": "Ime",
"PLACEHOLDER": "User Guide | Chatwoot",
- "MESSAGE": "Choose an name for your portal.",
- "ERROR": "Name is required"
+ "MESSAGE": "Izaberite ime za svoj portal.",
+ "ERROR": "Ime je obavezno"
},
"SLUG": {
"LABEL": "Slug",
"PLACEHOLDER": "user-guide",
- "ERROR": "Slug is required",
+ "ERROR": "Slug je obavezan",
"FORMAT_ERROR": "Please enter a valid slug, for eg: user-guide"
}
},
@@ -720,33 +742,33 @@
"FORM": {
"AVATAR": {
"LABEL": "Logo",
- "IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again",
- "IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save changes to save the logo",
- "IMAGE_DELETE_SUCCESS": "Logo deleted successfully",
- "IMAGE_DELETE_ERROR": "Unable to delete logo",
+ "IMAGE_UPLOAD_ERROR": "Neuspešno otpremanje slike! Pokušajte ponovo",
+ "IMAGE_UPLOAD_SUCCESS": "Slika je uspešno dodata. Kliknite na sačuvaj izmene da biste sačuvali logo",
+ "IMAGE_DELETE_SUCCESS": "Logo je uspešno obrisan",
+ "IMAGE_DELETE_ERROR": "Nije moguće obrisati logo",
"IMAGE_UPLOAD_SIZE_ERROR": "Image size should be less than {size}MB"
},
"NAME": {
- "LABEL": "Name",
- "PLACEHOLDER": "Portal name",
- "ERROR": "Name is required"
+ "LABEL": "Ime",
+ "PLACEHOLDER": "Naziv portala",
+ "ERROR": "Naziv je obavezan"
},
"HEADER_TEXT": {
- "LABEL": "Header text",
- "PLACEHOLDER": "Portal header text"
+ "LABEL": "Tekst zaglavlja",
+ "PLACEHOLDER": "Tekst zaglavlja portala"
},
"PAGE_TITLE": {
- "LABEL": "Page title",
- "PLACEHOLDER": "Portal page title"
+ "LABEL": "Naslov stranice",
+ "PLACEHOLDER": "Naslov stranice portala"
},
"HOME_PAGE_LINK": {
- "LABEL": "Home page link",
- "PLACEHOLDER": "Portal home page link",
+ "LABEL": "Link ka početnoj stranici",
+ "PLACEHOLDER": "Link ka početnoj stranici portala",
"ERROR": "Enter a valid URL. The Home page link must start with 'http://' or 'https://'."
},
"SLUG": {
"LABEL": "Slug",
- "PLACEHOLDER": "Portal slug"
+ "PLACEHOLDER": "Slug portala"
},
"LIVE_CHAT_WIDGET": {
"LABEL": "Live chat widget",
diff --git a/app/javascript/dashboard/i18n/locale/sh/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/sh/inboxMgmt.json
index f4fe11343..b7a406ef9 100644
--- a/app/javascript/dashboard/i18n/locale/sh/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/sh/inboxMgmt.json
@@ -446,7 +446,7 @@
"TITLE_FINISH": "Eto!",
"CHANNEL": {
"WEBSITE": {
- "TITLE": "Website",
+ "TITLE": "Faqja e internetit",
"DESCRIPTION": "Create a live-chat widget"
},
"FACEBOOK": {
@@ -1134,7 +1134,7 @@
},
"CHANNELS": {
"MESSENGER": "Messenger",
- "WEB_WIDGET": "Website",
+ "WEB_WIDGET": "Faqja e internetit",
"TWITTER_PROFILE": "Twitter",
"TWILIO_SMS": "Twilio SMS",
"WHATSAPP": "WhatsApp",
diff --git a/app/javascript/dashboard/i18n/locale/sh/integrations.json b/app/javascript/dashboard/i18n/locale/sh/integrations.json
index ac723d5ec..2511c3e4f 100644
--- a/app/javascript/dashboard/i18n/locale/sh/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/sh/integrations.json
@@ -400,14 +400,14 @@
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Isprobajte ove upite",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "PANEL_TITLE": "Započnite s Copilotom",
+ "KICK_OFF_MESSAGE": "Treba vam brz sažetak, želite provjeriti prethodne razgovore ili sastaviti bolji odgovor? Copilot je tu da ubrza stvari.",
"SEND_MESSAGE": "Pošalji poruku...",
"EMPTY_MESSAGE": "Došlo je do pogreške pri generiranju odgovora. Molimo pokušajte ponovno.",
"LOADER": "Kapetan razmišlja",
"YOU": "Ti",
"USE": "Upotrijebi ovo",
- "RESET": "Reset",
+ "RESET": "Resetuj",
"SHOW_STEPS": "Prikaži korake",
"SELECT_ASSISTANT": "Odaberi asistenta",
"PROMPTS": {
@@ -429,7 +429,7 @@
},
"LIST_CONTACTS": {
"LABEL": "Popis kontakata",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "CONTENT": "Pokaži mi listu top 10 kontakata. Uključi ime, email ili broj telefona (ako je dostupan), vrijeme zadnjeg viđenja, oznake (ako ih ima)."
}
}
},
@@ -438,24 +438,24 @@
"ASSISTANT": "Asistent",
"MESSAGE_PLACEHOLDER": "Upišite svoju poruku...",
"HEADER": "Igralište",
- "DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
+ "DESCRIPTION": "Koristite ovaj poligon za slanje poruka svom asistentu i provjeru hoće li odgovarati tačno, brzo i u tonu koji očekujete.",
"CREDIT_NOTE": "Poruke poslane ovdje računaju se prema vašim Captain kreditima."
},
"PAYWALL": {
- "TITLE": "Upgrade to use Captain AI",
- "AVAILABLE_ON": "Captain is not available on the free plan.",
+ "TITLE": "Nadogradite se da biste koristili Captain AI",
+ "AVAILABLE_ON": "Captain nije dostupan na besplatnom planu.",
"UPGRADE_PROMPT": "Nadogradi svoj plan za pristup našim asistentima, kopilotu i još mnogo toga.",
"UPGRADE_NOW": "Nadogradi sada",
"CANCEL_ANYTIME": "Plan možete promijeniti ili otkazati u bilo kojem trenutku"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
+ "AVAILABLE_ON": "Captain AI je dostupan samo na Enterprise planovima.",
"UPGRADE_PROMPT": "Nadogradite svoj plan kako biste dobili pristup našim asistentima, kopilotu i još mnogo toga.",
"ASK_ADMIN": "Molimo obratite se svom administratoru za nadogradnju."
},
"BANNER": {
- "RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
- "DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
+ "RESPONSES": "Iskoristili ste preko 80% svog limita odgovora. Da biste nastavili koristiti Captain AI, molimo nadogradite se.",
+ "DOCUMENTS": "Dosegnut je limit dokumenata. Nadogradite se da biste nastavili koristiti Captain AI."
},
"FORM": {
"CANCEL": "Otkaži",
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Dokumenti",
"ADD_NEW": "Kreiraj novi dokument",
+ "SELECTED": "{count} odabrano",
+ "SELECT_ALL": "Odaberi sve ({count})",
+ "UNSELECT_ALL": "Poništi odabir svih ({count})",
+ "BULK_DELETE_BUTTON": "Delete",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Da, izbriši sve",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Povezana često postavljana pitanja",
"DESCRIPTION": "Ova često postavljana pitanja generirana su izravno iz dokumenta."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Alati",
"ADD_NEW": "Kreiraj novi alat",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "Nema dostupnih prilagođenih alata",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Prilagođeni alat je uspješno izbrisan",
"ERROR_MESSAGE": "Brisanje prilagođenog alata nije uspjelo"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Naziv alata",
"PLACEHOLDER": "Pretraga narudžbe",
- "ERROR": "Naziv alata je obavezan"
+ "ERROR": "Naziv alata je obavezan",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Opis",
diff --git a/app/javascript/dashboard/i18n/locale/sh/settings.json b/app/javascript/dashboard/i18n/locale/sh/settings.json
index 90f1715e7..0bc82b6e2 100644
--- a/app/javascript/dashboard/i18n/locale/sh/settings.json
+++ b/app/javascript/dashboard/i18n/locale/sh/settings.json
@@ -89,7 +89,7 @@
"TITLE": "Pristupni token",
"NOTE": "Ovaj token se može koristiti ako gradite integraciju temeljenu na API-ju",
"COPY": "Kopiraj",
- "RESET": "Reset",
+ "RESET": "Resetuj",
"CONFIRM_RESET": "Jeste li sigurni?",
"CONFIRM_HINT": "Kliknite ponovno za potvrdu",
"RESET_SUCCESS": "Token za pristup je uspješno regeneriran",
diff --git a/app/javascript/dashboard/i18n/locale/sk/conversation.json b/app/javascript/dashboard/i18n/locale/sk/conversation.json
index 739cf7ef8..c0851426f 100644
--- a/app/javascript/dashboard/i18n/locale/sk/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/sk/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Message signature is not configured, please configure it in profile settings.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "Dajte copilotu ďalšie podnety alebo sa opýtajte na čokoľvek... Stlačte enter pre odoslanie ďalšej správy",
"CLICK_HERE": "Click here to update",
"WHATSAPP_TEMPLATES": "Whatsapp Templates"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Potiahnite sem na pripojenie",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot rozmýšľa",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Pridať skrytú kópiu",
diff --git a/app/javascript/dashboard/i18n/locale/sk/helpCenter.json b/app/javascript/dashboard/i18n/locale/sk/helpCenter.json
index d5227a810..6822d879e 100644
--- a/app/javascript/dashboard/i18n/locale/sk/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/sk/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Locale removed from portal successfully",
"ERROR_MESSAGE": "Unable to remove locale from portal. Try again."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Default",
+ "DRAFT": "Draft",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Vymazať"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Select locale..."
},
+ "STATUS": {
+ "LABEL": "Status",
+ "OPTIONS": {
+ "LIVE": "Published",
+ "DRAFT": "Draft"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Locale added successfully",
"ERROR_MESSAGE": "Unable to add locale. Try again."
diff --git a/app/javascript/dashboard/i18n/locale/sk/integrations.json b/app/javascript/dashboard/i18n/locale/sk/integrations.json
index bf12b7874..d0b03a697 100644
--- a/app/javascript/dashboard/i18n/locale/sk/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/sk/integrations.json
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Captain",
- "HEADER_KNOW_MORE": "Know more",
+ "HEADER_KNOW_MORE": "Viac informácií",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "ASSISTANTS": "Asistenti",
+ "SWITCH_ASSISTANT": "Prepnite medzi asistentmi",
+ "NEW_ASSISTANT": "Vytvoriť asistenta",
+ "EMPTY_LIST": "Nenašli sa žiadni asistenti, vytvorte si jedného, aby ste mohli začať"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "PANEL_TITLE": "Začnite s Copilotom",
+ "KICK_OFF_MESSAGE": "Potrebujete rýchly prehľad, chcete skontrolovať minulé konverzácie alebo zostaviť lepšiu odpoveď? Copilot je tu, aby vám pomohol zrýchliť prácu.",
"SEND_MESSAGE": "Poslať správu...",
- "EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
- "LOADER": "Captain is thinking",
+ "EMPTY_MESSAGE": "Pri generovaní odpovede došlo k chybe. Skúste to, prosím, znova.",
+ "LOADER": "Captain rozmýšľa",
"YOU": "Vy",
- "USE": "Use this",
- "RESET": "Reset",
- "SHOW_STEPS": "Show steps",
- "SELECT_ASSISTANT": "Select Assistant",
+ "USE": "Použiť toto",
+ "RESET": "Obnoviť",
+ "SHOW_STEPS": "Zobraziť kroky",
+ "SELECT_ASSISTANT": "Vybrať asistenta",
"PROMPTS": {
"SUMMARIZE": {
- "LABEL": "Summarize this conversation",
- "CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
+ "LABEL": "Zhrnúť túto konverzáciu",
+ "CONTENT": "Zhrň kľúčové body diskutované medzi zákazníkom a podporným agentom, vrátane obáv zákazníka, otázok a riešení či odpovedí poskytnutých agentom podpory"
},
"SUGGEST": {
- "LABEL": "Suggest an answer",
- "CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
+ "LABEL": "Navrhnúť odpoveď",
+ "CONTENT": "Analyzuj dopyt zákazníka a zostav odpoveď, ktorá účinne rieši ich obavy alebo otázky. Zabezpeč, aby odpoveď bola jasná, stručná a poskytovala užitočné informácie."
},
"RATE": {
- "LABEL": "Rate this conversation",
- "CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
+ "LABEL": "Ohodnoť túto konverzáciu",
+ "CONTENT": "Preskúmaj konverzáciu, aby si zistil, ako dobre spĺňa potreby zákazníka. Zdieľ hodnotenie od 1 do 5 na základe tónu, jasnosti a efektívnosti."
},
"HIGH_PRIORITY": {
- "LABEL": "High priority conversations",
- "CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
+ "LABEL": "Konverzácie s vysokou prioritou",
+ "CONTENT": "Daj mi zhrnutie všetkých otvorených konverzácií s vysokou prioritou. Zahrň ID konverzácie, meno zákazníka (ak je k dispozícii), obsah poslednej správy a prideleného agenta. Ak je to relevantné, zoraď podľa stavu."
},
"LIST_CONTACTS": {
- "LABEL": "List contacts",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "LABEL": "Zoznam kontaktov",
+ "CONTENT": "Ukáž mi zoznam top 10 kontaktov. Zahrň meno, e-mail alebo telefónne číslo (ak je k dispozícii), čas posledného prihlásenia a štítky (ak nejaké sú)."
}
}
},
"PLAYGROUND": {
"USER": "Vy",
- "ASSISTANT": "Assistant",
+ "ASSISTANT": "Asistent",
"MESSAGE_PLACEHOLDER": "Zadajte svoju správu...",
- "HEADER": "Playground",
- "DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
- "CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
+ "HEADER": "Ihrisko",
+ "DESCRIPTION": "Použite toto ihrisko na odosielanie správ svojmu asistentovi a skontrolujte, či odpovedá presne, rýchlo a v očakávanom tóne.",
+ "CREDIT_NOTE": "Správy odoslané tu sa budú rátať do vašich kreditov Captain."
},
"PAYWALL": {
- "TITLE": "Upgrade to use Captain AI",
- "AVAILABLE_ON": "Captain is not available on the free plan.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "TITLE": "Prejdite na vyšší plán a používajte Captain AI",
+ "AVAILABLE_ON": "Captain nie je dostupný v bezplatnom pláne.",
+ "UPGRADE_PROMPT": "Prejdite na vyšší plán a získajte prístup k našim asistentom, copilotu a ďalším funkciám.",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "AVAILABLE_ON": "Captain AI je dostupný iba v Enterprise plánoch.",
+ "UPGRADE_PROMPT": "Prejdite na vyšší plán a získajte prístup k našim asistentom, copilotu a ďalším funkciám.",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"BANNER": {
- "RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
- "DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
+ "RESPONSES": "Vyčerpali ste viac ako 80 % limitu odpovedí. Pre pokračovanie v používaní Captain AI prosím prejdite na vyšší plán.",
+ "DOCUMENTS": "Dosiahnutý limit dokumentov. Pre pokračovanie v používaní Captain AI prejdite na vyšší plán."
},
"FORM": {
"CANCEL": "Zrušiť",
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
+ "SELECTED": "{count} selected",
+ "SELECT_ALL": "Select all ({count})",
+ "UNSELECT_ALL": "Unselect all ({count})",
+ "BULK_DELETE_BUTTON": "Vymazať",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Yes, delete all",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Description",
diff --git a/app/javascript/dashboard/i18n/locale/sl/contact.json b/app/javascript/dashboard/i18n/locale/sl/contact.json
index 8a3856c60..6ef898099 100644
--- a/app/javascript/dashboard/i18n/locale/sl/contact.json
+++ b/app/javascript/dashboard/i18n/locale/sl/contact.json
@@ -10,7 +10,7 @@
"BROWSER_LANGUAGE": "Jezik brskalnika",
"CONVERSATION_TITLE": "Podrobnosti pogovora",
"VIEW_PROFILE": "Ogled profila",
- "BROWSER": "Browser",
+ "BROWSER": "Brskalnik",
"OS": "Operacijski sistem",
"INITIATED_FROM": "Začetek iz",
"INITIATED_AT": "Začeto ob",
@@ -25,7 +25,7 @@
},
"CONVERSATIONS": {
"NO_RECORDS_FOUND": "S tem stikom ni povezanih nobenih prejšnjih pogovorov.",
- "TITLE": "Previous Conversations"
+ "TITLE": "Prejšnji pogovori"
},
"LABELS": {
"CONTACT": {
@@ -50,7 +50,7 @@
"MUTED_SUCCESS": "Ta stik je bil uspešno blokiran. O prihodnjih pogovorih ne boste obveščeni.",
"UNMUTED_SUCCESS": "Ta stik je bil uspešno odklenjen.",
"SEND_TRANSCRIPT": "Pošlji prepis",
- "EDIT_LABEL": "Edit",
+ "EDIT_LABEL": "Uredi",
"SIDEBAR_SECTIONS": {
"CUSTOM_ATTRIBUTES": "Lastne lastnosti",
"CONTACT_LABELS": "Oznake stika",
diff --git a/app/javascript/dashboard/i18n/locale/sl/conversation.json b/app/javascript/dashboard/i18n/locale/sl/conversation.json
index 2adbfa36b..84629e2a0 100644
--- a/app/javascript/dashboard/i18n/locale/sl/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/sl/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Message signature is not configured, please configure it in profile settings.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "Daj copilotu dodatne ukaze ali vprašaj kar koli drugega... Pritisni Enter za pošiljanje nadaljnjega vprašanja",
"CLICK_HERE": "Click here to update",
"WHATSAPP_TEMPLATES": "Predloge za WhatsApp"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Drag and drop here to attach",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot razmišlja",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Add bcc",
diff --git a/app/javascript/dashboard/i18n/locale/sl/helpCenter.json b/app/javascript/dashboard/i18n/locale/sl/helpCenter.json
index e47dbb488..121e109bb 100644
--- a/app/javascript/dashboard/i18n/locale/sl/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/sl/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Jezik je bil uspešno odstranjen iz portala",
"ERROR_MESSAGE": "Jezika ni bilo mogoče odstraniti iz portala. Poskusite znova."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} članek | {count} članki",
"CATEGORIES_COUNT": "{count} kategorija | {count} kategorije",
"DEFAULT": "Privzeto",
+ "DRAFT": "Osnutek",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Nastavi kot privzeto",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Izbriši"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Izberite jezik..."
},
+ "STATUS": {
+ "LABEL": "Status",
+ "OPTIONS": {
+ "LIVE": "Objavljeno",
+ "DRAFT": "Osnutek"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Jezik je bil uspešno dodan",
"ERROR_MESSAGE": "Dodajanje jezika ni uspelo. Poskusite znova."
diff --git a/app/javascript/dashboard/i18n/locale/sl/integrations.json b/app/javascript/dashboard/i18n/locale/sl/integrations.json
index ad0e457fc..4869babed 100644
--- a/app/javascript/dashboard/i18n/locale/sl/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/sl/integrations.json
@@ -366,8 +366,8 @@
},
"NO_LINKED_ISSUES": "No linked issues found",
"DELETE": {
- "TITLE": "Are you sure you want to delete the integration?",
- "MESSAGE": "Are you sure you want to delete the integration?",
+ "TITLE": "Ali ste prepričani, da želite izbrisati integracijo?",
+ "MESSAGE": "Ali ste prepričani, da želite izbrisati integracijo?",
"CONFIRM": "Da, izbriši",
"CANCEL": "Prekliči"
},
@@ -390,56 +390,56 @@
},
"CAPTAIN": {
"NAME": "Kapitan",
- "HEADER_KNOW_MORE": "Know more",
+ "HEADER_KNOW_MORE": "Izvedi več",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "ASSISTANTS": "Pomočniki",
+ "SWITCH_ASSISTANT": "Preklapljanje med pomočniki",
+ "NEW_ASSISTANT": "Ustvari pomočnika",
+ "EMPTY_LIST": "Nobenega pomočnika ni bilo mogoče najti, prosimo, ustvarite enega za začetek"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "PANEL_TITLE": "Začnite s Copilotom",
+ "KICK_OFF_MESSAGE": "Potrebujete hitro povzetek, želite preveriti pretekle pogovore ali sestaviti boljši odgovor? Copilot je tu, da pospeši delo.",
"SEND_MESSAGE": "Pošlji sporočilo...",
- "EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
+ "EMPTY_MESSAGE": "Pri generiranju odgovora je prišlo do napake. Prosimo, poskusite znova.",
"LOADER": "Kapitan razmišlja",
"YOU": "Vi",
"USE": "Uporabi to",
"RESET": "Ponastavi",
- "SHOW_STEPS": "Show steps",
- "SELECT_ASSISTANT": "Select Assistant",
+ "SHOW_STEPS": "Pokaži korake",
+ "SELECT_ASSISTANT": "Izberi pomočnika",
"PROMPTS": {
"SUMMARIZE": {
- "LABEL": "Summarize this conversation",
- "CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
+ "LABEL": "Povzetek tega pogovora",
+ "CONTENT": "Povzemi ključne točke, o katerih sta se pogovarjala stranka in agent podpore, vključno s strankinimi skrbmi, vprašanji ter rešitvami ali odgovori agenta podpore."
},
"SUGGEST": {
- "LABEL": "Suggest an answer",
- "CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
+ "LABEL": "Predlagaj odgovor",
+ "CONTENT": "Analiziraj povpraševanje stranke in sestavi odgovor, ki učinkovito rešuje njihova vprašanja ali pomisleke. Poskrbi, da je odgovor jasen, jedrnat in vsebuje koristne informacije."
},
"RATE": {
- "LABEL": "Rate this conversation",
- "CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
+ "LABEL": "Ocenite ta pogovor",
+ "CONTENT": "Preglej pogovor, da oceniš, kako dobro izpolnjuje potrebe stranke. Deli oceno od 1 do 5 glede na ton, jasnost in učinkovitost."
},
"HIGH_PRIORITY": {
- "LABEL": "High priority conversations",
- "CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
+ "LABEL": "Pogovori z visoko prioriteto",
+ "CONTENT": "Naredi povzetek vseh odprtih pogovorov z visoko prioriteto. Vključi ID pogovora, ime stranke (če je na voljo), vsebino zadnjega sporočila in dodeljenega agenta. Po potrebi združi po statusu."
},
"LIST_CONTACTS": {
- "LABEL": "List contacts",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "LABEL": "Našteti stike",
+ "CONTENT": "Pokaži seznam top 10 stikov. Vključi ime, e-pošto ali telefonsko številko (če je na voljo), čas zadnjega vpogleda, oznake (če obstajajo)."
}
}
},
"PLAYGROUND": {
"USER": "Vi",
- "ASSISTANT": "Assistant",
+ "ASSISTANT": "Pomočnik",
"MESSAGE_PLACEHOLDER": "Vnesite svoje sporočilo...",
- "HEADER": "Playground",
- "DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
- "CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
+ "HEADER": "Poligon",
+ "DESCRIPTION": "Uporabi ta poligon za pošiljanje sporočil svojemu pomočniku in preveri, ali odgovarja natančno, hitro in v pričakovanem tonu.",
+ "CREDIT_NOTE": "Sporočila, poslana tukaj, se bodo štela v vaše Captain kredite."
},
"PAYWALL": {
"TITLE": "Nadgradite za uporabo Captain AI",
@@ -449,7 +449,7 @@
"CANCEL_ANYTIME": "Paket lahko kadarkoli spremenite ali prekličete"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
+ "AVAILABLE_ON": "Captain AI je na voljo samo v Enterprise paketih.",
"UPGRADE_PROMPT": "Nadgradite svoj paket, da pridobite dostop do naših pomočnikov, copilot in še več.",
"ASK_ADMIN": "Prosimo, obrnite se na svojega skrbnika za nadgradnjo."
},
@@ -577,7 +577,7 @@
"SUBTITLE": "Ustvarite asistenta, ki bo vašim uporabnikom zagotavljal hitre in natančne odgovore. Lahko se uči iz vaših pomožnih člankov in preteklih pogovorov.",
"FEATURE_SPOTLIGHT": {
"TITLE": "Captain Assistant",
- "NOTE": "Captain Assistant engages directly with customers, learns from your help docs and past conversations, and delivers instant, accurate responses. It handles the initial queries, providing quick resolutions before transferring to an agent when needed."
+ "NOTE": "Captain asistent se neposredno povezuje s strankami, se uči iz vaših pomožnih dokumentov in preteklih pogovorov ter zagotavlja takojšnje, natančne odgovore. Obvladuje začetna vprašanja in nudi hitre rešitve, preden po potrebi prenese zadevo agentu."
}
},
"GUARDRAILS": {
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Dokumenti",
"ADD_NEW": "Ustvari nov dokument",
+ "SELECTED": "{count} izbranih",
+ "SELECT_ALL": "Select all ({count})",
+ "UNSELECT_ALL": "Unselect all ({count})",
+ "BULK_DELETE_BUTTON": "Delete",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Da, izbriši vse",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Povezana pogosta vprašanja",
"DESCRIPTION": "Ta pogosta vprašanja so ustvarjena neposredno iz dokumenta."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Description",
@@ -920,10 +939,10 @@
},
"BULK_DELETE": {
"TITLE": "Izbrisati pogosta vprašanja?",
- "DESCRIPTION": "Are you sure you want to delete the selected FAQs? This action cannot be undone.",
- "CONFIRM": "Yes, delete all",
- "SUCCESS_MESSAGE": "FAQs deleted successfully",
- "ERROR_MESSAGE": "There was an error deleting the FAQs, please try again."
+ "DESCRIPTION": "Ali ste prepričani, da želite izbrisati izbrane pogosta vprašanja? Tega dejanja ni mogoče razveljaviti.",
+ "CONFIRM": "Da, izbriši vse",
+ "SUCCESS_MESSAGE": "Pogosta vprašanja so bila uspešno izbrisana",
+ "ERROR_MESSAGE": "Pri brisanju pogostih vprašanj je prišlo do napake, prosimo, poskusite znova."
},
"DELETE": {
"TITLE": "Ste prepričani, da želite izbrisati pogosta vprašanja?",
diff --git a/app/javascript/dashboard/i18n/locale/sl/report.json b/app/javascript/dashboard/i18n/locale/sl/report.json
index e56749ea6..b17386e89 100644
--- a/app/javascript/dashboard/i18n/locale/sl/report.json
+++ b/app/javascript/dashboard/i18n/locale/sl/report.json
@@ -1,14 +1,14 @@
{
"REPORT": {
"HEADER": "Conversations",
- "LOADING_CHART": "Loading chart data...",
+ "LOADING_CHART": "Nalaganje podatkov grafa...",
"NO_ENOUGH_DATA": "Nismo prejeli dovolj podatkov za ustvarjanje poročila. Poskusite znova pozneje.",
"DOWNLOAD_CONVERSATION_REPORTS": "Download conversation reports",
"DATA_FETCHING_FAILED": "Failed to fetch data, please try again later.",
"SUMMARY_FETCHING_FAILED": "Failed to fetch summary, please try again later.",
"METRICS": {
"CONVERSATIONS": {
- "NAME": "Conversations",
+ "NAME": "Pogovori",
"DESC": "(Skupaj)"
},
"INCOMING_MESSAGES": {
@@ -33,7 +33,7 @@
},
"RESOLUTION_COUNT": {
"NAME": "Število rešitev",
- "DESC": "( Total )"
+ "DESC": "Skupaj"
},
"BOT_RESOLUTION_COUNT": {
"NAME": "Resolution Count",
@@ -61,8 +61,8 @@
"CUSTOM_DATE_RANGE": "Custom date range"
},
"CUSTOM_DATE_RANGE": {
- "CONFIRM": "Apply",
- "PLACEHOLDER": "Select date range"
+ "CONFIRM": "Uporabi",
+ "PLACEHOLDER": "Izberi časovno obdobje"
},
"GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By",
"DURATION_FILTER_LABEL": "Duration",
@@ -424,7 +424,7 @@
}
},
"CSAT_REPORTS": {
- "HEADER": "CSAT Reports",
+ "HEADER": "CSAT Poročila",
"NO_RECORDS": "No responses yet",
"NO_RECORDS_DESCRIPTION": "CSAT survey responses will appear here once customers start providing feedback.",
"DOWNLOAD": "Download CSAT Reports",
@@ -454,10 +454,10 @@
},
"TABLE": {
"HEADER": {
- "CONTACT_NAME": "Contact",
+ "CONTACT_NAME": "Kontakt",
"AGENT_NAME": "Agent",
- "RATING": "Rating",
- "FEEDBACK_TEXT": "Feedback comment",
+ "RATING": "Ocena",
+ "FEEDBACK_TEXT": "Komentar povratne informacije",
"CONVERSATION": "Conversation",
"CUSTOMER": "Customer",
"RESPONSE": "Response",
@@ -469,11 +469,11 @@
"NO_FEEDBACK": "No feedback provided",
"METRIC": {
"TOTAL_RESPONSES": {
- "LABEL": "Total responses",
- "TOOLTIP": "Total number of responses collected"
+ "LABEL": "Skupni odgovori",
+ "TOOLTIP": "Skupno število zbranih odgovorov"
},
"SATISFACTION_SCORE": {
- "LABEL": "Satisfaction score",
+ "LABEL": "Ocena zadovoljstva",
"TOOLTIP": "Total number of positive responses / Total number of responses * 100"
},
"RESPONSE_RATE": {
diff --git a/app/javascript/dashboard/i18n/locale/sl/settings.json b/app/javascript/dashboard/i18n/locale/sl/settings.json
index 7f51eaf3b..a637cb789 100644
--- a/app/javascript/dashboard/i18n/locale/sl/settings.json
+++ b/app/javascript/dashboard/i18n/locale/sl/settings.json
@@ -352,7 +352,7 @@
"ONGOING": "V teku",
"ONE_OFF": "Enkratno",
"REPORTS_SLA": "SLA",
- "REPORTS_BOT": "Bot",
+ "REPORTS_BOT": "Boti",
"REPORTS_AGENT": "Agentje",
"REPORTS_LABEL": "Oznake",
"REPORTS_INBOX": "Prejeto",
@@ -805,13 +805,13 @@
"POPOVER": "Dodani agenti",
"EDIT": "Uredi"
},
- "NO_RECORDS_FOUND": "No agent capacity policies found"
+ "NO_RECORDS_FOUND": "Ni najdenih pravilnikov o zmogljivosti agentov"
},
"CREATE": {
"HEADER": {
- "TITLE": "Create agent capacity policy"
+ "TITLE": "Ustvari politiko zmogljivosti agenta"
},
- "CREATE_BUTTON": "Create policy",
+ "CREATE_BUTTON": "Ustvari politiko",
"API": {
"SUCCESS_MESSAGE": "Agent capacity policy created successfully",
"ERROR_MESSAGE": "Failed to create agent capacity policy"
@@ -908,15 +908,15 @@
}
},
"DELETE_POLICY": {
- "SUCCESS_MESSAGE": "Agent capacity policy deleted successfully",
- "ERROR_MESSAGE": "Failed to delete agent capacity policy"
+ "SUCCESS_MESSAGE": "Pravilnik o zmogljivosti agenta je bil uspešno izbrisan",
+ "ERROR_MESSAGE": "Brisanje pravilnika o zmogljivosti agenta ni uspelo"
}
},
"DELETE_POLICY": {
- "TITLE": "Delete policy",
- "DESCRIPTION": "Are you sure you want to delete this policy? This action cannot be undone.",
- "CONFIRM_BUTTON_LABEL": "Delete",
- "CANCEL_BUTTON_LABEL": "Cancel"
+ "TITLE": "Izbriši pravilnik",
+ "DESCRIPTION": "Ali ste prepričani, da želite izbrisati to politiko? Tega dejanja ni mogoče razveljaviti.",
+ "CONFIRM_BUTTON_LABEL": "Izbriši",
+ "CANCEL_BUTTON_LABEL": "Prekliči"
}
}
}
diff --git a/app/javascript/dashboard/i18n/locale/sq/conversation.json b/app/javascript/dashboard/i18n/locale/sq/conversation.json
index 8208d0abe..44041d04e 100644
--- a/app/javascript/dashboard/i18n/locale/sq/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/sq/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Message signature is not configured, please configure it in profile settings.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "Jep copilot udhëzime shtesë, ose pyet diçka tjetër... Shtyp enter për të dërguar vazhdimin",
"CLICK_HERE": "Click here to update",
"WHATSAPP_TEMPLATES": "Whatsapp Templates"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Drag and drop here to attach",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot po mendon",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Add bcc",
diff --git a/app/javascript/dashboard/i18n/locale/sq/helpCenter.json b/app/javascript/dashboard/i18n/locale/sq/helpCenter.json
index d72399603..a5ed7cd09 100644
--- a/app/javascript/dashboard/i18n/locale/sq/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/sq/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Gjuha u hoq nga portali me sukses",
"ERROR_MESSAGE": "Nuk mund të hiqet gjuha nga portali. Provoni përsëri."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} artikull | {count} artikuj",
"CATEGORIES_COUNT": "{count} kategori | {count} kategori",
"DEFAULT": "Parazgjedhje",
+ "DRAFT": "Nismë",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Bëje parazgjedhje",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Fshi"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Zgjidhni gjuhën..."
},
+ "STATUS": {
+ "LABEL": "Status",
+ "OPTIONS": {
+ "LIVE": "Botuar",
+ "DRAFT": "Nismë"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Gjuha u shtua me sukses",
"ERROR_MESSAGE": "Nuk mund të shtohet gjuha. Provoni përsëri."
diff --git a/app/javascript/dashboard/i18n/locale/sq/integrations.json b/app/javascript/dashboard/i18n/locale/sq/integrations.json
index a5abb2a03..7e6525a11 100644
--- a/app/javascript/dashboard/i18n/locale/sq/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/sq/integrations.json
@@ -449,7 +449,7 @@
"CANCEL_ANYTIME": "Mund të ndryshosh ose anullosh planin tënd në çdo kohë"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
+ "AVAILABLE_ON": "Captain AI është në dispozicion vetëm në planet Enterprise.",
"UPGRADE_PROMPT": "Përmirëso planin tënd për të pasur akses në asistentët tanë, copilot dhe më shumë.",
"ASK_ADMIN": "Ju lutemi kontaktoni administratorin tuaj për përmirësimin."
},
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Dokumentet",
"ADD_NEW": "Krijo një dokument të ri",
+ "SELECTED": "{count} i/e zgjedhur",
+ "SELECT_ALL": "Zgjidh të gjitha ({count})",
+ "UNSELECT_ALL": "Hiq zgjedhjen nga të gjitha ({count})",
+ "BULK_DELETE_BUTTON": "Delete",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Po, fshij të gjitha",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Pyetje të Shpeshta të lidhura",
"DESCRIPTION": "Këto Pyetje të Shpeshta janë gjeneruar direkt nga dokumenti."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Mjetet",
"ADD_NEW": "Krijo një mjet të ri",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "Nuk ka mjete të personalizuara në dispozicion",
"SUBTITLE": "Krijo mjete të personalizuara për të lidhur asistentin tënd me API dhe shërbime të jashtme, duke i mundësuar të marrë të dhëna dhe të kryejë veprime në emrin tënd.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Mjeti i personalizuar u fshi me sukses",
"ERROR_MESSAGE": "Dështoi fshirja e mjetit të personalizuar"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Emri i mjetit",
"PLACEHOLDER": "Kërkimi i porosisë",
- "ERROR": "Emri i mjetit është i nevojshëm"
+ "ERROR": "Emri i mjetit është i nevojshëm",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Përshkrimi",
diff --git a/app/javascript/dashboard/i18n/locale/sr/conversation.json b/app/javascript/dashboard/i18n/locale/sr/conversation.json
index 752efe60f..fb0a5d1ed 100644
--- a/app/javascript/dashboard/i18n/locale/sr/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/sr/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Potpis poruke nije podešen, molim vas podesite ga u podešavanjima profila.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "Dajte copilotu dodatne zahteve, ili pitajte bilo šta drugo... Pritisnite enter za slanje dopune",
"CLICK_HERE": "Kliknite ovde da izmenite",
"WHATSAPP_TEMPLATES": "Whatsapp šabloni"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Prevuci i pusti za dodavanje",
"START_AUDIO_RECORDING": "Pokreni snimanje zvuka",
"STOP_AUDIO_RECORDING": "Zaustavi snimanje zvuka",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot razmišlja",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Dodaj bcc",
diff --git a/app/javascript/dashboard/i18n/locale/sr/helpCenter.json b/app/javascript/dashboard/i18n/locale/sr/helpCenter.json
index f1b61014c..271eeb3a6 100644
--- a/app/javascript/dashboard/i18n/locale/sr/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/sr/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Locale removed from portal successfully",
"ERROR_MESSAGE": "Unable to remove locale from portal. Try again."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Predefinisano",
+ "DRAFT": "Nacrt",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Izbriši"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Select locale..."
},
+ "STATUS": {
+ "LABEL": "Status",
+ "OPTIONS": {
+ "LIVE": "Objavljeno",
+ "DRAFT": "Nacrt"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Locale added successfully",
"ERROR_MESSAGE": "Unable to add locale. Try again."
diff --git a/app/javascript/dashboard/i18n/locale/sr/integrations.json b/app/javascript/dashboard/i18n/locale/sr/integrations.json
index 2f74e4d22..0de1b1d41 100644
--- a/app/javascript/dashboard/i18n/locale/sr/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/sr/integrations.json
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Captain",
- "HEADER_KNOW_MORE": "Know more",
+ "HEADER_KNOW_MORE": "Saznaj više",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "ASSISTANTS": "Asistenti",
+ "SWITCH_ASSISTANT": "Prebaci se između asistenata",
+ "NEW_ASSISTANT": "Kreiraj asistenta",
+ "EMPTY_LIST": "Nema pronađenih asistenata, molimo kreirajte jednog da biste počeli"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "PANEL_TITLE": "Započnite sa Copilot-om",
+ "KICK_OFF_MESSAGE": "Treba vam brz rezime, želite da proverite prethodne razgovore ili da sastavite bolji odgovor? Copilot je tu da ubrza stvari.",
"SEND_MESSAGE": "Pošalji poruku...",
- "EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
- "LOADER": "Captain is thinking",
+ "EMPTY_MESSAGE": "Došlo je do greške pri generisanju odgovora. Molimo pokušajte ponovo.",
+ "LOADER": "Captain razmišlja",
"YOU": "You",
- "USE": "Use this",
- "RESET": "Reset",
- "SHOW_STEPS": "Show steps",
- "SELECT_ASSISTANT": "Select Assistant",
+ "USE": "Koristi ovo",
+ "RESET": "Resetuj",
+ "SHOW_STEPS": "Prikaži korake",
+ "SELECT_ASSISTANT": "Izaberite asistenta",
"PROMPTS": {
"SUMMARIZE": {
- "LABEL": "Summarize this conversation",
- "CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
+ "LABEL": "Sumirajte ovaj razgovor",
+ "CONTENT": "Sumirajte ključne tačke koje su diskutovane između kupca i agenta podrške, uključujući brige kupca, pitanja i rešenja ili odgovore koje je pružio agent podrške"
},
"SUGGEST": {
- "LABEL": "Suggest an answer",
- "CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
+ "LABEL": "Predloži odgovor",
+ "CONTENT": "Analizirajte upit kupca i sastavite odgovor koji efikasno rešava njihove brige ili pitanja. Osigurajte da odgovor bude jasan, sažet i da pruža korisne informacije."
},
"RATE": {
- "LABEL": "Rate this conversation",
- "CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
+ "LABEL": "Ocenite ovaj razgovor",
+ "CONTENT": "Pregledajte razgovor da biste videli koliko dobro zadovoljava potrebe kupca. Podelite ocenu do 5 na osnovu tona, jasnoće i efikasnosti."
},
"HIGH_PRIORITY": {
- "LABEL": "High priority conversations",
- "CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
+ "LABEL": "Razgovori visokog prioriteta",
+ "CONTENT": "Dajte mi rezime svih otvorenih razgovora sa visokim prioritetom. Uključite ID razgovora, ime kupca (ako je dostupno), sadržaj poslednje poruke i dodeljenog agenta. Grupisati po statusu ako je relevantno."
},
"LIST_CONTACTS": {
- "LABEL": "List contacts",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "LABEL": "Lista kontakata",
+ "CONTENT": "Prikaži mi listu top 10 kontakata. Uključi ime, email ili broj telefona (ako je dostupan), vreme poslednjeg viđenja, oznake (ako ima)."
}
}
},
"PLAYGROUND": {
"USER": "You",
- "ASSISTANT": "Assistant",
+ "ASSISTANT": "Asistent",
"MESSAGE_PLACEHOLDER": "Napišite vašu poruku...",
- "HEADER": "Playground",
- "DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
- "CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
+ "HEADER": "Prostor za igru",
+ "DESCRIPTION": "Koristite ovaj prostor za igru da šaljete poruke svom asistentu i proverite da li odgovara tačno, brzo i u tonu koji očekujete.",
+ "CREDIT_NOTE": "Poruke poslate ovde će se računati u vaše Captain kredite."
},
"PAYWALL": {
- "TITLE": "Upgrade to use Captain AI",
- "AVAILABLE_ON": "Captain is not available on the free plan.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "TITLE": "Nadogradite da biste koristili Captain AI",
+ "AVAILABLE_ON": "Captain nije dostupan na besplatnom planu.",
+ "UPGRADE_PROMPT": "Nadogradite svoj plan da biste dobili pristup našim asistentima, copilotu i još mnogo toga.",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "AVAILABLE_ON": "Captain AI je dostupan samo u Enterprise planovima.",
+ "UPGRADE_PROMPT": "Nadogradite svoj plan da biste dobili pristup našim asistentima, copilotu i još mnogo toga.",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"BANNER": {
- "RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
- "DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
+ "RESPONSES": "Iskoristili ste preko 80% svog limita za odgovore. Da biste nastavili koristiti Captain AI, molimo nadogradite se.",
+ "DOCUMENTS": "Dostignut je limit dokumenata. Nadogradite se da biste nastavili koristiti Captain AI."
},
"FORM": {
"CANCEL": "Otkaži",
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
+ "SELECTED": "{count} selected",
+ "SELECT_ALL": "Select all ({count})",
+ "UNSELECT_ALL": "Unselect all ({count})",
+ "BULK_DELETE_BUTTON": "Izbriši",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Yes, delete all",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Opis",
diff --git a/app/javascript/dashboard/i18n/locale/sv/conversation.json b/app/javascript/dashboard/i18n/locale/sv/conversation.json
index 03dd023e9..2f3428cef 100644
--- a/app/javascript/dashboard/i18n/locale/sv/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/sv/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Meddelandesignaturen är inte konfigurerad. Konfigurera den i profilinställningarna.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "Ge copilot ytterligare instruktioner, eller ställ andra frågor... Tryck enter för att skicka uppföljning",
"CLICK_HERE": "Klicka här för att uppdatera",
"WHATSAPP_TEMPLATES": "Whatsapp Templates"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Dra och släpp hit för att bifoga",
"START_AUDIO_RECORDING": "Starta ljudinspelning",
"STOP_AUDIO_RECORDING": "Stop audio recording",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot tänker",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Lägg till bcc",
diff --git a/app/javascript/dashboard/i18n/locale/sv/helpCenter.json b/app/javascript/dashboard/i18n/locale/sv/helpCenter.json
index f9ac0cb36..0ecf7e809 100644
--- a/app/javascript/dashboard/i18n/locale/sv/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/sv/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Locale removed from portal successfully",
"ERROR_MESSAGE": "Unable to remove locale from portal. Try again."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Default",
+ "DRAFT": "Draft",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Radera"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Select locale..."
},
+ "STATUS": {
+ "LABEL": "Status",
+ "OPTIONS": {
+ "LIVE": "Published",
+ "DRAFT": "Draft"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Locale added successfully",
"ERROR_MESSAGE": "Unable to add locale. Try again."
diff --git a/app/javascript/dashboard/i18n/locale/sv/integrations.json b/app/javascript/dashboard/i18n/locale/sv/integrations.json
index 31231d04d..14637807d 100644
--- a/app/javascript/dashboard/i18n/locale/sv/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/sv/integrations.json
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Captain",
- "HEADER_KNOW_MORE": "Know more",
+ "HEADER_KNOW_MORE": "Läs mer",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "ASSISTANTS": "Assistenter",
+ "SWITCH_ASSISTANT": "Växla mellan assistenter",
+ "NEW_ASSISTANT": "Skapa assistent",
+ "EMPTY_LIST": "Inga assistenter hittades, vänligen skapa en för att komma igång"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "PANEL_TITLE": "Kom igång med Copilot",
+ "KICK_OFF_MESSAGE": "Behöver du en snabb sammanfattning, vill kolla tidigare konversationer eller skriva ett bättre svar? Copilot är här för att snabba på processen.",
"SEND_MESSAGE": "Skicka meddelande...",
- "EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
- "LOADER": "Captain is thinking",
+ "EMPTY_MESSAGE": "Ett fel uppstod vid generering av svaret. Försök igen.",
+ "LOADER": "Captain tänker",
"YOU": "Du",
- "USE": "Use this",
- "RESET": "Reset",
- "SHOW_STEPS": "Show steps",
- "SELECT_ASSISTANT": "Select Assistant",
+ "USE": "Använd detta",
+ "RESET": "Återställ",
+ "SHOW_STEPS": "Visa steg",
+ "SELECT_ASSISTANT": "Välj assistent",
"PROMPTS": {
"SUMMARIZE": {
- "LABEL": "Summarize this conversation",
- "CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
+ "LABEL": "Sammanfatta denna konversation",
+ "CONTENT": "Sammanfatta de viktigaste punkterna som diskuterats mellan kunden och supportagenten, inklusive kundens bekymmer, frågor och de lösningar eller svar som tillhandahållits av supportagenten."
},
"SUGGEST": {
- "LABEL": "Suggest an answer",
- "CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
+ "LABEL": "Föreslå ett svar",
+ "CONTENT": "Analysera kundens förfrågan och utarbeta ett svar som effektivt tar itu med deras frågor eller bekymmer. Säkerställ att svaret är tydligt, koncist och ger hjälpsam information."
},
"RATE": {
- "LABEL": "Rate this conversation",
- "CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
+ "LABEL": "Betygsätt denna konversation",
+ "CONTENT": "Granska konversationen för att se hur väl den uppfyller kundens behov. Dela en bedömning från 1 till 5 baserat på ton, tydlighet och effektivitet."
},
"HIGH_PRIORITY": {
- "LABEL": "High priority conversations",
- "CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
+ "LABEL": "Konversationer med hög prioritet",
+ "CONTENT": "Ge mig en sammanfattning av alla öppna konversationer med hög prioritet. Inkludera konversations-ID, kundens namn (om tillgängligt), innehållet i sista meddelandet och tilldelad agent. Gruppera efter status om relevant."
},
"LIST_CONTACTS": {
- "LABEL": "List contacts",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "LABEL": "Lista kontakter",
+ "CONTENT": "Visa listan på topp 10 kontakter. Inkludera namn, e-post eller telefonnummer (om tillgängligt), senaste inloggningstid, taggar (om några)."
}
}
},
"PLAYGROUND": {
"USER": "Du",
- "ASSISTANT": "Assistant",
+ "ASSISTANT": "Assistent",
"MESSAGE_PLACEHOLDER": "Skriv ditt meddelande...",
- "HEADER": "Playground",
- "DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
- "CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
+ "HEADER": "Testmiljö",
+ "DESCRIPTION": "Använd denna testmiljö för att skicka meddelanden till din assistent och kontrollera om den svarar korrekt, snabbt och med den ton du förväntar dig.",
+ "CREDIT_NOTE": "Meddelanden som skickas här räknas mot dina Captain-krediter."
},
"PAYWALL": {
- "TITLE": "Upgrade to use Captain AI",
- "AVAILABLE_ON": "Captain is not available on the free plan.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "TITLE": "Uppgradera för att använda Captain AI",
+ "AVAILABLE_ON": "Captain är inte tillgängligt på gratisplanen.",
+ "UPGRADE_PROMPT": "Uppgradera din plan för att få tillgång till våra assistenter, copilot och mer.",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "AVAILABLE_ON": "Captain AI finns endast tillgängligt i Enterprise-planerna.",
+ "UPGRADE_PROMPT": "Uppgradera din plan för att få tillgång till våra assistenter, copilot och mer.",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"BANNER": {
- "RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
- "DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
+ "RESPONSES": "Du har använt över 80% av din svargräns. För att fortsätta använda Captain AI, vänligen uppgradera.",
+ "DOCUMENTS": "Dokumentgräns uppnådd. Uppgradera för att fortsätta använda Captain AI."
},
"FORM": {
"CANCEL": "Avbryt",
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
+ "SELECTED": "{count} selected",
+ "SELECT_ALL": "Select all ({count})",
+ "UNSELECT_ALL": "Unselect all ({count})",
+ "BULK_DELETE_BUTTON": "Radera",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Yes, delete all",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Beskrivning",
diff --git a/app/javascript/dashboard/i18n/locale/ta/conversation.json b/app/javascript/dashboard/i18n/locale/ta/conversation.json
index cf48d5b1d..535f073e9 100644
--- a/app/javascript/dashboard/i18n/locale/ta/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ta/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Message signature is not configured, please configure it in profile settings.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "கோபைலட் கூடுதல் உத்திகளை கொடுக்கவும், அல்லது வேறெதாவது கேளுங்கள்... தொடரவும் எண்டரை அழுத்தவும்",
"CLICK_HERE": "Click here to update",
"WHATSAPP_TEMPLATES": "Whatsapp Templates"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Drag and drop here to attach",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "கோபைலட் யோசிக்கிறது",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Add bcc",
diff --git a/app/javascript/dashboard/i18n/locale/ta/helpCenter.json b/app/javascript/dashboard/i18n/locale/ta/helpCenter.json
index f623dd88c..bd683a959 100644
--- a/app/javascript/dashboard/i18n/locale/ta/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/ta/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Locale removed from portal successfully",
"ERROR_MESSAGE": "Unable to remove locale from portal. Try again."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Default",
+ "DRAFT": "Draft",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Delete"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Select locale..."
},
+ "STATUS": {
+ "LABEL": "நிலை",
+ "OPTIONS": {
+ "LIVE": "Published",
+ "DRAFT": "Draft"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Locale added successfully",
"ERROR_MESSAGE": "Unable to add locale. Try again."
diff --git a/app/javascript/dashboard/i18n/locale/ta/integrations.json b/app/javascript/dashboard/i18n/locale/ta/integrations.json
index 863fe4dc6..334b64526 100644
--- a/app/javascript/dashboard/i18n/locale/ta/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ta/integrations.json
@@ -126,7 +126,7 @@
},
"HELP_TEXT": {
"TITLE": "Using Slack Integration",
- "BODY": "With this integration, all of your incoming conversations will be synced to the ***{selectedChannelName}*** channel in your Slack workspace. You can manage all your customer conversations right within the channel and never miss a message.\n\nHere are the main features of the integration:\n\n**Respond to conversations from within Slack:** To respond to a conversation in the ***{selectedChannelName}*** Slack channel, simply type out your message and send it as a thread. This will create a response back to the customer through Chatwoot. It's that simple!\n\n **Create private notes:** If you want to create private notes instead of replies, start your message with ***`note:`***. This ensures that your message is kept private and won't be visible to the customer.\n\n**Associate an agent profile:** If the person who replied on Slack has an agent profile in Chatwoot under the same email, the replies will be associated with that agent profile automatically. This means you can easily track who said what and when. On the other hand, when the replier doesn't have an associated agent profile, the replies will appear from the bot profile to the customer.",
+ "BODY": "இந்த ஒருங்கிணைப்புடன், உங்களுக்குள் வரும் அனைத்து உரையாடல்களும் உங்கள் Slack பணிமிடத்தில் உள்ள ***{selectedChannelName}*** சேனலுடன் ஒத்திசைக்கப்படும். அந்த சேனலுக்குள்ளேயே உங்கள் அனைத்து வாடிக்கையாளர் உரையாடல்களையும் நிர்வகிக்கலாம்; இதனால் எந்தச் செய்தியையும் தவறவிடமாட்டீர்கள்.\n\nஇந்த ஒருங்கிணைப்பின் முக்கிய அம்சங்கள் இவை:\n\n**Slack-இலிருந்தே உரையாடல்களுக்கு பதிலளிக்கவும்:** ***{selectedChannelName}*** Slack சேனலில் உள்ள ஒரு உரையாடலுக்கு பதிலளிக்க, உங்கள் செய்தியைத் தட்டச்சு செய்து அதை thread ஆக அனுப்பினால் போதும். இதனால் Chatwoot வழியாக வாடிக்கையாளருக்கு ஒரு பதில் உருவாகும். அவ்வளவுதான்!\n\n **தனிப்பட்ட குறிப்புகளை உருவாக்கவும்:** பதில்களுக்கு பதிலாக தனிப்பட்ட குறிப்புகளை உருவாக்க விரும்பினால், உங்கள் செய்தியை ***`note:`*** என்று தொடங்குங்கள். இதனால் உங்கள் செய்தி தனிப்பட்டதாகவே இருக்கும், மேலும் அது வாடிக்கையாளருக்குப் புலப்படாது.\n\n**ஒரு முகவர் சுயவிவரத்தை இணைக்கவும்:** Slack-இல் பதிலளித்த நபருக்கு, அதே மின்னஞ்சலுடன் Chatwoot-இல் ஒரு முகவர் சுயவிவரம் இருந்தால், அந்த பதில்கள் தானாகவே அந்த முகவர் சுயவிவரத்துடன் இணைக்கப்படும். இதன் மூலம் யார் என்ன, எப்போது சொன்னார் என்பதை எளிதாகக் கண்காணிக்கலாம். மறுபுறம், பதிலளிப்பவருக்கு தொடர்புடைய முகவர் சுயவிவரம் இல்லையெனில், வாடிக்கையாளருக்கு அந்த பதில்கள் bot சுயவிவரத்திலிருந்து வந்ததுபோல் தோன்றும்.",
"SELECTED": "தேர்ந்தெடுக்கப்பட்டது"
},
"SELECT_CHANNEL": {
@@ -406,17 +406,17 @@
"EMPTY_MESSAGE": "பதில் உருவாக்குவதில் பிழை ஏற்பட்டது. தயவுசெய்து மீண்டும் முயற்சிக்கவும்.",
"LOADER": "கேப்டன் யோசித்து கொண்டிருக்கிறார்",
"YOU": "நீங்கள்",
- "USE": "Use this",
+ "USE": "இதைப் பயன்படுத்தவும்",
"RESET": "மீட்டமைக்கவும்",
- "SHOW_STEPS": "Show steps",
- "SELECT_ASSISTANT": "Select Assistant",
+ "SHOW_STEPS": "சரண்களை காட்டு",
+ "SELECT_ASSISTANT": "உதவியாளரை தேர்வு செய்க",
"PROMPTS": {
"SUMMARIZE": {
- "LABEL": "Summarize this conversation",
+ "LABEL": "இந்த உரையாடலை சுருக்கவும்",
"CONTENT": "வாடிக்கையாளர் மற்றும் ஆதரவு முகவருக்கு இடையேயான முக்கிய அம்சங்களை சுருக்கவும், இதில் வாடிக்கையாளர் கவலைகள், கேள்விகள் மற்றும் ஆதரவு முகவரால் வழங்கப்பட்ட தீர்வுகள் அல்லது பதில்கள் அடங்கும்"
},
"SUGGEST": {
- "LABEL": "Suggest an answer",
+ "LABEL": "பதில் பரிந்துரைக்கவும்",
"CONTENT": "வாடிக்கையாளர் கேள்வியை பகுப்பாய்வு செய்து, அவர்களின் கவலைகள் அல்லது கேள்விகளை விளக்கமாக, தெளிவாக மற்றும் உதவிகரமாக பதிலளிக்கும் வரைவு உருவாக்கவும்."
},
"RATE": {
@@ -428,7 +428,7 @@
"CONTENT": "அனைத்து உயர் முன்னுரிமை திறந்த உரையாடல்களின் சுருக்கத்தை கொடுங்கள். உரையாடல் ஐடி, வாடிக்கையாளர் பெயர் (இருப்பின்), கடைசி செய்தி உள்ளடக்கம் மற்றும் நியமிக்கப்பட்ட முகவரையும் சேர்க்கவும். பொருத்தமானால் நிலை அடிப்படையில் குழுவாக்கவும்."
},
"LIST_CONTACTS": {
- "LABEL": "List contacts",
+ "LABEL": "தொடர்புகளை பட்டியலிடு",
"CONTENT": "மேல்தர 10 தொடர்புகளின் பட்டியலை எனக்கு காட்டவும். பெயர், மின்னஞ்சல் அல்லது தொலைபேசி எண் (இருப்பின்), கடைசியாக பார்க்கப்பட்ட நேரம், குறிச்சொற்கள் (இருப்பின்) ஆகியவற்றையும் சேர்க்கவும்."
}
}
@@ -436,7 +436,7 @@
"PLAYGROUND": {
"USER": "நீங்கள்",
"ASSISTANT": "உதவியாளர்",
- "MESSAGE_PLACEHOLDER": "உங்கள் செய்தியை تایப் செய்யவும்...",
+ "MESSAGE_PLACEHOLDER": "உங்கள் செய்தியை தட்டச்சு செய்யவும்...",
"HEADER": "விளையாட்டு மைதானம்",
"DESCRIPTION": "உங்கள் உதவியாளருக்கு செய்திகள் அனுப்பவும், அது துல்லியமாக, விரைவாக மற்றும் எதிர்பார்க்கும் தொனியில் பதிலளிக்கிறதா என சரிபார்க்க இந்த மைதானத்தை பயன்படுத்தவும்.",
"CREDIT_NOTE": "இங்கே அனுப்பப்படும் செய்திகள் உங்கள் Captain கிரெடிட்களுக்கு சேர்க்கப்படும்."
@@ -640,7 +640,7 @@
"ADD": "அனைத்தையும் சேர்க்கவும்",
"ADD_SINGLE": "இதைச் சேர்க்கவும்",
"SAVE": "சேர்க்கவும் மற்றும் சேமிக்கவும் (↵)",
- "PLACEHOLDER": "மற்றொரு பதில் வழிகாட்டுதலை تایப்புசெய்க..."
+ "PLACEHOLDER": "மற்றொரு பதில் வழிகாட்டுதலை தட்டச்சு செய்யவும்..."
},
"NEW": {
"TITLE": "ஒரு பதில் வழிகாட்டுதலைச் சேர்க்கவும்",
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "ஆவணங்கள்",
"ADD_NEW": "புதிய ஆவணத்தை உருவாக்கவும்",
+ "SELECTED": "{count} தேர்ந்தெடுக்கப்பட்டது",
+ "SELECT_ALL": "அனைத்தையும் தேர்ந்தெடு ({count})",
+ "UNSELECT_ALL": "அனைத்தையும் தேர்விலிருந்து நீக்கு ({count})",
+ "BULK_DELETE_BUTTON": "Delete",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "ஆம், அனைத்தையும் நீக்கவும்",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "சம்பந்தப்பட்ட அடிக்கடி கேட்கப்படும் கேள்விகள்",
"DESCRIPTION": "இந்த அடிக்கடி கேட்கப்படும் கேள்விகள் நேரடியாக ஆவணத்திலிருந்து உருவாக்கப்பட்டவை."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "கருவிகள்",
"ADD_NEW": "புதிய கருவியை உருவாக்கவும்",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "தனிப்பயன் கருவிகள் இல்லை",
"SUBTITLE": "உங்கள் உதவியாளரை வெளிப்புற APIகள் மற்றும் சேவைகளுடன் இணைக்க தனிப்பயன் கருவிகளை உருவாக்கவும், அது தரவுகளை பெறவும் மற்றும் உங்கள் சார்பாக செயல்களை செய்யவும்.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "தனிப்பயன் கருவி வெற்றிகரமாக நீக்கப்பட்டது",
"ERROR_MESSAGE": "தனிப்பயன் கருவியை நீக்க முடியவில்லை"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "கருவி பெயர்",
"PLACEHOLDER": "ஆர்டர் தேடல்",
- "ERROR": "கருவி பெயர் அவசியம்"
+ "ERROR": "கருவி பெயர் அவசியம்",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "விளக்கம்",
diff --git a/app/javascript/dashboard/i18n/locale/th/conversation.json b/app/javascript/dashboard/i18n/locale/th/conversation.json
index de79ac100..afbb99475 100644
--- a/app/javascript/dashboard/i18n/locale/th/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/th/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "ข้อความลายเซ็นต์ไม่ได้ถูกตั้งค่า โปรดปรับแต่งในหน้าตั้งค่าข้อมูลส่วนตัว",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "ให้ Copilot คำสั่งเพิ่มเติม หรือถามอย่างอื่น... กด enter เพื่อส่งข้อความติดตาม",
"CLICK_HERE": "คลิกที่นี่เพื่ออัปเดต",
"WHATSAPP_TEMPLATES": "Whatsapp Templates"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "ลากเเละปล่อยที่นี่เพื่อเพิ่ม",
"START_AUDIO_RECORDING": "เริ่มบันทึกเสียง",
"STOP_AUDIO_RECORDING": "หยุดบันทึกเสียง",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot กำลังคิด",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "เพิ่ม BCC",
diff --git a/app/javascript/dashboard/i18n/locale/th/helpCenter.json b/app/javascript/dashboard/i18n/locale/th/helpCenter.json
index e84f283ef..b4a3b618d 100644
--- a/app/javascript/dashboard/i18n/locale/th/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/th/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Locale removed from portal successfully",
"ERROR_MESSAGE": "Unable to remove locale from portal. Try again."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Default",
+ "DRAFT": "โครงร่าง",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "ลบ"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Select locale..."
},
+ "STATUS": {
+ "LABEL": "สถานะ",
+ "OPTIONS": {
+ "LIVE": "Published",
+ "DRAFT": "โครงร่าง"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Locale added successfully",
"ERROR_MESSAGE": "Unable to add locale. Try again."
diff --git a/app/javascript/dashboard/i18n/locale/th/integrations.json b/app/javascript/dashboard/i18n/locale/th/integrations.json
index c1c2a952e..e4c3c2241 100644
--- a/app/javascript/dashboard/i18n/locale/th/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/th/integrations.json
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Captain",
- "HEADER_KNOW_MORE": "Know more",
+ "HEADER_KNOW_MORE": "รู้เพิ่มเติม",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "ASSISTANTS": "ผู้ช่วย",
+ "SWITCH_ASSISTANT": "สลับระหว่างผู้ช่วย",
+ "NEW_ASSISTANT": "สร้างผู้ช่วย",
+ "EMPTY_LIST": "ไม่พบผู้ช่วย โปรดสร้างผู้ช่วยใหม่เพื่อเริ่มต้น"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "PANEL_TITLE": "เริ่มต้นกับ Copilot",
+ "KICK_OFF_MESSAGE": "ต้องการสรุปอย่างรวดเร็ว ตรวจสอบการสนทนาเก่า หรือร่างคำตอบที่ดีกว่า? Copilot ช่วยเร่งให้เร็วขึ้น",
"SEND_MESSAGE": "ส่วข้อความ...",
- "EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
- "LOADER": "Captain is thinking",
+ "EMPTY_MESSAGE": "เกิดข้อผิดพลาดในการสร้างคำตอบ โปรดลองอีกครั้ง",
+ "LOADER": "Captain กำลังคิด",
"YOU": "You",
- "USE": "Use this",
- "RESET": "Reset",
- "SHOW_STEPS": "Show steps",
- "SELECT_ASSISTANT": "Select Assistant",
+ "USE": "ใช้สิ่งนี้",
+ "RESET": "รีเซ็ต",
+ "SHOW_STEPS": "แสดงขั้นตอน",
+ "SELECT_ASSISTANT": "เลือกผู้ช่วย",
"PROMPTS": {
"SUMMARIZE": {
- "LABEL": "Summarize this conversation",
- "CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
+ "LABEL": "สรุปการสนทนานี้",
+ "CONTENT": "สรุปประเด็นสำคัญที่พูดคุยระหว่างลูกค้าและเจ้าหน้าที่ซัพพอร์ต รวมทั้งข้อกังวล คำถาม และวิธีแก้ไขหรือคำตอบที่เจ้าหน้าที่ให้"
},
"SUGGEST": {
- "LABEL": "Suggest an answer",
- "CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
+ "LABEL": "แนะนำคำตอบ",
+ "CONTENT": "วิเคราะห์คำถามของลูกค้า และร่างคำตอบที่ตอบโจทย์ข้อกังวลหรือคำถามอย่างมีประสิทธิภาพ ให้คำตอบชัดเจน กระชับ และให้ข้อมูลที่เป็นประโยชน์"
},
"RATE": {
- "LABEL": "Rate this conversation",
- "CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
+ "LABEL": "ให้คะแนนการสนทนานี้",
+ "CONTENT": "ตรวจสอบการสนทนาเพื่อดูว่าตรงตามความต้องการของลูกค้าอย่างไร ให้คะแนนจาก 5 โดยพิจารณาจากน้ำเสียง ความชัดเจน และประสิทธิผล"
},
"HIGH_PRIORITY": {
- "LABEL": "High priority conversations",
- "CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
+ "LABEL": "การสนทนาความสำคัญสูง",
+ "CONTENT": "สรุปการสนทนาเปิดที่มีความสำคัญสูงทั้งหมด รวม ID การสนทนา ชื่อลูกค้า (ถ้ามี) เนื้อหาข้อความล่าสุด และเจ้าหน้าที่ที่รับผิดชอบ จัดกลุ่มตามสถานะถ้ามีความเกี่ยวข้อง"
},
"LIST_CONTACTS": {
- "LABEL": "List contacts",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "LABEL": "รายชื่อติดต่อ",
+ "CONTENT": "แสดงรายชื่อ 10 ติดต่อยอดนิยม รวมชื่อ อีเมลหรือเบอร์โทรศัพท์ (ถ้ามี) เวลาที่เข้าชมล่าสุด ป้ายชื่อ (ถ้ามี)"
}
}
},
"PLAYGROUND": {
"USER": "You",
- "ASSISTANT": "Assistant",
+ "ASSISTANT": "ผู้ช่วย",
"MESSAGE_PLACEHOLDER": "พิมพ์ข้อความ...",
- "HEADER": "Playground",
- "DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
- "CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
+ "HEADER": "สนามทดสอบ",
+ "DESCRIPTION": "ใช้สนามทดสอบนี้เพื่อส่งข้อความถึงผู้ช่วย และตรวจสอบว่าตอบกลับได้ถูกต้อง รวดเร็ว และในน้ำเสียงที่คุณคาดหวังหรือไม่",
+ "CREDIT_NOTE": "ข้อความที่ส่งที่นี่จะนับรวมกับเครดิต Captain ของคุณ"
},
"PAYWALL": {
- "TITLE": "Upgrade to use Captain AI",
- "AVAILABLE_ON": "Captain is not available on the free plan.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "TITLE": "อัปเกรดเพื่อใช้ Captain AI",
+ "AVAILABLE_ON": "Captain ไม่สามารถใช้ได้ในแผนฟรี",
+ "UPGRADE_PROMPT": "อัปเกรดแผนเพื่อเข้าถึงผู้ช่วย Copilot และอื่นๆ",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "AVAILABLE_ON": "Captain AI ใช้ได้เฉพาะในแผน Enterprise เท่านั้น",
+ "UPGRADE_PROMPT": "อัปเกรดแผนเพื่อเข้าถึงผู้ช่วย Copilot และอื่นๆ",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"BANNER": {
- "RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
- "DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
+ "RESPONSES": "คุณใช้เกิน 80% ของขีดจำกัดการตอบแล้ว เพื่อใช้ Captain AI ต่อ กรุณาอัปเกรด",
+ "DOCUMENTS": "ถึงขีดจำกัดเอกสารแล้ว อัปเกรดเพื่อใช้ Captain AI ต่อ"
},
"FORM": {
"CANCEL": "ยกเลิก",
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
+ "SELECTED": "{count} selected",
+ "SELECT_ALL": "Select all ({count})",
+ "UNSELECT_ALL": "Unselect all ({count})",
+ "BULK_DELETE_BUTTON": "ลบ",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Yes, delete all",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "คำอธิบาย",
diff --git a/app/javascript/dashboard/i18n/locale/tl/agentMgmt.json b/app/javascript/dashboard/i18n/locale/tl/agentMgmt.json
index 4b66fe864..103b3e7b7 100644
--- a/app/javascript/dashboard/i18n/locale/tl/agentMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/tl/agentMgmt.json
@@ -1,8 +1,8 @@
{
"AGENT_MGMT": {
- "HEADER": "Agents",
- "HEADER_BTN_TXT": "Add Agent",
- "LOADING": "Fetching Agent List",
+ "HEADER": "Mga Ahente",
+ "HEADER_BTN_TXT": "Magdagdag ng ahente",
+ "LOADING": "Kinukuha ang listahan ng mga ahente",
"DESCRIPTION": "An agent is a member of your customer support team who can view and respond to user messages. The list below shows all the agents in your account.",
"LEARN_MORE": "Learn about user roles",
"AGENT_TYPES": {
diff --git a/app/javascript/dashboard/i18n/locale/tl/contact.json b/app/javascript/dashboard/i18n/locale/tl/contact.json
index 4aec4ddf9..893570978 100644
--- a/app/javascript/dashboard/i18n/locale/tl/contact.json
+++ b/app/javascript/dashboard/i18n/locale/tl/contact.json
@@ -1,7 +1,7 @@
{
"CONTACT_PANEL": {
"NOT_AVAILABLE": "Hindi magagamit",
- "EMAIL_ADDRESS": "Email Address",
+ "EMAIL_ADDRESS": "Alamat ng email",
"PHONE_NUMBER": "Numero ng Telepono",
"IDENTIFIER": "Tagakilala",
"COPY_SUCCESSFUL": "Matagumpay na nakopya sa clipboard",
@@ -11,7 +11,7 @@
"CONVERSATION_TITLE": "Mga Detalye ng Usapan",
"VIEW_PROFILE": "Tingnan ang profile",
"BROWSER": "Browser",
- "OS": "Operating System",
+ "OS": "Sistema ng pagpapatakbo",
"INITIATED_FROM": "Nagsimula mula sa",
"INITIATED_AT": "Nagsimula noong",
"IP_ADDRESS": "IP Address",
@@ -95,7 +95,7 @@
},
"EMAIL_ADDRESS": {
"PLACEHOLDER": "Ilagay ang email address ng contact",
- "LABEL": "Email Address",
+ "LABEL": "Alamat ng email",
"DUPLICATE": "Ang email address na ito ay ginagamit na para sa ibang kontak.",
"ERROR": "Mangyaring maglagay ng wastong email address."
},
diff --git a/app/javascript/dashboard/i18n/locale/tl/conversation.json b/app/javascript/dashboard/i18n/locale/tl/conversation.json
index c3fd53522..674e4f090 100644
--- a/app/javascript/dashboard/i18n/locale/tl/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/tl/conversation.json
@@ -4,7 +4,7 @@
"CSAT_REPLY_MESSAGE": "Please rate the conversation",
"404": "Sorry, we cannot find the conversation. Please try again",
"SWITCH_VIEW_LAYOUT": "Switch the layout",
- "DASHBOARD_APP_TAB_MESSAGES": "Messages",
+ "DASHBOARD_APP_TAB_MESSAGES": "Mga Mensahe",
"UNVERIFIED_SESSION": "The identity of this user is not verified",
"NO_MESSAGE_1": "Naku! Mukhang wala pang mensahe mula sa mga customer sa iyong inbox.",
"NO_MESSAGE_2": " para magpadala ng mensahe sa iyong page!",
@@ -22,7 +22,7 @@
"TITLE": "Maghanap ng mensahe",
"RESULT_TITLE": "Search Results",
"LOADING_MESSAGE": "Pinoproseso ang data...",
- "PLACEHOLDER": "Type any text to search messages",
+ "PLACEHOLDER": "Mag-type ng anumang teksto upang maghanap ng mga mensahe",
"NO_MATCHING_RESULTS": "No results found."
},
"UNREAD_MESSAGES": "Unread Messages",
@@ -64,14 +64,14 @@
"UNSUPPORTED_MESSAGE_TIKTOK": "This message is unsupported. You can view this message on the TikTok app.",
"SUCCESS_DELETE_MESSAGE": "Message deleted successfully",
"FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again",
- "NO_RESPONSE": "No response",
- "RESPONSE": "Response",
+ "NO_RESPONSE": "Walang tugon",
+ "RESPONSE": "Tugon",
"RATING_TITLE": "Rating",
"FEEDBACK_TITLE": "Feedback",
"REPLY_MESSAGE_NOT_FOUND": "Message not available",
"CARD": {
- "SHOW_LABELS": "Show labels",
- "HIDE_LABELS": "Hide labels"
+ "SHOW_LABELS": "Ipakita ang mga label",
+ "HIDE_LABELS": "Itago ang mga label"
},
"VOICE_CALL": {
"INCOMING_CALL": "Incoming call",
@@ -87,7 +87,7 @@
"HEADER": {
"RESOLVE_ACTION": "Tapusin",
"REOPEN_ACTION": "Buksan muli",
- "OPEN_ACTION": "Open",
+ "OPEN_ACTION": "Buksan",
"MORE_ACTIONS": "More actions",
"OPEN": "Higit pa",
"CLOSE": "Isara",
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Message signature is not configured, please configure it in profile settings.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "Bigyan ang copilot ng karagdagang mga hudyat, o magtanong ng kahit ano pa... Pindutin ang enter para magpadala ng follow-up",
"CLICK_HERE": "Click here to update",
"WHATSAPP_TEMPLATES": "Whatsapp Templates"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Drag and drop here to attach",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Iniisip ng Copilot",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Add bcc",
@@ -258,14 +258,14 @@
"FILE_SIZE_LIMIT": "File exceeds the {MAXIMUM_SUPPORTED_FILE_UPLOAD_SIZE} MB attachment limit",
"FILE_TYPE_NOT_SUPPORTED": "This {fileName} file type is not supported in this conversation",
"MESSAGE_ERROR": "Unable to send this message, please try again later",
- "SENT_BY": "Sent by:",
+ "SENT_BY": "Ipinadala ni:",
"BOT": "Bot",
"NATIVE_APP": "Native app",
"NATIVE_APP_ADVISORY": "This message was sent from the native app. Reply from Chatwoot to maintain the message window.",
"SEND_FAILED": "Couldn't send message! Try again",
"TRY_AGAIN": "retry",
"ASSIGNMENT": {
- "SELECT_AGENT": "Select Agent",
+ "SELECT_AGENT": "Pumili ng Ahente",
"REMOVE": "Remove",
"ASSIGN": "Assign"
},
diff --git a/app/javascript/dashboard/i18n/locale/tl/helpCenter.json b/app/javascript/dashboard/i18n/locale/tl/helpCenter.json
index 3bc6d7305..511bbf4c0 100644
--- a/app/javascript/dashboard/i18n/locale/tl/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/tl/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Matagumpay na natanggal ang wika mula sa portal",
"ERROR_MESSAGE": "Hindi matanggal ang wika mula sa portal. Subukang muli."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} artikulo | {count} mga artikulo",
"CATEGORIES_COUNT": "{count} kategorya | {count} mga kategorya",
"DEFAULT": "Default",
+ "DRAFT": "Burador",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Gawing default",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Tanggalin"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Pumili ng wika..."
},
+ "STATUS": {
+ "LABEL": "Status",
+ "OPTIONS": {
+ "LIVE": "Nailathala",
+ "DRAFT": "Burador"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Matagumpay na nadagdag ang wika",
"ERROR_MESSAGE": "Hindi maidagdag ang wika. Subukang muli."
diff --git a/app/javascript/dashboard/i18n/locale/tl/integrations.json b/app/javascript/dashboard/i18n/locale/tl/integrations.json
index fcdd4de0f..545393d1a 100644
--- a/app/javascript/dashboard/i18n/locale/tl/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/tl/integrations.json
@@ -126,7 +126,7 @@
},
"HELP_TEXT": {
"TITLE": "Paano gamitin ang Slack Integration?",
- "BODY": "With this integration, all of your incoming conversations will be synced to the ***{selectedChannelName}*** channel in your Slack workspace. You can manage all your customer conversations right within the channel and never miss a message.\n\nHere are the main features of the integration:\n\n**Respond to conversations from within Slack:** To respond to a conversation in the ***{selectedChannelName}*** Slack channel, simply type out your message and send it as a thread. This will create a response back to the customer through Chatwoot. It's that simple!\n\n **Create private notes:** If you want to create private notes instead of replies, start your message with ***`note:`***. This ensures that your message is kept private and won't be visible to the customer.\n\n**Associate an agent profile:** If the person who replied on Slack has an agent profile in Chatwoot under the same email, the replies will be associated with that agent profile automatically. This means you can easily track who said what and when. On the other hand, when the replier doesn't have an associated agent profile, the replies will appear from the bot profile to the customer.",
+ "BODY": "Sa integrasyong ito, masi-sync ang lahat ng iyong papasok na usapan sa channel na ***{selectedChannelName}*** sa iyong Slack workspace. Maaari mong pamahalaan ang lahat ng usapan ng iyong mga customer mismo sa channel at hindi na makakaligtaan ang anumang mensahe.\n\nNarito ang mga pangunahing feature ng integrasyon:\n\n**Sumagot sa mga usapan mula sa loob ng Slack:** Para sumagot sa isang usapan sa Slack channel na ***{selectedChannelName}***, i-type lang ang iyong mensahe at ipadala ito bilang thread. Lilikha ito ng tugon pabalik sa customer sa pamamagitan ng Chatwoot. Ganun lang kadali!\n\n **Gumawa ng mga pribadong note:** Kung gusto mong gumawa ng mga pribadong note sa halip na mga reply, simulan ang iyong mensahe sa ***`note:`***. Tinitiyak nito na mananatiling pribado ang iyong mensahe at hindi ito makikita ng customer.\n\n**Iugnay ang profile ng agent:** Kung ang taong sumagot sa Slack ay may agent profile sa Chatwoot na may parehong email, awtomatikong iuugnay ang mga reply sa profile na iyon. Ibig sabihin, madali mong masusubaybayan kung sino ang nagsabi ng ano at kailan. Sa kabilang banda, kapag walang katugmang agent profile ang sumagot, lalabas sa customer na mula ito sa bot profile.",
"SELECTED": "napili"
},
"SELECT_CHANNEL": {
@@ -393,8 +393,8 @@
"HEADER_KNOW_MORE": "Alamin pa",
"ASSISTANT_SWITCHER": {
"ASSISTANTS": "Mga Katulong",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
+ "SWITCH_ASSISTANT": "Lumipat sa pagitan ng mga assistant",
+ "NEW_ASSISTANT": "Gumawa ng Assistant",
"EMPTY_LIST": "Walang nahanap na mga assistant, mangyaring gumawa ng isa upang makapagsimula."
},
"COPILOT": {
@@ -449,7 +449,7 @@
"CANCEL_ANYTIME": "Maaari mong baguhin o kanselahin ang iyong plano anumang oras"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
+ "AVAILABLE_ON": "Ang Captain AI ay available lamang sa mga Enterprise na plano.",
"UPGRADE_PROMPT": "I-upgrade ang iyong plano para ma-access ang aming mga assistant, copilot at iba pa.",
"ASK_ADMIN": "Mangyaring makipag-ugnayan sa iyong administrator para sa pag-upgrade."
},
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Mga Dokumento",
"ADD_NEW": "Gumawa ng bagong dokumento",
+ "SELECTED": "{count} napili",
+ "SELECT_ALL": "Piliin lahat ({count})",
+ "UNSELECT_ALL": "Alisin ang pagpili sa lahat ({count})",
+ "BULK_DELETE_BUTTON": "Delete",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Oo, tanggalin lahat",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Mga Kaugnay na FAQ",
"DESCRIPTION": "Ang mga FAQ na ito ay direktang ginawa mula sa dokumento."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Mga Kasangkapan",
"ADD_NEW": "Gumawa ng bagong kasangkapan",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "Walang magagamit na pasadyang mga kasangkapan",
"SUBTITLE": "Gumawa ng mga pasadyang kasangkapan upang ikonekta ang iyong katulong sa mga panlabas na API at serbisyo, na nagbibigay-daan dito na kumuha ng data at magsagawa ng mga aksyon para sa iyo.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Nagkaroon ng error sa pagtanggal ng pasadyang kasangkapan"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Paglalarawan",
diff --git a/app/javascript/dashboard/i18n/locale/tl/report.json b/app/javascript/dashboard/i18n/locale/tl/report.json
index b0733bedd..ed1a1c700 100644
--- a/app/javascript/dashboard/i18n/locale/tl/report.json
+++ b/app/javascript/dashboard/i18n/locale/tl/report.json
@@ -1,129 +1,129 @@
{
"REPORT": {
- "HEADER": "Conversations",
+ "HEADER": "Mga Pag-uusap",
"LOADING_CHART": "Ikinakarga ang datos ng tsart...",
"NO_ENOUGH_DATA": "Walang sapat na datos para makagawa ng ulat. Pakisubukang muli mamaya.",
"DOWNLOAD_CONVERSATION_REPORTS": "Download conversation reports",
- "DATA_FETCHING_FAILED": "Failed to fetch data, please try again later.",
- "SUMMARY_FETCHING_FAILED": "Failed to fetch summary, please try again later.",
+ "DATA_FETCHING_FAILED": "Nabigong kunin ang datos, pakisubukang muli mamaya.",
+ "SUMMARY_FETCHING_FAILED": "Nabigong kunin ang buod, pakisubukang muli mamaya.",
"METRICS": {
"CONVERSATIONS": {
"NAME": "Usapan",
"DESC": "(Kabuuan)"
},
"INCOMING_MESSAGES": {
- "NAME": "Messages received",
+ "NAME": "Mga mensaheng natanggap",
"DESC": "(Kabuuan)"
},
"OUTGOING_MESSAGES": {
- "NAME": "Messages sent",
+ "NAME": "Mga mensaheng ipinadala",
"DESC": "(Kabuuan)"
},
"FIRST_RESPONSE_TIME": {
- "NAME": "First Response Time",
+ "NAME": "Unang Oras ng Tugon",
"DESC": "(Average)",
- "INFO_TEXT": "Total number of conversations used for computation:",
- "TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)"
+ "INFO_TEXT": "Kabuuang bilang ng mga pag-uusap na ginamit sa pagkalkula:",
+ "TOOLTIP_TEXT": "Ang Unang Oras ng Tugon ay {metricValue} (batay sa {conversationCount} mga pag-uusap)"
},
"RESOLUTION_TIME": {
"NAME": "Oras ng Resolusyon",
"DESC": "(Average)",
- "INFO_TEXT": "Total number of conversations used for computation:",
- "TOOLTIP_TEXT": "Resolution Time is {metricValue} (based on {conversationCount} conversations)"
+ "INFO_TEXT": "Kabuuang bilang ng mga pag-uusap na ginamit sa pagkalkula:",
+ "TOOLTIP_TEXT": "Ang Oras ng Resolusyon ay {metricValue} (batay sa {conversationCount} mga pag-uusap)"
},
"RESOLUTION_COUNT": {
"NAME": "Bilang ng Resolusyon",
"DESC": "( Kabuuan )"
},
"BOT_RESOLUTION_COUNT": {
- "NAME": "Resolution Count",
- "DESC": "( Total )"
+ "NAME": "Bilang ng Resolusyon",
+ "DESC": "( Kabuuan )"
},
"BOT_HANDOFF_COUNT": {
- "NAME": "Handoff Count",
- "DESC": "( Total )"
+ "NAME": "Bilang ng Pagsasalin",
+ "DESC": "( Kabuuan )"
},
"REPLY_TIME": {
- "NAME": "Customer waiting time",
- "TOOLTIP_TEXT": "Waiting time is {metricValue} (based on {conversationCount} replies)",
+ "NAME": "Oras ng paghihintay ng customer",
+ "TOOLTIP_TEXT": "Ang oras ng paghihintay ay {metricValue} (batay sa {conversationCount} mga sagot)",
"DESC": ""
}
},
"DATE_RANGE_OPTIONS": {
- "LAST_7_DAYS": "Last 7 days",
- "LAST_14_DAYS": "Last 14 days",
- "LAST_30_DAYS": "Last 30 days",
+ "LAST_7_DAYS": "Huling 7 araw",
+ "LAST_14_DAYS": "Huling 14 na araw",
+ "LAST_30_DAYS": "Huling 30 araw",
"THIS_MONTH": "This month",
"LAST_MONTH": "Last month",
- "LAST_3_MONTHS": "Last 3 months",
- "LAST_6_MONTHS": "Last 6 months",
- "LAST_YEAR": "Last year",
- "CUSTOM_DATE_RANGE": "Custom date range"
+ "LAST_3_MONTHS": "Huling 3 buwan",
+ "LAST_6_MONTHS": "Huling 6 na buwan",
+ "LAST_YEAR": "Nakaraang taon",
+ "CUSTOM_DATE_RANGE": "Pasadyang saklaw ng petsa"
},
"CUSTOM_DATE_RANGE": {
"CONFIRM": "Ilapat",
"PLACEHOLDER": "Pumili ng petsa"
},
- "GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By",
- "DURATION_FILTER_LABEL": "Duration",
+ "GROUP_BY_FILTER_DROPDOWN_LABEL": "Pangkatin Ayon sa",
+ "DURATION_FILTER_LABEL": "Tagal",
"GROUPING_OPTIONS": {
- "DAY": "Day",
- "WEEK": "Week",
- "MONTH": "Month",
- "YEAR": "Year"
+ "DAY": "Araw",
+ "WEEK": "Linggo",
+ "MONTH": "Buwan",
+ "YEAR": "Taon"
},
"GROUP_BY_DAY_OPTIONS": [
{
"id": 1,
- "groupBy": "Day"
+ "groupBy": "Araw"
}
],
"GROUP_BY_WEEK_OPTIONS": [
{
"id": 1,
- "groupBy": "Day"
+ "groupBy": "Araw"
},
{
"id": 2,
- "groupBy": "Week"
+ "groupBy": "Linggo"
}
],
"GROUP_BY_MONTH_OPTIONS": [
{
"id": 1,
- "groupBy": "Day"
+ "groupBy": "Araw"
},
{
"id": 2,
- "groupBy": "Week"
+ "groupBy": "Linggo"
},
{
"id": 3,
- "groupBy": "Month"
+ "groupBy": "Buwan"
}
],
"GROUP_BY_YEAR_OPTIONS": [
{
"id": 2,
- "groupBy": "Week"
+ "groupBy": "Linggo"
},
{
"id": 3,
- "groupBy": "Month"
+ "groupBy": "Buwan"
},
{
"id": 4,
- "groupBy": "Year"
+ "groupBy": "Taon"
}
],
- "BUSINESS_HOURS": "Business Hours",
+ "BUSINESS_HOURS": "Oras ng Negosyo",
"FILTER_ACTIONS": {
- "CLEAR_FILTER": "Clear filter",
- "EMPTY_LIST": "No results found"
+ "CLEAR_FILTER": "Tanggalin ang filter",
+ "EMPTY_LIST": "Walang nahanap na resulta"
},
"PAGINATION": {
- "RESULTS": "Showing {start} to {end} of {total} results",
- "PER_PAGE_TEMPLATE": "{size} / page"
+ "RESULTS": "Ipinapakita ang {start} hanggang {end} ng {total} resulta",
+ "PER_PAGE_TEMPLATE": "{size} / pahina"
}
},
"AGENT_REPORTS": {
@@ -152,16 +152,16 @@
"DESC": "( Kabuuan )"
},
"FIRST_RESPONSE_TIME": {
- "NAME": "First Response Time",
- "DESC": "( Avg )",
- "INFO_TEXT": "Total number of conversations used for computation:",
- "TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)"
+ "NAME": "Unang Oras ng Tugon",
+ "DESC": "( Karaniwan )",
+ "INFO_TEXT": "Kabuuang bilang ng mga pag-uusap na ginamit para sa pagkalkula:",
+ "TOOLTIP_TEXT": "Ang Unang Oras ng Pagtugon ay {metricValue} (batay sa {conversationCount} mga pag-uusap)"
},
"RESOLUTION_TIME": {
"NAME": "Oras ng Pagsagot",
- "DESC": "( Avg )",
- "INFO_TEXT": "Total number of conversations used for computation:",
- "TOOLTIP_TEXT": "Resolution Time is {metricValue} (based on {conversationCount} conversations)"
+ "DESC": "( Karaniwan )",
+ "INFO_TEXT": "Kabuuang bilang ng mga pag-uusap na ginamit para sa pagkalkula:",
+ "TOOLTIP_TEXT": "Ang Oras ng Resolusyon ay {metricValue} (batay sa {conversationCount} mga pag-uusap)"
},
"RESOLUTION_COUNT": {
"NAME": "Bilang ng Nalutas",
@@ -201,7 +201,7 @@
},
"LABEL_REPORTS": {
"HEADER": "Pangkalahatang-ideya ng Label",
- "DESCRIPTION": "Track label performance with key metrics including conversations, response times, resolution times, and resolved cases. Click a label name for detailed insights.",
+ "DESCRIPTION": "Subaybayan ang performance ng label gamit ang mga pangunahing sukatan kabilang ang mga pag-uusap, oras ng pagtugon, oras ng paglutas, at mga naresolbang kaso. I-click ang pangalan ng label para sa detalyadong impormasyon.",
"LOADING_CHART": "Ikinakarga ang datos ng tsart...",
"NO_ENOUGH_DATA": "Walang sapat na datos para makagawa ng ulat. Pakisubukang muli mamaya.",
"DOWNLOAD_LABEL_REPORTS": "I-download ang mga ulat ng label",
@@ -225,16 +225,16 @@
"DESC": "( Kabuuan )"
},
"FIRST_RESPONSE_TIME": {
- "NAME": "First Response Time",
- "DESC": "( Avg )",
- "INFO_TEXT": "Total number of conversations used for computation:",
- "TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)"
+ "NAME": "Unang Oras ng Pagtugon",
+ "DESC": "( Karaniwan )",
+ "INFO_TEXT": "Kabuuang bilang ng mga pag-uusap na ginamit para sa pagkalkula:",
+ "TOOLTIP_TEXT": "Ang Unang Oras ng Pagtugon ay {metricValue} (batay sa {conversationCount} mga pag-uusap)"
},
"RESOLUTION_TIME": {
"NAME": "Oras ng Resolusyon",
- "DESC": "( Avg )",
- "INFO_TEXT": "Total number of conversations used for computation:",
- "TOOLTIP_TEXT": "Resolution Time is {metricValue} (based on {conversationCount} conversations)"
+ "DESC": "( Karaniwan )",
+ "INFO_TEXT": "Kabuuang bilang ng mga pag-uusap na ginamit para sa pagkalkula:",
+ "TOOLTIP_TEXT": "Ang Oras ng Resolusyon ay {metricValue} (batay sa {conversationCount} mga pag-uusap)"
},
"RESOLUTION_COUNT": {
"NAME": "Bilang ng Resolusyon",
@@ -274,13 +274,13 @@
},
"INBOX_REPORTS": {
"HEADER": "Buod ng Inbox",
- "DESCRIPTION": "Quickly view your inbox performance with key metrics like conversations, response times, resolution times, and resolved cases—all in one place. Click an inbox name for more details.",
+ "DESCRIPTION": "Mabilis na tingnan ang performance ng iyong inbox gamit ang mga pangunahing sukatan tulad ng mga pag-uusap, oras ng pagtugon, oras ng paglutas, at mga nalutas na kaso—lahat sa isang lugar. I-click ang pangalan ng inbox para sa karagdagang detalye.",
"LOADING_CHART": "Ikinakarga ang datos ng tsart...",
"NO_ENOUGH_DATA": "Walang sapat na datos para makagawa ng ulat. Pakisubukang muli mamaya.",
"DOWNLOAD_INBOX_REPORTS": "I-download ang mga ulat ng inbox",
"FILTER_DROPDOWN_LABEL": "Pumili ng Inbox",
- "ALL_INBOXES": "All Inboxes",
- "SEARCH_INBOX": "Search Inbox",
+ "ALL_INBOXES": "Lahat ng Inbox",
+ "SEARCH_INBOX": "Hanapin sa Inbox",
"FILTERS": {
"INPUT_PLACEHOLDER": {
"INBOXES": "Search inboxes"
@@ -296,64 +296,64 @@
"DESC": "(Kabuuan)"
},
"OUTGOING_MESSAGES": {
- "NAME": "Outgoing Messages",
- "DESC": "( Total )"
+ "NAME": "Mga Lumabas na Mensahe",
+ "DESC": "( Kabuuan )"
},
"FIRST_RESPONSE_TIME": {
- "NAME": "First Response Time",
- "DESC": "( Avg )",
- "INFO_TEXT": "Total number of conversations used for computation:",
- "TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)"
+ "NAME": "Unang Oras ng Tugon",
+ "DESC": "( Karaniwan )",
+ "INFO_TEXT": "Kabuuang bilang ng mga pag-uusap na ginamit sa pagkalkula:",
+ "TOOLTIP_TEXT": "Ang Oras ng Unang Tugon ay {metricValue} (batay sa {conversationCount} mga pag-uusap)"
},
"RESOLUTION_TIME": {
- "NAME": "Resolution Time",
- "DESC": "( Avg )",
- "INFO_TEXT": "Total number of conversations used for computation:",
- "TOOLTIP_TEXT": "Resolution Time is {metricValue} (based on {conversationCount} conversations)"
+ "NAME": "Oras ng Paglutas",
+ "DESC": "( Karaniwan )",
+ "INFO_TEXT": "Kabuuang bilang ng mga pag-uusap na ginamit sa pagkalkula:",
+ "TOOLTIP_TEXT": "Ang Oras ng Resolusyon ay {metricValue} (batay sa {conversationCount} mga pag-uusap)"
},
"RESOLUTION_COUNT": {
- "NAME": "Resolution Count",
- "DESC": "( Total )"
+ "NAME": "Bilang ng Paglutas",
+ "DESC": "( Kabuuan )"
}
},
"DATE_RANGE": [
{
"id": 0,
- "name": "Last 7 days"
+ "name": "Huling 7 araw"
},
{
"id": 1,
- "name": "Last 30 days"
+ "name": "Huling 30 araw"
},
{
"id": 2,
- "name": "Last 3 months"
+ "name": "Huling 3 buwan"
},
{
"id": 3,
- "name": "Last 6 months"
+ "name": "Huling 6 na buwan"
},
{
"id": 4,
- "name": "Last year"
+ "name": "Nakaraang taon"
},
{
"id": 5,
- "name": "Custom date range"
+ "name": "Pasadyang saklaw ng petsa"
}
],
"CUSTOM_DATE_RANGE": {
- "CONFIRM": "Apply",
- "PLACEHOLDER": "Select date range"
+ "CONFIRM": "Ipatupad",
+ "PLACEHOLDER": "Pumili ng saklaw ng petsa"
}
},
"TEAM_REPORTS": {
- "HEADER": "Team Overview",
+ "HEADER": "Pangkalahatang-ideya ng Koponan",
"DESCRIPTION": "Get a snapshot of your team's performance with essential metrics, including conversations, response times, resolution times, and resolved cases. Click a team name for more details.",
- "LOADING_CHART": "Loading chart data...",
- "NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
- "DOWNLOAD_TEAM_REPORTS": "Download team reports",
- "FILTER_DROPDOWN_LABEL": "Select Team",
+ "LOADING_CHART": "Naglo-load ng datos ng tsart...",
+ "NO_ENOUGH_DATA": "Hindi pa sapat ang datos na natanggap para makabuo ng ulat, Pakisubukang muli mamaya.",
+ "DOWNLOAD_TEAM_REPORTS": "I-download ang mga ulat ng koponan",
+ "FILTER_DROPDOWN_LABEL": "Pumili ng Koponan",
"FILTERS": {
"ADD_FILTER": "Add filter",
"CLEAR_ALL": "Clear all",
@@ -364,71 +364,71 @@
},
"METRICS": {
"CONVERSATIONS": {
- "NAME": "Conversations",
- "DESC": "( Total )"
+ "NAME": "Mga Pag-uusap",
+ "DESC": "( Kabuuan )"
},
"INCOMING_MESSAGES": {
- "NAME": "Incoming Messages",
- "DESC": "( Total )"
+ "NAME": "Mga Papasok na Mensahe",
+ "DESC": "( Kabuuan )"
},
"OUTGOING_MESSAGES": {
- "NAME": "Outgoing Messages",
- "DESC": "( Total )"
+ "NAME": "Mga Papalabas na Mensahe",
+ "DESC": "( Kabuuan )"
},
"FIRST_RESPONSE_TIME": {
- "NAME": "First Response Time",
- "DESC": "( Avg )",
- "INFO_TEXT": "Total number of conversations used for computation:",
- "TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)"
+ "NAME": "Unang Oras ng Tugon",
+ "DESC": "( Karaniwan )",
+ "INFO_TEXT": "Kabuuang bilang ng mga pag-uusap na ginamit sa pagkalkula:",
+ "TOOLTIP_TEXT": "Ang Oras ng Unang Tugon ay {metricValue} (batay sa {conversationCount} mga pag-uusap)"
},
"RESOLUTION_TIME": {
- "NAME": "Resolution Time",
- "DESC": "( Avg )",
- "INFO_TEXT": "Total number of conversations used for computation:",
- "TOOLTIP_TEXT": "Resolution Time is {metricValue} (based on {conversationCount} conversations)"
+ "NAME": "Oras ng Paglutas",
+ "DESC": "( Karaniwan )",
+ "INFO_TEXT": "Kabuuang bilang ng mga pag-uusap na ginamit para sa pagkalkula:",
+ "TOOLTIP_TEXT": "Ang Oras ng Resolusyon ay {metricValue} (batay sa {conversationCount} mga pag-uusap)"
},
"RESOLUTION_COUNT": {
- "NAME": "Resolution Count",
- "DESC": "( Total )"
+ "NAME": "Bilang ng Paglutas",
+ "DESC": "( Kabuuan )"
}
},
"DATE_RANGE": [
{
"id": 0,
- "name": "Last 7 days"
+ "name": "Huling 7 araw"
},
{
"id": 1,
- "name": "Last 30 days"
+ "name": "Huling 30 araw"
},
{
"id": 2,
- "name": "Last 3 months"
+ "name": "Huling 3 buwan"
},
{
"id": 3,
- "name": "Last 6 months"
+ "name": "Huling 6 na buwan"
},
{
"id": 4,
- "name": "Last year"
+ "name": "Nakaraang taon"
},
{
"id": 5,
- "name": "Custom date range"
+ "name": "Pasadyang saklaw ng petsa"
}
],
"CUSTOM_DATE_RANGE": {
- "CONFIRM": "Apply",
- "PLACEHOLDER": "Select date range"
+ "CONFIRM": "Ilapat",
+ "PLACEHOLDER": "Pumili ng saklaw ng petsa"
}
},
"CSAT_REPORTS": {
"HEADER": "Ulat ng CSAT",
"NO_RECORDS": "No responses yet",
"NO_RECORDS_DESCRIPTION": "CSAT survey responses will appear here once customers start providing feedback.",
- "DOWNLOAD": "Download CSAT Reports",
- "DOWNLOAD_FAILED": "Failed to download CSAT Reports",
+ "DOWNLOAD": "I-download ang mga Ulat ng CSAT",
+ "DOWNLOAD_FAILED": "Nabigong i-download ang mga Ulat ng CSAT",
"FILTERS": {
"ADD_FILTER": "Add filter",
"CLEAR_ALL": "Clear all",
@@ -456,7 +456,7 @@
"HEADER": {
"CONTACT_NAME": "Kontak",
"AGENT_NAME": "Agent",
- "RATING": "Rating",
+ "RATING": "Pagsusuri",
"FEEDBACK_TEXT": "Komento ng feedback",
"CONVERSATION": "Conversation",
"CUSTOMER": "Customer",
@@ -502,43 +502,43 @@
}
},
"BOT_REPORTS": {
- "HEADER": "Bot Reports",
+ "HEADER": "Mga Ulat ng Bot",
"METRIC": {
"TOTAL_CONVERSATIONS": {
- "LABEL": "No. of Conversations",
- "TOOLTIP": "Total number of conversations handled by the bot"
+ "LABEL": "Bilang ng mga Pag-uusap",
+ "TOOLTIP": "Kabuuang bilang ng mga pag-uusap na hinawakan ng bot"
},
"TOTAL_RESPONSES": {
- "LABEL": "Total Responses",
- "TOOLTIP": "Total number of responses sent by the bot"
+ "LABEL": "Kabuuang Tugon",
+ "TOOLTIP": "Kabuuang bilang ng mga tugon na ipinadala ng bot"
},
"RESOLUTION_RATE": {
- "LABEL": "Resolution Rate",
- "TOOLTIP": "Total number of conversations resolved by the bot / Total number of conversations handled by the bot * 100"
+ "LABEL": "Porsyento ng Paglutas",
+ "TOOLTIP": "Kabuuang bilang ng mga pag-uusap na nalutas ng bot / Kabuuang bilang ng mga pag-uusap na hinawakan ng bot * 100"
},
"HANDOFF_RATE": {
- "LABEL": "Handoff Rate",
- "TOOLTIP": "Total number of conversations handed off to agents / Total number of conversations handled by the bot * 100"
+ "LABEL": "Porsyento ng Pagsasalin",
+ "TOOLTIP": "Kabuuang bilang ng mga pag-uusap na ipinasa sa mga ahente / Kabuuang bilang ng mga pag-uusap na hinawakan ng bot * 100"
}
}
},
"OVERVIEW_REPORTS": {
- "HEADER": "Overview",
- "LIVE": "Live",
+ "HEADER": "Pangkalahatang-ideya",
+ "LIVE": "Naka-live",
"ACCOUNT_CONVERSATIONS": {
- "HEADER": "Open Conversations",
- "LOADING_MESSAGE": "Loading conversation metrics...",
- "OPEN": "Open",
- "UNATTENDED": "Unattended",
- "UNASSIGNED": "Unassigned",
- "PENDING": "Pending"
+ "HEADER": "Mga Bukas na Pag-uusap",
+ "LOADING_MESSAGE": "Ikinakarga ang mga sukatan ng pag-uusap...",
+ "OPEN": "Bukas",
+ "UNATTENDED": "Hindi Napansin",
+ "UNASSIGNED": "Hindi Itinalaga",
+ "PENDING": "Nakahintay"
},
"CONVERSATION_HEATMAP": {
- "HEADER": "Conversation Traffic",
- "NO_CONVERSATIONS": "No conversations",
- "CONVERSATION": "{count} conversation",
- "CONVERSATIONS": "{count} conversations",
- "DOWNLOAD_REPORT": "Download report"
+ "HEADER": "Trapiko ng Pag-uusap",
+ "NO_CONVERSATIONS": "Walang mga pag-uusap",
+ "CONVERSATION": "{count} pag-uusap",
+ "CONVERSATIONS": "{count} mga pag-uusap",
+ "DOWNLOAD_REPORT": "I-download ang ulat"
},
"RESOLUTION_HEATMAP": {
"HEADER": "Resolutions",
@@ -548,103 +548,103 @@
"DOWNLOAD_REPORT": "Download report"
},
"AGENT_CONVERSATIONS": {
- "HEADER": "Conversations by agents",
- "LOADING_MESSAGE": "Loading agent metrics...",
- "NO_AGENTS": "There are no conversations by agents",
+ "HEADER": "Mga Pag-uusap ayon sa mga ahente",
+ "LOADING_MESSAGE": "Ikinakarga ang mga sukatan ng ahente...",
+ "NO_AGENTS": "Walang mga pag-uusap mula sa mga ahente",
"TABLE_HEADER": {
- "AGENT": "Agent",
- "OPEN": "Open",
- "UNATTENDED": "Unattended",
- "STATUS": "Status"
+ "AGENT": "Ahente",
+ "OPEN": "Bukas",
+ "UNATTENDED": "Hindi napansin",
+ "STATUS": "Katayuan"
}
},
"TEAM_CONVERSATIONS": {
- "ALL_TEAMS": "All Teams",
- "HEADER": "Conversations by teams",
- "LOADING_MESSAGE": "Loading team metrics...",
- "NO_TEAMS": "There is no data available",
+ "ALL_TEAMS": "Lahat ng Koponan",
+ "HEADER": "Mga pag-uusap ayon sa koponan",
+ "LOADING_MESSAGE": "Naglo-load ng mga sukatan ng koponan...",
+ "NO_TEAMS": "Walang magagamit na datos",
"TABLE_HEADER": {
- "TEAM": "Team",
- "OPEN": "Open",
- "UNATTENDED": "Unattended",
- "STATUS": "Status"
+ "TEAM": "Koponan",
+ "OPEN": "Bukas",
+ "UNATTENDED": "Hindi napansin",
+ "STATUS": "Katayuan"
}
},
"AGENT_STATUS": {
- "HEADER": "Agent status",
- "ONLINE": "Online",
- "BUSY": "Busy",
- "OFFLINE": "Offline"
+ "HEADER": "Katayuan ng ahente",
+ "ONLINE": "Naka-online",
+ "BUSY": "Abala",
+ "OFFLINE": "Hindi konektado"
}
},
"DAYS_OF_WEEK": {
- "SUNDAY": "Sunday",
- "MONDAY": "Monday",
- "TUESDAY": "Tuesday",
- "WEDNESDAY": "Wednesday",
- "THURSDAY": "Thursday",
- "FRIDAY": "Friday",
- "SATURDAY": "Saturday"
+ "SUNDAY": "Linggo",
+ "MONDAY": "Lunes",
+ "TUESDAY": "Martes",
+ "WEDNESDAY": "Miyerkules",
+ "THURSDAY": "Huwebes",
+ "FRIDAY": "Biyernes",
+ "SATURDAY": "Sabado"
},
"SLA_REPORTS": {
- "HEADER": "SLA Reports",
- "NO_RECORDS": "SLA applied conversations are not available.",
- "LOADING": "Loading SLA data...",
- "DOWNLOAD_SLA_REPORTS": "Download SLA reports",
- "DOWNLOAD_FAILED": "Failed to download SLA Reports",
+ "HEADER": "Mga Ulat ng SLA",
+ "NO_RECORDS": "Walang magagamit na mga pag-uusap na may inilapat na SLA.",
+ "LOADING": "Naglo-load ng datos ng SLA...",
+ "DOWNLOAD_SLA_REPORTS": "I-download ang mga ulat ng SLA",
+ "DOWNLOAD_FAILED": "Nabigong i-download ang mga Ulat ng SLA",
"DROPDOWN": {
- "ADD_FIlTER": "Add filter",
- "CLEAR_ALL": "Clear all",
- "CLEAR_FILTER": "Clear filter",
- "EMPTY_LIST": "No results found",
- "NO_FILTER": "No filters available",
- "SEARCH": "Search filter",
+ "ADD_FIlTER": "Magdagdag ng filter",
+ "CLEAR_ALL": "Tanggalin lahat",
+ "CLEAR_FILTER": "Tanggalin ang filter",
+ "EMPTY_LIST": "Walang nahanap na resulta",
+ "NO_FILTER": "Walang available na filter",
+ "SEARCH": "Hanapin ang filter",
"INPUT_PLACEHOLDER": {
- "SLA": "SLA name",
- "AGENTS": "Agent name",
- "INBOXES": "Inbox name",
- "LABELS": "Label name",
- "TEAMS": "Team name"
+ "SLA": "Pangalan ng SLA",
+ "AGENTS": "Pangalan ng ahente",
+ "INBOXES": "Pangalan ng inbox",
+ "LABELS": "Pangalan ng label",
+ "TEAMS": "Pangalan ng koponan"
},
- "SLA": "SLA Policy",
+ "SLA": "Patakaran ng SLA",
"INBOXES": "Inbox",
- "AGENTS": "Agent",
+ "AGENTS": "Ahente",
"LABELS": "Label",
- "TEAMS": "Team"
+ "TEAMS": "Koponan"
},
- "WITH": "with",
+ "WITH": "kasama",
"METRICS": {
"HIT_RATE": {
- "LABEL": "Hit Rate",
- "TOOLTIP": "Percentage of SLAs created were completed successfully"
+ "LABEL": "Porsyento ng Tagumpay",
+ "TOOLTIP": "Porsyento ng mga SLA na nagawa nang matagumpay"
},
"NO_OF_MISSES": {
- "LABEL": "Number of Misses",
- "TOOLTIP": "Total SLA misses in a certain period"
+ "LABEL": "Bilang ng mga Palya",
+ "TOOLTIP": "Kabuuang bilang ng mga palya sa SLA sa isang takdang panahon"
},
"NO_OF_CONVERSATIONS": {
- "LABEL": "Number of Conversations",
- "TOOLTIP": "Total number of conversations with SLA"
+ "LABEL": "Bilang ng mga Pag-uusap",
+ "TOOLTIP": "Kabuuang bilang ng mga pag-uusap na may SLA"
}
},
"TABLE": {
"HEADER": {
- "POLICY": "Policy",
- "CONVERSATION": "Conversation",
- "AGENT": "Agent"
+ "POLICY": "Patakaran",
+ "CONVERSATION": "Pag-uusap",
+ "AGENT": "Ahente"
},
- "VIEW_DETAILS": "View Details"
+ "VIEW_DETAILS": "Tingnan ang Detalye"
}
},
"SUMMARY_REPORTS": {
"INBOX": "Inbox",
- "AGENT": "Agent",
- "TEAM": "Team",
+ "AGENT": "Ahente",
+ "TEAM": "Koponan",
"LABEL": "Label",
- "AVG_RESOLUTION_TIME": "Avg. Resolution Time",
- "AVG_FIRST_RESPONSE_TIME": "Avg. First Response Time",
- "AVG_REPLY_TIME": "Avg. Customer Waiting Time",
- "RESOLUTION_COUNT": "Resolution Count",
- "CONVERSATIONS": "No. of conversations"
+ "AVG_RESOLUTION_TIME": "Karaniwang Oras ng Paglutas",
+ "AVG_FIRST_RESPONSE_TIME": "Karaniwang Oras ng Unang Tugon",
+ "AVG_REPLY_TIME": "Karaniwang Oras ng Paghintay ng Customer",
+ "RESOLUTION_COUNT": "Bilang ng mga Nalutas",
+ "CONVERSATIONS": "Bilang ng mga pag-uusap"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/tr/automation.json b/app/javascript/dashboard/i18n/locale/tr/automation.json
index 198d3e234..cb3ffe3cf 100644
--- a/app/javascript/dashboard/i18n/locale/tr/automation.json
+++ b/app/javascript/dashboard/i18n/locale/tr/automation.json
@@ -4,13 +4,13 @@
"DESCRIPTION": "Otomasyon, etiket ekleme veya konuşmaları en uygun temsilciye atama gibi manuel çaba gerektiren mevcut süreçleri kolaylaştırabilir ve onların yerine geçebilir. Bu sayede ekip, rutin işlere harcanan zamanı azaltarak güçlü yönlerine odaklanabilir.",
"LEARN_MORE": "Learn more about automation",
"COUNT": "{n} automation | {n} automations",
- "HEADER_BTN_TXT": "Create Automation",
+ "HEADER_BTN_TXT": "Otomasyon Oluştur",
"LOADING": "Otomasyon kuralları getiriliyor",
- "SEARCH_PLACEHOLDER": "Search automation rules...",
- "NO_RESULTS": "No automation rules found matching your search",
+ "SEARCH_PLACEHOLDER": "Otomasyon kurallarını ara...",
+ "NO_RESULTS": "Aramanızla eşleşen otomasyon kuralı bulunamadı",
"ADD": {
"TITLE": "Otomasyon Kuralı Ekle",
- "SUBMIT": "Yarat",
+ "SUBMIT": "Oluştur",
"CANCEL_BUTTON_TEXT": "İptal Et",
"FORM": {
"NAME": {
@@ -84,7 +84,7 @@
},
"FORM": {
"EDIT": "Düzenle",
- "CREATE": "Yarat",
+ "CREATE": "Oluştur",
"DELETE": "Sil",
"CANCEL": "İptal Et",
"RESET_MESSAGE": "Olay seçimini değiştirmek tüm koşulları ve aşağıda eklenmiş etkinlikleri değiştirecektir"
diff --git a/app/javascript/dashboard/i18n/locale/tr/conversation.json b/app/javascript/dashboard/i18n/locale/tr/conversation.json
index 24932a493..7c0be21fc 100644
--- a/app/javascript/dashboard/i18n/locale/tr/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/tr/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Mesaj imzası yapılandırılmamış, lütfen profil ayarlarında yapılandırın.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "Copilot için ek komutlar verin veya başka bir şey sorun... Takip için gönder tuşuna basın",
"CLICK_HERE": "Güncellemek için tıklayın",
"WHATSAPP_TEMPLATES": "WhatsApp Şablonları"
},
@@ -214,7 +214,7 @@
"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",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot düşünüyor",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Bcc ekle",
diff --git a/app/javascript/dashboard/i18n/locale/tr/helpCenter.json b/app/javascript/dashboard/i18n/locale/tr/helpCenter.json
index 825becac4..f75b75326 100644
--- a/app/javascript/dashboard/i18n/locale/tr/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/tr/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Yerel dil başarıyla portaldan kaldırıldı",
"ERROR_MESSAGE": "Yerel dil portaldan kaldırılamadı. Lütfen tekrar deneyin."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} makale | {count} makale",
"CATEGORIES_COUNT": "{count} kategori | {count} kategori",
"DEFAULT": "Varsayılan",
+ "DRAFT": "Taslak",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Sil"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Dil seçin..."
},
+ "STATUS": {
+ "LABEL": "Durum",
+ "OPTIONS": {
+ "LIVE": "Yayınlandı",
+ "DRAFT": "Taslak"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Yerel dil başarıyla eklendi",
"ERROR_MESSAGE": "Yerel dil eklenemedi. Lütfen tekrar deneyin."
diff --git a/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json
index a907fe5bc..5b8470469 100644
--- a/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json
@@ -710,20 +710,20 @@
"MESSENGER_SUB_HEAD": "Bu düğmeyi gövde etiketinizin içine yerleştirin",
"ALLOWED_DOMAINS": {
"TITLE": "İzin Verilen Alan Adları",
- "DESCRIPTION": "Restrict which websites can embed your chat widget. For security, only add domains you own and trust. Add one or more domains separated by commas. Leave blank to allow all domains (not recommended for production).",
+ "DESCRIPTION": "Sohbet widget'ınızı hangi web sitelerinin yerleştirebileceğini kısıtlayın. Güvenlik amacıyla, yalnızca sahip olduğunuz ve güvendiğiniz alan adlarını ekleyin. Bir veya daha fazla alan adını virgülle ayırarak ekleyin. Tüm alan adlarına izin vermek için boş bırakın (canlı ortamlar için önerilmez).",
"PLACEHOLDER": "example.com, www.example.com, app.example.com"
},
"ALLOW_MOBILE_WEBVIEW": {
- "LABEL": "Enable widget in mobile apps",
- "SUBTITLE": "Check this if you embed the widget in iOS or Android apps. Mobile apps don't send domain information, so they would be blocked by domain restrictions unless this is enabled."
+ "LABEL": "Mobil uygulamalarda widget'ı etkinleştir",
+ "SUBTITLE": "Widget'ı iOS veya Android uygulamalarına yerleştiriyorsanız bu seçeneği işaretleyin. Mobil uygulamalar alan adı bilgisi göndermediğinden, bu seçenek etkinleştirilmezse alan adı kısıtlamalarına takılarak engellenirler."
},
"IDENTITY_VALIDATION": {
- "TITLE": "Identity Validation",
- "DESCRIPTION": "Verify user authenticity by generating secure tokens. This prevents unauthorized users from impersonating others in your chat.",
+ "TITLE": "Kimlik Doğrulama",
+ "DESCRIPTION": "Güvenli token'lar oluşturarak kullanıcıların gerçekliğini doğrulayın. Bu işlem, yetkisiz kişilerin sohbetinizde başkalarının kimliğine bürünmesini engeller.",
"SECRET_KEY": "Gizli Anahtar",
- "VIEW_DOCS": "View documentation",
- "REQUIRE_LABEL": "Require identity validation for all conversations",
- "REQUIRE_DESCRIPTION": "When enabled, users must provide a valid identity token to start conversations. Requests without valid tokens will be rejected."
+ "VIEW_DOCS": "Dokümantasyonu görüntüle",
+ "REQUIRE_LABEL": "Tüm sohbetler için kimlik doğrulamayı zorunlu kıl",
+ "REQUIRE_DESCRIPTION": "Etkinleştirildiğinde, kullanıcıların sohbet başlatabilmesi için geçerli bir kimlik token'ı sunması gerekir. Geçerli bir token içermeyen istekler reddedilecektir."
},
"INBOX_AGENTS": "Kullanıcılar",
"INBOX_AGENTS_SUB_TEXT": "Bu gelen kutusuna aracı ekleyin veya aracıları kaldırın",
diff --git a/app/javascript/dashboard/i18n/locale/tr/integrations.json b/app/javascript/dashboard/i18n/locale/tr/integrations.json
index 5e516b419..ec8dff5c5 100644
--- a/app/javascript/dashboard/i18n/locale/tr/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/tr/integrations.json
@@ -404,12 +404,12 @@
"KICK_OFF_MESSAGE": "Hızlı bir özet mi gerekiyor, geçmiş konuşmaları mı kontrol etmek istiyorsunuz, yoksa daha iyi bir yanıt mı tasarlamak istiyorsunuz? Copilot işleri hızlandırmak için burada.",
"SEND_MESSAGE": "Mesajı Gönder...",
"EMPTY_MESSAGE": "Yanıt oluşturulurken bir hata oluştu. Lütfen tekrar deneyin.",
- "LOADER": "Captain is thinking",
+ "LOADER": "Captain düşünüyor",
"YOU": "Sen",
- "USE": "Use this",
- "RESET": "Reset",
+ "USE": "Bunu kullan",
+ "RESET": "Sıfırla",
"SHOW_STEPS": "Adımları göster",
- "SELECT_ASSISTANT": "Select Assistant",
+ "SELECT_ASSISTANT": "Asistanı Seç",
"PROMPTS": {
"SUMMARIZE": {
"LABEL": "Bu sohbeti özetle",
@@ -435,7 +435,7 @@
},
"PLAYGROUND": {
"USER": "Sen",
- "ASSISTANT": "Assistant",
+ "ASSISTANT": "Asistan",
"MESSAGE_PLACEHOLDER": "Mesajınızı yazın...",
"HEADER": "Oyun Alanı",
"DESCRIPTION": "Bu oyun alanını asistanınıza mesaj göndermek ve yanıtlarının doğru, hızlı ve beklediğiniz tonda olup olmadığını kontrol etmek için kullanın.",
@@ -443,7 +443,7 @@
},
"PAYWALL": {
"TITLE": "Captain AI kullanmak için yükseltin",
- "AVAILABLE_ON": "Captain is not available on the free plan.",
+ "AVAILABLE_ON": "Captain ücretsiz planda kullanılamaz.",
"UPGRADE_PROMPT": "Asistanlarımıza, Copilot'a ve daha fazlasına erişim sağlamak için planınızı yükseltin.",
"UPGRADE_NOW": "Şimdi yükselt",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
@@ -528,7 +528,7 @@
"ALLOW_CONVERSATION_FAQS": "Çözümlenmiş konuşmalardan SSS oluştur",
"ALLOW_MEMORIES": "Müşteri etkileşimlerinden önemli detayları anı olarak yakala.",
"ALLOW_CITATIONS": "Yanıtlara kaynak alıntıları ekle",
- "ALLOW_CONTACT_ATTRIBUTES": "Allow access to contact information"
+ "ALLOW_CONTACT_ATTRIBUTES": "İletişim bilgilerine erişime izin ver"
}
},
"EDIT": {
@@ -570,7 +570,7 @@
"OPTIONS": {
"EDIT_ASSISTANT": "Edit Assistant",
"DELETE_ASSISTANT": "Asistanı Sil",
- "VIEW_CONNECTED_INBOXES": "View connected inboxes"
+ "VIEW_CONNECTED_INBOXES": "Bağlı gelen kutularını görüntüle"
},
"EMPTY_STATE": {
"TITLE": "No assistants available",
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Belgeler",
"ADD_NEW": "Yeni belge oluştur",
+ "SELECTED": "{count} selected",
+ "SELECT_ALL": "Tümünü seç ({count})",
+ "UNSELECT_ALL": "Tümünü kaldır ({count})",
+ "BULK_DELETE_BUTTON": "Sil",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Yes, delete all",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "İlgili SSS",
"DESCRIPTION": "Bu SSS'ler doğrudan belgeden oluşturulmuştur."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Araçlar",
"ADD_NEW": "Yeni bir araç oluşturun",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "Özel araçlar mevcut değil",
"SUBTITLE": "Asistanınızın harici API'lere ve hizmetlere bağlanmasını sağlamak için özel araçlar oluşturun; böylece asistanınız sizin adınıza veri çekebilir ve işlemler gerçekleştirebilir.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Özel araç başarıyla silindi",
"ERROR_MESSAGE": "Özel araç silinemedi"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Araç Adı",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Araç adı zorunludur"
+ "ERROR": "Araç adı zorunludur",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Açıklama",
@@ -988,7 +1007,7 @@
}
},
"INBOXES": {
- "HEADER": "Connected Inboxes",
+ "HEADER": "Bağlı Gelen Kutuları",
"ADD_NEW": "Connect a new inbox",
"OPTIONS": {
"DISCONNECT": "Bağlantıyı Kes"
@@ -997,13 +1016,13 @@
"TITLE": "Are you sure to disconnect the inbox?",
"DESCRIPTION": "",
"CONFIRM": "Evet, sil",
- "SUCCESS_MESSAGE": "The inbox was successfully disconnected.",
+ "SUCCESS_MESSAGE": "Gelen kutusu başarıyla bağlantısı kesildi.",
"ERROR_MESSAGE": "There was an error disconnecting the inbox, please try again."
},
"FORM_DESCRIPTION": "Choose an inbox to connect with the assistant.",
"CREATE": {
"TITLE": "Connect an Inbox",
- "SUCCESS_MESSAGE": "The inbox was successfully connected.",
+ "SUCCESS_MESSAGE": "Gelen kutusu başarıyla bağlandı.",
"ERROR_MESSAGE": "An error occurred while connecting the inbox. Please try again."
},
"FORM": {
@@ -1014,7 +1033,7 @@
}
},
"EMPTY_STATE": {
- "TITLE": "No Connected Inboxes",
+ "TITLE": "Bağlı Gelen Kutusu Yok",
"SUBTITLE": "Bir gelen kutusunu bağlamak, asistanın müşterilerinizden gelen ilk soruları size aktarmadan önce ele almasını sağlar."
}
}
diff --git a/app/javascript/dashboard/i18n/locale/tr/settings.json b/app/javascript/dashboard/i18n/locale/tr/settings.json
index 6c3751fb4..3b3ef5367 100644
--- a/app/javascript/dashboard/i18n/locale/tr/settings.json
+++ b/app/javascript/dashboard/i18n/locale/tr/settings.json
@@ -381,7 +381,7 @@
"DOCS": "Dokümantasyonu oku",
"SECURITY": "Güvenlik",
"CAPTAIN_AI": "Captain",
- "CONVERSATION_WORKFLOW": "Conversation Workflow"
+ "CONVERSATION_WORKFLOW": "Konuşma Akışı"
},
"CAPTAIN_SETTINGS": {
"TITLE": "Captain Settings",
@@ -566,7 +566,7 @@
},
"REQUIRED_ATTRIBUTES": {
"TITLE": "Attributes required on resolution",
- "DESCRIPTION": "When resolving a conversation, agents will be prompted to fill these attributes if they haven't yet.",
+ "DESCRIPTION": "Bir konuşma sonuçlandırılırken, temsilcilerden henüz doldurmamışlarsa bu alanları doldurmaları istenecektir.",
"NO_ATTRIBUTES": "No attributes added yet",
"ADD": {
"TITLE": "Add Attributes",
@@ -578,17 +578,17 @@
},
"MODAL": {
"TITLE": "Görüşmeyi Çöz",
- "DESCRIPTION": "Please fill in the following custom attributes before resolving this conversation",
+ "DESCRIPTION": "Bu konuşmayı kapatmadan önce lütfen aşağıdaki özel özellikleri doldurun",
"ACTIONS": {
"RESOLVE": "Görüşmeyi Çöz",
"CANCEL": "İptal Et"
},
"PLACEHOLDERS": {
- "TEXT": "Write a note...",
- "NUMBER": "Enter a number",
- "LINK": "Add a link",
- "DATE": "Pick a date",
- "LIST": "Select an option"
+ "TEXT": "Bir not yaz...",
+ "NUMBER": "Bir sayı girin",
+ "LINK": "Bağlantı ekle",
+ "DATE": "Bir tarih seçin",
+ "LIST": "Bir seçenek seçin"
},
"CHECKBOX": {
"YES": "Evet",
@@ -598,7 +598,7 @@
"PAYWALL": {
"TITLE": "Upgrade to use required attributes",
"AVAILABLE_ON": "The required conversation attributes feature is available on the Business and Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to prompt agents to fill required attributes before conversation resolution.",
+ "UPGRADE_PROMPT": "Planınızı yükseltin ve temsilcilerin görüşme sonuçlandırılmadan önce gerekli alanları doldurmasını sağlayın.",
"UPGRADE_NOW": "Şimdi yükselt",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
diff --git a/app/javascript/dashboard/i18n/locale/uk/conversation.json b/app/javascript/dashboard/i18n/locale/uk/conversation.json
index eba59f944..587ea716b 100644
--- a/app/javascript/dashboard/i18n/locale/uk/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/uk/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Не налаштовано підпис повідомлення, будь ласка, налаштуйте його в налаштуваннях профілю.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "Надайте Copilot додаткові підказки або запитайте що-небудь ще... Натисніть Enter для відправлення відповіді",
"CLICK_HERE": "Натисніть тут для оновлення",
"WHATSAPP_TEMPLATES": "Шаблони Whatsapp"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Перетягніть сюди, щоб прикріпити",
"START_AUDIO_RECORDING": "Почати аудіозапис",
"STOP_AUDIO_RECORDING": "Зупинити аудіозапис",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot думає",
"EMAIL_HEAD": {
"TO": "На",
"ADD_BCC": "Додати bcc",
diff --git a/app/javascript/dashboard/i18n/locale/uk/helpCenter.json b/app/javascript/dashboard/i18n/locale/uk/helpCenter.json
index d9ab1728c..21e0220f2 100644
--- a/app/javascript/dashboard/i18n/locale/uk/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/uk/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Локаль видалена з порталу",
"ERROR_MESSAGE": "Не вдалося видалити локаль з порталу. Спробуйте ще раз."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "За замовчуванням",
+ "DRAFT": "Чернетка",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Видалити"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Виберіть мову..."
},
+ "STATUS": {
+ "LABEL": "Статус",
+ "OPTIONS": {
+ "LIVE": "Опубліковано",
+ "DRAFT": "Чернетка"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Локаль успішно додано",
"ERROR_MESSAGE": "Не вдалося додати локаль. Спробуйте ще раз."
diff --git a/app/javascript/dashboard/i18n/locale/uk/integrations.json b/app/javascript/dashboard/i18n/locale/uk/integrations.json
index e08d6f19e..ba40168ed 100644
--- a/app/javascript/dashboard/i18n/locale/uk/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/uk/integrations.json
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Captain",
- "HEADER_KNOW_MORE": "Know more",
+ "HEADER_KNOW_MORE": "Дізнатися більше",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "ASSISTANTS": "Асистенти",
+ "SWITCH_ASSISTANT": "Перемикання між асистентами",
+ "NEW_ASSISTANT": "Створити асистента",
+ "EMPTY_LIST": "Асистентів не знайдено, будь ласка, створіть одного, щоб почати"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "PANEL_TITLE": "Почніть працювати з Copilot",
+ "KICK_OFF_MESSAGE": "Потрібен швидкий підсумок, хочете переглянути минулі розмови або скласти кращу відповідь? Copilot допоможе прискорити цей процес.",
"SEND_MESSAGE": "Надіслати...",
- "EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
- "LOADER": "Captain is thinking",
+ "EMPTY_MESSAGE": "Виникла помилка під час генерації відповіді. Будь ласка, спробуйте ще раз.",
+ "LOADER": "Captain думає",
"YOU": "Ви",
- "USE": "Use this",
- "RESET": "Reset",
- "SHOW_STEPS": "Show steps",
- "SELECT_ASSISTANT": "Select Assistant",
+ "USE": "Використати це",
+ "RESET": "Скинути",
+ "SHOW_STEPS": "Показати кроки",
+ "SELECT_ASSISTANT": "Вибрати асистента",
"PROMPTS": {
"SUMMARIZE": {
- "LABEL": "Summarize this conversation",
- "CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
+ "LABEL": "Підсумувати цю розмову",
+ "CONTENT": "Підсумуйте ключові моменти, обговорені між клієнтом і агентом підтримки, включно з занепокоєннями клієнта, питаннями та наданими агентом рішеннями чи відповідями"
},
"SUGGEST": {
- "LABEL": "Suggest an answer",
- "CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
+ "LABEL": "Запропонувати відповідь",
+ "CONTENT": "Проаналізуйте питання клієнта і складіть відповідь, що ефективно вирішує їхні проблеми чи запитання. Відповідь має бути чіткою, лаконічною і містити корисну інформацію."
},
"RATE": {
- "LABEL": "Rate this conversation",
- "CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
+ "LABEL": "Оцініть цю розмову",
+ "CONTENT": "Перегляньте розмову, щоб оцінити, наскільки добре вона відповідає потребам клієнта. Поставте оцінку від 1 до 5, базуючись на тоні, ясності та ефективності."
},
"HIGH_PRIORITY": {
- "LABEL": "High priority conversations",
- "CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
+ "LABEL": "Розмови з високим пріоритетом",
+ "CONTENT": "Дайте мені підсумок усіх відкритих розмов з високим пріоритетом. Включіть ID розмови, ім’я клієнта (якщо є), зміст останнього повідомлення та призначеного агента. Групуйте за статусом, якщо це доречно."
},
"LIST_CONTACTS": {
- "LABEL": "List contacts",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "LABEL": "Список контактів",
+ "CONTENT": "Покажіть список топ-10 контактів. Включіть ім’я, електронну пошту або номер телефону (якщо є), час останнього відвідування, теги (якщо є)."
}
}
},
"PLAYGROUND": {
"USER": "Ви",
- "ASSISTANT": "Assistant",
+ "ASSISTANT": "Асистент",
"MESSAGE_PLACEHOLDER": "Введіть Ваше повідомлення...",
- "HEADER": "Playground",
- "DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
- "CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
+ "HEADER": "Тестова зона",
+ "DESCRIPTION": "Використовуйте цю тестову зону, щоб надсилати повідомлення своєму асистентові і перевіряти, чи відповідає він точно, швидко і в очікуваному тоні.",
+ "CREDIT_NOTE": "Повідомлення, надіслані тут, зараховуються до ваших кредитів Captain."
},
"PAYWALL": {
- "TITLE": "Upgrade to use Captain AI",
- "AVAILABLE_ON": "Captain is not available on the free plan.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "TITLE": "Оновіть план для використання Captain AI",
+ "AVAILABLE_ON": "Captain недоступний на безкоштовному плані.",
+ "UPGRADE_PROMPT": "Оновіть план, щоб отримати доступ до наших асистентів, Copilot і не тільки.",
"UPGRADE_NOW": "Оновити зараз",
"CANCEL_ANYTIME": "Ви можете змінити або скасувати план у будь-який час"
},
"ENTERPRISE_PAYWALL": {
"AVAILABLE_ON": "Captain AI доступний тільки в планах Enterprise.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "UPGRADE_PROMPT": "Оновіть план, щоб отримати доступ до наших асистентів, Copilot і не тільки.",
"ASK_ADMIN": "Будь ласка, зверніться до адміністратора для оновлення."
},
"BANNER": {
- "RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
- "DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
+ "RESPONSES": "Ви використали понад 80% ліміту відповідей. Щоб продовжити використовувати Captain AI, будь ласка, оновіть план.",
+ "DOCUMENTS": "Досягнуто ліміту документів. Оновіть план, щоб продовжити використовувати Captain AI."
},
"FORM": {
"CANCEL": "Скасувати",
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
+ "SELECTED": "{count} selected",
+ "SELECT_ALL": "Select all ({count})",
+ "UNSELECT_ALL": "Unselect all ({count})",
+ "BULK_DELETE_BUTTON": "Видалити",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Yes, delete all",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Опис",
diff --git a/app/javascript/dashboard/i18n/locale/ur/conversation.json b/app/javascript/dashboard/i18n/locale/ur/conversation.json
index f64d50e02..63b63615b 100644
--- a/app/javascript/dashboard/i18n/locale/ur/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ur/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Message signature is not configured, please configure it in profile settings.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "کوپائلٹ کو اضافی پرامپٹس دیں، یا کچھ اور پوچھیں... فالو اپ بھیجنے کے لیے انٹر دبائیں",
"CLICK_HERE": "Click here to update",
"WHATSAPP_TEMPLATES": "Whatsapp Templates"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Drag and drop here to attach",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "کوپائلٹ سوچ رہا ہے",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Add bcc",
diff --git a/app/javascript/dashboard/i18n/locale/ur/helpCenter.json b/app/javascript/dashboard/i18n/locale/ur/helpCenter.json
index 40fd85e57..9820b7284 100644
--- a/app/javascript/dashboard/i18n/locale/ur/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/ur/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Locale removed from portal successfully",
"ERROR_MESSAGE": "Unable to remove locale from portal. Try again."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Default",
+ "DRAFT": "Draft",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "حذف کریں۔"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Select locale..."
},
+ "STATUS": {
+ "LABEL": "اسٹیٹس",
+ "OPTIONS": {
+ "LIVE": "Published",
+ "DRAFT": "Draft"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Locale added successfully",
"ERROR_MESSAGE": "Unable to add locale. Try again."
diff --git a/app/javascript/dashboard/i18n/locale/ur/integrations.json b/app/javascript/dashboard/i18n/locale/ur/integrations.json
index ca08dc3fb..985813f05 100644
--- a/app/javascript/dashboard/i18n/locale/ur/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ur/integrations.json
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Captain",
- "HEADER_KNOW_MORE": "Know more",
+ "HEADER_KNOW_MORE": "مزید جانیں",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "ASSISTANTS": "اسسٹنٹس",
+ "SWITCH_ASSISTANT": "اسسٹنٹس کے درمیان سوئچ کریں",
+ "NEW_ASSISTANT": "اسسٹنٹ بنائیں",
+ "EMPTY_LIST": "کوئی اسسٹنٹس نہیں ملے، براہ کرم شروع کرنے کے لیے ایک بنائیں"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "PANEL_TITLE": "Copilot کے ساتھ شروع کریں",
+ "KICK_OFF_MESSAGE": "کیا آپ کو جلدی خلاصہ چاہیے، پچھلی گفتگو دیکھنی ہے، یا بہتر جواب تیار کرنا ہے؟ Copilot یہاں ہے تاکہ چیزوں کو تیز کرے۔",
"SEND_MESSAGE": "پیغام بھیجیں...",
- "EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
- "LOADER": "Captain is thinking",
+ "EMPTY_MESSAGE": "جواب تیار کرنے میں مسئلہ ہوا۔ براہ کرم دوبارہ کوشش کریں۔",
+ "LOADER": "Captain غور کر رہا ہے",
"YOU": "You",
- "USE": "Use this",
- "RESET": "Reset",
- "SHOW_STEPS": "Show steps",
- "SELECT_ASSISTANT": "Select Assistant",
+ "USE": "اسے استعمال کریں",
+ "RESET": "ری سیٹ کریں",
+ "SHOW_STEPS": "قدم دکھائیں",
+ "SELECT_ASSISTANT": "اسسٹنٹ منتخب کریں",
"PROMPTS": {
"SUMMARIZE": {
- "LABEL": "Summarize this conversation",
- "CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
+ "LABEL": "اس گفتگو کا خلاصہ کریں",
+ "CONTENT": "کسٹمر اور سپورٹ ایجنٹ کے درمیان زیر بحث اہم نکات کا خلاصہ کریں، بشمول کسٹمر کے خدشات، سوالات، اور سپورٹ ایجنٹ کی جانب سے فراہم کردہ حل یا جوابات۔"
},
"SUGGEST": {
- "LABEL": "Suggest an answer",
- "CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
+ "LABEL": "جواب کی تجویز دیں",
+ "CONTENT": "کسٹمر کی پوچھ گچھ کا تجزیہ کریں، اور ایسی جواب مسودہ تیار کریں جو مؤثر طریقے سے ان کے خدشات یا سوالات کو حل کرے۔ جواب واضح، مختصر، اور مددگار معلومات فراہم کرے۔"
},
"RATE": {
- "LABEL": "Rate this conversation",
- "CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
+ "LABEL": "اس گفتگو کو درجہ دیں",
+ "CONTENT": "گفتگو کا جائزہ لیں تاکہ معلوم ہو سکے کہ یہ کسٹمر کی ضروریات کو کس حد تک پورا کرتی ہے۔ لہجہ، وضاحت، اور مؤثریت کی بنیاد پر 5 میں سے درجہ بندی شیئر کریں۔"
},
"HIGH_PRIORITY": {
- "LABEL": "High priority conversations",
- "CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
+ "LABEL": "اعلی ترجیحی بات چیت",
+ "CONTENT": "تمام اعلی ترجیحی کھلی بات چیت کا خلاصہ دیں۔ بات چیت کی شناخت، کسٹمر کا نام (اگر دستیاب ہو)، آخری پیغام کا مواد، اور تفویض کردہ ایجنٹ شامل کریں۔ اگر مناسب ہو تو صورت حال کے مطابق گروپ بنائیں۔"
},
"LIST_CONTACTS": {
- "LABEL": "List contacts",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "LABEL": "رابطے کی فہرست",
+ "CONTENT": "میرے لیے سب سے اوپر 10 رابطوں کی فہرست دکھائیں۔ نام، ای میل یا فون نمبر (اگر دستیاب ہو)، آخری بار دیکھا گیا وقت، ٹیگز (اگر کوئی ہوں) شامل کریں۔"
}
}
},
"PLAYGROUND": {
"USER": "You",
- "ASSISTANT": "Assistant",
+ "ASSISTANT": "اسسٹنٹ",
"MESSAGE_PLACEHOLDER": "Type your message...",
- "HEADER": "Playground",
- "DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
- "CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
+ "HEADER": "پلے گراؤنڈ",
+ "DESCRIPTION": "اس پلے گراؤنڈ کا استعمال اپنے اسسٹنٹ کو پیغامات بھیجنے کے لیے کریں اور چیک کریں کہ آیا وہ درست، تیز، اور آپ کی توقع کے مطابق لہجے میں جواب دیتا ہے۔",
+ "CREDIT_NOTE": "یہاں بھیجے گئے پیغامات آپ کے Captain کریڈٹس میں شمار ہوں گے۔"
},
"PAYWALL": {
- "TITLE": "Upgrade to use Captain AI",
- "AVAILABLE_ON": "Captain is not available on the free plan.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "TITLE": "Captain AI استعمال کرنے کے لیے اپ گریڈ کریں",
+ "AVAILABLE_ON": "Captain مفت پلان پر دستیاب نہیں ہے۔",
+ "UPGRADE_PROMPT": "ہمارے اسسٹنٹس، کوپائلٹ اور مزید تک رسائی کے لیے اپنے پلان کو اپ گریڈ کریں۔",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "AVAILABLE_ON": "Captain AI صرف انٹرپرائز پلانز میں دستیاب ہے۔",
+ "UPGRADE_PROMPT": "ہمارے اسسٹنٹس، کوپائلٹ اور مزید تک رسائی کے لیے اپنے پلان کو اپ گریڈ کریں۔",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"BANNER": {
- "RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
- "DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
+ "RESPONSES": "آپ نے اپنی جواب کی حد کا 80٪ سے زیادہ استعمال کر لیا ہے۔ Captain AI استعمال کرتے رہنے کے لیے براہ کرم اپ گریڈ کریں۔",
+ "DOCUMENTS": "دستاویزات کی حد پہنچ چکی ہے۔ Captain AI استعمال کرتے رہنے کے لیے اپ گریڈ کریں۔"
},
"FORM": {
"CANCEL": "منسوخ کریں۔",
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
+ "SELECTED": "{count} selected",
+ "SELECT_ALL": "Select all ({count})",
+ "UNSELECT_ALL": "Unselect all ({count})",
+ "BULK_DELETE_BUTTON": "حذف کریں۔",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Yes, delete all",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Description",
diff --git a/app/javascript/dashboard/i18n/locale/ur_IN/conversation.json b/app/javascript/dashboard/i18n/locale/ur_IN/conversation.json
index 7b7e325ab..4a200b79a 100644
--- a/app/javascript/dashboard/i18n/locale/ur_IN/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ur_IN/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Message signature is not configured, please configure it in profile settings.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "کوپائلٹ کو اضافی ہدایات دیں، یا کچھ اور پوچھیں... فالو اپ بھیجنے کے لیے انٹر دبائیں",
"CLICK_HERE": "Click here to update",
"WHATSAPP_TEMPLATES": "Whatsapp Templates"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Drag and drop here to attach",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "کوپائلٹ سوچ رہا ہے",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Add bcc",
diff --git a/app/javascript/dashboard/i18n/locale/ur_IN/helpCenter.json b/app/javascript/dashboard/i18n/locale/ur_IN/helpCenter.json
index 60ea62a0d..df37ab3e3 100644
--- a/app/javascript/dashboard/i18n/locale/ur_IN/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/ur_IN/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "زبان پورٹل سے کامیابی سے ہٹا دی گئی",
"ERROR_MESSAGE": "پورٹل سے لوکیل ہٹانے میں ناکامی۔ دوبارہ کوشش کریں۔."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} مضمون | {count} مضامین",
"CATEGORIES_COUNT": "{count} زمرہ | {count} زمرے",
"DEFAULT": "ڈیفالٹ",
+ "DRAFT": "مسودہ",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "ڈیفالٹ بنائیں",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "حذف کریں"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "زبان منتخب کریں..."
},
+ "STATUS": {
+ "LABEL": "Status",
+ "OPTIONS": {
+ "LIVE": "شائع شدہ",
+ "DRAFT": "مسودہ"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "مقامی زبان کامیابی سے شامل کی گئی",
"ERROR_MESSAGE": "لوکیل شامل کرنے میں ناکامی۔ دوبارہ کوشش کریں۔."
diff --git a/app/javascript/dashboard/i18n/locale/ur_IN/integrations.json b/app/javascript/dashboard/i18n/locale/ur_IN/integrations.json
index c5c48a439..4f124f413 100644
--- a/app/javascript/dashboard/i18n/locale/ur_IN/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ur_IN/integrations.json
@@ -392,10 +392,10 @@
"NAME": "کپٹن",
"HEADER_KNOW_MORE": "مزید جانیں",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "ASSISTANTS": "اسسٹنٹس",
+ "SWITCH_ASSISTANT": "اسسٹنٹس کے درمیان سوئچ کریں",
+ "NEW_ASSISTANT": "اسسٹنٹ بنائیں",
+ "EMPTY_LIST": "کوئی اسسٹنٹ نہیں ملا، شروع کرنے کے لیے براہ کرم ایک بنائیں"
},
"COPILOT": {
"TITLE": "کوپائلٹ",
@@ -449,7 +449,7 @@
"CANCEL_ANYTIME": "آپ کسی بھی وقت اپنا پلان تبدیل یا منسوخ کر سکتے ہیں"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
+ "AVAILABLE_ON": "Captain AI صرف انٹرپرائز پلانز میں دستیاب ہے۔",
"UPGRADE_PROMPT": "ہمارے اسسٹنٹس، کوپائلٹ اور مزید تک رسائی کے لیے اپنا پلان اپ گریڈ کریں۔",
"ASK_ADMIN": "براہ کرم اپ گریڈ کے لیے اپنے ایڈمنسٹریٹر سے رابطہ کریں۔"
},
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "دستاویزات",
"ADD_NEW": "نئی دستاویز بنائیں",
+ "SELECTED": "{count} منتخب شدہ",
+ "SELECT_ALL": "تمام منتخب کریں ({count})",
+ "UNSELECT_ALL": "تمام غیر منتخب کریں ({count})",
+ "BULK_DELETE_BUTTON": "Delete",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "ہاں، سب کو حذف کریں",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "متعلقہ FAQs",
"DESCRIPTION": "یہ FAQs براہ راست دستاویز سے تیار کیے گئے ہیں۔"
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Description",
diff --git a/app/javascript/dashboard/i18n/locale/vi/conversation.json b/app/javascript/dashboard/i18n/locale/vi/conversation.json
index fb375f6d2..19778bfc7 100644
--- a/app/javascript/dashboard/i18n/locale/vi/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/vi/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Chứ ký cuối tin nhắn chưa được cài đặt, xin hãy cài đặt một chữ ký trong phần cài đặt hồ sơ.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "Cho copilot thêm lời nhắc hoặc hỏi thêm bất cứ điều gì... Nhấn enter để gửi theo dõi",
"CLICK_HERE": "Bấm vào đây để cập nhật",
"WHATSAPP_TEMPLATES": "Mẫu Whatsapp"
},
@@ -214,7 +214,7 @@
"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",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot đang suy nghĩ",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Thêm bcc",
diff --git a/app/javascript/dashboard/i18n/locale/vi/helpCenter.json b/app/javascript/dashboard/i18n/locale/vi/helpCenter.json
index d11cd7f29..1a4505ecf 100644
--- a/app/javascript/dashboard/i18n/locale/vi/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/vi/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Ngôn ngữ đã được gỡ bỏ thành công khỏi cổng thông tin",
"ERROR_MESSAGE": "Không thể gỡ ngôn ngữ khỏi cổng thông tin. Vui lòng thử lại."
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Mặc định",
+ "DRAFT": "Nháp",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "Xoá"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Select locale..."
},
+ "STATUS": {
+ "LABEL": "Trạng thái",
+ "OPTIONS": {
+ "LIVE": "Đã phát hành",
+ "DRAFT": "Nháp"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "Ngôn ngữ được thêm thành công",
"ERROR_MESSAGE": "Không thể thêm ngôn ngữ. Vui lòng thử lại."
diff --git a/app/javascript/dashboard/i18n/locale/vi/integrations.json b/app/javascript/dashboard/i18n/locale/vi/integrations.json
index 6184a7732..8a594cf51 100644
--- a/app/javascript/dashboard/i18n/locale/vi/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/vi/integrations.json
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Captain",
- "HEADER_KNOW_MORE": "Know more",
+ "HEADER_KNOW_MORE": "Tìm hiểu thêm",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "ASSISTANTS": "Trợ lý",
+ "SWITCH_ASSISTANT": "Chuyển đổi giữa các trợ lý",
+ "NEW_ASSISTANT": "Tạo Trợ Lý",
+ "EMPTY_LIST": "Không tìm thấy trợ lý nào, vui lòng tạo một trợ lý để bắt đầu"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "PANEL_TITLE": "Bắt đầu với Copilot",
+ "KICK_OFF_MESSAGE": "Cần tóm tắt nhanh, muốn kiểm tra các cuộc trò chuyện trước, hay soạn câu trả lời tốt hơn? Copilot sẽ giúp tăng tốc.",
"SEND_MESSAGE": "Gửi tin nhắn...",
- "EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
- "LOADER": "Captain is thinking",
+ "EMPTY_MESSAGE": "Đã xảy ra lỗi khi tạo phản hồi. Vui lòng thử lại.",
+ "LOADER": "Captain đang suy nghĩ",
"YOU": "You",
- "USE": "Use this",
- "RESET": "Reset",
- "SHOW_STEPS": "Show steps",
- "SELECT_ASSISTANT": "Select Assistant",
+ "USE": "Sử dụng cái này",
+ "RESET": "Đặt lại",
+ "SHOW_STEPS": "Hiển thị các bước",
+ "SELECT_ASSISTANT": "Chọn Trợ Lý",
"PROMPTS": {
"SUMMARIZE": {
- "LABEL": "Summarize this conversation",
- "CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
+ "LABEL": "Tóm tắt cuộc trò chuyện này",
+ "CONTENT": "Tóm tắt các điểm chính đã thảo luận giữa khách hàng và nhân viên hỗ trợ, bao gồm các mối quan tâm, câu hỏi của khách hàng và các giải pháp hoặc phản hồi của nhân viên hỗ trợ"
},
"SUGGEST": {
- "LABEL": "Suggest an answer",
- "CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
+ "LABEL": "Gợi ý câu trả lời",
+ "CONTENT": "Phân tích yêu cầu của khách hàng và soạn phản hồi hiệu quả giải quyết thắc mắc hoặc câu hỏi. Đảm bảo trả lời rõ ràng, ngắn gọn và cung cấp thông tin hữu ích."
},
"RATE": {
- "LABEL": "Rate this conversation",
- "CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
+ "LABEL": "Đánh giá cuộc trò chuyện này",
+ "CONTENT": "Xem xét cuộc trò chuyện để đánh giá mức độ đáp ứng nhu cầu của khách hàng. Chia sẻ đánh giá từ 5 dựa trên tông giọng, độ rõ ràng và hiệu quả."
},
"HIGH_PRIORITY": {
- "LABEL": "High priority conversations",
- "CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
+ "LABEL": "Các cuộc trò chuyện ưu tiên cao",
+ "CONTENT": "Cho tôi bản tóm tắt tất cả các cuộc trò chuyện mở có độ ưu tiên cao. Bao gồm ID cuộc trò chuyện, tên khách hàng (nếu có), nội dung tin nhắn cuối cùng và nhân viên phụ trách. Nhóm theo trạng thái nếu có liên quan."
},
"LIST_CONTACTS": {
- "LABEL": "List contacts",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "LABEL": "Liệt kê liên hệ",
+ "CONTENT": "Hiển thị danh sách 10 liên hệ hàng đầu. Bao gồm tên, email hoặc số điện thoại (nếu có), thời gian truy cập cuối, thẻ (nếu có)."
}
}
},
"PLAYGROUND": {
"USER": "You",
- "ASSISTANT": "Assistant",
+ "ASSISTANT": "Trợ lý",
"MESSAGE_PLACEHOLDER": "Gõ tin nhắn của bạn...",
- "HEADER": "Playground",
- "DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
- "CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
+ "HEADER": "Sân chơi",
+ "DESCRIPTION": "Sử dụng sân chơi này để gửi tin nhắn tới trợ lý của bạn và kiểm tra xem nó phản hồi có chính xác, nhanh chóng và đúng giọng bạn mong đợi không.",
+ "CREDIT_NOTE": "Tin nhắn gửi ở đây sẽ tính vào tín dụng Captain của bạn."
},
"PAYWALL": {
- "TITLE": "Upgrade to use Captain AI",
- "AVAILABLE_ON": "Captain is not available on the free plan.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "TITLE": "Nâng cấp để sử dụng Captain AI",
+ "AVAILABLE_ON": "Captain không khả dụng trên gói miễn phí.",
+ "UPGRADE_PROMPT": "Nâng cấp gói của bạn để truy cập trợ lý, copilot và nhiều hơn nữa.",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "AVAILABLE_ON": "Captain AI chỉ có trong các gói Doanh nghiệp.",
+ "UPGRADE_PROMPT": "Nâng cấp gói của bạn để truy cập trợ lý, copilot và nhiều hơn nữa.",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"BANNER": {
- "RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
- "DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
+ "RESPONSES": "Bạn đã sử dụng hơn 80% giới hạn phản hồi. Để tiếp tục sử dụng Captain AI, vui lòng nâng cấp.",
+ "DOCUMENTS": "Giới hạn tài liệu đã đạt. Nâng cấp để tiếp tục sử dụng Captain AI."
},
"FORM": {
"CANCEL": "Huỷ",
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
+ "SELECTED": "{count} selected",
+ "SELECT_ALL": "Select all ({count})",
+ "UNSELECT_ALL": "Unselect all ({count})",
+ "BULK_DELETE_BUTTON": "Xoá",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Yes, delete all",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Mô tả",
diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/conversation.json b/app/javascript/dashboard/i18n/locale/zh_CN/conversation.json
index 9f4e80843..e18dfd0cd 100644
--- a/app/javascript/dashboard/i18n/locale/zh_CN/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/zh_CN/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "未设置消息签名,请在个人资料中进行设置。",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "为 Copilot 提供额外提示,或提问其他内容… 按 Enter 发送跟进",
"CLICK_HERE": "点击此处更新",
"WHATSAPP_TEMPLATES": "Whatsapp 模板列表"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "拖放到此处添加附件",
"START_AUDIO_RECORDING": "开始录音",
"STOP_AUDIO_RECORDING": "停止录音",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot 正在思考",
"EMAIL_HEAD": {
"TO": "发给",
"ADD_BCC": "添加密送",
diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/helpCenter.json b/app/javascript/dashboard/i18n/locale/zh_CN/helpCenter.json
index f0921232e..139146f18 100644
--- a/app/javascript/dashboard/i18n/locale/zh_CN/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/zh_CN/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "语言环境从门户中移除成功",
"ERROR_MESSAGE": "无法从门户中移除语言环境,请重试。"
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} 篇文章 | {count} 篇文章",
"CATEGORIES_COUNT": "{count} 个类别 | {count} 个类别",
"DEFAULT": "默认",
+ "DRAFT": "草稿",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "设为默认",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "删除"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "选择语言环境..."
},
+ "STATUS": {
+ "LABEL": "状态",
+ "OPTIONS": {
+ "LIVE": "已发布",
+ "DRAFT": "草稿"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "语言环境添加成功",
"ERROR_MESSAGE": "无法添加语言环境,请重试。"
diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/integrations.json b/app/javascript/dashboard/i18n/locale/zh_CN/integrations.json
index dbdd769b5..ccdf12826 100644
--- a/app/javascript/dashboard/i18n/locale/zh_CN/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/zh_CN/integrations.json
@@ -393,9 +393,9 @@
"HEADER_KNOW_MORE": "了解更多",
"ASSISTANT_SWITCHER": {
"ASSISTANTS": "助手",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "SWITCH_ASSISTANT": "在助手之间切换",
+ "NEW_ASSISTANT": "创建助手",
+ "EMPTY_LIST": "未找到助手,请创建一个以开始使用"
},
"COPILOT": {
"TITLE": "Copilot",
@@ -449,7 +449,7 @@
"CANCEL_ANYTIME": "您可以随时更改或取消您的计划"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
+ "AVAILABLE_ON": "Captain AI 仅适用于企业计划。",
"UPGRADE_PROMPT": "升级您的计划以获取我们的助手、副驾驶等功能。",
"ASK_ADMIN": "请联系您的管理员进行升级。"
},
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "文档",
"ADD_NEW": "创建新文档",
+ "SELECTED": "{count} 已选择",
+ "SELECT_ALL": "全选 ({count})",
+ "UNSELECT_ALL": "取消全选({count})",
+ "BULK_DELETE_BUTTON": "删除",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "是,全部删除",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "相关常见问题",
"DESCRIPTION": "这些常见问题直接从文档生成。"
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "工具",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "描述信息",
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json b/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json
index 6602350d4..b03244e9b 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Message signature is not configured, please configure it in profile settings.",
- "COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
+ "COPILOT_MSG_INPUT": "給 Copilot 更多提示,或問其他問題... 按 Enter 發送續接訊息",
"CLICK_HERE": "Click here to update",
"WHATSAPP_TEMPLATES": "Whatsapp Templates"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Drag and drop here to attach",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
- "COPILOT_THINKING": "Copilot is thinking",
+ "COPILOT_THINKING": "Copilot 正在思考",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "密件副本",
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/helpCenter.json b/app/javascript/dashboard/i18n/locale/zh_TW/helpCenter.json
index 40ed91076..9beb84c08 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/helpCenter.json
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "語言環境從門戶中移除成功",
"ERROR_MESSAGE": "無法從門戶中移除語言環境,請重試。"
}
+ },
+ "DRAFT_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale moved to draft successfully",
+ "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ }
+ },
+ "PUBLISH_LOCALE": {
+ "API": {
+ "SUCCESS_MESSAGE": "Locale published successfully",
+ "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ }
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} 篇文章 | {count} 篇文章",
"CATEGORIES_COUNT": "{count} 個類別 | {count} 個類別",
"DEFAULT": "預設",
+ "DRAFT": "草稿",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "設為預設",
+ "MOVE_TO_DRAFT": "Move to draft",
+ "PUBLISH_LOCALE": "Publish locale",
"DELETE": "刪除"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "選擇語言環境..."
},
+ "STATUS": {
+ "LABEL": "狀態",
+ "OPTIONS": {
+ "LIVE": "已釋出",
+ "DRAFT": "草稿"
+ }
+ },
"API": {
"SUCCESS_MESSAGE": "語言環境新增成功",
"ERROR_MESSAGE": "無法新增語言環境,請重試。"
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json b/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json
index b51026d28..d7095b8f4 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Captain",
- "HEADER_KNOW_MORE": "Know more",
+ "HEADER_KNOW_MORE": "了解更多",
"ASSISTANT_SWITCHER": {
- "ASSISTANTS": "Assistants",
- "SWITCH_ASSISTANT": "Switch between assistants",
- "NEW_ASSISTANT": "Create Assistant",
- "EMPTY_LIST": "No assistants found, please create one to get started"
+ "ASSISTANTS": "助理",
+ "SWITCH_ASSISTANT": "切換助理",
+ "NEW_ASSISTANT": "建立助理",
+ "EMPTY_LIST": "找不到助理,請先建立一個以開始使用"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
- "PANEL_TITLE": "Get started with Copilot",
- "KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
+ "PANEL_TITLE": "開始使用 Copilot",
+ "KICK_OFF_MESSAGE": "需要快速摘要、查看過往對話,或草擬更好的回覆?Copilot 幫你加快速度。",
"SEND_MESSAGE": "傳送訊息...",
- "EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
- "LOADER": "Captain is thinking",
+ "EMPTY_MESSAGE": "產生回應時發生錯誤。請再試一次。",
+ "LOADER": "Captain 思考中",
"YOU": "You",
- "USE": "Use this",
- "RESET": "Reset",
- "SHOW_STEPS": "Show steps",
- "SELECT_ASSISTANT": "Select Assistant",
+ "USE": "使用這個",
+ "RESET": "重設",
+ "SHOW_STEPS": "顯示步驟",
+ "SELECT_ASSISTANT": "選擇助理",
"PROMPTS": {
"SUMMARIZE": {
- "LABEL": "Summarize this conversation",
- "CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
+ "LABEL": "摘要此對話",
+ "CONTENT": "摘要客戶與客服人員間討論的重點,包括客戶的疑慮、問題,以及客服提供的解決方案或回覆。"
},
"SUGGEST": {
- "LABEL": "Suggest an answer",
- "CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
+ "LABEL": "建議回覆",
+ "CONTENT": "分析客戶的詢問,擬定有效回應以解決其疑慮或問題。確保回覆清楚、簡潔並提供有用資訊。"
},
"RATE": {
- "LABEL": "Rate this conversation",
- "CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
+ "LABEL": "評分此對話",
+ "CONTENT": "檢視此對話,評估其滿足客戶需求的程度。針對語調、清晰度與效果,給出五分制評分。"
},
"HIGH_PRIORITY": {
- "LABEL": "High priority conversations",
- "CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
+ "LABEL": "高優先度對話",
+ "CONTENT": "請給我所有高優先度未結案對話的摘要。包含對話 ID、客戶姓名(若有)、最後訊息內容及指定的代理人。若有相關狀態,請依狀態分組。"
},
"LIST_CONTACTS": {
- "LABEL": "List contacts",
- "CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
+ "LABEL": "列出聯絡人",
+ "CONTENT": "請顯示十大聯絡人清單。包含姓名、電子郵件或電話號碼(若有)、最後出現時間、標籤(若有)。"
}
}
},
"PLAYGROUND": {
"USER": "You",
- "ASSISTANT": "Assistant",
+ "ASSISTANT": "助理",
"MESSAGE_PLACEHOLDER": "輸入你的訊息...",
- "HEADER": "Playground",
- "DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
- "CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
+ "HEADER": "測試區",
+ "DESCRIPTION": "使用此測試區發送訊息給您的助理,檢查其回應是否準確、快速且符合預期語調。",
+ "CREDIT_NOTE": "此處發送的訊息將計入您的 Captain 點數。"
},
"PAYWALL": {
- "TITLE": "Upgrade to use Captain AI",
- "AVAILABLE_ON": "Captain is not available on the free plan.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "TITLE": "升級以使用 Captain AI",
+ "AVAILABLE_ON": "Captain 不適用於免費方案。",
+ "UPGRADE_PROMPT": "升級方案以使用助理、Copilot 及更多功能。",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
+ "AVAILABLE_ON": "Captain AI 僅於企業方案中提供。",
+ "UPGRADE_PROMPT": "升級方案以使用助理、Copilot 及更多功能。",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"BANNER": {
- "RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
- "DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
+ "RESPONSES": "您已使用超過回應限制的 80%。請升級以繼續使用 Captain AI。",
+ "DOCUMENTS": "文件數量已達上限。請升級以繼續使用 Captain AI。"
},
"FORM": {
"CANCEL": "取消",
@@ -738,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
+ "SELECTED": "{count} selected",
+ "SELECT_ALL": "Select all ({count})",
+ "UNSELECT_ALL": "Unselect all ({count})",
+ "BULK_DELETE_BUTTON": "刪除",
+ "BULK_DELETE": {
+ "TITLE": "Delete documents?",
+ "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
+ "CONFIRM": "Yes, delete all",
+ "SUCCESS_MESSAGE": "Documents deleted successfully",
+ "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ },
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -795,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
+ "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -825,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "TEST": {
+ "BUTTON": "Test connection",
+ "SUCCESS": "Endpoint returned HTTP {status}",
+ "ERROR": "Connection failed",
+ "DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
+ },
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required"
+ "ERROR": "Tool name is required",
+ "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "描述資訊",
diff --git a/app/javascript/widget/i18n/locale/it.json b/app/javascript/widget/i18n/locale/it.json
index d4592d856..d5ec381d2 100644
--- a/app/javascript/widget/i18n/locale/it.json
+++ b/app/javascript/widget/i18n/locale/it.json
@@ -23,9 +23,9 @@
"BACK_AS_SOON_AS_POSSIBLE": "Torneremo il prima possibile"
},
"REPLY_TIME": {
- "IN_A_FEW_MINUTES": "In genere risponde in pochi minuti",
- "IN_A_FEW_HOURS": "In genere risponde in poche ore",
- "IN_A_DAY": "In genere risponde in un giorno",
+ "IN_A_FEW_MINUTES": "Di solito risponde in pochi minuti",
+ "IN_A_FEW_HOURS": "Di solito risponde in poche ore",
+ "IN_A_DAY": "Di solito risponde entro un giorno",
"BACK_IN_HOURS": "Torneremo online in {n} ora | Torneremo online in {n} ore",
"BACK_IN_MINUTES": "Torneremo online in {time} minuti",
"BACK_AT_TIME": "Torneremo online alle {time}",
diff --git a/config/locales/am.yml b/config/locales/am.yml
index 30b1ddfc1..3d1f0e4b4 100644
--- a/config/locales/am.yml
+++ b/config/locales/am.yml
@@ -343,14 +343,14 @@ am:
copilot_message_required: Message is required
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Captain AI ለማቋቋም እቅድዎን ያዘምኑ'
+ disabled: 'Captain AI ለዚህ መለያ ተሰናክሏል።'
+ api_key_missing: 'Captain AI API ቁልፍ አልተከፈተም።'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: '%{function_name} መሣሪያ እየተጠቀምነው ነው'
+ completed_tool_call: 'የ%{function_name} መሣሪያ ጥሪ ተጠናቋል'
+ invalid_tool_call: 'የተሳሳተ መሣሪያ ጥሪ'
+ tool_not_available: 'መሣሪያ አይገኝም'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ am:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Search for article by title or body...
@@ -409,6 +410,10 @@ am:
title: Page not found
description: We couldn't find the page you were looking for.
back_to_home: Go to home page
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Name
diff --git a/config/locales/ar.yml b/config/locales/ar.yml
index 69b861380..8eb577610 100644
--- a/config/locales/ar.yml
+++ b/config/locales/ar.yml
@@ -343,14 +343,14 @@ ar:
copilot_message_required: الرسالة مطلوبة
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'قم بترقية خطتك لتمكين Captain AI'
+ disabled: 'تم تعطيل Captain AI لهذا الحساب.'
+ api_key_missing: 'مفتاح API الخاص بـ Captain AI غير مضبوط.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'جارٍ استخدام الأداة %{function_name}'
+ completed_tool_call: 'استدعاء أداة %{function_name} مكتمل'
+ invalid_tool_call: 'استدعاء أداة غير صالح'
+ tool_not_available: 'الأداة غير متوفرة'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ ar:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: البحث عن مقالة حسب العنوان أو الجسم...
@@ -409,6 +410,10 @@ ar:
title: لم يتم العثور على الصفحة
description: لم نتمكن من العثور على الصفحة التي تبحث عنها.
back_to_home: الذهاب إلى الصفحة الرئيسية
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: الاسم
diff --git a/config/locales/az.yml b/config/locales/az.yml
index a18c882c4..ab86b145a 100644
--- a/config/locales/az.yml
+++ b/config/locales/az.yml
@@ -343,14 +343,14 @@ az:
copilot_message_required: Message is required
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Captain AI-ni aktiv etmək üçün planınızı təkmilləşdirin'
+ disabled: 'Bu hesab üçün Captain AI deaktivdir.'
+ api_key_missing: 'Captain AI API açarı konfiqurasiya olunmayıb.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: '%{function_name} alətindən istifadə olunur'
+ completed_tool_call: '%{function_name} alət çağırışı tamamlandı'
+ invalid_tool_call: 'Yanlış alət çağırışı'
+ tool_not_available: 'Alət mövcud deyil'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ az:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Search for article by title or body...
@@ -409,6 +410,10 @@ az:
title: Page not found
description: We couldn't find the page you were looking for.
back_to_home: Go to home page
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Name
diff --git a/config/locales/bg.yml b/config/locales/bg.yml
index ae1735454..08b32753c 100644
--- a/config/locales/bg.yml
+++ b/config/locales/bg.yml
@@ -343,14 +343,14 @@ bg:
copilot_message_required: Message is required
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Надградете плана си, за да активирате Captain AI'
+ disabled: 'Captain AI е деактивиран за този акаунт.'
+ api_key_missing: 'API ключът на Captain AI не е конфигуриран.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'Използване на инструмента %{function_name}'
+ completed_tool_call: 'Завършен повик на инструмента %{function_name}'
+ invalid_tool_call: 'Невалидно повикване на инструмент'
+ tool_not_available: 'Инструментът не е наличен'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ bg:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Search for article by title or body...
@@ -409,6 +410,10 @@ bg:
title: Page not found
description: We couldn't find the page you were looking for.
back_to_home: Go to home page
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Име
diff --git a/config/locales/bn.yml b/config/locales/bn.yml
index 5f2e3fecd..5b7fe90d9 100644
--- a/config/locales/bn.yml
+++ b/config/locales/bn.yml
@@ -373,6 +373,7 @@ bn:
page_processing_error: 'পৃষ্ঠা প্রক্রিয়াকরণের সময় ত্রুটি %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: '৫ বার চেষ্টা করার পরেও অনন্য স্লাগ তৈরি করা যায়নি'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: শিরোনাম বা বর্ণনা দিয়ে আর্টিকেল খুঁজুন...
@@ -409,6 +410,10 @@ bn:
title: পৃষ্ঠা খুঁজে পাওয়া যায়নি
description: আপনি যে পৃষ্ঠাটি খুঁজছিলেন, তা খুঁজে পাওয়া যায়নি।.
back_to_home: হোম পৃষ্ঠায় যান
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: নাম
diff --git a/config/locales/ca.yml b/config/locales/ca.yml
index 67f67ad80..9d5d5befa 100644
--- a/config/locales/ca.yml
+++ b/config/locales/ca.yml
@@ -343,14 +343,14 @@ ca:
copilot_message_required: El missatge és obligatori
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Actualitza el teu pla per habilitar Captain AI'
+ disabled: 'Captain AI està desactivat per aquest compte.'
+ api_key_missing: 'La clau API de Captain AI no està configurada.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'Utilitzant eina %{function_name}'
+ completed_tool_call: 'S''ha completat la crida a l''eina %{function_name}'
+ invalid_tool_call: 'Crida d''eina no vàlida'
+ tool_not_available: 'Eina no disponible'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ ca:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Cerca l'article per títol o cos...
@@ -409,6 +410,10 @@ ca:
title: Pàgina no trobada
description: No hem pogut trobar la pàgina que estaves buscant.
back_to_home: Ves a la pàgina d'inici
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Nom
diff --git a/config/locales/cs.yml b/config/locales/cs.yml
index 1ec141d81..64d341e03 100644
--- a/config/locales/cs.yml
+++ b/config/locales/cs.yml
@@ -343,14 +343,14 @@ cs:
copilot_message_required: Message is required
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Upgradujte svůj plán pro povolení Captain AI'
+ disabled: 'Captain AI je pro tento účet deaktivován.'
+ api_key_missing: 'API klíč Captain AI není nakonfigurován.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'Používá se nástroj %{function_name}'
+ completed_tool_call: 'Dokončeno volání nástroje %{function_name}'
+ invalid_tool_call: 'Neplatné volání nástroje'
+ tool_not_available: 'Nástroj není dostupný'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ cs:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Search for article by title or body...
@@ -409,6 +410,10 @@ cs:
title: Page not found
description: We couldn't find the page you were looking for.
back_to_home: Go to home page
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Název
diff --git a/config/locales/da.yml b/config/locales/da.yml
index 6a7bfa2b1..fc5b400cd 100644
--- a/config/locales/da.yml
+++ b/config/locales/da.yml
@@ -343,14 +343,14 @@ da:
copilot_message_required: Beskeden er påkrævet
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Opgrader din plan for at aktivere Captain AI'
+ disabled: 'Captain AI er deaktiveret for denne konto.'
+ api_key_missing: 'Captain AI API-nøgle er ikke konfigureret.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'Bruger værktøj %{function_name}'
+ completed_tool_call: 'Fuldført %{function_name} værktøjskald'
+ invalid_tool_call: 'Ugyldigt værktøjskald'
+ tool_not_available: 'Værktøj ikke tilgængeligt'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ da:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Search for article by title or body...
@@ -409,6 +410,10 @@ da:
title: Page not found
description: We couldn't find the page you were looking for.
back_to_home: Go to home page
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Navn
diff --git a/config/locales/de.yml b/config/locales/de.yml
index 0964741f4..df55ffaa6 100644
--- a/config/locales/de.yml
+++ b/config/locales/de.yml
@@ -343,14 +343,14 @@ de:
copilot_message_required: Nachricht ist erforderlich
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Upgrade Ihres Tarifs, um Captain AI zu aktivieren'
+ disabled: 'Captain AI ist für dieses Konto deaktiviert.'
+ api_key_missing: 'Captain AI API-Schlüssel ist nicht konfiguriert.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'Verwende Werkzeug %{function_name}'
+ completed_tool_call: 'Werkzeugaufruf %{function_name} abgeschlossen'
+ invalid_tool_call: 'Ungültiger Werkzeugaufruf'
+ tool_not_available: 'Werkzeug nicht verfügbar'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ de:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Artikel nach Titel oder Text suchen...
@@ -409,6 +410,10 @@ de:
title: Seite nicht gefunden
description: Wir konnten die von Ihnen gesuchte Seite nicht finden.
back_to_home: Zur Startseite wechseln
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Name
diff --git a/config/locales/el.yml b/config/locales/el.yml
index 65978baf1..e3770b117 100644
--- a/config/locales/el.yml
+++ b/config/locales/el.yml
@@ -343,14 +343,14 @@ el:
copilot_message_required: Το μήνυμα είναι απαραίτητο
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Αναβαθμίστε το πακέτο σας για να ενεργοποιήσετε το Captain AI'
+ disabled: 'Το Captain AI είναι απενεργοποιημένο για αυτόν τον λογαριασμό.'
+ api_key_missing: 'Το API key του Captain AI δεν έχει ρυθμιστεί.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'Χρήση εργαλείου %{function_name}'
+ completed_tool_call: 'Ολοκληρώθηκε κλήση εργαλείου %{function_name}'
+ invalid_tool_call: 'Μη έγκυρη κλήση εργαλείου'
+ tool_not_available: 'Το εργαλείο δεν είναι διαθέσιμο'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ el:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Αναζήτηση άρθρου με τίτλο ή περιεχόμενο...
@@ -409,6 +410,10 @@ el:
title: Page not found
description: We couldn't find the page you were looking for.
back_to_home: Go to home page
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Όνομα
diff --git a/config/locales/es.yml b/config/locales/es.yml
index 6f9b51521..789853d1d 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -343,14 +343,14 @@ es:
copilot_message_required: El mensaje es obligatorio
copilot_error: 'Conecte un asistente a esta bandeja de entrada para utilizar Copilot'
copilot_limit: 'Te quedaste sin créditos de Copilot. Puedes comprar más créditos desde la sección de facturación.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Actualiza tu plan para habilitar Captain AI'
+ disabled: 'Captain AI está deshabilitado para esta cuenta.'
+ api_key_missing: 'La clave API de Captain AI no está configurada.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'Usando la herramienta %{function_name}'
+ completed_tool_call: 'Se completó la llamada a la herramienta %{function_name}'
+ invalid_tool_call: 'Llamada de herramienta no válida'
+ tool_not_available: 'Herramienta no disponible'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ es:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Buscar artículo por título o cuerpo...
@@ -409,6 +410,10 @@ es:
title: Página no encontrada
description: No pudimos encontrar la página que estaba buscando.
back_to_home: Ir a la página de inicio
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Nombre
diff --git a/config/locales/et.yml b/config/locales/et.yml
index f2e3664ed..634ef0cc9 100644
--- a/config/locales/et.yml
+++ b/config/locales/et.yml
@@ -343,14 +343,14 @@ et:
copilot_message_required: Message is required
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Luba Captain AI kasutamiseks uuenda oma plaani'
+ disabled: 'Captain AI on selle konto jaoks keelatud.'
+ api_key_missing: 'Captain AI API võti pole seadistatud.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'Kasutatakse tööriista %{function_name}'
+ completed_tool_call: 'Lõpetatud tööriista %{function_name} kutsumine'
+ invalid_tool_call: 'Kehtetu tööriista kutsumine'
+ tool_not_available: 'Tööriist pole saadaval'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ et:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Otsi artiklit pealkirja või sisuteksti järgi...
@@ -409,6 +410,10 @@ et:
title: Page not found
description: We couldn't find the page you were looking for.
back_to_home: Go to home page
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Name
diff --git a/config/locales/fa.yml b/config/locales/fa.yml
index d5ea19972..5d3874460 100644
--- a/config/locales/fa.yml
+++ b/config/locales/fa.yml
@@ -343,14 +343,14 @@ fa:
copilot_message_required: پیام الزامی است
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'پلن خود را ارتقا دهید تا Captain AI فعال شود'
+ disabled: 'Captain AI برای این حساب غیر فعال شده است.'
+ api_key_missing: 'کلید API Captain AI پیکربندی نشده است.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'در حال استفاده از ابزار %{function_name}'
+ completed_tool_call: 'تماس با ابزار %{function_name} تکمیل شد'
+ invalid_tool_call: 'تماس با ابزار نامعتبر'
+ tool_not_available: 'ابزار در دسترس نیست'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ fa:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: جستجوی مقاله براساس عنوان یا متن...
@@ -409,6 +410,10 @@ fa:
title: صفحه یافت نشد
description: ما نتوانستیم صفحه مورد نظر شما را پیدا کنیم.
back_to_home: به صفحه اصلی بروید
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: نام
diff --git a/config/locales/fi.yml b/config/locales/fi.yml
index 7df132a2d..4a74ecdbe 100644
--- a/config/locales/fi.yml
+++ b/config/locales/fi.yml
@@ -343,14 +343,14 @@ fi:
copilot_message_required: Message is required
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Päivitä tilauksesi ottaaksesi Captain AI:n käyttöön'
+ disabled: 'Captain AI on poistettu käytöstä tälle tilille.'
+ api_key_missing: 'Captain AI:n API-avain ei ole määritetty.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'Käytetään työkalua %{function_name}'
+ completed_tool_call: 'Suoritettu %{function_name} työkalukutsu'
+ invalid_tool_call: 'Virheellinen työkalukutsu'
+ tool_not_available: 'Työkalu ei ole käytettävissä'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ fi:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Search for article by title or body...
@@ -409,6 +410,10 @@ fi:
title: Page not found
description: We couldn't find the page you were looking for.
back_to_home: Go to home page
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Nimi
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index a901b17b7..503ae817a 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -343,14 +343,14 @@ fr:
copilot_message_required: Le message est obligatoire
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Passez à la version supérieure pour activer Captain AI'
+ disabled: 'Captain AI est désactivé pour ce compte.'
+ api_key_missing: 'La clé API de Captain AI n’est pas configurée.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'Utilisation de l’outil %{function_name}'
+ completed_tool_call: 'Appel d’outil %{function_name} terminé'
+ invalid_tool_call: 'Appel d’outil invalide'
+ tool_not_available: 'Outil non disponible'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ fr:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Rechercher un article par titre ou contenu...
@@ -409,6 +410,10 @@ fr:
title: Page introuvable
description: Nous n'avons pas pu trouver la page que vous cherchiez.
back_to_home: Aller à la page d'accueil
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Nom
diff --git a/config/locales/he.yml b/config/locales/he.yml
index 01cdcf7fa..4d4df6d6f 100644
--- a/config/locales/he.yml
+++ b/config/locales/he.yml
@@ -343,9 +343,9 @@ he:
copilot_message_required: הודעה נדרשת
copilot_error: 'אנא חבר עוזר לתיבת דואר נכנס זו כדי להשתמש ב-Copilot'
copilot_limit: 'נגמרו לך זיכויי Copilot. אתה יכול לקנות זיכויים נוספים מסעיף החיובים.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'שדרג את התכנית שלך כדי להפעיל את Captain AI'
+ disabled: 'Captain AI מושבת עבור חשבון זה.'
+ api_key_missing: 'מפתח ה-API של Captain AI לא מוגדר.'
copilot:
using_tool: 'משתמש בכלי %{function_name}'
completed_tool_call: 'הושלם קריאת כלי %{function_name}'
@@ -373,6 +373,7 @@ he:
page_processing_error: 'שגיאה בעיבוד עמודים %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'לא ניתן ליצור slug ייחודי לאחר 5 ניסיונות'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: חפש מאמר לפי כותרת או תוכן...
@@ -409,6 +410,10 @@ he:
title: דף לא נמצא
description: לא הצלחנו למצוא את הדף שחיפשת.
back_to_home: חזור לדף הבית
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: שם
diff --git a/config/locales/hi.yml b/config/locales/hi.yml
index 333aae650..a00189938 100644
--- a/config/locales/hi.yml
+++ b/config/locales/hi.yml
@@ -343,14 +343,14 @@ hi:
copilot_message_required: Message is required
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Captain AI सक्षम करने के लिए अपनी योजना को अपग्रेड करें'
+ disabled: 'इस खाते के लिए Captain AI अक्षम है।'
+ api_key_missing: 'Captain AI API कुंजी कॉन्फ़िगर नहीं है।'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'टूल %{function_name} का उपयोग कर रहा है'
+ completed_tool_call: '%{function_name} टूल कॉल पूरा हुआ'
+ invalid_tool_call: 'अमान्य टूल कॉल'
+ tool_not_available: 'टूल उपलब्ध नहीं है'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ hi:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Search for article by title or body...
@@ -409,6 +410,10 @@ hi:
title: Page not found
description: We couldn't find the page you were looking for.
back_to_home: Go to home page
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Name
diff --git a/config/locales/hr.yml b/config/locales/hr.yml
index 523c707c1..418790547 100644
--- a/config/locales/hr.yml
+++ b/config/locales/hr.yml
@@ -343,14 +343,14 @@ hr:
copilot_message_required: Message is required
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Nadogradite svoj plan da biste omogućili Captain AI'
+ disabled: 'Captain AI je onemogućen za ovaj račun.'
+ api_key_missing: 'Captain AI API ključ nije konfiguriran.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'Koristi alat %{function_name}'
+ completed_tool_call: 'Završeni poziv alata %{function_name}'
+ invalid_tool_call: 'Nevažeći poziv alata'
+ tool_not_available: 'Alat nije dostupan'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ hr:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Search for article by title or body...
@@ -409,6 +410,10 @@ hr:
title: Page not found
description: We couldn't find the page you were looking for.
back_to_home: Go to home page
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Ime
diff --git a/config/locales/hu.yml b/config/locales/hu.yml
index c553068e8..2bbec32f1 100644
--- a/config/locales/hu.yml
+++ b/config/locales/hu.yml
@@ -343,14 +343,14 @@ hu:
copilot_message_required: Üzenet kötelező
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Frissítse csomagját a Captain AI használatának engedélyezéséhez'
+ disabled: 'A Captain AI le van tiltva ezen a fiókon.'
+ api_key_missing: 'A Captain AI API kulcs nincs konfigurálva.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: '%{function_name} eszköz használata'
+ completed_tool_call: 'Befejezett %{function_name} eszközhívás'
+ invalid_tool_call: 'Érvénytelen eszközhívás'
+ tool_not_available: 'Eszköz nem elérhető'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ hu:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Keress a bejegyzések címében és tartalmában...
@@ -409,6 +410,10 @@ hu:
title: Az oldal nem található
description: Nem találtuk meg a keresett oldalt.
back_to_home: Menj a kezdőlapra
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Név
diff --git a/config/locales/hy.yml b/config/locales/hy.yml
index de7ecd48e..993b520c5 100644
--- a/config/locales/hy.yml
+++ b/config/locales/hy.yml
@@ -17,7 +17,7 @@
#To learn more, please read the Rails Internationalization guide
#available at https://guides.rubyonrails.org/i18n.html.
hy:
- hello: 'Hello world'
+ hello: 'Բարեւ աշխարհ'
inbox:
reauthorization:
success: 'Channel reauthorized successfully'
@@ -32,22 +32,22 @@ hy:
reset_password_saml_user: This account uses SAML authentication. Password reset is not available. Please contact your administrator.
login_saml_user: This account uses SAML authentication. Please sign in through your organization's SAML provider.
saml_not_available: SAML authentication is not available in this installation.
- inbox_deletetion_response: Your inbox deletion request will be processed in some time.
+ inbox_deletetion_response: Ձեր մուտքի ջնջման հարցումը կմշակվի որոշ ժամանակ անց։
errors:
account:
reporting_timezone:
invalid: is not a valid timezone
validations:
- presence: must not be blank
+ presence: չպետք է դատարկ լինի
webhook:
- invalid: Invalid events
+ invalid: Անվավեր իրադարձություններ
signup:
- disposable_email: We do not allow disposable emails
+ disposable_email: Ժամանակավոր էլ. հասցեները թույլ չեն տրվում
blocked_domain: This domain is not allowed. If you believe this is a mistake, please contact support.
- invalid_email: You have entered an invalid email
+ invalid_email: Մուտքագրված էլ. հասցեն սխալ է
email_already_exists: 'You have already signed up for an account with %{email}'
- invalid_params: 'Invalid, please check the signup paramters and try again'
- failed: Signup failed
+ invalid_params: 'Սխալ տվյալներ, խնդրում ենք ստուգել գրանցման պարամետրերը և կրկին փորձել'
+ failed: Գրանցումը ձախողվեց
assignment_policy:
not_found: Assignment policy not found
attachments:
@@ -57,16 +57,16 @@ hy:
sso_not_enabled: SAML SSO is not enabled for this installation
data_import:
data_type:
- invalid: Invalid data type
+ invalid: Անվավեր տվյալների տեսակ
contacts:
import:
- failed: File is blank
+ failed: Ֆայլը դատարկ է
export:
- success: We will notify you once contacts export file is ready to view.
+ success: Կտեղեկացնենք, երբ կոնտակտների արտահանման ֆայլը պատրաստ լինի դիտման։
email:
- invalid: Invalid email
+ invalid: Էլ. հասցեն անվավեր է
phone_number:
- invalid: should be in e164 format
+ invalid: պետք է լինի e164 ձևաչափով
companies:
domain:
invalid: must be a valid domain name
@@ -77,11 +77,11 @@ hy:
time_range_limit_exceeded: 'Search is limited to the last %{days} days'
categories:
locale:
- unique: should be unique in the category and portal
+ unique: պետք է լինի եզակի կատեգորիայում և պորտալում
dyte:
- invalid_message_type: 'Invalid message type. Action not permitted'
+ invalid_message_type: 'Հաղորդագրության անվավեր տեսակ։ Գործողությունը թույլատրված չէ'
slack:
- invalid_channel_id: 'Invalid slack channel. Please try again'
+ invalid_channel_id: 'Սխալ Slack ալիք։ Խնդրում ենք փորձել կրկին'
whatsapp:
token_exchange_failed: 'Failed to exchange code for access token. Please try again.'
invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.'
@@ -92,18 +92,18 @@ hy:
not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.'
inboxes:
imap:
- socket_error: Please check the network connection, IMAP address and try again.
- no_response_error: Please check the IMAP credentials and try again.
- host_unreachable_error: Host unreachable, Please check the IMAP address, IMAP port and try again.
+ socket_error: Խնդրում ենք ստուգել ցանցի կապը, IMAP հասցեն և կրկին փորձել։
+ no_response_error: Խնդրում ենք ստուգել IMAP մուտքագրերը և կրկին փորձել։
+ host_unreachable_error: Հոսթը անհասանելի է։ Ստուգեք IMAP հասցեն, IMAP պորտը և կրկին փորձեք։
connection_timed_out_error: Connection timed out for %{address}:%{port}
- connection_closed_error: Connection closed.
+ connection_closed_error: Կապը փակվեց։
smtp:
authentication_error: SMTP authentication failed. Please verify your login credentials.
connection_error: Could not connect to SMTP server. Please check the server address and port.
ssl_error: SSL/TLS error. Please verify your encryption settings.
smtp_error: SMTP server error. Please check your configuration and try again.
validations:
- name: should not start or end with symbols, and it should not have < > / \ @ characters.
+ name: չպետք է սկսվի կամ ավարտվի նշաններով և չպետք է պարունակի < > / \ @ նշաններ։
custom_filters:
number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 1000.
invalid_attribute: Invalid attribute key - [%{key}]. The key should be one of [%{allowed_keys}] or a custom attribute defined in the account.
@@ -138,32 +138,32 @@ hy:
invalid_certificate: must be a valid X.509 certificate in PEM format
reports:
period: Reporting period %{since} to %{until}
- utc_warning: The report generated is in UTC timezone
+ utc_warning: Հաշվետվությունը ստեղծվել է UTC ժամանակային գոտում
agent_csv:
- agent_name: Agent name
- conversations_count: Assigned conversations
- avg_first_response_time: Avg first response time
- avg_resolution_time: Avg resolution time
+ agent_name: Գործակալի անունը
+ conversations_count: Նշանակված զրույցներ
+ avg_first_response_time: Միջին առաջին արձագանքի ժամանակը
+ avg_resolution_time: Միջին լուծման ժամանակը
resolution_count: Resolution Count
avg_customer_waiting_time: Avg customer waiting time
inbox_csv:
- inbox_name: Inbox name
- inbox_type: Inbox type
- conversations_count: No. of conversations
- avg_first_response_time: Avg first response time
- avg_resolution_time: Avg resolution time
+ inbox_name: Մուտքի անուն
+ inbox_type: Մուտքի տեսակ
+ conversations_count: Զրույցների քանակ
+ avg_first_response_time: Միջին առաջին արձագանքի ժամանակը
+ avg_resolution_time: Միջին լուծման ժամանակը
label_csv:
- label_title: Label
- conversations_count: No. of conversations
- avg_first_response_time: Avg first response time
- avg_resolution_time: Avg resolution time
+ label_title: Պիտակ
+ conversations_count: Զրույցների քանակը
+ avg_first_response_time: Միջին առաջին արձագանքի ժամանակը
+ avg_resolution_time: Միջին լուծման ժամանակը
avg_reply_time: Avg reply time
resolution_count: Resolution Count
team_csv:
- team_name: Team name
- conversations_count: Conversations count
- avg_first_response_time: Avg first response time
- avg_resolution_time: Avg resolution time
+ team_name: Թիմի անունը
+ conversations_count: Զրույցների քանակը
+ avg_first_response_time: Միջին առաջին արձագանքի ժամանակը
+ avg_resolution_time: Միջին լուծման ժամանակը
resolution_count: Resolution Count
avg_customer_waiting_time: Avg customer waiting time
conversation_csv:
@@ -175,7 +175,7 @@ hy:
resolution_count: Resolution count
avg_customer_waiting_time: Avg customer waiting time
conversation_traffic_csv:
- timezone: Timezone
+ timezone: Ժամային գոտի
sla_csv:
conversation_id: Conversation ID
sla_policy_breached: SLA Policy
@@ -185,17 +185,17 @@ hy:
labels: Labels
conversation_link: Link to the Conversation
breached_events: Breached Events
- default_group_by: day
+ default_group_by: օր
csat:
headers:
- contact_name: Contact Name
- contact_email_address: Contact Email Address
- contact_phone_number: Contact Phone Number
- link_to_the_conversation: Link to the conversation
- agent_name: Agent Name
- rating: Rating
- feedback: Feedback Comment
- recorded_at: Recorded date
+ contact_name: Կոնտակտի անունը
+ contact_email_address: Կապի էլ. հասցե
+ contact_phone_number: Կապի հեռախոսահամար
+ link_to_the_conversation: Զրույցի հղում
+ agent_name: Օպերատորի անուն
+ rating: Գնահատական
+ feedback: Կարծիք
+ recorded_at: Գրանցման ամսաթիվ
review_notes: Review Notes
notifications:
notification_title:
@@ -213,10 +213,10 @@ hy:
handoff: 'Transferring to another agent for further assistance.'
messages:
instagram_story_content: '%{story_sender} mentioned you in the story: '
- instagram_deleted_story_content: This story is no longer available.
+ instagram_deleted_story_content: Այս պատմությունը այլևս հասանելի չէ։
instagram_shared_story_content: 'Shared story'
instagram_shared_post_content: 'Shared post'
- deleted: This message was deleted
+ deleted: Այս հաղորդագրությունը ջնջվել է
whatsapp:
list_button_label: 'Choose an item'
delivery_status:
@@ -240,7 +240,7 @@ hy:
auto_resolved_days: 'Conversation was marked resolved by system due to %{count} days of inactivity'
auto_resolved_hours: 'Conversation was marked resolved by system due to %{count} hours of inactivity'
auto_resolved_minutes: 'Conversation was marked resolved by system due to %{count} minutes of inactivity'
- system_auto_open: System reopened the conversation due to a new incoming message.
+ system_auto_open: Համակարգը նոր մուտքային հաղորդագրության պատճառով կրկին բացեց զրույցը։
priority:
added: '%{user_name} set the priority to %{new_priority}'
updated: '%{user_name} changed the priority from %{old_priority} to %{new_priority}'
@@ -272,9 +272,9 @@ hy:
auto_resolution_message: 'Resolving the conversation as it has been inactive for a while. Please start a new conversation if you need further assistance.'
templates:
greeting_message_body: '%{account_name} typically replies in a few hours.'
- ways_to_reach_you_message_body: 'Give the team a way to reach you.'
- email_input_box_message_body: 'Get notified by email'
- csat_input_message_body: 'Please rate the conversation'
+ ways_to_reach_you_message_body: 'Տվեք թիմին կապվելու հնարավորություն։'
+ email_input_box_message_body: 'Ստացեք ծանուցումներ էլ. փոստով'
+ csat_input_message_body: 'Խնդրում ենք գնահատել զրույցը'
reply:
email:
header:
@@ -287,8 +287,8 @@ hy:
header:
reply_with_name: '%{assignee_name} from %{inbox_name} <%{from_email}>'
reply_with_inbox_name: '%{inbox_name} <%{from_email}>'
- email_subject: 'New messages on this conversation'
- transcript_subject: 'Conversation Transcript'
+ email_subject: 'Նոր հաղորդագրություններ այս զրույցում'
+ transcript_subject: 'Զրույցի արձանագրություն'
survey:
response: 'Please rate this conversation, %{link}'
contacts:
@@ -309,7 +309,7 @@ hy:
short_description: 'Receive notifications and respond to conversations directly in Slack.'
description: "Integrate Chatwoot with Slack to keep your team in sync. This integration allows you to receive notifications for new conversations and respond to them directly within Slack's interface."
webhooks:
- name: 'Webhooks'
+ name: 'Վեբհուկեր'
description: 'Webhook events provide real-time updates about activities in your Chatwoot account. You can subscribe to your preferred events, and Chatwoot will send you HTTP callbacks with the updates.'
dialogflow:
name: 'Dialogflow'
@@ -343,14 +343,14 @@ hy:
copilot_message_required: Message is required
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Տեղափոխեք ձեր փաթեթը՝ առավելացնելու Captain AI գործառույթը'
+ disabled: 'Captain AI-ն անջատված է այս հաշվի համար։'
+ api_key_missing: 'Captain AI API բանալին կարգավորված չէ։'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'Օգտագործվում է %{function_name} գործիքը'
+ completed_tool_call: 'Ավարտեց %{function_name} գործիքի կանչը'
+ invalid_tool_call: 'Ոչ վավեր գործիքի կանչ'
+ tool_not_available: 'Գործիքը հասանելի չէ'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,51 +373,56 @@ hy:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
- search_placeholder: Search for article by title or body...
- empty_placeholder: No results found.
- loading_placeholder: Searching...
- results_title: Search results
- toc_header: 'On this page'
+ search_placeholder: Որոնեք հոդվածի վերնագրով կամ բովանդակությամբ...
+ empty_placeholder: Արդյունքներ չեն գտնվել։
+ loading_placeholder: Որոնում...
+ results_title: Որոնման արդյունքներ
+ toc_header: 'Այս էջում'
hero:
- sub_title: Search for the articles here or browse the categories below.
+ sub_title: Որոնեք հոդվածներ այստեղ կամ դիտեք ստորև ներկայացված կատեգորիաները։
common:
- home: Home
+ home: Գլխավոր
last_updated_on: Last updated on %{last_updated_on}
- view_all_articles: View all
- article: article
- articles: articles
- author: author
- authors: authors
- other: other
- others: others
- by: By
- no_articles: There are no articles here
+ view_all_articles: Դիտել բոլորը
+ article: հոդված
+ articles: հոդվածներ
+ author: հեղինակ
+ authors: հեղինակներ
+ other: այլ
+ others: այլք
+ by: Ըստ
+ no_articles: Այստեղ հոդվածներ չկան
footer:
- made_with: Made with
+ made_with: Ստեղծված է
header:
- go_to_homepage: Website
+ go_to_homepage: Կայք
visit_website: Visit website
appearance:
- system: System
- light: Light
- dark: Dark
- featured_articles: Featured Articles
- uncategorized: Uncategorized
+ system: Համակարգ
+ light: Լուսավոր
+ dark: Մութ
+ featured_articles: Առաջարկվող հոդվածներ
+ uncategorized: Առանց կատեգորիայի
404:
- title: Page not found
- description: We couldn't find the page you were looking for.
- back_to_home: Go to home page
+ title: Էջը չի գտնվել
+ description: Չհաջողվեց գտնել ձեր փնտրած էջը։
+ back_to_home: Վերադառնալ գլխավոր էջ
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
- name: Name
- email: Email
- phone_number: Phone
- company_name: Company
- inbox_name: Inbox
- inbox_type: Inbox Type
- button: Open conversation
+ name: Անուն
+ email: Էլ. հասցե
+ phone_number: Հեռախոս
+ company_name: Կազմակերպություն
+ inbox_name: Մուտքային
+ inbox_type: Մուտքայինի տեսակ
+ button: Բացել զրույցը
time_units:
days:
one: '%{count} day'
diff --git a/config/locales/id.yml b/config/locales/id.yml
index d6a0c7e85..07bfb930a 100644
--- a/config/locales/id.yml
+++ b/config/locales/id.yml
@@ -343,14 +343,14 @@ id:
copilot_message_required: Pesan wajib diisi
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Tingkatkan paket Anda untuk mengaktifkan Captain AI'
+ disabled: 'Captain AI dinonaktifkan untuk akun ini.'
+ api_key_missing: 'Kunci API Captain AI belum dikonfigurasi.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'Menggunakan alat %{function_name}'
+ completed_tool_call: 'Panggilan alat %{function_name} selesai'
+ invalid_tool_call: 'Panggilan alat tidak valid'
+ tool_not_available: 'Alat tidak tersedia'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ id:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Telusuri artikel menurut judul atau isi...
@@ -409,6 +410,10 @@ id:
title: Page not found
description: We couldn't find the page you were looking for.
back_to_home: Go to home page
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Nama
diff --git a/config/locales/is.yml b/config/locales/is.yml
index fa04a9a99..758f0723f 100644
--- a/config/locales/is.yml
+++ b/config/locales/is.yml
@@ -343,14 +343,14 @@ is:
copilot_message_required: Message is required
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Uppfærðu áætlun þína til að virkja Captain AI'
+ disabled: 'Captain AI er óvirkur fyrir þennan reikning.'
+ api_key_missing: 'Captain AI API lykill er ekki stilltur.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'Notkun á tól %{function_name}'
+ completed_tool_call: 'Lokið við %{function_name} verkfæri'
+ invalid_tool_call: 'Ógild verkfærakall'
+ tool_not_available: 'Tæki ekki í boði'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ is:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Search for article by title or body...
@@ -409,6 +410,10 @@ is:
title: Page not found
description: We couldn't find the page you were looking for.
back_to_home: Go to home page
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Nafn
diff --git a/config/locales/it.yml b/config/locales/it.yml
index abf601c29..d75f10c2c 100644
--- a/config/locales/it.yml
+++ b/config/locales/it.yml
@@ -271,7 +271,7 @@ it:
unmuted: '%{user_name} ha riattivato l''audio della conversazione'
auto_resolution_message: 'La conversazione sta per essere risolta per inattività. Avvia una nuova conversazione se hai bisogno di ulteriore assistenza.'
templates:
- greeting_message_body: '%{account_name}, in genere, risponde in poche ore.'
+ greeting_message_body: 'Solitamente %{account_name} risponde in poche ore.'
ways_to_reach_you_message_body: 'Dai al team un modo per contattarti.'
email_input_box_message_body: 'Ricevi notifiche via email'
csat_input_message_body: 'Valuta la conversazione'
@@ -373,6 +373,7 @@ it:
page_processing_error: 'Errore nell''elaborazione delle pagine %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Impossibile generare slug univoco dopo 5 tentativi'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Cerca articolo tramite titolo o testo...
@@ -409,6 +410,10 @@ it:
title: Pagina non trovata
description: Non siamo riusciti a trovare la pagina che stavi cercando.
back_to_home: Vai alla pagina iniziale
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Nome
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index 1a390199f..99745a509 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -343,14 +343,14 @@ ja:
copilot_message_required: メッセージは必須です
copilot_error: 'この受信トレイにアシスタントを接続してCopilotを使用してください'
copilot_limit: 'Copilot残高がありません。課金セクションからクレジットを追加購入することができます。'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Captain AIを有効にするにはプランをアップグレードしてください。'
+ disabled: 'このアカウントではCaptain AIが無効化されています。'
+ api_key_missing: 'Captain AI APIキーが設定されていません。'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'ツール%{function_name}を使用中'
+ completed_tool_call: '%{function_name}ツール呼び出しが完了しました。'
+ invalid_tool_call: '無効なツール呼び出しです。'
+ tool_not_available: 'ツールが利用できません。'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ ja:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: タイトルまたは本文で記事を検索...
@@ -409,6 +410,10 @@ ja:
title: ページが見つかりません
description: お探しのページが見つかりませんでした。
back_to_home: ホームページに戻る
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: 名前
diff --git a/config/locales/ka.yml b/config/locales/ka.yml
index 4ce3358cf..35ee5551d 100644
--- a/config/locales/ka.yml
+++ b/config/locales/ka.yml
@@ -343,14 +343,14 @@ ka:
copilot_message_required: Message is required
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'განაახლეთ თქვენი გეგმა, რომ აქტიურდეს Captain AI'
+ disabled: 'Captain AI გათიშულია ამ ანგარიშისთვის.'
+ api_key_missing: 'Captain AI API გასაღები კონფიგურირებული ვერ არის.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'გამოიყენება ინსტრუმენტი %{function_name}'
+ completed_tool_call: 'დასრულებულია %{function_name} ინსტრუმენტის გამოძახება'
+ invalid_tool_call: 'არასწორი ინსტრუმენტის გამოძახება'
+ tool_not_available: 'ინსტრუმენტი მიუწვდომელია'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ ka:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Search for article by title or body...
@@ -409,6 +410,10 @@ ka:
title: Page not found
description: We couldn't find the page you were looking for.
back_to_home: Go to home page
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Name
diff --git a/config/locales/ko.yml b/config/locales/ko.yml
index 73fff9dd1..9359651b8 100644
--- a/config/locales/ko.yml
+++ b/config/locales/ko.yml
@@ -373,6 +373,7 @@ ko:
page_processing_error: '페이지 %{start}-%{end} 처리 오류: %{error}'
custom_tool:
slug_generation_failed: '5회 시도 후에도 고유 슬러그를 생성할 수 없습니다'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: 게시물을 제목이나 내용으로 검색하세요...
@@ -409,6 +410,10 @@ ko:
title: 페이지를 찾을 수 없습니다
description: 찾고자 하는 페이지를 찾을 수 없었습니다.
back_to_home: 홈 화면으로 이동
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: 이름
diff --git a/config/locales/lt.yml b/config/locales/lt.yml
index 0ac3bd06a..18dc11024 100644
--- a/config/locales/lt.yml
+++ b/config/locales/lt.yml
@@ -343,14 +343,14 @@ lt:
copilot_message_required: Yra reikalingas pranešimas
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Atnaujinkite savo planą, kad įgalintumėte Captain AI'
+ disabled: 'Captain AI šiai paskyrai išjungtas.'
+ api_key_missing: 'Captain AI API raktas nėra sukonfigūruotas.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'Naudojamas %{function_name} įrankis'
+ completed_tool_call: 'Įvykdytas %{function_name} įrankio kvietimas'
+ invalid_tool_call: 'Neteisingas įrankio kvietimas'
+ tool_not_available: 'Įrankis nepasiekiamas'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ lt:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Ieškokite straipsnio pagal pavadinimą arba turinį...
@@ -409,6 +410,10 @@ lt:
title: Puslapis nerastas
description: We couldn't find the page you were looking for.
back_to_home: Eikite į pradinį puslapį
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Vardas
diff --git a/config/locales/lv.yml b/config/locales/lv.yml
index d9967630f..c23c81086 100644
--- a/config/locales/lv.yml
+++ b/config/locales/lv.yml
@@ -343,14 +343,14 @@ lv:
copilot_message_required: Nepieciešams ziņojums
copilot_error: 'Lai izmantotu Copilot, lūdzu, pievienojiet šai iesūtnei palīgu'
copilot_limit: 'Jums ir beigušies Copilot kredīti. Vairāk kredītu varat iegādāties norēķinu sadaļā.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Jauniniet savu plānu, lai iespējotu Captain AI'
+ disabled: 'Captain AI šim kontam ir atspējots.'
+ api_key_missing: 'Captain AI API atslēga nav konfigurēta.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'Tiek izmantots rīks %{function_name}'
+ completed_tool_call: 'Pabeigta %{function_name} rīka izsaukšana'
+ invalid_tool_call: 'Nederīgs rīka izsaukums'
+ tool_not_available: 'Rīks nav pieejams'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ lv:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Meklēt rakstu pēc nosaukuma vai pamatteksta...
@@ -409,6 +410,10 @@ lv:
title: Lapa nav atrasta
description: Mēs nevarējām atrast lapu, kuru meklējāt.
back_to_home: Doties uz sākumlapu
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Nosaukums
diff --git a/config/locales/ml.yml b/config/locales/ml.yml
index 421c657aa..63b770b2c 100644
--- a/config/locales/ml.yml
+++ b/config/locales/ml.yml
@@ -343,14 +343,14 @@ ml:
copilot_message_required: സന്ദേശം ആവശ്യമാണ്
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Captain AI സജീവമാക്കാൻ നിങ്ങളുടെ പ്ലാൻ അപ്ഗ്രേഡ് ചെയ്യുക'
+ disabled: 'ഈ അക്കൗണ്ടിനായി Captain AI പ്രവർത്തനരഹിതമാണ്.'
+ api_key_missing: 'Captain AI API കീ ക്രമീകരിച്ചിട്ടില്ല.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: '%{function_name} ഉപകരണം ഉപയോഗിക്കുന്നു'
+ completed_tool_call: '%{function_name} ഉപകരണ കോൾ പൂർത്തിയായി'
+ invalid_tool_call: 'അസാധുവായ ഉപകരണ കോൾ'
+ tool_not_available: 'ഉപകരണം ലഭ്യമല്ല'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ ml:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Search for article by title or body...
@@ -409,6 +410,10 @@ ml:
title: Page not found
description: We couldn't find the page you were looking for.
back_to_home: Go to home page
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: പേര്
diff --git a/config/locales/ms.yml b/config/locales/ms.yml
index 97837fed9..ad64f4f53 100644
--- a/config/locales/ms.yml
+++ b/config/locales/ms.yml
@@ -343,14 +343,14 @@ ms:
copilot_message_required: Message is required
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Tingkatkan pelan anda untuk mengaktifkan Captain AI'
+ disabled: 'Captain AI dilumpuhkan untuk akaun ini.'
+ api_key_missing: 'Kunci API Captain AI tidak dikonfigurasi.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'Menggunakan alat %{function_name}'
+ completed_tool_call: 'Panggilan alat %{function_name} selesai'
+ invalid_tool_call: 'Panggilan alat tidak sah'
+ tool_not_available: 'Alat tidak tersedia'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ ms:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Search for article by title or body...
@@ -409,6 +410,10 @@ ms:
title: Page not found
description: We couldn't find the page you were looking for.
back_to_home: Go to home page
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Nama
diff --git a/config/locales/ne.yml b/config/locales/ne.yml
index f44c46dbe..7fcb084c2 100644
--- a/config/locales/ne.yml
+++ b/config/locales/ne.yml
@@ -193,7 +193,7 @@ ne:
contact_phone_number: Contact Phone Number
link_to_the_conversation: Link to the conversation
agent_name: एजेन्टको नाम
- rating: Rating
+ rating: मूल्याङ्कन
feedback: प्रतिक्रिया टिप्पणी
recorded_at: रेकर्ड गरिएको मिति
review_notes: समीक्षा नोटहरू
@@ -343,7 +343,7 @@ ne:
copilot_message_required: सन्देश आवश्यक छ
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'तपाईंका Copilot क्रेडिट सकिएका छन्। तपाईं बिलिङ सेक्सनबाट थप क्रेडिट किन्न सक्नुहुन्छ।.'
- upgrade: 'Upgrade your plan to enable Captain AI'
+ upgrade: 'Captain AI सक्षम गर्न आफ्नो योजना सुधार्नुहोस्'
disabled: 'यस खातामा Captain AI अक्षम गरिएको छ।.'
api_key_missing: 'Captain AI API कुञ्जी सेटअप गरिएको छैन।.'
copilot:
@@ -373,6 +373,7 @@ ne:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: '5 प्रयासपछि अनन्य स्लग सिर्जना गर्न सकिएन।'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: शीर्षक वा मुख्य भागबाट लेख खोज्नुहोस्...
@@ -409,6 +410,10 @@ ne:
title: पृष्ठ फेला परेन
description: हामीले तपाईं खोजिरहनुभएको पृष्ठ फेला पार्न सकेनौं।.
back_to_home: Go to home page
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: नाम
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index 9b37e7530..e090b3e2b 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -343,14 +343,14 @@ nl:
copilot_message_required: Bericht is vereist
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Upgrade je abonnement om Captain AI in te schakelen'
+ disabled: 'Captain AI is uitgeschakeld voor dit account.'
+ api_key_missing: 'Captain AI API-sleutel is niet geconfigureerd.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'Bezig met gebruik van tool %{function_name}'
+ completed_tool_call: 'Voltooide %{function_name} tool-aanroep'
+ invalid_tool_call: 'Ongeldige tool-aanroep'
+ tool_not_available: 'Tool niet beschikbaar'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ nl:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Search for article by title or body...
@@ -409,6 +410,10 @@ nl:
title: Page not found
description: We couldn't find the page you were looking for.
back_to_home: Go to home page
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Naam
diff --git a/config/locales/no.yml b/config/locales/no.yml
index 8dfb24e67..f68991515 100644
--- a/config/locales/no.yml
+++ b/config/locales/no.yml
@@ -343,14 +343,14 @@
copilot_message_required: Message is required
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Oppgrader planen din for å aktivere Captain AI'
+ disabled: 'Captain AI er deaktivert for denne kontoen.'
+ api_key_missing: 'Captain AI API-nøkkel er ikke konfigurert.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'Bruker verktøy %{function_name}'
+ completed_tool_call: 'Fullført %{function_name} verktøysanrop'
+ invalid_tool_call: 'Ugyldig verktøysanrop'
+ tool_not_available: 'Verktøy ikke tilgjengelig'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Search for article by title or body...
@@ -409,6 +410,10 @@
title: Page not found
description: We couldn't find the page you were looking for.
back_to_home: Go to home page
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Navn
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index d2b4fe3a2..3b6ab744a 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -343,14 +343,14 @@ pl:
copilot_message_required: Wiadomość jest wymagana
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Zaktualizuj swój plan, aby włączyć Captain AI'
+ disabled: 'Captain AI jest wyłączony dla tego konta.'
+ api_key_missing: 'Klucz API Captain AI nie jest skonfigurowany.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'Używanie narzędzia %{function_name}'
+ completed_tool_call: 'Zakończono wywołanie narzędzia %{function_name}'
+ invalid_tool_call: 'Nieprawidłowe wywołanie narzędzia'
+ tool_not_available: 'Narzędzie niedostępne'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ pl:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Wyszukaj artykuł według tytułu lub treści...
@@ -409,6 +410,10 @@ pl:
title: Page not found
description: We couldn't find the page you were looking for.
back_to_home: Go to home page
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Imię
diff --git a/config/locales/pt.yml b/config/locales/pt.yml
index 8371d83d4..0efa2f1a6 100644
--- a/config/locales/pt.yml
+++ b/config/locales/pt.yml
@@ -343,9 +343,9 @@ pt:
copilot_message_required: A mensagem é obrigatória
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Faça upgrade do seu plano para ativar o Captain AI'
+ disabled: 'Captain AI está desativado para esta conta.'
+ api_key_missing: 'A chave API do Captain AI não está configurada.'
copilot:
using_tool: 'A usar a ferramenta %{function_name}'
completed_tool_call: 'Chamada da ferramenta %{function_name} concluída'
@@ -373,6 +373,7 @@ pt:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Pesquisar artigo por título ou corpo...
@@ -409,6 +410,10 @@ pt:
title: Página não encontrada
description: Não conseguimos encontrar a página que está a procurar.
back_to_home: Ir para a home page
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: 'Nome:'
diff --git a/config/locales/pt_BR.yml b/config/locales/pt_BR.yml
index 6517f9bd6..44d454d79 100644
--- a/config/locales/pt_BR.yml
+++ b/config/locales/pt_BR.yml
@@ -36,7 +36,7 @@ pt_BR:
errors:
account:
reporting_timezone:
- invalid: is not a valid timezone
+ invalid: não é um fuso horário válido
validations:
presence: não pode ficar em branco
webhook:
@@ -373,6 +373,7 @@ pt_BR:
page_processing_error: 'Erro ao processar as páginas %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Não foi possível gerar um slug único após 5 tentativas'
+ limit_exceeded: 'Você pode criar no máximo %{limit} ferramentas personalizadas por conta'
public_portal:
search:
search_placeholder: Pesquisar por artigo por título ou corpo...
@@ -409,6 +410,10 @@ pt_BR:
title: Página não encontrada
description: Não conseguimos encontrar a página que você estava procurando.
back_to_home: Ir para a página inicial
+ not_active:
+ title: Central de Ajuda Indisponível
+ description: Entre em contato com o administrador do site para mais informações.
+ action: Se você é o administrador, por favor atualize seu plano para restaurar o acesso.
slack_unfurl:
fields:
name: Nome
diff --git a/config/locales/ro.yml b/config/locales/ro.yml
index 59ff55b1b..6e4ec8eb7 100644
--- a/config/locales/ro.yml
+++ b/config/locales/ro.yml
@@ -343,14 +343,14 @@ ro:
copilot_message_required: Este necesar un mesaj
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Faceți upgrade la planul dvs. pentru a activa Captain AI'
+ disabled: 'Captain AI este dezactivat pentru acest cont.'
+ api_key_missing: 'Cheia API Captain AI nu este configurată.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'Se utilizează instrumentul %{function_name}'
+ completed_tool_call: 'Apelul instrumentului %{function_name} a fost finalizat'
+ invalid_tool_call: 'Apel invalid al instrumentului'
+ tool_not_available: 'Instrumentul nu este disponibil'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ ro:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Căutați articol după titlu sau corp...
@@ -409,6 +410,10 @@ ro:
title: Page not found
description: We couldn't find the page you were looking for.
back_to_home: Go to home page
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Nume
diff --git a/config/locales/ru.yml b/config/locales/ru.yml
index eaa852f72..a297e8e62 100644
--- a/config/locales/ru.yml
+++ b/config/locales/ru.yml
@@ -373,6 +373,7 @@ ru:
page_processing_error: 'Ошибка при обработке страниц %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Невозможно сгенерировать уникальный slug после 5 попыток'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Поиск статьи по названию или содержанию...
@@ -409,6 +410,10 @@ ru:
title: Страница не найдена
description: Мы не смогли найти запрашиваемую вами страницу.
back_to_home: Перейти на главную страницу
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Имя
diff --git a/config/locales/sh.yml b/config/locales/sh.yml
index 18aab6b08..714947500 100644
--- a/config/locales/sh.yml
+++ b/config/locales/sh.yml
@@ -343,14 +343,14 @@ sh:
copilot_message_required: Message is required
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Nadogradite svoj plan da omogućite Captain AI'
+ disabled: 'Captain AI je onemogućen za ovaj nalog.'
+ api_key_missing: 'API ključ za Captain AI nije konfigurisan.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'Koristi se alat %{function_name}'
+ completed_tool_call: 'Dovršeno pozivanje alata %{function_name}'
+ invalid_tool_call: 'Nevažeće pozivanje alata'
+ tool_not_available: 'Alat nije dostupan'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ sh:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Pretraži članak po naslovu ili sadržaju...
@@ -409,6 +410,10 @@ sh:
title: Page not found
description: We couldn't find the page you were looking for.
back_to_home: Go to home page
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Name
diff --git a/config/locales/sk.yml b/config/locales/sk.yml
index bbb7dbecd..c452b8ce4 100644
--- a/config/locales/sk.yml
+++ b/config/locales/sk.yml
@@ -343,14 +343,14 @@ sk:
copilot_message_required: Message is required
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Pre zapnutie Captain AI prejdite na vyšší plán'
+ disabled: 'Captain AI je pre tento účet deaktivovaný.'
+ api_key_missing: 'API kľúč Captain AI nie je nakonfigurovaný.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'Používam nástroj %{function_name}'
+ completed_tool_call: 'Dokončené volanie nástroja %{function_name}'
+ invalid_tool_call: 'Neplatné volanie nástroja'
+ tool_not_available: 'Nástroj nie je k dispozícii'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ sk:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Search for article by title or body...
@@ -409,6 +410,10 @@ sk:
title: Page not found
description: We couldn't find the page you were looking for.
back_to_home: Go to home page
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Meno
diff --git a/config/locales/sl.yml b/config/locales/sl.yml
index 3d809edf4..d8f0c5693 100644
--- a/config/locales/sl.yml
+++ b/config/locales/sl.yml
@@ -343,14 +343,14 @@ sl:
copilot_message_required: Message is required
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Nadgradite svoj paket, da omogočite Captain AI'
+ disabled: 'Captain AI je v tem računu onemogočen.'
+ api_key_missing: 'Ključ API za Captain AI ni konfiguriran.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'Uporaba orodja %{function_name}'
+ completed_tool_call: 'Zaključen klic orodja %{function_name}'
+ invalid_tool_call: 'Neveljaven klic orodja'
+ tool_not_available: 'Orodje ni na voljo'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ sl:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Iskanje članka po naslovu ali telesu ...
@@ -409,6 +410,10 @@ sl:
title: Stran ni najdena
description: Nismo mogli najti strani, ki ste jo iskali.
back_to_home: Pojdite na domačo stran
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Ime
diff --git a/config/locales/sq.yml b/config/locales/sq.yml
index ad765272a..b437e1658 100644
--- a/config/locales/sq.yml
+++ b/config/locales/sq.yml
@@ -343,9 +343,9 @@ sq:
copilot_message_required: Message is required
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Përmirëso planin tënd për të aktivizuar Captain AI'
+ disabled: 'Captain AI është i çaktivizuar për këtë llogari.'
+ api_key_missing: 'Çelësi API i Captain AI nuk është konfiguruar.'
copilot:
using_tool: 'Duke përdorur mjetin %{function_name}'
completed_tool_call: 'Thirrja e mjetit %{function_name} u përfundua'
@@ -373,6 +373,7 @@ sq:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Search for article by title or body...
@@ -409,6 +410,10 @@ sq:
title: Page not found
description: We couldn't find the page you were looking for.
back_to_home: Go to home page
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Name
diff --git a/config/locales/sr.yml b/config/locales/sr.yml
index 568fa0225..cd3e516b6 100644
--- a/config/locales/sr.yml
+++ b/config/locales/sr.yml
@@ -343,14 +343,14 @@ sr-Latn:
copilot_message_required: Poruka je obavezna
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Nadogradite svoj plan da biste omogućili Captain AI'
+ disabled: 'Captain AI je onemogućen za ovaj nalog.'
+ api_key_missing: 'API ključ za Captain AI nije konfigurisan.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'Koristi alat %{function_name}'
+ completed_tool_call: 'Završeno pozivanje alata %{function_name}'
+ invalid_tool_call: 'Nevažeće pozivanje alata'
+ tool_not_available: 'Alat nije dostupan'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ sr-Latn:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Search for article by title or body...
@@ -409,6 +410,10 @@ sr-Latn:
title: Page not found
description: We couldn't find the page you were looking for.
back_to_home: Go to home page
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Ime
diff --git a/config/locales/sv.yml b/config/locales/sv.yml
index d7e0786b4..06c6b19f2 100644
--- a/config/locales/sv.yml
+++ b/config/locales/sv.yml
@@ -343,14 +343,14 @@ sv:
copilot_message_required: Meddelande måste fyllas i
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Uppgradera din plan för att aktivera Captain AI'
+ disabled: 'Captain AI är inaktiverat för detta konto.'
+ api_key_missing: 'Captain AI API-nyckel är inte konfigurerad.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'Använder verktyget %{function_name}'
+ completed_tool_call: 'Avslutad verktygsanrop %{function_name}'
+ invalid_tool_call: 'Ogiltigt verktygsanrop'
+ tool_not_available: 'Verktyg inte tillgängligt'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ sv:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Sök efter artikel baserat på rubrik eller brödtext...
@@ -409,6 +410,10 @@ sv:
title: Sidan kunde inte hittas
description: Vi kunde inte hitta sidan du letade efter.
back_to_home: Gå till startsidan
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Namn
diff --git a/config/locales/ta.yml b/config/locales/ta.yml
index bcbb4adc0..2c1b34ef4 100644
--- a/config/locales/ta.yml
+++ b/config/locales/ta.yml
@@ -343,14 +343,14 @@ ta:
copilot_message_required: Message is required
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Captain AI ஐ இயல்பாக்க உங்கள் திட்டத்தை மேம்படுத்தவும்'
+ disabled: 'இந்த கணக்குக்கு Captain AI செயலிழக்கப்பட்டிருக்கிறது.'
+ api_key_missing: 'Captain AI API விசை அமைக்கப்படவில்லை.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: '%{function_name} கருவியை பயன்படுத்துகிறோம்'
+ completed_tool_call: '%{function_name} கருவி அழைப்பு முடிந்தது'
+ invalid_tool_call: 'தவறான கருவி அழைப்பு'
+ tool_not_available: 'கருவி கிடைக்கவில்லை'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ ta:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Search for article by title or body...
@@ -409,6 +410,10 @@ ta:
title: Page not found
description: We couldn't find the page you were looking for.
back_to_home: Go to home page
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: பெயர்
diff --git a/config/locales/th.yml b/config/locales/th.yml
index f6d76635b..94e32e821 100644
--- a/config/locales/th.yml
+++ b/config/locales/th.yml
@@ -343,14 +343,14 @@ th:
copilot_message_required: โปรดระบุข้อความด้วย
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'อัปเกรดแผนเพื่อเปิดใช้งาน Captain AI'
+ disabled: 'Captain AI ถูกปิดใช้งานสำหรับบัญชีนี้'
+ api_key_missing: 'ไม่ได้ตั้งค่า API key ของ Captain AI'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'กำลังใช้เครื่องมือ %{function_name}'
+ completed_tool_call: 'เรียกใช้เครื่องมือ %{function_name} เสร็จสิ้น'
+ invalid_tool_call: 'การเรียกใช้เครื่องมือไม่ถูกต้อง'
+ tool_not_available: 'เครื่องมือไม่พร้อมใช้งาน'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ th:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Search for article by title or body...
@@ -409,6 +410,10 @@ th:
title: Page not found
description: We couldn't find the page you were looking for.
back_to_home: Go to home page
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: ชื่อ
diff --git a/config/locales/tl.yml b/config/locales/tl.yml
index 8daab87c5..7353177fe 100644
--- a/config/locales/tl.yml
+++ b/config/locales/tl.yml
@@ -17,20 +17,20 @@
#To learn more, please read the Rails Internationalization guide
#available at https://guides.rubyonrails.org/i18n.html.
tl:
- hello: 'Hello world'
+ hello: 'Kamusta mundo'
inbox:
reauthorization:
success: 'Channel reauthorized successfully'
- not_required: 'Reauthorization is not required for this inbox'
+ not_required: 'Hindi kailangan ng muling awtorisasyon para sa inbox na ito'
invalid_channel: 'Invalid channel type for reauthorization'
auth:
saml:
- invalid_email: 'Please enter a valid email address'
- authentication_failed: 'Authentication failed. Please check your credentials and try again.'
+ invalid_email: 'Mangyaring ilagay ang isang wastong email address'
+ authentication_failed: 'Nabigo ang pagpapatunay. Pakisuri ang iyong mga kredensyal at subukang muli.'
messages:
- reset_password: Request for password reset is successful. A email with instructions will be sent to your email if it exists.
- reset_password_saml_user: This account uses SAML authentication. Password reset is not available. Please contact your administrator.
- login_saml_user: This account uses SAML authentication. Please sign in through your organization's SAML provider.
+ reset_password: Matagumpay ang kahilingan para sa pag-reset ng password. Isang email na may mga tagubilin ang ipapadala sa iyong email kung ito ay umiiral.
+ reset_password_saml_user: Gumagamit ang account na ito ng SAML na pagpapatotoo. Hindi available ang pag-reset ng password. Mangyaring kontakin ang iyong administrator.
+ login_saml_user: Gumagamit ang account na ito ng SAML na pagpapatotoo. Mangyaring mag-sign in sa pamamagitan ng SAML provider ng iyong organisasyon.
saml_not_available: SAML authentication is not available in this installation.
inbox_deletetion_response: Your inbox deletion request will be processed in some time.
errors:
@@ -38,227 +38,227 @@ tl:
reporting_timezone:
invalid: is not a valid timezone
validations:
- presence: must not be blank
+ presence: hindi dapat walang laman
webhook:
- invalid: Invalid events
+ invalid: Hindi wastong mga pangyayari
signup:
- disposable_email: We do not allow disposable emails
- blocked_domain: This domain is not allowed. If you believe this is a mistake, please contact support.
- invalid_email: You have entered an invalid email
- email_already_exists: 'You have already signed up for an account with %{email}'
+ disposable_email: Hindi pinapayagan ang pansamantalang email
+ blocked_domain: Hindi pinapayagan ang domain na ito. Kung naniniwala kang nagkamali, mangyaring makipag-ugnayan sa suporta.
+ invalid_email: Naglagay ka ng hindi wastong email
+ email_already_exists: 'May account ka nang nakarehistro gamit ang %{email}'
invalid_params: 'Invalid, please check the signup paramters and try again'
- failed: Signup failed
+ failed: Nabigo ang pag-sign up
assignment_policy:
- not_found: Assignment policy not found
+ not_found: Hindi matagpuan ang patakaran sa pagtatalaga
attachments:
- invalid: Invalid attachment
+ invalid: Hindi wastong kalakip
saml:
- feature_not_enabled: SAML feature not enabled for this account
+ feature_not_enabled: Hindi naka-enable ang tampok na SAML para sa account na ito
sso_not_enabled: SAML SSO is not enabled for this installation
data_import:
data_type:
- invalid: Invalid data type
+ invalid: Hindi wastong uri ng datos
contacts:
import:
- failed: File is blank
+ failed: Walang laman ang file
export:
- success: We will notify you once contacts export file is ready to view.
+ success: Ipapaalam namin sa iyo kapag handa na ang file ng export ng mga contact para makita.
email:
- invalid: Invalid email
+ invalid: Hindi wastong email
phone_number:
- invalid: should be in e164 format
+ invalid: dapat ay nasa e164 na format
companies:
domain:
- invalid: must be a valid domain name
+ invalid: dapat ay isang wastong pangalan ng domain
search:
query_missing: Specify search string with parameter q
messages:
search:
- time_range_limit_exceeded: 'Search is limited to the last %{days} days'
+ time_range_limit_exceeded: 'Ang paghahanap ay limitado sa huling %{days} araw'
categories:
locale:
- unique: should be unique in the category and portal
+ unique: dapat ay natatangi sa kategorya at portal
dyte:
- invalid_message_type: 'Invalid message type. Action not permitted'
+ invalid_message_type: 'Hindi wastong uri ng mensahe. Hindi pinapayagan ang aksyon'
slack:
invalid_channel_id: 'Invalid slack channel. Please try again'
whatsapp:
- token_exchange_failed: 'Failed to exchange code for access token. Please try again.'
- invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.'
- phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.'
+ token_exchange_failed: 'Nabigong palitan ang code para sa access token. Pakisubukang muli.'
+ invalid_token_permissions: 'Ang access token ay walang kinakailangang pahintulot para sa WhatsApp.'
+ phone_info_fetch_failed: 'Nabigong kunin ang impormasyon ng numero ng telepono. Pakisubukang muli.'
phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists'
reauthorization:
- generic: 'Failed to reauthorize WhatsApp. Please try again.'
+ generic: 'Nabigong muling pahintulutan ang WhatsApp. Pakisubukang muli.'
not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.'
inboxes:
imap:
socket_error: Please check the network connection, IMAP address and try again.
- no_response_error: Please check the IMAP credentials and try again.
+ no_response_error: Pakisuri ang mga kredensyal ng IMAP at subukang muli.
host_unreachable_error: Host unreachable, Please check the IMAP address, IMAP port and try again.
- connection_timed_out_error: Connection timed out for %{address}:%{port}
- connection_closed_error: Connection closed.
+ connection_timed_out_error: Nawala ang koneksyon sa oras para sa %{address}:%{port}
+ connection_closed_error: Isinara ang koneksyon.
smtp:
- authentication_error: SMTP authentication failed. Please verify your login credentials.
+ authentication_error: Nabigo ang SMTP na pagpapatotoo. Pakisuri ang iyong mga kredensyal sa pag-login.
connection_error: Could not connect to SMTP server. Please check the server address and port.
ssl_error: SSL/TLS error. Please verify your encryption settings.
smtp_error: SMTP server error. Please check your configuration and try again.
validations:
- name: should not start or end with symbols, and it should not have < > / \ @ characters.
+ name: hindi dapat magsimula o magtapos sa mga simbolo, at hindi dapat magkaroon ng mga karakter na < > / \ @.
custom_filters:
- number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 1000.
- invalid_attribute: Invalid attribute key - [%{key}]. The key should be one of [%{allowed_keys}] or a custom attribute defined in the account.
+ number_of_records: Naabot na ang limitasyon. Ang pinakamataas na bilang ng pinapayagang custom filter para sa isang gumagamit kada account ay 1000.
+ invalid_attribute: Hindi wastong susi ng attribute - [%{key}]. Ang susi ay dapat kabilang sa [%{allowed_keys}] o isang custom na attribute na itinakda sa account.
invalid_operator: Invalid operator. The allowed operators for %{attribute_name} are [%{allowed_keys}].
invalid_query_operator: Query operator must be either "AND" or "OR".
- invalid_value: Invalid value. The values provided for %{attribute_name} are invalid
+ invalid_value: Hindi wastong halaga. Ang mga halagang ibinigay para sa %{attribute_name} ay hindi wasto
custom_attribute_definition:
attribute_key_format: must only contain letters, numbers, underscores, hyphens, and dots
- key_conflict: The provided key is not allowed as it might conflict with default attributes.
+ key_conflict: Hindi pinapayagan ang ibinigay na susi dahil maaaring magdulot ito ng salungatan sa mga default na katangian.
mfa:
already_enabled: MFA is already enabled
- not_enabled: MFA is not enabled
- invalid_code: Invalid verification code
+ not_enabled: Hindi naka-enable ang MFA
+ invalid_code: Hindi wastong code ng beripikasyon
invalid_backup_code: Invalid backup code
- invalid_token: Invalid or expired MFA token
- invalid_credentials: Invalid credentials or verification code
+ invalid_token: Hindi wastong o paso na ang MFA token
+ invalid_credentials: Hindi wastong kredensyal o code ng beripikasyon
feature_unavailable: MFA feature is not available. Please configure encryption keys.
topup:
credits_required: Credits amount is required
invalid_credits: Invalid credits amount
invalid_option: Invalid topup option
plan_not_eligible: Top-ups are only available for paid plans. Please upgrade your plan first.
- stripe_customer_not_configured: Stripe customer not configured
- no_payment_method: No payment methods found. Please add a payment method before making a purchase.
+ stripe_customer_not_configured: Hindi nakaayos ang Stripe customer
+ no_payment_method: Walang natagpuang paraan ng pagbabayad. Mangyaring magdagdag ng paraan ng pagbabayad bago bumili.
reports:
- date_range_too_long: Date range cannot exceed 6 months
+ date_range_too_long: Hindi maaaring lumampas sa 6 na buwan ang saklaw ng petsa
profile:
mfa:
- enabled: MFA enabled successfully
- disabled: MFA disabled successfully
+ enabled: Matagumpay na na-enable ang MFA
+ disabled: Matagumpay na na-disable ang MFA
account_saml_settings:
- invalid_certificate: must be a valid X.509 certificate in PEM format
+ invalid_certificate: dapat ay isang wastong X.509 sertipiko sa PEM na format
reports:
- period: Reporting period %{since} to %{until}
+ period: Panahon ng ulat mula %{since} hanggang %{until}
utc_warning: The report generated is in UTC timezone
agent_csv:
- agent_name: Agent name
- conversations_count: Assigned conversations
- avg_first_response_time: Avg first response time
- avg_resolution_time: Avg resolution time
- resolution_count: Resolution Count
- avg_customer_waiting_time: Avg customer waiting time
+ agent_name: Pangalan ng ahente
+ conversations_count: Itinalagang mga pag-uusap
+ avg_first_response_time: Karaniwang oras ng unang tugon
+ avg_resolution_time: Karaniwang oras ng paglutas
+ resolution_count: Bilang ng Resolusyon
+ avg_customer_waiting_time: Karaniwang oras ng paghihintay ng customer
inbox_csv:
- inbox_name: Inbox name
- inbox_type: Inbox type
- conversations_count: No. of conversations
- avg_first_response_time: Avg first response time
- avg_resolution_time: Avg resolution time
+ inbox_name: Pangalan ng inbox
+ inbox_type: Uri ng inbox
+ conversations_count: Bilang ng mga pag-uusap
+ avg_first_response_time: Karaniwang oras ng unang tugon
+ avg_resolution_time: Karaniwang oras ng paglutas
label_csv:
label_title: Label
- conversations_count: No. of conversations
- avg_first_response_time: Avg first response time
- avg_resolution_time: Avg resolution time
- avg_reply_time: Avg reply time
- resolution_count: Resolution Count
+ conversations_count: Bilang ng mga pag-uusap
+ avg_first_response_time: Karaniwang oras ng unang tugon
+ avg_resolution_time: Karaniwang oras ng paglutas
+ avg_reply_time: Karaniwang oras ng sagot
+ resolution_count: Bilang ng mga resolusyon
team_csv:
- team_name: Team name
- conversations_count: Conversations count
- avg_first_response_time: Avg first response time
- avg_resolution_time: Avg resolution time
- resolution_count: Resolution Count
- avg_customer_waiting_time: Avg customer waiting time
+ team_name: Pangalan ng koponan
+ conversations_count: Bilang ng mga pag-uusap
+ avg_first_response_time: Karaniwang oras ng unang tugon
+ avg_resolution_time: Karaniwang oras ng paglutas
+ resolution_count: Bilang ng Resolusyon
+ avg_customer_waiting_time: Karaniwang oras ng paghihintay ng customer
conversation_csv:
- conversations_count: Conversations
- incoming_messages_count: Messages received
- outgoing_messages_count: Messages sent
- avg_first_response_time: Avg first response time
- avg_resolution_time: Avg resolution time
- resolution_count: Resolution count
- avg_customer_waiting_time: Avg customer waiting time
+ conversations_count: Mga pag-uusap
+ incoming_messages_count: Mga mensaheng natanggap
+ outgoing_messages_count: Mga mensaheng ipinadala
+ avg_first_response_time: Karaniwang oras ng unang tugon
+ avg_resolution_time: Karaniwang oras ng paglutas
+ resolution_count: Bilang ng mga paglutas
+ avg_customer_waiting_time: Karaniwang oras ng paghihintay ng customer
conversation_traffic_csv:
timezone: Timezone
sla_csv:
- conversation_id: Conversation ID
- sla_policy_breached: SLA Policy
- assignee: Assignee
- team: Team
+ conversation_id: ID ng Pag-uusap
+ sla_policy_breached: Patakaran ng SLA
+ assignee: Itinalaga
+ team: Koponan
inbox: Inbox
- labels: Labels
- conversation_link: Link to the Conversation
- breached_events: Breached Events
- default_group_by: day
+ labels: Mga label
+ conversation_link: Ugnay sa Pag-uusap
+ breached_events: Mga Nilabag na Kaganapan
+ default_group_by: araw
csat:
headers:
- contact_name: Contact Name
- contact_email_address: Contact Email Address
- contact_phone_number: Contact Phone Number
- link_to_the_conversation: Link to the conversation
- agent_name: Agent Name
- rating: Rating
- feedback: Feedback Comment
- recorded_at: Recorded date
- review_notes: Review Notes
+ contact_name: Pangalan ng Contact
+ contact_email_address: Email address ng contact
+ contact_phone_number: Numero ng Telepono ng Contact
+ link_to_the_conversation: Ugnay sa pag-uusap
+ agent_name: Pangalan ng ahente
+ rating: Pagtataya
+ feedback: Komento sa puna
+ recorded_at: Petsa ng pagtatala
+ review_notes: Mga Tala sa Pagsusuri
notifications:
notification_title:
- conversation_creation: 'A conversation (#%{display_id}) has been created in %{inbox_name}'
- conversation_assignment: 'A conversation (#%{display_id}) has been assigned to you'
- assigned_conversation_new_message: 'A new message is created in conversation (#%{display_id})'
- conversation_mention: 'You have been mentioned in conversation (#%{display_id})'
+ conversation_creation: 'Isang pag-uusap (#%{display_id}) ang nalikha sa %{inbox_name}'
+ conversation_assignment: 'Isang pag-uusap (#%{display_id}) ang naitalaga sa iyo'
+ assigned_conversation_new_message: 'May bagong mensahe sa pag-uusap (#%{display_id})'
+ conversation_mention: 'Nabanggit ka sa pag-uusap (#%{display_id})'
sla_missed_first_response: 'SLA target first response missed for conversation (#%{display_id})'
sla_missed_next_response: 'SLA target next response missed for conversation (#%{display_id})'
sla_missed_resolution: 'SLA target resolution missed for conversation (#%{display_id})'
- attachment: 'Attachment'
- no_content: 'No content'
+ attachment: 'Kalakip'
+ no_content: 'Walang nilalaman'
conversations:
captain:
- handoff: 'Transferring to another agent for further assistance.'
+ handoff: 'Ililipat sa ibang ahente para sa karagdagang tulong.'
messages:
- instagram_story_content: '%{story_sender} mentioned you in the story: '
- instagram_deleted_story_content: This story is no longer available.
+ instagram_story_content: 'Binanggit ka ni %{story_sender} sa kwento: '
+ instagram_deleted_story_content: Hindi na available ang kuwentong ito.
instagram_shared_story_content: 'Shared story'
instagram_shared_post_content: 'Shared post'
- deleted: This message was deleted
+ deleted: Tinanggal ang mensaheng ito
whatsapp:
- list_button_label: 'Choose an item'
+ list_button_label: 'Pumili ng isang item'
delivery_status:
error_code: 'Error code: %{error_code}'
activity:
captain:
- resolved: 'Conversation was marked resolved by %{user_name} due to inactivity'
- resolved_with_reason: 'Conversation was marked resolved by %{user_name} (%{reason})'
- resolved_by_tool: 'Conversation was marked resolved by %{user_name}: %{reason}'
- open: 'Conversation was marked open by %{user_name}'
- open_with_reason: 'Conversation was marked open by %{user_name} (%{reason})'
- auto_opened_after_agent_reply: 'Conversation was marked open automatically after an agent reply'
+ resolved: 'Ang pag-uusap ay tinakdang tapos ni %{user_name} dahil sa kawalan ng aktibidad'
+ resolved_with_reason: 'Ang pag-uusap ay tinakdang tapos ni %{user_name} (%{reason})'
+ resolved_by_tool: 'Tinukoy na nalutas ang pag-uusap ni %{user_name}: %{reason}'
+ open: 'Ang pag-uusap ay tinakdang bukas ni %{user_name}'
+ open_with_reason: 'Binuksan ang pag-uusap ni %{user_name} (%{reason})'
+ auto_opened_after_agent_reply: 'Awtomatikong binuksan ang pag-uusap matapos ang tugon ng ahente'
agent_bot:
error_moved_to_open: 'Conversation was marked open by system due to an error with the agent bot.'
status:
- resolved: 'Conversation was marked resolved by %{user_name}'
- contact_resolved: 'Conversation was resolved by %{contact_name}'
- open: 'Conversation was reopened by %{user_name}'
+ resolved: 'Tinukoy bilang nalutas ang pag-uusap ni %{user_name}'
+ contact_resolved: 'Nalutas ang pag-uusap ni %{contact_name}'
+ open: 'Muling binuksan ang pag-uusap ni %{user_name}'
pending: 'Conversation was marked as pending by %{user_name}'
snoozed: 'Conversation was snoozed by %{user_name}'
- auto_resolved_days: 'Conversation was marked resolved by system due to %{count} days of inactivity'
- auto_resolved_hours: 'Conversation was marked resolved by system due to %{count} hours of inactivity'
- auto_resolved_minutes: 'Conversation was marked resolved by system due to %{count} minutes of inactivity'
- system_auto_open: System reopened the conversation due to a new incoming message.
+ auto_resolved_days: 'Ang pag-uusap ay tinakdang tapos ng sistema dahil sa %{count} araw ng hindi pagkilos'
+ auto_resolved_hours: 'Ang pag-uusap ay tinakdang tapos ng sistema dahil sa %{count} oras ng hindi pagkilos'
+ auto_resolved_minutes: 'Ang pag-uusap ay tinakdang tapos ng sistema dahil sa %{count} minuto ng hindi pagkilos'
+ system_auto_open: Muling binuksan ng sistema ang pag-uusap dahil sa bagong papasok na mensahe.
priority:
- added: '%{user_name} set the priority to %{new_priority}'
- updated: '%{user_name} changed the priority from %{old_priority} to %{new_priority}'
- removed: '%{user_name} removed the priority'
+ added: 'Itinakda ni %{user_name} ang prayoridad sa %{new_priority}'
+ updated: 'Binago ni %{user_name} ang prayoridad mula %{old_priority} patungong %{new_priority}'
+ removed: 'Inalis ni %{user_name} ang prayoridad'
assignee:
- self_assigned: '%{user_name} self-assigned this conversation'
- assigned: 'Assigned to %{assignee_name} by %{user_name}'
- removed: 'Conversation unassigned by %{user_name}'
+ self_assigned: 'Inatasan ni %{user_name} ang sarili sa pag-uusap na ito'
+ assigned: 'Itinalaga kay %{assignee_name} ni %{user_name}'
+ removed: 'Hindi na itinalaga ang pag-uusap ni %{user_name}'
team:
- assigned: 'Assigned to %{team_name} by %{user_name}'
- assigned_with_assignee: 'Assigned to %{assignee_name} via %{team_name} by %{user_name}'
- removed: 'Unassigned from %{team_name} by %{user_name}'
+ assigned: 'Itinalaga sa %{team_name} ni %{user_name}'
+ assigned_with_assignee: 'Itinalaga kay %{assignee_name} sa pamamagitan ng %{team_name} ni %{user_name}'
+ removed: 'Inalis mula sa %{team_name} ni %{user_name}'
labels:
- added: '%{user_name} added %{labels}'
- removed: '%{user_name} removed %{labels}'
+ added: 'Idinagdag ni %{user_name} ang %{labels}'
+ removed: 'Tinanggal ni %{user_name} ang %{labels}'
sla:
- added: '%{user_name} added SLA policy %{sla_name}'
- removed: '%{user_name} removed SLA policy %{sla_name}'
+ added: 'Idinagdag ni %{user_name} ang patakaran ng SLA na %{sla_name}'
+ removed: 'Inalis ni %{user_name} ang patakaran ng SLA na %{sla_name}'
linear:
issue_created: 'Linear issue %{issue_id} was created by %{user_name}'
issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}'
@@ -267,46 +267,46 @@ tl:
not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions'
auto_resolve:
not_sent_due_to_messaging_window: 'Auto-resolve message not sent due to outgoing message restrictions'
- muted: '%{user_name} has muted the conversation'
- unmuted: '%{user_name} has unmuted the conversation'
+ muted: 'Tahimik na ang pag-uusap ni %{user_name}'
+ unmuted: 'Inalis ni %{user_name} ang katahimikan sa pag-uusap'
auto_resolution_message: 'Resolving the conversation as it has been inactive for a while. Please start a new conversation if you need further assistance.'
templates:
- greeting_message_body: '%{account_name} typically replies in a few hours.'
- ways_to_reach_you_message_body: 'Give the team a way to reach you.'
- email_input_box_message_body: 'Get notified by email'
- csat_input_message_body: 'Please rate the conversation'
+ greeting_message_body: 'Karaniwang sumasagot ang %{account_name} sa loob ng ilang oras.'
+ ways_to_reach_you_message_body: 'Bigyan ang koponan ng paraan para maabot ka.'
+ email_input_box_message_body: 'Makatanggap ng abiso sa pamamagitan ng email'
+ csat_input_message_body: 'Pakisuri ang pag-uusap'
reply:
email:
header:
- notifications: 'Notifications'
- from_with_name: '%{assignee_name} from %{inbox_name} <%{from_email}>'
- reply_with_name: '%{assignee_name} from %{inbox_name} '
- friendly_name: '%{sender_name} from %{business_name} <%{from_email}>'
+ notifications: 'Mga Abiso'
+ from_with_name: '%{assignee_name} mula sa %{inbox_name} <%{from_email}>'
+ reply_with_name: '%{assignee_name} mula sa %{inbox_name} '
+ friendly_name: '%{sender_name} mula sa %{business_name} <%{from_email}>'
professional_name: '%{business_name} <%{from_email}>'
channel_email:
header:
- reply_with_name: '%{assignee_name} from %{inbox_name} <%{from_email}>'
+ reply_with_name: '%{assignee_name} mula sa %{inbox_name} <%{from_email}>'
reply_with_inbox_name: '%{inbox_name} <%{from_email}>'
- email_subject: 'New messages on this conversation'
- transcript_subject: 'Conversation Transcript'
+ email_subject: 'Mga bagong mensahe sa pag-uusap na ito'
+ transcript_subject: 'Talaan ng Pag-uusap'
survey:
- response: 'Please rate this conversation, %{link}'
+ response: 'Pakisuri ang pag-uusap na ito, %{link}'
contacts:
online:
- delete: '%{contact_name} is Online, please try again later'
+ delete: 'Online si %{contact_name}, pakisubukang muli mamaya'
integration_apps:
#Note: webhooks and dashboard_apps don't need short_description as they use different modal components
dashboard_apps:
- name: 'Dashboard Apps'
+ name: 'Mga App sa Dashboard'
description: 'Dashboard Apps allow you to create and embed applications that display user information, orders, or payment history, providing more context to your customer support agents.'
dyte:
name: 'Dyte'
- short_description: 'Start video/voice calls with customers directly from Chatwoot.'
+ short_description: 'Magsimula ng tawag na video/boses kasama ang mga customer nang direkta mula sa Chatwoot.'
description: 'Dyte is a product that integrates audio and video functionalities into your application. With this integration, your agents can start video/voice calls with your customers directly from Chatwoot.'
- meeting_name: '%{agent_name} has started a meeting'
+ meeting_name: 'Nagsimula si %{agent_name} ng isang pagpupulong'
slack:
name: 'Slack'
- short_description: 'Receive notifications and respond to conversations directly in Slack.'
+ short_description: 'Tumanggap ng mga abiso at tumugon sa mga pag-uusap nang direkta sa Slack.'
description: "Integrate Chatwoot with Slack to keep your team in sync. This integration allows you to receive notifications for new conversations and respond to them directly within Slack's interface."
webhooks:
name: 'Webhooks'
@@ -317,11 +317,11 @@ tl:
description: 'Build chatbots with Dialogflow and easily integrate them into your inbox. These bots can handle initial queries before transferring them to a customer service agent.'
google_translate:
name: 'Google Translate'
- short_description: 'Automatically translate customer messages for agents.'
+ short_description: 'Awtomatikong isalin ang mga mensahe ng customer para sa mga ahente.'
description: "Integrate Google Translate to help agents easily translate customer messages. This integration automatically detects the language and converts it to the agent's or admin's preferred language."
openai:
name: 'OpenAI'
- short_description: 'AI-powered reply suggestions, summarization, and message enhancement.'
+ short_description: 'Mga mungkahi sa sagot na pinapagana ng AI, buod, at pagpapahusay ng mensahe.'
description: 'Leverage the power of large language models from OpenAI with the features such as reply suggestions, summarization, message rephrasing, spell-checking, and label classification.'
linear:
name: 'Linear'
@@ -340,84 +340,89 @@ tl:
short_description: 'Sync your contacts and conversations with LeadSquared CRM.'
description: 'Sync your contacts and conversations with LeadSquared CRM. This integration automatically creates leads in LeadSquared when new contacts are added, and logs conversation activity to provide your sales team with complete context.'
captain:
- copilot_message_required: Message is required
+ copilot_message_required: Kinakailangan ang mensahe
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'I-upgrade ang iyong plano upang paganahin ang Captain AI'
+ disabled: 'Hindi pinagana ang Captain AI para sa account na ito.'
+ api_key_missing: 'Hindi naka-configure ang Captain AI API key.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'Gumagamit ng kasangkapang %{function_name}'
+ completed_tool_call: 'Natapos ang tawag sa kasangkapang %{function_name}'
+ invalid_tool_call: 'Hindi wastong tawag sa kasangkapan'
+ tool_not_available: 'Hindi magagamit ang kasangkapan'
documents:
- limit_exceeded: 'Document limit exceeded'
- pdf_format_error: 'must be a PDF file'
- pdf_size_error: 'must be less than 10MB'
- 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}'
- pdf_processing_success: 'Successfully processed PDF document %{document_id}'
- faq_generation_complete: 'FAQ generation complete. Total FAQs created: %{count}'
- using_paginated_faq: 'Using paginated FAQ generation for document %{document_id}'
- using_standard_faq: 'Using standard FAQ generation for document %{document_id}'
- response_creation_error: 'Error in creating response document: %{error}'
- missing_openai_file_id: 'Document must have openai_file_id for paginated processing'
+ limit_exceeded: 'Lumampas sa limitasyon ang dokumento'
+ pdf_format_error: 'dapat ay isang PDF na file'
+ pdf_size_error: 'dapat ay mas mababa sa 10MB'
+ pdf_upload_failed: 'Nabigong i-upload ang PDF sa OpenAI'
+ pdf_upload_success: 'Matagumpay na na-upload ang PDF na may file_id: %{file_id}'
+ pdf_processing_failed: 'Nabigong iproseso ang dokumentong PDF %{document_id}: %{error}'
+ pdf_processing_success: 'Matagumpay na naproseso ang PDF na dokumento %{document_id}'
+ faq_generation_complete: 'Tapos na ang paglikha ng FAQ. Kabuuang FAQ na nalikha: %{count}'
+ using_paginated_faq: 'Gumagamit ng pahinang FAQ na paglikha para sa dokumento %{document_id}'
+ using_standard_faq: 'Gumagamit ng karaniwang paglikha ng FAQ para sa dokumento %{document_id}'
+ response_creation_error: 'May error sa paggawa ng dokumento ng sagot: %{error}'
+ missing_openai_file_id: 'Dapat may openai_file_id ang dokumento para sa pahinang proseso'
openai_api_error: 'OpenAI API Error: %{error}'
- starting_paginated_faq: 'Starting paginated FAQ generation (%{pages_per_chunk} pages per chunk)'
- stopping_faq_generation: 'Stopping processing. Reason: %{reason}'
- paginated_faq_complete: 'Paginated generation complete. Total FAQs: %{total_faqs}, Pages processed: %{pages_processed}'
- processing_pages: 'Processing pages %{start}-%{end} (iteration %{iteration})'
+ starting_paginated_faq: 'Nagsisimula ang pagbuo ng pahinang FAQ (%{pages_per_chunk} pahina kada bahagi)'
+ stopping_faq_generation: 'Itinigil ang proseso. Dahilan: %{reason}'
+ paginated_faq_complete: 'Tapos na ang pahinang pagbuo. Kabuuang FAQ: %{total_faqs}, Mga pahinang naproseso: %{pages_processed}'
+ processing_pages: 'Pinoproseso ang mga pahina %{start}-%{end} (ikot %{iteration})'
chunk_generated: 'Chunk generated %{chunk_faqs} FAQs. Total so far: %{total_faqs}'
- page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
+ page_processing_error: 'May error sa pagproseso ng mga pahina %{start}-%{end}: %{error}'
custom_tool:
- slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ slug_generation_failed: 'Hindi makabuo ng natatanging slug pagkatapos ng 5 pagtatangka'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
- search_placeholder: Search for article by title or body...
- empty_placeholder: No results found.
- loading_placeholder: Searching...
- results_title: Search results
- toc_header: 'On this page'
+ search_placeholder: Maghanap ng artikulo ayon sa pamagat o nilalaman...
+ empty_placeholder: Walang nahanap na resulta.
+ loading_placeholder: Naghahanap...
+ results_title: Mga resulta ng paghahanap
+ toc_header: 'Sa pahinang ito'
hero:
- sub_title: Search for the articles here or browse the categories below.
+ sub_title: Maghanap ng mga artikulo dito o tingnan ang mga kategorya sa ibaba.
common:
- home: Home
- last_updated_on: Last updated on %{last_updated_on}
- view_all_articles: View all
- article: article
- articles: articles
- author: author
- authors: authors
- other: other
- others: others
- by: By
- no_articles: There are no articles here
+ home: Bahay
+ last_updated_on: Huling na-update noong %{last_updated_on}
+ view_all_articles: Tingnan lahat
+ article: artikulo
+ articles: mga artikulo
+ author: may-akda
+ authors: mga may-akda
+ other: iba
+ others: mga iba
+ by: Ni
+ no_articles: Walang mga artikulo dito
footer:
- made_with: Made with
+ made_with: Ginawa gamit ang
header:
go_to_homepage: Website
- visit_website: Visit website
+ visit_website: Bisitahin ang website
appearance:
- system: System
- light: Light
- dark: Dark
- featured_articles: Featured Articles
- uncategorized: Uncategorized
+ system: Sistema
+ light: Maliwanag
+ dark: Madilim
+ featured_articles: Mga Tampok na Artikulo
+ uncategorized: Walang kategorya
404:
- title: Page not found
- description: We couldn't find the page you were looking for.
- back_to_home: Go to home page
+ title: Hindi makita ang pahina
+ description: Hindi namin makita ang pahinang hinahanap mo.
+ back_to_home: Pumunta sa pangunahing pahina
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
- name: Name
+ name: Pangalan
email: Email
- phone_number: Phone
- company_name: Company
+ phone_number: Telepono
+ company_name: Kumpanya
inbox_name: Inbox
- inbox_type: Inbox Type
- button: Open conversation
+ inbox_type: Uri ng inbox
+ button: Buksan ang pag-uusap
time_units:
days:
one: '%{count} day'
@@ -432,21 +437,21 @@ tl:
one: '%{count} second'
other: '%{count} seconds'
auto_assignment:
- default_policy_name: 'Default Policy'
- policy_actor: 'Automation System via %{policy_name}'
+ default_policy_name: 'Pangkaraniwang Patakaran'
+ policy_actor: 'Sistema ng Awtomasyon sa pamamagitan ng %{policy_name}'
automation:
- system_name: 'Automation System'
+ system_name: 'Sistema ng Awtomasyon'
crm:
- no_message: 'No messages in conversation'
- attachment: '[Attachment: %{type}]'
- no_content: '[No content]'
+ no_message: 'Walang mga mensahe sa pag-uusap'
+ attachment: '[Kalakip: %{type}]'
+ no_content: '[Walang nilalaman]'
created_activity: |
- New conversation started on %{brand_name}
+ Nagsimula ng bagong pag-uusap sa %{brand_name}
Channel: %{channel_info}
- Created: %{formatted_creation_time}
- Conversation ID: %{display_id}
- View in %{brand_name}: %{url}
+ Nilikha: %{formatted_creation_time}
+ ID ng Pag-uusap: %{display_id}
+ Tingnan sa %{brand_name}: %{url}
transcript_activity: |
Conversation Transcript from %{brand_name}
@@ -457,13 +462,13 @@ tl:
Transcript:
%{format_messages}
agent_capacity_policy:
- inbox_already_assigned: 'Inbox has already been assigned to this policy'
+ inbox_already_assigned: 'Na-assign na ang inbox sa patakarang ito'
portals:
send_instructions:
- email_required: 'Email is required'
- invalid_email_format: 'Invalid email format'
- custom_domain_not_configured: 'Custom domain is not configured'
- instructions_sent_successfully: 'Instructions sent successfully'
- subject: 'Finish setting up %{custom_domain}'
+ email_required: 'Kinakailangan ang email'
+ invalid_email_format: 'Hindi wastong format ng email'
+ custom_domain_not_configured: 'Hindi nakaayos ang custom domain'
+ instructions_sent_successfully: 'Matagumpay na naipadala ang mga tagubilin'
+ subject: 'Tapusin ang pagsasaayos ng %{custom_domain}'
ssl_status:
- custom_domain_not_configured: 'Custom domain is not configured'
+ custom_domain_not_configured: 'Hindi nakaayos ang custom domain'
diff --git a/config/locales/tr.yml b/config/locales/tr.yml
index d7b7c7d8b..78feff87a 100644
--- a/config/locales/tr.yml
+++ b/config/locales/tr.yml
@@ -36,7 +36,7 @@ tr:
errors:
account:
reporting_timezone:
- invalid: is not a valid timezone
+ invalid: geçerli bir saat dilimi değil
validations:
presence: boş bırakılmamalı
webhook:
@@ -343,9 +343,9 @@ tr:
copilot_message_required: Mesaj gerekli
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Captain AI''yi etkinleştirmek için planınızı yükseltin'
+ disabled: 'Bu hesap için Captain AI devre dışı.'
+ api_key_missing: 'Captain AI API anahtarı yapılandırılmamış.'
copilot:
using_tool: '%{function_name} aracını kullanıyor'
completed_tool_call: '%{function_name} aracı çağrısı tamamlandı'
@@ -373,6 +373,7 @@ tr:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Başlık veya içerikle makale arayın...
@@ -409,6 +410,10 @@ tr:
title: Sayfa bulunamadı
description: Aradığınız sayfayı bulamadık.
back_to_home: Ana sayfaya dön
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: İsim
diff --git a/config/locales/uk.yml b/config/locales/uk.yml
index 8c952bca2..45b637468 100644
--- a/config/locales/uk.yml
+++ b/config/locales/uk.yml
@@ -343,14 +343,14 @@ uk:
copilot_message_required: Необхідне повідомлення
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Оновіть план, щоб активувати Captain AI'
+ disabled: 'Captain AI вимкнено для цього облікового запису.'
+ api_key_missing: 'API-ключ Captain AI не налаштований.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'Використання інструменту %{function_name}'
+ completed_tool_call: 'Завершено виклик інструменту %{function_name}'
+ invalid_tool_call: 'Недійсний виклик інструменту'
+ tool_not_available: 'Інструмент недоступний'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ uk:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Пошук статті за заголовком або змістом...
@@ -409,6 +410,10 @@ uk:
title: Сторінку не знайдено
description: Ми не змогли знайти сторінку, яку Ви шукали.
back_to_home: Перейти на головну сторінку
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Ім'я
diff --git a/config/locales/ur.yml b/config/locales/ur.yml
index 2c4215cb8..48251a0c6 100644
--- a/config/locales/ur.yml
+++ b/config/locales/ur.yml
@@ -343,14 +343,14 @@ ur:
copilot_message_required: Message is required
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Captain AI فعال کرنے کے لیے اپنا پلان اپ گریڈ کریں'
+ disabled: 'اس اکاؤنٹ کے لیے Captain AI غیر فعال ہے۔'
+ api_key_missing: 'Captain AI API کلید تشکیل نہیں دی گئی۔'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: '%{function_name} ٹول استعمال کر رہا ہے'
+ completed_tool_call: '%{function_name} ٹول کال مکمل ہو گئی'
+ invalid_tool_call: 'غلط ٹول کال'
+ tool_not_available: 'ٹول دستیاب نہیں'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ ur:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Search for article by title or body...
@@ -409,6 +410,10 @@ ur:
title: Page not found
description: We couldn't find the page you were looking for.
back_to_home: Go to home page
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: نام
diff --git a/config/locales/ur_IN.yml b/config/locales/ur_IN.yml
index 1c48a4aac..94d0e54ef 100644
--- a/config/locales/ur_IN.yml
+++ b/config/locales/ur_IN.yml
@@ -343,14 +343,14 @@ ur:
copilot_message_required: Message is required
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Captain AI کو فعال کرنے کے لیے اپنا پلان اپ گریڈ کریں'
+ disabled: 'Captain AI اس اکاؤنٹ کے لیے غیر فعال ہے۔'
+ api_key_missing: 'Captain AI API کلید ترتیب نہیں دی گئی۔'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'ٹول %{function_name} استعمال کیا جا رہا ہے'
+ completed_tool_call: '%{function_name} ٹول کال مکمل ہو گئی'
+ invalid_tool_call: 'غلط ٹول کال'
+ tool_not_available: 'ٹول دستیاب نہیں ہے'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ ur:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Search for article by title or body...
@@ -409,6 +410,10 @@ ur:
title: Page not found
description: We couldn't find the page you were looking for.
back_to_home: Go to home page
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Name
diff --git a/config/locales/vi.yml b/config/locales/vi.yml
index 9139d36d6..3fbb47a63 100644
--- a/config/locales/vi.yml
+++ b/config/locales/vi.yml
@@ -343,14 +343,14 @@ vi:
copilot_message_required: Thông điệp bắt buộc có
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: 'Nâng cấp gói của bạn để bật Captain AI'
+ disabled: 'Captain AI bị vô hiệu hóa cho tài khoản này.'
+ api_key_missing: 'Chưa cấu hình khóa API Captain AI.'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: 'Đang sử dụng công cụ %{function_name}'
+ completed_tool_call: 'Đã hoàn thành cuộc gọi công cụ %{function_name}'
+ invalid_tool_call: 'Cuộc gọi công cụ không hợp lệ'
+ tool_not_available: 'Công cụ không khả dụng'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ vi:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Tìm bài viết theo tiêu đề hoặc nội dung...
@@ -409,6 +410,10 @@ vi:
title: Page not found
description: We couldn't find the page you were looking for.
back_to_home: Go to home page
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: Tên
diff --git a/config/locales/zh_CN.yml b/config/locales/zh_CN.yml
index bcb854c13..00e5a409f 100644
--- a/config/locales/zh_CN.yml
+++ b/config/locales/zh_CN.yml
@@ -343,9 +343,9 @@ zh_CN:
copilot_message_required: 消息是必填项
copilot_error: '请为该收件箱连接一个助手以使用 Copilot'
copilot_limit: '您的 Copilot 积分已用完。您可以从计费部分购买更多积分。'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: '升级您的计划以启用 Captain AI'
+ disabled: '此账户已禁用 Captain AI。'
+ api_key_missing: 'Captain AI API 密钥未配置。'
copilot:
using_tool: '使用工具 %{function_name}'
completed_tool_call: '%{function_name} 工具调用完成'
@@ -373,6 +373,7 @@ zh_CN:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: 搜索文章的标题或正文...
@@ -409,6 +410,10 @@ zh_CN:
title: 页面不存在
description: 我们找不到您想要的页面。
back_to_home: 前往主页
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: 姓名:
diff --git a/config/locales/zh_TW.yml b/config/locales/zh_TW.yml
index 2137c7a1a..5d06650e8 100644
--- a/config/locales/zh_TW.yml
+++ b/config/locales/zh_TW.yml
@@ -343,14 +343,14 @@ zh_TW:
copilot_message_required: 訊息為必填
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: 'Upgrade your plan to enable Captain AI'
- disabled: 'Captain AI is disabled for this account.'
- api_key_missing: 'Captain AI API key is not configured.'
+ upgrade: '升級您的方案以啟用 Captain AI'
+ disabled: '此帳戶已停用 Captain AI。'
+ api_key_missing: 'Captain AI API 金鑰尚未設定。'
copilot:
- using_tool: 'Using tool %{function_name}'
- completed_tool_call: 'Completed %{function_name} tool call'
- invalid_tool_call: 'Invalid tool call'
- tool_not_available: 'Tool not available'
+ using_tool: '正在使用工具 %{function_name}'
+ completed_tool_call: '已完成 %{function_name} 工具呼叫'
+ invalid_tool_call: '無效的工具呼叫'
+ tool_not_available: '工具不可用'
documents:
limit_exceeded: 'Document limit exceeded'
pdf_format_error: 'must be a PDF file'
@@ -373,6 +373,7 @@ zh_TW:
page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
custom_tool:
slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
+ limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
public_portal:
search:
search_placeholder: Search for article by title or body...
@@ -409,6 +410,10 @@ zh_TW:
title: Page not found
description: We couldn't find the page you were looking for.
back_to_home: Go to home page
+ not_active:
+ title: Help Center Unavailable
+ description: Please contact the site administrator for more information.
+ action: If you are the administrator, please upgrade your plan to restore access.
slack_unfurl:
fields:
name: 姓名
From 118270d2e8e55b58714fb6cc0df60453b909134f Mon Sep 17 00:00:00 2001
From: Muhsin Keloth
Date: Mon, 6 Apr 2026 16:45:47 +0400
Subject: [PATCH 24/53] fix(agent-bot): Update listener spec to match signed
webhook arguments (#14006)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Fixes failing `agent_bot_listener_spec.rb` tests for
`conversation_status_changed` events. After #13892 added webhook
signing, `process_webhook_bot_event` passes `:agent_bot_webhook` and
`secret:`/`delivery_id:` kwargs to
`AgentBots::WebhookJob.perform_later`, but two spec expectations were
not updated to match the new call signature.
## What changed
- Updated `perform_later` expectations in `conversation_status_changed`
specs to include the `:agent_bot_webhook` type and `secret` keyword
arguments.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Muhsin <12408980+muhsin-k@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context)
---
spec/listeners/agent_bot_listener_spec.rb | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/spec/listeners/agent_bot_listener_spec.rb b/spec/listeners/agent_bot_listener_spec.rb
index c74ca450c..08deeb6c4 100644
--- a/spec/listeners/agent_bot_listener_spec.rb
+++ b/spec/listeners/agent_bot_listener_spec.rb
@@ -82,7 +82,9 @@ describe AgentBotListener do
create(:agent_bot_inbox, inbox: inbox, agent_bot: agent_bot)
expect(AgentBots::WebhookJob).to receive(:perform_later).with(
agent_bot.outgoing_url,
- hash_including(event: 'conversation_status_changed', changed_attributes: anything)
+ hash_including(event: 'conversation_status_changed', changed_attributes: anything),
+ :agent_bot_webhook,
+ hash_including(secret: agent_bot.secret)
).once
listener.conversation_status_changed(event)
end
@@ -96,7 +98,9 @@ describe AgentBotListener do
it 'sends webhook to the assigned agent bot' do
expect(AgentBots::WebhookJob).to receive(:perform_later).with(
agent_bot.outgoing_url,
- hash_including(event: 'conversation_status_changed', changed_attributes: anything)
+ hash_including(event: 'conversation_status_changed', changed_attributes: anything),
+ :agent_bot_webhook,
+ hash_including(secret: agent_bot.secret)
).once
listener.conversation_status_changed(event)
end
From fbe3560b7a6f63a6c5dd763de701dc1aa3a91a2e Mon Sep 17 00:00:00 2001
From: Aakash Bakhle <48802744+aakashb95@users.noreply.github.com>
Date: Tue, 7 Apr 2026 10:58:29 +0530
Subject: [PATCH 25/53] feat(captain): Add paywall and expose Custom Tools
(#13977)
# Pull Request Template
## Description
Custom tools is now discoverable on all plans
## Type of change
- [x] Bug fix (non-breaking change which fixes an issue)
## How Has This Been Tested?
Before:
After:
## 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
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] 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
- [x] Any dependent changes have been merged and published in downstream
modules
---------
Co-authored-by: Shivam Mishra
---
.../captain/pageComponents/Paywall.vue | 9 +++++-
.../components-next/sidebar/Sidebar.vue | 30 +++++--------------
app/javascript/dashboard/featureFlags.js | 1 +
.../i18n/locale/en/integrations.json | 12 ++++++++
.../dashboard/captain/captain.routes.js | 8 ++++-
.../routes/dashboard/captain/tools/Index.vue | 12 ++++++--
.../settings/components/BasePaywallModal.vue | 15 ++++++++--
7 files changed, 58 insertions(+), 29 deletions(-)
diff --git a/app/javascript/dashboard/components-next/captain/pageComponents/Paywall.vue b/app/javascript/dashboard/components-next/captain/pageComponents/Paywall.vue
index 2b896a905..4da3be357 100644
--- a/app/javascript/dashboard/components-next/captain/pageComponents/Paywall.vue
+++ b/app/javascript/dashboard/components-next/captain/pageComponents/Paywall.vue
@@ -6,6 +6,13 @@ import { useAccount } from 'dashboard/composables/useAccount';
import BasePaywallModal from 'dashboard/routes/dashboard/settings/components/BasePaywallModal.vue';
+defineProps({
+ featurePrefix: {
+ type: String,
+ default: 'CAPTAIN',
+ },
+});
+
const router = useRouter();
const currentUser = useMapGetter('getCurrentUser');
@@ -31,7 +38,7 @@ const openBilling = () => {
>
{
);
});
-const hasCustomTools = computed(() => {
- return (
- isFeatureEnabledonAccount.value(
- accountId.value,
- FEATURE_FLAGS.CAPTAIN_CUSTOM_TOOLS
- ) ||
- isFeatureEnabledonAccount.value(accountId.value, FEATURE_FLAGS.CAPTAIN_V2)
- );
-});
-
const toggleShortcutModalFn = show => {
if (show) {
emit('openKeyShortcutModal');
@@ -374,18 +364,14 @@ const menuItems = computed(() => {
navigationPath: 'captain_assistants_inboxes_index',
}),
},
- ...(hasCustomTools.value
- ? [
- {
- name: 'Tools',
- label: t('SIDEBAR.CAPTAIN_TOOLS'),
- activeOn: ['captain_tools_index'],
- to: accountScopedRoute('captain_assistants_index', {
- navigationPath: 'captain_tools_index',
- }),
- },
- ]
- : []),
+ {
+ name: 'Tools',
+ label: t('SIDEBAR.CAPTAIN_TOOLS'),
+ activeOn: ['captain_tools_index'],
+ to: accountScopedRoute('captain_assistants_index', {
+ navigationPath: 'captain_tools_index',
+ }),
+ },
{
name: 'Settings',
label: t('SIDEBAR.CAPTAIN_SETTINGS'),
diff --git a/app/javascript/dashboard/featureFlags.js b/app/javascript/dashboard/featureFlags.js
index b4aa34f88..0cc67db67 100644
--- a/app/javascript/dashboard/featureFlags.js
+++ b/app/javascript/dashboard/featureFlags.js
@@ -50,6 +50,7 @@ export const FEATURE_FLAGS = {
export const PREMIUM_FEATURES = [
FEATURE_FLAGS.SLA,
FEATURE_FLAGS.CAPTAIN,
+ FEATURE_FLAGS.CAPTAIN_CUSTOM_TOOLS,
FEATURE_FLAGS.CUSTOM_ROLES,
FEATURE_FLAGS.AUDIT_LOGS,
FEATURE_FLAGS.HELP_CENTER,
diff --git a/app/javascript/dashboard/i18n/locale/en/integrations.json b/app/javascript/dashboard/i18n/locale/en/integrations.json
index 1b9caf02f..ad89755e1 100644
--- a/app/javascript/dashboard/i18n/locale/en/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/en/integrations.json
@@ -838,6 +838,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
+ "PAYWALL": {
+ "TITLE": "Upgrade to use tools with Captain",
+ "AVAILABLE_ON": "Captain Tools are only available in Business and Enterprise plans. Please upgrade to Business plan to use the feature.",
+ "UPGRADE_PROMPT": "",
+ "UPGRADE_NOW": "Open billing",
+ "CANCEL_ANYTIME": ""
+ },
+ "ENTERPRISE_PAYWALL": {
+ "AVAILABLE_ON": "Captain Tools are only available in the paid plans.",
+ "UPGRADE_PROMPT": "Please upgrade to a paid plan to use this feature.",
+ "ASK_ADMIN": "Please reach out to your administrator for the upgrade."
+ },
"TEST": {
"BUTTON": "Test connection",
"SUCCESS": "Endpoint returned HTTP {status}",
diff --git a/app/javascript/dashboard/routes/dashboard/captain/captain.routes.js b/app/javascript/dashboard/routes/dashboard/captain/captain.routes.js
index 9fd87ccba..1ab4fa501 100644
--- a/app/javascript/dashboard/routes/dashboard/captain/captain.routes.js
+++ b/app/javascript/dashboard/routes/dashboard/captain/captain.routes.js
@@ -23,6 +23,12 @@ const meta = {
installationTypes: [INSTALLATION_TYPES.CLOUD, INSTALLATION_TYPES.ENTERPRISE],
};
+const metaCustomTools = {
+ permissions: ['administrator', 'agent'],
+ featureFlag: FEATURE_FLAGS.CAPTAIN_CUSTOM_TOOLS,
+ installationTypes: [INSTALLATION_TYPES.CLOUD, INSTALLATION_TYPES.ENTERPRISE],
+};
+
const metaV2 = {
permissions: ['administrator', 'agent'],
featureFlag: FEATURE_FLAGS.CAPTAIN_V2,
@@ -46,7 +52,7 @@ const assistantRoutes = [
path: frontendURL('accounts/:accountId/captain/:assistantId/tools'),
component: CustomToolsIndex,
name: 'captain_tools_index',
- meta,
+ meta: metaCustomTools,
},
{
path: frontendURL('accounts/:accountId/captain/:assistantId/scenarios'),
diff --git a/app/javascript/dashboard/routes/dashboard/captain/tools/Index.vue b/app/javascript/dashboard/routes/dashboard/captain/tools/Index.vue
index ea331dcaf..442c5ae65 100644
--- a/app/javascript/dashboard/routes/dashboard/captain/tools/Index.vue
+++ b/app/javascript/dashboard/routes/dashboard/captain/tools/Index.vue
@@ -5,13 +5,14 @@ import { FEATURE_FLAGS } from 'dashboard/featureFlags';
import { usePolicy } from 'dashboard/composables/usePolicy';
import PageLayout from 'dashboard/components-next/captain/PageLayout.vue';
+import CaptainPaywall from 'dashboard/components-next/captain/pageComponents/Paywall.vue';
import CustomToolsPageEmptyState from 'dashboard/components-next/captain/pageComponents/emptyStates/CustomToolsPageEmptyState.vue';
import CreateCustomToolDialog from 'dashboard/components-next/captain/pageComponents/customTool/CreateCustomToolDialog.vue';
import CustomToolCard from 'dashboard/components-next/captain/pageComponents/customTool/CustomToolCard.vue';
import DeleteDialog from 'dashboard/components-next/captain/pageComponents/DeleteDialog.vue';
const store = useStore();
-const { isFeatureFlagEnabled } = usePolicy();
+const { isFeatureFlagEnabled, shouldShowPaywall } = usePolicy();
const SOFT_LIMIT = 10;
const isV2 = computed(() => isFeatureFlagEnabled(FEATURE_FLAGS.CAPTAIN_V2));
@@ -80,7 +81,9 @@ const onDeleteSuccess = () => {
};
onMounted(() => {
- fetchCustomTools();
+ if (!shouldShowPaywall(FEATURE_FLAGS.CAPTAIN_CUSTOM_TOOLS)) {
+ fetchCustomTools();
+ }
});
@@ -89,6 +92,7 @@ onMounted(() => {
:header-title="$t('CAPTAIN.CUSTOM_TOOLS.HEADER')"
:button-label="$t('CAPTAIN.CUSTOM_TOOLS.ADD_NEW')"
:button-policy="['administrator']"
+ :feature-flag="FEATURE_FLAGS.CAPTAIN_CUSTOM_TOOLS"
:total-count="customToolsMeta.totalCount"
:current-page="customToolsMeta.page"
:show-pagination-footer="!isFetching && !!customTools.length"
@@ -98,6 +102,10 @@ onMounted(() => {
@update:current-page="onPageChange"
@click="openCreateDialog"
>
+
+
+
+
diff --git a/app/javascript/dashboard/routes/dashboard/settings/components/BasePaywallModal.vue b/app/javascript/dashboard/routes/dashboard/settings/components/BasePaywallModal.vue
index 6701d111a..3381a30ed 100644
--- a/app/javascript/dashboard/routes/dashboard/settings/components/BasePaywallModal.vue
+++ b/app/javascript/dashboard/routes/dashboard/settings/components/BasePaywallModal.vue
@@ -1,4 +1,5 @@
@@ -47,11 +53,14 @@ const emit = defineEmits(['upgrade']);
/>
{{ $t(`${featurePrefix}.${i18nKey}.UPGRADE_PROMPT`) }}
-
+
+ {{ $t('GENERAL_SETTINGS.LIMIT_MESSAGES.NON_ADMIN') }}
+
+
{{ $t(`${featurePrefix}.ENTERPRISE_PAYWALL.ASK_ADMIN`) }}
-
+
{{ $t(`${featurePrefix}.PAYWALL.UPGRADE_NOW`) }}
@@ -59,7 +68,7 @@ const emit = defineEmits(['upgrade']);
{{ $t(`${featurePrefix}.PAYWALL.CANCEL_ANYTIME`) }}
-
+
{{ $t(`${featurePrefix}.PAYWALL.UPGRADE_NOW`) }}
From 4f94ad4a75225ae05a5a0550c2d92eb72b03240e Mon Sep 17 00:00:00 2001
From: Shivam Mishra
Date: Tue, 7 Apr 2026 13:45:17 +0530
Subject: [PATCH 26/53] feat: ensure signup verification [UPM-14] (#13858)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Previously, signing up gave immediate access to the app. Now,
unconfirmed users are redirected to a verification page where they can
resend the confirmation email.
- After signup, the user is routed to `/auth/verify-email` instead of
the dashboard
- After login, unconfirmed users are redirected to the verification page
- The dashboard route guard catches unconfirmed users and redirects them
- `active_for_authentication?` is removed from the sessions controller
so unconfirmed users can authenticate — the frontend gates access
instead
- If the user visits the verification page after already confirming,
they're automatically redirected to the dashboard
- No session is issued until the user is verified
Demo
#### Fresh Signup
https://github.com/user-attachments/assets/abb735e5-7c8e-44a2-801c-96d9e4823e51
#### Google Fresh Signup
https://github.com/user-attachments/assets/ab9e389a-a604-4a9d-b492-219e6d94ee3f
#### Create new account from Dashboard
https://github.com/user-attachments/assets/c456690d-1946-4e0b-834b-ad8efcea8369
---------
Co-authored-by: Muhsin Keloth
---
app/controllers/api/v1/accounts_controller.rb | 23 +++-
.../auth/resend_confirmations_controller.rb | 18 +++
.../dashboard/i18n/locale/en/signup.json | 9 +-
app/javascript/v3/api/auth.js | 8 +-
.../auth/signup/components/Signup/Form.vue | 8 +-
.../v3/views/auth/verify-email/Index.vue | 110 ++++++++++++++++++
app/javascript/v3/views/routes.js | 10 ++
config/initializers/rack_attack.rb | 14 ++-
config/routes.rb | 2 +
.../api/v1/accounts_controller_spec.rb | 52 ++++++++-
.../resend_confirmations_controller_spec.rb | 74 ++++++++++++
11 files changed, 316 insertions(+), 12 deletions(-)
create mode 100644 app/controllers/auth/resend_confirmations_controller.rb
create mode 100644 app/javascript/v3/views/auth/verify-email/Index.vue
create mode 100644 spec/controllers/auth/resend_confirmations_controller_spec.rb
diff --git a/app/controllers/api/v1/accounts_controller.rb b/app/controllers/api/v1/accounts_controller.rb
index 3e513a4b2..2d14fe7ca 100644
--- a/app/controllers/api/v1/accounts_controller.rb
+++ b/app/controllers/api/v1/accounts_controller.rb
@@ -31,8 +31,18 @@ class Api::V1::AccountsController < Api::BaseController
user: current_user
).perform
if @user
- send_auth_headers(@user)
- render 'api/v1/accounts/create', format: :json, locals: { resource: @user }
+ # Authenticated users (dashboard "add account") and api_only signups
+ # need the full response with account_id. API-only deployments have no
+ # frontend to handle the email confirmation flow, so they need auth
+ # tokens to proceed.
+ # Unauthenticated web signup returns only the email — no session is
+ # created until the user confirms via the email link.
+ if current_user || api_only_signup?
+ send_auth_headers(@user)
+ render 'api/v1/accounts/create', format: :json, locals: { resource: @user }
+ else
+ render json: { email: @user.email }
+ end
else
render_error_response(CustomExceptions::Account::SignupFailed.new({}))
end
@@ -103,6 +113,15 @@ class Api::V1::AccountsController < Api::BaseController
raise ActionController::RoutingError, 'Not Found' unless GlobalConfigService.account_signup_enabled?
end
+ def api_only_signup?
+ # CW_API_ONLY_SERVER is the canonical flag for API-only deployments.
+ # ENABLE_ACCOUNT_SIGNUP='api_only' is a legacy sentinel for the same purpose.
+ # Read ENABLE_ACCOUNT_SIGNUP raw from InstallationConfig because GlobalConfig.get
+ # typecasts it to boolean, coercing 'api_only' to true.
+ ActiveModel::Type::Boolean.new.cast(ENV.fetch('CW_API_ONLY_SERVER', false)) ||
+ InstallationConfig.find_by(name: 'ENABLE_ACCOUNT_SIGNUP')&.value.to_s == 'api_only'
+ end
+
def validate_captcha
raise ActionController::InvalidAuthenticityToken, 'Invalid Captcha' unless ChatwootCaptcha.new(params[:h_captcha_client_response]).valid?
end
diff --git a/app/controllers/auth/resend_confirmations_controller.rb b/app/controllers/auth/resend_confirmations_controller.rb
new file mode 100644
index 000000000..b2c778c46
--- /dev/null
+++ b/app/controllers/auth/resend_confirmations_controller.rb
@@ -0,0 +1,18 @@
+# Unauthenticated endpoint for resending confirmation emails during signup.
+# This is a standalone controller (not on DeviseOverrides::ConfirmationsController)
+# because OmniAuth middleware intercepts all POST /auth/* routes as provider
+# callbacks, and Devise controller filters cause 307 redirects for custom actions.
+# Inherits from ActionController::API to avoid both issues entirely.
+# Rate-limited by Rack::Attack (IP + email) and gated by hCaptcha.
+class Auth::ResendConfirmationsController < ActionController::API
+ def create
+ return head(:ok) unless ChatwootCaptcha.new(params[:h_captcha_client_response]).valid?
+
+ email = params[:email]
+ return head(:ok) unless email.is_a?(String)
+
+ user = User.from_email(email.strip.downcase)
+ user&.send_confirmation_instructions unless user&.confirmed?
+ head :ok
+ end
+end
diff --git a/app/javascript/dashboard/i18n/locale/en/signup.json b/app/javascript/dashboard/i18n/locale/en/signup.json
index 4a90fd322..238a1f061 100644
--- a/app/javascript/dashboard/i18n/locale/en/signup.json
+++ b/app/javascript/dashboard/i18n/locale/en/signup.json
@@ -45,6 +45,13 @@
"ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
},
"SUBMIT": "Create account",
- "HAVE_AN_ACCOUNT": "Already have an account?"
+ "HAVE_AN_ACCOUNT": "Already have an account?",
+ "VERIFY_EMAIL": {
+ "TITLE": "Check your inbox",
+ "DESCRIPTION": "We sent a verification link to {email}. Click the link to verify your email and get started.",
+ "RESEND": "Resend verification email",
+ "RESEND_SUCCESS": "Verification email sent. Please check your inbox.",
+ "RESEND_ERROR": "Could not send verification email. Please try again."
+ }
}
}
diff --git a/app/javascript/v3/api/auth.js b/app/javascript/v3/api/auth.js
index cccd9468e..c4ef40b1c 100644
--- a/app/javascript/v3/api/auth.js
+++ b/app/javascript/v3/api/auth.js
@@ -57,7 +57,6 @@ export const register = async creds => {
password: creds.password,
h_captcha_client_response: creds.hCaptchaClientResponse,
});
- setAuthCredentials(response);
return response.data;
} catch (error) {
throwErrorMessage(error);
@@ -65,6 +64,13 @@ export const register = async creds => {
return null;
};
+export const resendConfirmation = async ({ email, hCaptchaClientResponse }) => {
+ return wootAPI.post('resend_confirmation', {
+ email,
+ h_captcha_client_response: hCaptchaClientResponse,
+ });
+};
+
export const verifyPasswordToken = async ({ confirmationToken }) => {
try {
const response = await wootAPI.post('auth/confirmation', {
diff --git a/app/javascript/v3/views/auth/signup/components/Signup/Form.vue b/app/javascript/v3/views/auth/signup/components/Signup/Form.vue
index cc6606dad..89d1e58f6 100644
--- a/app/javascript/v3/views/auth/signup/components/Signup/Form.vue
+++ b/app/javascript/v3/views/auth/signup/components/Signup/Form.vue
@@ -4,8 +4,8 @@ import { useVuelidate } from '@vuelidate/core';
import { required, minLength, email } from '@vuelidate/validators';
import { useStore } from 'vuex';
import { useI18n } from 'vue-i18n';
+import { useRouter } from 'vue-router';
import { useAlert } from 'dashboard/composables';
-import { DEFAULT_REDIRECT_URL } from 'dashboard/constants/globals';
import VueHcaptcha from '@hcaptcha/vue3-hcaptcha';
import FormInput from '../../../../../components/Form/Input.vue';
import NextButton from 'dashboard/components-next/button/Button.vue';
@@ -19,6 +19,7 @@ const MIN_PASSWORD_LENGTH = 6;
const store = useStore();
const { t } = useI18n();
+const router = useRouter();
const hCaptcha = ref(null);
const isPasswordFocused = ref(false);
@@ -76,7 +77,10 @@ const performRegistration = async () => {
isSignupInProgress.value = true;
try {
await register(credentials);
- window.location = DEFAULT_REDIRECT_URL;
+ router.push({
+ name: 'auth_verify_email',
+ state: { email: credentials.email },
+ });
} catch (error) {
const errorMessage = error?.message || t('REGISTER.API.ERROR_MESSAGE');
if (globalConfig.value.hCaptchaSiteKey) {
diff --git a/app/javascript/v3/views/auth/verify-email/Index.vue b/app/javascript/v3/views/auth/verify-email/Index.vue
new file mode 100644
index 000000000..5d9ad1233
--- /dev/null
+++ b/app/javascript/v3/views/auth/verify-email/Index.vue
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
+ {{ $t('REGISTER.VERIFY_EMAIL.TITLE') }}
+
+
+ {{ $t('REGISTER.VERIFY_EMAIL.DESCRIPTION', { email }) }}
+
+
+
+
+
+
+
+
+
diff --git a/app/javascript/v3/views/routes.js b/app/javascript/v3/views/routes.js
index 1be56dcb3..11fbcb0f3 100644
--- a/app/javascript/v3/views/routes.js
+++ b/app/javascript/v3/views/routes.js
@@ -5,6 +5,7 @@ import SamlLogin from './login/Saml.vue';
import Signup from './auth/signup/Index.vue';
import ResetPassword from './auth/reset/password/Index.vue';
import Confirmation from './auth/confirmation/Index.vue';
+import VerifyEmail from './auth/verify-email/Index.vue';
import PasswordEdit from './auth/password/Edit.vue';
export default [
@@ -48,6 +49,15 @@ export default [
redirectUrl: route.query.route_url,
}),
},
+ {
+ path: frontendURL('auth/verify-email'),
+ name: 'auth_verify_email',
+ component: VerifyEmail,
+ meta: { ignoreSession: true },
+ props: () => ({
+ email: window.history.state?.email || '',
+ }),
+ },
{
path: frontendURL('auth/password/edit'),
name: 'auth_password_edit',
diff --git a/config/initializers/rack_attack.rb b/config/initializers/rack_attack.rb
index db7be0e43..15e78af9b 100644
--- a/config/initializers/rack_attack.rb
+++ b/config/initializers/rack_attack.rb
@@ -120,8 +120,20 @@ class Rack::Attack
end
end
- ## Resend confirmation throttling
+ ## Resend confirmation throttling (unauthenticated)
throttle('resend_confirmation/ip', limit: 5, period: 30.minutes) do |req|
+ req.ip if req.path_without_extentions == '/resend_confirmation' && req.post?
+ end
+
+ throttle('resend_confirmation/email', limit: 5, period: 1.hour) do |req|
+ if req.path_without_extentions == '/resend_confirmation' && req.post?
+ email = req.params['email'].presence || ActionDispatch::Request.new(req.env).params['email'].presence
+ email.to_s.downcase.gsub(/\s+/, '')
+ end
+ end
+
+ ## Resend confirmation throttling (authenticated)
+ throttle('resend_confirmation_auth/ip', limit: 5, period: 30.minutes) do |req|
req.ip if req.path_without_extentions == '/api/v1/profile/resend_confirmation' && req.post?
end
diff --git a/config/routes.rb b/config/routes.rb
index 3e868d6d8..31453b157 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -8,6 +8,8 @@ Rails.application.routes.draw do
omniauth_callbacks: 'devise_overrides/omniauth_callbacks'
}, via: [:get, :post]
+ post 'resend_confirmation', to: 'auth/resend_confirmations#create'
+
## renders the frontend paths only if its not an api only server
if ActiveModel::Type::Boolean.new.cast(ENV.fetch('CW_API_ONLY_SERVER', false))
root to: 'api#index'
diff --git a/spec/controllers/api/v1/accounts_controller_spec.rb b/spec/controllers/api/v1/accounts_controller_spec.rb
index d76f22187..d93503418 100644
--- a/spec/controllers/api/v1/accounts_controller_spec.rb
+++ b/spec/controllers/api/v1/accounts_controller_spec.rb
@@ -26,8 +26,8 @@ RSpec.describe 'Accounts API', type: :request do
expect(AccountBuilder).to have_received(:new).with(params.except(:password).merge(user_password: params[:password]))
expect(account_builder).to have_received(:perform)
- expect(response.headers.keys).to include('access-token', 'token-type', 'client', 'expiry', 'uid')
- expect(response.body).to include('en')
+ expect(response.headers.keys).not_to include('access-token', 'token-type', 'client', 'expiry', 'uid')
+ expect(response.parsed_body['email']).to eq(email)
end
end
@@ -46,8 +46,8 @@ RSpec.describe 'Accounts API', type: :request do
as: :json
expect(ChatwootCaptcha).to have_received(:new).with('123')
- expect(response.headers.keys).to include('access-token', 'token-type', 'client', 'expiry', 'uid')
- expect(response.body).to include('en')
+ expect(response.headers.keys).not_to include('access-token', 'token-type', 'client', 'expiry', 'uid')
+ expect(response.parsed_body['email']).to eq(email)
end
end
@@ -68,6 +68,23 @@ RSpec.describe 'Accounts API', type: :request do
end
end
+ context 'when an authenticated user creates a second account' do
+ let(:existing_user) { create(:user, password: 'Password1!') }
+
+ it 'returns the full response with account_id' do
+ with_modified_env ENABLE_ACCOUNT_SIGNUP: 'true' do
+ post api_v1_accounts_url,
+ params: { account_name: 'Second Account', email: existing_user.email,
+ user_full_name: existing_user.name, password: 'Password1!' },
+ headers: existing_user.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:success)
+ expect(response.parsed_body.dig('data', 'account_id')).to be_present
+ end
+ end
+ end
+
context 'when ENABLE_ACCOUNT_SIGNUP env variable is set to false' do
it 'responds 404 on requests' do
params = { account_name: 'test', email: email, user_full_name: user_full_name }
@@ -105,7 +122,17 @@ RSpec.describe 'Accounts API', type: :request do
end
context 'when ENABLE_ACCOUNT_SIGNUP env variable is set to api_only' do
- it 'does not respond 404 on requests' do
+ before do
+ GlobalConfig.clear_cache
+ InstallationConfig.where(name: 'ENABLE_ACCOUNT_SIGNUP').delete_all
+ end
+
+ after do
+ InstallationConfig.where(name: 'ENABLE_ACCOUNT_SIGNUP').delete_all
+ GlobalConfig.clear_cache
+ end
+
+ it 'returns auth headers and full response for api_only signup' do
params = { account_name: 'test', email: email, user_full_name: user_full_name, password: 'Password1!' }
with_modified_env ENABLE_ACCOUNT_SIGNUP: 'api_only' do
post api_v1_accounts_url,
@@ -113,6 +140,21 @@ RSpec.describe 'Accounts API', type: :request do
as: :json
expect(response).to have_http_status(:success)
+ expect(response.headers.keys).to include('access-token', 'token-type', 'client', 'expiry', 'uid')
+ end
+ end
+ end
+
+ context 'when CW_API_ONLY_SERVER is true' do
+ it 'returns auth headers and full response' do
+ params = { account_name: 'test', email: email, user_full_name: user_full_name, password: 'Password1!' }
+ with_modified_env ENABLE_ACCOUNT_SIGNUP: 'true', CW_API_ONLY_SERVER: 'true' do
+ post api_v1_accounts_url,
+ params: params,
+ as: :json
+
+ expect(response).to have_http_status(:success)
+ expect(response.headers.keys).to include('access-token', 'token-type', 'client', 'expiry', 'uid')
end
end
end
diff --git a/spec/controllers/auth/resend_confirmations_controller_spec.rb b/spec/controllers/auth/resend_confirmations_controller_spec.rb
new file mode 100644
index 000000000..f7df9c128
--- /dev/null
+++ b/spec/controllers/auth/resend_confirmations_controller_spec.rb
@@ -0,0 +1,74 @@
+require 'rails_helper'
+
+RSpec.describe 'Resend Confirmations API', type: :request do
+ describe 'POST /resend_confirmation' do
+ let(:email) { 'unconfirmed@example.com' }
+
+ context 'when the user exists and is unconfirmed' do
+ before { create(:user, email: email, skip_confirmation: false) }
+
+ it 'sends confirmation instructions and returns 200' do
+ expect do
+ post '/resend_confirmation', params: { email: email }, as: :json
+ end.to have_enqueued_mail(Devise::Mailer, :confirmation_instructions)
+
+ expect(response).to have_http_status(:ok)
+ end
+ end
+
+ context 'when the user exists and is already confirmed' do
+ before { create(:user, email: email) }
+
+ it 'returns 200 without sending confirmation' do
+ expect do
+ post '/resend_confirmation', params: { email: email }, as: :json
+ end.not_to have_enqueued_mail(Devise::Mailer, :confirmation_instructions)
+
+ expect(response).to have_http_status(:ok)
+ end
+ end
+
+ context 'when the email does not exist' do
+ it 'returns 200 without leaking email existence' do
+ post '/resend_confirmation', params: { email: 'nobody@example.com' }, as: :json
+
+ expect(response).to have_http_status(:ok)
+ end
+ end
+
+ context 'when hCaptcha is configured' do
+ before do
+ create(:user, email: email, skip_confirmation: false)
+ allow(ChatwootCaptcha).to receive(:new).and_return(captcha)
+ end
+
+ context 'with a valid captcha response' do
+ let(:captcha) { instance_double(ChatwootCaptcha, valid?: true) }
+
+ it 'sends confirmation instructions' do
+ expect do
+ post '/resend_confirmation',
+ params: { email: email, h_captcha_client_response: 'valid-token' },
+ as: :json
+ end.to have_enqueued_mail(Devise::Mailer, :confirmation_instructions)
+
+ expect(response).to have_http_status(:ok)
+ end
+ end
+
+ context 'with an invalid captcha response' do
+ let(:captcha) { instance_double(ChatwootCaptcha, valid?: false) }
+
+ it 'returns 200 without sending confirmation' do
+ expect do
+ post '/resend_confirmation',
+ params: { email: email, h_captcha_client_response: 'bad-token' },
+ as: :json
+ end.not_to have_enqueued_mail(Devise::Mailer, :confirmation_instructions)
+
+ expect(response).to have_http_status(:ok)
+ end
+ end
+ end
+ end
+end
From 871f2f4d56516d4fc07b6a242dab60872673995b Mon Sep 17 00:00:00 2001
From: Shivam Mishra
Date: Wed, 8 Apr 2026 10:47:54 +0530
Subject: [PATCH 27/53] fix: harden fetching on upload endpoint (#14012)
---
Gemfile | 2 +
Gemfile.lock | 2 +
.../api/v1/accounts/upload_controller.rb | 42 +--
config/locales/en.yml | 8 +
lib/safe_fetch.rb | 98 +++++++
.../api/v1/upload_controller_spec.rb | 113 +++++++-
spec/lib/safe_fetch_spec.rb | 258 ++++++++++++++++++
7 files changed, 494 insertions(+), 29 deletions(-)
create mode 100644 lib/safe_fetch.rb
create mode 100644 spec/lib/safe_fetch_spec.rb
diff --git a/Gemfile b/Gemfile
index 01c7a9f83..a5068e765 100644
--- a/Gemfile
+++ b/Gemfile
@@ -40,6 +40,8 @@ gem 'json_refs'
gem 'rack-attack', '>= 6.7.0'
# a utility tool for streaming, flexible and safe downloading of remote files
gem 'down'
+# SSRF-safe URL fetching
+gem 'ssrf_filter', '~> 1.5'
# authentication type to fetch and send mail over oauth2.0
gem 'gmail_xoauth'
# Lock net-smtp to 0.3.4 to avoid issues with gmail_xoauth2
diff --git a/Gemfile.lock b/Gemfile.lock
index 74ea4d82d..b77e5880f 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -942,6 +942,7 @@ GEM
activesupport (>= 5.2)
sprockets (>= 3.0.0)
squasher (0.7.2)
+ ssrf_filter (1.5.0)
stackprof (0.2.25)
statsd-ruby (1.5.0)
stripe (18.0.1)
@@ -1158,6 +1159,7 @@ DEPENDENCIES
spring
spring-watcher-listen
squasher
+ ssrf_filter (~> 1.5)
stackprof
stripe (~> 18.0)
telephone_number
diff --git a/app/controllers/api/v1/accounts/upload_controller.rb b/app/controllers/api/v1/accounts/upload_controller.rb
index 479d8ae1b..bf20bc6ff 100644
--- a/app/controllers/api/v1/accounts/upload_controller.rb
+++ b/app/controllers/api/v1/accounts/upload_controller.rb
@@ -5,7 +5,7 @@ class Api::V1::Accounts::UploadController < Api::V1::Accounts::BaseController
elsif params[:external_url].present?
create_from_url
else
- render_error('No file or URL provided', :unprocessable_entity)
+ render_error(I18n.t('errors.upload.missing_input'), :unprocessable_entity)
end
render_success(result) if result.is_a?(ActiveStorage::Blob)
@@ -19,35 +19,21 @@ class Api::V1::Accounts::UploadController < Api::V1::Accounts::BaseController
end
def create_from_url
- uri = parse_uri(params[:external_url])
- return if performed?
-
- fetch_and_process_file_from_uri(uri)
- end
-
- def parse_uri(url)
- uri = URI.parse(url)
- validate_uri(uri)
- uri
- rescue URI::InvalidURIError, SocketError
- render_error('Invalid URL provided', :unprocessable_entity)
- nil
- end
-
- def validate_uri(uri)
- raise URI::InvalidURIError unless uri.is_a?(URI::HTTP) || uri.is_a?(URI::HTTPS)
- end
-
- def fetch_and_process_file_from_uri(uri)
- uri.open do |file|
- create_and_save_blob(file, File.basename(uri.path), file.content_type)
+ SafeFetch.fetch(params[:external_url].to_s) do |result|
+ create_and_save_blob(result.tempfile, result.filename, result.content_type)
end
- rescue OpenURI::HTTPError => e
- render_error("Failed to fetch file from URL: #{e.message}", :unprocessable_entity)
- rescue SocketError
- render_error('Invalid URL provided', :unprocessable_entity)
+ rescue SafeFetch::HttpError => e
+ render_error(I18n.t('errors.upload.fetch_failed_with_message', message: e.message), :unprocessable_entity)
+ rescue SafeFetch::FetchError
+ render_error(I18n.t('errors.upload.fetch_failed'), :unprocessable_entity)
+ rescue SafeFetch::FileTooLargeError
+ render_error(I18n.t('errors.upload.file_too_large'), :unprocessable_entity)
+ rescue SafeFetch::UnsupportedContentTypeError
+ render_error(I18n.t('errors.upload.unsupported_content_type'), :unprocessable_entity)
+ rescue SafeFetch::Error
+ render_error(I18n.t('errors.upload.invalid_url'), :unprocessable_entity)
rescue StandardError
- render_error('An unexpected error occurred', :internal_server_error)
+ render_error(I18n.t('errors.upload.unexpected'), :internal_server_error)
end
def create_and_save_blob(io, filename, content_type)
diff --git a/config/locales/en.yml b/config/locales/en.yml
index e6308c43c..1cb3c4d12 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -66,6 +66,14 @@ en:
not_found: Assignment policy not found
attachments:
invalid: Invalid attachment
+ upload:
+ missing_input: 'No file or URL provided'
+ invalid_url: 'Invalid URL provided'
+ fetch_failed: 'Failed to fetch file from URL'
+ fetch_failed_with_message: 'Failed to fetch file from URL: %{message}'
+ file_too_large: 'File exceeds the maximum allowed size'
+ unsupported_content_type: 'File type not supported (only images and videos are allowed)'
+ unexpected: 'An unexpected error occurred'
saml:
feature_not_enabled: SAML feature not enabled for this account
sso_not_enabled: SAML SSO is not enabled for this installation
diff --git a/lib/safe_fetch.rb b/lib/safe_fetch.rb
new file mode 100644
index 000000000..e6635c9c3
--- /dev/null
+++ b/lib/safe_fetch.rb
@@ -0,0 +1,98 @@
+require 'ssrf_filter'
+
+module SafeFetch
+ DEFAULT_ALLOWED_CONTENT_TYPE_PREFIXES = %w[image/ video/].freeze
+ DEFAULT_OPEN_TIMEOUT = 2
+ DEFAULT_READ_TIMEOUT = 20
+ DEFAULT_MAX_BYTES_FALLBACK_MB = 40
+
+ Result = Data.define(:tempfile, :filename, :content_type)
+
+ class Error < StandardError; end
+ class InvalidUrlError < Error; end
+ class UnsafeUrlError < Error; end
+ class FetchError < Error; end
+ class HttpError < Error; end
+ class FileTooLargeError < Error; end
+ class UnsupportedContentTypeError < Error; end
+
+ def self.fetch(url,
+ max_bytes: nil,
+ allowed_content_type_prefixes: DEFAULT_ALLOWED_CONTENT_TYPE_PREFIXES)
+ raise ArgumentError, 'block required' unless block_given?
+
+ effective_max_bytes = max_bytes || default_max_bytes
+ uri = parse_and_validate_url!(url)
+ filename = filename_for(uri)
+ tempfile = Tempfile.new('chatwoot-safe-fetch', binmode: true)
+
+ response = stream_to_tempfile(url, tempfile, effective_max_bytes, allowed_content_type_prefixes)
+ raise HttpError, "#{response.code} #{response.message}" unless response.is_a?(Net::HTTPSuccess)
+
+ tempfile.rewind
+ yield Result.new(tempfile: tempfile, filename: filename, content_type: response['content-type'])
+ rescue SsrfFilter::InvalidUriScheme, URI::InvalidURIError => e
+ raise InvalidUrlError, e.message
+ rescue SsrfFilter::Error, Resolv::ResolvError => e
+ raise UnsafeUrlError, e.message
+ rescue Net::OpenTimeout, Net::ReadTimeout, SocketError, OpenSSL::SSL::SSLError => e
+ raise FetchError, e.message
+ ensure
+ tempfile&.close!
+ end
+
+ class << self
+ private
+
+ def stream_to_tempfile(url, tempfile, max_bytes, allowed_content_type_prefixes)
+ response = nil
+ bytes_written = 0
+
+ SsrfFilter.get(
+ url,
+ http_options: { open_timeout: DEFAULT_OPEN_TIMEOUT, read_timeout: DEFAULT_READ_TIMEOUT }
+ ) do |res|
+ response = res
+ next unless res.is_a?(Net::HTTPSuccess)
+
+ unless allowed_content_type?(res['content-type'], allowed_content_type_prefixes)
+ raise UnsupportedContentTypeError, "content-type not allowed: #{res['content-type']}"
+ end
+
+ res.read_body do |chunk|
+ bytes_written += chunk.bytesize
+ raise FileTooLargeError, "exceeded #{max_bytes} bytes" if bytes_written > max_bytes
+
+ tempfile.write(chunk)
+ end
+ end
+
+ response
+ end
+
+ def filename_for(uri)
+ File.basename(uri.path).presence || "download-#{Time.current.to_i}-#{SecureRandom.hex(4)}"
+ end
+
+ def default_max_bytes
+ limit_mb = GlobalConfigService.load('MAXIMUM_FILE_UPLOAD_SIZE', DEFAULT_MAX_BYTES_FALLBACK_MB).to_i
+ limit_mb = DEFAULT_MAX_BYTES_FALLBACK_MB if limit_mb <= 0
+ limit_mb.megabytes
+ end
+
+ def parse_and_validate_url!(url)
+ uri = URI.parse(url)
+ raise InvalidUrlError, 'scheme must be http or https' unless uri.is_a?(URI::HTTP) || uri.is_a?(URI::HTTPS)
+ raise InvalidUrlError, 'missing host' if uri.host.blank?
+
+ uri
+ end
+
+ def allowed_content_type?(value, prefixes)
+ mime = value.to_s.split(';').first&.strip&.downcase
+ return false if mime.blank?
+
+ prefixes.any? { |prefix| mime.start_with?(prefix) }
+ end
+ end
+end
diff --git a/spec/controllers/api/v1/upload_controller_spec.rb b/spec/controllers/api/v1/upload_controller_spec.rb
index 93ef28dd8..2878c2a5e 100644
--- a/spec/controllers/api/v1/upload_controller_spec.rb
+++ b/spec/controllers/api/v1/upload_controller_spec.rb
@@ -39,6 +39,11 @@ RSpec.describe 'Api::V1::Accounts::UploadController', type: :request do
let(:valid_external_url) { 'http://example.com/image.jpg' }
before do
+ allow(Resolv).to receive(:getaddresses).and_call_original
+ allow(Resolv).to receive(:getaddresses).with('example.com').and_return(['93.184.216.34'])
+ allow(Resolv).to receive(:getaddresses).with('error.example.com').and_return(['93.184.216.34'])
+ allow(Resolv).to receive(:getaddresses).with('nonexistent.example.com').and_return(['93.184.216.34'])
+
stub_request(:get, valid_external_url)
.to_return(status: 200, body: File.new(Rails.root.join('spec/assets/avatar.png')), headers: { 'Content-Type' => 'image/png' })
end
@@ -82,7 +87,7 @@ RSpec.describe 'Api::V1::Accounts::UploadController', type: :request do
params: { external_url: 'http://nonexistent.example.com' }
expect(response).to have_http_status(:unprocessable_entity)
- expect(response.parsed_body['error']).to eq('Invalid URL provided')
+ expect(response.parsed_body['error']).to eq('Failed to fetch file from URL')
end
it 'handles HTTP errors' do
@@ -96,6 +101,112 @@ RSpec.describe 'Api::V1::Accounts::UploadController', type: :request do
expect(response).to have_http_status(:unprocessable_entity)
expect(response.parsed_body['error']).to start_with('Failed to fetch file from URL')
end
+
+ it 'rejects oversized responses with a file-size message' do
+ stub_request(:get, valid_external_url)
+ .to_return(status: 200,
+ body: 'x' * (41 * 1024 * 1024),
+ headers: { 'Content-Type' => 'image/png' })
+
+ post upload_url,
+ headers: user.create_new_auth_token,
+ params: { external_url: valid_external_url }
+
+ expect(response).to have_http_status(:unprocessable_entity)
+ expect(response.parsed_body['error']).to eq('File exceeds the maximum allowed size')
+ end
+
+ it 'rejects unsupported content types with a file-type message' do
+ stub_request(:get, valid_external_url)
+ .to_return(status: 200,
+ body: '',
+ headers: { 'Content-Type' => 'text/html' })
+
+ post upload_url,
+ headers: user.create_new_auth_token,
+ params: { external_url: valid_external_url }
+
+ expect(response).to have_http_status(:unprocessable_entity)
+ expect(response.parsed_body['error']).to eq('File type not supported (only images and videos are allowed)')
+ end
+
+ context 'with SSRF attack vectors' do
+ it 'blocks requests to private IP ranges (10.x.x.x)' do
+ post upload_url,
+ headers: user.create_new_auth_token,
+ params: { external_url: 'http://10.0.0.1/secret' }
+
+ expect(response).to have_http_status(:unprocessable_entity)
+ expect(response.parsed_body['error']).to eq('Invalid URL provided')
+ end
+
+ it 'blocks requests to private IP ranges (172.16.x.x)' do
+ post upload_url,
+ headers: user.create_new_auth_token,
+ params: { external_url: 'http://172.16.0.1/secret' }
+
+ expect(response).to have_http_status(:unprocessable_entity)
+ expect(response.parsed_body['error']).to eq('Invalid URL provided')
+ end
+
+ it 'blocks requests to private IP ranges (192.168.x.x)' do
+ post upload_url,
+ headers: user.create_new_auth_token,
+ params: { external_url: 'http://192.168.1.1/secret' }
+
+ expect(response).to have_http_status(:unprocessable_entity)
+ expect(response.parsed_body['error']).to eq('Invalid URL provided')
+ end
+
+ it 'blocks requests to loopback addresses' do
+ post upload_url,
+ headers: user.create_new_auth_token,
+ params: { external_url: 'http://127.0.0.1/secret' }
+
+ expect(response).to have_http_status(:unprocessable_entity)
+ expect(response.parsed_body['error']).to eq('Invalid URL provided')
+ end
+
+ it 'blocks requests to AWS metadata service (169.254.169.254)' do
+ post upload_url,
+ headers: user.create_new_auth_token,
+ params: { external_url: 'http://169.254.169.254/latest/meta-data/iam/security-credentials/' }
+
+ expect(response).to have_http_status(:unprocessable_entity)
+ expect(response.parsed_body['error']).to eq('Invalid URL provided')
+ end
+
+ it 'blocks requests to localhost' do
+ post upload_url,
+ headers: user.create_new_auth_token,
+ params: { external_url: 'http://localhost/secret' }
+
+ expect(response).to have_http_status(:unprocessable_entity)
+ expect(response.parsed_body['error']).to eq('Invalid URL provided')
+ end
+
+ it 'blocks requests to .local domains' do
+ allow(Resolv).to receive(:getaddresses).with('server.local').and_return(['192.168.1.100'])
+
+ post upload_url,
+ headers: user.create_new_auth_token,
+ params: { external_url: 'http://server.local/secret' }
+
+ expect(response).to have_http_status(:unprocessable_entity)
+ expect(response.parsed_body['error']).to eq('Invalid URL provided')
+ end
+
+ it 'blocks DNS rebinding attacks (hostname resolving to private IP)' do
+ allow(Resolv).to receive(:getaddresses).with('evil.attacker.com').and_return(['10.0.0.1'])
+
+ post upload_url,
+ headers: user.create_new_auth_token,
+ params: { external_url: 'http://evil.attacker.com/secret' }
+
+ expect(response).to have_http_status(:unprocessable_entity)
+ expect(response.parsed_body['error']).to eq('Invalid URL provided')
+ end
+ end
end
it 'returns an error when no file or URL is provided' do
diff --git a/spec/lib/safe_fetch_spec.rb b/spec/lib/safe_fetch_spec.rb
new file mode 100644
index 000000000..70f9b05de
--- /dev/null
+++ b/spec/lib/safe_fetch_spec.rb
@@ -0,0 +1,258 @@
+require 'rails_helper'
+
+# `SafeFetch.fetch` is a custom method that requires a block (it yields a Result);
+# it is NOT `Hash#fetch`, so RuboCop's autocorrect to `fetch(url, nil)` would break the API.
+# rubocop:disable Style/RedundantFetchBlock
+RSpec.describe SafeFetch do
+ let(:url) { 'http://example.com/image.png' }
+
+ before do
+ allow(Resolv).to receive(:getaddresses).and_call_original
+ allow(Resolv).to receive(:getaddresses).with('example.com').and_return(['93.184.216.34'])
+ end
+
+ describe '.fetch' do
+ context 'with a valid public URL serving an image' do
+ before do
+ stub_request(:get, url).to_return(
+ status: 200,
+ body: File.new(Rails.root.join('spec/assets/avatar.png')),
+ headers: { 'Content-Type' => 'image/png' }
+ )
+ end
+
+ it 'yields a Result with tempfile, filename, and content_type' do
+ described_class.fetch(url) do |result|
+ expect(result.tempfile).to be_a(Tempfile)
+ expect(result.filename).to eq('image.png')
+ expect(result.content_type).to eq('image/png')
+ expect(result.tempfile.size).to be > 0
+ end
+ end
+
+ it 'closes the tempfile after the block returns' do
+ captured = nil
+ described_class.fetch(url) { |result| captured = result.tempfile }
+ expect(captured.closed?).to be true
+ end
+
+ it 'closes the tempfile even when the block raises' do
+ captured = nil
+ expect do
+ described_class.fetch(url) do |result|
+ captured = result.tempfile
+ raise 'boom'
+ end
+ end.to raise_error('boom')
+ expect(captured.closed?).to be true
+ end
+
+ it 'defaults the filename to a unique "download--" when the URL has no path' do
+ bare_url = 'http://example.com'
+ stub_request(:get, bare_url).to_return(
+ status: 200,
+ body: File.new(Rails.root.join('spec/assets/avatar.png')),
+ headers: { 'Content-Type' => 'image/png' }
+ )
+
+ described_class.fetch(bare_url) do |result|
+ expect(result.filename).to match(/\Adownload-\d+-[a-f0-9]{8}\z/)
+ end
+ end
+
+ it 'requires a block' do
+ expect { described_class.fetch(url) }.to raise_error(ArgumentError, /block required/)
+ end
+ end
+
+ context 'with URL validation' do
+ it 'raises InvalidUrlError for javascript: URLs' do
+ expect { described_class.fetch('javascript:alert(1)') { nil } }
+ .to raise_error(SafeFetch::InvalidUrlError)
+ end
+
+ it 'raises InvalidUrlError for mailto: URLs' do
+ expect { described_class.fetch('mailto:test@example.com') { nil } }
+ .to raise_error(SafeFetch::InvalidUrlError)
+ end
+
+ it 'raises InvalidUrlError for data: URLs' do
+ expect { described_class.fetch('data:text/html,') { nil } }
+ .to raise_error(SafeFetch::InvalidUrlError)
+ end
+
+ it 'raises InvalidUrlError for ftp: URLs' do
+ expect { described_class.fetch('ftp://example.com/file') { nil } }
+ .to raise_error(SafeFetch::InvalidUrlError)
+ end
+
+ it 'raises InvalidUrlError for malformed URLs' do
+ expect { described_class.fetch('not_a_url') { nil } }
+ .to raise_error(SafeFetch::InvalidUrlError)
+ end
+
+ it 'raises InvalidUrlError when host is missing' do
+ expect { described_class.fetch('http:///path') { nil } }
+ .to raise_error(SafeFetch::InvalidUrlError, /missing host/)
+ end
+ end
+
+ context 'with SSRF protection (integration with ssrf_filter)' do
+ it 'raises UnsafeUrlError for private IP literals (10.x.x.x)' do
+ expect { described_class.fetch('http://10.0.0.1/secret') { nil } }
+ .to raise_error(SafeFetch::UnsafeUrlError)
+ end
+
+ it 'raises UnsafeUrlError for loopback addresses' do
+ expect { described_class.fetch('http://127.0.0.1/secret') { nil } }
+ .to raise_error(SafeFetch::UnsafeUrlError)
+ end
+
+ it 'raises UnsafeUrlError for AWS metadata IP (169.254.169.254)' do
+ expect { described_class.fetch('http://169.254.169.254/latest/meta-data/') { nil } }
+ .to raise_error(SafeFetch::UnsafeUrlError)
+ end
+
+ it 'raises UnsafeUrlError when hostname resolves to a private IP (DNS rebinding)' do
+ allow(Resolv).to receive(:getaddresses).with('evil.example.com').and_return(['10.0.0.1'])
+ expect { described_class.fetch('http://evil.example.com/secret') { nil } }
+ .to raise_error(SafeFetch::UnsafeUrlError)
+ end
+ end
+
+ context 'with content-type allowlist' do
+ it 'rejects text/html responses' do
+ stub_request(:get, url).to_return(
+ status: 200,
+ body: '',
+ headers: { 'Content-Type' => 'text/html' }
+ )
+
+ expect { described_class.fetch(url) { nil } }
+ .to raise_error(SafeFetch::UnsupportedContentTypeError)
+ end
+
+ it 'rejects application/octet-stream responses' do
+ stub_request(:get, url).to_return(
+ status: 200,
+ body: 'x',
+ headers: { 'Content-Type' => 'application/octet-stream' }
+ )
+
+ expect { described_class.fetch(url) { nil } }
+ .to raise_error(SafeFetch::UnsupportedContentTypeError)
+ end
+
+ it 'allows video/mp4 responses' do
+ stub_request(:get, url).to_return(
+ status: 200,
+ body: File.new(Rails.root.join('spec/assets/avatar.png')),
+ headers: { 'Content-Type' => 'video/mp4' }
+ )
+
+ expect { described_class.fetch(url) { nil } }.not_to raise_error
+ end
+
+ it 'strips charset/boundary parameters before comparing' do
+ stub_request(:get, url).to_return(
+ status: 200,
+ body: 'x',
+ headers: { 'Content-Type' => 'image/png; charset=binary' }
+ )
+
+ expect { described_class.fetch(url) { nil } }.not_to raise_error
+ end
+
+ it 'rejects when the content-type header is missing' do
+ stub_request(:get, url).to_return(status: 200, body: 'x', headers: {})
+
+ expect { described_class.fetch(url) { nil } }
+ .to raise_error(SafeFetch::UnsupportedContentTypeError)
+ end
+ end
+
+ context 'with body size cap' do
+ it 'honours a custom max_bytes argument' do
+ stub_request(:get, url).to_return(
+ status: 200,
+ body: 'xxxxx',
+ headers: { 'Content-Type' => 'image/png' }
+ )
+
+ expect { described_class.fetch(url, max_bytes: 2) { nil } }
+ .to raise_error(SafeFetch::FileTooLargeError)
+ end
+
+ it 'reads the default cap from GlobalConfigService MAXIMUM_FILE_UPLOAD_SIZE (matching Attachment#validate_file_size)' do
+ allow(GlobalConfigService).to receive(:load).and_call_original
+ allow(GlobalConfigService).to receive(:load).with('MAXIMUM_FILE_UPLOAD_SIZE', 40).and_return('1')
+
+ oversize = 'x' * (1.megabyte + 1)
+ stub_request(:get, url).to_return(
+ status: 200,
+ body: oversize,
+ headers: { 'Content-Type' => 'image/png' }
+ )
+
+ expect { described_class.fetch(url) { nil } }
+ .to raise_error(SafeFetch::FileTooLargeError)
+ end
+
+ it 'falls back to 40 MB when GlobalConfigService returns a non-positive value' do
+ allow(GlobalConfigService).to receive(:load).and_call_original
+ allow(GlobalConfigService).to receive(:load).with('MAXIMUM_FILE_UPLOAD_SIZE', 40).and_return('-10')
+
+ # 1 MB body should pass under the 40 MB fallback
+ stub_request(:get, url).to_return(
+ status: 200,
+ body: 'x' * 1.megabyte,
+ headers: { 'Content-Type' => 'image/png' }
+ )
+
+ expect { described_class.fetch(url) { nil } }.not_to raise_error
+ end
+
+ it 'allows uploads between the old hardcoded 10 MB and the configured limit (regression check)' do
+ # Default config is 40 MB; a 15 MB upload must succeed.
+ # This is the exact regression scenario: with the old hardcoded 10 MB cap,
+ # this would have failed even though direct file uploads of the same size succeed.
+ allow(GlobalConfigService).to receive(:load).and_call_original
+ allow(GlobalConfigService).to receive(:load).with('MAXIMUM_FILE_UPLOAD_SIZE', 40).and_return('40')
+
+ stub_request(:get, url).to_return(
+ status: 200,
+ body: 'x' * (15 * 1024 * 1024),
+ headers: { 'Content-Type' => 'image/png' }
+ )
+
+ expect { described_class.fetch(url) { nil } }.not_to raise_error
+ end
+ end
+
+ context 'with network failures' do
+ it 'maps Net::ReadTimeout to FetchError' do
+ stub_request(:get, url).to_raise(Net::ReadTimeout)
+
+ expect { described_class.fetch(url) { nil } }
+ .to raise_error(SafeFetch::FetchError)
+ end
+
+ it 'maps SocketError to FetchError' do
+ stub_request(:get, url).to_raise(SocketError.new('connection refused'))
+
+ expect { described_class.fetch(url) { nil } }
+ .to raise_error(SafeFetch::FetchError)
+ end
+ end
+
+ context 'with non-2xx upstream responses' do
+ it 'raises HttpError with the status code in the message' do
+ stub_request(:get, url).to_return(status: 404, body: '', headers: {})
+
+ expect { described_class.fetch(url) { nil } }
+ .to raise_error(SafeFetch::HttpError, /404/)
+ end
+ end
+ end
+end
+# rubocop:enable Style/RedundantFetchBlock
From e5107604a051d41839a1667431275221b0d236c6 Mon Sep 17 00:00:00 2001
From: Shivam Mishra
Date: Wed, 8 Apr 2026 11:16:52 +0530
Subject: [PATCH 28/53] feat: account enrichment using context.dev [UPM-27]
(#13978)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
## Account branding enrichment during signup
This PR does the following
### Replace Firecrawl with Context.dev
Switches the enterprise brand lookup from Firecrawl to Context.dev for
better data quality, built-in caching, and automatic filtering of
free/disposable email providers. The service interface changes from URL
to email input to match Context.dev's email endpoint. OSS still falls
back to basic HTML scraping with a normalized output shape across both
paths.
The enterprise path intentionally does not fall back to HTML scraping on
failure — speed matters more than completeness. We want the user on the
editable onboarding form fast, and a slow fallback scrape is worse than
letting them fill it in.
Requires `CONTEXT_DEV_API_KEY` in Super Admin → App Config. Without it,
falls back to OSS HTML scraping.
### Add job to enrich account details
After account creation, `Account::BrandingEnrichmentJob` looks up the
signup email and pre-fills the account name, colors, logos, social
links, and industry into `custom_attributes['brand_info']`.
The job signals completion via a short-lived Redis key (30s TTL) + an
ActionCable broadcast (`account.enrichment_completed`). The Redis key
lets the frontend distinguish "still running" from "finished with no
results."
---
app/controllers/api/v1/accounts_controller.rb | 11 ++
app/jobs/account/branding_enrichment_job.rb | 32 +++
.../{concerns => }/social_link_parser.rb | 0
app/services/website_branding_service.rb | 84 ++++----
config/installation_config.yml | 7 +
.../super_admin/app_configs_controller.rb | 6 +-
.../enterprise/website_branding_service.rb | 123 ++++--------
lib/redis/redis_keys.rb | 3 +
.../website_branding_service_spec.rb | 187 +++++++-----------
.../services/website_branding_service_spec.rb | 85 ++++----
10 files changed, 250 insertions(+), 288 deletions(-)
create mode 100644 app/jobs/account/branding_enrichment_job.rb
rename app/services/{concerns => }/social_link_parser.rb (100%)
diff --git a/app/controllers/api/v1/accounts_controller.rb b/app/controllers/api/v1/accounts_controller.rb
index 2d14fe7ca..7176d6e1b 100644
--- a/app/controllers/api/v1/accounts_controller.rb
+++ b/app/controllers/api/v1/accounts_controller.rb
@@ -30,6 +30,7 @@ class Api::V1::AccountsController < Api::BaseController
locale: account_params[:locale],
user: current_user
).perform
+ enqueue_branding_enrichment
if @user
# Authenticated users (dashboard "add account") and api_only signups
# need the full response with account_id. API-only deployments have no
@@ -69,6 +70,16 @@ class Api::V1::AccountsController < Api::BaseController
private
+ def enqueue_branding_enrichment
+ return if account_params[:email].blank?
+
+ Account::BrandingEnrichmentJob.perform_later(@account.id, account_params[:email])
+ Redis::Alfred.set(format(Redis::Alfred::ACCOUNT_ONBOARDING_ENRICHMENT, account_id: @account.id), '1', ex: 30)
+ rescue StandardError => e
+ # Enrichment is optional — never let queue/Redis failures abort signup
+ ChatwootExceptionTracker.new(e).capture_exception
+ end
+
def ensure_account_name
# ensure that account_name and user_full_name is present
# this is becuase the account builder and the models validations are not triggered
diff --git a/app/jobs/account/branding_enrichment_job.rb b/app/jobs/account/branding_enrichment_job.rb
new file mode 100644
index 000000000..2898604ca
--- /dev/null
+++ b/app/jobs/account/branding_enrichment_job.rb
@@ -0,0 +1,32 @@
+class Account::BrandingEnrichmentJob < ApplicationJob
+ queue_as :low
+
+ def perform(account_id, email)
+ result = WebsiteBrandingService.new(email).perform
+ return if result.blank?
+
+ account = Account.find(account_id)
+ account.name = result[:title] if result[:title].present?
+ account.custom_attributes['brand_info'] = result if account.custom_attributes['brand_info'].blank?
+ account.save! if account.changed?
+ ensure
+ finish_enrichment(account_id)
+ end
+
+ private
+
+ def finish_enrichment(account_id)
+ Redis::Alfred.delete(format(Redis::Alfred::ACCOUNT_ONBOARDING_ENRICHMENT, account_id: account_id))
+
+ account = Account.find(account_id)
+ if account.custom_attributes['onboarding_step'] == 'enrichment'
+ account.custom_attributes['onboarding_step'] = 'account_details'
+ account.save!
+ end
+
+ user = account.administrators.first
+ return unless user
+
+ ActionCableBroadcastJob.perform_later([user.pubsub_token], 'account.enrichment_completed', { account_id: account_id })
+ end
+end
diff --git a/app/services/concerns/social_link_parser.rb b/app/services/social_link_parser.rb
similarity index 100%
rename from app/services/concerns/social_link_parser.rb
rename to app/services/social_link_parser.rb
diff --git a/app/services/website_branding_service.rb b/app/services/website_branding_service.rb
index 89326e4b6..3592267ff 100644
--- a/app/services/website_branding_service.rb
+++ b/app/services/website_branding_service.rb
@@ -1,8 +1,15 @@
class WebsiteBrandingService
include SocialLinkParser
- def initialize(url)
- @url = normalize_url(url)
+ attr_reader :http_status
+
+ DATA_DEFAULTS = { description: nil, slogan: nil, phone: nil, address: nil, links: nil, stock: nil, industries: [], is_nsfw: false }.freeze
+
+ def initialize(email)
+ @email = email
+ @domain = email.split('@').last&.downcase&.strip
+ @url = "https://#{@domain}"
+ @http_status = nil
end
def perform
@@ -11,13 +18,14 @@ class WebsiteBrandingService
links = extract_links(doc)
- {
- business_name: extract_business_name(doc),
- language: extract_language(doc),
- industry_category: nil,
- social_handles: extract_social_from_links(links),
- branding: extract_branding(doc)
- }
+ DATA_DEFAULTS.merge({
+ domain: @domain,
+ title: extract_title(doc),
+ colors: extract_colors(doc),
+ logos: extract_logos(doc),
+ socials: build_socials(links),
+ email: @email
+ })
rescue StandardError => e
Rails.logger.error "[WebsiteBranding] #{e.message}"
nil
@@ -25,12 +33,9 @@ class WebsiteBrandingService
private
- def normalize_url(url)
- url.match?(%r{\Ahttps?://}) ? url : "https://#{url}"
- end
-
def fetch_page
response = HTTParty.get(@url, follow_redirects: true, timeout: 15)
+ @http_status = response.code
return nil unless response.success?
Nokogiri::HTML(response.body)
@@ -39,7 +44,7 @@ class WebsiteBrandingService
nil
end
- def extract_business_name(doc)
+ def extract_title(doc)
og_site_name = doc.at_css('meta[property="og:site_name"]')&.[]('content')
return og_site_name.strip if og_site_name.present?
@@ -47,8 +52,37 @@ class WebsiteBrandingService
title&.strip&.split(/\s*[|\-–—·:]+\s*/)&.first
end
- def extract_language(doc)
- doc.at_css('html')&.[]('lang')&.split('-')&.first&.downcase
+ def extract_colors(doc)
+ color = doc.at_css('meta[name="theme-color"]')&.[]('content')
+ return [] if color.blank?
+
+ [{ hex: color, name: nil }]
+ end
+
+ def extract_logos(doc)
+ favicon = doc.at_css('link[rel*="icon"]')&.[]('href')
+ return [] if favicon.blank?
+
+ url = resolve_url(favicon)
+ return [] if url.blank?
+
+ [{ url: url, type: nil, mode: nil, colors: [], resolution: { aspect_ratio: 1 } }]
+ end
+
+ def build_socials(links)
+ handles = extract_social_from_links(links)
+ handles.filter_map do |platform, handle|
+ next if handle.blank?
+
+ url = reconstruct_social_url(platform, handle)
+ { type: platform.to_s, url: url }
+ end
+ end
+
+ def reconstruct_social_url(platform, handle)
+ base_urls = { whatsapp: 'https://wa.me/', line: 'https://line.me/', facebook: 'https://facebook.com/',
+ instagram: 'https://instagram.com/', telegram: 'https://t.me/', tiktok: 'https://tiktok.com/' }
+ "#{base_urls[platform]}#{handle}"
end
def extract_links(doc)
@@ -62,24 +96,6 @@ class WebsiteBrandingService
end.uniq
end
- def extract_branding(doc)
- {
- favicon: extract_favicon(doc),
- primary_color: extract_theme_color(doc)
- }
- end
-
- def extract_favicon(doc)
- favicon = doc.at_css('link[rel*="icon"]')&.[]('href')
- return nil if favicon.blank?
-
- resolve_url(favicon)
- end
-
- def extract_theme_color(doc)
- doc.at_css('meta[name="theme-color"]')&.[]('content')
- end
-
def resolve_url(url)
return nil if url.blank?
return url if url.start_with?('http')
diff --git a/config/installation_config.yml b/config/installation_config.yml
index 34cb736bf..884dd2e58 100644
--- a/config/installation_config.yml
+++ b/config/installation_config.yml
@@ -211,6 +211,13 @@
type: code
# End of Captain Config
+# ------- Context.dev Config ------- #
+- name: CONTEXT_DEV_API_KEY
+ display_title: 'Context.dev API Key'
+ description: 'API key for Context.dev branding service used during account onboarding'
+ type: secret
+# ------- End of Context.dev Config ------- #
+
# ------- Chatwoot Internal Config for Cloud ----#
- name: CHATWOOT_INBOX_TOKEN
value:
diff --git a/enterprise/app/controllers/enterprise/super_admin/app_configs_controller.rb b/enterprise/app/controllers/enterprise/super_admin/app_configs_controller.rb
index 87ac8f6d6..f91f12708 100644
--- a/enterprise/app/controllers/enterprise/super_admin/app_configs_controller.rb
+++ b/enterprise/app/controllers/enterprise/super_admin/app_configs_controller.rb
@@ -34,9 +34,9 @@ module Enterprise::SuperAdmin::AppConfigsController
end
def internal_config_options
- %w[CHATWOOT_INBOX_TOKEN CHATWOOT_INBOX_HMAC_KEY CLOUD_ANALYTICS_TOKEN CLEARBIT_API_KEY DASHBOARD_SCRIPTS INACTIVE_WHATSAPP_NUMBERS
- SKIP_INCOMING_BCC_PROCESSING CAPTAIN_CLOUD_PLAN_LIMITS ACCOUNT_SECURITY_NOTIFICATION_WEBHOOK_URL CHATWOOT_INSTANCE_ADMIN_EMAIL
- OG_IMAGE_CDN_URL OG_IMAGE_CLIENT_REF CLOUDFLARE_API_KEY CLOUDFLARE_ZONE_ID BLOCKED_EMAIL_DOMAINS
+ %w[CHATWOOT_INBOX_TOKEN CHATWOOT_INBOX_HMAC_KEY CLOUD_ANALYTICS_TOKEN CLEARBIT_API_KEY CONTEXT_DEV_API_KEY DASHBOARD_SCRIPTS
+ INACTIVE_WHATSAPP_NUMBERS SKIP_INCOMING_BCC_PROCESSING CAPTAIN_CLOUD_PLAN_LIMITS ACCOUNT_SECURITY_NOTIFICATION_WEBHOOK_URL
+ CHATWOOT_INSTANCE_ADMIN_EMAIL OG_IMAGE_CDN_URL OG_IMAGE_CLIENT_REF CLOUDFLARE_API_KEY CLOUDFLARE_ZONE_ID BLOCKED_EMAIL_DOMAINS
OTEL_PROVIDER LANGFUSE_PUBLIC_KEY LANGFUSE_SECRET_KEY LANGFUSE_BASE_URL]
end
diff --git a/enterprise/app/services/enterprise/website_branding_service.rb b/enterprise/app/services/enterprise/website_branding_service.rb
index 6efdd5051..a1925e80d 100644
--- a/enterprise/app/services/enterprise/website_branding_service.rb
+++ b/enterprise/app/services/enterprise/website_branding_service.rb
@@ -1,112 +1,63 @@
module Enterprise::WebsiteBrandingService
- FIRECRAWL_SCRAPE_ENDPOINT = 'https://api.firecrawl.dev/v2/scrape'.freeze
-
- INDUSTRY_CATEGORIES = [
- 'Technology',
- 'E-commerce',
- 'Healthcare',
- 'Education',
- 'Finance',
- 'Real Estate',
- 'Marketing',
- 'Travel & Hospitality',
- 'Food & Beverage',
- 'Media & Entertainment',
- 'Professional Services',
- 'Non-profit',
- 'Other'
- ].freeze
+ CONTEXT_DEV_ENDPOINT = 'https://api.context.dev/v1/brand/retrieve-by-email'.freeze
def perform
- return super unless firecrawl_enabled?
+ return super unless context_dev_enabled?
- response = perform_firecrawl_request
- process_firecrawl_response(response)
+ response = fetch_brand
+ process_response(response)
rescue StandardError => e
- Rails.logger.error "[WebsiteBranding] Firecrawl failed: #{e.message}, falling back to basic scrape"
- super
+ Rails.logger.error "[WebsiteBranding] Context.dev failed: #{e.message}"
+ nil
end
private
- def firecrawl_enabled?
- firecrawl_api_key.present?
+ def context_dev_enabled?
+ context_dev_api_key.present?
end
- def firecrawl_api_key
- InstallationConfig.find_by(name: 'CAPTAIN_FIRECRAWL_API_KEY')&.value
+ def context_dev_api_key
+ InstallationConfig.find_by(name: 'CONTEXT_DEV_API_KEY')&.value
end
- def perform_firecrawl_request
- HTTParty.post(
- FIRECRAWL_SCRAPE_ENDPOINT,
- body: scrape_payload.to_json,
+ def fetch_brand
+ HTTParty.get(
+ CONTEXT_DEV_ENDPOINT,
+ query: { email: @email },
headers: {
- 'Authorization' => "Bearer #{firecrawl_api_key}",
+ 'Authorization' => "Bearer #{context_dev_api_key}",
'Content-Type' => 'application/json'
}
)
end
- def scrape_payload
- {
- url: @url,
- onlyMainContent: false,
- formats: [
- {
- type: 'json',
- schema: extract_schema,
- prompt: 'Extract the business name, primary language, and industry category from this website.'
- },
- 'branding',
- 'links'
- ]
- }
- end
-
- def extract_schema
- {
- type: 'object',
- properties: {
- business_name: { type: 'string', description: 'The name of the business or company' },
- language: { type: 'string', description: 'Primary language as ISO 639-1 code (e.g., en, es, fr)' },
- industry_category: { type: 'string', enum: INDUSTRY_CATEGORIES, description: 'Industry category for this business' }
- },
- required: %w[business_name]
- }
- end
-
- def process_firecrawl_response(response)
+ def process_response(response)
+ @http_status = response.code
raise "API Error: #{response.message} (Status: #{response.code})" unless response.success?
- format_firecrawl_response(response)
+ brand = response.parsed_response&.dig('brand')
+ return nil if brand.blank?
+
+ format_brand(brand)
end
- def format_firecrawl_response(response)
- data = response.parsed_response
- extract = data.dig('data', 'json') || {}
- brand = data.dig('data', 'branding') || {}
- links = data.dig('data', 'links') || []
-
+ def format_brand(brand)
{
- business_name: extract['business_name'],
- language: extract['language'],
- industry_category: extract['industry_category'],
- social_handles: extract_social_from_links(links),
- branding: extract_firecrawl_branding(brand)
- }
- end
-
- def extract_firecrawl_branding(brand)
- {
- favicon: url_or_nil(brand.dig('images', 'favicon')),
- primary_color: brand.dig('colors', 'primary')
- }
- end
-
- def url_or_nil(value)
- return nil if value.blank? || !value.start_with?('http')
-
- value
+ domain: brand['domain'],
+ title: brand['title'],
+ description: brand['description'],
+ slogan: brand['slogan'],
+ phone: brand['phone'],
+ address: brand['address'],
+ colors: brand['colors'] || [],
+ logos: brand['logos'] || [],
+ socials: brand['socials'] || [],
+ links: brand['links'],
+ email: @email,
+ industries: brand.dig('industries', 'eic') || [],
+ stock: brand['stock'],
+ is_nsfw: brand['is_nsfw'] || false
+ }.deep_symbolize_keys
end
end
diff --git a/lib/redis/redis_keys.rb b/lib/redis/redis_keys.rb
index 8c9361ab5..59e33036d 100644
--- a/lib/redis/redis_keys.rb
+++ b/lib/redis/redis_keys.rb
@@ -50,6 +50,9 @@ module Redis::RedisKeys
ASSIGNMENT_KEY = 'ASSIGNMENT::%d::AGENT::%d::CONVERSATION::%d'.freeze
ASSIGNMENT_KEY_PATTERN = 'ASSIGNMENT::%d::AGENT::%d::*'.freeze
+ ## Account Onboarding
+ ACCOUNT_ONBOARDING_ENRICHMENT = 'ONBOARDING_ENRICHMENT::%d'.freeze
+
## Account Email Rate Limiting
ACCOUNT_OUTBOUND_EMAIL_COUNT_KEY = 'OUTBOUND_EMAIL_COUNT::%d::%s'.freeze
end
diff --git a/spec/enterprise/services/enterprise/website_branding_service_spec.rb b/spec/enterprise/services/enterprise/website_branding_service_spec.rb
index 0907db518..64b6dfb53 100644
--- a/spec/enterprise/services/enterprise/website_branding_service_spec.rb
+++ b/spec/enterprise/services/enterprise/website_branding_service_spec.rb
@@ -7,164 +7,111 @@ end
RSpec.describe Enterprise::WebsiteBrandingService do
describe '#perform' do
- subject(:service) { test_klass.new(url) }
+ subject(:service) { test_klass.new(email) }
- let(:url) { 'https://example.com' }
- let(:api_key) { 'test-firecrawl-api-key' }
- let(:scrape_endpoint) { described_class::FIRECRAWL_SCRAPE_ENDPOINT }
- let(:fallback_html) { 'Fallback ' }
+ let(:email) { 'user@example.com' }
+ let(:api_key) { 'test-context-dev-api-key' }
+ let(:endpoint) { described_class::CONTEXT_DEV_ENDPOINT }
+ let(:fallback_html) { 'Fallback ' }
let(:success_response_body) do
{
- success: true,
- data: {
- json: {
- business_name: 'Acme Corp',
- language: 'en',
- industry_category: 'Technology'
- },
- branding: {
- images: { logo: 'https://example.com/logo.png', favicon: 'https://example.com/favicon.png' },
- colors: { primary: '#FF5733' }
- },
- links: [
- 'https://example.com/about',
- 'https://facebook.com/acmecorp',
- 'https://instagram.com/acme_corp',
- 'https://wa.me/1234567890',
- 'https://t.me/acmecorp',
- 'https://tiktok.com/@acmetok'
- ]
+ status: 'ok',
+ code: 200,
+ brand: {
+ domain: 'example.com',
+ title: 'Acme Corp',
+ description: 'Leading tech company',
+ slogan: 'We build things',
+ is_nsfw: false,
+ colors: [{ hex: '#FF5733', name: 'Orange Red' }],
+ logos: [{ url: 'https://media.brand.dev/logo.png', type: 'icon', mode: 'light',
+ colors: [{ hex: '#FF5733', name: 'Orange Red' }],
+ resolution: { width: 256, height: 256, aspect_ratio: 1 } }],
+ socials: [
+ { type: 'facebook', url: 'https://facebook.com/acmecorp' },
+ { type: 'instagram', url: 'https://instagram.com/acme_corp' }
+ ],
+ industries: {
+ eic: [{ industry: 'Technology', subindustry: 'Software' }]
+ }
}
}.to_json
end
before do
- stub_request(:get, url).to_return(status: 200, body: fallback_html, headers: { 'content-type' => 'text/html' })
+ stub_request(:get, 'https://example.com').to_return(status: 200, body: fallback_html,
+ headers: { 'content-type' => 'text/html' })
end
- context 'when firecrawl is configured and API returns success' do
+ context 'when context.dev is configured and API returns success' do
before do
- create(:installation_config, name: 'CAPTAIN_FIRECRAWL_API_KEY', value: api_key)
- stub_request(:post, scrape_endpoint)
- .with(headers: { 'Authorization' => "Bearer #{api_key}", 'Content-Type' => 'application/json' })
+ create(:installation_config, name: 'CONTEXT_DEV_API_KEY', value: api_key)
+ stub_request(:get, endpoint)
+ .with(query: { email: email }, headers: { 'Authorization' => "Bearer #{api_key}" })
.to_return(status: 200, body: success_response_body, headers: { 'content-type' => 'application/json' })
end
- it 'returns business info and branding from firecrawl' do
+ it 'returns basic brand info' do
result = service.perform
- expect(result).to eq({
- business_name: 'Acme Corp',
- language: 'en',
- industry_category: 'Technology',
- social_handles: {
- whatsapp: '1234567890',
- line: nil,
- facebook: 'acmecorp',
- instagram: 'acme_corp',
- telegram: 'acmecorp',
- tiktok: '@acmetok'
- },
- branding: {
- favicon: 'https://example.com/favicon.png',
- primary_color: '#FF5733'
- }
- })
+ expect(result).to include(domain: 'example.com', title: 'Acme Corp', description: 'Leading tech company',
+ slogan: 'We build things', is_nsfw: false, email: email)
+ end
+
+ it 'returns colors, logos, socials, and industries' do
+ result = service.perform
+
+ expect(result[:colors]).to eq([{ hex: '#FF5733', name: 'Orange Red' }])
+ expect(result[:logos].first[:url]).to eq('https://media.brand.dev/logo.png')
+ expect(result[:socials]).to eq([{ type: 'facebook', url: 'https://facebook.com/acmecorp' },
+ { type: 'instagram', url: 'https://instagram.com/acme_corp' }])
+ expect(result[:industries]).to eq([{ industry: 'Technology', subindustry: 'Software' }])
end
end
- context 'when firecrawl API returns an error' do
+ context 'when context.dev API returns an error' do
before do
- create(:installation_config, name: 'CAPTAIN_FIRECRAWL_API_KEY', value: api_key)
- stub_request(:post, scrape_endpoint)
- .to_return(status: 422, body: '{"error": "Invalid URL"}', headers: {})
+ create(:installation_config, name: 'CONTEXT_DEV_API_KEY', value: api_key)
+ stub_request(:get, endpoint)
+ .with(query: { email: email })
+ .to_return(status: 422, body: '{"error": "FREE_EMAIL_DETECTED"}')
end
- it 'falls back to basic scrape' do
- result = service.perform
- expect(result[:business_name]).to eq('Fallback')
- expect(result[:industry_category]).to be_nil
+ it 'returns nil' do
+ expect(service.perform).to be_nil
end
end
- context 'when firecrawl raises an exception' do
+ context 'when context.dev raises an exception' do
before do
- create(:installation_config, name: 'CAPTAIN_FIRECRAWL_API_KEY', value: api_key)
- stub_request(:post, scrape_endpoint).to_raise(StandardError.new('connection refused'))
+ create(:installation_config, name: 'CONTEXT_DEV_API_KEY', value: api_key)
+ stub_request(:get, endpoint).with(query: { email: email }).to_raise(StandardError.new('connection refused'))
end
- it 'falls back to basic scrape' do
- result = service.perform
- expect(result[:business_name]).to eq('Fallback')
+ it 'returns nil' do
+ expect(service.perform).to be_nil
end
end
- context 'when firecrawl is not configured' do
- it 'uses basic scrape' do
- expect(HTTParty).not_to receive(:post)
+ context 'when context.dev is not configured' do
+ it 'falls back to base scraper' do
result = service.perform
- expect(result[:business_name]).to eq('Fallback')
+ expect(result[:title]).to eq('Fallback')
+ expect(result[:industries]).to eq([])
end
end
- context 'when WhatsApp link uses api.whatsapp.com format' do
+ context 'when context.dev returns empty brand' do
before do
- create(:installation_config, name: 'CAPTAIN_FIRECRAWL_API_KEY', value: api_key)
- response = {
- success: true,
- data: {
- json: { business_name: 'Acme Corp' },
- links: ['https://api.whatsapp.com/send?phone=5511999999999&text=Hello']
- }
- }.to_json
- stub_request(:post, scrape_endpoint)
- .to_return(status: 200, body: response, headers: { 'content-type' => 'application/json' })
+ create(:installation_config, name: 'CONTEXT_DEV_API_KEY', value: api_key)
+ stub_request(:get, endpoint)
+ .with(query: { email: email })
+ .to_return(status: 200, body: { status: 'ok', code: 200, brand: nil }.to_json,
+ headers: { 'content-type' => 'application/json' })
end
- it 'extracts phone number from query param' do
- result = service.perform
- expect(result[:social_handles][:whatsapp]).to eq('5511999999999')
- end
- end
-
- context 'when WhatsApp link uses wa.me format' do
- before do
- create(:installation_config, name: 'CAPTAIN_FIRECRAWL_API_KEY', value: api_key)
- response = {
- success: true,
- data: {
- json: { business_name: 'Acme Corp' },
- links: ['https://wa.me/+5511999999999']
- }
- }.to_json
- stub_request(:post, scrape_endpoint)
- .to_return(status: 200, body: response, headers: { 'content-type' => 'application/json' })
- end
-
- it 'extracts phone number from path' do
- result = service.perform
- expect(result[:social_handles][:whatsapp]).to eq('5511999999999')
- end
- end
-
- context 'when links contain lookalike domains' do
- before do
- create(:installation_config, name: 'CAPTAIN_FIRECRAWL_API_KEY', value: api_key)
- response = {
- success: true,
- data: {
- json: { business_name: 'Acme Corp' },
- links: ['https://notfacebook.com/page', 'https://fakeinstagram.com/user']
- }
- }.to_json
- stub_request(:post, scrape_endpoint)
- .to_return(status: 200, body: response, headers: { 'content-type' => 'application/json' })
- end
-
- it 'does not match lookalike domains' do
- result = service.perform
- expect(result[:social_handles][:facebook]).to be_nil
- expect(result[:social_handles][:instagram]).to be_nil
+ it 'returns nil' do
+ expect(service.perform).to be_nil
end
end
end
diff --git a/spec/services/website_branding_service_spec.rb b/spec/services/website_branding_service_spec.rb
index 19598fb59..e90da4c64 100644
--- a/spec/services/website_branding_service_spec.rb
+++ b/spec/services/website_branding_service_spec.rb
@@ -2,6 +2,7 @@ require 'rails_helper'
RSpec.describe WebsiteBrandingService do
describe '#perform' do
+ let(:email) { 'user@example.com' }
let(:url) { 'https://example.com' }
let(:html_body) do
<<~HTML
@@ -9,12 +10,21 @@ RSpec.describe WebsiteBrandingService do
Acme Corp | Home
-
+
+
+
-
+
+
+ FB
+ TG
+
Facebook
Instagram
@@ -31,26 +41,19 @@ RSpec.describe WebsiteBrandingService do
stub_request(:get, url).to_return(status: 200, body: html_body, headers: { 'content-type' => 'text/html' })
end
- it 'extracts business info, branding, and social handles' do
- result = described_class.new(url).perform
+ it 'extracts basic brand info' do
+ result = described_class.new(email).perform
- expect(result).to eq({
- business_name: 'Acme Corp',
- language: 'en',
- industry_category: nil,
- social_handles: {
- whatsapp: '1234567890',
- line: nil,
- facebook: 'acmecorp',
- instagram: 'acme_corp',
- telegram: 'acmecorp',
- tiktok: '@acmetok'
- },
- branding: {
- favicon: 'https://example.com/favicon.ico',
- primary_color: '#FF5733'
- }
- })
+ expect(result).to include(domain: 'example.com', title: 'Acme Corp', email: email,
+ description: nil, slogan: nil, is_nsfw: false, industries: [])
+ end
+
+ it 'extracts colors, logos, and socials' do
+ result = described_class.new(email).perform
+
+ expect(result[:colors]).to eq([{ hex: '#FF5733', name: nil }])
+ expect(result[:logos].first[:url]).to eq('https://example.com/favicon.ico')
+ expect(result[:socials].map { |s| s[:type] }).to contain_exactly('facebook', 'instagram', 'whatsapp', 'telegram', 'tiktok')
end
context 'when og:site_name is missing' do
@@ -64,17 +67,18 @@ RSpec.describe WebsiteBrandingService do
end
it 'falls back to the first segment of the title' do
- result = described_class.new(url).perform
- expect(result[:business_name]).to eq('Mon Entreprise')
- expect(result[:language]).to eq('fr')
+ result = described_class.new(email).perform
+ expect(result[:title]).to eq('Mon Entreprise')
end
end
context 'when the page fails to load' do
before { stub_request(:get, url).to_return(status: 500, body: '') }
- it 'returns nil' do
- expect(described_class.new(url).perform).to be_nil
+ it 'returns nil and sets http_status' do
+ service = described_class.new(email)
+ expect(service.perform).to be_nil
+ expect(service.http_status).to eq(500)
end
end
@@ -83,18 +87,7 @@ RSpec.describe WebsiteBrandingService do
it 'logs the error and returns nil' do
expect(Rails.logger).to receive(:error).with(/connection refused/)
- expect(described_class.new(url).perform).to be_nil
- end
- end
-
- context 'when URL has no scheme' do
- before do
- stub_request(:get, 'https://example.com').to_return(status: 200, body: html_body, headers: { 'content-type' => 'text/html' })
- end
-
- it 'prepends https://' do
- result = described_class.new('example.com').perform
- expect(result[:business_name]).to eq('Acme Corp')
+ expect(described_class.new(email).perform).to be_nil
end
end
@@ -109,8 +102,9 @@ RSpec.describe WebsiteBrandingService do
end
it 'extracts phone from query param' do
- result = described_class.new(url).perform
- expect(result[:social_handles][:whatsapp]).to eq('5511999999999')
+ result = described_class.new(email).perform
+ whatsapp = result[:socials].find { |s| s[:type] == 'whatsapp' }
+ expect(whatsapp[:url]).to eq('https://wa.me/5511999999999')
end
end
@@ -128,9 +122,10 @@ RSpec.describe WebsiteBrandingService do
end
it 'does not match lookalike domains' do
- result = described_class.new(url).perform
- expect(result[:social_handles][:facebook]).to be_nil
- expect(result[:social_handles][:instagram]).to be_nil
+ result = described_class.new(email).perform
+ types = result[:socials].map { |s| s[:type] }
+ expect(types).not_to include('facebook')
+ expect(types).not_to include('instagram')
end
end
@@ -148,8 +143,8 @@ RSpec.describe WebsiteBrandingService do
end
it 'resolves the relative favicon URL' do
- result = described_class.new(url).perform
- expect(result[:branding][:favicon]).to eq('https://example.com/favicon.ico')
+ result = described_class.new(email).perform
+ expect(result[:logos].first[:url]).to eq('https://example.com/favicon.ico')
end
end
end
From 699b12b1d39759e31200e93f57836ae9d00872f2 Mon Sep 17 00:00:00 2001
From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Date: Wed, 8 Apr 2026 12:17:19 +0530
Subject: [PATCH 29/53] fix: Block inline images in message signatures (#13772)
# Pull Request Template
## Description
This PR includes, block inline images in message signatures and prevent
auto signature insertion when editor is disabled.
- Strip inline base64 images from signature on save and show warning
message
- Add `INLINE_IMAGE_WARNING` translation key for signature inline image
removal notification
- Add disabled check to `addSignature()` to prevent signature insertion
when editor is disabled
- Add `isEditorDisabled` checks to signature toggle logic in
`toggleSignatureForDraft()`, `replaceText()`, and `clearMessage()`
- Remove unused `replaceText` from the codebase, which belongs to old
`textarea` editor
Fixes
https://linear.app/chatwoot/issue/CW-6588/the-browser-hangs-when-the-message-signature-contains-inline-image
## Type of change
- [x] Bug fix (non-breaking change which fixes an issue)
## How Has This Been Tested?
### Loom video
https://www.loom.com/share/fb556b46a12a4308a737eed732d5ed73
## Checklist:
- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [ ] 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 | 11 ++++--
.../widgets/WootWriter/ReplyBottomPanel.vue | 4 ---
.../widgets/conversation/ReplyBox.vue | 35 ++++---------------
.../dashboard/helper/editorHelper.js | 19 ++++++++++
.../helper/specs/editorHelper.spec.js | 31 ++++++++++++++++
.../dashboard/i18n/locale/en/settings.json | 3 +-
.../settings/profile/MessageSignature.vue | 16 ++++++++-
7 files changed, 83 insertions(+), 36 deletions(-)
diff --git a/app/javascript/dashboard/components/widgets/WootWriter/Editor.vue b/app/javascript/dashboard/components/widgets/WootWriter/Editor.vue
index 2a9577644..1bf08d169 100644
--- a/app/javascript/dashboard/components/widgets/WootWriter/Editor.vue
+++ b/app/javascript/dashboard/components/widgets/WootWriter/Editor.vue
@@ -313,7 +313,12 @@ const plugins = computed(() => {
const sendWithSignature = computed(() => {
// this is considered the source of truth, we watch this property
// on change, we toggle the signature in the editor
- if (props.allowSignature && !props.isPrivate && props.channelType) {
+ if (
+ props.allowSignature &&
+ !props.isPrivate &&
+ props.channelType &&
+ !props.disabled
+ ) {
return fetchSignatureFlagFromUISettings(props.channelType);
}
@@ -436,6 +441,7 @@ function reloadState(content = props.modelValue) {
}
function addSignature() {
+ if (props.disabled) return;
let content = props.modelValue;
// see if the content is empty, if it is before appending the signature
// we need to add a paragraph node and move the cursor at the start of the editor
@@ -454,6 +460,7 @@ function addSignature() {
}
function removeSignature() {
+ if (props.disabled) return;
if (!props.signature) return;
let content = props.modelValue;
content = removeSignatureHelper(
@@ -806,7 +813,7 @@ watch(
watch(sendWithSignature, newValue => {
// see if the allowSignature flag is true
- if (props.allowSignature) {
+ if (props.allowSignature && !props.disabled) {
toggleSignatureInEditor(newValue);
}
});
diff --git a/app/javascript/dashboard/components/widgets/WootWriter/ReplyBottomPanel.vue b/app/javascript/dashboard/components/widgets/WootWriter/ReplyBottomPanel.vue
index 5f76041dc..ff569d763 100644
--- a/app/javascript/dashboard/components/widgets/WootWriter/ReplyBottomPanel.vue
+++ b/app/javascript/dashboard/components/widgets/WootWriter/ReplyBottomPanel.vue
@@ -128,7 +128,6 @@ export default {
},
},
emits: [
- 'replaceText',
'toggleInsertArticle',
'selectWhatsappTemplate',
'selectContentTemplate',
@@ -277,9 +276,6 @@ export default {
toggleMessageSignature() {
this.setSignatureFlagForInbox(this.channelType, !this.sendWithSignature);
},
- replaceText(text) {
- this.$emit('replaceText', text);
- },
toggleInsertArticle() {
this.$emit('toggleInsertArticle');
},
diff --git a/app/javascript/dashboard/components/widgets/conversation/ReplyBox.vue b/app/javascript/dashboard/components/widgets/conversation/ReplyBox.vue
index ef6fa03d6..a5122094e 100644
--- a/app/javascript/dashboard/components/widgets/conversation/ReplyBox.vue
+++ b/app/javascript/dashboard/components/widgets/conversation/ReplyBox.vue
@@ -27,7 +27,6 @@ import { CMD_AI_ASSIST } from 'dashboard/helper/commandbar/events';
import {
getMessageVariables,
getUndefinedVariablesInMessage,
- replaceVariablesInMessage,
} from '@chatwoot/utils';
import WhatsappTemplates from './WhatsappTemplates/Modal.vue';
import ContentTemplates from './ContentTemplates/ContentTemplatesModal.vue';
@@ -636,10 +635,17 @@ export default {
return message;
}
+ // Even when editor is disabled (e.g. WhatsApp/API can't reply), we must
+ // still normalize stale signatures out of drafts when signature is off.
+ if (this.isEditorDisabled && this.sendWithSignature) {
+ return message;
+ }
+
const effectiveChannelType = getEffectiveChannelType(
this.channelType,
this.inbox?.medium || ''
);
+
return this.sendWithSignature
? appendSignature(message, this.messageSignature, effectiveChannelType)
: removeSignature(message, this.messageSignature, effectiveChannelType);
@@ -911,32 +917,6 @@ export default {
});
this.hideContentTemplatesModal();
},
- replaceText(message) {
- if (this.sendWithSignature && !this.private) {
- // if signature is enabled, append it to the message
- // appendSignature ensures that the signature is not duplicated
- // so we don't need to check if the signature is already present
- const effectiveChannelType = getEffectiveChannelType(
- this.channelType,
- this.inbox?.medium || ''
- );
- message = appendSignature(
- message,
- this.messageSignature,
- effectiveChannelType
- );
- }
-
- const updatedMessage = replaceVariablesInMessage({
- message,
- variables: this.messageVariables,
- });
-
- setTimeout(() => {
- useTrack(CONVERSATION_EVENTS.INSERTED_A_CANNED_RESPONSE);
- this.message = updatedMessage;
- }, 100);
- },
setReplyMode(mode = REPLY_EDITOR_MODES.REPLY) {
// Clear attachments when switching between private note and reply modes
// This is to prevent from breaking the upload rules
@@ -1435,7 +1415,6 @@ export default {
:new-conversation-modal-active="newConversationModalActive"
@select-whatsapp-template="openWhatsappTemplateModal"
@select-content-template="openContentTemplateModal"
- @replace-text="replaceText"
@toggle-insert-article="toggleInsertArticle"
@toggle-quoted-reply="toggleQuotedReply"
/>
diff --git a/app/javascript/dashboard/helper/editorHelper.js b/app/javascript/dashboard/helper/editorHelper.js
index 25d062650..b3d071ccd 100644
--- a/app/javascript/dashboard/helper/editorHelper.js
+++ b/app/javascript/dashboard/helper/editorHelper.js
@@ -32,6 +32,25 @@ export function extractTextFromMarkdown(markdown) {
.trim(); // Trim any extra space
}
+/**
+ * Removes inline base64 markdown images from signature content.
+ *
+ * @param {string} content
+ * @returns {{ sanitizedContent: string, hasInlineImages: boolean }}
+ */
+export function stripInlineBase64Images(content) {
+ if (!content || typeof content !== 'string') {
+ return { sanitizedContent: content || '', hasInlineImages: false };
+ }
+
+ const markdownInlineBase64ImageRegex =
+ /!\[[^\]]*]\(\s*data:image\/[a-zA-Z0-9.+-]+;base64,[^)]+\s*\)/gi;
+ const sanitizedContent = content.replace(markdownInlineBase64ImageRegex, '');
+ const hasInlineImages = sanitizedContent !== content;
+
+ return { sanitizedContent, hasInlineImages };
+}
+
/**
* Strip unsupported markdown formatting based on channel capabilities.
* Uses MARKDOWN_PATTERNS from editor constants.
diff --git a/app/javascript/dashboard/helper/specs/editorHelper.spec.js b/app/javascript/dashboard/helper/specs/editorHelper.spec.js
index ca61c1bab..f558dd213 100644
--- a/app/javascript/dashboard/helper/specs/editorHelper.spec.js
+++ b/app/javascript/dashboard/helper/specs/editorHelper.spec.js
@@ -15,6 +15,7 @@ import {
getMenuAnchor,
calculateMenuPosition,
stripUnsupportedFormatting,
+ stripInlineBase64Images,
} from '../editorHelper';
import { FORMATTING } from 'dashboard/constants/editor';
import { EditorState } from '@chatwoot/prosemirror-schema';
@@ -423,6 +424,36 @@ describe('extractTextFromMarkdown', () => {
});
});
+describe('stripInlineBase64Images', () => {
+ it('removes markdown data:image base64 images and sets hasInlineImages', () => {
+ const content =
+ 'Hello\n\nWorld';
+ const { sanitizedContent, hasInlineImages } =
+ stripInlineBase64Images(content);
+
+ expect(hasInlineImages).toBe(true);
+ expect(sanitizedContent).not.toContain('data:image/png;base64');
+ expect(sanitizedContent).toContain('Hello');
+ expect(sanitizedContent).toContain('World');
+ });
+
+ it('leaves hosted image markdown unchanged', () => {
+ const content = '';
+ const { sanitizedContent, hasInlineImages } =
+ stripInlineBase64Images(content);
+
+ expect(hasInlineImages).toBe(false);
+ expect(sanitizedContent).toBe(content);
+ });
+
+ it('returns empty hasInlineImages for empty input', () => {
+ expect(stripInlineBase64Images('')).toEqual({
+ sanitizedContent: '',
+ hasInlineImages: false,
+ });
+ });
+});
+
describe('insertAtCursor', () => {
it('should return undefined if editorView is not provided', () => {
const result = insertAtCursor(undefined, schema.text('Hello'), 0);
diff --git a/app/javascript/dashboard/i18n/locale/en/settings.json b/app/javascript/dashboard/i18n/locale/en/settings.json
index d885cf8ce..bfbd920a7 100644
--- a/app/javascript/dashboard/i18n/locale/en/settings.json
+++ b/app/javascript/dashboard/i18n/locale/en/settings.json
@@ -68,7 +68,8 @@
"API_SUCCESS": "Signature saved successfully",
"IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again",
"IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save to save the signature",
- "IMAGE_UPLOAD_SIZE_ERROR": "Image size should be less than {size}MB"
+ "IMAGE_UPLOAD_SIZE_ERROR": "Image size should be less than {size}MB",
+ "INLINE_IMAGE_WARNING": "Pasted inline images were removed. Please use the image upload button to add images to your signature."
},
"MESSAGE_SIGNATURE": {
"LABEL": "Message Signature",
diff --git a/app/javascript/dashboard/routes/dashboard/settings/profile/MessageSignature.vue b/app/javascript/dashboard/routes/dashboard/settings/profile/MessageSignature.vue
index fbaed06c1..b0dab9774 100644
--- a/app/javascript/dashboard/routes/dashboard/settings/profile/MessageSignature.vue
+++ b/app/javascript/dashboard/routes/dashboard/settings/profile/MessageSignature.vue
@@ -1,5 +1,8 @@
From 45124c3b41ab108a1bdcebc2fc5d236b7a2bfb69 Mon Sep 17 00:00:00 2001
From: YJack0000
Date: Wed, 8 Apr 2026 16:12:20 +0800
Subject: [PATCH 30/53] fix(i18n): improve zh-TW translation coverage and
quality (#14004)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Comprehensive update to Traditional Chinese (Taiwan) translations. As a
native zh-TW speaker and active user based in Taiwan, I found the
existing translations were quite incomplete (~54% overall) with many
strings still in English. Some existing translations also used
Simplified Chinese terms or unnatural phrasing.
I chose to submit this as a direct PR rather than going through Crowdin
because working through all the files at once is much faster and lets me
ensure consistent terminology across the entire locale.
Closes #14003
## What changed
**Backend (`config/locales/zh_TW.yml`)**
- Translated all ~259 previously untranslated strings (was ~19%
complete, now 100%)
- Covers: error messages, notifications, activity logs, integration
descriptions, Captain AI, public portal, reports
**Frontend (42 JSON files under `dashboard/i18n/locale/zh_TW/`)**
- Translated ~2,627 previously untranslated strings (was ~50% complete,
now ~100%)
- Most impacted files: `inboxMgmt.json`, `integrations.json`,
`settings.json`, `conversation.json`, `contact.json`, `report.json`
**Quality fixes across all files**
- Replaced Simplified Chinese terms mixed into zh-TW: 账→帳, 获→取得, 模板→範本,
收件箱→收件匣, 重置→重設, 自定義→自訂
- Standardized terminology for consistency: 客服人員 (agent), 延後 (snooze),
稽核 (audit), 巨集 (macro)
- Fixed incorrect translations (e.g., audit log table headers were
swapped, availability label was wrong)
## How to test
1. Set account/user language to 中文(台灣)
2. Navigate through the dashboard — settings, inbox management,
integrations, reports, conversations
3. Verify strings display in natural Traditional Chinese with no
remaining English gaps
4. Check that all placeholders (names, counts, dates) render correctly
---
.../i18n/locale/zh_TW/advancedFilters.json | 76 +-
.../i18n/locale/zh_TW/agentBots.json | 50 +-
.../i18n/locale/zh_TW/agentMgmt.json | 78 +-
.../i18n/locale/zh_TW/attributesMgmt.json | 106 +-
.../i18n/locale/zh_TW/auditLogs.json | 80 +-
.../i18n/locale/zh_TW/automation.json | 188 +--
.../i18n/locale/zh_TW/bulkActions.json | 40 +-
.../dashboard/i18n/locale/zh_TW/campaign.json | 94 +-
.../i18n/locale/zh_TW/cannedMgmt.json | 72 +-
.../dashboard/i18n/locale/zh_TW/chatlist.json | 86 +-
.../i18n/locale/zh_TW/companies.json | 20 +-
.../i18n/locale/zh_TW/components.json | 24 +-
.../dashboard/i18n/locale/zh_TW/contact.json | 552 ++++----
.../i18n/locale/zh_TW/contactFilters.json | 36 +-
.../i18n/locale/zh_TW/contentTemplates.json | 34 +-
.../i18n/locale/zh_TW/conversation.json | 528 ++++----
.../dashboard/i18n/locale/zh_TW/csatMgmt.json | 10 +-
.../i18n/locale/zh_TW/customRole.json | 98 +-
.../i18n/locale/zh_TW/datePicker.json | 30 +-
.../dashboard/i18n/locale/zh_TW/emoji.json | 4 +-
.../dashboard/i18n/locale/zh_TW/general.json | 12 +-
.../i18n/locale/zh_TW/generalSettings.json | 246 ++--
.../i18n/locale/zh_TW/helpCenter.json | 732 +++++------
.../dashboard/i18n/locale/zh_TW/inbox.json | 90 +-
.../i18n/locale/zh_TW/inboxMgmt.json | 1118 ++++++++---------
.../i18n/locale/zh_TW/integrationApps.json | 32 +-
.../i18n/locale/zh_TW/integrations.json | 1058 ++++++++--------
.../i18n/locale/zh_TW/labelsMgmt.json | 66 +-
.../dashboard/i18n/locale/zh_TW/login.json | 18 +-
.../dashboard/i18n/locale/zh_TW/macros.json | 134 +-
.../dashboard/i18n/locale/zh_TW/mfa.json | 148 +--
.../dashboard/i18n/locale/zh_TW/report.json | 540 ++++----
.../i18n/locale/zh_TW/resetPassword.json | 14 +-
.../dashboard/i18n/locale/zh_TW/search.json | 44 +-
.../i18n/locale/zh_TW/setNewPassword.json | 12 +-
.../dashboard/i18n/locale/zh_TW/settings.json | 924 +++++++-------
.../dashboard/i18n/locale/zh_TW/signup.json | 52 +-
.../dashboard/i18n/locale/zh_TW/sla.json | 106 +-
.../dashboard/i18n/locale/zh_TW/snooze.json | 6 +-
.../i18n/locale/zh_TW/teamsSettings.json | 64 +-
.../i18n/locale/zh_TW/whatsappTemplates.json | 40 +-
.../i18n/locale/zh_TW/yearInReview.json | 4 +-
config/locales/zh_TW.yml | 582 ++++-----
43 files changed, 4128 insertions(+), 4120 deletions(-)
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/advancedFilters.json b/app/javascript/dashboard/i18n/locale/zh_TW/advancedFilters.json
index 20da64545..2ab003990 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/advancedFilters.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/advancedFilters.json
@@ -1,24 +1,24 @@
{
"FILTER": {
"TITLE": "篩選對話",
- "SUBTITLE": "添加你的條件,並按下同意後,可以讓你的聊天更加簡潔",
+ "SUBTITLE": "新增您的篩選條件,然後按下「套用篩選」來精確找到您需要的對話。",
"EDIT_CUSTOM_FILTER": "編輯資料夾",
- "CUSTOM_VIEWS_SUBTITLE": "添加或移除一些條件與更新你的資料夾",
- "ADD_NEW_FILTER": "添加查詢條件",
- "FILTER_DELETE_ERROR": "哎呀,我們無法存檔! 請添加至少一個條件來保存。",
- "SUBMIT_BUTTON_LABEL": "篩選",
+ "CUSTOM_VIEWS_SUBTITLE": "新增或移除篩選條件並更新您的資料夾。",
+ "ADD_NEW_FILTER": "新增篩選條件",
+ "FILTER_DELETE_ERROR": "無法儲存空白內容!請至少新增一個篩選條件。",
+ "SUBMIT_BUTTON_LABEL": "套用篩選",
"UPDATE_BUTTON_LABEL": "更新資料夾",
"CANCEL_BUTTON_LABEL": "取消",
- "CLEAR_BUTTON_LABEL": "清除查詢條件",
+ "CLEAR_BUTTON_LABEL": "清除篩選條件",
"FOLDER_LABEL": "資料夾名稱",
- "FOLDER_QUERY_LABEL": "快速資料夾",
- "EMPTY_VALUE_ERROR": "此欄位為必填項目.",
+ "FOLDER_QUERY_LABEL": "資料夾查詢",
+ "EMPTY_VALUE_ERROR": "此欄位為必填。",
"TOOLTIP_LABEL": "篩選對話",
"QUERY_DROPDOWN_LABELS": {
"AND": "且",
"OR": "或"
},
- "INPUT_PLACEHOLDER": "輸入文字或數值",
+ "INPUT_PLACEHOLDER": "輸入值",
"OPERATOR_LABELS": {
"equal_to": "等於",
"not_equal_to": "不等於",
@@ -28,7 +28,7 @@
"is_greater_than": "大於",
"is_less_than": "小於",
"days_before": "x 天前",
- "starts_with": "從這開始",
+ "starts_with": "開頭為",
"equalTo": "等於",
"notEqualTo": "不等於",
"contains": "包含",
@@ -38,7 +38,7 @@
"isGreaterThan": "大於",
"isLessThan": "小於",
"daysBefore": "x 天前",
- "startsWith": "從這開始"
+ "startsWith": "開頭為"
},
"ATTRIBUTE_LABELS": {
"TRUE": "是",
@@ -46,50 +46,50 @@
},
"ATTRIBUTES": {
"STATUS": "狀態",
- "ASSIGNEE_NAME": "指派客服",
+ "ASSIGNEE_NAME": "指派對象",
"INBOX_NAME": "收件匣名稱",
"TEAM_NAME": "團隊名稱",
- "CONVERSATION_IDENTIFIER": "對話ID",
+ "CONVERSATION_IDENTIFIER": "對話識別碼",
"CAMPAIGN_NAME": "活動名稱",
"LABELS": "標籤",
"BROWSER_LANGUAGE": "瀏覽器語言",
- "PRIORITY": "優先程度",
+ "PRIORITY": "優先順序",
"COUNTRY_NAME": "國家名稱",
- "REFERER_LINK": "推薦人連結",
- "CUSTOM_ATTRIBUTE_LIST": "列表",
+ "REFERER_LINK": "來源連結",
+ "CUSTOM_ATTRIBUTE_LIST": "清單",
"CUSTOM_ATTRIBUTE_TEXT": "文字",
"CUSTOM_ATTRIBUTE_NUMBER": "數字",
"CUSTOM_ATTRIBUTE_LINK": "連結",
"CUSTOM_ATTRIBUTE_CHECKBOX": "勾選框",
- "CREATED_AT": "建立於",
+ "CREATED_AT": "建立時間",
"LAST_ACTIVITY": "最後活動"
},
"ERRORS": {
- "VALUE_REQUIRED": "此欄位為必填項目",
- "ATTRIBUTE_KEY_REQUIRED": "必填項",
- "FILTER_OPERATOR_REQUIRED": "需要過濾器運算子",
- "VALUE_MUST_BE_BETWEEN_1_AND_998": "數值必須介於1-998之間"
+ "VALUE_REQUIRED": "此欄位為必填",
+ "ATTRIBUTE_KEY_REQUIRED": "屬性鍵值為必填",
+ "FILTER_OPERATOR_REQUIRED": "篩選運算子為必填",
+ "VALUE_MUST_BE_BETWEEN_1_AND_998": "數值必須介於 1 到 998 之間"
},
"GROUPS": {
- "STANDARD_FILTERS": "一般查詢條件",
- "ADDITIONAL_FILTERS": "添加查詢條件",
+ "STANDARD_FILTERS": "標準篩選條件",
+ "ADDITIONAL_FILTERS": "額外篩選條件",
"CUSTOM_ATTRIBUTES": "自訂屬性"
},
"CUSTOM_VIEWS": {
"ADD": {
- "TITLE": "你要儲存這個篩選條件嗎?",
- "LABEL": "為這個篩選條件命名",
- "PLACEHOLDER": "給你的查詢條件命名,以便後面查看",
- "ERROR_MESSAGE": "名稱為必填.",
+ "TITLE": "您要儲存此篩選條件嗎?",
+ "LABEL": "為此篩選條件命名",
+ "PLACEHOLDER": "為篩選條件命名,以便日後查閱。",
+ "ERROR_MESSAGE": "名稱為必填。",
"SAVE_BUTTON": "儲存篩選條件",
"CANCEL_BUTTON": "取消",
"API_FOLDERS": {
- "SUCCESS_MESSAGE": "成功建立資料夾.",
- "ERROR_MESSAGE": "建立資料夾時出現錯誤."
+ "SUCCESS_MESSAGE": "資料夾建立成功。",
+ "ERROR_MESSAGE": "建立資料夾時發生錯誤。"
},
"API_SEGMENTS": {
- "SUCCESS_MESSAGE": "成功建立帳戶",
- "ERROR_MESSAGE": "建立時出錯"
+ "SUCCESS_MESSAGE": "區段建立成功。",
+ "ERROR_MESSAGE": "建立區段時發生錯誤。"
}
},
"EDIT": {
@@ -100,18 +100,18 @@
"MODAL": {
"CONFIRM": {
"TITLE": "刪除確認",
- "MESSAGE": "你確定要刪除此篩選條件嗎",
- "YES": "是的,刪除",
- "NO": "否,保留"
+ "MESSAGE": "您確定要刪除此篩選條件嗎?",
+ "YES": "是,刪除",
+ "NO": "不,保留"
}
},
"API_FOLDERS": {
- "SUCCESS_MESSAGE": "成功刪除資料夾.",
- "ERROR_MESSAGE": "刪除資料夾時出現錯誤."
+ "SUCCESS_MESSAGE": "資料夾刪除成功。",
+ "ERROR_MESSAGE": "刪除資料夾時發生錯誤。"
},
"API_SEGMENTS": {
- "SUCCESS_MESSAGE": "刪除成功",
- "ERROR_MESSAGE": "刪除時出錯"
+ "SUCCESS_MESSAGE": "區段刪除成功。",
+ "ERROR_MESSAGE": "刪除區段時發生錯誤。"
}
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/agentBots.json b/app/javascript/dashboard/i18n/locale/zh_TW/agentBots.json
index 800340f96..e10cd4c40 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/agentBots.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/agentBots.json
@@ -2,34 +2,34 @@
"AGENT_BOTS": {
"HEADER": "機器人",
"LOADING_EDITOR": "正在載入編輯器...",
- "DESCRIPTION": "代理機器人就像您團隊中最出色的成員。他們可以處理瑣碎的事務,讓您可以專注於重要的事情。試試看吧!您可以從此頁面管理您的機器人,或使用「新增機器人」按鈕建立新的機器人。",
- "LEARN_MORE": "Learn about agent bots",
- "COUNT": "{n} bot | {n} bots",
- "SEARCH_PLACEHOLDER": "Search bots...",
- "NO_RESULTS": "No bots found matching your search",
+ "DESCRIPTION": "機器人就像您團隊中最出色的成員。它們可以處理瑣碎的事務,讓您專注於重要的事情。試試看吧!您可以從此頁面管理機器人,或使用「新增機器人」按鈕建立新的機器人。",
+ "LEARN_MORE": "瞭解更多關於機器人",
+ "COUNT": "{n} 個機器人 | {n} 個機器人",
+ "SEARCH_PLACEHOLDER": "搜尋機器人...",
+ "NO_RESULTS": "找不到符合搜尋條件的機器人",
"GLOBAL_BOT": "系統機器人",
"GLOBAL_BOT_BADGE": "系統",
"AVATAR": {
- "SUCCESS_DELETE": "機器人頭像已成功刪除",
+ "SUCCESS_DELETE": "機器人頭像刪除成功",
"ERROR_DELETE": "刪除機器人頭像時發生錯誤,請再試一次"
},
"BOT_CONFIGURATION": {
- "TITLE": "選擇一個機器人",
- "DESC": "將機器人分配到您的收件匣中。它們可以處理初始對話,並在必要時轉接給真人客服",
+ "TITLE": "選擇機器人",
+ "DESC": "將機器人指派到您的收件匣。它們可以處理初始對話,並在需要時轉接給真人客服。",
"SUBMIT": "更新",
"DISCONNECT": "取消機器人連結",
- "SUCCESS_MESSAGE": "成功更新機器人",
- "DISCONNECTED_SUCCESS_MESSAGE": "成功解除機器人連結",
- "ERROR_MESSAGE": "無法更新機器人,請再試一次",
- "DISCONNECTED_ERROR_MESSAGE": "無法斷開機器人,請再試一次",
+ "SUCCESS_MESSAGE": "機器人更新成功。",
+ "DISCONNECTED_SUCCESS_MESSAGE": "機器人已成功解除連結。",
+ "ERROR_MESSAGE": "無法更新機器人,請再試一次。",
+ "DISCONNECTED_ERROR_MESSAGE": "無法解除機器人連結,請再試一次。",
"SELECT_PLACEHOLDER": "選擇機器人"
},
"ADD": {
"TITLE": "新增機器人",
"CANCEL_BUTTON_TEXT": "取消",
"API": {
- "SUCCESS_MESSAGE": "機器人新增成功.",
- "ERROR_MESSAGE": "無法新增機器人,請稍後再試."
+ "SUCCESS_MESSAGE": "機器人新增成功。",
+ "ERROR_MESSAGE": "無法新增機器人,請稍後再試。"
}
},
"LIST": {
@@ -51,24 +51,24 @@
"NO": "不,保留"
},
"API": {
- "SUCCESS_MESSAGE": "機器人刪除成功",
- "ERROR_MESSAGE": "無法刪除機器人,請再試一次"
+ "SUCCESS_MESSAGE": "機器人刪除成功。",
+ "ERROR_MESSAGE": "無法刪除機器人,請再試一次。"
}
},
"EDIT": {
"BUTTON_TEXT": "編輯",
"TITLE": "編輯機器人",
"API": {
- "SUCCESS_MESSAGE": "機器人更新成功.",
- "ERROR_MESSAGE": "無法更新機器人,請稍後再試"
+ "SUCCESS_MESSAGE": "機器人更新成功。",
+ "ERROR_MESSAGE": "無法更新機器人,請再試一次。"
}
},
"ACCESS_TOKEN": {
- "TITLE": "訪問 token",
- "DESCRIPTION": "複製訪問token並妥善保管",
- "COPY_SUCCESSFUL": "訪問token已複製到剪貼簿",
- "RESET_SUCCESS": "訪問token已成功重新產生",
- "RESET_ERROR": "無法重新產生訪問token。請再試一次"
+ "TITLE": "存取權杖",
+ "DESCRIPTION": "複製存取權杖並妥善保管",
+ "COPY_SUCCESSFUL": "存取權杖已複製到剪貼簿",
+ "RESET_SUCCESS": "存取權杖已成功重新產生",
+ "RESET_ERROR": "無法重新產生存取權杖,請再試一次"
},
"FORM": {
"AVATAR": {
@@ -80,8 +80,8 @@
"REQUIRED": "機器人名稱為必填"
},
"DESCRIPTION": {
- "LABEL": "描述資訊",
- "PLACEHOLDER": "這個機器人的作用是什麼"
+ "LABEL": "描述",
+ "PLACEHOLDER": "這個機器人的功能是什麼?"
},
"WEBHOOK_URL": {
"LABEL": "Webhook 網址",
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/agentMgmt.json b/app/javascript/dashboard/i18n/locale/zh_TW/agentMgmt.json
index 30d081ca3..635be6793 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/agentMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/agentMgmt.json
@@ -3,104 +3,104 @@
"HEADER": "客服",
"HEADER_BTN_TXT": "新增客服",
"LOADING": "正在取得客服列表",
- "DESCRIPTION": "代理是客戶支援團隊的成員,可以查看和回覆用戶訊息。下面的清單顯示了您帳戶中的所有代理程式。",
- "LEARN_MORE": "了解使用者角色",
+ "DESCRIPTION": "客服是您客戶支援團隊的成員,可以查看和回覆使用者訊息。以下列表顯示了您帳戶中的所有客服。",
+ "LEARN_MORE": "瞭解使用者角色",
"AGENT_TYPES": {
"ADMINISTRATOR": "管理員",
"AGENT": "客服"
},
- "COUNT": "{n} agent | {n} agents",
+ "COUNT": "{n} 位客服 | {n} 位客服",
"LIST": {
- "404": "沒有與此帳號關聯的客服",
+ "404": "沒有與此帳戶關聯的客服",
"TITLE": "管理您團隊中的客服",
- "DESC": "你可以新增 / 移除客服到你的團隊",
- "NAME": "姓名",
- "EMAIL": "電子信箱",
+ "DESC": "您可以新增或移除團隊中的客服。",
+ "NAME": "名稱",
+ "EMAIL": "電子郵件",
"STATUS": "狀態",
"ACTIONS": "操作",
- "VERIFIED": "已認證",
+ "VERIFIED": "已驗證",
"VERIFICATION_PENDING": "待驗證",
- "AVAILABLE_CUSTOM_ROLE": "可用的自定義角色權限"
+ "AVAILABLE_CUSTOM_ROLE": "可用的自訂角色權限"
},
"ADD": {
- "TITLE": "新增客服到你的團隊",
- "DESC": "您可以新增能夠支援您的收件匣的人",
+ "TITLE": "新增客服到您的團隊",
+ "DESC": "您可以新增能夠處理收件匣支援的人員。",
"CANCEL_BUTTON_TEXT": "取消",
"FORM": {
"NAME": {
- "LABEL": "客服姓名",
- "PLACEHOLDER": "請輸客服名稱"
+ "LABEL": "客服名稱",
+ "PLACEHOLDER": "請輸入客服名稱"
},
"AGENT_TYPE": {
- "LABEL": "客服角色",
+ "LABEL": "角色",
"PLACEHOLDER": "請選擇一個角色",
- "ERROR": "客服角色為必填"
+ "ERROR": "角色為必填"
},
"EMAIL": {
- "LABEL": "電子信箱地址",
- "PLACEHOLDER": "請輸入客服的電子郵件"
+ "LABEL": "電子郵件地址",
+ "PLACEHOLDER": "請輸入客服的電子郵件地址"
},
"SUBMIT": "新增客服"
},
"API": {
- "SUCCESS_MESSAGE": "成功新增客服",
- "EXIST_MESSAGE": "該電子郵件已被註冊,請輸入新的電子郵件",
+ "SUCCESS_MESSAGE": "客服新增成功",
+ "EXIST_MESSAGE": "該電子郵件已被使用,請嘗試其他電子郵件地址",
"ERROR_MESSAGE": "無法連接伺服器,請稍後再試"
}
},
"DELETE": {
"BUTTON_TEXT": "刪除",
"API": {
- "SUCCESS_MESSAGE": "刪除客服成功",
+ "SUCCESS_MESSAGE": "客服刪除成功",
"ERROR_MESSAGE": "無法連接伺服器,請稍後再試"
},
"CONFIRM": {
"TITLE": "確認刪除",
- "MESSAGE": "您確定要刪除嗎? ",
- "YES": "是,刪除 ",
- "NO": "不,保留 "
+ "MESSAGE": "您確定要刪除嗎?",
+ "YES": "是,刪除",
+ "NO": "不,保留"
}
},
"EDIT": {
"TITLE": "編輯客服",
"FORM": {
"NAME": {
- "LABEL": "客服姓名",
+ "LABEL": "客服名稱",
"PLACEHOLDER": "請輸入客服名稱"
},
"AGENT_TYPE": {
"LABEL": "角色",
"PLACEHOLDER": "請選擇一個角色",
- "ERROR": "客服角色為必填"
+ "ERROR": "角色為必填"
},
"EMAIL": {
- "LABEL": "電子信箱地址",
- "PLACEHOLDER": "請輸入客服的電子郵件"
+ "LABEL": "電子郵件地址",
+ "PLACEHOLDER": "請輸入客服的電子郵件地址"
},
"AGENT_AVAILABILITY": {
- "LABEL": "有效的",
- "PLACEHOLDER": "請選擇可用狀態",
- "ERROR": "Availability is required"
+ "LABEL": "上線狀態",
+ "PLACEHOLDER": "請選擇上線狀態",
+ "ERROR": "上線狀態為必填"
},
"SUBMIT": "編輯客服"
},
"BUTTON_TEXT": "編輯",
"CANCEL_BUTTON_TEXT": "取消",
"API": {
- "SUCCESS_MESSAGE": "更新客服資訊成功",
+ "SUCCESS_MESSAGE": "客服資訊更新成功",
"ERROR_MESSAGE": "無法連接伺服器,請稍後再試"
},
"PASSWORD_RESET": {
- "ADMIN_RESET_BUTTON": "重置密碼",
- "ADMIN_SUCCESS_MESSAGE": "一封包含重置密碼說明的電子郵件已發送給客服",
- "SUCCESS_MESSAGE": "客服密碼重置成功",
- "ERROR_MESSAGE": "無法連接 Chatwoot 伺服器,請稍後再試"
+ "ADMIN_RESET_BUTTON": "重設密碼",
+ "ADMIN_SUCCESS_MESSAGE": "一封包含重設密碼說明的電子郵件已傳送給客服",
+ "SUCCESS_MESSAGE": "客服密碼重設成功",
+ "ERROR_MESSAGE": "無法連接伺服器,請稍後再試"
}
},
"SEARCH_PLACEHOLDER": "搜尋客服...",
- "NO_RESULTS": "No agents found matching your search",
+ "NO_RESULTS": "找不到符合搜尋條件的客服",
"SEARCH": {
- "NO_RESULTS": "查無結果"
+ "NO_RESULTS": "查無結果。"
},
"MULTI_SELECTOR": {
"PLACEHOLDER": "無",
@@ -113,8 +113,8 @@
},
"SEARCH": {
"NO_RESULTS": {
- "AGENT": "查無客服",
- "TEAM": "查無團隊"
+ "AGENT": "找不到客服",
+ "TEAM": "找不到團隊"
},
"PLACEHOLDER": {
"AGENT": "搜尋客服",
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/attributesMgmt.json b/app/javascript/dashboard/i18n/locale/zh_TW/attributesMgmt.json
index 01bdafea1..9cc9dd6ed 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/attributesMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/attributesMgmt.json
@@ -3,11 +3,11 @@
"HEADER": "自訂屬性",
"HEADER_BTN_TXT": "新增自訂屬性",
"LOADING": "正在取得自訂屬性",
- "DESCRIPTION": "自定義屬性可用於追蹤有關聯絡人或對話的額外詳情,例如訂閱方案或首次購買的日期。您可以添加不同類型的自定義屬性,如文字、清單或數字,以捕捉您所需的特定資訊。",
- "LEARN_MORE": "Learn more about custom attributes",
- "COUNT": "{n} attribute | {n} attributes",
- "SEARCH_PLACEHOLDER": "Search attributes...",
- "NO_RESULTS": "No attributes found matching your search",
+ "DESCRIPTION": "自訂屬性用於追蹤聯絡人或對話的額外詳情,例如訂閱方案或首次購買的日期。您可以新增不同類型的自訂屬性,如文字、清單或數字,以擷取您所需的特定資訊。",
+ "LEARN_MORE": "瞭解更多關於自訂屬性",
+ "COUNT": "{n} 個屬性 | {n} 個屬性",
+ "SEARCH_PLACEHOLDER": "搜尋屬性...",
+ "NO_RESULTS": "找不到符合搜尋條件的屬性",
"ATTRIBUTE_MODELS": {
"CONVERSATION": "對話",
"CONTACT": "聯絡人"
@@ -17,7 +17,7 @@
"NUMBER": "數字",
"LINK": "連結",
"DATE": "日期",
- "LIST": "列表",
+ "LIST": "清單",
"CHECKBOX": "勾選框"
},
"ADD": {
@@ -27,82 +27,82 @@
"FORM": {
"NAME": {
"LABEL": "顯示名稱",
- "PLACEHOLDER": "Enter custom attribute display name",
+ "PLACEHOLDER": "輸入自訂屬性顯示名稱",
"ERROR": "名稱為必填"
},
"DESC": {
- "LABEL": "描述資訊",
- "PLACEHOLDER": "Enter custom attribute description",
+ "LABEL": "描述",
+ "PLACEHOLDER": "輸入自訂屬性描述",
"ERROR": "描述為必填"
},
"MODEL": {
- "LABEL": "Applies to",
+ "LABEL": "適用於",
"PLACEHOLDER": "請選擇其中一個",
- "ERROR": "Model is required"
+ "ERROR": "模型為必填"
},
"TYPE": {
- "LABEL": "類別",
- "PLACEHOLDER": "請選擇一個類別",
- "ERROR": "類別為必填",
+ "LABEL": "類型",
+ "PLACEHOLDER": "請選擇一個類型",
+ "ERROR": "類型為必填",
"LIST": {
- "LABEL": "List Values",
- "PLACEHOLDER": "Please enter value and press enter key",
- "ERROR": "Must have at least one value"
+ "LABEL": "清單值",
+ "PLACEHOLDER": "請輸入值並按下 Enter 鍵",
+ "ERROR": "至少需要一個值"
}
},
"KEY": {
- "LABEL": "Key",
- "PLACEHOLDER": "Enter custom attribute key",
- "ERROR": "Key is required",
- "IN_VALID": "Invalid key"
+ "LABEL": "鍵值",
+ "PLACEHOLDER": "輸入自訂屬性鍵值",
+ "ERROR": "鍵值為必填",
+ "IN_VALID": "無效的鍵值"
},
"REGEX_PATTERN": {
- "LABEL": "Regex Pattern",
- "PLACEHOLDER": "Please enter custom attribute regex pattern. (Optional)"
+ "LABEL": "正規表達式",
+ "PLACEHOLDER": "請輸入自訂屬性的正規表達式(選填)"
},
"REGEX_CUE": {
- "LABEL": "Regex Cue",
- "PLACEHOLDER": "Please enter regex pattern hint. (Optional)"
+ "LABEL": "正規表達式提示",
+ "PLACEHOLDER": "請輸入正規表達式提示(選填)"
},
"ENABLE_REGEX": {
- "LABEL": "Enable regex validation"
+ "LABEL": "啟用正規表達式驗證"
},
"BADGES": {
- "PRE_CHAT": "Pre-chat",
- "RESOLUTION": "Resolution"
+ "PRE_CHAT": "對話前表單",
+ "RESOLUTION": "結案"
}
},
"API": {
- "SUCCESS_MESSAGE": "Custom Attribute added successfully!",
- "ERROR_MESSAGE": "Could not create a Custom Attribute. Please try again later."
+ "SUCCESS_MESSAGE": "自訂屬性新增成功!",
+ "ERROR_MESSAGE": "無法建立自訂屬性,請稍後再試。"
}
},
"DELETE": {
"BUTTON_TEXT": "刪除",
"API": {
- "SUCCESS_MESSAGE": "Custom Attribute deleted successfully.",
- "ERROR_MESSAGE": "Couldn't delete the custom attribute. Try again."
+ "SUCCESS_MESSAGE": "自訂屬性刪除成功。",
+ "ERROR_MESSAGE": "無法刪除自訂屬性,請再試一次。"
},
"CONFIRM": {
- "TITLE": "確定要刪除 - {attributeName} ?",
+ "TITLE": "確定要刪除 - {attributeName} 嗎?",
"PLACE_HOLDER": "請輸入 {attributeName} 以確認",
- "MESSAGE": "Deleting will remove the custom attribute",
- "YES": "刪除 ",
+ "MESSAGE": "刪除後將移除此自訂屬性",
+ "YES": "刪除",
"NO": "取消"
}
},
"EDIT": {
- "TITLE": "Edit Custom Attribute",
+ "TITLE": "編輯自訂屬性",
"UPDATE_BUTTON_TEXT": "更新",
"TYPE": {
"LIST": {
- "LABEL": "List Values",
- "PLACEHOLDER": "Please enter values and press enter key"
+ "LABEL": "清單值",
+ "PLACEHOLDER": "請輸入值並按下 Enter 鍵"
}
},
"API": {
- "SUCCESS_MESSAGE": "Custom Attribute updated successfully",
- "ERROR_MESSAGE": "There was an error updating custom attribute, please try again"
+ "SUCCESS_MESSAGE": "自訂屬性更新成功",
+ "ERROR_MESSAGE": "更新自訂屬性時發生錯誤,請再試一次"
}
},
"TABS": {
@@ -112,34 +112,34 @@
},
"LIST": {
"TABLE_HEADER": {
- "NAME": "姓名",
- "DESCRIPTION": "描述資訊",
- "TYPE": "類別",
- "KEY": "Key"
+ "NAME": "名稱",
+ "DESCRIPTION": "描述",
+ "TYPE": "類型",
+ "KEY": "鍵值"
},
"BUTTONS": {
"EDIT": "編輯",
"DELETE": "刪除"
},
"EMPTY_RESULT": {
- "404": "There are no custom attributes created",
- "NOT_FOUND": "There are no custom attributes configured"
+ "404": "尚未建立任何自訂屬性",
+ "NOT_FOUND": "尚未設定任何自訂屬性"
},
"REGEX_PATTERN": {
- "LABEL": "Regex Pattern",
- "PLACEHOLDER": "Please enter custom attribute regex pattern. (Optional)"
+ "LABEL": "正規表達式",
+ "PLACEHOLDER": "請輸入自訂屬性的正規表達式(選填)"
},
"REGEX_CUE": {
- "LABEL": "Regex Cue",
- "PLACEHOLDER": "Please enter regex pattern hint. (Optional)"
+ "LABEL": "正規表達式提示",
+ "PLACEHOLDER": "請輸入正規表達式提示(選填)"
},
"ENABLE_REGEX": {
- "LABEL": "Enable regex validation"
+ "LABEL": "啟用正規表達式驗證"
}
},
"BADGES": {
- "PRE_CHAT": "Pre-chat",
- "RESOLUTION": "Resolution"
+ "PRE_CHAT": "對話前表單",
+ "RESOLUTION": "結案"
}
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/auditLogs.json b/app/javascript/dashboard/i18n/locale/zh_TW/auditLogs.json
index 11962694c..90cc75ed7 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/auditLogs.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/auditLogs.json
@@ -1,74 +1,74 @@
{
"AUDIT_LOGS": {
"HEADER": "稽核日誌",
- "HEADER_BTN_TXT": "新增審計日誌",
- "LOADING": "正在獲取審計日誌",
- "DESCRIPTION": "稽核日誌儲存您賬戶中的活動記錄,允許您跟蹤和審計您的賬戶、團隊或服務。",
- "LEARN_MORE": "瞭解更多關於審計日誌的資訊",
- "SEARCH_404": "沒有任何項目符合此查詢",
- "SIDEBAR_TXT": "審計日誌
審計日誌是 Chatwoot 系統中事件和操作的痕跡。
",
+ "HEADER_BTN_TXT": "新增稽核日誌",
+ "LOADING": "正在載入稽核日誌",
+ "DESCRIPTION": "稽核日誌記錄您帳戶中的所有活動,讓您可以追蹤與稽核帳戶、團隊或服務的異動。",
+ "LEARN_MORE": "了解更多關於稽核日誌的資訊",
+ "SEARCH_404": "沒有符合此查詢的項目",
+ "SIDEBAR_TXT": "稽核日誌
稽核日誌記錄 Chatwoot 系統中的事件與操作軌跡。
",
"LIST": {
- "404": "此賬戶中沒有可用的審計日誌。",
- "TITLE": "管理審計日誌",
- "DESC": "審計日誌是 Chatwoot 系統中事件和操作的痕跡。",
+ "404": "此帳戶中沒有可用的稽核日誌。",
+ "TITLE": "管理稽核日誌",
+ "DESC": "稽核日誌記錄 Chatwoot 系統中的事件與操作軌跡。",
"TABLE_HEADER": {
- "ACTIVITY": "User",
- "TIME": "Action",
- "IP_ADDRESS": "IP 位置"
+ "ACTIVITY": "活動",
+ "TIME": "時間",
+ "IP_ADDRESS": "IP 位址"
}
},
"API": {
- "SUCCESS_MESSAGE": "審計日誌獲取成功",
- "ERROR_MESSAGE": "無法連接伺服器,請稍後再試"
+ "SUCCESS_MESSAGE": "稽核日誌取得成功",
+ "ERROR_MESSAGE": "無法連線至伺服器,請稍後再試。"
},
"DEFAULT_USER": "系統",
"AUTOMATION_RULE": {
- "ADD": "{agentName} 建立了一個新的自動化規則 (#{id})",
- "EDIT": "{agentName} 更新了一個自動化規則 (#{id})",
- "DELETE": "{agentName} 刪除了一個自動化規則 (#{id})"
+ "ADD": "{agentName} 建立了新的自動化規則(#{id})",
+ "EDIT": "{agentName} 更新了自動化規則(#{id})",
+ "DELETE": "{agentName} 刪除了自動化規則(#{id})"
},
"ACCOUNT_USER": {
- "ADD": "{agentName} 邀請了 {invitee} 加入賬戶作為 {role}",
+ "ADD": "{agentName} 邀請 {invitee} 以 {role} 身分加入帳戶",
"EDIT": {
- "SELF": "{agentName} 將其 {attributes} 更改為 {values}",
- "OTHER": "{agentName} 將 {user} 的 {attributes} 更改為 {values}",
- "DELETED": "{agentName} 將一個已刪除使用者的 {attributes} 更改為 {values}"
+ "SELF": "{agentName} 將自己的 {attributes} 變更為 {values}",
+ "OTHER": "{agentName} 將 {user} 的 {attributes} 變更為 {values}",
+ "DELETED": "{agentName} 將已刪除使用者的 {attributes} 變更為 {values}"
}
},
"INBOX": {
- "ADD": "{agentName} 建立了一個新的收件箱 (#{id})",
- "EDIT": "{agentName} 更新了一個收件箱 (#{id})",
- "DELETE": "{agentName} 刪除了一個收件箱 (#{id})"
+ "ADD": "{agentName} 建立了新的收件匣(#{id})",
+ "EDIT": "{agentName} 更新了收件匣(#{id})",
+ "DELETE": "{agentName} 刪除了收件匣(#{id})"
},
"WEBHOOK": {
- "ADD": "{agentName} 建立了一個新的 webhook (#{id})",
- "EDIT": "{agentName} 更新了一個 webhook (#{id})",
- "DELETE": "{agentName} 刪除了一個 webhook (#{id})"
+ "ADD": "{agentName} 建立了新的 Webhook(#{id})",
+ "EDIT": "{agentName} 更新了 Webhook(#{id})",
+ "DELETE": "{agentName} 刪除了 Webhook(#{id})"
},
"USER_ACTION": {
- "SIGN_IN": "{agentName} 登入",
- "SIGN_OUT": "{agentName} 登出"
+ "SIGN_IN": "{agentName} 已登入",
+ "SIGN_OUT": "{agentName} 已登出"
},
"TEAM": {
- "ADD": "{agentName} 建立了一個新的團隊 (#{id})",
- "EDIT": "{agentName} 更新了一個團隊 (#{id})",
- "DELETE": "{agentName} 刪除了一個團隊 (#{id})"
+ "ADD": "{agentName} 建立了新的團隊(#{id})",
+ "EDIT": "{agentName} 更新了團隊(#{id})",
+ "DELETE": "{agentName} 刪除了團隊(#{id})"
},
"MACRO": {
- "ADD": "{agentName} 建立了一個新的宏 (#{id})",
- "EDIT": "{agentName} 更新了一個宏 (#{id})",
- "DELETE": "{agentName} 刪除了一個宏 (#{id})"
+ "ADD": "{agentName} 建立了新的巨集(#{id})",
+ "EDIT": "{agentName} 更新了巨集(#{id})",
+ "DELETE": "{agentName} 刪除了巨集(#{id})"
},
"INBOX_MEMBER": {
- "ADD": "{agentName} 將 {user} 新增到收件箱 (#{inbox_id})",
- "REMOVE": "{agentName} 將 {user} 從收件箱 (#{inbox_id}) 中移除"
+ "ADD": "{agentName} 將 {user} 新增至收件匣(#{inbox_id})",
+ "REMOVE": "{agentName} 將 {user} 從收件匣(#{inbox_id})中移除"
},
"TEAM_MEMBER": {
- "ADD": "{agentName} 將 {user} 新增到團隊 (#{team_id})",
- "REMOVE": "{agentName} 將 {user} 從團隊 (#{team_id}) 中移除"
+ "ADD": "{agentName} 將 {user} 新增至團隊(#{team_id})",
+ "REMOVE": "{agentName} 將 {user} 從團隊(#{team_id})中移除"
},
"ACCOUNT": {
- "EDIT": "{agentName} 更新了賬戶配置 (#{id})"
+ "EDIT": "{agentName} 更新了帳戶設定(#{id})"
},
"CONVERSATION": {
"DELETE": "{agentName} 刪除了對話 #{id}"
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/automation.json b/app/javascript/dashboard/i18n/locale/zh_TW/automation.json
index 53bdf309e..250d2a8d2 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/automation.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/automation.json
@@ -1,55 +1,55 @@
{
"AUTOMATION": {
"HEADER": "自動化",
- "DESCRIPTION": "Automation can replace and streamline existing processes that require manual effort, such as adding labels and assigning conversations to the most suitable agent. This allows the team to focus on their strengths while reducing time spent on routine tasks.",
- "LEARN_MORE": "Learn more about automation",
- "COUNT": "{n} automation | {n} automations",
- "HEADER_BTN_TXT": "Create Automation",
- "LOADING": "Fetching automation rules",
- "SEARCH_PLACEHOLDER": "Search automation rules...",
- "NO_RESULTS": "No automation rules found matching your search",
+ "DESCRIPTION": "自動化可以取代並簡化需要手動執行的現有流程,例如新增標籤和將對話指派給最合適的客服人員。這讓團隊能夠專注於核心工作,同時減少花在例行事務上的時間。",
+ "LEARN_MORE": "瞭解更多關於自動化的資訊",
+ "COUNT": "{n} 條自動化規則 | {n} 條自動化規則",
+ "HEADER_BTN_TXT": "建立自動化",
+ "LOADING": "正在載入自動化規則",
+ "SEARCH_PLACEHOLDER": "搜尋自動化規則...",
+ "NO_RESULTS": "找不到符合搜尋條件的自動化規則",
"ADD": {
"TITLE": "新增自動化規則",
"SUBMIT": "建立",
"CANCEL_BUTTON_TEXT": "取消",
"FORM": {
"NAME": {
- "LABEL": "Rule Name",
- "PLACEHOLDER": "Enter rule name",
+ "LABEL": "規則名稱",
+ "PLACEHOLDER": "輸入規則名稱",
"ERROR": "名稱為必填"
},
"DESC": {
- "LABEL": "描述資訊",
- "PLACEHOLDER": "Enter rule description",
+ "LABEL": "描述",
+ "PLACEHOLDER": "輸入規則描述",
"ERROR": "描述為必填"
},
"EVENT": {
- "LABEL": "Event",
- "PLACEHOLDER": "請選擇其中一個",
- "ERROR": "Event is required"
+ "LABEL": "事件",
+ "PLACEHOLDER": "請選擇一項",
+ "ERROR": "事件為必填"
},
"CONDITIONS": {
- "LABEL": "Conditions"
+ "LABEL": "條件"
},
"ACTIONS": {
- "LABEL": "操作"
+ "LABEL": "動作"
}
},
- "CONDITION_BUTTON_LABEL": "Add Condition",
- "ACTION_BUTTON_LABEL": "Add Action",
+ "CONDITION_BUTTON_LABEL": "新增條件",
+ "ACTION_BUTTON_LABEL": "新增動作",
"API": {
- "SUCCESS_MESSAGE": "Automation rule added successfully",
- "ERROR_MESSAGE": "Could not able to create a automation rule, Please try again later"
+ "SUCCESS_MESSAGE": "自動化規則已成功建立",
+ "ERROR_MESSAGE": "無法建立自動化規則,請稍後再試"
}
},
"LIST": {
"TABLE_HEADER": {
- "NAME": "姓名",
- "ACTIVE": "Active",
- "CREATED_ON": "Created on",
+ "NAME": "名稱",
+ "ACTIVE": "啟用",
+ "CREATED_ON": "建立時間",
"ACTIONS": "操作"
},
- "404": "No automation rules found"
+ "404": "找不到任何自動化規則"
},
"DELETE": {
"TITLE": "刪除自動化規則",
@@ -62,8 +62,8 @@
"NO": "不,保留 "
},
"API": {
- "SUCCESS_MESSAGE": "Automation rule deleted successfully",
- "ERROR_MESSAGE": "Could not able to delete a automation rule, Please try again later"
+ "SUCCESS_MESSAGE": "自動化規則已成功刪除",
+ "ERROR_MESSAGE": "無法刪除自動化規則,請稍後再試"
}
},
"EDIT": {
@@ -71,15 +71,15 @@
"SUBMIT": "更新",
"CANCEL_BUTTON_TEXT": "取消",
"API": {
- "SUCCESS_MESSAGE": "Automation rule updated successfully",
- "ERROR_MESSAGE": "Could not update automation rule, Please try again later"
+ "SUCCESS_MESSAGE": "自動化規則已成功更新",
+ "ERROR_MESSAGE": "無法更新自動化規則,請稍後再試"
}
},
"CLONE": {
- "TOOLTIP": "Clone",
+ "TOOLTIP": "複製",
"API": {
- "SUCCESS_MESSAGE": "Automation cloned successfully",
- "ERROR_MESSAGE": "Could not clone automation rule, Please try again later"
+ "SUCCESS_MESSAGE": "自動化規則已成功複製",
+ "ERROR_MESSAGE": "無法複製自動化規則,請稍後再試"
}
},
"FORM": {
@@ -87,101 +87,101 @@
"CREATE": "建立",
"DELETE": "刪除",
"CANCEL": "取消",
- "RESET_MESSAGE": "Changing event type will reset the conditions and events you have added below"
+ "RESET_MESSAGE": "變更事件類型將會重置您在下方新增的條件與動作"
},
"CONDITION": {
- "DELETE_MESSAGE": "You need to have atleast one condition to save",
- "CONTACT_CUSTOM_ATTR_LABEL": "Contact Custom Attributes",
- "CONVERSATION_CUSTOM_ATTR_LABEL": "Conversation Custom Attributes"
+ "DELETE_MESSAGE": "您至少需要保留一個條件才能儲存",
+ "CONTACT_CUSTOM_ATTR_LABEL": "聯絡人自訂屬性",
+ "CONVERSATION_CUSTOM_ATTR_LABEL": "對話自訂屬性"
},
"ACTION": {
- "DELETE_MESSAGE": "You need to have atleast one action to save",
- "TEAM_MESSAGE_INPUT_PLACEHOLDER": "Enter your message here",
- "TEAM_DROPDOWN_PLACEHOLDER": "Select teams",
- "EMAIL_INPUT_PLACEHOLDER": "Enter email",
- "URL_INPUT_PLACEHOLDER": "Enter URL"
+ "DELETE_MESSAGE": "您至少需要保留一個動作才能儲存",
+ "TEAM_MESSAGE_INPUT_PLACEHOLDER": "在此輸入您的訊息",
+ "TEAM_DROPDOWN_PLACEHOLDER": "選擇團隊",
+ "EMAIL_INPUT_PLACEHOLDER": "輸入電子郵件",
+ "URL_INPUT_PLACEHOLDER": "輸入 URL"
},
"TOGGLE": {
"ACTIVATION_TITLE": "啟用自動化規則",
"DEACTIVATION_TITLE": "停用自動化規則",
- "ACTIVATION_DESCRIPTION": "This action will activate the automation rule '{automationName}'. Are you sure you want to proceed?",
- "DEACTIVATION_DESCRIPTION": "This action will deactivate the automation rule '{automationName}'. Are you sure you want to proceed?",
- "ACTIVATION_SUCCESFUL": "Automation Rule Activated Successfully",
- "DEACTIVATION_SUCCESFUL": "Automation Rule Deactivated Successfully",
- "ACTIVATION_ERROR": "Could not Activate Automation, Please try again later",
- "DEACTIVATION_ERROR": "Could not Deactivate Automation, Please try again later",
+ "ACTIVATION_DESCRIPTION": "此操作將啟用自動化規則「{automationName}」。您確定要繼續嗎?",
+ "DEACTIVATION_DESCRIPTION": "此操作將停用自動化規則「{automationName}」。您確定要繼續嗎?",
+ "ACTIVATION_SUCCESFUL": "自動化規則已成功啟用",
+ "DEACTIVATION_SUCCESFUL": "自動化規則已成功停用",
+ "ACTIVATION_ERROR": "無法啟用自動化規則,請稍後再試",
+ "DEACTIVATION_ERROR": "無法停用自動化規則,請稍後再試",
"CONFIRMATION_LABEL": "是",
"CANCEL_LABEL": "否"
},
"ATTACHMENT": {
- "UPLOAD_ERROR": "Could not upload attachment, Please try again",
- "LABEL_IDLE": "Upload Attachment",
- "LABEL_UPLOADING": "上傳中",
- "LABEL_UPLOADED": "Successfully Uploaded",
- "LABEL_UPLOAD_FAILED": "Upload Failed"
+ "UPLOAD_ERROR": "無法上傳附件,請再試一次",
+ "LABEL_IDLE": "上傳附件",
+ "LABEL_UPLOADING": "上傳中...",
+ "LABEL_UPLOADED": "上傳成功",
+ "LABEL_UPLOAD_FAILED": "上傳失敗"
},
"ERRORS": {
- "ATTRIBUTE_KEY_REQUIRED": "Attribute key is required",
- "FILTER_OPERATOR_REQUIRED": "Filter operator is required",
- "VALUE_REQUIRED": "此欄位為必填項目",
- "VALUE_MUST_BE_BETWEEN_1_AND_998": "Value must be between 1 and 998",
- "ACTION_PARAMETERS_REQUIRED": "Action parameters are required",
- "ATLEAST_ONE_CONDITION_REQUIRED": "At least one condition is required",
- "ATLEAST_ONE_ACTION_REQUIRED": "At least one action is required"
+ "ATTRIBUTE_KEY_REQUIRED": "屬性鍵值為必填",
+ "FILTER_OPERATOR_REQUIRED": "篩選運算子為必填",
+ "VALUE_REQUIRED": "值為必填",
+ "VALUE_MUST_BE_BETWEEN_1_AND_998": "值必須介於 1 到 998 之間",
+ "ACTION_PARAMETERS_REQUIRED": "動作參數為必填",
+ "ATLEAST_ONE_CONDITION_REQUIRED": "至少需要一個條件",
+ "ATLEAST_ONE_ACTION_REQUIRED": "至少需要一個動作"
},
"NONE_OPTION": "無",
"EVENTS": {
- "CONVERSATION_CREATED": "Conversation Created",
- "CONVERSATION_UPDATED": "Conversation Updated",
- "MESSAGE_CREATED": "Message Created",
- "CONVERSATION_RESOLVED": "Conversation Resolved",
- "CONVERSATION_OPENED": "Conversation Opened"
+ "CONVERSATION_CREATED": "對話已建立",
+ "CONVERSATION_UPDATED": "對話已更新",
+ "MESSAGE_CREATED": "訊息已建立",
+ "CONVERSATION_RESOLVED": "對話已解決",
+ "CONVERSATION_OPENED": "對話已開啟"
},
"ACTIONS": {
- "ASSIGN_AGENT": "Assign to Agent",
- "ASSIGN_TEAM": "Assign a Team",
- "ADD_LABEL": "Add a Label",
- "REMOVE_LABEL": "Remove a Label",
- "SEND_EMAIL_TO_TEAM": "Send an Email to Team",
- "SEND_EMAIL_TRANSCRIPT": "Send an Email Transcript",
+ "ASSIGN_AGENT": "指派給客服人員",
+ "ASSIGN_TEAM": "指派團隊",
+ "ADD_LABEL": "新增標籤",
+ "REMOVE_LABEL": "移除標籤",
+ "SEND_EMAIL_TO_TEAM": "傳送電子郵件給團隊",
+ "SEND_EMAIL_TRANSCRIPT": "傳送電子郵件對話記錄",
"MUTE_CONVERSATION": "將對話靜音",
- "SNOOZE_CONVERSATION": "Snooze Conversation",
- "RESOLVE_CONVERSATION": "Resolve Conversation",
- "SEND_WEBHOOK_EVENT": "Send Webhook Event",
- "SEND_ATTACHMENT": "Send Attachment",
- "SEND_MESSAGE": "Send a Message",
- "ADD_PRIVATE_NOTE": "Add a Private Note",
- "CHANGE_PRIORITY": "Change Priority",
- "ADD_SLA": "Add SLA",
+ "SNOOZE_CONVERSATION": "暫停對話通知",
+ "RESOLVE_CONVERSATION": "解決對話",
+ "SEND_WEBHOOK_EVENT": "傳送 Webhook 事件",
+ "SEND_ATTACHMENT": "傳送附件",
+ "SEND_MESSAGE": "傳送訊息",
+ "ADD_PRIVATE_NOTE": "新增私人備註",
+ "CHANGE_PRIORITY": "變更優先順序",
+ "ADD_SLA": "新增 SLA",
"OPEN_CONVERSATION": "開啟對話",
- "PENDING_CONVERSATION": "Mark conversation as pending"
+ "PENDING_CONVERSATION": "將對話標記為待處理"
},
"MESSAGE_TYPES": {
- "INCOMING": "Incoming Message",
- "OUTGOING": "Outgoing Message"
+ "INCOMING": "接收的訊息",
+ "OUTGOING": "傳送的訊息"
},
"PRIORITY_TYPES": {
"NONE": "無",
- "LOW": "Low",
- "MEDIUM": "Medium",
- "HIGH": "High",
- "URGENT": "Urgent"
+ "LOW": "低",
+ "MEDIUM": "中",
+ "HIGH": "高",
+ "URGENT": "緊急"
},
"ATTRIBUTES": {
- "MESSAGE_TYPE": "Message Type",
- "MESSAGE_CONTAINS": "Message Contains",
- "EMAIL": "Email",
+ "MESSAGE_TYPE": "訊息類型",
+ "MESSAGE_CONTAINS": "訊息包含",
+ "EMAIL": "電子郵件",
"INBOX": "收件匣",
- "CONVERSATION_LANGUAGE": "Conversation Language",
- "PHONE_NUMBER": "聯絡人電話",
+ "CONVERSATION_LANGUAGE": "對話語言",
+ "PHONE_NUMBER": "電話號碼",
"STATUS": "狀態",
"BROWSER_LANGUAGE": "瀏覽器語言",
- "MAIL_SUBJECT": "Email Subject",
+ "MAIL_SUBJECT": "郵件主旨",
"COUNTRY_NAME": "國家",
- "REFERER_LINK": "Referrer Link",
- "ASSIGNEE_NAME": "Assignee",
- "TEAM_NAME": "Team",
- "PRIORITY": "優先程度",
+ "REFERER_LINK": "來源連結",
+ "ASSIGNEE_NAME": "負責人",
+ "TEAM_NAME": "團隊",
+ "PRIORITY": "優先順序",
"LABELS": "標籤"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/bulkActions.json b/app/javascript/dashboard/i18n/locale/zh_TW/bulkActions.json
index dce7ec159..22d4b3ea8 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/bulkActions.json
@@ -2,44 +2,44 @@
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "已選擇 {conversationCount} 個對話",
"AGENT_SELECT_LABEL": "選擇客服",
- "ASSIGN_CONFIRMATION_LABEL": "您確定要將 {conversationCount} 個 {conversationLabel} 分配給",
- "UNASSIGN_CONFIRMATION_LABEL": "您確定要取消分配 {conversationCount} 個 {conversationLabel} 嗎?",
+ "ASSIGN_CONFIRMATION_LABEL": "您確定要將 {conversationCount} 個{conversationLabel}指派給",
+ "UNASSIGN_CONFIRMATION_LABEL": "您確定要取消指派 {conversationCount} 個{conversationLabel}嗎?",
"GO_BACK_LABEL": "返回",
"ASSIGN_LABEL": "指派",
"YES": "是",
"SEARCH_INPUT_PLACEHOLDER": "搜尋",
"ASSIGN_AGENT_TOOLTIP": "指派客服",
"ASSIGN_TEAM_TOOLTIP": "指派團隊",
- "ASSIGN_SUCCESFUL": "對話分配成功.",
- "ASSIGN_FAILED": "分配對話失敗。請再試一次。",
- "RESOLVE_SUCCESFUL": "成功將對話標記為已解決.",
- "RESOLVE_FAILED": "解決對話失敗。請再試一次。",
+ "ASSIGN_SUCCESFUL": "對話指派成功。",
+ "ASSIGN_FAILED": "指派對話失敗,請再試一次。",
+ "RESOLVE_SUCCESFUL": "對話已成功標記為已解決。",
+ "RESOLVE_FAILED": "解決對話失敗,請再試一次。",
"ALL_CONVERSATIONS_SELECTED_ALERT": "僅選擇了此頁面上可見的對話。",
- "AGENT_LIST_LOADING": "正在載入客服代表",
+ "AGENT_LIST_LOADING": "正在載入客服列表",
"UPDATE": {
- "CHANGE_STATUS": "更改狀態",
+ "CHANGE_STATUS": "變更狀態",
"SNOOZE_UNTIL": "擱置",
"UPDATE_SUCCESFUL": "對話狀態更新成功。",
- "UPDATE_FAILED": "更新對話失敗。請再試一次。"
+ "UPDATE_FAILED": "更新對話失敗,請再試一次。"
},
"RESOLVE": {
- "ALL_MISSING_ATTRIBUTES": "Cannot resolve conversations due to missing required attributes",
- "PARTIAL_SUCCESS": "Some conversations need required attributes before resolving and were skipped"
+ "ALL_MISSING_ATTRIBUTES": "由於缺少必填屬性,無法解決對話",
+ "PARTIAL_SUCCESS": "部分對話因缺少必填屬性而被跳過"
},
"LABELS": {
- "ASSIGN_LABELS": "標記標籤",
- "NO_LABELS_FOUND": "查無標籤",
- "ASSIGN_SELECTED_LABELS": "分配指定的標籤",
- "ASSIGN_SUCCESFUL": "已成功分配標籤.",
- "ASSIGN_FAILED": "分配標籤失敗。請再試一次。"
+ "ASSIGN_LABELS": "指派標籤",
+ "NO_LABELS_FOUND": "找不到標籤",
+ "ASSIGN_SELECTED_LABELS": "指派已選標籤",
+ "ASSIGN_SUCCESFUL": "標籤指派成功。",
+ "ASSIGN_FAILED": "指派標籤失敗,請再試一次。"
},
"TEAMS": {
"TEAM_SELECT_LABEL": "選擇團隊",
"NONE": "無",
- "NO_TEAMS_AVAILABLE": "此帳戶尚未新增團隊。",
- "ASSIGN_SELECTED_TEAMS": "分配選定的團隊。",
- "ASSIGN_SUCCESFUL": "團隊分配成功。",
- "ASSIGN_FAILED": "分配團隊失敗。請再試一次。"
+ "NO_TEAMS_AVAILABLE": "此帳戶尚未新增任何團隊。",
+ "ASSIGN_SELECTED_TEAMS": "指派已選團隊。",
+ "ASSIGN_SUCCESFUL": "團隊指派成功。",
+ "ASSIGN_FAILED": "指派團隊失敗,請再試一次。"
}
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/campaign.json b/app/javascript/dashboard/i18n/locale/zh_TW/campaign.json
index 9be6b0405..427bd03ee 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/campaign.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/campaign.json
@@ -1,7 +1,7 @@
{
"CAMPAIGN": {
"LIVE_CHAT": {
- "HEADER_TITLE": "實時聊天活動",
+ "HEADER_TITLE": "即時聊天活動",
"NEW_CAMPAIGN": "建立活動",
"CARD": {
"STATUS": {
@@ -9,18 +9,18 @@
"DISABLED": "已停用"
},
"CAMPAIGN_DETAILS": {
- "SENT_BY": "發送者:",
+ "SENT_BY": "發送者",
"BOT": "機器人",
- "FROM": "發自",
- "URL": "網址:"
+ "FROM": "來自",
+ "URL": "URL:"
}
},
"EMPTY_STATE": {
- "TITLE": "暫無實時聊天活動",
- "SUBTITLE": "透過主動訊息與您的客戶連線。點選 '建立活動' 開始。"
+ "TITLE": "目前沒有即時聊天活動",
+ "SUBTITLE": "透過主動訊息與您的客戶建立連結。點選「建立活動」以開始。"
},
"CREATE": {
- "TITLE": "建立實時聊天活動",
+ "TITLE": "建立即時聊天活動",
"CANCEL_BUTTON_TEXT": "取消",
"CREATE_BUTTON_TEXT": "建立",
"FORM": {
@@ -37,44 +37,44 @@
"INBOX": {
"LABEL": "選擇收件匣",
"PLACEHOLDER": "選擇收件匣",
- "ERROR": "收件箱是必填項"
+ "ERROR": "收件匣為必填"
},
"SENT_BY": {
- "LABEL": "發送者:",
- "PLACEHOLDER": "請選擇發件人",
+ "LABEL": "發送者",
+ "PLACEHOLDER": "請選擇發送者",
"ERROR": "發送者為必填"
},
"END_POINT": {
- "LABEL": "網址",
+ "LABEL": "URL",
"PLACEHOLDER": "請輸入 URL",
- "ERROR": "請輸入一個有效的 URL"
+ "ERROR": "請輸入有效的 URL"
},
"TIME_ON_PAGE": {
"LABEL": "頁面停留時間(秒)",
"PLACEHOLDER": "請輸入時間",
- "ERROR": "頁面停留時間是必填項"
+ "ERROR": "頁面停留時間為必填"
},
"OTHER_PREFERENCES": {
"TITLE": "其他設定",
"ENABLED": "啟用活動",
- "TRIGGER_ONLY_BUSINESS_HOURS": "僅在工作時間觸發"
+ "TRIGGER_ONLY_BUSINESS_HOURS": "僅在營業時間觸發"
},
"BUTTONS": {
"CREATE": "建立",
"CANCEL": "取消"
},
"API": {
- "SUCCESS_MESSAGE": "實時聊天活動建立成功",
- "ERROR_MESSAGE": "出現錯誤,請重試。"
+ "SUCCESS_MESSAGE": "即時聊天活動建立成功",
+ "ERROR_MESSAGE": "發生錯誤,請重試。"
}
}
},
"EDIT": {
- "TITLE": "編輯實時聊天活動",
+ "TITLE": "編輯即時聊天活動",
"FORM": {
"API": {
- "SUCCESS_MESSAGE": "實時聊天活動更新成功",
- "ERROR_MESSAGE": "出現錯誤,請重試。"
+ "SUCCESS_MESSAGE": "即時聊天活動更新成功",
+ "ERROR_MESSAGE": "發生錯誤,請重試。"
}
}
}
@@ -83,16 +83,16 @@
"HEADER_TITLE": "簡訊活動",
"NEW_CAMPAIGN": "建立活動",
"EMPTY_STATE": {
- "TITLE": "暫無簡訊活動",
- "SUBTITLE": "啟動簡訊活動直接與客戶溝通。輕鬆傳送優惠或公告。點選 '建立活動' 開始。"
+ "TITLE": "目前沒有簡訊活動",
+ "SUBTITLE": "發起簡訊活動以直接聯繫您的客戶。輕鬆發送優惠或公告。點選「建立活動」以開始。"
},
"CARD": {
"STATUS": {
"COMPLETED": "已完成",
- "SCHEDULED": "已計劃"
+ "SCHEDULED": "已排程"
},
"CAMPAIGN_DETAILS": {
- "SENT_FROM": "發自",
+ "SENT_FROM": "發送自",
"ON": "於"
}
},
@@ -114,17 +114,17 @@
"INBOX": {
"LABEL": "選擇收件匣",
"PLACEHOLDER": "選擇收件匣",
- "ERROR": "收件箱是必填項"
+ "ERROR": "收件匣為必填"
},
"AUDIENCE": {
"LABEL": "受眾",
"PLACEHOLDER": "選擇客戶標籤",
- "ERROR": "受眾是必填項"
+ "ERROR": "受眾為必填"
},
"SCHEDULED_AT": {
- "LABEL": "計劃時間",
+ "LABEL": "排程時間",
"PLACEHOLDER": "請選擇時間",
- "ERROR": "計劃時間是必填項"
+ "ERROR": "排程時間為必填"
},
"BUTTONS": {
"CREATE": "建立",
@@ -132,7 +132,7 @@
},
"API": {
"SUCCESS_MESSAGE": "簡訊活動建立成功",
- "ERROR_MESSAGE": "出現錯誤,請重試。"
+ "ERROR_MESSAGE": "發生錯誤,請重試。"
}
}
}
@@ -141,16 +141,16 @@
"HEADER_TITLE": "WhatsApp 活動",
"NEW_CAMPAIGN": "建立活動",
"EMPTY_STATE": {
- "TITLE": "沒有可用的 WhatsApp 行銷活動",
- "SUBTITLE": "發起 WhatsApp 活動以直接聯絡您的客戶。輕鬆發送報價或發佈公告。點擊「建立行銷活動」即可開始。"
+ "TITLE": "目前沒有 WhatsApp 活動",
+ "SUBTITLE": "發起 WhatsApp 活動以直接聯繫您的客戶。輕鬆發送優惠或公告。點選「建立活動」以開始。"
},
"CARD": {
"STATUS": {
"COMPLETED": "已完成",
- "SCHEDULED": "已計劃"
+ "SCHEDULED": "已排程"
},
"CAMPAIGN_DETAILS": {
- "SENT_FROM": "發自",
+ "SENT_FROM": "發送自",
"ON": "於"
}
},
@@ -167,47 +167,47 @@
"INBOX": {
"LABEL": "選擇收件匣",
"PLACEHOLDER": "選擇收件匣",
- "ERROR": "收件箱是必填項"
+ "ERROR": "收件匣為必填"
},
"TEMPLATE": {
- "LABEL": "WhatsApp 模板",
- "PLACEHOLDER": "選擇模板",
- "INFO": "選擇用於此行銷活動的範本。",
- "ERROR": "需要模板",
- "PREVIEW_TITLE": "{templateName} 處理中",
+ "LABEL": "WhatsApp 範本",
+ "PLACEHOLDER": "選擇範本",
+ "INFO": "選擇此活動要使用的範本。",
+ "ERROR": "範本為必填",
+ "PREVIEW_TITLE": "處理 {templateName}",
"LANGUAGE": "語言",
"CATEGORY": "類別",
- "VARIABLES_LABEL": "引數",
+ "VARIABLES_LABEL": "變數",
"VARIABLE_PLACEHOLDER": "輸入 {variable} 的值"
},
"AUDIENCE": {
"LABEL": "受眾",
"PLACEHOLDER": "選擇客戶標籤",
- "ERROR": "受眾是必填項"
+ "ERROR": "受眾為必填"
},
"SCHEDULED_AT": {
- "LABEL": "計劃時間",
+ "LABEL": "排程時間",
"PLACEHOLDER": "請選擇時間",
- "ERROR": "計劃時間是必填項"
+ "ERROR": "排程時間為必填"
},
"BUTTONS": {
"CREATE": "建立",
"CANCEL": "取消"
},
"API": {
- "SUCCESS_MESSAGE": "WhatsApp 行銷活動創建成功",
- "ERROR_MESSAGE": "出現錯誤,請重試。"
+ "SUCCESS_MESSAGE": "WhatsApp 活動建立成功",
+ "ERROR_MESSAGE": "發生錯誤,請重試。"
}
}
}
},
"CONFIRM_DELETE": {
- "TITLE": "您確定要刪除嗎?",
- "DESCRIPTION": "刪除操作是永久性的,無法恢復。",
+ "TITLE": "確定要刪除嗎?",
+ "DESCRIPTION": "刪除操作是永久性的,無法復原。",
"CONFIRM": "刪除",
"API": {
"SUCCESS_MESSAGE": "活動刪除成功",
- "ERROR_MESSAGE": "出現錯誤,請重試。"
+ "ERROR_MESSAGE": "發生錯誤,請重試。"
}
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/cannedMgmt.json b/app/javascript/dashboard/i18n/locale/zh_TW/cannedMgmt.json
index 5cebf8ba0..d6f945f9d 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/cannedMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/cannedMgmt.json
@@ -1,79 +1,79 @@
{
"CANNED_MGMT": {
"HEADER": "預設回覆",
- "LEARN_MORE": "Learn more about canned responses",
- "DESCRIPTION": "Canned Responses are pre-written reply templates that help you quickly respond to a conversation. Agents can type the '/' character followed by the shortcode to insert a canned response during a conversation. ",
- "COUNT": "{n} canned response | {n} canned responses",
- "HEADER_BTN_TXT": "Add canned response",
- "LOADING": "Fetching canned responses...",
- "SEARCH_PLACEHOLDER": "Search canned responses...",
- "NO_RESULTS": "No canned responses found matching your search",
- "SEARCH_404": "沒有任何項目符合此查詢.",
+ "LEARN_MORE": "瞭解更多關於預設回覆",
+ "DESCRIPTION": "預設回覆是預先撰寫的回覆範本,可幫助您快速回應對話。客服可以在對話中輸入「/」字元加上簡碼來插入預設回覆。",
+ "COUNT": "{n} 個預設回覆 | {n} 個預設回覆",
+ "HEADER_BTN_TXT": "新增預設回覆",
+ "LOADING": "正在取得預設回覆...",
+ "SEARCH_PLACEHOLDER": "搜尋預設回覆...",
+ "NO_RESULTS": "找不到符合搜尋條件的預設回覆",
+ "SEARCH_404": "沒有任何項目符合此查詢。",
"LIST": {
- "404": "此帳戶中沒有可用的罐頭回覆。",
+ "404": "此帳戶中沒有可用的預設回覆。",
"TITLE": "管理預設回覆",
- "DESC": "Canned Responses are predefined reply templates which can be used to quickly send out replies to conversations.",
+ "DESC": "預設回覆是預先定義的回覆範本,可用於快速傳送對話回覆。",
"TABLE_HEADER": {
- "SHORT_CODE": "Short code",
- "CONTENT": "内容",
+ "SHORT_CODE": "簡碼",
+ "CONTENT": "內容",
"ACTIONS": "操作"
}
},
"ADD": {
- "TITLE": "Add canned response",
- "DESC": "Canned Responses are predefined reply templates which can be used to quickly send out replies to conversations.",
- "CANCEL_BUTTON_TEXT": "取消操作",
+ "TITLE": "新增預設回覆",
+ "DESC": "預設回覆是預先定義的回覆範本,可用於快速傳送對話回覆。",
+ "CANCEL_BUTTON_TEXT": "取消",
"FORM": {
"SHORT_CODE": {
- "LABEL": "Short code",
- "PLACEHOLDER": "Please enter a short code.",
- "ERROR": "Short Code is required."
+ "LABEL": "簡碼",
+ "PLACEHOLDER": "請輸入簡碼。",
+ "ERROR": "簡碼為必填。"
},
"CONTENT": {
"LABEL": "訊息",
- "PLACEHOLDER": "Please write the message you want to save as a template to use later.",
- "ERROR": "訊息為必填."
+ "PLACEHOLDER": "請輸入您想儲存為範本的訊息,以便日後使用。",
+ "ERROR": "訊息為必填。"
},
"SUBMIT": "送出"
},
"API": {
- "SUCCESS_MESSAGE": "Canned response added successfully.",
- "ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
+ "SUCCESS_MESSAGE": "預設回覆新增成功。",
+ "ERROR_MESSAGE": "無法連接伺服器,請再試一次。"
}
},
"EDIT": {
- "TITLE": "編輯罐頭回覆",
- "CANCEL_BUTTON_TEXT": "取消操作",
+ "TITLE": "編輯預設回覆",
+ "CANCEL_BUTTON_TEXT": "取消",
"FORM": {
"SHORT_CODE": {
- "LABEL": "Short code",
- "PLACEHOLDER": "Please enter a shortcode.",
- "ERROR": "Short code is required."
+ "LABEL": "簡碼",
+ "PLACEHOLDER": "請輸入簡碼。",
+ "ERROR": "簡碼為必填。"
},
"CONTENT": {
"LABEL": "訊息",
- "PLACEHOLDER": "Please write the message you want to save as a template to use later.",
- "ERROR": "訊息為必填."
+ "PLACEHOLDER": "請輸入您想儲存為範本的訊息,以便日後使用。",
+ "ERROR": "訊息為必填。"
},
"SUBMIT": "送出"
},
"BUTTON_TEXT": "編輯",
"API": {
- "SUCCESS_MESSAGE": "Canned response is updated successfully.",
- "ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
+ "SUCCESS_MESSAGE": "預設回覆更新成功。",
+ "ERROR_MESSAGE": "無法連接伺服器,請再試一次。"
}
},
"DELETE": {
"BUTTON_TEXT": "刪除",
"API": {
- "SUCCESS_MESSAGE": "Canned response deleted successfully.",
- "ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
+ "SUCCESS_MESSAGE": "預設回覆刪除成功。",
+ "ERROR_MESSAGE": "無法連接伺服器,請再試一次。"
},
"CONFIRM": {
"TITLE": "刪除確認",
- "MESSAGE": "您確定要刪除嗎? ",
- "YES": "Yes, delete ",
- "NO": "No, keep "
+ "MESSAGE": "您確定要刪除嗎?",
+ "YES": "是,刪除",
+ "NO": "不,保留"
}
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/chatlist.json b/app/javascript/dashboard/i18n/locale/zh_TW/chatlist.json
index 7dfa95814..227e83521 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/chatlist.json
@@ -4,20 +4,20 @@
"LOAD_MORE_CONVERSATIONS": "載入更多對話",
"EOF": "所有對話已載入 🎉",
"LIST": {
- "404": "這個群組中無有效對話"
+ "404": "這個群組中沒有進行中的對話"
},
- "FAILED_TO_SEND": "Failed to send",
+ "FAILED_TO_SEND": "傳送失敗",
"TAB_HEADING": "對話",
"MENTION_HEADING": "被提及",
"UNATTENDED_HEADING": "無人處理",
"SEARCH": {
- "INPUT": "搜尋人、聊天室、保存回覆"
+ "INPUT": "搜尋人員、對話、預設回覆…"
},
- "FILTER_ALL": "所有的",
+ "FILTER_ALL": "全部",
"ASSIGNEE_TYPE_TABS": {
"me": "我的",
- "unassigned": "未指派的",
- "all": "所有的"
+ "unassigned": "未指派",
+ "all": "全部"
},
"CHAT_STATUS_FILTER_ITEMS": {
"open": {
@@ -30,55 +30,55 @@
"TEXT": "待處理"
},
"snoozed": {
- "TEXT": "擱置"
+ "TEXT": "已擱置"
},
"all": {
- "TEXT": "所有"
+ "TEXT": "全部"
}
},
- "VIEW_FILTER": "查看",
+ "VIEW_FILTER": "檢視",
"SORT_TOOLTIP_LABEL": "排序對話",
"CHAT_SORT": {
"STATUS": "狀態",
- "ORDER_BY": "排序"
+ "ORDER_BY": "排序方式"
},
"CHAT_TIME_STAMP": {
"CREATED": {
- "LATEST": "Created",
- "OLDEST": "建立於:"
+ "LATEST": "建立時間",
+ "OLDEST": "建立於:"
},
"LAST_ACTIVITY": {
- "NOT_ACTIVE": "Last activity:",
- "ACTIVE": "Last activity"
+ "NOT_ACTIVE": "最後活動:",
+ "ACTIVE": "最後活動"
}
},
"SORT_ORDER_ITEMS": {
"last_activity_at_asc": {
- "TEXT": "最後收到訊息: 舊的在前"
+ "TEXT": "最後活動:舊的在前"
},
"last_activity_at_desc": {
- "TEXT": "最後收到訊息: 新的在前"
+ "TEXT": "最後活動:新的在前"
},
"created_at_desc": {
- "TEXT": "對話建立日期: 新的在前"
+ "TEXT": "建立日期:新的在前"
},
"created_at_asc": {
- "TEXT": "對話建立日期: 舊的在前"
+ "TEXT": "建立日期:舊的在前"
},
"priority_desc": {
- "TEXT": "優先程度: 高的在前"
+ "TEXT": "優先順序:高的在前"
},
"priority_asc": {
- "TEXT": "優先程度: 低的在前"
+ "TEXT": "優先順序:低的在前"
},
"waiting_since_asc": {
- "TEXT": "等待回應: 久的在前"
+ "TEXT": "等待回應:最久的在前"
},
"waiting_since_desc": {
- "TEXT": "等待回應: 近的在前"
+ "TEXT": "等待回應:最短的在前"
},
"priority_desc_created_at_asc": {
- "TEXT": "Priority: Highest first, Created: Oldest first"
+ "TEXT": "優先順序:高的在前,建立日期:舊的在前"
}
},
"ATTACHMENTS": {
@@ -86,13 +86,13 @@
"CONTENT": "圖片訊息"
},
"audio": {
- "CONTENT": "聲音訊息"
+ "CONTENT": "語音訊息"
},
"video": {
"CONTENT": "影片訊息"
},
"file": {
- "CONTENT": "附件"
+ "CONTENT": "檔案附件"
},
"location": {
"CONTENT": "位置"
@@ -104,42 +104,42 @@
"CONTENT": "分享了一個網址"
},
"contact": {
- "CONTENT": "Shared contact"
+ "CONTENT": "分享的聯絡人"
},
"embed": {
- "CONTENT": "Embedded content"
+ "CONTENT": "嵌入內容"
}
},
"CHAT_SORT_BY_FILTER": {
- "TITLE": "Sort conversation",
- "DROPDOWN_TITLE": "Sort by",
+ "TITLE": "排序對話",
+ "DROPDOWN_TITLE": "排序方式",
"ITEMS": {
"LATEST": {
- "NAME": "Last activity at",
- "LABEL": "Last activity"
+ "NAME": "最後活動時間",
+ "LABEL": "最後活動"
},
"CREATED_AT": {
- "NAME": "建立於",
- "LABEL": "建立於"
+ "NAME": "建立時間",
+ "LABEL": "建立時間"
},
"LAST_USER_MESSAGE_AT": {
- "NAME": "Last user message at",
- "LABEL": "Last message"
+ "NAME": "最後使用者訊息時間",
+ "LABEL": "最後訊息"
}
}
},
- "RECEIVED_VIA_EMAIL": "使用電子郵件接收",
- "VIEW_TWEET_IN_TWITTER": "View tweet in Twitter",
- "REPLY_TO_TWEET": "Reply to this tweet",
- "LINK_TO_STORY": "Go to instagram story",
+ "RECEIVED_VIA_EMAIL": "透過電子郵件接收",
+ "VIEW_TWEET_IN_TWITTER": "在 Twitter 上查看推文",
+ "REPLY_TO_TWEET": "回覆此推文",
+ "LINK_TO_STORY": "前往 Instagram 限時動態",
"SENT": "傳送成功",
- "READ": "Read successfully",
- "DELIVERED": "Delivered successfully",
+ "READ": "已讀",
+ "DELIVERED": "已送達",
"NO_MESSAGES": "沒有訊息",
"NO_CONTENT": "沒有可用內容",
"HIDE_QUOTED_TEXT": "隱藏引用文字",
"SHOW_QUOTED_TEXT": "顯示引用文字",
- "MESSAGE_READ": "Read",
- "SENDING": "Sending"
+ "MESSAGE_READ": "已讀",
+ "SENDING": "傳送中"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/companies.json b/app/javascript/dashboard/i18n/locale/zh_TW/companies.json
index 225ca0d2c..e03d13de5 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/companies.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/companies.json
@@ -4,30 +4,30 @@
"SORT_BY": {
"LABEL": "排序方式",
"OPTIONS": {
- "NAME": "姓名",
- "DOMAIN": "域名",
- "CREATED_AT": "建立於",
+ "NAME": "名稱",
+ "DOMAIN": "網域",
+ "CREATED_AT": "建立時間",
"CONTACTS_COUNT": "聯絡人數量"
}
},
"ORDER": {
- "LABEL": "命令",
+ "LABEL": "排列順序",
"OPTIONS": {
- "ASCENDING": "升序",
- "DESCENDING": "降序"
+ "ASCENDING": "遞增",
+ "DESCENDING": "遞減"
}
},
"SEARCH_PLACEHOLDER": "搜尋公司...",
- "LOADING": "正在加載公司...",
+ "LOADING": "正在載入公司...",
"UNNAMED": "未命名公司",
- "CONTACTS_COUNT": "{n} 聯絡方式 | {n} 聯絡人",
+ "CONTACTS_COUNT": "{n} 位聯絡人 | {n} 位聯絡人",
"EMPTY_STATE": {
- "TITLE": "沒有找到公司"
+ "TITLE": "找不到公司"
}
},
"COMPANIES_LAYOUT": {
"PAGINATION_FOOTER": {
- "SHOWING": "顯示 {totalItems} 公司的 {startItem} – {endItem} |顯示 {totalItems} 個公司中的 {startItem} – {endItem} 個"
+ "SHOWING": "顯示 {totalItems} 間公司中的第 {startItem} – {endItem} 間 | 顯示 {totalItems} 間公司中的第 {startItem} – {endItem} 間"
}
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/components.json b/app/javascript/dashboard/i18n/locale/zh_TW/components.json
index 93f23d25b..e835209ef 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/components.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/components.json
@@ -4,27 +4,27 @@
"CURRENT_PAGE_INFO": "第 {currentPage} / {totalPages} 頁 | 第 {currentPage} / {totalPages} 頁"
},
"COMBOBOX": {
- "PLACEHOLDER": "請選擇一個選項……",
- "EMPTY_SEARCH_RESULTS": "未找到與搜尋詞 `{searchTerm}` 匹配的項",
+ "PLACEHOLDER": "請選擇一個選項...",
+ "EMPTY_SEARCH_RESULTS": "找不到與搜尋詞「{searchTerm}」相符的項目",
"EMPTY_STATE": "查無結果。",
- "SEARCH_PLACEHOLDER": "搜尋……",
- "MORE": "+{count} 更多"
+ "SEARCH_PLACEHOLDER": "搜尋...",
+ "MORE": "還有 {count} 個"
},
"DROPDOWN_MENU": {
- "SEARCH_PLACEHOLDER": "搜尋……",
+ "SEARCH_PLACEHOLDER": "搜尋...",
"EMPTY_STATE": "查無結果。",
- "SEARCHING": "搜尋中……"
+ "SEARCHING": "搜尋中..."
},
"DIALOG": {
"BUTTONS": {
"CANCEL": "取消",
- "CONFIRM": "確定"
+ "CONFIRM": "確認"
}
},
"PHONE_INPUT": {
"SEARCH_PLACEHOLDER": "搜尋國家/地區",
- "ERROR": "電話號碼應為空或E.164格式",
- "DIAL_CODE_ERROR": "請從列表中選擇撥號程式碼"
+ "ERROR": "電話號碼應為空或符合 E.164 格式",
+ "DIAL_CODE_ERROR": "請從列表中選擇國碼"
},
"THUMBNAIL": {
"AUTHOR": {
@@ -32,7 +32,7 @@
}
},
"BREADCRUMB": {
- "ARIA_LABEL": "麵包屑導航"
+ "ARIA_LABEL": "麵包屑導覽"
},
"SWITCH": {
"TOGGLE": "切換開關"
@@ -48,9 +48,9 @@
"MINUTES": "分鐘",
"HOURS": "小時",
"DAYS": "天",
- "PLACEHOLDER": "輸入耗時"
+ "PLACEHOLDER": "輸入時間長度"
},
"CHANNEL_SELECTOR": {
- "COMING_SOON": "即將到來!"
+ "COMING_SOON": "即將推出!"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/contact.json b/app/javascript/dashboard/i18n/locale/zh_TW/contact.json
index 24d66f004..3025327fa 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/contact.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/contact.json
@@ -3,29 +3,29 @@
"NOT_AVAILABLE": "無法使用",
"EMAIL_ADDRESS": "電子信箱地址",
"PHONE_NUMBER": "電話號碼",
- "IDENTIFIER": "Identifier",
- "COPY_SUCCESSFUL": "成功複製到剪貼簿",
+ "IDENTIFIER": "識別碼",
+ "COPY_SUCCESSFUL": "已成功複製到剪貼簿",
"COMPANY": "公司",
"LOCATION": "位置",
"BROWSER_LANGUAGE": "瀏覽器語言",
"CONVERSATION_TITLE": "對話詳細資訊",
"VIEW_PROFILE": "查看個人檔案",
"BROWSER": "瀏覽器",
- "OS": "作業系统",
- "INITIATED_FROM": "發起自:",
+ "OS": "作業系統",
+ "INITIATED_FROM": "發起自",
"INITIATED_AT": "發起於",
- "IP_ADDRESS": "IP 位置",
- "CREATED_AT_LABEL": "Created",
+ "IP_ADDRESS": "IP 位址",
+ "CREATED_AT_LABEL": "建立時間",
"NEW_MESSAGE": "新訊息",
- "CALL": "Call",
- "CALL_INITIATED": "Calling the contact…",
- "CALL_FAILED": "Unable to start the call. Please try again.",
+ "CALL": "通話",
+ "CALL_INITIATED": "正在撥打聯絡人電話…",
+ "CALL_FAILED": "無法撥打電話,請稍後再試。",
"VOICE_INBOX_PICKER": {
- "TITLE": "Choose a voice inbox"
+ "TITLE": "選擇語音收件匣"
},
"CONVERSATIONS": {
- "NO_RECORDS_FOUND": "此聯絡人没有關聯到以前的對話。",
- "TITLE": "上一次對話"
+ "NO_RECORDS_FOUND": "此聯絡人沒有關聯的歷史對話。",
+ "TITLE": "歷史對話"
},
"LABELS": {
"CONTACT": {
@@ -33,29 +33,29 @@
"ERROR": "無法更新標籤"
},
"CONVERSATION": {
- "TITLE": "對話標記",
+ "TITLE": "對話標籤",
"ADD_BUTTON": "新增標籤"
},
"LABEL_SELECT": {
"TITLE": "新增標籤",
"PLACEHOLDER": "搜尋標籤",
"NO_RESULT": "查無標籤",
- "CREATE_LABEL": "Create new label"
+ "CREATE_LABEL": "建立新標籤"
}
},
- "MERGE_CONTACT": "Merge contact",
- "CONTACT_ACTIONS": "Contact actions",
- "MUTE_CONTACT": "Block Contact",
- "UNMUTE_CONTACT": "Unblock Contact",
- "MUTED_SUCCESS": "This contact is blocked successfully. You will not be notified of any future conversations.",
- "UNMUTED_SUCCESS": "This contact is unblocked successfully.",
- "SEND_TRANSCRIPT": "Send Transcript",
+ "MERGE_CONTACT": "合併聯絡人",
+ "CONTACT_ACTIONS": "聯絡人操作",
+ "MUTE_CONTACT": "封鎖聯絡人",
+ "UNMUTE_CONTACT": "解除封鎖聯絡人",
+ "MUTED_SUCCESS": "此聯絡人已成功封鎖。您將不會收到任何後續對話的通知。",
+ "UNMUTED_SUCCESS": "此聯絡人已成功解除封鎖。",
+ "SEND_TRANSCRIPT": "傳送對話記錄",
"EDIT_LABEL": "編輯",
"SIDEBAR_SECTIONS": {
"CUSTOM_ATTRIBUTES": "自訂屬性",
"CONTACT_LABELS": "聯絡人標籤",
- "PREVIOUS_CONVERSATIONS": "上一次對話",
- "NO_RECORDS_FOUND": "No attributes found"
+ "PREVIOUS_CONVERSATIONS": "歷史對話",
+ "NO_RECORDS_FOUND": "查無屬性"
}
},
"EDIT_CONTACT": {
@@ -69,13 +69,13 @@
"DESC": "刪除聯絡人資訊",
"CONFIRM": {
"TITLE": "確認刪除",
- "MESSAGE": "您確定要刪除嗎? ",
+ "MESSAGE": "您確定要刪除嗎?",
"YES": "是,刪除",
"NO": "不,保留"
},
"API": {
- "SUCCESS_MESSAGE": "聯絡人刪除成功",
- "ERROR_MESSAGE": "Could not delete contact. Please try again later."
+ "SUCCESS_MESSAGE": "聯絡人已成功刪除",
+ "ERROR_MESSAGE": "無法刪除聯絡人,請稍後再試。"
}
},
"CONTACT_FORM": {
@@ -83,29 +83,29 @@
"SUBMIT": "送出",
"CANCEL": "取消",
"AVATAR": {
- "LABEL": "連絡人頭像"
+ "LABEL": "聯絡人頭像"
},
"NAME": {
- "PLACEHOLDER": "請輸入聯絡人姓名",
- "LABEL": "聯絡人姓名"
+ "PLACEHOLDER": "請輸入聯絡人全名",
+ "LABEL": "全名"
},
"BIO": {
"PLACEHOLDER": "請輸入聯絡人簡介",
- "LABEL": "聯絡人簡介"
+ "LABEL": "簡介"
},
"EMAIL_ADDRESS": {
"PLACEHOLDER": "請輸入聯絡人電子信箱",
"LABEL": "電子信箱地址",
- "DUPLICATE": "這個電子信箱已經被其他聯絡人使用了。",
- "ERROR": "請輸入一個有效的電子信箱."
+ "DUPLICATE": "此電子信箱已被其他聯絡人使用。",
+ "ERROR": "請輸入有效的電子信箱地址。"
},
"PHONE_NUMBER": {
- "PLACEHOLDER": "請輸入聯絡人電話",
- "LABEL": "聯絡人電話",
- "HELP": "Phone number should be of E.164 format eg: +1415555555 [+][country code][area code][local phone number]. You can select the dial code from the dropdown.",
- "ERROR": "Phone number should be either empty or of E.164 format",
- "DIAL_CODE_ERROR": "Please select a dial code from the list",
- "DUPLICATE": "This phone number is in use for another contact."
+ "PLACEHOLDER": "請輸入聯絡人電話號碼",
+ "LABEL": "電話號碼",
+ "HELP": "電話號碼須為 E.164 格式,例如:+886912345678 [+][國碼][區碼][電話號碼]。您可以從下拉選單中選擇國碼。",
+ "ERROR": "電話號碼須為空白或符合 E.164 格式",
+ "DIAL_CODE_ERROR": "請從列表中選擇國碼",
+ "DUPLICATE": "此電話號碼已被其他聯絡人使用。"
},
"LOCATION": {
"PLACEHOLDER": "請輸入聯絡人位置",
@@ -116,15 +116,15 @@
"LABEL": "公司名稱"
},
"COUNTRY": {
- "PLACEHOLDER": "Enter the country name",
+ "PLACEHOLDER": "請輸入國家名稱",
"LABEL": "國家名稱",
"SELECT_PLACEHOLDER": "選擇",
- "REMOVE": "刪除",
- "SELECT_COUNTRY": "Select Country"
+ "REMOVE": "移除",
+ "SELECT_COUNTRY": "選擇國家"
},
"CITY": {
- "PLACEHOLDER": "Enter the city name",
- "LABEL": "City Name"
+ "PLACEHOLDER": "請輸入城市名稱",
+ "LABEL": "城市名稱"
},
"SOCIAL_PROFILES": {
"FACEBOOK": {
@@ -147,44 +147,44 @@
},
"DELETE_AVATAR": {
"API": {
- "SUCCESS_MESSAGE": "Contact avatar deleted successfully",
- "ERROR_MESSAGE": "Could not delete the contact avatar. Please try again later."
+ "SUCCESS_MESSAGE": "聯絡人頭像已成功刪除",
+ "ERROR_MESSAGE": "無法刪除聯絡人頭像,請稍後再試。"
}
},
"SUCCESS_MESSAGE": "聯絡人儲存成功",
- "ERROR_MESSAGE": "出現錯誤,請重試"
+ "ERROR_MESSAGE": "發生錯誤,請重試"
},
"NEW_CONVERSATION": {
"BUTTON_LABEL": "開始對話",
"TITLE": "新的對話",
- "DESC": "傳送一則新訊息以開始新的對話",
- "NO_INBOX": "Couldn't find an inbox to initiate a new conversation with this contact.",
+ "DESC": "傳送一則新訊息以開始新的對話。",
+ "NO_INBOX": "找不到可與此聯絡人發起新對話的收件匣。",
"FORM": {
"TO": {
- "LABEL": "To"
+ "LABEL": "收件人"
},
"INBOX": {
- "LABEL": "Via Inbox",
- "PLACEHOLDER": "Choose source inbox",
- "ERROR": "選擇一個收件匣"
+ "LABEL": "透過收件匣",
+ "PLACEHOLDER": "選擇來源收件匣",
+ "ERROR": "請選擇一個收件匣"
},
"SUBJECT": {
"LABEL": "主旨",
"PLACEHOLDER": "主旨",
- "ERROR": "Subject can't be empty"
+ "ERROR": "主旨不得為空"
},
"MESSAGE": {
"LABEL": "訊息",
- "PLACEHOLDER": "在此填寫你的訊息",
+ "PLACEHOLDER": "在此填寫您的訊息",
"ERROR": "訊息不得為空"
},
"ATTACHMENTS": {
- "SELECT": "Choose files",
- "HELP_TEXT": "Drag and drop files here or choose files to attach"
+ "SELECT": "選擇檔案",
+ "HELP_TEXT": "將檔案拖放到此處,或點選選擇要附加的檔案"
},
"SUBMIT": "傳送訊息",
"CANCEL": "取消",
- "SUCCESS_MESSAGE": "訊息已傳送",
+ "SUCCESS_MESSAGE": "訊息已傳送!",
"GO_TO_CONVERSATION": "查看",
"ERROR_MESSAGE": "無法傳送!請重新嘗試。"
}
@@ -198,17 +198,17 @@
},
"CUSTOM_ATTRIBUTES": {
"BUTTON": "新增自訂屬性",
- "COPY_SUCCESSFUL": "成功複製到剪貼簿",
- "SHOW_MORE": "顯示所有",
- "SHOW_LESS": "顯示部分",
+ "COPY_SUCCESSFUL": "已成功複製到剪貼簿",
+ "SHOW_MORE": "顯示所有屬性",
+ "SHOW_LESS": "顯示較少屬性",
"ACTIONS": {
- "COPY": "Copy attribute",
- "DELETE": "Delete attribute",
+ "COPY": "複製屬性",
+ "DELETE": "刪除屬性",
"EDIT": "編輯屬性"
},
"ADD": {
"TITLE": "建立自訂屬性",
- "DESC": "為聯絡人新增自訂資訊"
+ "DESC": "為此聯絡人新增自訂資訊。"
},
"FORM": {
"CREATE": "新增屬性",
@@ -216,126 +216,127 @@
"NAME": {
"LABEL": "自訂屬性名稱",
"PLACEHOLDER": "例如:shopify id",
- "ERROR": "Invalid custom attribute name"
+ "ERROR": "無效的自訂屬性名稱"
},
"VALUE": {
"LABEL": "屬性值",
"PLACEHOLDER": "例如:11901 "
},
"ADD": {
- "TITLE": "Create new attribute ",
- "SUCCESS": "屬性新增成功",
- "ERROR": "Unable to add attribute. Please try again later"
+ "TITLE": "建立新屬性",
+ "SUCCESS": "屬性已成功新增",
+ "ERROR": "無法新增屬性,請稍後再試"
},
"UPDATE": {
- "SUCCESS": "屬性更新成功",
- "ERROR": "Unable to update attribute. Please try again later"
+ "SUCCESS": "屬性已成功更新",
+ "ERROR": "無法更新屬性,請稍後再試"
},
"DELETE": {
- "SUCCESS": "Attribute deleted successfully",
- "ERROR": "Unable to delete attribute. Please try again later"
+ "SUCCESS": "屬性已成功刪除",
+ "ERROR": "無法刪除屬性,請稍後再試"
},
"ATTRIBUTE_SELECT": {
- "TITLE": "Add attributes",
- "PLACEHOLDER": "Search attributes",
- "NO_RESULT": "No attributes found"
+ "TITLE": "新增屬性",
+ "PLACEHOLDER": "搜尋屬性",
+ "NO_RESULT": "查無屬性"
},
"ATTRIBUTE_TYPE": {
"LIST": {
- "PLACEHOLDER": "Select value",
- "SEARCH_INPUT_PLACEHOLDER": "Search value",
- "NO_RESULT": "No result found"
+ "PLACEHOLDER": "選擇值",
+ "SEARCH_INPUT_PLACEHOLDER": "搜尋值",
+ "NO_RESULT": "查無結果"
}
}
},
"VALIDATIONS": {
- "REQUIRED": "Valid value is required",
- "INVALID_URL": "Invalid URL",
- "INVALID_INPUT": "Invalid Input"
+ "REQUIRED": "請輸入有效的值",
+ "INVALID_URL": "無效的 URL",
+ "INVALID_INPUT": "無效的輸入"
}
},
"MERGE_CONTACTS": {
"TITLE": "合併聯絡人",
- "DESCRIPTION": "Merge contacts to combine two profiles into one, including all attributes and conversations. In case of conflict, the Primary contact’ s attributes will take precedence.",
+ "DESCRIPTION": "合併聯絡人以將兩個個人檔案合併為一個,包含所有屬性和對話。如有衝突,將以主要聯絡人的屬性為準。",
"PRIMARY": {
- "TITLE": "Primary contact",
- "HELP_LABEL": "To be deleted"
+ "TITLE": "主要聯絡人",
+ "HELP_LABEL": "將被刪除"
},
"PARENT": {
- "TITLE": "Contact to merge",
- "PLACEHOLDER": "Search for a contact",
- "HELP_LABEL": "To be kept"
+ "TITLE": "要合併的聯絡人",
+ "PLACEHOLDER": "搜尋聯絡人",
+ "HELP_LABEL": "將被保留"
},
"SUMMARY": {
- "TITLE": "Summary",
- "DELETE_WARNING": "Contact of {primaryContactName} will be deleted.",
- "ATTRIBUTE_WARNING": "Contact details of {primaryContactName} will be copied to {parentContactName} ."
+ "TITLE": "摘要",
+ "DELETE_WARNING": "{primaryContactName} 的聯絡人資料將被刪除。",
+ "ATTRIBUTE_WARNING": "{primaryContactName} 的聯絡人詳細資訊將被複製到 {parentContactName} 。"
},
"SEARCH": {
- "ERROR_MESSAGE": "Something went wrong. Please try again later."
+ "ERROR_MESSAGE": "發生錯誤,請稍後再試。"
},
"FORM": {
"SUBMIT": " 合併聯絡人",
"CANCEL": "取消",
"CHILD_CONTACT": {
- "ERROR": "Select a child contact to merge"
+ "ERROR": "請選擇要合併的子聯絡人"
},
- "SUCCESS_MESSAGE": "Contact merged successfully",
- "ERROR_MESSAGE": "Could not merge contacts, try again!"
+ "SUCCESS_MESSAGE": "聯絡人已成功合併",
+ "ERROR_MESSAGE": "無法合併聯絡人,請重試!"
},
"DROPDOWN_ITEM": {
"ID": "(ID: {identifier})"
}
},
+
"CONTACTS_LAYOUT": {
"HEADER": {
"TITLE": "聯絡人",
- "SEARCH_TITLE": "Search contacts",
- "ACTIVE_TITLE": "Active contacts",
- "SEARCH_PLACEHOLDER": "Search...",
+ "SEARCH_TITLE": "搜尋聯絡人",
+ "ACTIVE_TITLE": "活躍聯絡人",
+ "SEARCH_PLACEHOLDER": "搜尋...",
"MESSAGE_BUTTON": "訊息",
"SEND_MESSAGE": "傳送訊息",
- "BLOCK_CONTACT": "Block contact",
- "UNBLOCK_CONTACT": "Unblock contact",
+ "BLOCK_CONTACT": "封鎖聯絡人",
+ "UNBLOCK_CONTACT": "解除封鎖聯絡人",
"BREADCRUMB": {
"CONTACTS": "聯絡人"
},
"ACTIONS": {
"CONTACT_CREATION": {
- "ADD_CONTACT": "Add contact",
- "EXPORT_CONTACT": "Export contacts",
- "IMPORT_CONTACT": "Import contacts",
- "SAVE_CONTACT": "Save contact",
- "EMAIL_ADDRESS_DUPLICATE": "這個電子信箱已經被其他聯絡人使用了。",
- "PHONE_NUMBER_DUPLICATE": "This phone number is in use for another contact.",
+ "ADD_CONTACT": "新增聯絡人",
+ "EXPORT_CONTACT": "匯出聯絡人",
+ "IMPORT_CONTACT": "匯入聯絡人",
+ "SAVE_CONTACT": "儲存聯絡人",
+ "EMAIL_ADDRESS_DUPLICATE": "此電子信箱已被其他聯絡人使用。",
+ "PHONE_NUMBER_DUPLICATE": "此電話號碼已被其他聯絡人使用。",
"SUCCESS_MESSAGE": "聯絡人儲存成功",
- "ERROR_MESSAGE": "Unable to save contact. Please try again later."
+ "ERROR_MESSAGE": "無法儲存聯絡人,請稍後再試。"
},
- "BLOCK_SUCCESS_MESSAGE": "This contact is blocked successfully",
- "BLOCK_ERROR_MESSAGE": "Unable to block contact. Please try again later.",
- "UNBLOCK_SUCCESS_MESSAGE": "This contact is unblocked successfully",
- "UNBLOCK_ERROR_MESSAGE": "Unable to unblock contact. Please try again later.",
+ "BLOCK_SUCCESS_MESSAGE": "此聯絡人已成功封鎖",
+ "BLOCK_ERROR_MESSAGE": "無法封鎖聯絡人,請稍後再試。",
+ "UNBLOCK_SUCCESS_MESSAGE": "此聯絡人已成功解除封鎖",
+ "UNBLOCK_ERROR_MESSAGE": "無法解除封鎖聯絡人,請稍後再試。",
"IMPORT_CONTACT": {
- "TITLE": "Import contacts",
- "DESCRIPTION": "透過 CSV 匯入聯絡人",
- "DOWNLOAD_LABEL": "下載 CSV 範例",
- "LABEL": "CSV File:",
- "CHOOSE_FILE": "Choose file",
+ "TITLE": "匯入聯絡人",
+ "DESCRIPTION": "透過 CSV 檔案匯入聯絡人。",
+ "DOWNLOAD_LABEL": "下載 CSV 範例檔案。",
+ "LABEL": "CSV 檔案:",
+ "CHOOSE_FILE": "選擇檔案",
"CHANGE": "變更",
"CANCEL": "取消",
"IMPORT": "匯入",
- "SUCCESS_MESSAGE": "You will be notified via email when the import is complete.",
- "ERROR_MESSAGE": "出現錯誤,請重試"
+ "SUCCESS_MESSAGE": "匯入完成後,您將收到電子郵件通知。",
+ "ERROR_MESSAGE": "發生錯誤,請重試"
},
"EXPORT_CONTACT": {
- "TITLE": "Export contacts",
- "DESCRIPTION": "Quickly export a csv file with comprehensive details of your contacts",
- "CONFIRM": "Export",
- "SUCCESS_MESSAGE": "Export is in progress, You will be notified via email when export file is ready to dowanlod.",
- "ERROR_MESSAGE": "出現錯誤,請重試"
+ "TITLE": "匯出聯絡人",
+ "DESCRIPTION": "快速匯出包含聯絡人完整資訊的 CSV 檔案",
+ "CONFIRM": "匯出",
+ "SUCCESS_MESSAGE": "正在匯出中,匯出檔案準備就緒後,您將收到電子郵件通知。",
+ "ERROR_MESSAGE": "發生錯誤,請重試"
},
"SORT_BY": {
- "LABEL": "Sort by",
+ "LABEL": "排序方式",
"OPTIONS": {
"NAME": "姓名",
"EMAIL": "Email",
@@ -344,315 +345,316 @@
"COUNTRY": "國家",
"CITY": "城市",
"LAST_ACTIVITY": "最後活動",
- "CREATED_AT": "建立於"
+ "CREATED_AT": "建立時間"
}
},
"ORDER": {
- "LABEL": "Ordering",
+ "LABEL": "排序順序",
"OPTIONS": {
- "ASCENDING": "Ascending",
- "DESCENDING": "Descending"
+ "ASCENDING": "升冪",
+ "DESCENDING": "降冪"
}
},
"FILTERS": {
"CREATE_SEGMENT": {
- "TITLE": "你要儲存這個篩選條件嗎?",
+ "TITLE": "您要儲存此篩選條件嗎?",
"CONFIRM": "儲存篩選條件",
- "LABEL": "姓名",
- "PLACEHOLDER": "Enter the name of the filter",
- "ERROR": "Enter a valid name",
- "SUCCESS_MESSAGE": "Filter saved successfully",
- "ERROR_MESSAGE": "Unable to save filter. Please try again later."
+ "LABEL": "名稱",
+ "PLACEHOLDER": "請輸入篩選條件名稱",
+ "ERROR": "請輸入有效的名稱",
+ "SUCCESS_MESSAGE": "篩選條件已成功儲存",
+ "ERROR_MESSAGE": "無法儲存篩選條件,請稍後再試。"
},
"DELETE_SEGMENT": {
"TITLE": "確認刪除",
- "DESCRIPTION": "Are you sure you want to delete this filter?",
+ "DESCRIPTION": "您確定要刪除此篩選條件嗎?",
"CONFIRM": "是,刪除",
- "CANCEL": "No, Cancel",
- "SUCCESS_MESSAGE": "Filter deleted successfully",
- "ERROR_MESSAGE": "Unable to delete filter. Please try again later."
+ "CANCEL": "不,取消",
+ "SUCCESS_MESSAGE": "篩選條件已成功刪除",
+ "ERROR_MESSAGE": "無法刪除篩選條件,請稍後再試。"
}
}
}
},
"PAGINATION_FOOTER": {
- "SHOWING": "Showing {startItem} - {endItem} of {totalItems} contacts"
+ "SHOWING": "顯示第 {startItem} - {endItem} 筆,共 {totalItems} 位聯絡人 | 顯示第 {startItem} - {endItem} 筆,共 {totalItems} 位聯絡人"
},
"FILTER": {
"NAME": "姓名",
"EMAIL": "Email",
"PHONE_NUMBER": "電話號碼",
- "IDENTIFIER": "Identifier",
+ "IDENTIFIER": "識別碼",
"COUNTRY": "國家",
"CITY": "城市",
- "CREATED_AT": "建立於",
+ "CREATED_AT": "建立時間",
"LAST_ACTIVITY": "最後活動",
- "REFERER_LINK": "推薦人連結",
- "BLOCKED": "Blocked",
+ "REFERER_LINK": "來源連結",
+ "BLOCKED": "已封鎖",
"BLOCKED_TRUE": "是",
"BLOCKED_FALSE": "否",
"BUTTONS": {
- "CLEAR_FILTERS": "清除查詢條件",
- "UPDATE_SEGMENT": "Update segment",
- "APPLY_FILTERS": "篩選",
- "ADD_FILTER": "添加查詢條件"
+ "CLEAR_FILTERS": "清除篩選條件",
+ "UPDATE_SEGMENT": "更新區段",
+ "APPLY_FILTERS": "套用篩選條件",
+ "ADD_FILTER": "新增篩選條件"
},
- "TITLE": "Filter contacts",
- "EDIT_SEGMENT": "Edit segment",
+ "TITLE": "篩選聯絡人",
+ "EDIT_SEGMENT": "編輯區段",
"SEGMENT": {
- "LABEL": "Segment name",
- "INPUT_PLACEHOLDER": "Enter the name of the segment"
+ "LABEL": "區段名稱",
+ "INPUT_PLACEHOLDER": "請輸入區段名稱"
},
"ACTIVE_FILTERS": {
- "MORE_FILTERS": "+ {count} more filters",
- "CLEAR_FILTERS": "清除查詢條件"
+ "MORE_FILTERS": "+ {count} 個篩選條件",
+ "CLEAR_FILTERS": "清除篩選條件"
}
},
"CARD": {
- "OF": "of",
+ "OF": "/",
"VIEW_DETAILS": "查看詳細資訊",
"EDIT_DETAILS_FORM": {
"TITLE": "編輯聯絡人資訊",
"FORM": {
"FIRST_NAME": {
- "PLACEHOLDER": "Enter the first name"
+ "PLACEHOLDER": "請輸入名字"
},
"LAST_NAME": {
- "PLACEHOLDER": "Enter the last name"
+ "PLACEHOLDER": "請輸入姓氏"
},
"EMAIL_ADDRESS": {
- "PLACEHOLDER": "Enter the email address",
- "DUPLICATE": "這個電子信箱已經被其他聯絡人使用了。"
+ "PLACEHOLDER": "請輸入電子信箱地址",
+ "DUPLICATE": "此電子信箱已被其他聯絡人使用。"
},
"PHONE_NUMBER": {
- "PLACEHOLDER": "Enter the phone number",
- "DUPLICATE": "This phone number is in use for another contact."
+ "PLACEHOLDER": "請輸入電話號碼",
+ "DUPLICATE": "此電話號碼已被其他聯絡人使用。"
},
"CITY": {
- "PLACEHOLDER": "Enter the city name"
+ "PLACEHOLDER": "請輸入城市名稱"
},
"COUNTRY": {
- "PLACEHOLDER": "Select country"
+ "PLACEHOLDER": "選擇國家"
},
"BIO": {
- "PLACEHOLDER": "Enter the bio"
+ "PLACEHOLDER": "請輸入簡介"
},
"COMPANY_NAME": {
"PLACEHOLDER": "請輸入公司名稱"
}
},
- "UPDATE_BUTTON": "Update contact",
- "SUCCESS_MESSAGE": "Contact updated successfully",
- "ERROR_MESSAGE": "Unable to update contact. Please try again later."
+ "UPDATE_BUTTON": "更新聯絡人",
+ "SUCCESS_MESSAGE": "聯絡人已成功更新",
+ "ERROR_MESSAGE": "無法更新聯絡人,請稍後再試。"
},
"SOCIAL_MEDIA": {
- "TITLE": "Edit social links",
+ "TITLE": "編輯社群連結",
"FORM": {
"FACEBOOK": {
- "PLACEHOLDER": "Add Facebook"
+ "PLACEHOLDER": "新增 Facebook"
},
"GITHUB": {
- "PLACEHOLDER": "Add Github"
+ "PLACEHOLDER": "新增 Github"
},
"INSTAGRAM": {
- "PLACEHOLDER": "Add Instagram"
+ "PLACEHOLDER": "新增 Instagram"
},
"TELEGRAM": {
- "PLACEHOLDER": "Add Telegram"
+ "PLACEHOLDER": "新增 Telegram"
},
"TIKTOK": {
- "PLACEHOLDER": "Add TikTok"
+ "PLACEHOLDER": "新增 TikTok"
},
"LINKEDIN": {
- "PLACEHOLDER": "Add LinkedIn"
+ "PLACEHOLDER": "新增 LinkedIn"
},
"TWITTER": {
- "PLACEHOLDER": "Add Twitter"
+ "PLACEHOLDER": "新增 Twitter"
}
}
},
"DELETE_CONTACT": {
- "MESSAGE": "This action is permanent and irreversible.",
- "BUTTON": "Delete now"
+ "MESSAGE": "此操作為永久性且不可復原。",
+ "BUTTON": "立即刪除"
}
},
"DETAILS": {
- "CREATED_AT": "Created {date}",
- "LAST_ACTIVITY": "Last active {date}",
- "DELETE_CONTACT_DESCRIPTION": "Permanently delete this contact. This action is irreversible",
+ "CREATED_AT": "建立於 {date}",
+ "LAST_ACTIVITY": "最後活動於 {date}",
+ "DELETE_CONTACT_DESCRIPTION": "永久刪除此聯絡人。此操作不可復原。",
"DELETE_CONTACT": "刪除聯絡人",
"DELETE_DIALOG": {
"TITLE": "確認刪除",
- "DESCRIPTION": "Are you sure you want to delete this contact?",
+ "DESCRIPTION": "您確定要刪除此聯絡人嗎?",
"CONFIRM": "是,刪除",
"API": {
- "SUCCESS_MESSAGE": "聯絡人刪除成功",
- "ERROR_MESSAGE": "Could not delete contact. Please try again later."
+ "SUCCESS_MESSAGE": "聯絡人已成功刪除",
+ "ERROR_MESSAGE": "無法刪除聯絡人,請稍後再試。"
}
},
"AVATAR": {
"UPLOAD": {
- "ERROR_MESSAGE": "Could not upload avatar. Please try again later.",
- "SUCCESS_MESSAGE": "Avatar uploaded successfully"
+ "ERROR_MESSAGE": "無法上傳頭像,請稍後再試。",
+ "SUCCESS_MESSAGE": "頭像已成功上傳"
},
"DELETE": {
- "SUCCESS_MESSAGE": "Avatar deleted successfully",
- "ERROR_MESSAGE": "Could not delete avatar. Please try again later."
+ "SUCCESS_MESSAGE": "頭像已成功刪除",
+ "ERROR_MESSAGE": "無法刪除頭像,請稍後再試。"
}
}
},
"SIDEBAR": {
"TABS": {
"ATTRIBUTES": "屬性",
- "HISTORY": "History",
- "NOTES": "筆記",
- "MERGE": "Merge"
+ "HISTORY": "歷史紀錄",
+ "NOTES": "備註",
+ "MERGE": "合併"
},
"HISTORY": {
- "EMPTY_STATE": "There are no previous conversations associated to this contact"
+ "EMPTY_STATE": "此聯絡人沒有關聯的歷史對話"
},
"ATTRIBUTES": {
- "SEARCH_PLACEHOLDER": "Search for attributes",
- "UNUSED_ATTRIBUTES": "{count} Used attribute | {count} Unused attributes",
- "EMPTY_STATE": "There are no contact custom attributes available in this account. You can create a custom attribute in settings.",
+ "SEARCH_PLACEHOLDER": "搜尋屬性",
+ "UNUSED_ATTRIBUTES": "{count} 個已使用屬性 | {count} 個未使用屬性",
+ "EMPTY_STATE": "此帳戶中沒有可用的聯絡人自訂屬性。您可以在設定中建立自訂屬性。",
"YES": "是",
"NO": "否",
"TRIGGER": {
- "SELECT": "Select value",
- "INPUT": "輸入文字或數值"
+ "SELECT": "選擇值",
+ "INPUT": "輸入值"
},
"VALIDATIONS": {
- "INVALID_NUMBER": "Invalid number",
- "REQUIRED": "Valid value is required",
- "INVALID_INPUT": "Invalid input",
- "INVALID_URL": "Invalid URL",
- "INVALID_DATE": "Invalid date"
+ "INVALID_NUMBER": "無效的數字",
+ "REQUIRED": "請輸入有效的值",
+ "INVALID_INPUT": "無效的輸入",
+ "INVALID_URL": "無效的 URL",
+ "INVALID_DATE": "無效的日期"
},
- "NO_ATTRIBUTES": "No attributes found",
+ "NO_ATTRIBUTES": "查無屬性",
"API": {
- "SUCCESS_MESSAGE": "屬性更新成功",
- "DELETE_SUCCESS_MESSAGE": "Attribute deleted successfully",
- "UPDATE_ERROR": "Unable to update attribute. Please try again later",
- "DELETE_ERROR": "Unable to delete attribute. Please try again later"
+ "SUCCESS_MESSAGE": "屬性已成功更新",
+ "DELETE_SUCCESS_MESSAGE": "屬性已成功刪除",
+ "UPDATE_ERROR": "無法更新屬性,請稍後再試",
+ "DELETE_ERROR": "無法刪除屬性,請稍後再試"
}
},
"MERGE": {
- "TITLE": "Merge contact",
- "DESCRIPTION": "Combine two profiles into one, including all attributes and conversations. In case of conflict, the primary contact’s attributes will take precedence.",
- "PRIMARY": "Primary contact",
- "PRIMARY_HELP_LABEL": "To be saved",
- "PRIMARY_REQUIRED_ERROR": "Please select a contact to merge with before proceeding",
- "PARENT": "To be merged",
- "PARENT_HELP_LABEL": "To be deleted",
- "EMPTY_STATE": "No contacts found",
- "PLACEHOLDER": "Search for primary contact",
- "SEARCH_PLACEHOLDER": "Search for a contact",
- "SEARCH_ERROR_MESSAGE": "Could not search for contacts. Please try again later.",
- "SUCCESS_MESSAGE": "Contact merged successfully",
- "ERROR_MESSAGE": "Could not merge contacts, try again!",
- "IS_SEARCHING": "Searching...",
+ "TITLE": "合併聯絡人",
+ "DESCRIPTION": "將兩個個人檔案合併為一個,包含所有屬性和對話。如有衝突,將以主要聯絡人的屬性為準。",
+ "PRIMARY": "主要聯絡人",
+ "PRIMARY_HELP_LABEL": "將被保留",
+ "PRIMARY_REQUIRED_ERROR": "請先選擇要合併的聯絡人再繼續",
+ "PARENT": "將被合併",
+ "PARENT_HELP_LABEL": "將被刪除",
+ "EMPTY_STATE": "找不到聯絡人",
+ "PLACEHOLDER": "搜尋主要聯絡人",
+ "SEARCH_PLACEHOLDER": "搜尋聯絡人",
+ "SEARCH_ERROR_MESSAGE": "無法搜尋聯絡人,請稍後再試。",
+ "SUCCESS_MESSAGE": "聯絡人已成功合併",
+ "ERROR_MESSAGE": "無法合併聯絡人,請重試!",
+ "IS_SEARCHING": "搜尋中...",
"BUTTONS": {
"CANCEL": "取消",
- "CONFIRM": "Merge contact"
+ "CONFIRM": "合併聯絡人"
}
},
"NOTES": {
- "PLACEHOLDER": "新增筆記",
- "WROTE": "wrote",
- "YOU": "You",
- "SAVE": "Save note",
- "ADD_NOTE": "Add contact note",
- "EXPAND": "Expand",
- "COLLAPSE": "Collapse",
- "NO_NOTES": "No notes, you can add notes from the contact details page.",
- "EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above.",
- "CONVERSATION_EMPTY_STATE": "There are no notes yet. Use the Add note button to create one."
+ "PLACEHOLDER": "新增備註",
+ "WROTE": "撰寫了",
+ "YOU": "您",
+ "SAVE": "儲存備註",
+ "ADD_NOTE": "新增聯絡人備註",
+ "EXPAND": "展開",
+ "COLLAPSE": "收合",
+ "NO_NOTES": "尚無備註,您可以從聯絡人詳細資訊頁面新增備註。",
+ "EMPTY_STATE": "此聯絡人尚無備註。您可以在上方輸入框中新增備註。",
+ "CONVERSATION_EMPTY_STATE": "尚無備註。使用新增備註按鈕來建立一個。"
}
},
"EMPTY_STATE": {
- "TITLE": "No contacts found in this account",
- "SUBTITLE": "Start adding new contacts by clicking on the button below",
- "BUTTON_LABEL": "Add contact",
+ "TITLE": "此帳戶中找不到聯絡人",
+ "SUBTITLE": "點選下方按鈕開始新增聯絡人",
+ "BUTTON_LABEL": "新增聯絡人",
"SEARCH_EMPTY_STATE_TITLE": "找不到符合條件的聯絡人 🔍",
- "LIST_EMPTY_STATE_TITLE": "No contacts available in this view 📋",
- "ACTIVE_EMPTY_STATE_TITLE": "No contacts are active at the moment 🌙"
+ "LIST_EMPTY_STATE_TITLE": "此檢視中沒有可用的聯絡人 📋",
+ "ACTIVE_EMPTY_STATE_TITLE": "目前沒有活躍的聯絡人 🌙"
},
- "LOAD_MORE": "Load more"
+ "LOAD_MORE": "載入更多"
},
"CONTACTS_BULK_ACTIONS": {
- "ASSIGN_LABELS": "Assign Labels",
- "ASSIGN_LABELS_SUCCESS": "Labels assigned successfully.",
- "ASSIGN_LABELS_FAILED": "Failed to assign labels",
- "DESCRIPTION": "Select the labels you want to add to the selected contacts.",
- "NO_LABELS_FOUND": "No labels available yet.",
- "SELECTED_COUNT": "{count} selected",
- "CLEAR_SELECTION": "Clear selection",
- "SELECT_ALL": "Select all ({count})",
+ "ASSIGN_LABELS": "指派標籤",
+ "ASSIGN_LABELS_SUCCESS": "標籤已成功指派。",
+ "ASSIGN_LABELS_FAILED": "指派標籤失敗",
+ "DESCRIPTION": "選擇您要新增到所選聯絡人的標籤。",
+ "NO_LABELS_FOUND": "尚無可用的標籤。",
+ "SELECTED_COUNT": "已選取 {count} 個",
+ "CLEAR_SELECTION": "清除選取",
+ "SELECT_ALL": "全選({count})",
"DELETE_CONTACTS": "刪除",
- "DELETE_SUCCESS": "Contacts deleted successfully.",
- "DELETE_FAILED": "Failed to delete contacts.",
+ "DELETE_SUCCESS": "聯絡人已成功刪除。",
+ "DELETE_FAILED": "刪除聯絡人失敗。",
"DELETE_DIALOG": {
- "TITLE": "Delete selected contacts",
- "SINGULAR_TITLE": "Delete selected contact",
- "DESCRIPTION": "This will permanently delete {count} selected contacts. This action cannot be undone.",
- "SINGULAR_DESCRIPTION": "This will permanently delete the selected contact. This action cannot be undone.",
- "CONFIRM_MULTIPLE": "Delete contacts",
+ "TITLE": "刪除所選聯絡人",
+ "SINGULAR_TITLE": "刪除所選聯絡人",
+ "DESCRIPTION": "此操作將永久刪除 {count} 位所選聯絡人。此操作無法復原。",
+ "SINGULAR_DESCRIPTION": "此操作將永久刪除所選聯絡人。此操作無法復原。",
+ "CONFIRM_MULTIPLE": "刪除聯絡人",
"CONFIRM_SINGLE": "刪除聯絡人"
}
},
+
"COMPOSE_NEW_CONVERSATION": {
"CONTACT_SEARCH": {
- "ERROR_MESSAGE": "We couldn’t complete the search. Please try again."
+ "ERROR_MESSAGE": "無法完成搜尋,請重試。"
},
"FORM": {
"GO_TO_CONVERSATION": "查看",
- "SUCCESS_MESSAGE": "The message was sent successfully!",
- "ERROR_MESSAGE": "An error occurred while creating the conversation. Please try again later.",
- "NO_INBOX_ALERT": "There are no available inboxes to start a conversation with this contact.",
+ "SUCCESS_MESSAGE": "訊息已成功傳送!",
+ "ERROR_MESSAGE": "建立對話時發生錯誤,請稍後再試。",
+ "NO_INBOX_ALERT": "沒有可用的收件匣來與此聯絡人發起對話。",
"CONTACT_SELECTOR": {
- "LABEL": "To:",
- "TAG_INPUT_PLACEHOLDER": "Enter at least 2 characters to search by name, email, or phone number",
- "CONTACT_CREATING": "Creating contact..."
+ "LABEL": "收件人:",
+ "TAG_INPUT_PLACEHOLDER": "請輸入至少 2 個字元以搜尋姓名、電子信箱或電話號碼",
+ "CONTACT_CREATING": "正在建立聯絡人..."
},
"INBOX_SELECTOR": {
- "LABEL": "Via:",
- "BUTTON": "Show inboxes"
+ "LABEL": "透過:",
+ "BUTTON": "顯示收件匣"
},
"EMAIL_OPTIONS": {
- "SUBJECT_LABEL": "主旨 :",
- "SUBJECT_PLACEHOLDER": "Enter your email subject here",
- "CC_LABEL": "副本:",
- "CC_PLACEHOLDER": "Enter at least 2 characters to search by email",
- "BCC_LABEL": "密件副本:",
- "BCC_PLACEHOLDER": "Enter at least 2 characters to search by email",
+ "SUBJECT_LABEL": "主旨:",
+ "SUBJECT_PLACEHOLDER": "請在此輸入電子郵件主旨",
+ "CC_LABEL": "副本:",
+ "CC_PLACEHOLDER": "請輸入至少 2 個字元以搜尋電子信箱",
+ "BCC_LABEL": "密件副本:",
+ "BCC_PLACEHOLDER": "請輸入至少 2 個字元以搜尋電子信箱",
"BCC_BUTTON": "密件副本"
},
"MESSAGE_EDITOR": {
- "PLACEHOLDER": "在此填寫你的訊息..."
+ "PLACEHOLDER": "在此填寫您的訊息..."
},
"WHATSAPP_OPTIONS": {
- "LABEL": "Select template",
- "SEARCH_PLACEHOLDER": "Search templates",
- "EMPTY_STATE": "No templates found",
+ "LABEL": "選擇範本",
+ "SEARCH_PLACEHOLDER": "搜尋範本",
+ "EMPTY_STATE": "查無範本",
"TEMPLATE_PARSER": {
- "TEMPLATE_NAME": "WhatsApp template: {templateName}",
- "VARIABLES": "Variables",
+ "TEMPLATE_NAME": "WhatsApp 範本:{templateName}",
+ "VARIABLES": "變數",
"BACK": "返回",
"SEND_MESSAGE": "傳送訊息"
}
},
"TWILIO_OPTIONS": {
- "LABEL": "Select template",
- "SEARCH_PLACEHOLDER": "Search templates",
- "EMPTY_STATE": "No templates found",
+ "LABEL": "選擇範本",
+ "SEARCH_PLACEHOLDER": "搜尋範本",
+ "EMPTY_STATE": "查無範本",
"TEMPLATE_PARSER": {
"BACK": "返回",
"SEND_MESSAGE": "傳送訊息"
}
},
"ACTION_BUTTONS": {
- "DISCARD": "Discard",
- "SEND": "Send ({keyCode})"
+ "DISCARD": "捨棄",
+ "SEND": "傳送({keyCode})"
}
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/contactFilters.json b/app/javascript/dashboard/i18n/locale/zh_TW/contactFilters.json
index 3a6337285..16501446d 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/contactFilters.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/contactFilters.json
@@ -1,20 +1,20 @@
{
"CONTACTS_FILTER": {
- "TITLE": "過濾聯絡人",
- "SUBTITLE": "新增過濾器並點選“提交”以過濾聯絡人。",
- "EDIT_CUSTOM_SEGMENT": "編輯分段",
- "CUSTOM_VIEWS_SUBTITLE": "新增或刪除過濾器並更新您的分段。",
+ "TITLE": "篩選聯絡人",
+ "SUBTITLE": "新增以下篩選條件並點選「送出」以篩選聯絡人。",
+ "EDIT_CUSTOM_SEGMENT": "編輯區段",
+ "CUSTOM_VIEWS_SUBTITLE": "新增或移除篩選條件並更新您的區段。",
"ADD_NEW_FILTER": "新增篩選條件",
- "CLEAR_ALL_FILTERS": "清除所有過濾器",
- "FILTER_DELETE_ERROR": "你必須有至少一個篩選條件才能儲存",
+ "CLEAR_ALL_FILTERS": "清除所有篩選條件",
+ "FILTER_DELETE_ERROR": "至少需要一個篩選條件才能儲存",
"SUBMIT_BUTTON_LABEL": "送出",
- "UPDATE_BUTTON_LABEL": "更新分段",
+ "UPDATE_BUTTON_LABEL": "更新區段",
"CANCEL_BUTTON_LABEL": "取消",
"CLEAR_BUTTON_LABEL": "清除篩選條件",
- "EMPTY_VALUE_ERROR": "此欄位為必填項目",
- "SEGMENT_LABEL": "分段名稱",
- "SEGMENT_QUERY_LABEL": "分段查詢",
- "TOOLTIP_LABEL": "過濾聯絡人",
+ "EMPTY_VALUE_ERROR": "值為必填",
+ "SEGMENT_LABEL": "區段名稱",
+ "SEGMENT_QUERY_LABEL": "區段查詢",
+ "TOOLTIP_LABEL": "篩選聯絡人",
"QUERY_DROPDOWN_LABELS": {
"AND": "且",
"OR": "或"
@@ -31,28 +31,28 @@
"days_before": "x 天前"
},
"ERRORS": {
- "VALUE_REQUIRED": "此欄位為必填項目"
+ "VALUE_REQUIRED": "值為必填"
},
"ATTRIBUTES": {
"NAME": "姓名",
"EMAIL": "電子郵件",
"PHONE_NUMBER": "電話號碼",
- "IDENTIFIER": "識別符號",
+ "IDENTIFIER": "識別碼",
"CITY": "城市",
"COUNTRY": "國家",
"CUSTOM_ATTRIBUTE_LIST": "列表",
"CUSTOM_ATTRIBUTE_TEXT": "文字",
"CUSTOM_ATTRIBUTE_NUMBER": "數字",
"CUSTOM_ATTRIBUTE_LINK": "連結",
- "CUSTOM_ATTRIBUTE_CHECKBOX": "勾選框",
- "CREATED_AT": "建立於",
+ "CUSTOM_ATTRIBUTE_CHECKBOX": "核取方塊",
+ "CREATED_AT": "建立時間",
"LAST_ACTIVITY": "最後活動",
- "REFERER_LINK": "引用連結",
- "BLOCKED": "已阻止",
+ "REFERER_LINK": "來源連結",
+ "BLOCKED": "已封鎖",
"LABELS": "標籤"
},
"GROUPS": {
- "STANDARD_FILTERS": "一般篩選條件",
+ "STANDARD_FILTERS": "標準篩選條件",
"ADDITIONAL_FILTERS": "進階篩選條件",
"CUSTOM_ATTRIBUTES": "自訂屬性"
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/contentTemplates.json b/app/javascript/dashboard/i18n/locale/zh_TW/contentTemplates.json
index e893227bd..88d2d25c3 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/contentTemplates.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/contentTemplates.json
@@ -1,45 +1,45 @@
{
"CONTENT_TEMPLATES": {
"MODAL": {
- "TITLE": "Twilio 模板",
- "SUBTITLE": "選擇您想要傳送的 Twilio 模板",
- "TEMPLATE_SELECTED_SUBTITLE": "配置模板: {templateName}"
+ "TITLE": "Twilio 範本",
+ "SUBTITLE": "選擇您想要傳送的 Twilio 範本",
+ "TEMPLATE_SELECTED_SUBTITLE": "設定範本:{templateName}"
},
"PICKER": {
- "SEARCH_PLACEHOLDER": "查詢模板",
- "NO_TEMPLATES_FOUND": "沒有找到對應的模版",
+ "SEARCH_PLACEHOLDER": "搜尋範本",
+ "NO_TEMPLATES_FOUND": "找不到對應的範本",
"NO_CONTENT": "無內容",
- "HEADER": "頁頭",
- "BODY": "正文內容",
+ "HEADER": "標頭",
+ "BODY": "內文",
"FOOTER": "頁尾",
"BUTTONS": "按鈕",
"CATEGORY": "類別",
"MEDIA_CONTENT": "媒體內容",
"MEDIA_CONTENT_FALLBACK": "媒體內容",
- "NO_TEMPLATES_AVAILABLE": "沒有可用的 Twilio 模板。單擊重新整理以同步Twilio 的模板。",
- "REFRESH_BUTTON": "重新整理模板",
- "REFRESH_SUCCESS": "模板重新整理已啟動。更新可能需要幾分鐘時間。",
- "REFRESH_ERROR": "重新整理模板失敗。請重試。",
+ "NO_TEMPLATES_AVAILABLE": "沒有可用的 Twilio 範本。點擊重新整理以從 Twilio 同步範本。",
+ "REFRESH_BUTTON": "重新整理範本",
+ "REFRESH_SUCCESS": "範本重新整理已啟動,可能需要幾分鐘才能完成更新。",
+ "REFRESH_ERROR": "重新整理範本失敗,請再試一次。",
"LABELS": {
"LANGUAGE": "語言",
- "TEMPLATE_BODY": "模板內容",
+ "TEMPLATE_BODY": "範本內文",
"CATEGORY": "類別"
},
"TYPES": {
"MEDIA": "媒體",
- "QUICK_REPLY": "快速回復",
- "CALL_TO_ACTION": "號召性用語",
+ "QUICK_REPLY": "快速回覆",
+ "CALL_TO_ACTION": "行動呼籲",
"TEXT": "文字"
}
},
"PARSER": {
- "VARIABLES_LABEL": "引數",
+ "VARIABLES_LABEL": "變數",
"LANGUAGE": "語言",
"CATEGORY": "類別",
- "VARIABLE_PLACEHOLDER": "請填寫 {variable}",
+ "VARIABLE_PLACEHOLDER": "請填寫 {variable} 的值",
"GO_BACK_LABEL": "返回",
"SEND_MESSAGE_LABEL": "傳送訊息",
- "FORM_ERROR_MESSAGE": "你必須填寫所有引數才能傳送",
+ "FORM_ERROR_MESSAGE": "傳送前請先填寫所有變數",
"MEDIA_HEADER_LABEL": "{type} 標頭",
"MEDIA_URL_LABEL": "輸入完整媒體 URL",
"MEDIA_URL_PLACEHOLDER": "https://example.com/image.jpg"
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json b/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json
index b03244e9b..af331dc0d 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json
@@ -1,285 +1,285 @@
{
"CONVERSATION": {
"SELECT_A_CONVERSATION": "請從左側窗格選擇一個對話",
- "CSAT_REPLY_MESSAGE": "Please rate the conversation",
- "404": "Sorry, we cannot find the conversation. Please try again",
- "SWITCH_VIEW_LAYOUT": "Switch the layout",
+ "CSAT_REPLY_MESSAGE": "請為此對話評分",
+ "404": "抱歉,找不到該對話。請再試一次",
+ "SWITCH_VIEW_LAYOUT": "切換版面配置",
"DASHBOARD_APP_TAB_MESSAGES": "訊息",
- "UNVERIFIED_SESSION": "The identity of this user is not verified",
- "NO_MESSAGE_1": "您的收件匣中似乎没有客户的消息。",
- "NO_MESSAGE_2": " 向您的頁面發送一條消息!",
- "NO_INBOX_1": "看來你還沒有新增任何收件匣。",
+ "UNVERIFIED_SESSION": "此使用者的身份尚未驗證",
+ "NO_MESSAGE_1": "您的收件匣中目前沒有客戶的訊息。",
+ "NO_MESSAGE_2": " 向您的頁面發送一則訊息!",
+ "NO_INBOX_1": "看起來您還沒有新增任何收件匣。",
"NO_INBOX_2": " 開始吧",
- "NO_INBOX_AGENT": "看起來你還沒有分配到收件匣。請聯絡你的管理員",
+ "NO_INBOX_AGENT": "看起來您尚未被分配到任何收件匣。請聯絡您的管理員",
"SEARCH_MESSAGES": "在對話中搜尋訊息",
- "VIEW_ORIGINAL": "View original",
- "VIEW_TRANSLATED": "View translated",
+ "VIEW_ORIGINAL": "檢視原文",
+ "VIEW_TRANSLATED": "檢視翻譯",
"EMPTY_STATE": {
- "CMD_BAR": "to open command menu",
- "KEYBOARD_SHORTCUTS": "to view keyboard shortcuts"
+ "CMD_BAR": "開啟指令選單",
+ "KEYBOARD_SHORTCUTS": "檢視鍵盤快捷鍵"
},
"SEARCH": {
"TITLE": "搜尋訊息",
"RESULT_TITLE": "搜尋結果",
- "LOADING_MESSAGE": "Crunching data...",
+ "LOADING_MESSAGE": "正在處理資料...",
"PLACEHOLDER": "輸入任何文字以搜尋訊息",
"NO_MATCHING_RESULTS": "查無結果。"
},
"UNREAD_MESSAGES": "未讀訊息",
"UNREAD_MESSAGE": "未讀訊息",
"CLICK_HERE": "點擊這裡",
- "LOADING_INBOXES": "正在加載收件匣",
- "LOADING_CONVERSATIONS": "加載更多對話",
- "CANNOT_REPLY": "您不能回覆,原因是:",
- "24_HOURS_WINDOW": "24 小時消息視窗限制",
- "48_HOURS_WINDOW": "48 小时消息窗口限制",
- "API_HOURS_WINDOW": "You can only reply to this conversation within {hours} hours",
- "NOT_ASSIGNED_TO_YOU": "This conversation is not assigned to you. Would you like to assign this conversation to yourself?",
- "ASSIGN_TO_ME": "指定給我",
- "BOT_HANDOFF_MESSAGE": "You are responding to a conversation which is currently handled by an assistant or a bot.",
- "BOT_HANDOFF_ACTION": "Mark open and assign to you",
- "BOT_HANDOFF_REOPEN_ACTION": "Mark conversation open",
- "BOT_HANDOFF_SUCCESS": "Conversation has been handed over to you",
- "BOT_HANDOFF_ERROR": "Failed to take over the conversation. Please try again.",
- "TWILIO_WHATSAPP_CAN_REPLY": "You can only reply to this conversation using a template message due to",
- "TWILIO_WHATSAPP_24_HOURS_WINDOW": "24 小時消息視窗限制",
- "OLD_INSTAGRAM_INBOX_REPLY_BANNER": "This Instagram account was migrated to the new Instagram channel inbox. All new messages will show up there. You won’t be able to send messages from this conversation anymore.",
- "REPLYING_TO": "你正在回覆到:",
- "REMOVE_SELECTION": "移除選擇項目",
+ "LOADING_INBOXES": "正在載入收件匣",
+ "LOADING_CONVERSATIONS": "正在載入對話",
+ "CANNOT_REPLY": "您無法回覆,原因是",
+ "24_HOURS_WINDOW": "24 小時訊息視窗限制",
+ "48_HOURS_WINDOW": "48 小時訊息視窗限制",
+ "API_HOURS_WINDOW": "您只能在 {hours} 小時內回覆此對話",
+ "NOT_ASSIGNED_TO_YOU": "此對話尚未指派給您。您是否要將此對話指派給自己?",
+ "ASSIGN_TO_ME": "指派給我",
+ "BOT_HANDOFF_MESSAGE": "您正在回覆一個目前由助理或機器人處理的對話。",
+ "BOT_HANDOFF_ACTION": "標記為開啟並指派給您",
+ "BOT_HANDOFF_REOPEN_ACTION": "將對話標記為開啟",
+ "BOT_HANDOFF_SUCCESS": "對話已移交給您",
+ "BOT_HANDOFF_ERROR": "無法接管對話。請再試一次。",
+ "TWILIO_WHATSAPP_CAN_REPLY": "由於以下原因,您只能使用範本訊息回覆此對話",
+ "TWILIO_WHATSAPP_24_HOURS_WINDOW": "24 小時訊息視窗限制",
+ "OLD_INSTAGRAM_INBOX_REPLY_BANNER": "此 Instagram 帳號已遷移至新的 Instagram 頻道收件匣。所有新訊息將顯示在該處。您將無法再從此對話發送訊息。",
+ "REPLYING_TO": "您正在回覆:",
+ "REMOVE_SELECTION": "移除選擇",
"DOWNLOAD": "下載",
- "UNKNOWN_FILE_TYPE": "Unknown File",
- "SAVE_CONTACT": "Save Contact",
- "NO_CONTENT": "No content to display",
+ "UNKNOWN_FILE_TYPE": "未知檔案",
+ "SAVE_CONTACT": "儲存聯絡人",
+ "NO_CONTENT": "無內容可顯示",
"SHARED_ATTACHMENT": {
- "CONTACT": "{sender} has shared a contact",
- "LOCATION": "{sender} has shared a location",
- "FILE": "{sender} has shared a file",
- "MEETING": "{sender} has started a meeting"
+ "CONTACT": "{sender} 分享了一個聯絡人",
+ "LOCATION": "{sender} 分享了一個位置",
+ "FILE": "{sender} 分享了一個檔案",
+ "MEETING": "{sender} 開始了一場會議"
},
"UPLOADING_ATTACHMENTS": "正在上傳附件...",
- "REPLIED_TO_STORY": "Replied to your story",
- "UNSUPPORTED_MESSAGE": "This message is unsupported. You can view this message on the Facebook / Instagram app.",
- "UNSUPPORTED_MESSAGE_FACEBOOK": "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.",
+ "REPLIED_TO_STORY": "回覆了您的限時動態",
+ "UNSUPPORTED_MESSAGE": "此訊息不受支援。如需檢視,請在原始平台上開啟。",
+ "UNSUPPORTED_MESSAGE_FACEBOOK": "此訊息不受支援。您可以在 Facebook Messenger 應用程式中檢視此訊息。",
+ "UNSUPPORTED_MESSAGE_INSTAGRAM": "此訊息不受支援。您可以在 Instagram 應用程式中檢視此訊息。",
+ "UNSUPPORTED_MESSAGE_TIKTOK": "此訊息不受支援。您可以在 TikTok 應用程式中檢視此訊息。",
"SUCCESS_DELETE_MESSAGE": "已成功刪除訊息",
"FAIL_DELETE_MESSSAGE": "無法刪除訊息!請再試一次",
"NO_RESPONSE": "無回應",
- "RESPONSE": "Response",
- "RATING_TITLE": "Rating",
- "FEEDBACK_TITLE": "Feedback",
- "REPLY_MESSAGE_NOT_FOUND": "Message not available",
+ "RESPONSE": "回應",
+ "RATING_TITLE": "評分",
+ "FEEDBACK_TITLE": "意見回饋",
+ "REPLY_MESSAGE_NOT_FOUND": "訊息無法使用",
"CARD": {
- "SHOW_LABELS": "Show labels",
- "HIDE_LABELS": "Hide labels"
+ "SHOW_LABELS": "顯示標籤",
+ "HIDE_LABELS": "隱藏標籤"
},
"VOICE_CALL": {
- "INCOMING_CALL": "Incoming call",
- "OUTGOING_CALL": "Outgoing call",
- "CALL_IN_PROGRESS": "Call in progress",
- "NO_ANSWER": "No answer",
- "MISSED_CALL": "Missed call",
- "CALL_ENDED": "Call ended",
- "NOT_ANSWERED_YET": "Not answered yet",
- "THEY_ANSWERED": "They answered",
- "YOU_ANSWERED": "You answered"
+ "INCOMING_CALL": "來電",
+ "OUTGOING_CALL": "撥出電話",
+ "CALL_IN_PROGRESS": "通話中",
+ "NO_ANSWER": "未接聽",
+ "MISSED_CALL": "未接來電",
+ "CALL_ENDED": "通話結束",
+ "NOT_ANSWERED_YET": "尚未接聽",
+ "THEY_ANSWERED": "對方已接聽",
+ "YOU_ANSWERED": "您已接聽"
},
"HEADER": {
- "RESOLVE_ACTION": "已解決",
- "REOPEN_ACTION": "重新打開",
- "OPEN_ACTION": "打開",
- "MORE_ACTIONS": "More actions",
- "OPEN": "詳細資訊",
+ "RESOLVE_ACTION": "解決",
+ "REOPEN_ACTION": "重新開啟",
+ "OPEN_ACTION": "開啟",
+ "MORE_ACTIONS": "更多操作",
+ "OPEN": "更多",
"CLOSE": "關閉",
"DETAILS": "詳情",
- "SNOOZED_UNTIL": "Snoozed until",
- "SNOOZED_UNTIL_TOMORROW": "Snoozed until tomorrow",
- "SNOOZED_UNTIL_NEXT_WEEK": "Snoozed until next week",
- "SNOOZED_UNTIL_NEXT_REPLY": "Snoozed until next reply",
+ "SNOOZED_UNTIL": "延後至",
+ "SNOOZED_UNTIL_TOMORROW": "延後至明天",
+ "SNOOZED_UNTIL_NEXT_WEEK": "延後至下週",
+ "SNOOZED_UNTIL_NEXT_REPLY": "延後至下次回覆",
"SLA_STATUS": {
"FRT": "FRT {status}",
"NRT": "NRT {status}",
"RT": "RT {status}",
- "MISSED": "missed",
- "DUE": "due"
+ "MISSED": "已逾期",
+ "DUE": "即將到期"
}
},
"RESOLVE_DROPDOWN": {
"MARK_PENDING": "標記為待處理",
- "SNOOZE_UNTIL": "Snooze",
+ "SNOOZE_UNTIL": "延後",
"SNOOZE": {
- "TITLE": "Snooze until",
- "NEXT_REPLY": "下個回覆",
+ "TITLE": "延後至",
+ "NEXT_REPLY": "下次回覆",
"TOMORROW": "明天",
"NEXT_WEEK": "下週"
}
},
"MENTION": {
- "AGENTS": "客服",
+ "AGENTS": "客服人員",
"TEAMS": "團隊"
},
"CUSTOM_SNOOZE": {
- "TITLE": "Snooze until",
- "APPLY": "Snooze",
+ "TITLE": "延後至",
+ "APPLY": "延後",
"CANCEL": "取消"
},
"PRIORITY": {
"TITLE": "優先程度",
"OPTIONS": {
"NONE": "無",
- "URGENT": "Urgent",
- "HIGH": "High",
- "MEDIUM": "Medium",
- "LOW": "Low"
+ "URGENT": "緊急",
+ "HIGH": "高",
+ "MEDIUM": "中",
+ "LOW": "低"
},
"CHANGE_PRIORITY": {
"SELECT_PLACEHOLDER": "無",
- "INPUT_PLACEHOLDER": "Select priority",
- "NO_RESULTS": "No results found",
- "SUCCESSFUL": "Changed priority of conversation id {conversationId} to {priority}",
- "FAILED": "Couldn't change priority. Please try again."
+ "INPUT_PLACEHOLDER": "選擇優先程度",
+ "NO_RESULTS": "查無結果",
+ "SUCCESSFUL": "已將對話 {conversationId} 的優先程度變更為 {priority}",
+ "FAILED": "無法變更優先程度。請再試一次。"
}
},
"DELETE_CONVERSATION": {
- "TITLE": "Delete conversation #{conversationId}",
- "DESCRIPTION": "Are you sure you want to delete this conversation?",
+ "TITLE": "刪除對話 #{conversationId}",
+ "DESCRIPTION": "您確定要刪除此對話嗎?",
"CONFIRM": "刪除"
},
"CARD_CONTEXT_MENU": {
"PENDING": "標記為待處理",
- "RESOLVED": "Mark as resolved",
- "MARK_AS_UNREAD": "Mark as unread",
- "MARK_AS_READ": "標記為已讀取",
+ "RESOLVED": "標記為已解決",
+ "MARK_AS_UNREAD": "標記為未讀",
+ "MARK_AS_READ": "標記為已讀",
"REOPEN": "重新開啟對話",
"SNOOZE": {
- "TITLE": "Snooze",
- "NEXT_REPLY": "Until next reply",
- "TOMORROW": "Until tomorrow",
- "NEXT_WEEK": "Until next week"
+ "TITLE": "延後",
+ "NEXT_REPLY": "至下次回覆",
+ "TOMORROW": "至明天",
+ "NEXT_WEEK": "至下週"
},
- "ASSIGN_AGENT": "Assign agent",
- "ASSIGN_LABEL": "Assign label",
- "AGENTS_LOADING": "Loading agents...",
- "ASSIGN_TEAM": "Assign team",
- "DELETE": "Delete conversation",
- "OPEN_IN_NEW_TAB": "Open in new tab",
- "COPY_LINK": "Copy conversation link",
- "COPY_LINK_SUCCESS": "Conversation link copied to clipboard",
+ "ASSIGN_AGENT": "指派客服人員",
+ "ASSIGN_LABEL": "指派標籤",
+ "AGENTS_LOADING": "正在載入客服人員...",
+ "ASSIGN_TEAM": "指派團隊",
+ "DELETE": "刪除對話",
+ "OPEN_IN_NEW_TAB": "在新分頁中開啟",
+ "COPY_LINK": "複製對話連結",
+ "COPY_LINK_SUCCESS": "對話連結已複製到剪貼簿",
"API": {
"AGENT_ASSIGNMENT": {
- "SUCCESFUL": "Conversation id {conversationId} assigned to \"{agentName}\"",
- "FAILED": "Couldn't assign agent. Please try again."
+ "SUCCESFUL": "已將對話 {conversationId} 指派給「{agentName}」",
+ "FAILED": "無法指派客服人員。請再試一次。"
},
"LABEL_ASSIGNMENT": {
- "SUCCESFUL": "Assigned label #{labelName} to conversation id {conversationId}",
- "FAILED": "Couldn't assign label. Please try again."
+ "SUCCESFUL": "已將標籤 #{labelName} 指派至對話 {conversationId}",
+ "FAILED": "無法指派標籤。請再試一次。"
},
"LABEL_REMOVAL": {
- "SUCCESFUL": "Removed label #{labelName} from conversation id {conversationId}",
- "FAILED": "Couldn't remove label. Please try again."
+ "SUCCESFUL": "已從對話 {conversationId} 移除標籤 #{labelName}",
+ "FAILED": "無法移除標籤。請再試一次。"
},
"TEAM_ASSIGNMENT": {
- "SUCCESFUL": "Assigned team \"{team}\" to conversation id {conversationId}",
- "FAILED": "Couldn't assign team. Please try again."
+ "SUCCESFUL": "已將團隊「{team}」指派至對話 {conversationId}",
+ "FAILED": "無法指派團隊。請再試一次。"
}
}
},
"FOOTER": {
- "MESSAGE_SIGN_TOOLTIP": "Message signature",
- "ENABLE_SIGN_TOOLTIP": "Enable signature",
- "DISABLE_SIGN_TOOLTIP": "Disable signature",
- "MSG_INPUT": "輸入“/”開始選擇快捷回覆",
- "PRIVATE_MSG_INPUT": "Shift + 輸入新行。這只對客服可以看見",
- "MESSAGING_RESTRICTED": "You cannot reply to this conversation",
- "MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
- "MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
- "MESSAGE_SIGNATURE_NOT_CONFIGURED": "Message signature is not configured, please configure it in profile settings.",
- "COPILOT_MSG_INPUT": "給 Copilot 更多提示,或問其他問題... 按 Enter 發送續接訊息",
- "CLICK_HERE": "Click here to update",
- "WHATSAPP_TEMPLATES": "Whatsapp Templates"
+ "MESSAGE_SIGN_TOOLTIP": "訊息簽名",
+ "ENABLE_SIGN_TOOLTIP": "啟用簽名",
+ "DISABLE_SIGN_TOOLTIP": "停用簽名",
+ "MSG_INPUT": "Shift + Enter 換行。輸入「/」開始選擇快捷回覆。",
+ "PRIVATE_MSG_INPUT": "Shift + Enter 換行。此訊息僅對客服人員可見",
+ "MESSAGING_RESTRICTED": "您無法回覆此對話",
+ "MESSAGING_RESTRICTED_WHATSAPP": "由於 24 小時訊息視窗限制,您只能使用範本訊息回覆",
+ "MESSAGING_RESTRICTED_API": "由於訊息視窗限制,您只能使用範本訊息回覆",
+ "MESSAGE_SIGNATURE_NOT_CONFIGURED": "訊息簽名尚未設定,請至個人檔案設定中進行設定。",
+ "COPILOT_MSG_INPUT": "為 Copilot 提供額外提示,或詢問其他問題... 按 Enter 發送後續訊息",
+ "CLICK_HERE": "點擊此處更新",
+ "WHATSAPP_TEMPLATES": "WhatsApp 範本"
},
"REPLYBOX": {
"REPLY": "回覆",
"PRIVATE_NOTE": "私人筆記",
"SEND": "發送",
"CREATE": "新增筆記",
- "INSERT_READ_MORE": "Read more",
- "DISMISS_REPLY": "Dismiss reply",
- "REPLYING_TO": "Replying to:",
- "TIP_EMOJI_ICON": "顯示 emoji 選擇器",
- "TIP_ATTACH_ICON": "附件",
- "TIP_AUDIORECORDER_ICON": "Record audio",
- "TIP_AUDIORECORDER_PERMISSION": "Allow access to audio",
- "TIP_AUDIORECORDER_ERROR": "Could not open the audio",
- "DRAG_DROP": "Drag and drop here to attach",
- "START_AUDIO_RECORDING": "Start audio recording",
- "STOP_AUDIO_RECORDING": "Stop audio recording",
+ "INSERT_READ_MORE": "閱讀更多",
+ "DISMISS_REPLY": "取消回覆",
+ "REPLYING_TO": "正在回覆:",
+ "TIP_EMOJI_ICON": "顯示表情符號選擇器",
+ "TIP_ATTACH_ICON": "附加檔案",
+ "TIP_AUDIORECORDER_ICON": "錄製音訊",
+ "TIP_AUDIORECORDER_PERMISSION": "允許存取音訊",
+ "TIP_AUDIORECORDER_ERROR": "無法開啟音訊",
+ "DRAG_DROP": "拖放至此處以附加檔案",
+ "START_AUDIO_RECORDING": "開始錄音",
+ "STOP_AUDIO_RECORDING": "停止錄音",
"COPILOT_THINKING": "Copilot 正在思考",
"EMAIL_HEAD": {
- "TO": "TO",
- "ADD_BCC": "密件副本",
+ "TO": "收件人",
+ "ADD_BCC": "新增密件副本",
"CC": {
"LABEL": "副本",
- "PLACEHOLDER": "使用半型逗號分隔 Email",
- "ERROR": "請輸入有效的電子信箱"
+ "PLACEHOLDER": "以半形逗號分隔電子郵件地址",
+ "ERROR": "請輸入有效的電子郵件地址"
},
"BCC": {
"LABEL": "密件副本",
- "PLACEHOLDER": "使用半型逗號分隔 Email",
- "ERROR": "請輸入有效的電子信箱"
+ "PLACEHOLDER": "以半形逗號分隔電子郵件地址",
+ "ERROR": "請輸入有效的電子郵件地址"
}
},
"UNDEFINED_VARIABLES": {
- "TITLE": "Undefined variables",
- "MESSAGE": "You have {undefinedVariablesCount} undefined variables in your message: {undefinedVariables}. Would you like to send the message anyway?",
+ "TITLE": "未定義的變數",
+ "MESSAGE": "您的訊息中有 {undefinedVariablesCount} 個未定義的變數:{undefinedVariables}。是否仍要發送此訊息?",
"CONFIRM": {
"YES": "發送",
"CANCEL": "取消"
}
},
"QUOTED_REPLY": {
- "ENABLE_TOOLTIP": "Include quoted email thread",
- "DISABLE_TOOLTIP": "Don't include quoted email thread",
- "REMOVE_PREVIEW": "Remove quoted email thread",
- "COLLAPSE": "Collapse preview",
- "EXPAND": "Expand preview"
+ "ENABLE_TOOLTIP": "包含引用的電子郵件串",
+ "DISABLE_TOOLTIP": "不包含引用的電子郵件串",
+ "REMOVE_PREVIEW": "移除引用的電子郵件串",
+ "COLLAPSE": "收合預覽",
+ "EXPAND": "展開預覽"
}
},
- "VISIBLE_TO_AGENTS": "私人筆記:僅對您和您的團隊可以看見",
- "CHANGE_STATUS": "對話狀態已更改",
- "CHANGE_STATUS_FAILED": "Conversation status change failed",
- "CHANGE_AGENT": "對話指派人已更改",
- "CHANGE_AGENT_FAILED": "Assignee change failed",
- "ASSIGN_LABEL_SUCCESFUL": "Label assigned successfully",
- "ASSIGN_LABEL_FAILED": "Label assignment failed",
- "CHANGE_TEAM": "Conversation team changed",
- "SUCCESS_DELETE_CONVERSATION": "Conversation deleted successfully",
- "FAIL_DELETE_CONVERSATION": "Couldn't delete conversation! Try again",
- "FILE_SIZE_LIMIT": "File exceeds the {MAXIMUM_SUPPORTED_FILE_UPLOAD_SIZE} MB attachment limit",
- "FILE_TYPE_NOT_SUPPORTED": "This {fileName} file type is not supported in this conversation",
- "MESSAGE_ERROR": "Unable to send this message, please try again later",
- "SENT_BY": "寄送者:",
+ "VISIBLE_TO_AGENTS": "私人筆記:僅對您和您的團隊可見",
+ "CHANGE_STATUS": "對話狀態已變更",
+ "CHANGE_STATUS_FAILED": "對話狀態變更失敗",
+ "CHANGE_AGENT": "對話指派人已變更",
+ "CHANGE_AGENT_FAILED": "指派人變更失敗",
+ "ASSIGN_LABEL_SUCCESFUL": "標籤指派成功",
+ "ASSIGN_LABEL_FAILED": "標籤指派失敗",
+ "CHANGE_TEAM": "對話團隊已變更",
+ "SUCCESS_DELETE_CONVERSATION": "對話已成功刪除",
+ "FAIL_DELETE_CONVERSATION": "無法刪除對話!請再試一次",
+ "FILE_SIZE_LIMIT": "檔案超過 {MAXIMUM_SUPPORTED_FILE_UPLOAD_SIZE} MB 的附件大小限制",
+ "FILE_TYPE_NOT_SUPPORTED": "此對話不支援 {fileName} 檔案類型",
+ "MESSAGE_ERROR": "無法發送此訊息,請稍後再試",
+ "SENT_BY": "發送者:",
"BOT": "機器人",
- "NATIVE_APP": "Native app",
- "NATIVE_APP_ADVISORY": "This message was sent from the native app. Reply from Chatwoot to maintain the message window.",
- "SEND_FAILED": "Couldn't send message! Try again",
- "TRY_AGAIN": "retry",
+ "NATIVE_APP": "原生應用程式",
+ "NATIVE_APP_ADVISORY": "此訊息是從原生應用程式發送的。請從 Chatwoot 回覆以維持訊息視窗。",
+ "SEND_FAILED": "無法發送訊息!請再試一次",
+ "TRY_AGAIN": "重試",
"ASSIGNMENT": {
- "SELECT_AGENT": "選擇客服",
- "REMOVE": "刪除",
+ "SELECT_AGENT": "選擇客服人員",
+ "REMOVE": "移除",
"ASSIGN": "指派"
},
"CONTEXT_MENU": {
"COPY": "複製",
- "REPLY_TO": "Reply to this message",
+ "REPLY_TO": "回覆此訊息",
"DELETE": "刪除",
- "CREATE_A_CANNED_RESPONSE": "Add to canned responses",
- "TRANSLATE": "Translate",
- "COPY_PERMALINK": "Copy link to the message",
- "LINK_COPIED": "Message URL copied to the clipboard",
+ "CREATE_A_CANNED_RESPONSE": "新增至快捷回覆",
+ "TRANSLATE": "翻譯",
+ "COPY_PERMALINK": "複製訊息連結",
+ "LINK_COPIED": "訊息連結已複製到剪貼簿",
"DELETE_CONFIRMATION": {
- "TITLE": "Are you sure you want to delete this message?",
- "MESSAGE": "You cannot undo this action",
+ "TITLE": "您確定要刪除此訊息嗎?",
+ "MESSAGE": "此操作無法復原",
"DELETE": "刪除",
"CANCEL": "取消"
}
@@ -289,164 +289,164 @@
"COPILOT": "Copilot"
},
"VOICE_WIDGET": {
- "INCOMING_CALL": "Incoming call",
- "OUTGOING_CALL": "Outgoing call",
- "CALL_IN_PROGRESS": "Call in progress",
- "NOT_ANSWERED_YET": "Not answered yet",
- "HANDLED_IN_ANOTHER_TAB": "Being handled in another tab",
- "REJECT_CALL": "Reject",
- "JOIN_CALL": "Join call",
- "END_CALL": "End call"
+ "INCOMING_CALL": "來電",
+ "OUTGOING_CALL": "撥出電話",
+ "CALL_IN_PROGRESS": "通話中",
+ "NOT_ANSWERED_YET": "尚未接聽",
+ "HANDLED_IN_ANOTHER_TAB": "正在另一個分頁中處理",
+ "REJECT_CALL": "拒接",
+ "JOIN_CALL": "加入通話",
+ "END_CALL": "結束通話"
}
},
"EMAIL_TRANSCRIPT": {
- "TITLE": "Send conversation transcript",
- "DESC": "Send a copy of the conversation transcript to the specified email address",
+ "TITLE": "發送對話記錄",
+ "DESC": "將對話記錄副本發送至指定的電子郵件地址",
"SUBMIT": "送出",
- "CANCEL": "取消操作",
- "SEND_EMAIL_SUCCESS": "The chat transcript was sent successfully",
- "SEND_EMAIL_ERROR": "出錯了,請重試",
- "SEND_EMAIL_PAYMENT_REQUIRED": "Email transcript is not available on your current plan. Please upgrade to use this feature.",
+ "CANCEL": "取消",
+ "SEND_EMAIL_SUCCESS": "對話記錄已成功發送",
+ "SEND_EMAIL_ERROR": "發生錯誤,請再試一次",
+ "SEND_EMAIL_PAYMENT_REQUIRED": "您目前的方案不支援電子郵件對話記錄。請升級以使用此功能。",
"FORM": {
- "SEND_TO_CONTACT": "Send the transcript to the customer",
- "SEND_TO_AGENT": "Send the transcript to the assigned agent",
- "SEND_TO_OTHER_EMAIL_ADDRESS": "Send the transcript to another email address",
+ "SEND_TO_CONTACT": "將記錄發送給客戶",
+ "SEND_TO_AGENT": "將記錄發送給指派的客服人員",
+ "SEND_TO_OTHER_EMAIL_ADDRESS": "將記錄發送至其他電子郵件地址",
"EMAIL": {
- "PLACEHOLDER": "請輸入電子信箱",
- "ERROR": "請輸入一個有效的電子信箱"
+ "PLACEHOLDER": "請輸入電子郵件地址",
+ "ERROR": "請輸入有效的電子郵件地址"
}
}
},
"ONBOARDING": {
- "TITLE": "Hey 👋, 歡迎來到 {installationName}!",
- "DESCRIPTION": "Thanks for signing up. We want you to get the most out of {installationName}. Here are a few things you can do in {installationName} to make the experience delightful.",
- "GREETING_MORNING": "👋 Good morning, {name}. Welcome to {installationName}.",
- "GREETING_AFTERNOON": "👋 Good afternoon, {name}. Welcome to {installationName}.",
- "GREETING_EVENING": "👋 Good evening, {name}. Welcome to {installationName}.",
- "READ_LATEST_UPDATES": "查看我們最後的更新",
+ "TITLE": "嗨 👋,歡迎來到 {installationName}!",
+ "DESCRIPTION": "感謝您的註冊。我們希望您能充分運用 {installationName}。以下是一些您可以在 {installationName} 中進行的操作,讓體驗更加順暢。",
+ "GREETING_MORNING": "👋 早安,{name}。歡迎來到 {installationName}。",
+ "GREETING_AFTERNOON": "👋 午安,{name}。歡迎來到 {installationName}。",
+ "GREETING_EVENING": "👋 晚安,{name}。歡迎來到 {installationName}。",
+ "READ_LATEST_UPDATES": "查看我們的最新更新",
"ALL_CONVERSATION": {
- "TITLE": "All your conversations in one place",
- "DESCRIPTION": "View all the conversations from your customers in one single dashboard. You can filter the conversations by the incoming channel, label and status.",
- "NEW_LINK": "按此建立一個收件匣"
+ "TITLE": "將所有對話集中在一處",
+ "DESCRIPTION": "在單一儀表板中檢視來自客戶的所有對話。您可以依據來源頻道、標籤和狀態篩選對話。",
+ "NEW_LINK": "點擊此處建立收件匣"
},
"TEAM_MEMBERS": {
- "TITLE": "邀請團隊成員",
- "DESCRIPTION": "Since you are getting ready to talk to your customer, bring in your teammates to assist you. You can invite your teammates by adding their email addresses to the agent list.",
- "NEW_LINK": "按此邀請一個新成員"
+ "TITLE": "邀請您的團隊成員",
+ "DESCRIPTION": "既然您準備好與客戶對話了,不妨邀請您的隊友來協助您。您可以將隊友的電子郵件地址新增到客服人員清單中來邀請他們。",
+ "NEW_LINK": "點擊此處邀請團隊成員"
},
"LABELS": {
- "TITLE": "Organize conversations with labels",
- "DESCRIPTION": "Labels provide an easier way to categorize your conversation. Create some labels like #support-enquiry, #billing-question etc., so that you can use them in a conversation later.",
- "NEW_LINK": "按此建立標籤"
+ "TITLE": "使用標籤整理對話",
+ "DESCRIPTION": "標籤提供了更簡便的方式來分類您的對話。建立一些標籤,例如 #support-enquiry、#billing-question 等,以便日後在對話中使用。",
+ "NEW_LINK": "點擊此處建立標籤"
},
"CANNED_RESPONSES": {
- "TITLE": "Create canned responses",
- "DESCRIPTION": "Pre-written quick reply templates help you quickly respond to a conversation. Agents can type the '/' character followed by the shortcode to insert a response.",
- "NEW_LINK": "Click here to create a canned response"
+ "TITLE": "建立快捷回覆",
+ "DESCRIPTION": "預先撰寫的快速回覆範本可幫助您快速回應對話。客服人員可以輸入「/」字元後接簡碼來插入回覆。",
+ "NEW_LINK": "點擊此處建立快捷回覆"
}
},
"CONVERSATION_SIDEBAR": {
- "ASSIGNEE_LABEL": "指派客服",
- "SELF_ASSIGN": "指定給我",
+ "ASSIGNEE_LABEL": "指派客服人員",
+ "SELF_ASSIGN": "指派給我",
"TEAM_LABEL": "指派團隊",
"SELECT": {
"PLACEHOLDER": "無"
},
"ACCORDION": {
"CONTACT_DETAILS": "聯絡人詳細資料",
- "CONVERSATION_ACTIONS": "Conversation Actions",
- "CONVERSATION_LABELS": "對話標記",
+ "CONVERSATION_ACTIONS": "對話操作",
+ "CONVERSATION_LABELS": "對話標籤",
"CONVERSATION_INFO": "對話資訊",
- "CONTACT_NOTES": "Contact Notes",
+ "CONTACT_NOTES": "聯絡人備註",
"CONTACT_ATTRIBUTES": "聯絡人屬性",
- "PREVIOUS_CONVERSATION": "上一次對話",
- "MACROS": "Macros",
- "LINEAR_ISSUES": "Linked Linear Issues",
- "SHOPIFY_ORDERS": "Shopify Orders"
+ "PREVIOUS_CONVERSATION": "先前的對話",
+ "MACROS": "巨集",
+ "LINEAR_ISSUES": "已連結的 Linear 議題",
+ "SHOPIFY_ORDERS": "Shopify 訂單"
},
"SHOPIFY": {
- "ORDER_ID": "Order #{id}",
- "ERROR": "Error loading orders",
- "NO_SHOPIFY_ORDERS": "No orders found",
+ "ORDER_ID": "訂單 #{id}",
+ "ERROR": "載入訂單時發生錯誤",
+ "NO_SHOPIFY_ORDERS": "找不到訂單",
"FINANCIAL_STATUS": {
"PENDING": "待處理",
- "AUTHORIZED": "Authorized",
- "PARTIALLY_PAID": "Partially Paid",
- "PAID": "Paid",
- "PARTIALLY_REFUNDED": "Partially Refunded",
- "REFUNDED": "Refunded",
- "VOIDED": "Voided"
+ "AUTHORIZED": "已授權",
+ "PARTIALLY_PAID": "部分付款",
+ "PAID": "已付款",
+ "PARTIALLY_REFUNDED": "部分退款",
+ "REFUNDED": "已退款",
+ "VOIDED": "已作廢"
},
"FULFILLMENT_STATUS": {
- "FULFILLED": "Fulfilled",
- "PARTIALLY_FULFILLED": "Partially Fulfilled",
- "UNFULFILLED": "Unfulfilled"
+ "FULFILLED": "已出貨",
+ "PARTIALLY_FULFILLED": "部分出貨",
+ "UNFULFILLED": "未出貨"
}
}
},
"CONVERSATION_CUSTOM_ATTRIBUTES": {
- "ADD_BUTTON_TEXT": "Create attribute",
- "NO_RECORDS_FOUND": "No attributes found",
+ "ADD_BUTTON_TEXT": "建立屬性",
+ "NO_RECORDS_FOUND": "找不到屬性",
"UPDATE": {
"SUCCESS": "屬性更新成功",
- "ERROR": "Unable to update attribute. Please try again later"
+ "ERROR": "無法更新屬性。請稍後再試"
},
"ADD": {
"TITLE": "新增",
"SUCCESS": "屬性新增成功",
- "ERROR": "Unable to add attribute. Please try again later"
+ "ERROR": "無法新增屬性。請稍後再試"
},
"DELETE": {
- "SUCCESS": "Attribute deleted successfully",
- "ERROR": "Unable to delete attribute. Please try again later"
+ "SUCCESS": "屬性刪除成功",
+ "ERROR": "無法刪除屬性。請稍後再試"
},
"ATTRIBUTE_SELECT": {
- "TITLE": "Add attributes",
- "PLACEHOLDER": "Search attributes",
- "NO_RESULT": "No attributes found"
+ "TITLE": "新增屬性",
+ "PLACEHOLDER": "搜尋屬性",
+ "NO_RESULT": "找不到屬性"
}
},
"EMAIL_HEADER": {
- "FROM": "From",
- "TO": "To",
+ "FROM": "寄件人",
+ "TO": "收件人",
"BCC": "密件副本",
"CC": "副本",
"SUBJECT": "主旨",
- "EXPAND": "Expand email"
+ "EXPAND": "展開電子郵件"
},
"CONVERSATION_PARTICIPANTS": {
- "SIDEBAR_MENU_TITLE": "Participating",
- "SIDEBAR_TITLE": "Conversation participants",
- "NO_RECORDS_FOUND": "No results found",
- "ADD_PARTICIPANTS": "Select participants",
- "REMANING_PARTICIPANTS_TEXT": "+{count} others",
- "REMANING_PARTICIPANT_TEXT": "+{count} other",
- "TOTAL_PARTICIPANTS_TEXT": "{count} people are participating.",
- "TOTAL_PARTICIPANT_TEXT": "{count} person is participating.",
- "NO_PARTICIPANTS_TEXT": "No one is participating!.",
- "WATCH_CONVERSATION": "Join conversation",
- "YOU_ARE_WATCHING": "You are participating",
+ "SIDEBAR_MENU_TITLE": "參與中",
+ "SIDEBAR_TITLE": "對話參與者",
+ "NO_RECORDS_FOUND": "查無結果",
+ "ADD_PARTICIPANTS": "選擇參與者",
+ "REMANING_PARTICIPANTS_TEXT": "及其他 {count} 人",
+ "REMANING_PARTICIPANT_TEXT": "及其他 {count} 人",
+ "TOTAL_PARTICIPANTS_TEXT": "共 {count} 人正在參與。",
+ "TOTAL_PARTICIPANT_TEXT": "共 {count} 人正在參與。",
+ "NO_PARTICIPANTS_TEXT": "目前無人參與。",
+ "WATCH_CONVERSATION": "加入對話",
+ "YOU_ARE_WATCHING": "您正在參與",
"API": {
- "ERROR_MESSAGE": "Could not update, try again!",
- "SUCCESS_MESSAGE": "Participants updated!"
+ "ERROR_MESSAGE": "無法更新,請再試一次!",
+ "SUCCESS_MESSAGE": "參與者已更新!"
}
},
"TRANSLATE_MODAL": {
- "TITLE": "View translated content",
- "DESC": "You can view the translated content in each langauge.",
- "ORIGINAL_CONTENT": "Original Content",
- "TRANSLATED_CONTENT": "Translated Content",
- "NO_TRANSLATIONS_AVAILABLE": "No translations are available for this content"
+ "TITLE": "檢視翻譯內容",
+ "DESC": "您可以檢視各語言的翻譯內容。",
+ "ORIGINAL_CONTENT": "原始內容",
+ "TRANSLATED_CONTENT": "翻譯內容",
+ "NO_TRANSLATIONS_AVAILABLE": "此內容目前沒有可用的翻譯"
},
"TYPING": {
- "ONE": "{user} is typing",
- "TWO": "{user} and {secondUser} are typing",
- "MULTIPLE": "{user} and {count} others are typing"
+ "ONE": "{user} 正在輸入",
+ "TWO": "{user} 和 {secondUser} 正在輸入",
+ "MULTIPLE": "{user} 和其他 {count} 人正在輸入"
},
"COPILOT": {
- "TRY_THESE_PROMPTS": "Try these prompts"
+ "TRY_THESE_PROMPTS": "試試這些提示"
},
"GALLERY_VIEW": {
- "ERROR_DOWNLOADING": "Unable to download attachment. Please try again"
+ "ERROR_DOWNLOADING": "無法下載附件。請再試一次"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/csatMgmt.json b/app/javascript/dashboard/i18n/locale/zh_TW/csatMgmt.json
index c8d3583c3..d7f7da253 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/csatMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/csatMgmt.json
@@ -1,12 +1,12 @@
{
"CSAT": {
- "TITLE": "評價您的對話",
+ "TITLE": "為您的對話評分",
"PLACEHOLDER": "告訴我們更多...",
"RATINGS": {
- "POOR": "😞 差",
- "FAIR": "😑 一般",
- "AVERAGE": "😐 中等",
- "GOOD": "😀 好",
+ "POOR": "😞 很差",
+ "FAIR": "😑 尚可",
+ "AVERAGE": "😐 普通",
+ "GOOD": "😀 良好",
"EXCELLENT": "😍 非常好"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/customRole.json b/app/javascript/dashboard/i18n/locale/zh_TW/customRole.json
index 901b4a7c7..c71818a0a 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/customRole.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/customRole.json
@@ -1,93 +1,93 @@
{
"CUSTOM_ROLE": {
- "HEADER": "Custom Roles",
- "LEARN_MORE": "Learn more about custom roles",
- "DESCRIPTION": "Custom roles are roles that are created by the account owner or admin. These roles can be assigned to agents to define their access and permissions within the account. Custom roles can be created with specific permissions and access levels to suit the requirements of the organization.",
- "COUNT": "{n} custom role | {n} custom roles",
- "HEADER_BTN_TXT": "Add custom role",
- "LOADING": "Fetching custom roles...",
- "SEARCH_PLACEHOLDER": "Search custom roles...",
- "NO_RESULTS": "No custom roles found matching your search",
- "SEARCH_404": "沒有任何項目符合此查詢.",
+ "HEADER": "自訂角色",
+ "LEARN_MORE": "瞭解更多關於自訂角色",
+ "DESCRIPTION": "自訂角色是由帳戶擁有者或管理員建立的角色。這些角色可以指派給客服,以定義他們在帳戶中的存取權限。自訂角色可以根據組織的需求,建立具有特定權限和存取層級的角色。",
+ "COUNT": "{n} 個自訂角色 | {n} 個自訂角色",
+ "HEADER_BTN_TXT": "新增自訂角色",
+ "LOADING": "正在取得自訂角色...",
+ "SEARCH_PLACEHOLDER": "搜尋自訂角色...",
+ "NO_RESULTS": "找不到符合搜尋條件的自訂角色",
+ "SEARCH_404": "沒有任何項目符合此查詢。",
"PAYWALL": {
- "TITLE": "Upgrade to create custom roles",
- "AVAILABLE_ON": "The custom role feature is only available in the Business and Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to advanced features like team management, automations, custom attributes, and more.",
- "UPGRADE_NOW": "Upgrade now",
- "CANCEL_ANYTIME": "You can change or cancel your plan anytime"
+ "TITLE": "升級以建立自訂角色",
+ "AVAILABLE_ON": "自訂角色功能僅在 Business 和 Enterprise 方案中提供。",
+ "UPGRADE_PROMPT": "升級您的方案以存取進階功能,例如團隊管理、自動化、自訂屬性等。",
+ "UPGRADE_NOW": "立即升級",
+ "CANCEL_ANYTIME": "您可以隨時變更或取消方案"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "The custom role feature is only available in the paid plans.",
- "UPGRADE_PROMPT": "Upgrade to a paid plan to access advanced features like audit logs, agent capacity, and more.",
- "ASK_ADMIN": "Please reach out to your administrator for the upgrade."
+ "AVAILABLE_ON": "自訂角色功能僅在付費方案中提供。",
+ "UPGRADE_PROMPT": "升級至付費方案以存取進階功能,例如稽核日誌、客服容量等。",
+ "ASK_ADMIN": "請聯繫您的管理員進行升級。"
},
"LIST": {
- "404": "There are no custom roles available in this account.",
- "TITLE": "Manage custom roles",
- "DESC": "Custom roles are roles that are created by the account owner or admin. These roles can be assigned to agents to define their access and permissions within the account. Custom roles can be created with specific permissions and access levels to suit the requirements of the organization.",
+ "404": "此帳戶中沒有可用的自訂角色。",
+ "TITLE": "管理自訂角色",
+ "DESC": "自訂角色是由帳戶擁有者或管理員建立的角色。這些角色可以指派給客服,以定義他們在帳戶中的存取權限。自訂角色可以根據組織的需求,建立具有特定權限和存取層級的角色。",
"TABLE_HEADER": {
- "NAME": "姓名",
- "DESCRIPTION": "描述資訊",
- "PERMISSIONS": "Permissions",
+ "NAME": "名稱",
+ "DESCRIPTION": "描述",
+ "PERMISSIONS": "權限",
"ACTIONS": "操作"
}
},
"PERMISSIONS": {
- "CONVERSATION_MANAGE": "Manage all conversations",
- "CONVERSATION_UNASSIGNED_MANAGE": "Manage unassigned conversations and those assigned to them",
- "CONVERSATION_PARTICIPATING_MANAGE": "Manage participating conversations and those assigned to them",
- "CONTACT_MANAGE": "Manage contacts",
- "REPORT_MANAGE": "Manage reports",
- "KNOWLEDGE_BASE_MANAGE": "Manage knowledge base"
+ "CONVERSATION_MANAGE": "管理所有對話",
+ "CONVERSATION_UNASSIGNED_MANAGE": "管理未指派的對話及指派給自己的對話",
+ "CONVERSATION_PARTICIPATING_MANAGE": "管理參與中的對話及指派給自己的對話",
+ "CONTACT_MANAGE": "管理聯絡人",
+ "REPORT_MANAGE": "管理報表",
+ "KNOWLEDGE_BASE_MANAGE": "管理知識庫"
},
"FORM": {
"NAME": {
- "LABEL": "姓名",
- "PLACEHOLDER": "Please enter a name.",
- "ERROR": "名稱為必填."
+ "LABEL": "名稱",
+ "PLACEHOLDER": "請輸入名稱。",
+ "ERROR": "名稱為必填。"
},
"DESCRIPTION": {
- "LABEL": "描述資訊",
- "PLACEHOLDER": "Please enter a description.",
- "ERROR": "描述為必填."
+ "LABEL": "描述",
+ "PLACEHOLDER": "請輸入描述。",
+ "ERROR": "描述為必填。"
},
"PERMISSIONS": {
- "LABEL": "Permissions",
- "ERROR": "Permissions are required."
+ "LABEL": "權限",
+ "ERROR": "權限為必填。"
},
"CANCEL_BUTTON_TEXT": "取消",
"API": {
- "ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
+ "ERROR_MESSAGE": "無法連接伺服器,請再試一次。"
}
},
"ADD": {
- "TITLE": "Add custom role",
- "DESC": " Custom roles allows you to create roles with specific permissions and access levels to suit the requirements of the organization.",
+ "TITLE": "新增自訂角色",
+ "DESC": "自訂角色可讓您建立具有特定權限和存取層級的角色,以符合組織的需求。",
"SUBMIT": "送出",
"API": {
- "SUCCESS_MESSAGE": "Custom role added successfully."
+ "SUCCESS_MESSAGE": "自訂角色新增成功。"
}
},
"EDIT": {
"BUTTON_TEXT": "編輯",
- "TITLE": "Edit custom role",
- "DESC": " Custom roles allows you to create roles with specific permissions and access levels to suit the requirements of the organization.",
+ "TITLE": "編輯自訂角色",
+ "DESC": "自訂角色可讓您建立具有特定權限和存取層級的角色,以符合組織的需求。",
"SUBMIT": "更新",
"API": {
- "SUCCESS_MESSAGE": "Custom role updated successfully."
+ "SUCCESS_MESSAGE": "自訂角色更新成功。"
}
},
"DELETE": {
"BUTTON_TEXT": "刪除",
"API": {
- "SUCCESS_MESSAGE": "Custom role deleted successfully.",
- "ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
+ "SUCCESS_MESSAGE": "自訂角色刪除成功。",
+ "ERROR_MESSAGE": "無法連接伺服器,請再試一次。"
},
"CONFIRM": {
"TITLE": "刪除確認",
- "MESSAGE": "您確定要刪除嗎? ",
- "YES": "是的,刪除 ",
- "NO": "No, keep "
+ "MESSAGE": "您確定要刪除嗎?",
+ "YES": "是,刪除",
+ "NO": "不,保留"
}
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/datePicker.json b/app/javascript/dashboard/i18n/locale/zh_TW/datePicker.json
index 0087c2765..ed7ff32cb 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/datePicker.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/datePicker.json
@@ -1,24 +1,24 @@
{
"DATE_PICKER": {
- "PREVIOUS_PERIOD": "Previous period",
- "NEXT_PERIOD": "Next period",
- "WEEK_NUMBER": "Week #{weekNumber}",
+ "PREVIOUS_PERIOD": "上一個期間",
+ "NEXT_PERIOD": "下一個期間",
+ "WEEK_NUMBER": "第 {weekNumber} 週",
"APPLY_BUTTON": "套用",
- "CLEAR_BUTTON": "Clear",
+ "CLEAR_BUTTON": "清除",
"DATE_RANGE_INPUT": {
- "START": "Start Date",
- "END": "End Date"
+ "START": "開始日期",
+ "END": "結束日期"
},
"DATE_RANGE_OPTIONS": {
- "TITLE": "DATE RANGE",
- "LAST_7_DAYS": "最近7天",
- "LAST_30_DAYS": "最近30天",
- "LAST_3_MONTHS": "三個月內",
- "LAST_6_MONTHS": "六個月內",
- "LAST_YEAR": "去年",
- "THIS_WEEK": "This week",
- "MONTH_TO_DATE": "This month",
- "CUSTOM_RANGE": "自定日期範圍"
+ "TITLE": "日期範圍",
+ "LAST_7_DAYS": "最近 7 天",
+ "LAST_30_DAYS": "最近 30 天",
+ "LAST_3_MONTHS": "最近 3 個月",
+ "LAST_6_MONTHS": "最近 6 個月",
+ "LAST_YEAR": "最近一年",
+ "THIS_WEEK": "本週",
+ "MONTH_TO_DATE": "本月",
+ "CUSTOM_RANGE": "自訂日期範圍"
}
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/emoji.json b/app/javascript/dashboard/i18n/locale/zh_TW/emoji.json
index 2058dd940..d6a1703af 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/emoji.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/emoji.json
@@ -1,7 +1,7 @@
{
"EMOJI": {
"PLACEHOLDER": "搜尋表情符號",
- "NOT_FOUND": "沒有適合你的搜尋結果",
- "REMOVE": "刪除"
+ "NOT_FOUND": "找不到符合的表情符號",
+ "REMOVE": "移除"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/general.json b/app/javascript/dashboard/i18n/locale/zh_TW/general.json
index 9a06e3266..301f6fc30 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/general.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/general.json
@@ -1,16 +1,16 @@
{
"GENERAL": {
- "SHOWING_RESULTS": "Showing {firstIndex}-{lastIndex} of {totalCount} items",
+ "SHOWING_RESULTS": "顯示第 {firstIndex}-{lastIndex} 項,共 {totalCount} 項",
"PHONE_INPUT": {
"PLACEHOLDER": "搜尋",
- "EMPTY_STATE": "No results found"
+ "EMPTY_STATE": "查無結果"
},
"CLOSE": "關閉",
"BETA": "Beta",
- "BETA_DESCRIPTION": "This feature is in beta and may change as we improve it.",
- "ACCEPT": "Accept",
- "DISCARD": "Discard",
- "PREFERRED": "Preferred"
+ "BETA_DESCRIPTION": "此功能目前為 Beta 版本,我們仍在持續改善中。",
+ "ACCEPT": "接受",
+ "DISCARD": "捨棄",
+ "PREFERRED": "偏好"
},
"CHOICE_TOGGLE": {
"YES": "是",
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/generalSettings.json b/app/javascript/dashboard/i18n/locale/zh_TW/generalSettings.json
index 6b006caf4..ec95e9d6f 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/generalSettings.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/generalSettings.json
@@ -1,76 +1,76 @@
{
"GENERAL_SETTINGS": {
"LIMIT_MESSAGES": {
- "CONVERSATION": "You have exceeded the conversation limit. Hacker plan allows only 500 conversations.",
- "INBOXES": "You have exceeded the inbox limit. Hacker plan only supports website live-chat. Additional inboxes like email, WhatsApp etc. require a paid plan.",
- "AGENTS": "You have exceeded the agent limit. Your plan only allows {allowedAgents} agents.",
- "NON_ADMIN": "Please contact your administrator to upgrade the plan and continue using all features."
+ "CONVERSATION": "您已超過對話數量上限。Hacker 方案僅允許 500 則對話。",
+ "INBOXES": "您已超過收件匣數量上限。Hacker 方案僅支援網站即時聊天。如需使用電子郵件、WhatsApp 等額外收件匣,請升級至付費方案。",
+ "AGENTS": "您已超過客服人員數量上限。您的方案僅允許 {allowedAgents} 位客服人員。",
+ "NON_ADMIN": "請聯絡您的管理員升級方案,以繼續使用所有功能。"
},
"TITLE": "帳戶設定",
"SUBMIT": "更新設定",
"BACK": "返回",
- "DISMISS": "Dismiss",
+ "DISMISS": "關閉",
"UPDATE": {
"ERROR": "無法更新設定,請重試!",
"SUCCESS": "已成功更新帳戶設定"
},
"ACCOUNT_DELETE_SECTION": {
- "TITLE": "Delete your Account",
- "NOTE": "Once you delete your account, all your data will be deleted.",
- "BUTTON_TEXT": "Delete Your Account",
+ "TITLE": "刪除您的帳戶",
+ "NOTE": "一旦刪除帳戶,您的所有資料將被永久刪除。",
+ "BUTTON_TEXT": "刪除您的帳戶",
"CONFIRM": {
- "TITLE": "Delete Account",
- "MESSAGE": "Deleting your Account is irreversible. Enter your account name below to confirm you want to permanently delete it.",
+ "TITLE": "刪除帳戶",
+ "MESSAGE": "刪除帳戶後將無法復原。請在下方輸入您的帳戶名稱以確認永久刪除。",
"BUTTON_TEXT": "刪除",
"DISMISS": "取消",
"PLACE_HOLDER": "請輸入 {accountName} 以確認"
},
- "SUCCESS": "Account marked for deletion",
- "FAILURE": "Could not delete account, try again!",
+ "SUCCESS": "帳戶已標記為待刪除",
+ "FAILURE": "無法刪除帳戶,請重試!",
"SCHEDULED_DELETION": {
- "TITLE": "Account Scheduled for Deletion",
- "MESSAGE_MANUAL": "This account is scheduled for deletion on {deletionDate}. This was requested by an administrator. You can cancel the deletion before this date.",
- "MESSAGE_INACTIVITY": "This account is scheduled for deletion on {deletionDate} due to account inactivity. You can cancel the deletion before this date.",
- "CLEAR_BUTTON": "Cancel Scheduled Deletion"
+ "TITLE": "帳戶已排定刪除",
+ "MESSAGE_MANUAL": "此帳戶已排定於 {deletionDate} 刪除。此操作由管理員發起,您可以在該日期之前取消刪除。",
+ "MESSAGE_INACTIVITY": "此帳戶因長期未使用,已排定於 {deletionDate} 刪除。您可以在該日期之前取消刪除。",
+ "CLEAR_BUTTON": "取消排定刪除"
}
},
"FORM": {
"ERROR": "請修正表單錯誤",
"GENERAL_SECTION": {
- "TITLE": "常規設定",
+ "TITLE": "一般設定",
"NOTE": ""
},
"ACCOUNT_ID": {
- "TITLE": "Account ID",
- "NOTE": "This ID is required if you are building an API based integration"
+ "TITLE": "帳戶 ID",
+ "NOTE": "如果您正在建立基於 API 的整合,將需要此 ID"
},
"AUTO_RESOLVE": {
- "TITLE": "Auto-resolve conversations",
- "NOTE": "This configuration would allow you to automatically resolve the conversation after a certain period of inactivity.",
+ "TITLE": "自動解決對話",
+ "NOTE": "此設定可讓您在一段時間無活動後自動解決對話。",
"DURATION": {
- "LABEL": "Inactivity duration",
- "HELP": "Time period of inactivity after which conversation is auto-resolved",
+ "LABEL": "無活動持續時間",
+ "HELP": "對話在無活動多久後自動解決",
"PLACEHOLDER": "30",
- "ERROR": "Auto resolve duration should be between 10 minutes and 999 days",
+ "ERROR": "自動解決時間應介於 10 分鐘至 999 天之間",
"API": {
- "SUCCESS": "Auto resolve settings updated successfully",
- "ERROR": "Failed to update auto resolve settings"
+ "SUCCESS": "已成功更新自動解決設定",
+ "ERROR": "無法更新自動解決設定"
}
},
"MESSAGE": {
- "LABEL": "Custom auto-resolution message",
- "PLACEHOLDER": "Conversation was marked resolved by system due to 15 days of inactivity",
- "HELP": "Message sent to the customer after conversation is auto-resolved"
+ "LABEL": "自訂自動解決訊息",
+ "PLACEHOLDER": "由於 15 天無活動,此對話已被系統標記為已解決",
+ "HELP": "對話自動解決後傳送給客戶的訊息"
},
- "PREFERENCES": "Preferences",
+ "PREFERENCES": "偏好設定",
"LABEL": {
- "LABEL": "Add label after auto-resolution",
- "PLACEHOLDER": "Select a label"
+ "LABEL": "自動解決後新增標籤",
+ "PLACEHOLDER": "選擇標籤"
},
"IGNORE_WAITING": {
- "LABEL": "Skip conversations waiting for agent’s reply"
+ "LABEL": "跳過等待客服回覆的對話"
},
- "UPDATE_BUTTON": "Save Changes"
+ "UPDATE_BUTTON": "儲存變更"
},
"NAME": {
"LABEL": "帳戶名稱",
@@ -78,13 +78,13 @@
"ERROR": "請輸入有效的帳戶名稱"
},
"LANGUAGE": {
- "LABEL": "Site language",
+ "LABEL": "網站語言",
"PLACEHOLDER": "您的帳戶名稱",
"ERROR": ""
},
"DOMAIN": {
- "LABEL": "接收電子信箱的域名",
- "PLACEHOLDER": "接收信箱的域名",
+ "LABEL": "接收電子郵件的網域",
+ "PLACEHOLDER": "用於接收郵件的網域",
"ERROR": ""
},
"SUPPORT_EMAIL": {
@@ -93,48 +93,48 @@
"ERROR": ""
},
"AUTO_RESOLVE_IGNORE_WAITING": {
- "LABEL": "Exclude unattended conversations",
- "HELP": "When enabled, the system will skip resolving conversations that are still waiting for an agent's reply."
+ "LABEL": "排除未回覆的對話",
+ "HELP": "啟用後,系統將跳過仍在等待客服回覆的對話,不會自動解決。"
},
"AUDIO_TRANSCRIPTION": {
- "TITLE": "Transcribe Audio Messages",
- "NOTE": "Automatically transcribe audio messages in conversations. Generate a text transcript whenever an audio message is sent or received, and display it alongside the message.",
+ "TITLE": "語音訊息轉文字",
+ "NOTE": "自動將對話中的語音訊息轉為文字。每當傳送或接收語音訊息時,系統會自動產生文字稿並顯示在訊息旁。",
"API": {
- "SUCCESS": "Audio transcription setting updated successfully",
- "ERROR": "Failed to update audio transcription setting"
+ "SUCCESS": "已成功更新語音轉文字設定",
+ "ERROR": "無法更新語音轉文字設定"
}
},
"AUTO_RESOLVE_DURATION": {
- "LABEL": "Inactivity duration for resolution",
- "HELP": "Duration after a conversation should auto resolve if there is no activity",
+ "LABEL": "無活動自動解決時間",
+ "HELP": "對話在無活動多久後應自動解決",
"PLACEHOLDER": "30",
- "ERROR": "Auto resolve duration should be between 10 minutes and 999 days",
+ "ERROR": "自動解決時間應介於 10 分鐘至 999 天之間",
"API": {
- "SUCCESS": "Auto resolve settings updated successfully",
- "ERROR": "Failed to update auto resolve settings"
+ "SUCCESS": "已成功更新自動解決設定",
+ "ERROR": "無法更新自動解決設定"
},
"UPDATE_BUTTON": "更新",
- "MESSAGE_LABEL": "Custom resolution message",
- "MESSAGE_PLACEHOLDER": "Conversation was marked resolved by system due to 15 days of inactivity",
- "MESSAGE_HELP": "This message is sent to the customer when a conversation is automatically resolved by the system due to inactivity."
+ "MESSAGE_LABEL": "自訂解決訊息",
+ "MESSAGE_PLACEHOLDER": "由於 15 天無活動,此對話已被系統標記為已解決",
+ "MESSAGE_HELP": "當對話因無活動而被系統自動解決時,此訊息將傳送給客戶。"
},
"FEATURES": {
- "INBOUND_EMAIL_ENABLED": "您的帳戶啟用了電子信箱與對話的持續性功能。",
- "CUSTOM_EMAIL_DOMAIN_ENABLED": "您現在可以在您的自定義域名的電子信箱中接收消息。"
+ "INBOUND_EMAIL_ENABLED": "您的帳戶已啟用電子郵件對話延續功能。",
+ "CUSTOM_EMAIL_DOMAIN_ENABLED": "您現在可以在自訂網域的信箱中接收郵件。"
}
},
- "UPDATE_CHATWOOT": "An update {latestChatwootVersion} for Chatwoot is available. Please update your instance.",
- "LEARN_MORE": "Learn more",
- "PAYMENT_PENDING": "Your payment is pending. Please update your payment information to continue using Chatwoot",
- "UPGRADE": "Upgrade to continue using Chatwoot",
- "LIMITS_UPGRADE": "Your account has exceeded the usage limits, please upgrade your plan to continue using Chatwoot",
- "OPEN_BILLING": "Open billing"
+ "UPDATE_CHATWOOT": "Chatwoot 有新版本 {latestChatwootVersion} 可供更新,請更新您的執行個體。",
+ "LEARN_MORE": "瞭解更多",
+ "PAYMENT_PENDING": "您的付款尚未完成,請更新付款資訊以繼續使用 Chatwoot",
+ "UPGRADE": "升級以繼續使用 Chatwoot",
+ "LIMITS_UPGRADE": "您的帳戶已超過使用量上限,請升級方案以繼續使用 Chatwoot",
+ "OPEN_BILLING": "開啟帳單"
},
"FORMS": {
"MULTISELECT": {
- "ENTER_TO_SELECT": "按下 enter 以選擇",
- "ENTER_TO_REMOVE": "按下 enter 以移除",
- "NO_OPTIONS": "List is empty",
+ "ENTER_TO_SELECT": "按下 Enter 以選擇",
+ "ENTER_TO_REMOVE": "按下 Enter 以移除",
+ "NO_OPTIONS": "清單為空",
"SELECT_ONE": "選擇其中一項",
"SELECT": "選擇"
}
@@ -142,108 +142,108 @@
"NOTIFICATIONS_PAGE": {
"HEADER": "通知",
"MARK_ALL_DONE": "全部標記完成",
- "DELETE_TITLE": "刪除",
+ "DELETE_TITLE": "已刪除",
"UNREAD_NOTIFICATION": {
"TITLE": "未讀通知",
"ALL_NOTIFICATIONS": "查看所有通知",
- "LOADING_UNREAD_MESSAGE": "正在讀取未讀通知",
- "EMPTY_MESSAGE": "你沒有未讀取的通知"
+ "LOADING_UNREAD_MESSAGE": "正在載入未讀通知...",
+ "EMPTY_MESSAGE": "您沒有未讀通知"
},
"LIST": {
- "LOADING_MESSAGE": "載入更多通知...",
+ "LOADING_MESSAGE": "正在載入通知...",
"404": "沒有通知",
"TABLE_HEADER": [
"姓名",
- "聯絡人電話",
+ "電話號碼",
"對話",
"最後聯絡"
]
},
"TYPE_LABEL": {
"conversation_creation": "新對話",
- "conversation_assignment": "對話已被指派",
+ "conversation_assignment": "對話已指派",
"assigned_conversation_new_message": "新訊息",
"participating_conversation_new_message": "新訊息",
"conversation_mention": "被提及",
- "sla_missed_first_response": "SLA Missed",
- "sla_missed_next_response": "SLA Missed",
- "sla_missed_resolution": "SLA Missed"
+ "sla_missed_first_response": "SLA 未達標",
+ "sla_missed_next_response": "SLA 未達標",
+ "sla_missed_resolution": "SLA 未達標"
}
},
"NETWORK": {
"NOTIFICATION": {
"OFFLINE": "離線",
- "RECONNECTING": "重新連線...",
- "RECONNECT_SUCCESS": "連線恢復"
+ "RECONNECTING": "重新連線中...",
+ "RECONNECT_SUCCESS": "已重新連線"
},
"BUTTON": {
"REFRESH": "重新整理"
}
},
"COMMAND_BAR": {
- "SEARCH_PLACEHOLDER": "Search or jump to",
- "SNOOZE_PLACEHOLDER": "Type a time e.g. tomorrow, 2 hours, next friday, jan 15...",
+ "SEARCH_PLACEHOLDER": "搜尋或快速跳轉",
+ "SNOOZE_PLACEHOLDER": "輸入時間,例如:明天、2 小時後、下週五、1月15日...",
"SECTIONS": {
- "GENERAL": "General",
+ "GENERAL": "一般",
"REPORTS": "報表",
"CONVERSATION": "對話",
- "BULK_ACTIONS": "Bulk Actions",
- "CHANGE_ASSIGNEE": "Change Assignee",
- "CHANGE_PRIORITY": "Change Priority",
- "CHANGE_TEAM": "Change Team",
- "SNOOZE_CONVERSATION": "Snooze Conversation",
- "ADD_LABEL": "Add label to the conversation",
- "REMOVE_LABEL": "Remove label from the conversation",
+ "BULK_ACTIONS": "批次操作",
+ "CHANGE_ASSIGNEE": "變更負責人",
+ "CHANGE_PRIORITY": "變更優先順序",
+ "CHANGE_TEAM": "變更團隊",
+ "SNOOZE_CONVERSATION": "延後對話",
+ "ADD_LABEL": "為對話新增標籤",
+ "REMOVE_LABEL": "從對話移除標籤",
"SETTINGS": "設定",
- "AI_ASSIST": "AI Assist",
- "APPEARANCE": "Appearance",
- "SNOOZE_NOTIFICATION": "Snooze Notification"
+ "AI_ASSIST": "AI 助手",
+ "APPEARANCE": "外觀",
+ "SNOOZE_NOTIFICATION": "延後通知"
},
"COMMANDS": {
- "GO_TO_CONVERSATION_DASHBOARD": "Go to Conversation Dashboard",
- "GO_TO_CONTACTS_DASHBOARD": "Go to Contacts Dashboard",
- "GO_TO_REPORTS_OVERVIEW": "Go to Reports Overview",
- "GO_TO_CONVERSATION_REPORTS": "Go to Conversation Reports",
- "GO_TO_AGENT_REPORTS": "Go to Agent Reports",
- "GO_TO_LABEL_REPORTS": "Go to Label Reports",
- "GO_TO_INBOX_REPORTS": "Go to Inbox Reports",
- "GO_TO_TEAM_REPORTS": "Go to Team Reports",
- "GO_TO_SETTINGS_AGENTS": "Go to Agent Settings",
- "GO_TO_SETTINGS_TEAMS": "Go to Team Settings",
- "GO_TO_SETTINGS_INBOXES": "Go to Inbox Settings",
- "GO_TO_SETTINGS_LABELS": "Go to Label Settings",
- "GO_TO_SETTINGS_CANNED_RESPONSES": "Go to Canned Response Settings",
- "GO_TO_SETTINGS_APPLICATIONS": "Go to Application Settings",
- "GO_TO_SETTINGS_ACCOUNT": "Go to Account Settings",
- "GO_TO_SETTINGS_PROFILE": "Go to Profile Settings",
- "GO_TO_NOTIFICATIONS": "Go to Notifications",
- "ADD_LABELS_TO_CONVERSATION": "Add label to the conversation",
- "ASSIGN_AN_AGENT": "指派客服",
- "AI_ASSIST": "AI Assist",
- "ASSIGN_PRIORITY": "Assign priority",
+ "GO_TO_CONVERSATION_DASHBOARD": "前往對話儀表板",
+ "GO_TO_CONTACTS_DASHBOARD": "前往聯絡人儀表板",
+ "GO_TO_REPORTS_OVERVIEW": "前往報表總覽",
+ "GO_TO_CONVERSATION_REPORTS": "前往對話報表",
+ "GO_TO_AGENT_REPORTS": "前往客服人員報表",
+ "GO_TO_LABEL_REPORTS": "前往標籤報表",
+ "GO_TO_INBOX_REPORTS": "前往收件匣報表",
+ "GO_TO_TEAM_REPORTS": "前往團隊報表",
+ "GO_TO_SETTINGS_AGENTS": "前往客服人員設定",
+ "GO_TO_SETTINGS_TEAMS": "前往團隊設定",
+ "GO_TO_SETTINGS_INBOXES": "前往收件匣設定",
+ "GO_TO_SETTINGS_LABELS": "前往標籤設定",
+ "GO_TO_SETTINGS_CANNED_RESPONSES": "前往預設回覆設定",
+ "GO_TO_SETTINGS_APPLICATIONS": "前往應用程式設定",
+ "GO_TO_SETTINGS_ACCOUNT": "前往帳戶設定",
+ "GO_TO_SETTINGS_PROFILE": "前往個人資料設定",
+ "GO_TO_NOTIFICATIONS": "前往通知",
+ "ADD_LABELS_TO_CONVERSATION": "為對話新增標籤",
+ "ASSIGN_AN_AGENT": "指派客服人員",
+ "AI_ASSIST": "AI 助手",
+ "ASSIGN_PRIORITY": "指派優先順序",
"ASSIGN_A_TEAM": "指派團隊",
"MUTE_CONVERSATION": "將對話靜音",
- "UNMUTE_CONVERSATION": "將對話解除靜音",
- "REMOVE_LABEL_FROM_CONVERSATION": "Remove label from the conversation",
+ "UNMUTE_CONVERSATION": "取消對話靜音",
+ "REMOVE_LABEL_FROM_CONVERSATION": "從對話移除標籤",
"REOPEN_CONVERSATION": "重新開啟對話",
"RESOLVE_CONVERSATION": "解決對話",
- "SEND_TRANSCRIPT": "Send an email transcript",
- "SNOOZE_CONVERSATION": "Snooze Conversation",
- "UNTIL_NEXT_REPLY": "Until next reply",
- "UNTIL_NEXT_WEEK": "Until next week",
- "UNTIL_TOMORROW": "Until tomorrow",
- "UNTIL_NEXT_MONTH": "Until next month",
- "AN_HOUR_FROM_NOW": "Until an hour from now",
- "UNTIL_CUSTOM_TIME": "Custom...",
- "CHANGE_APPEARANCE": "Change Appearance",
- "LIGHT_MODE": "Light",
- "DARK_MODE": "Dark",
- "SYSTEM_MODE": "System",
- "SNOOZE_NOTIFICATION": "Snooze Notification"
+ "SEND_TRANSCRIPT": "傳送對話記錄電子郵件",
+ "SNOOZE_CONVERSATION": "延後對話",
+ "UNTIL_NEXT_REPLY": "直到下次回覆",
+ "UNTIL_NEXT_WEEK": "直到下週",
+ "UNTIL_TOMORROW": "直到明天",
+ "UNTIL_NEXT_MONTH": "直到下個月",
+ "AN_HOUR_FROM_NOW": "一小時後",
+ "UNTIL_CUSTOM_TIME": "自訂時間...",
+ "CHANGE_APPEARANCE": "變更外觀",
+ "LIGHT_MODE": "淺色",
+ "DARK_MODE": "深色",
+ "SYSTEM_MODE": "跟隨系統",
+ "SNOOZE_NOTIFICATION": "延後通知"
}
},
"DASHBOARD_APPS": {
- "LOADING_MESSAGE": "Loading Dashboard App..."
+ "LOADING_MESSAGE": "正在載入儀表板應用程式..."
},
"COMMON": {
"OR": "或",
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/helpCenter.json b/app/javascript/dashboard/i18n/locale/zh_TW/helpCenter.json
index 9beb84c08..b462339b2 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/helpCenter.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/helpCenter.json
@@ -2,146 +2,146 @@
"HELP_CENTER": {
"TITLE": "幫助中心",
"NEW_PAGE": {
- "DESCRIPTION": "為您的客戶建立自助服務幫助中心門戶。幫助他們快速找到答案,無需等待。簡化查詢,提高代理效率,提升客戶支援。",
- "CREATE_PORTAL_BUTTON": "建立門戶"
+ "DESCRIPTION": "為您的客戶建立自助服務幫助中心入口。幫助他們快速找到答案,無需等待。簡化查詢流程、提升客服效率並改善客戶支援品質。",
+ "CREATE_PORTAL_BUTTON": "建立入口"
},
"HEADER": {
- "FILTER": "過濾條件",
+ "FILTER": "篩選條件",
"SORT": "排序方式",
- "LOCALE": "語言環境",
+ "LOCALE": "語系",
"SETTINGS_BUTTON": "設定",
- "NEW_BUTTON": "新建文章",
+ "NEW_BUTTON": "新增文章",
"DROPDOWN_OPTIONS": {
- "PUBLISHED": "已釋出",
+ "PUBLISHED": "已發佈",
"DRAFT": "草稿",
- "ARCHIVED": "已存檔"
+ "ARCHIVED": "已封存"
},
"TITLES": {
"ALL_ARTICLES": "所有文章",
"MINE": "我的文章",
- "DRAFT": "文章草稿",
- "ARCHIVED": "已存檔的文章"
+ "DRAFT": "草稿文章",
+ "ARCHIVED": "已封存的文章"
},
"LOCALE_SELECT": {
- "TITLE": "選擇語言環境",
- "PLACEHOLDER": "選擇語言環境",
- "NO_RESULT": "未找到語言環境",
- "SEARCH_PLACEHOLDER": "搜尋語言環境"
+ "TITLE": "選擇語系",
+ "PLACEHOLDER": "選擇語系",
+ "NO_RESULT": "找不到語系",
+ "SEARCH_PLACEHOLDER": "搜尋語系"
}
},
"EDIT_HEADER": {
"ALL_ARTICLES": "所有文章",
- "PUBLISH_BUTTON": "釋出",
- "MOVE_TO_ARCHIVE_BUTTON": "移至已存檔",
+ "PUBLISH_BUTTON": "發佈",
+ "MOVE_TO_ARCHIVE_BUTTON": "移至封存",
"PREVIEW": "預覽",
"ADD_TRANSLATION": "新增翻譯",
"OPEN_SIDEBAR": "開啟側邊欄",
"CLOSE_SIDEBAR": "關閉側邊欄",
"SAVING": "儲存中...",
- "SAVED": "儲存成功"
+ "SAVED": "已儲存"
},
"ARTICLE_EDITOR": {
"IMAGE_UPLOAD": {
- "TITLE": "上傳頭像",
- "UPLOADING": "上傳中",
+ "TITLE": "上傳圖片",
+ "UPLOADING": "上傳中...",
"SUCCESS": "圖片上傳成功",
- "ERROR": "上傳圖片時出錯",
- "UN_AUTHORIZED_ERROR": "您無權上傳圖片",
- "ERROR_FILE_SIZE": "圖片大小應小於 {size}MB",
- "ERROR_FILE_FORMAT": "圖片格式應為 jpg、jpeg 或 png",
- "ERROR_FILE_DIMENSIONS": "圖片尺寸應小於 2000 x 2000"
+ "ERROR": "上傳圖片時發生錯誤",
+ "UN_AUTHORIZED_ERROR": "您沒有上傳圖片的權限",
+ "ERROR_FILE_SIZE": "圖片大小不能超過 {size}MB",
+ "ERROR_FILE_FORMAT": "圖片格式須為 jpg、jpeg 或 png",
+ "ERROR_FILE_DIMENSIONS": "圖片尺寸不能超過 2000 x 2000"
}
},
"ARTICLE_SETTINGS": {
"TITLE": "文章設定",
"FORM": {
"CATEGORY": {
- "LABEL": "類別",
- "TITLE": "選擇類別",
- "PLACEHOLDER": "選擇類別",
- "NO_RESULT": "未找到類別",
- "SEARCH_PLACEHOLDER": "搜尋類別"
+ "LABEL": "分類",
+ "TITLE": "選擇分類",
+ "PLACEHOLDER": "選擇分類",
+ "NO_RESULT": "找不到分類",
+ "SEARCH_PLACEHOLDER": "搜尋分類"
},
"AUTHOR": {
"LABEL": "作者",
"TITLE": "選擇作者",
"PLACEHOLDER": "選擇作者",
- "NO_RESULT": "未找到作者",
+ "NO_RESULT": "找不到作者",
"SEARCH_PLACEHOLDER": "搜尋作者"
},
"META_TITLE": {
"LABEL": "Meta 標題",
- "PLACEHOLDER": "增加一個Meta標題"
+ "PLACEHOLDER": "新增 Meta 標題"
},
"META_DESCRIPTION": {
- "LABEL": "Meta描述",
- "PLACEHOLDER": "新增您的Meta描述以獲得更好的SEO效果……"
+ "LABEL": "Meta 描述",
+ "PLACEHOLDER": "新增 Meta 描述以獲得更好的 SEO 效果..."
},
"META_TAGS": {
- "LABEL": "Meta標籤",
- "PLACEHOLDER": "增加Meta標籤,以逗號分隔"
+ "LABEL": "Meta 標籤",
+ "PLACEHOLDER": "新增 Meta 標籤,以逗號分隔..."
}
},
"BUTTONS": {
- "ARCHIVE": "歸檔文章",
+ "ARCHIVE": "封存文章",
"DELETE": "刪除文章"
}
},
"ARTICLE_SEARCH_RESULT": {
"UNCATEGORIZED": "未分類",
- "SEARCH_RESULTS": "搜尋 {query} 的結果",
+ "SEARCH_RESULTS": "「{query}」的搜尋結果",
"EMPTY_TEXT": "搜尋文章以插入回覆。",
"SEARCH_LOADER": "搜尋中...",
"INSERT_ARTICLE": "插入",
- "NO_RESULT": "未找到文章",
+ "NO_RESULT": "找不到文章",
"COPY_LINK": "複製文章連結到剪貼簿",
- "OPEN_LINK": "在新標籤頁中開啟文章",
+ "OPEN_LINK": "在新分頁中開啟文章",
"PREVIEW_LINK": "預覽文章"
},
"PORTAL": {
- "HEADER": "入口網站",
+ "HEADER": "入口",
"DEFAULT": "預設",
- "NEW_BUTTON": "新入口網站",
- "ACTIVE_BADGE": "活躍",
- "CHOOSE_LOCALE_LABEL": "選擇一個語言環境",
- "LOADING_MESSAGE": "正在載入門戶...",
+ "NEW_BUTTON": "新增入口",
+ "ACTIVE_BADGE": "啟用中",
+ "CHOOSE_LOCALE_LABEL": "選擇語系",
+ "LOADING_MESSAGE": "正在載入入口...",
"ARTICLES_LABEL": "文章",
- "NO_PORTALS_MESSAGE": "沒有可用的門戶",
- "ADD_NEW_LOCALE": "新增一個新的語言環境",
+ "NO_PORTALS_MESSAGE": "沒有可用的入口",
+ "ADD_NEW_LOCALE": "新增語系",
"POPOVER": {
- "TITLE": "入口網站",
- "PORTAL_SETTINGS": "門戶設定",
- "SUBTITLE": "您有多個入口網站,每個入口網站可以有不同的語言環境。",
+ "TITLE": "入口",
+ "PORTAL_SETTINGS": "入口設定",
+ "SUBTITLE": "您有多個入口,每個入口可以有不同的語系。",
"CANCEL_BUTTON_LABEL": "取消",
- "CHOOSE_LOCALE_BUTTON": "選擇語言"
+ "CHOOSE_LOCALE_BUTTON": "選擇語系"
},
"PORTAL_SETTINGS": {
"LIST_ITEM": {
"HEADER": {
"COUNT_LABEL": "文章",
- "ADD": "新增語言環境",
- "VISIT": "訪問網站",
+ "ADD": "新增語系",
+ "VISIT": "造訪網站",
"SETTINGS": "設定",
"DELETE": "刪除"
},
"PORTAL_CONFIG": {
- "TITLE": "門戶配置",
+ "TITLE": "入口設定",
"ITEMS": {
- "NAME": "姓名",
- "DOMAIN": "自定義域名",
- "SLUG": "網址代稱",
- "TITLE": "門戶標題",
- "THEME": "主題顏色",
- "SUB_TEXT": "門戶副文字"
+ "NAME": "名稱",
+ "DOMAIN": "自訂網域",
+ "SLUG": "網址代碼",
+ "TITLE": "入口標題",
+ "THEME": "主題色彩",
+ "SUB_TEXT": "入口副標文字"
}
},
"AVAILABLE_LOCALES": {
- "TITLE": "可用的語言環境",
+ "TITLE": "可用語系",
"TABLE": {
- "NAME": "語言環境名稱",
- "CODE": "語言環境程式碼",
+ "NAME": "語系名稱",
+ "CODE": "語系代碼",
"ARTICLE_COUNT": "文章數量",
- "CATEGORIES": "類別數量",
+ "CATEGORIES": "分類數量",
"SWAP": "交換",
"DELETE": "刪除",
"DEFAULT_LOCALE": "預設"
@@ -149,51 +149,51 @@
}
},
"DELETE_PORTAL": {
- "TITLE": "刪除門戶",
- "MESSAGE": "您確定要刪除此門戶嗎",
- "YES": "是,刪除門戶",
- "NO": "否,保留門戶",
+ "TITLE": "刪除入口",
+ "MESSAGE": "您確定要刪除此入口嗎?",
+ "YES": "是,刪除入口",
+ "NO": "不,保留入口",
"API": {
- "DELETE_SUCCESS": "門戶刪除成功",
- "DELETE_ERROR": "刪除門戶時出錯"
+ "DELETE_SUCCESS": "入口刪除成功",
+ "DELETE_ERROR": "刪除入口時發生錯誤"
}
},
"SEND_CNAME_INSTRUCTIONS": {
"API": {
- "SUCCESS_MESSAGE": "CNAME 指令發送成功",
- "ERROR_MESSAGE": "發送 CNAME 指令時發生錯誤"
+ "SUCCESS_MESSAGE": "CNAME 設定說明傳送成功",
+ "ERROR_MESSAGE": "傳送 CNAME 設定說明時發生錯誤"
}
}
},
"EDIT": {
- "HEADER_TEXT": "編輯門戶",
+ "HEADER_TEXT": "編輯入口",
"TABS": {
"BASIC_SETTINGS": {
"TITLE": "基本資訊"
},
"CUSTOMIZATION_SETTINGS": {
- "TITLE": "門戶定製"
+ "TITLE": "入口自訂"
},
"CATEGORY_SETTINGS": {
- "TITLE": "類別"
+ "TITLE": "分類"
},
"LOCALE_SETTINGS": {
- "TITLE": "語言環境"
+ "TITLE": "語系"
}
},
"CATEGORIES": {
- "TITLE": "類別",
- "NEW_CATEGORY": "新建類別",
+ "TITLE": "分類",
+ "NEW_CATEGORY": "新增分類",
"TABLE": {
- "NAME": "姓名",
- "DESCRIPTION": "描述資訊",
- "LOCALE": "語言環境",
+ "NAME": "名稱",
+ "DESCRIPTION": "描述",
+ "LOCALE": "語系",
"ARTICLE_COUNT": "文章數量",
"ACTION_BUTTON": {
- "EDIT": "編輯類別",
- "DELETE": "刪除類別"
+ "EDIT": "編輯分類",
+ "DELETE": "刪除分類"
},
- "EMPTY_TEXT": "未找到類別"
+ "EMPTY_TEXT": "找不到分類"
}
},
"EDIT_BASIC_INFO": {
@@ -204,140 +204,140 @@
"CREATE_FLOW": {
"BASIC": {
"TITLE": "幫助中心資訊",
- "BODY": "關於門戶的基本資訊"
+ "BODY": "關於入口的基本資訊"
},
"CUSTOMIZATION": {
- "TITLE": "幫助中心定製",
- "BODY": "定製門戶"
+ "TITLE": "幫助中心自訂",
+ "BODY": "自訂入口"
},
"FINISH": {
"TITLE": "完成!🎉",
- "BODY": "您已全部設定完成!"
+ "BODY": "一切準備就緒!"
}
},
"CREATE_FLOW_PAGE": {
"BACK_BUTTON": "返回",
"BASIC_SETTINGS_PAGE": {
- "HEADER": "建立門戶",
+ "HEADER": "建立入口",
"TITLE": "幫助中心資訊",
- "CREATE_BASIC_SETTING_BUTTON": "建立門戶基本設定"
+ "CREATE_BASIC_SETTING_BUTTON": "建立入口基本設定"
},
"CUSTOMIZATION_PAGE": {
- "HEADER": "門戶定製",
- "TITLE": "幫助中心定製",
- "UPDATE_PORTAL_BUTTON": "更新門戶設定"
+ "HEADER": "入口自訂",
+ "TITLE": "幫助中心自訂",
+ "UPDATE_PORTAL_BUTTON": "更新入口設定"
},
"FINISH_PAGE": {
- "TITLE": "完成!🎉 您已全部設定完成!",
- "MESSAGE": "您現在可以在所有門戶頁面中看到此建立的門戶。",
- "FINISH": "轉到所有門戶頁面"
+ "TITLE": "完成!🎉 一切準備就緒!",
+ "MESSAGE": "您現在可以在所有入口頁面中看到此入口。",
+ "FINISH": "前往所有入口頁面"
}
},
"LOGO": {
- "LABEL": "標識",
- "UPLOAD_BUTTON": "上傳Logo",
- "HELP_TEXT": "此Logo將顯示在門戶標題中。",
- "IMAGE_UPLOAD_SUCCESS": "Logo上傳成功",
- "IMAGE_UPLOAD_ERROR": "Logo刪除成功",
- "IMAGE_DELETE_ERROR": "刪除Logo時出錯"
+ "LABEL": "Logo",
+ "UPLOAD_BUTTON": "上傳 Logo",
+ "HELP_TEXT": "此 Logo 將顯示在入口標頭中。",
+ "IMAGE_UPLOAD_SUCCESS": "Logo 上傳成功",
+ "IMAGE_UPLOAD_ERROR": "Logo 刪除成功",
+ "IMAGE_DELETE_ERROR": "刪除 Logo 時發生錯誤"
},
"NAME": {
- "LABEL": "姓名",
- "PLACEHOLDER": "門戶名稱",
- "HELP_TEXT": "該名稱將用於面向公眾的門戶內部。",
+ "LABEL": "名稱",
+ "PLACEHOLDER": "入口名稱",
+ "HELP_TEXT": "此名稱將用於對外公開的入口內部。",
"ERROR": "名稱為必填"
},
"SLUG": {
- "LABEL": "網址代稱",
- "PLACEHOLDER": "門戶的URL Slug",
- "ERROR": "Slug 為必填項"
+ "LABEL": "網址代碼",
+ "PLACEHOLDER": "入口的網址代碼",
+ "ERROR": "網址代碼為必填"
},
"DOMAIN": {
- "LABEL": "自定義域名",
- "PLACEHOLDER": "門戶自定義域名",
- "HELP_TEXT": "只有在您想為入口網站使用自訂網域時才需新增。例如:{exampleURL}",
- "ERROR": "請輸入有效的域名URL"
+ "LABEL": "自訂網域",
+ "PLACEHOLDER": "入口自訂網域",
+ "HELP_TEXT": "僅在您想為入口使用自訂網域時才需新增。例如:{exampleURL}",
+ "ERROR": "請輸入有效的網域 URL"
},
"HOME_PAGE_LINK": {
- "LABEL": "主頁連結",
- "PLACEHOLDER": "門戶主頁連結",
- "HELP_TEXT": "此連結用於從入口網站返回首頁。例如:{exampleURL}",
- "ERROR": "請輸入有效的主頁URL"
+ "LABEL": "首頁連結",
+ "PLACEHOLDER": "入口首頁連結",
+ "HELP_TEXT": "此連結用於從入口返回首頁。例如:{exampleURL}",
+ "ERROR": "請輸入有效的首頁 URL"
},
"THEME_COLOR": {
- "LABEL": "門戶主題顏色",
- "HELP_TEXT": "此顏色將作為門戶的主題顏色顯示。"
+ "LABEL": "入口主題色彩",
+ "HELP_TEXT": "此色彩將作為入口的主題色彩顯示。"
},
"PAGE_TITLE": {
"LABEL": "頁面標題",
- "PLACEHOLDER": "門戶頁面標題",
- "HELP_TEXT": "頁面標題將用於面向公眾的門戶。",
- "ERROR": "頁面標題是必填項"
+ "PLACEHOLDER": "入口頁面標題",
+ "HELP_TEXT": "頁面標題將用於對外公開的入口。",
+ "ERROR": "頁面標題為必填"
},
"HEADER_TEXT": {
- "LABEL": "標題文字",
- "PLACEHOLDER": "門戶標題文字",
- "HELP_TEXT": "門戶標題文字將用於面向公眾的門戶。",
- "ERROR": "門戶標題文字是必填項"
+ "LABEL": "標頭文字",
+ "PLACEHOLDER": "入口標頭文字",
+ "HELP_TEXT": "入口標頭文字將用於對外公開的入口。",
+ "ERROR": "入口標頭文字為必填"
},
"API": {
- "SUCCESS_MESSAGE_FOR_BASIC": "門戶建立成功。",
- "ERROR_MESSAGE_FOR_BASIC": "無法建立門戶,請重試。",
- "SUCCESS_MESSAGE_FOR_UPDATE": "門戶更新成功。",
- "ERROR_MESSAGE_FOR_UPDATE": "無法更新門戶,請重試。"
+ "SUCCESS_MESSAGE_FOR_BASIC": "入口建立成功。",
+ "ERROR_MESSAGE_FOR_BASIC": "無法建立入口,請再試一次。",
+ "SUCCESS_MESSAGE_FOR_UPDATE": "入口更新成功。",
+ "ERROR_MESSAGE_FOR_UPDATE": "無法更新入口,請再試一次。"
}
},
"ADD_LOCALE": {
- "TITLE": "新增一個新的語言環境",
- "SUB_TITLE": "這將向您的可用翻譯列表中新增一個新的語言環境。",
- "PORTAL": "入口網站",
+ "TITLE": "新增語系",
+ "SUB_TITLE": "這將在您的可用翻譯清單中新增一個語系。",
+ "PORTAL": "入口",
"LOCALE": {
- "LABEL": "語言環境",
- "PLACEHOLDER": "選擇一個語言環境",
- "ERROR": "語言環境是必填項"
+ "LABEL": "語系",
+ "PLACEHOLDER": "選擇語系",
+ "ERROR": "語系為必填"
},
"BUTTONS": {
- "CREATE": "建立語言環境",
+ "CREATE": "建立語系",
"CANCEL": "取消"
},
"API": {
- "SUCCESS_MESSAGE": "語言環境新增成功",
- "ERROR_MESSAGE": "無法新增語言環境,請重試。"
+ "SUCCESS_MESSAGE": "語系新增成功",
+ "ERROR_MESSAGE": "無法新增語系,請再試一次。"
}
},
"CHANGE_DEFAULT_LOCALE": {
"API": {
- "SUCCESS_MESSAGE": "預設語言環境更新成功",
- "ERROR_MESSAGE": "無法更新預設語言環境,請重試。"
+ "SUCCESS_MESSAGE": "預設語系更新成功",
+ "ERROR_MESSAGE": "無法更新預設語系,請再試一次。"
}
},
"DELETE_LOCALE": {
"API": {
- "SUCCESS_MESSAGE": "語言環境從門戶中移除成功",
- "ERROR_MESSAGE": "無法從門戶中移除語言環境,請重試。"
+ "SUCCESS_MESSAGE": "語系已從入口中移除",
+ "ERROR_MESSAGE": "無法從入口中移除語系,請再試一次。"
}
},
"DRAFT_LOCALE": {
"API": {
- "SUCCESS_MESSAGE": "Locale moved to draft successfully",
- "ERROR_MESSAGE": "Unable to move locale to draft. Try again."
+ "SUCCESS_MESSAGE": "語系已成功移至草稿",
+ "ERROR_MESSAGE": "無法將語系移至草稿,請再試一次。"
}
},
"PUBLISH_LOCALE": {
"API": {
- "SUCCESS_MESSAGE": "Locale published successfully",
- "ERROR_MESSAGE": "Unable to publish locale. Try again."
+ "SUCCESS_MESSAGE": "語系發佈成功",
+ "ERROR_MESSAGE": "無法發佈語系,請再試一次。"
}
}
},
"TABLE": {
"LOADING_MESSAGE": "正在載入文章...",
- "404": "沒有找到您要搜尋的文章 🔍",
+ "404": "找不到符合搜尋條件的文章 🔍",
"NO_ARTICLES": "沒有可用的文章",
"HEADERS": {
"TITLE": "標題",
- "CATEGORY": "類別",
- "READ_COUNT": "瀏覽量",
+ "CATEGORY": "分類",
+ "READ_COUNT": "瀏覽次數",
"STATUS": "狀態",
"LAST_EDITED": "最後編輯"
},
@@ -348,56 +348,56 @@
},
"EDIT_ARTICLE": {
"LOADING": "正在載入文章...",
- "TITLE_PLACEHOLDER": "文章標題在此處顯示",
- "CONTENT_PLACEHOLDER": "在此處寫下您的文章",
+ "TITLE_PLACEHOLDER": "在此輸入文章標題",
+ "CONTENT_PLACEHOLDER": "在此撰寫您的文章",
"API": {
- "ERROR": "儲存文章時出錯"
+ "ERROR": "儲存文章時發生錯誤"
}
},
"PUBLISH_ARTICLE": {
"API": {
- "ERROR": "釋出文章時出錯",
- "SUCCESS": "文章釋出成功"
+ "ERROR": "發佈文章時發生錯誤",
+ "SUCCESS": "文章發佈成功"
}
},
"ARCHIVE_ARTICLE": {
"API": {
- "ERROR": "歸檔文章時出錯",
- "SUCCESS": "文章歸檔成功"
+ "ERROR": "封存文章時發生錯誤",
+ "SUCCESS": "文章封存成功"
}
},
"DRAFT_ARTICLE": {
"API": {
- "ERROR": "草稿文章時出錯",
- "SUCCESS": "文章草稿成功"
+ "ERROR": "將文章移至草稿時發生錯誤",
+ "SUCCESS": "文章已成功移至草稿"
}
},
"DELETE_ARTICLE": {
"MODAL": {
"CONFIRM": {
"TITLE": "確認刪除",
- "MESSAGE": "您確定要刪除這篇文章嗎?",
+ "MESSAGE": "您確定要刪除此文章嗎?",
"YES": "是,刪除",
- "NO": "否,保留它"
+ "NO": "不,保留"
}
},
"API": {
"SUCCESS_MESSAGE": "文章刪除成功",
- "ERROR_MESSAGE": "刪除文章時出錯"
+ "ERROR_MESSAGE": "刪除文章時發生錯誤"
}
},
"REORDER_ARTICLE": {
"API": {
- "ERROR_MESSAGE": "Unable to reorder articles. Please try again."
+ "ERROR_MESSAGE": "無法重新排序文章,請再試一次。"
}
},
"REORDER_CATEGORY": {
"API": {
- "ERROR_MESSAGE": "Unable to reorder categories. Please try again."
+ "ERROR_MESSAGE": "無法重新排序分類,請再試一次。"
}
},
"CREATE_ARTICLE": {
- "ERROR_MESSAGE": "請新增文章標題和內容,然後才能更新設定"
+ "ERROR_MESSAGE": "請先新增文章標題和內容,才能更新設定"
},
"SIDEBAR": {
"SEARCH": {
@@ -406,113 +406,113 @@
},
"CATEGORY": {
"ADD": {
- "TITLE": "建立一個類別",
- "SUB_TITLE": "類別將用於公共門戶來對文章進行歸類。",
- "PORTAL": "入口網站",
- "LOCALE": "語言環境",
+ "TITLE": "建立分類",
+ "SUB_TITLE": "分類將用於公開入口中對文章進行歸類。",
+ "PORTAL": "入口",
+ "LOCALE": "語系",
"NAME": {
- "LABEL": "姓名",
- "PLACEHOLDER": "類別名稱",
- "HELP_TEXT": "類別名稱和圖示將用於面向公眾的門戶以對文章進行分類。",
+ "LABEL": "名稱",
+ "PLACEHOLDER": "分類名稱",
+ "HELP_TEXT": "分類名稱和圖示將用於對外公開的入口中對文章進行分類。",
"ERROR": "名稱為必填"
},
"SLUG": {
- "LABEL": "網址代稱",
- "PLACEHOLDER": "類別的URL Slug",
+ "LABEL": "網址代碼",
+ "PLACEHOLDER": "分類的網址代碼",
"HELP_TEXT": "app.chatwoot.com/hc/my-portal/en-US/categories/my-slug",
- "ERROR": "Slug 為必填項"
+ "ERROR": "網址代碼為必填"
},
"DESCRIPTION": {
- "LABEL": "描述資訊",
- "PLACEHOLDER": "給出有關該類別的簡短描述。",
+ "LABEL": "描述",
+ "PLACEHOLDER": "請簡短描述此分類。",
"ERROR": "描述為必填"
},
"BUTTONS": {
- "CREATE": "建立類別",
+ "CREATE": "建立分類",
"CANCEL": "取消"
},
"API": {
- "SUCCESS_MESSAGE": "類別建立成功",
- "ERROR_MESSAGE": "無法建立類別"
+ "SUCCESS_MESSAGE": "分類建立成功",
+ "ERROR_MESSAGE": "無法建立分類"
}
},
"EDIT": {
- "TITLE": "編輯類別",
- "SUB_TITLE": "編輯類別將更新面向公眾的門戶中的類別。",
- "PORTAL": "入口網站",
- "LOCALE": "語言環境",
+ "TITLE": "編輯分類",
+ "SUB_TITLE": "編輯分類將更新對外公開入口中的分類。",
+ "PORTAL": "入口",
+ "LOCALE": "語系",
"NAME": {
- "LABEL": "姓名",
- "PLACEHOLDER": "類別名稱",
- "HELP_TEXT": "類別名稱和圖示將用於面向公眾的門戶以對文章進行分類。",
+ "LABEL": "名稱",
+ "PLACEHOLDER": "分類名稱",
+ "HELP_TEXT": "分類名稱和圖示將用於對外公開的入口中對文章進行分類。",
"ERROR": "名稱為必填"
},
"SLUG": {
- "LABEL": "網址代稱",
- "PLACEHOLDER": "類別的URL Slug",
+ "LABEL": "網址代碼",
+ "PLACEHOLDER": "分類的網址代碼",
"HELP_TEXT": "app.chatwoot.com/hc/my-portal/en-US/categories/my-slug",
- "ERROR": "Slug 為必填項"
+ "ERROR": "網址代碼為必填"
},
"DESCRIPTION": {
- "LABEL": "描述資訊",
- "PLACEHOLDER": "給出有關該類別的簡短描述。",
+ "LABEL": "描述",
+ "PLACEHOLDER": "請簡短描述此分類。",
"ERROR": "描述為必填"
},
"BUTTONS": {
- "CREATE": "更新類別",
+ "CREATE": "更新分類",
"CANCEL": "取消"
},
"API": {
- "SUCCESS_MESSAGE": "類別更新成功",
- "ERROR_MESSAGE": "無法更新類別"
+ "SUCCESS_MESSAGE": "分類更新成功",
+ "ERROR_MESSAGE": "無法更新分類"
}
},
"DELETE": {
"API": {
- "SUCCESS_MESSAGE": "類別刪除成功",
- "ERROR_MESSAGE": "無法刪除類別"
+ "SUCCESS_MESSAGE": "分類刪除成功",
+ "ERROR_MESSAGE": "無法刪除分類"
}
}
},
"ARTICLE_SEARCH": {
"TITLE": "搜尋文章",
"PLACEHOLDER": "搜尋文章",
- "NO_RESULT": "未找到文章",
+ "NO_RESULT": "找不到文章",
"SEARCHING": "搜尋中...",
"SEARCH_BUTTON": "搜尋",
"INSERT_ARTICLE": "插入連結",
- "IFRAME_ERROR": "URL為空或無效,無法顯示內容。",
+ "IFRAME_ERROR": "URL 為空或無效,無法顯示內容。",
"OPEN_ARTICLE_SEARCH": "從幫助中心插入文章",
"SUCCESS_ARTICLE_INSERTED": "文章插入成功",
"PREVIEW_LINK": "預覽文章",
- "CANCEL": "取消",
+ "CANCEL": "關閉",
"BACK": "返回",
- "BACK_RESULTS": "返回結果"
+ "BACK_RESULTS": "返回搜尋結果"
},
"UPGRADE_PAGE": {
"TITLE": "幫助中心",
- "DESCRIPTION": "建立使用者友好的自助服務門戶。幫助您的使用者訪問文章並獲得24/7支援。升級您的訂閱以啟用此功能。",
- "SELF_HOSTED_DESCRIPTION": "建立使用者友好的自助服務門戶。幫助您的使用者訪問文章並獲得24/7支援。請聯絡您的管理員以啟用此功能。",
+ "DESCRIPTION": "建立使用者友善的自助服務入口。幫助您的使用者存取文章並獲得全天候支援。升級您的訂閱以啟用此功能。",
+ "SELF_HOSTED_DESCRIPTION": "建立使用者友善的自助服務入口。幫助您的使用者存取文章並獲得全天候支援。請聯繫您的管理員以啟用此功能。",
"BUTTON": {
"LEARN_MORE": "瞭解更多",
"UPGRADE": "升級"
},
"FEATURES": {
"PORTALS": {
- "TITLE": "多門戶支援",
- "DESCRIPTION": "使用同一賬戶為不同產品建立多個幫助中心門戶。"
+ "TITLE": "多入口支援",
+ "DESCRIPTION": "使用同一帳戶為不同產品建立多個幫助中心入口。"
},
"LOCALES": {
- "TITLE": "全面支援多語言環境",
- "DESCRIPTION": "將門戶本地化為您的語言。我們支援所有語言環境,並允許為每篇文章提供翻譯。"
+ "TITLE": "完整多語系支援",
+ "DESCRIPTION": "將入口本地化為您的語言。我們支援所有語系,並允許為每篇文章提供翻譯。"
},
"SEO": {
- "TITLE": "SEO友好設計",
- "DESCRIPTION": "自定義您的Meta標籤,透過我們的SEO友好頁面提高在搜尋引擎中的可見性。"
+ "TITLE": "SEO 友善設計",
+ "DESCRIPTION": "自訂您的 Meta 標籤,透過我們的 SEO 友善頁面提升搜尋引擎曝光度。"
},
"API": {
- "TITLE": "全面API支援",
- "DESCRIPTION": "使用我們的API將門戶作為無頭CMS與第三方前端框架整合。"
+ "TITLE": "完整 API 支援",
+ "DESCRIPTION": "透過我們的 API 將入口作為 Headless CMS 與第三方前端框架整合。"
}
}
},
@@ -522,15 +522,15 @@
"CARD": {
"VIEWS": "{count} 次瀏覽 | {count} 次瀏覽",
"DROPDOWN_MENU": {
- "PUBLISH": "釋出",
+ "PUBLISH": "發佈",
"DRAFT": "草稿",
- "ARCHIVE": "歸檔",
+ "ARCHIVE": "封存",
"DELETE": "刪除"
},
"STATUS": {
"DRAFT": "草稿",
- "PUBLISHED": "已釋出",
- "ARCHIVED": "已歸檔"
+ "PUBLISHED": "已發佈",
+ "ARCHIVED": "已封存"
},
"CATEGORY": {
"UNCATEGORISED": "未分類"
@@ -542,58 +542,58 @@
"ALL": "所有文章",
"MINE": "我的",
"DRAFT": "草稿",
- "PUBLISHED": "已釋出",
- "ARCHIVED": "已歸檔"
+ "PUBLISHED": "已發佈",
+ "ARCHIVED": "已封存"
},
"CATEGORY": {
- "ALL": "所有類別"
+ "ALL": "所有分類"
},
"LOCALE": {
- "ALL": "所有語言環境"
+ "ALL": "所有語系"
},
- "NEW_ARTICLE": "新建文章"
+ "NEW_ARTICLE": "新增文章"
},
"EMPTY_STATE": {
"ALL": {
"TITLE": "撰寫一篇文章",
"SUBTITLE": "撰寫一篇豐富的文章,讓我們開始吧!",
- "BUTTON_LABEL": "新建文章"
+ "BUTTON_LABEL": "新增文章"
},
"MINE": {
- "TITLE": "您尚未在此撰寫任何文章",
- "SUBTITLE": "您撰寫的所有文章將顯示在此處以便快速訪問。"
+ "TITLE": "您尚未撰寫任何文章",
+ "SUBTITLE": "您撰寫的所有文章將顯示在此處,方便快速存取。"
},
"DRAFT": {
"TITLE": "草稿中沒有文章",
"SUBTITLE": "草稿文章將顯示在此處"
},
"PUBLISHED": {
- "TITLE": "沒有已釋出的文章",
- "SUBTITLE": "已釋出的文章將顯示在此處"
+ "TITLE": "沒有已發佈的文章",
+ "SUBTITLE": "已發佈的文章將顯示在此處"
},
"ARCHIVED": {
- "TITLE": "歸檔中沒有文章",
- "SUBTITLE": "歸檔文章不會顯示在門戶上,您可以用它標記已棄用或過時的頁面"
+ "TITLE": "封存中沒有文章",
+ "SUBTITLE": "已封存的文章不會顯示在入口上,您可以用它標記已棄用或過時的頁面"
},
"CATEGORY": {
- "TITLE": "此類別中沒有文章",
- "SUBTITLE": "此類別中的文章將顯示在此處"
+ "TITLE": "此分類中沒有文章",
+ "SUBTITLE": "此分類中的文章將顯示在此處"
}
}
},
"CATEGORY_PAGE": {
"CATEGORY_HEADER": {
- "NEW_CATEGORY": "新建類別",
- "EDIT_CATEGORY": "編輯類別",
- "CATEGORIES_COUNT": "{n} 個類別 | {n} 個類別",
+ "NEW_CATEGORY": "新增分類",
+ "EDIT_CATEGORY": "編輯分類",
+ "CATEGORIES_COUNT": "{n} 個分類 | {n} 個分類",
"BREADCRUMB": {
- "CATEGORY_LOCALE": "類別 ({localeCode})",
- "ACTIVE_CATEGORY": "{categoryName} ({categoryCount} 篇文章) | {categoryName} ({categoryCount} 篇文章)"
+ "CATEGORY_LOCALE": "分類 ({localeCode})",
+ "ACTIVE_CATEGORY": "{categoryName}({categoryCount} 篇文章)| {categoryName}({categoryCount} 篇文章)"
}
},
"CATEGORY_EMPTY_STATE": {
- "TITLE": "未找到類別",
- "SUBTITLE": "類別將顯示在此處。您可以點選“新建類別”按鈕新增類別。"
+ "TITLE": "找不到分類",
+ "SUBTITLE": "分類將顯示在此處。您可以點擊「新增分類」按鈕來新增分類。"
},
"CATEGORY_CARD": {
"ARTICLES_COUNT": "{count} 篇文章 | {count} 篇文章"
@@ -601,44 +601,44 @@
"CATEGORY_DIALOG": {
"CREATE": {
"API": {
- "SUCCESS_MESSAGE": "類別建立成功",
- "ERROR_MESSAGE": "無法建立類別"
+ "SUCCESS_MESSAGE": "分類建立成功",
+ "ERROR_MESSAGE": "無法建立分類"
}
},
"EDIT": {
"API": {
- "SUCCESS_MESSAGE": "類別更新成功",
- "ERROR_MESSAGE": "無法更新類別"
+ "SUCCESS_MESSAGE": "分類更新成功",
+ "ERROR_MESSAGE": "無法更新分類"
}
},
"DELETE": {
"API": {
- "SUCCESS_MESSAGE": "類別刪除成功",
- "ERROR_MESSAGE": "無法刪除類別"
+ "SUCCESS_MESSAGE": "分類刪除成功",
+ "ERROR_MESSAGE": "無法刪除分類"
}
},
"HEADER": {
- "CREATE": "建立類別",
- "EDIT": "編輯類別",
- "DESCRIPTION": "編輯類別將更新面向公眾的門戶中的類別。",
- "PORTAL": "入口網站",
- "LOCALE": "語言環境"
+ "CREATE": "建立分類",
+ "EDIT": "編輯分類",
+ "DESCRIPTION": "編輯分類將更新對外公開入口中的分類。",
+ "PORTAL": "入口",
+ "LOCALE": "語系"
},
"FORM": {
"NAME": {
- "LABEL": "姓名",
- "PLACEHOLDER": "類別名稱",
+ "LABEL": "名稱",
+ "PLACEHOLDER": "分類名稱",
"ERROR": "名稱為必填"
},
"SLUG": {
- "LABEL": "網址代稱",
- "PLACEHOLDER": "類別的URL Slug",
- "ERROR": "Slug 是必填項",
+ "LABEL": "網址代碼",
+ "PLACEHOLDER": "分類的網址代碼",
+ "ERROR": "網址代碼為必填",
"HELP_TEXT": "app.chatwoot.com/hc/{portalSlug}/{localeCode}/categories/{categorySlug}"
},
"DESCRIPTION": {
- "LABEL": "描述資訊",
- "PLACEHOLDER": "給出有關該類別的簡短描述。",
+ "LABEL": "描述",
+ "PLACEHOLDER": "請簡短描述此分類。",
"ERROR": "描述為必填"
}
},
@@ -650,36 +650,36 @@
}
},
"LOCALES_PAGE": {
- "LOCALES_COUNT": "沒有可用的語言環境 | {n} 個語言環境 | {n} 個語言環境",
- "NEW_LOCALE_BUTTON_TEXT": "新建語言環境",
+ "LOCALES_COUNT": "沒有可用的語系 | {n} 個語系 | {n} 個語系",
+ "NEW_LOCALE_BUTTON_TEXT": "新增語系",
"LOCALE_CARD": {
"ARTICLES_COUNT": "{count} 篇文章 | {count} 篇文章",
- "CATEGORIES_COUNT": "{count} 個類別 | {count} 個類別",
+ "CATEGORIES_COUNT": "{count} 個分類 | {count} 個分類",
"DEFAULT": "預設",
"DRAFT": "草稿",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "設為預設",
- "MOVE_TO_DRAFT": "Move to draft",
- "PUBLISH_LOCALE": "Publish locale",
+ "MOVE_TO_DRAFT": "移至草稿",
+ "PUBLISH_LOCALE": "發佈語系",
"DELETE": "刪除"
}
},
"ADD_LOCALE_DIALOG": {
- "TITLE": "新增一個新的語言環境",
- "DESCRIPTION": "選擇此文章將使用的語言。這將新增到您的翻譯列表中,您可以稍後新增更多。",
+ "TITLE": "新增語系",
+ "DESCRIPTION": "選擇此文章將使用的語言。這將新增到您的翻譯清單中,您可以稍後新增更多。",
"COMBOBOX": {
- "PLACEHOLDER": "選擇語言環境..."
+ "PLACEHOLDER": "選擇語系..."
},
"STATUS": {
"LABEL": "狀態",
"OPTIONS": {
- "LIVE": "已釋出",
+ "LIVE": "已發佈",
"DRAFT": "草稿"
}
},
"API": {
- "SUCCESS_MESSAGE": "語言環境新增成功",
- "ERROR_MESSAGE": "無法新增語言環境,請重試。"
+ "SUCCESS_MESSAGE": "語系新增成功",
+ "ERROR_MESSAGE": "無法新增語系,請再試一次。"
}
}
},
@@ -687,186 +687,186 @@
"HEADER": {
"STATUS": {
"SAVING": "儲存中...",
- "SAVED": "儲存成功"
+ "SAVED": "已儲存"
},
"PREVIEW": "預覽",
- "PUBLISH": "釋出",
+ "PUBLISH": "發佈",
"DRAFT": "草稿",
- "ARCHIVE": "歸檔",
- "BACK_TO_ARTICLES": "返回文章"
+ "ARCHIVE": "封存",
+ "BACK_TO_ARTICLES": "返回文章列表"
},
"EDIT_ARTICLE": {
"MORE_PROPERTIES": "更多屬性",
"UNCATEGORIZED": "未分類",
- "EDITOR_PLACEHOLDER": "寫點什麼..."
+ "EDITOR_PLACEHOLDER": "開始撰寫..."
},
"ARTICLE_PROPERTIES": {
"ARTICLE_PROPERTIES": "文章屬性",
- "META_DESCRIPTION": "Meta描述",
- "META_DESCRIPTION_PLACEHOLDER": "新增Meta描述",
- "META_TITLE": "Meta標題",
- "META_TITLE_PLACEHOLDER": "新增Meta標題",
- "META_TAGS": "Meta標籤",
- "META_TAGS_PLACEHOLDER": "新增Meta標籤"
+ "META_DESCRIPTION": "Meta 描述",
+ "META_DESCRIPTION_PLACEHOLDER": "新增 Meta 描述",
+ "META_TITLE": "Meta 標題",
+ "META_TITLE_PLACEHOLDER": "新增 Meta 標題",
+ "META_TAGS": "Meta 標籤",
+ "META_TAGS_PLACEHOLDER": "新增 Meta 標籤"
},
"API": {
- "ERROR": "儲存文章時出錯"
+ "ERROR": "儲存文章時發生錯誤"
}
},
"PORTAL_SWITCHER": {
- "NEW_PORTAL": "新建門戶",
- "PORTALS": "入口網站",
- "CREATE_PORTAL": "建立和管理多個門戶",
+ "NEW_PORTAL": "新增入口",
+ "PORTALS": "入口",
+ "CREATE_PORTAL": "建立和管理多個入口",
"ARTICLES": "文章",
- "DOMAIN": "域名",
- "PORTAL_NAME": "門戶名稱"
+ "DOMAIN": "網域",
+ "PORTAL_NAME": "入口名稱"
},
"CREATE_PORTAL_DIALOG": {
- "TITLE": "建立新門戶",
- "DESCRIPTION": "為您的門戶命名並建立一個使用者友好的URL Slug。您稍後可以在設定中修改它們。",
+ "TITLE": "建立新入口",
+ "DESCRIPTION": "為您的入口命名並建立一個易於使用的網址代碼。您可以稍後在設定中修改。",
"CONFIRM_BUTTON_LABEL": "建立",
"NAME": {
- "LABEL": "姓名",
+ "LABEL": "名稱",
"PLACEHOLDER": "使用者指南 | Chatwoot",
- "MESSAGE": "為您的門戶選擇一個名稱。",
+ "MESSAGE": "為您的入口選擇一個名稱。",
"ERROR": "名稱為必填"
},
"SLUG": {
- "LABEL": "網址代稱",
- "PLACEHOLDER": "使用者指南",
- "ERROR": "Slug 為必填項",
- "FORMAT_ERROR": "請輸入有效的 Slug,例如:user-guide"
+ "LABEL": "網址代碼",
+ "PLACEHOLDER": "user-guide",
+ "ERROR": "網址代碼為必填",
+ "FORMAT_ERROR": "請輸入有效的網址代碼,例如:user-guide"
}
},
"PORTAL_SETTINGS": {
"FORM": {
"AVATAR": {
- "LABEL": "頭像",
+ "LABEL": "Logo",
"IMAGE_UPLOAD_ERROR": "無法上傳圖片!請再試一次",
- "IMAGE_UPLOAD_SUCCESS": "圖片上傳成功,請點選儲存更改以儲存Logo",
- "IMAGE_DELETE_SUCCESS": "Logo刪除成功",
- "IMAGE_DELETE_ERROR": "無法刪除Logo",
- "IMAGE_UPLOAD_SIZE_ERROR": "圖片大小應小於 {size}MB"
+ "IMAGE_UPLOAD_SUCCESS": "圖片新增成功。請點擊儲存變更以儲存 Logo",
+ "IMAGE_DELETE_SUCCESS": "Logo 刪除成功",
+ "IMAGE_DELETE_ERROR": "無法刪除 Logo",
+ "IMAGE_UPLOAD_SIZE_ERROR": "圖片大小不能超過 {size}MB"
},
"NAME": {
- "LABEL": "姓名",
- "PLACEHOLDER": "門戶名稱",
+ "LABEL": "名稱",
+ "PLACEHOLDER": "入口名稱",
"ERROR": "名稱為必填"
},
"HEADER_TEXT": {
- "LABEL": "標題文字",
- "PLACEHOLDER": "門戶標題文字"
+ "LABEL": "標頭文字",
+ "PLACEHOLDER": "入口標頭文字"
},
"PAGE_TITLE": {
"LABEL": "頁面標題",
- "PLACEHOLDER": "門戶頁面標題"
+ "PLACEHOLDER": "入口頁面標題"
},
"HOME_PAGE_LINK": {
- "LABEL": "主頁連結",
- "PLACEHOLDER": "門戶主頁連結",
- "ERROR": "輸入有效的 URL。主頁連結必須以「http://」或「https://」開頭。"
+ "LABEL": "首頁連結",
+ "PLACEHOLDER": "入口首頁連結",
+ "ERROR": "請輸入有效的 URL。首頁連結必須以「http://」或「https://」開頭。"
},
"SLUG": {
- "LABEL": "網址代稱",
- "PLACEHOLDER": "門戶Slug"
+ "LABEL": "網址代碼",
+ "PLACEHOLDER": "入口網址代碼"
},
"LIVE_CHAT_WIDGET": {
- "LABEL": "線上聊天小部件",
- "PLACEHOLDER": "選擇線上聊天小部件",
- "HELP_TEXT": "選擇將顯示在您的幫助中心上的線上聊天小部件",
- "NONE_OPTION": "沒有小部件"
+ "LABEL": "即時聊天小工具",
+ "PLACEHOLDER": "選擇即時聊天小工具",
+ "HELP_TEXT": "選擇將顯示在幫助中心的即時聊天小工具",
+ "NONE_OPTION": "不使用小工具"
},
"BRAND_COLOR": {
- "LABEL": "品牌顏色"
+ "LABEL": "品牌色彩"
},
- "SAVE_CHANGES": "儲存更改"
+ "SAVE_CHANGES": "儲存變更"
},
"CONFIGURATION_FORM": {
"CUSTOM_DOMAIN": {
- "HEADER": "自定義域名",
- "LABEL": "自定義域名:",
- "DESCRIPTION": "您可以在自定義域名上託管您的門戶。例如,如果您的網站是 yourdomain.com,並且您希望您的門戶在 docs.yourdomain.com 上可用,只需在此欄位中輸入即可。",
- "STATUS_DESCRIPTION": "您的自訂入口網站將在經過驗證後立即開始工作。",
- "PLACEHOLDER": "門戶自定義域名",
+ "HEADER": "自訂網域",
+ "LABEL": "自訂網域:",
+ "DESCRIPTION": "您可以在自訂網域上託管您的入口。例如,如果您的網站是 yourdomain.com,而您希望入口在 docs.yourdomain.com 上可用,只需在此欄位中輸入即可。",
+ "STATUS_DESCRIPTION": "您的自訂入口將在驗證通過後立即開始運作。",
+ "PLACEHOLDER": "入口自訂網域",
"EDIT_BUTTON": "編輯",
- "ADD_BUTTON": "新增自定義域名",
+ "ADD_BUTTON": "新增自訂網域",
"STATUS": {
- "LIVE": "實時",
+ "LIVE": "已上線",
"PENDING": "等待驗證",
"ERROR": "驗證失敗"
},
"DIALOG": {
- "ADD_HEADER": "新增自定義域名",
- "EDIT_HEADER": "編輯自定義域名",
- "ADD_CONFIRM_BUTTON_LABEL": "新增域名",
- "EDIT_CONFIRM_BUTTON_LABEL": "更新域名",
- "LABEL": "自定義域名",
- "PLACEHOLDER": "門戶自定義域名",
- "ERROR": "自定義域名是必填項",
- "FORMAT_ERROR": "請輸入有效的網域 URL,例如docs.yourdomain.com"
+ "ADD_HEADER": "新增自訂網域",
+ "EDIT_HEADER": "編輯自訂網域",
+ "ADD_CONFIRM_BUTTON_LABEL": "新增網域",
+ "EDIT_CONFIRM_BUTTON_LABEL": "更新網域",
+ "LABEL": "自訂網域",
+ "PLACEHOLDER": "入口自訂網域",
+ "ERROR": "自訂網域為必填",
+ "FORMAT_ERROR": "請輸入有效的網域 URL,例如 docs.yourdomain.com"
},
"DNS_CONFIGURATION_DIALOG": {
- "HEADER": "DNS配置",
- "DESCRIPTION": "登入您的 DNS 提供商賬戶,並新增一個指向 chatwoot.help 的子域名的 CNAME 記錄",
+ "HEADER": "DNS 設定",
+ "DESCRIPTION": "登入您的 DNS 供應商帳戶,新增一筆指向 chatwoot.help 的子網域 CNAME 記錄",
"COPY": "已成功複製 CNAME",
"SEND_INSTRUCTIONS": {
- "HEADER": "發送指令",
- "DESCRIPTION": "如果您希望讓您的開發團隊中的人員來處理此步驟,您可以在下面輸入電子郵件地址,我們將向他們發送所需的說明。",
- "PLACEHOLDER": "輸入他們的電子郵件",
- "ERROR": "輸入有效的電子郵件地址",
- "SEND_BUTTON": "發送"
+ "HEADER": "傳送設定說明",
+ "DESCRIPTION": "如果您希望由開發團隊的成員來處理此步驟,可以在下方輸入電子郵件地址,我們將傳送所需的設定說明給他們。",
+ "PLACEHOLDER": "輸入電子郵件地址",
+ "ERROR": "請輸入有效的電子郵件地址",
+ "SEND_BUTTON": "傳送"
}
}
},
"DELETE_PORTAL": {
"BUTTON": "刪除 {portalName}",
- "HEADER": "刪除門戶",
- "DESCRIPTION": "永久刪除此門戶。此操作不可逆",
+ "HEADER": "刪除入口",
+ "DESCRIPTION": "永久刪除此入口。此操作無法復原",
"DIALOG": {
"HEADER": "確定要刪除 {portalName} 嗎?",
- "DESCRIPTION": "這是一個永久操作,無法撤銷。",
+ "DESCRIPTION": "此為永久操作,無法復原。",
"CONFIRM_BUTTON_LABEL": "刪除"
}
},
- "EDIT_CONFIGURATION": "編輯配置"
+ "EDIT_CONFIGURATION": "編輯設定"
},
"API": {
"CREATE_PORTAL": {
- "SUCCESS_MESSAGE": "門戶建立成功",
- "ERROR_MESSAGE": "無法建立門戶"
+ "SUCCESS_MESSAGE": "入口建立成功",
+ "ERROR_MESSAGE": "無法建立入口"
},
"UPDATE_PORTAL": {
- "SUCCESS_MESSAGE": "門戶更新成功",
- "ERROR_MESSAGE": "無法更新門戶"
+ "SUCCESS_MESSAGE": "入口更新成功",
+ "ERROR_MESSAGE": "無法更新入口"
}
}
},
"PDF_UPLOAD": {
- "TITLE": "上傳PDF文檔",
- "DESCRIPTION": "上傳 PDF 文檔,利用 AI 自動產生常見問題解答",
- "DRAG_DROP_TEXT": "將您的 PDF 檔案拖放到此處,或按一下以選擇",
+ "TITLE": "上傳 PDF 文件",
+ "DESCRIPTION": "上傳 PDF 文件,利用 AI 自動產生常見問題",
+ "DRAG_DROP_TEXT": "將 PDF 檔案拖放到此處,或點擊選擇檔案",
"SELECT_FILE": "選擇 PDF 檔案",
- "ADDITIONAL_CONTEXT_LABEL": "其他上下文(可選)",
- "ADDITIONAL_CONTEXT_PLACEHOLDER": "提供常見問題產生的任何其他上下文或說明...",
- "UPLOADING": "上傳中",
- "UPLOAD": "上傳和進度",
+ "ADDITIONAL_CONTEXT_LABEL": "額外說明(選填)",
+ "ADDITIONAL_CONTEXT_PLACEHOLDER": "提供產生常見問題所需的額外說明或指示...",
+ "UPLOADING": "上傳中...",
+ "UPLOAD": "上傳並處理",
"CANCEL": "取消",
- "ERROR_INVALID_TYPE": "請選擇一個有效的 PDF 檔案",
- "ERROR_FILE_TOO_LARGE": "檔案大小必須小於 512MB",
- "ERROR_UPLOAD_FAILED": "上傳 PDF 失敗。請重試。"
+ "ERROR_INVALID_TYPE": "請選擇有效的 PDF 檔案",
+ "ERROR_FILE_TOO_LARGE": "檔案大小不能超過 512MB",
+ "ERROR_UPLOAD_FAILED": "上傳 PDF 失敗,請再試一次。"
},
"PDF_DOCUMENTS": {
"TITLE": "PDF 文件",
- "DESCRIPTION": "管理上傳的 PDF 文件並從它們生成常見問題",
+ "DESCRIPTION": "管理已上傳的 PDF 文件,並從中產生常見問題",
"UPLOAD_PDF": "上傳 PDF",
- "UPLOAD_FIRST_PDF": "上傳您的第一個PDF",
+ "UPLOAD_FIRST_PDF": "上傳您的第一個 PDF",
"UPLOADED_BY": "上傳者",
- "GENERATE_FAQS": "生成常見問題",
- "GENERATING": "生成中...",
- "CONFIRM_DELETE": "您確定要刪除 {filename}?",
+ "GENERATE_FAQS": "產生常見問題",
+ "GENERATING": "產生中...",
+ "CONFIRM_DELETE": "您確定要刪除 {filename} 嗎?",
"EMPTY_STATE": {
- "TITLE": "尚無PDF文件",
- "DESCRIPTION": "上傳 PDF 文件以使用 AI 自動生成常見問題內容"
+ "TITLE": "尚無 PDF 文件",
+ "DESCRIPTION": "上傳 PDF 文件以使用 AI 自動產生常見問題內容"
},
"STATUS": {
"UPLOADED": "已就緒",
@@ -876,22 +876,22 @@
}
},
"CONTENT_GENERATION": {
- "TITLE": "內容生成",
- "DESCRIPTION": "上傳 PDF 文件以使用 AI 自動生成常見問題內容",
+ "TITLE": "內容產生",
+ "DESCRIPTION": "上傳 PDF 文件以使用 AI 自動產生常見問題內容",
"UPLOAD_TITLE": "上傳 PDF 文件",
- "DRAG_DROP": "拖放您的 PDF 檔案到此處,或單擊以選擇",
+ "DRAG_DROP": "將 PDF 檔案拖放到此處,或點擊選擇檔案",
"SELECT_FILE": "選擇 PDF 檔案",
"UPLOADING": "正在處理文件...",
"UPLOAD_SUCCESS": "文件處理成功!",
- "UPLOAD_ERROR": "上傳文件失敗。請重試。",
- "INVALID_FILE_TYPE": "請選擇一個有效的 PDF 檔案",
- "FILE_TOO_LARGE": "檔案大小必須小於 512MB",
- "GENERATED_CONTENT": "生成常見問題",
- "PUBLISH_SELECTED": "釋出所選內容",
- "PUBLISHING": "釋出中...",
+ "UPLOAD_ERROR": "上傳文件失敗,請再試一次。",
+ "INVALID_FILE_TYPE": "請選擇有效的 PDF 檔案",
+ "FILE_TOO_LARGE": "檔案大小不能超過 512MB",
+ "GENERATED_CONTENT": "已產生的常見問題內容",
+ "PUBLISH_SELECTED": "發佈已選內容",
+ "PUBLISHING": "發佈中...",
"FROM_DOCUMENT": "來自文件",
- "NO_CONTENT": "沒有可用的生成內容。上傳 PDF 文件即可開始。",
- "LOADING": "正在載入生成的內容..."
+ "NO_CONTENT": "沒有可用的產生內容。上傳 PDF 文件即可開始。",
+ "LOADING": "正在載入產生的內容..."
}
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/inbox.json b/app/javascript/dashboard/i18n/locale/zh_TW/inbox.json
index d8307e382..14cc4300b 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/inbox.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/inbox.json
@@ -1,53 +1,53 @@
{
"INBOX": {
"LIST": {
- "TITLE": "我的收件箱",
+ "TITLE": "我的收件匣",
"DISPLAY_DROPDOWN": "顯示",
- "LOADING": "正在獲取通知",
- "404": "此組中沒有活躍的通知。",
+ "LOADING": "正在載入通知",
+ "404": "此群組中沒有進行中的通知。",
"NO_NOTIFICATIONS": "沒有通知",
- "NOTE": "來自所有訂閱收件箱的通知",
- "NO_MESSAGES_AVAILABLE": "哎呀!無法獲取訊息",
- "SNOOZED_UNTIL": "推遲到",
- "SNOOZED_UNTIL_TOMORROW": "推遲到明天",
- "SNOOZED_UNTIL_NEXT_WEEK": "推遲到下週"
+ "NOTE": "來自所有已訂閱收件匣的通知",
+ "NO_MESSAGES_AVAILABLE": "糟糕!無法載入訊息",
+ "SNOOZED_UNTIL": "延後至",
+ "SNOOZED_UNTIL_TOMORROW": "延後至明天",
+ "SNOOZED_UNTIL_NEXT_WEEK": "延後至下週"
},
"ACTION_HEADER": {
- "SNOOZE": "擱置通知",
+ "SNOOZE": "延後通知",
"DELETE": "刪除通知",
"BACK": "返回"
},
"TYPES": {
- "CONVERSATION_MENTION": "您被提及在對話中",
+ "CONVERSATION_MENTION": "您在對話中被提及",
"CONVERSATION_CREATION": "新對話已建立",
- "CONVERSATION_ASSIGNMENT": "對話已分配給您",
- "ASSIGNED_CONVERSATION_NEW_MESSAGE": "分配的對話中有新訊息",
+ "CONVERSATION_ASSIGNMENT": "有一則對話已指派給您",
+ "ASSIGNED_CONVERSATION_NEW_MESSAGE": "已指派的對話中有新訊息",
"PARTICIPATING_CONVERSATION_NEW_MESSAGE": "您參與的對話中有新訊息",
- "SLA_MISSED_FIRST_RESPONSE": "對話的首次響應SLA目標未達成",
- "SLA_MISSED_NEXT_RESPONSE": "對話的下次響應SLA目標未達成",
- "SLA_MISSED_RESOLUTION": "對話的解決SLA目標未達成"
+ "SLA_MISSED_FIRST_RESPONSE": "對話的 SLA 首次回應目標未達成",
+ "SLA_MISSED_NEXT_RESPONSE": "對話的 SLA 下次回應目標未達成",
+ "SLA_MISSED_RESOLUTION": "對話的 SLA 解決目標未達成"
},
"TYPES_NEXT": {
"CONVERSATION_MENTION": "被提及",
- "CONVERSATION_ASSIGNMENT": "分配給您",
+ "CONVERSATION_ASSIGNMENT": "已指派給您",
"CONVERSATION_CREATION": "新對話",
- "SLA_MISSED_FIRST_RESPONSE": "SLA違約",
- "SLA_MISSED_NEXT_RESPONSE": "SLA違約",
- "SLA_MISSED_RESOLUTION": "SLA違約",
+ "SLA_MISSED_FIRST_RESPONSE": "SLA 違規",
+ "SLA_MISSED_NEXT_RESPONSE": "SLA 違規",
+ "SLA_MISSED_RESOLUTION": "SLA 違規",
"PARTICIPATING_CONVERSATION_NEW_MESSAGE": "新訊息",
"ASSIGNED_CONVERSATION_NEW_MESSAGE": "新訊息",
- "SNOOZED_UNTIL": "推遲至{time}",
- "SNOOZED_ENDS": "推遲結束"
+ "SNOOZED_UNTIL": "已延後 {time}",
+ "SNOOZED_ENDS": "延後已結束"
},
- "NO_CONTENT": "沒有可用內容",
+ "NO_CONTENT": "沒有可用的內容",
"MENU_ITEM": {
- "MARK_AS_READ": "標記為已讀取",
- "MARK_AS_UNREAD": "標記為未讀取",
- "SNOOZE": "擱置",
+ "MARK_AS_READ": "標記為已讀",
+ "MARK_AS_UNREAD": "標記為未讀",
+ "SNOOZE": "延後",
"DELETE": "刪除",
- "MARK_ALL_READ": "標記全部為已讀取",
- "DELETE_ALL": "刪除所有",
- "DELETE_ALL_READ": "標記為未讀取已讀取"
+ "MARK_ALL_READ": "全部標記為已讀",
+ "DELETE_ALL": "刪除全部",
+ "DELETE_ALL_READ": "刪除所有已讀"
},
"DISPLAY_MENU": {
"SORT": "排序",
@@ -55,21 +55,21 @@
"SORT_OPTIONS": {
"NEWEST": "最新",
"OLDEST": "最舊",
- "PRIORITY": "優先程度"
+ "PRIORITY": "優先順序"
},
"DISPLAY_OPTIONS": {
- "SNOOZED": "擱置",
+ "SNOOZED": "已延後",
"READ": "已讀",
"LABELS": "標籤",
- "CONVERSATION_ID": "對話ID"
+ "CONVERSATION_ID": "對話 ID"
}
},
"ALERTS": {
- "MARK_AS_READ": "通知標記為已讀",
- "MARK_AS_UNREAD": "通知標記為未讀",
- "SNOOZE": "通知已推遲",
+ "MARK_AS_READ": "通知已標記為已讀",
+ "MARK_AS_UNREAD": "通知已標記為未讀",
+ "SNOOZE": "通知已延後",
"DELETE": "通知已刪除",
- "MARK_ALL_READ": "所有通知標記為已讀",
+ "MARK_ALL_READ": "所有通知已標記為已讀",
"DELETE_ALL": "所有通知已刪除",
"DELETE_ALL_READ": "所有已讀通知已刪除"
},
@@ -77,18 +77,18 @@
"TITLE": "需要重新授權",
"DESCRIPTION": "您的 WhatsApp 連線已過期。請重新連線以繼續接收和發送訊息。",
"BUTTON_TEXT": "重新連線 WhatsApp",
- "LOADING_FACEBOOK": "載入 Facebook SDK...",
+ "LOADING_FACEBOOK": "正在載入 Facebook SDK...",
"SUCCESS": "WhatsApp 重新連線成功",
- "ERROR": "無法重新連線 WhatsApp。請再試一次。",
- "WHATSAPP_APP_ID_MISSING": "WhatsApp ID未配置。請聯絡您的管理員。",
- "WHATSAPP_CONFIG_ID_MISSING": "未配置 WhatsApp 設定 ID。請聯絡您的管理員。",
- "CONFIGURATION_ERROR": "重新授權時發生配置錯誤。",
- "FACEBOOK_LOAD_ERROR": "無法載入 Facebook SDK。請重試。",
+ "ERROR": "無法重新連線 WhatsApp,請再試一次。",
+ "WHATSAPP_APP_ID_MISSING": "WhatsApp App ID 尚未設定。請聯絡您的管理員。",
+ "WHATSAPP_CONFIG_ID_MISSING": "WhatsApp 設定 ID 尚未設定。請聯絡您的管理員。",
+ "CONFIGURATION_ERROR": "重新授權時發生設定錯誤。",
+ "FACEBOOK_LOAD_ERROR": "無法載入 Facebook SDK,請重試。",
"TROUBLESHOOTING": {
- "TITLE": "疑難解答",
- "POPUP_BLOCKED": "確保此站點允許彈出視窗",
- "COOKIES": "必須啟用第三方cookie",
- "ADMIN_ACCESS": "您需要管理員許可權才能訪問 WhatsApp Business 賬戶"
+ "TITLE": "疑難排解",
+ "POPUP_BLOCKED": "請確認此網站允許彈出式視窗",
+ "COOKIES": "必須啟用第三方 Cookie",
+ "ADMIN_ACCESS": "您需要 WhatsApp Business 帳戶的管理員權限"
}
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json
index d43c00f9c..d19bd5a21 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json
@@ -1,110 +1,110 @@
{
"INBOX_MGMT": {
"HEADER": "收件匣",
- "DESCRIPTION": "A channel is the mode of communication your customer chooses to interact with you. An inbox is where you manage interactions for a specific channel. It can include communications from various sources such as email, live chat, and social media.",
- "LEARN_MORE": "Learn more about inboxes",
- "COUNT": "{n} inbox | {n} inboxes",
- "SEARCH_PLACEHOLDER": "Search inboxes...",
- "NO_RESULTS": "No inboxes found matching your search",
- "RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
- "CLICK_TO_RECONNECT": "Click here to reconnect.",
- "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
- "COMPLETE_REGISTRATION": "Complete Registration",
+ "DESCRIPTION": "頻道是客戶與您互動時選擇的溝通方式。收件匣是您管理特定頻道互動的地方,可以包含來自電子郵件、即時聊天和社群媒體等各種來源的通訊。",
+ "LEARN_MORE": "進一步了解收件匣",
+ "COUNT": "{n} 個收件匣",
+ "SEARCH_PLACEHOLDER": "搜尋收件匣...",
+ "NO_RESULTS": "找不到符合搜尋條件的收件匣",
+ "RECONNECTION_REQUIRED": "您的收件匣已斷開連線。在您重新授權之前,將無法接收新訊息。",
+ "CLICK_TO_RECONNECT": "點此重新連線。",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "您的 WhatsApp Business 註冊尚未完成。請在重新連線前至 Meta Business Manager 確認您的顯示名稱狀態。",
+ "COMPLETE_REGISTRATION": "完成註冊",
"LIST": {
- "404": "此帳戶没有收件匣。"
+ "404": "此帳戶沒有收件匣。"
},
"CREATE_FLOW": {
"CHANNEL": {
"TITLE": "選擇頻道",
- "BODY": "選擇你想要與 Chatwoot 整合的提供商。"
+ "BODY": "選擇您想要與 Chatwoot 整合的服務供應商。"
},
"INBOX": {
- "TITLE": "新增收件匣",
- "BODY": "驗證您的帳戶並建立建立收件匣。"
+ "TITLE": "建立收件匣",
+ "BODY": "驗證您的帳戶並建立收件匣。"
},
"AGENT": {
- "TITLE": "新增客服",
- "BODY": "將客服增加到建立的收件匣。"
+ "TITLE": "新增客服人員",
+ "BODY": "將客服人員新增到已建立的收件匣。"
},
"FINISH": {
- "TITLE": "Voilà!",
- "BODY": "您已設定狀態為離開"
+ "TITLE": "完成!",
+ "BODY": "一切準備就緒!"
}
},
"ADD": {
"CHANNEL_NAME": {
"LABEL": "收件匣名稱",
- "PLACEHOLDER": "輸入你的收件匣名稱 (e. g: Acme Inc)",
- "ERROR": "Please enter a valid inbox name"
+ "PLACEHOLDER": "輸入您的收件匣名稱(例:Acme Inc)",
+ "ERROR": "請輸入有效的收件匣名稱"
},
"WEBSITE_NAME": {
"LABEL": "網站名稱",
- "PLACEHOLDER": "輸入您的網站名稱 (e.g: Acme Inc)"
+ "PLACEHOLDER": "輸入您的網站名稱(例:Acme Inc)"
},
"FB": {
- "HELP": "注意: 通過登入,我們只能訪問您的頁面的消息。您的私人消息永遠不能被聊天室訪問。",
- "CHOOSE_PAGE": "選擇頁面",
- "CHOOSE_PLACEHOLDER": "從列表中選擇一個頁面",
+ "HELP": "注意:登入後,我們僅能存取您粉絲專頁的訊息。Chatwoot 永遠無法存取您的私人訊息。",
+ "CHOOSE_PAGE": "選擇粉絲專頁",
+ "CHOOSE_PLACEHOLDER": "從列表中選擇一個粉絲專頁",
"INBOX_NAME": "收件匣名稱",
- "ADD_NAME": "為收件匣新增名稱",
- "PICK_NAME": "Pick a Name for your Inbox",
- "PICK_A_VALUE": "選擇一個數值",
- "CREATE_INBOX": "新增收件匣"
+ "ADD_NAME": "為您的收件匣新增名稱",
+ "PICK_NAME": "為您的收件匣選擇一個名稱",
+ "PICK_A_VALUE": "選擇一個值",
+ "CREATE_INBOX": "建立收件匣"
},
"INSTAGRAM": {
- "CONTINUE_WITH_INSTAGRAM": "Continue with Instagram",
- "CONNECT_YOUR_INSTAGRAM_PROFILE": "Connect your Instagram Profile",
- "HELP": "To add your Instagram profile as a channel, you need to authenticate your Instagram Profile by clicking on 'Continue with Instagram' ",
- "ERROR_MESSAGE": "There was an error connecting to Instagram, please try again",
- "ERROR_AUTH": "There was an error connecting to Instagram, please try again",
- "NEW_INBOX_SUGGESTION": "This Instagram account was previously linked to a different inbox and has now been migrated here. All new messages will appear here. The old inbox will no longer be able to send or receive messages for this account.",
- "DUPLICATE_INBOX_BANNER": "This Instagram account was migrated to the new Instagram channel inbox. You won’t be able to send/receive Instagram messages from this inbox anymore."
+ "CONTINUE_WITH_INSTAGRAM": "繼續使用 Instagram",
+ "CONNECT_YOUR_INSTAGRAM_PROFILE": "連結您的 Instagram 個人檔案",
+ "HELP": "若要將您的 Instagram 個人檔案新增為頻道,請點擊「繼續使用 Instagram」來驗證您的 Instagram 個人檔案。",
+ "ERROR_MESSAGE": "連結 Instagram 時發生錯誤,請重試",
+ "ERROR_AUTH": "連結 Instagram 時發生錯誤,請重試",
+ "NEW_INBOX_SUGGESTION": "此 Instagram 帳號先前連結至其他收件匣,現已遷移至此處。所有新訊息將顯示在此。舊收件匣將無法再為此帳號收發訊息。",
+ "DUPLICATE_INBOX_BANNER": "此 Instagram 帳號已遷移至新的 Instagram 頻道收件匣。您將無法再從此收件匣收發 Instagram 訊息。"
},
"TIKTOK": {
- "CONTINUE_WITH_TIKTOK": "Continue with TikTok",
- "CONNECT_YOUR_TIKTOK_PROFILE": "Connect your TikTok Profile",
- "HELP": "To add your TikTok profile as a channel, you need to authenticate your TikTok Profile by clicking on 'Continue with TikTok' ",
- "ERROR_MESSAGE": "There was an error connecting to TikTok, please try again",
- "ERROR_AUTH": "There was an error connecting to TikTok, please try again"
+ "CONTINUE_WITH_TIKTOK": "繼續使用 TikTok",
+ "CONNECT_YOUR_TIKTOK_PROFILE": "連結您的 TikTok 個人檔案",
+ "HELP": "若要將您的 TikTok 個人檔案新增為頻道,請點擊「繼續使用 TikTok」來驗證您的 TikTok 個人檔案。",
+ "ERROR_MESSAGE": "連結 TikTok 時發生錯誤,請重試",
+ "ERROR_AUTH": "連結 TikTok 時發生錯誤,請重試"
},
"TWITTER": {
- "HELP": "若要將您的 Twitter 個人資料建立為頻道,您需要通過點擊“使用 Twitter 登入”來驗證您的 Twitter 個人資料。 ",
- "ERROR_MESSAGE": "There was an error connecting to Twitter, please try again",
+ "HELP": "若要將您的 Twitter 個人檔案新增為頻道,請點擊「使用 Twitter 登入」來驗證您的 Twitter 個人檔案。",
+ "ERROR_MESSAGE": "連結 Twitter 時發生錯誤,請重試",
"TWEETS": {
- "ENABLE": "Create conversations from mentioned Tweets"
+ "ENABLE": "從提及的推文建立對話"
}
},
"WEBSITE_CHANNEL": {
"TITLE": "網站頻道",
- "DESC": "為您的網站建立一個頻道並通過我們的網站小元件開始支持您的客户。",
- "LOADING_MESSAGE": "建立網站支持頻道",
+ "DESC": "為您的網站建立一個頻道,透過網站小工具開始為客戶提供支援服務。",
+ "LOADING_MESSAGE": "正在建立網站支援頻道",
"CHANNEL_AVATAR": {
"LABEL": "頻道頭像"
},
"CHANNEL_WEBHOOK_URL": {
- "LABEL": "Webhook 網址",
- "PLACEHOLDER": "Please enter your Webhook URL",
- "ERROR": "請輸入一個有效的 URL"
+ "LABEL": "Webhook URL",
+ "PLACEHOLDER": "請輸入您的 Webhook URL",
+ "ERROR": "請輸入有效的 URL"
},
"CHANNEL_DOMAIN": {
- "LABEL": "網站域名",
- "PLACEHOLDER": "輸入您的網站域名(e.g: acme.com)"
+ "LABEL": "網站網域",
+ "PLACEHOLDER": "輸入您的網站網域(例:acme.com)"
},
"CHANNEL_WELCOME_TITLE": {
- "LABEL": "歡迎標題:",
- "PLACEHOLDER": "你好!"
+ "LABEL": "歡迎標題",
+ "PLACEHOLDER": "您好!"
},
"CHANNEL_WELCOME_TAGLINE": {
- "LABEL": "歡迎標籤行",
- "PLACEHOLDER": "如有疑問,請聯繫我們"
+ "LABEL": "歡迎副標題",
+ "PLACEHOLDER": "我們讓溝通變得簡單。歡迎提出任何問題,或分享您的意見。"
},
"CHANNEL_GREETING_MESSAGE": {
- "LABEL": "頻道問候消息",
- "PLACEHOLDER": "Acme Inc 通常在幾小時内回覆。"
+ "LABEL": "頻道問候訊息",
+ "PLACEHOLDER": "Acme Inc 通常在幾小時內回覆。"
},
"CHANNEL_GREETING_TOGGLE": {
- "LABEL": "開啟頻道問候功能",
- "HELP_TEXT": "Automatically send a greeting message when a new conversation is created.",
+ "LABEL": "啟用頻道問候功能",
+ "HELP_TEXT": "當客戶發起對話並發送第一則訊息時,自動發送問候訊息。",
"ENABLED": "已啟用",
"DISABLED": "已停用"
},
@@ -113,297 +113,297 @@
"IN_A_FEW_MINUTES": "幾分鐘內",
"IN_A_FEW_HOURS": "幾小時內",
"IN_A_DAY": "一天內",
- "HELP_TEXT": "此回覆時間將會顯示在 live chat 小工具"
+ "HELP_TEXT": "此回覆時間將顯示在即時聊天小工具上"
},
"WIDGET_COLOR": {
- "LABEL": "視窗小元件顏色",
- "PLACEHOLDER": "更新小元件中使用的元件顏色"
+ "LABEL": "小工具顏色",
+ "PLACEHOLDER": "更新小工具使用的顏色"
},
"SUBMIT_BUTTON": "建立收件匣",
"API": {
- "ERROR_MESSAGE": "We were not able to create a website channel, please try again"
+ "ERROR_MESSAGE": "無法建立網站頻道,請重試"
}
},
"TWILIO": {
- "TITLE": "Twilio SMS/WhatsApp Channel",
- "DESC": "Integrate Twilio and start supporting your customers via SMS or WhatsApp.",
+ "TITLE": "Twilio SMS/WhatsApp 頻道",
+ "DESC": "整合 Twilio,透過 SMS 或 WhatsApp 為客戶提供支援服務。",
"ACCOUNT_SID": {
"LABEL": "帳戶 SID",
"PLACEHOLDER": "請輸入您的 Twilio 帳戶 SID",
- "ERROR": "此欄位是必填項目"
+ "ERROR": "此欄位為必填"
},
"API_KEY": {
- "USE_API_KEY": "Use API Key Authentication",
+ "USE_API_KEY": "使用 API Key 驗證",
"LABEL": "API Key SID",
- "PLACEHOLDER": "Please enter your API Key SID",
- "ERROR": "此欄位是必填項目"
+ "PLACEHOLDER": "請輸入您的 API Key SID",
+ "ERROR": "此欄位為必填"
},
"API_KEY_SECRET": {
"LABEL": "API Key Secret",
- "PLACEHOLDER": "Please enter your API Key Secret",
- "ERROR": "此欄位是必填項目"
+ "PLACEHOLDER": "請輸入您的 API Key Secret",
+ "ERROR": "此欄位為必填"
},
"MESSAGING_SERVICE_SID": {
"LABEL": "Messaging Service SID",
- "PLACEHOLDER": "Please enter your Twilio Messaging Service SID",
- "ERROR": "此欄位是必填項目",
- "USE_MESSAGING_SERVICE": "Use a Twilio Messaging Service"
+ "PLACEHOLDER": "請輸入您的 Twilio Messaging Service SID",
+ "ERROR": "此欄位為必填",
+ "USE_MESSAGING_SERVICE": "使用 Twilio Messaging Service"
},
"CHANNEL_TYPE": {
"LABEL": "頻道類型",
"ERROR": "請選擇您的頻道類型"
},
"AUTH_TOKEN": {
- "LABEL": "身份驗證 token",
- "PLACEHOLDER": "請輸入您的 Twilio 認證 token",
- "ERROR": "此欄位是必填項目"
+ "LABEL": "Auth Token",
+ "PLACEHOLDER": "請輸入您的 Twilio Auth Token",
+ "ERROR": "此欄位為必填"
},
"CHANNEL_NAME": {
"LABEL": "收件匣名稱",
"PLACEHOLDER": "請輸入收件匣名稱",
- "ERROR": "此欄位是必填項目"
+ "ERROR": "此欄位為必填"
},
"PHONE_NUMBER": {
- "LABEL": "聯絡人電話",
- "PLACEHOLDER": "請輸入發送消息的電話號碼。",
- "ERROR": "Please provide a valid phone number that starts with a `+` sign and does not contain any spaces."
+ "LABEL": "電話號碼",
+ "PLACEHOLDER": "請輸入發送訊息的電話號碼。",
+ "ERROR": "請提供以 `+` 開頭且不含空格的有效電話號碼。"
},
"API_CALLBACK": {
- "TITLE": "回呼地址",
- "SUBTITLE": "您必須使用這裡提到的URL來配置 Twilio 中的回呼URL。"
+ "TITLE": "回呼 URL",
+ "SUBTITLE": "您需要在 Twilio 中使用此處的 URL 設定訊息回呼 URL。"
},
"SUBMIT_BUTTON": "建立 Twilio 頻道",
"API": {
- "ERROR_MESSAGE": "我們無法驗證 Twilio 憑證,請重試"
+ "ERROR_MESSAGE": "無法驗證 Twilio 憑證,請重試"
}
},
"SMS": {
"TITLE": "SMS 頻道",
- "DESC": "Start supporting your customers via SMS.",
+ "DESC": "透過 SMS 開始為客戶提供支援服務。",
"PROVIDERS": {
- "LABEL": "API Provider",
+ "LABEL": "API 供應商",
"TWILIO": "Twilio",
"BANDWIDTH": "Bandwidth"
},
"API": {
- "ERROR_MESSAGE": "We were not able to save the SMS channel"
+ "ERROR_MESSAGE": "無法儲存 SMS 頻道"
},
"BANDWIDTH": {
"ACCOUNT_ID": {
- "LABEL": "Account ID",
- "PLACEHOLDER": "Please enter your Bandwidth Account ID",
- "ERROR": "此欄位是必填項目"
+ "LABEL": "帳戶 ID",
+ "PLACEHOLDER": "請輸入您的 Bandwidth 帳戶 ID",
+ "ERROR": "此欄位為必填"
},
"API_KEY": {
"LABEL": "API Key",
- "PLACEHOLDER": "Please enter your Bandwidth API Key",
- "ERROR": "此欄位是必填項目"
+ "PLACEHOLDER": "請輸入您的 Bandwidth API Key",
+ "ERROR": "此欄位為必填"
},
"API_SECRET": {
"LABEL": "API Secret",
- "PLACEHOLDER": "Please enter your Bandwidth API Secret",
- "ERROR": "此欄位是必填項目"
+ "PLACEHOLDER": "請輸入您的 Bandwidth API Secret",
+ "ERROR": "此欄位為必填"
},
"APPLICATION_ID": {
"LABEL": "Application ID",
- "PLACEHOLDER": "Please enter your Bandwidth Application ID",
- "ERROR": "此欄位是必填項目"
+ "PLACEHOLDER": "請輸入您的 Bandwidth Application ID",
+ "ERROR": "此欄位為必填"
},
"INBOX_NAME": {
"LABEL": "收件匣名稱",
"PLACEHOLDER": "請輸入收件匣名稱",
- "ERROR": "此欄位是必填項目"
+ "ERROR": "此欄位為必填"
},
"PHONE_NUMBER": {
"LABEL": "電話號碼",
- "PLACEHOLDER": "請輸入發送消息的電話號碼。",
- "ERROR": "Please provide a valid phone number that starts with a `+` sign and does not contain any spaces."
+ "PLACEHOLDER": "請輸入發送訊息的電話號碼。",
+ "ERROR": "請提供以 `+` 開頭且不含空格的有效電話號碼。"
},
- "SUBMIT_BUTTON": "Create Bandwidth Channel",
+ "SUBMIT_BUTTON": "建立 Bandwidth 頻道",
"API": {
- "ERROR_MESSAGE": "We were not able to authenticate Bandwidth credentials, please try again"
+ "ERROR_MESSAGE": "無法驗證 Bandwidth 憑證,請重試"
},
"API_CALLBACK": {
- "TITLE": "回呼地址",
- "SUBTITLE": "You have to configure the message callback URL in Bandwidth with the URL mentioned here."
+ "TITLE": "回呼 URL",
+ "SUBTITLE": "您需要在 Bandwidth 中使用此處的 URL 設定訊息回呼 URL。"
}
}
},
"WHATSAPP": {
- "TITLE": "WhatsApp Channel",
- "DESC": "Start supporting your customers via WhatsApp.",
+ "TITLE": "WhatsApp 頻道",
+ "DESC": "透過 WhatsApp 開始為客戶提供支援服務。",
"PROVIDERS": {
- "LABEL": "API Provider",
+ "LABEL": "API 供應商",
"WHATSAPP_EMBEDDED": "WhatsApp Business",
"TWILIO": "Twilio",
"WHATSAPP_CLOUD": "WhatsApp Cloud",
- "WHATSAPP_CLOUD_DESC": "Quick setup through Meta",
- "TWILIO_DESC": "Connect via Twilio credentials",
+ "WHATSAPP_CLOUD_DESC": "透過 Meta 快速設定",
+ "TWILIO_DESC": "透過 Twilio 憑證連接",
"360_DIALOG": "360Dialog"
},
"SELECT_PROVIDER": {
- "TITLE": "Select your API provider",
- "DESCRIPTION": "Choose your WhatsApp provider. You can connect directly through Meta which requires no setup, or connect through Twilio using your account credentials."
+ "TITLE": "選擇您的 API 供應商",
+ "DESCRIPTION": "選擇您的 WhatsApp 供應商。您可以透過 Meta 直接連接(無需額外設定),或使用 Twilio 帳戶憑證連接。"
},
"INBOX_NAME": {
"LABEL": "收件匣名稱",
- "PLACEHOLDER": "Please enter an inbox name",
- "ERROR": "此欄位是必填項目"
+ "PLACEHOLDER": "請輸入收件匣名稱",
+ "ERROR": "此欄位為必填"
},
"PHONE_NUMBER": {
"LABEL": "電話號碼",
- "PLACEHOLDER": "請輸入發送消息的電話號碼。",
- "ERROR": "Please provide a valid phone number that starts with a `+` sign and does not contain any spaces."
+ "PLACEHOLDER": "請輸入發送訊息的電話號碼。",
+ "ERROR": "請提供以 `+` 開頭且不含空格的有效電話號碼。"
},
"PHONE_NUMBER_ID": {
- "LABEL": "Phone number ID",
- "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.",
- "ERROR": "Please enter a valid value."
+ "LABEL": "電話號碼 ID",
+ "PLACEHOLDER": "請輸入從 Facebook 開發者後台取得的電話號碼 ID。",
+ "ERROR": "請輸入有效的值。"
},
"BUSINESS_ACCOUNT_ID": {
- "LABEL": "Business Account ID",
- "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.",
- "ERROR": "Please enter a valid value."
+ "LABEL": "商業帳戶 ID",
+ "PLACEHOLDER": "請輸入從 Facebook 開發者後台取得的商業帳戶 ID。",
+ "ERROR": "請輸入有效的值。"
},
"WEBHOOK_VERIFY_TOKEN": {
- "LABEL": "Webhook Verify Token",
- "PLACEHOLDER": "Enter a verify token which you want to configure for Facebook webhooks.",
- "ERROR": "Please enter a valid value."
+ "LABEL": "Webhook 驗證 Token",
+ "PLACEHOLDER": "輸入您想為 Facebook Webhook 設定的驗證 Token。",
+ "ERROR": "請輸入有效的值。"
},
"API_KEY": {
- "LABEL": "API key",
- "SUBTITLE": "Configure the WhatsApp API key.",
- "PLACEHOLDER": "API key",
- "ERROR": "Please enter a valid value."
+ "LABEL": "API Key",
+ "SUBTITLE": "設定 WhatsApp API Key。",
+ "PLACEHOLDER": "API Key",
+ "ERROR": "請輸入有效的值。"
},
"API_CALLBACK": {
- "TITLE": "回呼地址",
- "SUBTITLE": "You have to configure the webhook URL and the verification token in the Facebook Developer portal with the values shown below.",
- "WEBHOOK_URL": "Webhook 網址",
- "WEBHOOK_VERIFICATION_TOKEN": "Webhook Verification Token"
+ "TITLE": "回呼 URL",
+ "SUBTITLE": "您需要在 Facebook 開發者入口網站中,使用下方顯示的值設定 Webhook URL 和驗證 Token。",
+ "WEBHOOK_URL": "Webhook URL",
+ "WEBHOOK_VERIFICATION_TOKEN": "Webhook 驗證 Token"
},
- "SUBMIT_BUTTON": "Create WhatsApp Channel",
+ "SUBMIT_BUTTON": "建立 WhatsApp 頻道",
"EMBEDDED_SIGNUP": {
- "TITLE": "Quick setup with Meta",
- "DESC": "Use the WhatsApp Embedded Signup flow to quickly connect new numbers. You will be redirected to Meta to log into your WhatsApp Business account. Having admin access will help make the setup smooth and easy.",
+ "TITLE": "透過 Meta 快速設定",
+ "DESC": "使用 WhatsApp Embedded Signup 流程快速連接新號碼。您將被導向至 Meta 登入 WhatsApp Business 帳號。擁有管理員權限將有助於順利完成設定。",
"BENEFITS": {
- "TITLE": "Benefits of Embedded Signup:",
- "EASY_SETUP": "No manual configuration required",
- "SECURE_AUTH": "Secure OAuth based authentication",
- "AUTO_CONFIG": "Automatic webhook and phone number configuration"
+ "TITLE": "Embedded Signup 的優點:",
+ "EASY_SETUP": "無需手動設定",
+ "SECURE_AUTH": "安全的 OAuth 驗證",
+ "AUTO_CONFIG": "自動設定 Webhook 和電話號碼"
},
"LEARN_MORE": {
- "TEXT": "To learn more about integrated signup, pricing, and limitations, visit {link}.",
- "LINK_TEXT": "this link"
+ "TEXT": "如需了解更多關於整合註冊、定價和限制的資訊,請造訪 {link}。",
+ "LINK_TEXT": "此連結"
},
- "SUBMIT_BUTTON": "Connect with WhatsApp Business",
- "AUTH_PROCESSING": "Authenticating with Meta",
- "WAITING_FOR_BUSINESS_INFO": "Please complete business setup in the Meta window...",
- "PROCESSING": "Setting up your WhatsApp Business Account",
- "LOADING_SDK": "Loading Facebook SDK...",
- "CANCELLED": "WhatsApp Signup was cancelled",
- "SUCCESS_TITLE": "WhatsApp Business Account Connected!",
- "WAITING_FOR_AUTH": "Waiting for authentication...",
- "INVALID_BUSINESS_DATA": "Invalid business data received from Facebook. Please try again.",
- "SIGNUP_ERROR": "Signup error occurred",
- "AUTH_NOT_COMPLETED": "Authentication not completed. Please restart the process.",
- "SUCCESS_FALLBACK": "WhatsApp Business Account has been successfully configured",
- "MANUAL_FALLBACK": "If your number is already connected to the WhatsApp Business Platform (API), or if you’re a tech provider onboarding your own number, please use the {link} flow",
- "MANUAL_LINK_TEXT": "manual setup flow"
+ "SUBMIT_BUTTON": "連接 WhatsApp Business",
+ "AUTH_PROCESSING": "正在透過 Meta 進行驗證",
+ "WAITING_FOR_BUSINESS_INFO": "請在 Meta 視窗中完成商業設定...",
+ "PROCESSING": "正在設定您的 WhatsApp Business 帳號",
+ "LOADING_SDK": "正在載入 Facebook SDK...",
+ "CANCELLED": "WhatsApp 註冊已取消",
+ "SUCCESS_TITLE": "WhatsApp Business 帳號已連接!",
+ "WAITING_FOR_AUTH": "正在等待驗證...",
+ "INVALID_BUSINESS_DATA": "從 Facebook 收到的商業資料無效。請重試。",
+ "SIGNUP_ERROR": "註冊時發生錯誤",
+ "AUTH_NOT_COMPLETED": "驗證未完成。請重新開始流程。",
+ "SUCCESS_FALLBACK": "WhatsApp Business 帳號已成功設定",
+ "MANUAL_FALLBACK": "如果您的號碼已連接到 WhatsApp Business Platform(API),或者您是正在接入自己號碼的技術供應商,請使用 {link}",
+ "MANUAL_LINK_TEXT": "手動設定流程"
},
"API": {
- "ERROR_MESSAGE": "We were not able to save the WhatsApp channel"
+ "ERROR_MESSAGE": "無法儲存 WhatsApp 頻道"
}
},
"VOICE": {
- "TITLE": "Voice Channel",
- "DESC": "Integrate Twilio Voice and start supporting your customers via phone calls.",
+ "TITLE": "語音頻道",
+ "DESC": "整合 Twilio Voice,透過電話為客戶提供支援服務。",
"PHONE_NUMBER": {
- "LABEL": "聯絡人電話",
- "PLACEHOLDER": "Enter your phone number (e.g. +1234567890)",
- "ERROR": "Please provide a valid phone number in E.164 format (e.g. +1234567890)"
+ "LABEL": "電話號碼",
+ "PLACEHOLDER": "輸入您的電話號碼(例:+1234567890)",
+ "ERROR": "請提供 E.164 格式的有效電話號碼(例:+1234567890)"
},
"TWILIO": {
"ACCOUNT_SID": {
"LABEL": "帳戶 SID",
- "PLACEHOLDER": "Enter your Twilio Account SID",
- "REQUIRED": "Account SID is required"
+ "PLACEHOLDER": "輸入您的 Twilio 帳戶 SID",
+ "REQUIRED": "帳戶 SID 為必填"
},
"AUTH_TOKEN": {
- "LABEL": "身份驗證 token",
- "PLACEHOLDER": "Enter your Twilio Auth Token",
- "REQUIRED": "Auth Token is required"
+ "LABEL": "Auth Token",
+ "PLACEHOLDER": "輸入您的 Twilio Auth Token",
+ "REQUIRED": "Auth Token 為必填"
},
"API_KEY_SID": {
"LABEL": "API Key SID",
- "PLACEHOLDER": "Enter your Twilio API Key SID",
- "REQUIRED": "API Key SID is required"
+ "PLACEHOLDER": "輸入您的 Twilio API Key SID",
+ "REQUIRED": "API Key SID 為必填"
},
"API_KEY_SECRET": {
"LABEL": "API Key Secret",
- "PLACEHOLDER": "Enter your Twilio API Key Secret",
- "REQUIRED": "API Key Secret is required"
+ "PLACEHOLDER": "輸入您的 Twilio API Key Secret",
+ "REQUIRED": "API Key Secret 為必填"
}
},
"CONFIGURATION": {
"TWILIO_VOICE_URL_TITLE": "Twilio Voice URL",
- "TWILIO_VOICE_URL_SUBTITLE": "Configure this URL as the Voice URL on your Twilio phone number and TwiML App.",
+ "TWILIO_VOICE_URL_SUBTITLE": "在您的 Twilio 電話號碼和 TwiML App 上將此 URL 設定為 Voice URL。",
"TWILIO_STATUS_URL_TITLE": "Twilio Status Callback URL",
- "TWILIO_STATUS_URL_SUBTITLE": "Configure this URL as the Status Callback URL on your Twilio phone number."
+ "TWILIO_STATUS_URL_SUBTITLE": "在您的 Twilio 電話號碼上將此 URL 設定為 Status Callback URL。"
},
- "SUBMIT_BUTTON": "Create Voice Channel",
+ "SUBMIT_BUTTON": "建立語音頻道",
"API": {
- "ERROR_MESSAGE": "We were not able to create the voice channel"
+ "ERROR_MESSAGE": "無法建立語音頻道"
}
},
"API_CHANNEL": {
"TITLE": "API 頻道",
- "DESC": "與 API 頻道互動,開始服務客戶。",
+ "DESC": "整合 API 頻道,開始為客戶提供支援服務。",
"CHANNEL_NAME": {
- "LABEL": "頻道類型",
+ "LABEL": "頻道名稱",
"PLACEHOLDER": "請輸入頻道名稱",
- "ERROR": "此欄位是必填項目"
+ "ERROR": "此欄位為必填"
},
"WEBHOOK_URL": {
- "LABEL": "Webhook 網址",
- "SUBTITLE": "Configure the URL where you want to receive callbacks on events.",
- "PLACEHOLDER": "Webhook 網址"
+ "LABEL": "Webhook URL",
+ "SUBTITLE": "設定您想要接收事件回呼的 URL。",
+ "PLACEHOLDER": "Webhook URL"
},
"SUBMIT_BUTTON": "建立 API 頻道",
"API": {
- "ERROR_MESSAGE": "我們無法保存 API 頻道"
+ "ERROR_MESSAGE": "無法儲存 API 頻道"
}
},
"EMAIL_CHANNEL": {
- "TITLE": "電子信箱頻道",
- "DESC": "Integrate your email inbox.",
+ "TITLE": "電子郵件頻道",
+ "DESC": "整合您的電子郵件信箱。",
"CHANNEL_NAME": {
- "LABEL": "頻道類型",
+ "LABEL": "頻道名稱",
"PLACEHOLDER": "請輸入頻道名稱",
- "ERROR": "此欄位是必填項目"
+ "ERROR": "此欄位為必填"
},
"EMAIL": {
"LABEL": "Email",
- "SUBTITLE": "Provide the email address where your customers send support requests.",
+ "SUBTITLE": "請提供客戶發送支援請求的電子郵件地址。",
"PLACEHOLDER": "Email"
},
- "SUBMIT_BUTTON": "建立電子信箱頻道",
+ "SUBMIT_BUTTON": "建立電子郵件頻道",
"API": {
- "ERROR_MESSAGE": "我們無法儲存電子信箱頻道"
+ "ERROR_MESSAGE": "無法儲存電子郵件頻道"
},
- "FINISH_MESSAGE": "開始將您的電子信箱轉發到以下電子信箱地址。",
- "FINISH_MESSAGE_NO_FORWARDING": "Your email inbox has been created successfully! You need to configure SMTP and IMAP credentials to send and receive emails. Without these settings, no emails will be processed.",
- "FORWARDING_ADDRESS_LABEL": "Forward emails to this address:",
+ "FINISH_MESSAGE": "您的電子郵件收件匣已成功建立!您可以開始將郵件轉寄至下方地址,或設定 SMTP 和 IMAP 憑證以直接收發郵件。",
+ "FINISH_MESSAGE_NO_FORWARDING": "您的電子郵件收件匣已成功建立!您需要設定 SMTP 和 IMAP 憑證才能收發郵件。若未設定,將不會處理任何郵件。",
+ "FORWARDING_ADDRESS_LABEL": "將郵件轉寄至此地址:",
"CONFIGURE_SMTP_IMAP_LINK": "點擊這裡",
- "CONFIGURE_SMTP_IMAP_TEXT": " to configure IMAP and SMTP settings"
+ "CONFIGURE_SMTP_IMAP_TEXT": "設定 IMAP 和 SMTP"
},
"LINE_CHANNEL": {
- "TITLE": "LINE Channel",
- "DESC": "Integrate with LINE channel and start supporting your customers.",
+ "TITLE": "LINE 頻道",
+ "DESC": "整合 LINE 頻道,開始為客戶提供支援服務。",
"CHANNEL_NAME": {
- "LABEL": "頻道類型",
+ "LABEL": "頻道名稱",
"PLACEHOLDER": "請輸入頻道名稱",
- "ERROR": "此欄位是必填項目"
+ "ERROR": "此欄位為必填"
},
"LINE_CHANNEL_ID": {
"LABEL": "LINE Channel ID",
@@ -417,144 +417,144 @@
"LABEL": "LINE Channel Token",
"PLACEHOLDER": "LINE Channel Token"
},
- "SUBMIT_BUTTON": "建立 LINE Channel",
+ "SUBMIT_BUTTON": "建立 LINE 頻道",
"API": {
- "ERROR_MESSAGE": "We were not able to save the LINE channel"
+ "ERROR_MESSAGE": "無法儲存 LINE 頻道"
},
"API_CALLBACK": {
- "TITLE": "回呼地址",
- "SUBTITLE": "You have to configure the webhook URL in LINE application with the URL mentioned here."
+ "TITLE": "回呼 URL",
+ "SUBTITLE": "您需要在 LINE 應用程式中使用此處的 URL 設定 Webhook URL。"
}
},
"TELEGRAM_CHANNEL": {
- "TITLE": "Telegram Channel",
- "DESC": "Integrate with Telegram channel and start supporting your customers.",
+ "TITLE": "Telegram 頻道",
+ "DESC": "整合 Telegram 頻道,開始為客戶提供支援服務。",
"BOT_TOKEN": {
"LABEL": "Bot Token",
- "SUBTITLE": "Configure the bot token you have obtained from Telegram BotFather.",
+ "SUBTITLE": "設定您從 Telegram BotFather 取得的 Bot Token。",
"PLACEHOLDER": "Bot Token"
},
- "SUBMIT_BUTTON": "建立 Telegram Channel",
+ "SUBMIT_BUTTON": "建立 Telegram 頻道",
"API": {
- "ERROR_MESSAGE": "我們無法儲存 telegram 頻道"
+ "ERROR_MESSAGE": "無法儲存 Telegram 頻道"
}
},
"AUTH": {
- "TITLE": "選擇一個頻道",
- "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below.",
- "TITLE_NEXT": "Complete the setup",
- "TITLE_FINISH": "Voilà!",
+ "TITLE": "選擇頻道",
+ "DESC": "Chatwoot 支援即時聊天小工具、Facebook Messenger、WhatsApp、電子郵件等頻道。如果您想建立自訂頻道,可以使用 API 頻道來建立。請選擇以下其中一個頻道開始使用。",
+ "TITLE_NEXT": "完成設定",
+ "TITLE_FINISH": "完成!",
"CHANNEL": {
"WEBSITE": {
- "TITLE": "Website",
- "DESCRIPTION": "Create a live-chat widget"
+ "TITLE": "網站",
+ "DESCRIPTION": "建立即時聊天小工具"
},
"FACEBOOK": {
"TITLE": "Facebook",
- "DESCRIPTION": "Connect your Facebook page"
+ "DESCRIPTION": "連結您的 Facebook 粉絲專頁"
},
"WHATSAPP": {
"TITLE": "WhatsApp",
- "DESCRIPTION": "Support your customers on WhatsApp"
+ "DESCRIPTION": "透過 WhatsApp 為客戶提供支援"
},
"EMAIL": {
"TITLE": "Email",
- "DESCRIPTION": "Connect with Gmail, Outlook, or other providers"
+ "DESCRIPTION": "連結 Gmail、Outlook 或其他供應商"
},
"SMS": {
"TITLE": "SMS",
- "DESCRIPTION": "Integrate SMS channel with Twilio or bandwidth"
+ "DESCRIPTION": "透過 Twilio 或 Bandwidth 整合 SMS 頻道"
},
"API": {
"TITLE": "API",
- "DESCRIPTION": "Make a custom channel using our API"
+ "DESCRIPTION": "使用我們的 API 建立自訂頻道"
},
"TELEGRAM": {
"TITLE": "Telegram",
- "DESCRIPTION": "Configure Telegram channel using Bot token"
+ "DESCRIPTION": "使用 Bot Token 設定 Telegram 頻道"
},
"LINE": {
- "TITLE": "Line",
- "DESCRIPTION": "Integrate your Line channel"
+ "TITLE": "LINE",
+ "DESCRIPTION": "整合您的 LINE 頻道"
},
"INSTAGRAM": {
"TITLE": "Instagram",
- "DESCRIPTION": "Connect your instagram account"
+ "DESCRIPTION": "連結您的 Instagram 帳號"
},
"TIKTOK": {
"TITLE": "TikTok",
- "DESCRIPTION": "Connect your TikTok account"
+ "DESCRIPTION": "連結您的 TikTok 帳號"
},
"VOICE": {
- "TITLE": "Voice",
- "DESCRIPTION": "Integrate with Twilio Voice"
+ "TITLE": "語音",
+ "DESCRIPTION": "整合 Twilio Voice"
}
}
},
"AGENTS": {
- "TITLE": "客服",
- "DESC": "在這裡您可以新增客服來管理您新建立的收件匣。只有這些選定的客服才能訪問您的收件匣。 不屬於此收件匣的客服在登入時將無法看到或回覆此收件匣中的消息。 PS: 作為管理員,如果您需要訪問所有收件匣, 您應該將自己建立到您建立的所有收件匣中。",
- "VALIDATION_ERROR": "Add at least one agent to your new Inbox",
- "PICK_AGENTS": "為收件匣挑選一些客服"
+ "TITLE": "客服人員",
+ "DESC": "在此您可以新增客服人員來管理新建立的收件匣。只有被選取的客服人員才能存取此收件匣。不屬於此收件匣的客服人員在登入後將無法查看或回覆此收件匣中的訊息。 注意: 身為管理員,如果您需要存取所有收件匣,應將自己新增為所有收件匣的客服人員。",
+ "VALIDATION_ERROR": "請至少新增一位客服人員到新收件匣",
+ "PICK_AGENTS": "為收件匣選擇客服人員"
},
"DETAILS": {
- "TITLE": "收件匣詳細資訊",
- "DESC": "從下面的下拉菜單中選擇您想要連接到聊天室的 Facebook 頁面。 您也可以給您的收件匣提供一個自定義名稱以便更好地識別身份。"
+ "TITLE": "收件匣詳情",
+ "DESC": "從下方的下拉選單中選擇您要連結至 Chatwoot 的 Facebook 粉絲專頁。您也可以為收件匣設定自訂名稱以便識別。"
},
"FINISH": {
- "TITLE": "做得漂亮!",
- "DESC": "您已成功地將您的 Facebook 頁面與 Chatwoot 整合。下次客户發送消息到您的頁面時,對話將自動出現在收件匣中。 我們還為您提供了一個小元件脚本,您可以輕鬆地建立到您的網站。 在您的網站上登入後, 客户可以在没有任何外部工具幫助的情况下,從您的網站向您發送消息,對話將會在這裡出現在 Chatwoot 上。 酷,對吧?好吧,我們很肯定 :)"
+ "TITLE": "完成!",
+ "DESC": "您已成功將 Facebook 粉絲專頁與 Chatwoot 整合。下次客戶在您的粉絲專頁發送訊息時,對話將自動出現在收件匣中。 我們也為您提供了一段小工具程式碼,您可以輕鬆地加入到您的網站中。網站上線後,客戶可以直接從您的網站傳送訊息給您,無需任何外部工具,對話將直接顯示在 Chatwoot 中。 很酷吧?我們一直在努力 :)"
},
"EMAIL_PROVIDER": {
- "TITLE": "選擇你的電子郵件供應商",
- "DESCRIPTION": "Select an email provider from the list below. If you don't see your email provider in the list, you can select the other provider option and provide the IMAP and SMTP Credentials."
+ "TITLE": "選擇您的電子郵件供應商",
+ "DESCRIPTION": "從下方列表中選擇一個電子郵件供應商。如果列表中沒有您的供應商,可以選擇其他供應商選項,並提供 IMAP 和 SMTP 憑證。"
},
"MICROSOFT": {
"TITLE": "Microsoft Email",
- "DESCRIPTION": "Click on the Sign in with Microsoft button to get started. You will redirected to the email sign in page. Once you accept the requested permissions, you would be redirected back to the inbox creation step.",
- "EMAIL_PLACEHOLDER": "輸入電子信箱",
- "SIGN_IN": "Sign in with Microsoft",
- "ERROR_MESSAGE": "There was an error connecting to Microsoft, please try again"
+ "DESCRIPTION": "點擊「使用 Microsoft 登入」按鈕開始。您將被導向至電子郵件登入頁面。接受所需權限後,將返回收件匣建立步驟。",
+ "EMAIL_PLACEHOLDER": "輸入電子郵件地址",
+ "SIGN_IN": "使用 Microsoft 登入",
+ "ERROR_MESSAGE": "連結 Microsoft 時發生錯誤,請重試"
},
"GOOGLE": {
"TITLE": "Google Email",
- "DESCRIPTION": "Click on the Sign in with Google button to get started. You will redirected to the email sign in page. Once you accept the requested permissions, you would be redirected back to the inbox creation step.",
- "SIGN_IN": "Sign in with Google",
- "EMAIL_PLACEHOLDER": "輸入電子信箱",
- "ERROR_MESSAGE": "There was an error connecting to Google, please try again"
+ "DESCRIPTION": "點擊「使用 Google 登入」按鈕開始。您將被導向至電子郵件登入頁面。接受所需權限後,將返回收件匣建立步驟。",
+ "SIGN_IN": "使用 Google 登入",
+ "EMAIL_PLACEHOLDER": "輸入電子郵件地址",
+ "ERROR_MESSAGE": "連結 Google 時發生錯誤,請重試"
}
},
"DETAILS": {
- "LOADING_FB": "在 Facebook 上認證你... ..",
- "ERROR_FB_LOADING": "Error loading Facebook SDK. Please disable any ad-blockers and try again from a different browser.",
- "ERROR_FB_AUTH": "出錯了,請刷新頁面...",
- "ERROR_FB_UNAUTHORIZED": "You're not authorized to perform this action. ",
- "ERROR_FB_UNAUTHORIZED_HELP": "Please ensure you have access to the Facebook page with full control. You can read more about Facebook roles here .",
- "CREATING_CHANNEL": "建立您的收件匣...",
- "TITLE": "配置收件匣詳情",
+ "LOADING_FB": "正在透過 Facebook 進行驗證...",
+ "ERROR_FB_LOADING": "載入 Facebook SDK 時發生錯誤。請停用廣告攔截器,並使用其他瀏覽器重試。",
+ "ERROR_FB_AUTH": "發生錯誤,請重新整理頁面...",
+ "ERROR_FB_UNAUTHORIZED": "您未獲授權執行此操作。",
+ "ERROR_FB_UNAUTHORIZED_HELP": "請確認您擁有 Facebook 粉絲專頁的完整控制權限。您可以在此處 了解更多 Facebook 角色的相關資訊。",
+ "CREATING_CHANNEL": "正在建立您的收件匣...",
+ "TITLE": "設定收件匣詳情",
"DESC": ""
},
"AGENTS": {
- "BUTTON_TEXT": "新增客服",
- "ADD_AGENTS": "正在新增客服到你的收件匣..."
+ "BUTTON_TEXT": "新增客服人員",
+ "ADD_AGENTS": "正在將客服人員新增到您的收件匣..."
},
"FINISH": {
"TITLE": "您的收件匣已準備就緒!",
- "MESSAGE": "您現在可以通過您的新頻道與您的客户聯繫。開心的支援客戶吧",
- "BUTTON_TEXT": "带我到這裡",
+ "MESSAGE": "您現在可以透過新頻道與客戶互動。祝您支援愉快!",
+ "BUTTON_TEXT": "前往收件匣",
"MORE_SETTINGS": "更多設定",
- "WEBSITE_SUCCESS": "您已成功完成建立網站頻道。複製下面顯示的代碼並將其黏貼在您的網站上。 下次客户使用即時聊天時,對話將自動出現在您的收件匣中。",
- "WHATSAPP_QR_INSTRUCTION": "Scan the QR code above to quickly test your WhatsApp inbox",
- "MESSENGER_QR_INSTRUCTION": "Scan the QR code above to quickly test your Facebook Messenger inbox",
- "TELEGRAM_QR_INSTRUCTION": "Scan the QR code above to quickly test your Telegram inbox"
+ "WEBSITE_SUCCESS": "您已成功建立網站頻道。複製下方顯示的程式碼,並貼到您的網站上。下次客戶使用即時聊天時,對話將自動出現在您的收件匣中。",
+ "WHATSAPP_QR_INSTRUCTION": "掃描上方 QR Code 以快速測試您的 WhatsApp 收件匣",
+ "MESSENGER_QR_INSTRUCTION": "掃描上方 QR Code 以快速測試您的 Facebook Messenger 收件匣",
+ "TELEGRAM_QR_INSTRUCTION": "掃描上方 QR Code 以快速測試您的 Telegram 收件匣"
},
"REAUTH": "重新授權",
"VIEW": "查看",
"EDIT": {
"API": {
"SUCCESS_MESSAGE": "已成功更新收件匣設定",
- "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "自動分配成功更新",
- "ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later."
+ "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "自動分配已成功更新",
+ "ERROR_MESSAGE": "無法更新收件匣設定,請稍後再試。"
},
"EMAIL_COLLECT_BOX": {
"ENABLED": "已啟用",
@@ -565,22 +565,22 @@
"DISABLED": "已停用"
},
"SENDER_NAME_SECTION": {
- "TITLE": "Sender name",
- "SUB_TEXT": "Select the name shown to your customer when they receive emails from your agents.",
- "FOR_EG": "For eg:",
+ "TITLE": "寄件者名稱",
+ "SUB_TEXT": "選擇客戶收到客服人員郵件時顯示的名稱。",
+ "FOR_EG": "例如:",
"FRIENDLY": {
- "TITLE": "Friendly",
- "FROM": "from",
- "SUBTITLE": "Add the name of the agent who sent the reply in the sender name to make it friendly."
+ "TITLE": "親切風格",
+ "FROM": "來自",
+ "SUBTITLE": "在寄件者名稱中加入回覆客服人員的姓名,使其更加親切。"
},
"PROFESSIONAL": {
- "TITLE": "Professional",
- "SUBTITLE": "Use only the configured business name as the sender name in the email header."
+ "TITLE": "專業風格",
+ "SUBTITLE": "僅使用已設定的企業名稱作為電子郵件標頭中的寄件者名稱。"
},
"BUSINESS_NAME": {
- "BUTTON_TEXT": "Configure your business name",
- "PLACEHOLDER": "Enter your business name",
- "SAVE_BUTTON_TEXT": "Save"
+ "BUTTON_TEXT": "設定您的企業名稱",
+ "PLACEHOLDER": "輸入您的企業名稱",
+ "SAVE_BUTTON_TEXT": "儲存"
}
},
"ALLOW_MESSAGES_AFTER_RESOLVED": {
@@ -592,10 +592,10 @@
"DISABLED": "已停用"
},
"LOCK_TO_SINGLE_CONVERSATION": {
- "ENABLED": "Reopen same conversation",
- "DISABLED": "Create new conversations",
- "ENABLED_DESCRIPTION": "When a contact messages again, the previous conversation will be reopened.",
- "DISABLED_DESCRIPTION": "A new conversation will be created each time after the previous one is resolved."
+ "ENABLED": "重新開啟同一對話",
+ "DISABLED": "建立新對話",
+ "ENABLED_DESCRIPTION": "當聯絡人再次傳送訊息時,將重新開啟先前的對話。",
+ "DISABLED_DESCRIPTION": "前一次對話解決後,每次都會建立新的對話。"
},
"ENABLE_HMAC": {
"LABEL": "啟用"
@@ -603,92 +603,92 @@
},
"DELETE": {
"BUTTON_TEXT": "刪除",
- "AVATAR_DELETE_BUTTON_TEXT": "刪除頭貼",
+ "AVATAR_DELETE_BUTTON_TEXT": "刪除頭像",
"CONFIRM": {
"TITLE": "確認刪除",
- "MESSAGE": "您確定要刪除吗? ",
+ "MESSAGE": "您確定要刪除嗎?",
"PLACE_HOLDER": "請輸入 {inboxName} 以確認",
- "YES": "是,刪除 ",
- "NO": "不,保留 "
+ "YES": "是,刪除",
+ "NO": "否,保留"
},
"API": {
- "SUCCESS_MESSAGE": "收件匣刪除成功",
- "ERROR_MESSAGE": "無法刪除收件匣。請稍後再試。",
- "AVATAR_SUCCESS_MESSAGE": "Inbox avatar deleted successfully",
- "AVATAR_ERROR_MESSAGE": "Could not delete the inbox avatar. Please try again later."
+ "SUCCESS_MESSAGE": "收件匣已成功刪除",
+ "ERROR_MESSAGE": "無法刪除收件匣,請稍後再試。",
+ "AVATAR_SUCCESS_MESSAGE": "收件匣頭像已成功刪除",
+ "AVATAR_ERROR_MESSAGE": "無法刪除收件匣頭像,請稍後再試。"
}
},
"TABS": {
"SETTINGS": "設定",
- "COLLABORATORS": "客服人員",
- "CONFIGURATION": "組態",
+ "COLLABORATORS": "協作人員",
+ "CONFIGURATION": "設定檔",
"CAMPAIGN": "行銷活動",
- "PRE_CHAT_FORM": "Pre Chat Form",
+ "PRE_CHAT_FORM": "聊天前表單",
"BUSINESS_HOURS": "服務時間",
- "WIDGET_BUILDER": "Widget Builder",
- "BOT_CONFIGURATION": "增機器人設定",
- "ACCOUNT_HEALTH": "Account Health",
- "CSAT": "顧客滿意度得分(CSAT)"
+ "WIDGET_BUILDER": "小工具建置器",
+ "BOT_CONFIGURATION": "機器人設定",
+ "ACCOUNT_HEALTH": "帳號健康狀態",
+ "CSAT": "CSAT"
},
- "CHANNEL_PREFERENCES": "Channel Preferences",
- "WIDGET_FEATURES": "Widget features",
+ "CHANNEL_PREFERENCES": "頻道偏好設定",
+ "WIDGET_FEATURES": "小工具功能",
"ACCOUNT_HEALTH": {
- "TITLE": "Manage your WhatsApp account",
- "DESCRIPTION": "Review your WhatsApp account status, messaging limits, and quality. Update settings or resolve issues if needed",
- "GO_TO_SETTINGS": "Go to Meta Business Manager",
- "NO_DATA": "Health data is not available",
+ "TITLE": "管理您的 WhatsApp 帳號",
+ "DESCRIPTION": "檢視您的 WhatsApp 帳號狀態、訊息限制和品質。如有需要,更新設定或解決問題。",
+ "GO_TO_SETTINGS": "前往 Meta Business Manager",
+ "NO_DATA": "無法取得健康狀態資料",
"FIELDS": {
"DISPLAY_PHONE_NUMBER": {
- "LABEL": "Display phone number",
- "TOOLTIP": "Phone number displayed to customers"
+ "LABEL": "顯示電話號碼",
+ "TOOLTIP": "顯示給客戶的電話號碼"
},
"VERIFIED_NAME": {
- "LABEL": "Business name",
- "TOOLTIP": "Business name verified by WhatsApp"
+ "LABEL": "企業名稱",
+ "TOOLTIP": "經 WhatsApp 驗證的企業名稱"
},
"DISPLAY_NAME_STATUS": {
- "LABEL": "Display name status",
- "TOOLTIP": "Status of your business name verification"
+ "LABEL": "顯示名稱狀態",
+ "TOOLTIP": "您的企業名稱驗證狀態"
},
"QUALITY_RATING": {
- "LABEL": "Quality rating",
- "TOOLTIP": "WhatsApp quality rating for your account"
+ "LABEL": "品質評分",
+ "TOOLTIP": "您帳號的 WhatsApp 品質評分"
},
"MESSAGING_LIMIT_TIER": {
- "LABEL": "Messaging limit tier",
- "TOOLTIP": "Daily messaging limit for your account"
+ "LABEL": "訊息限制等級",
+ "TOOLTIP": "您帳號的每日訊息限制"
},
"ACCOUNT_MODE": {
- "LABEL": "Account mode",
- "TOOLTIP": "Current operating mode of your WhatsApp account"
+ "LABEL": "帳號模式",
+ "TOOLTIP": "您的 WhatsApp 帳號目前的運作模式"
}
},
"VALUES": {
"TIERS": {
- "TIER_250": "250 customers per 24h",
- "TIER_1000": "1K customers per 24h",
- "TIER_1K": "1K customers per 24h",
- "TIER_10K": "10K customers per 24h",
- "TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h",
- "UNKNOWN": "Rating not available"
+ "TIER_250": "每 24 小時 250 位客戶",
+ "TIER_1000": "每 24 小時 1K 位客戶",
+ "TIER_1K": "每 24 小時 1K 位客戶",
+ "TIER_10K": "每 24 小時 10K 位客戶",
+ "TIER_100K": "每 24 小時 100K 位客戶",
+ "TIER_UNLIMITED": "每 24 小時不限客戶數",
+ "UNKNOWN": "評分不可用"
},
"STATUSES": {
- "APPROVED": "Approved",
- "PENDING_REVIEW": "Pending Review",
- "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
- "REJECTED": "Rejected",
- "DECLINED": "Declined",
- "NON_EXISTS": "Non exists"
+ "APPROVED": "已核准",
+ "PENDING_REVIEW": "審核中",
+ "AVAILABLE_WITHOUT_REVIEW": "無需審核即可使用",
+ "REJECTED": "已拒絕",
+ "DECLINED": "已駁回",
+ "NON_EXISTS": "不存在"
},
"MODES": {
- "SANDBOX": "Sandbox",
- "LIVE": "Live"
+ "SANDBOX": "沙箱模式",
+ "LIVE": "正式環境"
}
},
"WEBHOOK": {
"TITLE": "Webhook 設定",
- "DESCRIPTION": "您的 WhatsApp Business 帳號需要設定 Webhook URL,才能接收顧客傳送的訊息",
+ "DESCRIPTION": "您的 WhatsApp Business 帳號需要設定 Webhook URL,才能接收客戶訊息",
"ACTION_REQUIRED": "Webhook 尚未設定",
"REGISTER_BUTTON": "註冊 Webhook",
"REGISTER_SUCCESS": "Webhook 註冊成功",
@@ -699,294 +699,294 @@
},
"SETTINGS": "設定",
"FEATURES": {
- "LABEL": "Features",
+ "LABEL": "功能",
"DISPLAY_FILE_PICKER": "在小工具上顯示檔案選擇器",
- "DISPLAY_EMOJI_PICKER": "在小工具上顯示 emoji 選擇器",
- "ALLOW_END_CONVERSATION": "Allow users to end conversation from the widget",
- "USE_INBOX_AVATAR_FOR_BOT": "Use inbox name and avatar for the bot"
+ "DISPLAY_EMOJI_PICKER": "在小工具上顯示表情符號選擇器",
+ "ALLOW_END_CONVERSATION": "允許使用者從小工具結束對話",
+ "USE_INBOX_AVATAR_FOR_BOT": "使用收件匣名稱和頭像作為機器人顯示"
},
"SETTINGS_POPUP": {
- "MESSENGER_HEADING": "Messenger 脚本",
- "MESSENGER_SUB_HEAD": "將此按鈕放置在視窗標籤中",
+ "MESSENGER_HEADING": "Messenger 程式碼",
+ "MESSENGER_SUB_HEAD": "將此按鈕放置在 body 標籤中",
"ALLOWED_DOMAINS": {
- "TITLE": "Allowed Domains",
- "DESCRIPTION": "Restrict which websites can embed your chat widget. For security, only add domains you own and trust. Add one or more domains separated by commas. Leave blank to allow all domains (not recommended for production).",
+ "TITLE": "允許的網域",
+ "DESCRIPTION": "限制哪些網站可以嵌入您的聊天小工具。為了安全起見,請僅新增您擁有且信任的網域。輸入一個或多個網域,以逗號分隔。留空則允許所有網域(不建議在正式環境中使用)。",
"PLACEHOLDER": "example.com, www.example.com, app.example.com"
},
"ALLOW_MOBILE_WEBVIEW": {
- "LABEL": "Enable widget in mobile apps",
- "SUBTITLE": "Check this if you embed the widget in iOS or Android apps. Mobile apps don't send domain information, so they would be blocked by domain restrictions unless this is enabled."
+ "LABEL": "在行動應用程式中啟用小工具",
+ "SUBTITLE": "如果您將小工具嵌入 iOS 或 Android 應用程式,請勾選此項。行動應用程式不會發送網域資訊,因此除非啟用此選項,否則會被網域限制封鎖。"
},
"IDENTITY_VALIDATION": {
- "TITLE": "Identity Validation",
- "DESCRIPTION": "Verify user authenticity by generating secure tokens. This prevents unauthorized users from impersonating others in your chat.",
- "SECRET_KEY": "Secret Key",
- "VIEW_DOCS": "View documentation",
- "REQUIRE_LABEL": "Require identity validation for all conversations",
- "REQUIRE_DESCRIPTION": "When enabled, users must provide a valid identity token to start conversations. Requests without valid tokens will be rejected."
+ "TITLE": "身份驗證",
+ "DESCRIPTION": "透過產生安全 Token 來驗證使用者身份。這可以防止未授權使用者在您的聊天中冒充他人。",
+ "SECRET_KEY": "密鑰",
+ "VIEW_DOCS": "查看文件",
+ "REQUIRE_LABEL": "要求所有對話進行身份驗證",
+ "REQUIRE_DESCRIPTION": "啟用後,使用者必須提供有效的身份 Token 才能開始對話。未提供有效 Token 的請求將被拒絕。"
},
- "INBOX_AGENTS": "客服",
- "INBOX_AGENTS_SUB_TEXT": "新增或刪除此收件匣中的客服",
- "AGENT_ASSIGNMENT": "Conversation Assignment",
- "AGENT_ASSIGNMENT_SUB_TEXT": "Update conversation assignment settings",
+ "INBOX_AGENTS": "客服人員",
+ "INBOX_AGENTS_SUB_TEXT": "新增或移除此收件匣中的客服人員",
+ "AGENT_ASSIGNMENT": "對話分配",
+ "AGENT_ASSIGNMENT_SUB_TEXT": "更新對話分配設定",
"UPDATE": "更新",
- "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box",
- "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation",
+ "ENABLE_EMAIL_COLLECT_BOX": "啟用電子郵件收集框",
+ "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "在新對話中啟用或停用電子郵件收集框",
"AUTO_ASSIGNMENT": "啟用自動分配",
- "SENDER_NAME_SECTION": "Enable Agent Name in Email",
- "SENDER_NAME_SECTION_TEXT": "Enable/Disable showing Agent's name in email, if disabled it will show business name",
- "ENABLE_CONTINUITY_VIA_EMAIL": "Enable conversation continuity via email",
- "ENABLE_CONTINUITY_VIA_EMAIL_SUB_TEXT": "Conversations will continue over email if the contact email address is available.",
- "LOCK_TO_SINGLE_CONVERSATION": "Conversation Routing",
- "LOCK_TO_SINGLE_CONVERSATION_SUB_TEXT": "Configure conversation creation for existing contacts",
+ "SENDER_NAME_SECTION": "在郵件中啟用客服人員名稱",
+ "SENDER_NAME_SECTION_TEXT": "啟用/停用在郵件中顯示客服人員名稱,停用時將顯示企業名稱",
+ "ENABLE_CONTINUITY_VIA_EMAIL": "透過電子郵件啟用對話延續",
+ "ENABLE_CONTINUITY_VIA_EMAIL_SUB_TEXT": "若聯絡人有電子郵件地址,對話將透過電子郵件繼續。",
+ "LOCK_TO_SINGLE_CONVERSATION": "對話路由",
+ "LOCK_TO_SINGLE_CONVERSATION_SUB_TEXT": "設定現有聯絡人的對話建立方式",
"INBOX_UPDATE_TITLE": "收件匣設定",
- "INBOX_UPDATE_SUB_TEXT": "更新收件匣設定",
- "AUTO_ASSIGNMENT_SUB_TEXT": "啟用或停用此收件匣客服的對話自動分配。",
+ "INBOX_UPDATE_SUB_TEXT": "更新您的收件匣設定",
+ "AUTO_ASSIGNMENT_SUB_TEXT": "啟用或停用此收件匣客服人員的新對話自動分配。",
"HMAC_VERIFICATION": "使用者身份驗證",
- "HMAC_DESCRIPTION": "With this key you can generate a secret token that can be used to verify the identity of your users.",
- "HMAC_LINK_TO_DOCS": "You can read more here.",
- "HMAC_MANDATORY_VERIFICATION": "Enforce User Identity Validation",
- "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests that cannot be verified will be rejected.",
- "INBOX_IDENTIFIER": "Inbox Identifier",
- "INBOX_IDENTIFIER_SUB_TEXT": "Use the `inbox_identifier` token shown here to authentication your API clients.",
- "FORWARD_EMAIL_TITLE": "Forward to Email",
- "FORWARD_EMAIL_SUB_TEXT": "開始將您的電子信箱轉發到以下電子信箱地址。",
- "FORWARD_EMAIL_NOT_CONFIGURED": "Forwarding emails to your inbox is currently disabled on this installation. To use this feature, it must be enabled by your administrator. Please get in touch with them to proceed.",
- "ALLOW_MESSAGES_AFTER_RESOLVED": "Allow messages after conversation resolved",
- "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved.",
- "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.",
- "WHATSAPP_SECTION_UPDATE_SUBHEADER": "Enter the new API key to be used for the integration with the WhatsApp APIs.",
+ "HMAC_DESCRIPTION": "使用此金鑰,您可以產生用於驗證使用者身份的安全 Token。",
+ "HMAC_LINK_TO_DOCS": "您可以在此了解更多。",
+ "HMAC_MANDATORY_VERIFICATION": "強制使用者身份驗證",
+ "HMAC_MANDATORY_DESCRIPTION": "啟用後,無法驗證的請求將被拒絕。",
+ "INBOX_IDENTIFIER": "收件匣識別碼",
+ "INBOX_IDENTIFIER_SUB_TEXT": "使用此處顯示的 `inbox_identifier` Token 來驗證您的 API 用戶端。",
+ "FORWARD_EMAIL_TITLE": "轉寄電子郵件",
+ "FORWARD_EMAIL_SUB_TEXT": "開始將您的電子郵件轉寄至以下地址。",
+ "FORWARD_EMAIL_NOT_CONFIGURED": "此安裝環境目前未啟用郵件轉寄功能。若需使用此功能,請聯絡您的管理員啟用。",
+ "ALLOW_MESSAGES_AFTER_RESOLVED": "允許在對話解決後傳送訊息",
+ "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "允許終端使用者在對話已解決後仍能傳送訊息。",
+ "WHATSAPP_SECTION_SUBHEADER": "此 API Key 用於與 WhatsApp API 的整合。",
+ "WHATSAPP_SECTION_UPDATE_SUBHEADER": "輸入用於 WhatsApp API 整合的新 API Key。",
"WHATSAPP_SECTION_TITLE": "API Key",
"WHATSAPP_SECTION_UPDATE_TITLE": "更新 API Key",
"WHATSAPP_SECTION_UPDATE_PLACEHOLDER": "在此輸入新的 API Key",
"WHATSAPP_SECTION_UPDATE_BUTTON": "更新",
"WHATSAPP_EMBEDDED_SIGNUP_TITLE": "WhatsApp Embedded Signup",
- "WHATSAPP_EMBEDDED_SIGNUP_SUBHEADER": "This inbox is connected through WhatsApp embedded signup.",
- "WHATSAPP_EMBEDDED_SIGNUP_DESCRIPTION": "You can reconfigure this inbox to update your WhatsApp Business settings.",
- "WHATSAPP_RECONFIGURE_BUTTON": "Reconfigure",
- "WHATSAPP_CONNECT_TITLE": "Connect to WhatsApp Business",
- "WHATSAPP_CONNECT_SUBHEADER": "Upgrade to WhatsApp embedded signup for easier management.",
- "WHATSAPP_CONNECT_DESCRIPTION": "Connect this inbox to WhatsApp Business for enhanced features and easier management.",
+ "WHATSAPP_EMBEDDED_SIGNUP_SUBHEADER": "此收件匣透過 WhatsApp Embedded Signup 連接。",
+ "WHATSAPP_EMBEDDED_SIGNUP_DESCRIPTION": "您可以重新設定此收件匣以更新 WhatsApp Business 設定。",
+ "WHATSAPP_RECONFIGURE_BUTTON": "重新設定",
+ "WHATSAPP_CONNECT_TITLE": "連接到 WhatsApp Business",
+ "WHATSAPP_CONNECT_SUBHEADER": "升級至 WhatsApp Embedded Signup 以便於管理。",
+ "WHATSAPP_CONNECT_DESCRIPTION": "將此收件匣連接到 WhatsApp Business,以獲得進階功能和更便捷的管理。",
"WHATSAPP_CONNECT_BUTTON": "連接",
- "WHATSAPP_CONNECT_SUCCESS": "Successfully connected to WhatsApp Business!",
- "WHATSAPP_CONNECT_ERROR": "Failed to connect to WhatsApp Business. Please try again.",
- "WHATSAPP_RECONFIGURE_SUCCESS": "Successfully reconfigured WhatsApp Business!",
- "WHATSAPP_RECONFIGURE_ERROR": "Failed to reconfigure WhatsApp Business. Please try again.",
- "WHATSAPP_APP_ID_MISSING": "WhatsApp App ID is not configured. Please contact your administrator.",
- "WHATSAPP_CONFIG_ID_MISSING": "WhatsApp Configuration ID is not configured. Please contact your administrator.",
- "WHATSAPP_LOGIN_CANCELLED": "WhatsApp login was cancelled. Please try again.",
- "WHATSAPP_WEBHOOK_TITLE": "Webhook Verification Token",
- "WHATSAPP_WEBHOOK_SUBHEADER": "This token is used to verify the authenticity of the webhook endpoint.",
- "WHATSAPP_TEMPLATES_SYNC_TITLE": "Sync Templates",
- "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.",
- "UPDATE_PRE_CHAT_FORM_SETTINGS": "Update Pre Chat Form Settings"
+ "WHATSAPP_CONNECT_SUCCESS": "已成功連接到 WhatsApp Business!",
+ "WHATSAPP_CONNECT_ERROR": "連接 WhatsApp Business 失敗,請重試。",
+ "WHATSAPP_RECONFIGURE_SUCCESS": "已成功重新設定 WhatsApp Business!",
+ "WHATSAPP_RECONFIGURE_ERROR": "重新設定 WhatsApp Business 失敗,請重試。",
+ "WHATSAPP_APP_ID_MISSING": "WhatsApp App ID 尚未設定,請聯絡您的管理員。",
+ "WHATSAPP_CONFIG_ID_MISSING": "WhatsApp Configuration ID 尚未設定,請聯絡您的管理員。",
+ "WHATSAPP_LOGIN_CANCELLED": "WhatsApp 登入已取消,請重試。",
+ "WHATSAPP_WEBHOOK_TITLE": "Webhook 驗證 Token",
+ "WHATSAPP_WEBHOOK_SUBHEADER": "此 Token 用於驗證 Webhook 端點的真實性。",
+ "WHATSAPP_TEMPLATES_SYNC_TITLE": "同步範本",
+ "WHATSAPP_TEMPLATES_SYNC_SUBHEADER": "手動從 WhatsApp 同步訊息範本以更新可用範本。",
+ "WHATSAPP_TEMPLATES_SYNC_BUTTON": "同步範本",
+ "WHATSAPP_TEMPLATES_SYNC_SUCCESS": "範本同步已啟動。可能需要幾分鐘才能更新完成。",
+ "UPDATE_PRE_CHAT_FORM_SETTINGS": "更新聊天前表單設定"
},
"HELP_CENTER": {
- "LABEL": "Help Center",
- "PLACEHOLDER": "Select Help Center",
- "SELECT_PLACEHOLDER": "Select Help Center",
+ "LABEL": "幫助中心",
+ "PLACEHOLDER": "選擇幫助中心",
+ "SELECT_PLACEHOLDER": "選擇幫助中心",
"NONE": "無",
- "REMOVE": "Remove Help Center",
- "SUB_TEXT": "Attach a Help Center with the inbox"
+ "REMOVE": "移除幫助中心",
+ "SUB_TEXT": "將幫助中心連結到此收件匣"
},
"AUTO_ASSIGNMENT": {
- "MAX_ASSIGNMENT_LIMIT": "Auto assignment limit",
- "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Please enter a value greater than 0",
- "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limit the maximum number of conversations from this inbox that can be auto assigned to an agent"
+ "MAX_ASSIGNMENT_LIMIT": "自動分配上限",
+ "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "請輸入大於 0 的值",
+ "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "限制此收件匣可自動分配給單一客服人員的最大對話數"
},
"ASSIGNMENT": {
- "TITLE": "Conversation Assignment",
- "DESCRIPTION": "Automatically assign incoming conversations to available agents based on assignment policies",
- "ENABLE_AUTO_ASSIGNMENT": "Enable automatic conversation assignment",
- "DEFAULT_RULES_TITLE": "Default assignment rules",
- "DEFAULT_RULES_DESCRIPTION": "Using the default assignment behavior for all conversations",
- "DEFAULT_RULE_1": "Earliest created conversations first",
- "DEFAULT_RULE_2": "Round robin distribution",
- "CUSTOMIZE_WITH_POLICY": "Customize with assignment policy",
- "USING_POLICY": "Using custom assignment policy for this inbox",
- "CUSTOMIZE_POLICY": "Customize with assignment policy",
- "DELETE_POLICY": "Delete policy",
- "POLICY_LABEL": "Assignment policy",
- "ASSIGNMENT_ORDER_LABEL": "Assignment Order",
- "ASSIGNMENT_METHOD_LABEL": "Assignment Method",
+ "TITLE": "對話分配",
+ "DESCRIPTION": "根據分配策略,自動將新對話分配給可用的客服人員",
+ "ENABLE_AUTO_ASSIGNMENT": "啟用自動對話分配",
+ "DEFAULT_RULES_TITLE": "預設分配規則",
+ "DEFAULT_RULES_DESCRIPTION": "對所有對話使用預設分配行為",
+ "DEFAULT_RULE_1": "優先處理最早建立的對話",
+ "DEFAULT_RULE_2": "輪流分配",
+ "CUSTOMIZE_WITH_POLICY": "使用分配策略自訂",
+ "USING_POLICY": "此收件匣使用自訂分配策略",
+ "CUSTOMIZE_POLICY": "使用分配策略自訂",
+ "DELETE_POLICY": "刪除策略",
+ "POLICY_LABEL": "分配策略",
+ "ASSIGNMENT_ORDER_LABEL": "分配順序",
+ "ASSIGNMENT_METHOD_LABEL": "分配方式",
"POLICY_STATUS": {
- "ACTIVE": "Active",
- "INACTIVE": "Inactive"
+ "ACTIVE": "啟用中",
+ "INACTIVE": "已停用"
},
"PRIORITY": {
- "EARLIEST_CREATED": "Earliest created",
- "LONGEST_WAITING": "Longest waiting"
+ "EARLIEST_CREATED": "最早建立",
+ "LONGEST_WAITING": "等待最久"
},
"METHOD": {
- "ROUND_ROBIN": "Round robin",
- "BALANCED": "Balanced assignment"
+ "ROUND_ROBIN": "輪流分配",
+ "BALANCED": "均衡分配"
},
- "UPGRADE_PROMPT": "Custom assignment policies are available on the Business plan",
- "UPGRADE_TO_BUSINESS": "Upgrade to Business",
- "DEFAULT_POLICY_LINKED": "Default policy linked",
- "DEFAULT_POLICY_DESCRIPTION": "Link a custom assignment policy to customize how conversations are assigned to agents in this inbox.",
- "LINK_EXISTING_POLICY": "Link existing policy",
- "CREATE_NEW_POLICY": "Create new policy",
- "NO_POLICIES": "No assignment policies found",
- "VIEW_ALL_POLICIES": "View all policies",
- "CURRENT_BEHAVIOR": "Currently using default assignment behavior:",
- "LINK_SUCCESS": "Assignment policy linked successfully",
- "LINK_ERROR": "Failed to link assignment policy"
+ "UPGRADE_PROMPT": "自訂分配策略適用於 Business 方案",
+ "UPGRADE_TO_BUSINESS": "升級至 Business",
+ "DEFAULT_POLICY_LINKED": "已連結預設策略",
+ "DEFAULT_POLICY_DESCRIPTION": "連結自訂分配策略,以自訂此收件匣中對話分配給客服人員的方式。",
+ "LINK_EXISTING_POLICY": "連結現有策略",
+ "CREATE_NEW_POLICY": "建立新策略",
+ "NO_POLICIES": "找不到分配策略",
+ "VIEW_ALL_POLICIES": "查看所有策略",
+ "CURRENT_BEHAVIOR": "目前使用預設分配行為:",
+ "LINK_SUCCESS": "已成功連結分配策略",
+ "LINK_ERROR": "連結分配策略失敗"
},
"ASSIGNMENT_POLICY": {
- "DELETE_CONFIRM_TITLE": "Delete assignment policy?",
- "DELETE_CONFIRM_MESSAGE": "Are you sure you want to remove this assignment policy from this inbox? The inbox will revert to default assignment rules.",
+ "DELETE_CONFIRM_TITLE": "要刪除分配策略嗎?",
+ "DELETE_CONFIRM_MESSAGE": "您確定要從此收件匣移除此分配策略嗎?收件匣將恢復為預設分配規則。",
"CANCEL": "取消",
"CONFIRM_DELETE": "刪除",
- "DELETE_SUCCESS": "Assignment policy removed successfully",
- "DELETE_ERROR": "Failed to remove assignment policy"
+ "DELETE_SUCCESS": "已成功移除分配策略",
+ "DELETE_ERROR": "移除分配策略失敗"
},
"FACEBOOK_REAUTHORIZE": {
"TITLE": "重新授權",
- "SUBTITLE": "Your Facebook connection has expired, please reconnect your Facebook page to continue services",
- "MESSAGE_SUCCESS": "重新連接成功",
- "MESSAGE_ERROR": "出現錯誤,請重試"
+ "SUBTITLE": "您的 Facebook 連線已過期,請重新連結 Facebook 粉絲專頁以繼續服務",
+ "MESSAGE_SUCCESS": "重新連線成功",
+ "MESSAGE_ERROR": "發生錯誤,請重試"
},
"PRE_CHAT_FORM": {
- "DESCRIPTION": "Pre chat forms enable you to capture user information before they start conversation with you.",
- "SET_FIELDS": "Pre chat form fields",
+ "DESCRIPTION": "聊天前表單可讓您在客戶開始對話之前收集其資訊。",
+ "SET_FIELDS": "聊天前表單欄位",
"SET_FIELDS_HEADER": {
- "FIELDS": "Fields",
- "LABEL": "Label",
- "PLACE_HOLDER": "Placeholder",
- "KEY": "Key",
- "TYPE": "類別",
- "REQUIRED": "Required"
+ "FIELDS": "欄位",
+ "LABEL": "標籤",
+ "PLACE_HOLDER": "預設文字",
+ "KEY": "鍵值",
+ "TYPE": "類型",
+ "REQUIRED": "必填"
},
"ENABLE": {
- "LABEL": "Enable pre chat form",
+ "LABEL": "啟用聊天前表單",
"OPTIONS": {
"ENABLED": "是",
"DISABLED": "否"
}
},
"PRE_CHAT_MESSAGE": {
- "LABEL": "Pre chat message",
- "PLACEHOLDER": "This message would be visible to the users along with the form"
+ "LABEL": "聊天前訊息",
+ "PLACEHOLDER": "此訊息將與表單一起顯示給使用者"
},
"REQUIRE_EMAIL": {
- "LABEL": "Visitors should provide their name and email address before starting the chat"
+ "LABEL": "訪客在開始聊天前須提供姓名和電子郵件地址"
}
},
"CSAT": {
- "TITLE": "Enable CSAT",
- "SUBTITLE": "Automatically trigger CSAT surveys at the end of conversations to understand how customers feel about their support experience. Track satisfaction trends and identify areas for improvement over time.",
+ "TITLE": "啟用 CSAT",
+ "SUBTITLE": "在對話結束時自動觸發 CSAT 滿意度調查,了解客戶對支援體驗的感受。追蹤滿意度趨勢,找出需要改善的地方。",
"DISPLAY_TYPE": {
- "LABEL": "Display type"
+ "LABEL": "顯示類型"
},
"MESSAGE": {
"LABEL": "訊息",
- "PLACEHOLDER": "Please enter a message to show users with the form"
+ "PLACEHOLDER": "請輸入要與表單一起顯示給使用者的訊息"
},
"BUTTON_TEXT": {
- "LABEL": "Button text",
- "PLACEHOLDER": "Please rate us"
+ "LABEL": "按鈕文字",
+ "PLACEHOLDER": "請為我們評分"
},
"LANGUAGE": {
- "LABEL": "Language",
- "PLACEHOLDER": "Select template language"
+ "LABEL": "語言",
+ "PLACEHOLDER": "選擇範本語言"
},
"MESSAGE_PREVIEW": {
- "LABEL": "Message preview",
- "TOOLTIP": "This may vary slightly when rendered on WhatsApp's platform."
+ "LABEL": "訊息預覽",
+ "TOOLTIP": "在 WhatsApp 平台上呈現時可能會略有不同。"
},
"TEMPLATE_STATUS": {
- "APPROVED": "Approved by WhatsApp",
- "PENDING": "Pending WhatsApp approval",
- "REJECTED": "Meta rejected the template",
- "DEFAULT": "Needs WhatsApp approval",
- "NOT_FOUND": "The template does not exist in the Meta platform."
+ "APPROVED": "已獲 WhatsApp 核准",
+ "PENDING": "待 WhatsApp 審核中",
+ "REJECTED": "Meta 已拒絕此範本",
+ "DEFAULT": "需要 WhatsApp 審核",
+ "NOT_FOUND": "此範本在 Meta 平台上不存在。"
},
"TEMPLATE_CREATION": {
- "SUCCESS_MESSAGE": "WhatsApp template created successfully and sent for approval",
- "ERROR_MESSAGE": "Failed to create WhatsApp template"
+ "SUCCESS_MESSAGE": "WhatsApp 範本已成功建立並送出審核",
+ "ERROR_MESSAGE": "建立 WhatsApp 範本失敗"
},
"TEMPLATE_UPDATE_DIALOG": {
- "TITLE": "Edit survey details",
- "DESCRIPTION": "We will delete the previous template and make a new one which will be sent again for WhatsApp approval",
- "CONFIRM": "Create new template",
+ "TITLE": "編輯問卷調查詳情",
+ "DESCRIPTION": "我們將刪除先前的範本並建立新範本,新範本將再次送交 WhatsApp 審核",
+ "CONFIRM": "建立新範本",
"CANCEL": "返回"
},
"UTILITY_ANALYZER": {
- "ACTION": "Check utility fit",
- "HELPER_NOTE": "Check this message before submission to improve Utility fit. The system creates a dedicated CSAT template with buttons for reporting and submits it as Utility; Meta may still reclassify it as Marketing based on content.",
- "RESULT_LABEL": "Meta category prediction",
- "GUIDANCE_NOTE": "This is a guidance check, not a guarantee of Meta approval.",
- "SUGGESTION_LABEL": "Suggested utility-safe rewrite",
- "APPLY": "Use this rewrite",
- "ERROR_MESSAGE": "Couldn't analyze the message. Please try again.",
+ "ACTION": "檢查 Utility 適配性",
+ "HELPER_NOTE": "在送出前檢查此訊息以改善 Utility 適配性。系統會建立包含報告按鈕的專用 CSAT 範本,並以 Utility 類型送出;Meta 仍可能根據內容將其重新分類為 Marketing。",
+ "RESULT_LABEL": "Meta 分類預測",
+ "GUIDANCE_NOTE": "這是指引性檢查,不保證 Meta 一定會核准。",
+ "SUGGESTION_LABEL": "建議的 Utility 安全改寫",
+ "APPLY": "使用此改寫",
+ "ERROR_MESSAGE": "無法分析訊息,請重試。",
"CLASSIFICATION": {
- "LIKELY_UTILITY": "Likely Utility",
- "LIKELY_MARKETING": "Likely Marketing",
- "UNCLEAR": "Needs clarification"
+ "LIKELY_UTILITY": "可能為 Utility",
+ "LIKELY_MARKETING": "可能為 Marketing",
+ "UNCLEAR": "需要進一步釐清"
}
},
"SURVEY_RULE": {
- "LABEL": "Survey rule",
- "DESCRIPTION_PREFIX": "Send the survey if the conversation",
- "DESCRIPTION_SUFFIX": "any of the labels",
+ "LABEL": "問卷規則",
+ "DESCRIPTION_PREFIX": "在對話",
+ "DESCRIPTION_SUFFIX": "任一標籤時發送問卷",
"OPERATOR": {
"CONTAINS": "包含",
"DOES_NOT_CONTAINS": "不包含"
},
- "SELECT_PLACEHOLDER": "select labels"
+ "SELECT_PLACEHOLDER": "選擇標籤"
},
- "NOTE": "Note: CSAT surveys are sent only once per conversation",
- "WHATSAPP_NOTE": "Note: When you save, the system creates a dedicated CSAT template in WhatsApp (used to capture rating and feedback in reports) and submits it as Utility for approval. Meta may still classify it as Marketing based on content. After approval, surveys are sent only once per conversation as per the survey rule.",
+ "NOTE": "注意:CSAT 問卷每次對話僅發送一次",
+ "WHATSAPP_NOTE": "注意:儲存後,系統會在 WhatsApp 中建立專用的 CSAT 範本(用於在報告中收集評分和回饋),並以 Utility 類型送出審核。Meta 仍可能根據內容將其分類為 Marketing。核准後,問卷將依據問卷規則,每次對話僅發送一次。",
"API": {
- "SUCCESS_MESSAGE": "CSAT settings updated successfully",
- "ERROR_MESSAGE": "We couldn't update CSAT settings. Please try again later."
+ "SUCCESS_MESSAGE": "CSAT 設定已成功更新",
+ "ERROR_MESSAGE": "無法更新 CSAT 設定,請稍後再試。"
}
},
"BUSINESS_HOURS": {
- "TITLE": "設定你的服務時間",
- "SUBTITLE": "為你的 livechat 小工具設定服務時間",
- "WEEKLY_TITLE": "Set your weekly hours",
+ "TITLE": "設定您的服務時間",
+ "SUBTITLE": "在即時聊天小工具上設定您的服務時間",
+ "WEEKLY_TITLE": "設定每週服務時間",
"TIMEZONE_LABEL": "選擇時區",
"UPDATE": "更新服務時間設定",
- "TOGGLE_AVAILABILITY": "啟用收件匣可用服務時間",
- "UNAVAILABLE_MESSAGE_LABEL": "Unavailable message for visitors",
- "TOGGLE_HELP": "Enabling business availability will show the available hours on live chat widget even if all the agents are offline. Outside available hours visitors can be warned with a message and a pre-chat form.",
+ "TOGGLE_AVAILABILITY": "啟用此收件匣的服務時間",
+ "UNAVAILABLE_MESSAGE_LABEL": "訪客不可用時的訊息",
+ "TOGGLE_HELP": "啟用服務時間後,即使所有客服人員都離線,也會在即時聊天小工具上顯示可用時間。在非服務時間,訪客將會看到提示訊息和聊天前表單。",
"DAY": {
- "DAY": "Day",
- "AVAILABILITY": "有效的",
- "HOURS": "Hours",
- "ENABLE": "Enable availability for this day",
- "UNAVAILABLE": "無法使用",
- "VALIDATION_ERROR": "開始時間必須在關閉時間之前",
+ "DAY": "日",
+ "AVAILABILITY": "服務狀態",
+ "HOURS": "時間",
+ "ENABLE": "啟用此日的服務時間",
+ "UNAVAILABLE": "不可用",
+ "VALIDATION_ERROR": "開始時間必須早於結束時間。",
"CHOOSE": "選擇"
},
- "ALL_DAY": "All-Day"
+ "ALL_DAY": "全天"
},
"IMAP": {
"TITLE": "IMAP",
- "SUBTITLE": "Set your IMAP details",
- "NOTE_TEXT": "To enable SMTP, please configure IMAP.",
- "UPDATE": "Update IMAP settings",
- "TOGGLE_AVAILABILITY": "Enable IMAP configuration for this inbox",
- "TOGGLE_HELP": "Enabling IMAP will help the user to receive email",
+ "SUBTITLE": "設定您的 IMAP 資訊",
+ "NOTE_TEXT": "若要啟用 SMTP,請先設定 IMAP。",
+ "UPDATE": "更新 IMAP 設定",
+ "TOGGLE_AVAILABILITY": "為此收件匣啟用 IMAP 設定",
+ "TOGGLE_HELP": "啟用 IMAP 將可接收電子郵件",
"EDIT": {
- "SUCCESS_MESSAGE": "IMAP settings updated successfully",
- "ERROR_MESSAGE": "Unable to update IMAP settings"
+ "SUCCESS_MESSAGE": "IMAP 設定已成功更新",
+ "ERROR_MESSAGE": "無法更新 IMAP 設定"
},
"ADDRESS": {
- "LABEL": "Address",
- "PLACE_HOLDER": "Address (Eg: imap.gmail.com)"
+ "LABEL": "位址",
+ "PLACE_HOLDER": "位址(例:imap.gmail.com)"
},
"PORT": {
- "LABEL": "Port",
- "PLACE_HOLDER": "Port"
+ "LABEL": "連接埠",
+ "PLACE_HOLDER": "連接埠"
},
"LOGIN": {
- "LABEL": "登入",
- "PLACE_HOLDER": "登入"
+ "LABEL": "登入帳號",
+ "PLACE_HOLDER": "登入帳號"
},
"PASSWORD": {
"LABEL": "密碼",
@@ -996,107 +996,107 @@
},
"MICROSOFT": {
"TITLE": "Microsoft",
- "SUBTITLE": "Reauthorize your MICROSOFT account"
+ "SUBTITLE": "重新授權您的 Microsoft 帳號"
},
"SMTP": {
"TITLE": "SMTP",
- "SUBTITLE": "設定你的 SMTP",
+ "SUBTITLE": "設定您的 SMTP 資訊",
"UPDATE": "更新 SMTP 設定",
- "TOGGLE_AVAILABILITY": "Enable SMTP configuration for this inbox",
- "TOGGLE_HELP": "Enabling SMTP will help the user to send email",
+ "TOGGLE_AVAILABILITY": "為此收件匣啟用 SMTP 設定",
+ "TOGGLE_HELP": "啟用 SMTP 將可發送電子郵件",
"EDIT": {
- "SUCCESS_MESSAGE": "SMTP settings updated successfully",
- "ERROR_MESSAGE": "Unable to update SMTP settings"
+ "SUCCESS_MESSAGE": "SMTP 設定已成功更新",
+ "ERROR_MESSAGE": "無法更新 SMTP 設定"
},
"ADDRESS": {
- "LABEL": "Address",
- "PLACE_HOLDER": "Address (Eg: smtp.gmail.com)"
+ "LABEL": "位址",
+ "PLACE_HOLDER": "位址(例:smtp.gmail.com)"
},
"PORT": {
- "LABEL": "Port",
- "PLACE_HOLDER": "Port"
+ "LABEL": "連接埠",
+ "PLACE_HOLDER": "連接埠"
},
"LOGIN": {
- "LABEL": "登入",
- "PLACE_HOLDER": "登入"
+ "LABEL": "登入帳號",
+ "PLACE_HOLDER": "登入帳號"
},
"PASSWORD": {
"LABEL": "密碼",
"PLACE_HOLDER": "密碼"
},
"DOMAIN": {
- "LABEL": "Domain",
- "PLACE_HOLDER": "Domain"
+ "LABEL": "網域",
+ "PLACE_HOLDER": "網域"
},
- "ENCRYPTION": "Encryption",
+ "ENCRYPTION": "加密方式",
"SSL_TLS": "SSL/TLS",
"START_TLS": "STARTTLS",
- "OPEN_SSL_VERIFY_MODE": "Open SSL Verify Mode",
- "AUTH_MECHANISM": "Authentication"
+ "OPEN_SSL_VERIFY_MODE": "Open SSL 驗證模式",
+ "AUTH_MECHANISM": "驗證機制"
},
- "NOTE": "Note: ",
+ "NOTE": "注意:",
"WIDGET_BUILDER": {
"WIDGET_OPTIONS": {
"AVATAR": {
- "LABEL": "Website Avatar",
+ "LABEL": "網站頭像",
"DELETE": {
"API": {
- "SUCCESS_MESSAGE": "Avatar deleted successfully",
- "ERROR_MESSAGE": "出現錯誤,請重試"
+ "SUCCESS_MESSAGE": "頭像已成功刪除",
+ "ERROR_MESSAGE": "發生錯誤,請重試"
}
}
},
"WEBSITE_NAME": {
"LABEL": "網站名稱",
- "PLACE_HOLDER": "輸入您的網站名稱 (e.g: Acme Inc)",
- "ERROR": "Please enter a valid website name"
+ "PLACE_HOLDER": "輸入您的網站名稱(例:Acme Inc)",
+ "ERROR": "請輸入有效的網站名稱"
},
"WELCOME_HEADING": {
- "LABEL": "歡迎標題:",
- "PLACE_HOLDER": "Hi there!"
+ "LABEL": "歡迎標題",
+ "PLACE_HOLDER": "您好!"
},
"WELCOME_TAGLINE": {
- "LABEL": "歡迎標籤行",
- "PLACE_HOLDER": "如有疑問,請聯繫我們"
+ "LABEL": "歡迎副標題",
+ "PLACE_HOLDER": "我們讓溝通變得簡單。歡迎提出任何問題,或分享您的意見。"
},
"REPLY_TIME": {
- "LABEL": "Reply Time",
+ "LABEL": "回覆時間",
"IN_A_FEW_MINUTES": "幾分鐘內",
"IN_A_FEW_HOURS": "幾小時內",
"IN_A_DAY": "一天內"
},
- "WIDGET_COLOR_LABEL": "視窗小元件顏色",
- "WIDGET_BUBBLE": "Bubble",
- "WIDGET_BUBBLE_POSITION_LABEL": "Position:",
- "WIDGET_BUBBLE_TYPE_LABEL": "類別:",
+ "WIDGET_COLOR_LABEL": "小工具顏色",
+ "WIDGET_BUBBLE": "氣泡",
+ "WIDGET_BUBBLE_POSITION_LABEL": "位置:",
+ "WIDGET_BUBBLE_TYPE_LABEL": "類型:",
"WIDGET_BUBBLE_LAUNCHER_TITLE": {
"DEFAULT": "與我們對話",
- "LABEL": "Launcher Title",
+ "LABEL": "啟動器標題",
"PLACE_HOLDER": "與我們對話"
},
"UPDATE": {
- "BUTTON_TEXT": "Update Widget Settings",
+ "BUTTON_TEXT": "更新小工具設定",
"API": {
- "SUCCESS_MESSAGE": "Widget settings updated successfully",
- "ERROR_MESSAGE": "Unable to update widget settings"
+ "SUCCESS_MESSAGE": "小工具設定已成功更新",
+ "ERROR_MESSAGE": "無法更新小工具設定"
}
},
"WIDGET_VIEW_OPTION": {
- "PREVIEW": "Preview",
- "SCRIPT": "Script"
+ "PREVIEW": "預覽",
+ "SCRIPT": "程式碼"
},
"WIDGET_BUBBLE_POSITION": {
- "LEFT": "Left",
- "RIGHT": "Right"
+ "LEFT": "左側",
+ "RIGHT": "右側"
},
"WIDGET_BUBBLE_TYPE": {
- "STANDARD": "Standard",
- "EXPANDED_BUBBLE": "Expanded Bubble"
+ "STANDARD": "標準",
+ "EXPANDED_BUBBLE": "展開氣泡"
}
},
"WIDGET_SCREEN": {
- "DEFAULT": "Default",
- "CHAT": "Chat mode"
+ "DEFAULT": "預設",
+ "CHAT": "聊天模式"
},
"REPLY_TIME": {
"IN_A_FEW_MINUTES": "通常在幾分鐘內回覆",
@@ -1105,15 +1105,15 @@
},
"FOOTER": {
"START_CONVERSATION_BUTTON_TEXT": "開始對話",
- "CHAT_INPUT_PLACEHOLDER": "輸入你的訊息"
+ "CHAT_INPUT_PLACEHOLDER": "輸入您的訊息"
},
"BODY": {
"TEAM_AVAILABILITY": {
- "ONLINE": "We are Online",
+ "ONLINE": "我們在線上",
"OFFLINE": "我們目前不在線上"
},
- "USER_MESSAGE": "Hi",
- "AGENT_MESSAGE": "Hello"
+ "USER_MESSAGE": "您好",
+ "AGENT_MESSAGE": "哈囉"
},
"BRANDING_TEXT": "Powered by Chatwoot",
"SCRIPT_SETTINGS": "\n window.chatwootSettings = {options};"
@@ -1121,31 +1121,31 @@
"EMAIL_PROVIDERS": {
"MICROSOFT": {
"TITLE": "Microsoft",
- "DESCRIPTION": "Connect with Microsoft"
+ "DESCRIPTION": "連結 Microsoft"
},
"GOOGLE": {
"TITLE": "Google",
- "DESCRIPTION": "Connect with Google"
+ "DESCRIPTION": "連結 Google"
},
"OTHER_PROVIDERS": {
- "TITLE": "Other Providers",
- "DESCRIPTION": "Connect with Other Providers"
+ "TITLE": "其他供應商",
+ "DESCRIPTION": "連結其他供應商"
}
},
"CHANNELS": {
"MESSENGER": "Messenger",
- "WEB_WIDGET": "Website",
+ "WEB_WIDGET": "網站",
"TWITTER_PROFILE": "Twitter",
"TWILIO_SMS": "Twilio SMS",
"WHATSAPP": "WhatsApp",
"SMS": "SMS",
"EMAIL": "Email",
"TELEGRAM": "Telegram",
- "LINE": "Line",
+ "LINE": "LINE",
"API": "API 頻道",
"INSTAGRAM": "Instagram",
"TIKTOK": "TikTok",
- "VOICE": "Voice"
+ "VOICE": "語音"
}
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/integrationApps.json b/app/javascript/dashboard/i18n/locale/zh_TW/integrationApps.json
index e18711ae0..e88d80e13 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/integrationApps.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/integrationApps.json
@@ -1,38 +1,38 @@
{
"INTEGRATION_APPS": {
- "FETCHING": "Fetching Integrations",
- "NO_HOOK_CONFIGURED": "There are no {integrationId} integrations configured in this account.",
- "HEADER": "Applications",
- "COUNT": "{n} integration | {n} integrations",
- "SEARCH_PLACEHOLDER": "Search...",
- "NO_RESULTS": "No results found matching your search",
+ "FETCHING": "正在取得整合",
+ "NO_HOOK_CONFIGURED": "此帳戶中尚未設定 {integrationId} 整合。",
+ "HEADER": "應用程式",
+ "COUNT": "{n} 個整合 | {n} 個整合",
+ "SEARCH_PLACEHOLDER": "搜尋...",
+ "NO_RESULTS": "找不到符合搜尋條件的結果",
"STATUS": {
"ENABLED": "已啟用",
"DISABLED": "已停用"
},
- "CONFIGURE": "配置",
- "ADD_BUTTON": "Add a new hook",
+ "CONFIGURE": "設定",
+ "ADD_BUTTON": "新增掛鉤",
"DELETE": {
"TITLE": {
"INBOX": "刪除確認",
- "ACCOUNT": "取消連結"
+ "ACCOUNT": "取消連接"
},
"MESSAGE": {
"INBOX": "您確定要刪除嗎?",
- "ACCOUNT": "您確定要取消連結嗎?"
+ "ACCOUNT": "您確定要取消連接嗎?"
},
"CONFIRM_BUTTON_TEXT": {
"INBOX": "是,刪除",
- "ACCOUNT": "是的,取消連結"
+ "ACCOUNT": "是,取消連接"
},
"CANCEL_BUTTON_TEXT": "取消",
"API": {
- "SUCCESS_MESSAGE": "Hook deleted successfully",
+ "SUCCESS_MESSAGE": "掛鉤刪除成功",
"ERROR_MESSAGE": "無法連接伺服器,請稍後再試"
}
},
"LIST": {
- "FETCHING": "Fetching integration hooks",
+ "FETCHING": "正在取得整合掛鉤",
"INBOX": "收件匣",
"ACTIONS": "操作",
"DELETE": {
@@ -49,7 +49,7 @@
"CANCEL": "取消"
},
"API": {
- "SUCCESS_MESSAGE": "Integration hook added successfully",
+ "SUCCESS_MESSAGE": "整合掛鉤新增成功",
"ERROR_MESSAGE": "無法連接伺服器,請稍後再試"
}
},
@@ -57,10 +57,10 @@
"BUTTON_TEXT": "連接"
},
"DISCONNECT": {
- "BUTTON_TEXT": "取消連結"
+ "BUTTON_TEXT": "取消連接"
},
"SIDEBAR_DESCRIPTION": {
- "DIALOGFLOW": "Dialogflow is a natural language processing platform for building conversational interfaces. Integrating it with {installationName} lets bots handle queries first and transfer them to agents when needed. It helps qualify leads and reduce agent workload by answering FAQs. To add Dialogflow, create a Service Account in Google Console and share the credentials. Refer to the docs for details"
+ "DIALOGFLOW": "Dialogflow 是一個用於建立對話介面的自然語言處理平台。將其與 {installationName} 整合後,機器人可以先處理查詢,並在需要時將其轉接給客服。它有助於篩選潛在客戶,並透過回答常見問題來減輕客服的工作量。若要新增 Dialogflow,請在 Google Console 中建立服務帳戶並分享憑證。詳情請參閱文件"
}
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json b/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json
index d7095b8f4..e6b518be4 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json
@@ -3,117 +3,117 @@
"SHOPIFY": {
"HEADER": "Shopify",
"DELETE": {
- "TITLE": "Delete Shopify Integration",
- "MESSAGE": "Are you sure you want to delete the Shopify integration?"
+ "TITLE": "刪除 Shopify 整合",
+ "MESSAGE": "您確定要刪除 Shopify 整合嗎?"
},
"STORE_URL": {
- "TITLE": "Connect Shopify Store",
- "LABEL": "Store URL",
+ "TITLE": "連接 Shopify 商店",
+ "LABEL": "商店網址",
"PLACEHOLDER": "your-store.myshopify.com",
- "HELP": "Enter your Shopify store's myshopify.com URL",
+ "HELP": "請輸入您的 Shopify 商店的 myshopify.com 網址",
"CANCEL": "取消",
- "SUBMIT": "Connect Store"
+ "SUBMIT": "連接商店"
},
- "ERROR": "There was an error connecting to Shopify. Please try again or contact support if the issue persists."
+ "ERROR": "連接 Shopify 時發生錯誤。請重試,若問題持續存在,請聯繫支援團隊。"
},
- "HEADER": "整合方式",
- "DESCRIPTION": "Chatwoot integrates with multiple tools and services to improve your team's efficiency. Explore the list below to configure your favorite apps.",
- "LEARN_MORE": "Learn more about integrations",
- "LOADING": "Fetching integrations",
- "SEARCH_PLACEHOLDER": "Search integrations...",
- "NO_RESULTS": "No integrations found matching your search",
+ "HEADER": "整合",
+ "DESCRIPTION": "Chatwoot 可與多種工具和服務整合,以提升團隊效率。請瀏覽以下列表來設定您常用的應用程式。",
+ "LEARN_MORE": "進一步瞭解整合功能",
+ "LOADING": "正在取得整合資訊",
+ "SEARCH_PLACEHOLDER": "搜尋整合...",
+ "NO_RESULTS": "找不到符合搜尋條件的整合",
"CAPTAIN": {
- "DISABLED": "Captain is not enabled on your account.",
- "CLICK_HERE_TO_CONFIGURE": "Click here to configure",
- "LOADING_CONSOLE": "Loading Captain Console...",
- "FAILED_TO_LOAD_CONSOLE": "Failed to load Captain Console. Please refresh and try again."
+ "DISABLED": "您的帳戶尚未啟用 Captain。",
+ "CLICK_HERE_TO_CONFIGURE": "點此進行設定",
+ "LOADING_CONSOLE": "正在載入 Captain 控制台...",
+ "FAILED_TO_LOAD_CONSOLE": "無法載入 Captain 控制台。請重新整理頁面後再試一次。"
},
"WEBHOOK": {
- "SUBSCRIBED_EVENTS": "Subscribed Events",
- "LEARN_MORE": "Learn more about webhooks",
+ "SUBSCRIBED_EVENTS": "已訂閱的事件",
+ "LEARN_MORE": "進一步瞭解 webhook",
"SECRET": {
- "LABEL": "Secret",
- "COPY": "Copy secret to clipboard",
- "COPY_SUCCESS": "Secret copied to clipboard",
- "TOGGLE": "Toggle secret visibility",
- "CREATED_DESC": "Your webhook has been created. Use the secret below to verify webhook signatures. Please copy it now — you can also find it later in the webhook edit form.",
- "DONE": "Done"
+ "LABEL": "密鑰",
+ "COPY": "複製密鑰至剪貼簿",
+ "COPY_SUCCESS": "密鑰已複製至剪貼簿",
+ "TOGGLE": "切換密鑰顯示",
+ "CREATED_DESC": "您的 webhook 已建立。請使用以下密鑰來驗證 webhook 簽章。請立即複製——您也可以稍後在 webhook 編輯表單中找到它。",
+ "DONE": "完成"
},
- "COUNT": "{n} webhook | {n} webhooks",
- "SEARCH_PLACEHOLDER": "Search webhooks...",
- "NO_RESULTS": "No webhooks found matching your search",
+ "COUNT": "{n} 個 webhook",
+ "SEARCH_PLACEHOLDER": "搜尋 webhook...",
+ "NO_RESULTS": "找不到符合搜尋條件的 webhook",
"FORM": {
"CANCEL": "取消",
- "DESC": "Webhook 事件為您提供了有關 Chatwoot 帳戶中發生的事情的即時資訊。請輸入一個有效的URL來配置回呼。",
+ "DESC": "Webhook 事件為您提供 Chatwoot 帳戶中即時發生的事件資訊。請輸入有效的 URL 來設定回呼。",
"SUBSCRIPTIONS": {
- "LABEL": "Events",
+ "LABEL": "事件",
"EVENTS": {
- "CONVERSATION_CREATED": "Conversation Created",
- "CONVERSATION_STATUS_CHANGED": "Conversation Status Changed",
- "CONVERSATION_UPDATED": "Conversation Updated",
- "MESSAGE_CREATED": "Message created",
- "MESSAGE_UPDATED": "Message updated",
- "WEBWIDGET_TRIGGERED": "Live chat widget opened by the user",
- "CONTACT_CREATED": "Contact created",
- "CONTACT_UPDATED": "Contact updated",
- "CONVERSATION_TYPING_ON": "Conversation Typing On",
- "CONVERSATION_TYPING_OFF": "Conversation Typing Off"
+ "CONVERSATION_CREATED": "對話已建立",
+ "CONVERSATION_STATUS_CHANGED": "對話狀態已變更",
+ "CONVERSATION_UPDATED": "對話已更新",
+ "MESSAGE_CREATED": "訊息已建立",
+ "MESSAGE_UPDATED": "訊息已更新",
+ "WEBWIDGET_TRIGGERED": "使用者開啟了即時聊天小工具",
+ "CONTACT_CREATED": "聯絡人已建立",
+ "CONTACT_UPDATED": "聯絡人已更新",
+ "CONVERSATION_TYPING_ON": "對話正在輸入",
+ "CONVERSATION_TYPING_OFF": "對話停止輸入"
}
},
"NAME": {
- "LABEL": "Webhook Name",
- "PLACEHOLDER": "Enter the name of the webhook"
+ "LABEL": "Webhook 名稱",
+ "PLACEHOLDER": "請輸入 webhook 的名稱"
},
"END_POINT": {
"LABEL": "Webhook 網址",
- "PLACEHOLDER": "Example: {webhookExampleURL}",
- "ERROR": "請輸入一個有效的 URL"
+ "PLACEHOLDER": "範例:{webhookExampleURL}",
+ "ERROR": "請輸入有效的 URL"
},
- "EDIT_SUBMIT": "Update webhook",
+ "EDIT_SUBMIT": "更新 webhook",
"ADD_SUBMIT": "建立 webhook"
},
- "TITLE": "回呼接口位址",
- "CONFIGURE": "配置",
+ "TITLE": "Webhook",
+ "CONFIGURE": "設定",
"HEADER": "Webhook 設定",
"HEADER_BTN_TXT": "建立新的 webhook",
- "LOADING": "正在取得已建立的 webhooks",
- "SEARCH_404": "没有任何項目符合此查詢",
- "SIDEBAR_TXT": "Webhooks
Webhooks 是 HTTP 回呼,可以為每個帳戶定義的。 他們是由諸如在 Chatwoot 中建立消息等事件所觸發的。您可以為此帳戶建立多個 webhook。 建立一個 webhook , 點擊 建立新的 webhook 按鈕。 您也可以通過點擊刪除按鈕刪除任何現有的 webhook。
",
+ "LOADING": "正在取得已建立的 webhook",
+ "SEARCH_404": "沒有任何項目符合此查詢",
+ "SIDEBAR_TXT": "Webhooks
Webhook 是可以為每個帳戶定義的 HTTP 回呼。它們會被 Chatwoot 中的事件(例如建立訊息)所觸發。您可以為此帳戶建立多個 webhook。 若要建立 webhook ,請點擊 建立新的 webhook 按鈕。您也可以點擊刪除按鈕來移除現有的 webhook。
",
"LIST": {
- "404": "此帳戶没有配置 webhooks。",
- "TITLE": "管理 webhooks",
+ "404": "此帳戶尚未設定任何 webhook。",
+ "TITLE": "管理 webhook",
"TABLE_HEADER": {
- "WEBHOOK_ENDPOINT": "Webhook 端点",
+ "WEBHOOK_ENDPOINT": "Webhook 端點",
"ACTIONS": "操作"
}
},
"EDIT": {
"BUTTON_TEXT": "編輯",
- "TITLE": "編輯 Webhook",
+ "TITLE": "編輯 webhook",
"API": {
- "SUCCESS_MESSAGE": "Webhook configuration updated successfully",
+ "SUCCESS_MESSAGE": "Webhook 設定已成功更新",
"ERROR_MESSAGE": "無法連接伺服器,請稍後再試"
}
},
"ADD": {
- "CANCEL": "取消操作",
+ "CANCEL": "取消",
"TITLE": "建立新的 webhook",
"API": {
- "SUCCESS_MESSAGE": "Webhook configuration added successfully",
+ "SUCCESS_MESSAGE": "Webhook 設定已成功新增",
"ERROR_MESSAGE": "無法連接伺服器,請稍後再試"
}
},
"DELETE": {
"BUTTON_TEXT": "刪除",
"API": {
- "SUCCESS_MESSAGE": "Webhook 刪除成功",
+ "SUCCESS_MESSAGE": "Webhook 已成功刪除",
"ERROR_MESSAGE": "無法連接伺服器,請稍後再試"
},
"CONFIRM": {
"TITLE": "確認刪除",
- "MESSAGE": "Are you sure to delete the webhook? ({webhookURL})",
- "YES": "是,刪除 ",
- "NO": "否,保留它"
+ "MESSAGE": "您確定要刪除此 webhook 嗎?({webhookURL})",
+ "YES": "是,刪除",
+ "NO": "否,保留"
}
}
},
@@ -121,276 +121,276 @@
"HEADER": "Slack",
"DELETE": "刪除",
"DELETE_CONFIRMATION": {
- "TITLE": "Delete the integration",
- "MESSAGE": "Are you sure you want to delete the integration? Doing so will result in the loss of access to conversations on your Slack workspace."
+ "TITLE": "刪除整合",
+ "MESSAGE": "您確定要刪除此整合嗎?刪除後將無法再從您的 Slack 工作區存取對話。"
},
"HELP_TEXT": {
- "TITLE": "Using Slack Integration",
- "BODY": "With this integration, all of your incoming conversations will be synced to the ***{selectedChannelName}*** channel in your Slack workspace. You can manage all your customer conversations right within the channel and never miss a message.\n\nHere are the main features of the integration:\n\n**Respond to conversations from within Slack:** To respond to a conversation in the ***{selectedChannelName}*** Slack channel, simply type out your message and send it as a thread. This will create a response back to the customer through Chatwoot. It's that simple!\n\n **Create private notes:** If you want to create private notes instead of replies, start your message with ***`note:`***. This ensures that your message is kept private and won't be visible to the customer.\n\n**Associate an agent profile:** If the person who replied on Slack has an agent profile in Chatwoot under the same email, the replies will be associated with that agent profile automatically. This means you can easily track who said what and when. On the other hand, when the replier doesn't have an associated agent profile, the replies will appear from the bot profile to the customer.",
- "SELECTED": "selected"
+ "TITLE": "如何使用 Slack 整合?",
+ "BODY": "透過此整合,您所有的傳入對話都將同步至 Slack 工作區中的 ***{selectedChannelName}*** 頻道。您可以直接在該頻道中管理所有客戶對話,不再錯過任何訊息。\n\n以下是此整合的主要功能:\n\n**在 Slack 中回覆對話:**若要在 ***{selectedChannelName}*** Slack 頻道中回覆對話,只需輸入您的訊息並以討論串方式傳送。這將透過 Chatwoot 回覆給客戶。就是這麼簡單!\n\n**建立私人備註:**如果您想建立私人備註而非回覆,請在訊息開頭加上 ***`note:`***。這可確保您的訊息為私密內容,客戶無法看見。\n\n**關聯客服人員個人資料:**如果在 Slack 上回覆的人在 Chatwoot 中擁有相同電子郵件的客服人員個人資料,回覆將自動與該客服人員個人資料關聯。這表示您可以輕鬆追蹤誰在何時說了什麼。另一方面,當回覆者沒有關聯的客服人員個人資料時,回覆將以機器人個人資料的身分顯示給客戶。",
+ "SELECTED": "已選擇"
},
"SELECT_CHANNEL": {
- "OPTION_LABEL": "Select a channel",
+ "OPTION_LABEL": "選擇頻道",
"UPDATE": "更新",
- "BUTTON_TEXT": "Connect channel",
- "DESCRIPTION": "Your Slack workspace is now linked with Chatwoot. However, the integration is currently inactive. To activate the integration and connect a channel to Chatwoot, please click the button below.\n\n**Note:** If you are attempting to connect a private channel, add the Chatwoot app to the Slack channel before proceeding with this step.",
- "ATTENTION_REQUIRED": "Attention required",
- "EXPIRED": "Your Slack integration has expired. To continue receiving messages on Slack, please delete the integration and connect your workspace again."
+ "BUTTON_TEXT": "連接頻道",
+ "DESCRIPTION": "您的 Slack 工作區已與 Chatwoot 連結。但整合目前處於非啟用狀態。若要啟用整合並將頻道連接至 Chatwoot,請點擊下方按鈕。\n\n**注意:**如果您嘗試連接私人頻道,請先將 Chatwoot 應用程式加入該 Slack 頻道,再進行此步驟。",
+ "ATTENTION_REQUIRED": "需要注意",
+ "EXPIRED": "您的 Slack 整合已過期。若要繼續在 Slack 上接收訊息,請刪除此整合並重新連接您的工作區。"
},
- "UPDATE_ERROR": "There was an error updating the integration, please try again",
- "UPDATE_SUCCESS": "The channel is connected successfully",
- "FAILED_TO_FETCH_CHANNELS": "There was an error fetching the channels from Slack, please try again"
+ "UPDATE_ERROR": "更新整合時發生錯誤,請重試",
+ "UPDATE_SUCCESS": "頻道已成功連接",
+ "FAILED_TO_FETCH_CHANNELS": "從 Slack 取得頻道時發生錯誤,請重試"
},
"DYTE": {
- "CLICK_HERE_TO_JOIN": "Click here to join",
- "LEAVE_THE_ROOM": "Leave the room",
- "START_VIDEO_CALL_HELP_TEXT": "Start a new video call with the customer",
- "JOIN_ERROR": "There was an error joining the call, please try again",
- "CREATE_ERROR": "There was an error creating a meeting link, please try again"
+ "CLICK_HERE_TO_JOIN": "點此加入",
+ "LEAVE_THE_ROOM": "離開房間",
+ "START_VIDEO_CALL_HELP_TEXT": "與客戶開始新的視訊通話",
+ "JOIN_ERROR": "加入通話時發生錯誤,請重試",
+ "CREATE_ERROR": "建立會議連結時發生錯誤,請重試"
},
"OPEN_AI": {
- "AI_ASSIST": "AI Assist",
- "WITH_AI": " {option} with AI ",
+ "AI_ASSIST": "AI 輔助",
+ "WITH_AI": " 使用 AI {option} ",
"OPTIONS": {
- "REPLY_SUGGESTION": "Reply Suggestion",
- "SUMMARIZE": "Summarize",
- "REPHRASE": "Improve Writing",
- "FIX_SPELLING_GRAMMAR": "Fix Spelling and Grammar",
- "SHORTEN": "Shorten",
- "EXPAND": "Expand",
- "MAKE_FRIENDLY": "Change message tone to friendly",
- "MAKE_FORMAL": "Use formal tone",
- "SIMPLIFY": "Simplify",
- "CONFIDENT": "Use confident tone",
- "PROFESSIONAL": "Use professional tone",
- "CASUAL": "Use casual tone",
- "STRAIGHTFORWARD": "Use straightforward tone"
+ "REPLY_SUGGESTION": "回覆建議",
+ "SUMMARIZE": "摘要",
+ "REPHRASE": "改善文筆",
+ "FIX_SPELLING_GRAMMAR": "修正拼寫和文法",
+ "SHORTEN": "縮短",
+ "EXPAND": "展開",
+ "MAKE_FRIENDLY": "將訊息語氣改為親切",
+ "MAKE_FORMAL": "使用正式語氣",
+ "SIMPLIFY": "簡化",
+ "CONFIDENT": "使用自信語氣",
+ "PROFESSIONAL": "使用專業語氣",
+ "CASUAL": "使用輕鬆語氣",
+ "STRAIGHTFORWARD": "使用直白語氣"
},
"REPLY_OPTIONS": {
- "IMPROVE_REPLY": "Improve reply",
- "IMPROVE_REPLY_SELECTION": "Improve the selection",
+ "IMPROVE_REPLY": "改善回覆",
+ "IMPROVE_REPLY_SELECTION": "改善選取內容",
"CHANGE_TONE": {
- "TITLE": "Change tone",
+ "TITLE": "變更語氣",
"OPTIONS": {
- "PROFESSIONAL": "Professional",
- "CASUAL": "Casual",
- "STRAIGHTFORWARD": "Straightforward",
- "CONFIDENT": "Confident",
- "FRIENDLY": "Friendly"
+ "PROFESSIONAL": "專業",
+ "CASUAL": "輕鬆",
+ "STRAIGHTFORWARD": "直白",
+ "CONFIDENT": "自信",
+ "FRIENDLY": "親切"
}
},
- "GRAMMAR": "Fix grammar & spelling",
- "SUGGESTION": "Suggest a reply",
- "SUMMARIZE": "Summarize the conversation",
- "ASK_COPILOT": "Ask Copilot"
+ "GRAMMAR": "修正文法與拼寫",
+ "SUGGESTION": "建議回覆",
+ "SUMMARIZE": "摘要對話",
+ "ASK_COPILOT": "詢問 Copilot"
},
"ASSISTANCE_MODAL": {
- "DRAFT_TITLE": "Draft content",
- "GENERATED_TITLE": "Generated content",
- "AI_WRITING": "AI is writing",
+ "DRAFT_TITLE": "草稿內容",
+ "GENERATED_TITLE": "生成內容",
+ "AI_WRITING": "AI 正在撰寫",
"BUTTONS": {
- "APPLY": "Use this suggestion",
+ "APPLY": "使用此建議",
"CANCEL": "取消"
}
},
"CTA_MODAL": {
- "TITLE": "Integrate with OpenAI",
- "DESC": "Bring advanced AI features to your dashboard with OpenAI's GPT models. To begin, enter the API key from your OpenAI account.",
- "KEY_PLACEHOLDER": "Enter your OpenAI API key",
+ "TITLE": "與 OpenAI 整合",
+ "DESC": "透過 OpenAI 的 GPT 模型為您的儀表板帶來進階 AI 功能。請輸入您 OpenAI 帳戶的 API 金鑰以開始使用。",
+ "KEY_PLACEHOLDER": "請輸入您的 OpenAI API 金鑰",
"BUTTONS": {
- "NEED_HELP": "Need help?",
- "DISMISS": "Dismiss",
- "FINISH": "Finish Setup"
+ "NEED_HELP": "需要幫助?",
+ "DISMISS": "關閉",
+ "FINISH": "完成設定"
},
- "DISMISS_MESSAGE": "You can setup OpenAI integration later Whenever you want.",
- "SUCCESS_MESSAGE": "OpenAI integration setup successfully"
+ "DISMISS_MESSAGE": "您可以在任何時候設定 OpenAI 整合。",
+ "SUCCESS_MESSAGE": "OpenAI 整合設定成功"
},
- "TITLE": "Improve With AI",
- "SUMMARY_TITLE": "Summary with AI",
- "REPLY_TITLE": "Reply suggestion with AI",
- "SUBTITLE": "An improved reply will be generated using AI, based on your current draft.",
+ "TITLE": "使用 AI 改善",
+ "SUMMARY_TITLE": "AI 摘要",
+ "REPLY_TITLE": "AI 回覆建議",
+ "SUBTITLE": "系統將根據您目前的草稿,使用 AI 生成改善後的回覆。",
"TONE": {
- "TITLE": "Tone",
+ "TITLE": "語氣",
"OPTIONS": {
- "PROFESSIONAL": "Professional",
- "FRIENDLY": "Friendly"
+ "PROFESSIONAL": "專業",
+ "FRIENDLY": "親切"
}
},
"BUTTONS": {
- "GENERATE": "Generate",
- "GENERATING": "Generating...",
+ "GENERATE": "生成",
+ "GENERATING": "生成中...",
"CANCEL": "取消"
},
- "GENERATE_ERROR": "There was an error processing the content, please try again"
+ "GENERATE_ERROR": "處理內容時發生錯誤,請確認您的 OpenAI API 金鑰後再試一次"
},
"DELETE": {
"BUTTON_TEXT": "刪除",
"API": {
- "SUCCESS_MESSAGE": "已成功刪除"
+ "SUCCESS_MESSAGE": "整合已成功刪除"
}
},
"CONNECT": {
"BUTTON_TEXT": "連接"
},
"DASHBOARD_APPS": {
- "TITLE": "Dashboard Apps",
- "HEADER_BTN_TXT": "Add a new dashboard app",
- "SIDEBAR_TXT": "Dashboard Apps
Dashboard Apps allow organizations to embed an application inside the Chatwoot dashboard to provide the context for customer support agents. This feature allows you to create an application independently and embed that inside the dashboard to provide user information, their orders, or their previous payment history.
When you embed your application using the dashboard in Chatwoot, your application will get the context of the conversation and contact as a window event. Implement a listener for the message event on your page to receive the context.
To add a new dashboard app, click on the button 'Add a new dashboard app'.
",
- "DESCRIPTION": "Dashboard Apps allow organizations to embed an application inside the dashboard to provide the context for customer support agents. This feature allows you to create an application independently and embed that to provide user information, their orders, or their previous payment history.",
- "LEARN_MORE": "Learn more about Dashboard Apps",
- "COUNT": "{n} dashboard app | {n} dashboard apps",
- "SEARCH_PLACEHOLDER": "Search dashboard apps...",
- "NO_RESULTS": "No dashboard apps found matching your search",
+ "TITLE": "儀表板應用程式",
+ "HEADER_BTN_TXT": "新增儀表板應用程式",
+ "SIDEBAR_TXT": "儀表板應用程式
儀表板應用程式允許組織在 Chatwoot 儀表板中嵌入應用程式,為客服人員提供相關資訊。此功能讓您可以獨立建立應用程式,並將其嵌入儀表板中,提供使用者資訊、訂單記錄或過往付款歷史。
當您透過 Chatwoot 儀表板嵌入應用程式時,您的應用程式將以 window event 的形式接收對話和聯絡人的上下文資訊。請在您的頁面上實作 message event 監聽器以接收上下文。
若要新增儀表板應用程式,請點擊「新增儀表板應用程式」按鈕。
",
+ "DESCRIPTION": "儀表板應用程式允許組織在儀表板中嵌入應用程式,為客服人員提供相關資訊。此功能讓您可以獨立建立應用程式,並將其嵌入以提供使用者資訊、訂單記錄或過往付款歷史。",
+ "LEARN_MORE": "進一步瞭解儀表板應用程式",
+ "COUNT": "{n} 個儀表板應用程式",
+ "SEARCH_PLACEHOLDER": "搜尋儀表板應用程式...",
+ "NO_RESULTS": "找不到符合搜尋條件的儀表板應用程式",
"LIST": {
- "404": "There are no dashboard apps configured on this account yet",
- "LOADING": "Fetching dashboard apps...",
+ "404": "此帳戶尚未設定任何儀表板應用程式",
+ "LOADING": "正在取得儀表板應用程式...",
"TABLE_HEADER": {
- "NAME": "姓名",
- "ENDPOINT": "Endpoint",
+ "NAME": "名稱",
+ "ENDPOINT": "端點",
"ACTIONS": "操作"
},
"EDIT_TOOLTIP": "編輯應用程式",
"DELETE_TOOLTIP": "刪除應用程式"
},
"FORM": {
- "TITLE_LABEL": "姓名",
- "TITLE_PLACEHOLDER": "Enter a name for your dashboard app",
- "TITLE_ERROR": "A name for the dashboard app is required",
- "URL_LABEL": "Endpoint",
- "URL_PLACEHOLDER": "Enter the endpoint URL where your app is hosted",
- "URL_ERROR": "A valid URL is required"
+ "TITLE_LABEL": "名稱",
+ "TITLE_PLACEHOLDER": "請輸入儀表板應用程式的名稱",
+ "TITLE_ERROR": "儀表板應用程式名稱為必填",
+ "URL_LABEL": "端點",
+ "URL_PLACEHOLDER": "請輸入應用程式託管的端點 URL",
+ "URL_ERROR": "請輸入有效的 URL"
},
"CREATE": {
- "HEADER": "Add a new dashboard app",
+ "HEADER": "新增儀表板應用程式",
"FORM_SUBMIT": "送出",
"FORM_CANCEL": "取消",
- "API_SUCCESS": "Dashboard app configured successfully",
- "API_ERROR": "We couldn't create an app. Please try again later"
+ "API_SUCCESS": "儀表板應用程式已成功設定",
+ "API_ERROR": "無法建立應用程式,請稍後再試"
},
"UPDATE": {
- "HEADER": "Edit dashboard app",
+ "HEADER": "編輯儀表板應用程式",
"FORM_SUBMIT": "更新",
"FORM_CANCEL": "取消",
- "API_SUCCESS": "Dashboard app updated successfully",
- "API_ERROR": "無法更新應用程式,請稍後再試。"
+ "API_SUCCESS": "儀表板應用程式已成功更新",
+ "API_ERROR": "無法更新應用程式,請稍後再試"
},
"DELETE": {
"CONFIRM_YES": "是,刪除",
"CONFIRM_NO": "否,保留",
- "TITLE": "刪除確認",
- "MESSAGE": "你確定要刪除應用程式 {appName} 嗎?",
- "API_SUCCESS": "Dashboard app deleted successfully",
- "API_ERROR": "We couldn't delete the app. Please try again later"
+ "TITLE": "確認刪除",
+ "MESSAGE": "您確定要刪除應用程式 {appName} 嗎?",
+ "API_SUCCESS": "儀表板應用程式已成功刪除",
+ "API_ERROR": "無法刪除應用程式,請稍後再試"
}
},
"LINEAR": {
"HEADER": "Linear",
- "ADD_OR_LINK_BUTTON": "Create/Link Linear Issue",
- "LOADING": "Fetching linear issues...",
- "LOADING_ERROR": "There was an error fetching the linear issues, please try again",
+ "ADD_OR_LINK_BUTTON": "建立/連結 Linear 議題",
+ "LOADING": "正在取得 Linear 議題...",
+ "LOADING_ERROR": "取得 Linear 議題時發生錯誤,請重試",
"CREATE": "建立",
"LINK": {
- "SEARCH": "Search issues",
- "SELECT": "Select issue",
+ "SEARCH": "搜尋議題",
+ "SELECT": "選擇議題",
"TITLE": "連結",
- "EMPTY_LIST": "No linear issues found",
- "LOADING": "Loading",
- "ERROR": "There was an error fetching the linear issues, please try again",
- "LINK_SUCCESS": "Issue linked successfully",
- "LINK_ERROR": "There was an error linking the issue, please try again",
- "LINK_TITLE": "Conversation (#{conversationId}) with {name}"
+ "EMPTY_LIST": "找不到 Linear 議題",
+ "LOADING": "載入中",
+ "ERROR": "取得 Linear 議題時發生錯誤,請重試",
+ "LINK_SUCCESS": "議題已成功連結",
+ "LINK_ERROR": "連結議題時發生錯誤,請重試",
+ "LINK_TITLE": "對話(#{conversationId})與 {name}"
},
"ADD_OR_LINK": {
- "TITLE": "Create/link linear issue",
- "DESCRIPTION": "Create Linear issues from conversations, or link existing ones for seamless tracking.",
+ "TITLE": "建立/連結 Linear 議題",
+ "DESCRIPTION": "從對話中建立 Linear 議題,或連結現有議題以進行無縫追蹤。",
"FORM": {
"TITLE": {
"LABEL": "標題",
- "PLACEHOLDER": "Enter title",
+ "PLACEHOLDER": "請輸入標題",
"REQUIRED_ERROR": "標題為必填"
},
"DESCRIPTION": {
- "LABEL": "描述資訊",
- "PLACEHOLDER": "Enter description"
+ "LABEL": "描述",
+ "PLACEHOLDER": "請輸入描述"
},
"TEAM": {
- "LABEL": "Team",
+ "LABEL": "團隊",
"PLACEHOLDER": "選擇團隊",
- "SEARCH": "Search team",
- "REQUIRED_ERROR": "Team is required"
+ "SEARCH": "搜尋團隊",
+ "REQUIRED_ERROR": "團隊為必填"
},
"ASSIGNEE": {
- "LABEL": "Assignee",
- "PLACEHOLDER": "Select assignee",
- "SEARCH": "Search assignee"
+ "LABEL": "負責人",
+ "PLACEHOLDER": "選擇負責人",
+ "SEARCH": "搜尋負責人"
},
"PRIORITY": {
"LABEL": "優先程度",
- "PLACEHOLDER": "Select priority",
- "SEARCH": "Search priority"
+ "PLACEHOLDER": "選擇優先程度",
+ "SEARCH": "搜尋優先程度"
},
"LABEL": {
- "LABEL": "Label",
- "PLACEHOLDER": "Select label",
- "SEARCH": "Search label"
+ "LABEL": "標籤",
+ "PLACEHOLDER": "選擇標籤",
+ "SEARCH": "搜尋標籤"
},
"STATUS": {
"LABEL": "狀態",
- "PLACEHOLDER": "Select status",
- "SEARCH": "Search status"
+ "PLACEHOLDER": "選擇狀態",
+ "SEARCH": "搜尋狀態"
},
"PROJECT": {
- "LABEL": "Project",
- "PLACEHOLDER": "Select project",
- "SEARCH": "Search project"
+ "LABEL": "專案",
+ "PLACEHOLDER": "選擇專案",
+ "SEARCH": "搜尋專案"
}
},
"CREATE": "建立",
"CANCEL": "取消",
- "CREATE_SUCCESS": "Issue created successfully",
- "CREATE_ERROR": "There was an error creating the issue, please try again",
- "LOADING_TEAM_ERROR": "There was an error fetching the teams, please try again",
- "LOADING_TEAM_ENTITIES_ERROR": "There was an error fetching the team entities, please try again"
+ "CREATE_SUCCESS": "議題已成功建立",
+ "CREATE_ERROR": "建立議題時發生錯誤,請重試",
+ "LOADING_TEAM_ERROR": "取得團隊時發生錯誤,請重試",
+ "LOADING_TEAM_ENTITIES_ERROR": "取得團隊項目時發生錯誤,請重試"
},
"ISSUE": {
"STATUS": "狀態",
"PRIORITY": "優先程度",
- "ASSIGNEE": "Assignee",
+ "ASSIGNEE": "負責人",
"LABELS": "標籤",
- "CREATED_AT": "Created at {createdAt}"
+ "CREATED_AT": "建立於 {createdAt}"
},
"UNLINK": {
- "TITLE": "Unlink",
- "SUCCESS": "Issue unlinked successfully",
- "ERROR": "There was an error unlinking the issue, please try again"
+ "TITLE": "取消連結",
+ "SUCCESS": "議題已成功取消連結",
+ "ERROR": "取消連結議題時發生錯誤,請重試"
},
- "NO_LINKED_ISSUES": "No linked issues found",
+ "NO_LINKED_ISSUES": "找不到已連結的議題",
"DELETE": {
- "TITLE": "Are you sure you want to delete the integration?",
- "MESSAGE": "Are you sure you want to delete the integration?",
- "CONFIRM": "是的,刪除",
+ "TITLE": "您確定要刪除此整合嗎?",
+ "MESSAGE": "您確定要刪除此整合嗎?",
+ "CONFIRM": "是,刪除",
"CANCEL": "取消"
},
"CTA": {
- "TITLE": "Connect to Linear",
- "AGENT_DESCRIPTION": "Linear workspace is not connected. Request your administrator to connect a workspace to use this integration.",
- "DESCRIPTION": "Linear workspace is not connected. Click the button below to connect your workspace to use this integration.",
- "BUTTON_TEXT": "Connect Linear workspace"
+ "TITLE": "連接至 Linear",
+ "AGENT_DESCRIPTION": "Linear 工作區尚未連接。請聯繫您的管理員連接工作區以使用此整合。",
+ "DESCRIPTION": "Linear 工作區尚未連接。點擊下方按鈕連接您的工作區以使用此整合。",
+ "BUTTON_TEXT": "連接 Linear 工作區"
}
},
"NOTION": {
"HEADER": "Notion",
"DELETE": {
- "TITLE": "Are you sure you want to delete the Notion integration?",
- "MESSAGE": "Deleting this integration will remove access to your Notion workspace and stop all related functionality.",
- "CONFIRM": "是的,刪除",
+ "TITLE": "您確定要刪除 Notion 整合嗎?",
+ "MESSAGE": "刪除此整合將會移除對您 Notion 工作區的存取權限,並停止所有相關功能。",
+ "CONFIRM": "是,刪除",
"CANCEL": "取消"
}
}
},
"CAPTAIN": {
"NAME": "Captain",
- "HEADER_KNOW_MORE": "了解更多",
+ "HEADER_KNOW_MORE": "瞭解更多",
"ASSISTANT_SWITCHER": {
"ASSISTANTS": "助理",
"SWITCH_ASSISTANT": "切換助理",
@@ -399,63 +399,63 @@
},
"COPILOT": {
"TITLE": "Copilot",
- "TRY_THESE_PROMPTS": "Try these prompts",
+ "TRY_THESE_PROMPTS": "試試這些提示",
"PANEL_TITLE": "開始使用 Copilot",
- "KICK_OFF_MESSAGE": "需要快速摘要、查看過往對話,或草擬更好的回覆?Copilot 幫你加快速度。",
+ "KICK_OFF_MESSAGE": "需要快速摘要、想查看過去的對話,或草擬更好的回覆?Copilot 在此幫您加速處理。",
"SEND_MESSAGE": "傳送訊息...",
- "EMPTY_MESSAGE": "產生回應時發生錯誤。請再試一次。",
- "LOADER": "Captain 思考中",
- "YOU": "You",
- "USE": "使用這個",
+ "EMPTY_MESSAGE": "生成回應時發生錯誤,請重試。",
+ "LOADER": "Captain 正在思考",
+ "YOU": "您",
+ "USE": "使用此內容",
"RESET": "重設",
"SHOW_STEPS": "顯示步驟",
"SELECT_ASSISTANT": "選擇助理",
"PROMPTS": {
"SUMMARIZE": {
"LABEL": "摘要此對話",
- "CONTENT": "摘要客戶與客服人員間討論的重點,包括客戶的疑慮、問題,以及客服提供的解決方案或回覆。"
+ "CONTENT": "請摘要客戶與客服人員之間討論的重點,包括客戶的疑慮、問題,以及客服人員提供的解決方案或回覆"
},
"SUGGEST": {
"LABEL": "建議回覆",
- "CONTENT": "分析客戶的詢問,擬定有效回應以解決其疑慮或問題。確保回覆清楚、簡潔並提供有用資訊。"
+ "CONTENT": "請分析客戶的詢問,並草擬一份能有效解決其疑慮或問題的回覆。確保回覆清晰、簡潔且提供有用的資訊。"
},
"RATE": {
"LABEL": "評分此對話",
- "CONTENT": "檢視此對話,評估其滿足客戶需求的程度。針對語調、清晰度與效果,給出五分制評分。"
+ "CONTENT": "請檢視此對話是否滿足客戶的需求。根據語氣、清晰度和有效性,提供 1 至 5 的評分。"
},
"HIGH_PRIORITY": {
- "LABEL": "高優先度對話",
- "CONTENT": "請給我所有高優先度未結案對話的摘要。包含對話 ID、客戶姓名(若有)、最後訊息內容及指定的代理人。若有相關狀態,請依狀態分組。"
+ "LABEL": "高優先程度對話",
+ "CONTENT": "請提供所有高優先程度未結對話的摘要。包含對話 ID、客戶名稱(如有)、最後一則訊息內容以及指派的客服人員。如相關請按狀態分組。"
},
"LIST_CONTACTS": {
"LABEL": "列出聯絡人",
- "CONTENT": "請顯示十大聯絡人清單。包含姓名、電子郵件或電話號碼(若有)、最後出現時間、標籤(若有)。"
+ "CONTENT": "請顯示前 10 名聯絡人。包含名稱、電子郵件或電話號碼(如有)、最後上線時間、標籤(如有)。"
}
}
},
"PLAYGROUND": {
- "USER": "You",
+ "USER": "您",
"ASSISTANT": "助理",
- "MESSAGE_PLACEHOLDER": "輸入你的訊息...",
- "HEADER": "測試區",
- "DESCRIPTION": "使用此測試區發送訊息給您的助理,檢查其回應是否準確、快速且符合預期語調。",
- "CREDIT_NOTE": "此處發送的訊息將計入您的 Captain 點數。"
+ "MESSAGE_PLACEHOLDER": "輸入您的訊息...",
+ "HEADER": "Playground",
+ "DESCRIPTION": "使用此 Playground 向您的助理傳送訊息,檢查其回應是否準確、快速且符合您期望的語氣。",
+ "CREDIT_NOTE": "在此傳送的訊息將計入您的 Captain 額度。"
},
"PAYWALL": {
"TITLE": "升級以使用 Captain AI",
- "AVAILABLE_ON": "Captain 不適用於免費方案。",
- "UPGRADE_PROMPT": "升級方案以使用助理、Copilot 及更多功能。",
- "UPGRADE_NOW": "Upgrade now",
- "CANCEL_ANYTIME": "You can change or cancel your plan anytime"
+ "AVAILABLE_ON": "免費方案不提供 Captain。",
+ "UPGRADE_PROMPT": "升級您的方案以取得助理、Copilot 等功能的存取權限。",
+ "UPGRADE_NOW": "立即升級",
+ "CANCEL_ANYTIME": "您可以隨時更改或取消方案"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "Captain AI 僅於企業方案中提供。",
- "UPGRADE_PROMPT": "升級方案以使用助理、Copilot 及更多功能。",
- "ASK_ADMIN": "Please reach out to your administrator for the upgrade."
+ "AVAILABLE_ON": "Captain AI 僅在企業方案中提供。",
+ "UPGRADE_PROMPT": "升級您的方案以取得助理、Copilot 等功能的存取權限。",
+ "ASK_ADMIN": "請聯繫您的管理員進行升級。"
},
"BANNER": {
- "RESPONSES": "您已使用超過回應限制的 80%。請升級以繼續使用 Captain AI。",
- "DOCUMENTS": "文件數量已達上限。請升級以繼續使用 Captain AI。"
+ "RESPONSES": "您已使用超過 80% 的回應額度。若要繼續使用 Captain AI,請升級方案。",
+ "DOCUMENTS": "文件額度已用完。請升級以繼續使用 Captain AI。"
},
"FORM": {
"CANCEL": "取消",
@@ -463,247 +463,247 @@
"EDIT": "更新"
},
"ASSISTANTS": {
- "HEADER": "Assistants",
- "NO_ASSISTANTS_AVAILABLE": "There are no assistants available in your account.",
- "ADD_NEW": "Create a new assistant",
+ "HEADER": "助理",
+ "NO_ASSISTANTS_AVAILABLE": "您的帳戶中沒有可用的助理。",
+ "ADD_NEW": "建立新助理",
"DELETE": {
- "TITLE": "Are you sure to delete the assistant?",
- "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.",
- "CONFIRM": "是的,刪除",
- "SUCCESS_MESSAGE": "The assistant has been successfully deleted",
- "ERROR_MESSAGE": "There was an error deleting the assistant, please try again."
+ "TITLE": "您確定要刪除此助理嗎?",
+ "DESCRIPTION": "此操作不可復原。刪除此助理將會從所有已連接的收件匣中移除,並永久清除所有已生成的知識。",
+ "CONFIRM": "是,刪除",
+ "SUCCESS_MESSAGE": "助理已成功刪除",
+ "ERROR_MESSAGE": "刪除助理時發生錯誤,請重試。"
},
- "FORM_DESCRIPTION": "Fill out the details below to name your assistant, describe its purpose, and specify the product it will support.",
+ "FORM_DESCRIPTION": "請填寫以下資訊,為您的助理命名、描述其用途,並指定其支援的產品。",
"CREATE": {
- "TITLE": "Create an assistant",
- "SUCCESS_MESSAGE": "The assistant has been successfully created",
- "ERROR_MESSAGE": "There was an error creating the assistant, please try again."
+ "TITLE": "建立助理",
+ "SUCCESS_MESSAGE": "助理已成功建立",
+ "ERROR_MESSAGE": "建立助理時發生錯誤,請重試。"
},
"FORM": {
"UPDATE": "更新",
"SECTIONS": {
- "BASIC_INFO": "Basic Information",
- "SYSTEM_MESSAGES": "System Messages",
- "INSTRUCTIONS": "Instructions",
- "FEATURES": "Features",
- "TOOLS": "Tools "
+ "BASIC_INFO": "基本資訊",
+ "SYSTEM_MESSAGES": "系統訊息",
+ "INSTRUCTIONS": "指示",
+ "FEATURES": "功能",
+ "TOOLS": "工具"
},
"NAME": {
- "LABEL": "姓名",
- "PLACEHOLDER": "Enter assistant name",
- "ERROR": "The name is required"
+ "LABEL": "名稱",
+ "PLACEHOLDER": "請輸入助理名稱",
+ "ERROR": "名稱為必填"
},
"TEMPERATURE": {
- "LABEL": "Response Temperature",
- "DESCRIPTION": "Adjust how creative or restrictive the assistant's responses should be. Lower values produce more focused and deterministic responses, while higher values allow for more creative and varied outputs."
+ "LABEL": "回應溫度",
+ "DESCRIPTION": "調整助理回應的創造性或限制性。較低的值會產生更聚焦且確定性的回應,而較高的值則允許更多創意和多樣化的輸出。"
},
"DESCRIPTION": {
- "LABEL": "描述資訊",
- "PLACEHOLDER": "Enter assistant description",
- "ERROR": "The description is required"
+ "LABEL": "描述",
+ "PLACEHOLDER": "請輸入助理描述",
+ "ERROR": "描述為必填"
},
"PRODUCT_NAME": {
- "LABEL": "Product Name",
- "PLACEHOLDER": "Enter product name",
- "ERROR": "The product name is required"
+ "LABEL": "產品名稱",
+ "PLACEHOLDER": "請輸入產品名稱",
+ "ERROR": "產品名稱為必填"
},
"WELCOME_MESSAGE": {
- "LABEL": "Welcome Message",
- "PLACEHOLDER": "Enter welcome message"
+ "LABEL": "歡迎訊息",
+ "PLACEHOLDER": "請輸入歡迎訊息"
},
"HANDOFF_MESSAGE": {
- "LABEL": "Handoff Message",
- "PLACEHOLDER": "Enter handoff message"
+ "LABEL": "轉接訊息",
+ "PLACEHOLDER": "請輸入轉接訊息"
},
"RESOLUTION_MESSAGE": {
- "LABEL": "Resolution Message",
- "PLACEHOLDER": "Enter resolution message"
+ "LABEL": "解決訊息",
+ "PLACEHOLDER": "請輸入解決訊息"
},
"INSTRUCTIONS": {
- "LABEL": "Instructions",
- "PLACEHOLDER": "Enter instructions for the assistant"
+ "LABEL": "指示",
+ "PLACEHOLDER": "請輸入給助理的指示"
},
"FEATURES": {
- "TITLE": "Features",
- "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations",
- "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.",
- "ALLOW_CITATIONS": "Include source citations in responses",
- "ALLOW_CONTACT_ATTRIBUTES": "Allow access to contact information"
+ "TITLE": "功能",
+ "ALLOW_CONVERSATION_FAQS": "從已解決的對話生成常見問答",
+ "ALLOW_MEMORIES": "從客戶互動中擷取重要細節作為記憶。",
+ "ALLOW_CITATIONS": "在回應中包含來源引用",
+ "ALLOW_CONTACT_ATTRIBUTES": "允許存取聯絡人資訊"
}
},
"EDIT": {
- "TITLE": "Update the assistant",
- "SUCCESS_MESSAGE": "The assistant has been successfully updated",
- "ERROR_MESSAGE": "There was an error updating the assistant, please try again.",
- "NOT_FOUND": "Could not find the assistant. Please try again."
+ "TITLE": "更新助理",
+ "SUCCESS_MESSAGE": "助理已成功更新",
+ "ERROR_MESSAGE": "更新助理時發生錯誤,請重試。",
+ "NOT_FOUND": "找不到該助理,請重試。"
},
"SETTINGS": {
"HEADER": "設定",
"BASIC_SETTINGS": {
- "TITLE": "Basic settings",
- "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human."
+ "TITLE": "基本設定",
+ "DESCRIPTION": "自訂助理在結束對話或轉接給真人時的用語。"
},
"SYSTEM_SETTINGS": {
- "TITLE": "System settings",
- "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human."
+ "TITLE": "系統設定",
+ "DESCRIPTION": "自訂助理在結束對話或轉接給真人時的用語。"
},
"CONTROL_ITEMS": {
- "TITLE": "The Fun Stuff",
- "DESCRIPTION": "Add more control to the assistant. (a bit more visual like a story : Query guardrail → scenarios → output) Nudges user to actually utilise these.",
+ "TITLE": "進階控制",
+ "DESCRIPTION": "為助理新增更多控制項目。(更視覺化的流程:查詢防護機制 → 情境 → 輸出)鼓勵您善加利用這些功能。",
"OPTIONS": {
"GUARDRAILS": {
- "TITLE": "Guardrails",
- "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic."
+ "TITLE": "防護機制",
+ "DESCRIPTION": "確保回應保持正軌——僅回答您希望助理回答的問題類型,排除不當或離題的內容。"
},
"RESPONSE_GUIDELINES": {
- "TITLE": "Response guidelines",
- "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?"
+ "TITLE": "回應準則",
+ "DESCRIPTION": "助理回覆的風格與結構——清楚友善?簡短精煉?詳細正式?"
}
}
},
"DELETE": {
- "TITLE": "Delete Assistant",
- "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.",
- "BUTTON_TEXT": "Delete {assistantName}"
+ "TITLE": "刪除助理",
+ "DESCRIPTION": "此操作不可復原。刪除此助理將會從所有已連接的收件匣中移除,並永久清除所有已生成的知識。",
+ "BUTTON_TEXT": "刪除 {assistantName}"
}
},
"OPTIONS": {
- "EDIT_ASSISTANT": "Edit Assistant",
- "DELETE_ASSISTANT": "Delete Assistant",
- "VIEW_CONNECTED_INBOXES": "View connected inboxes"
+ "EDIT_ASSISTANT": "編輯助理",
+ "DELETE_ASSISTANT": "刪除助理",
+ "VIEW_CONNECTED_INBOXES": "檢視已連接的收件匣"
},
"EMPTY_STATE": {
- "TITLE": "No assistants available",
- "SUBTITLE": "Create an assistant to provide quick and accurate responses to your users. It can learn from your help articles and past conversations.",
+ "TITLE": "沒有可用的助理",
+ "SUBTITLE": "建立助理來為您的使用者提供快速且準確的回應。它可以從您的幫助文章和過去的對話中學習。",
"FEATURE_SPOTLIGHT": {
- "TITLE": "Captain Assistant",
- "NOTE": "Captain Assistant engages directly with customers, learns from your help docs and past conversations, and delivers instant, accurate responses. It handles the initial queries, providing quick resolutions before transferring to an agent when needed."
+ "TITLE": "Captain 助理",
+ "NOTE": "Captain 助理可直接與客戶互動、從您的幫助文件和過往對話中學習,並提供即時、準確的回應。它會處理初始查詢,提供快速解決方案,必要時再轉接給客服人員。"
}
},
"GUARDRAILS": {
- "TITLE": "Guardrails",
- "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.",
+ "TITLE": "防護機制",
+ "DESCRIPTION": "確保回應保持正軌——僅回答您希望助理回答的問題類型,排除不當或離題的內容。",
"BULK_ACTION": {
- "SELECTED": "{count} item selected | {count} items selected",
- "SELECT_ALL": "Select all ({count})",
- "UNSELECT_ALL": "Unselect all ({count})",
+ "SELECTED": "已選擇 {count} 個項目",
+ "SELECT_ALL": "全選({count})",
+ "UNSELECT_ALL": "取消全選({count})",
"BULK_DELETE_BUTTON": "刪除"
},
"ADD": {
"SUGGESTED": {
- "TITLE": "Example guardrails",
- "ADD": "Add all",
- "ADD_SINGLE": "Add this",
- "SAVE": "Add and save (↵)",
- "PLACEHOLDER": "Type in another guardrail..."
+ "TITLE": "範例防護機制",
+ "ADD": "全部新增",
+ "ADD_SINGLE": "新增此項",
+ "SAVE": "新增並儲存(↵)",
+ "PLACEHOLDER": "輸入另一條防護機制..."
},
"NEW": {
- "TITLE": "Add a guardrail",
+ "TITLE": "新增防護機制",
"CREATE": "建立",
"CANCEL": "取消",
- "PLACEHOLDER": "Type in another guardrail...",
- "TEST_ALL": "Test all"
+ "PLACEHOLDER": "輸入另一條防護機制...",
+ "TEST_ALL": "全部測試"
}
},
"LIST": {
- "SEARCH_PLACEHOLDER": "Search..."
+ "SEARCH_PLACEHOLDER": "搜尋..."
},
- "EMPTY_MESSAGE": "No guardrails found. Create or add examples to begin.",
- "SEARCH_EMPTY_MESSAGE": "No guardrails found for this search.",
+ "EMPTY_MESSAGE": "找不到防護機制。請建立或新增範例以開始。",
+ "SEARCH_EMPTY_MESSAGE": "找不到符合搜尋條件的防護機制。",
"API": {
"ADD": {
- "SUCCESS": "Guardrails added successfully",
- "ERROR": "There was an error adding guardrails, please try again."
+ "SUCCESS": "防護機制已成功新增",
+ "ERROR": "新增防護機制時發生錯誤,請重試。"
},
"UPDATE": {
- "SUCCESS": "Guardrails updated successfully",
- "ERROR": "There was an error updating guardrails, please try again."
+ "SUCCESS": "防護機制已成功更新",
+ "ERROR": "更新防護機制時發生錯誤,請重試。"
},
"DELETE": {
- "SUCCESS": "Guardrails deleted successfully",
- "ERROR": "There was an error deleting guardrails, please try again."
+ "SUCCESS": "防護機制已成功刪除",
+ "ERROR": "刪除防護機制時發生錯誤,請重試。"
}
}
},
"RESPONSE_GUIDELINES": {
- "TITLE": "Response Guidelines",
- "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?",
+ "TITLE": "回應準則",
+ "DESCRIPTION": "助理回覆的風格與結構——清楚友善?簡短精煉?詳細正式?",
"BULK_ACTION": {
- "SELECTED": "{count} item selected | {count} items selected",
- "SELECT_ALL": "Select all ({count})",
- "UNSELECT_ALL": "Unselect all ({count})",
+ "SELECTED": "已選擇 {count} 個項目",
+ "SELECT_ALL": "全選({count})",
+ "UNSELECT_ALL": "取消全選({count})",
"BULK_DELETE_BUTTON": "刪除"
},
"ADD": {
"SUGGESTED": {
- "TITLE": "Example response guidelines",
- "ADD": "Add all",
- "ADD_SINGLE": "Add this",
- "SAVE": "Add and save (↵)",
- "PLACEHOLDER": "Type in another response guideline..."
+ "TITLE": "範例回應準則",
+ "ADD": "全部新增",
+ "ADD_SINGLE": "新增此項",
+ "SAVE": "新增並儲存(↵)",
+ "PLACEHOLDER": "輸入另一條回應準則..."
},
"NEW": {
- "TITLE": "Add a response guideline",
+ "TITLE": "新增回應準則",
"CREATE": "建立",
"CANCEL": "取消",
- "PLACEHOLDER": "Type in another response guideline...",
- "TEST_ALL": "Test all"
+ "PLACEHOLDER": "輸入另一條回應準則...",
+ "TEST_ALL": "全部測試"
}
},
"LIST": {
- "SEARCH_PLACEHOLDER": "Search..."
+ "SEARCH_PLACEHOLDER": "搜尋..."
},
- "EMPTY_MESSAGE": "No response guidelines found. Create or add examples to begin.",
- "SEARCH_EMPTY_MESSAGE": "No response guidelines found for this search.",
+ "EMPTY_MESSAGE": "找不到回應準則。請建立或新增範例以開始。",
+ "SEARCH_EMPTY_MESSAGE": "找不到符合搜尋條件的回應準則。",
"API": {
"ADD": {
- "SUCCESS": "Response Guidelines added successfully",
- "ERROR": "There was an error adding response guidelines, please try again."
+ "SUCCESS": "回應準則已成功新增",
+ "ERROR": "新增回應準則時發生錯誤,請重試。"
},
"UPDATE": {
- "SUCCESS": "Response Guidelines updated successfully",
- "ERROR": "There was an error updating response guidelines, please try again."
+ "SUCCESS": "回應準則已成功更新",
+ "ERROR": "更新回應準則時發生錯誤,請重試。"
},
"DELETE": {
- "SUCCESS": "Response Guidelines deleted successfully",
- "ERROR": "There was an error deleting response guidelines, please try again."
+ "SUCCESS": "回應準則已成功刪除",
+ "ERROR": "刪除回應準則時發生錯誤,請重試。"
}
}
},
"SCENARIOS": {
- "TITLE": "Scenarios",
- "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”",
+ "TITLE": "情境",
+ "DESCRIPTION": "為助理提供一些情境——例如「當使用者遇到困難時該怎麼做」或「如何處理退款請求」。",
"BULK_ACTION": {
- "SELECTED": "{count} item selected | {count} items selected",
- "SELECT_ALL": "Select all ({count})",
- "UNSELECT_ALL": "Unselect all ({count})",
+ "SELECTED": "已選擇 {count} 個項目",
+ "SELECT_ALL": "全選({count})",
+ "UNSELECT_ALL": "取消全選({count})",
"BULK_DELETE_BUTTON": "刪除"
},
"ADD": {
"SUGGESTED": {
- "TITLE": "Example scenarios",
- "ADD": "Add all",
- "ADD_SINGLE": "Add this",
- "TOOLS_USED": "Tools used :"
+ "TITLE": "範例情境",
+ "ADD": "全部新增",
+ "ADD_SINGLE": "新增此項",
+ "TOOLS_USED": "使用的工具:"
},
"NEW": {
- "CREATE": "Add a scenario",
- "TITLE": "Create a scenario",
+ "CREATE": "新增情境",
+ "TITLE": "建立情境",
"FORM": {
"TITLE": {
"LABEL": "標題",
- "PLACEHOLDER": "Enter a name for the scenario",
- "ERROR": "Scenario name is required"
+ "PLACEHOLDER": "請輸入情境名稱",
+ "ERROR": "情境名稱為必填"
},
"DESCRIPTION": {
- "LABEL": "描述資訊",
- "PLACEHOLDER": "Describe how and where this scenario will be used",
- "ERROR": "Scenario description is required"
+ "LABEL": "描述",
+ "PLACEHOLDER": "描述此情境的使用方式和時機",
+ "ERROR": "情境描述為必填"
},
"INSTRUCTION": {
- "LABEL": "How to handle",
- "PLACEHOLDER": "Describe how and where this scenario will be handled",
- "ERROR": "Scenario content is required"
+ "LABEL": "處理方式",
+ "PLACEHOLDER": "描述此情境的處理方式和時機",
+ "ERROR": "情境內容為必填"
},
"CREATE": "建立",
"CANCEL": "取消"
@@ -712,130 +712,136 @@
},
"UPDATE": {
"CANCEL": "取消",
- "UPDATE": "Update changes"
+ "UPDATE": "更新變更"
},
"LIST": {
- "SEARCH_PLACEHOLDER": "Search..."
+ "SEARCH_PLACEHOLDER": "搜尋..."
},
- "EMPTY_MESSAGE": "No scenarios found. Create or add examples to begin.",
- "SEARCH_EMPTY_MESSAGE": "No scenarios found for this search.",
+ "EMPTY_MESSAGE": "找不到情境。請建立或新增範例以開始。",
+ "SEARCH_EMPTY_MESSAGE": "找不到符合搜尋條件的情境。",
"API": {
"ADD": {
- "SUCCESS": "Scenarios added successfully",
- "ERROR": "There was an error adding scenarios, please try again."
+ "SUCCESS": "情境已成功新增",
+ "ERROR": "新增情境時發生錯誤,請重試。"
},
"UPDATE": {
- "SUCCESS": "Scenarios updated successfully",
- "ERROR": "There was an error updating scenarios, please try again."
+ "SUCCESS": "情境已成功更新",
+ "ERROR": "更新情境時發生錯誤,請重試。"
},
"DELETE": {
- "SUCCESS": "Scenarios deleted successfully",
- "ERROR": "There was an error deleting scenarios, please try again."
+ "SUCCESS": "情境已成功刪除",
+ "ERROR": "刪除情境時發生錯誤,請重試。"
}
}
}
},
"DOCUMENTS": {
- "HEADER": "Documents",
- "ADD_NEW": "Create a new document",
- "SELECTED": "{count} selected",
- "SELECT_ALL": "Select all ({count})",
- "UNSELECT_ALL": "Unselect all ({count})",
+ "HEADER": "文件",
+ "ADD_NEW": "建立新文件",
+ "SELECTED": "已選擇 {count} 個",
+ "SELECT_ALL": "全選({count})",
+ "UNSELECT_ALL": "取消全選({count})",
"BULK_DELETE_BUTTON": "刪除",
"BULK_DELETE": {
- "TITLE": "Delete documents?",
- "DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
- "CONFIRM": "Yes, delete all",
- "SUCCESS_MESSAGE": "Documents deleted successfully",
- "ERROR_MESSAGE": "There was an error deleting the documents, please try again."
+ "TITLE": "刪除文件?",
+ "DESCRIPTION": "您確定要刪除所選的文件嗎?此操作無法復原。",
+ "CONFIRM": "是,全部刪除",
+ "SUCCESS_MESSAGE": "文件已成功刪除",
+ "ERROR_MESSAGE": "刪除文件時發生錯誤,請重試。"
},
"RELATED_RESPONSES": {
- "TITLE": "Related FAQs",
- "DESCRIPTION": "These FAQs are generated directly from the document."
+ "TITLE": "相關常見問答",
+ "DESCRIPTION": "這些常見問答是直接從文件中生成的。"
},
- "FORM_DESCRIPTION": "Enter the URL of the document to add it as a knowledge source and choose the assistant to associate it with.",
+ "FORM_DESCRIPTION": "請輸入文件的 URL 將其新增為知識來源,並選擇要關聯的助理。",
"CREATE": {
- "TITLE": "Add a document",
- "SUCCESS_MESSAGE": "The document has been successfully created",
- "ERROR_MESSAGE": "There was an error creating the document, please try again."
+ "TITLE": "新增文件",
+ "SUCCESS_MESSAGE": "文件已成功建立",
+ "ERROR_MESSAGE": "建立文件時發生錯誤,請重試。"
},
"FORM": {
"TYPE": {
- "LABEL": "Document Type",
+ "LABEL": "文件類型",
"URL": "URL",
- "PDF": "PDF File"
+ "PDF": "PDF 檔案"
},
"URL": {
"LABEL": "URL",
- "PLACEHOLDER": "Enter the URL of the document",
- "ERROR": "Please provide a valid URL for the document"
+ "PLACEHOLDER": "請輸入文件的 URL",
+ "ERROR": "請提供有效的文件 URL"
},
"PDF_FILE": {
- "LABEL": "PDF File",
- "CHOOSE_FILE": "Choose PDF file",
- "ERROR": "Please select a PDF file",
- "HELP_TEXT": "Maximum file size: 10MB",
- "INVALID_TYPE": "Please select a valid PDF file",
- "TOO_LARGE": "File size exceeds 10MB limit"
+ "LABEL": "PDF 檔案",
+ "CHOOSE_FILE": "選擇 PDF 檔案",
+ "ERROR": "請選擇一個 PDF 檔案",
+ "HELP_TEXT": "檔案大小上限:10MB",
+ "INVALID_TYPE": "請選擇有效的 PDF 檔案",
+ "TOO_LARGE": "檔案大小超過 10MB 限制"
},
"NAME": {
- "LABEL": "Document Name (Optional)",
- "PLACEHOLDER": "Enter a name for the document"
+ "LABEL": "文件名稱(選填)",
+ "PLACEHOLDER": "請輸入文件名稱"
}
},
"DELETE": {
- "TITLE": "Are you sure to delete the document?",
- "DESCRIPTION": "This action is permanent. Deleting this document will permanently erase all generated knowledge.",
- "CONFIRM": "是的,刪除",
- "SUCCESS_MESSAGE": "The document has been successfully deleted",
- "ERROR_MESSAGE": "There was an error deleting the document, please try again."
+ "TITLE": "您確定要刪除此文件嗎?",
+ "DESCRIPTION": "此操作不可復原。刪除此文件將永久清除所有已生成的知識。",
+ "CONFIRM": "是,刪除",
+ "SUCCESS_MESSAGE": "文件已成功刪除",
+ "ERROR_MESSAGE": "刪除文件時發生錯誤,請重試。"
},
"OPTIONS": {
- "VIEW_RELATED_RESPONSES": "View Related Responses",
- "DELETE_DOCUMENT": "Delete Document"
+ "VIEW_RELATED_RESPONSES": "檢視相關回應",
+ "DELETE_DOCUMENT": "刪除文件"
},
"EMPTY_STATE": {
- "TITLE": "No documents available",
- "SUBTITLE": "Documents are used by your assistant to generate FAQs. You can import documents to provide context for your assistant.",
+ "TITLE": "沒有可用的文件",
+ "SUBTITLE": "文件可供助理生成常見問答。您可以匯入文件為助理提供知識來源。",
"FEATURE_SPOTLIGHT": {
- "TITLE": "Captain Document",
- "NOTE": "A document in Captain serves as a knowledge resource for the assistant. By connecting your help center or guides, Captain can analyze the content and provide accurate responses for customer inquiries."
+ "TITLE": "Captain 文件",
+ "NOTE": "Captain 中的文件可作為助理的知識資源。透過連接您的幫助中心或指南,Captain 能分析內容並為客戶詢問提供準確的回應。"
}
}
},
"CUSTOM_TOOLS": {
- "HEADER": "Tools",
- "ADD_NEW": "Create a new tool",
- "SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
+ "HEADER": "工具",
+ "ADD_NEW": "建立新工具",
+ "SOFT_LIMIT_WARNING": "擁有超過 10 個工具可能會降低助理選擇正確工具的可靠性。建議移除未使用的工具以獲得更好的效果。",
"EMPTY_STATE": {
- "TITLE": "No custom tools available",
- "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "TITLE": "沒有可用的自訂工具",
+ "SUBTITLE": "建立自訂工具將您的助理與外部 API 和服務連接,使其能夠代您取得資料並執行操作。",
"FEATURE_SPOTLIGHT": {
- "TITLE": "Custom Tools",
- "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ "TITLE": "自訂工具",
+ "NOTE": "自訂工具讓您的助理能與外部 API 和服務互動。建立工具以取得資料、執行操作,或與您現有的系統整合,以增強助理的能力。"
}
},
- "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "FORM_DESCRIPTION": "設定您的自訂工具以連接外部 API",
"OPTIONS": {
- "EDIT_TOOL": "Edit tool",
- "DELETE_TOOL": "Delete tool"
+ "EDIT_TOOL": "編輯工具",
+ "DELETE_TOOL": "刪除工具"
},
"CREATE": {
- "TITLE": "Create Custom Tool",
- "SUCCESS_MESSAGE": "Custom tool created successfully",
- "ERROR_MESSAGE": "Failed to create custom tool"
+ "TITLE": "建立自訂工具",
+ "SUCCESS_MESSAGE": "自訂工具已成功建立",
+ "ERROR_MESSAGE": "建立自訂工具失敗"
},
"EDIT": {
- "TITLE": "Edit Custom Tool",
- "SUCCESS_MESSAGE": "Custom tool updated successfully",
- "ERROR_MESSAGE": "Failed to update custom tool"
+ "TITLE": "編輯自訂工具",
+ "SUCCESS_MESSAGE": "自訂工具已成功更新",
+ "ERROR_MESSAGE": "更新自訂工具失敗"
},
"DELETE": {
- "TITLE": "Delete Custom Tool",
- "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
- "CONFIRM": "是的,刪除",
- "SUCCESS_MESSAGE": "Custom tool deleted successfully",
- "ERROR_MESSAGE": "Failed to delete custom tool"
+ "TITLE": "刪除自訂工具",
+ "DESCRIPTION": "您確定要刪除此自訂工具嗎?此操作無法復原。",
+ "CONFIRM": "是,刪除",
+ "SUCCESS_MESSAGE": "自訂工具已成功刪除",
+ "ERROR_MESSAGE": "刪除自訂工具失敗"
+ },
+ "TEST": {
+ "BUTTON": "測試連接",
+ "SUCCESS": "端點回傳 HTTP {status}",
+ "ERROR": "連接失敗",
+ "DISABLED_HINT": "測試功能僅適用於沒有範本或請求內容的端點。"
},
"TEST": {
"BUTTON": "Test connection",
@@ -845,25 +851,25 @@
},
"FORM": {
"TITLE": {
- "LABEL": "Tool Name",
- "PLACEHOLDER": "Order Lookup",
- "ERROR": "Tool name is required",
- "MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
+ "LABEL": "工具名稱",
+ "PLACEHOLDER": "訂單查詢",
+ "ERROR": "工具名稱為必填",
+ "MAX_LENGTH_ERROR": "工具名稱不得超過 {max} 個字元"
},
"DESCRIPTION": {
- "LABEL": "描述資訊",
- "PLACEHOLDER": "Looks up order details by order ID"
+ "LABEL": "描述",
+ "PLACEHOLDER": "依訂單 ID 查詢訂單詳情"
},
"HTTP_METHOD": {
- "LABEL": "Method"
+ "LABEL": "方法"
},
"ENDPOINT_URL": {
- "LABEL": "Endpoint URL",
+ "LABEL": "端點 URL",
"PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
- "ERROR": "Valid URL is required"
+ "ERROR": "請輸入有效的 URL"
},
"AUTH_TYPE": {
- "LABEL": "Authentication Type"
+ "LABEL": "驗證類型"
},
"AUTH_TYPES": {
"NONE": "無",
@@ -873,168 +879,168 @@
},
"AUTH_CONFIG": {
"BEARER_TOKEN": "Bearer Token",
- "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
- "USERNAME": "Username",
- "USERNAME_PLACEHOLDER": "Enter username",
+ "BEARER_TOKEN_PLACEHOLDER": "請輸入您的 Bearer Token",
+ "USERNAME": "使用者名稱",
+ "USERNAME_PLACEHOLDER": "請輸入使用者名稱",
"PASSWORD": "密碼",
- "PASSWORD_PLACEHOLDER": "Enter password",
- "API_KEY": "Header Name",
+ "PASSWORD_PLACEHOLDER": "請輸入密碼",
+ "API_KEY": "Header 名稱",
"API_KEY_PLACEHOLDER": "X-API-Key",
- "API_VALUE": "Header Value",
- "API_VALUE_PLACEHOLDER": "Enter API key value"
+ "API_VALUE": "Header 值",
+ "API_VALUE_PLACEHOLDER": "請輸入 API Key 值"
},
"PARAMETERS": {
- "LABEL": "Parameters",
- "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ "LABEL": "參數",
+ "HELP_TEXT": "定義將從使用者查詢中提取的參數"
},
- "ADD_PARAMETER": "Add Parameter",
+ "ADD_PARAMETER": "新增參數",
"PARAM_NAME": {
- "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ "PLACEHOLDER": "參數名稱(例如 order_id)"
},
"PARAM_TYPE": {
- "PLACEHOLDER": "類別"
+ "PLACEHOLDER": "類型"
},
"PARAM_TYPES": {
"STRING": "String",
- "NUMBER": "數字",
+ "NUMBER": "Number",
"BOOLEAN": "Boolean",
"ARRAY": "Array",
"OBJECT": "Object"
},
"PARAM_DESCRIPTION": {
- "PLACEHOLDER": "Description of the parameter"
+ "PLACEHOLDER": "參數描述"
},
"PARAM_REQUIRED": {
- "LABEL": "Required"
+ "LABEL": "必填"
},
"REQUEST_TEMPLATE": {
- "LABEL": "Request Body Template (Optional)",
+ "LABEL": "請求內容範本(選填)",
"PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
},
"RESPONSE_TEMPLATE": {
- "LABEL": "Response Template (Optional)",
+ "LABEL": "回應範本(選填)",
"PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
},
"ERRORS": {
- "PARAM_NAME_REQUIRED": "Parameter name is required"
+ "PARAM_NAME_REQUIRED": "參數名稱為必填"
}
}
},
"RESPONSES": {
- "HEADER": "FAQs",
- "PENDING_FAQS": "Pending FAQs",
- "ADD_NEW": "Create new FAQ",
+ "HEADER": "常見問答",
+ "PENDING_FAQS": "待審核的常見問答",
+ "ADD_NEW": "建立新的常見問答",
"DOCUMENTABLE": {
- "CONVERSATION": "Conversation #{id}"
+ "CONVERSATION": "對話 #{id}"
},
- "SELECTED": "{count} selected",
- "SELECT_ALL": "Select all ({count})",
- "UNSELECT_ALL": "Unselect all ({count})",
- "SEARCH_PLACEHOLDER": "Search FAQs...",
- "BULK_APPROVE_BUTTON": "Approve",
+ "SELECTED": "已選擇 {count} 個",
+ "SELECT_ALL": "全選({count})",
+ "UNSELECT_ALL": "取消全選({count})",
+ "SEARCH_PLACEHOLDER": "搜尋常見問答...",
+ "BULK_APPROVE_BUTTON": "核准",
"BULK_DELETE_BUTTON": "刪除",
"BULK_APPROVE": {
- "SUCCESS_MESSAGE": "FAQs approved successfully",
- "ERROR_MESSAGE": "There was an error approving the FAQs, please try again."
+ "SUCCESS_MESSAGE": "常見問答已成功核准",
+ "ERROR_MESSAGE": "核准常見問答時發生錯誤,請重試。"
},
"BULK_DELETE": {
- "TITLE": "Delete FAQs?",
- "DESCRIPTION": "Are you sure you want to delete the selected FAQs? This action cannot be undone.",
- "CONFIRM": "Yes, delete all",
- "SUCCESS_MESSAGE": "FAQs deleted successfully",
- "ERROR_MESSAGE": "There was an error deleting the FAQs, please try again."
+ "TITLE": "刪除常見問答?",
+ "DESCRIPTION": "您確定要刪除所選的常見問答嗎?此操作無法復原。",
+ "CONFIRM": "是,全部刪除",
+ "SUCCESS_MESSAGE": "常見問答已成功刪除",
+ "ERROR_MESSAGE": "刪除常見問答時發生錯誤,請重試。"
},
"DELETE": {
- "TITLE": "Are you sure to delete the FAQ?",
+ "TITLE": "您確定要刪除此常見問答嗎?",
"DESCRIPTION": "",
- "CONFIRM": "是的,刪除",
- "SUCCESS_MESSAGE": "FAQ deleted successfully",
- "ERROR_MESSAGE": "There was an error deleting the FAQ, please try again."
+ "CONFIRM": "是,刪除",
+ "SUCCESS_MESSAGE": "常見問答已成功刪除",
+ "ERROR_MESSAGE": "刪除常見問答時發生錯誤,請重試。"
},
"FILTER": {
- "ASSISTANT": "Assistant: {selected}",
- "STATUS": "Status: {selected}",
- "ALL_ASSISTANTS": "所有的"
+ "ASSISTANT": "助理:{selected}",
+ "STATUS": "狀態:{selected}",
+ "ALL_ASSISTANTS": "全部"
},
"STATUS": {
"TITLE": "狀態",
- "PENDING": "待處理",
- "APPROVED": "Approved",
- "ALL": "所有的"
+ "PENDING": "待審核",
+ "APPROVED": "已核准",
+ "ALL": "全部"
},
"PENDING_BANNER": {
- "TITLE": "Captain has found some FAQs your customers were looking for.",
- "ACTION": "Click here to review"
+ "TITLE": "Captain 發現了一些客戶正在尋找的常見問答。",
+ "ACTION": "點此檢視"
},
- "FORM_DESCRIPTION": "Add a question and its corresponding answer to the knowledge base and select the assistant it should be associated with.",
+ "FORM_DESCRIPTION": "新增問題及其對應的答案至知識庫,並選擇要關聯的助理。",
"CREATE": {
- "TITLE": "Add an FAQ",
- "SUCCESS_MESSAGE": "The response has been added successfully.",
- "ERROR_MESSAGE": "An error occurred while adding the response. Please try again."
+ "TITLE": "新增常見問答",
+ "SUCCESS_MESSAGE": "回應已成功新增。",
+ "ERROR_MESSAGE": "新增回應時發生錯誤,請重試。"
},
"FORM": {
"QUESTION": {
- "LABEL": "Question",
- "PLACEHOLDER": "Enter the question here",
- "ERROR": "Please provide a valid question."
+ "LABEL": "問題",
+ "PLACEHOLDER": "請在此輸入問題",
+ "ERROR": "請提供有效的問題。"
},
"ANSWER": {
- "LABEL": "Answer",
- "PLACEHOLDER": "Enter the answer here",
- "ERROR": "Please provide a valid answer."
+ "LABEL": "答案",
+ "PLACEHOLDER": "請在此輸入答案",
+ "ERROR": "請提供有效的答案。"
}
},
"EDIT": {
- "TITLE": "Update the FAQ",
- "SUCCESS_MESSAGE": "The FAQ has been successfully updated",
- "ERROR_MESSAGE": "There was an error updating the FAQ, please try again",
- "APPROVE_SUCCESS_MESSAGE": "The FAQ was marked as approved"
+ "TITLE": "更新常見問答",
+ "SUCCESS_MESSAGE": "常見問答已成功更新",
+ "ERROR_MESSAGE": "更新常見問答時發生錯誤,請重試",
+ "APPROVE_SUCCESS_MESSAGE": "常見問答已標記為已核准"
},
"OPTIONS": {
- "APPROVE": "Approve",
+ "APPROVE": "核准",
"EDIT_RESPONSE": "編輯",
"DELETE_RESPONSE": "刪除"
},
"EMPTY_STATE": {
- "TITLE": "No FAQs Found",
- "NO_PENDING_TITLE": "There are no more pending FAQs to review",
- "SUBTITLE": "FAQs help your assistant provide quick and accurate answers to questions from your customers. They can be generated automatically from your content or can be added manually.",
- "CLEAR_SEARCH": "Clear active filters",
+ "TITLE": "找不到常見問答",
+ "NO_PENDING_TITLE": "沒有更多待審核的常見問答",
+ "SUBTITLE": "常見問答可幫助助理為客戶的問題提供快速且準確的回答。它們可以從您的內容自動生成,也可以手動新增。",
+ "CLEAR_SEARCH": "清除篩選條件",
"FEATURE_SPOTLIGHT": {
- "TITLE": "Captain FAQ",
- "NOTE": "Captain FAQs detects common customer questions—whether missing from your knowledge base or frequently asked—and generates relevant FAQs to improve support. You can review each suggestion and decide whether to approve or reject it."
+ "TITLE": "Captain 常見問答",
+ "NOTE": "Captain 常見問答會偵測常見的客戶問題——無論是知識庫中缺少的還是經常被問到的——並生成相關的常見問答以改善支援服務。您可以檢視每個建議並決定是否核准或拒絕。"
}
}
},
"INBOXES": {
- "HEADER": "Connected Inboxes",
- "ADD_NEW": "Connect a new inbox",
+ "HEADER": "已連接的收件匣",
+ "ADD_NEW": "連接新的收件匣",
"OPTIONS": {
- "DISCONNECT": "取消連結"
+ "DISCONNECT": "取消連接"
},
"DELETE": {
- "TITLE": "Are you sure to disconnect the inbox?",
+ "TITLE": "您確定要取消連接此收件匣嗎?",
"DESCRIPTION": "",
- "CONFIRM": "是的,刪除",
- "SUCCESS_MESSAGE": "The inbox was successfully disconnected.",
- "ERROR_MESSAGE": "There was an error disconnecting the inbox, please try again."
+ "CONFIRM": "是,刪除",
+ "SUCCESS_MESSAGE": "收件匣已成功取消連接。",
+ "ERROR_MESSAGE": "取消連接收件匣時發生錯誤,請重試。"
},
- "FORM_DESCRIPTION": "Choose an inbox to connect with the assistant.",
+ "FORM_DESCRIPTION": "選擇要與助理連接的收件匣。",
"CREATE": {
- "TITLE": "Connect an Inbox",
- "SUCCESS_MESSAGE": "The inbox was successfully connected.",
- "ERROR_MESSAGE": "An error occurred while connecting the inbox. Please try again."
+ "TITLE": "連接收件匣",
+ "SUCCESS_MESSAGE": "收件匣已成功連接。",
+ "ERROR_MESSAGE": "連接收件匣時發生錯誤,請重試。"
},
"FORM": {
"INBOX": {
"LABEL": "收件匣",
- "PLACEHOLDER": "Choose the inbox to deploy the assistant.",
- "ERROR": "An inbox selection is required."
+ "PLACEHOLDER": "選擇要部署助理的收件匣。",
+ "ERROR": "必須選擇一個收件匣。"
}
},
"EMPTY_STATE": {
- "TITLE": "No Connected Inboxes",
- "SUBTITLE": "Connecting an inbox allows the assistant to handle initial questions from your customers before transferring them to you."
+ "TITLE": "沒有已連接的收件匣",
+ "SUBTITLE": "連接收件匣可讓助理在轉接給您之前,先處理客戶的初始問題。"
}
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/labelsMgmt.json b/app/javascript/dashboard/i18n/locale/zh_TW/labelsMgmt.json
index 44815c8fb..d6e105251 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/labelsMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/labelsMgmt.json
@@ -2,20 +2,20 @@
"LABEL_MGMT": {
"HEADER": "標籤",
"HEADER_BTN_TXT": "新增標籤",
- "LOADING": "正在獲取標籤",
- "DESCRIPTION": "Labels help you categorize and prioritize conversations and leads. You can assign a label to a conversation or contact using the side panel.",
- "LEARN_MORE": "Learn more about labels",
- "COUNT": "{n} label | {n} labels",
+ "LOADING": "正在取得標籤",
+ "DESCRIPTION": "標籤可幫助您分類和排定對話與潛在客戶的優先順序。您可以透過側邊面板將標籤指派給對話或聯絡人。",
+ "LEARN_MORE": "瞭解更多關於標籤",
+ "COUNT": "{n} 個標籤 | {n} 個標籤",
"SEARCH_PLACEHOLDER": "搜尋標籤...",
- "NO_RESULTS": "No labels found matching your search",
- "SEARCH_404": "没有任何項目符合此查詢",
+ "NO_RESULTS": "找不到符合搜尋條件的標籤",
+ "SEARCH_404": "沒有任何項目符合此查詢",
"LIST": {
- "404": "此帳戶中没有可用的標籤。",
+ "404": "此帳戶中沒有可用的標籤。",
"TITLE": "管理標籤",
- "DESC": "標記可以讓您將對話集中起來。",
+ "DESC": "標籤可讓您將對話分組管理。",
"TABLE_HEADER": {
- "NAME": "姓名",
- "DESCRIPTION": "描述資訊",
+ "NAME": "名稱",
+ "DESCRIPTION": "描述",
"COLOR": "顏色",
"ACTION": "操作"
}
@@ -24,12 +24,12 @@
"NAME": {
"LABEL": "標籤名稱",
"PLACEHOLDER": "標籤名稱",
- "REQUIRED_ERROR": "Label name is required",
- "MINIMUM_LENGTH_ERROR": "Minimum length 2 is required",
- "VALID_ERROR": "Only Alphabets, Numbers, Hyphen and Underscore are allowed"
+ "REQUIRED_ERROR": "標籤名稱為必填",
+ "MINIMUM_LENGTH_ERROR": "最少需要 2 個字元",
+ "VALID_ERROR": "僅允許使用英文字母、數字、連字號和底線"
},
"DESCRIPTION": {
- "LABEL": "描述資訊",
+ "LABEL": "描述",
"PLACEHOLDER": "標籤描述"
},
"COLOR": {
@@ -41,48 +41,48 @@
"EDIT": "編輯",
"CREATE": "建立",
"DELETE": "刪除",
- "CANCEL": "取消操作"
+ "CANCEL": "取消"
},
"SUGGESTIONS": {
"TOOLTIP": {
- "SINGLE_SUGGESTION": "Add label to conversation",
- "MULTIPLE_SUGGESTION": "Select this label",
- "DESELECT": "Deselect label",
- "DISMISS": "Dismiss suggestion"
+ "SINGLE_SUGGESTION": "新增標籤至對話",
+ "MULTIPLE_SUGGESTION": "選擇此標籤",
+ "DESELECT": "取消選擇標籤",
+ "DISMISS": "關閉建議"
},
"POWERED_BY": "Chatwoot AI",
- "DISMISS": "Dismiss",
- "ADD_SELECTED_LABELS": "Add selected labels",
- "ADD_SELECTED_LABEL": "Add selected label",
- "ADD_ALL_LABELS": "Add all labels",
- "SUGGESTED_LABELS": "Suggested labels"
+ "DISMISS": "關閉",
+ "ADD_SELECTED_LABELS": "新增已選標籤",
+ "ADD_SELECTED_LABEL": "新增已選標籤",
+ "ADD_ALL_LABELS": "新增所有標籤",
+ "SUGGESTED_LABELS": "建議標籤"
},
"ADD": {
"TITLE": "新增標籤",
- "DESC": "標記可以讓您將對話集中起來。",
+ "DESC": "標籤可讓您將對話分組管理。",
"API": {
"SUCCESS_MESSAGE": "標籤新增成功",
- "ERROR_MESSAGE": "出現錯誤,請重試"
+ "ERROR_MESSAGE": "發生錯誤,請再試一次"
}
},
"EDIT": {
"TITLE": "編輯標籤",
"API": {
- "SUCCESS_MESSAGE": "標籤已成功更新",
- "ERROR_MESSAGE": "出錯了,請重試"
+ "SUCCESS_MESSAGE": "標籤更新成功",
+ "ERROR_MESSAGE": "發生錯誤,請再試一次"
}
},
"DELETE": {
"BUTTON_TEXT": "刪除",
"API": {
- "SUCCESS_MESSAGE": "標籤已成功刪除",
- "ERROR_MESSAGE": "出錯了,請重試"
+ "SUCCESS_MESSAGE": "標籤刪除成功",
+ "ERROR_MESSAGE": "發生錯誤,請再試一次"
},
"CONFIRM": {
"TITLE": "確認刪除",
- "MESSAGE": "您確定要刪除吗? ",
- "YES": "是,刪除 ",
- "NO": "不,保留 "
+ "MESSAGE": "您確定要刪除嗎?",
+ "YES": "是,刪除",
+ "NO": "不,保留"
}
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/login.json b/app/javascript/dashboard/i18n/locale/zh_TW/login.json
index ed9850494..ff21105b1 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/login.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/login.json
@@ -1,10 +1,10 @@
{
"LOGIN": {
- "TITLE": "登入到 Chatwoot",
+ "TITLE": "登入 Chatwoot",
"EMAIL": {
"LABEL": "電子郵件",
- "PLACEHOLDER": "例項 {'@'}companyname.com",
- "ERROR": "請輸入一個有效的電子信箱"
+ "PLACEHOLDER": "example{'@'}companyname.com",
+ "ERROR": "請輸入有效的電子郵件地址"
},
"PASSWORD": {
"LABEL": "密碼",
@@ -12,13 +12,13 @@
},
"API": {
"SUCCESS_MESSAGE": "登入成功",
- "ERROR_MESSAGE": "無法連線Woot伺服器,請稍後再試",
+ "ERROR_MESSAGE": "無法連線至 Woot 伺服器,請稍後再試。",
"UNAUTH": "使用者名稱或密碼不正確,請重試。"
},
"OAUTH": {
- "GOOGLE_LOGIN": "使用Google登入",
+ "GOOGLE_LOGIN": "使用 Google 登入",
"BUSINESS_ACCOUNTS_ONLY": "請使用您的公司電子郵件地址登入",
- "NO_ACCOUNT_FOUND": "我們找不到您的電子郵件地址的帳戶。"
+ "NO_ACCOUNT_FOUND": "找不到與您的電子郵件地址相關聯的帳戶。"
},
"FORGOT_PASSWORD": "忘記密碼了?",
"CREATE_NEW_ACCOUNT": "建立新帳戶",
@@ -29,12 +29,12 @@
"SUBTITLE": "輸入您的工作電子郵件以存取您的組織",
"BACK_TO_LOGIN": "透過密碼登入",
"WORK_EMAIL": {
- "LABEL": "工作信箱",
+ "LABEL": "工作電子郵件",
"PLACEHOLDER": "輸入您的工作電子郵件"
},
- "SUBMIT": "繼續使用單一登入",
+ "SUBMIT": "繼續使用 SSO",
"API": {
- "ERROR_MESSAGE": "SSO 身份驗證失敗。請檢查您的憑證並重試。"
+ "ERROR_MESSAGE": "SSO 驗證失敗。請檢查您的憑證並重試。"
}
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/macros.json b/app/javascript/dashboard/i18n/locale/zh_TW/macros.json
index 89ba79791..970b746a3 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/macros.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/macros.json
@@ -1,115 +1,115 @@
{
"MACROS": {
- "HEADER": "Macros",
- "DESCRIPTION": "A macro is a set of saved actions that help customer service agents easily complete tasks. The agents can define a set of actions like tagging a conversation with a label, sending an email transcript, updating a custom attribute, etc., and they can run these actions in a single click.",
- "LEARN_MORE": "Learn more about macros",
- "COUNT": "{n} macro | {n} macros",
- "HEADER_BTN_TXT": "Add a new macro",
- "HEADER_BTN_TXT_SAVE": "Save macro",
- "LOADING": "Fetching macros",
- "SEARCH_PLACEHOLDER": "Search macros...",
- "NO_RESULTS": "No macros found matching your search",
- "ERROR": "Something went wrong. Please try again",
- "ORDER_INFO": "Macros will run in the order you add your actions. You can rearrange them by dragging them by the handle beside each node.",
+ "HEADER": "巨集",
+ "DESCRIPTION": "巨集是一組預先儲存的動作,可協助客服人員輕鬆完成工作。客服人員可以定義一系列動作,例如為對話加上標籤、傳送電子郵件副本、更新自訂屬性等,並透過一鍵執行這些動作。",
+ "LEARN_MORE": "瞭解更多關於巨集的資訊",
+ "COUNT": "{n} 個巨集",
+ "HEADER_BTN_TXT": "新增巨集",
+ "HEADER_BTN_TXT_SAVE": "儲存巨集",
+ "LOADING": "正在載入巨集",
+ "SEARCH_PLACEHOLDER": "搜尋巨集...",
+ "NO_RESULTS": "找不到符合搜尋條件的巨集",
+ "ERROR": "發生錯誤,請重試",
+ "ORDER_INFO": "巨集將依照您新增動作的順序執行。您可以拖曳每個節點旁邊的控制點來重新排列順序。",
"ADD": {
"FORM": {
"NAME": {
- "LABEL": "Macro name",
- "PLACEHOLDER": "Enter a name for your macro",
- "ERROR": "Name is required for creating a macro"
+ "LABEL": "巨集名稱",
+ "PLACEHOLDER": "請輸入巨集名稱",
+ "ERROR": "建立巨集時必須填寫名稱"
},
"ACTIONS": {
- "LABEL": "操作"
+ "LABEL": "動作"
}
},
"API": {
- "SUCCESS_MESSAGE": "Macro added successfully",
- "ERROR_MESSAGE": "Unable to create macro, Please try again later"
+ "SUCCESS_MESSAGE": "巨集新增成功",
+ "ERROR_MESSAGE": "無法建立巨集,請稍後再試"
}
},
"LIST": {
"TABLE_HEADER": {
- "NAME": "姓名",
- "CREATED BY": "Created by",
- "LAST_UPDATED_BY": "Last updated by",
- "VISIBILITY": "Visibility",
- "ACTIONS": "操作"
+ "NAME": "名稱",
+ "CREATED BY": "建立者",
+ "LAST_UPDATED_BY": "最後更新者",
+ "VISIBILITY": "可見範圍",
+ "ACTIONS": "動作"
},
- "404": "No macros found"
+ "404": "找不到任何巨集"
},
"DELETE": {
- "TOOLTIP": "Delete macro",
+ "TOOLTIP": "刪除巨集",
"CONFIRM": {
- "MESSAGE": "您確定要刪除嗎? ",
+ "MESSAGE": "您確定要刪除 ",
"YES": "是,刪除",
"NO": "否"
},
"API": {
- "SUCCESS_MESSAGE": "Macro deleted successfully",
- "ERROR_MESSAGE": "There was an error deleting the macro. Please try again later"
+ "SUCCESS_MESSAGE": "巨集已成功刪除",
+ "ERROR_MESSAGE": "刪除巨集時發生錯誤,請稍後再試"
}
},
"EDIT": {
- "TOOLTIP": "Edit macro",
+ "TOOLTIP": "編輯巨集",
"API": {
- "SUCCESS_MESSAGE": "Macro updated successfully",
- "ERROR_MESSAGE": "Could not update Macro, Please try again later"
+ "SUCCESS_MESSAGE": "巨集已成功更新",
+ "ERROR_MESSAGE": "無法更新巨集,請稍後再試"
}
},
"EDITOR": {
- "START_FLOW": "Start Flow",
- "END_FLOW": "End Flow",
- "LOADING": "Fetching macro",
- "ADD_BTN_TOOLTIP": "Add new action",
- "DELETE_BTN_TOOLTIP": "Delete Action",
+ "START_FLOW": "開始流程",
+ "END_FLOW": "結束流程",
+ "LOADING": "正在載入巨集",
+ "ADD_BTN_TOOLTIP": "新增動作",
+ "DELETE_BTN_TOOLTIP": "刪除動作",
"VISIBILITY": {
- "LABEL": "Macro Visibility",
+ "LABEL": "巨集可見範圍",
"GLOBAL": {
- "LABEL": "Public",
- "DESCRIPTION": "This macro is available publicly for all agents in this account."
+ "LABEL": "公開",
+ "DESCRIPTION": "此巨集對帳號中的所有客服人員公開可用。"
},
"PERSONAL": {
- "LABEL": "Private",
- "DESCRIPTION": "This macro will be private to you and not be available to others."
+ "LABEL": "私人",
+ "DESCRIPTION": "此巨集僅限您個人使用,其他人無法使用。"
}
}
},
"EXECUTE": {
- "BUTTON_TOOLTIP": "Execute",
- "PREVIEW": "Preview Macro",
- "EXECUTED_SUCCESSFULLY": "Macro executed successfully"
+ "BUTTON_TOOLTIP": "執行",
+ "PREVIEW": "預覽巨集",
+ "EXECUTED_SUCCESSFULLY": "巨集已成功執行"
},
"ERRORS": {
- "ATTRIBUTE_KEY_REQUIRED": "Attribute key is required",
- "FILTER_OPERATOR_REQUIRED": "Filter operator is required",
- "VALUE_REQUIRED": "此欄位為必填項目",
- "VALUE_MUST_BE_BETWEEN_1_AND_998": "Value must be between 1 and 998",
- "ACTION_PARAMETERS_REQUIRED": "Action parameters are required",
- "ATLEAST_ONE_CONDITION_REQUIRED": "At least one condition is required",
- "ATLEAST_ONE_ACTION_REQUIRED": "At least one action is required"
+ "ATTRIBUTE_KEY_REQUIRED": "屬性鍵為必填",
+ "FILTER_OPERATOR_REQUIRED": "篩選運算子為必填",
+ "VALUE_REQUIRED": "此欄位為必填",
+ "VALUE_MUST_BE_BETWEEN_1_AND_998": "數值必須介於 1 到 998 之間",
+ "ACTION_PARAMETERS_REQUIRED": "動作參數為必填",
+ "ATLEAST_ONE_CONDITION_REQUIRED": "至少需要一個條件",
+ "ATLEAST_ONE_ACTION_REQUIRED": "至少需要一個動作"
},
"ACTIONS": {
- "ASSIGN_TEAM": "Assign a Team",
- "ASSIGN_AGENT": "Assign an Agent",
- "ADD_LABEL": "Add a Label",
- "REMOVE_LABEL": "Remove a Label",
- "REMOVE_ASSIGNED_TEAM": "Remove Assigned Team",
- "SEND_EMAIL_TRANSCRIPT": "Send an Email Transcript",
+ "ASSIGN_TEAM": "指派團隊",
+ "ASSIGN_AGENT": "指派客服人員",
+ "ADD_LABEL": "新增標籤",
+ "REMOVE_LABEL": "移除標籤",
+ "REMOVE_ASSIGNED_TEAM": "移除已指派的團隊",
+ "SEND_EMAIL_TRANSCRIPT": "傳送電子郵件副本",
"MUTE_CONVERSATION": "將對話靜音",
- "SNOOZE_CONVERSATION": "Snooze Conversation",
- "RESOLVE_CONVERSATION": "Resolve Conversation",
- "SEND_ATTACHMENT": "Send Attachment",
- "SEND_MESSAGE": "Send a Message",
- "CHANGE_PRIORITY": "Change Priority",
- "ADD_PRIVATE_NOTE": "Add a Private Note",
- "SEND_WEBHOOK_EVENT": "Send Webhook Event"
+ "SNOOZE_CONVERSATION": "暫停對話提醒",
+ "RESOLVE_CONVERSATION": "解決對話",
+ "SEND_ATTACHMENT": "傳送附件",
+ "SEND_MESSAGE": "傳送訊息",
+ "CHANGE_PRIORITY": "變更優先順序",
+ "ADD_PRIVATE_NOTE": "新增私人備註",
+ "SEND_WEBHOOK_EVENT": "傳送 Webhook 事件"
},
"PRIORITY_TYPES": {
"NONE": "無",
- "LOW": "Low",
- "MEDIUM": "Medium",
- "HIGH": "High",
- "URGENT": "Urgent"
+ "LOW": "低",
+ "MEDIUM": "中",
+ "HIGH": "高",
+ "URGENT": "緊急"
}
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/mfa.json b/app/javascript/dashboard/i18n/locale/zh_TW/mfa.json
index 728deecbc..3616edaec 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/mfa.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/mfa.json
@@ -1,106 +1,106 @@
{
"MFA_SETTINGS": {
- "TITLE": "Two-Factor Authentication",
- "SUBTITLE": "Protect your account from unauthorized access with TOTP-based authentication. This adds an extra layer of security to your account.",
- "DESCRIPTION": "Add an extra layer of security to your account using a time-based one-time password (TOTP)",
- "STATUS_TITLE": "Authentication Status",
- "STATUS_DESCRIPTION": "Manage your two-factor authentication settings and backup recovery codes",
+ "TITLE": "雙重驗證",
+ "SUBTITLE": "透過 TOTP 驗證機制保護您的帳號,防止未經授權的存取。這為您的帳號增添了一層額外的安全防護。",
+ "DESCRIPTION": "使用一次性時間密碼 (TOTP) 為您的帳號增加額外的安全防護",
+ "STATUS_TITLE": "驗證狀態",
+ "STATUS_DESCRIPTION": "管理您的雙重驗證設定及備用還原碼",
"ENABLED": "已啟用",
"DISABLED": "已停用",
- "STATUS_ENABLED": "Two-factor authentication is active",
- "STATUS_ENABLED_DESC": "Your account is protected with an additional layer of security",
- "ENABLE_BUTTON": "Enable Two-Factor Authentication",
- "ENHANCE_SECURITY": "Enhance Your Account Security",
- "ENHANCE_SECURITY_DESC": "Two-factor authentication adds an extra layer of security by requiring a verification code from your authenticator app in addition to your password.",
+ "STATUS_ENABLED": "雙重驗證已啟用",
+ "STATUS_ENABLED_DESC": "您的帳號已受到額外安全層的保護",
+ "ENABLE_BUTTON": "啟用雙重驗證",
+ "ENHANCE_SECURITY": "加強帳號安全性",
+ "ENHANCE_SECURITY_DESC": "雙重驗證透過在密碼之外要求驗證器應用程式提供驗證碼,為帳號增加額外的安全防護。",
"SETUP": {
"STEP_NUMBER_1": "1",
"STEP_NUMBER_2": "2",
- "STEP1_TITLE": "Scan QR Code with Your Authenticator App",
- "STEP1_DESCRIPTION": "Use Google Authenticator, Authy, or any TOTP-compatible app",
- "LOADING_QR": "Loading...",
- "MANUAL_ENTRY": "Can't scan? Enter code manually",
- "SECRET_KEY": "Secret Key",
+ "STEP1_TITLE": "使用驗證器應用程式掃描 QR Code",
+ "STEP1_DESCRIPTION": "請使用 Google Authenticator、Authy 或任何相容 TOTP 的應用程式",
+ "LOADING_QR": "載入中...",
+ "MANUAL_ENTRY": "無法掃描?請手動輸入代碼",
+ "SECRET_KEY": "密鑰",
"COPY": "複製",
- "ENTER_CODE": "Enter the 6-digit code from your authenticator app",
+ "ENTER_CODE": "請輸入驗證器應用程式中的 6 位數驗證碼",
"ENTER_CODE_PLACEHOLDER": "000000",
- "VERIFY_BUTTON": "Verify & Continue",
+ "VERIFY_BUTTON": "驗證並繼續",
"CANCEL": "取消",
- "ERROR_STARTING": "MFA not enabled. Please contact administrator.",
- "INVALID_CODE": "Invalid verification code",
- "SECRET_COPIED": "Secret key copied to clipboard",
- "SUCCESS": "Two-factor authentication has been enabled successfully"
+ "ERROR_STARTING": "MFA 未啟用,請聯繫管理員。",
+ "INVALID_CODE": "驗證碼無效",
+ "SECRET_COPIED": "密鑰已複製到剪貼簿",
+ "SUCCESS": "雙重驗證已成功啟用"
},
"BACKUP": {
- "TITLE": "Save Your Backup Codes",
- "DESCRIPTION": "Keep these codes safe. Each can be used once if you lose access to your authenticator",
- "IMPORTANT": "Important:",
- "IMPORTANT_NOTE": " Save these codes in a secure location. You won't be able to see them again.",
+ "TITLE": "儲存您的備用碼",
+ "DESCRIPTION": "請妥善保管這些備用碼。當您無法使用驗證器時,每組備用碼可使用一次",
+ "IMPORTANT": "重要:",
+ "IMPORTANT_NOTE": "請將這些備用碼存放在安全的地方,您將無法再次查看。",
"DOWNLOAD": "下載",
- "COPY_ALL": "Copy All",
- "CONFIRM": "I have saved my backup codes in a secure location and understand that I won't be able to see them again",
- "COMPLETE_SETUP": "Complete Setup",
- "CODES_COPIED": "Backup codes copied to clipboard"
+ "COPY_ALL": "全部複製",
+ "CONFIRM": "我已將備用碼存放在安全的地方,並了解將無法再次查看",
+ "COMPLETE_SETUP": "完成設定",
+ "CODES_COPIED": "備用碼已複製到剪貼簿"
},
"MANAGEMENT": {
- "BACKUP_CODES": "Backup Codes",
- "BACKUP_CODES_DESC": "Generate new codes if you've lost or used your existing ones",
- "REGENERATE": "Regenerate Backup Codes",
- "DISABLE_MFA": "Disable 2FA",
- "DISABLE_MFA_DESC": "Remove two-factor authentication from your account",
- "DISABLE_BUTTON": "Disable Two-Factor Authentication"
+ "BACKUP_CODES": "備用碼",
+ "BACKUP_CODES_DESC": "若您已遺失或用完備用碼,請重新產生新的備用碼",
+ "REGENERATE": "重新產生備用碼",
+ "DISABLE_MFA": "停用 2FA",
+ "DISABLE_MFA_DESC": "移除帳號的雙重驗證",
+ "DISABLE_BUTTON": "停用雙重驗證"
},
"DISABLE": {
- "TITLE": "Disable Two-Factor Authentication",
- "DESCRIPTION": "You'll need to enter your password and a verification code to disable two-factor authentication.",
+ "TITLE": "停用雙重驗證",
+ "DESCRIPTION": "您需要輸入密碼和驗證碼才能停用雙重驗證。",
"PASSWORD": "密碼",
- "OTP_CODE": "Verification Code",
+ "OTP_CODE": "驗證碼",
"OTP_CODE_PLACEHOLDER": "000000",
- "CONFIRM": "Disable 2FA",
+ "CONFIRM": "停用 2FA",
"CANCEL": "取消",
- "SUCCESS": "Two-factor authentication has been disabled",
- "ERROR": "Failed to disable MFA. Please check your credentials."
+ "SUCCESS": "雙重驗證已停用",
+ "ERROR": "停用 MFA 失敗,請確認您的帳號憑證。"
},
"REGENERATE": {
- "TITLE": "Regenerate Backup Codes",
- "DESCRIPTION": "This will invalidate your existing backup codes and generate new ones. Enter your verification code to continue.",
- "OTP_CODE": "Verification Code",
+ "TITLE": "重新產生備用碼",
+ "DESCRIPTION": "此操作將使現有的備用碼失效,並產生新的備用碼。請輸入驗證碼以繼續。",
+ "OTP_CODE": "驗證碼",
"OTP_CODE_PLACEHOLDER": "000000",
- "CONFIRM": "Generate New Codes",
+ "CONFIRM": "產生新備用碼",
"CANCEL": "取消",
- "NEW_CODES_TITLE": "New Backup Codes Generated",
- "NEW_CODES_DESC": "Your old backup codes have been invalidated. Save these new codes in a secure location.",
- "CODES_IMPORTANT": "Important:",
- "CODES_IMPORTANT_NOTE": " Each code can only be used once. Save them before closing this window.",
- "DOWNLOAD_CODES": "Download Codes",
- "COPY_ALL_CODES": "Copy All Codes",
- "CODES_SAVED": "I've Saved My Codes",
- "SUCCESS": "New backup codes have been generated",
- "ERROR": "Failed to regenerate backup codes"
+ "NEW_CODES_TITLE": "已產生新的備用碼",
+ "NEW_CODES_DESC": "您先前的備用碼已失效。請將這些新備用碼存放在安全的地方。",
+ "CODES_IMPORTANT": "重要:",
+ "CODES_IMPORTANT_NOTE": "每組備用碼僅能使用一次,請在關閉此視窗前妥善儲存。",
+ "DOWNLOAD_CODES": "下載備用碼",
+ "COPY_ALL_CODES": "複製全部備用碼",
+ "CODES_SAVED": "我已儲存備用碼",
+ "SUCCESS": "已產生新的備用碼",
+ "ERROR": "重新產生備用碼失敗"
}
},
"MFA_VERIFICATION": {
- "TITLE": "Two-Factor Authentication",
- "DESCRIPTION": "Enter your verification code to continue",
- "AUTHENTICATOR_APP": "Authenticator App",
- "BACKUP_CODE": "Backup Code",
- "ENTER_OTP_CODE": "Enter 6-digit code from your authenticator app",
- "ENTER_BACKUP_CODE": "Enter one of your backup codes",
+ "TITLE": "雙重驗證",
+ "DESCRIPTION": "請輸入驗證碼以繼續",
+ "AUTHENTICATOR_APP": "驗證器應用程式",
+ "BACKUP_CODE": "備用碼",
+ "ENTER_OTP_CODE": "請輸入驗證器應用程式中的 6 位數驗證碼",
+ "ENTER_BACKUP_CODE": "請輸入您的其中一組備用碼",
"BACKUP_CODE_PLACEHOLDER": "000000",
- "VERIFY_BUTTON": "Verify",
- "TRY_ANOTHER_METHOD": "Try another verification method",
- "CANCEL_LOGIN": "Cancel and return to login",
- "HELP_TEXT": "Having trouble signing in?",
- "LEARN_MORE": "Learn more about 2FA",
+ "VERIFY_BUTTON": "驗證",
+ "TRY_ANOTHER_METHOD": "嘗試其他驗證方式",
+ "CANCEL_LOGIN": "取消並返回登入頁面",
+ "HELP_TEXT": "登入時遇到問題?",
+ "LEARN_MORE": "進一步了解 2FA",
"HELP_MODAL": {
- "TITLE": "Two-Factor Authentication Help",
- "AUTHENTICATOR_TITLE": "Using an Authenticator App",
- "AUTHENTICATOR_DESC": "Open your authenticator app (Google Authenticator, Authy, etc.) and enter the 6-digit code shown for your account.",
- "BACKUP_TITLE": "Using a Backup Code",
- "BACKUP_DESC": "If you don't have access to your authenticator app, you can use one of the backup codes you saved when setting up 2FA. Each code can only be used once.",
- "CONTACT_TITLE": "Need More Help?",
- "CONTACT_DESC_CLOUD": "If you've lost access to both your authenticator app and backup codes, please reach out to Chatwoot support for assistance.",
- "CONTACT_DESC_SELF_HOSTED": "If you've lost access to both your authenticator app and backup codes, please contact your administrator for assistance."
+ "TITLE": "雙重驗證說明",
+ "AUTHENTICATOR_TITLE": "使用驗證器應用程式",
+ "AUTHENTICATOR_DESC": "開啟您的驗證器應用程式(Google Authenticator、Authy 等),並輸入您帳號所顯示的 6 位數驗證碼。",
+ "BACKUP_TITLE": "使用備用碼",
+ "BACKUP_DESC": "若您無法使用驗證器應用程式,可以使用設定 2FA 時所儲存的備用碼。每組備用碼僅能使用一次。",
+ "CONTACT_TITLE": "需要更多協助?",
+ "CONTACT_DESC_CLOUD": "若您無法使用驗證器應用程式及備用碼,請聯繫 Chatwoot 支援團隊以取得協助。",
+ "CONTACT_DESC_SELF_HOSTED": "若您無法使用驗證器應用程式及備用碼,請聯繫您的管理員以取得協助。"
},
- "VERIFICATION_FAILED": "Verification failed. Please try again."
+ "VERIFICATION_FAILED": "驗證失敗,請再試一次。"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/report.json b/app/javascript/dashboard/i18n/locale/zh_TW/report.json
index 1363948ad..3cece1b9b 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/report.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/report.json
@@ -1,137 +1,137 @@
{
"REPORT": {
"HEADER": "對話",
- "LOADING_CHART": "正在載入图表數據...",
- "NO_ENOUGH_DATA": "我們没有收到足夠的數據來生成報表,請稍後再試。",
- "DOWNLOAD_CONVERSATION_REPORTS": "Download conversation reports",
- "DATA_FETCHING_FAILED": "Failed to fetch data, please try again later.",
- "SUMMARY_FETCHING_FAILED": "Failed to fetch summary, please try again later.",
+ "LOADING_CHART": "正在載入圖表資料...",
+ "NO_ENOUGH_DATA": "我們尚未收到足夠的資料來產生報表,請稍後再試。",
+ "DOWNLOAD_CONVERSATION_REPORTS": "下載對話報表",
+ "DATA_FETCHING_FAILED": "無法取得資料,請稍後再試。",
+ "SUMMARY_FETCHING_FAILED": "無法取得摘要,請稍後再試。",
"METRICS": {
"CONVERSATIONS": {
"NAME": "對話",
- "DESC": "(總計)"
+ "DESC": "(總計)"
},
"INCOMING_MESSAGES": {
- "NAME": "收到的消息",
- "DESC": "(總計)"
+ "NAME": "收到的訊息",
+ "DESC": "(總計)"
},
"OUTGOING_MESSAGES": {
- "NAME": "發送的消息",
- "DESC": "(總計)"
+ "NAME": "發送的訊息",
+ "DESC": "(總計)"
},
"FIRST_RESPONSE_TIME": {
- "NAME": "First Response Time",
- "DESC": "( 平均)",
- "INFO_TEXT": "Total number of conversations used for computation:",
- "TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)"
+ "NAME": "首次回應時間",
+ "DESC": "(平均)",
+ "INFO_TEXT": "用於計算的對話總數:",
+ "TOOLTIP_TEXT": "首次回應時間為 {metricValue}(基於 {conversationCount} 則對話)"
},
"RESOLUTION_TIME": {
"NAME": "解決時間",
- "DESC": "( 平均)",
- "INFO_TEXT": "Total number of conversations used for computation:",
- "TOOLTIP_TEXT": "Resolution Time is {metricValue} (based on {conversationCount} conversations)"
+ "DESC": "(平均)",
+ "INFO_TEXT": "用於計算的對話總數:",
+ "TOOLTIP_TEXT": "解決時間為 {metricValue}(基於 {conversationCount} 則對話)"
},
"RESOLUTION_COUNT": {
- "NAME": "已解決的數量",
- "DESC": "(總計)"
+ "NAME": "已解決數量",
+ "DESC": "(總計)"
},
"BOT_RESOLUTION_COUNT": {
- "NAME": "已解決的數量",
- "DESC": "(總計)"
+ "NAME": "已解決數量",
+ "DESC": "(總計)"
},
"BOT_HANDOFF_COUNT": {
- "NAME": "Handoff Count",
- "DESC": "(總計)"
+ "NAME": "轉接數量",
+ "DESC": "(總計)"
},
"REPLY_TIME": {
- "NAME": "Customer waiting time",
- "TOOLTIP_TEXT": "Waiting time is {metricValue} (based on {conversationCount} replies)",
+ "NAME": "客戶等待時間",
+ "TOOLTIP_TEXT": "等待時間為 {metricValue}(基於 {conversationCount} 則回覆)",
"DESC": ""
}
},
"DATE_RANGE_OPTIONS": {
- "LAST_7_DAYS": "最近7天",
- "LAST_14_DAYS": "最近14天",
- "LAST_30_DAYS": "最近30天",
- "THIS_MONTH": "This month",
- "LAST_MONTH": "Last month",
- "LAST_3_MONTHS": "三個月內",
- "LAST_6_MONTHS": "六個月內",
+ "LAST_7_DAYS": "最近 7 天",
+ "LAST_14_DAYS": "最近 14 天",
+ "LAST_30_DAYS": "最近 30 天",
+ "THIS_MONTH": "本月",
+ "LAST_MONTH": "上個月",
+ "LAST_3_MONTHS": "最近 3 個月",
+ "LAST_6_MONTHS": "最近 6 個月",
"LAST_YEAR": "去年",
- "CUSTOM_DATE_RANGE": "自定日期範圍"
+ "CUSTOM_DATE_RANGE": "自訂日期範圍"
},
"CUSTOM_DATE_RANGE": {
"CONFIRM": "套用",
- "PLACEHOLDER": "Select date range"
+ "PLACEHOLDER": "選擇日期範圍"
},
- "GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By",
- "DURATION_FILTER_LABEL": "Duration",
+ "GROUP_BY_FILTER_DROPDOWN_LABEL": "分組依據",
+ "DURATION_FILTER_LABEL": "期間",
"GROUPING_OPTIONS": {
- "DAY": "Day",
- "WEEK": "Week",
- "MONTH": "Month",
- "YEAR": "Month"
+ "DAY": "日",
+ "WEEK": "週",
+ "MONTH": "月",
+ "YEAR": "年"
},
"GROUP_BY_DAY_OPTIONS": [
{
"id": 1,
- "groupBy": "Day"
+ "groupBy": "日"
}
],
"GROUP_BY_WEEK_OPTIONS": [
{
"id": 1,
- "groupBy": "Day"
+ "groupBy": "日"
},
{
"id": 2,
- "groupBy": "Week"
+ "groupBy": "週"
}
],
"GROUP_BY_MONTH_OPTIONS": [
{
"id": 1,
- "groupBy": "Day"
+ "groupBy": "日"
},
{
"id": 2,
- "groupBy": "Week"
+ "groupBy": "週"
},
{
"id": 3,
- "groupBy": "Month"
+ "groupBy": "月"
}
],
"GROUP_BY_YEAR_OPTIONS": [
- {
- "id": 1,
- "groupBy": "Day"
- },
{
"id": 2,
- "groupBy": "Week"
+ "groupBy": "週"
},
{
"id": 3,
- "groupBy": "Month"
+ "groupBy": "月"
+ },
+ {
+ "id": 4,
+ "groupBy": "年"
}
],
"BUSINESS_HOURS": "服務時間",
"FILTER_ACTIONS": {
- "CLEAR_FILTER": "Clear filter",
- "EMPTY_LIST": "No results found"
+ "CLEAR_FILTER": "清除篩選條件",
+ "EMPTY_LIST": "查無結果"
},
"PAGINATION": {
- "RESULTS": "Showing {start} to {end} of {total} results",
- "PER_PAGE_TEMPLATE": "{size} / page"
+ "RESULTS": "顯示第 {start} 至 {end} 筆,共 {total} 筆結果",
+ "PER_PAGE_TEMPLATE": "{size} / 頁"
}
},
"AGENT_REPORTS": {
"HEADER": "客服總覽",
- "DESCRIPTION": "Easily track agent performance with key metrics such as conversations, response times, resolution times, and resolved cases. Click an agent's name to learn more.",
- "LOADING_CHART": "正在載入图表數據...",
- "NO_ENOUGH_DATA": "我們没有收到足夠的數據來生成報表,請稍後再試。",
- "DOWNLOAD_AGENT_REPORTS": "下載客服報告",
+ "DESCRIPTION": "輕鬆追蹤客服績效,包含對話數、回應時間、解決時間及已解決案件等關鍵指標。點擊客服名稱以瞭解更多。",
+ "LOADING_CHART": "正在載入圖表資料...",
+ "NO_ENOUGH_DATA": "我們尚未收到足夠的資料來產生報表,請稍後再試。",
+ "DOWNLOAD_AGENT_REPORTS": "下載客服報表",
"FILTER_DROPDOWN_LABEL": "選擇客服",
"FILTERS": {
"INPUT_PLACEHOLDER": {
@@ -141,49 +141,49 @@
"METRICS": {
"CONVERSATIONS": {
"NAME": "對話",
- "DESC": "(總計)"
+ "DESC": "(總計)"
},
"INCOMING_MESSAGES": {
- "NAME": "收到的消息",
- "DESC": "(總計)"
+ "NAME": "收到的訊息",
+ "DESC": "(總計)"
},
"OUTGOING_MESSAGES": {
- "NAME": "發送的消息",
- "DESC": "(總計)"
+ "NAME": "發送的訊息",
+ "DESC": "(總計)"
},
"FIRST_RESPONSE_TIME": {
- "NAME": "First Response Time",
- "DESC": "( 平均)",
- "INFO_TEXT": "Total number of conversations used for computation:",
- "TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)"
+ "NAME": "首次回應時間",
+ "DESC": "(平均)",
+ "INFO_TEXT": "用於計算的對話總數:",
+ "TOOLTIP_TEXT": "首次回應時間為 {metricValue}(基於 {conversationCount} 則對話)"
},
"RESOLUTION_TIME": {
"NAME": "解決時間",
- "DESC": "( 平均)",
- "INFO_TEXT": "Total number of conversations used for computation:",
- "TOOLTIP_TEXT": "Resolution Time is {metricValue} (based on {conversationCount} conversations)"
+ "DESC": "(平均)",
+ "INFO_TEXT": "用於計算的對話總數:",
+ "TOOLTIP_TEXT": "解決時間為 {metricValue}(基於 {conversationCount} 則對話)"
},
"RESOLUTION_COUNT": {
- "NAME": "已解決的數量",
- "DESC": "(總計)"
+ "NAME": "已解決數量",
+ "DESC": "(總計)"
}
},
"DATE_RANGE": [
{
"id": 0,
- "name": "最近7天"
+ "name": "最近 7 天"
},
{
"id": 1,
- "name": "最近30天"
+ "name": "最近 30 天"
},
{
"id": 2,
- "name": "三個月內"
+ "name": "最近 3 個月"
},
{
"id": 3,
- "name": "六個月內"
+ "name": "最近 6 個月"
},
{
"id": 4,
@@ -191,7 +191,7 @@
},
{
"id": 5,
- "name": "Custom date range"
+ "name": "自訂日期範圍"
}
],
"CUSTOM_DATE_RANGE": {
@@ -200,12 +200,12 @@
}
},
"LABEL_REPORTS": {
- "HEADER": "Labels Overview",
- "DESCRIPTION": "Track label performance with key metrics including conversations, response times, resolution times, and resolved cases. Click a label name for detailed insights.",
- "LOADING_CHART": "正在載入图表數據...",
- "NO_ENOUGH_DATA": "我們没有收到足夠的數據來生成報表,請稍後再試。",
- "DOWNLOAD_LABEL_REPORTS": "Download label reports",
- "FILTER_DROPDOWN_LABEL": "Select Label",
+ "HEADER": "標籤總覽",
+ "DESCRIPTION": "透過對話數、回應時間、解決時間及已解決案件等關鍵指標追蹤標籤績效。點擊標籤名稱以取得詳細分析。",
+ "LOADING_CHART": "正在載入圖表資料...",
+ "NO_ENOUGH_DATA": "我們尚未收到足夠的資料來產生報表,請稍後再試。",
+ "DOWNLOAD_LABEL_REPORTS": "下載標籤報表",
+ "FILTER_DROPDOWN_LABEL": "選擇標籤",
"FILTERS": {
"INPUT_PLACEHOLDER": {
"LABELS": "搜尋標籤"
@@ -214,49 +214,49 @@
"METRICS": {
"CONVERSATIONS": {
"NAME": "對話",
- "DESC": "(總計)"
+ "DESC": "(總計)"
},
"INCOMING_MESSAGES": {
- "NAME": "收到的消息",
- "DESC": "(總計)"
+ "NAME": "收到的訊息",
+ "DESC": "(總計)"
},
"OUTGOING_MESSAGES": {
- "NAME": "發送的消息",
- "DESC": "(總計)"
+ "NAME": "發送的訊息",
+ "DESC": "(總計)"
},
"FIRST_RESPONSE_TIME": {
- "NAME": "First Response Time",
- "DESC": "( 平均)",
- "INFO_TEXT": "Total number of conversations used for computation:",
- "TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)"
+ "NAME": "首次回應時間",
+ "DESC": "(平均)",
+ "INFO_TEXT": "用於計算的對話總數:",
+ "TOOLTIP_TEXT": "首次回應時間為 {metricValue}(基於 {conversationCount} 則對話)"
},
"RESOLUTION_TIME": {
"NAME": "解決時間",
- "DESC": "( 平均)",
- "INFO_TEXT": "Total number of conversations used for computation:",
- "TOOLTIP_TEXT": "Resolution Time is {metricValue} (based on {conversationCount} conversations)"
+ "DESC": "(平均)",
+ "INFO_TEXT": "用於計算的對話總數:",
+ "TOOLTIP_TEXT": "解決時間為 {metricValue}(基於 {conversationCount} 則對話)"
},
"RESOLUTION_COUNT": {
- "NAME": "已解決的數量",
- "DESC": "(總計)"
+ "NAME": "已解決數量",
+ "DESC": "(總計)"
}
},
"DATE_RANGE": [
{
"id": 0,
- "name": "最近7天"
+ "name": "最近 7 天"
},
{
"id": 1,
- "name": "最近30天"
+ "name": "最近 30 天"
},
{
"id": 2,
- "name": "三個月內"
+ "name": "最近 3 個月"
},
{
"id": 3,
- "name": "六個月內"
+ "name": "最近 6 個月"
},
{
"id": 4,
@@ -264,7 +264,7 @@
},
{
"id": 5,
- "name": "自定日期範圍"
+ "name": "自訂日期範圍"
}
],
"CUSTOM_DATE_RANGE": {
@@ -273,65 +273,65 @@
}
},
"INBOX_REPORTS": {
- "HEADER": "Inbox Overview",
- "DESCRIPTION": "Quickly view your inbox performance with key metrics like conversations, response times, resolution times, and resolved cases—all in one place. Click an inbox name for more details.",
- "LOADING_CHART": "正在載入图表數據...",
- "NO_ENOUGH_DATA": "我們没有收到足夠的數據來生成報表,請稍後再試。",
- "DOWNLOAD_INBOX_REPORTS": "Download inbox reports",
+ "HEADER": "收件匣總覽",
+ "DESCRIPTION": "快速檢視收件匣績效,包含對話數、回應時間、解決時間及已解決案件等關鍵指標。點擊收件匣名稱以取得更多詳情。",
+ "LOADING_CHART": "正在載入圖表資料...",
+ "NO_ENOUGH_DATA": "我們尚未收到足夠的資料來產生報表,請稍後再試。",
+ "DOWNLOAD_INBOX_REPORTS": "下載收件匣報表",
"FILTER_DROPDOWN_LABEL": "選擇收件匣",
- "ALL_INBOXES": "All Inboxes",
- "SEARCH_INBOX": "Search Inbox",
+ "ALL_INBOXES": "所有收件匣",
+ "SEARCH_INBOX": "搜尋收件匣",
"FILTERS": {
"INPUT_PLACEHOLDER": {
- "INBOXES": "Search inboxes"
+ "INBOXES": "搜尋收件匣"
}
},
"METRICS": {
"CONVERSATIONS": {
"NAME": "對話",
- "DESC": "(總計)"
+ "DESC": "(總計)"
},
"INCOMING_MESSAGES": {
- "NAME": "收到的消息",
- "DESC": "(總計)"
+ "NAME": "收到的訊息",
+ "DESC": "(總計)"
},
"OUTGOING_MESSAGES": {
- "NAME": "發送的消息",
- "DESC": "(總計)"
+ "NAME": "發送的訊息",
+ "DESC": "(總計)"
},
"FIRST_RESPONSE_TIME": {
- "NAME": "First Response Time",
- "DESC": "( 平均)",
- "INFO_TEXT": "Total number of conversations used for computation:",
- "TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)"
+ "NAME": "首次回應時間",
+ "DESC": "(平均)",
+ "INFO_TEXT": "用於計算的對話總數:",
+ "TOOLTIP_TEXT": "首次回應時間為 {metricValue}(基於 {conversationCount} 則對話)"
},
"RESOLUTION_TIME": {
"NAME": "解決時間",
- "DESC": "( 平均)",
- "INFO_TEXT": "Total number of conversations used for computation:",
- "TOOLTIP_TEXT": "Resolution Time is {metricValue} (based on {conversationCount} conversations)"
+ "DESC": "(平均)",
+ "INFO_TEXT": "用於計算的對話總數:",
+ "TOOLTIP_TEXT": "解決時間為 {metricValue}(基於 {conversationCount} 則對話)"
},
"RESOLUTION_COUNT": {
- "NAME": "已解決的數量",
- "DESC": "(總計)"
+ "NAME": "已解決數量",
+ "DESC": "(總計)"
}
},
"DATE_RANGE": [
{
"id": 0,
- "name": "最近7天"
+ "name": "最近 7 天"
},
{
"id": 1,
- "name": "最近30天"
+ "name": "最近 30 天"
},
{
"id": 2,
- "name": "三個月內"
+ "name": "最近 3 個月"
},
{
"id": 3,
- "name": "六個月內"
+ "name": "最近 6 個月"
},
{
"id": 4,
@@ -339,7 +339,7 @@
},
{
"id": 5,
- "name": "Custom date range"
+ "name": "自訂日期範圍"
}
],
"CUSTOM_DATE_RANGE": {
@@ -348,16 +348,16 @@
}
},
"TEAM_REPORTS": {
- "HEADER": "Team Overview",
- "DESCRIPTION": "Get a snapshot of your team's performance with essential metrics, including conversations, response times, resolution times, and resolved cases. Click a team name for more details.",
- "LOADING_CHART": "正在載入图表數據...",
- "NO_ENOUGH_DATA": "我們没有收到足夠的數據來生成報表,請稍後再試。",
- "DOWNLOAD_TEAM_REPORTS": "Download team reports",
- "FILTER_DROPDOWN_LABEL": "Select Team",
+ "HEADER": "團隊總覽",
+ "DESCRIPTION": "透過對話數、回應時間、解決時間及已解決案件等關鍵指標,快速掌握團隊績效。點擊團隊名稱以取得更多詳情。",
+ "LOADING_CHART": "正在載入圖表資料...",
+ "NO_ENOUGH_DATA": "我們尚未收到足夠的資料來產生報表,請稍後再試。",
+ "DOWNLOAD_TEAM_REPORTS": "下載團隊報表",
+ "FILTER_DROPDOWN_LABEL": "選擇團隊",
"FILTERS": {
- "ADD_FILTER": "添加查詢條件",
- "CLEAR_ALL": "Clear all",
- "NO_FILTER": "No filters available",
+ "ADD_FILTER": "新增篩選條件",
+ "CLEAR_ALL": "全部清除",
+ "NO_FILTER": "沒有可用的篩選條件",
"INPUT_PLACEHOLDER": {
"TEAMS": "搜尋團隊"
}
@@ -365,49 +365,49 @@
"METRICS": {
"CONVERSATIONS": {
"NAME": "對話",
- "DESC": "(總計)"
+ "DESC": "(總計)"
},
"INCOMING_MESSAGES": {
- "NAME": "收到的消息",
- "DESC": "(總計)"
+ "NAME": "收到的訊息",
+ "DESC": "(總計)"
},
"OUTGOING_MESSAGES": {
- "NAME": "發送的消息",
- "DESC": "(總計)"
+ "NAME": "發送的訊息",
+ "DESC": "(總計)"
},
"FIRST_RESPONSE_TIME": {
- "NAME": "First Response Time",
- "DESC": "( 平均)",
- "INFO_TEXT": "Total number of conversations used for computation:",
- "TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)"
+ "NAME": "首次回應時間",
+ "DESC": "(平均)",
+ "INFO_TEXT": "用於計算的對話總數:",
+ "TOOLTIP_TEXT": "首次回應時間為 {metricValue}(基於 {conversationCount} 則對話)"
},
"RESOLUTION_TIME": {
"NAME": "解決時間",
- "DESC": "( 平均)",
- "INFO_TEXT": "Total number of conversations used for computation:",
- "TOOLTIP_TEXT": "Resolution Time is {metricValue} (based on {conversationCount} conversations)"
+ "DESC": "(平均)",
+ "INFO_TEXT": "用於計算的對話總數:",
+ "TOOLTIP_TEXT": "解決時間為 {metricValue}(基於 {conversationCount} 則對話)"
},
"RESOLUTION_COUNT": {
- "NAME": "已解決的數量",
- "DESC": "(總計)"
+ "NAME": "已解決數量",
+ "DESC": "(總計)"
}
},
"DATE_RANGE": [
{
"id": 0,
- "name": "最近7天"
+ "name": "最近 7 天"
},
{
"id": 1,
- "name": "最近30天"
+ "name": "最近 30 天"
},
{
"id": 2,
- "name": "三個月內"
+ "name": "最近 3 個月"
},
{
"id": 3,
- "name": "六個月內"
+ "name": "最近 6 個月"
},
{
"id": 4,
@@ -415,7 +415,7 @@
},
{
"id": 5,
- "name": "自定日期範圍"
+ "name": "自訂日期範圍"
}
],
"CUSTOM_DATE_RANGE": {
@@ -424,20 +424,20 @@
}
},
"CSAT_REPORTS": {
- "HEADER": "CSAT Reports",
- "NO_RECORDS": "No responses yet",
- "NO_RECORDS_DESCRIPTION": "CSAT survey responses will appear here once customers start providing feedback.",
- "DOWNLOAD": "Download CSAT Reports",
- "DOWNLOAD_FAILED": "Failed to download CSAT Reports",
+ "HEADER": "CSAT 報表",
+ "NO_RECORDS": "尚無回覆",
+ "NO_RECORDS_DESCRIPTION": "當客戶開始提供回饋後,CSAT 問卷回覆將顯示於此。",
+ "DOWNLOAD": "下載 CSAT 報表",
+ "DOWNLOAD_FAILED": "無法下載 CSAT 報表",
"FILTERS": {
- "ADD_FILTER": "添加查詢條件",
- "CLEAR_ALL": "Clear all",
- "NO_FILTER": "No filters available",
+ "ADD_FILTER": "新增篩選條件",
+ "CLEAR_ALL": "全部清除",
+ "NO_FILTER": "沒有可用的篩選條件",
"INPUT_PLACEHOLDER": {
"AGENTS": "搜尋客服",
- "INBOXES": "Search inboxes",
+ "INBOXES": "搜尋收件匣",
"TEAMS": "搜尋團隊",
- "RATINGS": "Search ratings"
+ "RATINGS": "搜尋評分"
},
"AGENTS": {
"LABEL": "客服"
@@ -446,126 +446,126 @@
"LABEL": "收件匣"
},
"TEAMS": {
- "LABEL": "Team"
+ "LABEL": "團隊"
},
"RATINGS": {
- "LABEL": "Rating"
+ "LABEL": "評分"
}
},
"TABLE": {
"HEADER": {
"CONTACT_NAME": "聯絡人",
"AGENT_NAME": "客服",
- "RATING": "Rating",
- "FEEDBACK_TEXT": "Feedback comment",
+ "RATING": "評分",
+ "FEEDBACK_TEXT": "回饋意見",
"CONVERSATION": "對話",
- "CUSTOMER": "Customer",
- "RESPONSE": "Response",
- "HANDLED_BY": "Handled by"
+ "CUSTOMER": "客戶",
+ "RESPONSE": "回覆",
+ "HANDLED_BY": "處理人員"
},
- "UNKNOWN_CUSTOMER": "Unknown customer"
+ "UNKNOWN_CUSTOMER": "未知客戶"
},
- "NO_AGENT": "No assigned agent",
- "NO_FEEDBACK": "No feedback provided",
+ "NO_AGENT": "未指派客服",
+ "NO_FEEDBACK": "未提供回饋",
"METRIC": {
"TOTAL_RESPONSES": {
- "LABEL": "Total responses",
- "TOOLTIP": "Total number of responses collected"
+ "LABEL": "總回覆數",
+ "TOOLTIP": "收集到的回覆總數"
},
"SATISFACTION_SCORE": {
- "LABEL": "Satisfaction score",
- "TOOLTIP": "Total number of positive responses / Total number of responses * 100"
+ "LABEL": "滿意度分數",
+ "TOOLTIP": "正面回覆總數 / 回覆總數 * 100"
},
"RESPONSE_RATE": {
- "LABEL": "Response rate",
- "TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100"
+ "LABEL": "回覆率",
+ "TOOLTIP": "回覆總數 / 已發送的 CSAT 問卷訊息總數 * 100"
},
- "RATING_DISTRIBUTION": "Rating distribution"
+ "RATING_DISTRIBUTION": "評分分布"
},
"REVIEW_NOTES": {
- "TITLE": "Review notes",
- "PLACEHOLDER": "Add review notes about this rating...",
- "SAVE": "Save",
+ "TITLE": "審閱備註",
+ "PLACEHOLDER": "為此評分新增審閱備註...",
+ "SAVE": "儲存",
"CANCEL": "取消",
- "SAVING": "Saving...",
- "SAVED": "Notes saved successfully",
- "SAVE_ERROR": "Failed to save notes",
- "UPDATED_BY": "Updated by {name} {time}",
- "UPDATED_BY_LABEL": "Updated by",
+ "SAVING": "儲存中...",
+ "SAVED": "備註已成功儲存",
+ "SAVE_ERROR": "無法儲存備註",
+ "UPDATED_BY": "由 {name} 於 {time} 更新",
+ "UPDATED_BY_LABEL": "更新者",
"PAYWALL": {
- "TITLE": "Upgrade to add review notes",
- "AVAILABLE_ON": "The review notes feature is only available in the Business and Enterprise plans.",
- "UPGRADE_PROMPT": "Add internal context to every CSAT response with review notes. Capture what really happened, spot patterns faster, and make better decisions from your feedback.",
- "UPGRADE_NOW": "Upgrade now",
- "CANCEL_ANYTIME": "You can change or cancel your plan anytime"
+ "TITLE": "升級以新增審閱備註",
+ "AVAILABLE_ON": "審閱備註功能僅適用於 Business 和 Enterprise 方案。",
+ "UPGRADE_PROMPT": "透過審閱備註為每則 CSAT 回覆新增內部備註。記錄實際情況、更快發現問題模式,並從回饋中做出更好的決策。",
+ "UPGRADE_NOW": "立即升級",
+ "CANCEL_ANYTIME": "您可以隨時變更或取消方案"
}
}
},
"BOT_REPORTS": {
- "HEADER": "Bot Reports",
+ "HEADER": "機器人報表",
"METRIC": {
"TOTAL_CONVERSATIONS": {
- "LABEL": "No. of Conversations",
- "TOOLTIP": "Total number of conversations handled by the bot"
+ "LABEL": "對話數量",
+ "TOOLTIP": "機器人處理的對話總數"
},
"TOTAL_RESPONSES": {
- "LABEL": "Total Responses",
- "TOOLTIP": "Total number of responses sent by the bot"
+ "LABEL": "總回覆數",
+ "TOOLTIP": "機器人發送的回覆總數"
},
"RESOLUTION_RATE": {
- "LABEL": "Resolution Rate",
- "TOOLTIP": "Total number of conversations resolved by the bot / Total number of conversations handled by the bot * 100"
+ "LABEL": "解決率",
+ "TOOLTIP": "機器人解決的對話數 / 機器人處理的對話總數 * 100"
},
"HANDOFF_RATE": {
- "LABEL": "Handoff Rate",
- "TOOLTIP": "Total number of conversations handed off to agents / Total number of conversations handled by the bot * 100"
+ "LABEL": "轉接率",
+ "TOOLTIP": "轉接給客服的對話數 / 機器人處理的對話總數 * 100"
}
}
},
"OVERVIEW_REPORTS": {
"HEADER": "總覽",
- "LIVE": "Live",
+ "LIVE": "即時",
"ACCOUNT_CONVERSATIONS": {
- "HEADER": "Open Conversations",
- "LOADING_MESSAGE": "Loading conversation metrics...",
+ "HEADER": "進行中的對話",
+ "LOADING_MESSAGE": "正在載入對話指標...",
"OPEN": "開啟",
"UNATTENDED": "無人處理",
- "UNASSIGNED": "未指派的",
+ "UNASSIGNED": "未指派",
"PENDING": "待處理"
},
"CONVERSATION_HEATMAP": {
- "HEADER": "Conversation Traffic",
- "NO_CONVERSATIONS": "No conversations",
- "CONVERSATION": "{count} conversation",
- "CONVERSATIONS": "{count} conversations",
- "DOWNLOAD_REPORT": "Download report"
+ "HEADER": "對話流量",
+ "NO_CONVERSATIONS": "沒有對話",
+ "CONVERSATION": "{count} 則對話",
+ "CONVERSATIONS": "{count} 則對話",
+ "DOWNLOAD_REPORT": "下載報表"
},
"RESOLUTION_HEATMAP": {
- "HEADER": "Resolutions",
- "NO_CONVERSATIONS": "No conversations",
- "CONVERSATION": "{count} conversation",
- "CONVERSATIONS": "{count} conversations",
- "DOWNLOAD_REPORT": "Download report"
+ "HEADER": "已解決案件",
+ "NO_CONVERSATIONS": "沒有對話",
+ "CONVERSATION": "{count} 則對話",
+ "CONVERSATIONS": "{count} 則對話",
+ "DOWNLOAD_REPORT": "下載報表"
},
"AGENT_CONVERSATIONS": {
- "HEADER": "Conversations by agents",
- "LOADING_MESSAGE": "Loading agent metrics...",
- "NO_AGENTS": "There are no conversations by agents",
+ "HEADER": "依客服分類的對話",
+ "LOADING_MESSAGE": "正在載入客服指標...",
+ "NO_AGENTS": "目前沒有客服的對話紀錄",
"TABLE_HEADER": {
"AGENT": "客服",
- "OPEN": "OPEN",
+ "OPEN": "開啟",
"UNATTENDED": "無人處理",
"STATUS": "狀態"
}
},
"TEAM_CONVERSATIONS": {
- "ALL_TEAMS": "All Teams",
- "HEADER": "Conversations by teams",
- "LOADING_MESSAGE": "Loading team metrics...",
- "NO_TEAMS": "There is no data available",
+ "ALL_TEAMS": "所有團隊",
+ "HEADER": "依團隊分類的對話",
+ "LOADING_MESSAGE": "正在載入團隊指標...",
+ "NO_TEAMS": "目前沒有可用資料",
"TABLE_HEADER": {
- "TEAM": "Team",
- "OPEN": "打開",
+ "TEAM": "團隊",
+ "OPEN": "開啟",
"UNATTENDED": "無人處理",
"STATUS": "狀態"
}
@@ -578,73 +578,73 @@
}
},
"DAYS_OF_WEEK": {
- "SUNDAY": "Sunday",
- "MONDAY": "Monday",
- "TUESDAY": "Tuesday",
- "WEDNESDAY": "Wednesday",
- "THURSDAY": "Thursday",
- "FRIDAY": "Friday",
- "SATURDAY": "Saturday"
+ "SUNDAY": "星期日",
+ "MONDAY": "星期一",
+ "TUESDAY": "星期二",
+ "WEDNESDAY": "星期三",
+ "THURSDAY": "星期四",
+ "FRIDAY": "星期五",
+ "SATURDAY": "星期六"
},
"SLA_REPORTS": {
- "HEADER": "SLA Reports",
- "NO_RECORDS": "SLA applied conversations are not available.",
- "LOADING": "Loading SLA data...",
- "DOWNLOAD_SLA_REPORTS": "Download SLA reports",
- "DOWNLOAD_FAILED": "Failed to download SLA Reports",
+ "HEADER": "SLA 報表",
+ "NO_RECORDS": "目前沒有套用 SLA 的對話。",
+ "LOADING": "正在載入 SLA 資料...",
+ "DOWNLOAD_SLA_REPORTS": "下載 SLA 報表",
+ "DOWNLOAD_FAILED": "無法下載 SLA 報表",
"DROPDOWN": {
- "ADD_FIlTER": "添加查詢條件",
- "CLEAR_ALL": "Clear all",
- "CLEAR_FILTER": "Clear filter",
- "EMPTY_LIST": "No results found",
- "NO_FILTER": "No filters available",
- "SEARCH": "Search filter",
+ "ADD_FIlTER": "新增篩選條件",
+ "CLEAR_ALL": "全部清除",
+ "CLEAR_FILTER": "清除篩選條件",
+ "EMPTY_LIST": "查無結果",
+ "NO_FILTER": "沒有可用的篩選條件",
+ "SEARCH": "搜尋篩選條件",
"INPUT_PLACEHOLDER": {
- "SLA": "SLA name",
+ "SLA": "SLA 名稱",
"AGENTS": "客服名稱",
"INBOXES": "收件匣名稱",
"LABELS": "標籤名稱",
"TEAMS": "團隊名稱"
},
- "SLA": "SLA Policy",
+ "SLA": "SLA 政策",
"INBOXES": "收件匣",
"AGENTS": "客服",
- "LABELS": "Label",
- "TEAMS": "Team"
+ "LABELS": "標籤",
+ "TEAMS": "團隊"
},
- "WITH": "with",
+ "WITH": "包含",
"METRICS": {
"HIT_RATE": {
- "LABEL": "Hit Rate",
- "TOOLTIP": "Percentage of SLAs created were completed successfully"
+ "LABEL": "達成率",
+ "TOOLTIP": "已建立的 SLA 中成功完成的百分比"
},
"NO_OF_MISSES": {
- "LABEL": "Number of Misses",
- "TOOLTIP": "Total SLA misses in a certain period"
+ "LABEL": "未達成次數",
+ "TOOLTIP": "特定期間內的 SLA 未達成總次數"
},
"NO_OF_CONVERSATIONS": {
- "LABEL": "Number of Conversations",
- "TOOLTIP": "Total number of conversations with SLA"
+ "LABEL": "對話數量",
+ "TOOLTIP": "套用 SLA 的對話總數"
}
},
"TABLE": {
"HEADER": {
- "POLICY": "Policy",
+ "POLICY": "政策",
"CONVERSATION": "對話",
"AGENT": "客服"
},
- "VIEW_DETAILS": "View Details"
+ "VIEW_DETAILS": "檢視詳情"
}
},
"SUMMARY_REPORTS": {
"INBOX": "收件匣",
"AGENT": "客服",
- "TEAM": "Team",
- "LABEL": "Label",
- "AVG_RESOLUTION_TIME": "Avg. Resolution Time",
- "AVG_FIRST_RESPONSE_TIME": "Avg. First Response Time",
- "AVG_REPLY_TIME": "Avg. Customer Waiting Time",
- "RESOLUTION_COUNT": "已解決的數量",
- "CONVERSATIONS": "No. of conversations"
+ "TEAM": "團隊",
+ "LABEL": "標籤",
+ "AVG_RESOLUTION_TIME": "平均解決時間",
+ "AVG_FIRST_RESPONSE_TIME": "平均首次回應時間",
+ "AVG_REPLY_TIME": "平均客戶等待時間",
+ "RESOLUTION_COUNT": "已解決數量",
+ "CONVERSATIONS": "對話數量"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/resetPassword.json b/app/javascript/dashboard/i18n/locale/zh_TW/resetPassword.json
index 4eebba2e0..e110a6813 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/resetPassword.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/resetPassword.json
@@ -1,16 +1,16 @@
{
"RESET_PASSWORD": {
- "TITLE": "重置密碼",
- "DESCRIPTION": "輸入您用來登入到Chatwoot 的電子郵件地址,獲取密碼重置說明。",
- "GO_BACK_TO_LOGIN": "回到登入頁面",
+ "TITLE": "重設密碼",
+ "DESCRIPTION": "請輸入您用來登入 Chatwoot 的電子郵件地址,以取得密碼重設說明。",
+ "GO_BACK_TO_LOGIN": "如果您想返回登入頁面,",
"EMAIL": {
"LABEL": "電子郵件",
- "PLACEHOLDER": "請輸入您的電子信箱.",
- "ERROR": "請輸入一個有效的電子信箱."
+ "PLACEHOLDER": "請輸入您的電子郵件",
+ "ERROR": "請輸入有效的電子郵件地址"
},
"API": {
- "SUCCESS_MESSAGE": "密碼重置連結已發送到您的電子信箱.",
- "ERROR_MESSAGE": "無法連線 Woot 伺服器,請稍後再試。"
+ "SUCCESS_MESSAGE": "密碼重設連結已發送至您的電子郵件。",
+ "ERROR_MESSAGE": "無法連線至 Woot 伺服器,請稍後再試。"
},
"SUBMIT": "送出"
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/search.json b/app/javascript/dashboard/i18n/locale/zh_TW/search.json
index 1e1c0063d..c52ea9ffa 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/search.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/search.json
@@ -13,56 +13,56 @@
"MESSAGES": "訊息",
"ARTICLES": "文章"
},
- "VIEW_MORE": "檢視更多",
+ "VIEW_MORE": "查看更多",
"LOAD_MORE": "載入更多",
"SEARCHING_DATA": "搜尋中",
"LOADING_DATA": "載入中",
- "EMPTY_STATE": "未找到與查詢 '{query}' 相關的 {item}",
- "EMPTY_STATE_FULL": "查無 {query} 條件的結果",
- "PLACEHOLDER_KEYBINDING": "/聚焦搜尋框",
+ "EMPTY_STATE": "找不到與「{query}」相符的{item}",
+ "EMPTY_STATE_FULL": "找不到與「{query}」相符的結果",
+ "PLACEHOLDER_KEYBINDING": "/ 聚焦搜尋",
"INPUT_PLACEHOLDER": "輸入 3 個或更多字元以進行搜尋",
"RECENT_SEARCHES": "最近搜尋",
"CLEAR_ALL": "清除全部",
"MOST_RECENT": "最新",
- "EMPTY_STATE_DEFAULT": "透過會話 Id、電子郵件、電話號碼、訊息等進行搜尋以獲得更好的搜尋結果。 ",
+ "EMPTY_STATE_DEFAULT": "透過對話 ID、電子郵件、電話號碼、訊息進行搜尋,以獲得更佳的搜尋結果。",
"BOT_LABEL": "機器人",
- "READ_MORE": "檢視更多",
- "READ_LESS": "少讀",
+ "READ_MORE": "閱讀更多",
+ "READ_LESS": "收合",
"WROTE": "寫道:",
"FROM": "來自",
"EMAIL": "電子郵件",
"EMAIL_SUBJECT": "主旨",
"PRIVATE": "私人備註",
- "TRANSCRIPT": "對話記錄",
+ "TRANSCRIPT": "對話紀錄",
"CREATED_AT": "建立於 {time}",
"UPDATED_AT": "更新於 {time}",
"SORT_BY": {
"RELEVANCE": "相關性"
},
"DATE_RANGE": {
- "LAST_7_DAYS": "最近7天",
- "LAST_30_DAYS": "最近30天",
- "LAST_60_DAYS": "最近60天",
- "LAST_90_DAYS": "最近90天",
+ "LAST_7_DAYS": "最近 7 天",
+ "LAST_30_DAYS": "最近 30 天",
+ "LAST_60_DAYS": "最近 60 天",
+ "LAST_90_DAYS": "最近 90 天",
"CUSTOM_RANGE": "自訂範圍:",
- "CREATED_BETWEEN": "建立於以下期間",
- "AND": "和",
+ "CREATED_BETWEEN": "建立於",
+ "AND": "至",
"APPLY": "套用",
- "BEFORE_DATE": "{date}",
- "AFTER_DATE": "{date}之後",
- "TIME_RANGE": "按時間篩選",
+ "BEFORE_DATE": "{date} 之前",
+ "AFTER_DATE": "{date} 之後",
+ "TIME_RANGE": "依時間篩選",
"CLEAR_FILTER": "清除篩選條件"
},
"FILTERS": {
- "FILTER_MESSAGE": "篩選郵件的依據:",
+ "FILTER_MESSAGE": "依以下條件篩選訊息:",
"FROM": "發送者",
"IN": "收件匣",
- "AGENTS": "客服",
+ "AGENTS": "客服人員",
"CONTACTS": "聯絡人",
"INBOXES": "收件匣",
- "NO_AGENTS": "查無客服",
- "NO_CONTACTS": "透過搜尋開始查看結果",
- "NO_INBOXES": "未找到收件匣"
+ "NO_AGENTS": "找不到客服人員",
+ "NO_CONTACTS": "開始搜尋以查看結果",
+ "NO_INBOXES": "找不到收件匣"
}
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/setNewPassword.json b/app/javascript/dashboard/i18n/locale/zh_TW/setNewPassword.json
index c195bafc2..009588f6d 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/setNewPassword.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/setNewPassword.json
@@ -4,19 +4,19 @@
"PASSWORD": {
"LABEL": "密碼",
"PLACEHOLDER": "密碼",
- "ERROR": "密碼太短了."
+ "ERROR": "密碼過短。"
},
"CONFIRM_PASSWORD": {
- "LABEL": "請重新輸入一次密碼",
+ "LABEL": "確認密碼",
"PLACEHOLDER": "確認密碼",
- "ERROR": "密碼不匹配."
+ "ERROR": "密碼不一致。"
},
"API": {
- "SUCCESS_MESSAGE": "成功修改密碼.",
- "ERROR_MESSAGE": "無法連線Woot伺服器,請稍後再試"
+ "SUCCESS_MESSAGE": "密碼已成功變更。",
+ "ERROR_MESSAGE": "無法連線至 Woot 伺服器,請稍後再試。"
},
"CAPTCHA": {
- "ERROR": "驗證碼過期。請重新獲取"
+ "ERROR": "驗證已過期,請重新完成驗證。"
},
"SUBMIT": "送出"
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/settings.json b/app/javascript/dashboard/i18n/locale/zh_TW/settings.json
index 0f64c2e94..1a42133b4 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/settings.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/settings.json
@@ -4,211 +4,211 @@
"TITLE": "個人資料設定",
"BTN_TEXT": "更新個人資料",
"DELETE_AVATAR": "刪除頭貼",
- "AVATAR_DELETE_SUCCESS": "Avatar has been deleted successfully",
- "AVATAR_DELETE_FAILED": "There is an error while deleting avatar, please try again",
- "UPDATE_SUCCESS": "你的個人檔案已經成功更新",
- "PASSWORD_UPDATE_SUCCESS": "你的密碼已成功變更",
- "AFTER_EMAIL_CHANGED": "您的個人資料已成功更新,請在您的登入憑證更改後重新登入",
+ "AVATAR_DELETE_SUCCESS": "已成功刪除頭貼",
+ "AVATAR_DELETE_FAILED": "刪除頭貼時發生錯誤,請再試一次",
+ "UPDATE_SUCCESS": "您的個人檔案已成功更新",
+ "PASSWORD_UPDATE_SUCCESS": "您的密碼已成功變更",
+ "AFTER_EMAIL_CHANGED": "您的個人資料已成功更新,由於登入憑證已變更,請重新登入",
"FORM": {
- "PICTURE": "Profile Picture",
+ "PICTURE": "個人頭像",
"AVATAR": "頭像",
"ERROR": "請修正表單錯誤",
- "REMOVE_IMAGE": "刪除",
- "UPLOAD_IMAGE": "上傳頭像",
- "UPDATE_IMAGE": "更新頭像",
+ "REMOVE_IMAGE": "移除",
+ "UPLOAD_IMAGE": "上傳圖片",
+ "UPDATE_IMAGE": "更新圖片",
"PROFILE_SECTION": {
"TITLE": "個人資訊",
- "NOTE": "您的電子信箱地址是您的身份並用於登入。"
+ "NOTE": "您的電子信箱地址是您的身份識別,並用於登入。"
},
"SEND_MESSAGE": {
- "TITLE": "傳送訊息熱鍵",
- "NOTE": "You can select a hotkey (either Enter or Cmd/Ctrl+Enter) based on your preference of writing.",
- "UPDATE_SUCCESS": "你的設定已經成功更新",
+ "TITLE": "傳送訊息快捷鍵",
+ "NOTE": "您可以根據撰寫習慣選擇快捷鍵(Enter 或 Cmd/Ctrl+Enter)。",
+ "UPDATE_SUCCESS": "您的設定已成功更新",
"CARD": {
"ENTER_KEY": {
"HEADING": "Enter (↵)",
- "CONTENT": "Send messages by pressing Enter key instead of clicking the send button."
+ "CONTENT": "按下 Enter 鍵即可傳送訊息,而無需點擊傳送按鈕。"
},
"CMD_ENTER_KEY": {
"HEADING": "Cmd/Ctrl + Enter (⌘ + ↵)",
- "CONTENT": "Send messages by pressing Cmd/Ctrl + enter key instead of clicking the send button."
+ "CONTENT": "按下 Cmd/Ctrl + Enter 鍵即可傳送訊息,而無需點擊傳送按鈕。"
}
}
},
"INTERFACE_SECTION": {
- "TITLE": "Interface",
- "NOTE": "Customize the look and feel of your Chatwoot dashboard.",
+ "TITLE": "介面",
+ "NOTE": "自訂您的 Chatwoot 儀表板外觀與風格。",
"FONT_SIZE": {
- "TITLE": "Font size",
- "NOTE": "Adjust the text size across the dashboard based on your preference.",
- "UPDATE_SUCCESS": "Your font settings have been updated successfully",
- "UPDATE_ERROR": "There is an error while updating the font settings, please try again",
+ "TITLE": "字體大小",
+ "NOTE": "根據您的偏好調整儀表板的文字大小。",
+ "UPDATE_SUCCESS": "您的字體設定已成功更新",
+ "UPDATE_ERROR": "更新字體設定時發生錯誤,請再試一次",
"OPTIONS": {
- "SMALLER": "Smaller",
- "SMALL": "Small",
- "DEFAULT": "Default",
- "LARGE": "Large",
- "LARGER": "Larger",
- "EXTRA_LARGE": "Extra Large"
+ "SMALLER": "更小",
+ "SMALL": "小",
+ "DEFAULT": "預設",
+ "LARGE": "大",
+ "LARGER": "更大",
+ "EXTRA_LARGE": "特大"
}
},
"LANGUAGE": {
- "TITLE": "Preferred Language",
- "NOTE": "Choose the language you want to use.",
- "UPDATE_SUCCESS": "Your Language settings have been updated successfully",
- "UPDATE_ERROR": "There is an error while updating the language settings, please try again",
- "USE_ACCOUNT_DEFAULT": "Use account default"
+ "TITLE": "偏好語言",
+ "NOTE": "選擇您想使用的語言。",
+ "UPDATE_SUCCESS": "您的語言設定已成功更新",
+ "UPDATE_ERROR": "更新語言設定時發生錯誤,請再試一次",
+ "USE_ACCOUNT_DEFAULT": "使用帳戶預設值"
}
},
"MESSAGE_SIGNATURE_SECTION": {
- "TITLE": "Personal message signature",
- "NOTE": "Create a unique message signature to appear at the end of every message you send from any inbox. You can also include an inline image, which is supported in live-chat, email, and API inboxes.",
- "BTN_TEXT": "Save message signature",
- "API_ERROR": "Couldn't save signature! Try again",
- "API_SUCCESS": "Signature saved successfully",
- "IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again",
- "IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save to save the signature",
- "IMAGE_UPLOAD_SIZE_ERROR": "Image size should be less than {size}MB"
+ "TITLE": "個人訊息簽名",
+ "NOTE": "建立專屬的訊息簽名,將自動附加於您從任何收件匣發送的每則訊息結尾。您也可以插入行內圖片,支援即時聊天、電子郵件和 API 收件匣。",
+ "BTN_TEXT": "儲存訊息簽名",
+ "API_ERROR": "無法儲存簽名,請再試一次",
+ "API_SUCCESS": "簽名已成功儲存",
+ "IMAGE_UPLOAD_ERROR": "無法上傳圖片,請再試一次",
+ "IMAGE_UPLOAD_SUCCESS": "圖片已成功新增。請點擊儲存以保存簽名",
+ "IMAGE_UPLOAD_SIZE_ERROR": "圖片大小須小於 {size}MB"
},
"MESSAGE_SIGNATURE": {
- "LABEL": "Message Signature",
- "ERROR": "Message Signature cannot be empty",
- "PLACEHOLDER": "Insert your personal message signature here."
+ "LABEL": "訊息簽名",
+ "ERROR": "訊息簽名不可為空",
+ "PLACEHOLDER": "在此輸入您的個人訊息簽名。"
},
"PASSWORD_SECTION": {
"TITLE": "密碼",
- "NOTE": "更新您的密碼會在多個設備中重置您的登入資訊。",
+ "NOTE": "更新密碼將會重置您在多個裝置上的登入狀態。",
"BTN_TEXT": "變更密碼"
},
"SECURITY_SECTION": {
- "TITLE": "Security",
- "NOTE": "Manage additional security features for your account.",
- "MFA_BUTTON": "Manage Two-Factor Authentication"
+ "TITLE": "安全性",
+ "NOTE": "管理您帳戶的額外安全功能。",
+ "MFA_BUTTON": "管理雙因素驗證"
},
"ACCESS_TOKEN": {
- "TITLE": "訪問 token",
- "NOTE": "如果要構建基於 API 的整合,則可以使用此 token",
+ "TITLE": "存取 Token",
+ "NOTE": "若您正在建立基於 API 的整合,可以使用此 token",
"COPY": "複製",
- "RESET": "Reset",
- "CONFIRM_RESET": "Are you sure?",
- "CONFIRM_HINT": "Click again to confirm",
- "RESET_SUCCESS": "訪問token已成功重新產生",
- "RESET_ERROR": "無法重新產生訪問token。請再試一次"
+ "RESET": "重設",
+ "CONFIRM_RESET": "確定要重設嗎?",
+ "CONFIRM_HINT": "再次點擊以確認",
+ "RESET_SUCCESS": "存取 token 已成功重新產生",
+ "RESET_ERROR": "無法重新產生存取 token,請再試一次"
},
"AUDIO_NOTIFICATIONS_SECTION": {
- "TITLE": "音效通知",
- "NOTE": "Enable audio notifications in dashboard for new messages and conversations.",
- "PLAY": "Play sound",
+ "TITLE": "音效提醒",
+ "NOTE": "啟用儀表板中的音效提醒,以接收新訊息和新對話的通知。",
+ "PLAY": "播放音效",
"ALERT_TYPES": {
"NONE": "無",
- "MINE": "Assigned",
- "ALL": "所有的",
- "ASSIGNED": "My assigned conversations",
- "UNASSIGNED": "Unassigned conversations",
- "NOTME": "Open conversations assigned to others"
+ "MINE": "已指派",
+ "ALL": "全部",
+ "ASSIGNED": "指派給我的對話",
+ "UNASSIGNED": "未指派的對話",
+ "NOTME": "指派給其他人的進行中對話"
},
"ALERT_COMBINATIONS": {
- "NONE": "You haven't selected any options, you won't receive any audio alerts.",
- "ASSIGNED": "You'll receive alerts for conversations assigned to you.",
- "UNASSIGNED": "You'll receive alerts for any unassigned conversations.",
- "NOTME": "You'll receive alerts for conversations assigned to others.",
- "ASSIGNED+UNASSIGNED": "You'll receive alerts for your assigned conversations and any unattended ones.",
- "ASSIGNED+NOTME": "You'll receive alerts for conversations assigned to you and to others, but not for unassigned ones.",
- "NOTME+UNASSIGNED": "You'll receive alerts for unattended conversations and those assigned to others.",
- "ASSIGNED+NOTME+UNASSIGNED": "You'll receive alerts for all conversations."
+ "NONE": "您尚未選擇任何選項,將不會收到任何音效提醒。",
+ "ASSIGNED": "您將收到指派給您的對話的提醒。",
+ "UNASSIGNED": "您將收到任何未指派對話的提醒。",
+ "NOTME": "您將收到指派給其他人的對話的提醒。",
+ "ASSIGNED+UNASSIGNED": "您將收到指派給您的對話及任何未處理對話的提醒。",
+ "ASSIGNED+NOTME": "您將收到指派給您及其他人的對話的提醒,但不包括未指派的對話。",
+ "NOTME+UNASSIGNED": "您將收到未處理的對話及指派給其他人的對話的提醒。",
+ "ASSIGNED+NOTME+UNASSIGNED": "您將收到所有對話的提醒。"
},
"ALERT_TYPE": {
- "TITLE": "Alert events for conversations:",
+ "TITLE": "對話提醒事件",
"NONE": "無",
"ASSIGNED": "已指派的對話",
"ALL_CONVERSATIONS": "所有對話"
},
"DEFAULT_TONE": {
- "TITLE": "Alert tone:"
+ "TITLE": "提醒音效:"
},
"CONDITIONS": {
- "TITLE": "Alert conditions:",
- "CONDITION_ONE": "Send audio alerts only if the browser window is not active",
- "CONDITION_TWO": "Send alerts every 30s until all the assigned conversations are read"
+ "TITLE": "提醒條件:",
+ "CONDITION_ONE": "僅在瀏覽器視窗非使用中時發送音效提醒",
+ "CONDITION_TWO": "每 30 秒發送一次提醒,直到所有指派的對話已讀"
},
- "SOUND_PERMISSION_ERROR": "Autoplay is disabled in your browser. To hear alerts automatically, enable sound permission in your browser settings or interact with the page.",
- "READ_MORE": "Read more"
+ "SOUND_PERMISSION_ERROR": "您的瀏覽器已停用自動播放。若要自動聽到提醒音效,請在瀏覽器設定中啟用音效權限,或與頁面互動。",
+ "READ_MORE": "了解更多"
},
"EMAIL_NOTIFICATIONS_SECTION": {
- "TITLE": "電子信箱通知",
- "NOTE": "在此更新您的電子信箱通知設定",
- "CONVERSATION_ASSIGNMENT": "當對話分配給我時發送電子信箱通知",
- "CONVERSATION_CREATION": "當對話分配給我時發送電子信箱通知",
- "CONVERSATION_MENTION": "當你在對話中被提及時以 Email 通知",
- "ASSIGNED_CONVERSATION_NEW_MESSAGE": "當被指派的對話中有新訊息時以 Email 通知",
- "PARTICIPATING_CONVERSATION_NEW_MESSAGE": "Send email notifications when a new message is created in a participating conversation",
- "SLA_MISSED_FIRST_RESPONSE": "Send email notifications when a conversation misses first response SLA",
- "SLA_MISSED_NEXT_RESPONSE": "Send email notifications when a conversation misses next response SLA",
- "SLA_MISSED_RESOLUTION": "Send email notifications when a conversation misses resolution SLA"
+ "TITLE": "電子郵件通知",
+ "NOTE": "在此更新您的電子郵件通知偏好設定",
+ "CONVERSATION_ASSIGNMENT": "當對話被指派給我時發送電子郵件通知",
+ "CONVERSATION_CREATION": "當有新對話建立時發送電子郵件通知",
+ "CONVERSATION_MENTION": "當您在對話中被提及時發送電子郵件通知",
+ "ASSIGNED_CONVERSATION_NEW_MESSAGE": "當已指派的對話中有新訊息時發送電子郵件通知",
+ "PARTICIPATING_CONVERSATION_NEW_MESSAGE": "當參與中的對話有新訊息時發送電子郵件通知",
+ "SLA_MISSED_FIRST_RESPONSE": "當對話未達首次回應 SLA 時發送電子郵件通知",
+ "SLA_MISSED_NEXT_RESPONSE": "當對話未達下次回應 SLA 時發送電子郵件通知",
+ "SLA_MISSED_RESOLUTION": "當對話未達解決 SLA 時發送電子郵件通知"
},
"NOTIFICATIONS": {
- "TITLE": "Notification preferences",
- "TYPE_TITLE": "Notification type",
- "EMAIL": "Email",
- "PUSH": "Push notification",
+ "TITLE": "通知偏好設定",
+ "TYPE_TITLE": "通知類型",
+ "EMAIL": "電子郵件",
+ "PUSH": "推播通知",
"TYPES": {
- "CONVERSATION_CREATED": "A new conversation is created",
- "CONVERSATION_ASSIGNED": "A conversation is assigned to you",
- "CONVERSATION_MENTION": "You are mentioned in a conversation",
- "ASSIGNED_CONVERSATION_NEW_MESSAGE": "A new message is created in an assigned conversation",
- "PARTICIPATING_CONVERSATION_NEW_MESSAGE": "A new message is created in a participating conversation",
- "SLA_MISSED_FIRST_RESPONSE": "A conversation misses first response SLA",
- "SLA_MISSED_NEXT_RESPONSE": "A conversation misses next response SLA",
- "SLA_MISSED_RESOLUTION": "A conversation misses resolution SLA"
+ "CONVERSATION_CREATED": "有新對話建立",
+ "CONVERSATION_ASSIGNED": "有對話被指派給您",
+ "CONVERSATION_MENTION": "您在對話中被提及",
+ "ASSIGNED_CONVERSATION_NEW_MESSAGE": "已指派的對話中有新訊息",
+ "PARTICIPATING_CONVERSATION_NEW_MESSAGE": "參與中的對話有新訊息",
+ "SLA_MISSED_FIRST_RESPONSE": "對話未達首次回應 SLA",
+ "SLA_MISSED_NEXT_RESPONSE": "對話未達下次回應 SLA",
+ "SLA_MISSED_RESOLUTION": "對話未達解決 SLA"
},
- "BROWSER_PERMISSION": "Enable push notifications for your browser so you’re able to receive them"
+ "BROWSER_PERMISSION": "請啟用瀏覽器推播通知,以便接收通知"
},
"API": {
- "UPDATE_SUCCESS": "您的通知設定已成功更新",
- "UPDATE_ERROR": "更新配置時出錯,請再試一次"
+ "UPDATE_SUCCESS": "您的通知偏好設定已成功更新",
+ "UPDATE_ERROR": "更新偏好設定時發生錯誤,請再試一次"
},
"PUSH_NOTIFICATIONS_SECTION": {
- "TITLE": "推送通知",
- "NOTE": "在此更新您的電子信箱通知設定",
- "CONVERSATION_ASSIGNMENT": "當對話被分配給我時發送推送通知",
- "CONVERSATION_CREATION": "建立新對話時發送推送通知",
- "CONVERSATION_MENTION": "當你在對話中被提及時以推播通知",
- "ASSIGNED_CONVERSATION_NEW_MESSAGE": "當被指派的對話中有新訊息時以推播通知",
- "PARTICIPATING_CONVERSATION_NEW_MESSAGE": "Send push notifications when a new message is created in a participating conversation",
- "HAS_ENABLED_PUSH": "您已啟用此瀏覽器的推送。",
- "REQUEST_PUSH": "啟用推送通知",
- "SLA_MISSED_FIRST_RESPONSE": "Send push notifications when a conversation misses first response SLA",
- "SLA_MISSED_NEXT_RESPONSE": "Send push notifications when a conversation misses next response SLA",
- "SLA_MISSED_RESOLUTION": "Send push notifications when a conversation misses resolution SLA"
+ "TITLE": "推播通知",
+ "NOTE": "在此更新您的推播通知偏好設定",
+ "CONVERSATION_ASSIGNMENT": "當對話被指派給我時發送推播通知",
+ "CONVERSATION_CREATION": "當有新對話建立時發送推播通知",
+ "CONVERSATION_MENTION": "當您在對話中被提及時發送推播通知",
+ "ASSIGNED_CONVERSATION_NEW_MESSAGE": "當已指派的對話中有新訊息時發送推播通知",
+ "PARTICIPATING_CONVERSATION_NEW_MESSAGE": "當參與中的對話有新訊息時發送推播通知",
+ "HAS_ENABLED_PUSH": "您已為此瀏覽器啟用推播通知。",
+ "REQUEST_PUSH": "啟用推播通知",
+ "SLA_MISSED_FIRST_RESPONSE": "當對話未達首次回應 SLA 時發送推播通知",
+ "SLA_MISSED_NEXT_RESPONSE": "當對話未達下次回應 SLA 時發送推播通知",
+ "SLA_MISSED_RESOLUTION": "當對話未達解決 SLA 時發送推播通知"
},
"PROFILE_IMAGE": {
- "LABEL": "頭像"
+ "LABEL": "個人頭像"
},
"NAME": {
- "LABEL": "你的姓名",
- "ERROR": "請輸入一個有效的完整姓名",
+ "LABEL": "您的姓名",
+ "ERROR": "請輸入有效的完整姓名",
"PLACEHOLDER": "請輸入您的完整姓名"
},
"DISPLAY_NAME": {
"LABEL": "顯示名稱",
- "ERROR": "請輸入一個有效的顯示名稱",
- "PLACEHOLDER": "請輸入一個名字,這將會在對話中顯示"
+ "ERROR": "請輸入有效的顯示名稱",
+ "PLACEHOLDER": "請輸入顯示名稱,此名稱將顯示在對話中"
},
"AVAILABILITY": {
- "LABEL": "有效的",
+ "LABEL": "上線狀態",
"STATUS": {
"ONLINE": "上線",
"BUSY": "忙碌",
"OFFLINE": "離線"
},
- "SET_AVAILABILITY_SUCCESS": "Availability has been set successfully",
- "SET_AVAILABILITY_ERROR": "Couldn't set availability, please try again",
- "IMPERSONATING_ERROR": "Cannot change availability while impersonating a user"
+ "SET_AVAILABILITY_SUCCESS": "上線狀態已成功設定",
+ "SET_AVAILABILITY_ERROR": "無法設定上線狀態,請再試一次",
+ "IMPERSONATING_ERROR": "模擬使用者時無法變更上線狀態"
},
"EMAIL": {
"LABEL": "您的電子信箱地址",
- "ERROR": "請輸入一個有效的電子信箱",
- "PLACEHOLDER": "請輸入您的名字,這將會在對話中顯示"
+ "ERROR": "請輸入有效的電子信箱地址",
+ "PLACEHOLDER": "請輸入您的電子信箱地址,此地址將顯示在對話中"
},
"CURRENT_PASSWORD": {
"LABEL": "目前的密碼",
@@ -217,13 +217,13 @@
},
"PASSWORD": {
"LABEL": "新密碼",
- "ERROR": "請輸入長度6或更長的密碼",
+ "ERROR": "請輸入長度 6 位以上的密碼",
"PLACEHOLDER": "請輸入新密碼"
},
"PASSWORD_CONFIRMATION": {
- "LABEL": "重新輸入一次密碼",
- "ERROR": "兩次密碼不一致",
- "PLACEHOLDER": "請重複您的新密碼"
+ "LABEL": "確認新密碼",
+ "ERROR": "確認密碼必須與新密碼一致",
+ "PLACEHOLDER": "請再次輸入您的新密碼"
}
}
},
@@ -231,40 +231,40 @@
"CHANGE_AVAILABILITY_STATUS": "變更",
"CHANGE_ACCOUNTS": "切換帳戶",
"SWITCH_ACCOUNT": "切換帳戶",
- "CONTACT_SUPPORT": "Contact Support",
+ "CONTACT_SUPPORT": "聯繫客服",
"SELECTOR_SUBTITLE": "從以下列表中選擇一個帳戶",
"PROFILE_SETTINGS": "個人資料設定",
- "YEAR_IN_REVIEW": "Year in Review",
- "KEYBOARD_SHORTCUTS": "鍵盤快速鍵",
- "APPEARANCE": "切換風格",
+ "YEAR_IN_REVIEW": "年度回顧",
+ "KEYBOARD_SHORTCUTS": "鍵盤快捷鍵",
+ "APPEARANCE": "切換外觀",
"SUPER_ADMIN_CONSOLE": "系統管理員後台",
- "DOCS": "Read documentation",
- "CHANGELOG": "Changelog",
- "LOGOUT": "退出登入"
+ "DOCS": "閱讀說明文件",
+ "CHANGELOG": "更新日誌",
+ "LOGOUT": "登出"
},
"APP_GLOBAL": {
- "TRIAL_MESSAGE": "剩餘試用期天數",
+ "TRIAL_MESSAGE": "天試用期剩餘。",
"TRAIL_BUTTON": "立即購買",
- "DELETED_USER": "刪除使用者",
- "EMAIL_VERIFICATION_PENDING": "It seems that you haven't verified your email address yet. Please check your inbox for the verification email.",
- "RESEND_VERIFICATION_MAIL": "Resend verification email",
- "EMAIL_VERIFICATION_SENT": "Verification email has been sent. Please check your inbox.",
+ "DELETED_USER": "已刪除的使用者",
+ "EMAIL_VERIFICATION_PENDING": "您似乎尚未驗證電子信箱地址。請檢查您的收件匣以取得驗證信件。",
+ "RESEND_VERIFICATION_MAIL": "重新發送驗證信件",
+ "EMAIL_VERIFICATION_SENT": "驗證信件已發送,請檢查您的收件匣。",
"ACCOUNT_SUSPENDED": {
- "TITLE": "Account Suspended",
- "MESSAGE": "Your account is suspended. Please reach out to the support team for more information."
+ "TITLE": "帳戶已停權",
+ "MESSAGE": "您的帳戶已被停權。如需更多資訊,請聯繫客服團隊。"
},
"NO_ACCOUNTS": {
- "TITLE": "No account found",
- "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.",
- "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.",
- "LOGOUT": "退出登入"
+ "TITLE": "找不到帳戶",
+ "MESSAGE_CLOUD": "您目前未加入任何帳戶。若您認為這是一個錯誤,請聯繫我們的客服團隊。",
+ "MESSAGE_SELF_HOSTED": "您目前未加入任何帳戶,請聯繫您的管理員。",
+ "LOGOUT": "登出"
}
},
"COMPONENTS": {
"CODE": {
"BUTTON_TEXT": "複製",
- "CODEPEN": "Open in CodePen",
- "COPY_SUCCESSFUL": "Copied to clipboard"
+ "CODEPEN": "在 CodePen 中開啟",
+ "COPY_SUCCESSFUL": "已複製到剪貼簿"
},
"SHOW_MORE_BLOCK": {
"SHOW_MORE": "顯示更多",
@@ -273,18 +273,18 @@
"FILE_BUBBLE": {
"DOWNLOAD": "下載",
"UPLOADING": "上傳中...",
- "INSTAGRAM_STORY_UNAVAILABLE": "This story is no longer available.",
- "INSTAGRAM_STORY_REPLY": "Replied to your story:"
+ "INSTAGRAM_STORY_UNAVAILABLE": "此限時動態已不再可用。",
+ "INSTAGRAM_STORY_REPLY": "回覆了您的限時動態:"
},
"LOCATION_BUBBLE": {
- "SEE_ON_MAP": "See on map"
+ "SEE_ON_MAP": "在地圖上查看"
},
"FORM_BUBBLE": {
"SUBMIT": "送出"
},
"MEDIA": {
- "IMAGE_UNAVAILABLE": "This image is no longer available.",
- "LOADING_FAILED": "Loading failed"
+ "IMAGE_UNAVAILABLE": "此圖片已不再可用。",
+ "LOADING_FAILED": "載入失敗"
}
},
"CONFIRM_EMAIL": "正在驗證...",
@@ -294,301 +294,301 @@
}
},
"SIDEBAR": {
- "NO_ITEMS": "No items",
- "CURRENTLY_VIEWING_ACCOUNT": "Currently viewing:",
+ "NO_ITEMS": "沒有項目",
+ "CURRENTLY_VIEWING_ACCOUNT": "目前檢視:",
"SWITCH": "切換",
- "INBOX_VIEW": "Inbox View",
+ "INBOX_VIEW": "收件匣檢視",
"CONVERSATIONS": "對話",
- "INBOX": "My Inbox",
+ "INBOX": "我的收件匣",
"ALL_CONVERSATIONS": "所有對話",
- "MENTIONED_CONVERSATIONS": "被提及",
+ "MENTIONED_CONVERSATIONS": "提及",
"PARTICIPATING_CONVERSATIONS": "參與中",
"UNATTENDED_CONVERSATIONS": "無人處理",
"REPORTS": "報表",
"SETTINGS": "設定",
"CONTACTS": "聯絡人",
- "ACTIVE": "Active",
- "COMPANIES": "Companies",
- "ALL_COMPANIES": "All Companies",
+ "ACTIVE": "進行中",
+ "COMPANIES": "公司",
+ "ALL_COMPANIES": "所有公司",
"CAPTAIN": "Captain",
- "CAPTAIN_ASSISTANTS": "Assistants",
- "CAPTAIN_DOCUMENTS": "Documents",
- "CAPTAIN_RESPONSES": "FAQs",
- "CAPTAIN_TOOLS": "Tools",
- "CAPTAIN_SCENARIOS": "Scenarios",
- "CAPTAIN_PLAYGROUND": "Playground",
+ "CAPTAIN_ASSISTANTS": "助理",
+ "CAPTAIN_DOCUMENTS": "文件",
+ "CAPTAIN_RESPONSES": "常見問答",
+ "CAPTAIN_TOOLS": "工具",
+ "CAPTAIN_SCENARIOS": "情境",
+ "CAPTAIN_PLAYGROUND": "練習場",
"CAPTAIN_INBOXES": "收件匣",
"CAPTAIN_SETTINGS": "設定",
"HOME": "首頁",
- "AGENTS": "客服",
+ "AGENTS": "客服人員",
"AGENT_BOTS": "機器人",
"AUDIT_LOGS": "稽核日誌",
"INBOXES": "收件匣",
"NOTIFICATIONS": "通知",
"CANNED_RESPONSES": "預設回覆",
- "INTEGRATIONS": "整合方式",
- "PROFILE_SETTINGS": "個人檔案設定",
+ "INTEGRATIONS": "整合",
+ "PROFILE_SETTINGS": "個人資料設定",
"ACCOUNT_SETTINGS": "帳戶設定",
- "APPLICATIONS": "應用程序",
+ "APPLICATIONS": "應用程式",
"LABELS": "標籤",
"CUSTOM_ATTRIBUTES": "自訂屬性",
"AUTOMATION": "自動化",
"MACROS": "巨集",
"TEAMS": "團隊",
"BILLING": "帳單",
- "CUSTOM_VIEWS_FOLDER": "常用篩選條件",
+ "CUSTOM_VIEWS_FOLDER": "資料夾",
"CUSTOM_VIEWS_SEGMENTS": "分眾",
"ALL_CONTACTS": "所有聯絡人",
- "TAGGED_WITH": "Tagged with",
+ "TAGGED_WITH": "標記為",
"NEW_LABEL": "新增標籤",
- "NEW_TEAM": "建立新團隊",
+ "NEW_TEAM": "新增團隊",
"NEW_INBOX": "新增收件匣",
"REPORTS_CONVERSATION": "對話",
- "CSAT": "顧客滿意度得分(CSAT)",
- "LIVE_CHAT": "Live Chat",
+ "CSAT": "CSAT",
+ "LIVE_CHAT": "即時聊天",
"SMS": "SMS",
"WHATSAPP": "WhatsApp",
"CAMPAIGNS": "行銷活動",
- "ONGOING": "Ongoing",
- "ONE_OFF": "開啟 關閉",
- "REPORTS_SLA": "服務水準協議(SLA)",
+ "ONGOING": "進行中",
+ "ONE_OFF": "一次性",
+ "REPORTS_SLA": "SLA",
"REPORTS_BOT": "機器人",
- "REPORTS_AGENT": "客服",
+ "REPORTS_AGENT": "客服人員",
"REPORTS_LABEL": "標籤",
"REPORTS_INBOX": "收件匣",
- "REPORTS_TEAM": "Team",
- "AGENT_ASSIGNMENT": "Agent Assignment",
- "SET_AVAILABILITY_TITLE": "我的狀態",
- "SET_YOUR_AVAILABILITY": "設定你的服務時間",
- "SLA": "服務水準協議(SLA)",
+ "REPORTS_TEAM": "團隊",
+ "AGENT_ASSIGNMENT": "客服指派",
+ "SET_AVAILABILITY_TITLE": "將自己設定為",
+ "SET_YOUR_AVAILABILITY": "設定您的上線狀態",
+ "SLA": "SLA",
"CUSTOM_ROLES": "自訂角色",
"BETA": "Beta",
"REPORTS_OVERVIEW": "總覽",
- "REAUTHORIZE": "Your inbox connection has expired, please reconnect\n to continue receiving and sending messages",
+ "REAUTHORIZE": "您的收件匣連線已過期,請重新連線\n以繼續接收和傳送訊息",
"HELP_CENTER": {
- "TITLE": "Help Center",
- "ARTICLES": "Articles",
- "CATEGORIES": "Categories",
- "LOCALES": "Locales",
+ "TITLE": "幫助中心",
+ "ARTICLES": "文章",
+ "CATEGORIES": "分類",
+ "LOCALES": "語系",
"SETTINGS": "設定"
},
"CHANNELS": "頻道",
"SET_AUTO_OFFLINE": {
"TEXT": "自動標記為離線",
- "INFO_TEXT": "當您未使用應用程式或儀表板時,讓系統自動將您標記為離線",
- "INFO_SHORT": "Automatically mark offline when you aren't using the app."
+ "INFO_TEXT": "當您未使用應用程式或儀表板時,讓系統自動將您標記為離線。",
+ "INFO_SHORT": "當您未使用應用程式時自動標記為離線。"
},
- "DOCS": "Read docs",
- "SECURITY": "Security",
+ "DOCS": "閱讀文件",
+ "SECURITY": "安全性",
"CAPTAIN_AI": "Captain",
- "CONVERSATION_WORKFLOW": "Conversation Workflow"
+ "CONVERSATION_WORKFLOW": "對話工作流程"
},
"CAPTAIN_SETTINGS": {
- "TITLE": "Captain Settings",
- "DESCRIPTION": "Configure your AI models and features for Captain. Captain follows a credit based billing, you will be charged credits for every action Captain takes based on the model selected.",
- "LOADING": "Loading Captain configuration...",
- "LINK_TEXT": "Learn more about Captain Credits",
- "NOT_ENABLED": "Captain is not enabled for your account. Please upgrade your plan to access Captain features.",
+ "TITLE": "Captain 設定",
+ "DESCRIPTION": "設定 Captain 的 AI 模型和功能。Captain 採用點數計費制,您將根據所選模型為 Captain 執行的每項操作支付點數。",
+ "LOADING": "正在載入 Captain 設定...",
+ "LINK_TEXT": "了解更多關於 Captain 點數",
+ "NOT_ENABLED": "您的帳戶尚未啟用 Captain。請升級您的方案以使用 Captain 功能。",
"MODEL_CONFIG": {
- "TITLE": "Model Configuration",
- "DESCRIPTION": "Select AI models for different features.",
- "SELECT_MODEL": "Select model",
- "CREDITS_PER_MESSAGE": "{credits} credit/message",
- "COMING_SOON": "Coming soon",
+ "TITLE": "模型設定",
+ "DESCRIPTION": "為不同功能選擇 AI 模型。",
+ "SELECT_MODEL": "選擇模型",
+ "CREDITS_PER_MESSAGE": "{credits} 點數/訊息",
+ "COMING_SOON": "即將推出",
"EDITOR": {
- "TITLE": "Editor Features",
- "DESCRIPTION": "Powers smart compose, grammar corrections, tone adjustments, and content enhancement in your message editor."
+ "TITLE": "編輯器功能",
+ "DESCRIPTION": "支援智慧撰寫、文法修正、語氣調整,以及訊息編輯器中的內容強化。"
},
"ASSISTANT": {
- "TITLE": "Assistant",
- "DESCRIPTION": "Handles automated responses, conversation summaries, and intelligent reply suggestions for customer interactions."
+ "TITLE": "助理",
+ "DESCRIPTION": "處理自動回覆、對話摘要,以及客戶互動的智慧回覆建議。"
},
"COPILOT": {
"TITLE": "Co-pilot",
- "DESCRIPTION": "Provides real-time contextual suggestions, knowledge base recommendations, and proactive insights during conversations."
+ "DESCRIPTION": "在對話過程中提供即時情境建議、知識庫推薦及主動洞察。"
}
},
"FEATURES": {
- "TITLE": "Features",
- "DESCRIPTION": "Enable or disable AI-powered features.",
+ "TITLE": "功能",
+ "DESCRIPTION": "啟用或停用 AI 驅動的功能。",
"AUDIO_TRANSCRIPTION": {
- "TITLE": "Audio Transcription",
- "DESCRIPTION": "Automatically convert voice messages and call recordings into searchable text transcripts."
+ "TITLE": "語音轉文字",
+ "DESCRIPTION": "自動將語音訊息和通話錄音轉換為可搜尋的文字記錄。"
},
"HELP_CENTER_SEARCH": {
- "TITLE": "Help Center Search Indexing",
- "DESCRIPTION": "Use AI for context aware search inside your help center articles."
+ "TITLE": "幫助中心搜尋索引",
+ "DESCRIPTION": "使用 AI 在您的幫助中心文章中進行情境感知搜尋。"
},
"LABEL_SUGGESTION": {
- "TITLE": "Label Suggestion",
- "DESCRIPTION": "Automatically suggest relevant labels and tags for conversations based on content analysis and context.",
- "MODEL_TITLE": "Label Suggestion Model",
- "MODEL_DESCRIPTION": "Select the AI model to use for analyzing conversations and suggesting appropriate labels"
+ "TITLE": "標籤建議",
+ "DESCRIPTION": "根據內容分析和情境,自動建議對話的相關標籤。",
+ "MODEL_TITLE": "標籤建議模型",
+ "MODEL_DESCRIPTION": "選擇用於分析對話並建議適當標籤的 AI 模型"
}
},
"API": {
- "SUCCESS": "Captain settings updated successfully.",
- "ERROR": "Failed to update Captain settings. Please try again."
+ "SUCCESS": "Captain 設定已成功更新。",
+ "ERROR": "更新 Captain 設定失敗,請再試一次。"
}
},
"BILLING_SETTINGS": {
"TITLE": "帳單",
- "DESCRIPTION": "Manage your subscription here, upgrade your plan and get more for your team.",
+ "DESCRIPTION": "在此管理您的訂閱,升級方案以為您的團隊獲得更多功能。",
"CURRENT_PLAN": {
- "TITLE": "Current Plan",
- "PLAN_NOTE": "You are currently subscribed to the **{plan}** plan with **{quantity}** licenses",
- "SEAT_COUNT": "Number of seats",
- "RENEWS_ON": "Renews on"
+ "TITLE": "目前方案",
+ "PLAN_NOTE": "您目前訂閱的是 **{plan}** 方案,擁有 **{quantity}** 個授權",
+ "SEAT_COUNT": "席位數量",
+ "RENEWS_ON": "續約日期"
},
- "VIEW_PRICING": "View Pricing",
+ "VIEW_PRICING": "查看定價",
"MANAGE_SUBSCRIPTION": {
- "TITLE": "Manage your subscription",
- "DESCRIPTION": "View your previous invoices, edit your billing details, or cancel your subscription.",
- "BUTTON_TXT": "Go to the billing portal"
+ "TITLE": "管理您的訂閱",
+ "DESCRIPTION": "查看過去的發票、編輯帳單資訊或取消訂閱。",
+ "BUTTON_TXT": "前往帳單入口"
},
"CAPTAIN": {
"TITLE": "Captain",
- "DESCRIPTION": "Manage usage and credits for Captain AI.",
- "BUTTON_TXT": "Buy more credits",
- "DOCUMENTS": "Documents",
- "RESPONSES": "Responses",
- "UPGRADE": "Captain is not available on the free plan, upgrade now to get access to assistants, copilot and more.",
+ "DESCRIPTION": "管理 Captain AI 的用量和點數。",
+ "BUTTON_TXT": "購買更多點數",
+ "DOCUMENTS": "文件",
+ "RESPONSES": "點數",
+ "UPGRADE": "Captain 在免費方案中不可用,立即升級以使用助理、Co-pilot 等功能。",
"REFRESH_CREDITS": "重新整理"
},
"CHAT_WITH_US": {
- "TITLE": "Need help?",
- "DESCRIPTION": "Do you face any issues in billing? We are here to help.",
- "BUTTON_TXT": "與我們對話"
+ "TITLE": "需要協助?",
+ "DESCRIPTION": "帳單方面遇到問題?我們隨時為您提供協助。",
+ "BUTTON_TXT": "與我們聯繫"
},
- "NO_BILLING_USER": "Your billing account is being configured. Please refresh the page and try again.",
+ "NO_BILLING_USER": "您的帳單帳戶正在設定中,請重新整理頁面後再試一次。",
"TOPUP": {
- "BUY_CREDITS": "Buy more credits",
- "MODAL_TITLE": "Buy AI Credits",
- "MODAL_DESCRIPTION": "Purchase additional credits for Captain AI.",
- "CREDITS": "CREDITS",
- "ONE_TIME": "one-time",
- "POPULAR": "Most Popular",
- "NOTE_TITLE": "Note:",
- "NOTE_DESCRIPTION": "Credits are added immediately and expire in 6 months. An active subscription is required to use credits. Purchased credits are consumed after your monthly plan credits.",
+ "BUY_CREDITS": "購買更多點數",
+ "MODAL_TITLE": "購買 AI 點數",
+ "MODAL_DESCRIPTION": "為 Captain AI 購買額外的點數。",
+ "CREDITS": "點數",
+ "ONE_TIME": "一次性",
+ "POPULAR": "最熱門",
+ "NOTE_TITLE": "注意:",
+ "NOTE_DESCRIPTION": "點數會立即加入並於 6 個月後到期。使用點數需要有效的訂閱。購買的點數將在每月方案點數用完後才會使用。",
"CANCEL": "取消",
- "PURCHASE": "Purchase Credits",
- "LOADING": "Loading options...",
- "FETCH_ERROR": "Failed to load credit options. Please try again.",
- "PURCHASE_ERROR": "Failed to process purchase. Please try again.",
- "PURCHASE_SUCCESS": "Successfully added {credits} credits to your account",
+ "PURCHASE": "購買點數",
+ "LOADING": "正在載入選項...",
+ "FETCH_ERROR": "無法載入點數選項,請再試一次。",
+ "PURCHASE_ERROR": "購買處理失敗,請再試一次。",
+ "PURCHASE_SUCCESS": "已成功將 {credits} 點數加入您的帳戶",
"CONFIRM": {
- "TITLE": "Confirm Purchase",
- "DESCRIPTION": "You are about to purchase {credits} credits for {amount}.",
- "INSTANT_DEDUCTION_NOTE": "Your saved card will be charged immediately upon confirmation.",
- "GO_BACK": "Go Back",
- "CONFIRM_PURCHASE": "Confirm Purchase"
+ "TITLE": "確認購買",
+ "DESCRIPTION": "您即將以 {amount} 購買 {credits} 點數。",
+ "INSTANT_DEDUCTION_NOTE": "確認後將立即從您的已儲存信用卡扣款。",
+ "GO_BACK": "返回",
+ "CONFIRM_PURCHASE": "確認購買"
}
}
},
"SECURITY_SETTINGS": {
- "TITLE": "Security",
- "DESCRIPTION": "Manage your account security settings.",
- "LINK_TEXT": "Learn more about SAML SSO",
- "SAML_DISABLED_MESSAGE": "SAML SSO is currently disabled. Please contact your administrator to enable this feature.",
+ "TITLE": "安全性",
+ "DESCRIPTION": "管理您的帳戶安全設定。",
+ "LINK_TEXT": "了解更多關於 SAML SSO",
+ "SAML_DISABLED_MESSAGE": "SAML SSO 目前已停用。請聯繫您的管理員以啟用此功能。",
"SAML": {
"TITLE": "SAML SSO",
- "NOTE": "Configure SAML single sign-on for your account. Users will authenticate through your identity provider instead of using email/password.",
+ "NOTE": "為您的帳戶設定 SAML 單一登入。使用者將透過您的身份提供者進行驗證,而非使用電子郵件/密碼。",
"ACS_URL": {
"LABEL": "ACS URL",
- "TOOLTIP": "Assertion Consumer Service URL - Configure this URL in your IdP as the destination for SAML responses"
+ "TOOLTIP": "Assertion Consumer Service URL - 在您的 IdP 中將此 URL 設定為 SAML 回應的目的地"
},
"SSO_URL": {
"LABEL": "SSO URL",
- "HELP": "The URL where SAML authentication requests will be sent",
+ "HELP": "SAML 驗證請求將發送至此 URL",
"PLACEHOLDER": "https://your-idp.com/saml/sso"
},
"CERTIFICATE": {
- "LABEL": "Signing certificate in PEM format",
- "HELP": "The public certificate from your identity provider used to verify SAML responses",
+ "LABEL": "PEM 格式的簽章憑證",
+ "HELP": "來自您身份提供者的公開憑證,用於驗證 SAML 回應",
"PLACEHOLDER": "-----BEGIN CERTIFICATE-----\nMIIC..."
},
"FINGERPRINT": {
- "LABEL": "Fingerprint",
- "TOOLTIP": "SHA-1 fingerprint of the certificate - Use this to verify the certificate in your IdP configuration"
+ "LABEL": "指紋",
+ "TOOLTIP": "憑證的 SHA-1 指紋 - 用此指紋在您的 IdP 設定中驗證憑證"
},
- "COPY_SUCCESS": "Copied to clipboard",
+ "COPY_SUCCESS": "已複製到剪貼簿",
"SP_ENTITY_ID": {
"LABEL": "SP Entity ID",
- "HELP": "Unique identifier for this application as a service provider (auto-generated).",
- "TOOLTIP": "Unique identifier for Chatwoot as the Service Provider - Configure this in your IdP settings"
+ "HELP": "此應用程式作為服務提供者的唯一識別碼(自動產生)。",
+ "TOOLTIP": "Chatwoot 作為服務提供者的唯一識別碼 - 請在您的 IdP 設定中進行配置"
},
"IDP_ENTITY_ID": {
- "LABEL": "Identity Provider Entity ID",
- "HELP": "Unique identifier for your identity provider (usually found in IdP configuration)",
+ "LABEL": "身份提供者 Entity ID",
+ "HELP": "您的身份提供者的唯一識別碼(通常可在 IdP 設定中找到)",
"PLACEHOLDER": "https://your-idp.com/saml"
},
- "UPDATE_BUTTON": "Update SAML Settings",
+ "UPDATE_BUTTON": "更新 SAML 設定",
"API": {
- "SUCCESS": "SAML settings updated successfully",
- "ERROR": "Failed to update SAML settings",
- "ERROR_LOADING": "Failed to load SAML settings",
- "DISABLED": "SAML settings disabled successfully"
+ "SUCCESS": "SAML 設定已成功更新",
+ "ERROR": "更新 SAML 設定失敗",
+ "ERROR_LOADING": "載入 SAML 設定失敗",
+ "DISABLED": "SAML 設定已成功停用"
},
"VALIDATION": {
- "REQUIRED_FIELDS": "SSO URL, Identity Provider Entity ID, and Certificate are required fields",
- "SSO_URL_ERROR": "Please enter a valid SSO URL",
- "CERTIFICATE_ERROR": "Certificate is required",
- "IDP_ENTITY_ID_ERROR": "Identity Provider Entity ID is required"
+ "REQUIRED_FIELDS": "SSO URL、身份提供者 Entity ID 和憑證為必填欄位",
+ "SSO_URL_ERROR": "請輸入有效的 SSO URL",
+ "CERTIFICATE_ERROR": "憑證為必填欄位",
+ "IDP_ENTITY_ID_ERROR": "身份提供者 Entity ID 為必填欄位"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "The SAML SSO feature is only available in the Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade to an Enterprise plan to access SAML single sign-on and other advanced security features.",
- "ASK_ADMIN": "Please reach out to your administrator for the upgrade."
+ "AVAILABLE_ON": "SAML SSO 功能僅在企業版方案中提供。",
+ "UPGRADE_PROMPT": "升級至企業版方案以使用 SAML 單一登入及其他進階安全功能。",
+ "ASK_ADMIN": "請聯繫您的管理員進行升級。"
},
"PAYWALL": {
- "TITLE": "Upgrade to enable SAML SSO",
- "AVAILABLE_ON": "The SAML SSO feature is only available in the Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to SAML single sign-on and other advanced features.",
- "UPGRADE_NOW": "Upgrade now",
- "CANCEL_ANYTIME": "You can change or cancel your plan anytime"
+ "TITLE": "升級以啟用 SAML SSO",
+ "AVAILABLE_ON": "SAML SSO 功能僅在企業版方案中提供。",
+ "UPGRADE_PROMPT": "升級您的方案以使用 SAML 單一登入及其他進階功能。",
+ "UPGRADE_NOW": "立即升級",
+ "CANCEL_ANYTIME": "您可以隨時變更或取消您的方案"
},
"ATTRIBUTE_MAPPING": {
- "TITLE": "SAML Attribute Setup",
- "DESCRIPTION": "The following attribute mappings must be configured in your identity provider"
+ "TITLE": "SAML 屬性設定",
+ "DESCRIPTION": "以下屬性對應必須在您的身份提供者中進行設定"
},
"INFO_SECTION": {
- "TITLE": "Service Provider Information",
- "TOOLTIP": "Copy these values and configure them in your Identity Provider to establish the SAML connection"
+ "TITLE": "服務提供者資訊",
+ "TOOLTIP": "複製這些值並在您的身份提供者中進行設定,以建立 SAML 連線"
}
}
},
"CONVERSATION_WORKFLOW": {
"INDEX": {
"HEADER": {
- "TITLE": "Conversation Workflows",
- "DESCRIPTION": "Configure rules and required fields for conversation resolution."
+ "TITLE": "對話工作流程",
+ "DESCRIPTION": "設定對話解決的規則和必填欄位。"
}
},
"REQUIRED_ATTRIBUTES": {
- "TITLE": "Attributes required on resolution",
- "DESCRIPTION": "When resolving a conversation, agents will be prompted to fill these attributes if they haven't yet.",
- "NO_ATTRIBUTES": "No attributes added yet",
+ "TITLE": "解決時必填的屬性",
+ "DESCRIPTION": "解決對話時,系統會提示客服人員填寫尚未完成的屬性。",
+ "NO_ATTRIBUTES": "尚未新增任何屬性",
"ADD": {
- "TITLE": "Add Attributes",
- "SEARCH_PLACEHOLDER": "Search attributes"
+ "TITLE": "新增屬性",
+ "SEARCH_PLACEHOLDER": "搜尋屬性"
},
"SAVE": {
- "SUCCESS": "Required attributes updated",
- "ERROR": "Could not update required attributes, please try again"
+ "SUCCESS": "必填屬性已更新",
+ "ERROR": "無法更新必填屬性,請再試一次"
},
"MODAL": {
"TITLE": "解決對話",
- "DESCRIPTION": "Please fill in the following custom attributes before resolving this conversation",
+ "DESCRIPTION": "請在解決此對話前填寫以下自訂屬性",
"ACTIONS": {
"RESOLVE": "解決對話",
"CANCEL": "取消"
},
"PLACEHOLDERS": {
- "TEXT": "Write a note...",
- "NUMBER": "Enter a number",
- "LINK": "Add a link",
- "DATE": "Pick a date",
- "LIST": "Select an option"
+ "TEXT": "輸入備註...",
+ "NUMBER": "輸入數字",
+ "LINK": "新增連結",
+ "DATE": "選擇日期",
+ "LIST": "選擇選項"
},
"CHECKBOX": {
"YES": "是",
@@ -596,325 +596,325 @@
}
},
"PAYWALL": {
- "TITLE": "Upgrade to use required attributes",
- "AVAILABLE_ON": "The required conversation attributes feature is available on the Business and Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to prompt agents to fill required attributes before conversation resolution.",
- "UPGRADE_NOW": "Upgrade now",
- "CANCEL_ANYTIME": "You can change or cancel your plan anytime"
+ "TITLE": "升級以使用必填屬性功能",
+ "AVAILABLE_ON": "對話必填屬性功能在商務版和企業版方案中提供。",
+ "UPGRADE_PROMPT": "升級您的方案,以在對話解決前提示客服人員填寫必填屬性。",
+ "UPGRADE_NOW": "立即升級",
+ "CANCEL_ANYTIME": "您可以隨時變更或取消您的方案"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "The required conversation attributes feature is available on the paid plans.",
- "UPGRADE_PROMPT": "Upgrade to a paid plan to enforce required attributes before conversation resolution.",
- "ASK_ADMIN": "Please reach out to your administrator for the upgrade."
+ "AVAILABLE_ON": "對話必填屬性功能在付費方案中提供。",
+ "UPGRADE_PROMPT": "升級至付費方案,以在對話解決前強制要求填寫必填屬性。",
+ "ASK_ADMIN": "請聯繫您的管理員進行升級。"
}
}
},
"CREATE_ACCOUNT": {
- "NO_ACCOUNT_WARNING": "Uh oh! We could not find any Chatwoot accounts. Please create a new account to continue.",
+ "NO_ACCOUNT_WARNING": "糟糕!找不到任何 Chatwoot 帳戶。請建立新帳戶以繼續。",
"NEW_ACCOUNT": "新帳戶",
"SELECTOR_SUBTITLE": "建立新帳戶",
"API": {
- "SUCCESS_MESSAGE": "成功建立帳戶",
- "EXIST_MESSAGE": "帳戶已經存在",
+ "SUCCESS_MESSAGE": "帳戶已成功建立",
+ "EXIST_MESSAGE": "帳戶已存在",
"ERROR_MESSAGE": "無法連接伺服器,請稍後再試"
},
"FORM": {
"NAME": {
"LABEL": "公司名稱",
- "PLACEHOLDER": "Wayne 企業"
+ "PLACEHOLDER": "Wayne Enterprises"
},
"SUBMIT": "送出",
"CANCEL": "取消"
}
},
"KEYBOARD_SHORTCUTS": {
- "TOGGLE_MODAL": "View all shortcuts",
+ "TOGGLE_MODAL": "查看所有快捷鍵",
"TITLE": {
"OPEN_CONVERSATION": "開啟對話",
- "RESOLVE_AND_NEXT": "Resolve and move to next",
- "NAVIGATE_DROPDOWN": "Navigate dropdown items",
- "RESOLVE_CONVERSATION": "Resolve Conversation",
- "GO_TO_CONVERSATION_DASHBOARD": "Go to Conversation Dashboard",
+ "RESOLVE_AND_NEXT": "解決並移至下一個",
+ "NAVIGATE_DROPDOWN": "瀏覽下拉選單項目",
+ "RESOLVE_CONVERSATION": "解決對話",
+ "GO_TO_CONVERSATION_DASHBOARD": "前往對話儀表板",
"ADD_ATTACHMENT": "新增附件",
- "GO_TO_CONTACTS_DASHBOARD": "Go to Contacts Dashboard",
- "TOGGLE_SIDEBAR": "Toggle Sidebar",
- "GO_TO_REPORTS_SIDEBAR": "Go to Reports sidebar",
- "MOVE_TO_NEXT_TAB": "Move to next tab in conversation list",
+ "GO_TO_CONTACTS_DASHBOARD": "前往聯絡人儀表板",
+ "TOGGLE_SIDEBAR": "切換側邊欄",
+ "GO_TO_REPORTS_SIDEBAR": "前往報表側邊欄",
+ "MOVE_TO_NEXT_TAB": "移至對話列表的下一個分頁",
"GO_TO_SETTINGS": "前往設定",
- "SWITCH_TO_PRIVATE_NOTE": "Switch to Private Note",
- "SWITCH_TO_REPLY": "Switch to Reply",
- "TOGGLE_SNOOZE_DROPDOWN": "Toggle snooze dropdown"
+ "SWITCH_TO_PRIVATE_NOTE": "切換至私人備註",
+ "SWITCH_TO_REPLY": "切換至回覆",
+ "TOGGLE_SNOOZE_DROPDOWN": "切換延後下拉選單"
}
},
"ASSIGNMENT_POLICY": {
"INDEX": {
"HEADER": {
- "TITLE": "Agent assignment",
- "DESCRIPTION": "Define policies to effectively manage workload and route conversations based on the needs of inboxes and agents. Learn more here"
+ "TITLE": "客服指派",
+ "DESCRIPTION": "定義政策以有效管理工作量,並根據收件匣和客服人員的需求分配對話。在此了解更多"
},
"ASSIGNMENT_POLICY": {
- "TITLE": "Assignment policy",
- "DESCRIPTION": "Manage how conversations get assigned in inboxes.",
+ "TITLE": "指派政策",
+ "DESCRIPTION": "管理收件匣中對話的指派方式。",
"FEATURES": [
- "Assign by conversations evenly or by available capacity",
- "Add fair distribution rules to avoid overloading any agent",
- "Add inboxes to a policy - one policy per inbox"
+ "依對話數量平均分配或依可用容量分配",
+ "新增公平分配規則以避免任何客服人員過載",
+ "將收件匣加入政策 - 每個收件匣一個政策"
]
},
"AGENT_CAPACITY_POLICY": {
- "TITLE": "Agent capacity policy",
- "DESCRIPTION": "Manage workload for agents.",
+ "TITLE": "客服容量政策",
+ "DESCRIPTION": "管理客服人員的工作量。",
"FEATURES": [
- "Define maximum conversations per inbox",
- "Create exceptions based on labels and time",
- "Add agents to a policy - one policy per agent"
+ "定義每個收件匣的最大對話數",
+ "根據標籤和時間建立例外規則",
+ "將客服人員加入政策 - 每位客服一個政策"
]
}
},
"AGENT_ASSIGNMENT_POLICY": {
"INDEX": {
"HEADER": {
- "TITLE": "Assignment policy",
- "CREATE_POLICY": "New policy"
+ "TITLE": "指派政策",
+ "CREATE_POLICY": "新增政策"
},
"CARD": {
- "ORDER": "Order",
- "PRIORITY": "優先程度",
- "ACTIVE": "Active",
- "INACTIVE": "Inactive",
- "POPOVER": "Added inboxes",
+ "ORDER": "順序",
+ "PRIORITY": "優先順序",
+ "ACTIVE": "啟用中",
+ "INACTIVE": "已停用",
+ "POPOVER": "已加入的收件匣",
"EDIT": "編輯"
},
- "NO_RECORDS_FOUND": "No assignment policies found"
+ "NO_RECORDS_FOUND": "找不到指派政策"
},
"CREATE": {
"HEADER": {
- "TITLE": "Create assignment policy"
+ "TITLE": "建立指派政策"
},
- "CREATE_BUTTON": "Create policy",
+ "CREATE_BUTTON": "建立政策",
"API": {
- "SUCCESS_MESSAGE": "Assignment policy created successfully",
- "ERROR_MESSAGE": "Failed to create assignment policy",
- "INBOX_LINKED": "Inbox has been linked to the policy"
+ "SUCCESS_MESSAGE": "指派政策已成功建立",
+ "ERROR_MESSAGE": "建立指派政策失敗",
+ "INBOX_LINKED": "收件匣已連結至此政策"
}
},
"EDIT": {
"HEADER": {
- "TITLE": "Edit assignment policy"
+ "TITLE": "編輯指派政策"
},
- "EDIT_BUTTON": "Update policy",
+ "EDIT_BUTTON": "更新政策",
"CONFIRM_ADD_INBOX_DIALOG": {
- "TITLE": "Add inbox",
- "DESCRIPTION": "{inboxName} inbox is already linked to another policy. Are you sure you want to link it to this policy? It will be unlinked from the other policy.",
- "CONFIRM_BUTTON_LABEL": "Continue",
+ "TITLE": "新增收件匣",
+ "DESCRIPTION": "{inboxName} 收件匣已連結至其他政策。確定要將其連結至此政策嗎?它將從另一個政策中解除連結。",
+ "CONFIRM_BUTTON_LABEL": "繼續",
"CANCEL_BUTTON_LABEL": "取消"
},
"INBOX_LINK_PROMPT": {
- "TITLE": "Link inbox to policy",
- "DESCRIPTION": "Would you like to link this inbox to the assignment policy?",
- "LINK_BUTTON": "Link inbox",
- "CANCEL_BUTTON": "Skip"
+ "TITLE": "將收件匣連結至政策",
+ "DESCRIPTION": "您要將此收件匣連結至指派政策嗎?",
+ "LINK_BUTTON": "連結收件匣",
+ "CANCEL_BUTTON": "略過"
},
"API": {
- "SUCCESS_MESSAGE": "Assignment policy updated successfully",
- "ERROR_MESSAGE": "Failed to update assignment policy"
+ "SUCCESS_MESSAGE": "指派政策已成功更新",
+ "ERROR_MESSAGE": "更新指派政策失敗"
},
"INBOX_API": {
"ADD": {
- "SUCCESS_MESSAGE": "Inbox added to policy successfully",
- "ERROR_MESSAGE": "Failed to add inbox to policy"
+ "SUCCESS_MESSAGE": "收件匣已成功加入政策",
+ "ERROR_MESSAGE": "將收件匣加入政策失敗"
},
"REMOVE": {
- "SUCCESS_MESSAGE": "Inbox removed from policy successfully",
- "ERROR_MESSAGE": "Failed to remove inbox from policy"
+ "SUCCESS_MESSAGE": "收件匣已成功從政策中移除",
+ "ERROR_MESSAGE": "將收件匣從政策中移除失敗"
}
}
},
"FORM": {
"NAME": {
- "LABEL": "Policy name:",
- "PLACEHOLDER": "Enter policy name"
+ "LABEL": "政策名稱:",
+ "PLACEHOLDER": "輸入政策名稱"
},
"DESCRIPTION": {
- "LABEL": "描述資訊:",
- "PLACEHOLDER": "Enter description"
+ "LABEL": "描述:",
+ "PLACEHOLDER": "輸入描述"
},
"STATUS": {
- "LABEL": "狀態:",
- "PLACEHOLDER": "Select status",
- "ACTIVE": "Policy is active",
- "INACTIVE": "Policy is inactive"
+ "LABEL": "狀態:",
+ "PLACEHOLDER": "選擇狀態",
+ "ACTIVE": "政策已啟用",
+ "INACTIVE": "政策已停用"
},
"ASSIGNMENT_ORDER": {
- "LABEL": "Assignment order",
+ "LABEL": "指派順序",
"ROUND_ROBIN": {
- "LABEL": "Round robin",
- "DESCRIPTION": "Assign conversations evenly among agents."
+ "LABEL": "輪流分配",
+ "DESCRIPTION": "在客服人員之間平均分配對話。"
},
"BALANCED": {
- "LABEL": "Balanced",
- "DESCRIPTION": "Assign conversations based on available capacity.",
- "PREMIUM_MESSAGE": "Upgrade to access balanced assignment and agent capacity management.",
- "PREMIUM_BADGE": "Premium"
+ "LABEL": "平衡分配",
+ "DESCRIPTION": "根據可用容量分配對話。",
+ "PREMIUM_MESSAGE": "升級以使用平衡分配和客服容量管理功能。",
+ "PREMIUM_BADGE": "進階版"
}
},
"ASSIGNMENT_PRIORITY": {
- "LABEL": "Assignment priority",
+ "LABEL": "指派優先順序",
"EARLIEST_CREATED": {
- "LABEL": "Earliest created",
- "DESCRIPTION": "The conversation that was created first gets assigned first."
+ "LABEL": "最早建立",
+ "DESCRIPTION": "最先建立的對話優先被指派。"
},
"LONGEST_WAITING": {
- "LABEL": "Longest waiting",
- "DESCRIPTION": "The conversation waiting the longest gets assigned first."
+ "LABEL": "等待最久",
+ "DESCRIPTION": "等待時間最長的對話優先被指派。"
}
},
"FAIR_DISTRIBUTION": {
- "LABEL": "Fair distribution policy",
- "DESCRIPTION": "Set the maximum number of conversations that can be assigned per agent within a time window to avoid overloading any one agent. This required field defaults to 100 conversations per hour.",
- "INPUT_MAX": "Assign max",
- "DURATION": "Conversations per agent in every"
+ "LABEL": "公平分配政策",
+ "DESCRIPTION": "設定在時間區間內每位客服人員可被指派的最大對話數,以避免任何一位客服人員過載。此必填欄位預設為每小時 100 則對話。",
+ "INPUT_MAX": "最大指派數",
+ "DURATION": "每位客服人員在每段時間內的對話數"
},
"INBOXES": {
- "LABEL": "Added inboxes",
- "DESCRIPTION": "Add inboxes for which this policy will be applicable.",
- "ADD_BUTTON": "Add inbox",
+ "LABEL": "已加入的收件匣",
+ "DESCRIPTION": "新增適用此政策的收件匣。",
+ "ADD_BUTTON": "新增收件匣",
"DROPDOWN": {
- "SEARCH_PLACEHOLDER": "Search and select inboxes to add",
+ "SEARCH_PLACEHOLDER": "搜尋並選擇要新增的收件匣",
"ADD_BUTTON": "新增"
},
- "EMPTY_STATE": "No inboxes added to this policy, add an inbox to get started",
+ "EMPTY_STATE": "此政策尚未加入任何收件匣,請新增收件匣以開始使用",
"API": {
- "SUCCESS_MESSAGE": "Inbox successfully added to policy",
- "ERROR_MESSAGE": "Failed to add inbox to policy"
+ "SUCCESS_MESSAGE": "收件匣已成功加入政策",
+ "ERROR_MESSAGE": "將收件匣加入政策失敗"
}
}
},
"DELETE_POLICY": {
- "SUCCESS_MESSAGE": "Assignment policy deleted successfully",
- "ERROR_MESSAGE": "Failed to delete assignment policy"
+ "SUCCESS_MESSAGE": "指派政策已成功刪除",
+ "ERROR_MESSAGE": "刪除指派政策失敗"
}
},
"AGENT_CAPACITY_POLICY": {
"INDEX": {
"HEADER": {
- "TITLE": "Agent capacity",
- "CREATE_POLICY": "New policy"
+ "TITLE": "客服容量",
+ "CREATE_POLICY": "新增政策"
},
"CARD": {
- "POPOVER": "Added agents",
+ "POPOVER": "已加入的客服人員",
"EDIT": "編輯"
},
- "NO_RECORDS_FOUND": "No agent capacity policies found"
+ "NO_RECORDS_FOUND": "找不到客服容量政策"
},
"CREATE": {
"HEADER": {
- "TITLE": "Create agent capacity policy"
+ "TITLE": "建立客服容量政策"
},
- "CREATE_BUTTON": "Create policy",
+ "CREATE_BUTTON": "建立政策",
"API": {
- "SUCCESS_MESSAGE": "Agent capacity policy created successfully",
- "ERROR_MESSAGE": "Failed to create agent capacity policy"
+ "SUCCESS_MESSAGE": "客服容量政策已成功建立",
+ "ERROR_MESSAGE": "建立客服容量政策失敗"
}
},
"EDIT": {
"HEADER": {
- "TITLE": "Edit agent capacity policy"
+ "TITLE": "編輯客服容量政策"
},
- "EDIT_BUTTON": "Update policy",
+ "EDIT_BUTTON": "更新政策",
"CONFIRM_ADD_AGENT_DIALOG": {
- "TITLE": "Add agent",
- "DESCRIPTION": "{agentName} is already linked to another policy. Are you sure you want to link it to this policy? It will be unlinked from the other policy.",
- "CONFIRM_BUTTON_LABEL": "Continue",
+ "TITLE": "新增客服人員",
+ "DESCRIPTION": "{agentName} 已連結至其他政策。確定要將其連結至此政策嗎?它將從另一個政策中解除連結。",
+ "CONFIRM_BUTTON_LABEL": "繼續",
"CANCEL_BUTTON_LABEL": "取消"
},
"API": {
- "SUCCESS_MESSAGE": "Agent capacity policy updated successfully",
- "ERROR_MESSAGE": "Failed to update agent capacity policy"
+ "SUCCESS_MESSAGE": "客服容量政策已成功更新",
+ "ERROR_MESSAGE": "更新客服容量政策失敗"
},
"AGENT_API": {
"ADD": {
- "SUCCESS_MESSAGE": "Agent added to policy successfully",
- "ERROR_MESSAGE": "Failed to add agent to policy"
+ "SUCCESS_MESSAGE": "客服人員已成功加入政策",
+ "ERROR_MESSAGE": "將客服人員加入政策失敗"
},
"REMOVE": {
- "SUCCESS_MESSAGE": "Agent removed from policy successfully",
- "ERROR_MESSAGE": "Failed to remove agent from policy"
+ "SUCCESS_MESSAGE": "客服人員已成功從政策中移除",
+ "ERROR_MESSAGE": "將客服人員從政策中移除失敗"
}
},
"INBOX_LIMIT_API": {
"ADD": {
- "SUCCESS_MESSAGE": "Inbox limit added successfully",
- "ERROR_MESSAGE": "Failed to add inbox limit"
+ "SUCCESS_MESSAGE": "收件匣限制已成功新增",
+ "ERROR_MESSAGE": "新增收件匣限制失敗"
},
"UPDATE": {
- "SUCCESS_MESSAGE": "Inbox limit updated successfully",
- "ERROR_MESSAGE": "Failed to update inbox limit"
+ "SUCCESS_MESSAGE": "收件匣限制已成功更新",
+ "ERROR_MESSAGE": "更新收件匣限制失敗"
},
"DELETE": {
- "SUCCESS_MESSAGE": "Inbox limit deleted successfully",
- "ERROR_MESSAGE": "Failed to delete inbox limit"
+ "SUCCESS_MESSAGE": "收件匣限制已成功刪除",
+ "ERROR_MESSAGE": "刪除收件匣限制失敗"
}
}
},
"FORM": {
"NAME": {
- "LABEL": "Policy name:",
- "PLACEHOLDER": "Enter policy name"
+ "LABEL": "政策名稱:",
+ "PLACEHOLDER": "輸入政策名稱"
},
"DESCRIPTION": {
- "LABEL": "描述資訊:",
- "PLACEHOLDER": "Enter description"
+ "LABEL": "描述:",
+ "PLACEHOLDER": "輸入描述"
},
"INBOX_CAPACITY_LIMIT": {
- "LABEL": "Inbox capacity limits",
- "ADD_BUTTON": "Add inbox",
+ "LABEL": "收件匣容量限制",
+ "ADD_BUTTON": "新增收件匣",
"FIELD": {
- "SELECT_INBOX": "Select inbox",
- "MAX_CONVERSATIONS": "Max conversations",
- "SET_LIMIT": "Set limit"
+ "SELECT_INBOX": "選擇收件匣",
+ "MAX_CONVERSATIONS": "最大對話數",
+ "SET_LIMIT": "設定限制"
},
- "EMPTY_STATE": "No inbox limit set"
+ "EMPTY_STATE": "尚未設定收件匣限制"
},
"EXCLUSION_RULES": {
- "LABEL": "Exclusion rules",
- "DESCRIPTION": "Conversations that satisfy the following conditions would not count towards agent capacity",
+ "LABEL": "排除規則",
+ "DESCRIPTION": "符合以下條件的對話將不計入客服容量",
"TAGS": {
- "LABEL": "Exclude conversations tagged with specific labels",
- "ADD_TAG": "add tag",
+ "LABEL": "排除標記了特定標籤的對話",
+ "ADD_TAG": "新增標籤",
"DROPDOWN": {
- "SEARCH_PLACEHOLDER": "Search and select tags to add"
+ "SEARCH_PLACEHOLDER": "搜尋並選擇要新增的標籤"
},
- "EMPTY_STATE": "No tags added to this policy."
+ "EMPTY_STATE": "此政策尚未新增任何標籤。"
},
"DURATION": {
- "LABEL": "Exclude conversations older than a specified duration",
- "PLACEHOLDER": "Set time"
+ "LABEL": "排除超過指定時間的對話",
+ "PLACEHOLDER": "設定時間"
}
},
"USERS": {
- "LABEL": "Assigned agents",
- "DESCRIPTION": "Add agents for which this policy will be applicable.",
- "ADD_BUTTON": "Add agent",
+ "LABEL": "已指派的客服人員",
+ "DESCRIPTION": "新增適用此政策的客服人員。",
+ "ADD_BUTTON": "新增客服人員",
"DROPDOWN": {
- "SEARCH_PLACEHOLDER": "Search and select agents to add",
+ "SEARCH_PLACEHOLDER": "搜尋並選擇要新增的客服人員",
"ADD_BUTTON": "新增"
},
- "EMPTY_STATE": "No agents added",
+ "EMPTY_STATE": "尚未新增客服人員",
"API": {
- "SUCCESS_MESSAGE": "Agent successfully added to policy",
- "ERROR_MESSAGE": "Failed to add agent to policy"
+ "SUCCESS_MESSAGE": "客服人員已成功加入政策",
+ "ERROR_MESSAGE": "將客服人員加入政策失敗"
}
}
},
"DELETE_POLICY": {
- "SUCCESS_MESSAGE": "Agent capacity policy deleted successfully",
- "ERROR_MESSAGE": "Failed to delete agent capacity policy"
+ "SUCCESS_MESSAGE": "客服容量政策已成功刪除",
+ "ERROR_MESSAGE": "刪除客服容量政策失敗"
}
},
"DELETE_POLICY": {
- "TITLE": "Delete policy",
- "DESCRIPTION": "Are you sure you want to delete this policy? This action cannot be undone.",
+ "TITLE": "刪除政策",
+ "DESCRIPTION": "確定要刪除此政策嗎?此操作無法復原。",
"CONFIRM_BUTTON_LABEL": "刪除",
"CANCEL_BUTTON_LABEL": "取消"
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/signup.json b/app/javascript/dashboard/i18n/locale/zh_TW/signup.json
index 67087743f..c43c72849 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/signup.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/signup.json
@@ -1,50 +1,50 @@
{
"REGISTER": {
- "TRY_WOOT": "Create an account",
- "GET_STARTED": "Get started with Chatwoot",
+ "TRY_WOOT": "建立帳號",
+ "GET_STARTED": "開始使用 Chatwoot",
"TITLE": "註冊",
- "TESTIMONIAL_HEADER": "All it takes is one step to move forward",
- "TESTIMONIAL_CONTENT": "You're one step away from engaging your customers, retaining them and finding new ones.",
- "TERMS_ACCEPT": "By creating an account, you agree to our T & C and Privacy policy ",
+ "TESTIMONIAL_HEADER": "只需一步即可向前邁進",
+ "TESTIMONIAL_CONTENT": "您只差一步就能與客戶互動、留住他們並發掘新客戶。",
+ "TERMS_ACCEPT": "建立帳號即表示您同意我們的服務條款 和隱私政策 ",
"OAUTH": {
- "GOOGLE_SIGNUP": "Sign up with Google"
+ "GOOGLE_SIGNUP": "使用 Google 註冊"
},
"COMPANY_NAME": {
- "LABEL": "Company name",
- "PLACEHOLDER": "Enter your company name. E.g., Wayne Enterprises",
- "ERROR": "Company name is too short."
+ "LABEL": "公司名稱",
+ "PLACEHOLDER": "輸入您的公司名稱,例如:Wayne Enterprises",
+ "ERROR": "公司名稱過短。"
},
"FULL_NAME": {
"LABEL": "姓名",
- "PLACEHOLDER": "Enter your full name. E.g., Bruce Wayne",
- "ERROR": "姓名太短了."
+ "PLACEHOLDER": "輸入您的姓名,例如:Bruce Wayne",
+ "ERROR": "姓名過短。"
},
"EMAIL": {
"LABEL": "工作電子郵件",
- "PLACEHOLDER": "Enter your work email address. E.g., bruce{'@'}wayne{'.'}enterprises",
- "ERROR": "Please enter a valid work email address."
+ "PLACEHOLDER": "輸入您的工作電子郵件,例如:bruce{'@'}wayne{'.'}enterprises",
+ "ERROR": "請輸入有效的工作電子郵件地址。"
},
"PASSWORD": {
"LABEL": "密碼",
"PLACEHOLDER": "密碼",
- "ERROR": "密碼太短了.",
- "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character.",
- "REQUIREMENTS_LENGTH": "At least 6 characters long",
- "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
- "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
- "REQUIREMENTS_NUMBER": "At least one number",
- "REQUIREMENTS_SPECIAL": "At least one special character"
+ "ERROR": "密碼過短。",
+ "IS_INVALID_PASSWORD": "密碼應包含至少 1 個大寫字母、1 個小寫字母、1 個數字和 1 個特殊字元。",
+ "REQUIREMENTS_LENGTH": "至少 6 個字元",
+ "REQUIREMENTS_UPPERCASE": "至少一個大寫字母",
+ "REQUIREMENTS_LOWERCASE": "至少一個小寫字母",
+ "REQUIREMENTS_NUMBER": "至少一個數字",
+ "REQUIREMENTS_SPECIAL": "至少一個特殊字元"
},
"CONFIRM_PASSWORD": {
- "LABEL": "Confirm password",
- "PLACEHOLDER": "Confirm password",
- "ERROR": "密碼不匹配."
+ "LABEL": "確認密碼",
+ "PLACEHOLDER": "確認密碼",
+ "ERROR": "密碼不一致。"
},
"API": {
- "SUCCESS_MESSAGE": "Registration Successful",
- "ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
+ "SUCCESS_MESSAGE": "註冊成功",
+ "ERROR_MESSAGE": "無法連接伺服器,請再試一次。"
},
- "SUBMIT": "Create account",
+ "SUBMIT": "建立帳號",
"HAVE_AN_ACCOUNT": "已經有帳號了嗎?"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/sla.json b/app/javascript/dashboard/i18n/locale/zh_TW/sla.json
index f4dc28a54..debdf44ca 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/sla.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/sla.json
@@ -1,46 +1,46 @@
{
"SLA": {
- "HEADER": "Service Level Agreements",
- "ADD_ACTION": "Add SLA",
- "ADD_ACTION_LONG": "Create a new SLA Policy",
- "DESCRIPTION": "Service Level Agreements (SLAs) are contracts that define clear expectations between your team and customers. They establish standards for response and resolution times, creating a framework for accountability and ensures a consistent, high-quality experience.",
- "LEARN_MORE": "Learn more about SLA",
- "COUNT": "{n} SLA | {n} SLAs",
- "LOADING": "Fetching SLAs",
- "SEARCH_PLACEHOLDER": "Search SLA...",
+ "HEADER": "服務等級協議",
+ "ADD_ACTION": "新增 SLA",
+ "ADD_ACTION_LONG": "建立新的 SLA 政策",
+ "DESCRIPTION": "服務等級協議(SLA)是定義您的團隊與客戶之間明確期望的合約。它建立了回應與解決時間的標準,形成一個責任歸屬的框架,確保提供一致且高品質的服務體驗。",
+ "LEARN_MORE": "進一步瞭解 SLA",
+ "COUNT": "{n} 個 SLA | {n} 個 SLA",
+ "LOADING": "正在載入 SLA",
+ "SEARCH_PLACEHOLDER": "搜尋 SLA...",
"SEARCH": {
- "NO_RESULTS": "No SLA found matching your search"
+ "NO_RESULTS": "找不到符合搜尋條件的 SLA"
},
"PAYWALL": {
- "TITLE": "Upgrade to create SLAs",
- "AVAILABLE_ON": "The SLA feature is only available in the Business and Enterprise plans.",
- "UPGRADE_PROMPT": "Upgrade your plan to get access to advanced features like team management, automations, custom attributes, and more.",
- "UPGRADE_NOW": "Upgrade now",
- "CANCEL_ANYTIME": "You can change or cancel your plan anytime"
+ "TITLE": "升級以建立 SLA",
+ "AVAILABLE_ON": "SLA 功能僅在 Business 和 Enterprise 方案中提供。",
+ "UPGRADE_PROMPT": "升級您的方案以使用進階功能,如團隊管理、自動化、自訂屬性等。",
+ "UPGRADE_NOW": "立即升級",
+ "CANCEL_ANYTIME": "您可以隨時變更或取消方案"
},
"ENTERPRISE_PAYWALL": {
- "AVAILABLE_ON": "The SLA feature is only available in the paid plans.",
- "UPGRADE_PROMPT": "Upgrade to a paid plan to access advanced features like audit logs, agent capacity, and more.",
- "ASK_ADMIN": "Please reach out to your administrator for the upgrade."
+ "AVAILABLE_ON": "SLA 功能僅在付費方案中提供。",
+ "UPGRADE_PROMPT": "升級至付費方案以使用進階功能,如稽核紀錄、客服人員容量等。",
+ "ASK_ADMIN": "請聯繫您的管理員進行升級。"
},
"LIST": {
- "404": "There are no SLAs available in this account.",
+ "404": "此帳戶中沒有可用的 SLA。",
"TABLE_HEADER": {
- "SLA": "服務水準協議(SLA)",
- "BUSINESS_HOURS": "Business hours"
+ "SLA": "SLA",
+ "BUSINESS_HOURS": "服務時間"
},
"EMPTY": {
"TITLE_1": "Enterprise P0",
- "DESC_1": "Issues raised by enterprise customers, that require immediate attention.",
+ "DESC_1": "企業客戶提出的問題,需要立即處理。",
"TITLE_2": "Enterprise P1",
- "DESC_2": "Issues raised by enterprise customers, that needs to be acknowledged quickly."
+ "DESC_2": "企業客戶提出的問題,需要盡快回覆確認。"
},
- "BUSINESS_HOURS_ON": "Turned on",
- "BUSINESS_HOURS_OFF": "Turned off",
+ "BUSINESS_HOURS_ON": "已開啟",
+ "BUSINESS_HOURS_OFF": "已關閉",
"RESPONSE_TYPES": {
- "FRT": "First response time threshold",
- "NRT": "Next response time threshold",
- "RT": "Resolution time threshold",
+ "FRT": "首次回應時間門檻",
+ "NRT": "後續回應時間門檻",
+ "RT": "解決時間門檻",
"SHORT_HAND": {
"FRT": "FRT",
"NRT": "NRT",
@@ -50,22 +50,22 @@
},
"FORM": {
"NAME": {
- "LABEL": "SLA Name",
- "PLACEHOLDER": "SLA Name",
- "REQUIRED_ERROR": "SLA name is required",
- "MINIMUM_LENGTH_ERROR": "Minimum length 2 is required",
- "VALID_ERROR": "Only Alphabets, Numbers, Hyphen and Underscore are allowed"
+ "LABEL": "SLA 名稱",
+ "PLACEHOLDER": "SLA 名稱",
+ "REQUIRED_ERROR": "SLA 名稱為必填",
+ "MINIMUM_LENGTH_ERROR": "最少需要 2 個字元",
+ "VALID_ERROR": "僅允許使用英文字母、數字、連字號和底線"
},
"DESCRIPTION": {
- "LABEL": "描述資訊",
- "PLACEHOLDER": "SLA for premium customers"
+ "LABEL": "描述",
+ "PLACEHOLDER": "適用於進階客戶的 SLA"
},
"FIRST_RESPONSE_TIME": {
- "LABEL": "First Response Time",
+ "LABEL": "首次回應時間",
"PLACEHOLDER": "5"
},
"NEXT_RESPONSE_TIME": {
- "LABEL": "Next Response Time",
+ "LABEL": "後續回應時間",
"PLACEHOLDER": "5"
},
"RESOLUTION_TIME": {
@@ -74,10 +74,10 @@
},
"BUSINESS_HOURS": {
"LABEL": "服務時間",
- "PLACEHOLDER": "Only during business hours"
+ "PLACEHOLDER": "僅在服務時間內"
},
"THRESHOLD_TIME": {
- "INVALID_FORMAT_ERROR": "Threshold should be a number and greater than zero"
+ "INVALID_FORMAT_ERROR": "門檻值必須為大於零的數字"
},
"EDIT": "編輯",
"CREATE": "建立",
@@ -85,33 +85,33 @@
"CANCEL": "取消"
},
"ADD": {
- "TITLE": "Add SLA",
- "DESC": "Friendly promises for great service!",
+ "TITLE": "新增 SLA",
+ "DESC": "為優質服務訂下承諾!",
"API": {
- "SUCCESS_MESSAGE": "SLA added successfully",
- "ERROR_MESSAGE": "出現錯誤,請重試"
+ "SUCCESS_MESSAGE": "SLA 新增成功",
+ "ERROR_MESSAGE": "發生錯誤,請重試"
}
},
"DELETE": {
- "TITLE": "Delete SLA",
+ "TITLE": "刪除 SLA",
"API": {
- "SUCCESS_MESSAGE": "SLA deleted successfully",
- "ERROR_MESSAGE": "出現錯誤,請重試"
+ "SUCCESS_MESSAGE": "SLA 刪除成功",
+ "ERROR_MESSAGE": "發生錯誤,請重試"
},
"CONFIRM": {
"TITLE": "確認刪除",
- "MESSAGE": "Are you sure you want to delete ",
+ "MESSAGE": "您確定要刪除 ",
"YES": "是,刪除 ",
- "NO": "不,保留 "
+ "NO": "否,保留 "
}
},
"EVENTS": {
- "TITLE": "SLA Misses",
- "FRT": "首次回覆時間",
- "NRT": "Next response time",
- "RT": "Resolution time",
- "SHOW_MORE": "{count} more",
- "HIDE": "Hide {count} rows"
+ "TITLE": "SLA 未達標",
+ "FRT": "首次回應時間",
+ "NRT": "後續回應時間",
+ "RT": "解決時間",
+ "SHOW_MORE": "還有 {count} 筆",
+ "HIDE": "隱藏 {count} 列"
}
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/snooze.json b/app/javascript/dashboard/i18n/locale/zh_TW/snooze.json
index 8c631716a..c2455ef72 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/snooze.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/snooze.json
@@ -36,8 +36,8 @@
"TIME_OF_DAY": {
"MORNING": "早上",
"AFTERNOON": "下午",
- "EVENING": "晚上",
- "NIGHT": "夜晚",
+ "EVENING": "傍晚",
+ "NIGHT": "晚上",
"NOON": "中午",
"MIDNIGHT": "午夜"
},
@@ -65,7 +65,7 @@
"FIFTH": "第五"
},
"OF": "的",
- "AFTER": "後",
+ "AFTER": "之後",
"WEEK": "週",
"DAY": "天"
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/teamsSettings.json b/app/javascript/dashboard/i18n/locale/zh_TW/teamsSettings.json
index 637ec5a57..350ceff8b 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/teamsSettings.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/teamsSettings.json
@@ -2,50 +2,50 @@
"TEAMS_SETTINGS": {
"NEW_TEAM": "建立新團隊",
"HEADER": "團隊",
- "LOADING": "Fetching teams",
- "DESCRIPTION": "Teams allow you to organize agents into groups based on their responsibilities. An agent can belong to multiple teams. When working collaboratively, you can assign conversations to specific teams.",
- "LEARN_MORE": "Learn more about teams",
- "COUNT": "{n} team | {n} teams",
+ "LOADING": "正在取得團隊",
+ "DESCRIPTION": "團隊可讓您根據職責將客服分組。一位客服可以屬於多個團隊。協作時,您可以將對話指派給特定團隊。",
+ "LEARN_MORE": "瞭解更多關於團隊",
+ "COUNT": "{n} 個團隊 | {n} 個團隊",
"SEARCH_PLACEHOLDER": "搜尋團隊...",
- "NO_RESULTS": "No teams found matching your search",
+ "NO_RESULTS": "找不到符合搜尋條件的團隊",
"LIST": {
- "404": "There are no teams created on this account.",
+ "404": "此帳戶中尚未建立任何團隊。",
"EDIT_TEAM": "編輯團隊",
"NONE": "無"
},
"CREATE_FLOW": {
"CREATE": {
- "TITLE": "建立一個新團隊",
- "DESC": "為你的新團隊新增一個標題跟描述"
+ "TITLE": "建立新團隊",
+ "DESC": "為您的新團隊新增標題和描述。"
},
"AGENTS": {
"BUTTON_TEXT": "將客服加入團隊",
"TITLE": "將客服加入團隊 - {teamName}",
- "DESC": "將客服新增到新建立的團隊。這會讓你可以用團隊的形式處理對話,也可以取得同一個對話的新事件通知。"
+ "DESC": "將客服新增到新建立的團隊。這會讓您可以用團隊的形式處理對話,也可以取得同一個對話的新事件通知。"
},
"WIZARD_CREATE": {
"TITLE": "建立",
- "BODY": "為客服建立一個新團隊"
+ "BODY": "為客服建立新團隊。"
},
"WIZARD_ADD_AGENTS": {
"TITLE": "新增客服",
- "BODY": "將客服加入團隊"
+ "BODY": "將客服加入團隊。"
},
"WIZARD_FINISH": {
"TITLE": "完成",
- "BODY": "您已設定狀態為離開"
+ "BODY": "一切準備就緒!"
}
},
"EDIT_FLOW": {
"CREATE": {
"TITLE": "編輯團隊詳細資訊",
- "DESC": "編輯團隊標題及描述",
+ "DESC": "編輯團隊的標題和描述。",
"BUTTON_TEXT": "更新團隊"
},
"AGENTS": {
"BUTTON_TEXT": "更新團隊客服",
"TITLE": "將客服加入團隊 - {teamName}",
- "DESC": "為新建立的團隊新增客服,當對話被指派至團隊時,所有加入的客服都會被通知。"
+ "DESC": "為新建立的團隊新增客服。當對話被指派至此團隊時,所有已新增的客服都會收到通知。"
},
"EDIT_WIZARD_DETAILS": {
"TITLE": "團隊詳細資訊",
@@ -55,12 +55,12 @@
"EDIT_WIZARD_AGENTS": {
"TITLE": "編輯客服",
"ROUTE": "settings_teams_edit_members",
- "BODY": "編輯團隊內的客服"
+ "BODY": "編輯團隊中的客服。"
},
"EDIT_WIZARD_FINISH": {
"TITLE": "完成",
"ROUTE": "settings_teams_edit_finish",
- "BODY": "您已設定狀態為離開"
+ "BODY": "一切準備就緒!"
}
},
"TEAM_FORM": {
@@ -68,38 +68,38 @@
},
"AGENTS": {
"AGENT": "客服",
- "EMAIL": "Email",
+ "EMAIL": "電子郵件",
"BUTTON_TEXT": "新增客服",
- "ADD_AGENTS": "正在將客服加入到你的團隊...",
+ "ADD_AGENTS": "正在將客服加入您的團隊...",
"SELECT": "選擇",
"SELECT_ALL": "選取所有客服",
- "SELECTED_COUNT": "{total} 中的 {selected} 個客服被選取"
+ "SELECTED_COUNT": "已選取 {total} 位客服中的 {selected} 位。"
},
"ADD": {
"TITLE": "將客服加入團隊 - {teamName}",
- "DESC": "將客服新增到新建立的團隊。這會讓你可以用團隊的形式處理對話,也可以取得同一個對話的新事件通知。",
+ "DESC": "將客服新增到新建立的團隊。這會讓您可以用團隊的形式處理對話,也可以取得同一個對話的新事件通知。",
"SELECT": "選擇",
- "SELECT_ALL": "選取所有克服",
- "SELECTED_COUNT": "{total} 中的 {selected} 個客服被選取",
+ "SELECT_ALL": "選取所有客服",
+ "SELECTED_COUNT": "已選取 {total} 位客服中的 {selected} 位。",
"BUTTON_TEXT": "新增客服",
- "AGENT_VALIDATION_ERROR": "Select at least one agent."
+ "AGENT_VALIDATION_ERROR": "請至少選擇一位客服。"
},
"FINISH": {
- "TITLE": "你的團隊已經準備好了",
- "MESSAGE": "You can now collaborate as a team on conversations. Happy supporting ",
+ "TITLE": "您的團隊已準備就緒!",
+ "MESSAGE": "您現在可以用團隊的形式協作處理對話。祝支援順利!",
"BUTTON_TEXT": "完成"
},
"DELETE": {
"BUTTON_TEXT": "刪除",
"API": {
- "SUCCESS_MESSAGE": "團隊刪除成功",
- "ERROR_MESSAGE": "無法刪除團隊,請再試一次"
+ "SUCCESS_MESSAGE": "團隊刪除成功。",
+ "ERROR_MESSAGE": "無法刪除團隊,請再試一次。"
},
"CONFIRM": {
- "TITLE": "Are you sure you want to delete the team?",
+ "TITLE": "確定要刪除此團隊嗎?",
"PLACE_HOLDER": "請輸入 {teamName} 以確認",
- "MESSAGE": "刪除此團隊將會移除已指派給此團隊的對話指派對象",
- "YES": "刪除 ",
+ "MESSAGE": "刪除團隊將移除已指派給此團隊的對話的團隊指派。",
+ "YES": "刪除",
"NO": "取消"
}
},
@@ -113,10 +113,10 @@
},
"DESCRIPTION": {
"LABEL": "團隊描述",
- "PLACEHOLDER": "對此團隊的簡短描述"
+ "PLACEHOLDER": "關於此團隊的簡短描述。"
},
"AUTO_ASSIGN": {
- "LABEL": "允許在團隊中自動指派"
+ "LABEL": "允許此團隊自動指派。"
},
"SUBMIT_CREATE": "建立團隊"
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/zh_TW/whatsappTemplates.json
index 293701544..28f67bd77 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/whatsappTemplates.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/whatsappTemplates.json
@@ -1,46 +1,46 @@
{
"WHATSAPP_TEMPLATES": {
"MODAL": {
- "TITLE": "Whatsapp 模板列表",
- "SUBTITLE": "請選擇想要傳送的 Whatsapp 訊息模板",
- "TEMPLATE_SELECTED_SUBTITLE": "配置範本:{templateName}"
+ "TITLE": "WhatsApp 範本",
+ "SUBTITLE": "請選擇要發送的 WhatsApp 範本",
+ "TEMPLATE_SELECTED_SUBTITLE": "設定範本:{templateName}"
},
"PICKER": {
- "SEARCH_PLACEHOLDER": "查詢模板",
- "NO_TEMPLATES_FOUND": "沒有找到對應的模版",
+ "SEARCH_PLACEHOLDER": "搜尋範本",
+ "NO_TEMPLATES_FOUND": "找不到相符的範本",
"HEADER": "標題",
- "BODY": "正文",
- "FOOTER": "頁腳",
+ "BODY": "內文",
+ "FOOTER": "頁尾",
"BUTTONS": "按鈕",
"CATEGORY": "類別",
"MEDIA_CONTENT": "媒體內容",
"MEDIA_CONTENT_FALLBACK": "媒體內容",
- "NO_TEMPLATES_AVAILABLE": "沒有可用的 WhatsApp 範本。點擊重新整理以從 WhatsApp 同步範本。",
- "REFRESH_BUTTON": "刷新模板",
- "REFRESH_SUCCESS": "已啟動模板刷新。更新可能需要幾分鐘的時間。 ",
- "REFRESH_ERROR": "刷新範本失敗。請重試。 ",
+ "NO_TEMPLATES_AVAILABLE": "沒有可用的 WhatsApp 範本。點選重新整理以從 WhatsApp 同步範本。",
+ "REFRESH_BUTTON": "重新整理範本",
+ "REFRESH_SUCCESS": "已開始重新整理範本,可能需要幾分鐘才能完成更新。",
+ "REFRESH_ERROR": "重新整理範本失敗,請重試。",
"LABELS": {
"LANGUAGE": "語言",
- "TEMPLATE_BODY": "模板內容",
+ "TEMPLATE_BODY": "範本內文",
"CATEGORY": "類別"
}
},
"PARSER": {
- "VARIABLES_LABEL": "引數",
+ "VARIABLES_LABEL": "變數",
"LANGUAGE": "語言",
"CATEGORY": "類別",
- "VARIABLE_PLACEHOLDER": "請填寫 {variable}",
+ "VARIABLE_PLACEHOLDER": "輸入 {variable} 的值",
"GO_BACK_LABEL": "返回",
"SEND_MESSAGE_LABEL": "傳送訊息",
- "FORM_ERROR_MESSAGE": "你必須填寫所有引數才能傳送",
+ "FORM_ERROR_MESSAGE": "傳送前請填寫所有變數",
"MEDIA_HEADER_LABEL": "{type} 標題",
- "OTP_CODE": "輸入 4 到 8 位數的一次性密碼",
- "EXPIRY_MINUTES": "輸入到期分鐘",
+ "OTP_CODE": "輸入 4 至 8 位數的一次性密碼",
+ "EXPIRY_MINUTES": "輸入到期分鐘數",
"BUTTON_PARAMETERS": "按鈕參數",
- "BUTTON_LABEL": "按鈕{index}",
- "COUPON_CODE": "輸入優惠券代碼(最多 15 個字元)",
+ "BUTTON_LABEL": "按鈕 {index}",
+ "COUPON_CODE": "輸入優惠碼(最多 15 個字元)",
"MEDIA_URL_LABEL": "輸入 {type} URL",
- "DOCUMENT_NAME_PLACEHOLDER": "輸入文件檔案名稱(例如 Invoice_2025.pdf)",
+ "DOCUMENT_NAME_PLACEHOLDER": "輸入文件檔名(例如 Invoice_2025.pdf)",
"BUTTON_PARAMETER": "輸入按鈕參數"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/yearInReview.json b/app/javascript/dashboard/i18n/locale/zh_TW/yearInReview.json
index f75991ddd..871da974c 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/yearInReview.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/yearInReview.json
@@ -31,7 +31,7 @@
}
},
"PERSONALITY": {
- "TITLE": "您的客服人格是",
+ "TITLE": "您的客服風格是",
"MESSAGES": {
"SWIFT_HELPER": "您的平均回覆時間為 {time}。比大多數通知還快。",
"QUICK_RESPONDER": "您的平均回覆時間為 {time}。收件匣幾乎不用等待。",
@@ -53,7 +53,7 @@
},
"BANNER": {
"TITLE": "您的 {year} 年度回顧來了",
- "BUTTON": "看看您的影響力"
+ "BUTTON": "查看您的影響力"
},
"NAVIGATION": {
"PREVIOUS": "上一頁",
diff --git a/config/locales/zh_TW.yml b/config/locales/zh_TW.yml
index 5d06650e8..8f5f069ae 100644
--- a/config/locales/zh_TW.yml
+++ b/config/locales/zh_TW.yml
@@ -20,409 +20,409 @@ zh_TW:
hello: '你好。'
inbox:
reauthorization:
- success: 'Channel reauthorized successfully'
- not_required: 'Reauthorization is not required for this inbox'
- invalid_channel: 'Invalid channel type for reauthorization'
+ success: '頻道重新授權成功'
+ not_required: '此收件匣不需要重新授權'
+ invalid_channel: '無效的頻道類型,無法進行重新授權'
auth:
saml:
invalid_email: '請輸入一個有效的電子信箱'
- authentication_failed: 'Authentication failed. Please check your credentials and try again.'
+ authentication_failed: '驗證失敗,請檢查您的憑證後再試一次。'
messages:
- reset_password: Request for password reset is successful. A email with instructions will be sent to your email if it exists.
- reset_password_saml_user: This account uses SAML authentication. Password reset is not available. Please contact your administrator.
- login_saml_user: This account uses SAML authentication. Please sign in through your organization's SAML provider.
- saml_not_available: SAML authentication is not available in this installation.
- inbox_deletetion_response: 您的收件匣刪除請求將在一段時間後處理。
+ reset_password: '密碼重設請求已成功,若該電子郵件存在,將會收到一封包含操作說明的信件。'
+ reset_password_saml_user: '此帳號使用 SAML 驗證,無法重設密碼。請聯繫您的管理員。'
+ login_saml_user: '此帳號使用 SAML 驗證,請透過您組織的 SAML 提供者登入。'
+ saml_not_available: '此安裝尚未啟用 SAML 驗證。'
+ inbox_deletetion_response: '您的收件匣刪除請求將在一段時間後處理。'
errors:
account:
reporting_timezone:
- invalid: is not a valid timezone
+ invalid: '不是有效的時區'
validations:
- presence: must not be blank
+ presence: '不能為空白'
webhook:
- invalid: Invalid events
+ invalid: '無效的事件'
signup:
- disposable_email: 我們不允許一次性電子郵件。
- blocked_domain: This domain is not allowed. If you believe this is a mistake, please contact support.
- invalid_email: 您輸入的電子郵件無效。
- email_already_exists: '您已經註冊了一個帳號%{email}'
- invalid_params: 'Invalid, please check the signup paramters and try again'
- failed: 註冊失敗。
+ disposable_email: '我們不允許一次性電子郵件。'
+ blocked_domain: '此網域不被允許。如果您認為這是一個錯誤,請聯繫客服。'
+ invalid_email: '您輸入的電子郵件無效。'
+ email_already_exists: '您已經使用 %{email} 註冊過帳號'
+ invalid_params: '參數無效,請檢查註冊資料後再試一次'
+ failed: '註冊失敗。'
assignment_policy:
- not_found: Assignment policy not found
+ not_found: '找不到分配策略'
attachments:
- invalid: Invalid attachment
+ invalid: '無效的附件'
saml:
- feature_not_enabled: SAML feature not enabled for this account
- sso_not_enabled: SAML SSO is not enabled for this installation
+ feature_not_enabled: '此帳號尚未啟用 SAML 功能'
+ sso_not_enabled: '此安裝尚未啟用 SAML SSO'
data_import:
data_type:
- invalid: Invalid data type
+ invalid: '無效的資料類型'
contacts:
import:
- failed: File is blank
+ failed: '檔案為空白'
export:
- success: We will notify you once contacts export file is ready to view.
+ success: '聯絡人匯出檔案準備好後,我們會通知您。'
email:
- invalid: 無效的email
+ invalid: '無效的電子郵件'
phone_number:
- invalid: should be in e164 format
+ invalid: '應為 E.164 格式'
companies:
domain:
- invalid: must be a valid domain name
+ invalid: '必須是有效的網域名稱'
search:
- query_missing: Specify search string with parameter q
+ query_missing: '請使用參數 q 指定搜尋字串'
messages:
search:
- time_range_limit_exceeded: 'Search is limited to the last %{days} days'
+ time_range_limit_exceeded: '搜尋範圍限制為最近 %{days} 天'
categories:
locale:
- unique: should be unique in the category and portal
+ unique: '在該分類與入口網站中應為唯一'
dyte:
- invalid_message_type: 'Invalid message type. Action not permitted'
+ invalid_message_type: '無效的訊息類型,不允許此操作'
slack:
- invalid_channel_id: 'Invalid slack channel. Please try again'
+ invalid_channel_id: '無效的 Slack 頻道,請再試一次'
whatsapp:
- token_exchange_failed: 'Failed to exchange code for access token. Please try again.'
- invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.'
- phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.'
- phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists'
+ token_exchange_failed: '無法將代碼交換為存取權杖,請再試一次。'
+ invalid_token_permissions: '存取權杖不具備 WhatsApp 所需的權限。'
+ phone_info_fetch_failed: '無法取得電話號碼資訊,請再試一次。'
+ phone_number_already_exists: '此電話號碼 %{phone_number} 的頻道已存在,若問題持續請聯繫客服'
reauthorization:
- generic: 'Failed to reauthorize WhatsApp. Please try again.'
- not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.'
+ generic: '無法重新授權 WhatsApp,請再試一次。'
+ not_supported: '此類型的 WhatsApp 頻道不支援重新授權。'
inboxes:
imap:
- socket_error: Please check the network connection, IMAP address and try again.
- no_response_error: Please check the IMAP credentials and try again.
- host_unreachable_error: Host unreachable, Please check the IMAP address, IMAP port and try again.
- connection_timed_out_error: Connection timed out for %{address}:%{port}
- connection_closed_error: Connection closed.
+ socket_error: '請檢查網路連線與 IMAP 位址後再試一次。'
+ no_response_error: '請檢查 IMAP 憑證後再試一次。'
+ host_unreachable_error: '無法連線到主機,請檢查 IMAP 位址、IMAP 連接埠後再試一次。'
+ connection_timed_out_error: '%{address}:%{port} 連線逾時'
+ connection_closed_error: '連線已關閉。'
smtp:
- authentication_error: SMTP authentication failed. Please verify your login credentials.
- connection_error: Could not connect to SMTP server. Please check the server address and port.
- ssl_error: SSL/TLS error. Please verify your encryption settings.
- smtp_error: SMTP server error. Please check your configuration and try again.
+ authentication_error: 'SMTP 驗證失敗,請確認您的登入憑證。'
+ connection_error: '無法連線到 SMTP 伺服器,請檢查伺服器位址與連接埠。'
+ ssl_error: 'SSL/TLS 錯誤,請確認您的加密設定。'
+ smtp_error: 'SMTP 伺服器錯誤,請檢查您的設定後再試一次。'
validations:
- name: should not start or end with symbols, and it should not have < > / \ @ characters.
+ name: '不能以符號開頭或結尾,且不能包含 < > / \ @ 字元。'
custom_filters:
- number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 1000.
- invalid_attribute: Invalid attribute key - [%{key}]. The key should be one of [%{allowed_keys}] or a custom attribute defined in the account.
- invalid_operator: Invalid operator. The allowed operators for %{attribute_name} are [%{allowed_keys}].
- invalid_query_operator: Query operator must be either "AND" or "OR".
- invalid_value: Invalid value. The values provided for %{attribute_name} are invalid
+ number_of_records: '已達上限。每位使用者在每個帳號中最多可建立 1000 個自訂篩選器。'
+ invalid_attribute: '無效的屬性鍵 - [%{key}]。鍵應為 [%{allowed_keys}] 之一,或帳號中定義的自訂屬性。'
+ invalid_operator: '無效的運算子。%{attribute_name} 允許的運算子為 [%{allowed_keys}]。'
+ invalid_query_operator: '查詢運算子必須為「AND」或「OR」。'
+ invalid_value: '無效的值。為 %{attribute_name} 提供的值無效'
custom_attribute_definition:
- attribute_key_format: must only contain letters, numbers, underscores, hyphens, and dots
- key_conflict: The provided key is not allowed as it might conflict with default attributes.
+ attribute_key_format: '只能包含字母、數字、底線、連字號和點'
+ key_conflict: '提供的鍵不被允許,因為可能與預設屬性衝突。'
mfa:
- already_enabled: MFA is already enabled
- not_enabled: MFA is not enabled
- invalid_code: Invalid verification code
- invalid_backup_code: Invalid backup code
- invalid_token: Invalid or expired MFA token
- invalid_credentials: Invalid credentials or verification code
- feature_unavailable: MFA feature is not available. Please configure encryption keys.
+ already_enabled: 'MFA 已啟用'
+ not_enabled: 'MFA 未啟用'
+ invalid_code: '無效的驗證碼'
+ invalid_backup_code: '無效的備用碼'
+ invalid_token: '無效或已過期的 MFA 權杖'
+ invalid_credentials: '無效的憑證或驗證碼'
+ feature_unavailable: 'MFA 功能無法使用,請設定加密金鑰。'
topup:
- credits_required: Credits amount is required
- invalid_credits: Invalid credits amount
- invalid_option: Invalid topup option
- plan_not_eligible: Top-ups are only available for paid plans. Please upgrade your plan first.
- stripe_customer_not_configured: Stripe customer not configured
- no_payment_method: No payment methods found. Please add a payment method before making a purchase.
+ credits_required: '需填入儲值點數金額'
+ invalid_credits: '無效的儲值點數金額'
+ invalid_option: '無效的儲值選項'
+ plan_not_eligible: '儲值僅適用於付費方案,請先升級您的方案。'
+ stripe_customer_not_configured: 'Stripe 客戶尚未設定'
+ no_payment_method: '找不到付款方式,請先新增付款方式再進行購買。'
reports:
- date_range_too_long: Date range cannot exceed 6 months
+ date_range_too_long: '日期範圍不能超過 6 個月'
profile:
mfa:
- enabled: MFA enabled successfully
- disabled: MFA disabled successfully
+ enabled: 'MFA 啟用成功'
+ disabled: 'MFA 停用成功'
account_saml_settings:
- invalid_certificate: must be a valid X.509 certificate in PEM format
+ invalid_certificate: '必須是 PEM 格式的有效 X.509 憑證'
reports:
- period: Reporting period %{since} to %{until}
- utc_warning: The report generated is in UTC timezone
+ period: '報告期間 %{since} 至 %{until}'
+ utc_warning: '此報告以 UTC 時區產生'
agent_csv:
- agent_name: 客服名稱
- conversations_count: Assigned conversations
- avg_first_response_time: Avg first response time
- avg_resolution_time: Avg resolution time
- resolution_count: 已解決的數量
- avg_customer_waiting_time: Avg customer waiting time
+ agent_name: '客服名稱'
+ conversations_count: '已分配的對話數'
+ avg_first_response_time: '平均首次回應時間'
+ avg_resolution_time: '平均解決時間'
+ resolution_count: '已解決的數量'
+ avg_customer_waiting_time: '平均客戶等待時間'
inbox_csv:
- inbox_name: 收件匣名稱
- inbox_type: 收件匣類型
- conversations_count: No. of conversations
- avg_first_response_time: Avg first response time
- avg_resolution_time: Avg resolution time
+ inbox_name: '收件匣名稱'
+ inbox_type: '收件匣類型'
+ conversations_count: '對話數量'
+ avg_first_response_time: '平均首次回應時間'
+ avg_resolution_time: '平均解決時間'
label_csv:
- label_title: Label
- conversations_count: No. of conversations
- avg_first_response_time: Avg first response time
- avg_resolution_time: Avg resolution time
- avg_reply_time: Avg reply time
- resolution_count: 已解決的數量
+ label_title: '標籤'
+ conversations_count: '對話數量'
+ avg_first_response_time: '平均首次回應時間'
+ avg_resolution_time: '平均解決時間'
+ avg_reply_time: '平均回覆時間'
+ resolution_count: '已解決的數量'
team_csv:
- team_name: 團隊名稱
- conversations_count: 對話數量
- avg_first_response_time: Avg first response time
- avg_resolution_time: Avg resolution time
- resolution_count: 已解決的數量
- avg_customer_waiting_time: Avg customer waiting time
+ team_name: '團隊名稱'
+ conversations_count: '對話數量'
+ avg_first_response_time: '平均首次回應時間'
+ avg_resolution_time: '平均解決時間'
+ resolution_count: '已解決的數量'
+ avg_customer_waiting_time: '平均客戶等待時間'
conversation_csv:
- conversations_count: 對話
- incoming_messages_count: 收到的消息
- outgoing_messages_count: 發送的消息
- avg_first_response_time: Avg first response time
- avg_resolution_time: Avg resolution time
- resolution_count: Resolution count
- avg_customer_waiting_time: Avg customer waiting time
+ conversations_count: '對話'
+ incoming_messages_count: '收到的訊息'
+ outgoing_messages_count: '發送的訊息'
+ avg_first_response_time: '平均首次回應時間'
+ avg_resolution_time: '平均解決時間'
+ resolution_count: '已解決的數量'
+ avg_customer_waiting_time: '平均客戶等待時間'
conversation_traffic_csv:
- timezone: Timezone
+ timezone: '時區'
sla_csv:
- conversation_id: Conversation ID
- sla_policy_breached: SLA Policy
- assignee: Assignee
- team: Team
- inbox: 收件匣
- labels: 標籤
- conversation_link: Link to the Conversation
- breached_events: Breached Events
+ conversation_id: '對話 ID'
+ sla_policy_breached: 'SLA 政策'
+ assignee: '負責人'
+ team: '團隊'
+ inbox: '收件匣'
+ labels: '標籤'
+ conversation_link: '對話連結'
+ breached_events: '違反的事件'
default_group_by: day
csat:
headers:
- contact_name: Contact Name
- contact_email_address: Contact Email Address
- contact_phone_number: Contact Phone Number
- link_to_the_conversation: Link to the conversation
- agent_name: 客服姓名
- rating: Rating
- feedback: Feedback Comment
- recorded_at: Recorded date
- review_notes: Review Notes
+ contact_name: '聯絡人姓名'
+ contact_email_address: '聯絡人電子郵件'
+ contact_phone_number: '聯絡人電話號碼'
+ link_to_the_conversation: '對話連結'
+ agent_name: '客服姓名'
+ rating: '評分'
+ feedback: '意見回饋'
+ recorded_at: '記錄日期'
+ review_notes: '審核備註'
notifications:
notification_title:
- conversation_creation: 'A conversation (#%{display_id}) has been created in %{inbox_name}'
- conversation_assignment: 'A conversation (#%{display_id}) has been assigned to you'
- assigned_conversation_new_message: 'A new message is created in conversation (#%{display_id})'
- conversation_mention: 'You have been mentioned in conversation (#%{display_id})'
- sla_missed_first_response: 'SLA target first response missed for conversation (#%{display_id})'
- sla_missed_next_response: 'SLA target next response missed for conversation (#%{display_id})'
- sla_missed_resolution: 'SLA target resolution missed for conversation (#%{display_id})'
- attachment: 'Attachment'
- no_content: 'No content'
+ conversation_creation: '一則對話 (#%{display_id}) 已在 %{inbox_name} 中建立'
+ conversation_assignment: '一則對話 (#%{display_id}) 已分配給您'
+ assigned_conversation_new_message: '對話 (#%{display_id}) 中有新訊息'
+ conversation_mention: '您在對話 (#%{display_id}) 中被提及'
+ sla_missed_first_response: '對話 (#%{display_id}) 未達 SLA 首次回應目標'
+ sla_missed_next_response: '對話 (#%{display_id}) 未達 SLA 後續回應目標'
+ sla_missed_resolution: '對話 (#%{display_id}) 未達 SLA 解決目標'
+ attachment: '附件'
+ no_content: '無內容'
conversations:
captain:
- handoff: 'Transferring to another agent for further assistance.'
+ handoff: '正在轉接至其他客服人員以提供進一步協助。'
messages:
- instagram_story_content: '%{story_sender} mentioned you in the story: '
- instagram_deleted_story_content: This story is no longer available.
- instagram_shared_story_content: 'Shared story'
- instagram_shared_post_content: 'Shared post'
- deleted: 訊息已被刪除
+ instagram_story_content: '%{story_sender} 在限時動態中提及了您:'
+ instagram_deleted_story_content: '此限時動態已不存在。'
+ instagram_shared_story_content: '分享的限時動態'
+ instagram_shared_post_content: '分享的貼文'
+ deleted: '訊息已被刪除'
whatsapp:
- list_button_label: 'Choose an item'
+ list_button_label: '選擇一個項目'
delivery_status:
- error_code: 'Error code: %{error_code}'
+ error_code: '錯誤代碼:%{error_code}'
activity:
captain:
- resolved: 'Conversation was marked resolved by %{user_name} due to inactivity'
- resolved_with_reason: 'Conversation was marked resolved by %{user_name} (%{reason})'
- resolved_by_tool: 'Conversation was marked resolved by %{user_name}: %{reason}'
- open: 'Conversation was marked open by %{user_name}'
- open_with_reason: 'Conversation was marked open by %{user_name} (%{reason})'
- auto_opened_after_agent_reply: 'Conversation was marked open automatically after an agent reply'
+ resolved: '%{user_name} 因無活動而將對話標記為已解決'
+ resolved_with_reason: '%{user_name} 將對話標記為已解決(%{reason})'
+ resolved_by_tool: '%{user_name} 將對話標記為已解決:%{reason}'
+ open: '%{user_name} 將對話標記為開啟'
+ open_with_reason: '%{user_name} 將對話標記為開啟(%{reason})'
+ auto_opened_after_agent_reply: '客服回覆後,對話已自動標記為開啟'
agent_bot:
- error_moved_to_open: 'Conversation was marked open by system due to an error with the agent bot.'
+ error_moved_to_open: '由於機器人客服發生錯誤,系統已將對話標記為開啟。'
status:
- resolved: '被%{user_name}標記的對話已解決。'
- contact_resolved: 'Conversation was resolved by %{contact_name}'
- open: '被%{user_name}恢復對話。'
- pending: 'Conversation was marked as pending by %{user_name}'
- snoozed: 'Conversation was snoozed by %{user_name}'
- auto_resolved_days: '由於對話已經 %{count} 天沒有新活動,已經被系統標記為完成'
- auto_resolved_hours: 'Conversation was marked resolved by system due to %{count} hours of inactivity'
- auto_resolved_minutes: 'Conversation was marked resolved by system due to %{count} minutes of inactivity'
- system_auto_open: System reopened the conversation due to a new incoming message.
+ resolved: '%{user_name} 將對話標記為已解決'
+ contact_resolved: '%{contact_name} 已解決此對話'
+ open: '%{user_name} 重新開啟了對話'
+ pending: '%{user_name} 將對話標記為待處理'
+ snoozed: '%{user_name} 將對話設為延後處理'
+ auto_resolved_days: '由於對話已經 %{count} 天沒有新活動,已被系統標記為已解決'
+ auto_resolved_hours: '由於對話已經 %{count} 小時沒有新活動,已被系統標記為已解決'
+ auto_resolved_minutes: '由於對話已經 %{count} 分鐘沒有新活動,已被系統標記為已解決'
+ system_auto_open: '由於收到新的傳入訊息,系統已重新開啟對話。'
priority:
- added: '%{user_name} set the priority to %{new_priority}'
- updated: '%{user_name} changed the priority from %{old_priority} to %{new_priority}'
- removed: '%{user_name} removed the priority'
+ added: '%{user_name} 將優先順序設為 %{new_priority}'
+ updated: '%{user_name} 將優先順序從 %{old_priority} 變更為 %{new_priority}'
+ removed: '%{user_name} 移除了優先順序'
assignee:
self_assigned: '%{user_name} 將對話指派給自己'
- assigned: '被%{user_name}分配給%{assignee_name}。'
- removed: '對話被%{user_name}設定成未分配。'
+ assigned: '%{user_name} 將對話分配給 %{assignee_name}'
+ removed: '%{user_name} 取消了對話的分配'
team:
- assigned: '被%{user_name}分配給%{team_name}。'
- assigned_with_assignee: 'Assigned to %{assignee_name} via %{team_name} by %{user_name}'
- removed: '被 %{user_name} 從 %{team_name} 解除指派'
+ assigned: '%{user_name} 將對話分配給 %{team_name}'
+ assigned_with_assignee: '%{user_name} 透過 %{team_name} 將對話分配給 %{assignee_name}'
+ removed: '%{user_name} 將對話從 %{team_name} 取消分配'
labels:
added: '%{user_name} 新增了 %{labels}'
removed: '%{user_name} 移除了 %{labels}'
sla:
- added: '%{user_name} added SLA policy %{sla_name}'
- removed: '%{user_name} removed SLA policy %{sla_name}'
+ added: '%{user_name} 新增了 SLA 政策 %{sla_name}'
+ removed: '%{user_name} 移除了 SLA 政策 %{sla_name}'
linear:
- issue_created: 'Linear issue %{issue_id} was created by %{user_name}'
- issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}'
- issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}'
+ issue_created: '%{user_name} 建立了 Linear 議題 %{issue_id}'
+ issue_linked: '%{user_name} 連結了 Linear 議題 %{issue_id}'
+ issue_unlinked: '%{user_name} 取消連結了 Linear 議題 %{issue_id}'
csat:
- not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions'
+ not_sent_due_to_messaging_window: '由於傳出訊息限制,未發送 CSAT 問卷'
auto_resolve:
- not_sent_due_to_messaging_window: 'Auto-resolve message not sent due to outgoing message restrictions'
+ not_sent_due_to_messaging_window: '由於傳出訊息限制,未發送自動解決訊息'
muted: '%{user_name} 已將對話靜音'
unmuted: '%{user_name} 將對話解除靜音'
- auto_resolution_message: 'Resolving the conversation as it has been inactive for a while. Please start a new conversation if you need further assistance.'
+ auto_resolution_message: '由於此對話已有一段時間沒有活動,即將結束對話。如需進一步協助,請開啟新的對話。'
templates:
- greeting_message_body: '%{account_name} 通常在幾小時內回覆'
+ greeting_message_body: '%{account_name} 通常在幾小時內回覆。'
ways_to_reach_you_message_body: '給個聯繫方式讓團隊可以聯繫到您。'
email_input_box_message_body: '透過電子郵件得到通知。'
- csat_input_message_body: 'Please rate the conversation'
+ csat_input_message_body: '請為這次對話評分'
reply:
email:
header:
notifications: '通知'
- from_with_name: '%{assignee_name} from %{inbox_name} <%{from_email}>'
- reply_with_name: '%{assignee_name} from %{inbox_name} '
- friendly_name: '%{sender_name} from %{business_name} <%{from_email}>'
+ from_with_name: '%{assignee_name} 來自 %{inbox_name} <%{from_email}>'
+ reply_with_name: '%{assignee_name} 來自 %{inbox_name} '
+ friendly_name: '%{sender_name} 來自 %{business_name} <%{from_email}>'
professional_name: '%{business_name} <%{from_email}>'
channel_email:
header:
- reply_with_name: '%{assignee_name} from %{inbox_name} <%{from_email}>'
+ reply_with_name: '%{assignee_name} 來自 %{inbox_name} <%{from_email}>'
reply_with_inbox_name: '%{inbox_name} <%{from_email}>'
email_subject: '在對話中的新訊息'
transcript_subject: '對話紀錄'
survey:
- response: 'Please rate this conversation, %{link}'
+ response: '請為這次對話評分,%{link}'
contacts:
online:
- delete: '%{contact_name} is Online, please try again later'
+ delete: '%{contact_name} 目前在線上,請稍後再試'
integration_apps:
#Note: webhooks and dashboard_apps don't need short_description as they use different modal components
dashboard_apps:
- name: 'Dashboard Apps'
- description: 'Dashboard Apps allow you to create and embed applications that display user information, orders, or payment history, providing more context to your customer support agents.'
+ name: '儀表板應用程式'
+ description: '儀表板應用程式可讓您建立並嵌入顯示使用者資訊、訂單或付款紀錄的應用程式,為您的客服人員提供更多背景資訊。'
dyte:
name: 'Dyte'
- short_description: 'Start video/voice calls with customers directly from Chatwoot.'
- description: 'Dyte is a product that integrates audio and video functionalities into your application. With this integration, your agents can start video/voice calls with your customers directly from Chatwoot.'
- meeting_name: '%{agent_name} has started a meeting'
+ short_description: '直接從 Chatwoot 與客戶進行視訊/語音通話。'
+ description: 'Dyte 是一個將音訊和視訊功能整合到應用程式中的產品。透過此整合,您的客服人員可以直接從 Chatwoot 與客戶進行視訊/語音通話。'
+ meeting_name: '%{agent_name} 已發起會議'
slack:
name: 'Slack'
- short_description: 'Receive notifications and respond to conversations directly in Slack.'
- description: "Integrate Chatwoot with Slack to keep your team in sync. This integration allows you to receive notifications for new conversations and respond to them directly within Slack's interface."
+ short_description: '在 Slack 中直接接收通知並回覆對話。'
+ description: '將 Chatwoot 與 Slack 整合,讓您的團隊保持同步。此整合可讓您接收新對話的通知,並直接在 Slack 介面中回覆。'
webhooks:
name: 'Webhooks'
- description: 'Webhook events provide real-time updates about activities in your Chatwoot account. You can subscribe to your preferred events, and Chatwoot will send you HTTP callbacks with the updates.'
+ description: 'Webhook 事件提供您 Chatwoot 帳號中活動的即時更新。您可以訂閱偏好的事件,Chatwoot 將透過 HTTP 回呼向您發送更新。'
dialogflow:
name: 'Dialogflow'
- short_description: 'Build chatbots to handle initial queries before transferring to agents.'
- description: 'Build chatbots with Dialogflow and easily integrate them into your inbox. These bots can handle initial queries before transferring them to a customer service agent.'
+ short_description: '建立聊天機器人,在轉接給客服之前處理初步查詢。'
+ description: '使用 Dialogflow 建立聊天機器人,並輕鬆整合到您的收件匣中。這些機器人可以在轉接給客服人員之前處理初步查詢。'
google_translate:
- name: 'Google Translate'
- short_description: 'Automatically translate customer messages for agents.'
- description: "Integrate Google Translate to help agents easily translate customer messages. This integration automatically detects the language and converts it to the agent's or admin's preferred language."
+ name: 'Google 翻譯'
+ short_description: '自動為客服人員翻譯客戶訊息。'
+ description: '整合 Google 翻譯,幫助客服人員輕鬆翻譯客戶訊息。此整合會自動偵測語言,並將其轉換為客服人員或管理員偏好的語言。'
openai:
name: 'OpenAI'
- short_description: 'AI-powered reply suggestions, summarization, and message enhancement.'
- description: 'Leverage the power of large language models from OpenAI with the features such as reply suggestions, summarization, message rephrasing, spell-checking, and label classification.'
+ short_description: 'AI 驅動的回覆建議、摘要和訊息強化。'
+ description: '利用 OpenAI 大型語言模型的強大功能,提供回覆建議、摘要、訊息改寫、拼字檢查和標籤分類等功能。'
linear:
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.'
+ short_description: '直接從對話中建立和連結 Linear 議題。'
+ description: '直接從對話視窗中在 Linear 建立議題。或者連結現有的 Linear 議題,讓議題追蹤流程更加順暢高效。'
notion:
name: 'Notion'
- short_description: 'Integrate databases, documents and pages directly with Captain.'
- description: 'Connect your Notion workspace to enable Captain to access and generate intelligent responses using content from your databases, documents, and pages to provide more contextual customer support.'
+ short_description: '將資料庫、文件和頁面直接與 Captain 整合。'
+ description: '連結您的 Notion 工作區,讓 Captain 能夠存取並使用您的資料庫、文件和頁面內容產生智慧回應,提供更具情境的客戶支援。'
shopify:
name: 'Shopify'
- short_description: 'Access order details and customer data from your Shopify store.'
- description: 'Connect your Shopify store to access order details, customer information, and product data directly within your conversations and helps your support team provide faster, more contextual assistance to your customers.'
+ short_description: '從您的 Shopify 商店存取訂單詳情和客戶資料。'
+ description: '連結您的 Shopify 商店,在對話中直接存取訂單詳情、客戶資訊和產品資料,幫助您的客服團隊為客戶提供更快速、更具情境的協助。'
leadsquared:
name: 'LeadSquared'
- short_description: 'Sync your contacts and conversations with LeadSquared CRM.'
- description: 'Sync your contacts and conversations with LeadSquared CRM. This integration automatically creates leads in LeadSquared when new contacts are added, and logs conversation activity to provide your sales team with complete context.'
+ short_description: '將您的聯絡人和對話與 LeadSquared CRM 同步。'
+ description: '將您的聯絡人和對話與 LeadSquared CRM 同步。此整合會在新增聯絡人時自動在 LeadSquared 中建立潛在客戶,並記錄對話活動,為您的銷售團隊提供完整的上下文。'
captain:
- copilot_message_required: 訊息為必填
- copilot_error: 'Please connect an assistant to this inbox to use Copilot'
- copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
- upgrade: '升級您的方案以啟用 Captain AI'
- disabled: '此帳戶已停用 Captain AI。'
- api_key_missing: 'Captain AI API 金鑰尚未設定。'
+ copilot_message_required: '訊息為必填'
+ copilot_error: '請先為此收件匣連結助理以使用 Copilot'
+ copilot_limit: '您的 Copilot 點數已用完。您可以在帳單區域購買更多點數。'
+ upgrade: '請升級您的方案以啟用 Captain AI'
+ disabled: '此帳號已停用 Captain AI。'
+ api_key_missing: '尚未設定 Captain AI API 金鑰。'
copilot:
using_tool: '正在使用工具 %{function_name}'
completed_tool_call: '已完成 %{function_name} 工具呼叫'
invalid_tool_call: '無效的工具呼叫'
tool_not_available: '工具不可用'
documents:
- limit_exceeded: 'Document limit exceeded'
- pdf_format_error: 'must be a PDF file'
- pdf_size_error: 'must be less than 10MB'
- 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}'
- pdf_processing_success: 'Successfully processed PDF document %{document_id}'
- faq_generation_complete: 'FAQ generation complete. Total FAQs created: %{count}'
- using_paginated_faq: 'Using paginated FAQ generation for document %{document_id}'
- using_standard_faq: 'Using standard FAQ generation for document %{document_id}'
- response_creation_error: 'Error in creating response document: %{error}'
- missing_openai_file_id: 'Document must have openai_file_id for paginated processing'
- openai_api_error: 'OpenAI API Error: %{error}'
- starting_paginated_faq: 'Starting paginated FAQ generation (%{pages_per_chunk} pages per chunk)'
- stopping_faq_generation: 'Stopping processing. Reason: %{reason}'
- paginated_faq_complete: 'Paginated generation complete. Total FAQs: %{total_faqs}, Pages processed: %{pages_processed}'
- processing_pages: 'Processing pages %{start}-%{end} (iteration %{iteration})'
- chunk_generated: 'Chunk generated %{chunk_faqs} FAQs. Total so far: %{total_faqs}'
- page_processing_error: 'Error processing pages %{start}-%{end}: %{error}'
+ limit_exceeded: '已超過文件上限'
+ pdf_format_error: '必須為 PDF 檔案'
+ pdf_size_error: '必須小於 10MB'
+ pdf_upload_failed: '無法將 PDF 上傳至 OpenAI'
+ pdf_upload_success: 'PDF 上傳成功,file_id:%{file_id}'
+ pdf_processing_failed: '處理 PDF 文件 %{document_id} 失敗:%{error}'
+ pdf_processing_success: '已成功處理 PDF 文件 %{document_id}'
+ faq_generation_complete: 'FAQ 產生完成。建立的 FAQ 總數:%{count}'
+ using_paginated_faq: '正在對文件 %{document_id} 使用分頁 FAQ 產生'
+ using_standard_faq: '正在對文件 %{document_id} 使用標準 FAQ 產生'
+ response_creation_error: '建立回應文件時發生錯誤:%{error}'
+ missing_openai_file_id: '文件必須具有 openai_file_id 才能進行分頁處理'
+ openai_api_error: 'OpenAI API 錯誤:%{error}'
+ starting_paginated_faq: '開始分頁 FAQ 產生(每批次 %{pages_per_chunk} 頁)'
+ stopping_faq_generation: '停止處理。原因:%{reason}'
+ paginated_faq_complete: '分頁產生完成。FAQ 總數:%{total_faqs},已處理頁數:%{pages_processed}'
+ processing_pages: '正在處理第 %{start}-%{end} 頁(第 %{iteration} 次迭代)'
+ chunk_generated: '批次產生了 %{chunk_faqs} 個 FAQ。目前總計:%{total_faqs}'
+ page_processing_error: '處理第 %{start}-%{end} 頁時發生錯誤:%{error}'
custom_tool:
- slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
- limit_exceeded: 'You can create a maximum of %{limit} custom tools per account'
+ slug_generation_failed: '嘗試 5 次後仍無法產生唯一的 slug'
+ limit_exceeded: '每個帳號最多可建立 %{limit} 個自訂工具'
public_portal:
search:
- search_placeholder: Search for article by title or body...
- empty_placeholder: 查無結果。
- loading_placeholder: Searching...
- results_title: Search results
- toc_header: 'On this page'
+ search_placeholder: '依標題或內容搜尋文章...'
+ empty_placeholder: '查無結果。'
+ loading_placeholder: '搜尋中...'
+ results_title: '搜尋結果'
+ toc_header: '本頁內容'
hero:
- sub_title: Search for the articles here or browse the categories below.
+ sub_title: '在此搜尋文章或瀏覽以下分類。'
common:
- home: 首頁
- last_updated_on: Last updated on %{last_updated_on}
- view_all_articles: View all
- article: article
- articles: articles
- author: author
- authors: authors
- other: other
- others: others
- by: By
- no_articles: There are no articles here
+ home: '首頁'
+ last_updated_on: '最後更新於 %{last_updated_on}'
+ view_all_articles: '查看全部'
+ article: '篇文章'
+ articles: '篇文章'
+ author: '位作者'
+ authors: '位作者'
+ other: '其他'
+ others: '其他'
+ by: '作者:'
+ no_articles: '這裡還沒有文章'
footer:
- made_with: Made with
+ made_with: '由以下技術製作'
header:
- go_to_homepage: Website
- visit_website: Visit website
+ go_to_homepage: '網站首頁'
+ visit_website: '前往網站'
appearance:
- system: System
- light: Light
- dark: Dark
- featured_articles: Featured Articles
- uncategorized: Uncategorized
+ system: '系統'
+ light: '淺色'
+ dark: '深色'
+ featured_articles: '精選文章'
+ uncategorized: '未分類'
404:
- title: Page not found
- description: We couldn't find the page you were looking for.
- back_to_home: Go to home page
+ title: '找不到頁面'
+ description: '我們找不到您要尋找的頁面。'
+ back_to_home: '回到首頁'
not_active:
- title: Help Center Unavailable
- description: Please contact the site administrator for more information.
- action: If you are the administrator, please upgrade your plan to restore access.
+ title: '幫助中心目前無法使用'
+ description: '請聯繫網站管理員以取得更多資訊。'
+ action: '如果您是管理員,請升級您的方案以恢復存取權限。'
slack_unfurl:
fields:
- name: 姓名
- email: Email
- phone_number: Phone
- company_name: 公司
- inbox_name: 收件匣
- inbox_type: Inbox Type
- button: 開啟對話
+ name: '姓名'
+ email: '電子郵件'
+ phone_number: '電話'
+ company_name: '公司'
+ inbox_name: '收件匣'
+ inbox_type: '收件匣類型'
+ button: '開啟對話'
time_units:
days:
one: '%{count} 天'
@@ -437,38 +437,38 @@ zh_TW:
one: '%{count} 秒'
other: '%{count} 秒'
auto_assignment:
- default_policy_name: 'Default Policy'
- policy_actor: 'Automation System via %{policy_name}'
+ default_policy_name: '預設策略'
+ policy_actor: '自動化系統(透過 %{policy_name})'
automation:
- system_name: 'Automation System'
+ system_name: '自動化系統'
crm:
- no_message: 'No messages in conversation'
- attachment: '[Attachment: %{type}]'
- no_content: '[No content]'
+ no_message: '對話中沒有訊息'
+ attachment: '[附件:%{type}]'
+ no_content: '[無內容]'
created_activity: |
- New conversation started on %{brand_name}
+ 在 %{brand_name} 上開始了新對話
- Channel: %{channel_info}
- Created: %{formatted_creation_time}
- Conversation ID: %{display_id}
- View in %{brand_name}: %{url}
+ 頻道:%{channel_info}
+ 建立時間:%{formatted_creation_time}
+ 對話 ID:%{display_id}
+ 在 %{brand_name} 中查看:%{url}
transcript_activity: |
- Conversation Transcript from %{brand_name}
+ 來自 %{brand_name} 的對話紀錄
- Channel: %{channel_info}
- Conversation ID: %{display_id}
- View in %{brand_name}: %{url}
+ 頻道:%{channel_info}
+ 對話 ID:%{display_id}
+ 在 %{brand_name} 中查看:%{url}
- Transcript:
+ 紀錄內容:
%{format_messages}
agent_capacity_policy:
- inbox_already_assigned: 'Inbox has already been assigned to this policy'
+ inbox_already_assigned: '收件匣已被分配給此策略'
portals:
send_instructions:
- email_required: 'Email is required'
- invalid_email_format: 'Invalid email format'
- custom_domain_not_configured: 'Custom domain is not configured'
- instructions_sent_successfully: 'Instructions sent successfully'
- subject: 'Finish setting up %{custom_domain}'
+ email_required: '電子郵件為必填'
+ invalid_email_format: '電子郵件格式無效'
+ custom_domain_not_configured: '尚未設定自訂網域'
+ instructions_sent_successfully: '操作說明已成功發送'
+ subject: '完成 %{custom_domain} 的設定'
ssl_status:
- custom_domain_not_configured: 'Custom domain is not configured'
+ custom_domain_not_configured: '尚未設定自訂網域'
From 00837019b5bcecf9dd69947c29d7c015aaabd0e2 Mon Sep 17 00:00:00 2001
From: zip-fa <61551308+zip-fa@users.noreply.github.com>
Date: Wed, 8 Apr 2026 15:00:07 +0300
Subject: [PATCH 31/53] fix(captain): display handoff message to customer in V2
flow (#13885)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
HandoffTool changes conversation status but only posts a private note.
ResponseBuilderJob now detects the tool flag and creates the public
handoff message that was previously only shown in V1.
# Pull Request Template
## Description
Captain V2 was silently forwarding conversations to humans without
showing a handoff message to the customer. The conversation appeared to
just stop
responding.
Root cause: In V2, HandoffTool calls bot_handoff! during agent
execution, which changes conversation status from pending to open. By
the time control returns
to ResponseBuilderJob#process_response, the conversation_pending? guard
returns early - skipping create_handoff_message entirely. The V1 flow
didn't have this
problem because AssistantChatService just returns a string token
(conversation_handoff) and lets ResponseBuilderJob handle everything.
What changed:
1. AgentRunnerService now surfaces the handoff_tool_called flag (already
tracked internally for usage metadata) in its response hash.
2. ResponseBuilderJob#handoff_requested? detects handoffs from both V1
(response token) and V2 (tool flag).
3. ResponseBuilderJob#process_response checks handoff_requested? before
the conversation_pending? guard, so V2 handoffs are processed even when
the status has
already changed.
4. ResponseBuilderJob#process_action('handoff') captures
conversation_pending? before calling bot_handoff! and uses that snapshot
to guard both bot_handoff!
and the OOO message - preventing double-execution when V2's HandoffTool
already ran them.
New V2 handoff flow:
AgentRunnerService
→ agent calls HandoffTool (creates private note, calls bot_handoff!)
→ returns response with handoff_tool_called: true
ResponseBuilderJob#process_response
→ handoff_requested? detects the flag
→ process_action('handoff')
→ create_handoff_message (public message for customer)
→ bot_handoff! skipped (conversation_pending? is false)
→ OOO skipped (conversation_pending? is false)
Fixes #13881
## Type of change
Please delete options that are not relevant.
- [x] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality not to work as expected)
- [ ] This change requires a documentation update
## How Has This Been Tested?
- Update existing response_builder_job_spec.rb covering the V2 handoff
path, V2 normal response path, and V1 regression
- Updated existing agent_runner_service_spec.rb expectations for the new
handoff_tool_called key and added a context for when the flag is true
## Checklist:
- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [ ] 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
- [x] 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
- [x] Any dependent changes have been merged and published in downstream
modules
---------
Co-authored-by: Aakash Bakhle <48802744+aakashb95@users.noreply.github.com>
Co-authored-by: aakashb95
---
.../conversation/response_builder_job.rb | 64 ++++++++----
.../captain/assistant/agent_runner_service.rb | 21 ++--
.../conversation/response_builder_job_spec.rb | 98 +++++++++++++++++--
.../assistant/agent_runner_service_spec.rb | 88 ++++++++++++++++-
4 files changed, 235 insertions(+), 36 deletions(-)
diff --git a/enterprise/app/jobs/captain/conversation/response_builder_job.rb b/enterprise/app/jobs/captain/conversation/response_builder_job.rb
index 268c6a3ee..5e7c5b3c2 100644
--- a/enterprise/app/jobs/captain/conversation/response_builder_job.rb
+++ b/enterprise/app/jobs/captain/conversation/response_builder_job.rb
@@ -45,11 +45,28 @@ class Captain::Conversation::ResponseBuilderJob < ApplicationJob
end
def process_response
- return unless conversation_pending?
+ # Check V2 before V1: error_response can set both signals at once when HandoffTool
+ # fired before the runner errored. V2 must win — running V1 on top would duplicate
+ # OOO and re-dispatch the bot_handoff event.
+ if v2_handoff_tool_fired?
+ if conversation_pending?
+ # HandoffTool flipped the flag without committing — its perform returned a
+ # failure string (e.g. "Conversation not found") before bot_handoff! ran. Fall
+ # back to a full V1 handoff so the customer still ends up with a human.
+ process_v1_handoff
+ else
+ # HandoffTool already opened the conversation inside the agent loop. All that's
+ # left is the customer-facing follow-up message.
+ process_v2_handoff
+ end
+ elsif v1_handoff_requested?
+ # V1 only signals via the response string — no state has been touched yet. If
+ # the conversation isn't pending anymore, a human took over mid-run; bail out
+ # rather than posting a stale handoff message on top of their reply.
+ return unless conversation_pending?
- if handoff_requested?
- process_action('handoff')
- else
+ process_v1_handoff
+ elsif conversation_pending?
ActiveRecord::Base.transaction do
create_messages
Rails.logger.info("[CAPTAIN][ResponseBuilderJob] Incrementing response usage for #{account.id}")
@@ -84,18 +101,27 @@ class Captain::Conversation::ResponseBuilderJob < ApplicationJob
Captain::OpenAiMessageBuilderService.new(message: message).generate_content
end
- def handoff_requested?
+ def v1_handoff_requested?
@response['response'] == 'conversation_handoff'
end
- def process_action(action)
- case action
- when 'handoff'
- I18n.with_locale(@assistant.account.locale) do
- create_handoff_message
- @conversation.bot_handoff!
- send_out_of_office_message_if_applicable
- end
+ def v2_handoff_tool_fired?
+ @response['handoff_tool_called']
+ end
+
+ def process_v1_handoff
+ I18n.with_locale(@assistant.account.locale) do
+ create_handoff_message
+ @conversation.bot_handoff!
+ send_out_of_office_message_if_applicable
+ end
+ end
+
+ def process_v2_handoff
+ # HandoffTool already ran bot_handoff! + OOO inside the agent loop. Preserve
+ # waiting_since so this message doesn't clear the timestamp it left in place.
+ I18n.with_locale(@assistant.account.locale) do
+ create_handoff_message(preserve_waiting_since: true)
end
end
@@ -107,9 +133,10 @@ class Captain::Conversation::ResponseBuilderJob < ApplicationJob
::MessageTemplates::Template::OutOfOffice.perform_if_applicable(@conversation)
end
- def create_handoff_message
+ def create_handoff_message(preserve_waiting_since: false)
create_outgoing_message(
- @assistant.config['handoff_message'].presence || I18n.t('conversations.captain.handoff')
+ @assistant.config['handoff_message'].presence || I18n.t('conversations.captain.handoff'),
+ preserve_waiting_since: preserve_waiting_since
)
end
@@ -122,7 +149,7 @@ class Captain::Conversation::ResponseBuilderJob < ApplicationJob
raise ArgumentError, 'Message content cannot be blank' if content.blank?
end
- def create_outgoing_message(message_content, agent_name: nil)
+ def create_outgoing_message(message_content, agent_name: nil, preserve_waiting_since: false)
additional_attrs = {}
additional_attrs[:agent_name] = agent_name if agent_name.present?
@@ -132,13 +159,14 @@ class Captain::Conversation::ResponseBuilderJob < ApplicationJob
inbox_id: inbox.id,
sender: @assistant,
content: message_content,
- additional_attributes: additional_attrs
+ additional_attributes: additional_attrs,
+ preserve_waiting_since: preserve_waiting_since
)
end
def handle_error(error)
log_error(error)
- process_action('handoff') if conversation_pending?
+ process_v1_handoff if conversation_pending?
true
end
diff --git a/enterprise/app/services/captain/assistant/agent_runner_service.rb b/enterprise/app/services/captain/assistant/agent_runner_service.rb
index a58084960..21a9c331e 100644
--- a/enterprise/app/services/captain/assistant/agent_runner_service.rb
+++ b/enterprise/app/services/captain/assistant/agent_runner_service.rb
@@ -24,6 +24,7 @@ class Captain::Assistant::AgentRunnerService
@conversation = conversation
@callbacks = callbacks
@source = source
+ @handoff_tool_called = false
end
def generate_response(message_history: [])
@@ -98,13 +99,15 @@ class Captain::Assistant::AgentRunnerService
output = result.output
response = output.is_a?(Hash) ? output.with_indifferent_access : { 'response' => output.to_s, 'reasoning' => 'Processed by agent' }
response['agent_name'] = result.context&.dig(:current_agent)
+ response['handoff_tool_called'] = result.context&.dig(:captain_v2_handoff_tool_called) || false
response
end
def error_response(error_message)
{
'response' => 'conversation_handoff',
- 'reasoning' => "Error occurred: #{error_message}"
+ 'reasoning' => "Error occurred: #{error_message}",
+ 'handoff_tool_called' => @handoff_tool_called
}
end
@@ -175,16 +178,18 @@ class Captain::Assistant::AgentRunnerService
end
def add_usage_metadata_callback(runner)
- return runner unless ChatwootApp.otel_enabled?
-
handoff_tool_name = Captain::Tools::HandoffTool.new(@assistant).name
+ # Tool tracking always runs — process_response in the job consumes the resulting
+ # handoff_tool_called flag regardless of whether OTEL is enabled.
runner.on_tool_complete do |tool_name, _tool_result, context_wrapper|
track_handoff_usage(tool_name, handoff_tool_name, context_wrapper)
end
- runner.on_run_complete do |_agent_name, _result, context_wrapper|
- write_credits_used_metadata(context_wrapper)
+ if ChatwootApp.otel_enabled?
+ runner.on_run_complete do |_agent_name, _result, context_wrapper|
+ write_credits_used_metadata(context_wrapper)
+ end
end
runner
end
@@ -193,15 +198,17 @@ class Captain::Assistant::AgentRunnerService
return unless context_wrapper&.context
return unless tool_name.to_s == handoff_tool_name
+ # Mirror the flag onto the instance so error_response can surface it even when
+ # the runner raises before returning a result (the context is unreachable then).
context_wrapper.context[:captain_v2_handoff_tool_called] = true
+ @handoff_tool_called = true
end
def write_credits_used_metadata(context_wrapper)
root_span = context_wrapper&.context&.dig(:__otel_tracing, :root_span)
return unless root_span
- credit_used = !context_wrapper.context[:captain_v2_handoff_tool_called]
- root_span.set_attribute(format(ATTR_LANGFUSE_METADATA, 'credit_used'), credit_used.to_s)
+ root_span.set_attribute(format(ATTR_LANGFUSE_METADATA, 'credit_used'), @handoff_tool_called ? 'false' : 'true')
end
def runner
diff --git a/spec/enterprise/jobs/captain/conversation/response_builder_job_spec.rb b/spec/enterprise/jobs/captain/conversation/response_builder_job_spec.rb
index 1baccf5c7..548b84992 100644
--- a/spec/enterprise/jobs/captain/conversation/response_builder_job_spec.rb
+++ b/spec/enterprise/jobs/captain/conversation/response_builder_job_spec.rb
@@ -101,6 +101,90 @@ RSpec.describe Captain::Conversation::ResponseBuilderJob, type: :job do
end
end
+ context 'when captain_v2 handoff tool fires during agent execution' do
+ before do
+ allow(account).to receive(:feature_enabled?).and_return(false)
+ allow(account).to receive(:feature_enabled?).with('captain_integration_v2').and_return(true)
+ end
+
+ it 'creates a public handoff message visible to the customer' do
+ allow(mock_agent_runner_service).to receive(:generate_response) do
+ conversation.update!(status: :open)
+ { 'response' => 'Let me connect you', 'handoff_tool_called' => true }
+ end
+
+ described_class.perform_now(conversation, assistant)
+
+ public_messages = conversation.messages.outgoing.where(private: false)
+ expect(public_messages.count).to eq(1)
+ expect(public_messages.last.content).to eq(I18n.t('conversations.captain.handoff'))
+ end
+
+ it 'does not call bot_handoff! again when conversation is already open' do
+ allow(mock_agent_runner_service).to receive(:generate_response) do
+ conversation.update!(status: :open)
+ { 'response' => 'Let me connect you', 'handoff_tool_called' => true }
+ end
+
+ expect(conversation).not_to receive(:bot_handoff!)
+
+ described_class.perform_now(conversation, assistant)
+ end
+
+ it 'does not create a duplicate out of office message' do
+ allow(mock_agent_runner_service).to receive(:generate_response) do
+ conversation.update!(status: :open)
+ { 'response' => 'Let me connect you', 'handoff_tool_called' => true }
+ end
+
+ described_class.perform_now(conversation, assistant)
+
+ expect(conversation.messages.template.count).to eq(0)
+ end
+
+ it 'preserves waiting_since when HandoffTool already called bot_handoff!' do
+ original_waiting_since = 5.minutes.ago
+ conversation.update!(waiting_since: original_waiting_since)
+
+ allow(mock_agent_runner_service).to receive(:generate_response) do
+ conversation.update!(status: :open, waiting_since: original_waiting_since)
+ { 'response' => 'Let me connect you', 'handoff_tool_called' => true }
+ end
+
+ described_class.perform_now(conversation, assistant)
+
+ expect(conversation.reload.waiting_since).to be_within(1.second).of(original_waiting_since)
+ end
+
+ it 'does not hand off when handoff_tool_called is false' do
+ allow(mock_agent_runner_service).to receive(:generate_response).and_return({
+ 'response' => 'Hi! How can I help you?',
+ 'handoff_tool_called' => false
+ })
+
+ described_class.perform_now(conversation, assistant)
+
+ expect(conversation.messages.outgoing.count).to eq(1)
+ expect(conversation.messages.last.content).to eq('Hi! How can I help you?')
+ expect(conversation.reload.status).to eq('pending')
+ end
+
+ it 'falls back to a full V1 handoff when HandoffTool fired but failed to commit' do
+ allow(mock_agent_runner_service).to receive(:generate_response).and_return({
+ 'response' => 'I tried to hand off',
+ 'handoff_tool_called' => true
+ })
+
+ described_class.perform_now(conversation, assistant)
+
+ conversation.reload
+ expect(conversation.status).to eq('open')
+ public_messages = conversation.messages.outgoing.where(private: false)
+ expect(public_messages.count).to eq(1)
+ expect(public_messages.last.content).to eq(I18n.t('conversations.captain.handoff'))
+ end
+ end
+
# Regression (PR #13417): wrapping create_handoff_message and bot_handoff! in the
# same transaction defers the message's after_create_commit until commit, at which
# point it clears waiting_since (bot_response). The handoff path must stay outside
@@ -116,13 +200,15 @@ RSpec.describe Captain::Conversation::ResponseBuilderJob, type: :job do
end
it 'sets waiting_since to approximately the handoff time' do
- freeze_time do
- described_class.perform_now(conversation, assistant)
+ # Don't use freeze_time here: we need a real gap between the seeded waiting_since
+ # and Time.current, otherwise "preserved" and "reset" both look identical.
+ conversation.update!(waiting_since: 10.minutes.ago)
- conversation.reload
- expect(conversation.status).to eq('open')
- expect(conversation.waiting_since).to be_within(1.second).of(Time.current)
- end
+ described_class.perform_now(conversation, assistant)
+
+ conversation.reload
+ expect(conversation.status).to eq('open')
+ expect(conversation.waiting_since).to be_within(5.seconds).of(Time.current)
end
it 'preserves waiting_since so a human reply consumes it for reply_time tracking' do
diff --git a/spec/enterprise/services/captain/assistant/agent_runner_service_spec.rb b/spec/enterprise/services/captain/assistant/agent_runner_service_spec.rb
index e232be19d..d6e57e710 100644
--- a/spec/enterprise/services/captain/assistant/agent_runner_service_spec.rb
+++ b/spec/enterprise/services/captain/assistant/agent_runner_service_spec.rb
@@ -10,7 +10,7 @@ RSpec.describe Captain::Assistant::AgentRunnerService do
let(:assistant) { create(:captain_assistant, account: account) }
let(:scenario) { create(:captain_scenario, assistant: assistant, enabled: true) }
- let(:mock_runner) { instance_double(Agents::Runner) }
+ let(:mock_runner) { instance_double(Agents::AgentRunner) }
let(:mock_agent) { instance_double(Agents::Agent) }
let(:mock_scenario_agent) { instance_double(Agents::Agent) }
let(:mock_result) { instance_double(Agents::RunResult, output: { 'response' => 'Test response' }, context: nil) }
@@ -31,6 +31,8 @@ RSpec.describe Captain::Assistant::AgentRunnerService do
allow(scenario).to receive(:agent).and_return(mock_scenario_agent)
allow(Agents::Runner).to receive(:with_agents).and_return(mock_runner)
allow(mock_runner).to receive(:run).and_return(mock_result)
+ allow(mock_runner).to receive(:on_tool_complete).and_return(mock_runner)
+ allow(mock_runner).to receive(:on_run_complete).and_return(mock_runner)
allow(mock_agent).to receive(:register_handoffs)
allow(mock_scenario_agent).to receive(:register_handoffs)
end
@@ -165,7 +167,24 @@ RSpec.describe Captain::Assistant::AgentRunnerService do
it 'processes and formats agent result' do
result = service.generate_response(message_history: message_history)
- expect(result).to eq({ 'response' => 'Test response', 'agent_name' => nil })
+ expect(result).to eq({ 'response' => 'Test response', 'agent_name' => nil, 'handoff_tool_called' => false })
+ end
+
+ context 'when handoff tool was called during agent execution' do
+ let(:runner_context) { { captain_v2_handoff_tool_called: true } }
+ let(:mock_result) do
+ instance_double(Agents::RunResult, output: { 'response' => 'Let me connect you' }, context: runner_context)
+ end
+
+ it 'includes handoff_tool_called flag in response' do
+ result = service.generate_response(message_history: message_history)
+
+ expect(result).to eq({
+ 'response' => 'Let me connect you',
+ 'agent_name' => nil,
+ 'handoff_tool_called' => true
+ })
+ end
end
context 'when no scenarios are enabled' do
@@ -192,7 +211,8 @@ RSpec.describe Captain::Assistant::AgentRunnerService do
expect(result).to eq({
'response' => 'Simple string response',
'reasoning' => 'Processed by agent',
- 'agent_name' => nil
+ 'agent_name' => nil,
+ 'handoff_tool_called' => false
})
end
end
@@ -214,7 +234,8 @@ RSpec.describe Captain::Assistant::AgentRunnerService do
expect(result).to eq({
'response' => 'conversation_handoff',
- 'reasoning' => 'Error occurred: Test error'
+ 'reasoning' => 'Error occurred: Test error',
+ 'handoff_tool_called' => false
})
end
@@ -235,7 +256,32 @@ RSpec.describe Captain::Assistant::AgentRunnerService do
expect(result).to eq({
'response' => 'conversation_handoff',
- 'reasoning' => 'Error occurred: Test error'
+ 'reasoning' => 'Error occurred: Test error',
+ 'handoff_tool_called' => false
+ })
+ end
+ end
+
+ context 'when HandoffTool fired before the runner errored' do
+ # The stubbed runner never invokes the on_tool_complete callback, so we call
+ # track_handoff_usage directly to simulate the flag being set before the raise.
+ before do
+ allow(mock_runner).to receive(:run) do
+ service.send(:track_handoff_usage,
+ Captain::Tools::HandoffTool.new(assistant).name,
+ Captain::Tools::HandoffTool.new(assistant).name,
+ Struct.new(:context).new({}))
+ raise error
+ end
+ end
+
+ it 'surfaces handoff_tool_called in error_response so the job routes to the V2 path' do
+ result = service.generate_response(message_history: message_history)
+
+ expect(result).to eq({
+ 'response' => 'conversation_handoff',
+ 'reasoning' => 'Error occurred: Test error',
+ 'handoff_tool_called' => true
})
end
end
@@ -479,6 +525,38 @@ RSpec.describe Captain::Assistant::AgentRunnerService do
run_complete_callback.call('assistant', nil, context_wrapper)
end
+ it 'registers handoff tracking callback when OTEL is disabled' do
+ service = described_class.new(assistant: assistant, conversation: conversation)
+ runner = instance_double(Agents::AgentRunner)
+ tool_complete_callback = nil
+
+ allow(ChatwootApp).to receive(:otel_enabled?).and_return(false)
+ allow(runner).to receive(:on_tool_complete) do |&block|
+ tool_complete_callback = block
+ runner
+ end
+
+ service.send(:add_usage_metadata_callback, runner)
+
+ context_wrapper = Struct.new(:context).new({})
+
+ expect(tool_complete_callback).not_to be_nil
+ tool_complete_callback.call(Captain::Tools::HandoffTool.new(assistant).name, 'ok', context_wrapper)
+
+ expect(context_wrapper.context[:captain_v2_handoff_tool_called]).to be true
+ end
+
+ it 'does not register OTEL run callback when OTEL is disabled' do
+ service = described_class.new(assistant: assistant, conversation: conversation)
+ runner = instance_double(Agents::AgentRunner)
+
+ allow(ChatwootApp).to receive(:otel_enabled?).and_return(false)
+ allow(runner).to receive(:on_tool_complete).and_return(runner)
+ expect(runner).not_to receive(:on_run_complete)
+
+ service.send(:add_usage_metadata_callback, runner)
+ end
+
it 'sets credit_used=true when handoff tool is not used' do
service = described_class.new(assistant: assistant, conversation: conversation)
runner = instance_double(Agents::AgentRunner)
From bd14e96ed90208b63c55588c88fec4001a24ead6 Mon Sep 17 00:00:00 2001
From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Date: Thu, 9 Apr 2026 10:40:37 +0530
Subject: [PATCH 32/53] chore: allow article to create without content (#14007)
---
.../public/api/v1/portals/articles_controller.rb | 2 +-
.../components/widgets/WootWriter/FullEditor.vue | 4 ++--
.../helpcenter/pages/PortalsArticlesNewPage.vue | 2 +-
app/models/article.rb | 2 +-
spec/models/article_spec.rb | 11 ++++++++++-
5 files changed, 15 insertions(+), 6 deletions(-)
diff --git a/app/controllers/public/api/v1/portals/articles_controller.rb b/app/controllers/public/api/v1/portals/articles_controller.rb
index a8e22d878..2bbfafcc7 100644
--- a/app/controllers/public/api/v1/portals/articles_controller.rb
+++ b/app/controllers/public/api/v1/portals/articles_controller.rb
@@ -62,7 +62,7 @@ class Public::Api::V1::Portals::ArticlesController < Public::Api::V1::Portals::B
def set_article
@article = @portal.articles.find_by(slug: permitted_params[:article_slug])
- @parsed_content = render_article_content(@article.content)
+ @parsed_content = render_article_content(@article.content.to_s)
end
def set_category
diff --git a/app/javascript/dashboard/components/widgets/WootWriter/FullEditor.vue b/app/javascript/dashboard/components/widgets/WootWriter/FullEditor.vue
index 817f6e2b9..976ed3270 100644
--- a/app/javascript/dashboard/components/widgets/WootWriter/FullEditor.vue
+++ b/app/javascript/dashboard/components/widgets/WootWriter/FullEditor.vue
@@ -79,7 +79,7 @@ export default {
created() {
state = createState(
- this.modelValue,
+ this.modelValue || '',
this.placeholder,
this.plugins,
{ onImageUpload: this.openFileBrowser },
@@ -170,7 +170,7 @@ export default {
},
reloadState() {
state = createState(
- this.modelValue,
+ this.modelValue || '',
this.placeholder,
this.plugins,
{ onImageUpload: this.openFileBrowser },
diff --git a/app/javascript/dashboard/routes/dashboard/helpcenter/pages/PortalsArticlesNewPage.vue b/app/javascript/dashboard/routes/dashboard/helpcenter/pages/PortalsArticlesNewPage.vue
index 3833573ad..0c541fd19 100644
--- a/app/javascript/dashboard/routes/dashboard/helpcenter/pages/PortalsArticlesNewPage.vue
+++ b/app/javascript/dashboard/routes/dashboard/helpcenter/pages/PortalsArticlesNewPage.vue
@@ -39,7 +39,7 @@ const createNewArticle = async ({ title, content }) => {
if (title) article.value.title = title;
if (content) article.value.content = content;
- if (!article.value.title || !article.value.content) return;
+ if (!article.value.title) return;
isUpdating.value = true;
try {
diff --git a/app/models/article.rb b/app/models/article.rb
index cb6215157..2a56b006d 100644
--- a/app/models/article.rb
+++ b/app/models/article.rb
@@ -58,7 +58,7 @@ class Article < ApplicationRecord
validates :account_id, presence: true
validates :author_id, presence: true
validates :title, presence: true
- validates :content, presence: true
+ validates :content, presence: true, if: :published?
# ensuring that the position is always set correctly
before_create :add_position_to_article
diff --git a/spec/models/article_spec.rb b/spec/models/article_spec.rb
index 161f3541d..5741b95f0 100644
--- a/spec/models/article_spec.rb
+++ b/spec/models/article_spec.rb
@@ -10,7 +10,16 @@ RSpec.describe Article do
it { is_expected.to validate_presence_of(:account_id) }
it { is_expected.to validate_presence_of(:author_id) }
it { is_expected.to validate_presence_of(:title) }
- it { is_expected.to validate_presence_of(:content) }
+
+ it 'validates content presence only for published articles' do
+ article = build(:article, portal_id: portal_1.id, author_id: user.id, category_id: category_1.id,
+ title: 'test', content: nil, status: :draft)
+ expect(article).to be_valid
+
+ article.status = :published
+ expect(article).not_to be_valid
+ expect(article.errors[:content]).to include("can't be blank")
+ end
end
describe 'associations' do
From f1da7b8afa552dbb579d678a21afa8ad23797188 Mon Sep 17 00:00:00 2001
From: Tanmay Deep Sharma <32020192+tds-1@users.noreply.github.com>
Date: Thu, 9 Apr 2026 16:14:17 +0530
Subject: [PATCH 33/53] feat: enable assignment v2 by default for new accounts
(#14031)
## Description
Enable assignment v2 by default for new accounts
## Type of change
- [ ] New feature (non-breaking change which adds functionality)
## Checklist:
- [ ] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules
---
config/features.yml | 2 +-
...091202_enable_assignment_v2_for_new_accounts.rb | 14 ++++++++++++++
db/schema.rb | 2 +-
3 files changed, 16 insertions(+), 2 deletions(-)
create mode 100644 db/migrate/20260409091202_enable_assignment_v2_for_new_accounts.rb
diff --git a/config/features.yml b/config/features.yml
index 00f9321b8..8a7074e71 100644
--- a/config/features.yml
+++ b/config/features.yml
@@ -190,7 +190,7 @@
chatwoot_internal: true
- name: assignment_v2
display_name: Assignment V2
- enabled: false
+ enabled: true
- name: twilio_content_templates
display_name: Twilio Content Templates
enabled: false
diff --git a/db/migrate/20260409091202_enable_assignment_v2_for_new_accounts.rb b/db/migrate/20260409091202_enable_assignment_v2_for_new_accounts.rb
new file mode 100644
index 000000000..c7c66bb51
--- /dev/null
+++ b/db/migrate/20260409091202_enable_assignment_v2_for_new_accounts.rb
@@ -0,0 +1,14 @@
+class EnableAssignmentV2ForNewAccounts < ActiveRecord::Migration[7.1]
+ def up
+ config = InstallationConfig.find_by(name: 'ACCOUNT_LEVEL_FEATURE_DEFAULTS')
+ return if config&.value.blank?
+
+ features = config.value
+ feature = features.find { |f| f['name'] == 'assignment_v2' }
+ return if feature.blank?
+
+ feature['enabled'] = true
+ config.update!(value: features)
+ GlobalConfig.clear_cache
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index d0993a55b..0067f36ff 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema[7.1].define(version: 2026_03_24_102005) do
+ActiveRecord::Schema[7.1].define(version: 2026_04_09_091202) do
# These extensions should be enabled to support this database
enable_extension "pg_stat_statements"
enable_extension "pg_trgm"
From f13f3ba44680af551444d1304823fbcf83ae9270 Mon Sep 17 00:00:00 2001
From: Aakash Bakhle <48802744+aakashb95@users.noreply.github.com>
Date: Thu, 9 Apr 2026 18:04:52 +0530
Subject: [PATCH 34/53] fix: log only on system api key failures (#13968)
Removes sentry flooding of unnecessary rubyllm logs of wrong API key.
Logs only system api key error since it would be P0.
---------
Co-authored-by: Claude Opus 4.6 (1M context)
---
.../captain/llm/translate_query_service.rb | 6 ++--
.../conversation_completion_service.rb | 8 ++----
lib/captain/base_task_service.rb | 28 ++++++++++++++++---
lib/integrations/llm_base_service.rb | 14 ++++++++--
lib/llm/exception_trackable.rb | 11 ++++++++
.../conversation_completion_service_spec.rb | 12 ++++----
spec/lib/captain/base_task_service_spec.rb | 22 +++++++++++++++
.../lib/integrations/llm_base_service_spec.rb | 28 +++++++++++++++++++
8 files changed, 109 insertions(+), 20 deletions(-)
create mode 100644 lib/llm/exception_trackable.rb
create mode 100644 spec/lib/integrations/llm_base_service_spec.rb
diff --git a/enterprise/app/services/captain/llm/translate_query_service.rb b/enterprise/app/services/captain/llm/translate_query_service.rb
index bdff88150..93f68b05b 100644
--- a/enterprise/app/services/captain/llm/translate_query_service.rb
+++ b/enterprise/app/services/captain/llm/translate_query_service.rb
@@ -27,9 +27,9 @@ class Captain::Llm::TranslateQueryService < Captain::BaseTaskService
end
# Translation is an internal operation, not customer-initiated.
- # Prefer the system key; fall back to the account's hook key for self-hosted setups without one.
- def api_key
- @api_key ||= system_api_key.presence || openai_hook&.settings&.dig('api_key')
+ # It should always use the installation key.
+ def llm_credential
+ @llm_credential ||= system_llm_credential
end
def query_in_target_language?(query)
diff --git a/enterprise/lib/captain/conversation_completion_service.rb b/enterprise/lib/captain/conversation_completion_service.rb
index e9cdc8937..aa40e8000 100644
--- a/enterprise/lib/captain/conversation_completion_service.rb
+++ b/enterprise/lib/captain/conversation_completion_service.rb
@@ -56,12 +56,10 @@ class Captain::ConversationCompletionService < Captain::BaseTaskService
{ complete: false, reason: reason }
end
- # Prefer the system API key over the account's OpenAI hook key.
# This is an internal operational evaluation, not a customer-triggered feature,
- # so it should not consume the customer's OpenAI credits on hosted platforms.
- # Falls back to the account hook for self-hosted deployments without a system key.
- def api_key
- @api_key ||= system_api_key.presence || openai_hook&.settings&.dig('api_key')
+ # so it should always use the installation key.
+ def llm_credential
+ @llm_credential ||= system_llm_credential
end
def event_name
diff --git a/lib/captain/base_task_service.rb b/lib/captain/base_task_service.rb
index 60e6ac579..123377ea0 100644
--- a/lib/captain/base_task_service.rb
+++ b/lib/captain/base_task_service.rb
@@ -1,6 +1,7 @@
class Captain::BaseTaskService
include Integrations::LlmInstrumentation
include Captain::ToolInstrumentation
+ include Llm::ExceptionTrackable
# gpt-4o-mini supports 128,000 tokens
# 1 token is approx 4 characters
@@ -55,7 +56,9 @@ class Captain::BaseTaskService
end
def execute_ruby_llm_request(model:, messages:, schema: nil, tools: [])
- Llm::Config.with_api_key(api_key, api_base: api_base) do |context|
+ credential = llm_credential
+
+ Llm::Config.with_api_key(credential[:api_key], api_base: api_base) do |context|
chat = build_chat(context, model: model, messages: messages, schema: schema, tools: tools)
conversation_messages = messages.reject { |m| m[:role] == 'system' }
@@ -65,7 +68,7 @@ class Captain::BaseTaskService
build_ruby_llm_response(chat.ask(conversation_messages.last[:content]), messages)
end
rescue StandardError => e
- ChatwootExceptionTracker.new(e, account: account).capture_exception
+ capture_llm_exception(e, credential: credential)
{ error: e.message, request_messages: messages }
end
@@ -147,11 +150,24 @@ class Captain::BaseTaskService
end
def api_key_configured?
- api_key.present?
+ llm_credential.present?
end
def api_key
- @api_key ||= openai_hook&.settings&.dig('api_key') || system_api_key
+ llm_credential&.dig(:api_key)
+ end
+
+ def llm_credential
+ @llm_credential ||= hook_llm_credential || system_llm_credential
+ end
+
+ def hook_llm_credential
+ key = openai_hook&.settings&.dig('api_key').presence
+ { api_key: key, source: :hook } if key
+ end
+
+ def system_llm_credential
+ { api_key: system_api_key, source: :system } if system_api_key.present?
end
def openai_hook
@@ -162,6 +178,10 @@ class Captain::BaseTaskService
@system_api_key ||= InstallationConfig.find_by(name: 'CAPTAIN_OPEN_AI_API_KEY')&.value
end
+ def exception_tracking_account
+ account
+ end
+
def prompt_from_file(file_name)
Rails.root.join('lib/integrations/openai/openai_prompts', "#{file_name}.liquid").read
end
diff --git a/lib/integrations/llm_base_service.rb b/lib/integrations/llm_base_service.rb
index 397888b83..8410130ee 100644
--- a/lib/integrations/llm_base_service.rb
+++ b/lib/integrations/llm_base_service.rb
@@ -1,5 +1,6 @@
class Integrations::LlmBaseService
include Integrations::LlmInstrumentation
+ include Llm::ExceptionTrackable
# gpt-4o-mini supports 128,000 tokens
# 1 token is approx 4 characters
@@ -100,13 +101,14 @@ class Integrations::LlmBaseService
def execute_ruby_llm_request(parsed_body)
messages = parsed_body['messages']
model = parsed_body['model']
+ credential = llm_credential
- Llm::Config.with_api_key(hook.settings['api_key'], api_base: api_base) do |context|
+ Llm::Config.with_api_key(credential[:api_key], api_base: api_base) do |context|
chat = context.chat(model: model)
setup_chat_with_messages(chat, messages)
end
rescue StandardError => e
- ChatwootExceptionTracker.new(e, account: hook.account).capture_exception
+ capture_llm_exception(e, credential: credential)
build_error_response_from_exception(e, messages)
end
@@ -164,6 +166,14 @@ class Integrations::LlmBaseService
}
end
+ def llm_credential
+ @llm_credential ||= { api_key: hook.settings['api_key'], source: :hook }
+ end
+
+ def exception_tracking_account
+ hook.account
+ end
+
def build_error_response_from_exception(error, messages)
{ error: error.message, request_messages: messages }
end
diff --git a/lib/llm/exception_trackable.rb b/lib/llm/exception_trackable.rb
new file mode 100644
index 000000000..a2bb48618
--- /dev/null
+++ b/lib/llm/exception_trackable.rb
@@ -0,0 +1,11 @@
+module Llm::ExceptionTrackable
+ private
+
+ def capture_llm_exception(error, credential:)
+ if credential && credential[:source] == :system
+ ChatwootExceptionTracker.new(error, account: exception_tracking_account).capture_exception
+ else
+ Rails.logger.error("[LLM] account=#{exception_tracking_account&.id} #{error.class}: #{error.message}")
+ end
+ end
+end
diff --git a/spec/enterprise/lib/captain/conversation_completion_service_spec.rb b/spec/enterprise/lib/captain/conversation_completion_service_spec.rb
index 58b2b2ce6..5c2000a84 100644
--- a/spec/enterprise/lib/captain/conversation_completion_service_spec.rb
+++ b/spec/enterprise/lib/captain/conversation_completion_service_spec.rb
@@ -141,15 +141,15 @@ RSpec.describe Captain::ConversationCompletionService do
service.perform
end
- it 'falls back to the account hook key when no system key exists' do
+ it 'does not fall back to the account hook key when no system key exists' do
InstallationConfig.find_by(name: 'CAPTAIN_OPEN_AI_API_KEY').update!(value: nil)
- expect(Llm::Config).to receive(:with_api_key).with('customer-own-key', api_base: anything).and_yield(mock_context)
- allow(mock_chat).to receive(:ask).and_return(
- instance_double(RubyLLM::Message, content: { 'complete' => true, 'reason' => 'Done' }, input_tokens: 10, output_tokens: 5)
- )
+ expect(Llm::Config).not_to receive(:with_api_key)
- service.perform
+ result = service.perform
+
+ expect(result[:complete]).to be false
+ expect(result[:reason]).to eq(I18n.t('captain.api_key_missing'))
end
end
diff --git a/spec/lib/captain/base_task_service_spec.rb b/spec/lib/captain/base_task_service_spec.rb
index b3c330252..cb8a2ae2c 100644
--- a/spec/lib/captain/base_task_service_spec.rb
+++ b/spec/lib/captain/base_task_service_spec.rb
@@ -258,6 +258,18 @@ RSpec.describe Captain::BaseTaskService do
expect(result[:error]).to eq('API Error')
expect(result[:request_messages]).to eq(messages)
end
+
+ it 'does not track exceptions for account hook failures' do
+ create(:integrations_hook, :openai, account: account, settings: { 'api_key' => 'hook-key' })
+
+ expect(Llm::Config).to receive(:with_api_key).with('hook-key', api_base: anything).and_raise(error)
+ expect(ChatwootExceptionTracker).not_to receive(:new)
+
+ result = service.send(:make_api_call, model: model, messages: messages)
+
+ expect(result[:error]).to eq('API Error')
+ expect(result[:request_messages]).to eq(messages)
+ end
end
describe '#api_key' do
@@ -276,6 +288,16 @@ RSpec.describe Captain::BaseTaskService do
expect(service.send(:api_key)).to eq('test-key')
end
end
+
+ context 'when no API key is configured' do
+ before do
+ InstallationConfig.find_by(name: 'CAPTAIN_OPEN_AI_API_KEY')&.destroy
+ end
+
+ it 'returns nil' do
+ expect(service.send(:api_key)).to be_nil
+ end
+ end
end
describe '#prompt_from_file' do
diff --git a/spec/lib/integrations/llm_base_service_spec.rb b/spec/lib/integrations/llm_base_service_spec.rb
new file mode 100644
index 000000000..fc23d18ba
--- /dev/null
+++ b/spec/lib/integrations/llm_base_service_spec.rb
@@ -0,0 +1,28 @@
+require 'rails_helper'
+
+RSpec.describe Integrations::LlmBaseService do
+ let(:account) { create(:account) }
+ let(:inbox) { create(:inbox, account: account) }
+ let(:conversation) { create(:conversation, account: account, inbox: inbox) }
+ let(:hook) { create(:integrations_hook, :openai, account: account, settings: { 'api_key' => 'hook-key' }) }
+ let(:event) { { 'name' => 'summarize', 'data' => { 'conversation_display_id' => conversation.display_id } } }
+ let(:service) { described_class.new(hook: hook, event: event) }
+ let(:error) { StandardError.new('API Error') }
+ let(:body) { { model: 'gpt-4', messages: [{ role: 'user', content: 'Hello' }] }.to_json }
+
+ describe '#make_api_call' do
+ before do
+ allow(service).to receive(:instrument_llm_call).and_yield
+ allow(Llm::Config).to receive(:with_api_key).and_raise(error)
+ end
+
+ it 'does not track exceptions for hook key failures' do
+ expect(ChatwootExceptionTracker).not_to receive(:new)
+
+ result = service.send(:make_api_call, body)
+
+ expect(result[:error]).to eq('API Error')
+ expect(result[:request_messages]).to eq([{ 'role' => 'user', 'content' => 'Hello' }])
+ end
+ end
+end
From 42163946ebace8c898912f3e4d8fe7abefa55116 Mon Sep 17 00:00:00 2001
From: Pranav
Date: Thu, 9 Apr 2026 23:12:44 -0700
Subject: [PATCH 35/53] fix: Ignore RoutingError in New Relic error reporting
(#14030)
Routing errors (404s) are expected in production and don't represent
actionable issues. Reporting them to New Relic creates noise and makes
it harder to spot real errors. Adds ActionController::RoutingError to
the New Relic error_collector.ignore_errors list so these are no longer
tracked as exceptions.
---
config/newrelic.yml | 3 +++
1 file changed, 3 insertions(+)
diff --git a/config/newrelic.yml b/config/newrelic.yml
index e1482e4a1..921d6edfb 100644
--- a/config/newrelic.yml
+++ b/config/newrelic.yml
@@ -18,6 +18,9 @@ common: &default_settings
distributed_tracing:
enabled: true
+ error_collector:
+ ignore_errors: 'ActionController::RoutingError'
+
# To disable the agent regardless of other settings, uncomment the following:
agent_enabled: <%= ENV['NEW_RELIC_LICENSE_KEY'].present? && ENV.fetch('NEW_RELIC_AGENT_ENABLED', true) %>
From 3190b29fe9cd307afdb49eafe8a14d2b8fb48459 Mon Sep 17 00:00:00 2001
From: Pranav
Date: Thu, 9 Apr 2026 23:57:15 -0700
Subject: [PATCH 36/53] fix(revert): "fix: Ignore RoutingError in New Relic
error reporting (#14030)" (#14038)
This reverts commit 42163946ebace8c898912f3e4d8fe7abefa55116.
---
config/newrelic.yml | 3 ---
1 file changed, 3 deletions(-)
diff --git a/config/newrelic.yml b/config/newrelic.yml
index 921d6edfb..e1482e4a1 100644
--- a/config/newrelic.yml
+++ b/config/newrelic.yml
@@ -18,9 +18,6 @@ common: &default_settings
distributed_tracing:
enabled: true
- error_collector:
- ignore_errors: 'ActionController::RoutingError'
-
# To disable the agent regardless of other settings, uncomment the following:
agent_enabled: <%= ENV['NEW_RELIC_LICENSE_KEY'].present? && ENV.fetch('NEW_RELIC_AGENT_ENABLED', true) %>
From 224b1f98b0ad127b8dbc325c9af7a47d090df3a6 Mon Sep 17 00:00:00 2001
From: Tanmay Deep Sharma <32020192+tds-1@users.noreply.github.com>
Date: Fri, 10 Apr 2026 13:31:28 +0530
Subject: [PATCH 37/53] fix: handle ioerror in imap fetch (#13960)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
## Description
The IMAP email fetch job (Inboxes::FetchImapEmailsJob) crashes with an
unhandled IOError: closed stream when the mail server's SSL socket is
closed mid-write during Net::IMAP#fetch. This error was being reported
to Sentry because the rescue clause only caught EOFError, not its parent
class IOError.
Fixes
[CW-6689](https://linear.app/chatwoot/issue/CW-6689/ioerror-closed-stream-ioerror)
Widened the rescue in fetch_imap_emails_job.rb from EOFError to IOError.
In Ruby's exception hierarchy, EOFError is a subclass of IOError:
```
StandardError
└── IOError
└── EOFError
```
The Sentry stacktrace shows a plain IOError: closed stream raised from
OpenSSL::Buffering#do_write → Net::IMAP#put_string → Net::IMAP#fetch.
Since this is an IOError (not EOFError), it bypassed the existing rescue
and fell through to the StandardError catch-all, which reported it to
Sentry as an unhandled exception.
Rescuing IOError now catches both:
IOError: closed stream — the reported crash (parent class)
EOFError — the previously handled case (still caught as a subclass)
## Type of change
- [ ] Bug fix (non-breaking change which fixes an issue)
## Checklist:
- [ ] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules
---------
Co-authored-by: Claude Opus 4.6 (1M context)
---
app/jobs/inboxes/fetch_imap_emails_job.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/jobs/inboxes/fetch_imap_emails_job.rb b/app/jobs/inboxes/fetch_imap_emails_job.rb
index ec5717f3b..e98edf409 100644
--- a/app/jobs/inboxes/fetch_imap_emails_job.rb
+++ b/app/jobs/inboxes/fetch_imap_emails_job.rb
@@ -13,7 +13,7 @@ class Inboxes::FetchImapEmailsJob < MutexApplicationJob
end
rescue *ExceptionList::IMAP_EXCEPTIONS => e
Rails.logger.error "Authorization error for email channel - #{channel.inbox.id} : #{e.message}"
- rescue EOFError, OpenSSL::SSL::SSLError, Net::IMAP::NoResponseError, Net::IMAP::BadResponseError, Net::IMAP::InvalidResponseError,
+ rescue IOError, OpenSSL::SSL::SSLError, Net::IMAP::NoResponseError, Net::IMAP::BadResponseError, Net::IMAP::InvalidResponseError,
Net::IMAP::ResponseParseError, Net::IMAP::ResponseReadError, Net::IMAP::ResponseTooLargeError => e
Rails.logger.error "Error for email channel - #{channel.inbox.id} : #{e.message}"
rescue LockAcquisitionError
From de0bd8e71b380bbaffded2fed9b0297d1f3564b7 Mon Sep 17 00:00:00 2001
From: Vishnu Narayanan
Date: Fri, 10 Apr 2026 17:32:13 +0530
Subject: [PATCH 38/53] fix(perf): disable tags counter cache to prevent label
deadlocks (#14021)
Label attach/detach against a shared label no longer deadlocks under
parallel load. During high-concurrency label writes (for example, a
broadcast script attaching a campaign label to many conversations at
once), Chatwoot previously hit periodic `ActiveRecord::Deadlocked`
errors and tail-latency spikes on the tags table. This PR removes the
contention by disabling the `acts-as-taggable-on` counter cache, which
Chatwoot never reads.
## Closes
Fixes [INF-68](https://linear.app/chatwoot/issue/INF-68) (event 2)
## How to reproduce
1. Seed an account with ~20 conversations and 5 labels.
2. Spawn 20 parallel threads, each calling
`conversation.update!(label_list: shared_labels.shuffle)` against
different conversations.
3. Observe `ActiveRecord::Deadlocked` exceptions and p99 label-write
latency well above 1s.
With the counter cache disabled, the deadlock cycle cannot form.
## How this was tested
- Ran a 20-thread synthetic load test locally, each thread attaching 5
shared labels (shuffled per request) to different conversations. With
the counter cache enabled: 8 deadlocks across 300 attempts, p99 ~2.2s.
With the counter cache disabled: zero deadlocks, p99 ~306ms (roughly 85%
tail-latency reduction). The `UPDATE tags SET taggings_count = ...`
statement disappears from the SQL log entirely.
- Verified at boot via `rails runner` that
`ActsAsTaggableOn::Tagging.reflect_on_association(:tag).options[:counter_cache]`
returns `false` after the initializer runs. The gem wires `belongs_to
:tag, counter_cache: ActsAsTaggableOn.tags_counter` at class-load time,
so the initializer must sit ahead of the `Tagging` autoload path; this
confirms it does.
---
config/initializers/acts_as_taggable_on.rb | 10 ++++++++++
1 file changed, 10 insertions(+)
create mode 100644 config/initializers/acts_as_taggable_on.rb
diff --git a/config/initializers/acts_as_taggable_on.rb b/config/initializers/acts_as_taggable_on.rb
new file mode 100644
index 000000000..9b0297bfa
--- /dev/null
+++ b/config/initializers/acts_as_taggable_on.rb
@@ -0,0 +1,10 @@
+# Disable the taggings counter cache on tags.
+#
+# Each tagging INSERT/DELETE would otherwise issue
+# `UPDATE tags SET taggings_count = ... WHERE id = ?`, which serialises
+# concurrent label writes on the same tag row and deadlocks under
+# parallel multi-label updates (refer INF-68)
+#
+# Safe because Chatwoot does not read `tags.taggings_count` anywhere;
+# label reports compute counts directly via GROUP BY on taggings.
+ActsAsTaggableOn.tags_counter = false
From 45b6ea6b3f7d5d952093831aa495fe17cb691b47 Mon Sep 17 00:00:00 2001
From: Sojan Jose
Date: Mon, 13 Apr 2026 10:40:46 +0530
Subject: [PATCH 39/53] feat: add automation condition to filter private notes
(#12102)
## Summary
Adds a new automation condition to filter private notes.
This allows automation rules to explicitly include or exclude private
notes instead of relying on implicit behavior.
Fixes: #11208
## Preview
https://github.com/user-attachments/assets/c40f6910-7bbf-4e59-aae5-ad408602927a
---
.../composables/spec/useAutomation.spec.js | 6 +++
.../spec/useEditableAutomation.spec.js | 54 +++++++++++++++++++
.../composables/useEditableAutomation.js | 19 ++++++-
.../dashboard/helper/automationHelper.js | 1 +
.../helper/specs/automationHelper.spec.js | 15 ++++++
.../dashboard/i18n/locale/en/automation.json | 1 +
.../settings/automation/constants.js | 6 +++
app/models/automation_rule.rb | 2 +-
.../conditions_filter_service.rb | 1 +
lib/filters/filter_keys.yml | 6 +++
.../automation_rule_listener_spec.rb | 9 ++++
spec/models/automation_rule_spec.rb | 13 +++++
.../condition_validation_service_spec.rb | 3 +-
.../conditions_filter_service_spec.rb | 21 ++++++++
14 files changed, 153 insertions(+), 4 deletions(-)
create mode 100644 app/javascript/dashboard/composables/spec/useEditableAutomation.spec.js
diff --git a/app/javascript/dashboard/composables/spec/useAutomation.spec.js b/app/javascript/dashboard/composables/spec/useAutomation.spec.js
index 6cce15996..2e07f1671 100644
--- a/app/javascript/dashboard/composables/spec/useAutomation.spec.js
+++ b/app/javascript/dashboard/composables/spec/useAutomation.spec.js
@@ -8,6 +8,7 @@ import {
agents,
teams,
labels,
+ booleanFilterOptions,
statusFilterOptions,
messageTypeOptions,
priorityOptions,
@@ -73,6 +74,8 @@ describe('useAutomation', () => {
return countries;
case 'message_type':
return messageTypeOptions;
+ case 'private_note':
+ return booleanFilterOptions;
case 'priority':
return priorityOptions;
default:
@@ -226,6 +229,9 @@ describe('useAutomation', () => {
expect(getConditionDropdownValues('message_type')).toEqual(
messageTypeOptions
);
+ expect(getConditionDropdownValues('private_note')).toEqual(
+ booleanFilterOptions
+ );
expect(getConditionDropdownValues('priority')).toEqual(priorityOptions);
});
diff --git a/app/javascript/dashboard/composables/spec/useEditableAutomation.spec.js b/app/javascript/dashboard/composables/spec/useEditableAutomation.spec.js
new file mode 100644
index 000000000..c6177e9a2
--- /dev/null
+++ b/app/javascript/dashboard/composables/spec/useEditableAutomation.spec.js
@@ -0,0 +1,54 @@
+import { useEditableAutomation } from '../useEditableAutomation';
+import useAutomationValues from '../useAutomationValues';
+
+vi.mock('../useAutomationValues');
+
+describe('useEditableAutomation', () => {
+ beforeEach(() => {
+ useAutomationValues.mockReturnValue({
+ getConditionDropdownValues: vi.fn(attributeKey => {
+ if (attributeKey === 'private_note') {
+ return [
+ { id: true, name: 'True' },
+ { id: false, name: 'False' },
+ ];
+ }
+
+ return [];
+ }),
+ getActionDropdownValues: vi.fn(),
+ });
+ });
+
+ it('rehydrates boolean conditions as a single selected option', () => {
+ const automation = {
+ event_name: 'message_created',
+ conditions: [
+ {
+ attribute_key: 'private_note',
+ filter_operator: 'equal_to',
+ values: [false],
+ query_operator: null,
+ },
+ ],
+ actions: [],
+ };
+ const automationTypes = {
+ message_created: {
+ conditions: [{ key: 'private_note', inputType: 'search_select' }],
+ },
+ };
+
+ const { formatAutomation } = useEditableAutomation();
+ const result = formatAutomation(automation, [], automationTypes, []);
+
+ expect(result.conditions).toEqual([
+ {
+ attribute_key: 'private_note',
+ filter_operator: 'equal_to',
+ values: { id: false, name: 'False' },
+ query_operator: 'and',
+ },
+ ]);
+ });
+});
diff --git a/app/javascript/dashboard/composables/useEditableAutomation.js b/app/javascript/dashboard/composables/useEditableAutomation.js
index 8b9041a8f..3f4e65b3c 100644
--- a/app/javascript/dashboard/composables/useEditableAutomation.js
+++ b/app/javascript/dashboard/composables/useEditableAutomation.js
@@ -46,11 +46,26 @@ export function useEditableAutomation() {
if (inputType === 'comma_separated_plain_text') {
return { ...condition, values: condition.values.join(',') };
}
+ const dropdownValues = getConditionDropdownValues(
+ condition.attribute_key
+ );
+ const hasBooleanOptions =
+ inputType === 'search_select' &&
+ dropdownValues.length &&
+ dropdownValues.every(item => typeof item.id === 'boolean');
+
+ if (hasBooleanOptions) {
+ return {
+ ...condition,
+ query_operator: condition.query_operator || 'and',
+ values: dropdownValues.find(item => item.id === condition.values[0]),
+ };
+ }
return {
...condition,
query_operator: condition.query_operator || 'and',
- values: [...getConditionDropdownValues(condition.attribute_key)].filter(
- item => [...condition.values].includes(item.id)
+ values: [...dropdownValues].filter(item =>
+ [...condition.values].includes(item.id)
),
};
});
diff --git a/app/javascript/dashboard/helper/automationHelper.js b/app/javascript/dashboard/helper/automationHelper.js
index fa6120c16..8aed8dcda 100644
--- a/app/javascript/dashboard/helper/automationHelper.js
+++ b/app/javascript/dashboard/helper/automationHelper.js
@@ -150,6 +150,7 @@ export const getConditionOptions = ({
conversation_language: languages,
country_code: countries,
message_type: messageTypeOptions,
+ private_note: booleanFilterOptions,
priority: priorityOptions,
labels: generateConditionOptions(labels, 'title'),
};
diff --git a/app/javascript/dashboard/helper/specs/automationHelper.spec.js b/app/javascript/dashboard/helper/specs/automationHelper.spec.js
index 10088963a..033481a0b 100644
--- a/app/javascript/dashboard/helper/specs/automationHelper.spec.js
+++ b/app/javascript/dashboard/helper/specs/automationHelper.spec.js
@@ -178,6 +178,21 @@ describe('getConditionOptions', () => {
})
).toEqual(testOptions);
});
+
+ it('returns boolean options for private_note', () => {
+ const booleanOptions = [
+ { id: true, name: 'True' },
+ { id: false, name: 'False' },
+ ];
+
+ expect(
+ helpers.getConditionOptions({
+ booleanFilterOptions: booleanOptions,
+ customAttributes,
+ type: 'private_note',
+ })
+ ).toEqual(booleanOptions);
+ });
});
describe('getFileName', () => {
diff --git a/app/javascript/dashboard/i18n/locale/en/automation.json b/app/javascript/dashboard/i18n/locale/en/automation.json
index 22a9735f4..d338fa9a2 100644
--- a/app/javascript/dashboard/i18n/locale/en/automation.json
+++ b/app/javascript/dashboard/i18n/locale/en/automation.json
@@ -169,6 +169,7 @@
},
"ATTRIBUTES": {
"MESSAGE_TYPE": "Message Type",
+ "PRIVATE_NOTE": "Private Note",
"MESSAGE_CONTAINS": "Message Contains",
"EMAIL": "Email",
"INBOX": "Inbox",
diff --git a/app/javascript/dashboard/routes/dashboard/settings/automation/constants.js b/app/javascript/dashboard/routes/dashboard/settings/automation/constants.js
index 3acca3e2e..24947c63b 100644
--- a/app/javascript/dashboard/routes/dashboard/settings/automation/constants.js
+++ b/app/javascript/dashboard/routes/dashboard/settings/automation/constants.js
@@ -14,6 +14,12 @@ export const AUTOMATIONS = {
inputType: 'search_select',
filterOperators: OPERATOR_TYPES_1,
},
+ {
+ key: 'private_note',
+ name: 'PRIVATE_NOTE',
+ inputType: 'search_select',
+ filterOperators: OPERATOR_TYPES_1,
+ },
{
key: 'content',
name: 'MESSAGE_CONTAINS',
diff --git a/app/models/automation_rule.rb b/app/models/automation_rule.rb
index 8162abb91..3ab23530d 100644
--- a/app/models/automation_rule.rb
+++ b/app/models/automation_rule.rb
@@ -36,7 +36,7 @@ class AutomationRule < ApplicationRecord
def conditions_attributes
%w[content email country_code status message_type browser_language assignee_id team_id referer city company inbox_id
- mail_subject phone_number priority conversation_language labels]
+ mail_subject phone_number priority conversation_language labels private_note]
end
def actions_attributes
diff --git a/app/services/automation_rules/conditions_filter_service.rb b/app/services/automation_rules/conditions_filter_service.rb
index 993ed21c9..862faceac 100644
--- a/app/services/automation_rules/conditions_filter_service.rb
+++ b/app/services/automation_rules/conditions_filter_service.rb
@@ -113,6 +113,7 @@ class AutomationRules::ConditionsFilterService < FilterService
query_operator = query_hash['query_operator']
attribute_key = 'processed_message_content' if attribute_key == 'content'
+ attribute_key = 'private' if attribute_key == 'private_note'
filter_operator_value = filter_operation(query_hash, current_index)
diff --git a/lib/filters/filter_keys.yml b/lib/filters/filter_keys.yml
index bfaf39325..8711239cc 100644
--- a/lib/filters/filter_keys.yml
+++ b/lib/filters/filter_keys.yml
@@ -214,6 +214,12 @@ messages:
filter_operators:
- "equal_to"
- "not_equal_to"
+ private_note:
+ attribute_type: "standard"
+ data_type: "boolean"
+ filter_operators:
+ - "equal_to"
+ - "not_equal_to"
content:
attribute_type: "standard"
data_type: "text"
diff --git a/spec/listeners/automation_rule_listener_spec.rb b/spec/listeners/automation_rule_listener_spec.rb
index 57a096a10..08085da7a 100644
--- a/spec/listeners/automation_rule_listener_spec.rb
+++ b/spec/listeners/automation_rule_listener_spec.rb
@@ -220,6 +220,15 @@ describe AutomationRuleListener do
expect(AutomationRules::ActionService).not_to have_received(:new)
end
+ it 'calls AutomationRules::ActionService if message is a private note' do
+ message.update!(private: true)
+ allow(condition_match).to receive(:present?).and_return(true)
+
+ listener.message_created(event)
+
+ expect(AutomationRules::ActionService).to have_received(:new).with(automation_rule, account, conversation)
+ end
+
it 'does not call AutomationRules::ActionService if conditions do not match based on content' do
message.update!(processed_message_content: 'hi', content: "hi\n\nhello")
allow(condition_match).to receive(:present?).and_return(false)
diff --git a/spec/models/automation_rule_spec.rb b/spec/models/automation_rule_spec.rb
index 91452b8a4..cd6297713 100644
--- a/spec/models/automation_rule_spec.rb
+++ b/spec/models/automation_rule_spec.rb
@@ -86,6 +86,19 @@ RSpec.describe AutomationRule do
rule = FactoryBot.build(:automation_rule, params)
expect(rule.valid?).to be true
end
+
+ it 'allows private_note as a valid condition attribute' do
+ params[:conditions] = [
+ {
+ attribute_key: 'private_note',
+ filter_operator: 'equal_to',
+ values: [true],
+ query_operator: nil
+ }
+ ]
+ rule = FactoryBot.build(:automation_rule, params)
+ expect(rule.valid?).to be true
+ end
end
describe 'reauthorizable' do
diff --git a/spec/services/automation_rules/condition_validation_service_spec.rb b/spec/services/automation_rules/condition_validation_service_spec.rb
index 36387754a..1f65fb475 100644
--- a/spec/services/automation_rules/condition_validation_service_spec.rb
+++ b/spec/services/automation_rules/condition_validation_service_spec.rb
@@ -10,7 +10,8 @@ RSpec.describe AutomationRules::ConditionValidationService do
rule.conditions = [
{ 'values': ['open'], 'attribute_key': 'status', 'query_operator': nil, 'filter_operator': 'equal_to' },
{ 'values': ['+918484'], 'attribute_key': 'phone_number', 'query_operator': 'OR', 'filter_operator': 'contains' },
- { 'values': ['test'], 'attribute_key': 'email', 'query_operator': nil, 'filter_operator': 'contains' }
+ { 'values': ['test'], 'attribute_key': 'email', 'query_operator': 'OR', 'filter_operator': 'contains' },
+ { 'values': [true], 'attribute_key': 'private_note', 'query_operator': nil, 'filter_operator': 'equal_to' }
]
rule.save
end
diff --git a/spec/services/automation_rules/conditions_filter_service_spec.rb b/spec/services/automation_rules/conditions_filter_service_spec.rb
index 426cb533e..c4ff81275 100644
--- a/spec/services/automation_rules/conditions_filter_service_spec.rb
+++ b/spec/services/automation_rules/conditions_filter_service_spec.rb
@@ -83,6 +83,27 @@ RSpec.describe AutomationRules::ConditionsFilterService do
end
end
+ context 'when filtering private notes' do
+ before do
+ rule.conditions = [
+ { 'values': [true], 'attribute_key': 'private_note', 'query_operator': nil, 'filter_operator': 'equal_to' }
+ ]
+ rule.save
+ end
+
+ it 'will return true when the message is a private note' do
+ message.update!(private: true)
+
+ expect(described_class.new(rule, conversation, { message: message, changed_attributes: {} }).perform).to be(true)
+ end
+
+ it 'will return false when the message is not a private note' do
+ message.update!(private: false)
+
+ expect(described_class.new(rule, conversation, { message: message, changed_attributes: {} }).perform).to be(false)
+ end
+ end
+
context 'when filter_operator is on processed_message_content' do
before do
rule.conditions = [
From 0592cccca9d1cff3a9d6dbadb77e468d3f8a3755 Mon Sep 17 00:00:00 2001
From: Tanmay Deep Sharma <32020192+tds-1@users.noreply.github.com>
Date: Mon, 13 Apr 2026 19:03:37 +0700
Subject: [PATCH 40/53] fix: prevent lost custom_attributes updates from
concurrent jsonb writes (#14040)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
## Linear ticket
https://linear.app/chatwoot/issue/CW-6834/billing-upgrade-didnt-work
## Description
A `customer.subscription.updated` Stripe webhook for account 76162
returned 200 OK but did not persist the new `subscribed_quantity`. Root
cause: a race condition between the webhook handler and
`increment_response_usage` (Captain usage counter), both doing
read-modify-write on the `custom_attributes` JSONB column. The webhook
wrote `quantity: 6`, then a concurrent `save` from
`increment_response_usage` overwrote the entire hash with stale data —
restoring `quantity: 5`.
Fix: use atomic `jsonb_set` so usage counter updates only touch the
single key they care about, instead of rewriting the whole
`custom_attributes` hash. `increment_custom_attribute` also performs the
increment in SQL, making concurrent increments correct as well.
## Type of change
- [x] Bug fix (non-breaking change which fixes an issue)
## How Has This Been Tested?
- New regression spec in `handle_stripe_event_service_spec.rb` that
simulates concurrent webhook + `increment_response_usage` and asserts
both `subscribed_quantity` and `captain_responses_usage` survive
- Existing account, billing, captain, and topup specs all pass locally
## 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
- [x] 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
---
.../account/plan_usage_and_limits.rb | 32 ++++++++++++++-----
.../handle_stripe_event_service_spec.rb | 31 ++++++++++++++++++
2 files changed, 55 insertions(+), 8 deletions(-)
diff --git a/enterprise/app/models/enterprise/account/plan_usage_and_limits.rb b/enterprise/app/models/enterprise/account/plan_usage_and_limits.rb
index 705097030..0937c7b82 100644
--- a/enterprise/app/models/enterprise/account/plan_usage_and_limits.rb
+++ b/enterprise/app/models/enterprise/account/plan_usage_and_limits.rb
@@ -16,20 +16,15 @@ module Enterprise::Account::PlanUsageAndLimits # rubocop:disable Metrics/ModuleL
end
def increment_response_usage
- current_usage = custom_attributes[CAPTAIN_RESPONSES_USAGE].to_i || 0
- custom_attributes[CAPTAIN_RESPONSES_USAGE] = current_usage + 1
- save
+ increment_custom_attribute(CAPTAIN_RESPONSES_USAGE)
end
def reset_response_usage
- custom_attributes[CAPTAIN_RESPONSES_USAGE] = 0
- save
+ update_custom_attribute(CAPTAIN_RESPONSES_USAGE, 0)
end
def update_document_usage
- # this will ensure that the document count is always accurate
- custom_attributes[CAPTAIN_DOCUMENTS_USAGE] = captain_documents.count
- save
+ update_custom_attribute(CAPTAIN_DOCUMENTS_USAGE, captain_documents.count)
end
def email_transcript_enabled?
@@ -130,6 +125,27 @@ module Enterprise::Account::PlanUsageAndLimits # rubocop:disable Metrics/ModuleL
ChatwootApp.max_limit
end
+ # Atomic jsonb_set to avoid clobbering concurrent writes to other custom_attributes keys.
+ # Goes through Account relation (rather than raw connection) so shard routing is respected.
+ # rubocop:disable Rails/SkipsModelValidations
+ def update_custom_attribute(key, value)
+ Account.where(id: id).update_all([
+ "custom_attributes = jsonb_set(COALESCE(custom_attributes, '{}'), ARRAY[:key], :value::jsonb)",
+ { key: key, value: value.to_json }
+ ])
+ custom_attributes[key] = value
+ end
+
+ def increment_custom_attribute(key)
+ Account.where(id: id).update_all([
+ "custom_attributes = jsonb_set(COALESCE(custom_attributes, '{}'), ARRAY[:key], " \
+ '(COALESCE((custom_attributes ->> :key)::int, 0) + 1)::text::jsonb)',
+ { key: key }
+ ])
+ custom_attributes[key] = custom_attributes[key].to_i + 1
+ end
+ # rubocop:enable Rails/SkipsModelValidations
+
def validate_limit_keys
errors.add(:limits, ': Invalid data') unless self[:limits].is_a? Hash
self[:limits] = {} if self[:limits].blank?
diff --git a/spec/enterprise/services/enterprise/billing/handle_stripe_event_service_spec.rb b/spec/enterprise/services/enterprise/billing/handle_stripe_event_service_spec.rb
index 0f8ce1494..f9b550ef8 100644
--- a/spec/enterprise/services/enterprise/billing/handle_stripe_event_service_spec.rb
+++ b/spec/enterprise/services/enterprise/billing/handle_stripe_event_service_spec.rb
@@ -83,6 +83,37 @@ describe Enterprise::Billing::HandleStripeEventService do
end
end
+ describe 'subscription quantity update' do
+ before do
+ allow(subscription).to receive(:[]).with('plan')
+ .and_return({ 'id' => 'price_startups', 'product' => 'plan_id_startups', 'name' => 'Startups' })
+ end
+
+ it 'updates subscribed_quantity' do
+ allow(subscription).to receive(:[]).with('quantity').and_return(6)
+
+ stripe_event_service.new.perform(event: event)
+
+ expect(account.reload.custom_attributes['subscribed_quantity']).to eq(6)
+ end
+
+ it 'persists quantity even when increment_response_usage runs concurrently' do
+ allow(subscription).to receive(:[]).with('quantity').and_return(6)
+ account.update!(custom_attributes: account.custom_attributes.merge('captain_responses_usage' => 100))
+
+ # Simulate: webhook updates quantity, then a concurrent increment_response_usage writes usage
+ stripe_event_service.new.perform(event: event)
+ account.reload
+
+ # Simulate concurrent increment_response_usage (atomic jsonb_set, not full hash overwrite)
+ account.increment_response_usage
+
+ # Quantity must survive the concurrent usage update
+ expect(account.reload.custom_attributes['subscribed_quantity']).to eq(6)
+ expect(account.reload.custom_attributes['captain_responses_usage']).to eq(101)
+ end
+ end
+
describe 'subscription deletion handling' do
it 'calls CreateStripeCustomerService on subscription deletion' do
allow(event).to receive(:type).and_return('customer.subscription.deleted')
From 722e68eecb6b9085e97ddc5770893478c4887f4b Mon Sep 17 00:00:00 2001
From: Tanmay Deep Sharma <32020192+tds-1@users.noreply.github.com>
Date: Mon, 13 Apr 2026 19:06:06 +0700
Subject: [PATCH 41/53] fix: validate support_email format and handle parse
errors in mailer (#13958)
## Description
ConversationReplyMailer#parse_email calls
Mail::Address.new(email_string).address without error handling. When an
account's support_email contains a non-email string (e.g., "Smith
Smith"), the mail gem raises Mail::Field::IncompleteParseError, crashing
conversation transcript emails.
This has caused 1,056 errors on Sentry (EXTERNAL-CHATINC-JX) since Feb
25, all from a single account that has a name stored in the
support_email field instead of a valid email address.
Closes
https://linear.app/chatwoot/issue/CW-6687/mailfieldincompleteparseerror-mailaddresslist-can-not-parse-orsmith
## Type of change
Please delete options that are not relevant.
- [ ] Bug fix (non-breaking change which fixes an issue)
## Checklist:
- [ ] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules
---------
Co-authored-by: Claude Opus 4.6 (1M context)
Co-authored-by: Vishnu Narayanan
---
app/builders/email/base_builder.rb | 6 +-
app/mailers/conversation_reply_mailer.rb | 5 +-
app/models/account.rb | 56 ++++---------------
.../concerns/account_settings_schema.rb | 47 ++++++++++++++++
.../concerns/email_address_parseable.rb | 15 +++++
config/locales/en.yml | 2 +
spec/models/account_spec.rb | 23 ++++++++
7 files changed, 102 insertions(+), 52 deletions(-)
create mode 100644 app/models/concerns/account_settings_schema.rb
create mode 100644 app/models/concerns/email_address_parseable.rb
diff --git a/app/builders/email/base_builder.rb b/app/builders/email/base_builder.rb
index 731b1b0f5..6f79d6018 100644
--- a/app/builders/email/base_builder.rb
+++ b/app/builders/email/base_builder.rb
@@ -1,4 +1,6 @@
class Email::BaseBuilder
+ include EmailAddressParseable
+
pattr_initialize [:inbox!]
private
@@ -47,8 +49,4 @@ class Email::BaseBuilder
# can save it in the format "Name "
parse_email(account.support_email)
end
-
- def parse_email(email_string)
- Mail::Address.new(email_string).address
- end
end
diff --git a/app/mailers/conversation_reply_mailer.rb b/app/mailers/conversation_reply_mailer.rb
index 220531221..d9e6ec8e0 100644
--- a/app/mailers/conversation_reply_mailer.rb
+++ b/app/mailers/conversation_reply_mailer.rb
@@ -5,6 +5,7 @@ class ConversationReplyMailer < ApplicationMailer
include ConversationReplyMailerHelper
include ReferencesHeaderBuilder
+ include EmailAddressParseable
default from: ENV.fetch('MAILER_SENDER_EMAIL', 'Chatwoot ')
layout :choose_layout
@@ -139,10 +140,6 @@ class ConversationReplyMailer < ApplicationMailer
sender_name(@channel.email)
end
- def parse_email(email_string)
- Mail::Address.new(email_string).address
- end
-
def inbox_from_email_address
return @inbox.email_address if @inbox.email_address
diff --git a/app/models/account.rb b/app/models/account.rb
index 06f47636e..181081aad 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -30,50 +30,7 @@ class Account < ApplicationRecord
include CacheKeys
include CaptainFeaturable
include AccountEmailRateLimitable
-
- SETTINGS_PARAMS_SCHEMA = {
- 'type': 'object',
- 'properties':
- {
- 'auto_resolve_after': { 'type': %w[integer null], 'minimum': 10, 'maximum': 1_439_856 },
- 'auto_resolve_message': { 'type': %w[string null] },
- 'auto_resolve_ignore_waiting': { 'type': %w[boolean null] },
- 'audio_transcriptions': { 'type': %w[boolean null] },
- 'auto_resolve_label': { 'type': %w[string null] },
- 'keep_pending_on_bot_failure': { 'type': %w[boolean null] },
- 'captain_auto_resolve_mode': { 'type': %w[string null], 'enum': ['evaluated', 'legacy', 'disabled', nil] },
- 'conversation_required_attributes': {
- 'type': %w[array null],
- 'items': { 'type': 'string' }
- },
- 'captain_models': {
- 'type': %w[object null],
- 'properties': {
- 'editor': { 'type': %w[string null] },
- 'assistant': { 'type': %w[string null] },
- 'copilot': { 'type': %w[string null] },
- 'label_suggestion': { 'type': %w[string null] },
- 'audio_transcription': { 'type': %w[string null] },
- 'help_center_search': { 'type': %w[string null] }
- },
- 'additionalProperties': false
- },
- 'captain_features': {
- 'type': %w[object null],
- 'properties': {
- 'editor': { 'type': %w[boolean null] },
- 'assistant': { 'type': %w[boolean null] },
- 'copilot': { 'type': %w[boolean null] },
- 'label_suggestion': { 'type': %w[boolean null] },
- 'audio_transcription': { 'type': %w[boolean null] },
- 'help_center_search': { 'type': %w[boolean null] }
- },
- 'additionalProperties': false
- }
- },
- 'required': [],
- 'additionalProperties': true
- }.to_json.freeze
+ include AccountSettingsSchema
DEFAULT_QUERY_SETTING = {
flag_query_mode: :bit_operator,
@@ -86,6 +43,7 @@ class Account < ApplicationRecord
schema: SETTINGS_PARAMS_SCHEMA,
attribute_resolver: ->(record) { record.settings }
validate :validate_reporting_timezone
+ validate :validate_support_email_format, if: :will_save_change_to_support_email?
store_accessor :settings, :auto_resolve_after, :auto_resolve_message, :auto_resolve_ignore_waiting
@@ -223,6 +181,16 @@ class Account < ApplicationRecord
errors.add(:reporting_timezone, I18n.t('errors.account.reporting_timezone.invalid'))
end
+ def validate_support_email_format
+ value = attributes['support_email']
+ return if value.blank?
+
+ parsed = Mail::Address.new(value).address
+ errors.add(:support_email, I18n.t('errors.account.support_email.invalid')) if parsed.blank?
+ rescue Mail::Field::ParseError, Mail::Field::IncompleteParseError
+ errors.add(:support_email, I18n.t('errors.account.support_email.invalid'))
+ end
+
def remove_account_sequences
ActiveRecord::Base.connection.exec_query("drop sequence IF EXISTS camp_dpid_seq_#{id}")
ActiveRecord::Base.connection.exec_query("drop sequence IF EXISTS conv_dpid_seq_#{id}")
diff --git a/app/models/concerns/account_settings_schema.rb b/app/models/concerns/account_settings_schema.rb
new file mode 100644
index 000000000..52e1c2811
--- /dev/null
+++ b/app/models/concerns/account_settings_schema.rb
@@ -0,0 +1,47 @@
+module AccountSettingsSchema
+ extend ActiveSupport::Concern
+
+ SETTINGS_PARAMS_SCHEMA = {
+ 'type': 'object',
+ 'properties':
+ {
+ 'auto_resolve_after': { 'type': %w[integer null], 'minimum': 10, 'maximum': 1_439_856 },
+ 'auto_resolve_message': { 'type': %w[string null] },
+ 'auto_resolve_ignore_waiting': { 'type': %w[boolean null] },
+ 'audio_transcriptions': { 'type': %w[boolean null] },
+ 'auto_resolve_label': { 'type': %w[string null] },
+ 'keep_pending_on_bot_failure': { 'type': %w[boolean null] },
+ 'captain_auto_resolve_mode': { 'type': %w[string null], 'enum': ['evaluated', 'legacy', 'disabled', nil] },
+ 'conversation_required_attributes': {
+ 'type': %w[array null],
+ 'items': { 'type': 'string' }
+ },
+ 'captain_models': {
+ 'type': %w[object null],
+ 'properties': {
+ 'editor': { 'type': %w[string null] },
+ 'assistant': { 'type': %w[string null] },
+ 'copilot': { 'type': %w[string null] },
+ 'label_suggestion': { 'type': %w[string null] },
+ 'audio_transcription': { 'type': %w[string null] },
+ 'help_center_search': { 'type': %w[string null] }
+ },
+ 'additionalProperties': false
+ },
+ 'captain_features': {
+ 'type': %w[object null],
+ 'properties': {
+ 'editor': { 'type': %w[boolean null] },
+ 'assistant': { 'type': %w[boolean null] },
+ 'copilot': { 'type': %w[boolean null] },
+ 'label_suggestion': { 'type': %w[boolean null] },
+ 'audio_transcription': { 'type': %w[boolean null] },
+ 'help_center_search': { 'type': %w[boolean null] }
+ },
+ 'additionalProperties': false
+ }
+ },
+ 'required': [],
+ 'additionalProperties': true
+ }.to_json.freeze
+end
diff --git a/app/models/concerns/email_address_parseable.rb b/app/models/concerns/email_address_parseable.rb
new file mode 100644
index 000000000..7cca4a577
--- /dev/null
+++ b/app/models/concerns/email_address_parseable.rb
@@ -0,0 +1,15 @@
+module EmailAddressParseable
+ extend ActiveSupport::Concern
+
+ private
+
+ def parse_email(email_string)
+ Mail::Address.new(email_string).address.presence || default_sender_email_address
+ rescue Mail::Field::ParseError, Mail::Field::IncompleteParseError
+ default_sender_email_address
+ end
+
+ def default_sender_email_address
+ Mail::Address.new(ENV.fetch('MAILER_SENDER_EMAIL', 'accounts@chatwoot.com')).address
+ end
+end
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 1cb3c4d12..057f41b81 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -51,6 +51,8 @@ en:
account:
reporting_timezone:
invalid: is not a valid timezone
+ support_email:
+ invalid: is not a valid email address
validations:
presence: must not be blank
webhook:
diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb
index e010a3123..76dbbcba2 100644
--- a/spec/models/account_spec.rb
+++ b/spec/models/account_spec.rb
@@ -256,6 +256,29 @@ RSpec.describe Account do
end
end
+ context 'when support_email is set' do
+ it 'allows a plain email address' do
+ account.support_email = 'support@example.com'
+ expect(account).to be_valid
+ end
+
+ it 'allows display-name format' do
+ account.support_email = 'Support Team '
+ expect(account).to be_valid
+ end
+
+ it 'allows blank values' do
+ account.support_email = ''
+ expect(account).to be_valid
+ end
+
+ it 'rejects malformed strings with no email part' do
+ account.support_email = 'Smith Smith'
+ expect(account).not_to be_valid
+ expect(account.errors[:support_email]).to include(I18n.t('errors.account.support_email.invalid'))
+ end
+ end
+
context 'when reporting_timezone is set' do
it 'allows valid timezone names' do
account.reporting_timezone = 'America/New_York'
From f422c83c26f70efb66ab56cde554da4aaa03234b Mon Sep 17 00:00:00 2001
From: Muhsin Keloth
Date: Mon, 13 Apr 2026 20:28:09 +0400
Subject: [PATCH 42/53] feat: Add unified Call model for voice calling (#14026)
Adds a Call model to track voice call state across providers (Twilio,
WhatsApp). This replaces storing call data in
conversation.additional_attributes and provides a foundation for call
analytics multi-call-per-conversation support, and future voice
providers.
---------
Co-authored-by: Muhsin <12408980+muhsin-k@users.noreply.github.com>
---
app/models/message.rb | 1 +
db/migrate/20260408170902_create_calls.rb | 34 ++++++++++++
db/schema.rb | 24 ++++++++
enterprise/app/models/call.rb | 55 +++++++++++++++++++
.../app/models/enterprise/concerns/account.rb | 1 +
.../enterprise/concerns/conversation.rb | 1 +
.../app/models/enterprise/concerns/inbox.rb | 1 +
.../app/models/enterprise/concerns/message.rb | 7 +++
8 files changed, 124 insertions(+)
create mode 100644 db/migrate/20260408170902_create_calls.rb
create mode 100644 enterprise/app/models/call.rb
create mode 100644 enterprise/app/models/enterprise/concerns/message.rb
diff --git a/app/models/message.rb b/app/models/message.rb
index 730d3e025..ccbb250c3 100644
--- a/app/models/message.rb
+++ b/app/models/message.rb
@@ -450,3 +450,4 @@ class Message < ApplicationRecord
end
Message.prepend_mod_with('Message')
+Message.include_mod_with('Concerns::Message')
diff --git a/db/migrate/20260408170902_create_calls.rb b/db/migrate/20260408170902_create_calls.rb
new file mode 100644
index 000000000..3b073b4df
--- /dev/null
+++ b/db/migrate/20260408170902_create_calls.rb
@@ -0,0 +1,34 @@
+class CreateCalls < ActiveRecord::Migration[7.0]
+ def change
+ create_table :calls do |t|
+ t.bigint :account_id, null: false
+ t.bigint :inbox_id, null: false
+ t.bigint :conversation_id, null: false
+ t.bigint :contact_id, null: false
+ t.bigint :message_id
+ t.bigint :accepted_by_agent_id
+ t.string :provider_call_id, null: false
+ t.integer :provider, null: false, default: 0
+ t.integer :direction, null: false
+ t.string :status, null: false, default: 'ringing'
+ t.datetime :started_at
+ t.integer :duration_seconds
+ t.string :end_reason
+ t.jsonb :meta, default: {}
+ t.text :transcript
+
+ t.timestamps
+ end
+
+ add_call_indexes
+ end
+
+ private
+
+ def add_call_indexes
+ add_index :calls, [:provider, :provider_call_id], unique: true
+ add_index :calls, [:account_id, :conversation_id]
+ add_index :calls, [:account_id, :contact_id]
+ add_index :calls, :message_id
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 0067f36ff..360bddb69 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -261,6 +261,30 @@ ActiveRecord::Schema[7.1].define(version: 2026_04_09_091202) do
t.index ["account_id"], name: "index_automation_rules_on_account_id"
end
+ create_table "calls", force: :cascade do |t|
+ t.bigint "account_id", null: false
+ t.bigint "inbox_id", null: false
+ t.bigint "conversation_id", null: false
+ t.bigint "contact_id", null: false
+ t.bigint "message_id"
+ t.bigint "accepted_by_agent_id"
+ t.string "provider_call_id", null: false
+ t.integer "provider", default: 0, null: false
+ t.integer "direction", null: false
+ t.string "status", default: "ringing", null: false
+ t.datetime "started_at"
+ t.integer "duration_seconds"
+ t.string "end_reason"
+ t.jsonb "meta", default: {}
+ t.text "transcript"
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.index ["account_id", "contact_id"], name: "index_calls_on_account_id_and_contact_id"
+ t.index ["account_id", "conversation_id"], name: "index_calls_on_account_id_and_conversation_id"
+ t.index ["message_id"], name: "index_calls_on_message_id"
+ t.index ["provider", "provider_call_id"], name: "index_calls_on_provider_and_provider_call_id", unique: true
+ end
+
create_table "campaigns", force: :cascade do |t|
t.integer "display_id", null: false
t.string "title", null: false
diff --git a/enterprise/app/models/call.rb b/enterprise/app/models/call.rb
new file mode 100644
index 000000000..9864a4167
--- /dev/null
+++ b/enterprise/app/models/call.rb
@@ -0,0 +1,55 @@
+# == Schema Information
+#
+# Table name: calls
+#
+# id :bigint not null, primary key
+# direction :integer not null
+# duration_seconds :integer
+# end_reason :string
+# meta :jsonb
+# provider :integer default("twilio"), not null
+# started_at :datetime
+# status :string default("ringing"), not null
+# transcript :text
+# created_at :datetime not null
+# updated_at :datetime not null
+# accepted_by_agent_id :bigint
+# account_id :bigint not null
+# contact_id :bigint not null
+# conversation_id :bigint not null
+# inbox_id :bigint not null
+# message_id :bigint
+# provider_call_id :string not null
+#
+# Indexes
+#
+# index_calls_on_account_id_and_contact_id (account_id,contact_id)
+# index_calls_on_account_id_and_conversation_id (account_id,conversation_id)
+# index_calls_on_message_id (message_id)
+# index_calls_on_provider_and_provider_call_id (provider,provider_call_id) UNIQUE
+#
+class Call < ApplicationRecord
+ # All valid call statuses
+ STATUSES = %w[ringing in_progress completed no_answer failed].freeze
+ # Statuses where the call is finished and won't change again
+ TERMINAL_STATUSES = %w[completed no_answer failed].freeze
+
+ enum :provider, { twilio: 0, whatsapp: 1 }
+ enum :direction, { incoming: 0, outgoing: 1 }
+
+ belongs_to :account
+ belongs_to :inbox
+ belongs_to :conversation
+ belongs_to :contact
+ belongs_to :message, optional: true
+ belongs_to :accepted_by_agent, class_name: 'User', optional: true
+
+ has_one_attached :recording
+
+ validates :provider_call_id, presence: true
+ validates :provider, presence: true
+ validates :direction, presence: true
+ validates :status, presence: true, inclusion: { in: STATUSES }
+
+ scope :active, -> { where.not(status: TERMINAL_STATUSES) }
+end
diff --git a/enterprise/app/models/enterprise/concerns/account.rb b/enterprise/app/models/enterprise/concerns/account.rb
index 01693ac79..427b5245b 100644
--- a/enterprise/app/models/enterprise/concerns/account.rb
+++ b/enterprise/app/models/enterprise/concerns/account.rb
@@ -17,6 +17,7 @@ module Enterprise::Concerns::Account
has_many :copilot_threads, dependent: :destroy_async
has_many :companies, dependent: :destroy_async
has_many :voice_channels, dependent: :destroy_async, class_name: '::Channel::Voice'
+ has_many :calls, dependent: :destroy_async
has_one :saml_settings, dependent: :destroy_async, class_name: 'AccountSamlSettings'
end
diff --git a/enterprise/app/models/enterprise/concerns/conversation.rb b/enterprise/app/models/enterprise/concerns/conversation.rb
index 057a30d1d..0f7595e0d 100644
--- a/enterprise/app/models/enterprise/concerns/conversation.rb
+++ b/enterprise/app/models/enterprise/concerns/conversation.rb
@@ -5,6 +5,7 @@ module Enterprise::Concerns::Conversation
belongs_to :sla_policy, optional: true
has_one :applied_sla, dependent: :destroy_async
has_many :sla_events, dependent: :destroy_async
+ has_many :calls, dependent: :destroy_async
has_many :captain_responses, class_name: 'Captain::AssistantResponse', dependent: :nullify, as: :documentable
before_validation :validate_sla_policy, if: -> { sla_policy_id_changed? }
around_save :ensure_applied_sla_is_created, if: -> { sla_policy_id_changed? }
diff --git a/enterprise/app/models/enterprise/concerns/inbox.rb b/enterprise/app/models/enterprise/concerns/inbox.rb
index 0de61db23..bdcd0fd63 100644
--- a/enterprise/app/models/enterprise/concerns/inbox.rb
+++ b/enterprise/app/models/enterprise/concerns/inbox.rb
@@ -7,5 +7,6 @@ module Enterprise::Concerns::Inbox
through: :captain_inbox,
class_name: 'Captain::Assistant'
has_many :inbox_capacity_limits, dependent: :destroy
+ has_many :calls, dependent: :destroy_async
end
end
diff --git a/enterprise/app/models/enterprise/concerns/message.rb b/enterprise/app/models/enterprise/concerns/message.rb
new file mode 100644
index 000000000..cfdea430b
--- /dev/null
+++ b/enterprise/app/models/enterprise/concerns/message.rb
@@ -0,0 +1,7 @@
+module Enterprise::Concerns::Message
+ extend ActiveSupport::Concern
+
+ included do
+ has_one :call, dependent: :nullify
+ end
+end
From a8c8b38f51f0f6c4e92792d8a2d3ef0cc73f43e0 Mon Sep 17 00:00:00 2001
From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Date: Mon, 13 Apr 2026 23:23:25 +0530
Subject: [PATCH 43/53] fix: create article on title blur instead of debounce
(#14037)
---
.../Pages/ArticleEditorPage/ArticleEditor.vue | 27 ++++++++++++-------
.../pages/PortalsArticlesNewPage.vue | 4 +--
2 files changed, 19 insertions(+), 12 deletions(-)
diff --git a/app/javascript/dashboard/components-next/HelpCenter/Pages/ArticleEditorPage/ArticleEditor.vue b/app/javascript/dashboard/components-next/HelpCenter/Pages/ArticleEditorPage/ArticleEditor.vue
index 4c4d95f0c..bdc6a56cb 100644
--- a/app/javascript/dashboard/components-next/HelpCenter/Pages/ArticleEditorPage/ArticleEditor.vue
+++ b/app/javascript/dashboard/components-next/HelpCenter/Pages/ArticleEditorPage/ArticleEditor.vue
@@ -1,5 +1,5 @@
@@ -122,6 +128,7 @@ const previewArticle = () => {
custom-text-area-wrapper-class="border-0 !bg-transparent dark:!bg-transparent !py-0 !px-0"
placeholder="Title"
autofocus
+ @blur="handleCreateArticle"
/>
{
if (title) article.value.title = title;
if (content) article.value.content = content;
- if (!article.value.title) return;
+ if (!article.value.title || isUpdating.value) return;
isUpdating.value = true;
try {
@@ -86,7 +86,7 @@ const goBackToArticles = () => {
:article="article"
:is-updating="isUpdating"
:is-saved="isSaved"
- @save-article="createNewArticle"
+ @create-article="createNewArticle"
@go-back="goBackToArticles"
@set-author="setAuthorId"
@set-category="setCategoryId"
From 288c1cb757b97e8a8862b793ed4f6053a629144d Mon Sep 17 00:00:00 2001
From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Date: Tue, 14 Apr 2026 13:45:34 +0530
Subject: [PATCH 44/53] fix: Respect app direction for incoming email content
(#14011)
---
.../components-next/message/bubbles/Email/Index.vue | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/app/javascript/dashboard/components-next/message/bubbles/Email/Index.vue b/app/javascript/dashboard/components-next/message/bubbles/Email/Index.vue
index 7a4164ded..3d29f3284 100644
--- a/app/javascript/dashboard/components-next/message/bubbles/Email/Index.vue
+++ b/app/javascript/dashboard/components-next/message/bubbles/Email/Index.vue
@@ -226,4 +226,10 @@ const handleSeeOriginal = () => {
}
}
}
+
+// Email clients (Gmail, Outlook) hardcode dir="ltr" on wrapper elements.
+// In RTL apps this forces email content LTR regardless of actual text.
+[dir='rtl'] .letter-render [dir='ltr'] {
+ direction: inherit;
+}
From b7b6e67df79e2353945cf3b97fde7b9f631e17aa Mon Sep 17 00:00:00 2001
From: Petterson <58094725+hahuma@users.noreply.github.com>
Date: Tue, 14 Apr 2026 09:06:10 -0300
Subject: [PATCH 45/53] fix(captain): localize AI summary to account language
(#13790)
AI-generated summaries now respect the account's language setting.
Previously, summaries were always returned in English regardless of the
user's configured language, making section headings like "Customer
Intent" and "Action Items" appear in English even for non-English
accounts.
Previous behavior:
Current Behavior:
## What changed
- Added explicit account locale to the AI system prompt in
`Captain::SummaryService`
- Updated the summary prompt template to instruct the model to translate
section headings
## How to test
1. Configure an account with a non-English language (e.g., Portuguese)
2. Open a conversation with messages
3. Use the Copilot "Summarize" feature
4. Verify that section headings ("Customer Intent", "Conversation
Summary", etc.) appear in the account's language
---------
Co-authored-by: Aakash Bakhle <48802744+aakashb95@users.noreply.github.com>
---
lib/captain/summary_service.rb | 10 +++++++++-
lib/integrations/openai/openai_prompts/summary.liquid | 2 +-
spec/lib/captain/summary_service_spec.rb | 3 ++-
3 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/lib/captain/summary_service.rb b/lib/captain/summary_service.rb
index 16ee57b51..030c0e510 100644
--- a/lib/captain/summary_service.rb
+++ b/lib/captain/summary_service.rb
@@ -5,7 +5,7 @@ class Captain::SummaryService < Captain::BaseTaskService
make_api_call(
model: GPT_MODEL,
messages: [
- { role: 'system', content: prompt_from_file('summary') },
+ { role: 'system', content: system_prompt },
{ role: 'user', content: conversation.to_llm_text(include_contact_details: false) }
]
)
@@ -13,6 +13,14 @@ class Captain::SummaryService < Captain::BaseTaskService
private
+ def system_prompt
+ <<~PROMPT
+ #{prompt_from_file('summary')}
+
+ Reply in #{account.locale_english_name}.
+ PROMPT
+ end
+
def event_name
'summarize'
end
diff --git a/lib/integrations/openai/openai_prompts/summary.liquid b/lib/integrations/openai/openai_prompts/summary.liquid
index 4ec5ffd5b..1ac05419a 100644
--- a/lib/integrations/openai/openai_prompts/summary.liquid
+++ b/lib/integrations/openai/openai_prompts/summary.liquid
@@ -17,7 +17,7 @@ Make sure you strongly adhere to the following rules when generating the summary
13. Do not insert your own opinions about the conversation.
-Reply in the user's language, as a markdown of the following format.
+Use markdown with the following format. Translate all section headings to match the reply language:
**Customer Intent**
diff --git a/spec/lib/captain/summary_service_spec.rb b/spec/lib/captain/summary_service_spec.rb
index 6da3f122b..c5ec50687 100644
--- a/spec/lib/captain/summary_service_spec.rb
+++ b/spec/lib/captain/summary_service_spec.rb
@@ -35,7 +35,8 @@ RSpec.describe Captain::SummaryService do
expect(service).to receive(:make_api_call) do |args|
expect(args[:messages].length).to eq(2)
expect(args[:messages][0][:role]).to eq('system')
- expect(args[:messages][0][:content]).to eq('Summarize this')
+ expect(args[:messages][0][:content]).to include('Summarize this')
+ expect(args[:messages][0][:content]).to include("Reply in #{account.locale_english_name}")
expect(args[:messages][1][:role]).to eq('user')
expect(args[:messages][1][:content]).to be_a(String)
{ message: 'Summary' }
From 72c9e1775bba9733927c2e7f07a737f32d80e491 Mon Sep 17 00:00:00 2001
From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Date: Tue, 14 Apr 2026 18:18:38 +0530
Subject: [PATCH 46/53] fix: Prevent article editor from resetting content
while typing (#14014)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
# Pull Request Template
## Description
### Description
This PR fixes an issue where the editor would reset content and move the
cursor while typing. The issue was caused by a dual debounce setup
(400ms + 2500ms) that saved content and then overwrote local state with
stale API responses while the user was still typing.
### What changed
* Editor now uses local state (`localTitle`, `localContent`) as the
source of truth while editing
* Vuex store is only used on initial load or navigation
* Replaced dual debounce with a single 500ms debounce (fewer API calls)
* `UPDATE_ARTICLE` now merges updates instead of replacing the article
* Prevents status changes from wiping unsaved content
* Removed `updateAsync` for a simpler update flow
### How it works
User types
→ local ref updates immediately (editor reads from this)
→ 500ms debounce triggers
→ dispatches `articles/update`
→ API persists the change
→ on success: store merges the response (used by other components)
→ editor remains unaffected (continues using local state)
Fixes
https://linear.app/chatwoot/issue/CW-6727/better-syncing-of-content-the-editor-randomly-updates-the-content
## Type of change
- [x] Bug fix (non-breaking change which fixes an issue)
## How Has This Been Tested?
1. Open any Help Center article for editing
2. Type continuously for a few seconds — content should not reset or
jump
3. Change article status (publish/archive/draft) while editing — content
should remain intact
4. Test on a slow network (use DevTools throttling) — typing should
remain smooth
## 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
---
.../Pages/ArticleEditorPage/ArticleEditor.vue | 42 ++++++++-----------
.../pages/PortalsArticlesEditPage.vue | 10 +----
.../modules/helpCenterArticles/actions.js | 27 +-----------
.../modules/helpCenterArticles/mutations.js | 8 ++--
4 files changed, 25 insertions(+), 62 deletions(-)
diff --git a/app/javascript/dashboard/components-next/HelpCenter/Pages/ArticleEditorPage/ArticleEditor.vue b/app/javascript/dashboard/components-next/HelpCenter/Pages/ArticleEditorPage/ArticleEditor.vue
index bdc6a56cb..2f06ea01e 100644
--- a/app/javascript/dashboard/components-next/HelpCenter/Pages/ArticleEditorPage/ArticleEditor.vue
+++ b/app/javascript/dashboard/components-next/HelpCenter/Pages/ArticleEditorPage/ArticleEditor.vue
@@ -1,5 +1,5 @@
@@ -194,10 +254,26 @@ export default {
+
{{ contact.name }}
+
onFieldUpdate('email', value)"
/>
onFieldUpdate('phone_number', value)"
/>
+ updateContactField({
+ additional_attributes: {
+ ...additionalAttributes,
+ company_name: value,
+ },
+ })
+ "
/>
{
+ this.$refs.editInput?.focus();
+ });
+ },
+ saveEdit() {
+ if (!this.isEditing) return;
+ this.isEditing = false;
+ const trimmed = this.editValue.trim();
+ if (trimmed !== (this.value || '')) {
+ this.$emit('update', trimmed);
+ }
+ },
+ cancelEdit() {
+ this.isEditing = false;
+ },
},
};
-
+
diff --git a/app/javascript/dashboard/store/modules/contacts/actions.js b/app/javascript/dashboard/store/modules/contacts/actions.js
index d7f87b776..d0029207e 100644
--- a/app/javascript/dashboard/store/modules/contacts/actions.js
+++ b/app/javascript/dashboard/store/modules/contacts/actions.js
@@ -36,7 +36,11 @@ const buildContactFormData = contactParams => {
export const handleContactOperationErrors = error => {
if (error.response?.status === 422) {
- throw new DuplicateContactException(error.response.data.attributes);
+ const exception = new DuplicateContactException(
+ error.response.data.attributes
+ );
+ exception.message = error.response.data.message || exception.message;
+ throw exception;
} else if (error.response?.data?.message) {
throw new ExceptionWithMessage(error.response.data.message);
} else {
diff --git a/app/javascript/shared/helpers/CustomErrors.js b/app/javascript/shared/helpers/CustomErrors.js
index 4f31eb291..ef5947189 100644
--- a/app/javascript/shared/helpers/CustomErrors.js
+++ b/app/javascript/shared/helpers/CustomErrors.js
@@ -1,10 +1,19 @@
/* eslint-disable max-classes-per-file */
export class DuplicateContactException extends Error {
+ static DEFAULT_MESSAGE = 'DUPLICATE_CONTACT';
+
constructor(data) {
- super('DUPLICATE_CONTACT');
+ super(DuplicateContactException.DEFAULT_MESSAGE);
this.data = data;
this.name = 'DuplicateContactException';
}
+
+ /** Server or client may assign `message` after construction; otherwise still DEFAULT_MESSAGE. */
+ get contactErrorDetail() {
+ return this.message === DuplicateContactException.DEFAULT_MESSAGE
+ ? null
+ : this.message;
+ }
}
export class ExceptionWithMessage extends Error {
constructor(data) {
From 8e5d4f4d2322f1282e94b175be06bf16ddd7016c Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 15 Apr 2026 00:44:54 +0530
Subject: [PATCH 48/53] chore(deps): bump axios from 1.13.6 to 1.15.0 (#14051)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Bumps [axios](https://github.com/axios/axios) from 1.13.6 to 1.15.0.
Release notes
Sourced from axios's
releases .
v1.15.0
This release delivers two critical security patches, adds runtime
support for Deno and Bun, and includes significant CI hardening,
documentation improvements, and routine dependency updates.
⚠️ Important Changes
Deprecation: url.parse() usage has
been replaced to address Node.js deprecation warnings. If you are on a
recent version of Node.js, this resolves console warnings you may have
been seeing. (#10625 )
🔒 Security Fixes
Proxy Handling: Fixed a no_proxy
hostname normalisation bypass that could lead to Server-Side Request
Forgery (SSRF). (#10661 )
Header Injection: Fixed an unrestricted cloud
metadata exfiltration vulnerability via a header injection chain.
(#10660 )
🚀 New Features
Runtime Support: Added compatibility checks and
documentation for Deno and Bun environments. (#10652 ,
#10653 )
🔧 Maintenance & Chores
CI Security: Hardened workflow permissions to least
privilege, added the zizmor security scanner, pinned action
versions, and gated npm publishing with OIDC and environment protection.
(#10618 ,
#10619 ,
#10627 ,
#10637 ,
#10666 )
Dependencies: Bumped
serialize-javascript, handlebars,
picomatch, vite, and
denoland/setup-deno to latest versions. Added a 7-day
Dependabot cooldown period. (#10574 ,
#10572 ,
#10568 ,
#10663 ,
#10664 ,
#10665 ,
#10669 ,
#10670 ,
#10616 )
Documentation: Unified docs, improved
beforeRedirect credential leakage example, clarified
withCredentials/withXSRFToken behaviour,
HTTP/2 support notes, async/await timeout error handling, header case
preservation, and various typo fixes. (#10649 ,
#10624 ,
#7452 ,
#7471 ,
#10654 ,
#10644 ,
#10589 )
Housekeeping: Removed stale files, regenerated
lockfile, and updated sponsor scripts and blocks. (#10584 ,
#10650 ,
#10582 ,
#10640 ,
#10659 ,
#10668 )
Tests: Added regression coverage for urlencoded
Content-Type casing. (#10573 )
🌟 New Contributors
We are thrilled to welcome our new contributors. Thank you for
helping improve Axios:
v1.14.0
This release focuses on compatibility fixes, adapter stability
improvements, and test/tooling modernisation.
⚠️ Important Changes
Breaking Changes: None identified in this
release.
Action Required: If you rely on env-based proxy
behaviour or CJS resolution edge-cases, validate your integration after
upgrade (notably proxy-from-env v2 alignment and
main entry compatibility fix).
🚀 New Features
Runtime Features: No new end-user features were
introduced in this release.
Test Coverage Expansion: Added broader smoke/module
test coverage for CJS and ESM package usage. (#7510 )
🐛 Bug Fixes
Headers: Trim trailing CRLF in normalised header
values. (#7456 )
HTTP/2: Close detached HTTP/2 sessions on timeout
to avoid lingering sessions. (#7457 )
Fetch Adapter: Cancel ReadableStream
created during request-stream capability probing to prevent async
resource leaks. (#7515 )
Proxy Handling: Fixed env proxy behavior with
proxy-from-env v2 usage. (#7499 )
... (truncated)
Changelog
Sourced from axios's
changelog .
Changelog
1.13.3
(2026-01-20)
Bug Fixes
http2: Use port 443 for HTTPS connections by
default. (#7256 )
(d7e6065 )
interceptor: handle the error in the same
interceptor (#6269 )
(5945e40 )
main field in package.json should correspond to cjs artifacts (#5756 )
(7373fbf )
package.json: add 'bun' package.json 'exports'
condition. Load the Node.js build in Bun instead of the browser build
(#5754 )
(b89217e )
silentJSONParsing=false should throw on invalid JSON (#7253 )
(#7257 )
(7d19335 )
turn AxiosError into a native error (#5394 )
(#5558 )
(1c6a86d )
types: add handlers to AxiosInterceptorManager
interface (#5551 )
(8d1271b )
types: restore AxiosError.cause type from unknown
to Error (#7327 )
(d8233d9 )
unclear error message is thrown when specifying an empty proxy
authorization (#6314 )
(6ef867e )
Features
Reverts
Revert "fix: silentJSONParsing=false should throw on invalid
JSON (#7253 )
(#7 …"
(#7298 )
(a4230f5 ),
closes #7253 #7 #7298
deps: bump peter-evans/create-pull-request from 7
to 8 in the github-actions group (#7334 )
(2d6ad5e )
Contributors to this release
... (truncated)
Commits
772a4e5
chore(release): prepare release 1.15.0 (#10671 )
4b07137
chore(deps-dev): bump vite from 8.0.0 to 8.0.5 in /tests/smoke/esm (#10663 )
51e57b3
chore(deps-dev): bump vite from 8.0.2 to 8.0.5 (#10664 )
fba1a77
chore(deps-dev): bump vite from 8.0.2 to 8.0.5 in /tests/module/esm (#10665 )
0bf6e28
chore(deps): bump denoland/setup-deno in the github-actions group (#10669 )
8107157
chore(deps-dev): bump the development_dependencies group with 4 updates
(#10670 )
e66530e
ci: require npm-publish environment for releases (#10666 )
49f23cb
chore(sponsor): update sponsor block (#10668 )
3631854
fix: unrestricted cloud metadata exfiltration via header injection chain
(#10 ...
fb3befb
fix: no_proxy hostname normalization bypass leads to ssrf (#10661 )
Additional commits viewable in compare
view
Install script changes
This version modifies prepare script that runs during
installation. Review the package contents before updating.
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/chatwoot/chatwoot/network/alerts).
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
---
package.json | 2 +-
pnpm-lock.yaml | 21 +++++++++++----------
2 files changed, 12 insertions(+), 11 deletions(-)
diff --git a/package.json b/package.json
index ddb6c09cc..c8e511be2 100644
--- a/package.json
+++ b/package.json
@@ -59,7 +59,7 @@
"@vueuse/components": "^12.0.0",
"@vueuse/core": "^12.0.0",
"activestorage": "^5.2.6",
- "axios": "^1.13.6",
+ "axios": "^1.15.0",
"camelcase-keys": "^9.1.3",
"chart.js": "~4.4.4",
"color2k": "^2.0.2",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index cb4b2b148..818698372 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -101,8 +101,8 @@ importers:
specifier: ^5.2.6
version: 5.2.8
axios:
- specifier: ^1.13.6
- version: 1.13.6
+ specifier: ^1.15.0
+ version: 1.15.0
camelcase-keys:
specifier: ^9.1.3
version: 9.1.3
@@ -1546,7 +1546,7 @@ packages:
'@xmldom/xmldom@0.7.13':
resolution: {integrity: sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==}
engines: {node: '>=10.0.0'}
- deprecated: this version is no longer supported, please update to at least 0.8.*
+ deprecated: this version has critical issues, please update to the latest version
abab@2.0.6:
resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==}
@@ -1716,8 +1716,8 @@ packages:
resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
engines: {node: '>= 0.4'}
- axios@1.13.6:
- resolution: {integrity: sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==}
+ axios@1.15.0:
+ resolution: {integrity: sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==}
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
@@ -3865,8 +3865,9 @@ packages:
proto-list@1.2.4:
resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==}
- proxy-from-env@1.1.0:
- resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
+ proxy-from-env@2.1.0:
+ resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==}
+ engines: {node: '>=10'}
psl@1.9.0:
resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==}
@@ -6349,11 +6350,11 @@ snapshots:
dependencies:
possible-typed-array-names: 1.0.0
- axios@1.13.6:
+ axios@1.15.0:
dependencies:
follow-redirects: 1.15.11
form-data: 4.0.5
- proxy-from-env: 1.1.0
+ proxy-from-env: 2.1.0
transitivePeerDependencies:
- debug
@@ -8793,7 +8794,7 @@ snapshots:
proto-list@1.2.4: {}
- proxy-from-env@1.1.0: {}
+ proxy-from-env@2.1.0: {}
psl@1.9.0: {}
From 3f9f054c431ff4272e91048e9d9d0df7a6a68451 Mon Sep 17 00:00:00 2001
From: Tanmay Deep Sharma <32020192+tds-1@users.noreply.github.com>
Date: Wed, 15 Apr 2026 13:42:48 +0700
Subject: [PATCH 49/53] fix: drop WhatsApp incoming messages from blocked
contacts (#14061)
## Linear ticket
https://linear.app/chatwoot/issue/CW-6839/blocked-contact-can-still-send-messages-to-whatsapp-inbox
## Description
Drop WhatsApp incoming messages from blocked contacts
## Type of change
- [ ] Bug fix (non-breaking change which fixes an issue)
## How Has This Been Tested?
- Incoming messages for blocked contacts
## Checklist:
- [ ] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] 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
---
app/services/whatsapp/incoming_message_base_service.rb | 1 +
1 file changed, 1 insertion(+)
diff --git a/app/services/whatsapp/incoming_message_base_service.rb b/app/services/whatsapp/incoming_message_base_service.rb
index a8ad176b6..5449c4740 100644
--- a/app/services/whatsapp/incoming_message_base_service.rb
+++ b/app/services/whatsapp/incoming_message_base_service.rb
@@ -37,6 +37,7 @@ class Whatsapp::IncomingMessageBaseService
set_contact
return unless @contact
+ return if @contact.blocked? && !outgoing_echo
ActiveRecord::Base.transaction do
set_conversation
From b96bf41234d92d5467608a6ddc1978ea7b0ddc96 Mon Sep 17 00:00:00 2001
From: Sojan Jose
Date: Wed, 15 Apr 2026 17:03:39 +0530
Subject: [PATCH 50/53] chore: Enable Participating tab for conversations
(#11714)
## Summary
This PR enables the **Participating** conversation view in the main
sidebar and keeps the behavior aligned with existing conversation views.
## What changed
- Added **Participating** under Conversations in the new sidebar.
- Added a guard in conversation realtime `addConversation` flow so
generic `conversation.created` events are not injected while the user is
on Participating view.
- Added participating route mapping in conversation-list redirect helper
so list redirects resolve correctly to `/participating/conversations`.
## Scope notes
- Kept changes minimal and consistent with current `develop` behavior.
- No additional update-event filtering was added beyond what existing
views already do.
---------
Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Co-authored-by: iamsivin
---
.../components-next/sidebar/Sidebar.vue | 6 ++
.../dashboard/components/ChatList.vue | 36 ++++++++--
.../conversation/ConversationHeader.vue | 1 +
app/javascript/dashboard/constants/globals.js | 5 ++
app/javascript/dashboard/helper/URLHelper.js | 1 +
.../dashboard/helper/specs/URLHelper.spec.js | 9 +++
.../store/modules/conversations/actions.js | 3 +
.../store/modules/conversations/getters.js | 13 ++++
.../conversations/helpers/actionHelpers.js | 8 +++
.../helpers/specs/actionHelpers.spec.js | 22 +++++-
.../store/modules/conversations/index.js | 6 +-
.../specs/conversations/getters.spec.js | 67 +++++++++++++++++++
.../specs/conversations/mutations.spec.js | 48 ++++++++++++-
13 files changed, 216 insertions(+), 9 deletions(-)
diff --git a/app/javascript/dashboard/components-next/sidebar/Sidebar.vue b/app/javascript/dashboard/components-next/sidebar/Sidebar.vue
index d08147739..9fd25c481 100644
--- a/app/javascript/dashboard/components-next/sidebar/Sidebar.vue
+++ b/app/javascript/dashboard/components-next/sidebar/Sidebar.vue
@@ -250,6 +250,12 @@ const menuItems = computed(() => {
activeOn: ['conversation_through_mentions'],
to: accountScopedRoute('conversation_mentions'),
},
+ {
+ name: 'Participating',
+ label: t('SIDEBAR.PARTICIPATING_CONVERSATIONS'),
+ activeOn: ['conversation_through_participating'],
+ to: accountScopedRoute('conversation_participating'),
+ },
{
name: 'Unattended',
activeOn: ['conversation_through_unattended'],
diff --git a/app/javascript/dashboard/components/ChatList.vue b/app/javascript/dashboard/components/ChatList.vue
index eeb2ad6e7..f311de4b2 100644
--- a/app/javascript/dashboard/components/ChatList.vue
+++ b/app/javascript/dashboard/components/ChatList.vue
@@ -56,6 +56,7 @@ import { generateValuesForEditCustomViews } from 'dashboard/helper/customViewsHe
import { conversationListPageURL } from '../helper/URLHelper';
import {
isOnMentionsView,
+ isOnParticipatingView,
isOnUnattendedView,
} from '../store/modules/conversations/helpers/actionHelpers';
import {
@@ -113,6 +114,7 @@ const chatLists = useMapGetter('getFilteredConversations');
const mineChatsList = useMapGetter('getMineChats');
const allChatList = useMapGetter('getAllStatusChats');
const unAssignedChatsList = useMapGetter('getUnAssignedChats');
+const participatingChatsList = useMapGetter('getParticipatingChats');
const chatListLoading = useMapGetter('getChatListLoadingStatus');
const activeInbox = useMapGetter('getSelectedInbox');
const conversationStats = useMapGetter('conversationStats/getStats');
@@ -296,13 +298,15 @@ const pageTitle = computed(() => {
if (props.label) {
return `#${props.label}`;
}
- if (props.conversationType === 'mention') {
+ if (props.conversationType === wootConstants.CONVERSATION_TYPE.MENTION) {
return t('CHAT_LIST.MENTION_HEADING');
}
- if (props.conversationType === 'participating') {
+ if (
+ props.conversationType === wootConstants.CONVERSATION_TYPE.PARTICIPATING
+ ) {
return t('CONVERSATION_PARTICIPANTS.SIDEBAR_MENU_TITLE');
}
- if (props.conversationType === 'unattended') {
+ if (props.conversationType === wootConstants.CONVERSATION_TYPE.UNATTENDED) {
return t('CHAT_LIST.UNATTENDED_HEADING');
}
if (hasActiveFolders.value) {
@@ -311,12 +315,30 @@ const pageTitle = computed(() => {
return t('CHAT_LIST.TAB_HEADING');
});
+function filterByAssigneeTab(conversations) {
+ if (activeAssigneeTab.value === wootConstants.ASSIGNEE_TYPE.ME) {
+ return conversations.filter(
+ c => c.meta?.assignee?.id === currentUser.value?.id
+ );
+ }
+ if (activeAssigneeTab.value === wootConstants.ASSIGNEE_TYPE.UNASSIGNED) {
+ return conversations.filter(c => !c.meta?.assignee);
+ }
+ return [...conversations];
+}
+
const conversationList = computed(() => {
let localConversationList = [];
if (!hasAppliedFiltersOrActiveFolders.value) {
const filters = conversationFilters.value;
- if (activeAssigneeTab.value === 'me') {
+ if (
+ props.conversationType === wootConstants.CONVERSATION_TYPE.PARTICIPATING
+ ) {
+ localConversationList = filterByAssigneeTab(
+ participatingChatsList.value(filters)
+ );
+ } else if (activeAssigneeTab.value === 'me') {
localConversationList = [...mineChatsList.value(filters)];
} else if (activeAssigneeTab.value === 'unassigned') {
localConversationList = [...unAssignedChatsList.value(filters)];
@@ -637,9 +659,11 @@ function redirectToConversationList() {
let conversationType = '';
if (isOnMentionsView({ route: { name } })) {
- conversationType = 'mention';
+ conversationType = wootConstants.CONVERSATION_TYPE.MENTION;
+ } else if (isOnParticipatingView({ route: { name } })) {
+ conversationType = wootConstants.CONVERSATION_TYPE.PARTICIPATING;
} else if (isOnUnattendedView({ route: { name } })) {
- conversationType = 'unattended';
+ conversationType = wootConstants.CONVERSATION_TYPE.UNATTENDED;
}
router.push(
conversationListPageURL({
diff --git a/app/javascript/dashboard/components/widgets/conversation/ConversationHeader.vue b/app/javascript/dashboard/components/widgets/conversation/ConversationHeader.vue
index 55252d6da..4edfd643c 100644
--- a/app/javascript/dashboard/components/widgets/conversation/ConversationHeader.vue
+++ b/app/javascript/dashboard/components/widgets/conversation/ConversationHeader.vue
@@ -45,6 +45,7 @@ const backButtonUrl = computed(() => {
const conversationTypeMap = {
conversation_through_mentions: 'mention',
+ conversation_through_participating: 'participating',
conversation_through_unattended: 'unattended',
};
return conversationListPageURL({
diff --git a/app/javascript/dashboard/constants/globals.js b/app/javascript/dashboard/constants/globals.js
index 21303efcb..4fbc8174b 100644
--- a/app/javascript/dashboard/constants/globals.js
+++ b/app/javascript/dashboard/constants/globals.js
@@ -12,6 +12,11 @@ export default {
SNOOZED: 'snoozed',
ALL: 'all',
},
+ CONVERSATION_TYPE: {
+ MENTION: 'mention',
+ PARTICIPATING: 'participating',
+ UNATTENDED: 'unattended',
+ },
SORT_BY_TYPE: {
LAST_ACTIVITY_AT_ASC: 'last_activity_at_asc',
LAST_ACTIVITY_AT_DESC: 'last_activity_at_desc',
diff --git a/app/javascript/dashboard/helper/URLHelper.js b/app/javascript/dashboard/helper/URLHelper.js
index a4b3f32b4..76a5d8bd4 100644
--- a/app/javascript/dashboard/helper/URLHelper.js
+++ b/app/javascript/dashboard/helper/URLHelper.js
@@ -51,6 +51,7 @@ export const conversationListPageURL = ({
} else if (conversationType) {
const urlMap = {
mention: 'mentions/conversations',
+ participating: 'participating/conversations',
unattended: 'unattended/conversations',
};
url = `accounts/${accountId}/${urlMap[conversationType]}`;
diff --git a/app/javascript/dashboard/helper/specs/URLHelper.spec.js b/app/javascript/dashboard/helper/specs/URLHelper.spec.js
index 224a1df8b..cd7479509 100644
--- a/app/javascript/dashboard/helper/specs/URLHelper.spec.js
+++ b/app/javascript/dashboard/helper/specs/URLHelper.spec.js
@@ -40,6 +40,15 @@ describe('#URL Helpers', () => {
'/app/accounts/1/custom_view/1'
);
});
+
+ it('should return url to participating conversations', () => {
+ expect(
+ conversationListPageURL({
+ accountId: 1,
+ conversationType: 'participating',
+ })
+ ).toBe('/app/accounts/1/participating/conversations');
+ });
});
describe('conversationUrl', () => {
it('should return direct conversation URL if activeInbox is nil', () => {
diff --git a/app/javascript/dashboard/store/modules/conversations/actions.js b/app/javascript/dashboard/store/modules/conversations/actions.js
index c6a197d85..7ee2561c1 100644
--- a/app/javascript/dashboard/store/modules/conversations/actions.js
+++ b/app/javascript/dashboard/store/modules/conversations/actions.js
@@ -6,6 +6,7 @@ import { createPendingMessage } from 'dashboard/helper/commons';
import {
buildConversationList,
isOnMentionsView,
+ isOnParticipatingView,
isOnUnattendedView,
isOnFoldersView,
} from './helpers/actionHelpers';
@@ -371,6 +372,7 @@ const actions = {
!hasAppliedFilters &&
!isOnFoldersView(rootState) &&
!isOnMentionsView(rootState) &&
+ !isOnParticipatingView(rootState) &&
!isOnUnattendedView(rootState) &&
isMatchingInboxFilter
) {
@@ -395,6 +397,7 @@ const actions = {
const {
meta: { sender },
} = conversation;
+
commit(types.UPDATE_CONVERSATION, conversation);
dispatch('conversationLabels/setConversationLabel', {
diff --git a/app/javascript/dashboard/store/modules/conversations/getters.js b/app/javascript/dashboard/store/modules/conversations/getters.js
index 9f5744fbb..333009707 100644
--- a/app/javascript/dashboard/store/modules/conversations/getters.js
+++ b/app/javascript/dashboard/store/modules/conversations/getters.js
@@ -102,6 +102,19 @@ const getters = {
return isUnAssigned && shouldFilter;
});
},
+ getParticipatingChats: (_state, _, __, rootGetters) => activeFilters => {
+ const currentUserId = rootGetters.getCurrentUser?.id;
+ const getWatchers = rootGetters['conversationWatchers/getByConversationId'];
+ return _state.allConversations.filter(conversation => {
+ const watchers = getWatchers(conversation.id);
+ // Watchers are only loaded for the conversation open in the detail
+ // panel. If loaded and current user is not in them, filter it out.
+ if (watchers && !watchers.some(w => w.id === currentUserId)) {
+ return false;
+ }
+ return applyPageFilters(conversation, activeFilters);
+ });
+ },
getAllStatusChats: (_state, _, __, rootGetters) => activeFilters => {
const currentUser = rootGetters.getCurrentUser;
const currentUserId = rootGetters.getCurrentUser.id;
diff --git a/app/javascript/dashboard/store/modules/conversations/helpers/actionHelpers.js b/app/javascript/dashboard/store/modules/conversations/helpers/actionHelpers.js
index f1c594b26..8c5575c3a 100644
--- a/app/javascript/dashboard/store/modules/conversations/helpers/actionHelpers.js
+++ b/app/javascript/dashboard/store/modules/conversations/helpers/actionHelpers.js
@@ -30,6 +30,14 @@ export const isOnUnattendedView = ({ route: { name: routeName } }) => {
return UNATTENDED_ROUTES.includes(routeName);
};
+export const isOnParticipatingView = ({ route: { name: routeName } }) => {
+ const PARTICIPATING_ROUTES = [
+ 'conversation_participating',
+ 'conversation_through_participating',
+ ];
+ return PARTICIPATING_ROUTES.includes(routeName);
+};
+
export const isOnFoldersView = ({ route: { name: routeName } }) => {
const FOLDER_ROUTES = [
'folder_conversations',
diff --git a/app/javascript/dashboard/store/modules/conversations/helpers/specs/actionHelpers.spec.js b/app/javascript/dashboard/store/modules/conversations/helpers/specs/actionHelpers.spec.js
index 2dcf0b26b..e37a5b225 100644
--- a/app/javascript/dashboard/store/modules/conversations/helpers/specs/actionHelpers.spec.js
+++ b/app/javascript/dashboard/store/modules/conversations/helpers/specs/actionHelpers.spec.js
@@ -1,4 +1,8 @@
-import { isOnMentionsView, isOnFoldersView } from '../actionHelpers';
+import {
+ isOnMentionsView,
+ isOnFoldersView,
+ isOnParticipatingView,
+} from '../actionHelpers';
describe('#isOnMentionsView', () => {
it('return valid responses when passing the state', () => {
@@ -24,3 +28,19 @@ describe('#isOnFoldersView', () => {
);
});
});
+
+describe('#isOnParticipatingView', () => {
+ it('return valid responses when passing the state', () => {
+ expect(
+ isOnParticipatingView({ route: { name: 'conversation_participating' } })
+ ).toBe(true);
+ expect(
+ isOnParticipatingView({
+ route: { name: 'conversation_through_participating' },
+ })
+ ).toBe(true);
+ expect(
+ isOnParticipatingView({ route: { name: 'conversation_messages' } })
+ ).toBe(false);
+ });
+});
diff --git a/app/javascript/dashboard/store/modules/conversations/index.js b/app/javascript/dashboard/store/modules/conversations/index.js
index d7137694e..bffc2204a 100644
--- a/app/javascript/dashboard/store/modules/conversations/index.js
+++ b/app/javascript/dashboard/store/modules/conversations/index.js
@@ -258,7 +258,11 @@ export const mutations = {
emitter.emit(BUS_EVENTS.SCROLL_TO_MESSAGE);
}
} else {
- _state.allConversations.push(conversation);
+ const { conversationType } = _state.conversationFilters || {};
+ const { MENTION, PARTICIPATING } = wootConstants.CONVERSATION_TYPE;
+ if (![MENTION, PARTICIPATING].includes(conversationType)) {
+ _state.allConversations.push(conversation);
+ }
}
},
diff --git a/app/javascript/dashboard/store/modules/specs/conversations/getters.spec.js b/app/javascript/dashboard/store/modules/specs/conversations/getters.spec.js
index 7b6c38456..69bf9c2ac 100644
--- a/app/javascript/dashboard/store/modules/specs/conversations/getters.spec.js
+++ b/app/javascript/dashboard/store/modules/specs/conversations/getters.spec.js
@@ -183,6 +183,73 @@ describe('#getters', () => {
]);
});
});
+ describe('#getParticipatingChats', () => {
+ const conversationList = [
+ { id: 1, inbox_id: 2, status: 1, meta: { assignee: { id: 1 } } },
+ { id: 2, inbox_id: 2, status: 1, meta: {} },
+ { id: 3, inbox_id: 3, status: 1, meta: { assignee: { id: 2 } } },
+ ];
+
+ it('returns all conversations when watchers are not loaded', () => {
+ const state = {
+ allConversations: conversationList,
+ participatingConversationIds: {},
+ };
+ const rootGetters = {
+ getCurrentUser: { id: 1 },
+ 'conversationWatchers/getByConversationId': () => undefined,
+ };
+ const result = getters.getParticipatingChats(
+ state,
+ {},
+ {},
+ rootGetters
+ )({ status: 1 });
+ expect(result).toEqual(conversationList);
+ });
+
+ it('filters out conversation when watchers loaded and user not participating', () => {
+ const state = {
+ allConversations: conversationList,
+ participatingConversationIds: {},
+ };
+ const rootGetters = {
+ getCurrentUser: { id: 1 },
+ 'conversationWatchers/getByConversationId': id => {
+ if (id === 2) return [{ id: 3 }];
+ return undefined;
+ },
+ };
+ const result = getters.getParticipatingChats(
+ state,
+ {},
+ {},
+ rootGetters
+ )({ status: 1 });
+ expect(result).toEqual([conversationList[0], conversationList[2]]);
+ });
+
+ it('keeps conversation when watchers loaded and user is participating', () => {
+ const state = {
+ allConversations: conversationList,
+ participatingConversationIds: {},
+ };
+ const rootGetters = {
+ getCurrentUser: { id: 1 },
+ 'conversationWatchers/getByConversationId': id => {
+ if (id === 1) return [{ id: 1 }, { id: 2 }];
+ return undefined;
+ },
+ };
+ const result = getters.getParticipatingChats(
+ state,
+ {},
+ {},
+ rootGetters
+ )({ status: 1 });
+ expect(result).toEqual(conversationList);
+ });
+ });
describe('#getConversationById', () => {
it('get conversations based on id', () => {
const state = {
diff --git a/app/javascript/dashboard/store/modules/specs/conversations/mutations.spec.js b/app/javascript/dashboard/store/modules/specs/conversations/mutations.spec.js
index bd048dbba..fc1c61b35 100644
--- a/app/javascript/dashboard/store/modules/specs/conversations/mutations.spec.js
+++ b/app/javascript/dashboard/store/modules/specs/conversations/mutations.spec.js
@@ -786,9 +786,55 @@ describe('#mutations', () => {
});
});
- it('should add conversation if not found', () => {
+ it('should add conversation if not found on normal view', () => {
const state = {
allConversations: [],
+ conversationFilters: {},
+ };
+
+ const conversation = {
+ id: 1,
+ status: 'open',
+ };
+
+ mutations[types.UPDATE_CONVERSATION](state, conversation);
+ expect(state.allConversations).toEqual([conversation]);
+ });
+
+ it('should not add conversation if not found on participating view', () => {
+ const state = {
+ allConversations: [],
+ conversationFilters: { conversationType: 'participating' },
+ };
+
+ const conversation = {
+ id: 1,
+ status: 'open',
+ };
+
+ mutations[types.UPDATE_CONVERSATION](state, conversation);
+ expect(state.allConversations).toEqual([]);
+ });
+
+ it('should not add conversation if not found on mention view', () => {
+ const state = {
+ allConversations: [],
+ conversationFilters: { conversationType: 'mention' },
+ };
+
+ const conversation = {
+ id: 1,
+ status: 'open',
+ };
+
+ mutations[types.UPDATE_CONVERSATION](state, conversation);
+ expect(state.allConversations).toEqual([]);
+ });
+
+ it('should add conversation if not found on unattended view', () => {
+ const state = {
+ allConversations: [],
+ conversationFilters: { conversationType: 'unattended' },
};
const conversation = {
From 5264de24b0f89d2d7193e852518407db4d2a83d2 Mon Sep 17 00:00:00 2001
From: Aakash Bakhle <48802744+aakashb95@users.noreply.github.com>
Date: Wed, 15 Apr 2026 17:56:10 +0530
Subject: [PATCH 51/53] feat: migrations for document auto-sync [AI-141]
(#14041)
# Pull Request Template
## Description
Add migrations for document auto-sync
Fixes # (issue)
## Type of change
- [x] New feature (non-breaking change which adds functionality)
## How Has This Been Tested?
locally
## 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
- [x] 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
- [x] Any dependent changes have been merged and published in downstream
modules
---
...d_edited_to_captain_assistant_responses.rb | 5 +++
...2_add_sync_columns_to_captain_documents.rb | 11 +++++
...l_edited_on_captain_assistant_responses.rb | 20 +++++++++
db/schema.rb | 7 +++-
.../app/models/captain/assistant_response.rb | 6 +++
enterprise/app/models/captain/document.rb | 42 ++++++++++++++-----
.../captain/_assistant_response.json.jbuilder | 1 +
.../v1/models/captain/_document.json.jbuilder | 4 ++
8 files changed, 85 insertions(+), 11 deletions(-)
create mode 100644 db/migrate/20260410092751_add_edited_to_captain_assistant_responses.rb
create mode 100644 db/migrate/20260410092752_add_sync_columns_to_captain_documents.rb
create mode 100644 db/migrate/20260410092753_backfill_edited_on_captain_assistant_responses.rb
diff --git a/db/migrate/20260410092751_add_edited_to_captain_assistant_responses.rb b/db/migrate/20260410092751_add_edited_to_captain_assistant_responses.rb
new file mode 100644
index 000000000..916bae3e5
--- /dev/null
+++ b/db/migrate/20260410092751_add_edited_to_captain_assistant_responses.rb
@@ -0,0 +1,5 @@
+class AddEditedToCaptainAssistantResponses < ActiveRecord::Migration[7.0]
+ def change
+ add_column :captain_assistant_responses, :edited, :boolean, default: false, null: false
+ end
+end
diff --git a/db/migrate/20260410092752_add_sync_columns_to_captain_documents.rb b/db/migrate/20260410092752_add_sync_columns_to_captain_documents.rb
new file mode 100644
index 000000000..f1a86b44c
--- /dev/null
+++ b/db/migrate/20260410092752_add_sync_columns_to_captain_documents.rb
@@ -0,0 +1,11 @@
+class AddSyncColumnsToCaptainDocuments < ActiveRecord::Migration[7.0]
+ def change
+ change_table :captain_documents, bulk: true do |t|
+ t.integer :sync_status
+ t.datetime :last_synced_at
+ t.datetime :last_sync_attempted_at
+ end
+
+ add_index :captain_documents, [:account_id, :sync_status]
+ end
+end
diff --git a/db/migrate/20260410092753_backfill_edited_on_captain_assistant_responses.rb b/db/migrate/20260410092753_backfill_edited_on_captain_assistant_responses.rb
new file mode 100644
index 000000000..eb0235e70
--- /dev/null
+++ b/db/migrate/20260410092753_backfill_edited_on_captain_assistant_responses.rb
@@ -0,0 +1,20 @@
+class BackfillEditedOnCaptainAssistantResponses < ActiveRecord::Migration[7.0]
+ def up
+ return unless ChatwootApp.enterprise?
+
+ # rubocop:disable Rails/SkipsModelValidations
+ # NOTE: Since there is no way of knowing currently which FAQs were edited by a human
+ # we use a heuristic based on time passed between created_at and updated_at.
+ # 15 days is arbitrary but seems reasonable for a user to go back and edit an FAQ.
+ Captain::AssistantResponse
+ .where('updated_at - created_at > make_interval(days := ?)', 15)
+ .in_batches(of: 1000) do |batch|
+ batch.update_all(edited: true)
+ end
+ # rubocop:enable Rails/SkipsModelValidations
+ end
+
+ def down
+ # no-op: rolling back migration of edited column will drop the edited column entirely
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 360bddb69..a143f593d 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema[7.1].define(version: 2026_04_09_091202) do
+ActiveRecord::Schema[7.1].define(version: 2026_04_10_092753) do
# These extensions should be enabled to support this database
enable_extension "pg_stat_statements"
enable_extension "pg_trgm"
@@ -329,6 +329,7 @@ ActiveRecord::Schema[7.1].define(version: 2026_04_09_091202) do
t.datetime "updated_at", null: false
t.integer "status", default: 1, null: false
t.string "documentable_type"
+ t.boolean "edited", default: false, null: false
t.index ["account_id"], name: "index_captain_assistant_responses_on_account_id"
t.index ["assistant_id"], name: "index_captain_assistant_responses_on_assistant_id"
t.index ["documentable_id", "documentable_type"], name: "idx_cap_asst_resp_on_documentable"
@@ -377,10 +378,14 @@ ActiveRecord::Schema[7.1].define(version: 2026_04_09_091202) do
t.datetime "updated_at", null: false
t.integer "status", default: 0, null: false
t.jsonb "metadata", default: {}
+ t.integer "sync_status"
+ t.datetime "last_synced_at"
+ t.datetime "last_sync_attempted_at"
t.index ["account_id"], name: "index_captain_documents_on_account_id"
t.index ["assistant_id", "external_link"], name: "index_captain_documents_on_assistant_id_and_external_link", unique: true
t.index ["assistant_id"], name: "index_captain_documents_on_assistant_id"
t.index ["status"], name: "index_captain_documents_on_status"
+ t.index ["account_id", "sync_status"], name: "index_captain_documents_on_account_id_and_sync_status"
end
create_table "captain_inboxes", force: :cascade do |t|
diff --git a/enterprise/app/models/captain/assistant_response.rb b/enterprise/app/models/captain/assistant_response.rb
index 12dcab1cc..db2ac058a 100644
--- a/enterprise/app/models/captain/assistant_response.rb
+++ b/enterprise/app/models/captain/assistant_response.rb
@@ -5,6 +5,7 @@
# id :bigint not null, primary key
# answer :text not null
# documentable_type :string
+# edited :boolean default(FALSE), not null
# embedding :vector(1536)
# question :string not null
# status :integer default("approved"), not null
@@ -35,6 +36,7 @@ class Captain::AssistantResponse < ApplicationRecord
before_validation :ensure_account
before_validation :ensure_status
+ before_validation :mark_as_edited, on: :update
after_commit :update_response_embedding
scope :ordered, -> { order(created_at: :desc) }
@@ -55,6 +57,10 @@ class Captain::AssistantResponse < ApplicationRecord
self.status ||= :approved
end
+ def mark_as_edited
+ self.edited = true if question_changed? || answer_changed?
+ end
+
def ensure_account
self.account = assistant&.account
end
diff --git a/enterprise/app/models/captain/document.rb b/enterprise/app/models/captain/document.rb
index 751162b28..d8e07a2d9 100644
--- a/enterprise/app/models/captain/document.rb
+++ b/enterprise/app/models/captain/document.rb
@@ -2,20 +2,24 @@
#
# Table name: captain_documents
#
-# id :bigint not null, primary key
-# content :text
-# external_link :string not null
-# metadata :jsonb
-# name :string
-# status :integer default("in_progress"), not null
-# created_at :datetime not null
-# updated_at :datetime not null
-# account_id :bigint not null
-# assistant_id :bigint not null
+# id :bigint not null, primary key
+# content :text
+# external_link :string not null
+# last_sync_attempted_at :datetime
+# last_synced_at :datetime
+# metadata :jsonb
+# name :string
+# status :integer default("in_progress"), not null
+# sync_status :integer
+# created_at :datetime not null
+# updated_at :datetime not null
+# account_id :bigint not null
+# assistant_id :bigint not null
#
# Indexes
#
# index_captain_documents_on_account_id (account_id)
+# index_captain_documents_on_account_id_and_sync_status (account_id,sync_status)
# index_captain_documents_on_assistant_id (assistant_id)
# index_captain_documents_on_assistant_id_and_external_link (assistant_id,external_link) UNIQUE
# index_captain_documents_on_status (status)
@@ -44,6 +48,8 @@ class Captain::Document < ApplicationRecord
available: 1
}
+ enum :sync_status, { syncing: 0, synced: 1, failed: 2 }, prefix: :sync
+
before_create :ensure_within_plan_limit
after_create_commit :enqueue_crawl_job
after_create_commit :update_document_usage
@@ -68,6 +74,22 @@ class Captain::Document < ApplicationRecord
pdf_file.blob.byte_size if pdf_file.attached?
end
+ def content_fingerprint
+ metadata&.dig('content_fingerprint')
+ end
+
+ def content_fingerprint=(value)
+ self.metadata = (metadata || {}).merge('content_fingerprint' => value)
+ end
+
+ def last_sync_error_code
+ metadata&.dig('last_sync_error_code')
+ end
+
+ def last_sync_error_code=(value)
+ self.metadata = (metadata || {}).merge('last_sync_error_code' => value)
+ end
+
def openai_file_id
metadata&.dig('openai_file_id')
end
diff --git a/enterprise/app/views/api/v1/models/captain/_assistant_response.json.jbuilder b/enterprise/app/views/api/v1/models/captain/_assistant_response.json.jbuilder
index c118c7647..9412b8c03 100644
--- a/enterprise/app/views/api/v1/models/captain/_assistant_response.json.jbuilder
+++ b/enterprise/app/views/api/v1/models/captain/_assistant_response.json.jbuilder
@@ -29,3 +29,4 @@ json.id resource.id
json.question resource.question
json.updated_at resource.updated_at.to_i
json.status resource.status
+json.edited resource.edited
diff --git a/enterprise/app/views/api/v1/models/captain/_document.json.jbuilder b/enterprise/app/views/api/v1/models/captain/_document.json.jbuilder
index 8064a5181..62710bc64 100644
--- a/enterprise/app/views/api/v1/models/captain/_document.json.jbuilder
+++ b/enterprise/app/views/api/v1/models/captain/_document.json.jbuilder
@@ -11,4 +11,8 @@ json.file_size resource.file_size
json.id resource.id
json.name resource.name
json.status resource.status
+json.sync_status resource.sync_status
+json.last_synced_at resource.last_synced_at&.to_i
+json.last_sync_attempted_at resource.last_sync_attempted_at&.to_i
+json.last_sync_error_code resource.last_sync_error_code
json.updated_at resource.updated_at.to_i
From 97dae52841877ae690be479dc44c1feff51f76bb Mon Sep 17 00:00:00 2001
From: Aakash Bakhle <48802744+aakashb95@users.noreply.github.com>
Date: Thu, 16 Apr 2026 10:28:38 +0530
Subject: [PATCH 52/53] fix: use committed model registry for RubyLLM (#14067)
RubyLLM bundles a static models.json that doesn't know about models
released after the gem was published. Self-hosted users configuring
newer models hit ModelNotFoundError.
Added a rake task that refreshes the registry from models.dev and saves
to disk. ~~Called during Docker image build so every deploy gets fresh
model data. Falls back silently to the bundled registry if models.dev is
unreachable.~~
Commit the models.json file to code so it is available across
deployments.
---------
Co-authored-by: Sojan Jose
---
config/llm_models.json | 24264 ++++++++++++++++++++++++++++++++++++++
lib/llm/config.rb | 2 +
lib/tasks/ruby_llm.rake | 17 +
3 files changed, 24283 insertions(+)
create mode 100644 config/llm_models.json
create mode 100644 lib/tasks/ruby_llm.rake
diff --git a/config/llm_models.json b/config/llm_models.json
new file mode 100644
index 000000000..e2fe0e938
--- /dev/null
+++ b/config/llm_models.json
@@ -0,0 +1,24264 @@
+[
+ {
+ "id": "claude-3-5-haiku-20241022",
+ "name": "Claude Haiku 3.5",
+ "provider": "anthropic",
+ "family": "claude-haiku",
+ "created_at": "2024-10-22 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": "2024-07-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.8,
+ "output_per_million": 4,
+ "cached_input_per_million": 0.08
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "anthropic",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-10-22",
+ "cost": {
+ "input": 0.8,
+ "output": 4,
+ "cache_read": 0.08,
+ "cache_write": 1
+ },
+ "limit": {
+ "context": 200000,
+ "output": 8192
+ },
+ "knowledge": "2024-07-31"
+ }
+ },
+ {
+ "id": "claude-3-5-haiku-latest",
+ "name": "Claude Haiku 3.5 (latest)",
+ "provider": "anthropic",
+ "family": "claude-haiku",
+ "created_at": "2024-10-22 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": "2024-07-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.8,
+ "output_per_million": 4,
+ "cached_input_per_million": 0.08
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "anthropic",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-10-22",
+ "cost": {
+ "input": 0.8,
+ "output": 4,
+ "cache_read": 0.08,
+ "cache_write": 1
+ },
+ "limit": {
+ "context": 200000,
+ "output": 8192
+ },
+ "knowledge": "2024-07-31"
+ }
+ },
+ {
+ "id": "claude-3-5-sonnet-20240620",
+ "name": "Claude Sonnet 3.5",
+ "provider": "anthropic",
+ "family": "claude-sonnet",
+ "created_at": "2024-06-20 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": "2024-04-30",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 3,
+ "output_per_million": 15,
+ "cached_input_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "anthropic",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-06-20",
+ "cost": {
+ "input": 3,
+ "output": 15,
+ "cache_read": 0.3,
+ "cache_write": 3.75
+ },
+ "limit": {
+ "context": 200000,
+ "output": 8192
+ },
+ "knowledge": "2024-04-30"
+ }
+ },
+ {
+ "id": "claude-3-5-sonnet-20241022",
+ "name": "Claude Sonnet 3.5 v2",
+ "provider": "anthropic",
+ "family": "claude-sonnet",
+ "created_at": "2024-10-22 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": "2024-04-30",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 3,
+ "output_per_million": 15,
+ "cached_input_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "anthropic",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-10-22",
+ "cost": {
+ "input": 3,
+ "output": 15,
+ "cache_read": 0.3,
+ "cache_write": 3.75
+ },
+ "limit": {
+ "context": 200000,
+ "output": 8192
+ },
+ "knowledge": "2024-04-30"
+ }
+ },
+ {
+ "id": "claude-3-7-sonnet-20250219",
+ "name": "Claude Sonnet 3.7",
+ "provider": "anthropic",
+ "family": "claude-sonnet",
+ "created_at": "2025-02-19 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": "2024-10-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 3,
+ "output_per_million": 15,
+ "cached_input_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "anthropic",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-02-19",
+ "cost": {
+ "input": 3,
+ "output": 15,
+ "cache_read": 0.3,
+ "cache_write": 3.75
+ },
+ "limit": {
+ "context": 200000,
+ "output": 64000
+ },
+ "knowledge": "2024-10-31"
+ }
+ },
+ {
+ "id": "claude-3-haiku-20240307",
+ "name": "Claude Haiku 3",
+ "provider": "anthropic",
+ "family": "claude-haiku",
+ "created_at": "2024-03-13 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": "2023-08-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.25,
+ "output_per_million": 1.25,
+ "cached_input_per_million": 0.03
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "anthropic",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-03-13",
+ "cost": {
+ "input": 0.25,
+ "output": 1.25,
+ "cache_read": 0.03,
+ "cache_write": 0.3
+ },
+ "limit": {
+ "context": 200000,
+ "output": 4096
+ },
+ "knowledge": "2023-08-31"
+ }
+ },
+ {
+ "id": "claude-3-opus-20240229",
+ "name": "Claude Opus 3",
+ "provider": "anthropic",
+ "family": "claude-opus",
+ "created_at": "2024-02-29 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": "2023-08-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 15,
+ "output_per_million": 75,
+ "cached_input_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "anthropic",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-02-29",
+ "cost": {
+ "input": 15,
+ "output": 75,
+ "cache_read": 1.5,
+ "cache_write": 18.75
+ },
+ "limit": {
+ "context": 200000,
+ "output": 4096
+ },
+ "knowledge": "2023-08-31"
+ }
+ },
+ {
+ "id": "claude-3-sonnet-20240229",
+ "name": "Claude Sonnet 3",
+ "provider": "anthropic",
+ "family": "claude-sonnet",
+ "created_at": "2024-03-04 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": "2023-08-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 3,
+ "output_per_million": 15,
+ "cached_input_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "anthropic",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-03-04",
+ "cost": {
+ "input": 3,
+ "output": 15,
+ "cache_read": 0.3,
+ "cache_write": 0.3
+ },
+ "limit": {
+ "context": 200000,
+ "output": 4096
+ },
+ "knowledge": "2023-08-31"
+ }
+ },
+ {
+ "id": "claude-haiku-4-5",
+ "name": "Claude Haiku 4.5 (latest)",
+ "provider": "anthropic",
+ "family": "claude-haiku",
+ "created_at": "2025-10-15 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": "2025-02-28",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1,
+ "output_per_million": 5,
+ "cached_input_per_million": 0.1
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "anthropic",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-10-15",
+ "cost": {
+ "input": 1,
+ "output": 5,
+ "cache_read": 0.1,
+ "cache_write": 1.25
+ },
+ "limit": {
+ "context": 200000,
+ "output": 64000
+ },
+ "knowledge": "2025-02-28"
+ }
+ },
+ {
+ "id": "claude-haiku-4-5-20251001",
+ "name": "Claude Haiku 4.5",
+ "provider": "anthropic",
+ "family": "claude-haiku",
+ "created_at": "2025-10-15 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": "2025-02-28",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1,
+ "output_per_million": 5,
+ "cached_input_per_million": 0.1
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "anthropic",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-10-15",
+ "cost": {
+ "input": 1,
+ "output": 5,
+ "cache_read": 0.1,
+ "cache_write": 1.25
+ },
+ "limit": {
+ "context": 200000,
+ "output": 64000
+ },
+ "knowledge": "2025-02-28"
+ }
+ },
+ {
+ "id": "claude-opus-4-0",
+ "name": "Claude Opus 4 (latest)",
+ "provider": "anthropic",
+ "family": "claude-opus",
+ "created_at": "2025-05-22 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 32000,
+ "knowledge_cutoff": "2025-03-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 15,
+ "output_per_million": 75,
+ "cached_input_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "anthropic",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-05-22",
+ "cost": {
+ "input": 15,
+ "output": 75,
+ "cache_read": 1.5,
+ "cache_write": 18.75
+ },
+ "limit": {
+ "context": 200000,
+ "output": 32000
+ },
+ "knowledge": "2025-03-31"
+ }
+ },
+ {
+ "id": "claude-opus-4-1",
+ "name": "Claude Opus 4.1 (latest)",
+ "provider": "anthropic",
+ "family": "claude-opus",
+ "created_at": "2025-08-05 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 32000,
+ "knowledge_cutoff": "2025-03-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 15,
+ "output_per_million": 75,
+ "cached_input_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "anthropic",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-08-05",
+ "cost": {
+ "input": 15,
+ "output": 75,
+ "cache_read": 1.5,
+ "cache_write": 18.75
+ },
+ "limit": {
+ "context": 200000,
+ "output": 32000
+ },
+ "knowledge": "2025-03-31"
+ }
+ },
+ {
+ "id": "claude-opus-4-1-20250805",
+ "name": "Claude Opus 4.1",
+ "provider": "anthropic",
+ "family": "claude-opus",
+ "created_at": "2025-08-05 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 32000,
+ "knowledge_cutoff": "2025-03-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 15,
+ "output_per_million": 75,
+ "cached_input_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "anthropic",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-08-05",
+ "cost": {
+ "input": 15,
+ "output": 75,
+ "cache_read": 1.5,
+ "cache_write": 18.75
+ },
+ "limit": {
+ "context": 200000,
+ "output": 32000
+ },
+ "knowledge": "2025-03-31"
+ }
+ },
+ {
+ "id": "claude-opus-4-20250514",
+ "name": "Claude Opus 4",
+ "provider": "anthropic",
+ "family": "claude-opus",
+ "created_at": "2025-05-22 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 32000,
+ "knowledge_cutoff": "2025-03-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 15,
+ "output_per_million": 75,
+ "cached_input_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "anthropic",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-05-22",
+ "cost": {
+ "input": 15,
+ "output": 75,
+ "cache_read": 1.5,
+ "cache_write": 18.75
+ },
+ "limit": {
+ "context": 200000,
+ "output": 32000
+ },
+ "knowledge": "2025-03-31"
+ }
+ },
+ {
+ "id": "claude-opus-4-5",
+ "name": "Claude Opus 4.5 (latest)",
+ "provider": "anthropic",
+ "family": "claude-opus",
+ "created_at": "2025-11-24 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": "2025-03-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 5,
+ "output_per_million": 25,
+ "cached_input_per_million": 0.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "anthropic",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-11-24",
+ "cost": {
+ "input": 5,
+ "output": 25,
+ "cache_read": 0.5,
+ "cache_write": 6.25
+ },
+ "limit": {
+ "context": 200000,
+ "output": 64000
+ },
+ "knowledge": "2025-03-31"
+ }
+ },
+ {
+ "id": "claude-opus-4-5-20251101",
+ "name": "Claude Opus 4.5",
+ "provider": "anthropic",
+ "family": "claude-opus",
+ "created_at": "2025-11-01 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": "2025-03-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 5,
+ "output_per_million": 25,
+ "cached_input_per_million": 0.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "anthropic",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-11-01",
+ "cost": {
+ "input": 5,
+ "output": 25,
+ "cache_read": 0.5,
+ "cache_write": 6.25
+ },
+ "limit": {
+ "context": 200000,
+ "output": 64000
+ },
+ "knowledge": "2025-03-31"
+ }
+ },
+ {
+ "id": "claude-opus-4-6",
+ "name": "Claude Opus 4.6",
+ "provider": "anthropic",
+ "family": "claude-opus",
+ "created_at": "2026-02-05 00:00:00 +0530",
+ "context_window": 1000000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 5,
+ "output_per_million": 25,
+ "cached_input_per_million": 0.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "anthropic",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-03-13",
+ "cost": {
+ "input": 5,
+ "output": 25,
+ "cache_read": 0.5,
+ "cache_write": 6.25
+ },
+ "limit": {
+ "context": 1000000,
+ "output": 128000
+ },
+ "knowledge": "2025-05"
+ }
+ },
+ {
+ "id": "claude-sonnet-4-0",
+ "name": "Claude Sonnet 4 (latest)",
+ "provider": "anthropic",
+ "family": "claude-sonnet",
+ "created_at": "2025-05-22 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": "2025-03-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 3,
+ "output_per_million": 15,
+ "cached_input_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "anthropic",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-05-22",
+ "cost": {
+ "input": 3,
+ "output": 15,
+ "cache_read": 0.3,
+ "cache_write": 3.75
+ },
+ "limit": {
+ "context": 200000,
+ "output": 64000
+ },
+ "knowledge": "2025-03-31"
+ }
+ },
+ {
+ "id": "claude-sonnet-4-20250514",
+ "name": "Claude Sonnet 4",
+ "provider": "anthropic",
+ "family": "claude-sonnet",
+ "created_at": "2025-05-22 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": "2025-03-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 3,
+ "output_per_million": 15,
+ "cached_input_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "anthropic",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-05-22",
+ "cost": {
+ "input": 3,
+ "output": 15,
+ "cache_read": 0.3,
+ "cache_write": 3.75
+ },
+ "limit": {
+ "context": 200000,
+ "output": 64000
+ },
+ "knowledge": "2025-03-31"
+ }
+ },
+ {
+ "id": "claude-sonnet-4-5",
+ "name": "Claude Sonnet 4.5 (latest)",
+ "provider": "anthropic",
+ "family": "claude-sonnet",
+ "created_at": "2025-09-29 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": "2025-07-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 3,
+ "output_per_million": 15,
+ "cached_input_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "anthropic",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-09-29",
+ "cost": {
+ "input": 3,
+ "output": 15,
+ "cache_read": 0.3,
+ "cache_write": 3.75
+ },
+ "limit": {
+ "context": 200000,
+ "output": 64000
+ },
+ "knowledge": "2025-07-31"
+ }
+ },
+ {
+ "id": "claude-sonnet-4-5-20250929",
+ "name": "Claude Sonnet 4.5",
+ "provider": "anthropic",
+ "family": "claude-sonnet",
+ "created_at": "2025-09-29 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": "2025-07-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 3,
+ "output_per_million": 15,
+ "cached_input_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "anthropic",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-09-29",
+ "cost": {
+ "input": 3,
+ "output": 15,
+ "cache_read": 0.3,
+ "cache_write": 3.75
+ },
+ "limit": {
+ "context": 200000,
+ "output": 64000
+ },
+ "knowledge": "2025-07-31"
+ }
+ },
+ {
+ "id": "claude-sonnet-4-6",
+ "name": "Claude Sonnet 4.6",
+ "provider": "anthropic",
+ "family": "claude-sonnet",
+ "created_at": "2026-02-17 00:00:00 +0530",
+ "context_window": 1000000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 3,
+ "output_per_million": 15,
+ "cached_input_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "anthropic",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-03-13",
+ "cost": {
+ "input": 3,
+ "output": 15,
+ "cache_read": 0.3,
+ "cache_write": 3.75
+ },
+ "limit": {
+ "context": 1000000,
+ "output": 64000
+ },
+ "knowledge": "2025-08"
+ }
+ },
+ {
+ "id": "amazon.nova-2-lite-v1:0",
+ "name": "Nova 2 Lite",
+ "provider": "bedrock",
+ "family": "nova",
+ "created_at": "2024-12-01 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "video"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.33,
+ "output_per_million": 2.75
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2024-12-01",
+ "cost": {
+ "input": 0.33,
+ "output": 2.75
+ },
+ "limit": {
+ "context": 128000,
+ "output": 4096
+ }
+ }
+ },
+ {
+ "id": "amazon.nova-lite-v1:0",
+ "name": "Nova Lite",
+ "provider": "bedrock",
+ "family": "nova-lite",
+ "created_at": "2024-12-03 00:00:00 +0530",
+ "context_window": 300000,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "video"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.06,
+ "output_per_million": 0.24,
+ "cached_input_per_million": 0.015
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-12-03",
+ "cost": {
+ "input": 0.06,
+ "output": 0.24,
+ "cache_read": 0.015
+ },
+ "limit": {
+ "context": 300000,
+ "output": 8192
+ },
+ "knowledge": "2024-10"
+ }
+ },
+ {
+ "id": "amazon.nova-micro-v1:0",
+ "name": "Nova Micro",
+ "provider": "bedrock",
+ "family": "nova-micro",
+ "created_at": "2024-12-03 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.035,
+ "output_per_million": 0.14,
+ "cached_input_per_million": 0.00875
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2024-12-03",
+ "cost": {
+ "input": 0.035,
+ "output": 0.14,
+ "cache_read": 0.00875
+ },
+ "limit": {
+ "context": 128000,
+ "output": 8192
+ },
+ "knowledge": "2024-10"
+ }
+ },
+ {
+ "id": "amazon.nova-premier-v1:0",
+ "name": "Nova Premier",
+ "provider": "bedrock",
+ "family": "nova",
+ "created_at": "2024-12-03 00:00:00 +0530",
+ "context_window": 1000000,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "video"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2.5,
+ "output_per_million": 12.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-12-03",
+ "cost": {
+ "input": 2.5,
+ "output": 12.5
+ },
+ "limit": {
+ "context": 1000000,
+ "output": 16384
+ },
+ "knowledge": "2024-10"
+ }
+ },
+ {
+ "id": "amazon.nova-pro-v1:0",
+ "name": "Nova Pro",
+ "provider": "bedrock",
+ "family": "nova-pro",
+ "created_at": "2024-12-03 00:00:00 +0530",
+ "context_window": 300000,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "video"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.8,
+ "output_per_million": 3.2,
+ "cached_input_per_million": 0.2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-12-03",
+ "cost": {
+ "input": 0.8,
+ "output": 3.2,
+ "cache_read": 0.2
+ },
+ "limit": {
+ "context": 300000,
+ "output": 8192
+ },
+ "knowledge": "2024-10"
+ }
+ },
+ {
+ "id": "anthropic.claude-3-5-haiku-20241022-v1:0",
+ "name": "Claude Haiku 3.5",
+ "provider": "bedrock",
+ "family": "claude-haiku",
+ "created_at": "2024-10-22 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.8,
+ "output_per_million": 4,
+ "cached_input_per_million": 0.08
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-10-22",
+ "cost": {
+ "input": 0.8,
+ "output": 4,
+ "cache_read": 0.08,
+ "cache_write": 1
+ },
+ "limit": {
+ "context": 200000,
+ "output": 8192
+ },
+ "knowledge": "2024-07"
+ }
+ },
+ {
+ "id": "anthropic.claude-3-5-sonnet-20240620-v1:0",
+ "name": "Claude Sonnet 3.5",
+ "provider": "bedrock",
+ "family": "claude-sonnet",
+ "created_at": "2024-06-20 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 3,
+ "output_per_million": 15,
+ "cached_input_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-06-20",
+ "cost": {
+ "input": 3,
+ "output": 15,
+ "cache_read": 0.3,
+ "cache_write": 3.75
+ },
+ "limit": {
+ "context": 200000,
+ "output": 8192
+ },
+ "knowledge": "2024-04"
+ }
+ },
+ {
+ "id": "anthropic.claude-3-5-sonnet-20241022-v2:0",
+ "name": "Claude Sonnet 3.5 v2",
+ "provider": "bedrock",
+ "family": "claude-sonnet",
+ "created_at": "2024-10-22 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 3,
+ "output_per_million": 15,
+ "cached_input_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-10-22",
+ "cost": {
+ "input": 3,
+ "output": 15,
+ "cache_read": 0.3,
+ "cache_write": 3.75
+ },
+ "limit": {
+ "context": 200000,
+ "output": 8192
+ },
+ "knowledge": "2024-04"
+ }
+ },
+ {
+ "id": "anthropic.claude-3-7-sonnet-20250219-v1:0",
+ "name": "Claude Sonnet 3.7",
+ "provider": "bedrock",
+ "family": "claude-sonnet",
+ "created_at": "2025-02-19 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 3,
+ "output_per_million": 15,
+ "cached_input_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-02-19",
+ "cost": {
+ "input": 3,
+ "output": 15,
+ "cache_read": 0.3,
+ "cache_write": 3.75
+ },
+ "limit": {
+ "context": 200000,
+ "output": 8192
+ },
+ "knowledge": "2024-04"
+ }
+ },
+ {
+ "id": "anthropic.claude-3-haiku-20240307-v1:0",
+ "name": "Claude Haiku 3",
+ "provider": "bedrock",
+ "family": "claude-haiku",
+ "created_at": "2024-03-13 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.25,
+ "output_per_million": 1.25
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-03-13",
+ "cost": {
+ "input": 0.25,
+ "output": 1.25
+ },
+ "limit": {
+ "context": 200000,
+ "output": 4096
+ },
+ "knowledge": "2024-02"
+ }
+ },
+ {
+ "id": "anthropic.claude-haiku-4-5-20251001-v1:0",
+ "name": "Claude Haiku 4.5",
+ "provider": "bedrock",
+ "family": "claude-haiku",
+ "created_at": "2025-10-15 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": "2025-02-28",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1,
+ "output_per_million": 5,
+ "cached_input_per_million": 0.1
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-10-15",
+ "cost": {
+ "input": 1,
+ "output": 5,
+ "cache_read": 0.1,
+ "cache_write": 1.25
+ },
+ "limit": {
+ "context": 200000,
+ "output": 64000
+ },
+ "knowledge": "2025-02-28"
+ }
+ },
+ {
+ "id": "anthropic.claude-opus-4-1-20250805-v1:0",
+ "name": "Claude Opus 4.1",
+ "provider": "bedrock",
+ "family": "claude-opus",
+ "created_at": "2025-08-05 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 32000,
+ "knowledge_cutoff": "2025-03-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 15,
+ "output_per_million": 75,
+ "cached_input_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-08-05",
+ "cost": {
+ "input": 15,
+ "output": 75,
+ "cache_read": 1.5,
+ "cache_write": 18.75
+ },
+ "limit": {
+ "context": 200000,
+ "output": 32000
+ },
+ "knowledge": "2025-03-31"
+ }
+ },
+ {
+ "id": "anthropic.claude-opus-4-20250514-v1:0",
+ "name": "Claude Opus 4",
+ "provider": "bedrock",
+ "family": "claude-opus",
+ "created_at": "2025-05-22 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 32000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 15,
+ "output_per_million": 75,
+ "cached_input_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-05-22",
+ "cost": {
+ "input": 15,
+ "output": 75,
+ "cache_read": 1.5,
+ "cache_write": 18.75
+ },
+ "limit": {
+ "context": 200000,
+ "output": 32000
+ },
+ "knowledge": "2024-04"
+ }
+ },
+ {
+ "id": "anthropic.claude-opus-4-5-20251101-v1:0",
+ "name": "Claude Opus 4.5",
+ "provider": "bedrock",
+ "family": "claude-opus",
+ "created_at": "2025-11-24 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": "2025-03-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 5,
+ "output_per_million": 25,
+ "cached_input_per_million": 0.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-08-01",
+ "cost": {
+ "input": 5,
+ "output": 25,
+ "cache_read": 0.5,
+ "cache_write": 6.25
+ },
+ "limit": {
+ "context": 200000,
+ "output": 64000
+ },
+ "knowledge": "2025-03-31"
+ }
+ },
+ {
+ "id": "anthropic.claude-opus-4-6-v1",
+ "name": "Claude Opus 4.6",
+ "provider": "bedrock",
+ "family": "claude-opus",
+ "created_at": "2026-02-05 00:00:00 +0530",
+ "context_window": 1000000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 5,
+ "output_per_million": 25,
+ "cached_input_per_million": 0.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-03-18",
+ "cost": {
+ "input": 5,
+ "output": 25,
+ "cache_read": 0.5,
+ "cache_write": 6.25
+ },
+ "limit": {
+ "context": 1000000,
+ "output": 128000
+ },
+ "knowledge": "2025-05"
+ }
+ },
+ {
+ "id": "anthropic.claude-sonnet-4-20250514-v1:0",
+ "name": "Claude Sonnet 4",
+ "provider": "bedrock",
+ "family": "claude-sonnet",
+ "created_at": "2025-05-22 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 3,
+ "output_per_million": 15,
+ "cached_input_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-05-22",
+ "cost": {
+ "input": 3,
+ "output": 15,
+ "cache_read": 0.3,
+ "cache_write": 3.75
+ },
+ "limit": {
+ "context": 200000,
+ "output": 64000
+ },
+ "knowledge": "2024-04"
+ }
+ },
+ {
+ "id": "anthropic.claude-sonnet-4-5-20250929-v1:0",
+ "name": "Claude Sonnet 4.5",
+ "provider": "bedrock",
+ "family": "claude-sonnet",
+ "created_at": "2025-09-29 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": "2025-07-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 3,
+ "output_per_million": 15,
+ "cached_input_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-09-29",
+ "cost": {
+ "input": 3,
+ "output": 15,
+ "cache_read": 0.3,
+ "cache_write": 3.75
+ },
+ "limit": {
+ "context": 200000,
+ "output": 64000
+ },
+ "knowledge": "2025-07-31"
+ }
+ },
+ {
+ "id": "anthropic.claude-sonnet-4-6",
+ "name": "Claude Sonnet 4.6",
+ "provider": "bedrock",
+ "family": "claude-sonnet",
+ "created_at": "2026-02-17 00:00:00 +0530",
+ "context_window": 1000000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 3,
+ "output_per_million": 15,
+ "cached_input_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-03-18",
+ "cost": {
+ "input": 3,
+ "output": 15,
+ "cache_read": 0.3,
+ "cache_write": 3.75
+ },
+ "limit": {
+ "context": 1000000,
+ "output": 64000
+ },
+ "knowledge": "2025-08"
+ }
+ },
+ {
+ "id": "deepseek.r1-v1:0",
+ "name": "DeepSeek-R1",
+ "provider": "bedrock",
+ "family": "deepseek-thinking",
+ "created_at": "2025-01-20 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 32768,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.35,
+ "output_per_million": 5.4
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-05-29",
+ "cost": {
+ "input": 1.35,
+ "output": 5.4
+ },
+ "limit": {
+ "context": 128000,
+ "output": 32768
+ },
+ "knowledge": "2024-07"
+ }
+ },
+ {
+ "id": "deepseek.v3-v1:0",
+ "name": "DeepSeek-V3.1",
+ "provider": "bedrock",
+ "family": "deepseek",
+ "created_at": "2025-09-18 00:00:00 +0530",
+ "context_window": 163840,
+ "max_output_tokens": 81920,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.58,
+ "output_per_million": 1.68
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-09-18",
+ "cost": {
+ "input": 0.58,
+ "output": 1.68
+ },
+ "limit": {
+ "context": 163840,
+ "output": 81920
+ },
+ "knowledge": "2024-07"
+ }
+ },
+ {
+ "id": "deepseek.v3.2",
+ "name": "DeepSeek-V3.2",
+ "provider": "bedrock",
+ "family": "deepseek",
+ "created_at": "2026-02-06 00:00:00 +0530",
+ "context_window": 163840,
+ "max_output_tokens": 81920,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.62,
+ "output_per_million": 1.85
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-02-06",
+ "cost": {
+ "input": 0.62,
+ "output": 1.85
+ },
+ "limit": {
+ "context": 163840,
+ "output": 81920
+ },
+ "knowledge": "2024-07"
+ }
+ },
+ {
+ "id": "eu.anthropic.claude-haiku-4-5-20251001-v1:0",
+ "name": "Claude Haiku 4.5 (EU)",
+ "provider": "bedrock",
+ "family": "claude-haiku",
+ "created_at": "2025-10-15 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": "2025-02-28",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1,
+ "output_per_million": 5,
+ "cached_input_per_million": 0.1
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-10-15",
+ "cost": {
+ "input": 1,
+ "output": 5,
+ "cache_read": 0.1,
+ "cache_write": 1.25
+ },
+ "limit": {
+ "context": 200000,
+ "output": 64000
+ },
+ "knowledge": "2025-02-28"
+ }
+ },
+ {
+ "id": "eu.anthropic.claude-opus-4-5-20251101-v1:0",
+ "name": "Claude Opus 4.5 (EU)",
+ "provider": "bedrock",
+ "family": "claude-opus",
+ "created_at": "2025-11-24 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": "2025-03-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 5,
+ "output_per_million": 25,
+ "cached_input_per_million": 0.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-08-01",
+ "cost": {
+ "input": 5,
+ "output": 25,
+ "cache_read": 0.5,
+ "cache_write": 6.25
+ },
+ "limit": {
+ "context": 200000,
+ "output": 64000
+ },
+ "knowledge": "2025-03-31"
+ }
+ },
+ {
+ "id": "eu.anthropic.claude-opus-4-6-v1",
+ "name": "Claude Opus 4.6 (EU)",
+ "provider": "bedrock",
+ "family": "claude-opus",
+ "created_at": "2026-02-05 00:00:00 +0530",
+ "context_window": 1000000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 5,
+ "output_per_million": 25,
+ "cached_input_per_million": 0.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-03-18",
+ "cost": {
+ "input": 5,
+ "output": 25,
+ "cache_read": 0.5,
+ "cache_write": 6.25
+ },
+ "limit": {
+ "context": 1000000,
+ "output": 128000
+ },
+ "knowledge": "2025-05"
+ }
+ },
+ {
+ "id": "eu.anthropic.claude-sonnet-4-20250514-v1:0",
+ "name": "Claude Sonnet 4 (EU)",
+ "provider": "bedrock",
+ "family": "claude-sonnet",
+ "created_at": "2025-05-22 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 3,
+ "output_per_million": 15,
+ "cached_input_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-05-22",
+ "cost": {
+ "input": 3,
+ "output": 15,
+ "cache_read": 0.3,
+ "cache_write": 3.75
+ },
+ "limit": {
+ "context": 200000,
+ "output": 64000
+ },
+ "knowledge": "2024-04"
+ }
+ },
+ {
+ "id": "eu.anthropic.claude-sonnet-4-5-20250929-v1:0",
+ "name": "Claude Sonnet 4.5 (EU)",
+ "provider": "bedrock",
+ "family": "claude-sonnet",
+ "created_at": "2025-09-29 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": "2025-07-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 3,
+ "output_per_million": 15,
+ "cached_input_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-09-29",
+ "cost": {
+ "input": 3,
+ "output": 15,
+ "cache_read": 0.3,
+ "cache_write": 3.75
+ },
+ "limit": {
+ "context": 200000,
+ "output": 64000
+ },
+ "knowledge": "2025-07-31"
+ }
+ },
+ {
+ "id": "eu.anthropic.claude-sonnet-4-6",
+ "name": "Claude Sonnet 4.6 (EU)",
+ "provider": "bedrock",
+ "family": "claude-sonnet",
+ "created_at": "2026-02-17 00:00:00 +0530",
+ "context_window": 1000000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 3,
+ "output_per_million": 15,
+ "cached_input_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-03-18",
+ "cost": {
+ "input": 3,
+ "output": 15,
+ "cache_read": 0.3,
+ "cache_write": 3.75
+ },
+ "limit": {
+ "context": 1000000,
+ "output": 64000
+ },
+ "knowledge": "2025-08"
+ }
+ },
+ {
+ "id": "global.anthropic.claude-haiku-4-5-20251001-v1:0",
+ "name": "Claude Haiku 4.5 (Global)",
+ "provider": "bedrock",
+ "family": "claude-haiku",
+ "created_at": "2025-10-15 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": "2025-02-28",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1,
+ "output_per_million": 5,
+ "cached_input_per_million": 0.1
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-10-15",
+ "cost": {
+ "input": 1,
+ "output": 5,
+ "cache_read": 0.1,
+ "cache_write": 1.25
+ },
+ "limit": {
+ "context": 200000,
+ "output": 64000
+ },
+ "knowledge": "2025-02-28"
+ }
+ },
+ {
+ "id": "global.anthropic.claude-opus-4-5-20251101-v1:0",
+ "name": "Claude Opus 4.5 (Global)",
+ "provider": "bedrock",
+ "family": "claude-opus",
+ "created_at": "2025-11-24 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": "2025-03-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 5,
+ "output_per_million": 25,
+ "cached_input_per_million": 0.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-08-01",
+ "cost": {
+ "input": 5,
+ "output": 25,
+ "cache_read": 0.5,
+ "cache_write": 6.25
+ },
+ "limit": {
+ "context": 200000,
+ "output": 64000
+ },
+ "knowledge": "2025-03-31"
+ }
+ },
+ {
+ "id": "global.anthropic.claude-opus-4-6-v1",
+ "name": "Claude Opus 4.6 (Global)",
+ "provider": "bedrock",
+ "family": "claude-opus",
+ "created_at": "2026-02-05 00:00:00 +0530",
+ "context_window": 1000000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 5,
+ "output_per_million": 25,
+ "cached_input_per_million": 0.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-03-18",
+ "cost": {
+ "input": 5,
+ "output": 25,
+ "cache_read": 0.5,
+ "cache_write": 6.25
+ },
+ "limit": {
+ "context": 1000000,
+ "output": 128000
+ },
+ "knowledge": "2025-05"
+ }
+ },
+ {
+ "id": "global.anthropic.claude-sonnet-4-20250514-v1:0",
+ "name": "Claude Sonnet 4 (Global)",
+ "provider": "bedrock",
+ "family": "claude-sonnet",
+ "created_at": "2025-05-22 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 3,
+ "output_per_million": 15,
+ "cached_input_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-05-22",
+ "cost": {
+ "input": 3,
+ "output": 15,
+ "cache_read": 0.3,
+ "cache_write": 3.75
+ },
+ "limit": {
+ "context": 200000,
+ "output": 64000
+ },
+ "knowledge": "2024-04"
+ }
+ },
+ {
+ "id": "global.anthropic.claude-sonnet-4-5-20250929-v1:0",
+ "name": "Claude Sonnet 4.5 (Global)",
+ "provider": "bedrock",
+ "family": "claude-sonnet",
+ "created_at": "2025-09-29 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": "2025-07-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 3,
+ "output_per_million": 15,
+ "cached_input_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-09-29",
+ "cost": {
+ "input": 3,
+ "output": 15,
+ "cache_read": 0.3,
+ "cache_write": 3.75
+ },
+ "limit": {
+ "context": 200000,
+ "output": 64000
+ },
+ "knowledge": "2025-07-31"
+ }
+ },
+ {
+ "id": "global.anthropic.claude-sonnet-4-6",
+ "name": "Claude Sonnet 4.6 (Global)",
+ "provider": "bedrock",
+ "family": "claude-sonnet",
+ "created_at": "2026-02-17 00:00:00 +0530",
+ "context_window": 1000000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 3,
+ "output_per_million": 15,
+ "cached_input_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-03-18",
+ "cost": {
+ "input": 3,
+ "output": 15,
+ "cache_read": 0.3,
+ "cache_write": 3.75
+ },
+ "limit": {
+ "context": 1000000,
+ "output": 64000
+ },
+ "knowledge": "2025-08"
+ }
+ },
+ {
+ "id": "google.gemma-3-12b-it",
+ "name": "Google Gemma 3 12B",
+ "provider": "bedrock",
+ "family": "gemma",
+ "created_at": "2024-12-01 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "structured_output",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.049999999999999996,
+ "output_per_million": 0.09999999999999999
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2024-12-01",
+ "cost": {
+ "input": 0.049999999999999996,
+ "output": 0.09999999999999999
+ },
+ "limit": {
+ "context": 131072,
+ "output": 8192
+ },
+ "knowledge": "2024-12"
+ }
+ },
+ {
+ "id": "google.gemma-3-27b-it",
+ "name": "Google Gemma 3 27B Instruct",
+ "provider": "bedrock",
+ "family": "gemma",
+ "created_at": "2025-07-27 00:00:00 +0530",
+ "context_window": 202752,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.12,
+ "output_per_million": 0.2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-07-27",
+ "cost": {
+ "input": 0.12,
+ "output": 0.2
+ },
+ "limit": {
+ "context": 202752,
+ "output": 8192
+ },
+ "knowledge": "2025-07"
+ }
+ },
+ {
+ "id": "google.gemma-3-4b-it",
+ "name": "Gemma 3 4B IT",
+ "provider": "bedrock",
+ "family": "gemma",
+ "created_at": "2024-12-01 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.04,
+ "output_per_million": 0.08
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2024-12-01",
+ "cost": {
+ "input": 0.04,
+ "output": 0.08
+ },
+ "limit": {
+ "context": 128000,
+ "output": 4096
+ }
+ }
+ },
+ {
+ "id": "meta.llama3-1-405b-instruct-v1:0",
+ "name": "Llama 3.1 405B Instruct",
+ "provider": "bedrock",
+ "family": "llama",
+ "created_at": "2024-07-23 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2.4,
+ "output_per_million": 2.4
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2024-07-23",
+ "cost": {
+ "input": 2.4,
+ "output": 2.4
+ },
+ "limit": {
+ "context": 128000,
+ "output": 4096
+ },
+ "knowledge": "2023-12"
+ }
+ },
+ {
+ "id": "meta.llama3-1-70b-instruct-v1:0",
+ "name": "Llama 3.1 70B Instruct",
+ "provider": "bedrock",
+ "family": "llama",
+ "created_at": "2024-07-23 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.72,
+ "output_per_million": 0.72
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2024-07-23",
+ "cost": {
+ "input": 0.72,
+ "output": 0.72
+ },
+ "limit": {
+ "context": 128000,
+ "output": 4096
+ },
+ "knowledge": "2023-12"
+ }
+ },
+ {
+ "id": "meta.llama3-1-8b-instruct-v1:0",
+ "name": "Llama 3.1 8B Instruct",
+ "provider": "bedrock",
+ "family": "llama",
+ "created_at": "2024-07-23 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.22,
+ "output_per_million": 0.22
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2024-07-23",
+ "cost": {
+ "input": 0.22,
+ "output": 0.22
+ },
+ "limit": {
+ "context": 128000,
+ "output": 4096
+ },
+ "knowledge": "2023-12"
+ }
+ },
+ {
+ "id": "meta.llama3-2-11b-instruct-v1:0",
+ "name": "Llama 3.2 11B Instruct",
+ "provider": "bedrock",
+ "family": "llama",
+ "created_at": "2024-09-25 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.16,
+ "output_per_million": 0.16
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-09-25",
+ "cost": {
+ "input": 0.16,
+ "output": 0.16
+ },
+ "limit": {
+ "context": 128000,
+ "output": 4096
+ },
+ "knowledge": "2023-12"
+ }
+ },
+ {
+ "id": "meta.llama3-2-1b-instruct-v1:0",
+ "name": "Llama 3.2 1B Instruct",
+ "provider": "bedrock",
+ "family": "llama",
+ "created_at": "2024-09-25 00:00:00 +0530",
+ "context_window": 131000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.1,
+ "output_per_million": 0.1
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2024-09-25",
+ "cost": {
+ "input": 0.1,
+ "output": 0.1
+ },
+ "limit": {
+ "context": 131000,
+ "output": 4096
+ },
+ "knowledge": "2023-12"
+ }
+ },
+ {
+ "id": "meta.llama3-2-3b-instruct-v1:0",
+ "name": "Llama 3.2 3B Instruct",
+ "provider": "bedrock",
+ "family": "llama",
+ "created_at": "2024-09-25 00:00:00 +0530",
+ "context_window": 131000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.15,
+ "output_per_million": 0.15
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2024-09-25",
+ "cost": {
+ "input": 0.15,
+ "output": 0.15
+ },
+ "limit": {
+ "context": 131000,
+ "output": 4096
+ },
+ "knowledge": "2023-12"
+ }
+ },
+ {
+ "id": "meta.llama3-2-90b-instruct-v1:0",
+ "name": "Llama 3.2 90B Instruct",
+ "provider": "bedrock",
+ "family": "llama",
+ "created_at": "2024-09-25 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.72,
+ "output_per_million": 0.72
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-09-25",
+ "cost": {
+ "input": 0.72,
+ "output": 0.72
+ },
+ "limit": {
+ "context": 128000,
+ "output": 4096
+ },
+ "knowledge": "2023-12"
+ }
+ },
+ {
+ "id": "meta.llama3-3-70b-instruct-v1:0",
+ "name": "Llama 3.3 70B Instruct",
+ "provider": "bedrock",
+ "family": "llama",
+ "created_at": "2024-12-06 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.72,
+ "output_per_million": 0.72
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2024-12-06",
+ "cost": {
+ "input": 0.72,
+ "output": 0.72
+ },
+ "limit": {
+ "context": 128000,
+ "output": 4096
+ },
+ "knowledge": "2023-12"
+ }
+ },
+ {
+ "id": "meta.llama4-maverick-17b-instruct-v1:0",
+ "name": "Llama 4 Maverick 17B Instruct",
+ "provider": "bedrock",
+ "family": "llama",
+ "created_at": "2025-04-05 00:00:00 +0530",
+ "context_window": 1000000,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.24,
+ "output_per_million": 0.97
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-04-05",
+ "cost": {
+ "input": 0.24,
+ "output": 0.97
+ },
+ "limit": {
+ "context": 1000000,
+ "output": 16384
+ },
+ "knowledge": "2024-08"
+ }
+ },
+ {
+ "id": "meta.llama4-scout-17b-instruct-v1:0",
+ "name": "Llama 4 Scout 17B Instruct",
+ "provider": "bedrock",
+ "family": "llama",
+ "created_at": "2025-04-05 00:00:00 +0530",
+ "context_window": 3500000,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.17,
+ "output_per_million": 0.66
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-04-05",
+ "cost": {
+ "input": 0.17,
+ "output": 0.66
+ },
+ "limit": {
+ "context": 3500000,
+ "output": 16384
+ },
+ "knowledge": "2024-08"
+ }
+ },
+ {
+ "id": "minimax.minimax-m2",
+ "name": "MiniMax M2",
+ "provider": "bedrock",
+ "family": "minimax",
+ "created_at": "2025-10-27 00:00:00 +0530",
+ "context_window": 204608,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.3,
+ "output_per_million": 1.2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-10-27",
+ "cost": {
+ "input": 0.3,
+ "output": 1.2
+ },
+ "limit": {
+ "context": 204608,
+ "output": 128000
+ }
+ }
+ },
+ {
+ "id": "minimax.minimax-m2.1",
+ "name": "MiniMax M2.1",
+ "provider": "bedrock",
+ "family": "minimax",
+ "created_at": "2025-12-23 00:00:00 +0530",
+ "context_window": 204800,
+ "max_output_tokens": 131072,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.3,
+ "output_per_million": 1.2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-12-23",
+ "cost": {
+ "input": 0.3,
+ "output": 1.2
+ },
+ "limit": {
+ "context": 204800,
+ "output": 131072
+ }
+ }
+ },
+ {
+ "id": "minimax.minimax-m2.5",
+ "name": "MiniMax M2.5",
+ "provider": "bedrock",
+ "family": "minimax",
+ "created_at": "2026-03-18 00:00:00 +0530",
+ "context_window": 196608,
+ "max_output_tokens": 98304,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.3,
+ "output_per_million": 1.2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-03-18",
+ "cost": {
+ "input": 0.3,
+ "output": 1.2
+ },
+ "limit": {
+ "context": 196608,
+ "output": 98304
+ }
+ }
+ },
+ {
+ "id": "mistral.devstral-2-123b",
+ "name": "Devstral 2 123B",
+ "provider": "bedrock",
+ "family": "devstral",
+ "created_at": "2026-02-17 00:00:00 +0530",
+ "context_window": 256000,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.4,
+ "output_per_million": 2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-02-17",
+ "cost": {
+ "input": 0.4,
+ "output": 2
+ },
+ "limit": {
+ "context": 256000,
+ "output": 8192
+ }
+ }
+ },
+ {
+ "id": "mistral.magistral-small-2509",
+ "name": "Magistral Small 1.2",
+ "provider": "bedrock",
+ "family": "magistral",
+ "created_at": "2025-12-02 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 40000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-12-02",
+ "cost": {
+ "input": 0.5,
+ "output": 1.5
+ },
+ "limit": {
+ "context": 128000,
+ "output": 40000
+ }
+ }
+ },
+ {
+ "id": "mistral.ministral-3-14b-instruct",
+ "name": "Ministral 14B 3.0",
+ "provider": "bedrock",
+ "family": "ministral",
+ "created_at": "2024-12-01 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.2,
+ "output_per_million": 0.2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2024-12-01",
+ "cost": {
+ "input": 0.2,
+ "output": 0.2
+ },
+ "limit": {
+ "context": 128000,
+ "output": 4096
+ }
+ }
+ },
+ {
+ "id": "mistral.ministral-3-3b-instruct",
+ "name": "Ministral 3 3B",
+ "provider": "bedrock",
+ "family": "ministral",
+ "created_at": "2025-12-02 00:00:00 +0530",
+ "context_window": 256000,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.1,
+ "output_per_million": 0.1
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-12-02",
+ "cost": {
+ "input": 0.1,
+ "output": 0.1
+ },
+ "limit": {
+ "context": 256000,
+ "output": 8192
+ }
+ }
+ },
+ {
+ "id": "mistral.ministral-3-8b-instruct",
+ "name": "Ministral 3 8B",
+ "provider": "bedrock",
+ "family": "ministral",
+ "created_at": "2024-12-01 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.15,
+ "output_per_million": 0.15
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2024-12-01",
+ "cost": {
+ "input": 0.15,
+ "output": 0.15
+ },
+ "limit": {
+ "context": 128000,
+ "output": 4096
+ }
+ }
+ },
+ {
+ "id": "mistral.mistral-large-3-675b-instruct",
+ "name": "Mistral Large 3",
+ "provider": "bedrock",
+ "family": "mistral",
+ "created_at": "2025-12-02 00:00:00 +0530",
+ "context_window": 256000,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-12-02",
+ "cost": {
+ "input": 0.5,
+ "output": 1.5
+ },
+ "limit": {
+ "context": 256000,
+ "output": 8192
+ }
+ }
+ },
+ {
+ "id": "mistral.pixtral-large-2502-v1:0",
+ "name": "Pixtral Large (25.02)",
+ "provider": "bedrock",
+ "family": "mistral",
+ "created_at": "2025-04-08 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2,
+ "output_per_million": 6
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-04-08",
+ "cost": {
+ "input": 2,
+ "output": 6
+ },
+ "limit": {
+ "context": 128000,
+ "output": 8192
+ }
+ }
+ },
+ {
+ "id": "mistral.voxtral-mini-3b-2507",
+ "name": "Voxtral Mini 3B 2507",
+ "provider": "bedrock",
+ "family": "mistral",
+ "created_at": "2024-12-01 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "audio",
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.04,
+ "output_per_million": 0.04
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2024-12-01",
+ "cost": {
+ "input": 0.04,
+ "output": 0.04
+ },
+ "limit": {
+ "context": 128000,
+ "output": 4096
+ }
+ }
+ },
+ {
+ "id": "mistral.voxtral-small-24b-2507",
+ "name": "Voxtral Small 24B 2507",
+ "provider": "bedrock",
+ "family": "mistral",
+ "created_at": "2025-07-01 00:00:00 +0530",
+ "context_window": 32000,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "audio"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.15,
+ "output_per_million": 0.35
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-07-01",
+ "cost": {
+ "input": 0.15,
+ "output": 0.35
+ },
+ "limit": {
+ "context": 32000,
+ "output": 8192
+ }
+ }
+ },
+ {
+ "id": "moonshot.kimi-k2-thinking",
+ "name": "Kimi K2 Thinking",
+ "provider": "bedrock",
+ "family": "kimi-thinking",
+ "created_at": "2025-12-02 00:00:00 +0530",
+ "context_window": 256000,
+ "max_output_tokens": 256000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.6,
+ "output_per_million": 2.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-12-02",
+ "interleaved": true,
+ "cost": {
+ "input": 0.6,
+ "output": 2.5
+ },
+ "limit": {
+ "context": 256000,
+ "output": 256000
+ }
+ }
+ },
+ {
+ "id": "moonshotai.kimi-k2.5",
+ "name": "Kimi K2.5",
+ "provider": "bedrock",
+ "family": "kimi",
+ "created_at": "2026-02-06 00:00:00 +0530",
+ "context_window": 256000,
+ "max_output_tokens": 256000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.6,
+ "output_per_million": 3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-02-06",
+ "interleaved": true,
+ "cost": {
+ "input": 0.6,
+ "output": 3
+ },
+ "limit": {
+ "context": 256000,
+ "output": 256000
+ }
+ }
+ },
+ {
+ "id": "nvidia.nemotron-nano-12b-v2",
+ "name": "NVIDIA Nemotron Nano 12B v2 VL BF16",
+ "provider": "bedrock",
+ "family": "nemotron",
+ "created_at": "2024-12-01 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.2,
+ "output_per_million": 0.6
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2024-12-01",
+ "cost": {
+ "input": 0.2,
+ "output": 0.6
+ },
+ "limit": {
+ "context": 128000,
+ "output": 4096
+ }
+ }
+ },
+ {
+ "id": "nvidia.nemotron-nano-3-30b",
+ "name": "NVIDIA Nemotron Nano 3 30B",
+ "provider": "bedrock",
+ "family": "nemotron",
+ "created_at": "2025-12-23 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.06,
+ "output_per_million": 0.24
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-12-23",
+ "cost": {
+ "input": 0.06,
+ "output": 0.24
+ },
+ "limit": {
+ "context": 128000,
+ "output": 4096
+ }
+ }
+ },
+ {
+ "id": "nvidia.nemotron-nano-9b-v2",
+ "name": "NVIDIA Nemotron Nano 9B v2",
+ "provider": "bedrock",
+ "family": "nemotron",
+ "created_at": "2024-12-01 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.06,
+ "output_per_million": 0.23
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2024-12-01",
+ "cost": {
+ "input": 0.06,
+ "output": 0.23
+ },
+ "limit": {
+ "context": 128000,
+ "output": 4096
+ }
+ }
+ },
+ {
+ "id": "nvidia.nemotron-super-3-120b",
+ "name": "NVIDIA Nemotron 3 Super 120B A12B",
+ "provider": "bedrock",
+ "family": "nemotron",
+ "created_at": "2026-03-11 00:00:00 +0530",
+ "context_window": 262144,
+ "max_output_tokens": 131072,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.15,
+ "output_per_million": 0.65
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-03-11",
+ "cost": {
+ "input": 0.15,
+ "output": 0.65
+ },
+ "limit": {
+ "context": 262144,
+ "output": 131072
+ }
+ }
+ },
+ {
+ "id": "openai.gpt-oss-120b-1:0",
+ "name": "gpt-oss-120b",
+ "provider": "bedrock",
+ "family": "gpt-oss",
+ "created_at": "2024-12-01 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.15,
+ "output_per_million": 0.6
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2024-12-01",
+ "cost": {
+ "input": 0.15,
+ "output": 0.6
+ },
+ "limit": {
+ "context": 128000,
+ "output": 4096
+ }
+ }
+ },
+ {
+ "id": "openai.gpt-oss-20b-1:0",
+ "name": "gpt-oss-20b",
+ "provider": "bedrock",
+ "family": "gpt-oss",
+ "created_at": "2024-12-01 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.07,
+ "output_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2024-12-01",
+ "cost": {
+ "input": 0.07,
+ "output": 0.3
+ },
+ "limit": {
+ "context": 128000,
+ "output": 4096
+ }
+ }
+ },
+ {
+ "id": "openai.gpt-oss-safeguard-120b",
+ "name": "GPT OSS Safeguard 120B",
+ "provider": "bedrock",
+ "family": "gpt-oss",
+ "created_at": "2024-12-01 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.15,
+ "output_per_million": 0.6
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2024-12-01",
+ "cost": {
+ "input": 0.15,
+ "output": 0.6
+ },
+ "limit": {
+ "context": 128000,
+ "output": 4096
+ }
+ }
+ },
+ {
+ "id": "openai.gpt-oss-safeguard-20b",
+ "name": "GPT OSS Safeguard 20B",
+ "provider": "bedrock",
+ "family": "gpt-oss",
+ "created_at": "2024-12-01 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.07,
+ "output_per_million": 0.2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2024-12-01",
+ "cost": {
+ "input": 0.07,
+ "output": 0.2
+ },
+ "limit": {
+ "context": 128000,
+ "output": 4096
+ }
+ }
+ },
+ {
+ "id": "qwen.qwen3-235b-a22b-2507-v1:0",
+ "name": "Qwen3 235B A22B 2507",
+ "provider": "bedrock",
+ "family": "qwen",
+ "created_at": "2025-09-18 00:00:00 +0530",
+ "context_window": 262144,
+ "max_output_tokens": 131072,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.22,
+ "output_per_million": 0.88
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-09-18",
+ "cost": {
+ "input": 0.22,
+ "output": 0.88
+ },
+ "limit": {
+ "context": 262144,
+ "output": 131072
+ },
+ "knowledge": "2024-04"
+ }
+ },
+ {
+ "id": "qwen.qwen3-32b-v1:0",
+ "name": "Qwen3 32B (dense)",
+ "provider": "bedrock",
+ "family": "qwen",
+ "created_at": "2025-09-18 00:00:00 +0530",
+ "context_window": 16384,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.15,
+ "output_per_million": 0.6
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-09-18",
+ "cost": {
+ "input": 0.15,
+ "output": 0.6
+ },
+ "limit": {
+ "context": 16384,
+ "output": 16384
+ },
+ "knowledge": "2024-04"
+ }
+ },
+ {
+ "id": "qwen.qwen3-coder-30b-a3b-v1:0",
+ "name": "Qwen3 Coder 30B A3B Instruct",
+ "provider": "bedrock",
+ "family": "qwen",
+ "created_at": "2025-09-18 00:00:00 +0530",
+ "context_window": 262144,
+ "max_output_tokens": 131072,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.15,
+ "output_per_million": 0.6
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-09-18",
+ "cost": {
+ "input": 0.15,
+ "output": 0.6
+ },
+ "limit": {
+ "context": 262144,
+ "output": 131072
+ },
+ "knowledge": "2024-04"
+ }
+ },
+ {
+ "id": "qwen.qwen3-coder-480b-a35b-v1:0",
+ "name": "Qwen3 Coder 480B A35B Instruct",
+ "provider": "bedrock",
+ "family": "qwen",
+ "created_at": "2025-09-18 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.22,
+ "output_per_million": 1.8
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-09-18",
+ "cost": {
+ "input": 0.22,
+ "output": 1.8
+ },
+ "limit": {
+ "context": 131072,
+ "output": 65536
+ },
+ "knowledge": "2024-04"
+ }
+ },
+ {
+ "id": "qwen.qwen3-coder-next",
+ "name": "Qwen3 Coder Next",
+ "provider": "bedrock",
+ "family": "qwen",
+ "created_at": "2026-02-06 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.22,
+ "output_per_million": 1.8
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-02-06",
+ "cost": {
+ "input": 0.22,
+ "output": 1.8
+ },
+ "limit": {
+ "context": 131072,
+ "output": 65536
+ }
+ }
+ },
+ {
+ "id": "qwen.qwen3-next-80b-a3b",
+ "name": "Qwen/Qwen3-Next-80B-A3B-Instruct",
+ "provider": "bedrock",
+ "family": "qwen",
+ "created_at": "2025-09-18 00:00:00 +0530",
+ "context_window": 262000,
+ "max_output_tokens": 262000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.14,
+ "output_per_million": 1.4
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-11-25",
+ "cost": {
+ "input": 0.14,
+ "output": 1.4
+ },
+ "limit": {
+ "context": 262000,
+ "output": 262000
+ }
+ }
+ },
+ {
+ "id": "qwen.qwen3-vl-235b-a22b",
+ "name": "Qwen/Qwen3-VL-235B-A22B-Instruct",
+ "provider": "bedrock",
+ "family": "qwen",
+ "created_at": "2025-10-04 00:00:00 +0530",
+ "context_window": 262000,
+ "max_output_tokens": 262000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.3,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-11-25",
+ "cost": {
+ "input": 0.3,
+ "output": 1.5
+ },
+ "limit": {
+ "context": 262000,
+ "output": 262000
+ }
+ }
+ },
+ {
+ "id": "us.anthropic.claude-haiku-4-5-20251001-v1:0",
+ "name": "Claude Haiku 4.5 (US)",
+ "provider": "bedrock",
+ "family": "claude-haiku",
+ "created_at": "2025-10-15 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": "2025-02-28",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1,
+ "output_per_million": 5,
+ "cached_input_per_million": 0.1
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-10-15",
+ "cost": {
+ "input": 1,
+ "output": 5,
+ "cache_read": 0.1,
+ "cache_write": 1.25
+ },
+ "limit": {
+ "context": 200000,
+ "output": 64000
+ },
+ "knowledge": "2025-02-28"
+ }
+ },
+ {
+ "id": "us.anthropic.claude-opus-4-1-20250805-v1:0",
+ "name": "Claude Opus 4.1 (US)",
+ "provider": "bedrock",
+ "family": "claude-opus",
+ "created_at": "2025-08-05 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 32000,
+ "knowledge_cutoff": "2025-03-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 15,
+ "output_per_million": 75,
+ "cached_input_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-08-05",
+ "cost": {
+ "input": 15,
+ "output": 75,
+ "cache_read": 1.5,
+ "cache_write": 18.75
+ },
+ "limit": {
+ "context": 200000,
+ "output": 32000
+ },
+ "knowledge": "2025-03-31"
+ }
+ },
+ {
+ "id": "us.anthropic.claude-opus-4-20250514-v1:0",
+ "name": "Claude Opus 4 (US)",
+ "provider": "bedrock",
+ "family": "claude-opus",
+ "created_at": "2025-05-22 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 32000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 15,
+ "output_per_million": 75,
+ "cached_input_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-05-22",
+ "cost": {
+ "input": 15,
+ "output": 75,
+ "cache_read": 1.5,
+ "cache_write": 18.75
+ },
+ "limit": {
+ "context": 200000,
+ "output": 32000
+ },
+ "knowledge": "2024-04"
+ }
+ },
+ {
+ "id": "us.anthropic.claude-opus-4-5-20251101-v1:0",
+ "name": "Claude Opus 4.5 (US)",
+ "provider": "bedrock",
+ "family": "claude-opus",
+ "created_at": "2025-11-24 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": "2025-03-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 5,
+ "output_per_million": 25,
+ "cached_input_per_million": 0.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-08-01",
+ "cost": {
+ "input": 5,
+ "output": 25,
+ "cache_read": 0.5,
+ "cache_write": 6.25
+ },
+ "limit": {
+ "context": 200000,
+ "output": 64000
+ },
+ "knowledge": "2025-03-31"
+ }
+ },
+ {
+ "id": "us.anthropic.claude-opus-4-6-v1",
+ "name": "Claude Opus 4.6 (US)",
+ "provider": "bedrock",
+ "family": "claude-opus",
+ "created_at": "2026-02-05 00:00:00 +0530",
+ "context_window": 1000000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 5,
+ "output_per_million": 25,
+ "cached_input_per_million": 0.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-03-18",
+ "cost": {
+ "input": 5,
+ "output": 25,
+ "cache_read": 0.5,
+ "cache_write": 6.25
+ },
+ "limit": {
+ "context": 1000000,
+ "output": 128000
+ },
+ "knowledge": "2025-05"
+ }
+ },
+ {
+ "id": "us.anthropic.claude-sonnet-4-20250514-v1:0",
+ "name": "Claude Sonnet 4 (US)",
+ "provider": "bedrock",
+ "family": "claude-sonnet",
+ "created_at": "2025-05-22 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 3,
+ "output_per_million": 15,
+ "cached_input_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-05-22",
+ "cost": {
+ "input": 3,
+ "output": 15,
+ "cache_read": 0.3,
+ "cache_write": 3.75
+ },
+ "limit": {
+ "context": 200000,
+ "output": 64000
+ },
+ "knowledge": "2024-04"
+ }
+ },
+ {
+ "id": "us.anthropic.claude-sonnet-4-5-20250929-v1:0",
+ "name": "Claude Sonnet 4.5 (US)",
+ "provider": "bedrock",
+ "family": "claude-sonnet",
+ "created_at": "2025-09-29 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": "2025-07-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 3,
+ "output_per_million": 15,
+ "cached_input_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-09-29",
+ "cost": {
+ "input": 3,
+ "output": 15,
+ "cache_read": 0.3,
+ "cache_write": 3.75
+ },
+ "limit": {
+ "context": 200000,
+ "output": 64000
+ },
+ "knowledge": "2025-07-31"
+ }
+ },
+ {
+ "id": "us.anthropic.claude-sonnet-4-6",
+ "name": "Claude Sonnet 4.6 (US)",
+ "provider": "bedrock",
+ "family": "claude-sonnet",
+ "created_at": "2026-02-17 00:00:00 +0530",
+ "context_window": 1000000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 3,
+ "output_per_million": 15,
+ "cached_input_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-03-18",
+ "cost": {
+ "input": 3,
+ "output": 15,
+ "cache_read": 0.3,
+ "cache_write": 3.75
+ },
+ "limit": {
+ "context": 1000000,
+ "output": 64000
+ },
+ "knowledge": "2025-08"
+ }
+ },
+ {
+ "id": "writer.palmyra-x4-v1:0",
+ "name": "Palmyra X4",
+ "provider": "bedrock",
+ "family": "palmyra",
+ "created_at": "2025-04-28 00:00:00 +0530",
+ "context_window": 122880,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2.5,
+ "output_per_million": 10
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-04-28",
+ "cost": {
+ "input": 2.5,
+ "output": 10
+ },
+ "limit": {
+ "context": 122880,
+ "output": 8192
+ }
+ }
+ },
+ {
+ "id": "writer.palmyra-x5-v1:0",
+ "name": "Palmyra X5",
+ "provider": "bedrock",
+ "family": "palmyra",
+ "created_at": "2025-04-28 00:00:00 +0530",
+ "context_window": 1040000,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.6,
+ "output_per_million": 6
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-04-28",
+ "cost": {
+ "input": 0.6,
+ "output": 6
+ },
+ "limit": {
+ "context": 1040000,
+ "output": 8192
+ }
+ }
+ },
+ {
+ "id": "zai.glm-4.7",
+ "name": "GLM-4.7",
+ "provider": "bedrock",
+ "family": "glm",
+ "created_at": "2025-12-22 00:00:00 +0530",
+ "context_window": 204800,
+ "max_output_tokens": 131072,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.6,
+ "output_per_million": 2.2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-12-22",
+ "interleaved": {
+ "field": "reasoning_content"
+ },
+ "cost": {
+ "input": 0.6,
+ "output": 2.2
+ },
+ "limit": {
+ "context": 204800,
+ "output": 131072
+ },
+ "knowledge": "2025-04"
+ }
+ },
+ {
+ "id": "zai.glm-4.7-flash",
+ "name": "GLM-4.7-Flash",
+ "provider": "bedrock",
+ "family": "glm-flash",
+ "created_at": "2026-01-19 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 131072,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.07,
+ "output_per_million": 0.4
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-01-19",
+ "cost": {
+ "input": 0.07,
+ "output": 0.4
+ },
+ "limit": {
+ "context": 200000,
+ "output": 131072
+ },
+ "knowledge": "2025-04"
+ }
+ },
+ {
+ "id": "zai.glm-5",
+ "name": "GLM-5",
+ "provider": "bedrock",
+ "family": "glm",
+ "created_at": "2026-03-18 00:00:00 +0530",
+ "context_window": 202752,
+ "max_output_tokens": 101376,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1,
+ "output_per_million": 3.2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "amazon-bedrock",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-03-18",
+ "interleaved": {
+ "field": "reasoning_content"
+ },
+ "cost": {
+ "input": 1,
+ "output": 3.2
+ },
+ "limit": {
+ "context": 202752,
+ "output": 101376
+ }
+ }
+ },
+ {
+ "id": "deepseek-chat",
+ "name": "DeepSeek Chat",
+ "provider": "deepseek",
+ "family": "deepseek",
+ "created_at": "2025-12-01 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.28,
+ "output_per_million": 0.42,
+ "cached_input_per_million": 0.028
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "deepseek",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-02-28",
+ "cost": {
+ "input": 0.28,
+ "output": 0.42,
+ "cache_read": 0.028
+ },
+ "limit": {
+ "context": 131072,
+ "output": 8192
+ },
+ "knowledge": "2025-09"
+ }
+ },
+ {
+ "id": "deepseek-reasoner",
+ "name": "DeepSeek Reasoner",
+ "provider": "deepseek",
+ "family": "deepseek-thinking",
+ "created_at": "2025-12-01 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.28,
+ "output_per_million": 0.42,
+ "cached_input_per_million": 0.028
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "deepseek",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-02-28",
+ "interleaved": {
+ "field": "reasoning_content"
+ },
+ "cost": {
+ "input": 0.28,
+ "output": 0.42,
+ "cache_read": 0.028
+ },
+ "limit": {
+ "context": 128000,
+ "output": 64000
+ },
+ "knowledge": "2025-09"
+ }
+ },
+ {
+ "id": "gemini-1.5-flash",
+ "name": "Gemini 1.5 Flash",
+ "provider": "gemini",
+ "family": "gemini-flash",
+ "created_at": "2024-05-14 00:00:00 +0530",
+ "context_window": 1000000,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.075,
+ "output_per_million": 0.3,
+ "cached_input_per_million": 0.01875
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-05-14",
+ "cost": {
+ "input": 0.075,
+ "output": 0.3,
+ "cache_read": 0.01875
+ },
+ "limit": {
+ "context": 1000000,
+ "output": 8192
+ },
+ "knowledge": "2024-04"
+ }
+ },
+ {
+ "id": "gemini-1.5-flash-8b",
+ "name": "Gemini 1.5 Flash-8B",
+ "provider": "gemini",
+ "family": "gemini-flash",
+ "created_at": "2024-10-03 00:00:00 +0530",
+ "context_window": 1000000,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.0375,
+ "output_per_million": 0.15,
+ "cached_input_per_million": 0.01
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-10-03",
+ "cost": {
+ "input": 0.0375,
+ "output": 0.15,
+ "cache_read": 0.01
+ },
+ "limit": {
+ "context": 1000000,
+ "output": 8192
+ },
+ "knowledge": "2024-04"
+ }
+ },
+ {
+ "id": "gemini-1.5-pro",
+ "name": "Gemini 1.5 Pro",
+ "provider": "gemini",
+ "family": "gemini-pro",
+ "created_at": "2024-02-15 00:00:00 +0530",
+ "context_window": 1000000,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 5,
+ "cached_input_per_million": 0.3125
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-02-15",
+ "cost": {
+ "input": 1.25,
+ "output": 5,
+ "cache_read": 0.3125
+ },
+ "limit": {
+ "context": 1000000,
+ "output": 8192
+ },
+ "knowledge": "2024-04"
+ }
+ },
+ {
+ "id": "gemini-2.0-flash",
+ "name": "Gemini 2.0 Flash",
+ "provider": "gemini",
+ "family": "gemini-flash",
+ "created_at": "2024-12-11 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.1,
+ "output_per_million": 0.4,
+ "cached_input_per_million": 0.025
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-12-11",
+ "cost": {
+ "input": 0.1,
+ "output": 0.4,
+ "cache_read": 0.025
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 8192
+ },
+ "knowledge": "2024-06"
+ }
+ },
+ {
+ "id": "gemini-2.0-flash-lite",
+ "name": "Gemini 2.0 Flash Lite",
+ "provider": "gemini",
+ "family": "gemini-flash-lite",
+ "created_at": "2024-12-11 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.075,
+ "output_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-12-11",
+ "cost": {
+ "input": 0.075,
+ "output": 0.3
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 8192
+ },
+ "knowledge": "2024-06"
+ }
+ },
+ {
+ "id": "gemini-2.5-flash",
+ "name": "Gemini 2.5 Flash",
+ "provider": "gemini",
+ "family": "gemini-flash",
+ "created_at": "2025-03-20 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.3,
+ "output_per_million": 2.5,
+ "cached_input_per_million": 0.075
+ }
+ },
+ "audio_tokens": {
+ "standard": {
+ "input_per_million": 1
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-06-05",
+ "cost": {
+ "input": 0.3,
+ "output": 2.5,
+ "cache_read": 0.075,
+ "input_audio": 1
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-2.5-flash-image",
+ "name": "Gemini 2.5 Flash Image",
+ "provider": "gemini",
+ "family": "gemini-flash",
+ "created_at": "2025-08-26 00:00:00 +0530",
+ "context_window": 32768,
+ "max_output_tokens": 32768,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text",
+ "image"
+ ]
+ },
+ "capabilities": [
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.3,
+ "output_per_million": 30,
+ "cached_input_per_million": 0.075
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-08-26",
+ "cost": {
+ "input": 0.3,
+ "output": 30,
+ "cache_read": 0.075
+ },
+ "limit": {
+ "context": 32768,
+ "output": 32768
+ },
+ "knowledge": "2025-06"
+ }
+ },
+ {
+ "id": "gemini-2.5-flash-image-preview",
+ "name": "Gemini 2.5 Flash Image (Preview)",
+ "provider": "gemini",
+ "family": "gemini-flash",
+ "created_at": "2025-08-26 00:00:00 +0530",
+ "context_window": 32768,
+ "max_output_tokens": 32768,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text",
+ "image"
+ ]
+ },
+ "capabilities": [
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.3,
+ "output_per_million": 30,
+ "cached_input_per_million": 0.075
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-08-26",
+ "cost": {
+ "input": 0.3,
+ "output": 30,
+ "cache_read": 0.075
+ },
+ "limit": {
+ "context": 32768,
+ "output": 32768
+ },
+ "knowledge": "2025-06"
+ }
+ },
+ {
+ "id": "gemini-2.5-flash-lite",
+ "name": "Gemini 2.5 Flash Lite",
+ "provider": "gemini",
+ "family": "gemini-flash-lite",
+ "created_at": "2025-06-17 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.1,
+ "output_per_million": 0.4,
+ "cached_input_per_million": 0.025
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-06-17",
+ "cost": {
+ "input": 0.1,
+ "output": 0.4,
+ "cache_read": 0.025
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-2.5-flash-lite-preview-06-17",
+ "name": "Gemini 2.5 Flash Lite Preview 06-17",
+ "provider": "gemini",
+ "family": "gemini-flash-lite",
+ "created_at": "2025-06-17 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.1,
+ "output_per_million": 0.4,
+ "cached_input_per_million": 0.025
+ }
+ },
+ "audio_tokens": {
+ "standard": {
+ "input_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-06-17",
+ "cost": {
+ "input": 0.1,
+ "output": 0.4,
+ "cache_read": 0.025,
+ "input_audio": 0.3
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-2.5-flash-lite-preview-09-2025",
+ "name": "Gemini 2.5 Flash Lite Preview 09-25",
+ "provider": "gemini",
+ "family": "gemini-flash-lite",
+ "created_at": "2025-09-25 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.1,
+ "output_per_million": 0.4,
+ "cached_input_per_million": 0.025
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-09-25",
+ "cost": {
+ "input": 0.1,
+ "output": 0.4,
+ "cache_read": 0.025
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-2.5-flash-preview-04-17",
+ "name": "Gemini 2.5 Flash Preview 04-17",
+ "provider": "gemini",
+ "family": "gemini-flash",
+ "created_at": "2025-04-17 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.15,
+ "output_per_million": 0.6,
+ "cached_input_per_million": 0.0375
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-04-17",
+ "cost": {
+ "input": 0.15,
+ "output": 0.6,
+ "cache_read": 0.0375
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-2.5-flash-preview-05-20",
+ "name": "Gemini 2.5 Flash Preview 05-20",
+ "provider": "gemini",
+ "family": "gemini-flash",
+ "created_at": "2025-05-20 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.15,
+ "output_per_million": 0.6,
+ "cached_input_per_million": 0.0375
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-05-20",
+ "cost": {
+ "input": 0.15,
+ "output": 0.6,
+ "cache_read": 0.0375
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-2.5-flash-preview-09-2025",
+ "name": "Gemini 2.5 Flash Preview 09-25",
+ "provider": "gemini",
+ "family": "gemini-flash",
+ "created_at": "2025-09-25 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.3,
+ "output_per_million": 2.5,
+ "cached_input_per_million": 0.075
+ }
+ },
+ "audio_tokens": {
+ "standard": {
+ "input_per_million": 1
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-09-25",
+ "cost": {
+ "input": 0.3,
+ "output": 2.5,
+ "cache_read": 0.075,
+ "input_audio": 1
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-2.5-flash-preview-tts",
+ "name": "Gemini 2.5 Flash Preview TTS",
+ "provider": "gemini",
+ "family": "gemini-flash",
+ "created_at": "2025-05-01 00:00:00 +0530",
+ "context_window": 8000,
+ "max_output_tokens": 16000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "audio"
+ ]
+ },
+ "capabilities": [],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 10
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": false,
+ "last_updated": "2025-05-01",
+ "cost": {
+ "input": 0.5,
+ "output": 10
+ },
+ "limit": {
+ "context": 8000,
+ "output": 16000
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-2.5-pro",
+ "name": "Gemini 2.5 Pro",
+ "provider": "gemini",
+ "family": "gemini-pro",
+ "created_at": "2025-03-20 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10,
+ "cached_input_per_million": 0.31
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-06-05",
+ "cost": {
+ "input": 1.25,
+ "output": 10,
+ "cache_read": 0.31
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-2.5-pro-preview-05-06",
+ "name": "Gemini 2.5 Pro Preview 05-06",
+ "provider": "gemini",
+ "family": "gemini-pro",
+ "created_at": "2025-05-06 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10,
+ "cached_input_per_million": 0.31
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-05-06",
+ "cost": {
+ "input": 1.25,
+ "output": 10,
+ "cache_read": 0.31
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-2.5-pro-preview-06-05",
+ "name": "Gemini 2.5 Pro Preview 06-05",
+ "provider": "gemini",
+ "family": "gemini-pro",
+ "created_at": "2025-06-05 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10,
+ "cached_input_per_million": 0.31
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-06-05",
+ "cost": {
+ "input": 1.25,
+ "output": 10,
+ "cache_read": 0.31
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-2.5-pro-preview-tts",
+ "name": "Gemini 2.5 Pro Preview TTS",
+ "provider": "gemini",
+ "family": "gemini-flash",
+ "created_at": "2025-05-01 00:00:00 +0530",
+ "context_window": 8000,
+ "max_output_tokens": 16000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "audio"
+ ]
+ },
+ "capabilities": [],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1,
+ "output_per_million": 20
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": false,
+ "last_updated": "2025-05-01",
+ "cost": {
+ "input": 1,
+ "output": 20
+ },
+ "limit": {
+ "context": 8000,
+ "output": 16000
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-3-flash-preview",
+ "name": "Gemini 3 Flash Preview",
+ "provider": "gemini",
+ "family": "gemini-flash",
+ "created_at": "2025-12-17 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "video",
+ "audio",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 3,
+ "cached_input_per_million": 0.05
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-12-17",
+ "cost": {
+ "input": 0.5,
+ "output": 3,
+ "cache_read": 0.05,
+ "context_over_200k": {
+ "input": 0.5,
+ "output": 3,
+ "cache_read": 0.05
+ }
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-3-pro-preview",
+ "name": "Gemini 3 Pro Preview",
+ "provider": "gemini",
+ "family": "gemini-pro",
+ "created_at": "2025-11-18 00:00:00 +0530",
+ "context_window": 1000000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "video",
+ "audio",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2,
+ "output_per_million": 12,
+ "cached_input_per_million": 0.2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-11-18",
+ "cost": {
+ "input": 2,
+ "output": 12,
+ "cache_read": 0.2,
+ "context_over_200k": {
+ "input": 4,
+ "output": 18,
+ "cache_read": 0.4
+ }
+ },
+ "limit": {
+ "context": 1000000,
+ "output": 64000
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-3.1-flash-image-preview",
+ "name": "Gemini 3.1 Flash Image (Preview)",
+ "provider": "gemini",
+ "family": "gemini-flash",
+ "created_at": "2026-02-26 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 32768,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text",
+ "image"
+ ]
+ },
+ "capabilities": [
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.25,
+ "output_per_million": 60
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-02-26",
+ "cost": {
+ "input": 0.25,
+ "output": 60
+ },
+ "limit": {
+ "context": 131072,
+ "output": 32768
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-3.1-flash-lite-preview",
+ "name": "Gemini 3.1 Flash Lite Preview",
+ "provider": "gemini",
+ "family": "gemini-flash-lite",
+ "created_at": "2026-03-03 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "video",
+ "audio",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.25,
+ "output_per_million": 1.5,
+ "cached_input_per_million": 0.025
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-03-03",
+ "cost": {
+ "input": 0.25,
+ "output": 1.5,
+ "cache_read": 0.025,
+ "cache_write": 1
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-3.1-pro-preview",
+ "name": "Gemini 3.1 Pro Preview",
+ "provider": "gemini",
+ "family": "gemini-pro",
+ "created_at": "2026-02-19 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "video",
+ "audio",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2,
+ "output_per_million": 12,
+ "cached_input_per_million": 0.2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-02-19",
+ "cost": {
+ "input": 2,
+ "output": 12,
+ "cache_read": 0.2,
+ "context_over_200k": {
+ "input": 4,
+ "output": 18,
+ "cache_read": 0.4
+ }
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-3.1-pro-preview-customtools",
+ "name": "Gemini 3.1 Pro Preview Custom Tools",
+ "provider": "gemini",
+ "family": "gemini-pro",
+ "created_at": "2026-02-19 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "video",
+ "audio",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2,
+ "output_per_million": 12,
+ "cached_input_per_million": 0.2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-02-19",
+ "cost": {
+ "input": 2,
+ "output": 12,
+ "cache_read": 0.2,
+ "context_over_200k": {
+ "input": 4,
+ "output": 18,
+ "cache_read": 0.4
+ }
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-embedding-001",
+ "name": "Gemini Embedding 001",
+ "provider": "gemini",
+ "family": "gemini",
+ "created_at": "2025-05-20 00:00:00 +0530",
+ "context_window": 2048,
+ "max_output_tokens": 3072,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.15
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": false,
+ "last_updated": "2025-05-20",
+ "cost": {
+ "input": 0.15,
+ "output": 0
+ },
+ "limit": {
+ "context": 2048,
+ "output": 3072
+ },
+ "knowledge": "2025-05"
+ }
+ },
+ {
+ "id": "gemini-flash-latest",
+ "name": "Gemini Flash Latest",
+ "provider": "gemini",
+ "family": "gemini-flash",
+ "created_at": "2025-09-25 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.3,
+ "output_per_million": 2.5,
+ "cached_input_per_million": 0.075
+ }
+ },
+ "audio_tokens": {
+ "standard": {
+ "input_per_million": 1
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-09-25",
+ "cost": {
+ "input": 0.3,
+ "output": 2.5,
+ "cache_read": 0.075,
+ "input_audio": 1
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-flash-lite-latest",
+ "name": "Gemini Flash-Lite Latest",
+ "provider": "gemini",
+ "family": "gemini-flash-lite",
+ "created_at": "2025-09-25 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.1,
+ "output_per_million": 0.4,
+ "cached_input_per_million": 0.025
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-09-25",
+ "cost": {
+ "input": 0.1,
+ "output": 0.4,
+ "cache_read": 0.025
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-live-2.5-flash",
+ "name": "Gemini Live 2.5 Flash",
+ "provider": "gemini",
+ "family": "gemini-flash",
+ "created_at": "2025-09-01 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 8000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video"
+ ],
+ "output": [
+ "text",
+ "audio"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 2
+ }
+ },
+ "audio_tokens": {
+ "standard": {
+ "input_per_million": 3,
+ "output_per_million": 12
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-09-01",
+ "cost": {
+ "input": 0.5,
+ "output": 2,
+ "input_audio": 3,
+ "output_audio": 12
+ },
+ "limit": {
+ "context": 128000,
+ "output": 8000
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-live-2.5-flash-preview-native-audio",
+ "name": "Gemini Live 2.5 Flash Preview Native Audio",
+ "provider": "gemini",
+ "family": "gemini-flash",
+ "created_at": "2025-06-17 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "audio",
+ "video"
+ ],
+ "output": [
+ "text",
+ "audio"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 2
+ }
+ },
+ "audio_tokens": {
+ "standard": {
+ "input_per_million": 3,
+ "output_per_million": 12
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": false,
+ "last_updated": "2025-09-18",
+ "cost": {
+ "input": 0.5,
+ "output": 2,
+ "input_audio": 3,
+ "output_audio": 12
+ },
+ "limit": {
+ "context": 131072,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemma-3-12b-it",
+ "name": "Gemma 3 12B",
+ "provider": "gemini",
+ "family": "gemma",
+ "created_at": "2025-03-13 00:00:00 +0530",
+ "context_window": 32768,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "structured_output",
+ "vision"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-03-13",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 32768,
+ "output": 8192
+ },
+ "knowledge": "2024-10"
+ }
+ },
+ {
+ "id": "gemma-3-27b-it",
+ "name": "Gemma 3 27B",
+ "provider": "gemini",
+ "family": "gemma",
+ "created_at": "2025-03-12 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "vision"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-03-12",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 131072,
+ "output": 8192
+ },
+ "knowledge": "2024-10"
+ }
+ },
+ {
+ "id": "gemma-3-4b-it",
+ "name": "Gemma 3 4B",
+ "provider": "gemini",
+ "family": "gemma",
+ "created_at": "2025-03-13 00:00:00 +0530",
+ "context_window": 32768,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "vision"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-03-13",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 32768,
+ "output": 8192
+ },
+ "knowledge": "2024-10"
+ }
+ },
+ {
+ "id": "gemma-3n-e2b-it",
+ "name": "Gemma 3n 2B",
+ "provider": "gemini",
+ "family": "gemma",
+ "created_at": "2025-07-09 00:00:00 +0530",
+ "context_window": 8192,
+ "max_output_tokens": 2000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-07-09",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 8192,
+ "output": 2000
+ },
+ "knowledge": "2024-10"
+ }
+ },
+ {
+ "id": "gemma-3n-e4b-it",
+ "name": "Gemma 3n 4B",
+ "provider": "gemini",
+ "family": "gemma",
+ "created_at": "2025-05-20 00:00:00 +0530",
+ "context_window": 8192,
+ "max_output_tokens": 2000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-05-20",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 8192,
+ "output": 2000
+ },
+ "knowledge": "2024-10"
+ }
+ },
+ {
+ "id": "gemma-4-26b-it",
+ "name": "Gemma 4 26B",
+ "provider": "gemini",
+ "family": "gemma",
+ "created_at": "2026-04-02 00:00:00 +0530",
+ "context_window": 256000,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-04-02",
+ "limit": {
+ "context": 256000,
+ "output": 8192
+ }
+ }
+ },
+ {
+ "id": "gemma-4-31b-it",
+ "name": "Gemma 4 31B",
+ "provider": "gemini",
+ "family": "gemma",
+ "created_at": "2026-04-02 00:00:00 +0530",
+ "context_window": 256000,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-04-02",
+ "limit": {
+ "context": 256000,
+ "output": 8192
+ }
+ }
+ },
+ {
+ "id": "codestral-latest",
+ "name": "Codestral (latest)",
+ "provider": "mistral",
+ "family": "codestral",
+ "created_at": "2024-05-29 00:00:00 +0530",
+ "context_window": 256000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.3,
+ "output_per_million": 0.9
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "mistral",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-01-04",
+ "cost": {
+ "input": 0.3,
+ "output": 0.9
+ },
+ "limit": {
+ "context": 256000,
+ "output": 4096
+ },
+ "knowledge": "2024-10"
+ }
+ },
+ {
+ "id": "devstral-2512",
+ "name": "Devstral 2",
+ "provider": "mistral",
+ "family": "devstral",
+ "created_at": "2025-12-09 00:00:00 +0530",
+ "context_window": 262144,
+ "max_output_tokens": 262144,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.4,
+ "output_per_million": 2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "mistral",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-12-09",
+ "cost": {
+ "input": 0.4,
+ "output": 2
+ },
+ "limit": {
+ "context": 262144,
+ "output": 262144
+ },
+ "knowledge": "2025-12"
+ }
+ },
+ {
+ "id": "devstral-medium-2507",
+ "name": "Devstral Medium",
+ "provider": "mistral",
+ "family": "devstral",
+ "created_at": "2025-07-10 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.4,
+ "output_per_million": 2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "mistral",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-07-10",
+ "cost": {
+ "input": 0.4,
+ "output": 2
+ },
+ "limit": {
+ "context": 128000,
+ "output": 128000
+ },
+ "knowledge": "2025-05"
+ }
+ },
+ {
+ "id": "devstral-medium-latest",
+ "name": "Devstral 2 (latest)",
+ "provider": "mistral",
+ "family": "devstral",
+ "created_at": "2025-12-02 00:00:00 +0530",
+ "context_window": 262144,
+ "max_output_tokens": 262144,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.4,
+ "output_per_million": 2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "mistral",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-12-02",
+ "cost": {
+ "input": 0.4,
+ "output": 2
+ },
+ "limit": {
+ "context": 262144,
+ "output": 262144
+ },
+ "knowledge": "2025-12"
+ }
+ },
+ {
+ "id": "devstral-small-2505",
+ "name": "Devstral Small 2505",
+ "provider": "mistral",
+ "family": "devstral",
+ "created_at": "2025-05-07 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.1,
+ "output_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "mistral",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-05-07",
+ "cost": {
+ "input": 0.1,
+ "output": 0.3
+ },
+ "limit": {
+ "context": 128000,
+ "output": 128000
+ },
+ "knowledge": "2025-05"
+ }
+ },
+ {
+ "id": "devstral-small-2507",
+ "name": "Devstral Small",
+ "provider": "mistral",
+ "family": "devstral",
+ "created_at": "2025-07-10 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.1,
+ "output_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "mistral",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-07-10",
+ "cost": {
+ "input": 0.1,
+ "output": 0.3
+ },
+ "limit": {
+ "context": 128000,
+ "output": 128000
+ },
+ "knowledge": "2025-05"
+ }
+ },
+ {
+ "id": "labs-devstral-small-2512",
+ "name": "Devstral Small 2",
+ "provider": "mistral",
+ "family": "devstral",
+ "created_at": "2025-12-09 00:00:00 +0530",
+ "context_window": 256000,
+ "max_output_tokens": 256000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "mistral",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-12-09",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 256000,
+ "output": 256000
+ },
+ "knowledge": "2025-12"
+ }
+ },
+ {
+ "id": "magistral-medium-latest",
+ "name": "Magistral Medium (latest)",
+ "provider": "mistral",
+ "family": "magistral-medium",
+ "created_at": "2025-03-17 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2,
+ "output_per_million": 5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "mistral",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-03-20",
+ "cost": {
+ "input": 2,
+ "output": 5
+ },
+ "limit": {
+ "context": 128000,
+ "output": 16384
+ },
+ "knowledge": "2025-06"
+ }
+ },
+ {
+ "id": "magistral-small",
+ "name": "Magistral Small",
+ "provider": "mistral",
+ "family": "magistral-small",
+ "created_at": "2025-03-17 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "mistral",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-03-17",
+ "cost": {
+ "input": 0.5,
+ "output": 1.5
+ },
+ "limit": {
+ "context": 128000,
+ "output": 128000
+ },
+ "knowledge": "2025-06"
+ }
+ },
+ {
+ "id": "ministral-3b-latest",
+ "name": "Ministral 3B (latest)",
+ "provider": "mistral",
+ "family": "ministral",
+ "created_at": "2024-10-01 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.04,
+ "output_per_million": 0.04
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "mistral",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2024-10-04",
+ "cost": {
+ "input": 0.04,
+ "output": 0.04
+ },
+ "limit": {
+ "context": 128000,
+ "output": 128000
+ },
+ "knowledge": "2024-10"
+ }
+ },
+ {
+ "id": "ministral-8b-latest",
+ "name": "Ministral 8B (latest)",
+ "provider": "mistral",
+ "family": "ministral",
+ "created_at": "2024-10-01 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.1,
+ "output_per_million": 0.1
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "mistral",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2024-10-04",
+ "cost": {
+ "input": 0.1,
+ "output": 0.1
+ },
+ "limit": {
+ "context": 128000,
+ "output": 128000
+ },
+ "knowledge": "2024-10"
+ }
+ },
+ {
+ "id": "mistral-embed",
+ "name": "Mistral Embed",
+ "provider": "mistral",
+ "family": "mistral-embed",
+ "created_at": "2023-12-11 00:00:00 +0530",
+ "context_window": 8000,
+ "max_output_tokens": 3072,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.1
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "mistral",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": false,
+ "last_updated": "2023-12-11",
+ "cost": {
+ "input": 0.1,
+ "output": 0
+ },
+ "limit": {
+ "context": 8000,
+ "output": 3072
+ }
+ }
+ },
+ {
+ "id": "mistral-large-2411",
+ "name": "Mistral Large 2.1",
+ "provider": "mistral",
+ "family": "mistral-large",
+ "created_at": "2024-11-01 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2,
+ "output_per_million": 6
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "mistral",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2024-11-04",
+ "cost": {
+ "input": 2,
+ "output": 6
+ },
+ "limit": {
+ "context": 131072,
+ "output": 16384
+ },
+ "knowledge": "2024-11"
+ }
+ },
+ {
+ "id": "mistral-large-2512",
+ "name": "Mistral Large 3",
+ "provider": "mistral",
+ "family": "mistral-large",
+ "created_at": "2024-11-01 00:00:00 +0530",
+ "context_window": 262144,
+ "max_output_tokens": 262144,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "mistral",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-12-02",
+ "cost": {
+ "input": 0.5,
+ "output": 1.5
+ },
+ "limit": {
+ "context": 262144,
+ "output": 262144
+ },
+ "knowledge": "2024-11"
+ }
+ },
+ {
+ "id": "mistral-large-latest",
+ "name": "Mistral Large (latest)",
+ "provider": "mistral",
+ "family": "mistral-large",
+ "created_at": "2024-11-01 00:00:00 +0530",
+ "context_window": 262144,
+ "max_output_tokens": 262144,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "mistral",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-12-02",
+ "cost": {
+ "input": 0.5,
+ "output": 1.5
+ },
+ "limit": {
+ "context": 262144,
+ "output": 262144
+ },
+ "knowledge": "2024-11"
+ }
+ },
+ {
+ "id": "mistral-medium-2505",
+ "name": "Mistral Medium 3",
+ "provider": "mistral",
+ "family": "mistral-medium",
+ "created_at": "2025-05-07 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 131072,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.4,
+ "output_per_million": 2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "mistral",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-05-07",
+ "cost": {
+ "input": 0.4,
+ "output": 2
+ },
+ "limit": {
+ "context": 131072,
+ "output": 131072
+ },
+ "knowledge": "2025-05"
+ }
+ },
+ {
+ "id": "mistral-medium-2508",
+ "name": "Mistral Medium 3.1",
+ "provider": "mistral",
+ "family": "mistral-medium",
+ "created_at": "2025-08-12 00:00:00 +0530",
+ "context_window": 262144,
+ "max_output_tokens": 262144,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.4,
+ "output_per_million": 2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "mistral",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-08-12",
+ "cost": {
+ "input": 0.4,
+ "output": 2
+ },
+ "limit": {
+ "context": 262144,
+ "output": 262144
+ },
+ "knowledge": "2025-05"
+ }
+ },
+ {
+ "id": "mistral-medium-latest",
+ "name": "Mistral Medium (latest)",
+ "provider": "mistral",
+ "family": "mistral-medium",
+ "created_at": "2025-05-07 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.4,
+ "output_per_million": 2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "mistral",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-05-10",
+ "cost": {
+ "input": 0.4,
+ "output": 2
+ },
+ "limit": {
+ "context": 128000,
+ "output": 16384
+ },
+ "knowledge": "2025-05"
+ }
+ },
+ {
+ "id": "mistral-nemo",
+ "name": "Mistral Nemo",
+ "provider": "mistral",
+ "family": "mistral-nemo",
+ "created_at": "2024-07-01 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.15,
+ "output_per_million": 0.15
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "mistral",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2024-07-01",
+ "cost": {
+ "input": 0.15,
+ "output": 0.15
+ },
+ "limit": {
+ "context": 128000,
+ "output": 128000
+ },
+ "knowledge": "2024-07"
+ }
+ },
+ {
+ "id": "mistral-small-2506",
+ "name": "Mistral Small 3.2",
+ "provider": "mistral",
+ "family": "mistral-small",
+ "created_at": "2025-06-20 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.1,
+ "output_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "mistral",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-06-20",
+ "cost": {
+ "input": 0.1,
+ "output": 0.3
+ },
+ "limit": {
+ "context": 128000,
+ "output": 16384
+ },
+ "knowledge": "2025-03"
+ }
+ },
+ {
+ "id": "mistral-small-2603",
+ "name": "Mistral Small 4",
+ "provider": "mistral",
+ "family": "mistral-small",
+ "created_at": "2026-03-16 00:00:00 +0530",
+ "context_window": 256000,
+ "max_output_tokens": 256000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.15,
+ "output_per_million": 0.6
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "mistral",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-03-16",
+ "cost": {
+ "input": 0.15,
+ "output": 0.6
+ },
+ "limit": {
+ "context": 256000,
+ "output": 256000
+ },
+ "knowledge": "2025-06"
+ }
+ },
+ {
+ "id": "mistral-small-latest",
+ "name": "Mistral Small (latest)",
+ "provider": "mistral",
+ "family": "mistral-small",
+ "created_at": "2026-03-16 00:00:00 +0530",
+ "context_window": 256000,
+ "max_output_tokens": 256000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.15,
+ "output_per_million": 0.6
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "mistral",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-03-16",
+ "cost": {
+ "input": 0.15,
+ "output": 0.6
+ },
+ "limit": {
+ "context": 256000,
+ "output": 256000
+ },
+ "knowledge": "2025-06"
+ }
+ },
+ {
+ "id": "open-mistral-7b",
+ "name": "Mistral 7B",
+ "provider": "mistral",
+ "family": "mistral",
+ "created_at": "2023-09-27 00:00:00 +0530",
+ "context_window": 8000,
+ "max_output_tokens": 8000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.25,
+ "output_per_million": 0.25
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "mistral",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2023-09-27",
+ "cost": {
+ "input": 0.25,
+ "output": 0.25
+ },
+ "limit": {
+ "context": 8000,
+ "output": 8000
+ },
+ "knowledge": "2023-12"
+ }
+ },
+ {
+ "id": "open-mixtral-8x22b",
+ "name": "Mixtral 8x22B",
+ "provider": "mistral",
+ "family": "mixtral",
+ "created_at": "2024-04-17 00:00:00 +0530",
+ "context_window": 64000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2,
+ "output_per_million": 6
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "mistral",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2024-04-17",
+ "cost": {
+ "input": 2,
+ "output": 6
+ },
+ "limit": {
+ "context": 64000,
+ "output": 64000
+ },
+ "knowledge": "2024-04"
+ }
+ },
+ {
+ "id": "open-mixtral-8x7b",
+ "name": "Mixtral 8x7B",
+ "provider": "mistral",
+ "family": "mixtral",
+ "created_at": "2023-12-11 00:00:00 +0530",
+ "context_window": 32000,
+ "max_output_tokens": 32000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.7,
+ "output_per_million": 0.7
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "mistral",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2023-12-11",
+ "cost": {
+ "input": 0.7,
+ "output": 0.7
+ },
+ "limit": {
+ "context": 32000,
+ "output": 32000
+ },
+ "knowledge": "2024-01"
+ }
+ },
+ {
+ "id": "pixtral-12b",
+ "name": "Pixtral 12B",
+ "provider": "mistral",
+ "family": "pixtral",
+ "created_at": "2024-09-01 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.15,
+ "output_per_million": 0.15
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "mistral",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-09-01",
+ "cost": {
+ "input": 0.15,
+ "output": 0.15
+ },
+ "limit": {
+ "context": 128000,
+ "output": 128000
+ },
+ "knowledge": "2024-09"
+ }
+ },
+ {
+ "id": "pixtral-large-latest",
+ "name": "Pixtral Large (latest)",
+ "provider": "mistral",
+ "family": "pixtral",
+ "created_at": "2024-11-01 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2,
+ "output_per_million": 6
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "mistral",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-11-04",
+ "cost": {
+ "input": 2,
+ "output": 6
+ },
+ "limit": {
+ "context": 128000,
+ "output": 128000
+ },
+ "knowledge": "2024-11"
+ }
+ },
+ {
+ "id": "babbage-002",
+ "name": "Babbage 002",
+ "provider": "openai",
+ "family": "babbage",
+ "created_at": "2023-08-21 21:46:55 +0530",
+ "context_window": 4096,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.4,
+ "output_per_million": 0.4
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "chatgpt-image-latest",
+ "name": "chatgpt-image-latest",
+ "provider": "openai",
+ "family": "gpt-image",
+ "created_at": "2025-12-16 00:00:00 +0530",
+ "context_window": 0,
+ "max_output_tokens": 0,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text",
+ "image"
+ ]
+ },
+ "capabilities": [
+ "vision",
+ "streaming"
+ ],
+ "pricing": {},
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2025-12-16",
+ "limit": {
+ "context": 0,
+ "input": 0,
+ "output": 0
+ }
+ }
+ },
+ {
+ "id": "codex-mini-latest",
+ "name": "Codex Mini",
+ "provider": "openai",
+ "family": "gpt-codex-mini",
+ "created_at": "2025-05-16 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 100000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.5,
+ "output_per_million": 6,
+ "cached_input_per_million": 0.375
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2025-05-16",
+ "cost": {
+ "input": 1.5,
+ "output": 6,
+ "cache_read": 0.375
+ },
+ "limit": {
+ "context": 200000,
+ "output": 100000
+ },
+ "knowledge": "2024-04"
+ }
+ },
+ {
+ "id": "computer-use-preview",
+ "name": "Computer Use Preview",
+ "provider": "openai",
+ "family": "other",
+ "created_at": "2024-12-20 06:17:57 +0530",
+ "context_window": 4096,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "computer-use-preview-2025-03-11",
+ "name": "Computer Use Preview 20250311",
+ "provider": "openai",
+ "family": "other",
+ "created_at": "2025-03-08 01:20:21 +0530",
+ "context_window": 4096,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "dall-e-2",
+ "name": "DALL-E-2",
+ "provider": "openai",
+ "family": "dall_e",
+ "created_at": "2023-11-01 05:52:57 +0530",
+ "context_window": 4096,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text",
+ "image"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "dall-e-3",
+ "name": "DALL-E-3",
+ "provider": "openai",
+ "family": "dall_e",
+ "created_at": "2023-11-01 02:16:29 +0530",
+ "context_window": 4096,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text",
+ "image"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "davinci-002",
+ "name": "Davinci 002",
+ "provider": "openai",
+ "family": "davinci",
+ "created_at": "2023-08-21 21:41:41 +0530",
+ "context_window": 4096,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2.0,
+ "output_per_million": 2.0
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-3.5-turbo",
+ "name": "GPT-3.5-turbo",
+ "provider": "openai",
+ "family": "gpt",
+ "created_at": "2023-03-01 00:00:00 +0530",
+ "context_window": 16385,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": "2021-09-01",
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5,
+ "cached_input_per_million": 1.25
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "openai",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2023-11-06",
+ "cost": {
+ "input": 0.5,
+ "output": 1.5,
+ "cache_read": 1.25
+ },
+ "limit": {
+ "context": 16385,
+ "output": 4096
+ },
+ "knowledge": "2021-09-01"
+ }
+ },
+ {
+ "id": "gpt-3.5-turbo-0125",
+ "name": "GPT-3.5 Turbo 0125",
+ "provider": "openai",
+ "family": "gpt35_turbo",
+ "created_at": "2024-01-24 03:49:18 +0530",
+ "context_window": 16385,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-3.5-turbo-1106",
+ "name": "GPT-3.5 Turbo 1106",
+ "provider": "openai",
+ "family": "gpt35_turbo",
+ "created_at": "2023-11-03 02:45:48 +0530",
+ "context_window": 16385,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-3.5-turbo-16k",
+ "name": "GPT-3.5 Turbo 16k",
+ "provider": "openai",
+ "family": "gpt35_turbo",
+ "created_at": "2023-05-11 04:05:02 +0530",
+ "context_window": 16385,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "openai-internal"
+ }
+ },
+ {
+ "id": "gpt-3.5-turbo-instruct",
+ "name": "GPT-3.5 Turbo Instruct",
+ "provider": "openai",
+ "family": "gpt35_turbo",
+ "created_at": "2023-08-24 23:53:47 +0530",
+ "context_window": 16385,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-3.5-turbo-instruct-0914",
+ "name": "GPT-3.5 Turbo Instruct 0914",
+ "provider": "openai",
+ "family": "gpt35_turbo",
+ "created_at": "2023-09-08 03:04:32 +0530",
+ "context_window": 16385,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-4",
+ "name": "GPT-4",
+ "provider": "openai",
+ "family": "gpt",
+ "created_at": "2023-11-06 00:00:00 +0530",
+ "context_window": 8192,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 30,
+ "output_per_million": 60
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "openai",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-04-09",
+ "cost": {
+ "input": 30,
+ "output": 60
+ },
+ "limit": {
+ "context": 8192,
+ "output": 8192
+ },
+ "knowledge": "2023-11"
+ }
+ },
+ {
+ "id": "gpt-4-0613",
+ "name": "GPT-4 0613",
+ "provider": "openai",
+ "family": "other",
+ "created_at": "2023-06-12 22:24:56 +0530",
+ "context_window": 4096,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "openai"
+ }
+ },
+ {
+ "id": "gpt-4-turbo",
+ "name": "GPT-4 Turbo",
+ "provider": "openai",
+ "family": "gpt",
+ "created_at": "2023-11-06 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 10,
+ "output_per_million": 30
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-04-09",
+ "cost": {
+ "input": 10,
+ "output": 30
+ },
+ "limit": {
+ "context": 128000,
+ "output": 4096
+ },
+ "knowledge": "2023-12"
+ }
+ },
+ {
+ "id": "gpt-4-turbo-2024-04-09",
+ "name": "GPT-4 Turbo 20240409",
+ "provider": "openai",
+ "family": "gpt4_turbo",
+ "created_at": "2024-04-09 00:11:17 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming",
+ "function_calling"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 10.0,
+ "output_per_million": 30.0
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-4.1",
+ "name": "GPT-4.1",
+ "provider": "openai",
+ "family": "gpt",
+ "created_at": "2025-04-14 00:00:00 +0530",
+ "context_window": 1047576,
+ "max_output_tokens": 32768,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "vision",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2,
+ "output_per_million": 8,
+ "cached_input_per_million": 0.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-04-14",
+ "cost": {
+ "input": 2,
+ "output": 8,
+ "cache_read": 0.5
+ },
+ "limit": {
+ "context": 1047576,
+ "output": 32768
+ },
+ "knowledge": "2024-04"
+ }
+ },
+ {
+ "id": "gpt-4.1-2025-04-14",
+ "name": "GPT-4.1 20250414",
+ "provider": "openai",
+ "family": "gpt41",
+ "created_at": "2025-04-11 01:39:06 +0530",
+ "context_window": 1047576,
+ "max_output_tokens": 32768,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming",
+ "function_calling",
+ "structured_output"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2.0,
+ "output_per_million": 8.0,
+ "cached_input_per_million": 0.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-4.1-mini",
+ "name": "GPT-4.1 mini",
+ "provider": "openai",
+ "family": "gpt-mini",
+ "created_at": "2025-04-14 00:00:00 +0530",
+ "context_window": 1047576,
+ "max_output_tokens": 32768,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "vision",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.4,
+ "output_per_million": 1.6,
+ "cached_input_per_million": 0.1
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-04-14",
+ "cost": {
+ "input": 0.4,
+ "output": 1.6,
+ "cache_read": 0.1
+ },
+ "limit": {
+ "context": 1047576,
+ "output": 32768
+ },
+ "knowledge": "2024-04"
+ }
+ },
+ {
+ "id": "gpt-4.1-mini-2025-04-14",
+ "name": "GPT-4.1 Mini 20250414",
+ "provider": "openai",
+ "family": "gpt41_mini",
+ "created_at": "2025-04-11 02:09:07 +0530",
+ "context_window": 1047576,
+ "max_output_tokens": 32768,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming",
+ "function_calling",
+ "structured_output"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.4,
+ "output_per_million": 1.6,
+ "cached_input_per_million": 0.1
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-4.1-nano",
+ "name": "GPT-4.1 nano",
+ "provider": "openai",
+ "family": "gpt-nano",
+ "created_at": "2025-04-14 00:00:00 +0530",
+ "context_window": 1047576,
+ "max_output_tokens": 32768,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "vision",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.1,
+ "output_per_million": 0.4,
+ "cached_input_per_million": 0.03
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-04-14",
+ "cost": {
+ "input": 0.1,
+ "output": 0.4,
+ "cache_read": 0.03
+ },
+ "limit": {
+ "context": 1047576,
+ "output": 32768
+ },
+ "knowledge": "2024-04"
+ }
+ },
+ {
+ "id": "gpt-4.1-nano-2025-04-14",
+ "name": "GPT-4.1 Nano 20250414",
+ "provider": "openai",
+ "family": "gpt41_nano",
+ "created_at": "2025-04-11 03:07:05 +0530",
+ "context_window": 1047576,
+ "max_output_tokens": 32768,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming",
+ "function_calling",
+ "structured_output"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.1,
+ "output_per_million": 0.4
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-4o",
+ "name": "GPT-4o",
+ "provider": "openai",
+ "family": "gpt",
+ "created_at": "2024-05-13 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "vision",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2.5,
+ "output_per_million": 10,
+ "cached_input_per_million": 1.25
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-08-06",
+ "cost": {
+ "input": 2.5,
+ "output": 10,
+ "cache_read": 1.25
+ },
+ "limit": {
+ "context": 128000,
+ "output": 16384
+ },
+ "knowledge": "2023-09"
+ }
+ },
+ {
+ "id": "gpt-4o-2024-05-13",
+ "name": "GPT-4o (2024-05-13)",
+ "provider": "openai",
+ "family": "gpt",
+ "created_at": "2024-05-13 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "vision",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 5,
+ "output_per_million": 15
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-05-13",
+ "cost": {
+ "input": 5,
+ "output": 15
+ },
+ "limit": {
+ "context": 128000,
+ "output": 4096
+ },
+ "knowledge": "2023-09"
+ }
+ },
+ {
+ "id": "gpt-4o-2024-08-06",
+ "name": "GPT-4o (2024-08-06)",
+ "provider": "openai",
+ "family": "gpt",
+ "created_at": "2024-08-06 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "vision",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2.5,
+ "output_per_million": 10,
+ "cached_input_per_million": 1.25
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-08-06",
+ "cost": {
+ "input": 2.5,
+ "output": 10,
+ "cache_read": 1.25
+ },
+ "limit": {
+ "context": 128000,
+ "output": 16384
+ },
+ "knowledge": "2023-09"
+ }
+ },
+ {
+ "id": "gpt-4o-2024-11-20",
+ "name": "GPT-4o (2024-11-20)",
+ "provider": "openai",
+ "family": "gpt",
+ "created_at": "2024-11-20 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "vision",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2.5,
+ "output_per_million": 10,
+ "cached_input_per_million": 1.25
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-11-20",
+ "cost": {
+ "input": 2.5,
+ "output": 10,
+ "cache_read": 1.25
+ },
+ "limit": {
+ "context": 128000,
+ "output": 16384
+ },
+ "knowledge": "2023-09"
+ }
+ },
+ {
+ "id": "gpt-4o-audio-preview",
+ "name": "GPT-4o-Audio Preview",
+ "provider": "openai",
+ "family": "gpt4o_audio",
+ "created_at": "2024-09-27 23:37:23 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "audio"
+ ],
+ "output": [
+ "text",
+ "audio"
+ ]
+ },
+ "capabilities": [
+ "streaming",
+ "speech_generation",
+ "transcription"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2.5,
+ "output_per_million": 10.0
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-4o-audio-preview-2024-12-17",
+ "name": "GPT-4o-Audio Preview 20241217",
+ "provider": "openai",
+ "family": "gpt4o_audio",
+ "created_at": "2024-12-13 01:40:39 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "audio"
+ ],
+ "output": [
+ "text",
+ "audio"
+ ]
+ },
+ "capabilities": [
+ "streaming",
+ "speech_generation",
+ "transcription"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2.5,
+ "output_per_million": 10.0
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-4o-audio-preview-2025-06-03",
+ "name": "GPT-4o-Audio Preview 20250603",
+ "provider": "openai",
+ "family": "gpt4o_audio",
+ "created_at": "2025-06-03 05:24:58 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "audio"
+ ],
+ "output": [
+ "text",
+ "audio"
+ ]
+ },
+ "capabilities": [
+ "streaming",
+ "speech_generation",
+ "transcription"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2.5,
+ "output_per_million": 10.0
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-4o-mini",
+ "name": "GPT-4o mini",
+ "provider": "openai",
+ "family": "gpt-mini",
+ "created_at": "2024-07-18 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "vision",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.15,
+ "output_per_million": 0.6,
+ "cached_input_per_million": 0.08
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-07-18",
+ "cost": {
+ "input": 0.15,
+ "output": 0.6,
+ "cache_read": 0.08
+ },
+ "limit": {
+ "context": 128000,
+ "output": 16384
+ },
+ "knowledge": "2023-09"
+ }
+ },
+ {
+ "id": "gpt-4o-mini-2024-07-18",
+ "name": "GPT-4o-Mini 20240718",
+ "provider": "openai",
+ "family": "gpt4o_mini",
+ "created_at": "2024-07-17 05:01:57 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming",
+ "function_calling",
+ "structured_output"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.15,
+ "output_per_million": 0.6
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-4o-mini-audio-preview",
+ "name": "GPT-4o-Mini Audio Preview",
+ "provider": "openai",
+ "family": "gpt4o_mini_audio",
+ "created_at": "2024-12-17 03:47:04 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "audio"
+ ],
+ "output": [
+ "text",
+ "audio"
+ ]
+ },
+ "capabilities": [
+ "streaming",
+ "speech_generation",
+ "transcription"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.15,
+ "output_per_million": 0.6
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-4o-mini-audio-preview-2024-12-17",
+ "name": "GPT-4o-Mini Audio Preview 20241217",
+ "provider": "openai",
+ "family": "gpt4o_mini_audio",
+ "created_at": "2024-12-14 00:22:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "audio"
+ ],
+ "output": [
+ "text",
+ "audio"
+ ]
+ },
+ "capabilities": [
+ "streaming",
+ "speech_generation",
+ "transcription"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.15,
+ "output_per_million": 0.6
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-4o-mini-realtime-preview",
+ "name": "GPT-4o-Mini Realtime Preview",
+ "provider": "openai",
+ "family": "gpt4o_mini_realtime",
+ "created_at": "2024-12-17 03:46:20 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.6,
+ "output_per_million": 2.4
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-4o-mini-realtime-preview-2024-12-17",
+ "name": "GPT-4o-Mini Realtime Preview 20241217",
+ "provider": "openai",
+ "family": "gpt4o_mini_realtime",
+ "created_at": "2024-12-13 23:26:41 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.6,
+ "output_per_million": 2.4
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-4o-mini-search-preview",
+ "name": "GPT-4o-Mini Search Preview",
+ "provider": "openai",
+ "family": "other",
+ "created_at": "2025-03-08 05:16:01 +0530",
+ "context_window": 4096,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-4o-mini-search-preview-2025-03-11",
+ "name": "GPT-4o-Mini Search Preview 20250311",
+ "provider": "openai",
+ "family": "other",
+ "created_at": "2025-03-08 05:10:58 +0530",
+ "context_window": 4096,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-4o-mini-transcribe",
+ "name": "GPT-4o-Mini Transcribe",
+ "provider": "openai",
+ "family": "gpt4o_mini_transcribe",
+ "created_at": "2025-03-16 01:26:36 +0530",
+ "context_window": 16000,
+ "max_output_tokens": 2000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "audio"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 5.0
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-4o-mini-transcribe-2025-03-20",
+ "name": "GPT-4o-Mini Transcribe 20250320",
+ "provider": "openai",
+ "family": "gpt4o_mini_transcribe",
+ "created_at": "2025-12-13 12:52:25 +0530",
+ "context_window": 16000,
+ "max_output_tokens": 2000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "audio"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 5.0
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-4o-mini-transcribe-2025-12-15",
+ "name": "GPT-4o-Mini Transcribe 20251215",
+ "provider": "openai",
+ "family": "gpt4o_mini_transcribe",
+ "created_at": "2025-12-13 12:50:07 +0530",
+ "context_window": 16000,
+ "max_output_tokens": 2000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "audio"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 5.0
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-4o-mini-tts",
+ "name": "GPT-4o-Mini Tts",
+ "provider": "openai",
+ "family": "gpt4o_mini_tts",
+ "created_at": "2025-03-19 22:35:59 +0530",
+ "context_window": null,
+ "max_output_tokens": null,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "audio"
+ ],
+ "output": [
+ "text",
+ "audio"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.6,
+ "output_per_million": 12.0
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-4o-mini-tts-2025-03-20",
+ "name": "GPT-4o-Mini Tts 20250320",
+ "provider": "openai",
+ "family": "gpt4o_mini_tts",
+ "created_at": "2025-12-13 12:55:31 +0530",
+ "context_window": null,
+ "max_output_tokens": null,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "audio"
+ ],
+ "output": [
+ "text",
+ "audio"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.6,
+ "output_per_million": 12.0
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-4o-mini-tts-2025-12-15",
+ "name": "GPT-4o-Mini Tts 20251215",
+ "provider": "openai",
+ "family": "gpt4o_mini_tts",
+ "created_at": "2025-12-13 12:57:17 +0530",
+ "context_window": null,
+ "max_output_tokens": null,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "audio"
+ ],
+ "output": [
+ "text",
+ "audio"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.6,
+ "output_per_million": 12.0
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-4o-realtime-preview",
+ "name": "GPT-4o-Realtime Preview",
+ "provider": "openai",
+ "family": "gpt4o_realtime",
+ "created_at": "2024-09-30 07:03:18 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 5.0,
+ "output_per_million": 20.0
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-4o-realtime-preview-2024-12-17",
+ "name": "GPT-4o-Realtime Preview 20241217",
+ "provider": "openai",
+ "family": "gpt4o_realtime",
+ "created_at": "2024-12-12 01:00:30 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 5.0,
+ "output_per_million": 20.0
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-4o-realtime-preview-2025-06-03",
+ "name": "GPT-4o-Realtime Preview 20250603",
+ "provider": "openai",
+ "family": "gpt4o_realtime",
+ "created_at": "2025-06-03 05:13:58 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 5.0,
+ "output_per_million": 20.0
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-4o-search-preview",
+ "name": "GPT-4o Search Preview",
+ "provider": "openai",
+ "family": "gpt4o_search",
+ "created_at": "2026-02-24 09:28:54 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2.5,
+ "output_per_million": 10.0
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-4o-search-preview-2025-03-11",
+ "name": "GPT-4o Search Preview 20250311",
+ "provider": "openai",
+ "family": "gpt4o_search",
+ "created_at": "2026-02-24 09:30:21 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2.5,
+ "output_per_million": 10.0
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-4o-transcribe",
+ "name": "GPT-4o-Transcribe",
+ "provider": "openai",
+ "family": "gpt4o_transcribe",
+ "created_at": "2025-03-16 01:24:23 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "audio"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2.5,
+ "output_per_million": 10.0
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-4o-transcribe-diarize",
+ "name": "GPT-4o-Transcribe Diarize",
+ "provider": "openai",
+ "family": "gpt4o_transcribe",
+ "created_at": "2025-06-25 02:31:27 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "audio"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2.5,
+ "output_per_million": 10.0
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-5",
+ "name": "GPT-5",
+ "provider": "openai",
+ "family": "gpt",
+ "created_at": "2025-08-07 00:00:00 +0530",
+ "context_window": 400000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2024-09-30",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10,
+ "cached_input_per_million": 0.125
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2025-08-07",
+ "cost": {
+ "input": 1.25,
+ "output": 10,
+ "cache_read": 0.125
+ },
+ "limit": {
+ "context": 400000,
+ "input": 272000,
+ "output": 128000
+ },
+ "knowledge": "2024-09-30"
+ }
+ },
+ {
+ "id": "gpt-5-2025-08-07",
+ "name": "GPT-5 20250807",
+ "provider": "openai",
+ "family": "gpt5",
+ "created_at": "2025-08-02 00:39:20 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 400000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming",
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10.0,
+ "cached_input_per_million": 0.125
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-5-chat-latest",
+ "name": "GPT-5 Chat (latest)",
+ "provider": "openai",
+ "family": "gpt-codex",
+ "created_at": "2025-08-07 00:00:00 +0530",
+ "context_window": 400000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2024-09-30",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "structured_output",
+ "reasoning",
+ "vision",
+ "streaming",
+ "function_calling"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-08-07",
+ "cost": {
+ "input": 1.25,
+ "output": 10
+ },
+ "limit": {
+ "context": 400000,
+ "input": 272000,
+ "output": 128000
+ },
+ "knowledge": "2024-09-30"
+ }
+ },
+ {
+ "id": "gpt-5-codex",
+ "name": "GPT-5-Codex",
+ "provider": "openai",
+ "family": "gpt-codex",
+ "created_at": "2025-09-15 00:00:00 +0530",
+ "context_window": 400000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2024-09-30",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10,
+ "cached_input_per_million": 0.125
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": false,
+ "last_updated": "2025-09-15",
+ "cost": {
+ "input": 1.25,
+ "output": 10,
+ "cache_read": 0.125
+ },
+ "limit": {
+ "context": 400000,
+ "input": 272000,
+ "output": 128000
+ },
+ "knowledge": "2024-09-30"
+ }
+ },
+ {
+ "id": "gpt-5-mini",
+ "name": "GPT-5 Mini",
+ "provider": "openai",
+ "family": "gpt-mini",
+ "created_at": "2025-08-07 00:00:00 +0530",
+ "context_window": 400000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2024-05-30",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.25,
+ "output_per_million": 2,
+ "cached_input_per_million": 0.025
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2025-08-07",
+ "cost": {
+ "input": 0.25,
+ "output": 2,
+ "cache_read": 0.025
+ },
+ "limit": {
+ "context": 400000,
+ "input": 272000,
+ "output": 128000
+ },
+ "knowledge": "2024-05-30"
+ }
+ },
+ {
+ "id": "gpt-5-mini-2025-08-07",
+ "name": "GPT-5 Mini 20250807",
+ "provider": "openai",
+ "family": "gpt5",
+ "created_at": "2025-08-06 02:01:07 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 400000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming",
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10.0,
+ "cached_input_per_million": 0.125
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-5-nano",
+ "name": "GPT-5 Nano",
+ "provider": "openai",
+ "family": "gpt-nano",
+ "created_at": "2025-08-07 00:00:00 +0530",
+ "context_window": 400000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2024-05-30",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.05,
+ "output_per_million": 0.4,
+ "cached_input_per_million": 0.005
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2025-08-07",
+ "cost": {
+ "input": 0.05,
+ "output": 0.4,
+ "cache_read": 0.005
+ },
+ "limit": {
+ "context": 400000,
+ "input": 272000,
+ "output": 128000
+ },
+ "knowledge": "2024-05-30"
+ }
+ },
+ {
+ "id": "gpt-5-nano-2025-08-07",
+ "name": "GPT-5 Nano 20250807",
+ "provider": "openai",
+ "family": "gpt5",
+ "created_at": "2025-08-06 02:08:23 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 400000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming",
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10.0,
+ "cached_input_per_million": 0.125
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-5-pro",
+ "name": "GPT-5 Pro",
+ "provider": "openai",
+ "family": "gpt-pro",
+ "created_at": "2025-10-06 00:00:00 +0530",
+ "context_window": 400000,
+ "max_output_tokens": 272000,
+ "knowledge_cutoff": "2024-09-30",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 15,
+ "output_per_million": 120
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2025-10-06",
+ "cost": {
+ "input": 15,
+ "output": 120
+ },
+ "limit": {
+ "context": 400000,
+ "input": 272000,
+ "output": 272000
+ },
+ "knowledge": "2024-09-30"
+ }
+ },
+ {
+ "id": "gpt-5-pro-2025-10-06",
+ "name": "GPT-5 Pro 20251006",
+ "provider": "openai",
+ "family": "gpt5",
+ "created_at": "2025-10-03 11:05:07 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 400000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming",
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10.0,
+ "cached_input_per_million": 0.125
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-5-search-api",
+ "name": "GPT-5 Search Api",
+ "provider": "openai",
+ "family": "gpt5",
+ "created_at": "2025-10-03 23:33:49 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 400000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming",
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10.0,
+ "cached_input_per_million": 0.125
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-5-search-api-2025-10-14",
+ "name": "GPT-5 Search Api 20251014",
+ "provider": "openai",
+ "family": "gpt5",
+ "created_at": "2025-10-10 02:36:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 400000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming",
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10.0,
+ "cached_input_per_million": 0.125
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-5.1",
+ "name": "GPT-5.1",
+ "provider": "openai",
+ "family": "gpt",
+ "created_at": "2025-11-13 00:00:00 +0530",
+ "context_window": 400000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2024-09-30",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10,
+ "cached_input_per_million": 0.13
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2025-11-13",
+ "cost": {
+ "input": 1.25,
+ "output": 10,
+ "cache_read": 0.13
+ },
+ "limit": {
+ "context": 400000,
+ "input": 272000,
+ "output": 128000
+ },
+ "knowledge": "2024-09-30"
+ }
+ },
+ {
+ "id": "gpt-5.1-2025-11-13",
+ "name": "GPT-5.1 20251113",
+ "provider": "openai",
+ "family": "gpt5",
+ "created_at": "2025-11-11 00:15:53 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 400000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming",
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10.0,
+ "cached_input_per_million": 0.125
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-5.1-chat-latest",
+ "name": "GPT-5.1 Chat",
+ "provider": "openai",
+ "family": "gpt-codex",
+ "created_at": "2025-11-13 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": "2024-09-30",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10,
+ "cached_input_per_million": 0.125
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2025-11-13",
+ "cost": {
+ "input": 1.25,
+ "output": 10,
+ "cache_read": 0.125
+ },
+ "limit": {
+ "context": 128000,
+ "output": 16384
+ },
+ "knowledge": "2024-09-30"
+ }
+ },
+ {
+ "id": "gpt-5.1-codex",
+ "name": "GPT-5.1 Codex",
+ "provider": "openai",
+ "family": "gpt-codex",
+ "created_at": "2025-11-13 00:00:00 +0530",
+ "context_window": 400000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2024-09-30",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10,
+ "cached_input_per_million": 0.125
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2025-11-13",
+ "cost": {
+ "input": 1.25,
+ "output": 10,
+ "cache_read": 0.125
+ },
+ "limit": {
+ "context": 400000,
+ "input": 272000,
+ "output": 128000
+ },
+ "knowledge": "2024-09-30"
+ }
+ },
+ {
+ "id": "gpt-5.1-codex-max",
+ "name": "GPT-5.1 Codex Max",
+ "provider": "openai",
+ "family": "gpt-codex",
+ "created_at": "2025-11-13 00:00:00 +0530",
+ "context_window": 400000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2024-09-30",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10,
+ "cached_input_per_million": 0.125
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2025-11-13",
+ "cost": {
+ "input": 1.25,
+ "output": 10,
+ "cache_read": 0.125
+ },
+ "limit": {
+ "context": 400000,
+ "input": 272000,
+ "output": 128000
+ },
+ "knowledge": "2024-09-30"
+ }
+ },
+ {
+ "id": "gpt-5.1-codex-mini",
+ "name": "GPT-5.1 Codex mini",
+ "provider": "openai",
+ "family": "gpt-codex",
+ "created_at": "2025-11-13 00:00:00 +0530",
+ "context_window": 400000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2024-09-30",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.25,
+ "output_per_million": 2,
+ "cached_input_per_million": 0.025
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2025-11-13",
+ "cost": {
+ "input": 0.25,
+ "output": 2,
+ "cache_read": 0.025
+ },
+ "limit": {
+ "context": 400000,
+ "input": 272000,
+ "output": 128000
+ },
+ "knowledge": "2024-09-30"
+ }
+ },
+ {
+ "id": "gpt-5.2",
+ "name": "GPT-5.2",
+ "provider": "openai",
+ "family": "gpt",
+ "created_at": "2025-12-11 00:00:00 +0530",
+ "context_window": 400000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2025-08-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.75,
+ "output_per_million": 14,
+ "cached_input_per_million": 0.175
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2025-12-11",
+ "cost": {
+ "input": 1.75,
+ "output": 14,
+ "cache_read": 0.175
+ },
+ "limit": {
+ "context": 400000,
+ "input": 272000,
+ "output": 128000
+ },
+ "knowledge": "2025-08-31"
+ }
+ },
+ {
+ "id": "gpt-5.2-2025-12-11",
+ "name": "GPT-5.2 20251211",
+ "provider": "openai",
+ "family": "gpt5",
+ "created_at": "2025-12-10 02:13:48 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 400000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming",
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10.0,
+ "cached_input_per_million": 0.125
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-5.2-chat-latest",
+ "name": "GPT-5.2 Chat",
+ "provider": "openai",
+ "family": "gpt-codex",
+ "created_at": "2025-12-11 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": "2025-08-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.75,
+ "output_per_million": 14,
+ "cached_input_per_million": 0.175
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2025-12-11",
+ "cost": {
+ "input": 1.75,
+ "output": 14,
+ "cache_read": 0.175
+ },
+ "limit": {
+ "context": 128000,
+ "output": 16384
+ },
+ "knowledge": "2025-08-31"
+ }
+ },
+ {
+ "id": "gpt-5.2-codex",
+ "name": "GPT-5.2 Codex",
+ "provider": "openai",
+ "family": "gpt-codex",
+ "created_at": "2025-12-11 00:00:00 +0530",
+ "context_window": 400000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2025-08-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.75,
+ "output_per_million": 14,
+ "cached_input_per_million": 0.175
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2025-12-11",
+ "cost": {
+ "input": 1.75,
+ "output": 14,
+ "cache_read": 0.175
+ },
+ "limit": {
+ "context": 400000,
+ "input": 272000,
+ "output": 128000
+ },
+ "knowledge": "2025-08-31"
+ }
+ },
+ {
+ "id": "gpt-5.2-pro",
+ "name": "GPT-5.2 Pro",
+ "provider": "openai",
+ "family": "gpt-pro",
+ "created_at": "2025-12-11 00:00:00 +0530",
+ "context_window": 400000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2025-08-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision",
+ "streaming",
+ "structured_output"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 21,
+ "output_per_million": 168
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2025-12-11",
+ "cost": {
+ "input": 21,
+ "output": 168
+ },
+ "limit": {
+ "context": 400000,
+ "input": 272000,
+ "output": 128000
+ },
+ "knowledge": "2025-08-31"
+ }
+ },
+ {
+ "id": "gpt-5.2-pro-2025-12-11",
+ "name": "GPT-5.2 Pro 20251211",
+ "provider": "openai",
+ "family": "gpt5",
+ "created_at": "2025-12-10 10:49:19 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 400000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming",
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10.0,
+ "cached_input_per_million": 0.125
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-5.3-chat-latest",
+ "name": "GPT-5.3 Chat (latest)",
+ "provider": "openai",
+ "family": "gpt",
+ "created_at": "2026-03-03 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": "2025-08-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "vision",
+ "streaming",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.75,
+ "output_per_million": 14,
+ "cached_input_per_million": 0.175
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-03-03",
+ "cost": {
+ "input": 1.75,
+ "output": 14,
+ "cache_read": 0.175
+ },
+ "limit": {
+ "context": 128000,
+ "output": 16384
+ },
+ "knowledge": "2025-08-31"
+ }
+ },
+ {
+ "id": "gpt-5.3-codex",
+ "name": "GPT-5.3 Codex",
+ "provider": "openai",
+ "family": "gpt-codex",
+ "created_at": "2026-02-05 00:00:00 +0530",
+ "context_window": 400000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2025-08-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.75,
+ "output_per_million": 14,
+ "cached_input_per_million": 0.175
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2026-02-05",
+ "cost": {
+ "input": 1.75,
+ "output": 14,
+ "cache_read": 0.175
+ },
+ "limit": {
+ "context": 400000,
+ "input": 272000,
+ "output": 128000
+ },
+ "knowledge": "2025-08-31"
+ }
+ },
+ {
+ "id": "gpt-5.3-codex-spark",
+ "name": "GPT-5.3 Codex Spark",
+ "provider": "openai",
+ "family": "gpt-codex-spark",
+ "created_at": "2026-02-05 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 32000,
+ "knowledge_cutoff": "2025-08-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.75,
+ "output_per_million": 14,
+ "cached_input_per_million": 0.175
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2026-02-05",
+ "cost": {
+ "input": 1.75,
+ "output": 14,
+ "cache_read": 0.175
+ },
+ "limit": {
+ "context": 128000,
+ "input": 100000,
+ "output": 32000
+ },
+ "knowledge": "2025-08-31"
+ }
+ },
+ {
+ "id": "gpt-5.4",
+ "name": "GPT-5.4",
+ "provider": "openai",
+ "family": "gpt",
+ "created_at": "2026-03-05 00:00:00 +0530",
+ "context_window": 1050000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2025-08-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2.5,
+ "output_per_million": 15,
+ "cached_input_per_million": 0.25
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2026-03-05",
+ "cost": {
+ "input": 2.5,
+ "output": 15,
+ "cache_read": 0.25,
+ "context_over_200k": {
+ "input": 5,
+ "output": 22.5,
+ "cache_read": 0.5
+ }
+ },
+ "limit": {
+ "context": 1050000,
+ "input": 922000,
+ "output": 128000
+ },
+ "knowledge": "2025-08-31"
+ }
+ },
+ {
+ "id": "gpt-5.4-2026-03-05",
+ "name": "GPT-5.4 20260305",
+ "provider": "openai",
+ "family": "gpt5",
+ "created_at": "2026-03-05 01:24:22 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 400000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming",
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10.0,
+ "cached_input_per_million": 0.125
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-5.4-mini",
+ "name": "GPT-5.4 mini",
+ "provider": "openai",
+ "family": "gpt-mini",
+ "created_at": "2026-03-17 00:00:00 +0530",
+ "context_window": 400000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2025-08-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.75,
+ "output_per_million": 4.5,
+ "cached_input_per_million": 0.075
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2026-03-17",
+ "cost": {
+ "input": 0.75,
+ "output": 4.5,
+ "cache_read": 0.075
+ },
+ "limit": {
+ "context": 400000,
+ "input": 272000,
+ "output": 128000
+ },
+ "knowledge": "2025-08-31"
+ }
+ },
+ {
+ "id": "gpt-5.4-mini-2026-03-17",
+ "name": "GPT-5.4 Mini 20260317",
+ "provider": "openai",
+ "family": "gpt5",
+ "created_at": "2026-03-14 06:47:56 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 400000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming",
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10.0,
+ "cached_input_per_million": 0.125
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-5.4-nano",
+ "name": "GPT-5.4 nano",
+ "provider": "openai",
+ "family": "gpt-nano",
+ "created_at": "2026-03-17 00:00:00 +0530",
+ "context_window": 400000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2025-08-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.2,
+ "output_per_million": 1.25,
+ "cached_input_per_million": 0.02
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2026-03-17",
+ "cost": {
+ "input": 0.2,
+ "output": 1.25,
+ "cache_read": 0.02
+ },
+ "limit": {
+ "context": 400000,
+ "input": 272000,
+ "output": 128000
+ },
+ "knowledge": "2025-08-31"
+ }
+ },
+ {
+ "id": "gpt-5.4-nano-2026-03-17",
+ "name": "GPT-5.4 Nano 20260317",
+ "provider": "openai",
+ "family": "gpt5",
+ "created_at": "2026-03-14 06:43:57 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 400000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming",
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10.0,
+ "cached_input_per_million": 0.125
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-5.4-pro",
+ "name": "GPT-5.4 Pro",
+ "provider": "openai",
+ "family": "gpt-pro",
+ "created_at": "2026-03-05 00:00:00 +0530",
+ "context_window": 1050000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2025-08-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision",
+ "streaming",
+ "structured_output"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 30,
+ "output_per_million": 180
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2026-03-05",
+ "cost": {
+ "input": 30,
+ "output": 180,
+ "context_over_200k": {
+ "input": 60,
+ "output": 270
+ }
+ },
+ "limit": {
+ "context": 1050000,
+ "input": 922000,
+ "output": 128000
+ },
+ "knowledge": "2025-08-31"
+ }
+ },
+ {
+ "id": "gpt-5.4-pro-2026-03-05",
+ "name": "GPT-5.4 Pro 20260305",
+ "provider": "openai",
+ "family": "gpt5",
+ "created_at": "2026-03-05 02:57:37 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 400000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming",
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10.0,
+ "cached_input_per_million": 0.125
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-audio",
+ "name": "GPT-Audio",
+ "provider": "openai",
+ "family": "other",
+ "created_at": "2025-08-28 05:30:49 +0530",
+ "context_window": 4096,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "audio"
+ ],
+ "output": [
+ "text",
+ "audio"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-audio-1.5",
+ "name": "GPT-Audio 1.5",
+ "provider": "openai",
+ "family": "other",
+ "created_at": "2026-02-20 06:58:05 +0530",
+ "context_window": 4096,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "audio"
+ ],
+ "output": [
+ "text",
+ "audio"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-audio-2025-08-28",
+ "name": "GPT-Audio 20250828",
+ "provider": "openai",
+ "family": "other",
+ "created_at": "2025-08-27 06:25:46 +0530",
+ "context_window": 4096,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "audio"
+ ],
+ "output": [
+ "text",
+ "audio"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-audio-mini",
+ "name": "GPT-Audio Mini",
+ "provider": "openai",
+ "family": "other",
+ "created_at": "2025-10-03 22:50:27 +0530",
+ "context_window": 4096,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "audio"
+ ],
+ "output": [
+ "text",
+ "audio"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-audio-mini-2025-10-06",
+ "name": "GPT-Audio Mini 20251006",
+ "provider": "openai",
+ "family": "other",
+ "created_at": "2025-10-03 22:52:17 +0530",
+ "context_window": 4096,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "audio"
+ ],
+ "output": [
+ "text",
+ "audio"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-audio-mini-2025-12-15",
+ "name": "GPT-Audio Mini 20251215",
+ "provider": "openai",
+ "family": "other",
+ "created_at": "2025-12-15 06:23:28 +0530",
+ "context_window": 4096,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "audio"
+ ],
+ "output": [
+ "text",
+ "audio"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-image-1",
+ "name": "gpt-image-1",
+ "provider": "openai",
+ "family": "gpt-image",
+ "created_at": "2025-04-24 00:00:00 +0530",
+ "context_window": 0,
+ "max_output_tokens": 0,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "image"
+ ]
+ },
+ "capabilities": [
+ "vision",
+ "streaming"
+ ],
+ "pricing": {},
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2025-04-24",
+ "limit": {
+ "context": 0,
+ "input": 0,
+ "output": 0
+ }
+ }
+ },
+ {
+ "id": "gpt-image-1-mini",
+ "name": "gpt-image-1-mini",
+ "provider": "openai",
+ "family": "gpt-image",
+ "created_at": "2025-09-26 00:00:00 +0530",
+ "context_window": 0,
+ "max_output_tokens": 0,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text",
+ "image"
+ ]
+ },
+ "capabilities": [
+ "vision",
+ "streaming"
+ ],
+ "pricing": {},
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2025-09-26",
+ "limit": {
+ "context": 0,
+ "input": 0,
+ "output": 0
+ }
+ }
+ },
+ {
+ "id": "gpt-image-1.5",
+ "name": "gpt-image-1.5",
+ "provider": "openai",
+ "family": "gpt-image",
+ "created_at": "2025-11-25 00:00:00 +0530",
+ "context_window": 0,
+ "max_output_tokens": 0,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text",
+ "image"
+ ]
+ },
+ "capabilities": [
+ "vision",
+ "streaming"
+ ],
+ "pricing": {},
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2025-11-25",
+ "limit": {
+ "context": 0,
+ "input": 0,
+ "output": 0
+ }
+ }
+ },
+ {
+ "id": "gpt-realtime",
+ "name": "GPT-Realtime",
+ "provider": "openai",
+ "family": "other",
+ "created_at": "2025-08-27 10:45:01 +0530",
+ "context_window": 4096,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-realtime-1.5",
+ "name": "GPT-Realtime 1.5",
+ "provider": "openai",
+ "family": "other",
+ "created_at": "2026-02-19 06:07:49 +0530",
+ "context_window": 4096,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-realtime-2025-08-28",
+ "name": "GPT-Realtime 20250828",
+ "provider": "openai",
+ "family": "other",
+ "created_at": "2025-08-27 10:46:13 +0530",
+ "context_window": 4096,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-realtime-mini",
+ "name": "GPT-Realtime Mini",
+ "provider": "openai",
+ "family": "other",
+ "created_at": "2025-10-04 00:15:33 +0530",
+ "context_window": 4096,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-realtime-mini-2025-10-06",
+ "name": "GPT-Realtime Mini 20251006",
+ "provider": "openai",
+ "family": "other",
+ "created_at": "2025-10-04 00:16:15 +0530",
+ "context_window": 4096,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "gpt-realtime-mini-2025-12-15",
+ "name": "GPT-Realtime Mini 20251215",
+ "provider": "openai",
+ "family": "other",
+ "created_at": "2025-12-13 13:16:47 +0530",
+ "context_window": 4096,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "o1",
+ "name": "o1",
+ "provider": "openai",
+ "family": "o",
+ "created_at": "2024-12-05 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 100000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 15,
+ "output_per_million": 60,
+ "cached_input_per_million": 7.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2024-12-05",
+ "cost": {
+ "input": 15,
+ "output": 60,
+ "cache_read": 7.5
+ },
+ "limit": {
+ "context": 200000,
+ "output": 100000
+ },
+ "knowledge": "2023-09"
+ }
+ },
+ {
+ "id": "o1-2024-12-17",
+ "name": "O1-20241217",
+ "provider": "openai",
+ "family": "o1",
+ "created_at": "2024-12-16 10:59:36 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 100000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming",
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 15.0,
+ "output_per_million": 60.0
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "o1-mini",
+ "name": "o1-mini",
+ "provider": "openai",
+ "family": "o-mini",
+ "created_at": "2024-09-12 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.1,
+ "output_per_million": 4.4,
+ "cached_input_per_million": 0.55
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": false,
+ "last_updated": "2024-09-12",
+ "cost": {
+ "input": 1.1,
+ "output": 4.4,
+ "cache_read": 0.55
+ },
+ "limit": {
+ "context": 128000,
+ "output": 65536
+ },
+ "knowledge": "2023-09"
+ }
+ },
+ {
+ "id": "o1-preview",
+ "name": "o1-preview",
+ "provider": "openai",
+ "family": "o",
+ "created_at": "2024-09-12 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 32768,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 15,
+ "output_per_million": 60,
+ "cached_input_per_million": 7.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2024-09-12",
+ "cost": {
+ "input": 15,
+ "output": 60,
+ "cache_read": 7.5
+ },
+ "limit": {
+ "context": 128000,
+ "output": 32768
+ },
+ "knowledge": "2023-09"
+ }
+ },
+ {
+ "id": "o1-pro",
+ "name": "o1-pro",
+ "provider": "openai",
+ "family": "o-pro",
+ "created_at": "2025-03-19 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 100000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 150,
+ "output_per_million": 600
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2025-03-19",
+ "cost": {
+ "input": 150,
+ "output": 600
+ },
+ "limit": {
+ "context": 200000,
+ "output": 100000
+ },
+ "knowledge": "2023-09"
+ }
+ },
+ {
+ "id": "o1-pro-2025-03-19",
+ "name": "O1-Pro 20250319",
+ "provider": "openai",
+ "family": "o1_pro",
+ "created_at": "2025-03-18 04:15:04 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 100000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming",
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 150.0,
+ "output_per_million": 600.0
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "o3",
+ "name": "o3",
+ "provider": "openai",
+ "family": "o",
+ "created_at": "2025-04-16 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 100000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2,
+ "output_per_million": 8,
+ "cached_input_per_million": 0.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2025-04-16",
+ "cost": {
+ "input": 2,
+ "output": 8,
+ "cache_read": 0.5
+ },
+ "limit": {
+ "context": 200000,
+ "output": 100000
+ },
+ "knowledge": "2024-05"
+ }
+ },
+ {
+ "id": "o3-2025-04-16",
+ "name": "O3-20250416",
+ "provider": "openai",
+ "family": "other",
+ "created_at": "2025-04-08 22:58:21 +0530",
+ "context_window": 4096,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "o3-deep-research",
+ "name": "o3-deep-research",
+ "provider": "openai",
+ "family": "o",
+ "created_at": "2024-06-26 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 100000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 10,
+ "output_per_million": 40,
+ "cached_input_per_million": 2.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2024-06-26",
+ "cost": {
+ "input": 10,
+ "output": 40,
+ "cache_read": 2.5
+ },
+ "limit": {
+ "context": 200000,
+ "output": 100000
+ },
+ "knowledge": "2024-05"
+ }
+ },
+ {
+ "id": "o3-deep-research-2025-06-26",
+ "name": "O3-Deep Research 20250626",
+ "provider": "openai",
+ "family": "other",
+ "created_at": "2025-06-25 20:56:59 +0530",
+ "context_window": 4096,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "o3-mini",
+ "name": "o3-mini",
+ "provider": "openai",
+ "family": "o-mini",
+ "created_at": "2024-12-20 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 100000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.1,
+ "output_per_million": 4.4,
+ "cached_input_per_million": 0.55
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": false,
+ "last_updated": "2025-01-29",
+ "cost": {
+ "input": 1.1,
+ "output": 4.4,
+ "cache_read": 0.55
+ },
+ "limit": {
+ "context": 200000,
+ "output": 100000
+ },
+ "knowledge": "2024-05"
+ }
+ },
+ {
+ "id": "o3-mini-2025-01-31",
+ "name": "O3-Mini 20250131",
+ "provider": "openai",
+ "family": "o3_mini",
+ "created_at": "2025-01-28 02:06:40 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 100000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming",
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.1,
+ "output_per_million": 4.4
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "o3-pro",
+ "name": "o3-pro",
+ "provider": "openai",
+ "family": "o-pro",
+ "created_at": "2025-06-10 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 100000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 20,
+ "output_per_million": 80
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2025-06-10",
+ "cost": {
+ "input": 20,
+ "output": 80
+ },
+ "limit": {
+ "context": 200000,
+ "output": 100000
+ },
+ "knowledge": "2024-05"
+ }
+ },
+ {
+ "id": "o3-pro-2025-06-10",
+ "name": "O3-Pro 20250610",
+ "provider": "openai",
+ "family": "other",
+ "created_at": "2025-06-06 05:09:21 +0530",
+ "context_window": 4096,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "o4-mini",
+ "name": "o4-mini",
+ "provider": "openai",
+ "family": "o-mini",
+ "created_at": "2025-04-16 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 100000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.1,
+ "output_per_million": 4.4,
+ "cached_input_per_million": 0.28
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2025-04-16",
+ "cost": {
+ "input": 1.1,
+ "output": 4.4,
+ "cache_read": 0.28
+ },
+ "limit": {
+ "context": 200000,
+ "output": 100000
+ },
+ "knowledge": "2024-05"
+ }
+ },
+ {
+ "id": "o4-mini-2025-04-16",
+ "name": "O4 Mini 20250416",
+ "provider": "openai",
+ "family": "other",
+ "created_at": "2025-04-08 23:01:46 +0530",
+ "context_window": 4096,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "o4-mini-deep-research",
+ "name": "o4-mini-deep-research",
+ "provider": "openai",
+ "family": "o-mini",
+ "created_at": "2024-06-26 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 100000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision",
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2,
+ "output_per_million": 8,
+ "cached_input_per_million": 0.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2024-06-26",
+ "cost": {
+ "input": 2,
+ "output": 8,
+ "cache_read": 0.5
+ },
+ "limit": {
+ "context": 200000,
+ "output": 100000
+ },
+ "knowledge": "2024-05"
+ }
+ },
+ {
+ "id": "o4-mini-deep-research-2025-06-26",
+ "name": "O4 Mini Deep Research 20250626",
+ "provider": "openai",
+ "family": "other",
+ "created_at": "2025-06-25 21:12:01 +0530",
+ "context_window": 4096,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "omni-moderation-2024-09-26",
+ "name": "Omni Moderation 20240926",
+ "provider": "openai",
+ "family": "moderation",
+ "created_at": "2024-11-28 00:37:46 +0530",
+ "context_window": null,
+ "max_output_tokens": null,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text",
+ "moderation"
+ ]
+ },
+ "capabilities": [],
+ "pricing": {},
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "omni-moderation-latest",
+ "name": "Omni Moderation Latest",
+ "provider": "openai",
+ "family": "moderation",
+ "created_at": "2024-11-15 22:17:45 +0530",
+ "context_window": null,
+ "max_output_tokens": null,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text",
+ "moderation"
+ ]
+ },
+ "capabilities": [],
+ "pricing": {},
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "sora-2",
+ "name": "Sora 2",
+ "provider": "openai",
+ "family": "other",
+ "created_at": "2025-10-06 05:26:55 +0530",
+ "context_window": 4096,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "sora-2-pro",
+ "name": "Sora 2 Pro",
+ "provider": "openai",
+ "family": "other",
+ "created_at": "2025-10-06 05:27:43 +0530",
+ "context_window": 4096,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "text-embedding-3-large",
+ "name": "text-embedding-3-large",
+ "provider": "openai",
+ "family": "text-embedding",
+ "created_at": "2024-01-25 00:00:00 +0530",
+ "context_window": 8191,
+ "max_output_tokens": 3072,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "batch"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.13
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": false,
+ "last_updated": "2024-01-25",
+ "cost": {
+ "input": 0.13,
+ "output": 0
+ },
+ "limit": {
+ "context": 8191,
+ "output": 3072
+ },
+ "knowledge": "2024-01"
+ }
+ },
+ {
+ "id": "text-embedding-3-small",
+ "name": "text-embedding-3-small",
+ "provider": "openai",
+ "family": "text-embedding",
+ "created_at": "2024-01-25 00:00:00 +0530",
+ "context_window": 8191,
+ "max_output_tokens": 1536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "batch"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.02
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": false,
+ "last_updated": "2024-01-25",
+ "cost": {
+ "input": 0.02,
+ "output": 0
+ },
+ "limit": {
+ "context": 8191,
+ "output": 1536
+ },
+ "knowledge": "2024-01"
+ }
+ },
+ {
+ "id": "text-embedding-ada-002",
+ "name": "text-embedding-ada-002",
+ "provider": "openai",
+ "family": "text-embedding",
+ "created_at": "2022-12-15 00:00:00 +0530",
+ "context_window": 8192,
+ "max_output_tokens": 1536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "batch"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.1
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "openai-internal",
+ "source": "models.dev",
+ "provider_id": "openai",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": false,
+ "last_updated": "2022-12-15",
+ "cost": {
+ "input": 0.1,
+ "output": 0
+ },
+ "limit": {
+ "context": 8192,
+ "output": 1536
+ },
+ "knowledge": "2022-12"
+ }
+ },
+ {
+ "id": "tts-1",
+ "name": "TTS-1",
+ "provider": "openai",
+ "family": "tts1",
+ "created_at": "2023-04-20 03:19:11 +0530",
+ "context_window": null,
+ "max_output_tokens": null,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "audio"
+ ],
+ "output": [
+ "text",
+ "audio"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 15.0,
+ "output_per_million": 15.0
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "openai-internal"
+ }
+ },
+ {
+ "id": "tts-1-1106",
+ "name": "TTS-1 1106",
+ "provider": "openai",
+ "family": "tts1",
+ "created_at": "2023-11-04 04:44:01 +0530",
+ "context_window": null,
+ "max_output_tokens": null,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "audio"
+ ],
+ "output": [
+ "text",
+ "audio"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 15.0,
+ "output_per_million": 15.0
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "tts-1-hd",
+ "name": "TTS-1 HD",
+ "provider": "openai",
+ "family": "tts1_hd",
+ "created_at": "2023-11-04 02:43:35 +0530",
+ "context_window": null,
+ "max_output_tokens": null,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "audio"
+ ],
+ "output": [
+ "text",
+ "audio"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 30.0,
+ "output_per_million": 30.0
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "tts-1-hd-1106",
+ "name": "TTS-1 HD 1106",
+ "provider": "openai",
+ "family": "tts1_hd",
+ "created_at": "2023-11-04 04:48:53 +0530",
+ "context_window": null,
+ "max_output_tokens": null,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "audio"
+ ],
+ "output": [
+ "text",
+ "audio"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 30.0,
+ "output_per_million": 30.0
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "system"
+ }
+ },
+ {
+ "id": "whisper-1",
+ "name": "Whisper 1",
+ "provider": "openai",
+ "family": "whisper",
+ "created_at": "2023-02-28 02:43:04 +0530",
+ "context_window": null,
+ "max_output_tokens": null,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "audio"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "streaming"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.006,
+ "output_per_million": 0.006
+ }
+ }
+ },
+ "metadata": {
+ "object": "model",
+ "owned_by": "openai-internal"
+ }
+ },
+ {
+ "id": "anthropic/claude-3.5-haiku",
+ "name": "Claude Haiku 3.5",
+ "provider": "openrouter",
+ "family": "claude-haiku",
+ "created_at": "2024-10-22 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": "2024-07-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.8,
+ "output_per_million": 4,
+ "cached_input_per_million": 0.08
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-10-22",
+ "cost": {
+ "input": 0.8,
+ "output": 4,
+ "cache_read": 0.08,
+ "cache_write": 1
+ },
+ "limit": {
+ "context": 200000,
+ "output": 8192
+ },
+ "knowledge": "2024-07-31"
+ }
+ },
+ {
+ "id": "anthropic/claude-3.7-sonnet",
+ "name": "Claude Sonnet 3.7",
+ "provider": "openrouter",
+ "family": "claude-sonnet",
+ "created_at": "2025-02-19 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 15,
+ "output_per_million": 75,
+ "cached_input_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-02-19",
+ "cost": {
+ "input": 15,
+ "output": 75,
+ "cache_read": 1.5,
+ "cache_write": 18.75
+ },
+ "limit": {
+ "context": 200000,
+ "output": 128000
+ },
+ "knowledge": "2024-01"
+ }
+ },
+ {
+ "id": "anthropic/claude-haiku-4.5",
+ "name": "Claude Haiku 4.5",
+ "provider": "openrouter",
+ "family": "claude-haiku",
+ "created_at": "2025-10-15 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": "2025-02-28",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1,
+ "output_per_million": 5,
+ "cached_input_per_million": 0.1
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-10-15",
+ "cost": {
+ "input": 1,
+ "output": 5,
+ "cache_read": 0.1,
+ "cache_write": 1.25
+ },
+ "limit": {
+ "context": 200000,
+ "output": 64000
+ },
+ "knowledge": "2025-02-28"
+ }
+ },
+ {
+ "id": "anthropic/claude-opus-4",
+ "name": "Claude Opus 4",
+ "provider": "openrouter",
+ "family": "claude-opus",
+ "created_at": "2025-05-22 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 32000,
+ "knowledge_cutoff": "2025-03-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 15,
+ "output_per_million": 75,
+ "cached_input_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-05-22",
+ "cost": {
+ "input": 15,
+ "output": 75,
+ "cache_read": 1.5,
+ "cache_write": 18.75
+ },
+ "limit": {
+ "context": 200000,
+ "output": 32000
+ },
+ "knowledge": "2025-03-31"
+ }
+ },
+ {
+ "id": "anthropic/claude-opus-4.1",
+ "name": "Claude Opus 4.1",
+ "provider": "openrouter",
+ "family": "claude-opus",
+ "created_at": "2025-08-05 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 32000,
+ "knowledge_cutoff": "2025-03-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 15,
+ "output_per_million": 75,
+ "cached_input_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-08-05",
+ "cost": {
+ "input": 15,
+ "output": 75,
+ "cache_read": 1.5,
+ "cache_write": 18.75
+ },
+ "limit": {
+ "context": 200000,
+ "output": 32000
+ },
+ "knowledge": "2025-03-31"
+ }
+ },
+ {
+ "id": "anthropic/claude-opus-4.5",
+ "name": "Claude Opus 4.5",
+ "provider": "openrouter",
+ "family": "claude-opus",
+ "created_at": "2025-11-24 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 32000,
+ "knowledge_cutoff": "2025-05-30",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 5,
+ "output_per_million": 25,
+ "cached_input_per_million": 0.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-11-24",
+ "cost": {
+ "input": 5,
+ "output": 25,
+ "cache_read": 0.5,
+ "cache_write": 6.25
+ },
+ "limit": {
+ "context": 200000,
+ "output": 32000
+ },
+ "knowledge": "2025-05-30"
+ }
+ },
+ {
+ "id": "anthropic/claude-opus-4.6",
+ "name": "Claude Opus 4.6",
+ "provider": "openrouter",
+ "family": "claude-opus",
+ "created_at": "2026-02-05 00:00:00 +0530",
+ "context_window": 1000000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2025-05-30",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 5,
+ "output_per_million": 25,
+ "cached_input_per_million": 0.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-02-05",
+ "cost": {
+ "input": 5,
+ "output": 25,
+ "cache_read": 0.5,
+ "cache_write": 6.25,
+ "context_over_200k": {
+ "input": 10,
+ "output": 37.5,
+ "cache_read": 1,
+ "cache_write": 12.5
+ }
+ },
+ "limit": {
+ "context": 1000000,
+ "output": 128000
+ },
+ "knowledge": "2025-05-30"
+ }
+ },
+ {
+ "id": "anthropic/claude-sonnet-4",
+ "name": "Claude Sonnet 4",
+ "provider": "openrouter",
+ "family": "claude-sonnet",
+ "created_at": "2025-05-22 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": "2025-03-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 3,
+ "output_per_million": 15,
+ "cached_input_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-05-22",
+ "cost": {
+ "input": 3,
+ "output": 15,
+ "cache_read": 0.3,
+ "cache_write": 3.75,
+ "context_over_200k": {
+ "input": 6,
+ "output": 22.5,
+ "cache_read": 0.6,
+ "cache_write": 7.5
+ }
+ },
+ "limit": {
+ "context": 200000,
+ "output": 64000
+ },
+ "knowledge": "2025-03-31"
+ }
+ },
+ {
+ "id": "anthropic/claude-sonnet-4.5",
+ "name": "Claude Sonnet 4.5",
+ "provider": "openrouter",
+ "family": "claude-sonnet",
+ "created_at": "2025-09-29 00:00:00 +0530",
+ "context_window": 1000000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": "2025-07-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 3,
+ "output_per_million": 15,
+ "cached_input_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-09-29",
+ "cost": {
+ "input": 3,
+ "output": 15,
+ "cache_read": 0.3,
+ "cache_write": 3.75,
+ "context_over_200k": {
+ "input": 6,
+ "output": 22.5,
+ "cache_read": 0.6,
+ "cache_write": 7.5
+ }
+ },
+ "limit": {
+ "context": 1000000,
+ "output": 64000
+ },
+ "knowledge": "2025-07-31"
+ }
+ },
+ {
+ "id": "anthropic/claude-sonnet-4.6",
+ "name": "Claude Sonnet 4.6",
+ "provider": "openrouter",
+ "family": "claude-sonnet",
+ "created_at": "2026-02-17 00:00:00 +0530",
+ "context_window": 1000000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 3,
+ "output_per_million": 15,
+ "cached_input_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-02-17",
+ "cost": {
+ "input": 3,
+ "output": 15,
+ "cache_read": 0.3,
+ "cache_write": 3.75,
+ "context_over_200k": {
+ "input": 6,
+ "output": 22.5,
+ "cache_read": 0.6,
+ "cache_write": 7.5
+ }
+ },
+ "limit": {
+ "context": 1000000,
+ "output": 128000
+ }
+ }
+ },
+ {
+ "id": "arcee-ai/trinity-large-preview:free",
+ "name": "Trinity Large Preview",
+ "provider": "openrouter",
+ "family": "trinity",
+ "created_at": "2026-01-28 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 131072,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-01-28",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 131072,
+ "output": 131072
+ },
+ "knowledge": "2025-06"
+ }
+ },
+ {
+ "id": "arcee-ai/trinity-large-thinking",
+ "name": "Trinity Large Thinking",
+ "provider": "openrouter",
+ "family": "trinity",
+ "created_at": "2026-04-01 00:00:00 +0530",
+ "context_window": 262144,
+ "max_output_tokens": 80000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.22,
+ "output_per_million": 0.85
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-04-03",
+ "cost": {
+ "input": 0.22,
+ "output": 0.85
+ },
+ "limit": {
+ "context": 262144,
+ "output": 80000
+ }
+ }
+ },
+ {
+ "id": "black-forest-labs/flux.2-flex",
+ "name": "FLUX.2 Flex",
+ "provider": "openrouter",
+ "family": "flux",
+ "created_at": "2025-11-25 00:00:00 +0530",
+ "context_window": 67344,
+ "max_output_tokens": 67344,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "image",
+ "text"
+ ],
+ "output": [
+ "image"
+ ]
+ },
+ "capabilities": [
+ "vision"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-01-31",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 67344,
+ "output": 67344
+ },
+ "knowledge": "2025-06"
+ }
+ },
+ {
+ "id": "black-forest-labs/flux.2-klein-4b",
+ "name": "FLUX.2 Klein 4B",
+ "provider": "openrouter",
+ "family": "flux",
+ "created_at": "2026-01-14 00:00:00 +0530",
+ "context_window": 40960,
+ "max_output_tokens": 40960,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "image",
+ "text"
+ ],
+ "output": [
+ "image"
+ ]
+ },
+ "capabilities": [
+ "vision"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-01-31",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 40960,
+ "output": 40960
+ },
+ "knowledge": "2025-06"
+ }
+ },
+ {
+ "id": "black-forest-labs/flux.2-max",
+ "name": "FLUX.2 Max",
+ "provider": "openrouter",
+ "family": "flux",
+ "created_at": "2025-12-16 00:00:00 +0530",
+ "context_window": 46864,
+ "max_output_tokens": 46864,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "image",
+ "text"
+ ],
+ "output": [
+ "image"
+ ]
+ },
+ "capabilities": [
+ "vision"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-01-31",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 46864,
+ "output": 46864
+ },
+ "knowledge": "2025-06"
+ }
+ },
+ {
+ "id": "black-forest-labs/flux.2-pro",
+ "name": "FLUX.2 Pro",
+ "provider": "openrouter",
+ "family": "flux",
+ "created_at": "2025-11-25 00:00:00 +0530",
+ "context_window": 46864,
+ "max_output_tokens": 46864,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "image",
+ "text"
+ ],
+ "output": [
+ "image"
+ ]
+ },
+ "capabilities": [
+ "vision"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-01-31",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 46864,
+ "output": 46864
+ },
+ "knowledge": "2025-06"
+ }
+ },
+ {
+ "id": "bytedance-seed/seedream-4.5",
+ "name": "Seedream 4.5",
+ "provider": "openrouter",
+ "family": "seed",
+ "created_at": "2025-12-23 00:00:00 +0530",
+ "context_window": 4096,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "image",
+ "text"
+ ],
+ "output": [
+ "image"
+ ]
+ },
+ "capabilities": [
+ "vision"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-01-31",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 4096,
+ "output": 4096
+ },
+ "knowledge": "2025-06"
+ }
+ },
+ {
+ "id": "cognitivecomputations/dolphin-mistral-24b-venice-edition:free",
+ "name": "Uncensored (free)",
+ "provider": "openrouter",
+ "family": "mistral",
+ "created_at": "2025-07-09 00:00:00 +0530",
+ "context_window": 32768,
+ "max_output_tokens": 32768,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "structured_output"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-01-31",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 32768,
+ "output": 32768
+ },
+ "knowledge": "2025-06"
+ }
+ },
+ {
+ "id": "deepseek/deepseek-chat-v3-0324",
+ "name": "DeepSeek V3 0324",
+ "provider": "openrouter",
+ "family": "deepseek",
+ "created_at": "2025-03-24 00:00:00 +0530",
+ "context_window": 16384,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "structured_output"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-03-24",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 16384,
+ "output": 8192
+ },
+ "knowledge": "2024-10"
+ }
+ },
+ {
+ "id": "deepseek/deepseek-chat-v3.1",
+ "name": "DeepSeek-V3.1",
+ "provider": "openrouter",
+ "family": "deepseek",
+ "created_at": "2025-08-21 00:00:00 +0530",
+ "context_window": 163840,
+ "max_output_tokens": 163840,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.2,
+ "output_per_million": 0.8
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-08-21",
+ "cost": {
+ "input": 0.2,
+ "output": 0.8
+ },
+ "limit": {
+ "context": 163840,
+ "output": 163840
+ },
+ "knowledge": "2025-07"
+ }
+ },
+ {
+ "id": "deepseek/deepseek-r1",
+ "name": "DeepSeek: R1",
+ "provider": "openrouter",
+ "family": "deepseek-thinking",
+ "created_at": "2025-01-20 00:00:00 +0530",
+ "context_window": 64000,
+ "max_output_tokens": 16000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.7,
+ "output_per_million": 2.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-01-20",
+ "cost": {
+ "input": 0.7,
+ "output": 2.5
+ },
+ "limit": {
+ "context": 64000,
+ "output": 16000
+ },
+ "knowledge": "2024-07"
+ }
+ },
+ {
+ "id": "deepseek/deepseek-r1-distill-llama-70b",
+ "name": "DeepSeek R1 Distill Llama 70B",
+ "provider": "openrouter",
+ "family": "deepseek-thinking",
+ "created_at": "2025-01-23 00:00:00 +0530",
+ "context_window": 8192,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-01-23",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 8192,
+ "output": 8192
+ },
+ "knowledge": "2024-10"
+ }
+ },
+ {
+ "id": "deepseek/deepseek-v3.1-terminus",
+ "name": "DeepSeek V3.1 Terminus",
+ "provider": "openrouter",
+ "family": "deepseek",
+ "created_at": "2025-09-22 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.27,
+ "output_per_million": 1
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-09-22",
+ "cost": {
+ "input": 0.27,
+ "output": 1
+ },
+ "limit": {
+ "context": 131072,
+ "output": 65536
+ },
+ "knowledge": "2025-07"
+ }
+ },
+ {
+ "id": "deepseek/deepseek-v3.1-terminus:exacto",
+ "name": "DeepSeek V3.1 Terminus (exacto)",
+ "provider": "openrouter",
+ "family": "deepseek",
+ "created_at": "2025-09-22 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.27,
+ "output_per_million": 1
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-09-22",
+ "cost": {
+ "input": 0.27,
+ "output": 1
+ },
+ "limit": {
+ "context": 131072,
+ "output": 65536
+ },
+ "knowledge": "2025-07"
+ }
+ },
+ {
+ "id": "deepseek/deepseek-v3.2",
+ "name": "DeepSeek V3.2",
+ "provider": "openrouter",
+ "family": "deepseek",
+ "created_at": "2025-12-01 00:00:00 +0530",
+ "context_window": 163840,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.28,
+ "output_per_million": 0.4
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-12-01",
+ "cost": {
+ "input": 0.28,
+ "output": 0.4
+ },
+ "limit": {
+ "context": 163840,
+ "output": 65536
+ },
+ "knowledge": "2024-07"
+ }
+ },
+ {
+ "id": "deepseek/deepseek-v3.2-speciale",
+ "name": "DeepSeek V3.2 Speciale",
+ "provider": "openrouter",
+ "family": "deepseek",
+ "created_at": "2025-12-01 00:00:00 +0530",
+ "context_window": 163840,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.27,
+ "output_per_million": 0.41
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-12-01",
+ "cost": {
+ "input": 0.27,
+ "output": 0.41
+ },
+ "limit": {
+ "context": 163840,
+ "output": 65536
+ },
+ "knowledge": "2024-07"
+ }
+ },
+ {
+ "id": "google/gemini-2.0-flash-001",
+ "name": "Gemini 2.0 Flash",
+ "provider": "openrouter",
+ "family": "gemini-flash",
+ "created_at": "2024-12-11 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.1,
+ "output_per_million": 0.4,
+ "cached_input_per_million": 0.025
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-12-11",
+ "cost": {
+ "input": 0.1,
+ "output": 0.4,
+ "cache_read": 0.025
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 8192
+ },
+ "knowledge": "2024-06"
+ }
+ },
+ {
+ "id": "google/gemini-2.5-flash",
+ "name": "Gemini 2.5 Flash",
+ "provider": "openrouter",
+ "family": "gemini-flash",
+ "created_at": "2025-07-17 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.3,
+ "output_per_million": 2.5,
+ "cached_input_per_million": 0.0375
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-07-17",
+ "cost": {
+ "input": 0.3,
+ "output": 2.5,
+ "cache_read": 0.0375
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "google/gemini-2.5-flash-lite",
+ "name": "Gemini 2.5 Flash Lite",
+ "provider": "openrouter",
+ "family": "gemini-flash-lite",
+ "created_at": "2025-06-17 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.1,
+ "output_per_million": 0.4,
+ "cached_input_per_million": 0.025
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-06-17",
+ "cost": {
+ "input": 0.1,
+ "output": 0.4,
+ "cache_read": 0.025
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "google/gemini-2.5-flash-lite-preview-09-2025",
+ "name": "Gemini 2.5 Flash Lite Preview 09-25",
+ "provider": "openrouter",
+ "family": "gemini-flash-lite",
+ "created_at": "2025-09-25 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.1,
+ "output_per_million": 0.4,
+ "cached_input_per_million": 0.025
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-09-25",
+ "cost": {
+ "input": 0.1,
+ "output": 0.4,
+ "cache_read": 0.025
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "google/gemini-2.5-flash-preview-09-2025",
+ "name": "Gemini 2.5 Flash Preview 09-25",
+ "provider": "openrouter",
+ "family": "gemini-flash",
+ "created_at": "2025-09-25 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.3,
+ "output_per_million": 2.5,
+ "cached_input_per_million": 0.031
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-09-25",
+ "cost": {
+ "input": 0.3,
+ "output": 2.5,
+ "cache_read": 0.031
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "google/gemini-2.5-pro",
+ "name": "Gemini 2.5 Pro",
+ "provider": "openrouter",
+ "family": "gemini-pro",
+ "created_at": "2025-03-20 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10,
+ "cached_input_per_million": 0.31
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-06-05",
+ "cost": {
+ "input": 1.25,
+ "output": 10,
+ "cache_read": 0.31
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "google/gemini-2.5-pro-preview-05-06",
+ "name": "Gemini 2.5 Pro Preview 05-06",
+ "provider": "openrouter",
+ "family": "gemini-pro",
+ "created_at": "2025-05-06 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10,
+ "cached_input_per_million": 0.31
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-05-06",
+ "cost": {
+ "input": 1.25,
+ "output": 10,
+ "cache_read": 0.31
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "google/gemini-2.5-pro-preview-06-05",
+ "name": "Gemini 2.5 Pro Preview 06-05",
+ "provider": "openrouter",
+ "family": "gemini-pro",
+ "created_at": "2025-06-05 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10,
+ "cached_input_per_million": 0.31
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-06-05",
+ "cost": {
+ "input": 1.25,
+ "output": 10,
+ "cache_read": 0.31
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "google/gemini-3-flash-preview",
+ "name": "Gemini 3 Flash Preview",
+ "provider": "openrouter",
+ "family": "gemini-flash",
+ "created_at": "2025-12-17 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 3,
+ "cached_input_per_million": 0.05
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-12-17",
+ "interleaved": {
+ "field": "reasoning_details"
+ },
+ "cost": {
+ "input": 0.5,
+ "output": 3,
+ "cache_read": 0.05
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "google/gemini-3-pro-preview",
+ "name": "Gemini 3 Pro Preview",
+ "provider": "openrouter",
+ "family": "gemini-pro",
+ "created_at": "2025-11-18 00:00:00 +0530",
+ "context_window": 1050000,
+ "max_output_tokens": 66000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2,
+ "output_per_million": 12
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-11",
+ "interleaved": {
+ "field": "reasoning_details"
+ },
+ "cost": {
+ "input": 2,
+ "output": 12
+ },
+ "limit": {
+ "context": 1050000,
+ "output": 66000
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "google/gemini-3.1-flash-lite-preview",
+ "name": "Gemini 3.1 Flash Lite Preview",
+ "provider": "openrouter",
+ "family": "gemini-flash-lite",
+ "created_at": "2026-03-03 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "video",
+ "pdf",
+ "audio"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.25,
+ "output_per_million": 1.5,
+ "cached_input_per_million": 0.025,
+ "reasoning_output_per_million": 1.5
+ }
+ },
+ "audio_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 0.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-03-03",
+ "cost": {
+ "input": 0.25,
+ "output": 1.5,
+ "reasoning": 1.5,
+ "cache_read": 0.025,
+ "cache_write": 0.083,
+ "input_audio": 0.5,
+ "output_audio": 0.5
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ }
+ }
+ },
+ {
+ "id": "google/gemini-3.1-pro-preview",
+ "name": "Gemini 3.1 Pro Preview",
+ "provider": "openrouter",
+ "family": "gemini-pro",
+ "created_at": "2026-02-19 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2,
+ "output_per_million": 12,
+ "reasoning_output_per_million": 12
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-02-19",
+ "interleaved": {
+ "field": "reasoning_details"
+ },
+ "cost": {
+ "input": 2,
+ "output": 12,
+ "reasoning": 12,
+ "context_over_200k": {
+ "input": 4,
+ "output": 18,
+ "cache_read": 0.4
+ }
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "google/gemini-3.1-pro-preview-customtools",
+ "name": "Gemini 3.1 Pro Preview Custom Tools",
+ "provider": "openrouter",
+ "family": "gemini-pro",
+ "created_at": "2026-02-19 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2,
+ "output_per_million": 12,
+ "reasoning_output_per_million": 12
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-02-19",
+ "interleaved": {
+ "field": "reasoning_details"
+ },
+ "cost": {
+ "input": 2,
+ "output": 12,
+ "reasoning": 12,
+ "context_over_200k": {
+ "input": 4,
+ "output": 18,
+ "cache_read": 0.4
+ }
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "google/gemma-2-9b-it",
+ "name": "Gemma 2 9B",
+ "provider": "openrouter",
+ "family": "gemma",
+ "created_at": "2024-06-28 00:00:00 +0530",
+ "context_window": 8192,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.03,
+ "output_per_million": 0.09
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2024-06-28",
+ "cost": {
+ "input": 0.03,
+ "output": 0.09
+ },
+ "limit": {
+ "context": 8192,
+ "output": 8192
+ },
+ "knowledge": "2024-06"
+ }
+ },
+ {
+ "id": "google/gemma-3-12b-it",
+ "name": "Gemma 3 12B",
+ "provider": "openrouter",
+ "family": "gemma",
+ "created_at": "2025-03-13 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 131072,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "structured_output",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.03,
+ "output_per_million": 0.1
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-03-13",
+ "cost": {
+ "input": 0.03,
+ "output": 0.1
+ },
+ "limit": {
+ "context": 131072,
+ "output": 131072
+ },
+ "knowledge": "2024-10"
+ }
+ },
+ {
+ "id": "google/gemma-3-12b-it:free",
+ "name": "Gemma 3 12B (free)",
+ "provider": "openrouter",
+ "family": "gemma",
+ "created_at": "2025-03-13 00:00:00 +0530",
+ "context_window": 32768,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "vision"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-03-13",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 32768,
+ "output": 8192
+ },
+ "knowledge": "2024-10"
+ }
+ },
+ {
+ "id": "google/gemma-3-27b-it",
+ "name": "Gemma 3 27B",
+ "provider": "openrouter",
+ "family": "gemma",
+ "created_at": "2025-03-12 00:00:00 +0530",
+ "context_window": 96000,
+ "max_output_tokens": 96000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.04,
+ "output_per_million": 0.15
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-03-12",
+ "cost": {
+ "input": 0.04,
+ "output": 0.15
+ },
+ "limit": {
+ "context": 96000,
+ "output": 96000
+ },
+ "knowledge": "2024-10"
+ }
+ },
+ {
+ "id": "google/gemma-3-27b-it:free",
+ "name": "Gemma 3 27B (free)",
+ "provider": "openrouter",
+ "family": "gemma",
+ "created_at": "2025-03-12 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-03-12",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 131072,
+ "output": 8192
+ },
+ "knowledge": "2024-10"
+ }
+ },
+ {
+ "id": "google/gemma-3-4b-it",
+ "name": "Gemma 3 4B",
+ "provider": "openrouter",
+ "family": "gemma",
+ "created_at": "2025-03-13 00:00:00 +0530",
+ "context_window": 96000,
+ "max_output_tokens": 96000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.01703,
+ "output_per_million": 0.06815
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-03-13",
+ "cost": {
+ "input": 0.01703,
+ "output": 0.06815
+ },
+ "limit": {
+ "context": 96000,
+ "output": 96000
+ },
+ "knowledge": "2024-10"
+ }
+ },
+ {
+ "id": "google/gemma-3-4b-it:free",
+ "name": "Gemma 3 4B (free)",
+ "provider": "openrouter",
+ "family": "gemma",
+ "created_at": "2025-03-13 00:00:00 +0530",
+ "context_window": 32768,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "vision"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-03-13",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 32768,
+ "output": 8192
+ },
+ "knowledge": "2024-10"
+ }
+ },
+ {
+ "id": "google/gemma-3n-e2b-it:free",
+ "name": "Gemma 3n 2B (free)",
+ "provider": "openrouter",
+ "family": "gemma",
+ "created_at": "2025-07-09 00:00:00 +0530",
+ "context_window": 8192,
+ "max_output_tokens": 2000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-07-09",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 8192,
+ "output": 2000
+ },
+ "knowledge": "2024-06"
+ }
+ },
+ {
+ "id": "google/gemma-3n-e4b-it",
+ "name": "Gemma 3n 4B",
+ "provider": "openrouter",
+ "family": "gemma",
+ "created_at": "2025-05-20 00:00:00 +0530",
+ "context_window": 32768,
+ "max_output_tokens": 32768,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.02,
+ "output_per_million": 0.04
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-05-20",
+ "cost": {
+ "input": 0.02,
+ "output": 0.04
+ },
+ "limit": {
+ "context": 32768,
+ "output": 32768
+ },
+ "knowledge": "2024-06"
+ }
+ },
+ {
+ "id": "google/gemma-3n-e4b-it:free",
+ "name": "Gemma 3n 4B (free)",
+ "provider": "openrouter",
+ "family": "gemma",
+ "created_at": "2025-05-20 00:00:00 +0530",
+ "context_window": 8192,
+ "max_output_tokens": 2000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-05-20",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 8192,
+ "output": 2000
+ },
+ "knowledge": "2024-06"
+ }
+ },
+ {
+ "id": "google/gemma-4-26b-a4b-it",
+ "name": "Gemma 4 26B A4B",
+ "provider": "openrouter",
+ "family": "gemma",
+ "created_at": "2026-04-03 00:00:00 +0530",
+ "context_window": 262144,
+ "max_output_tokens": 262144,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "video"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.13,
+ "output_per_million": 0.4
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-04-03",
+ "cost": {
+ "input": 0.13,
+ "output": 0.4
+ },
+ "limit": {
+ "context": 262144,
+ "output": 262144
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "google/gemma-4-26b-a4b-it:free",
+ "name": "Gemma 4 26B A4B (free)",
+ "provider": "openrouter",
+ "family": "gemma",
+ "created_at": "2026-04-03 00:00:00 +0530",
+ "context_window": 262144,
+ "max_output_tokens": 32768,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "video"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-04-03",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 262144,
+ "output": 32768
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "google/gemma-4-31b-it",
+ "name": "Gemma 4 31B",
+ "provider": "openrouter",
+ "family": "gemma",
+ "created_at": "2026-04-02 00:00:00 +0530",
+ "context_window": 262144,
+ "max_output_tokens": 262144,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "video"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.14,
+ "output_per_million": 0.4
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-04-02",
+ "cost": {
+ "input": 0.14,
+ "output": 0.4
+ },
+ "limit": {
+ "context": 262144,
+ "output": 262144
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "google/gemma-4-31b-it:free",
+ "name": "Gemma 4 31B (free)",
+ "provider": "openrouter",
+ "family": "gemma",
+ "created_at": "2026-04-02 00:00:00 +0530",
+ "context_window": 262144,
+ "max_output_tokens": 32768,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "video"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-04-02",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 262144,
+ "output": 32768
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "inception/mercury-2",
+ "name": "Mercury 2",
+ "provider": "openrouter",
+ "family": "mercury",
+ "created_at": "2026-03-04 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 50000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.25,
+ "output_per_million": 0.75,
+ "cached_input_per_million": 0.025
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-03-04",
+ "cost": {
+ "input": 0.25,
+ "output": 0.75,
+ "cache_read": 0.025
+ },
+ "limit": {
+ "context": 128000,
+ "output": 50000
+ }
+ }
+ },
+ {
+ "id": "inception/mercury-edit-2",
+ "name": "Mercury Edit 2",
+ "provider": "openrouter",
+ "family": null,
+ "created_at": "2026-03-30 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.25,
+ "output_per_million": 0.75,
+ "cached_input_per_million": 0.025
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-03-30",
+ "cost": {
+ "input": 0.25,
+ "output": 0.75,
+ "cache_read": 0.025
+ },
+ "limit": {
+ "context": 128000,
+ "output": 8192
+ }
+ }
+ },
+ {
+ "id": "liquid/lfm-2.5-1.2b-instruct:free",
+ "name": "LFM2.5-1.2B-Instruct (free)",
+ "provider": "openrouter",
+ "family": "liquid",
+ "created_at": "2026-01-20 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 32768,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-01-28",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 131072,
+ "output": 32768
+ },
+ "knowledge": "2025-06"
+ }
+ },
+ {
+ "id": "liquid/lfm-2.5-1.2b-thinking:free",
+ "name": "LFM2.5-1.2B-Thinking (free)",
+ "provider": "openrouter",
+ "family": "liquid",
+ "created_at": "2026-01-20 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 32768,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "reasoning"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-01-28",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 131072,
+ "output": 32768
+ },
+ "knowledge": "2025-06"
+ }
+ },
+ {
+ "id": "meta-llama/llama-3.2-11b-vision-instruct",
+ "name": "Llama 3.2 11B Vision Instruct",
+ "provider": "openrouter",
+ "family": "llama",
+ "created_at": "2024-09-25 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "vision"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-09-25",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 131072,
+ "output": 8192
+ },
+ "knowledge": "2023-12"
+ }
+ },
+ {
+ "id": "meta-llama/llama-3.2-3b-instruct:free",
+ "name": "Llama 3.2 3B Instruct (free)",
+ "provider": "openrouter",
+ "family": "llama",
+ "created_at": "2024-09-25 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 131072,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "vision"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-09-25",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 131072,
+ "output": 131072
+ },
+ "knowledge": "2023-12"
+ }
+ },
+ {
+ "id": "meta-llama/llama-3.3-70b-instruct:free",
+ "name": "Llama 3.3 70B Instruct (free)",
+ "provider": "openrouter",
+ "family": "llama",
+ "created_at": "2024-12-06 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 131072,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2024-12-06",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 131072,
+ "output": 131072
+ },
+ "knowledge": "2024-12"
+ }
+ },
+ {
+ "id": "minimax/minimax-01",
+ "name": "MiniMax-01",
+ "provider": "openrouter",
+ "family": "minimax",
+ "created_at": "2025-01-15 00:00:00 +0530",
+ "context_window": 1000000,
+ "max_output_tokens": 1000000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.2,
+ "output_per_million": 1.1
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-01-15",
+ "cost": {
+ "input": 0.2,
+ "output": 1.1
+ },
+ "limit": {
+ "context": 1000000,
+ "output": 1000000
+ }
+ }
+ },
+ {
+ "id": "minimax/minimax-m1",
+ "name": "MiniMax M1",
+ "provider": "openrouter",
+ "family": "minimax",
+ "created_at": "2025-06-17 00:00:00 +0530",
+ "context_window": 1000000,
+ "max_output_tokens": 40000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.4,
+ "output_per_million": 2.2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-06-17",
+ "cost": {
+ "input": 0.4,
+ "output": 2.2
+ },
+ "limit": {
+ "context": 1000000,
+ "output": 40000
+ }
+ }
+ },
+ {
+ "id": "minimax/minimax-m2",
+ "name": "MiniMax M2",
+ "provider": "openrouter",
+ "family": "minimax",
+ "created_at": "2025-10-23 00:00:00 +0530",
+ "context_window": 196600,
+ "max_output_tokens": 118000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.28,
+ "output_per_million": 1.15,
+ "cached_input_per_million": 0.28
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-10-23",
+ "interleaved": {
+ "field": "reasoning_details"
+ },
+ "cost": {
+ "input": 0.28,
+ "output": 1.15,
+ "cache_read": 0.28,
+ "cache_write": 1.15
+ },
+ "limit": {
+ "context": 196600,
+ "output": 118000
+ }
+ }
+ },
+ {
+ "id": "minimax/minimax-m2.1",
+ "name": "MiniMax M2.1",
+ "provider": "openrouter",
+ "family": "minimax",
+ "created_at": "2025-12-23 00:00:00 +0530",
+ "context_window": 204800,
+ "max_output_tokens": 131072,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.3,
+ "output_per_million": 1.2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-12-23",
+ "interleaved": {
+ "field": "reasoning_details"
+ },
+ "cost": {
+ "input": 0.3,
+ "output": 1.2
+ },
+ "limit": {
+ "context": 204800,
+ "output": 131072
+ }
+ }
+ },
+ {
+ "id": "minimax/minimax-m2.5",
+ "name": "MiniMax M2.5",
+ "provider": "openrouter",
+ "family": "minimax",
+ "created_at": "2026-02-12 00:00:00 +0530",
+ "context_window": 204800,
+ "max_output_tokens": 131072,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.3,
+ "output_per_million": 1.2,
+ "cached_input_per_million": 0.03
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-02-12",
+ "interleaved": {
+ "field": "reasoning_details"
+ },
+ "cost": {
+ "input": 0.3,
+ "output": 1.2,
+ "cache_read": 0.03
+ },
+ "limit": {
+ "context": 204800,
+ "output": 131072
+ }
+ }
+ },
+ {
+ "id": "minimax/minimax-m2.5:free",
+ "name": "MiniMax M2.5 (free)",
+ "provider": "openrouter",
+ "family": "minimax",
+ "created_at": "2026-02-12 00:00:00 +0530",
+ "context_window": 204800,
+ "max_output_tokens": 131072,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-02-12",
+ "interleaved": {
+ "field": "reasoning_details"
+ },
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 204800,
+ "output": 131072
+ }
+ }
+ },
+ {
+ "id": "minimax/minimax-m2.7",
+ "name": "MiniMax M2.7",
+ "provider": "openrouter",
+ "family": "minimax",
+ "created_at": "2026-03-18 00:00:00 +0530",
+ "context_window": 204800,
+ "max_output_tokens": 131072,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.3,
+ "output_per_million": 1.2,
+ "cached_input_per_million": 0.06
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-03-18",
+ "cost": {
+ "input": 0.3,
+ "output": 1.2,
+ "cache_read": 0.06,
+ "cache_write": 0.375
+ },
+ "limit": {
+ "context": 204800,
+ "output": 131072
+ }
+ }
+ },
+ {
+ "id": "mistralai/codestral-2508",
+ "name": "Codestral 2508",
+ "provider": "openrouter",
+ "family": "codestral",
+ "created_at": "2025-08-01 00:00:00 +0530",
+ "context_window": 256000,
+ "max_output_tokens": 256000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.3,
+ "output_per_million": 0.9
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-08-01",
+ "cost": {
+ "input": 0.3,
+ "output": 0.9
+ },
+ "limit": {
+ "context": 256000,
+ "output": 256000
+ },
+ "knowledge": "2025-05"
+ }
+ },
+ {
+ "id": "mistralai/devstral-2512",
+ "name": "Devstral 2 2512",
+ "provider": "openrouter",
+ "family": "devstral",
+ "created_at": "2025-09-12 00:00:00 +0530",
+ "context_window": 262144,
+ "max_output_tokens": 262144,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.15,
+ "output_per_million": 0.6
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-09-12",
+ "cost": {
+ "input": 0.15,
+ "output": 0.6
+ },
+ "limit": {
+ "context": 262144,
+ "output": 262144
+ },
+ "knowledge": "2025-12"
+ }
+ },
+ {
+ "id": "mistralai/devstral-medium-2507",
+ "name": "Devstral Medium",
+ "provider": "openrouter",
+ "family": "devstral",
+ "created_at": "2025-07-10 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 131072,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.4,
+ "output_per_million": 2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-07-10",
+ "cost": {
+ "input": 0.4,
+ "output": 2
+ },
+ "limit": {
+ "context": 131072,
+ "output": 131072
+ },
+ "knowledge": "2025-05"
+ }
+ },
+ {
+ "id": "mistralai/devstral-small-2505",
+ "name": "Devstral Small",
+ "provider": "openrouter",
+ "family": "devstral",
+ "created_at": "2025-05-07 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.06,
+ "output_per_million": 0.12
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-05-07",
+ "cost": {
+ "input": 0.06,
+ "output": 0.12
+ },
+ "limit": {
+ "context": 128000,
+ "output": 128000
+ },
+ "knowledge": "2025-05"
+ }
+ },
+ {
+ "id": "mistralai/devstral-small-2507",
+ "name": "Devstral Small 1.1",
+ "provider": "openrouter",
+ "family": "devstral",
+ "created_at": "2025-07-10 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 131072,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.1,
+ "output_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-07-10",
+ "cost": {
+ "input": 0.1,
+ "output": 0.3
+ },
+ "limit": {
+ "context": 131072,
+ "output": 131072
+ },
+ "knowledge": "2025-05"
+ }
+ },
+ {
+ "id": "mistralai/mistral-medium-3",
+ "name": "Mistral Medium 3",
+ "provider": "openrouter",
+ "family": "mistral-medium",
+ "created_at": "2025-05-07 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 131072,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.4,
+ "output_per_million": 2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-05-07",
+ "cost": {
+ "input": 0.4,
+ "output": 2
+ },
+ "limit": {
+ "context": 131072,
+ "output": 131072
+ },
+ "knowledge": "2025-05"
+ }
+ },
+ {
+ "id": "mistralai/mistral-medium-3.1",
+ "name": "Mistral Medium 3.1",
+ "provider": "openrouter",
+ "family": "mistral-medium",
+ "created_at": "2025-08-12 00:00:00 +0530",
+ "context_window": 262144,
+ "max_output_tokens": 262144,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.4,
+ "output_per_million": 2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-08-12",
+ "cost": {
+ "input": 0.4,
+ "output": 2
+ },
+ "limit": {
+ "context": 262144,
+ "output": 262144
+ },
+ "knowledge": "2025-05"
+ }
+ },
+ {
+ "id": "mistralai/mistral-small-2603",
+ "name": "Mistral Small 4",
+ "provider": "openrouter",
+ "family": "mistral-small",
+ "created_at": "2026-03-16 00:00:00 +0530",
+ "context_window": 262144,
+ "max_output_tokens": 262144,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.15,
+ "output_per_million": 0.6
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-03-16",
+ "cost": {
+ "input": 0.15,
+ "output": 0.6
+ },
+ "limit": {
+ "context": 262144,
+ "output": 262144
+ },
+ "knowledge": "2025-06"
+ }
+ },
+ {
+ "id": "mistralai/mistral-small-3.1-24b-instruct",
+ "name": "Mistral Small 3.1 24B Instruct",
+ "provider": "openrouter",
+ "family": "mistral-small",
+ "created_at": "2025-03-17 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "vision"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-03-17",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 128000,
+ "output": 8192
+ },
+ "knowledge": "2024-10"
+ }
+ },
+ {
+ "id": "mistralai/mistral-small-3.2-24b-instruct",
+ "name": "Mistral Small 3.2 24B Instruct",
+ "provider": "openrouter",
+ "family": "mistral-small",
+ "created_at": "2025-06-20 00:00:00 +0530",
+ "context_window": 96000,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "vision"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-06-20",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 96000,
+ "output": 8192
+ },
+ "knowledge": "2024-10"
+ }
+ },
+ {
+ "id": "moonshotai/kimi-k2",
+ "name": "Kimi K2",
+ "provider": "openrouter",
+ "family": "kimi",
+ "created_at": "2025-07-11 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 32768,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.55,
+ "output_per_million": 2.2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-07-11",
+ "cost": {
+ "input": 0.55,
+ "output": 2.2
+ },
+ "limit": {
+ "context": 131072,
+ "output": 32768
+ },
+ "knowledge": "2024-10"
+ }
+ },
+ {
+ "id": "moonshotai/kimi-k2-0905",
+ "name": "Kimi K2 Instruct 0905",
+ "provider": "openrouter",
+ "family": "kimi",
+ "created_at": "2025-09-05 00:00:00 +0530",
+ "context_window": 262144,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.6,
+ "output_per_million": 2.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-09-05",
+ "cost": {
+ "input": 0.6,
+ "output": 2.5
+ },
+ "limit": {
+ "context": 262144,
+ "output": 16384
+ },
+ "knowledge": "2024-10"
+ }
+ },
+ {
+ "id": "moonshotai/kimi-k2-0905:exacto",
+ "name": "Kimi K2 Instruct 0905 (exacto)",
+ "provider": "openrouter",
+ "family": "kimi",
+ "created_at": "2025-09-05 00:00:00 +0530",
+ "context_window": 262144,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.6,
+ "output_per_million": 2.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-09-05",
+ "cost": {
+ "input": 0.6,
+ "output": 2.5
+ },
+ "limit": {
+ "context": 262144,
+ "output": 16384
+ },
+ "knowledge": "2024-10"
+ }
+ },
+ {
+ "id": "moonshotai/kimi-k2-thinking",
+ "name": "Kimi K2 Thinking",
+ "provider": "openrouter",
+ "family": "kimi-thinking",
+ "created_at": "2025-11-06 00:00:00 +0530",
+ "context_window": 262144,
+ "max_output_tokens": 262144,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.6,
+ "output_per_million": 2.5,
+ "cached_input_per_million": 0.15
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-11-06",
+ "interleaved": {
+ "field": "reasoning_details"
+ },
+ "cost": {
+ "input": 0.6,
+ "output": 2.5,
+ "cache_read": 0.15
+ },
+ "limit": {
+ "context": 262144,
+ "output": 262144
+ },
+ "knowledge": "2024-08"
+ }
+ },
+ {
+ "id": "moonshotai/kimi-k2.5",
+ "name": "Kimi K2.5",
+ "provider": "openrouter",
+ "family": "kimi",
+ "created_at": "2026-01-27 00:00:00 +0530",
+ "context_window": 262144,
+ "max_output_tokens": 262144,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "video"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.6,
+ "output_per_million": 3,
+ "cached_input_per_million": 0.1
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-01-27",
+ "interleaved": {
+ "field": "reasoning_details"
+ },
+ "cost": {
+ "input": 0.6,
+ "output": 3,
+ "cache_read": 0.1
+ },
+ "limit": {
+ "context": 262144,
+ "output": 262144
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "nousresearch/hermes-3-llama-3.1-405b:free",
+ "name": "Hermes 3 405B Instruct (free)",
+ "provider": "openrouter",
+ "family": "hermes",
+ "created_at": "2024-08-16 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 131072,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "reasoning"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2024-08-16",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 131072,
+ "output": 131072
+ },
+ "knowledge": "2023-12"
+ }
+ },
+ {
+ "id": "nousresearch/hermes-4-405b",
+ "name": "Hermes 4 405B",
+ "provider": "openrouter",
+ "family": "hermes",
+ "created_at": "2025-08-25 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 131072,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1,
+ "output_per_million": 3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-08-25",
+ "cost": {
+ "input": 1,
+ "output": 3
+ },
+ "limit": {
+ "context": 131072,
+ "output": 131072
+ },
+ "knowledge": "2023-12"
+ }
+ },
+ {
+ "id": "nousresearch/hermes-4-70b",
+ "name": "Hermes 4 70B",
+ "provider": "openrouter",
+ "family": "hermes",
+ "created_at": "2025-08-25 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 131072,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.13,
+ "output_per_million": 0.4
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-08-25",
+ "cost": {
+ "input": 0.13,
+ "output": 0.4
+ },
+ "limit": {
+ "context": 131072,
+ "output": 131072
+ },
+ "knowledge": "2023-12"
+ }
+ },
+ {
+ "id": "nvidia/nemotron-3-nano-30b-a3b:free",
+ "name": "Nemotron 3 Nano 30B A3B (free)",
+ "provider": "openrouter",
+ "family": "nemotron",
+ "created_at": "2025-12-14 00:00:00 +0530",
+ "context_window": 256000,
+ "max_output_tokens": 256000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-01-31",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 256000,
+ "output": 256000
+ },
+ "knowledge": "2025-11"
+ }
+ },
+ {
+ "id": "nvidia/nemotron-3-super-120b-a12b",
+ "name": "Nemotron 3 Super",
+ "provider": "openrouter",
+ "family": "nemotron",
+ "created_at": "2026-03-11 00:00:00 +0530",
+ "context_window": 262144,
+ "max_output_tokens": 262144,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.1,
+ "output_per_million": 0.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-03-11",
+ "cost": {
+ "input": 0.1,
+ "output": 0.5
+ },
+ "limit": {
+ "context": 262144,
+ "output": 262144
+ },
+ "knowledge": "2024-04"
+ }
+ },
+ {
+ "id": "nvidia/nemotron-3-super-120b-a12b:free",
+ "name": "Nemotron 3 Super (free)",
+ "provider": "openrouter",
+ "family": "nemotron",
+ "created_at": "2026-03-11 00:00:00 +0530",
+ "context_window": 262144,
+ "max_output_tokens": 262144,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-03-11",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 262144,
+ "output": 262144
+ },
+ "knowledge": "2024-04"
+ }
+ },
+ {
+ "id": "nvidia/nemotron-nano-12b-v2-vl:free",
+ "name": "Nemotron Nano 12B 2 VL (free)",
+ "provider": "openrouter",
+ "family": "nemotron",
+ "created_at": "2025-10-28 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-01-31",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 128000,
+ "output": 128000
+ },
+ "knowledge": "2025-11"
+ }
+ },
+ {
+ "id": "nvidia/nemotron-nano-9b-v2",
+ "name": "nvidia-nemotron-nano-9b-v2",
+ "provider": "openrouter",
+ "family": "nemotron",
+ "created_at": "2025-08-18 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 131072,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.04,
+ "output_per_million": 0.16
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-08-18",
+ "cost": {
+ "input": 0.04,
+ "output": 0.16
+ },
+ "limit": {
+ "context": 131072,
+ "output": 131072
+ },
+ "knowledge": "2024-09"
+ }
+ },
+ {
+ "id": "nvidia/nemotron-nano-9b-v2:free",
+ "name": "Nemotron Nano 9B V2 (free)",
+ "provider": "openrouter",
+ "family": "nemotron",
+ "created_at": "2025-09-05 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-08-18",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 128000,
+ "output": 128000
+ },
+ "knowledge": "2024-09"
+ }
+ },
+ {
+ "id": "openai/gpt-4.1",
+ "name": "GPT-4.1",
+ "provider": "openrouter",
+ "family": "gpt",
+ "created_at": "2025-04-14 00:00:00 +0530",
+ "context_window": 1047576,
+ "max_output_tokens": 32768,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2,
+ "output_per_million": 8,
+ "cached_input_per_million": 0.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-04-14",
+ "cost": {
+ "input": 2,
+ "output": 8,
+ "cache_read": 0.5
+ },
+ "limit": {
+ "context": 1047576,
+ "output": 32768
+ },
+ "knowledge": "2024-04"
+ }
+ },
+ {
+ "id": "openai/gpt-4.1-mini",
+ "name": "GPT-4.1 Mini",
+ "provider": "openrouter",
+ "family": "gpt-mini",
+ "created_at": "2025-04-14 00:00:00 +0530",
+ "context_window": 1047576,
+ "max_output_tokens": 32768,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.4,
+ "output_per_million": 1.6,
+ "cached_input_per_million": 0.1
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-04-14",
+ "cost": {
+ "input": 0.4,
+ "output": 1.6,
+ "cache_read": 0.1
+ },
+ "limit": {
+ "context": 1047576,
+ "output": 32768
+ },
+ "knowledge": "2024-04"
+ }
+ },
+ {
+ "id": "openai/gpt-4o-mini",
+ "name": "GPT-4o-mini",
+ "provider": "openrouter",
+ "family": "gpt-mini",
+ "created_at": "2024-07-18 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.15,
+ "output_per_million": 0.6,
+ "cached_input_per_million": 0.08
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-07-18",
+ "cost": {
+ "input": 0.15,
+ "output": 0.6,
+ "cache_read": 0.08
+ },
+ "limit": {
+ "context": 128000,
+ "output": 16384
+ },
+ "knowledge": "2024-10"
+ }
+ },
+ {
+ "id": "openai/gpt-5",
+ "name": "GPT-5",
+ "provider": "openrouter",
+ "family": "gpt",
+ "created_at": "2025-08-07 00:00:00 +0530",
+ "context_window": 400000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2024-10-01",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-08-07",
+ "cost": {
+ "input": 1.25,
+ "output": 10
+ },
+ "limit": {
+ "context": 400000,
+ "output": 128000
+ },
+ "knowledge": "2024-10-01"
+ }
+ },
+ {
+ "id": "openai/gpt-5-chat",
+ "name": "GPT-5 Chat (latest)",
+ "provider": "openrouter",
+ "family": "gpt-codex",
+ "created_at": "2025-08-07 00:00:00 +0530",
+ "context_window": 400000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2024-09-30",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-08-07",
+ "cost": {
+ "input": 1.25,
+ "output": 10
+ },
+ "limit": {
+ "context": 400000,
+ "output": 128000
+ },
+ "knowledge": "2024-09-30"
+ }
+ },
+ {
+ "id": "openai/gpt-5-codex",
+ "name": "GPT-5 Codex",
+ "provider": "openrouter",
+ "family": "gpt-codex",
+ "created_at": "2025-09-15 00:00:00 +0530",
+ "context_window": 400000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2024-10-01",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10,
+ "cached_input_per_million": 0.125
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-09-15",
+ "cost": {
+ "input": 1.25,
+ "output": 10,
+ "cache_read": 0.125
+ },
+ "limit": {
+ "context": 400000,
+ "output": 128000
+ },
+ "knowledge": "2024-10-01"
+ }
+ },
+ {
+ "id": "openai/gpt-5-image",
+ "name": "GPT-5 Image",
+ "provider": "openrouter",
+ "family": "gpt",
+ "created_at": "2025-10-14 00:00:00 +0530",
+ "context_window": 400000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2024-10-01",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text",
+ "image"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 5,
+ "output_per_million": 10,
+ "cached_input_per_million": 1.25
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-10-14",
+ "cost": {
+ "input": 5,
+ "output": 10,
+ "cache_read": 1.25
+ },
+ "limit": {
+ "context": 400000,
+ "output": 128000
+ },
+ "knowledge": "2024-10-01"
+ }
+ },
+ {
+ "id": "openai/gpt-5-mini",
+ "name": "GPT-5 Mini",
+ "provider": "openrouter",
+ "family": "gpt-mini",
+ "created_at": "2025-08-07 00:00:00 +0530",
+ "context_window": 400000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2024-10-01",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.25,
+ "output_per_million": 2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-08-07",
+ "cost": {
+ "input": 0.25,
+ "output": 2
+ },
+ "limit": {
+ "context": 400000,
+ "output": 128000
+ },
+ "knowledge": "2024-10-01"
+ }
+ },
+ {
+ "id": "openai/gpt-5-nano",
+ "name": "GPT-5 Nano",
+ "provider": "openrouter",
+ "family": "gpt-nano",
+ "created_at": "2025-08-07 00:00:00 +0530",
+ "context_window": 400000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2024-10-01",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.05,
+ "output_per_million": 0.4
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-08-07",
+ "cost": {
+ "input": 0.05,
+ "output": 0.4
+ },
+ "limit": {
+ "context": 400000,
+ "output": 128000
+ },
+ "knowledge": "2024-10-01"
+ }
+ },
+ {
+ "id": "openai/gpt-5-pro",
+ "name": "GPT-5 Pro",
+ "provider": "openrouter",
+ "family": "gpt-pro",
+ "created_at": "2025-10-06 00:00:00 +0530",
+ "context_window": 400000,
+ "max_output_tokens": 272000,
+ "knowledge_cutoff": "2024-09-30",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 15,
+ "output_per_million": 120
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2025-10-06",
+ "cost": {
+ "input": 15,
+ "output": 120
+ },
+ "limit": {
+ "context": 400000,
+ "output": 272000
+ },
+ "knowledge": "2024-09-30"
+ }
+ },
+ {
+ "id": "openai/gpt-5.1",
+ "name": "GPT-5.1",
+ "provider": "openrouter",
+ "family": "gpt",
+ "created_at": "2025-11-13 00:00:00 +0530",
+ "context_window": 400000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2024-09-30",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10,
+ "cached_input_per_million": 0.125
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-11-13",
+ "cost": {
+ "input": 1.25,
+ "output": 10,
+ "cache_read": 0.125
+ },
+ "limit": {
+ "context": 400000,
+ "output": 128000
+ },
+ "knowledge": "2024-09-30"
+ }
+ },
+ {
+ "id": "openai/gpt-5.1-chat",
+ "name": "GPT-5.1 Chat",
+ "provider": "openrouter",
+ "family": "gpt-codex",
+ "created_at": "2025-11-13 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": "2024-09-30",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10,
+ "cached_input_per_million": 0.125
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-11-13",
+ "cost": {
+ "input": 1.25,
+ "output": 10,
+ "cache_read": 0.125
+ },
+ "limit": {
+ "context": 128000,
+ "output": 16384
+ },
+ "knowledge": "2024-09-30"
+ }
+ },
+ {
+ "id": "openai/gpt-5.1-codex",
+ "name": "GPT-5.1-Codex",
+ "provider": "openrouter",
+ "family": "gpt-codex",
+ "created_at": "2025-11-13 00:00:00 +0530",
+ "context_window": 400000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2024-09-30",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10,
+ "cached_input_per_million": 0.125
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-11-13",
+ "cost": {
+ "input": 1.25,
+ "output": 10,
+ "cache_read": 0.125
+ },
+ "limit": {
+ "context": 400000,
+ "output": 128000
+ },
+ "knowledge": "2024-09-30"
+ }
+ },
+ {
+ "id": "openai/gpt-5.1-codex-max",
+ "name": "GPT-5.1-Codex-Max",
+ "provider": "openrouter",
+ "family": "gpt-codex",
+ "created_at": "2025-11-13 00:00:00 +0530",
+ "context_window": 400000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2024-09-30",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.1,
+ "output_per_million": 9,
+ "cached_input_per_million": 0.11
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-11-13",
+ "cost": {
+ "input": 1.1,
+ "output": 9,
+ "cache_read": 0.11
+ },
+ "limit": {
+ "context": 400000,
+ "output": 128000
+ },
+ "knowledge": "2024-09-30"
+ }
+ },
+ {
+ "id": "openai/gpt-5.1-codex-mini",
+ "name": "GPT-5.1-Codex-Mini",
+ "provider": "openrouter",
+ "family": "gpt-codex",
+ "created_at": "2025-11-13 00:00:00 +0530",
+ "context_window": 400000,
+ "max_output_tokens": 100000,
+ "knowledge_cutoff": "2024-09-30",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.25,
+ "output_per_million": 2,
+ "cached_input_per_million": 0.025
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-11-13",
+ "cost": {
+ "input": 0.25,
+ "output": 2,
+ "cache_read": 0.025
+ },
+ "limit": {
+ "context": 400000,
+ "output": 100000
+ },
+ "knowledge": "2024-09-30"
+ }
+ },
+ {
+ "id": "openai/gpt-5.2",
+ "name": "GPT-5.2",
+ "provider": "openrouter",
+ "family": "gpt",
+ "created_at": "2025-12-11 00:00:00 +0530",
+ "context_window": 400000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2025-08-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.75,
+ "output_per_million": 14,
+ "cached_input_per_million": 0.175
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2025-12-11",
+ "cost": {
+ "input": 1.75,
+ "output": 14,
+ "cache_read": 0.175
+ },
+ "limit": {
+ "context": 400000,
+ "output": 128000
+ },
+ "knowledge": "2025-08-31"
+ }
+ },
+ {
+ "id": "openai/gpt-5.2-chat",
+ "name": "GPT-5.2 Chat",
+ "provider": "openrouter",
+ "family": "gpt-codex",
+ "created_at": "2025-12-11 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": "2025-08-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.75,
+ "output_per_million": 14,
+ "cached_input_per_million": 0.175
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2025-12-11",
+ "cost": {
+ "input": 1.75,
+ "output": 14,
+ "cache_read": 0.175
+ },
+ "limit": {
+ "context": 128000,
+ "output": 16384
+ },
+ "knowledge": "2025-08-31"
+ }
+ },
+ {
+ "id": "openai/gpt-5.2-codex",
+ "name": "GPT-5.2-Codex",
+ "provider": "openrouter",
+ "family": "gpt-codex",
+ "created_at": "2026-01-14 00:00:00 +0530",
+ "context_window": 400000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2025-08-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.75,
+ "output_per_million": 14,
+ "cached_input_per_million": 0.175
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-01-14",
+ "cost": {
+ "input": 1.75,
+ "output": 14,
+ "cache_read": 0.175
+ },
+ "limit": {
+ "context": 400000,
+ "output": 128000
+ },
+ "knowledge": "2025-08-31"
+ }
+ },
+ {
+ "id": "openai/gpt-5.2-pro",
+ "name": "GPT-5.2 Pro",
+ "provider": "openrouter",
+ "family": "gpt-pro",
+ "created_at": "2025-12-11 00:00:00 +0530",
+ "context_window": 400000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2025-08-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 21,
+ "output_per_million": 168
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2025-12-11",
+ "cost": {
+ "input": 21,
+ "output": 168
+ },
+ "limit": {
+ "context": 400000,
+ "output": 128000
+ },
+ "knowledge": "2025-08-31"
+ }
+ },
+ {
+ "id": "openai/gpt-5.3-codex",
+ "name": "GPT-5.3-Codex",
+ "provider": "openrouter",
+ "family": "gpt-codex",
+ "created_at": "2026-02-24 00:00:00 +0530",
+ "context_window": 400000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2025-08-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.75,
+ "output_per_million": 14,
+ "cached_input_per_million": 0.175
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2026-02-24",
+ "cost": {
+ "input": 1.75,
+ "output": 14,
+ "cache_read": 0.175
+ },
+ "limit": {
+ "context": 400000,
+ "output": 128000
+ },
+ "knowledge": "2025-08-31"
+ }
+ },
+ {
+ "id": "openai/gpt-5.4",
+ "name": "GPT-5.4",
+ "provider": "openrouter",
+ "family": "gpt",
+ "created_at": "2026-03-05 00:00:00 +0530",
+ "context_window": 1050000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2025-08-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2.5,
+ "output_per_million": 15,
+ "cached_input_per_million": 0.25
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2026-03-05",
+ "cost": {
+ "input": 2.5,
+ "output": 15,
+ "cache_read": 0.25,
+ "context_over_200k": {
+ "input": 5,
+ "output": 22.5,
+ "cache_read": 0.5
+ }
+ },
+ "limit": {
+ "context": 1050000,
+ "input": 922000,
+ "output": 128000
+ },
+ "knowledge": "2025-08-31"
+ }
+ },
+ {
+ "id": "openai/gpt-5.4-mini",
+ "name": "GPT-5.4 Mini",
+ "provider": "openrouter",
+ "family": "gpt-mini",
+ "created_at": "2026-03-17 00:00:00 +0530",
+ "context_window": 400000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2025-08-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.00000075,
+ "output_per_million": 0.0000045,
+ "cached_input_per_million": 0.000000075
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-03-17",
+ "cost": {
+ "input": 0.00000075,
+ "output": 0.0000045,
+ "cache_read": 0.000000075
+ },
+ "limit": {
+ "context": 400000,
+ "output": 128000
+ },
+ "knowledge": "2025-08-31"
+ }
+ },
+ {
+ "id": "openai/gpt-5.4-nano",
+ "name": "GPT-5.4 Nano",
+ "provider": "openrouter",
+ "family": "gpt-nano",
+ "created_at": "2026-03-17 00:00:00 +0530",
+ "context_window": 400000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2025-08-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.0000002,
+ "output_per_million": 0.00000125,
+ "cached_input_per_million": 0.00000002
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-03-17",
+ "cost": {
+ "input": 0.0000002,
+ "output": 0.00000125,
+ "cache_read": 0.00000002
+ },
+ "limit": {
+ "context": 400000,
+ "output": 128000
+ },
+ "knowledge": "2025-08-31"
+ }
+ },
+ {
+ "id": "openai/gpt-5.4-pro",
+ "name": "GPT-5.4 Pro",
+ "provider": "openrouter",
+ "family": "gpt-pro",
+ "created_at": "2026-03-05 00:00:00 +0530",
+ "context_window": 1050000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": "2025-08-31",
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 30,
+ "output_per_million": 180,
+ "cached_input_per_million": 30
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": false,
+ "last_updated": "2026-03-05",
+ "cost": {
+ "input": 30,
+ "output": 180,
+ "cache_read": 30
+ },
+ "limit": {
+ "context": 1050000,
+ "input": 922000,
+ "output": 128000
+ },
+ "knowledge": "2025-08-31"
+ }
+ },
+ {
+ "id": "openai/gpt-oss-120b",
+ "name": "GPT OSS 120B",
+ "provider": "openrouter",
+ "family": "gpt-oss",
+ "created_at": "2025-08-05 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 32768,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.072,
+ "output_per_million": 0.28
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-08-05",
+ "cost": {
+ "input": 0.072,
+ "output": 0.28
+ },
+ "limit": {
+ "context": 131072,
+ "output": 32768
+ }
+ }
+ },
+ {
+ "id": "openai/gpt-oss-120b:exacto",
+ "name": "GPT OSS 120B (exacto)",
+ "provider": "openrouter",
+ "family": "gpt-oss",
+ "created_at": "2025-08-05 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 32768,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.05,
+ "output_per_million": 0.24
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-08-05",
+ "cost": {
+ "input": 0.05,
+ "output": 0.24
+ },
+ "limit": {
+ "context": 131072,
+ "output": 32768
+ }
+ }
+ },
+ {
+ "id": "openai/gpt-oss-120b:free",
+ "name": "gpt-oss-120b (free)",
+ "provider": "openrouter",
+ "family": "gpt-oss",
+ "created_at": "2025-08-05 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 32768,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-08-05",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 131072,
+ "output": 32768
+ }
+ }
+ },
+ {
+ "id": "openai/gpt-oss-20b",
+ "name": "GPT OSS 20B",
+ "provider": "openrouter",
+ "family": "gpt-oss",
+ "created_at": "2025-08-05 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 32768,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.05,
+ "output_per_million": 0.2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-08-05",
+ "cost": {
+ "input": 0.05,
+ "output": 0.2
+ },
+ "limit": {
+ "context": 131072,
+ "output": 32768
+ }
+ }
+ },
+ {
+ "id": "openai/gpt-oss-20b:free",
+ "name": "gpt-oss-20b (free)",
+ "provider": "openrouter",
+ "family": "gpt-oss",
+ "created_at": "2025-08-05 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 32768,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-01-31",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 131072,
+ "output": 32768
+ }
+ }
+ },
+ {
+ "id": "openai/gpt-oss-safeguard-20b",
+ "name": "GPT OSS Safeguard 20B",
+ "provider": "openrouter",
+ "family": "gpt-oss",
+ "created_at": "2025-10-29 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.075,
+ "output_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-10-29",
+ "cost": {
+ "input": 0.075,
+ "output": 0.3
+ },
+ "limit": {
+ "context": 131072,
+ "output": 65536
+ }
+ }
+ },
+ {
+ "id": "openai/o4-mini",
+ "name": "o4 Mini",
+ "provider": "openrouter",
+ "family": "o-mini",
+ "created_at": "2025-04-16 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 100000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.1,
+ "output_per_million": 4.4,
+ "cached_input_per_million": 0.28
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-04-16",
+ "cost": {
+ "input": 1.1,
+ "output": 4.4,
+ "cache_read": 0.28
+ },
+ "limit": {
+ "context": 200000,
+ "output": 100000
+ },
+ "knowledge": "2024-06"
+ }
+ },
+ {
+ "id": "openrouter/elephant-alpha",
+ "name": "Elephant (free)",
+ "provider": "openrouter",
+ "family": "elephant",
+ "created_at": "2026-04-13 00:00:00 +0530",
+ "context_window": 262144,
+ "max_output_tokens": 32768,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-04-13",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 262144,
+ "output": 32768
+ }
+ }
+ },
+ {
+ "id": "openrouter/free",
+ "name": "Free Models Router",
+ "provider": "openrouter",
+ "family": null,
+ "created_at": "2026-02-01 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 8000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-02-01",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 200000,
+ "input": 200000,
+ "output": 8000
+ }
+ }
+ },
+ {
+ "id": "prime-intellect/intellect-3",
+ "name": "Intellect 3",
+ "provider": "openrouter",
+ "family": "glm",
+ "created_at": "2025-01-15 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.2,
+ "output_per_million": 1.1
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-01-15",
+ "cost": {
+ "input": 0.2,
+ "output": 1.1
+ },
+ "limit": {
+ "context": 131072,
+ "output": 8192
+ },
+ "knowledge": "2024-10"
+ }
+ },
+ {
+ "id": "qwen/qwen-2.5-coder-32b-instruct",
+ "name": "Qwen2.5 Coder 32B Instruct",
+ "provider": "openrouter",
+ "family": "qwen",
+ "created_at": "2024-11-11 00:00:00 +0530",
+ "context_window": 32768,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "structured_output"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2024-11-11",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 32768,
+ "output": 8192
+ },
+ "knowledge": "2024-10"
+ }
+ },
+ {
+ "id": "qwen/qwen2.5-vl-72b-instruct",
+ "name": "Qwen2.5 VL 72B Instruct",
+ "provider": "openrouter",
+ "family": "qwen",
+ "created_at": "2025-02-01 00:00:00 +0530",
+ "context_window": 32768,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "structured_output",
+ "vision"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-02-01",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 32768,
+ "output": 8192
+ },
+ "knowledge": "2024-10"
+ }
+ },
+ {
+ "id": "qwen/qwen3-235b-a22b-07-25",
+ "name": "Qwen3 235B A22B Instruct 2507",
+ "provider": "openrouter",
+ "family": "qwen",
+ "created_at": "2025-04-28 00:00:00 +0530",
+ "context_window": 262144,
+ "max_output_tokens": 131072,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.15,
+ "output_per_million": 0.85
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-07-21",
+ "cost": {
+ "input": 0.15,
+ "output": 0.85
+ },
+ "limit": {
+ "context": 262144,
+ "output": 131072
+ },
+ "knowledge": "2025-04"
+ }
+ },
+ {
+ "id": "qwen/qwen3-235b-a22b-thinking-2507",
+ "name": "Qwen3 235B A22B Thinking 2507",
+ "provider": "openrouter",
+ "family": "qwen",
+ "created_at": "2025-07-25 00:00:00 +0530",
+ "context_window": 262144,
+ "max_output_tokens": 81920,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.078,
+ "output_per_million": 0.312
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-07-25",
+ "cost": {
+ "input": 0.078,
+ "output": 0.312
+ },
+ "limit": {
+ "context": 262144,
+ "output": 81920
+ },
+ "knowledge": "2025-04"
+ }
+ },
+ {
+ "id": "qwen/qwen3-30b-a3b-instruct-2507",
+ "name": "Qwen3 30B A3B Instruct 2507",
+ "provider": "openrouter",
+ "family": "qwen",
+ "created_at": "2025-07-29 00:00:00 +0530",
+ "context_window": 262000,
+ "max_output_tokens": 262000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.2,
+ "output_per_million": 0.8
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-07-29",
+ "cost": {
+ "input": 0.2,
+ "output": 0.8
+ },
+ "limit": {
+ "context": 262000,
+ "output": 262000
+ },
+ "knowledge": "2025-04"
+ }
+ },
+ {
+ "id": "qwen/qwen3-30b-a3b-thinking-2507",
+ "name": "Qwen3 30B A3B Thinking 2507",
+ "provider": "openrouter",
+ "family": "qwen",
+ "created_at": "2025-07-29 00:00:00 +0530",
+ "context_window": 262000,
+ "max_output_tokens": 262000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.2,
+ "output_per_million": 0.8
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-07-29",
+ "cost": {
+ "input": 0.2,
+ "output": 0.8
+ },
+ "limit": {
+ "context": 262000,
+ "output": 262000
+ },
+ "knowledge": "2025-04"
+ }
+ },
+ {
+ "id": "qwen/qwen3-coder",
+ "name": "Qwen3 Coder",
+ "provider": "openrouter",
+ "family": "qwen",
+ "created_at": "2025-07-23 00:00:00 +0530",
+ "context_window": 262144,
+ "max_output_tokens": 66536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.3,
+ "output_per_million": 1.2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-07-23",
+ "cost": {
+ "input": 0.3,
+ "output": 1.2
+ },
+ "limit": {
+ "context": 262144,
+ "output": 66536
+ },
+ "knowledge": "2025-04"
+ }
+ },
+ {
+ "id": "qwen/qwen3-coder-30b-a3b-instruct",
+ "name": "Qwen3 Coder 30B A3B Instruct",
+ "provider": "openrouter",
+ "family": "qwen",
+ "created_at": "2025-07-31 00:00:00 +0530",
+ "context_window": 160000,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.07,
+ "output_per_million": 0.27
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-07-31",
+ "cost": {
+ "input": 0.07,
+ "output": 0.27
+ },
+ "limit": {
+ "context": 160000,
+ "output": 65536
+ },
+ "knowledge": "2025-04"
+ }
+ },
+ {
+ "id": "qwen/qwen3-coder-flash",
+ "name": "Qwen3 Coder Flash",
+ "provider": "openrouter",
+ "family": "qwen",
+ "created_at": "2025-07-23 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 66536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.3,
+ "output_per_million": 1.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-07-23",
+ "cost": {
+ "input": 0.3,
+ "output": 1.5
+ },
+ "limit": {
+ "context": 128000,
+ "output": 66536
+ },
+ "knowledge": "2025-04"
+ }
+ },
+ {
+ "id": "qwen/qwen3-coder:exacto",
+ "name": "Qwen3 Coder (exacto)",
+ "provider": "openrouter",
+ "family": "qwen",
+ "created_at": "2025-07-23 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 32768,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.38,
+ "output_per_million": 1.53
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-07-23",
+ "cost": {
+ "input": 0.38,
+ "output": 1.53
+ },
+ "limit": {
+ "context": 131072,
+ "output": 32768
+ },
+ "knowledge": "2025-04"
+ }
+ },
+ {
+ "id": "qwen/qwen3-max",
+ "name": "Qwen3 Max",
+ "provider": "openrouter",
+ "family": "qwen",
+ "created_at": "2025-09-05 00:00:00 +0530",
+ "context_window": 262144,
+ "max_output_tokens": 32768,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.2,
+ "output_per_million": 6
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-09-05",
+ "cost": {
+ "input": 1.2,
+ "output": 6
+ },
+ "limit": {
+ "context": 262144,
+ "output": 32768
+ }
+ }
+ },
+ {
+ "id": "qwen/qwen3-next-80b-a3b-instruct",
+ "name": "Qwen3 Next 80B A3B Instruct",
+ "provider": "openrouter",
+ "family": "qwen",
+ "created_at": "2025-09-11 00:00:00 +0530",
+ "context_window": 262144,
+ "max_output_tokens": 262144,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.14,
+ "output_per_million": 1.4
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-09-11",
+ "cost": {
+ "input": 0.14,
+ "output": 1.4
+ },
+ "limit": {
+ "context": 262144,
+ "output": 262144
+ },
+ "knowledge": "2025-04"
+ }
+ },
+ {
+ "id": "qwen/qwen3-next-80b-a3b-thinking",
+ "name": "Qwen3 Next 80B A3B Thinking",
+ "provider": "openrouter",
+ "family": "qwen",
+ "created_at": "2025-09-11 00:00:00 +0530",
+ "context_window": 262144,
+ "max_output_tokens": 262144,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.14,
+ "output_per_million": 1.4
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-09-11",
+ "cost": {
+ "input": 0.14,
+ "output": 1.4
+ },
+ "limit": {
+ "context": 262144,
+ "output": 262144
+ },
+ "knowledge": "2025-04"
+ }
+ },
+ {
+ "id": "qwen/qwen3.5-397b-a17b",
+ "name": "Qwen3.5 397B A17B",
+ "provider": "openrouter",
+ "family": "qwen",
+ "created_at": "2026-02-16 00:00:00 +0530",
+ "context_window": 262144,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "video"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.6,
+ "output_per_million": 3.6
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-02-16",
+ "cost": {
+ "input": 0.6,
+ "output": 3.6
+ },
+ "limit": {
+ "context": 262144,
+ "output": 65536
+ },
+ "knowledge": "2025-04"
+ }
+ },
+ {
+ "id": "qwen/qwen3.5-flash-02-23",
+ "name": "Qwen: Qwen3.5-Flash",
+ "provider": "openrouter",
+ "family": "qwen",
+ "created_at": "2026-02-25 00:00:00 +0530",
+ "context_window": 1000000,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "video"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.065,
+ "output_per_million": 0.26
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-02-25",
+ "cost": {
+ "input": 0.065,
+ "output": 0.26
+ },
+ "limit": {
+ "context": 1000000,
+ "output": 65536
+ }
+ }
+ },
+ {
+ "id": "qwen/qwen3.5-plus-02-15",
+ "name": "Qwen3.5 Plus 2026-02-15",
+ "provider": "openrouter",
+ "family": "qwen",
+ "created_at": "2026-02-16 00:00:00 +0530",
+ "context_window": 1000000,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "video"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.4,
+ "output_per_million": 2.4
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-02-16",
+ "cost": {
+ "input": 0.4,
+ "output": 2.4
+ },
+ "limit": {
+ "context": 1000000,
+ "output": 65536
+ },
+ "knowledge": "2025-04"
+ }
+ },
+ {
+ "id": "qwen/qwen3.6-plus",
+ "name": "Qwen3.6 Plus",
+ "provider": "openrouter",
+ "family": "qwen",
+ "created_at": "2026-04-02 00:00:00 +0530",
+ "context_window": 1000000,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "video"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.325,
+ "output_per_million": 1.95
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-04-02",
+ "cost": {
+ "input": 0.325,
+ "output": 1.95
+ },
+ "limit": {
+ "context": 1000000,
+ "output": 65536
+ },
+ "knowledge": "2025-04"
+ }
+ },
+ {
+ "id": "sourceful/riverflow-v2-fast-preview",
+ "name": "Riverflow V2 Fast Preview",
+ "provider": "openrouter",
+ "family": "sourceful",
+ "created_at": "2025-12-08 00:00:00 +0530",
+ "context_window": 8192,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "image"
+ ]
+ },
+ "capabilities": [
+ "vision"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-01-28",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 8192,
+ "output": 8192
+ },
+ "knowledge": "2025-06"
+ }
+ },
+ {
+ "id": "sourceful/riverflow-v2-max-preview",
+ "name": "Riverflow V2 Max Preview",
+ "provider": "openrouter",
+ "family": "sourceful",
+ "created_at": "2025-12-08 00:00:00 +0530",
+ "context_window": 8192,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "image"
+ ]
+ },
+ "capabilities": [
+ "vision"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-01-28",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 8192,
+ "output": 8192
+ },
+ "knowledge": "2025-06"
+ }
+ },
+ {
+ "id": "sourceful/riverflow-v2-standard-preview",
+ "name": "Riverflow V2 Standard Preview",
+ "provider": "openrouter",
+ "family": "sourceful",
+ "created_at": "2025-12-08 00:00:00 +0530",
+ "context_window": 8192,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "image"
+ ]
+ },
+ "capabilities": [
+ "vision"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-01-28",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 8192,
+ "output": 8192
+ },
+ "knowledge": "2025-06"
+ }
+ },
+ {
+ "id": "stepfun/step-3.5-flash",
+ "name": "Step 3.5 Flash",
+ "provider": "openrouter",
+ "family": "step",
+ "created_at": "2026-01-29 00:00:00 +0530",
+ "context_window": 256000,
+ "max_output_tokens": 256000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.1,
+ "output_per_million": 0.3,
+ "cached_input_per_million": 0.02
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-01-29",
+ "cost": {
+ "input": 0.1,
+ "output": 0.3,
+ "cache_read": 0.02
+ },
+ "limit": {
+ "context": 256000,
+ "output": 256000
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "x-ai/grok-3",
+ "name": "Grok 3",
+ "provider": "openrouter",
+ "family": "grok",
+ "created_at": "2025-02-17 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 3,
+ "output_per_million": 15,
+ "cached_input_per_million": 0.75
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-02-17",
+ "cost": {
+ "input": 3,
+ "output": 15,
+ "cache_read": 0.75,
+ "cache_write": 15
+ },
+ "limit": {
+ "context": 131072,
+ "output": 8192
+ },
+ "knowledge": "2024-11"
+ }
+ },
+ {
+ "id": "x-ai/grok-3-beta",
+ "name": "Grok 3 Beta",
+ "provider": "openrouter",
+ "family": "grok",
+ "created_at": "2025-02-17 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 3,
+ "output_per_million": 15,
+ "cached_input_per_million": 0.75
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-02-17",
+ "cost": {
+ "input": 3,
+ "output": 15,
+ "cache_read": 0.75,
+ "cache_write": 15
+ },
+ "limit": {
+ "context": 131072,
+ "output": 8192
+ },
+ "knowledge": "2024-11"
+ }
+ },
+ {
+ "id": "x-ai/grok-3-mini",
+ "name": "Grok 3 Mini",
+ "provider": "openrouter",
+ "family": "grok",
+ "created_at": "2025-02-17 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.3,
+ "output_per_million": 0.5,
+ "cached_input_per_million": 0.075
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-02-17",
+ "cost": {
+ "input": 0.3,
+ "output": 0.5,
+ "cache_read": 0.075,
+ "cache_write": 0.5
+ },
+ "limit": {
+ "context": 131072,
+ "output": 8192
+ },
+ "knowledge": "2024-11"
+ }
+ },
+ {
+ "id": "x-ai/grok-3-mini-beta",
+ "name": "Grok 3 Mini Beta",
+ "provider": "openrouter",
+ "family": "grok",
+ "created_at": "2025-02-17 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.3,
+ "output_per_million": 0.5,
+ "cached_input_per_million": 0.075
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-02-17",
+ "cost": {
+ "input": 0.3,
+ "output": 0.5,
+ "cache_read": 0.075,
+ "cache_write": 0.5
+ },
+ "limit": {
+ "context": 131072,
+ "output": 8192
+ },
+ "knowledge": "2024-11"
+ }
+ },
+ {
+ "id": "x-ai/grok-4",
+ "name": "Grok 4",
+ "provider": "openrouter",
+ "family": "grok",
+ "created_at": "2025-07-09 00:00:00 +0530",
+ "context_window": 256000,
+ "max_output_tokens": 64000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 3,
+ "output_per_million": 15,
+ "cached_input_per_million": 0.75
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-07-09",
+ "cost": {
+ "input": 3,
+ "output": 15,
+ "cache_read": 0.75,
+ "cache_write": 15
+ },
+ "limit": {
+ "context": 256000,
+ "output": 64000
+ },
+ "knowledge": "2025-07"
+ }
+ },
+ {
+ "id": "x-ai/grok-4-fast",
+ "name": "Grok 4 Fast",
+ "provider": "openrouter",
+ "family": "grok",
+ "created_at": "2025-08-19 00:00:00 +0530",
+ "context_window": 2000000,
+ "max_output_tokens": 30000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.2,
+ "output_per_million": 0.5,
+ "cached_input_per_million": 0.05
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-08-19",
+ "cost": {
+ "input": 0.2,
+ "output": 0.5,
+ "cache_read": 0.05,
+ "cache_write": 0.05
+ },
+ "limit": {
+ "context": 2000000,
+ "output": 30000
+ },
+ "knowledge": "2024-11"
+ }
+ },
+ {
+ "id": "x-ai/grok-4.1-fast",
+ "name": "Grok 4.1 Fast",
+ "provider": "openrouter",
+ "family": "grok",
+ "created_at": "2025-11-19 00:00:00 +0530",
+ "context_window": 2000000,
+ "max_output_tokens": 30000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.2,
+ "output_per_million": 0.5,
+ "cached_input_per_million": 0.05
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-11-19",
+ "cost": {
+ "input": 0.2,
+ "output": 0.5,
+ "cache_read": 0.05,
+ "cache_write": 0.05
+ },
+ "limit": {
+ "context": 2000000,
+ "output": 30000
+ },
+ "knowledge": "2024-11"
+ }
+ },
+ {
+ "id": "x-ai/grok-4.20-beta",
+ "name": "Grok 4.20 Beta",
+ "provider": "openrouter",
+ "family": "grok",
+ "created_at": "2026-03-12 00:00:00 +0530",
+ "context_window": 2000000,
+ "max_output_tokens": 30000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2,
+ "output_per_million": 6,
+ "cached_input_per_million": 0.2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-03-12",
+ "status": "beta",
+ "cost": {
+ "input": 2,
+ "output": 6,
+ "cache_read": 0.2,
+ "context_over_200k": {
+ "input": 4,
+ "output": 12
+ }
+ },
+ "limit": {
+ "context": 2000000,
+ "output": 30000
+ }
+ }
+ },
+ {
+ "id": "x-ai/grok-4.20-multi-agent-beta",
+ "name": "Grok 4.20 Multi - Agent Beta",
+ "provider": "openrouter",
+ "family": "grok",
+ "created_at": "2026-03-12 00:00:00 +0530",
+ "context_window": 2000000,
+ "max_output_tokens": 30000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2,
+ "output_per_million": 6,
+ "cached_input_per_million": 0.2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-03-12",
+ "status": "beta",
+ "cost": {
+ "input": 2,
+ "output": 6,
+ "cache_read": 0.2,
+ "context_over_200k": {
+ "input": 4,
+ "output": 12
+ }
+ },
+ "limit": {
+ "context": 2000000,
+ "output": 30000
+ }
+ }
+ },
+ {
+ "id": "x-ai/grok-code-fast-1",
+ "name": "Grok Code Fast 1",
+ "provider": "openrouter",
+ "family": "grok",
+ "created_at": "2025-08-26 00:00:00 +0530",
+ "context_window": 256000,
+ "max_output_tokens": 10000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.2,
+ "output_per_million": 1.5,
+ "cached_input_per_million": 0.02
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-08-26",
+ "cost": {
+ "input": 0.2,
+ "output": 1.5,
+ "cache_read": 0.02
+ },
+ "limit": {
+ "context": 256000,
+ "output": 10000
+ },
+ "knowledge": "2025-08"
+ }
+ },
+ {
+ "id": "xiaomi/mimo-v2-flash",
+ "name": "MiMo-V2-Flash",
+ "provider": "openrouter",
+ "family": "mimo",
+ "created_at": "2025-12-14 00:00:00 +0530",
+ "context_window": 262144,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.1,
+ "output_per_million": 0.3,
+ "cached_input_per_million": 0.01
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-12-14",
+ "cost": {
+ "input": 0.1,
+ "output": 0.3,
+ "cache_read": 0.01
+ },
+ "limit": {
+ "context": 262144,
+ "output": 65536
+ },
+ "knowledge": "2024-12"
+ }
+ },
+ {
+ "id": "xiaomi/mimo-v2-omni",
+ "name": "MiMo-V2-Omni",
+ "provider": "openrouter",
+ "family": "mimo",
+ "created_at": "2026-03-18 00:00:00 +0530",
+ "context_window": 262144,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "video",
+ "audio"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.4,
+ "output_per_million": 2,
+ "cached_input_per_million": 0.08
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-03-18",
+ "interleaved": {
+ "field": "reasoning_details"
+ },
+ "cost": {
+ "input": 0.4,
+ "output": 2,
+ "cache_read": 0.08
+ },
+ "limit": {
+ "context": 262144,
+ "output": 65536
+ }
+ }
+ },
+ {
+ "id": "xiaomi/mimo-v2-pro",
+ "name": "MiMo-V2-Pro",
+ "provider": "openrouter",
+ "family": "mimo",
+ "created_at": "2026-03-18 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1,
+ "output_per_million": 3,
+ "cached_input_per_million": 0.2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-03-18",
+ "interleaved": {
+ "field": "reasoning_details"
+ },
+ "cost": {
+ "input": 1,
+ "output": 3,
+ "cache_read": 0.2
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ }
+ }
+ },
+ {
+ "id": "z-ai/glm-4.5",
+ "name": "GLM 4.5",
+ "provider": "openrouter",
+ "family": "glm",
+ "created_at": "2025-07-28 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 96000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.6,
+ "output_per_million": 2.2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-07-28",
+ "cost": {
+ "input": 0.6,
+ "output": 2.2
+ },
+ "limit": {
+ "context": 128000,
+ "output": 96000
+ },
+ "knowledge": "2025-04"
+ }
+ },
+ {
+ "id": "z-ai/glm-4.5-air",
+ "name": "GLM 4.5 Air",
+ "provider": "openrouter",
+ "family": "glm-air",
+ "created_at": "2025-07-28 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 96000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.2,
+ "output_per_million": 1.1
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-07-28",
+ "cost": {
+ "input": 0.2,
+ "output": 1.1
+ },
+ "limit": {
+ "context": 128000,
+ "output": 96000
+ },
+ "knowledge": "2025-04"
+ }
+ },
+ {
+ "id": "z-ai/glm-4.5-air:free",
+ "name": "GLM 4.5 Air (free)",
+ "provider": "openrouter",
+ "family": "glm-air",
+ "created_at": "2025-07-28 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 96000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "reasoning"
+ ],
+ "pricing": {},
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-07-28",
+ "cost": {
+ "input": 0,
+ "output": 0
+ },
+ "limit": {
+ "context": 128000,
+ "output": 96000
+ },
+ "knowledge": "2025-04"
+ }
+ },
+ {
+ "id": "z-ai/glm-4.5v",
+ "name": "GLM 4.5V",
+ "provider": "openrouter",
+ "family": "glm",
+ "created_at": "2025-08-11 00:00:00 +0530",
+ "context_window": 64000,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "video"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.6,
+ "output_per_million": 1.8
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-08-11",
+ "cost": {
+ "input": 0.6,
+ "output": 1.8
+ },
+ "limit": {
+ "context": 64000,
+ "output": 16384
+ },
+ "knowledge": "2025-04"
+ }
+ },
+ {
+ "id": "z-ai/glm-4.6",
+ "name": "GLM 4.6",
+ "provider": "openrouter",
+ "family": "glm",
+ "created_at": "2025-09-30 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.6,
+ "output_per_million": 2.2,
+ "cached_input_per_million": 0.11
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-09-30",
+ "cost": {
+ "input": 0.6,
+ "output": 2.2,
+ "cache_read": 0.11
+ },
+ "limit": {
+ "context": 200000,
+ "output": 128000
+ },
+ "knowledge": "2025-09"
+ }
+ },
+ {
+ "id": "z-ai/glm-4.6:exacto",
+ "name": "GLM 4.6 (exacto)",
+ "provider": "openrouter",
+ "family": "glm",
+ "created_at": "2025-09-30 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.6,
+ "output_per_million": 1.9,
+ "cached_input_per_million": 0.11
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-09-30",
+ "cost": {
+ "input": 0.6,
+ "output": 1.9,
+ "cache_read": 0.11
+ },
+ "limit": {
+ "context": 200000,
+ "output": 128000
+ },
+ "knowledge": "2025-09"
+ }
+ },
+ {
+ "id": "z-ai/glm-4.7",
+ "name": "GLM-4.7",
+ "provider": "openrouter",
+ "family": "glm",
+ "created_at": "2025-12-22 00:00:00 +0530",
+ "context_window": 204800,
+ "max_output_tokens": 131072,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.6,
+ "output_per_million": 2.2,
+ "cached_input_per_million": 0.11
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-12-22",
+ "interleaved": {
+ "field": "reasoning_details"
+ },
+ "cost": {
+ "input": 0.6,
+ "output": 2.2,
+ "cache_read": 0.11
+ },
+ "limit": {
+ "context": 204800,
+ "output": 131072
+ },
+ "knowledge": "2025-04"
+ }
+ },
+ {
+ "id": "z-ai/glm-4.7-flash",
+ "name": "GLM-4.7-Flash",
+ "provider": "openrouter",
+ "family": "glm",
+ "created_at": "2026-01-19 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 65535,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.07,
+ "output_per_million": 0.4
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-01-19",
+ "interleaved": {
+ "field": "reasoning_details"
+ },
+ "cost": {
+ "input": 0.07,
+ "output": 0.4
+ },
+ "limit": {
+ "context": 200000,
+ "output": 65535
+ }
+ }
+ },
+ {
+ "id": "z-ai/glm-5",
+ "name": "GLM-5",
+ "provider": "openrouter",
+ "family": "glm",
+ "created_at": "2026-02-12 00:00:00 +0530",
+ "context_window": 202752,
+ "max_output_tokens": 131000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1,
+ "output_per_million": 3.2,
+ "cached_input_per_million": 0.2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-02-12",
+ "interleaved": {
+ "field": "reasoning_content"
+ },
+ "cost": {
+ "input": 1,
+ "output": 3.2,
+ "cache_read": 0.2
+ },
+ "limit": {
+ "context": 202752,
+ "output": 131000
+ }
+ }
+ },
+ {
+ "id": "z-ai/glm-5-turbo",
+ "name": "GLM-5-Turbo",
+ "provider": "openrouter",
+ "family": "glm",
+ "created_at": "2026-03-16 00:00:00 +0530",
+ "context_window": 202752,
+ "max_output_tokens": 131072,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.96,
+ "output_per_million": 3.2,
+ "cached_input_per_million": 0.192
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-03-16",
+ "interleaved": {
+ "field": "reasoning_content"
+ },
+ "cost": {
+ "input": 0.96,
+ "output": 3.2,
+ "cache_read": 0.192,
+ "cache_write": 0
+ },
+ "limit": {
+ "context": 202752,
+ "output": 131072
+ }
+ }
+ },
+ {
+ "id": "z-ai/glm-5.1",
+ "name": "GLM-5.1",
+ "provider": "openrouter",
+ "family": "glm",
+ "created_at": "2026-04-07 00:00:00 +0530",
+ "context_window": 202752,
+ "max_output_tokens": 131072,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.4,
+ "output_per_million": 4.4,
+ "cached_input_per_million": 0.26
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "openrouter",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-04-07",
+ "interleaved": {
+ "field": "reasoning_content"
+ },
+ "cost": {
+ "input": 1.4,
+ "output": 4.4,
+ "cache_read": 0.26
+ },
+ "limit": {
+ "context": 202752,
+ "output": 131072
+ }
+ }
+ },
+ {
+ "id": "sonar",
+ "name": "Sonar",
+ "provider": "perplexity",
+ "family": "sonar",
+ "created_at": "2024-01-01 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": "2025-09-01",
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1,
+ "output_per_million": 1
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "perplexity",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-09-01",
+ "cost": {
+ "input": 1,
+ "output": 1
+ },
+ "limit": {
+ "context": 128000,
+ "output": 4096
+ },
+ "knowledge": "2025-09-01"
+ }
+ },
+ {
+ "id": "sonar-deep-research",
+ "name": "Perplexity Sonar Deep Research",
+ "provider": "perplexity",
+ "family": null,
+ "created_at": "2025-02-01 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 32768,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2,
+ "output_per_million": 8,
+ "reasoning_output_per_million": 3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "perplexity",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": false,
+ "last_updated": "2025-09-01",
+ "cost": {
+ "input": 2,
+ "output": 8,
+ "reasoning": 3
+ },
+ "limit": {
+ "context": 128000,
+ "output": 32768
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "sonar-pro",
+ "name": "Sonar Pro",
+ "provider": "perplexity",
+ "family": "sonar-pro",
+ "created_at": "2024-01-01 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": "2025-09-01",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 3,
+ "output_per_million": 15
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "perplexity",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-09-01",
+ "cost": {
+ "input": 3,
+ "output": 15
+ },
+ "limit": {
+ "context": 200000,
+ "output": 8192
+ },
+ "knowledge": "2025-09-01"
+ }
+ },
+ {
+ "id": "sonar-reasoning-pro",
+ "name": "Sonar Reasoning Pro",
+ "provider": "perplexity",
+ "family": "sonar-reasoning",
+ "created_at": "2024-01-01 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 4096,
+ "knowledge_cutoff": "2025-09-01",
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2,
+ "output_per_million": 8
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "perplexity",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-09-01",
+ "cost": {
+ "input": 2,
+ "output": 8
+ },
+ "limit": {
+ "context": 128000,
+ "output": 4096
+ },
+ "knowledge": "2025-09-01"
+ }
+ },
+ {
+ "id": "deepseek-ai/deepseek-v3.1-maas",
+ "name": "DeepSeek V3.1",
+ "provider": "vertexai",
+ "family": "deepseek",
+ "created_at": "2025-08-28 00:00:00 +0530",
+ "context_window": 163840,
+ "max_output_tokens": 32768,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.6,
+ "output_per_million": 1.7
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google-vertex",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-08-28",
+ "cost": {
+ "input": 0.6,
+ "output": 1.7
+ },
+ "limit": {
+ "context": 163840,
+ "output": 32768
+ }
+ }
+ },
+ {
+ "id": "deepseek-ai/deepseek-v3.2-maas",
+ "name": "DeepSeek V3.2",
+ "provider": "vertexai",
+ "family": "deepseek",
+ "created_at": "2025-12-17 00:00:00 +0530",
+ "context_window": 163840,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.56,
+ "output_per_million": 1.68,
+ "cached_input_per_million": 0.056
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google-vertex",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-04-04",
+ "cost": {
+ "input": 0.56,
+ "output": 1.68,
+ "cache_read": 0.056
+ },
+ "limit": {
+ "context": 163840,
+ "output": 65536
+ }
+ }
+ },
+ {
+ "id": "gemini-2.0-flash",
+ "name": "Gemini 2.0 Flash",
+ "provider": "vertexai",
+ "family": "gemini-flash",
+ "created_at": "2024-12-11 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.15,
+ "output_per_million": 0.6,
+ "cached_input_per_million": 0.025
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google-vertex",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-12-11",
+ "cost": {
+ "input": 0.15,
+ "output": 0.6,
+ "cache_read": 0.025
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 8192
+ },
+ "knowledge": "2024-06"
+ }
+ },
+ {
+ "id": "gemini-2.0-flash-lite",
+ "name": "Gemini 2.0 Flash Lite",
+ "provider": "vertexai",
+ "family": "gemini-flash-lite",
+ "created_at": "2024-12-11 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.075,
+ "output_per_million": 0.3
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google-vertex",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2024-12-11",
+ "cost": {
+ "input": 0.075,
+ "output": 0.3
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 8192
+ },
+ "knowledge": "2024-06"
+ }
+ },
+ {
+ "id": "gemini-2.5-flash",
+ "name": "Gemini 2.5 Flash",
+ "provider": "vertexai",
+ "family": "gemini-flash",
+ "created_at": "2025-06-17 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.3,
+ "output_per_million": 2.5,
+ "cached_input_per_million": 0.075
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google-vertex",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-06-17",
+ "cost": {
+ "input": 0.3,
+ "output": 2.5,
+ "cache_read": 0.075,
+ "cache_write": 0.383
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-2.5-flash-lite",
+ "name": "Gemini 2.5 Flash Lite",
+ "provider": "vertexai",
+ "family": "gemini-flash-lite",
+ "created_at": "2025-06-17 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.1,
+ "output_per_million": 0.4,
+ "cached_input_per_million": 0.025
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google-vertex",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-06-17",
+ "cost": {
+ "input": 0.1,
+ "output": 0.4,
+ "cache_read": 0.025
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-2.5-flash-lite-preview-06-17",
+ "name": "Gemini 2.5 Flash Lite Preview 06-17",
+ "provider": "vertexai",
+ "family": "gemini-flash-lite",
+ "created_at": "2025-06-17 00:00:00 +0530",
+ "context_window": 65536,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.1,
+ "output_per_million": 0.4,
+ "cached_input_per_million": 0.025
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google-vertex",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-06-17",
+ "cost": {
+ "input": 0.1,
+ "output": 0.4,
+ "cache_read": 0.025
+ },
+ "limit": {
+ "context": 65536,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-2.5-flash-lite-preview-09-2025",
+ "name": "Gemini 2.5 Flash Lite Preview 09-25",
+ "provider": "vertexai",
+ "family": "gemini-flash-lite",
+ "created_at": "2025-09-25 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.1,
+ "output_per_million": 0.4,
+ "cached_input_per_million": 0.025
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google-vertex",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-09-25",
+ "cost": {
+ "input": 0.1,
+ "output": 0.4,
+ "cache_read": 0.025
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-2.5-flash-preview-04-17",
+ "name": "Gemini 2.5 Flash Preview 04-17",
+ "provider": "vertexai",
+ "family": "gemini-flash",
+ "created_at": "2025-04-17 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.15,
+ "output_per_million": 0.6,
+ "cached_input_per_million": 0.0375
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google-vertex",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-04-17",
+ "cost": {
+ "input": 0.15,
+ "output": 0.6,
+ "cache_read": 0.0375
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-2.5-flash-preview-05-20",
+ "name": "Gemini 2.5 Flash Preview 05-20",
+ "provider": "vertexai",
+ "family": "gemini-flash",
+ "created_at": "2025-05-20 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.15,
+ "output_per_million": 0.6,
+ "cached_input_per_million": 0.0375
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google-vertex",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-05-20",
+ "cost": {
+ "input": 0.15,
+ "output": 0.6,
+ "cache_read": 0.0375
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-2.5-flash-preview-09-2025",
+ "name": "Gemini 2.5 Flash Preview 09-25",
+ "provider": "vertexai",
+ "family": "gemini-flash",
+ "created_at": "2025-09-25 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.3,
+ "output_per_million": 2.5,
+ "cached_input_per_million": 0.075
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google-vertex",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-09-25",
+ "cost": {
+ "input": 0.3,
+ "output": 2.5,
+ "cache_read": 0.075,
+ "cache_write": 0.383
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-2.5-pro",
+ "name": "Gemini 2.5 Pro",
+ "provider": "vertexai",
+ "family": "gemini-pro",
+ "created_at": "2025-03-20 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10,
+ "cached_input_per_million": 0.31
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google-vertex",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-06-05",
+ "cost": {
+ "input": 1.25,
+ "output": 10,
+ "cache_read": 0.31
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-2.5-pro-preview-05-06",
+ "name": "Gemini 2.5 Pro Preview 05-06",
+ "provider": "vertexai",
+ "family": "gemini-pro",
+ "created_at": "2025-05-06 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10,
+ "cached_input_per_million": 0.31
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google-vertex",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-05-06",
+ "cost": {
+ "input": 1.25,
+ "output": 10,
+ "cache_read": 0.31
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-2.5-pro-preview-06-05",
+ "name": "Gemini 2.5 Pro Preview 06-05",
+ "provider": "vertexai",
+ "family": "gemini-pro",
+ "created_at": "2025-06-05 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1.25,
+ "output_per_million": 10,
+ "cached_input_per_million": 0.31
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google-vertex",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-06-05",
+ "cost": {
+ "input": 1.25,
+ "output": 10,
+ "cache_read": 0.31
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-3-flash-preview",
+ "name": "Gemini 3 Flash Preview",
+ "provider": "vertexai",
+ "family": "gemini-flash",
+ "created_at": "2025-12-17 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "video",
+ "audio",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.5,
+ "output_per_million": 3,
+ "cached_input_per_million": 0.05
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google-vertex",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-12-17",
+ "cost": {
+ "input": 0.5,
+ "output": 3,
+ "cache_read": 0.05,
+ "context_over_200k": {
+ "input": 0.5,
+ "output": 3,
+ "cache_read": 0.05
+ }
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-3-pro-preview",
+ "name": "Gemini 3 Pro Preview",
+ "provider": "vertexai",
+ "family": "gemini-pro",
+ "created_at": "2025-11-18 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "video",
+ "audio",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2,
+ "output_per_million": 12,
+ "cached_input_per_million": 0.2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google-vertex",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-11-18",
+ "cost": {
+ "input": 2,
+ "output": 12,
+ "cache_read": 0.2,
+ "context_over_200k": {
+ "input": 4,
+ "output": 18,
+ "cache_read": 0.4
+ }
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-3.1-pro-preview",
+ "name": "Gemini 3.1 Pro Preview",
+ "provider": "vertexai",
+ "family": "gemini-pro",
+ "created_at": "2026-02-19 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "video",
+ "audio",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2,
+ "output_per_million": 12,
+ "cached_input_per_million": 0.2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google-vertex",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-02-19",
+ "cost": {
+ "input": 2,
+ "output": 12,
+ "cache_read": 0.2,
+ "context_over_200k": {
+ "input": 4,
+ "output": 18,
+ "cache_read": 0.4
+ }
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-3.1-pro-preview-customtools",
+ "name": "Gemini 3.1 Pro Preview Custom Tools",
+ "provider": "vertexai",
+ "family": "gemini-pro",
+ "created_at": "2026-02-19 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "video",
+ "audio",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 2,
+ "output_per_million": 12,
+ "cached_input_per_million": 0.2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google-vertex",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2026-02-19",
+ "cost": {
+ "input": 2,
+ "output": 12,
+ "cache_read": 0.2,
+ "context_over_200k": {
+ "input": 4,
+ "output": 18,
+ "cache_read": 0.4
+ }
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-embedding-001",
+ "name": "Gemini Embedding 001",
+ "provider": "vertexai",
+ "family": "gemini",
+ "created_at": "2025-05-20 00:00:00 +0530",
+ "context_window": 2048,
+ "max_output_tokens": 3072,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.15
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google-vertex",
+ "open_weights": false,
+ "attachment": false,
+ "temperature": false,
+ "last_updated": "2025-05-20",
+ "cost": {
+ "input": 0.15,
+ "output": 0
+ },
+ "limit": {
+ "context": 2048,
+ "output": 3072
+ },
+ "knowledge": "2025-05"
+ }
+ },
+ {
+ "id": "gemini-flash-latest",
+ "name": "Gemini Flash Latest",
+ "provider": "vertexai",
+ "family": "gemini-flash",
+ "created_at": "2025-09-25 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.3,
+ "output_per_million": 2.5,
+ "cached_input_per_million": 0.075
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google-vertex",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-09-25",
+ "cost": {
+ "input": 0.3,
+ "output": 2.5,
+ "cache_read": 0.075,
+ "cache_write": 0.383
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "gemini-flash-lite-latest",
+ "name": "Gemini Flash-Lite Latest",
+ "provider": "vertexai",
+ "family": "gemini-flash-lite",
+ "created_at": "2025-09-25 00:00:00 +0530",
+ "context_window": 1048576,
+ "max_output_tokens": 65536,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image",
+ "audio",
+ "video",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.1,
+ "output_per_million": 0.4,
+ "cached_input_per_million": 0.025
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google-vertex",
+ "open_weights": false,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-09-25",
+ "cost": {
+ "input": 0.1,
+ "output": 0.4,
+ "cache_read": 0.025
+ },
+ "limit": {
+ "context": 1048576,
+ "output": 65536
+ },
+ "knowledge": "2025-01"
+ }
+ },
+ {
+ "id": "meta/llama-3.3-70b-instruct-maas",
+ "name": "Llama 3.3 70B Instruct",
+ "provider": "vertexai",
+ "family": "llama",
+ "created_at": "2025-04-29 00:00:00 +0530",
+ "context_window": 128000,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.72,
+ "output_per_million": 0.72
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google-vertex",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-04-29",
+ "cost": {
+ "input": 0.72,
+ "output": 0.72
+ },
+ "limit": {
+ "context": 128000,
+ "output": 8192
+ },
+ "knowledge": "2023-12"
+ }
+ },
+ {
+ "id": "meta/llama-4-maverick-17b-128e-instruct-maas",
+ "name": "Llama 4 Maverick 17B 128E Instruct",
+ "provider": "vertexai",
+ "family": "llama",
+ "created_at": "2025-04-29 00:00:00 +0530",
+ "context_window": 524288,
+ "max_output_tokens": 8192,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "image"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.35,
+ "output_per_million": 1.15
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google-vertex",
+ "open_weights": true,
+ "attachment": true,
+ "temperature": true,
+ "last_updated": "2025-04-29",
+ "cost": {
+ "input": 0.35,
+ "output": 1.15
+ },
+ "limit": {
+ "context": 524288,
+ "output": 8192
+ },
+ "knowledge": "2024-08"
+ }
+ },
+ {
+ "id": "moonshotai/kimi-k2-thinking-maas",
+ "name": "Kimi K2 Thinking",
+ "provider": "vertexai",
+ "family": "kimi-thinking",
+ "created_at": "2025-11-13 00:00:00 +0530",
+ "context_window": 262144,
+ "max_output_tokens": 262144,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.6,
+ "output_per_million": 2.5
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google-vertex",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-11-13",
+ "interleaved": {
+ "field": "reasoning_content"
+ },
+ "cost": {
+ "input": 0.6,
+ "output": 2.5
+ },
+ "limit": {
+ "context": 262144,
+ "output": 262144
+ },
+ "knowledge": "2024-08"
+ }
+ },
+ {
+ "id": "openai/gpt-oss-120b-maas",
+ "name": "GPT OSS 120B",
+ "provider": "vertexai",
+ "family": "gpt-oss",
+ "created_at": "2025-08-05 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 32768,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.09,
+ "output_per_million": 0.36
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google-vertex",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-08-05",
+ "cost": {
+ "input": 0.09,
+ "output": 0.36
+ },
+ "limit": {
+ "context": 131072,
+ "output": 32768
+ }
+ }
+ },
+ {
+ "id": "openai/gpt-oss-20b-maas",
+ "name": "GPT OSS 20B",
+ "provider": "vertexai",
+ "family": "gpt-oss",
+ "created_at": "2025-08-05 00:00:00 +0530",
+ "context_window": 131072,
+ "max_output_tokens": 32768,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.07,
+ "output_per_million": 0.25
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google-vertex",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-08-05",
+ "cost": {
+ "input": 0.07,
+ "output": 0.25
+ },
+ "limit": {
+ "context": 131072,
+ "output": 32768
+ }
+ }
+ },
+ {
+ "id": "qwen/qwen3-235b-a22b-instruct-2507-maas",
+ "name": "Qwen3 235B A22B Instruct",
+ "provider": "vertexai",
+ "family": "qwen",
+ "created_at": "2025-08-13 00:00:00 +0530",
+ "context_window": 262144,
+ "max_output_tokens": 16384,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.22,
+ "output_per_million": 0.88
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google-vertex",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2025-08-13",
+ "cost": {
+ "input": 0.22,
+ "output": 0.88
+ },
+ "limit": {
+ "context": 262144,
+ "output": 16384
+ }
+ }
+ },
+ {
+ "id": "zai-org/glm-4.7-maas",
+ "name": "GLM-4.7",
+ "provider": "vertexai",
+ "family": "glm",
+ "created_at": "2026-01-06 00:00:00 +0530",
+ "context_window": 200000,
+ "max_output_tokens": 128000,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text",
+ "pdf"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "structured_output",
+ "reasoning",
+ "vision"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 0.6,
+ "output_per_million": 2.2
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google-vertex",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-01-06",
+ "interleaved": {
+ "field": "reasoning_content"
+ },
+ "cost": {
+ "input": 0.6,
+ "output": 2.2
+ },
+ "limit": {
+ "context": 200000,
+ "output": 128000
+ },
+ "knowledge": "2025-04"
+ }
+ },
+ {
+ "id": "zai-org/glm-5-maas",
+ "name": "GLM-5",
+ "provider": "vertexai",
+ "family": "glm",
+ "created_at": "2026-02-11 00:00:00 +0530",
+ "context_window": 202752,
+ "max_output_tokens": 131072,
+ "knowledge_cutoff": null,
+ "modalities": {
+ "input": [
+ "text"
+ ],
+ "output": [
+ "text"
+ ]
+ },
+ "capabilities": [
+ "function_calling",
+ "reasoning"
+ ],
+ "pricing": {
+ "text_tokens": {
+ "standard": {
+ "input_per_million": 1,
+ "output_per_million": 3.2,
+ "cached_input_per_million": 0.1
+ }
+ }
+ },
+ "metadata": {
+ "source": "models.dev",
+ "provider_id": "google-vertex",
+ "open_weights": true,
+ "attachment": false,
+ "temperature": true,
+ "last_updated": "2026-02-11",
+ "interleaved": {
+ "field": "reasoning_content"
+ },
+ "cost": {
+ "input": 1,
+ "output": 3.2,
+ "cache_read": 0.1
+ },
+ "limit": {
+ "context": 202752,
+ "output": 131072
+ }
+ }
+ }
+]
\ No newline at end of file
diff --git a/lib/llm/config.rb b/lib/llm/config.rb
index 48de51022..6528e90c8 100644
--- a/lib/llm/config.rb
+++ b/lib/llm/config.rb
@@ -20,6 +20,7 @@ module Llm::Config
end
def with_api_key(api_key, api_base: nil)
+ initialize!
context = RubyLLM.context do |config|
config.openai_api_key = api_key
config.openai_api_base = api_base
@@ -34,6 +35,7 @@ module Llm::Config
RubyLLM.configure do |config|
config.openai_api_key = system_api_key if system_api_key.present?
config.openai_api_base = openai_endpoint.chomp('/') if openai_endpoint.present?
+ config.model_registry_file = Rails.root.join('config/llm_models.json').to_s
config.logger = Rails.logger
end
end
diff --git a/lib/tasks/ruby_llm.rake b/lib/tasks/ruby_llm.rake
new file mode 100644
index 000000000..0884f80c1
--- /dev/null
+++ b/lib/tasks/ruby_llm.rake
@@ -0,0 +1,17 @@
+# Refresh the RubyLLM model registry from models.dev and configured providers.
+# Updates config/llm_models.json so new models are available without a gem upgrade.
+#
+# Usage:
+# bundle exec rake ruby_llm:refresh_models
+#
+# Run this when new models are released, commit the updated config/llm_models.json.
+namespace :ruby_llm do
+ desc 'Refresh RubyLLM model registry from models.dev'
+ task refresh_models: :environment do
+ registry_path = Rails.root.join('config/llm_models.json').to_s
+ puts 'Refreshing RubyLLM model registry...'
+ RubyLLM.models.refresh!
+ RubyLLM.models.save_to_json(registry_path)
+ puts "RubyLLM model registry updated with #{RubyLLM.models.all.size} models at #{registry_path}"
+ end
+end
From cc008951dbda26da25f61b35f8bb9b1d5e447f0a Mon Sep 17 00:00:00 2001
From: Gabriel Jablonski
Date: Thu, 16 Apr 2026 02:27:16 -0300
Subject: [PATCH 53/53] fix(sidebar): improve active child route matching logic
(#13121)
---
.../dashboard/components-next/sidebar/SidebarGroup.vue | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/app/javascript/dashboard/components-next/sidebar/SidebarGroup.vue b/app/javascript/dashboard/components-next/sidebar/SidebarGroup.vue
index 812da812a..048a99cf8 100644
--- a/app/javascript/dashboard/components-next/sidebar/SidebarGroup.vue
+++ b/app/javascript/dashboard/components-next/sidebar/SidebarGroup.vue
@@ -158,9 +158,11 @@ const activeChild = computed(() => {
return rankedPage ?? activeOnPages[0];
}
- return navigableChildren.value.find(
- child => child.to && route.path.startsWith(resolvePath(child.to))
- );
+ return navigableChildren.value.find(child => {
+ if (!child.to) return false;
+ const childPath = resolvePath(child.to);
+ return route.path === childPath || route.path.startsWith(`${childPath}/`);
+ });
});
const hasActiveChild = computed(() => {