+
{{ $t('INBOX_MGMT.ADD.WEBSITE_CHANNEL.CHANNEL_AVATAR.LABEL') }}
@@ -856,6 +917,9 @@ export default {
+
diff --git a/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/whatsapp/Reauthorize.vue b/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/whatsapp/Reauthorize.vue
index 08ddcaded..229b62f69 100644
--- a/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/whatsapp/Reauthorize.vue
+++ b/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/whatsapp/Reauthorize.vue
@@ -16,6 +16,10 @@ const props = defineProps({
type: Object,
required: true,
},
+ whatsappRegistrationIncomplete: {
+ type: Boolean,
+ default: false,
+ },
});
const { t } = useI18n();
@@ -28,6 +32,20 @@ const whatsappConfigurationId = computed(
() => window.chatwootConfig.whatsappConfigurationId
);
+const actionLabel = computed(() => {
+ if (props.whatsappRegistrationIncomplete) {
+ return t('INBOX_MGMT.COMPLETE_REGISTRATION');
+ }
+ return '';
+});
+
+const description = computed(() => {
+ if (props.whatsappRegistrationIncomplete) {
+ return t('INBOX_MGMT.WHATSAPP_REGISTRATION_INCOMPLETE');
+ }
+ return '';
+});
+
const reauthorizeWhatsApp = async params => {
isRequestingAuthorization.value = true;
@@ -185,6 +203,8 @@ defineExpose({
diff --git a/app/javascript/dashboard/routes/dashboard/settings/inbox/components/AccountHealth.vue b/app/javascript/dashboard/routes/dashboard/settings/inbox/components/AccountHealth.vue
new file mode 100644
index 000000000..026c8ef69
--- /dev/null
+++ b/app/javascript/dashboard/routes/dashboard/settings/inbox/components/AccountHealth.vue
@@ -0,0 +1,228 @@
+
+
+
+
+
+
+
+
+ {{ t('INBOX_MGMT.ACCOUNT_HEALTH.TITLE') }}
+
+
+ {{ t('INBOX_MGMT.ACCOUNT_HEALTH.DESCRIPTION') }}
+
+
+
+ {{ t('INBOX_MGMT.ACCOUNT_HEALTH.GO_TO_SETTINGS') }}
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+ {{ item.value }}
+
+
+ {{ formatStatusDisplay(item.value) }}
+
+
+ {{ formatModeDisplay(item.value) }}
+
+
+ {{ formatTierDisplay(item.value) }}
+
+ {{
+ item.value
+ }}
+
+
+
+
+
+
+
+
+
{{ t('INBOX_MGMT.ACCOUNT_HEALTH.NO_DATA') }}
+
+
+
+
+
+
diff --git a/app/javascript/dashboard/routes/dashboard/settings/inbox/components/InboxReconnectionRequired.vue b/app/javascript/dashboard/routes/dashboard/settings/inbox/components/InboxReconnectionRequired.vue
index ac84065e9..109272973 100644
--- a/app/javascript/dashboard/routes/dashboard/settings/inbox/components/InboxReconnectionRequired.vue
+++ b/app/javascript/dashboard/routes/dashboard/settings/inbox/components/InboxReconnectionRequired.vue
@@ -1,15 +1,26 @@
- {{ $t('INBOX_MGMT.RECONNECTION_REQUIRED') }}
+ {{ description || $t('INBOX_MGMT.RECONNECTION_REQUIRED') }}
diff --git a/app/policies/inbox_policy.rb b/app/policies/inbox_policy.rb
index 8a6f81484..cace85e5e 100644
--- a/app/policies/inbox_policy.rb
+++ b/app/policies/inbox_policy.rb
@@ -61,4 +61,8 @@ class InboxPolicy < ApplicationPolicy
def sync_templates?
@account_user.administrator?
end
+
+ def health?
+ @account_user.administrator?
+ end
end
diff --git a/app/services/whatsapp/embedded_signup_service.rb b/app/services/whatsapp/embedded_signup_service.rb
index 1b882b1f1..4379d0b74 100644
--- a/app/services/whatsapp/embedded_signup_service.rb
+++ b/app/services/whatsapp/embedded_signup_service.rb
@@ -17,6 +17,7 @@ class Whatsapp::EmbeddedSignupService
channel = create_or_reauthorize_channel(access_token, phone_info)
channel.setup_webhooks
+ check_channel_health_and_prompt_reauth(channel)
channel
rescue StandardError => e
@@ -52,6 +53,24 @@ class Whatsapp::EmbeddedSignupService
end
end
+ def check_channel_health_and_prompt_reauth(channel)
+ health_data = Whatsapp::HealthService.new(channel).fetch_health_status
+ return unless health_data
+
+ if channel_in_pending_state?(health_data)
+ channel.prompt_reauthorization!
+ else
+ Rails.logger.info "[WHATSAPP] Channel #{channel.phone_number} health check passed"
+ end
+ rescue StandardError => e
+ Rails.logger.error "[WHATSAPP] Health check failed for channel #{channel.phone_number}: #{e.message}"
+ end
+
+ def channel_in_pending_state?(health_data)
+ health_data[:platform_type] == 'NOT_APPLICABLE' ||
+ health_data.dig(:throughput, 'level') == 'NOT_APPLICABLE'
+ end
+
def validate_parameters!
missing_params = []
missing_params << 'code' if @code.blank?
diff --git a/app/services/whatsapp/health_service.rb b/app/services/whatsapp/health_service.rb
new file mode 100644
index 000000000..94789ef79
--- /dev/null
+++ b/app/services/whatsapp/health_service.rb
@@ -0,0 +1,84 @@
+class Whatsapp::HealthService
+ BASE_URI = 'https://graph.facebook.com'.freeze
+
+ def initialize(channel)
+ @channel = channel
+ @access_token = channel.provider_config['api_key']
+ @api_version = GlobalConfigService.load('WHATSAPP_API_VERSION', 'v22.0')
+ end
+
+ def fetch_health_status
+ validate_channel!
+ fetch_phone_health_data
+ end
+
+ private
+
+ def validate_channel!
+ raise ArgumentError, 'Channel is required' if @channel.blank?
+ raise ArgumentError, 'API key is missing' if @access_token.blank?
+ raise ArgumentError, 'Phone number ID is missing' if @channel.provider_config['phone_number_id'].blank?
+ end
+
+ def fetch_phone_health_data
+ phone_number_id = @channel.provider_config['phone_number_id']
+
+ response = HTTParty.get(
+ "#{BASE_URI}/#{@api_version}/#{phone_number_id}",
+ query: {
+ fields: health_fields,
+ access_token: @access_token
+ }
+ )
+
+ handle_response(response)
+ rescue StandardError => e
+ Rails.logger.error "[WHATSAPP HEALTH] Error fetching health data: #{e.message}"
+ raise e
+ end
+
+ def health_fields
+ %w[
+ quality_rating
+ messaging_limit_tier
+ code_verification_status
+ account_mode
+ id
+ display_phone_number
+ name_status
+ verified_name
+ webhook_configuration
+ throughput
+ last_onboarded_time
+ platform_type
+ certificate
+ ].join(',')
+ end
+
+ def handle_response(response)
+ unless response.success?
+ error_message = "WhatsApp API request failed: #{response.code} - #{response.body}"
+ Rails.logger.error "[WHATSAPP HEALTH] #{error_message}"
+ raise error_message
+ end
+
+ data = response.parsed_response
+ format_health_response(data)
+ end
+
+ def format_health_response(response)
+ {
+ display_phone_number: response['display_phone_number'],
+ verified_name: response['verified_name'],
+ name_status: response['name_status'],
+ quality_rating: response['quality_rating'],
+ messaging_limit_tier: response['messaging_limit_tier'],
+ account_mode: response['account_mode'],
+ code_verification_status: response['code_verification_status'],
+ throughput: response['throughput'],
+ last_onboarded_time: response['last_onboarded_time'],
+ platform_type: response['platform_type'],
+ business_id: @channel.provider_config['business_account_id']
+ }
+ end
+end
diff --git a/app/services/whatsapp/webhook_setup_service.rb b/app/services/whatsapp/webhook_setup_service.rb
index a3faaaa56..63fed1e93 100644
--- a/app/services/whatsapp/webhook_setup_service.rb
+++ b/app/services/whatsapp/webhook_setup_service.rb
@@ -8,8 +8,12 @@ class Whatsapp::WebhookSetupService
def perform
validate_parameters!
- # Since coexistence method does not need to register, we check it
- register_phone_number unless phone_number_verified?
+
+ # Register phone number if either condition is met:
+ # 1. Phone number is not verified (code_verification_status != 'VERIFIED')
+ # 2. Phone number needs registration (pending provisioning state)
+ register_phone_number if !phone_number_verified? || phone_number_needs_registration?
+
setup_webhook
end
@@ -69,9 +73,44 @@ class Whatsapp::WebhookSetupService
def phone_number_verified?
phone_number_id = @channel.provider_config['phone_number_id']
- @api_client.phone_number_verified?(phone_number_id)
+ # Check with WhatsApp API if the phone number code verification is complete
+ # This checks code_verification_status == 'VERIFIED'
+ verified = @api_client.phone_number_verified?(phone_number_id)
+ Rails.logger.info("[WHATSAPP] Phone number #{phone_number_id} code verification status: #{verified}")
+
+ verified
rescue StandardError => e
- Rails.logger.error("[WHATSAPP] Phone registration status check failed, but continuing: #{e.message}")
+ # If verification check fails, assume not verified to be safe
+ Rails.logger.error("[WHATSAPP] Phone verification status check failed: #{e.message}")
+ false
+ end
+
+ def phone_number_needs_registration?
+ # Check if phone is in pending provisioning state based on health data
+ # This is a separate check from phone_number_verified? which only checks code verification
+
+ phone_number_in_pending_state?
+
+ rescue StandardError => e
+ Rails.logger.error("[WHATSAPP] Phone registration check failed: #{e.message}")
+ # Conservative approach: don't register if we can't determine the state
+ false
+ end
+
+ def phone_number_in_pending_state?
+ health_service = Whatsapp::HealthService.new(@channel)
+ health_data = health_service.fetch_health_status
+
+ # Check if phone number is in "not provisioned" state based on health indicators
+ # These conditions indicate the number is pending and needs registration:
+ # - platform_type: "NOT_APPLICABLE" means not fully set up
+ # - throughput.level: "NOT_APPLICABLE" means no messaging capacity assigned
+ health_data[:platform_type] == 'NOT_APPLICABLE' ||
+ health_data.dig(:throughput, :level) == 'NOT_APPLICABLE'
+
+ rescue StandardError => e
+ Rails.logger.error("[WHATSAPP] Health status check failed: #{e.message}")
+ # If health check fails, assume registration is not needed to avoid errors
false
end
end
diff --git a/config/routes.rb b/config/routes.rb
index 6a484b380..bf455949c 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -193,6 +193,7 @@ Rails.application.routes.draw do
post :set_agent_bot, on: :member
delete :avatar, on: :member
post :sync_templates, on: :member
+ get :health, on: :member
end
resources :inbox_members, only: [:create, :show], param: :inbox_id do
collection do
diff --git a/spec/controllers/api/v1/accounts/inboxes_controller_spec.rb b/spec/controllers/api/v1/accounts/inboxes_controller_spec.rb
index cc235cada..a44f60391 100644
--- a/spec/controllers/api/v1/accounts/inboxes_controller_spec.rb
+++ b/spec/controllers/api/v1/accounts/inboxes_controller_spec.rb
@@ -980,4 +980,153 @@ RSpec.describe 'Inboxes API', type: :request do
end
end
end
+
+ describe 'GET /api/v1/accounts/{account.id}/inboxes/{inbox.id}/health' do
+ let(:whatsapp_channel) do
+ create(:channel_whatsapp, account: account, provider: 'whatsapp_cloud', sync_templates: false, validate_provider_config: false)
+ end
+ let(:whatsapp_inbox) { create(:inbox, account: account, channel: whatsapp_channel) }
+ let(:non_whatsapp_inbox) { create(:inbox, account: account) }
+ let(:health_service) { instance_double(Whatsapp::HealthService) }
+ let(:health_data) do
+ {
+ display_phone_number: '+1234567890',
+ verified_name: 'Test Business',
+ name_status: 'APPROVED',
+ quality_rating: 'GREEN',
+ messaging_limit_tier: 'TIER_1000',
+ account_mode: 'LIVE',
+ business_id: 'business123'
+ }
+ end
+
+ before do
+ allow(Whatsapp::HealthService).to receive(:new).and_return(health_service)
+ allow(health_service).to receive(:fetch_health_status).and_return(health_data)
+ end
+
+ context 'when it is an unauthenticated user' do
+ it 'returns unauthorized' do
+ get "/api/v1/accounts/#{account.id}/inboxes/#{whatsapp_inbox.id}/health"
+
+ expect(response).to have_http_status(:unauthorized)
+ end
+ end
+
+ context 'when it is an authenticated user' do
+ context 'with WhatsApp inbox' do
+ it 'returns health data for administrator' do
+ get "/api/v1/accounts/#{account.id}/inboxes/#{whatsapp_inbox.id}/health",
+ headers: admin.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:success)
+ json_response = response.parsed_body
+ expect(json_response).to include(
+ 'display_phone_number' => '+1234567890',
+ 'verified_name' => 'Test Business',
+ 'name_status' => 'APPROVED',
+ 'quality_rating' => 'GREEN',
+ 'messaging_limit_tier' => 'TIER_1000',
+ 'account_mode' => 'LIVE',
+ 'business_id' => 'business123'
+ )
+ end
+
+ it 'returns health data for agent with inbox access' do
+ create(:inbox_member, user: agent, inbox: whatsapp_inbox)
+
+ get "/api/v1/accounts/#{account.id}/inboxes/#{whatsapp_inbox.id}/health",
+ headers: agent.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:success)
+ json_response = response.parsed_body
+ expect(json_response['display_phone_number']).to eq('+1234567890')
+ end
+
+ it 'returns unauthorized for agent without inbox access' do
+ get "/api/v1/accounts/#{account.id}/inboxes/#{whatsapp_inbox.id}/health",
+ headers: agent.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:unauthorized)
+ end
+
+ it 'calls the health service with correct channel' do
+ expect(Whatsapp::HealthService).to receive(:new).with(whatsapp_channel).and_return(health_service)
+ expect(health_service).to receive(:fetch_health_status)
+
+ get "/api/v1/accounts/#{account.id}/inboxes/#{whatsapp_inbox.id}/health",
+ headers: admin.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:success)
+ end
+
+ it 'handles service errors gracefully' do
+ allow(health_service).to receive(:fetch_health_status).and_raise(StandardError, 'API Error')
+
+ get "/api/v1/accounts/#{account.id}/inboxes/#{whatsapp_inbox.id}/health",
+ headers: admin.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:unprocessable_entity)
+ json_response = response.parsed_body
+ expect(json_response['error']).to include('API Error')
+ end
+ end
+
+ context 'with non-WhatsApp inbox' do
+ it 'returns bad request error for administrator' do
+ get "/api/v1/accounts/#{account.id}/inboxes/#{non_whatsapp_inbox.id}/health",
+ headers: admin.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:bad_request)
+ json_response = response.parsed_body
+ expect(json_response['error']).to eq('Health data only available for WhatsApp Cloud API channels')
+ end
+
+ it 'returns bad request error for agent' do
+ create(:inbox_member, user: agent, inbox: non_whatsapp_inbox)
+
+ get "/api/v1/accounts/#{account.id}/inboxes/#{non_whatsapp_inbox.id}/health",
+ headers: agent.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:bad_request)
+ json_response = response.parsed_body
+ expect(json_response['error']).to eq('Health data only available for WhatsApp Cloud API channels')
+ end
+ end
+
+ context 'with WhatsApp non-cloud inbox' do
+ let(:whatsapp_default_channel) do
+ create(:channel_whatsapp, account: account, provider: 'default', sync_templates: false, validate_provider_config: false)
+ end
+ let(:whatsapp_default_inbox) { create(:inbox, account: account, channel: whatsapp_default_channel) }
+
+ it 'returns bad request error for non-cloud provider' do
+ get "/api/v1/accounts/#{account.id}/inboxes/#{whatsapp_default_inbox.id}/health",
+ headers: admin.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:bad_request)
+ json_response = response.parsed_body
+ expect(json_response['error']).to eq('Health data only available for WhatsApp Cloud API channels')
+ end
+ end
+
+ context 'with non-existent inbox' do
+ it 'returns not found error' do
+ get "/api/v1/accounts/#{account.id}/inboxes/999999/health",
+ headers: admin.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:not_found)
+ end
+ end
+ end
+ end
end
diff --git a/spec/services/whatsapp/embedded_signup_service_spec.rb b/spec/services/whatsapp/embedded_signup_service_spec.rb
index 1db94928e..a20e36ac8 100644
--- a/spec/services/whatsapp/embedded_signup_service_spec.rb
+++ b/spec/services/whatsapp/embedded_signup_service_spec.rb
@@ -48,6 +48,15 @@ describe Whatsapp::EmbeddedSignupService do
allow(channel_creation).to receive(:perform).and_return(channel)
allow(channel).to receive(:setup_webhooks)
+ allow(channel).to receive(:phone_number).and_return('+1234567890')
+
+ health_service = instance_double(Whatsapp::HealthService)
+ allow(Whatsapp::HealthService).to receive(:new).and_return(health_service)
+ allow(health_service).to receive(:fetch_health_status).and_return({
+ platform_type: 'CLOUD_API',
+ throughput: { 'level' => 'STANDARD' },
+ messaging_limit_tier: 'TIER_1000'
+ })
end
it 'creates channel and sets up webhooks' do
@@ -57,6 +66,49 @@ describe Whatsapp::EmbeddedSignupService do
expect(result).to eq(channel)
end
+ it 'checks health status after channel creation' do
+ health_service = instance_double(Whatsapp::HealthService)
+ allow(Whatsapp::HealthService).to receive(:new).and_return(health_service)
+ expect(health_service).to receive(:fetch_health_status)
+
+ service.perform
+ end
+
+ context 'when channel is in pending state' do
+ it 'prompts reauthorization for pending channel' do
+ health_service = instance_double(Whatsapp::HealthService)
+ allow(Whatsapp::HealthService).to receive(:new).and_return(health_service)
+ allow(health_service).to receive(:fetch_health_status).and_return({
+ platform_type: 'NOT_APPLICABLE',
+ throughput: { 'level' => 'STANDARD' },
+ messaging_limit_tier: 'TIER_1000'
+ })
+
+ expect(channel).to receive(:prompt_reauthorization!)
+ service.perform
+ end
+
+ it 'prompts reauthorization when throughput level is NOT_APPLICABLE' do
+ health_service = instance_double(Whatsapp::HealthService)
+ allow(Whatsapp::HealthService).to receive(:new).and_return(health_service)
+ allow(health_service).to receive(:fetch_health_status).and_return({
+ platform_type: 'CLOUD_API',
+ throughput: { 'level' => 'NOT_APPLICABLE' },
+ messaging_limit_tier: 'TIER_1000'
+ })
+
+ expect(channel).to receive(:prompt_reauthorization!)
+ service.perform
+ end
+ end
+
+ context 'when channel is healthy' do
+ it 'does not prompt reauthorization for healthy channel' do
+ expect(channel).not_to receive(:prompt_reauthorization!)
+ service.perform
+ end
+ end
+
context 'when parameters are invalid' do
it 'raises ArgumentError for missing parameters' do
invalid_service = described_class.new(account: account, params: { code: '', business_id: '', waba_id: '' })
@@ -114,6 +166,16 @@ describe Whatsapp::EmbeddedSignupService do
business_id: params[:business_id]
).and_return(reauth_service)
allow(reauth_service).to receive(:perform).with(access_token, phone_info).and_return(channel)
+
+ allow(channel).to receive(:phone_number).and_return('+1234567890')
+
+ health_service = instance_double(Whatsapp::HealthService)
+ allow(Whatsapp::HealthService).to receive(:new).and_return(health_service)
+ allow(health_service).to receive(:fetch_health_status).and_return({
+ platform_type: 'CLOUD_API',
+ throughput: { 'level' => 'STANDARD' },
+ messaging_limit_tier: 'TIER_1000'
+ })
end
it 'uses ReauthorizationService and sets up webhooks' do
@@ -124,36 +186,57 @@ describe Whatsapp::EmbeddedSignupService do
expect(result).to eq(channel)
end
- it 'clears reauthorization flag' do
- inbox = create(:inbox, account: account)
- whatsapp_channel = create(:channel_whatsapp, account: account, phone_number: '+1234567890',
- validate_provider_config: false, sync_templates: false)
- inbox.update!(channel: whatsapp_channel)
- whatsapp_channel.prompt_reauthorization!
+ context 'with real channel requiring reauthorization' do
+ let(:inbox) { create(:inbox, account: account) }
+ let(:whatsapp_channel) do
+ create(:channel_whatsapp, account: account, phone_number: '+1234567890',
+ validate_provider_config: false, sync_templates: false)
+ end
+ let(:service_with_real_inbox) { described_class.new(account: account, params: params, inbox_id: inbox.id) }
- service_with_real_inbox = described_class.new(account: account, params: params, inbox_id: inbox.id)
+ before do
+ inbox.update!(channel: whatsapp_channel)
+ whatsapp_channel.prompt_reauthorization!
- # Mock the ReauthorizationService to return our test channel
- reauth_service = instance_double(Whatsapp::ReauthorizationService)
- allow(Whatsapp::ReauthorizationService).to receive(:new).with(
- account: account,
- inbox_id: inbox.id,
- phone_number_id: params[:phone_number_id],
- business_id: params[:business_id]
- ).and_return(reauth_service)
-
- # Perform the reauthorization and clear the flag
- allow(reauth_service).to receive(:perform) do
- whatsapp_channel.reauthorized!
- whatsapp_channel
+ setup_reauthorization_mocks
+ setup_health_service_mock
end
- allow(whatsapp_channel).to receive(:setup_webhooks).and_return(true)
+ it 'clears reauthorization flag when reauthorization completes' do
+ expect(whatsapp_channel.reauthorization_required?).to be true
+ result = service_with_real_inbox.perform
+ expect(result).to eq(whatsapp_channel)
+ expect(whatsapp_channel.reauthorization_required?).to be false
+ end
- expect(whatsapp_channel.reauthorization_required?).to be true
- result = service_with_real_inbox.perform
- expect(result).to eq(whatsapp_channel)
- expect(whatsapp_channel.reauthorization_required?).to be false
+ private
+
+ def setup_reauthorization_mocks
+ reauth_service = instance_double(Whatsapp::ReauthorizationService)
+ allow(Whatsapp::ReauthorizationService).to receive(:new).with(
+ account: account,
+ inbox_id: inbox.id,
+ phone_number_id: params[:phone_number_id],
+ business_id: params[:business_id]
+ ).and_return(reauth_service)
+
+ allow(reauth_service).to receive(:perform) do
+ whatsapp_channel.reauthorized!
+ whatsapp_channel
+ end
+
+ allow(whatsapp_channel).to receive(:setup_webhooks).and_return(true)
+ end
+
+ def setup_health_service_mock
+ health_service = instance_double(Whatsapp::HealthService)
+ allow(Whatsapp::HealthService).to receive(:new).and_return(health_service)
+ allow(health_service).to receive(:fetch_health_status).and_return({
+ platform_type: 'CLOUD_API',
+ throughput: { 'level' => 'STANDARD' },
+ messaging_limit_tier: 'TIER_1000'
+ })
+ end
end
end
end
diff --git a/spec/services/whatsapp/webhook_setup_service_spec.rb b/spec/services/whatsapp/webhook_setup_service_spec.rb
index e6a246e5d..38856e252 100644
--- a/spec/services/whatsapp/webhook_setup_service_spec.rb
+++ b/spec/services/whatsapp/webhook_setup_service_spec.rb
@@ -16,6 +16,7 @@ describe Whatsapp::WebhookSetupService do
let(:access_token) { 'test_access_token' }
let(:service) { described_class.new(channel, waba_id, access_token) }
let(:api_client) { instance_double(Whatsapp::FacebookApiClient) }
+ let(:health_service) { instance_double(Whatsapp::HealthService) }
before do
# Stub webhook teardown to prevent HTTP calls during cleanup
@@ -24,8 +25,14 @@ describe Whatsapp::WebhookSetupService do
# Clean up any existing channels to avoid phone number conflicts
Channel::Whatsapp.destroy_all
allow(Whatsapp::FacebookApiClient).to receive(:new).and_return(api_client)
- # Default stub for phone_number_verified? with any argument
+ allow(Whatsapp::HealthService).to receive(:new).and_return(health_service)
+
+ # Default stubs for phone_number_verified? and health service
allow(api_client).to receive(:phone_number_verified?).and_return(false)
+ allow(health_service).to receive(:fetch_health_status).and_return({
+ platform_type: 'APPLICABLE',
+ throughput: { level: 'APPLICABLE' }
+ })
end
describe '#perform' do
@@ -49,9 +56,13 @@ describe Whatsapp::WebhookSetupService do
end
end
- context 'when phone number IS verified (should NOT register)' do
+ context 'when phone number IS verified AND fully provisioned (should NOT register)' do
before do
allow(api_client).to receive(:phone_number_verified?).with('123456789').and_return(true)
+ allow(health_service).to receive(:fetch_health_status).and_return({
+ platform_type: 'APPLICABLE',
+ throughput: { level: 'APPLICABLE' }
+ })
allow(api_client).to receive(:subscribe_waba_webhook)
.with(waba_id, anything, 'test_verify_token').and_return({ 'success' => true })
end
@@ -66,16 +77,68 @@ describe Whatsapp::WebhookSetupService do
end
end
+ context 'when phone number IS verified BUT needs registration (pending provisioning)' do
+ before do
+ allow(api_client).to receive(:phone_number_verified?).with('123456789').and_return(true)
+ allow(health_service).to receive(:fetch_health_status).and_return({
+ platform_type: 'NOT_APPLICABLE',
+ throughput: { level: 'APPLICABLE' }
+ })
+ allow(SecureRandom).to receive(:random_number).with(900_000).and_return(123_456)
+ allow(api_client).to receive(:register_phone_number).with('123456789', 223_456)
+ allow(api_client).to receive(:subscribe_waba_webhook)
+ .with(waba_id, anything, 'test_verify_token').and_return({ 'success' => true })
+ allow(channel).to receive(:save!)
+ end
+
+ it 'registers the phone number due to pending provisioning state' do
+ with_modified_env FRONTEND_URL: 'https://app.chatwoot.com' do
+ expect(api_client).to receive(:register_phone_number).with('123456789', 223_456)
+ expect(api_client).to receive(:subscribe_waba_webhook)
+ .with(waba_id, 'https://app.chatwoot.com/webhooks/whatsapp/+1234567890', 'test_verify_token')
+ service.perform
+ end
+ end
+ end
+
+ context 'when phone number needs registration due to throughput level' do
+ before do
+ allow(api_client).to receive(:phone_number_verified?).with('123456789').and_return(true)
+ allow(health_service).to receive(:fetch_health_status).and_return({
+ platform_type: 'APPLICABLE',
+ throughput: { level: 'NOT_APPLICABLE' }
+ })
+ allow(SecureRandom).to receive(:random_number).with(900_000).and_return(123_456)
+ allow(api_client).to receive(:register_phone_number).with('123456789', 223_456)
+ allow(api_client).to receive(:subscribe_waba_webhook)
+ .with(waba_id, anything, 'test_verify_token').and_return({ 'success' => true })
+ allow(channel).to receive(:save!)
+ end
+
+ it 'registers the phone number due to throughput not applicable' do
+ with_modified_env FRONTEND_URL: 'https://app.chatwoot.com' do
+ expect(api_client).to receive(:register_phone_number).with('123456789', 223_456)
+ expect(api_client).to receive(:subscribe_waba_webhook)
+ .with(waba_id, 'https://app.chatwoot.com/webhooks/whatsapp/+1234567890', 'test_verify_token')
+ service.perform
+ end
+ end
+ end
+
context 'when phone_number_verified? raises error' do
before do
allow(api_client).to receive(:phone_number_verified?).with('123456789').and_raise('API down')
+ allow(health_service).to receive(:fetch_health_status).and_return({
+ platform_type: 'APPLICABLE',
+ throughput: { level: 'APPLICABLE' }
+ })
allow(SecureRandom).to receive(:random_number).with(900_000).and_return(123_456)
allow(api_client).to receive(:register_phone_number)
allow(api_client).to receive(:subscribe_waba_webhook).and_return({ 'success' => true })
allow(channel).to receive(:save!)
end
- it 'tries to register phone and proceeds with webhook setup' do
+ it 'tries to register phone (due to verification error) and proceeds with webhook setup' do
with_modified_env FRONTEND_URL: 'https://app.chatwoot.com' do
expect(api_client).to receive(:register_phone_number)
expect(api_client).to receive(:subscribe_waba_webhook)
@@ -84,6 +147,22 @@ describe Whatsapp::WebhookSetupService do
end
end
+ context 'when health service raises error' do
+ before do
+ allow(api_client).to receive(:phone_number_verified?).with('123456789').and_return(true)
+ allow(health_service).to receive(:fetch_health_status).and_raise('Health API down')
+ allow(api_client).to receive(:subscribe_waba_webhook).and_return({ 'success' => true })
+ end
+
+ it 'does not register phone (conservative approach) and proceeds with webhook setup' do
+ with_modified_env FRONTEND_URL: 'https://app.chatwoot.com' do
+ expect(api_client).not_to receive(:register_phone_number)
+ expect(api_client).to receive(:subscribe_waba_webhook)
+ expect { service.perform }.not_to raise_error
+ end
+ end
+ end
+
context 'when phone registration fails (not blocking)' do
before do
allow(api_client).to receive(:phone_number_verified?).with('123456789').and_return(false)
@@ -193,6 +272,10 @@ describe Whatsapp::WebhookSetupService do
before do
allow(api_client).to receive(:phone_number_verified?).with('123456789').and_return(true)
+ allow(health_service).to receive(:fetch_health_status).and_return({
+ platform_type: 'APPLICABLE',
+ throughput: { level: 'APPLICABLE' }
+ })
allow(api_client).to receive(:subscribe_waba_webhook)
.with(waba_id, anything, 'existing_verify_token').and_return({ 'success' => true })
end
@@ -218,6 +301,10 @@ describe Whatsapp::WebhookSetupService do
context 'when webhook setup is successful in creation flow' do
before do
allow(api_client).to receive(:phone_number_verified?).with('123456789').and_return(true)
+ allow(health_service).to receive(:fetch_health_status).and_return({
+ platform_type: 'APPLICABLE',
+ throughput: { level: 'APPLICABLE' }
+ })
allow(api_client).to receive(:subscribe_waba_webhook)
.with(waba_id, anything, 'test_verify_token').and_return({ 'success' => true })
end
From c29a08f0cad59fd122f4e2881461e14c725dee81 Mon Sep 17 00:00:00 2001
From: Chatwoot Bot <92152627+chatwoot-bot@users.noreply.github.com>
Date: Thu, 2 Oct 2025 05:54:12 -0700
Subject: [PATCH 154/182] chore: Update translations (#12555)
---
.../dashboard/i18n/locale/am/conversation.json | 7 +++++++
.../dashboard/i18n/locale/am/login.json | 2 +-
.../dashboard/i18n/locale/am/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/ar/conversation.json | 7 +++++++
.../dashboard/i18n/locale/ar/login.json | 2 +-
.../dashboard/i18n/locale/ar/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/az/conversation.json | 7 +++++++
.../dashboard/i18n/locale/az/login.json | 2 +-
.../dashboard/i18n/locale/az/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/bg/conversation.json | 7 +++++++
.../dashboard/i18n/locale/bg/login.json | 2 +-
.../dashboard/i18n/locale/bg/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/ca/conversation.json | 7 +++++++
.../dashboard/i18n/locale/ca/login.json | 2 +-
.../dashboard/i18n/locale/ca/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/cs/conversation.json | 7 +++++++
.../dashboard/i18n/locale/cs/login.json | 2 +-
.../dashboard/i18n/locale/cs/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/da/conversation.json | 7 +++++++
.../dashboard/i18n/locale/da/login.json | 2 +-
.../dashboard/i18n/locale/da/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/de/conversation.json | 7 +++++++
.../dashboard/i18n/locale/de/login.json | 2 +-
.../dashboard/i18n/locale/de/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/el/conversation.json | 7 +++++++
.../dashboard/i18n/locale/el/login.json | 2 +-
.../dashboard/i18n/locale/el/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/es/conversation.json | 7 +++++++
.../dashboard/i18n/locale/es/login.json | 2 +-
.../dashboard/i18n/locale/es/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/fa/conversation.json | 7 +++++++
.../dashboard/i18n/locale/fa/login.json | 2 +-
.../dashboard/i18n/locale/fa/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/fi/conversation.json | 7 +++++++
.../dashboard/i18n/locale/fi/login.json | 2 +-
.../dashboard/i18n/locale/fi/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/fr/conversation.json | 7 +++++++
.../dashboard/i18n/locale/fr/login.json | 2 +-
.../dashboard/i18n/locale/fr/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/he/conversation.json | 7 +++++++
.../dashboard/i18n/locale/he/login.json | 2 +-
.../dashboard/i18n/locale/he/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/hi/conversation.json | 7 +++++++
.../dashboard/i18n/locale/hi/login.json | 2 +-
.../dashboard/i18n/locale/hi/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/hr/conversation.json | 7 +++++++
.../dashboard/i18n/locale/hr/login.json | 2 +-
.../dashboard/i18n/locale/hr/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/hu/conversation.json | 7 +++++++
.../dashboard/i18n/locale/hu/login.json | 2 +-
.../dashboard/i18n/locale/hu/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/hy/conversation.json | 7 +++++++
.../dashboard/i18n/locale/hy/login.json | 2 +-
.../dashboard/i18n/locale/hy/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/id/conversation.json | 7 +++++++
.../dashboard/i18n/locale/id/login.json | 2 +-
.../dashboard/i18n/locale/id/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/is/conversation.json | 7 +++++++
.../dashboard/i18n/locale/is/login.json | 2 +-
.../dashboard/i18n/locale/is/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/it/conversation.json | 7 +++++++
.../dashboard/i18n/locale/it/login.json | 2 +-
.../dashboard/i18n/locale/it/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/ja/conversation.json | 7 +++++++
.../dashboard/i18n/locale/ja/login.json | 2 +-
.../dashboard/i18n/locale/ja/signup.json | 9 +++++++--
.../dashboard/i18n/locale/ka/conversation.json | 7 +++++++
.../dashboard/i18n/locale/ka/login.json | 2 +-
.../dashboard/i18n/locale/ka/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/ko/conversation.json | 7 +++++++
.../dashboard/i18n/locale/ko/login.json | 2 +-
.../dashboard/i18n/locale/ko/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/lt/conversation.json | 7 +++++++
.../dashboard/i18n/locale/lt/login.json | 2 +-
.../dashboard/i18n/locale/lt/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/lv/conversation.json | 7 +++++++
.../dashboard/i18n/locale/lv/login.json | 2 +-
.../dashboard/i18n/locale/lv/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/ml/conversation.json | 7 +++++++
.../dashboard/i18n/locale/ml/login.json | 2 +-
.../dashboard/i18n/locale/ml/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/ms/conversation.json | 7 +++++++
.../dashboard/i18n/locale/ms/login.json | 2 +-
.../dashboard/i18n/locale/ms/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/ne/conversation.json | 7 +++++++
.../dashboard/i18n/locale/ne/login.json | 2 +-
.../dashboard/i18n/locale/ne/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/nl/conversation.json | 7 +++++++
.../dashboard/i18n/locale/nl/login.json | 2 +-
.../dashboard/i18n/locale/nl/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/no/conversation.json | 7 +++++++
.../dashboard/i18n/locale/no/login.json | 2 +-
.../dashboard/i18n/locale/no/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/pl/conversation.json | 7 +++++++
.../dashboard/i18n/locale/pl/login.json | 2 +-
.../dashboard/i18n/locale/pl/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/pt/conversation.json | 7 +++++++
.../dashboard/i18n/locale/pt/login.json | 2 +-
.../dashboard/i18n/locale/pt/signup.json | 11 ++++++++---
.../i18n/locale/pt_BR/conversation.json | 7 +++++++
.../dashboard/i18n/locale/pt_BR/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/ro/conversation.json | 7 +++++++
.../dashboard/i18n/locale/ro/login.json | 2 +-
.../dashboard/i18n/locale/ro/signup.json | 9 +++++++--
.../dashboard/i18n/locale/ru/conversation.json | 7 +++++++
.../dashboard/i18n/locale/ru/login.json | 2 +-
.../dashboard/i18n/locale/ru/signup.json | 9 +++++++--
.../dashboard/i18n/locale/sh/conversation.json | 7 +++++++
.../dashboard/i18n/locale/sh/login.json | 2 +-
.../dashboard/i18n/locale/sh/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/sk/conversation.json | 7 +++++++
.../dashboard/i18n/locale/sk/login.json | 2 +-
.../dashboard/i18n/locale/sk/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/sl/conversation.json | 7 +++++++
.../dashboard/i18n/locale/sl/login.json | 2 +-
.../dashboard/i18n/locale/sl/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/sq/conversation.json | 7 +++++++
.../dashboard/i18n/locale/sq/login.json | 2 +-
.../dashboard/i18n/locale/sq/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/sr/conversation.json | 7 +++++++
.../dashboard/i18n/locale/sr/login.json | 2 +-
.../dashboard/i18n/locale/sr/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/sv/conversation.json | 7 +++++++
.../dashboard/i18n/locale/sv/login.json | 2 +-
.../dashboard/i18n/locale/sv/signup.json | 9 +++++++--
.../dashboard/i18n/locale/ta/conversation.json | 7 +++++++
.../dashboard/i18n/locale/ta/login.json | 2 +-
.../dashboard/i18n/locale/ta/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/th/conversation.json | 7 +++++++
.../dashboard/i18n/locale/th/login.json | 2 +-
.../dashboard/i18n/locale/th/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/tl/conversation.json | 7 +++++++
.../dashboard/i18n/locale/tl/login.json | 2 +-
.../dashboard/i18n/locale/tl/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/tr/conversation.json | 7 +++++++
.../dashboard/i18n/locale/tr/login.json | 2 +-
.../dashboard/i18n/locale/tr/mfa.json | 18 +++++++++---------
.../dashboard/i18n/locale/tr/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/uk/conversation.json | 7 +++++++
.../dashboard/i18n/locale/uk/login.json | 2 +-
.../dashboard/i18n/locale/uk/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/ur/conversation.json | 7 +++++++
.../dashboard/i18n/locale/ur/login.json | 2 +-
.../dashboard/i18n/locale/ur/signup.json | 11 ++++++++---
.../i18n/locale/ur_IN/conversation.json | 7 +++++++
.../dashboard/i18n/locale/ur_IN/login.json | 2 +-
.../dashboard/i18n/locale/ur_IN/signup.json | 11 ++++++++---
.../dashboard/i18n/locale/vi/conversation.json | 7 +++++++
.../dashboard/i18n/locale/vi/login.json | 2 +-
.../dashboard/i18n/locale/vi/signup.json | 9 +++++++--
.../i18n/locale/zh_CN/conversation.json | 7 +++++++
.../dashboard/i18n/locale/zh_CN/login.json | 2 +-
.../dashboard/i18n/locale/zh_CN/signup.json | 9 +++++++--
.../i18n/locale/zh_TW/conversation.json | 7 +++++++
.../dashboard/i18n/locale/zh_TW/login.json | 2 +-
.../dashboard/i18n/locale/zh_TW/signup.json | 9 +++++++--
156 files changed, 833 insertions(+), 209 deletions(-)
diff --git a/app/javascript/dashboard/i18n/locale/am/conversation.json b/app/javascript/dashboard/i18n/locale/am/conversation.json
index ecd318834..fed805271 100644
--- a/app/javascript/dashboard/i18n/locale/am/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/am/conversation.json
@@ -227,6 +227,13 @@
"YES": "Send",
"CANCEL": "Cancel"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team",
diff --git a/app/javascript/dashboard/i18n/locale/am/login.json b/app/javascript/dashboard/i18n/locale/am/login.json
index f347f2435..061284247 100644
--- a/app/javascript/dashboard/i18n/locale/am/login.json
+++ b/app/javascript/dashboard/i18n/locale/am/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Create a new account",
"SUBMIT": "Login",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/am/signup.json b/app/javascript/dashboard/i18n/locale/am/signup.json
index 501d9b87e..b0e5f5d27 100644
--- a/app/javascript/dashboard/i18n/locale/am/signup.json
+++ b/app/javascript/dashboard/i18n/locale/am/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Password",
"PLACEHOLDER": "Password",
"ERROR": "Password is too short.",
- "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character."
+ "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character.",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Confirm password",
"PLACEHOLDER": "Confirm password",
- "ERROR": "Password doesnot match."
+ "ERROR": "Passwords do not match."
},
"API": {
- "SUCCESS_MESSAGE": "Registration Successfull",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
},
"SUBMIT": "Create account",
diff --git a/app/javascript/dashboard/i18n/locale/ar/conversation.json b/app/javascript/dashboard/i18n/locale/ar/conversation.json
index a66530232..0ef95bbdc 100644
--- a/app/javascript/dashboard/i18n/locale/ar/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ar/conversation.json
@@ -227,6 +227,13 @@
"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"
}
},
"VISIBLE_TO_AGENTS": "ملاحظة خاصة: مرئية فقط لك ولأعضاء فريقك",
diff --git a/app/javascript/dashboard/i18n/locale/ar/login.json b/app/javascript/dashboard/i18n/locale/ar/login.json
index 3cb1f9504..247285442 100644
--- a/app/javascript/dashboard/i18n/locale/ar/login.json
+++ b/app/javascript/dashboard/i18n/locale/ar/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "إنشاء حساب جديد",
"SUBMIT": "تسجيل الدخول",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/ar/signup.json b/app/javascript/dashboard/i18n/locale/ar/signup.json
index 835f9f620..150312da6 100644
--- a/app/javascript/dashboard/i18n/locale/ar/signup.json
+++ b/app/javascript/dashboard/i18n/locale/ar/signup.json
@@ -27,15 +27,20 @@
"LABEL": "كلمة المرور",
"PLACEHOLDER": "كلمة المرور",
"ERROR": "كلمة المرور قصيرة جداً",
- "IS_INVALID_PASSWORD": "يجب أن تحتوي كلمة المرور على الأقل على حرف كبير واحد وحرف صغير واحد ورقم واحد وحرف خاص واحد"
+ "IS_INVALID_PASSWORD": "يجب أن تحتوي كلمة المرور على الأقل على حرف كبير واحد وحرف صغير واحد ورقم واحد وحرف خاص واحد",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "تأكيد كلمة المرور",
"PLACEHOLDER": "تأكيد كلمة المرور",
- "ERROR": "كلمة المرور غير متطابقة"
+ "ERROR": "كلمة المرور غير متطابقة."
},
"API": {
- "SUCCESS_MESSAGE": "تم التسجيل بنجاح",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "تعذر الاتصال بالخادم، الرجاء المحاولة مرة أخرى لاحقاً"
},
"SUBMIT": "إرسال",
diff --git a/app/javascript/dashboard/i18n/locale/az/conversation.json b/app/javascript/dashboard/i18n/locale/az/conversation.json
index 9fd39b70f..79d5ebc66 100644
--- a/app/javascript/dashboard/i18n/locale/az/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/az/conversation.json
@@ -227,6 +227,13 @@
"YES": "Send",
"CANCEL": "Cancel"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team",
diff --git a/app/javascript/dashboard/i18n/locale/az/login.json b/app/javascript/dashboard/i18n/locale/az/login.json
index f347f2435..061284247 100644
--- a/app/javascript/dashboard/i18n/locale/az/login.json
+++ b/app/javascript/dashboard/i18n/locale/az/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Create a new account",
"SUBMIT": "Login",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/az/signup.json b/app/javascript/dashboard/i18n/locale/az/signup.json
index 501d9b87e..b0e5f5d27 100644
--- a/app/javascript/dashboard/i18n/locale/az/signup.json
+++ b/app/javascript/dashboard/i18n/locale/az/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Password",
"PLACEHOLDER": "Password",
"ERROR": "Password is too short.",
- "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character."
+ "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character.",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Confirm password",
"PLACEHOLDER": "Confirm password",
- "ERROR": "Password doesnot match."
+ "ERROR": "Passwords do not match."
},
"API": {
- "SUCCESS_MESSAGE": "Registration Successfull",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
},
"SUBMIT": "Create account",
diff --git a/app/javascript/dashboard/i18n/locale/bg/conversation.json b/app/javascript/dashboard/i18n/locale/bg/conversation.json
index b8d15ad41..23da25e9d 100644
--- a/app/javascript/dashboard/i18n/locale/bg/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/bg/conversation.json
@@ -227,6 +227,13 @@
"YES": "Send",
"CANCEL": "Отмени"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team",
diff --git a/app/javascript/dashboard/i18n/locale/bg/login.json b/app/javascript/dashboard/i18n/locale/bg/login.json
index 825040257..87b2016d0 100644
--- a/app/javascript/dashboard/i18n/locale/bg/login.json
+++ b/app/javascript/dashboard/i18n/locale/bg/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Create new account",
"SUBMIT": "Login",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/bg/signup.json b/app/javascript/dashboard/i18n/locale/bg/signup.json
index 6c4c364fa..7e3e67bf1 100644
--- a/app/javascript/dashboard/i18n/locale/bg/signup.json
+++ b/app/javascript/dashboard/i18n/locale/bg/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Password",
"PLACEHOLDER": "Password",
"ERROR": "Password is too short",
- "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character"
+ "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Confirm Password",
"PLACEHOLDER": "Confirm Password",
- "ERROR": "Password doesnot match"
+ "ERROR": "Passwords do not match."
},
"API": {
- "SUCCESS_MESSAGE": "Registration Successfull",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Не можа да се свърже с Woot сървър. Моля, опитайте отново по-късно"
},
"SUBMIT": "Create account",
diff --git a/app/javascript/dashboard/i18n/locale/ca/conversation.json b/app/javascript/dashboard/i18n/locale/ca/conversation.json
index 4c692c7c5..5ddfd3c4a 100644
--- a/app/javascript/dashboard/i18n/locale/ca/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ca/conversation.json
@@ -227,6 +227,13 @@
"YES": "Envia",
"CANCEL": "Cancel·la"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Nota privada: Només és visible per tu i el vostre equip",
diff --git a/app/javascript/dashboard/i18n/locale/ca/login.json b/app/javascript/dashboard/i18n/locale/ca/login.json
index 6afe967f6..5de4ef8fc 100644
--- a/app/javascript/dashboard/i18n/locale/ca/login.json
+++ b/app/javascript/dashboard/i18n/locale/ca/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Crear un nou compte",
"SUBMIT": "Inicia la sessió",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/ca/signup.json b/app/javascript/dashboard/i18n/locale/ca/signup.json
index 5bb9067ba..0d3a1ba02 100644
--- a/app/javascript/dashboard/i18n/locale/ca/signup.json
+++ b/app/javascript/dashboard/i18n/locale/ca/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Contrasenya",
"PLACEHOLDER": "Contrasenya",
"ERROR": "La contrasenya és massa curta",
- "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character"
+ "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Confirma la contrasenya",
"PLACEHOLDER": "Confirma la contrasenya",
- "ERROR": "La contrasenya no coincideix."
+ "ERROR": "La contrasenya no coindeix."
},
"API": {
- "SUCCESS_MESSAGE": "Registrat correctament",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "No s'ha pogut connectar amb el servidor Woot. Torna-ho a provar més endavant"
},
"SUBMIT": "Crear un compte",
diff --git a/app/javascript/dashboard/i18n/locale/cs/conversation.json b/app/javascript/dashboard/i18n/locale/cs/conversation.json
index 12bea0321..b5eb3e61a 100644
--- a/app/javascript/dashboard/i18n/locale/cs/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/cs/conversation.json
@@ -227,6 +227,13 @@
"YES": "Poslat",
"CANCEL": "Zrušit"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Soukromá poznámka: Viditelné pouze pro vás a váš tým",
diff --git a/app/javascript/dashboard/i18n/locale/cs/login.json b/app/javascript/dashboard/i18n/locale/cs/login.json
index 42d455c9a..65c42b406 100644
--- a/app/javascript/dashboard/i18n/locale/cs/login.json
+++ b/app/javascript/dashboard/i18n/locale/cs/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Vytvořit nový účet",
"SUBMIT": "Přihlásit se",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/cs/signup.json b/app/javascript/dashboard/i18n/locale/cs/signup.json
index 01bab4804..4e0f5ffb9 100644
--- a/app/javascript/dashboard/i18n/locale/cs/signup.json
+++ b/app/javascript/dashboard/i18n/locale/cs/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Heslo",
"PLACEHOLDER": "Heslo",
"ERROR": "Heslo je příliš krátké",
- "IS_INVALID_PASSWORD": "Heslo by mělo obsahovat alespoň jedno velké písmeno, jedno malé písmeno, jedno číslo a jeden speciální znak"
+ "IS_INVALID_PASSWORD": "Heslo by mělo obsahovat alespoň jedno velké písmeno, jedno malé písmeno, jedno číslo a jeden speciální znak",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Potvrzení hesla",
"PLACEHOLDER": "Potvrzení hesla",
- "ERROR": "Heslo se neshoduje"
+ "ERROR": "Hesla se neshodují."
},
"API": {
- "SUCCESS_MESSAGE": "Registrace byla úspěšná",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Nelze se připojit k Woot serveru, opakujte akci později"
},
"SUBMIT": "Create account",
diff --git a/app/javascript/dashboard/i18n/locale/da/conversation.json b/app/javascript/dashboard/i18n/locale/da/conversation.json
index eb18255e7..35cae2a63 100644
--- a/app/javascript/dashboard/i18n/locale/da/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/da/conversation.json
@@ -227,6 +227,13 @@
"YES": "Send",
"CANCEL": "Annuller"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Privat Note: Kun synlig for dig og dit team",
diff --git a/app/javascript/dashboard/i18n/locale/da/login.json b/app/javascript/dashboard/i18n/locale/da/login.json
index 7f9b58047..6fbf51bbb 100644
--- a/app/javascript/dashboard/i18n/locale/da/login.json
+++ b/app/javascript/dashboard/i18n/locale/da/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Opret ny konto",
"SUBMIT": "Log Ind",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/da/signup.json b/app/javascript/dashboard/i18n/locale/da/signup.json
index 7b4f8ff35..553d18fd3 100644
--- a/app/javascript/dashboard/i18n/locale/da/signup.json
+++ b/app/javascript/dashboard/i18n/locale/da/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Adgangskode",
"PLACEHOLDER": "Adgangskode",
"ERROR": "Adgangskoden er for kort",
- "IS_INVALID_PASSWORD": "Adgangskoden skal indeholde mindst 1 stort bogstav, 1 lille bogstav, 1 nummer og 1 specialtegn"
+ "IS_INVALID_PASSWORD": "Adgangskoden skal indeholde mindst 1 stort bogstav, 1 lille bogstav, 1 nummer og 1 specialtegn",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Bekræft Adgangskode",
"PLACEHOLDER": "Bekræft Adgangskode",
- "ERROR": "Adgangskode stemmer ikke overens"
+ "ERROR": "Adgangskoder stemmer ikke overens."
},
"API": {
- "SUCCESS_MESSAGE": "Registrering Succesfuld",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Kunne ikke oprette forbindelse til Woot Server, Prøv igen senere"
},
"SUBMIT": "Opret en konto",
diff --git a/app/javascript/dashboard/i18n/locale/de/conversation.json b/app/javascript/dashboard/i18n/locale/de/conversation.json
index 719190eee..56b39edb9 100644
--- a/app/javascript/dashboard/i18n/locale/de/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/de/conversation.json
@@ -227,6 +227,13 @@
"YES": "Senden",
"CANCEL": "Abbrechen"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Privater Hinweis: Nur für Sie und Ihr Team sichtbar",
diff --git a/app/javascript/dashboard/i18n/locale/de/login.json b/app/javascript/dashboard/i18n/locale/de/login.json
index b9621736e..24c8dc351 100644
--- a/app/javascript/dashboard/i18n/locale/de/login.json
+++ b/app/javascript/dashboard/i18n/locale/de/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Neuen Account erstellen",
"SUBMIT": "Einloggen",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/de/signup.json b/app/javascript/dashboard/i18n/locale/de/signup.json
index ae2b35825..57e885325 100644
--- a/app/javascript/dashboard/i18n/locale/de/signup.json
+++ b/app/javascript/dashboard/i18n/locale/de/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Passwort",
"PLACEHOLDER": "Passwort",
"ERROR": "Das Passwort ist zu kurz",
- "IS_INVALID_PASSWORD": "Das Passwort sollte mindestens 1 Großbuchstaben, 1 Kleinbuchstaben, 1 Ziffer und 1 Sonderzeichen enthalten"
+ "IS_INVALID_PASSWORD": "Das Passwort sollte mindestens 1 Großbuchstaben, 1 Kleinbuchstaben, 1 Ziffer und 1 Sonderzeichen enthalten",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Bestätige das Passwort",
"PLACEHOLDER": "Bestätige das Passwort",
- "ERROR": "Passwort stimmt nicht überein"
+ "ERROR": "Passwörter stimmen nicht überein."
},
"API": {
- "SUCCESS_MESSAGE": "Registrierung erfolgreich",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Es konnte keine Verbindung zum Woot Server hergestellt werden. Bitte versuchen Sie es später erneut"
},
"SUBMIT": "Konto erstellen",
diff --git a/app/javascript/dashboard/i18n/locale/el/conversation.json b/app/javascript/dashboard/i18n/locale/el/conversation.json
index 94017c2c2..46de9b100 100644
--- a/app/javascript/dashboard/i18n/locale/el/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/el/conversation.json
@@ -227,6 +227,13 @@
"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"
}
},
"VISIBLE_TO_AGENTS": "Ιδιωτική Σημείωση: Ορατή μόνο σε σας και την ομάδα σας",
diff --git a/app/javascript/dashboard/i18n/locale/el/login.json b/app/javascript/dashboard/i18n/locale/el/login.json
index caed6ae8c..8d3be04f5 100644
--- a/app/javascript/dashboard/i18n/locale/el/login.json
+++ b/app/javascript/dashboard/i18n/locale/el/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Δημιουργία νέου Λογαριασμού",
"SUBMIT": "Είσοδος",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/el/signup.json b/app/javascript/dashboard/i18n/locale/el/signup.json
index db16157a3..28d9d5ca8 100644
--- a/app/javascript/dashboard/i18n/locale/el/signup.json
+++ b/app/javascript/dashboard/i18n/locale/el/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Κωδικός",
"PLACEHOLDER": "Κωδικός",
"ERROR": "Ο κωδικός είναι πολύ σύντομος",
- "IS_INVALID_PASSWORD": "Ο κωδικός πρόσβασης πρέπει να περιέχει τουλάχιστον 1 κεφαλαίο γράμμα, 1 πεζό γράμμα, 1 αριθμό και 1 ειδικό χαρακτήρα"
+ "IS_INVALID_PASSWORD": "Ο κωδικός πρόσβασης πρέπει να περιέχει τουλάχιστον 1 κεφαλαίο γράμμα, 1 πεζό γράμμα, 1 αριθμό και 1 ειδικό χαρακτήρα",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Επιβεβαίωση κωδικού",
"PLACEHOLDER": "Επιβεβαίωση κωδικού",
- "ERROR": "Οι κωδικοί δεν συμφωνούν"
+ "ERROR": "Οι κωδικοί δεν ταιριάζουν."
},
"API": {
- "SUCCESS_MESSAGE": "Επιτυχής καταχώρηση",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Αδυναμία σύνδεσης με τον Woot Server, Παρακαλώ προσπαθήστε αργότερα"
},
"SUBMIT": "Create account",
diff --git a/app/javascript/dashboard/i18n/locale/es/conversation.json b/app/javascript/dashboard/i18n/locale/es/conversation.json
index 5b02ceaba..c62c75667 100644
--- a/app/javascript/dashboard/i18n/locale/es/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/es/conversation.json
@@ -227,6 +227,13 @@
"YES": "Enviar",
"CANCEL": "Cancelar"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Nota privada: solo visible para ti y tu equipo",
diff --git a/app/javascript/dashboard/i18n/locale/es/login.json b/app/javascript/dashboard/i18n/locale/es/login.json
index 6ec932f6b..f174044e5 100644
--- a/app/javascript/dashboard/i18n/locale/es/login.json
+++ b/app/javascript/dashboard/i18n/locale/es/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Crear nueva cuenta",
"SUBMIT": "Iniciar sesión",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/es/signup.json b/app/javascript/dashboard/i18n/locale/es/signup.json
index 502ccd4b2..fe5e712ef 100644
--- a/app/javascript/dashboard/i18n/locale/es/signup.json
+++ b/app/javascript/dashboard/i18n/locale/es/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Contraseña",
"PLACEHOLDER": "Contraseña",
"ERROR": "La contraseña es demasiado corta",
- "IS_INVALID_PASSWORD": "La contraseña debe contener al menos 1 letra mayúscula, 1 letra minúscula, 1 número y 1 carácter especial"
+ "IS_INVALID_PASSWORD": "La contraseña debe contener al menos 1 letra mayúscula, 1 letra minúscula, 1 número y 1 carácter especial",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Confirmar contraseña",
"PLACEHOLDER": "Confirmar contraseña",
- "ERROR": "La contraseña no coincide"
+ "ERROR": "Las contraseñas no coinciden."
},
"API": {
- "SUCCESS_MESSAGE": "Registro Exitoso",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "No se pudo conectar al servidor Woot, por favor inténtalo de nuevo más tarde"
},
"SUBMIT": "Crear una cuenta",
diff --git a/app/javascript/dashboard/i18n/locale/fa/conversation.json b/app/javascript/dashboard/i18n/locale/fa/conversation.json
index 864674c88..45bc42a22 100644
--- a/app/javascript/dashboard/i18n/locale/fa/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/fa/conversation.json
@@ -227,6 +227,13 @@
"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"
}
},
"VISIBLE_TO_AGENTS": "یادداشت خصوصی: فقط برای شما و تیم شما قابل مشاهده است",
diff --git a/app/javascript/dashboard/i18n/locale/fa/login.json b/app/javascript/dashboard/i18n/locale/fa/login.json
index b2bbcf133..3ad23c7cd 100644
--- a/app/javascript/dashboard/i18n/locale/fa/login.json
+++ b/app/javascript/dashboard/i18n/locale/fa/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "حساب جدید بسازید",
"SUBMIT": "ورود",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/fa/signup.json b/app/javascript/dashboard/i18n/locale/fa/signup.json
index 2277872f1..0163a7e85 100644
--- a/app/javascript/dashboard/i18n/locale/fa/signup.json
+++ b/app/javascript/dashboard/i18n/locale/fa/signup.json
@@ -27,15 +27,20 @@
"LABEL": "رمز عبور",
"PLACEHOLDER": "رمز عبور",
"ERROR": "رمز عبور خیلی کوتاه است",
- "IS_INVALID_PASSWORD": "رمز عبور باید شامل حداقل ۱ حرف بزرگ، ۱ حرف کوچک، ۱ عدد و ۱ کاراکتر خاص باشد"
+ "IS_INVALID_PASSWORD": "رمز عبور باید شامل حداقل ۱ حرف بزرگ، ۱ حرف کوچک، ۱ عدد و ۱ کاراکتر خاص باشد",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "تکرار رمز عبور",
"PLACEHOLDER": "تکرار رمز عبور",
- "ERROR": "رمز عبور و تکرار رمز عبور یکسان نیستند"
+ "ERROR": "تکرار رمز عبور میبایست با رمز عبور یکسان باشد."
},
"API": {
- "SUCCESS_MESSAGE": "ثبت نام با موفقیت انجام شد",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "ارتباط با سرور برقرار نشد، لطفا بعدا امتحان کنید"
},
"SUBMIT": "ایجاد حساب کاربری",
diff --git a/app/javascript/dashboard/i18n/locale/fi/conversation.json b/app/javascript/dashboard/i18n/locale/fi/conversation.json
index 929b96c41..b4c67df36 100644
--- a/app/javascript/dashboard/i18n/locale/fi/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/fi/conversation.json
@@ -227,6 +227,13 @@
"YES": "Lähetä",
"CANCEL": "Peruuta"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Yksityinen huomautus: Näkyy vain sinulle ja tiimillesi",
diff --git a/app/javascript/dashboard/i18n/locale/fi/login.json b/app/javascript/dashboard/i18n/locale/fi/login.json
index 93bca4652..6c6a79d0b 100644
--- a/app/javascript/dashboard/i18n/locale/fi/login.json
+++ b/app/javascript/dashboard/i18n/locale/fi/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Luo uusi tili",
"SUBMIT": "Kirjaudu",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/fi/signup.json b/app/javascript/dashboard/i18n/locale/fi/signup.json
index 784dcbe86..4afef6704 100644
--- a/app/javascript/dashboard/i18n/locale/fi/signup.json
+++ b/app/javascript/dashboard/i18n/locale/fi/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Salasana",
"PLACEHOLDER": "Salasana",
"ERROR": "Salasana on liian lyhyt",
- "IS_INVALID_PASSWORD": "Salasanan tulee sisältää vähintään 1 iso kirjain, 1 pieni kirjain, 1 numero ja 1 erikoismerkki."
+ "IS_INVALID_PASSWORD": "Salasanan tulee sisältää vähintään 1 iso kirjain, 1 pieni kirjain, 1 numero ja 1 erikoismerkki.",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Vahvista salasana",
"PLACEHOLDER": "Vahvista salasana",
- "ERROR": "Salasanat eivät täsmää"
+ "ERROR": "Salasanat eivät täsmää."
},
"API": {
- "SUCCESS_MESSAGE": "Rekisteröinti onnistui",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Yhteyden muodostaminen Woot-palvelimelle ei onnistunut, yritä myöhemmin uudelleen"
},
"SUBMIT": "Create account",
diff --git a/app/javascript/dashboard/i18n/locale/fr/conversation.json b/app/javascript/dashboard/i18n/locale/fr/conversation.json
index 101a5f7f7..bde660851 100644
--- a/app/javascript/dashboard/i18n/locale/fr/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/fr/conversation.json
@@ -227,6 +227,13 @@
"YES": "Envoyer",
"CANCEL": "Annuler"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Note privée : uniquement visible par vous et votre équipe",
diff --git a/app/javascript/dashboard/i18n/locale/fr/login.json b/app/javascript/dashboard/i18n/locale/fr/login.json
index ebc44bc9a..a1aa8425e 100644
--- a/app/javascript/dashboard/i18n/locale/fr/login.json
+++ b/app/javascript/dashboard/i18n/locale/fr/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Créer un nouveau compte",
"SUBMIT": "Se connecter",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/fr/signup.json b/app/javascript/dashboard/i18n/locale/fr/signup.json
index b3e32f4e1..64b2a5a1a 100644
--- a/app/javascript/dashboard/i18n/locale/fr/signup.json
+++ b/app/javascript/dashboard/i18n/locale/fr/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Mot de passe",
"PLACEHOLDER": "Mot de passe",
"ERROR": "Le mot de passe est trop court",
- "IS_INVALID_PASSWORD": "Le mot de passe doit contenir au moins 1 lettre majuscule, 1 lettre minuscule, 1 chiffre et 1 caractère spécial"
+ "IS_INVALID_PASSWORD": "Le mot de passe doit contenir au moins 1 lettre majuscule, 1 lettre minuscule, 1 chiffre et 1 caractère spécial",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Confirmer le mot de passe",
"PLACEHOLDER": "Confirmer le mot de passe",
- "ERROR": "Les mots de passe ne correspondent pas"
+ "ERROR": "Les mots de passe ne correspondent pas."
},
"API": {
- "SUCCESS_MESSAGE": "Inscription réussie",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Impossible de se connecter au serveur Woot, veuillez réessayer plus tard"
},
"SUBMIT": "Créer un compte",
diff --git a/app/javascript/dashboard/i18n/locale/he/conversation.json b/app/javascript/dashboard/i18n/locale/he/conversation.json
index 55eb3e99f..680924236 100644
--- a/app/javascript/dashboard/i18n/locale/he/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/he/conversation.json
@@ -227,6 +227,13 @@
"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"
}
},
"VISIBLE_TO_AGENTS": "פתקים פרטיים: רק אתה והצוות שלך יכולים לראות",
diff --git a/app/javascript/dashboard/i18n/locale/he/login.json b/app/javascript/dashboard/i18n/locale/he/login.json
index 13ba68de7..567c6b5b7 100644
--- a/app/javascript/dashboard/i18n/locale/he/login.json
+++ b/app/javascript/dashboard/i18n/locale/he/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "צור חשבון",
"SUBMIT": "התחבר",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/he/signup.json b/app/javascript/dashboard/i18n/locale/he/signup.json
index 536e3b1f2..c4ef04332 100644
--- a/app/javascript/dashboard/i18n/locale/he/signup.json
+++ b/app/javascript/dashboard/i18n/locale/he/signup.json
@@ -27,15 +27,20 @@
"LABEL": "סיסמה",
"PLACEHOLDER": "סיסמה",
"ERROR": "הסיסמה קצרה מדי",
- "IS_INVALID_PASSWORD": "הסיסמה צריכה להכיל לפחות אות אחת גדולה, אות קטנה אחת, מספר אחד ותו מיוחד אחד"
+ "IS_INVALID_PASSWORD": "הסיסמה צריכה להכיל לפחות אות אחת גדולה, אות קטנה אחת, מספר אחד ותו מיוחד אחד",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "אמת סיסמה",
"PLACEHOLDER": "אמת סיסמה",
- "ERROR": "סיסמה לא מתאימה"
+ "ERROR": "סיסמאות לא תואמות"
},
"API": {
- "SUCCESS_MESSAGE": "ההרשמה הצליחה",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "לא ניתן להתחבר לשרת Woot, נסה שוב מאוחר יותר"
},
"SUBMIT": "צור חשבון",
diff --git a/app/javascript/dashboard/i18n/locale/hi/conversation.json b/app/javascript/dashboard/i18n/locale/hi/conversation.json
index 9fd39b70f..79d5ebc66 100644
--- a/app/javascript/dashboard/i18n/locale/hi/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/hi/conversation.json
@@ -227,6 +227,13 @@
"YES": "Send",
"CANCEL": "Cancel"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team",
diff --git a/app/javascript/dashboard/i18n/locale/hi/login.json b/app/javascript/dashboard/i18n/locale/hi/login.json
index c5084de10..8bf01d710 100644
--- a/app/javascript/dashboard/i18n/locale/hi/login.json
+++ b/app/javascript/dashboard/i18n/locale/hi/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Create new account",
"SUBMIT": "Login",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/hi/signup.json b/app/javascript/dashboard/i18n/locale/hi/signup.json
index 5179ee062..aa96873e1 100644
--- a/app/javascript/dashboard/i18n/locale/hi/signup.json
+++ b/app/javascript/dashboard/i18n/locale/hi/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Password",
"PLACEHOLDER": "Password",
"ERROR": "Password is too short",
- "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character"
+ "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Confirm Password",
"PLACEHOLDER": "Confirm Password",
- "ERROR": "Password doesnot match"
+ "ERROR": "Passwords do not match."
},
"API": {
- "SUCCESS_MESSAGE": "Registration Successfull",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Could not connect to Woot Server, Please try again later"
},
"SUBMIT": "Create account",
diff --git a/app/javascript/dashboard/i18n/locale/hr/conversation.json b/app/javascript/dashboard/i18n/locale/hr/conversation.json
index e20527813..496f294ce 100644
--- a/app/javascript/dashboard/i18n/locale/hr/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/hr/conversation.json
@@ -227,6 +227,13 @@
"YES": "Send",
"CANCEL": "Odustani"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team",
diff --git a/app/javascript/dashboard/i18n/locale/hr/login.json b/app/javascript/dashboard/i18n/locale/hr/login.json
index c5084de10..8bf01d710 100644
--- a/app/javascript/dashboard/i18n/locale/hr/login.json
+++ b/app/javascript/dashboard/i18n/locale/hr/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Create new account",
"SUBMIT": "Login",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/hr/signup.json b/app/javascript/dashboard/i18n/locale/hr/signup.json
index 5179ee062..9b2ff2cf1 100644
--- a/app/javascript/dashboard/i18n/locale/hr/signup.json
+++ b/app/javascript/dashboard/i18n/locale/hr/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Password",
"PLACEHOLDER": "Password",
"ERROR": "Password is too short",
- "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character"
+ "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Confirm Password",
"PLACEHOLDER": "Confirm Password",
- "ERROR": "Password doesnot match"
+ "ERROR": "Lozinke se ne poklapaju."
},
"API": {
- "SUCCESS_MESSAGE": "Registration Successfull",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Could not connect to Woot Server, Please try again later"
},
"SUBMIT": "Create account",
diff --git a/app/javascript/dashboard/i18n/locale/hu/conversation.json b/app/javascript/dashboard/i18n/locale/hu/conversation.json
index 49220702e..78cae2bda 100644
--- a/app/javascript/dashboard/i18n/locale/hu/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/hu/conversation.json
@@ -227,6 +227,13 @@
"YES": "Elküldés",
"CANCEL": "Mégse"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Privát megjegyzés: csak Neked és a csapat tagjainak látható",
diff --git a/app/javascript/dashboard/i18n/locale/hu/login.json b/app/javascript/dashboard/i18n/locale/hu/login.json
index 1daf099c0..3bd51284b 100644
--- a/app/javascript/dashboard/i18n/locale/hu/login.json
+++ b/app/javascript/dashboard/i18n/locale/hu/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Új fiók létrehozása",
"SUBMIT": "Bejelentkezés",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/hu/signup.json b/app/javascript/dashboard/i18n/locale/hu/signup.json
index 5d76848b9..01e0cfa50 100644
--- a/app/javascript/dashboard/i18n/locale/hu/signup.json
+++ b/app/javascript/dashboard/i18n/locale/hu/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Jelszó",
"PLACEHOLDER": "Jelszó",
"ERROR": "A jelszó túl rövid",
- "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character"
+ "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Jelszó megerősítése",
"PLACEHOLDER": "Jelszó megerősítése",
- "ERROR": "A jelszavak nem egyeznek"
+ "ERROR": "A jelszavak nem egyeznek."
},
"API": {
- "SUCCESS_MESSAGE": "Sikeres regisztráció",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Nem sikerült csatlakozni a Woot szerverhez, kérjük próbáld később"
},
"SUBMIT": "Fiók létrehozása",
diff --git a/app/javascript/dashboard/i18n/locale/hy/conversation.json b/app/javascript/dashboard/i18n/locale/hy/conversation.json
index 9fd39b70f..79d5ebc66 100644
--- a/app/javascript/dashboard/i18n/locale/hy/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/hy/conversation.json
@@ -227,6 +227,13 @@
"YES": "Send",
"CANCEL": "Cancel"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team",
diff --git a/app/javascript/dashboard/i18n/locale/hy/login.json b/app/javascript/dashboard/i18n/locale/hy/login.json
index c5084de10..8bf01d710 100644
--- a/app/javascript/dashboard/i18n/locale/hy/login.json
+++ b/app/javascript/dashboard/i18n/locale/hy/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Create new account",
"SUBMIT": "Login",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/hy/signup.json b/app/javascript/dashboard/i18n/locale/hy/signup.json
index 5179ee062..f6a6e5b2b 100644
--- a/app/javascript/dashboard/i18n/locale/hy/signup.json
+++ b/app/javascript/dashboard/i18n/locale/hy/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Password",
"PLACEHOLDER": "Password",
"ERROR": "Password is too short",
- "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character"
+ "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Confirm Password",
"PLACEHOLDER": "Confirm Password",
- "ERROR": "Password doesnot match"
+ "ERROR": "Passwords do not match"
},
"API": {
- "SUCCESS_MESSAGE": "Registration Successfull",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Could not connect to Woot Server, Please try again later"
},
"SUBMIT": "Create account",
diff --git a/app/javascript/dashboard/i18n/locale/id/conversation.json b/app/javascript/dashboard/i18n/locale/id/conversation.json
index e9197b164..493f1fb2b 100644
--- a/app/javascript/dashboard/i18n/locale/id/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/id/conversation.json
@@ -227,6 +227,13 @@
"YES": "Kirim",
"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"
}
},
"VISIBLE_TO_AGENTS": "Catatan Pribadi: Hanya terlihat oleh Anda dan tim Anda",
diff --git a/app/javascript/dashboard/i18n/locale/id/login.json b/app/javascript/dashboard/i18n/locale/id/login.json
index feaf9c267..1b86fbabb 100644
--- a/app/javascript/dashboard/i18n/locale/id/login.json
+++ b/app/javascript/dashboard/i18n/locale/id/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Buat akun baru",
"SUBMIT": "Masuk",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/id/signup.json b/app/javascript/dashboard/i18n/locale/id/signup.json
index f3ac4597a..dac2beec5 100644
--- a/app/javascript/dashboard/i18n/locale/id/signup.json
+++ b/app/javascript/dashboard/i18n/locale/id/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Kata Sandi",
"PLACEHOLDER": "Kata Sandi",
"ERROR": "Kata sandi terlalu pendek",
- "IS_INVALID_PASSWORD": "Kata sandi harus mengandung setidaknya 1 huruf kapital, 1 huruf kecil, 1 angka, dan 1 karakter khusus"
+ "IS_INVALID_PASSWORD": "Kata sandi harus mengandung setidaknya 1 huruf kapital, 1 huruf kecil, 1 angka, dan 1 karakter khusus",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Konfirmasi Kata Sandi",
"PLACEHOLDER": "Konfirmasi Kata Sandi",
- "ERROR": "Kata Sandi tidak cocok"
+ "ERROR": "Kata Sandi tidak cocok."
},
"API": {
- "SUCCESS_MESSAGE": "Pendaftaran Berhasil",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Tidak dapat terhubung ke Server Woot, Silahkan coba lagi nanti"
},
"SUBMIT": "Buat akun",
diff --git a/app/javascript/dashboard/i18n/locale/is/conversation.json b/app/javascript/dashboard/i18n/locale/is/conversation.json
index 91f0421db..fbea19fd8 100644
--- a/app/javascript/dashboard/i18n/locale/is/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/is/conversation.json
@@ -227,6 +227,13 @@
"YES": "Send",
"CANCEL": "Hætta við"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Einkaglósa: Aðeins sýnilegt þér og teymi þínu",
diff --git a/app/javascript/dashboard/i18n/locale/is/login.json b/app/javascript/dashboard/i18n/locale/is/login.json
index 589daccd6..744847871 100644
--- a/app/javascript/dashboard/i18n/locale/is/login.json
+++ b/app/javascript/dashboard/i18n/locale/is/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Stofna nýjan aðgang",
"SUBMIT": "Innskráning",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/is/signup.json b/app/javascript/dashboard/i18n/locale/is/signup.json
index de1840e13..e199471d2 100644
--- a/app/javascript/dashboard/i18n/locale/is/signup.json
+++ b/app/javascript/dashboard/i18n/locale/is/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Lykilorð",
"PLACEHOLDER": "Lykilorð",
"ERROR": "Lykilorið er of stutt",
- "IS_INVALID_PASSWORD": "Lykilorð ætti að innihalda að minnsta kosti 1 hástaf, 1 lágstaf, 1 tölustaf og 1 tákn"
+ "IS_INVALID_PASSWORD": "Lykilorð ætti að innihalda að minnsta kosti 1 hástaf, 1 lágstaf, 1 tölustaf og 1 tákn",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Staðfesta Lykilorð",
"PLACEHOLDER": "Staðfesta Lykilorð",
- "ERROR": "Lykilorðin stemma ekki"
+ "ERROR": "Passwords do not match."
},
"API": {
- "SUCCESS_MESSAGE": "Nýskráning tókst",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Náði ekki að tengjast við netþjóna Woot, vinsamlegast reynið aftur"
},
"SUBMIT": "Create account",
diff --git a/app/javascript/dashboard/i18n/locale/it/conversation.json b/app/javascript/dashboard/i18n/locale/it/conversation.json
index 5eccb170e..f399dbdfc 100644
--- a/app/javascript/dashboard/i18n/locale/it/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/it/conversation.json
@@ -227,6 +227,13 @@
"YES": "Invia",
"CANCEL": "annulla"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Nota privata: visibile solo a te e al tuo team",
diff --git a/app/javascript/dashboard/i18n/locale/it/login.json b/app/javascript/dashboard/i18n/locale/it/login.json
index 7211e7363..355a1ec05 100644
--- a/app/javascript/dashboard/i18n/locale/it/login.json
+++ b/app/javascript/dashboard/i18n/locale/it/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Crea un nuovo account",
"SUBMIT": "Accedi",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/it/signup.json b/app/javascript/dashboard/i18n/locale/it/signup.json
index b02b6ba98..92480be2c 100644
--- a/app/javascript/dashboard/i18n/locale/it/signup.json
+++ b/app/javascript/dashboard/i18n/locale/it/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Password",
"PLACEHOLDER": "Password",
"ERROR": "Password troppo corta.",
- "IS_INVALID_PASSWORD": "La password dovrebbe contenere almeno 1 lettera maiuscola, 1 lettera minuscola, 1 numero e 1 carattere speciale."
+ "IS_INVALID_PASSWORD": "La password dovrebbe contenere almeno 1 lettera maiuscola, 1 lettera minuscola, 1 numero e 1 carattere speciale.",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Conferma password",
"PLACEHOLDER": "Conferma password",
- "ERROR": "La password non corrisponde."
+ "ERROR": "Le password non corrispondono."
},
"API": {
- "SUCCESS_MESSAGE": "Registrazione riuscita",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Impossibile connettersi al server Woot, riprova più tardi."
},
"SUBMIT": "Create account",
diff --git a/app/javascript/dashboard/i18n/locale/ja/conversation.json b/app/javascript/dashboard/i18n/locale/ja/conversation.json
index 99dde2a7a..4fab79533 100644
--- a/app/javascript/dashboard/i18n/locale/ja/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ja/conversation.json
@@ -227,6 +227,13 @@
"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"
}
},
"VISIBLE_TO_AGENTS": "非公開設定の注意:あなたとあなたのチームのみに表示されます",
diff --git a/app/javascript/dashboard/i18n/locale/ja/login.json b/app/javascript/dashboard/i18n/locale/ja/login.json
index 4f4fd278a..8eb4a7c4a 100644
--- a/app/javascript/dashboard/i18n/locale/ja/login.json
+++ b/app/javascript/dashboard/i18n/locale/ja/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "新しいアカウントを作成",
"SUBMIT": "ログイン",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/ja/signup.json b/app/javascript/dashboard/i18n/locale/ja/signup.json
index f69b43f7d..19f5d28fd 100644
--- a/app/javascript/dashboard/i18n/locale/ja/signup.json
+++ b/app/javascript/dashboard/i18n/locale/ja/signup.json
@@ -27,7 +27,12 @@
"LABEL": "パスワード",
"PLACEHOLDER": "パスワード",
"ERROR": "パスワードが短すぎます",
- "IS_INVALID_PASSWORD": "パスワードは少なくとも1つの大文字、1つの小文字、1つの数字、1つの特殊文字を含む必要があります"
+ "IS_INVALID_PASSWORD": "パスワードは少なくとも1つの大文字、1つの小文字、1つの数字、1つの特殊文字を含む必要があります",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "パスワードの確認",
@@ -35,7 +40,7 @@
"ERROR": "パスワードが一致しません"
},
"API": {
- "SUCCESS_MESSAGE": "登録に成功しました",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Wootサーバーに接続できませんでした。後でもう一度お試しください。"
},
"SUBMIT": "アカウントを作成",
diff --git a/app/javascript/dashboard/i18n/locale/ka/conversation.json b/app/javascript/dashboard/i18n/locale/ka/conversation.json
index 9fd39b70f..79d5ebc66 100644
--- a/app/javascript/dashboard/i18n/locale/ka/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ka/conversation.json
@@ -227,6 +227,13 @@
"YES": "Send",
"CANCEL": "Cancel"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team",
diff --git a/app/javascript/dashboard/i18n/locale/ka/login.json b/app/javascript/dashboard/i18n/locale/ka/login.json
index ab3c798c5..a34ed1783 100644
--- a/app/javascript/dashboard/i18n/locale/ka/login.json
+++ b/app/javascript/dashboard/i18n/locale/ka/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Create new account",
"SUBMIT": "Login",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/ka/signup.json b/app/javascript/dashboard/i18n/locale/ka/signup.json
index 5179ee062..aa96873e1 100644
--- a/app/javascript/dashboard/i18n/locale/ka/signup.json
+++ b/app/javascript/dashboard/i18n/locale/ka/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Password",
"PLACEHOLDER": "Password",
"ERROR": "Password is too short",
- "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character"
+ "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Confirm Password",
"PLACEHOLDER": "Confirm Password",
- "ERROR": "Password doesnot match"
+ "ERROR": "Passwords do not match."
},
"API": {
- "SUCCESS_MESSAGE": "Registration Successfull",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Could not connect to Woot Server, Please try again later"
},
"SUBMIT": "Create account",
diff --git a/app/javascript/dashboard/i18n/locale/ko/conversation.json b/app/javascript/dashboard/i18n/locale/ko/conversation.json
index 1278ad79e..0f98014c0 100644
--- a/app/javascript/dashboard/i18n/locale/ko/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ko/conversation.json
@@ -227,6 +227,13 @@
"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"
}
},
"VISIBLE_TO_AGENTS": "개인 노트: 귀하와 귀하의 팀만 볼 수 있음",
diff --git a/app/javascript/dashboard/i18n/locale/ko/login.json b/app/javascript/dashboard/i18n/locale/ko/login.json
index fa8019bc6..a9f56cfef 100644
--- a/app/javascript/dashboard/i18n/locale/ko/login.json
+++ b/app/javascript/dashboard/i18n/locale/ko/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "계정 생성",
"SUBMIT": "로그인",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/ko/signup.json b/app/javascript/dashboard/i18n/locale/ko/signup.json
index 833b19170..89de09fdd 100644
--- a/app/javascript/dashboard/i18n/locale/ko/signup.json
+++ b/app/javascript/dashboard/i18n/locale/ko/signup.json
@@ -27,15 +27,20 @@
"LABEL": "비밀번호",
"PLACEHOLDER": "비밀번호",
"ERROR": "비밀번호가 너무 짧음",
- "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character"
+ "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "비밀번호 확인",
"PLACEHOLDER": "비밀번호 확인",
- "ERROR": "비밀번호가 일치하지 않음"
+ "ERROR": "비밀번호가 일치하지 않음."
},
"API": {
- "SUCCESS_MESSAGE": "등록 성공",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Woot Server에 연결할 수 없음. 나중에 다시 시도하십시오."
},
"SUBMIT": "Create account",
diff --git a/app/javascript/dashboard/i18n/locale/lt/conversation.json b/app/javascript/dashboard/i18n/locale/lt/conversation.json
index eb8a0d144..a9946f656 100644
--- a/app/javascript/dashboard/i18n/locale/lt/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/lt/conversation.json
@@ -227,6 +227,13 @@
"YES": "Siųsti",
"CANCEL": "Atšaukti"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Privati pastaba: matoma tik jums ir jūsų komandai",
diff --git a/app/javascript/dashboard/i18n/locale/lt/login.json b/app/javascript/dashboard/i18n/locale/lt/login.json
index 689bcb04e..51daf0f0e 100644
--- a/app/javascript/dashboard/i18n/locale/lt/login.json
+++ b/app/javascript/dashboard/i18n/locale/lt/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Sukurti naują paskyrą",
"SUBMIT": "Prisijungti",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/lt/signup.json b/app/javascript/dashboard/i18n/locale/lt/signup.json
index 7f28098ee..a1798ba20 100644
--- a/app/javascript/dashboard/i18n/locale/lt/signup.json
+++ b/app/javascript/dashboard/i18n/locale/lt/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Slaptažodis",
"PLACEHOLDER": "Slaptažodis",
"ERROR": "Password is too short",
- "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character"
+ "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Confirm Password",
"PLACEHOLDER": "Confirm Password",
- "ERROR": "Password doesnot match"
+ "ERROR": "Slaptažodžiai nesutampa."
},
"API": {
- "SUCCESS_MESSAGE": "Registracija sėkminga",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Could not connect to Woot Server, Please try again later"
},
"SUBMIT": "Sukurti paskyrą",
diff --git a/app/javascript/dashboard/i18n/locale/lv/conversation.json b/app/javascript/dashboard/i18n/locale/lv/conversation.json
index e8bf5e497..1985f71d8 100644
--- a/app/javascript/dashboard/i18n/locale/lv/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/lv/conversation.json
@@ -227,6 +227,13 @@
"YES": "Nosūtīt",
"CANCEL": "Atcelt"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Privāta Piezīme: Redzama tikai Jums un Jūsu komandai",
diff --git a/app/javascript/dashboard/i18n/locale/lv/login.json b/app/javascript/dashboard/i18n/locale/lv/login.json
index dfc994638..12c87ed0a 100644
--- a/app/javascript/dashboard/i18n/locale/lv/login.json
+++ b/app/javascript/dashboard/i18n/locale/lv/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Izveidot jaunu kontu",
"SUBMIT": "Pierakstīties",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/lv/signup.json b/app/javascript/dashboard/i18n/locale/lv/signup.json
index 6310e1203..768f6e298 100644
--- a/app/javascript/dashboard/i18n/locale/lv/signup.json
+++ b/app/javascript/dashboard/i18n/locale/lv/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Parole",
"PLACEHOLDER": "Parole",
"ERROR": "Parole ir pārāk īsa",
- "IS_INVALID_PASSWORD": "Parolei ir jāsatur vismaz 1 lielais burts, 1 mazais burts, 1 cipars un 1 speciālā rakstzīme."
+ "IS_INVALID_PASSWORD": "Parolei ir jāsatur vismaz 1 lielais burts, 1 mazais burts, 1 cipars un 1 speciālā rakstzīme.",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Apstipriniet paroli",
"PLACEHOLDER": "Apstipriniet paroli",
- "ERROR": "Parole nesakrīt."
+ "ERROR": "Paroles nesakrīt."
},
"API": {
- "SUCCESS_MESSAGE": "Reģistrācija sekmīga",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Nevarēja izveidot savienojumu ar Woot serveri. Lūdzu mēģiniet vēlreiz."
},
"SUBMIT": "Izveidot kontu",
diff --git a/app/javascript/dashboard/i18n/locale/ml/conversation.json b/app/javascript/dashboard/i18n/locale/ml/conversation.json
index 0680bf250..22c92c510 100644
--- a/app/javascript/dashboard/i18n/locale/ml/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ml/conversation.json
@@ -227,6 +227,13 @@
"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"
}
},
"VISIBLE_TO_AGENTS": "സ്വകാര്യ കുറിപ്പ്: നിങ്ങൾക്കും നിങ്ങളുടെ ടീമിനും മാത്രം ദൃശ്യമാണ്",
diff --git a/app/javascript/dashboard/i18n/locale/ml/login.json b/app/javascript/dashboard/i18n/locale/ml/login.json
index 5bc462302..b168600f1 100644
--- a/app/javascript/dashboard/i18n/locale/ml/login.json
+++ b/app/javascript/dashboard/i18n/locale/ml/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "പുതിയ അക്കൗണ്ട് സൃഷ്ടിക്കുക",
"SUBMIT": "സൈൻ ഇൻ",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/ml/signup.json b/app/javascript/dashboard/i18n/locale/ml/signup.json
index 5ebd6ec1e..27ff6f388 100644
--- a/app/javascript/dashboard/i18n/locale/ml/signup.json
+++ b/app/javascript/dashboard/i18n/locale/ml/signup.json
@@ -27,15 +27,20 @@
"LABEL": "പാസ്വേഡ്",
"PLACEHOLDER": "പാസ്വേഡ്",
"ERROR": "പാസ്വേഡ് വളരെ ചെറുതാണ്",
- "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character"
+ "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "പാസ്വേഡ് സ്ഥിരീകരിക്കുക",
"PLACEHOLDER": "പാസ്വേഡ് സ്ഥിരീകരിക്കുക",
- "ERROR": "പാസ്വേഡുകൾ പൊരുത്തപ്പെടുന്നില്ല"
+ "ERROR": "പാസ്വേഡുകൾ പൊരുത്തപ്പെടുന്നില്ല."
},
"API": {
- "SUCCESS_MESSAGE": "രജിസ്ട്രേഷൻ വിജയകരമാണ്",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "സെർവറിലേക്ക് കണക്റ്റുചെയ്യാനായില്ല, ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക"
},
"SUBMIT": "Create account",
diff --git a/app/javascript/dashboard/i18n/locale/ms/conversation.json b/app/javascript/dashboard/i18n/locale/ms/conversation.json
index 062782330..b8d77a497 100644
--- a/app/javascript/dashboard/i18n/locale/ms/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ms/conversation.json
@@ -227,6 +227,13 @@
"YES": "Send",
"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"
}
},
"VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team",
diff --git a/app/javascript/dashboard/i18n/locale/ms/login.json b/app/javascript/dashboard/i18n/locale/ms/login.json
index ab3c798c5..a34ed1783 100644
--- a/app/javascript/dashboard/i18n/locale/ms/login.json
+++ b/app/javascript/dashboard/i18n/locale/ms/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Create new account",
"SUBMIT": "Login",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/ms/signup.json b/app/javascript/dashboard/i18n/locale/ms/signup.json
index 0406a8044..7d72e3245 100644
--- a/app/javascript/dashboard/i18n/locale/ms/signup.json
+++ b/app/javascript/dashboard/i18n/locale/ms/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Password",
"PLACEHOLDER": "Password",
"ERROR": "Password is too short",
- "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character"
+ "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Confirm Password",
"PLACEHOLDER": "Confirm Password",
- "ERROR": "Password doesnot match"
+ "ERROR": "Passwords do not match."
},
"API": {
- "SUCCESS_MESSAGE": "Registration Successfull",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Masalah untuk hubungi Woot Server, Sila cuba sebentar lagi"
},
"SUBMIT": "Create account",
diff --git a/app/javascript/dashboard/i18n/locale/ne/conversation.json b/app/javascript/dashboard/i18n/locale/ne/conversation.json
index d4f3d5f66..22e94b355 100644
--- a/app/javascript/dashboard/i18n/locale/ne/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ne/conversation.json
@@ -227,6 +227,13 @@
"YES": "Send",
"CANCEL": "Cancel"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team",
diff --git a/app/javascript/dashboard/i18n/locale/ne/login.json b/app/javascript/dashboard/i18n/locale/ne/login.json
index ab3c798c5..a34ed1783 100644
--- a/app/javascript/dashboard/i18n/locale/ne/login.json
+++ b/app/javascript/dashboard/i18n/locale/ne/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Create new account",
"SUBMIT": "Login",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/ne/signup.json b/app/javascript/dashboard/i18n/locale/ne/signup.json
index 5179ee062..aa96873e1 100644
--- a/app/javascript/dashboard/i18n/locale/ne/signup.json
+++ b/app/javascript/dashboard/i18n/locale/ne/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Password",
"PLACEHOLDER": "Password",
"ERROR": "Password is too short",
- "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character"
+ "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Confirm Password",
"PLACEHOLDER": "Confirm Password",
- "ERROR": "Password doesnot match"
+ "ERROR": "Passwords do not match."
},
"API": {
- "SUCCESS_MESSAGE": "Registration Successfull",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Could not connect to Woot Server, Please try again later"
},
"SUBMIT": "Create account",
diff --git a/app/javascript/dashboard/i18n/locale/nl/conversation.json b/app/javascript/dashboard/i18n/locale/nl/conversation.json
index aee364321..976ee7fed 100644
--- a/app/javascript/dashboard/i18n/locale/nl/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/nl/conversation.json
@@ -227,6 +227,13 @@
"YES": "Verzenden",
"CANCEL": "Annuleren"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Privéopmerking: alleen zichtbaar voor jou en je team",
diff --git a/app/javascript/dashboard/i18n/locale/nl/login.json b/app/javascript/dashboard/i18n/locale/nl/login.json
index 3977b3d74..fcc586ec0 100644
--- a/app/javascript/dashboard/i18n/locale/nl/login.json
+++ b/app/javascript/dashboard/i18n/locale/nl/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Nieuw account aanmaken",
"SUBMIT": "Inloggen",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/nl/signup.json b/app/javascript/dashboard/i18n/locale/nl/signup.json
index 5db3c539d..4d6155c30 100644
--- a/app/javascript/dashboard/i18n/locale/nl/signup.json
+++ b/app/javascript/dashboard/i18n/locale/nl/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Wachtwoord",
"PLACEHOLDER": "Wachtwoord",
"ERROR": "Wachtwoord is te kort",
- "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character"
+ "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Bevestig wachtwoord",
"PLACEHOLDER": "Bevestig wachtwoord",
- "ERROR": "Wachtwoord komt niet overeen"
+ "ERROR": "Wachtwoorden komen niet overeen."
},
"API": {
- "SUCCESS_MESSAGE": "Registratie geslaagd",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Kan geen verbinding maken met Woot Server, probeer het later opnieuw"
},
"SUBMIT": "Account aanmaken",
diff --git a/app/javascript/dashboard/i18n/locale/no/conversation.json b/app/javascript/dashboard/i18n/locale/no/conversation.json
index 094adf7a4..be532fab7 100644
--- a/app/javascript/dashboard/i18n/locale/no/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/no/conversation.json
@@ -227,6 +227,13 @@
"YES": "Send",
"CANCEL": "Avbryt"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Privat notat: bare synlig for deg og ditt team",
diff --git a/app/javascript/dashboard/i18n/locale/no/login.json b/app/javascript/dashboard/i18n/locale/no/login.json
index d1a8f663d..dea863a08 100644
--- a/app/javascript/dashboard/i18n/locale/no/login.json
+++ b/app/javascript/dashboard/i18n/locale/no/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Opprett ny konto",
"SUBMIT": "Logg inn",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/no/signup.json b/app/javascript/dashboard/i18n/locale/no/signup.json
index 0e89d9dbc..4e941c374 100644
--- a/app/javascript/dashboard/i18n/locale/no/signup.json
+++ b/app/javascript/dashboard/i18n/locale/no/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Passord",
"PLACEHOLDER": "Passord",
"ERROR": "Passordet er for kort",
- "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character"
+ "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Bekreft passord",
"PLACEHOLDER": "Bekreft passord",
- "ERROR": "Passordet stemmer ikke"
+ "ERROR": "Passordet stemmer ikke."
},
"API": {
- "SUCCESS_MESSAGE": "Registrering fullført",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Kunne ikke koble til Woot Server, vennligst prøv igjen senere"
},
"SUBMIT": "Create account",
diff --git a/app/javascript/dashboard/i18n/locale/pl/conversation.json b/app/javascript/dashboard/i18n/locale/pl/conversation.json
index 2ffea2fee..657733ede 100644
--- a/app/javascript/dashboard/i18n/locale/pl/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/pl/conversation.json
@@ -227,6 +227,13 @@
"YES": "Wyślij",
"CANCEL": "Anuluj"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Prywatna uwaga: widoczne tylko dla Ciebie i Twojego zespołu",
diff --git a/app/javascript/dashboard/i18n/locale/pl/login.json b/app/javascript/dashboard/i18n/locale/pl/login.json
index ff381f58a..ea05184af 100644
--- a/app/javascript/dashboard/i18n/locale/pl/login.json
+++ b/app/javascript/dashboard/i18n/locale/pl/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Utwórz nowe konto",
"SUBMIT": "Zaloguj się",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/pl/signup.json b/app/javascript/dashboard/i18n/locale/pl/signup.json
index f9afd1695..e14216283 100644
--- a/app/javascript/dashboard/i18n/locale/pl/signup.json
+++ b/app/javascript/dashboard/i18n/locale/pl/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Hasło",
"PLACEHOLDER": "Hasło",
"ERROR": "Hasło jest zbyt krótkie",
- "IS_INVALID_PASSWORD": "Hasło powinno zawierać co najmniej 1 wielką literę, 1 małą literę, 1 cyfrę i 1 znak specjalny"
+ "IS_INVALID_PASSWORD": "Hasło powinno zawierać co najmniej 1 wielką literę, 1 małą literę, 1 cyfrę i 1 znak specjalny",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Potwierdź hasło",
"PLACEHOLDER": "Potwierdź hasło",
- "ERROR": "Hasła nie zgadzają się"
+ "ERROR": "Hasła nie pasują."
},
"API": {
- "SUCCESS_MESSAGE": "Rejestracja powiodła się",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Nie można połączyć się z serwerem Woot. Spróbuj ponownie później"
},
"SUBMIT": "Utwórz konto",
diff --git a/app/javascript/dashboard/i18n/locale/pt/conversation.json b/app/javascript/dashboard/i18n/locale/pt/conversation.json
index 447c0e243..5534f416b 100644
--- a/app/javascript/dashboard/i18n/locale/pt/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/pt/conversation.json
@@ -227,6 +227,13 @@
"YES": "Enviar",
"CANCEL": "Cancelar"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Nota Privada: Apenas visível para si e para a sua equipa",
diff --git a/app/javascript/dashboard/i18n/locale/pt/login.json b/app/javascript/dashboard/i18n/locale/pt/login.json
index a6173a18c..4149ff527 100644
--- a/app/javascript/dashboard/i18n/locale/pt/login.json
+++ b/app/javascript/dashboard/i18n/locale/pt/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Criar nova conta",
"SUBMIT": "Iniciar sessão",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/pt/signup.json b/app/javascript/dashboard/i18n/locale/pt/signup.json
index 2771c7b51..14aaa883c 100644
--- a/app/javascript/dashboard/i18n/locale/pt/signup.json
+++ b/app/javascript/dashboard/i18n/locale/pt/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Palavra-passe",
"PLACEHOLDER": "Palavra-passe",
"ERROR": "A senha é muito curta",
- "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character"
+ "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Confirmar senha",
"PLACEHOLDER": "Confirmar senha",
- "ERROR": "As senhas não conferem"
+ "ERROR": "As senhas não coincidem."
},
"API": {
- "SUCCESS_MESSAGE": "Registro Bem Sucedido",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Não foi possível conectar ao servidor Woot, por favor tente novamente mais tarde"
},
"SUBMIT": "Criar conta",
diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/conversation.json b/app/javascript/dashboard/i18n/locale/pt_BR/conversation.json
index c847fb49d..e146c98a2 100644
--- a/app/javascript/dashboard/i18n/locale/pt_BR/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/pt_BR/conversation.json
@@ -227,6 +227,13 @@
"YES": "Enviar",
"CANCEL": "Cancelar"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Mensagem Privada: Apenas visível para você e seu time",
diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/signup.json b/app/javascript/dashboard/i18n/locale/pt_BR/signup.json
index bace91f6d..0f43aaa24 100644
--- a/app/javascript/dashboard/i18n/locale/pt_BR/signup.json
+++ b/app/javascript/dashboard/i18n/locale/pt_BR/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Senha",
"PLACEHOLDER": "Senha",
"ERROR": "A senha é muito curta.",
- "IS_INVALID_PASSWORD": "A senha deve conter pelo menos 1 letra maiúscula, 1 letra minúscula, 1 número e 1 caractere especial."
+ "IS_INVALID_PASSWORD": "A senha deve conter pelo menos 1 letra maiúscula, 1 letra minúscula, 1 número e 1 caractere especial.",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Confirmar senha",
"PLACEHOLDER": "Confirmar senha",
- "ERROR": "As senhas não conferem."
+ "ERROR": "As senhas não coincidem."
},
"API": {
- "SUCCESS_MESSAGE": "Registro realizado com Sucesso",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Não foi possível conectar ao servidor Woot. Por favor, tente novamente."
},
"SUBMIT": "Criar conta",
diff --git a/app/javascript/dashboard/i18n/locale/ro/conversation.json b/app/javascript/dashboard/i18n/locale/ro/conversation.json
index c0ae01bb2..8dd1bf3bf 100644
--- a/app/javascript/dashboard/i18n/locale/ro/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ro/conversation.json
@@ -227,6 +227,13 @@
"YES": "Trimite",
"CANCEL": "Renunță"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Notă privată: vizibilă doar pentru tine și echipa ta",
diff --git a/app/javascript/dashboard/i18n/locale/ro/login.json b/app/javascript/dashboard/i18n/locale/ro/login.json
index c89340dc7..111edcc0c 100644
--- a/app/javascript/dashboard/i18n/locale/ro/login.json
+++ b/app/javascript/dashboard/i18n/locale/ro/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Creează un cont nou",
"SUBMIT": "Conectează-te",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/ro/signup.json b/app/javascript/dashboard/i18n/locale/ro/signup.json
index 0e85cfa49..ab33b8ddf 100644
--- a/app/javascript/dashboard/i18n/locale/ro/signup.json
+++ b/app/javascript/dashboard/i18n/locale/ro/signup.json
@@ -27,7 +27,12 @@
"LABEL": "Parola",
"PLACEHOLDER": "Parola",
"ERROR": "Parola este prea scurta.",
- "IS_INVALID_PASSWORD": "Parola trebuie să conțină atleast 1 literă mare, 1 literă mică, 1 număr și 1 caracter special."
+ "IS_INVALID_PASSWORD": "Parola trebuie să conțină atleast 1 literă mare, 1 literă mică, 1 număr și 1 caracter special.",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Confirmă parola",
@@ -35,7 +40,7 @@
"ERROR": "Parola nu coincide."
},
"API": {
- "SUCCESS_MESSAGE": "Înregistrare cu succes",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Nu s-a putut conecta la serverul Woot. Vă rugăm să încercați din nou."
},
"SUBMIT": "Creează cont",
diff --git a/app/javascript/dashboard/i18n/locale/ru/conversation.json b/app/javascript/dashboard/i18n/locale/ru/conversation.json
index b4b4c1f3f..4ec89cdc6 100644
--- a/app/javascript/dashboard/i18n/locale/ru/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ru/conversation.json
@@ -227,6 +227,13 @@
"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"
}
},
"VISIBLE_TO_AGENTS": "Приватная заметка: видна только вам и вашей команде",
diff --git a/app/javascript/dashboard/i18n/locale/ru/login.json b/app/javascript/dashboard/i18n/locale/ru/login.json
index 168d30133..391c7a587 100644
--- a/app/javascript/dashboard/i18n/locale/ru/login.json
+++ b/app/javascript/dashboard/i18n/locale/ru/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Создать новый аккаунт",
"SUBMIT": "Вход",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/ru/signup.json b/app/javascript/dashboard/i18n/locale/ru/signup.json
index 0033756e0..3310956e0 100644
--- a/app/javascript/dashboard/i18n/locale/ru/signup.json
+++ b/app/javascript/dashboard/i18n/locale/ru/signup.json
@@ -27,7 +27,12 @@
"LABEL": "Пароль",
"PLACEHOLDER": "Пароль",
"ERROR": "Пароль слишком короткий.",
- "IS_INVALID_PASSWORD": "Пароль должен содержать хотя бы одну заглавную букву, одну строчную букву, 1 цифру и 1 специальный символ."
+ "IS_INVALID_PASSWORD": "Пароль должен содержать хотя бы одну заглавную букву, одну строчную букву, 1 цифру и 1 специальный символ.",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Подтвердите пароль",
@@ -35,7 +40,7 @@
"ERROR": "Пароли не совпадают."
},
"API": {
- "SUCCESS_MESSAGE": "Успешная регистрация",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Не удалось подключиться к Woot серверу. Пожалуйста, попробуйте еще раз."
},
"SUBMIT": "Создать новый аккаунт",
diff --git a/app/javascript/dashboard/i18n/locale/sh/conversation.json b/app/javascript/dashboard/i18n/locale/sh/conversation.json
index 9fd39b70f..79d5ebc66 100644
--- a/app/javascript/dashboard/i18n/locale/sh/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/sh/conversation.json
@@ -227,6 +227,13 @@
"YES": "Send",
"CANCEL": "Cancel"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team",
diff --git a/app/javascript/dashboard/i18n/locale/sh/login.json b/app/javascript/dashboard/i18n/locale/sh/login.json
index ab3c798c5..a34ed1783 100644
--- a/app/javascript/dashboard/i18n/locale/sh/login.json
+++ b/app/javascript/dashboard/i18n/locale/sh/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Create new account",
"SUBMIT": "Login",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/sh/signup.json b/app/javascript/dashboard/i18n/locale/sh/signup.json
index 501d9b87e..b0e5f5d27 100644
--- a/app/javascript/dashboard/i18n/locale/sh/signup.json
+++ b/app/javascript/dashboard/i18n/locale/sh/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Password",
"PLACEHOLDER": "Password",
"ERROR": "Password is too short.",
- "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character."
+ "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character.",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Confirm password",
"PLACEHOLDER": "Confirm password",
- "ERROR": "Password doesnot match."
+ "ERROR": "Passwords do not match."
},
"API": {
- "SUCCESS_MESSAGE": "Registration Successfull",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
},
"SUBMIT": "Create account",
diff --git a/app/javascript/dashboard/i18n/locale/sk/conversation.json b/app/javascript/dashboard/i18n/locale/sk/conversation.json
index 99dde6c92..1eb8ca072 100644
--- a/app/javascript/dashboard/i18n/locale/sk/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/sk/conversation.json
@@ -227,6 +227,13 @@
"YES": "Poslať",
"CANCEL": "Zrušiť"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team",
diff --git a/app/javascript/dashboard/i18n/locale/sk/login.json b/app/javascript/dashboard/i18n/locale/sk/login.json
index 263e1c732..d19bef67f 100644
--- a/app/javascript/dashboard/i18n/locale/sk/login.json
+++ b/app/javascript/dashboard/i18n/locale/sk/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Create new account",
"SUBMIT": "Prihlásenie",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/sk/signup.json b/app/javascript/dashboard/i18n/locale/sk/signup.json
index c4a2c1477..7dedca246 100644
--- a/app/javascript/dashboard/i18n/locale/sk/signup.json
+++ b/app/javascript/dashboard/i18n/locale/sk/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Heslo",
"PLACEHOLDER": "Heslo",
"ERROR": "Heslo je príliš krátke.",
- "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character."
+ "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character.",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Confirm password",
"PLACEHOLDER": "Confirm password",
- "ERROR": "Heslá sa nezhodujú."
+ "ERROR": "Passwords do not match."
},
"API": {
- "SUCCESS_MESSAGE": "Registrácia bola úspešná",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
},
"SUBMIT": "Create account",
diff --git a/app/javascript/dashboard/i18n/locale/sl/conversation.json b/app/javascript/dashboard/i18n/locale/sl/conversation.json
index 24bf95f58..087a27305 100644
--- a/app/javascript/dashboard/i18n/locale/sl/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/sl/conversation.json
@@ -227,6 +227,13 @@
"YES": "Send",
"CANCEL": "Cancel"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team",
diff --git a/app/javascript/dashboard/i18n/locale/sl/login.json b/app/javascript/dashboard/i18n/locale/sl/login.json
index ae5556e62..59a1862fe 100644
--- a/app/javascript/dashboard/i18n/locale/sl/login.json
+++ b/app/javascript/dashboard/i18n/locale/sl/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Ustvarite nov račun",
"SUBMIT": "Prijava",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/sl/signup.json b/app/javascript/dashboard/i18n/locale/sl/signup.json
index 44638813b..d307a6d6e 100644
--- a/app/javascript/dashboard/i18n/locale/sl/signup.json
+++ b/app/javascript/dashboard/i18n/locale/sl/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Geslo",
"PLACEHOLDER": "Geslo",
"ERROR": "Geslo je prekratko.",
- "IS_INVALID_PASSWORD": "Geslo mora vsebovati vsaj 1 veliko črko, 1 malo črko, 1 številko in 1 poseben znak."
+ "IS_INVALID_PASSWORD": "Geslo mora vsebovati vsaj 1 veliko črko, 1 malo črko, 1 številko in 1 poseben znak.",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Potrdite geslo",
"PLACEHOLDER": "Potrdite geslo",
- "ERROR": "Geslo se ne ujema."
+ "ERROR": "Gesli se ne ujemata."
},
"API": {
- "SUCCESS_MESSAGE": "Registracija uspešna",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Ni bilo mogoče vzpostaviti povezave s strežnikom. Prosimo poskusite ponovno."
},
"SUBMIT": "Ustvari račun",
diff --git a/app/javascript/dashboard/i18n/locale/sq/conversation.json b/app/javascript/dashboard/i18n/locale/sq/conversation.json
index 4089631cf..c9eda3810 100644
--- a/app/javascript/dashboard/i18n/locale/sq/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/sq/conversation.json
@@ -227,6 +227,13 @@
"YES": "Send",
"CANCEL": "Cancel"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team",
diff --git a/app/javascript/dashboard/i18n/locale/sq/login.json b/app/javascript/dashboard/i18n/locale/sq/login.json
index f347f2435..061284247 100644
--- a/app/javascript/dashboard/i18n/locale/sq/login.json
+++ b/app/javascript/dashboard/i18n/locale/sq/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Create a new account",
"SUBMIT": "Login",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/sq/signup.json b/app/javascript/dashboard/i18n/locale/sq/signup.json
index 501d9b87e..b0e5f5d27 100644
--- a/app/javascript/dashboard/i18n/locale/sq/signup.json
+++ b/app/javascript/dashboard/i18n/locale/sq/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Password",
"PLACEHOLDER": "Password",
"ERROR": "Password is too short.",
- "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character."
+ "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character.",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Confirm password",
"PLACEHOLDER": "Confirm password",
- "ERROR": "Password doesnot match."
+ "ERROR": "Passwords do not match."
},
"API": {
- "SUCCESS_MESSAGE": "Registration Successfull",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
},
"SUBMIT": "Create account",
diff --git a/app/javascript/dashboard/i18n/locale/sr/conversation.json b/app/javascript/dashboard/i18n/locale/sr/conversation.json
index 1ac190668..c9661b435 100644
--- a/app/javascript/dashboard/i18n/locale/sr/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/sr/conversation.json
@@ -227,6 +227,13 @@
"YES": "Pošalji",
"CANCEL": "Otkaži"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Privatna beleška: Vidljiva samo vama i vašem timu",
diff --git a/app/javascript/dashboard/i18n/locale/sr/login.json b/app/javascript/dashboard/i18n/locale/sr/login.json
index 0782b5be5..845176d53 100644
--- a/app/javascript/dashboard/i18n/locale/sr/login.json
+++ b/app/javascript/dashboard/i18n/locale/sr/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Napravite novi nalog",
"SUBMIT": "Prijava",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/sr/signup.json b/app/javascript/dashboard/i18n/locale/sr/signup.json
index d53f01b79..520812e58 100644
--- a/app/javascript/dashboard/i18n/locale/sr/signup.json
+++ b/app/javascript/dashboard/i18n/locale/sr/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Lozinka",
"PLACEHOLDER": "Lozinka",
"ERROR": "Lozinka je prekratka.",
- "IS_INVALID_PASSWORD": "Lozinka bi trebalo da sadrži najmanje 1 veliko slovo, 1 malo slovo, 1 broj i 1 specijalni karakter."
+ "IS_INVALID_PASSWORD": "Lozinka bi trebalo da sadrži najmanje 1 veliko slovo, 1 malo slovo, 1 broj i 1 specijalni karakter.",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Confirm password",
"PLACEHOLDER": "Confirm password",
- "ERROR": "Lozinka se ne poklapa."
+ "ERROR": "Lozinke se ne poklapaju."
},
"API": {
- "SUCCESS_MESSAGE": "Registracija je uspešna",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
},
"SUBMIT": "Create account",
diff --git a/app/javascript/dashboard/i18n/locale/sv/conversation.json b/app/javascript/dashboard/i18n/locale/sv/conversation.json
index a919575ce..75b69b80a 100644
--- a/app/javascript/dashboard/i18n/locale/sv/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/sv/conversation.json
@@ -227,6 +227,13 @@
"YES": "Skicka",
"CANCEL": "Avbryt"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Privat anteckning: Endast synlig för dig och ditt team",
diff --git a/app/javascript/dashboard/i18n/locale/sv/login.json b/app/javascript/dashboard/i18n/locale/sv/login.json
index 9b65db5db..88b1f8a13 100644
--- a/app/javascript/dashboard/i18n/locale/sv/login.json
+++ b/app/javascript/dashboard/i18n/locale/sv/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Skapa nytt konto",
"SUBMIT": "Logga in",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/sv/signup.json b/app/javascript/dashboard/i18n/locale/sv/signup.json
index cc2f8b7d9..7b51af7e0 100644
--- a/app/javascript/dashboard/i18n/locale/sv/signup.json
+++ b/app/javascript/dashboard/i18n/locale/sv/signup.json
@@ -27,7 +27,12 @@
"LABEL": "Lösenord",
"PLACEHOLDER": "Lösenord",
"ERROR": "Lösenordet är för kort.",
- "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character."
+ "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character.",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Confirm password",
@@ -35,7 +40,7 @@
"ERROR": "Lösenorden matchar inte."
},
"API": {
- "SUCCESS_MESSAGE": "Registreringen lyckades",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
},
"SUBMIT": "Create account",
diff --git a/app/javascript/dashboard/i18n/locale/ta/conversation.json b/app/javascript/dashboard/i18n/locale/ta/conversation.json
index 0771e5063..6ddebf73f 100644
--- a/app/javascript/dashboard/i18n/locale/ta/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ta/conversation.json
@@ -227,6 +227,13 @@
"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"
}
},
"VISIBLE_TO_AGENTS": "தனிப்பட்ட குறிப்பு: உங்களுக்கும் உங்கள் குழுவினருக்கும் மட்டுமே தெரியும்",
diff --git a/app/javascript/dashboard/i18n/locale/ta/login.json b/app/javascript/dashboard/i18n/locale/ta/login.json
index bfc0ea9ca..4a2861d0d 100644
--- a/app/javascript/dashboard/i18n/locale/ta/login.json
+++ b/app/javascript/dashboard/i18n/locale/ta/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "புதிய கணக்கை உருவாக்க",
"SUBMIT": "உள்நுழையவும்",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/ta/signup.json b/app/javascript/dashboard/i18n/locale/ta/signup.json
index 1040b36b4..40a4ba953 100644
--- a/app/javascript/dashboard/i18n/locale/ta/signup.json
+++ b/app/javascript/dashboard/i18n/locale/ta/signup.json
@@ -27,15 +27,20 @@
"LABEL": "பாஸ்வேர்ட்",
"PLACEHOLDER": "பாஸ்வேர்ட்",
"ERROR": "Password is too short.",
- "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character."
+ "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character.",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Confirm password",
"PLACEHOLDER": "Confirm password",
- "ERROR": "Password doesnot match."
+ "ERROR": "Passwords do not match."
},
"API": {
- "SUCCESS_MESSAGE": "வெற்றிகரமாக பதிவு செய்துவிட்டிர்கள்",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
},
"SUBMIT": "Create account",
diff --git a/app/javascript/dashboard/i18n/locale/th/conversation.json b/app/javascript/dashboard/i18n/locale/th/conversation.json
index 9b3cc2aba..bcc10dbef 100644
--- a/app/javascript/dashboard/i18n/locale/th/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/th/conversation.json
@@ -227,6 +227,13 @@
"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"
}
},
"VISIBLE_TO_AGENTS": "โน้ตส่วนตัว: มีเพียงคุณและทีมเท่านั้นที่มองเห็นได้",
diff --git a/app/javascript/dashboard/i18n/locale/th/login.json b/app/javascript/dashboard/i18n/locale/th/login.json
index e2e305bba..f09bc012e 100644
--- a/app/javascript/dashboard/i18n/locale/th/login.json
+++ b/app/javascript/dashboard/i18n/locale/th/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "สร้างบัญชีใหม่",
"SUBMIT": "เข้าสู่ระบบ",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/th/signup.json b/app/javascript/dashboard/i18n/locale/th/signup.json
index f64567f88..be5ede8f9 100644
--- a/app/javascript/dashboard/i18n/locale/th/signup.json
+++ b/app/javascript/dashboard/i18n/locale/th/signup.json
@@ -27,15 +27,20 @@
"LABEL": "หรัสผ่าน",
"PLACEHOLDER": "หรัสผ่าน",
"ERROR": "หรัสผ่านนั้นสั้นเกินไป.",
- "IS_INVALID_PASSWORD": "รหัสผ่านต้องมีอย่างน้อย 1 ตัวอักษรภาษาอังกฤษพิมพ์เล็ก, 1 ตัวอักษรภาษาอังกฤษพิมพ์ใหญ่, 1 ตัวเลข และอักขระพิเศษ 1 ตัว."
+ "IS_INVALID_PASSWORD": "รหัสผ่านต้องมีอย่างน้อย 1 ตัวอักษรภาษาอังกฤษพิมพ์เล็ก, 1 ตัวอักษรภาษาอังกฤษพิมพ์ใหญ่, 1 ตัวเลข และอักขระพิเศษ 1 ตัว.",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Confirm password",
"PLACEHOLDER": "Confirm password",
- "ERROR": "รหัสผ่านไม่เหมือนกัน."
+ "ERROR": "หรัสผ่านไม่ตรงกัน."
},
"API": {
- "SUCCESS_MESSAGE": "ลงทะเบียนสำเร็จแล้ว",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
},
"SUBMIT": "Create account",
diff --git a/app/javascript/dashboard/i18n/locale/tl/conversation.json b/app/javascript/dashboard/i18n/locale/tl/conversation.json
index 9fd39b70f..79d5ebc66 100644
--- a/app/javascript/dashboard/i18n/locale/tl/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/tl/conversation.json
@@ -227,6 +227,13 @@
"YES": "Send",
"CANCEL": "Cancel"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team",
diff --git a/app/javascript/dashboard/i18n/locale/tl/login.json b/app/javascript/dashboard/i18n/locale/tl/login.json
index f347f2435..061284247 100644
--- a/app/javascript/dashboard/i18n/locale/tl/login.json
+++ b/app/javascript/dashboard/i18n/locale/tl/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Create a new account",
"SUBMIT": "Login",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/tl/signup.json b/app/javascript/dashboard/i18n/locale/tl/signup.json
index 501d9b87e..b0e5f5d27 100644
--- a/app/javascript/dashboard/i18n/locale/tl/signup.json
+++ b/app/javascript/dashboard/i18n/locale/tl/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Password",
"PLACEHOLDER": "Password",
"ERROR": "Password is too short.",
- "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character."
+ "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character.",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Confirm password",
"PLACEHOLDER": "Confirm password",
- "ERROR": "Password doesnot match."
+ "ERROR": "Passwords do not match."
},
"API": {
- "SUCCESS_MESSAGE": "Registration Successfull",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
},
"SUBMIT": "Create account",
diff --git a/app/javascript/dashboard/i18n/locale/tr/conversation.json b/app/javascript/dashboard/i18n/locale/tr/conversation.json
index ac0b82cb0..719028fc4 100644
--- a/app/javascript/dashboard/i18n/locale/tr/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/tr/conversation.json
@@ -227,6 +227,13 @@
"YES": "Gönder",
"CANCEL": "İptal Et"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Önizlemeyi daralt",
+ "EXPAND": "Önizlemeyi genişlet"
}
},
"VISIBLE_TO_AGENTS": "Özel Not: Yalnızca siz ve ekibiniz tarafından görülebilir",
diff --git a/app/javascript/dashboard/i18n/locale/tr/login.json b/app/javascript/dashboard/i18n/locale/tr/login.json
index 963609195..8460a575b 100644
--- a/app/javascript/dashboard/i18n/locale/tr/login.json
+++ b/app/javascript/dashboard/i18n/locale/tr/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Yeni hesap oluştur",
"SUBMIT": "Oturum aç",
"SAML": {
- "LABEL": "SSO ile giriş yapın",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Şifre ile giriş yap",
diff --git a/app/javascript/dashboard/i18n/locale/tr/mfa.json b/app/javascript/dashboard/i18n/locale/tr/mfa.json
index dbb616413..defd72261 100644
--- a/app/javascript/dashboard/i18n/locale/tr/mfa.json
+++ b/app/javascript/dashboard/i18n/locale/tr/mfa.json
@@ -1,22 +1,22 @@
{
"MFA_SETTINGS": {
"TITLE": "İki Faktörlü Kimlik Doğrulama",
- "SUBTITLE": "Secure your account with TOTP-based authentication",
- "DESCRIPTION": "Add an extra layer of security to your account using a time-based one-time password (TOTP)",
+ "SUBTITLE": "TOTP tabanlı kimlik doğrulama ile hesabınızı güvence altına alın",
+ "DESCRIPTION": "Zaman tabanlı tek kullanımlık şifre (TOTP) kullanarak hesabınıza ekstra bir güvenlik katmanı ekleyin",
"STATUS_TITLE": "Kimlik Doğrulama Durumu",
"STATUS_DESCRIPTION": "İki faktörlü kimlik doğrulama ayarlarınızı ve yedek kurtarma kodlarınızı yönetin",
"ENABLED": "Etkin",
"DISABLED": "Devre dışı",
- "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": "İki faktörlü kimlik doğrulama etkin",
+ "STATUS_ENABLED_DESC": "Hesabınız ek bir güvenlik katmanı ile korunmaktadır",
+ "ENABLE_BUTTON": "İki Faktörlü Kimlik Doğrulamayı Etkinleştir",
+ "ENHANCE_SECURITY": "Hesap Güvenliğinizi Artırın",
+ "ENHANCE_SECURITY_DESC": "İki faktörlü kimlik doğrulama, şifrenize ek olarak kimlik doğrulama uygulamanızdan bir doğrulama kodu talep ederek ekstra bir güvenlik katmanı ekler.",
"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",
+ "STEP1_TITLE": "Kimlik Doğrulama Uygulamanızla QR Kodunu Tarayın",
+ "STEP1_DESCRIPTION": "Google Authenticator, Authy veya TOTP uyumlu herhangi bir uygulamayı kullanın",
"LOADING_QR": "Loading...",
"MANUAL_ENTRY": "Tarama yapamıyor musunuz? Kodu manuel olarak girin",
"SECRET_KEY": "Gizli Anahtar",
diff --git a/app/javascript/dashboard/i18n/locale/tr/signup.json b/app/javascript/dashboard/i18n/locale/tr/signup.json
index d5f7364fe..c804e8968 100644
--- a/app/javascript/dashboard/i18n/locale/tr/signup.json
+++ b/app/javascript/dashboard/i18n/locale/tr/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Parola",
"PLACEHOLDER": "Parola",
"ERROR": "Parola çok kısa.",
- "IS_INVALID_PASSWORD": "Şifre en az 1 büyük harf, 1 küçük harf, 1 rakam ve 1 özel karakter içermelidir."
+ "IS_INVALID_PASSWORD": "Şifre en az 1 büyük harf, 1 küçük harf, 1 rakam ve 1 özel karakter içermelidir.",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Parolayı onayla",
"PLACEHOLDER": "Parolayı onayla",
- "ERROR": "Parolalar eşleşmiyor."
+ "ERROR": "Parola eşleşmiyor."
},
"API": {
- "SUCCESS_MESSAGE": "Kayıt başarılı",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Woot sunucusuna bağlanılamadı. Lütfen tekrar deneyin."
},
"SUBMIT": "Hesap oluştur",
diff --git a/app/javascript/dashboard/i18n/locale/uk/conversation.json b/app/javascript/dashboard/i18n/locale/uk/conversation.json
index 5aca1094e..11be01bb5 100644
--- a/app/javascript/dashboard/i18n/locale/uk/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/uk/conversation.json
@@ -227,6 +227,13 @@
"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"
}
},
"VISIBLE_TO_AGENTS": "Приватна нотатка: видима тільки вам та вашій команді",
diff --git a/app/javascript/dashboard/i18n/locale/uk/login.json b/app/javascript/dashboard/i18n/locale/uk/login.json
index 20f4c9e64..a3dbc9b45 100644
--- a/app/javascript/dashboard/i18n/locale/uk/login.json
+++ b/app/javascript/dashboard/i18n/locale/uk/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Створити новий обліковий запис",
"SUBMIT": "Увійти",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/uk/signup.json b/app/javascript/dashboard/i18n/locale/uk/signup.json
index 20163a58a..5acf45913 100644
--- a/app/javascript/dashboard/i18n/locale/uk/signup.json
+++ b/app/javascript/dashboard/i18n/locale/uk/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Пароль",
"PLACEHOLDER": "Пароль",
"ERROR": "Пароль занадто короткий.",
- "IS_INVALID_PASSWORD": "Пароль повинен містити принаймні 1 велику літеру, хоча б 1 малу літеру, 1 цифру та 1 спеціальний символ."
+ "IS_INVALID_PASSWORD": "Пароль повинен містити принаймні 1 велику літеру, хоча б 1 малу літеру, 1 цифру та 1 спеціальний символ.",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Підтвердити пароль",
"PLACEHOLDER": "Підтвердити пароль",
- "ERROR": "Пароль не підходить."
+ "ERROR": "Паролі не збігаються."
},
"API": {
- "SUCCESS_MESSAGE": "Реєстрація пройшла успішно",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Не вдалося підключитися до Woot сервера. Будь ласка, спробуйте ще раз."
},
"SUBMIT": "Створити акаунт",
diff --git a/app/javascript/dashboard/i18n/locale/ur/conversation.json b/app/javascript/dashboard/i18n/locale/ur/conversation.json
index fc03fbc7c..31e900a12 100644
--- a/app/javascript/dashboard/i18n/locale/ur/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ur/conversation.json
@@ -227,6 +227,13 @@
"YES": "Send",
"CANCEL": "منسوخ کریں۔"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team",
diff --git a/app/javascript/dashboard/i18n/locale/ur/login.json b/app/javascript/dashboard/i18n/locale/ur/login.json
index ab3c798c5..a34ed1783 100644
--- a/app/javascript/dashboard/i18n/locale/ur/login.json
+++ b/app/javascript/dashboard/i18n/locale/ur/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Create new account",
"SUBMIT": "Login",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/ur/signup.json b/app/javascript/dashboard/i18n/locale/ur/signup.json
index 501d9b87e..b0e5f5d27 100644
--- a/app/javascript/dashboard/i18n/locale/ur/signup.json
+++ b/app/javascript/dashboard/i18n/locale/ur/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Password",
"PLACEHOLDER": "Password",
"ERROR": "Password is too short.",
- "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character."
+ "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character.",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Confirm password",
"PLACEHOLDER": "Confirm password",
- "ERROR": "Password doesnot match."
+ "ERROR": "Passwords do not match."
},
"API": {
- "SUCCESS_MESSAGE": "Registration Successfull",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
},
"SUBMIT": "Create account",
diff --git a/app/javascript/dashboard/i18n/locale/ur_IN/conversation.json b/app/javascript/dashboard/i18n/locale/ur_IN/conversation.json
index 9fd39b70f..79d5ebc66 100644
--- a/app/javascript/dashboard/i18n/locale/ur_IN/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ur_IN/conversation.json
@@ -227,6 +227,13 @@
"YES": "Send",
"CANCEL": "Cancel"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team",
diff --git a/app/javascript/dashboard/i18n/locale/ur_IN/login.json b/app/javascript/dashboard/i18n/locale/ur_IN/login.json
index ab3c798c5..a34ed1783 100644
--- a/app/javascript/dashboard/i18n/locale/ur_IN/login.json
+++ b/app/javascript/dashboard/i18n/locale/ur_IN/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Create new account",
"SUBMIT": "Login",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/ur_IN/signup.json b/app/javascript/dashboard/i18n/locale/ur_IN/signup.json
index 501d9b87e..b0e5f5d27 100644
--- a/app/javascript/dashboard/i18n/locale/ur_IN/signup.json
+++ b/app/javascript/dashboard/i18n/locale/ur_IN/signup.json
@@ -27,15 +27,20 @@
"LABEL": "Password",
"PLACEHOLDER": "Password",
"ERROR": "Password is too short.",
- "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character."
+ "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character.",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Confirm password",
"PLACEHOLDER": "Confirm password",
- "ERROR": "Password doesnot match."
+ "ERROR": "Passwords do not match."
},
"API": {
- "SUCCESS_MESSAGE": "Registration Successfull",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
},
"SUBMIT": "Create account",
diff --git a/app/javascript/dashboard/i18n/locale/vi/conversation.json b/app/javascript/dashboard/i18n/locale/vi/conversation.json
index 58eadd9e0..ad17700b1 100644
--- a/app/javascript/dashboard/i18n/locale/vi/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/vi/conversation.json
@@ -227,6 +227,13 @@
"YES": "Gửi",
"CANCEL": "Huỷ"
}
+ },
+ "QUOTED_REPLY": {
+ "ENABLE_TOOLTIP": "Include quoted email thread",
+ "DISABLE_TOOLTIP": "Don't include quoted email thread",
+ "REMOVE_PREVIEW": "Remove quoted email thread",
+ "COLLAPSE": "Collapse preview",
+ "EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Lưu ý riêng: Chỉ hiển thị với bạn và nhóm của bạn",
diff --git a/app/javascript/dashboard/i18n/locale/vi/login.json b/app/javascript/dashboard/i18n/locale/vi/login.json
index 0981ad84d..8ec12fb28 100644
--- a/app/javascript/dashboard/i18n/locale/vi/login.json
+++ b/app/javascript/dashboard/i18n/locale/vi/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "Tạo mới tài khoản",
"SUBMIT": "Đăng nhập",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/vi/signup.json b/app/javascript/dashboard/i18n/locale/vi/signup.json
index f496bec9a..88739fc4f 100644
--- a/app/javascript/dashboard/i18n/locale/vi/signup.json
+++ b/app/javascript/dashboard/i18n/locale/vi/signup.json
@@ -27,7 +27,12 @@
"LABEL": "Mật khẩu",
"PLACEHOLDER": "Mật khẩu",
"ERROR": "Mật khẩu quá ngắn.",
- "IS_INVALID_PASSWORD": "Mật khẩu phải chứa ít nhất 1 chữ hoa, 1 chữ thường, 1 số và 1 ký tự đặc biệt."
+ "IS_INVALID_PASSWORD": "Mật khẩu phải chứa ít nhất 1 chữ hoa, 1 chữ thường, 1 số và 1 ký tự đặc biệt.",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Confirm password",
@@ -35,7 +40,7 @@
"ERROR": "Mật khẩu không khớp."
},
"API": {
- "SUCCESS_MESSAGE": "Đăng Kí Thành Công",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
},
"SUBMIT": "Create account",
diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/conversation.json b/app/javascript/dashboard/i18n/locale/zh_CN/conversation.json
index 5eaff3f80..41c55b552 100644
--- a/app/javascript/dashboard/i18n/locale/zh_CN/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/zh_CN/conversation.json
@@ -227,6 +227,13 @@
"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"
}
},
"VISIBLE_TO_AGENTS": "私人便签:仅对您和您的团队可见",
diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/login.json b/app/javascript/dashboard/i18n/locale/zh_CN/login.json
index 9376dd920..2dbbc9327 100644
--- a/app/javascript/dashboard/i18n/locale/zh_CN/login.json
+++ b/app/javascript/dashboard/i18n/locale/zh_CN/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "创建新账户",
"SUBMIT": "登录",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/signup.json b/app/javascript/dashboard/i18n/locale/zh_CN/signup.json
index 061100076..f379660c1 100644
--- a/app/javascript/dashboard/i18n/locale/zh_CN/signup.json
+++ b/app/javascript/dashboard/i18n/locale/zh_CN/signup.json
@@ -27,7 +27,12 @@
"LABEL": "密码",
"PLACEHOLDER": "密码",
"ERROR": "密码太短了.",
- "IS_INVALID_PASSWORD": "密码应至少应该包含:1个大写字母、1个小写字母、1个数字和1个特殊字符。"
+ "IS_INVALID_PASSWORD": "密码应至少应该包含:1个大写字母、1个小写字母、1个数字和1个特殊字符。",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "确认密码",
@@ -35,7 +40,7 @@
"ERROR": "密码不匹配."
},
"API": {
- "SUCCESS_MESSAGE": "注册成功",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "无法与 Woot 服务器建立连接。请重试。"
},
"SUBMIT": "创建新账户",
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json b/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json
index 333a13a0f..fa023c044 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json
@@ -227,6 +227,13 @@
"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"
}
},
"VISIBLE_TO_AGENTS": "私人筆記:僅對您和您的團隊可以看見",
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/login.json b/app/javascript/dashboard/i18n/locale/zh_TW/login.json
index ac38e25ef..63169e05b 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/login.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/login.json
@@ -24,7 +24,7 @@
"CREATE_NEW_ACCOUNT": "建立新帳戶",
"SUBMIT": "登入",
"SAML": {
- "LABEL": "Log in via SSO",
+ "LABEL": "Login via SSO",
"TITLE": "Initiate Single Sign-on (SSO)",
"SUBTITLE": "Enter your work email to access your organization",
"BACK_TO_LOGIN": "Login via Password",
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/signup.json b/app/javascript/dashboard/i18n/locale/zh_TW/signup.json
index 197a91b89..41a645e64 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/signup.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/signup.json
@@ -27,7 +27,12 @@
"LABEL": "密碼",
"PLACEHOLDER": "密碼",
"ERROR": "密碼太短了.",
- "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character."
+ "IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character.",
+ "REQUIREMENTS_LENGTH": "At least 6 characters long",
+ "REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
+ "REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
+ "REQUIREMENTS_NUMBER": "At least one number",
+ "REQUIREMENTS_SPECIAL": "At least one special character"
},
"CONFIRM_PASSWORD": {
"LABEL": "Confirm password",
@@ -35,7 +40,7 @@
"ERROR": "密碼不匹配."
},
"API": {
- "SUCCESS_MESSAGE": "註冊成功",
+ "SUCCESS_MESSAGE": "Registration Successful",
"ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
},
"SUBMIT": "Create account",
From 0d721bc898ad8f13fc996573b603986ffc76aa22 Mon Sep 17 00:00:00 2001
From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Date: Fri, 3 Oct 2025 15:31:58 +0530
Subject: [PATCH 155/182] chore: UI improvement in auth screens (#12573)
# Pull Request Template
## Type of change
### Screenshots
**Before**
**After**
## 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/v3/components/GoogleOauth/Button.vue | 2 +-
.../v3/views/auth/signup/components/Signup/Form.vue | 8 ++++----
app/javascript/v3/views/login/Index.vue | 9 +++++++--
package.json | 2 +-
pnpm-lock.yaml | 10 +++++-----
5 files changed, 18 insertions(+), 13 deletions(-)
diff --git a/app/javascript/v3/components/GoogleOauth/Button.vue b/app/javascript/v3/components/GoogleOauth/Button.vue
index c6214e9c3..2d1fc5a4e 100644
--- a/app/javascript/v3/components/GoogleOauth/Button.vue
+++ b/app/javascript/v3/components/GoogleOauth/Button.vue
@@ -34,7 +34,7 @@ export default {
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 b22f621fc..6a4497948 100644
--- a/app/javascript/v3/views/auth/signup/components/Signup/Form.vue
+++ b/app/javascript/v3/views/auth/signup/components/Signup/Form.vue
@@ -237,16 +237,16 @@ export default {
/>
-
+
diff --git a/app/javascript/v3/views/login/Index.vue b/app/javascript/v3/views/login/Index.vue
index 5faaa3e02..028af4f72 100644
--- a/app/javascript/v3/views/login/Index.vue
+++ b/app/javascript/v3/views/login/Index.vue
@@ -15,6 +15,7 @@ import SimpleDivider from '../../components/Divider/SimpleDivider.vue';
import FormInput from '../../components/Form/Input.vue';
import GoogleOAuthButton from '../../components/GoogleOauth/Button.vue';
import Spinner from 'shared/components/Spinner.vue';
+import Icon from 'dashboard/components-next/icon/Icon.vue';
import NextButton from 'dashboard/components-next/button/Button.vue';
import MfaVerification from 'dashboard/components/auth/MfaVerification.vue';
@@ -33,6 +34,7 @@ export default {
NextButton,
SimpleDivider,
MfaVerification,
+ Icon,
},
props: {
ssoAuthToken: { type: String, default: '' },
@@ -260,9 +262,12 @@ export default {
-
+
{{ $t('LOGIN.SAML.LABEL') }}
diff --git a/package.json b/package.json
index 66dd84aa2..38053b2c3 100644
--- a/package.json
+++ b/package.json
@@ -110,7 +110,7 @@
"@egoist/tailwindcss-icons": "^1.8.1",
"@histoire/plugin-vue": "0.17.15",
"@iconify-json/logos": "^1.2.3",
- "@iconify-json/lucide": "^1.2.11",
+ "@iconify-json/lucide": "^1.2.68",
"@iconify-json/ph": "^1.2.1",
"@iconify-json/ri": "^1.2.3",
"@iconify-json/teenyicons": "^1.2.1",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 71279b7e5..f4ae568c5 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -246,8 +246,8 @@ importers:
specifier: ^1.2.3
version: 1.2.3
'@iconify-json/lucide':
- specifier: ^1.2.11
- version: 1.2.11
+ specifier: ^1.2.68
+ version: 1.2.68
'@iconify-json/ph':
specifier: ^1.2.1
version: 1.2.1
@@ -884,8 +884,8 @@ packages:
'@iconify-json/logos@1.2.3':
resolution: {integrity: sha512-JLHS5hgZP1b55EONAWNeqBUuriRfRNKWXK4cqYx0PpVaJfIIMiiMxFfvoQiX/bkE9XgkLhcKmDUqL3LXPdXPwQ==}
- '@iconify-json/lucide@1.2.11':
- resolution: {integrity: sha512-dqpbV7+g1qqxtZOHCZKwdKhtYYqEUjFhYiOg/+PcADbjtapoL+bwa1Brn12gAHq5r2K7Mf29xRHOTmZ3UHHOrw==}
+ '@iconify-json/lucide@1.2.68':
+ resolution: {integrity: sha512-lR5xNJdn2CT0iR7lM25G4SewBO4G2hbr3fTWOc3AE9BspflEcneh02E3l9TBaCU/JOHozTJevWLrxBGypD7Tng==}
'@iconify-json/material-symbols@1.2.10':
resolution: {integrity: sha512-GcZxhOFStM7Dk/oZvJSaW0tR/k6NwTq+KDzYgCNBDg52ktZuRa/gkjRiYooJm/8PAe9NBYxIx8XjS/wi4sasdQ==}
@@ -5265,7 +5265,7 @@ snapshots:
dependencies:
'@iconify/types': 2.0.0
- '@iconify-json/lucide@1.2.11':
+ '@iconify-json/lucide@1.2.68':
dependencies:
'@iconify/types': 2.0.0
From b536f35fa728d7df2f233576f6969f4187fef8e4 Mon Sep 17 00:00:00 2001
From: Chatwoot Bot <92152627+chatwoot-bot@users.noreply.github.com>
Date: Sun, 5 Oct 2025 21:30:26 -0700
Subject: [PATCH 156/182] chore: Update translations (#12580)
---
.../dashboard/i18n/locale/am/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/ar/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/az/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/bg/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/ca/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/cs/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/da/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/de/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/el/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/es/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/fa/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/fi/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/fr/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/he/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/hi/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/hr/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/hu/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/hy/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/id/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/is/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/it/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/ja/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/ka/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/ko/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/lt/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/lv/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/ml/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/ms/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/ne/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/nl/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/no/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/pl/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/pt/inboxMgmt.json | 56 +++++++++++++++++++
.../i18n/locale/pt_BR/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/ro/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/ru/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/sh/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/sk/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/sl/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/sq/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/sr/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/sv/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/ta/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/th/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/tl/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/tr/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/uk/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/ur/inboxMgmt.json | 56 +++++++++++++++++++
.../i18n/locale/ur_IN/inboxMgmt.json | 56 +++++++++++++++++++
.../dashboard/i18n/locale/vi/inboxMgmt.json | 56 +++++++++++++++++++
.../i18n/locale/zh_CN/inboxMgmt.json | 56 +++++++++++++++++++
.../i18n/locale/zh_TW/inboxMgmt.json | 56 +++++++++++++++++++
52 files changed, 2912 insertions(+)
diff --git a/app/javascript/dashboard/i18n/locale/am/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/am/inboxMgmt.json
index 1c54adcb2..60038253c 100644
--- a/app/javascript/dashboard/i18n/locale/am/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/am/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "There are no inboxes attached to this account."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Business Hours",
"WIDGET_BUILDER": "Widget Builder",
"BOT_CONFIGURATION": "Bot Configuration",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Live"
+ }
+ }
+ },
"SETTINGS": "Settings",
"FEATURES": {
"LABEL": "Features",
diff --git a/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json
index 01d74aa3c..1314ed561 100644
--- a/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "تعلم المزيد عن صناديق البريد",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "لا توجد صناديق وارد لقنوات تواصل مرتبطة بهذا الحساب."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "ساعات العمل",
"WIDGET_BUILDER": "منشئ اللايف شات",
"BOT_CONFIGURATION": "اعدادات البوت",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "تقييم رضاء العملاء"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "مباشر"
+ }
+ }
+ },
"SETTINGS": "الإعدادات",
"FEATURES": {
"LABEL": "الخصائص",
diff --git a/app/javascript/dashboard/i18n/locale/az/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/az/inboxMgmt.json
index 1c54adcb2..60038253c 100644
--- a/app/javascript/dashboard/i18n/locale/az/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/az/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "There are no inboxes attached to this account."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Business Hours",
"WIDGET_BUILDER": "Widget Builder",
"BOT_CONFIGURATION": "Bot Configuration",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Live"
+ }
+ }
+ },
"SETTINGS": "Settings",
"FEATURES": {
"LABEL": "Features",
diff --git a/app/javascript/dashboard/i18n/locale/bg/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/bg/inboxMgmt.json
index 949dc639c..e540e8c1e 100644
--- a/app/javascript/dashboard/i18n/locale/bg/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/bg/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "There are no inboxes attached to this account."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Business Hours",
"WIDGET_BUILDER": "Widget Builder",
"BOT_CONFIGURATION": "Bot Configuration",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Live"
+ }
+ }
+ },
"SETTINGS": "Settings",
"FEATURES": {
"LABEL": "Features",
diff --git a/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json
index 8af8d02ea..c8670b02d 100644
--- a/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "La teva safata d'entrada està desconnectada. No rebràs missatges nous fins que no els tornis a autoritzar.",
"CLICK_TO_RECONNECT": "Fes clic aquí per tornar a connectar-te.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "No hi ha cap safata d'entrada connectat a aquest compte."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Horari comercial",
"WIDGET_BUILDER": "Creador del widget",
"BOT_CONFIGURATION": "Configuracions del bot",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "En directe"
+ }
+ }
+ },
"SETTINGS": "Configuracions",
"FEATURES": {
"LABEL": "Característiques",
diff --git a/app/javascript/dashboard/i18n/locale/cs/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/cs/inboxMgmt.json
index ad4d2f5cb..9bced9936 100644
--- a/app/javascript/dashboard/i18n/locale/cs/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/cs/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "K tomuto účtu nejsou připojeny žádné doručené schránky."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Pracovní doba",
"WIDGET_BUILDER": "Widget Builder",
"BOT_CONFIGURATION": "Bot Configuration",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Live"
+ }
+ }
+ },
"SETTINGS": "Nastavení",
"FEATURES": {
"LABEL": "Funkce",
diff --git a/app/javascript/dashboard/i18n/locale/da/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/da/inboxMgmt.json
index 18d8af156..03345d326 100644
--- a/app/javascript/dashboard/i18n/locale/da/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/da/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "Der er ingen indbakker tilknyttet denne konto."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Forretningstider",
"WIDGET_BUILDER": "Widget Builder",
"BOT_CONFIGURATION": "Bot konfiguration",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Levende"
+ }
+ }
+ },
"SETTINGS": "Indstillinger",
"FEATURES": {
"LABEL": "Funktioner",
diff --git a/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json
index 6e638393a..ad1134cb3 100644
--- a/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Mehr über Posteingänge erfahren",
"RECONNECTION_REQUIRED": "Ihr Posteingang ist nicht verbunden. Sie erhalten keine neuen Nachrichten, bis Sie ihn erneut autorisieren.",
"CLICK_TO_RECONNECT": "Klicken Sie hier, um die Verbindung wiederherzustellen.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "Diesem Konto sind keine Posteingänge zugeordnet."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Öffnungszeiten",
"WIDGET_BUILDER": "Widget-Generator",
"BOT_CONFIGURATION": "Bot-Konfiguration",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Live"
+ }
+ }
+ },
"SETTINGS": "Einstellungen",
"FEATURES": {
"LABEL": "Funktionen",
diff --git a/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json
index 71ebdbbcf..92b7e5c59 100644
--- a/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "Δεν υπάρχουν κιβώτια εισερχομένων σε αυτόν τον λογαριασμό."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Ώρες Εργασίας",
"WIDGET_BUILDER": "Δημιουργός Widget",
"BOT_CONFIGURATION": "Ρυθμίσεις Bot",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Ζωντανά"
+ }
+ }
+ },
"SETTINGS": "Ρυθμίσεις",
"FEATURES": {
"LABEL": "Χαρακτηριστικά",
diff --git a/app/javascript/dashboard/i18n/locale/es/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/es/inboxMgmt.json
index bc7a9f03c..b1aac6d09 100644
--- a/app/javascript/dashboard/i18n/locale/es/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/es/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Aprende más sobre las entradas",
"RECONNECTION_REQUIRED": "Tu bandeja de entrada está desconectada. No recibirás mensajes nuevos hasta que lo vuelvas a autorizar.",
"CLICK_TO_RECONNECT": "Haga clic aquí para volver a conectar.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "No hay entradas adjuntas a esta cuenta."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Horarios",
"WIDGET_BUILDER": "Constructor de Widget",
"BOT_CONFIGURATION": "Configuración del bot",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "Encuestas de Satisfacción"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "En vivo"
+ }
+ }
+ },
"SETTINGS": "Ajustes",
"FEATURES": {
"LABEL": "Características",
diff --git a/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json
index be270af6a..3a8e24b35 100644
--- a/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "برای این حساب هیچ صندوق ورودی معرفی نشده است."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "ساعت کاری",
"WIDGET_BUILDER": "سازنده ابزارک",
"BOT_CONFIGURATION": "پیکربندی ربات",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "رضایت مشتری"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "زنده"
+ }
+ }
+ },
"SETTINGS": "تنظیمات",
"FEATURES": {
"LABEL": "امکانات",
diff --git a/app/javascript/dashboard/i18n/locale/fi/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/fi/inboxMgmt.json
index 340955d75..8409f4bab 100644
--- a/app/javascript/dashboard/i18n/locale/fi/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/fi/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "Tähän tiliin ei ole liitetty saapuneet-kansiota."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Business Hours",
"WIDGET_BUILDER": "Widget Builder",
"BOT_CONFIGURATION": "Bot Configuration",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Live"
+ }
+ }
+ },
"SETTINGS": "Asetukset",
"FEATURES": {
"LABEL": "Ominaisuudet",
diff --git a/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json
index 4b744f1b7..583de65a9 100644
--- a/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "Il n'y a aucune boîte de réception associée à ce compte."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Heures de bureau",
"WIDGET_BUILDER": "Constructeur de Widget",
"BOT_CONFIGURATION": "Configuration du bot",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "En direct"
+ }
+ }
+ },
"SETTINGS": "Paramètres",
"FEATURES": {
"LABEL": "Fonctionnalités",
diff --git a/app/javascript/dashboard/i18n/locale/he/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/he/inboxMgmt.json
index f98fa5fe7..7bb57e2e7 100644
--- a/app/javascript/dashboard/i18n/locale/he/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/he/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "אין תיבות דואר נכנס מצורפות לחשבון זה."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "שעות פעילות",
"WIDGET_BUILDER": "בונה יישומונים",
"BOT_CONFIGURATION": "הגדרות בוט",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "לחיות"
+ }
+ }
+ },
"SETTINGS": "הגדרות",
"FEATURES": {
"LABEL": "מאפיינים",
diff --git a/app/javascript/dashboard/i18n/locale/hi/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/hi/inboxMgmt.json
index b61c6f3e4..00a9c78f0 100644
--- a/app/javascript/dashboard/i18n/locale/hi/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/hi/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "There are no inboxes attached to this account."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Business Hours",
"WIDGET_BUILDER": "Widget Builder",
"BOT_CONFIGURATION": "Bot Configuration",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Live"
+ }
+ }
+ },
"SETTINGS": "Settings",
"FEATURES": {
"LABEL": "Features",
diff --git a/app/javascript/dashboard/i18n/locale/hr/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/hr/inboxMgmt.json
index c79798c09..2b64f5d43 100644
--- a/app/javascript/dashboard/i18n/locale/hr/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/hr/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "There are no inboxes attached to this account."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Business Hours",
"WIDGET_BUILDER": "Widget Builder",
"BOT_CONFIGURATION": "Bot Configuration",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Live"
+ }
+ }
+ },
"SETTINGS": "Settings",
"FEATURES": {
"LABEL": "Features",
diff --git a/app/javascript/dashboard/i18n/locale/hu/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/hu/inboxMgmt.json
index 773ae8e0d..3f585db3e 100644
--- a/app/javascript/dashboard/i18n/locale/hu/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/hu/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "Nincs Inbox kapcsolva ehhez a fiókhoz."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Nyitvatartás",
"WIDGET_BUILDER": "Widget építő",
"BOT_CONFIGURATION": "Bot konfiguráció",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Élő"
+ }
+ }
+ },
"SETTINGS": "Beállítások",
"FEATURES": {
"LABEL": "Lehetőségek",
diff --git a/app/javascript/dashboard/i18n/locale/hy/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/hy/inboxMgmt.json
index 84c53dba4..e8cf88458 100644
--- a/app/javascript/dashboard/i18n/locale/hy/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/hy/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "There are no inboxes attached to this account."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Business Hours",
"WIDGET_BUILDER": "Widget Builder",
"BOT_CONFIGURATION": "Bot Configuration",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Live"
+ }
+ }
+ },
"SETTINGS": "Settings",
"FEATURES": {
"LABEL": "Features",
diff --git a/app/javascript/dashboard/i18n/locale/id/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/id/inboxMgmt.json
index 3cffd41e7..5409c4bb7 100644
--- a/app/javascript/dashboard/i18n/locale/id/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/id/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "Tidak ada kotak masuk yang dilampirkan ke akun ini."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Jam Kerja",
"WIDGET_BUILDER": "Pembuat Widget",
"BOT_CONFIGURATION": "Konfigurasi Bot",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Langsung"
+ }
+ }
+ },
"SETTINGS": "Pengaturan",
"FEATURES": {
"LABEL": "Fitur",
diff --git a/app/javascript/dashboard/i18n/locale/is/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/is/inboxMgmt.json
index 1b9562e25..e78d89c1a 100644
--- a/app/javascript/dashboard/i18n/locale/is/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/is/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "Það eru engin innhólf tengd við þennan reikning."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Business Hours",
"WIDGET_BUILDER": "Widget Builder",
"BOT_CONFIGURATION": "Bot stillingar",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Live"
+ }
+ }
+ },
"SETTINGS": "Stillingar",
"FEATURES": {
"LABEL": "Fídusar",
diff --git a/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json
index 321921131..b4ba15a0d 100644
--- a/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "Non ci sono caselle allegate a questo account."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Ore di lavoro",
"WIDGET_BUILDER": "Costruttore Widget",
"BOT_CONFIGURATION": "Bot Configuration",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Live"
+ }
+ }
+ },
"SETTINGS": "Impostazioni",
"FEATURES": {
"LABEL": "Funzionalità",
diff --git a/app/javascript/dashboard/i18n/locale/ja/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ja/inboxMgmt.json
index 06384ca55..99953d1cc 100644
--- a/app/javascript/dashboard/i18n/locale/ja/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ja/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "受信トレイについて詳しく知る",
"RECONNECTION_REQUIRED": "受信トレイが切断されました。再認証するまで新しいメッセージを受信できません。",
"CLICK_TO_RECONNECT": "再接続するにはここをクリック。",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "このアカウントに紐付けられている受信トレイはありません。"
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "営業時間",
"WIDGET_BUILDER": "ウィジェットビルダー",
"BOT_CONFIGURATION": "ボット設定",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "顧客満足度"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "承認済み",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Live"
+ }
+ }
+ },
"SETTINGS": "設定",
"FEATURES": {
"LABEL": "機能",
diff --git a/app/javascript/dashboard/i18n/locale/ka/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ka/inboxMgmt.json
index b61c6f3e4..00a9c78f0 100644
--- a/app/javascript/dashboard/i18n/locale/ka/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ka/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "There are no inboxes attached to this account."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Business Hours",
"WIDGET_BUILDER": "Widget Builder",
"BOT_CONFIGURATION": "Bot Configuration",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Live"
+ }
+ }
+ },
"SETTINGS": "Settings",
"FEATURES": {
"LABEL": "Features",
diff --git a/app/javascript/dashboard/i18n/locale/ko/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ko/inboxMgmt.json
index 1a6e29a05..1e21c4d18 100644
--- a/app/javascript/dashboard/i18n/locale/ko/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ko/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "이 계정에는 첨부된 받은 메시지함이 없습니다."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "영업시간",
"WIDGET_BUILDER": "Widget Builder",
"BOT_CONFIGURATION": "Bot Configuration",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Live"
+ }
+ }
+ },
"SETTINGS": "설정",
"FEATURES": {
"LABEL": "특징",
diff --git a/app/javascript/dashboard/i18n/locale/lt/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/lt/inboxMgmt.json
index a11833870..20e34fa24 100644
--- a/app/javascript/dashboard/i18n/locale/lt/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/lt/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "Prie šios paskyros nėra pridėtų gautųjų laiškų aplankų."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Darbo valandos",
"WIDGET_BUILDER": "Valdiklių kūrimo priemonė",
"BOT_CONFIGURATION": "Boto konfiguracija",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Tiesiogiai"
+ }
+ }
+ },
"SETTINGS": "Nustatymai",
"FEATURES": {
"LABEL": "Funkcijos",
diff --git a/app/javascript/dashboard/i18n/locale/lv/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/lv/inboxMgmt.json
index 6bb217ebe..888760213 100644
--- a/app/javascript/dashboard/i18n/locale/lv/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/lv/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Uzzināt vairāk par iesūtnēm",
"RECONNECTION_REQUIRED": "Jūsu iesūtne ir atvienota. Jūs nesaņemsiet jaunus ziņojumus, kamēr nebūsiet tos atkārtoti autorizējis.",
"CLICK_TO_RECONNECT": "Noklikšķiniet šeit, lai atkārtoti izveidotu savienojumu.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "Šim kontam nav pievienota neviena Iesūtne."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Darba Laiks",
"WIDGET_BUILDER": "Logrīku Veidotājs",
"BOT_CONFIGURATION": "Robota Konfigurācija",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Apstiprināts",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Tiešraide"
+ }
+ }
+ },
"SETTINGS": "Iestatījumi",
"FEATURES": {
"LABEL": "Īpašības",
diff --git a/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json
index a8739c5de..b957d22c7 100644
--- a/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "ഈ അക്കൗണ്ടിലേക്കു ഇൻബോക്സുകളൊന്നും ബന്ധിപ്പിച്ചിട്ടില്ല."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Business Hours",
"WIDGET_BUILDER": "Widget Builder",
"BOT_CONFIGURATION": "Bot Configuration",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Live"
+ }
+ }
+ },
"SETTINGS": "ക്രമീകരണങ്ങൾ",
"FEATURES": {
"LABEL": "Features",
diff --git a/app/javascript/dashboard/i18n/locale/ms/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ms/inboxMgmt.json
index ddc3f91e6..389123146 100644
--- a/app/javascript/dashboard/i18n/locale/ms/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ms/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "There are no inboxes attached to this account."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Business Hours",
"WIDGET_BUILDER": "Widget Builder",
"BOT_CONFIGURATION": "Bot Configuration",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Live"
+ }
+ }
+ },
"SETTINGS": "Settings",
"FEATURES": {
"LABEL": "Features",
diff --git a/app/javascript/dashboard/i18n/locale/ne/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ne/inboxMgmt.json
index ecd24fcf4..d9fc7e643 100644
--- a/app/javascript/dashboard/i18n/locale/ne/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ne/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "There are no inboxes attached to this account."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Business Hours",
"WIDGET_BUILDER": "Widget Builder",
"BOT_CONFIGURATION": "Bot Configuration",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Live"
+ }
+ }
+ },
"SETTINGS": "Settings",
"FEATURES": {
"LABEL": "Features",
diff --git a/app/javascript/dashboard/i18n/locale/nl/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/nl/inboxMgmt.json
index 2193de3b4..24f4701bd 100644
--- a/app/javascript/dashboard/i18n/locale/nl/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/nl/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "Er zijn geen inboxen aan dit account gekoppeld."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Business Hours",
"WIDGET_BUILDER": "Widget Builder",
"BOT_CONFIGURATION": "Bot Configuration",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Live"
+ }
+ }
+ },
"SETTINGS": "Instellingen",
"FEATURES": {
"LABEL": "Features",
diff --git a/app/javascript/dashboard/i18n/locale/no/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/no/inboxMgmt.json
index 15d27fe0b..beca8fb5a 100644
--- a/app/javascript/dashboard/i18n/locale/no/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/no/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "Det er ingen innbokser tilknyttet denne kontoen."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Business Hours",
"WIDGET_BUILDER": "Widget Builder",
"BOT_CONFIGURATION": "Bot Configuration",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Live"
+ }
+ }
+ },
"SETTINGS": "Innstillinger",
"FEATURES": {
"LABEL": "Funksjoner",
diff --git a/app/javascript/dashboard/i18n/locale/pl/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/pl/inboxMgmt.json
index 247b1324b..7ee2d9779 100644
--- a/app/javascript/dashboard/i18n/locale/pl/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/pl/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "Nie ma żadnych skrzynek odbiorczych przypisanych do tego konta."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Godziny pracy",
"WIDGET_BUILDER": "Kreator widżetów",
"BOT_CONFIGURATION": "Konfiguracja bota",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Na żywo"
+ }
+ }
+ },
"SETTINGS": "Ustawienia",
"FEATURES": {
"LABEL": "Funkcje",
diff --git a/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json
index 5153a2165..3c0bbf337 100644
--- a/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "A sua caixa de entrada está desconectada. Não serão recebidas novas mensagens até nova autorização.",
"CLICK_TO_RECONNECT": "Clique aqui para reconectar.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "Não há caixas de entrada anexadas a esta conta."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Horário comercial",
"WIDGET_BUILDER": "Construtor de widgets",
"BOT_CONFIGURATION": "Configuração do bot",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Disponível"
+ }
+ }
+ },
"SETTINGS": "Configurações",
"FEATURES": {
"LABEL": "Características",
diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json
index bad2fa1b6..5212f63d4 100644
--- a/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Saiba mais sobre as caixas de entrada",
"RECONNECTION_REQUIRED": "Sua caixa de entrada está desconectada. Você não receberá novas mensagens até reautorizar.",
"CLICK_TO_RECONNECT": "Clique aqui para reconectar.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "Não há caixas de entrada anexadas a esta conta."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Horário de funcionamento",
"WIDGET_BUILDER": "Construtor de Widget",
"BOT_CONFIGURATION": "Configuração do Bot",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Aceito",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Em tempo real"
+ }
+ }
+ },
"SETTINGS": "Configurações",
"FEATURES": {
"LABEL": "Funcionalidades",
diff --git a/app/javascript/dashboard/i18n/locale/ro/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ro/inboxMgmt.json
index 767465c74..049398332 100644
--- a/app/javascript/dashboard/i18n/locale/ro/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ro/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "Nu există căsuțe poștale atașate acestui cont."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Program de lucru",
"WIDGET_BUILDER": "Widget Builder",
"BOT_CONFIGURATION": "Configurarea botului",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Live"
+ }
+ }
+ },
"SETTINGS": "Setări",
"FEATURES": {
"LABEL": "Caracteristici",
diff --git a/app/javascript/dashboard/i18n/locale/ru/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ru/inboxMgmt.json
index 163ab9ceb..3b0a8802b 100644
--- a/app/javascript/dashboard/i18n/locale/ru/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ru/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Узнать больше о «Входящих»",
"RECONNECTION_REQUIRED": "Входящие сообщения отключены. Вы не будете получать новые сообщения пока не пройдете авторизацию повторно.",
"CLICK_TO_RECONNECT": "Нажмите здесь для повторного подключения.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "У вас пока нет источников."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Время работы",
"WIDGET_BUILDER": "Конструктор виджетов",
"BOT_CONFIGURATION": "Конфигурация бота",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Одобрено",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Онлайн"
+ }
+ }
+ },
"SETTINGS": "Настройки",
"FEATURES": {
"LABEL": "Возможности",
diff --git a/app/javascript/dashboard/i18n/locale/sh/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/sh/inboxMgmt.json
index d3c0353f0..77024f23c 100644
--- a/app/javascript/dashboard/i18n/locale/sh/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/sh/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "There are no inboxes attached to this account."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Business Hours",
"WIDGET_BUILDER": "Widget Builder",
"BOT_CONFIGURATION": "Bot Configuration",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Live"
+ }
+ }
+ },
"SETTINGS": "Settings",
"FEATURES": {
"LABEL": "Features",
diff --git a/app/javascript/dashboard/i18n/locale/sk/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/sk/inboxMgmt.json
index a0b408895..fa3214620 100644
--- a/app/javascript/dashboard/i18n/locale/sk/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/sk/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "There are no inboxes attached to this account."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Otváracie hodiny",
"WIDGET_BUILDER": "Widget Builder",
"BOT_CONFIGURATION": "Bot Configuration",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Live"
+ }
+ }
+ },
"SETTINGS": "Nastavenia",
"FEATURES": {
"LABEL": "Features",
diff --git a/app/javascript/dashboard/i18n/locale/sl/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/sl/inboxMgmt.json
index df7812746..69290a1a2 100644
--- a/app/javascript/dashboard/i18n/locale/sl/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/sl/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "There are no inboxes attached to this account."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Business Hours",
"WIDGET_BUILDER": "Widget Builder",
"BOT_CONFIGURATION": "Bot Configuration",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Live"
+ }
+ }
+ },
"SETTINGS": "Settings",
"FEATURES": {
"LABEL": "Features",
diff --git a/app/javascript/dashboard/i18n/locale/sq/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/sq/inboxMgmt.json
index 3c5be4d30..0cf3267ff 100644
--- a/app/javascript/dashboard/i18n/locale/sq/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/sq/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "There are no inboxes attached to this account."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Business Hours",
"WIDGET_BUILDER": "Widget Builder",
"BOT_CONFIGURATION": "Bot Configuration",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Live"
+ }
+ }
+ },
"SETTINGS": "Settings",
"FEATURES": {
"LABEL": "Features",
diff --git a/app/javascript/dashboard/i18n/locale/sr/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/sr/inboxMgmt.json
index 4fa945852..a4fece97a 100644
--- a/app/javascript/dashboard/i18n/locale/sr/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/sr/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "Nema prijamnih sandučeta povezanih sa ovim nalogom."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Radno vreme",
"WIDGET_BUILDER": "Izgrađivač vidžeta",
"BOT_CONFIGURATION": "Bot Configuration",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "Izveštaj o zadovoljstvu"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Uživo"
+ }
+ }
+ },
"SETTINGS": "Podešavanja",
"FEATURES": {
"LABEL": "Mogućnosti",
diff --git a/app/javascript/dashboard/i18n/locale/sv/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/sv/inboxMgmt.json
index 143ec9830..cfa768b2d 100644
--- a/app/javascript/dashboard/i18n/locale/sv/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/sv/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "Det finns inga inkorgar kopplade till detta konto."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Öppettider",
"WIDGET_BUILDER": "Widget Builder",
"BOT_CONFIGURATION": "Bot Configuration",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Live"
+ }
+ }
+ },
"SETTINGS": "Inställningar",
"FEATURES": {
"LABEL": "Funktioner",
diff --git a/app/javascript/dashboard/i18n/locale/ta/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ta/inboxMgmt.json
index 34c49db7e..32f0db539 100644
--- a/app/javascript/dashboard/i18n/locale/ta/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ta/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "இந்த கணக்கில் இன்பாக்ஸ்கள் எதுவும் இணைக்கப்படவில்லை."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Business Hours",
"WIDGET_BUILDER": "Widget Builder",
"BOT_CONFIGURATION": "Bot Configuration",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Live"
+ }
+ }
+ },
"SETTINGS": "அமைப்புகள்",
"FEATURES": {
"LABEL": "Features",
diff --git a/app/javascript/dashboard/i18n/locale/th/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/th/inboxMgmt.json
index 36b35e142..3ed841223 100644
--- a/app/javascript/dashboard/i18n/locale/th/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/th/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "ไม่มีกล่องข้อความที่เกี่ยวข้องในบัญชีนี้"
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "เวลาทำการ",
"WIDGET_BUILDER": "เครื่องมือสร้าง Widget",
"BOT_CONFIGURATION": "Bot Configuration",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "ขณะนี้"
+ }
+ }
+ },
"SETTINGS": "ตั้งค่า",
"FEATURES": {
"LABEL": "ฟีเจอร์",
diff --git a/app/javascript/dashboard/i18n/locale/tl/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/tl/inboxMgmt.json
index 1c54adcb2..60038253c 100644
--- a/app/javascript/dashboard/i18n/locale/tl/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/tl/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "There are no inboxes attached to this account."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Business Hours",
"WIDGET_BUILDER": "Widget Builder",
"BOT_CONFIGURATION": "Bot Configuration",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Live"
+ }
+ }
+ },
"SETTINGS": "Settings",
"FEATURES": {
"LABEL": "Features",
diff --git a/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json
index 1d5fc9983..cb131e8fc 100644
--- a/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "Bu hesaba bağlı gelen kutusu yok."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "İş Saatleri",
"WIDGET_BUILDER": "Widget Oluşturucu",
"BOT_CONFIGURATION": "Bot Yapılandırma",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Canlı"
+ }
+ }
+ },
"SETTINGS": "Ayarlar",
"FEATURES": {
"LABEL": "Özellikleri",
diff --git a/app/javascript/dashboard/i18n/locale/uk/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/uk/inboxMgmt.json
index b145602b1..b3b2108b0 100644
--- a/app/javascript/dashboard/i18n/locale/uk/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/uk/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "В цього облікового запису немає скриньк."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Робочий час",
"WIDGET_BUILDER": "Конструктор віджетів",
"BOT_CONFIGURATION": "Налаштування бота",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Онлайн"
+ }
+ }
+ },
"SETTINGS": "Налаштування",
"FEATURES": {
"LABEL": "Особливості",
diff --git a/app/javascript/dashboard/i18n/locale/ur/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ur/inboxMgmt.json
index 1d984e85b..7c36d716f 100644
--- a/app/javascript/dashboard/i18n/locale/ur/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ur/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "There are no inboxes attached to this account."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Business Hours",
"WIDGET_BUILDER": "Widget Builder",
"BOT_CONFIGURATION": "Bot Configuration",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Live"
+ }
+ }
+ },
"SETTINGS": "Settings",
"FEATURES": {
"LABEL": "Features",
diff --git a/app/javascript/dashboard/i18n/locale/ur_IN/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ur_IN/inboxMgmt.json
index b3a02062d..757ba2ca8 100644
--- a/app/javascript/dashboard/i18n/locale/ur_IN/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ur_IN/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "There are no inboxes attached to this account."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Business Hours",
"WIDGET_BUILDER": "Widget Builder",
"BOT_CONFIGURATION": "Bot Configuration",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Live"
+ }
+ }
+ },
"SETTINGS": "Settings",
"FEATURES": {
"LABEL": "Features",
diff --git a/app/javascript/dashboard/i18n/locale/vi/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/vi/inboxMgmt.json
index a990eeb42..81bc1b8eb 100644
--- a/app/javascript/dashboard/i18n/locale/vi/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/vi/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "Không có hộp thư đến nào được đính kèm với tài khoản này."
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "Giờ làm việc",
"WIDGET_BUILDER": "Trình tạo widget",
"BOT_CONFIGURATION": "Cấu hình Bot",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "CSAT"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Trực tuyến"
+ }
+ }
+ },
"SETTINGS": "Cài đặt",
"FEATURES": {
"LABEL": "Các tính năng",
diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/zh_CN/inboxMgmt.json
index e2e437400..93e79d04d 100644
--- a/app/javascript/dashboard/i18n/locale/zh_CN/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/zh_CN/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "了解更多关于收件箱的信息",
"RECONNECTION_REQUIRED": "您的收件箱已断开连接。在您重新授权之前,您不会收到新消息。",
"CLICK_TO_RECONNECT": "点击此处重新连接。",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "此账户没有收件箱。"
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "工作时间",
"WIDGET_BUILDER": "小部件生成器",
"BOT_CONFIGURATION": "机器人配置",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "客户满意度"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "已批准",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "实时"
+ }
+ }
+ },
"SETTINGS": "设置",
"FEATURES": {
"LABEL": "特性",
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json
index 80b25bfb8..02fd64aff 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json
@@ -5,6 +5,8 @@
"LEARN_MORE": "Learn more about inboxes",
"RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.",
"CLICK_TO_RECONNECT": "Click here to reconnect.",
+ "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.",
+ "COMPLETE_REGISTRATION": "Complete Registration",
"LIST": {
"404": "此帳戶没有收件匣。"
},
@@ -605,8 +607,62 @@
"BUSINESS_HOURS": "服務時間",
"WIDGET_BUILDER": "Widget Builder",
"BOT_CONFIGURATION": "增機器人設定",
+ "ACCOUNT_HEALTH": "Account Health",
"CSAT": "顧客滿意度得分(CSAT)"
},
+ "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",
+ "FIELDS": {
+ "DISPLAY_PHONE_NUMBER": {
+ "LABEL": "Display phone number",
+ "TOOLTIP": "Phone number displayed to customers"
+ },
+ "VERIFIED_NAME": {
+ "LABEL": "Business name",
+ "TOOLTIP": "Business name verified by WhatsApp"
+ },
+ "DISPLAY_NAME_STATUS": {
+ "LABEL": "Display name status",
+ "TOOLTIP": "Status of your business name verification"
+ },
+ "QUALITY_RATING": {
+ "LABEL": "Quality rating",
+ "TOOLTIP": "WhatsApp quality rating for your account"
+ },
+ "MESSAGING_LIMIT_TIER": {
+ "LABEL": "Messaging limit tier",
+ "TOOLTIP": "Daily messaging limit for your account"
+ },
+ "ACCOUNT_MODE": {
+ "LABEL": "Account mode",
+ "TOOLTIP": "Current operating mode of your WhatsApp account"
+ }
+ },
+ "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"
+ },
+ "STATUSES": {
+ "APPROVED": "Approved",
+ "PENDING_REVIEW": "Pending Review",
+ "AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
+ "REJECTED": "Rejected",
+ "DECLINED": "Declined"
+ },
+ "MODES": {
+ "SANDBOX": "Sandbox",
+ "LIVE": "Live"
+ }
+ }
+ },
"SETTINGS": "設定",
"FEATURES": {
"LABEL": "Features",
From a8aefa0c73d3f7d830b9f1525cef61a31b75e9ee Mon Sep 17 00:00:00 2001
From: Muhsin Keloth
Date: Mon, 6 Oct 2025 13:00:11 +0530
Subject: [PATCH 157/182] chore: Add account health missing translations
(#12596)
# Pull Request Template
## Description
Please include a summary of the change and issue(s) fixed. Also, mention
relevant motivation, context, and any dependencies that this change
requires.
Fixes # (issue)
## 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)
- [ ] 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?
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:
- [ ] 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
---
app/javascript/dashboard/i18n/locale/en/inboxMgmt.json | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json
index 60038253c..87fe57564 100644
--- a/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
From 8bbb8ba5a4495b848dae7ce3afcef412f5fb4861 Mon Sep 17 00:00:00 2001
From: Shivam Mishra
Date: Mon, 6 Oct 2025 20:23:15 +0530
Subject: [PATCH 158/182] feat(ee): Captain custom http tools (#12584)
To test this out, use the following PR:
https://github.com/chatwoot/chatwoot/pull/12585
---------
Co-authored-by: Pranav
---
...51003091242_create_captain_custom_tools.rb | 22 +
db/schema.rb | 21 +-
.../accounts/captain/assistants_controller.rb | 3 +-
enterprise/app/models/captain/assistant.rb | 13 +
enterprise/app/models/captain/custom_tool.rb | 91 +++++
enterprise/app/models/captain/scenario.rb | 20 +-
.../models/concerns/captain_tools_helpers.rb | 16 +-
.../concerns/safe_endpoint_validatable.rb | 84 ++++
enterprise/app/models/concerns/toolable.rb | 78 ++++
.../app/models/enterprise/concerns/account.rb | 1 +
enterprise/lib/captain/tools/http_tool.rb | 105 +++++
lib/tasks/captain_chat.rake | 2 +-
.../lib/captain/tools/http_tool_spec.rb | 241 +++++++++++
.../models/captain/custom_tool_spec.rb | 386 ++++++++++++++++++
.../models/captain/scenario_spec.rb | 183 ++++++++-
.../concerns/captain_tools_helpers_spec.rb | 74 ----
spec/factories/captain/custom_tool.rb | 51 +++
17 files changed, 1299 insertions(+), 92 deletions(-)
create mode 100644 db/migrate/20251003091242_create_captain_custom_tools.rb
create mode 100644 enterprise/app/models/captain/custom_tool.rb
create mode 100644 enterprise/app/models/concerns/safe_endpoint_validatable.rb
create mode 100644 enterprise/app/models/concerns/toolable.rb
create mode 100644 enterprise/lib/captain/tools/http_tool.rb
create mode 100644 spec/enterprise/lib/captain/tools/http_tool_spec.rb
create mode 100644 spec/enterprise/models/captain/custom_tool_spec.rb
create mode 100644 spec/factories/captain/custom_tool.rb
diff --git a/db/migrate/20251003091242_create_captain_custom_tools.rb b/db/migrate/20251003091242_create_captain_custom_tools.rb
new file mode 100644
index 000000000..8f63d826e
--- /dev/null
+++ b/db/migrate/20251003091242_create_captain_custom_tools.rb
@@ -0,0 +1,22 @@
+class CreateCaptainCustomTools < ActiveRecord::Migration[7.1]
+ def change
+ create_table :captain_custom_tools do |t|
+ t.references :account, null: false, index: true
+ t.string :slug, null: false
+ t.string :title, null: false
+ t.text :description
+ t.string :http_method, null: false, default: 'GET'
+ t.text :endpoint_url, null: false
+ t.text :request_template
+ t.text :response_template
+ t.string :auth_type, default: 'none'
+ t.jsonb :auth_config, default: {}
+ t.jsonb :param_schema, default: []
+ t.boolean :enabled, default: true, null: false
+
+ t.timestamps
+ end
+
+ add_index :captain_custom_tools, [:account_id, :slug], unique: true
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index d5f0c244c..f31d05cc3 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: 2025_09_17_012759) do
+ActiveRecord::Schema[7.1].define(version: 2025_10_03_091242) do
# These extensions should be enabled to support this database
enable_extension "pg_stat_statements"
enable_extension "pg_trgm"
@@ -323,6 +323,25 @@ ActiveRecord::Schema[7.1].define(version: 2025_09_17_012759) do
t.index ["account_id"], name: "index_captain_assistants_on_account_id"
end
+ create_table "captain_custom_tools", force: :cascade do |t|
+ t.bigint "account_id", null: false
+ t.string "slug", null: false
+ t.string "title", null: false
+ t.text "description"
+ t.string "http_method", default: "GET", null: false
+ t.text "endpoint_url", null: false
+ t.text "request_template"
+ t.text "response_template"
+ t.string "auth_type", default: "none"
+ t.jsonb "auth_config", default: {}
+ t.jsonb "param_schema", default: []
+ t.boolean "enabled", default: true, null: false
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.index ["account_id", "slug"], name: "index_captain_custom_tools_on_account_id_and_slug", unique: true
+ t.index ["account_id"], name: "index_captain_custom_tools_on_account_id"
+ end
+
create_table "captain_documents", force: :cascade do |t|
t.string "name"
t.string "external_link", null: false
diff --git a/enterprise/app/controllers/api/v1/accounts/captain/assistants_controller.rb b/enterprise/app/controllers/api/v1/accounts/captain/assistants_controller.rb
index 21675bad0..ebeaaf67f 100644
--- a/enterprise/app/controllers/api/v1/accounts/captain/assistants_controller.rb
+++ b/enterprise/app/controllers/api/v1/accounts/captain/assistants_controller.rb
@@ -33,7 +33,8 @@ class Api::V1::Accounts::Captain::AssistantsController < Api::V1::Accounts::Base
end
def tools
- @tools = Captain::Assistant.available_agent_tools
+ assistant = Captain::Assistant.new(account: Current.account)
+ @tools = assistant.available_agent_tools
end
private
diff --git a/enterprise/app/models/captain/assistant.rb b/enterprise/app/models/captain/assistant.rb
index 0423abf67..21ecf05c4 100644
--- a/enterprise/app/models/captain/assistant.rb
+++ b/enterprise/app/models/captain/assistant.rb
@@ -50,6 +50,19 @@ class Captain::Assistant < ApplicationRecord
name
end
+ def available_agent_tools
+ tools = self.class.built_in_agent_tools.dup
+
+ custom_tools = account.captain_custom_tools.enabled.map(&:to_tool_metadata)
+ tools.concat(custom_tools)
+
+ tools
+ end
+
+ def available_tool_ids
+ available_agent_tools.pluck(:id)
+ end
+
def push_event_data
{
id: id,
diff --git a/enterprise/app/models/captain/custom_tool.rb b/enterprise/app/models/captain/custom_tool.rb
new file mode 100644
index 000000000..8ad02f401
--- /dev/null
+++ b/enterprise/app/models/captain/custom_tool.rb
@@ -0,0 +1,91 @@
+# == Schema Information
+#
+# Table name: captain_custom_tools
+#
+# id :bigint not null, primary key
+# auth_config :jsonb
+# auth_type :string default("none")
+# description :text
+# enabled :boolean default(TRUE), not null
+# endpoint_url :text not null
+# http_method :string default("GET"), not null
+# param_schema :jsonb
+# request_template :text
+# response_template :text
+# slug :string not null
+# title :string not null
+# created_at :datetime not null
+# updated_at :datetime not null
+# account_id :bigint not null
+#
+# Indexes
+#
+# index_captain_custom_tools_on_account_id (account_id)
+# index_captain_custom_tools_on_account_id_and_slug (account_id,slug) UNIQUE
+#
+class Captain::CustomTool < ApplicationRecord
+ include Concerns::Toolable
+ include Concerns::SafeEndpointValidatable
+
+ self.table_name = 'captain_custom_tools'
+
+ PARAM_SCHEMA_VALIDATION = {
+ 'type': 'array',
+ 'items': {
+ 'type': 'object',
+ 'properties': {
+ 'name': { 'type': 'string' },
+ 'type': { 'type': 'string' },
+ 'description': { 'type': 'string' },
+ 'required': { 'type': 'boolean' }
+ },
+ 'required': %w[name type description],
+ 'additionalProperties': false
+ }
+ }.to_json.freeze
+
+ belongs_to :account
+
+ enum :http_method, %w[GET POST].index_by(&:itself), validate: true
+ enum :auth_type, %w[none bearer basic api_key].index_by(&:itself), default: :none, validate: true, prefix: :auth
+
+ before_validation :generate_slug
+
+ validates :slug, presence: true, uniqueness: { scope: :account_id }
+ validates :title, presence: true
+ validates :endpoint_url, presence: true
+ validates_with JsonSchemaValidator,
+ schema: PARAM_SCHEMA_VALIDATION,
+ attribute_resolver: ->(record) { record.param_schema }
+
+ scope :enabled, -> { where(enabled: true) }
+
+ def to_tool_metadata
+ {
+ id: slug,
+ title: title,
+ description: description,
+ custom: true
+ }
+ end
+
+ private
+
+ def generate_slug
+ return if slug.present?
+
+ base_slug = title.present? ? "custom_#{title.parameterize}" : "custom_#{SecureRandom.uuid}"
+ self.slug = find_unique_slug(base_slug)
+ end
+
+ def find_unique_slug(base_slug, counter = 0)
+ slug_candidate = counter.zero? ? base_slug : "#{base_slug}-#{counter}"
+ return find_unique_slug(base_slug, counter + 1) if slug_exists?(slug_candidate)
+
+ slug_candidate
+ end
+
+ def slug_exists?(candidate)
+ self.class.exists?(account_id: account_id, slug: candidate)
+ end
+end
diff --git a/enterprise/app/models/captain/scenario.rb b/enterprise/app/models/captain/scenario.rb
index aac7e2411..d04990199 100644
--- a/enterprise/app/models/captain/scenario.rb
+++ b/enterprise/app/models/captain/scenario.rb
@@ -57,7 +57,7 @@ class Captain::Scenario < ApplicationRecord
end
def agent_tools
- resolved_tools.map { |tool| self.class.resolve_tool_class(tool[:id]) }.map { |tool| tool.new(assistant) }
+ resolved_tools.map { |tool| resolve_tool_instance(tool) }
end
def resolved_instructions
@@ -69,12 +69,24 @@ class Captain::Scenario < ApplicationRecord
def resolved_tools
return [] if tools.blank?
- available_tools = self.class.available_agent_tools
+ available_tools = assistant.available_agent_tools
tools.filter_map do |tool_id|
available_tools.find { |tool| tool[:id] == tool_id }
end
end
+ def resolve_tool_instance(tool_metadata)
+ tool_id = tool_metadata[:id]
+
+ if tool_metadata[:custom]
+ custom_tool = Captain::CustomTool.find_by(slug: tool_id, account_id: account_id, enabled: true)
+ custom_tool&.tool(assistant)
+ else
+ tool_class = self.class.resolve_tool_class(tool_id)
+ tool_class&.new(assistant)
+ end
+ end
+
# Validates that all tool references in the instruction are valid.
# Parses the instruction for tool references and checks if they exist
# in the available tools configuration.
@@ -95,8 +107,8 @@ class Captain::Scenario < ApplicationRecord
tool_ids = extract_tool_ids_from_text(instruction)
return if tool_ids.empty?
- available_tool_ids = self.class.available_tool_ids
- invalid_tools = tool_ids - available_tool_ids
+ all_available_tool_ids = assistant.available_tool_ids
+ invalid_tools = tool_ids - all_available_tool_ids
return unless invalid_tools.any?
diff --git a/enterprise/app/models/concerns/captain_tools_helpers.rb b/enterprise/app/models/concerns/captain_tools_helpers.rb
index 5a660310c..34133aac2 100644
--- a/enterprise/app/models/concerns/captain_tools_helpers.rb
+++ b/enterprise/app/models/concerns/captain_tools_helpers.rb
@@ -8,12 +8,12 @@ module Concerns::CaptainToolsHelpers
TOOL_REFERENCE_REGEX = %r{\[[^\]]+\]\(tool://([^/)]+)\)}
class_methods do
- # Returns all available agent tools with their metadata.
+ # Returns all built-in agent tools with their metadata.
# Only includes tools that have corresponding class files and can be resolved.
#
# @return [Array] Array of tool hashes with :id, :title, :description, :icon
- def available_agent_tools
- @available_agent_tools ||= load_agent_tools
+ def built_in_agent_tools
+ @built_in_agent_tools ||= load_agent_tools
end
# Resolves a tool class from a tool ID.
@@ -26,12 +26,12 @@ module Concerns::CaptainToolsHelpers
class_name.safe_constantize
end
- # Returns an array of all available tool IDs.
- # Convenience method that extracts just the IDs from available_agent_tools.
+ # Returns an array of all built-in tool IDs.
+ # Convenience method that extracts just the IDs from built_in_agent_tools.
#
- # @return [Array] Array of available tool IDs
- def available_tool_ids
- @available_tool_ids ||= available_agent_tools.map { |tool| tool[:id] }
+ # @return [Array] Array of built-in tool IDs
+ def built_in_tool_ids
+ @built_in_tool_ids ||= built_in_agent_tools.map { |tool| tool[:id] }
end
private
diff --git a/enterprise/app/models/concerns/safe_endpoint_validatable.rb b/enterprise/app/models/concerns/safe_endpoint_validatable.rb
new file mode 100644
index 000000000..b151b10e7
--- /dev/null
+++ b/enterprise/app/models/concerns/safe_endpoint_validatable.rb
@@ -0,0 +1,84 @@
+module Concerns::SafeEndpointValidatable
+ extend ActiveSupport::Concern
+
+ FRONTEND_HOST = URI.parse(ENV.fetch('FRONTEND_URL', 'http://localhost:3000')).host.freeze
+ DISALLOWED_HOSTS = ['localhost', /\.local\z/i].freeze
+
+ included do
+ validate :validate_safe_endpoint_url
+ end
+
+ private
+
+ def validate_safe_endpoint_url
+ return if endpoint_url.blank?
+
+ uri = parse_endpoint_uri
+ return errors.add(:endpoint_url, 'must be a valid URL') unless uri
+
+ validate_endpoint_scheme(uri)
+ validate_endpoint_host(uri)
+ validate_not_ip_address(uri)
+ validate_no_unicode_chars(uri)
+ end
+
+ def parse_endpoint_uri
+ # Strip Liquid template syntax for validation
+ # Replace {{ variable }} with a placeholder value
+ sanitized_url = endpoint_url.gsub(/\{\{[^}]+\}\}/, 'placeholder')
+ URI.parse(sanitized_url)
+ rescue URI::InvalidURIError
+ nil
+ end
+
+ def validate_endpoint_scheme(uri)
+ return if uri.scheme == 'https'
+
+ errors.add(:endpoint_url, 'must use HTTPS protocol')
+ end
+
+ def validate_endpoint_host(uri)
+ if uri.host.blank?
+ errors.add(:endpoint_url, 'must have a valid hostname')
+ return
+ end
+
+ if uri.host == FRONTEND_HOST
+ errors.add(:endpoint_url, 'cannot point to the application itself')
+ return
+ end
+
+ DISALLOWED_HOSTS.each do |pattern|
+ matched = if pattern.is_a?(Regexp)
+ uri.host =~ pattern
+ else
+ uri.host.downcase == pattern
+ end
+
+ next unless matched
+
+ errors.add(:endpoint_url, 'cannot use disallowed hostname')
+ break
+ end
+ end
+
+ def validate_not_ip_address(uri)
+ # Check for IPv4
+ if /\A\d+\.\d+\.\d+\.\d+\z/.match?(uri.host)
+ errors.add(:endpoint_url, 'cannot be an IP address, must be a hostname')
+ return
+ end
+
+ # Check for IPv6
+ return unless uri.host.include?(':')
+
+ errors.add(:endpoint_url, 'cannot be an IP address, must be a hostname')
+ end
+
+ def validate_no_unicode_chars(uri)
+ return unless uri.host
+ return if /\A[\x00-\x7F]+\z/.match?(uri.host)
+
+ errors.add(:endpoint_url, 'hostname cannot contain non-ASCII characters')
+ end
+end
diff --git a/enterprise/app/models/concerns/toolable.rb b/enterprise/app/models/concerns/toolable.rb
new file mode 100644
index 000000000..24c16c6f4
--- /dev/null
+++ b/enterprise/app/models/concerns/toolable.rb
@@ -0,0 +1,78 @@
+module Concerns::Toolable
+ extend ActiveSupport::Concern
+
+ def tool(assistant)
+ custom_tool_record = self
+
+ tool_class = Class.new(Captain::Tools::HttpTool) do
+ description custom_tool_record.description
+
+ custom_tool_record.param_schema.each do |param_def|
+ param param_def['name'].to_sym,
+ type: param_def['type'],
+ desc: param_def['description'],
+ required: param_def.fetch('required', true)
+ end
+ end
+
+ tool_class.new(assistant, self)
+ end
+
+ def build_request_url(params)
+ return endpoint_url if endpoint_url.blank? || endpoint_url.exclude?('{{')
+
+ render_template(endpoint_url, params)
+ end
+
+ def build_request_body(params)
+ return nil if request_template.blank?
+
+ render_template(request_template, params)
+ end
+
+ def build_auth_headers
+ return {} if auth_none?
+
+ case auth_type
+ when 'bearer'
+ { 'Authorization' => "Bearer #{auth_config['token']}" }
+ when 'api_key'
+ if auth_config['location'] == 'header'
+ { auth_config['name'] => auth_config['key'] }
+ else
+ {}
+ end
+ else
+ {}
+ end
+ end
+
+ def build_basic_auth_credentials
+ return nil unless auth_type == 'basic'
+
+ [auth_config['username'], auth_config['password']]
+ end
+
+ def format_response(raw_response_body)
+ return raw_response_body if response_template.blank?
+
+ response_data = parse_response_body(raw_response_body)
+ render_template(response_template, { 'response' => response_data })
+ end
+
+ private
+
+ def render_template(template, context)
+ liquid_template = Liquid::Template.parse(template, error_mode: :strict)
+ liquid_template.render(context.deep_stringify_keys, registers: {}, strict_variables: true, strict_filters: true)
+ rescue Liquid::SyntaxError, Liquid::UndefinedVariable, Liquid::UndefinedFilter => e
+ Rails.logger.error("Liquid template error: #{e.message}")
+ raise "Template rendering failed: #{e.message}"
+ end
+
+ def parse_response_body(body)
+ JSON.parse(body)
+ rescue JSON::ParserError
+ body
+ end
+end
diff --git a/enterprise/app/models/enterprise/concerns/account.rb b/enterprise/app/models/enterprise/concerns/account.rb
index b52ac4b3e..b82d84b0a 100644
--- a/enterprise/app/models/enterprise/concerns/account.rb
+++ b/enterprise/app/models/enterprise/concerns/account.rb
@@ -10,6 +10,7 @@ module Enterprise::Concerns::Account
has_many :captain_assistants, dependent: :destroy_async, class_name: 'Captain::Assistant'
has_many :captain_assistant_responses, dependent: :destroy_async, class_name: 'Captain::AssistantResponse'
has_many :captain_documents, dependent: :destroy_async, class_name: 'Captain::Document'
+ has_many :captain_custom_tools, dependent: :destroy_async, class_name: 'Captain::CustomTool'
has_many :copilot_threads, dependent: :destroy_async
has_many :voice_channels, dependent: :destroy_async, class_name: '::Channel::Voice'
diff --git a/enterprise/lib/captain/tools/http_tool.rb b/enterprise/lib/captain/tools/http_tool.rb
new file mode 100644
index 000000000..b634de04e
--- /dev/null
+++ b/enterprise/lib/captain/tools/http_tool.rb
@@ -0,0 +1,105 @@
+require 'agents'
+
+class Captain::Tools::HttpTool < Agents::Tool
+ def initialize(assistant, custom_tool)
+ @assistant = assistant
+ @custom_tool = custom_tool
+ super()
+ end
+
+ def active?
+ @custom_tool.enabled?
+ end
+
+ def perform(_tool_context, **params)
+ url = @custom_tool.build_request_url(params)
+ body = @custom_tool.build_request_body(params)
+
+ response = execute_http_request(url, body)
+ @custom_tool.format_response(response.body)
+ rescue StandardError => e
+ Rails.logger.error("HttpTool execution error for #{@custom_tool.slug}: #{e.class} - #{e.message}")
+ 'An error occurred while executing the request'
+ end
+
+ private
+
+ PRIVATE_IP_RANGES = [
+ IPAddr.new('127.0.0.0/8'), # IPv4 Loopback
+ IPAddr.new('10.0.0.0/8'), # IPv4 Private network
+ IPAddr.new('172.16.0.0/12'), # IPv4 Private network
+ IPAddr.new('192.168.0.0/16'), # IPv4 Private network
+ IPAddr.new('169.254.0.0/16'), # IPv4 Link-local
+ IPAddr.new('::1'), # IPv6 Loopback
+ IPAddr.new('fc00::/7'), # IPv6 Unique local addresses
+ IPAddr.new('fe80::/10') # IPv6 Link-local
+ ].freeze
+
+ # Limit response size to prevent memory exhaustion and match LLM token limits
+ # 1MB of text ≈ 250K tokens, which exceeds most LLM context windows
+ MAX_RESPONSE_SIZE = 1.megabyte
+
+ def execute_http_request(url, body)
+ uri = URI.parse(url)
+
+ # Check if resolved IP is private
+ check_private_ip!(uri.host)
+
+ http = Net::HTTP.new(uri.host, uri.port)
+ http.use_ssl = uri.scheme == 'https'
+ http.read_timeout = 30
+ http.open_timeout = 10
+ http.max_retries = 0 # Disable redirects
+
+ request = build_http_request(uri, body)
+ apply_authentication(request)
+
+ response = http.request(request)
+
+ raise "HTTP request failed with status #{response.code}" unless response.is_a?(Net::HTTPSuccess)
+
+ validate_response!(response)
+
+ response
+ end
+
+ def check_private_ip!(hostname)
+ ip_address = IPAddr.new(Resolv.getaddress(hostname))
+
+ raise 'Request blocked: hostname resolves to private IP address' if PRIVATE_IP_RANGES.any? { |range| range.include?(ip_address) }
+ rescue Resolv::ResolvError, SocketError => e
+ raise "DNS resolution failed: #{e.message}"
+ end
+
+ def validate_response!(response)
+ content_length = response['content-length']&.to_i
+ if content_length && content_length > MAX_RESPONSE_SIZE
+ raise "Response size #{content_length} bytes exceeds maximum allowed #{MAX_RESPONSE_SIZE} bytes"
+ end
+
+ return unless response.body && response.body.bytesize > MAX_RESPONSE_SIZE
+
+ raise "Response body size #{response.body.bytesize} bytes exceeds maximum allowed #{MAX_RESPONSE_SIZE} bytes"
+ end
+
+ def build_http_request(uri, body)
+ if @custom_tool.http_method == 'POST'
+ request = Net::HTTP::Post.new(uri.request_uri)
+ if body
+ request.body = body
+ request['Content-Type'] = 'application/json'
+ end
+ else
+ request = Net::HTTP::Get.new(uri.request_uri)
+ end
+ request
+ end
+
+ def apply_authentication(request)
+ headers = @custom_tool.build_auth_headers
+ headers.each { |key, value| request[key] = value }
+
+ credentials = @custom_tool.build_basic_auth_credentials
+ request.basic_auth(*credentials) if credentials
+ end
+end
diff --git a/lib/tasks/captain_chat.rake b/lib/tasks/captain_chat.rake
index cfe257196..6dfb37211 100644
--- a/lib/tasks/captain_chat.rake
+++ b/lib/tasks/captain_chat.rake
@@ -118,7 +118,7 @@ class CaptainChatSession
end
def show_available_tools
- available_tools = Captain::Assistant.available_tool_ids
+ available_tools = @assistant.available_tool_ids
if available_tools.any?
puts "🔧 Available Tools (#{available_tools.count}): #{available_tools.join(', ')}"
else
diff --git a/spec/enterprise/lib/captain/tools/http_tool_spec.rb b/spec/enterprise/lib/captain/tools/http_tool_spec.rb
new file mode 100644
index 000000000..d48af2752
--- /dev/null
+++ b/spec/enterprise/lib/captain/tools/http_tool_spec.rb
@@ -0,0 +1,241 @@
+require 'rails_helper'
+
+RSpec.describe Captain::Tools::HttpTool, type: :model do
+ let(:account) { create(:account) }
+ let(:assistant) { create(:captain_assistant, account: account) }
+ let(:custom_tool) { create(:captain_custom_tool, account: account) }
+ let(:tool) { described_class.new(assistant, custom_tool) }
+ let(:tool_context) { Struct.new(:state).new({}) }
+
+ describe '#active?' do
+ it 'returns true when custom tool is enabled' do
+ custom_tool.update!(enabled: true)
+
+ expect(tool.active?).to be true
+ end
+
+ it 'returns false when custom tool is disabled' do
+ custom_tool.update!(enabled: false)
+
+ expect(tool.active?).to be false
+ end
+ end
+
+ describe '#perform' do
+ context 'with GET request' do
+ before do
+ custom_tool.update!(
+ http_method: 'GET',
+ endpoint_url: 'https://example.com/orders/123',
+ response_template: nil
+ )
+ stub_request(:get, 'https://example.com/orders/123')
+ .to_return(status: 200, body: '{"status": "success"}')
+ end
+
+ it 'executes GET request and returns response body' do
+ result = tool.perform(tool_context)
+
+ expect(result).to eq('{"status": "success"}')
+ expect(WebMock).to have_requested(:get, 'https://example.com/orders/123')
+ end
+ end
+
+ context 'with POST request' do
+ before do
+ custom_tool.update!(
+ http_method: 'POST',
+ endpoint_url: 'https://example.com/orders',
+ request_template: '{"order_id": "{{ order_id }}"}',
+ response_template: nil
+ )
+ stub_request(:post, 'https://example.com/orders')
+ .with(body: '{"order_id": "123"}', headers: { 'Content-Type' => 'application/json' })
+ .to_return(status: 200, body: '{"created": true}')
+ end
+
+ it 'executes POST request with rendered body' do
+ result = tool.perform(tool_context, order_id: '123')
+
+ expect(result).to eq('{"created": true}')
+ expect(WebMock).to have_requested(:post, 'https://example.com/orders')
+ .with(body: '{"order_id": "123"}')
+ end
+ end
+
+ context 'with template variables in URL' do
+ before do
+ custom_tool.update!(
+ endpoint_url: 'https://example.com/orders/{{ order_id }}',
+ response_template: nil
+ )
+ stub_request(:get, 'https://example.com/orders/456')
+ .to_return(status: 200, body: '{"order_id": "456"}')
+ end
+
+ it 'renders URL template with params' do
+ result = tool.perform(tool_context, order_id: '456')
+
+ expect(result).to eq('{"order_id": "456"}')
+ expect(WebMock).to have_requested(:get, 'https://example.com/orders/456')
+ end
+ end
+
+ context 'with bearer token authentication' do
+ before do
+ custom_tool.update!(
+ auth_type: 'bearer',
+ auth_config: { 'token' => 'secret_bearer_token' },
+ endpoint_url: 'https://example.com/data',
+ response_template: nil
+ )
+ stub_request(:get, 'https://example.com/data')
+ .with(headers: { 'Authorization' => 'Bearer secret_bearer_token' })
+ .to_return(status: 200, body: '{"authenticated": true}')
+ end
+
+ it 'adds Authorization header with bearer token' do
+ result = tool.perform(tool_context)
+
+ expect(result).to eq('{"authenticated": true}')
+ expect(WebMock).to have_requested(:get, 'https://example.com/data')
+ .with(headers: { 'Authorization' => 'Bearer secret_bearer_token' })
+ end
+ end
+
+ context 'with basic authentication' do
+ before do
+ custom_tool.update!(
+ auth_type: 'basic',
+ auth_config: { 'username' => 'user123', 'password' => 'pass456' },
+ endpoint_url: 'https://example.com/data',
+ response_template: nil
+ )
+ stub_request(:get, 'https://example.com/data')
+ .with(basic_auth: %w[user123 pass456])
+ .to_return(status: 200, body: '{"authenticated": true}')
+ end
+
+ it 'adds basic auth credentials' do
+ result = tool.perform(tool_context)
+
+ expect(result).to eq('{"authenticated": true}')
+ expect(WebMock).to have_requested(:get, 'https://example.com/data')
+ .with(basic_auth: %w[user123 pass456])
+ end
+ end
+
+ context 'with API key authentication' do
+ before do
+ custom_tool.update!(
+ auth_type: 'api_key',
+ auth_config: { 'key' => 'api_key_123', 'location' => 'header', 'name' => 'X-API-Key' },
+ endpoint_url: 'https://example.com/data',
+ response_template: nil
+ )
+ stub_request(:get, 'https://example.com/data')
+ .with(headers: { 'X-API-Key' => 'api_key_123' })
+ .to_return(status: 200, body: '{"authenticated": true}')
+ end
+
+ it 'adds API key header' do
+ result = tool.perform(tool_context)
+
+ expect(result).to eq('{"authenticated": true}')
+ expect(WebMock).to have_requested(:get, 'https://example.com/data')
+ .with(headers: { 'X-API-Key' => 'api_key_123' })
+ end
+ end
+
+ context 'with response template' do
+ before do
+ custom_tool.update!(
+ endpoint_url: 'https://example.com/orders/123',
+ response_template: 'Order status: {{ response.status }}, ID: {{ response.order_id }}'
+ )
+ stub_request(:get, 'https://example.com/orders/123')
+ .to_return(status: 200, body: '{"status": "shipped", "order_id": "123"}')
+ end
+
+ it 'formats response using template' do
+ result = tool.perform(tool_context)
+
+ expect(result).to eq('Order status: shipped, ID: 123')
+ end
+ end
+
+ context 'when handling errors' do
+ it 'returns generic error message on network failure' do
+ custom_tool.update!(endpoint_url: 'https://example.com/data')
+ stub_request(:get, 'https://example.com/data').to_raise(SocketError.new('Failed to connect'))
+
+ result = tool.perform(tool_context)
+
+ expect(result).to eq('An error occurred while executing the request')
+ end
+
+ it 'returns generic error message on timeout' do
+ custom_tool.update!(endpoint_url: 'https://example.com/data')
+ stub_request(:get, 'https://example.com/data').to_timeout
+
+ result = tool.perform(tool_context)
+
+ expect(result).to eq('An error occurred while executing the request')
+ end
+
+ it 'returns generic error message on HTTP 404' do
+ custom_tool.update!(endpoint_url: 'https://example.com/data')
+ stub_request(:get, 'https://example.com/data').to_return(status: 404, body: 'Not found')
+
+ result = tool.perform(tool_context)
+
+ expect(result).to eq('An error occurred while executing the request')
+ end
+
+ it 'returns generic error message on HTTP 500' do
+ custom_tool.update!(endpoint_url: 'https://example.com/data')
+ stub_request(:get, 'https://example.com/data').to_return(status: 500, body: 'Server error')
+
+ result = tool.perform(tool_context)
+
+ expect(result).to eq('An error occurred while executing the request')
+ end
+
+ it 'logs error details' do
+ custom_tool.update!(endpoint_url: 'https://example.com/data')
+ stub_request(:get, 'https://example.com/data').to_raise(StandardError.new('Test error'))
+
+ expect(Rails.logger).to receive(:error).with(/HttpTool execution error.*Test error/)
+
+ tool.perform(tool_context)
+ end
+ end
+
+ context 'when integrating with Toolable methods' do
+ it 'correctly integrates URL rendering, body rendering, auth, and response formatting' do
+ custom_tool.update!(
+ http_method: 'POST',
+ endpoint_url: 'https://example.com/users/{{ user_id }}/orders',
+ request_template: '{"product": "{{ product }}", "quantity": {{ quantity }}}',
+ auth_type: 'bearer',
+ auth_config: { 'token' => 'integration_token' },
+ response_template: 'Created order #{{ response.order_number }} for {{ response.product }}'
+ )
+
+ stub_request(:post, 'https://example.com/users/42/orders')
+ .with(
+ body: '{"product": "Widget", "quantity": 5}',
+ headers: {
+ 'Authorization' => 'Bearer integration_token',
+ 'Content-Type' => 'application/json'
+ }
+ )
+ .to_return(status: 200, body: '{"order_number": "ORD-789", "product": "Widget"}')
+
+ result = tool.perform(tool_context, user_id: '42', product: 'Widget', quantity: 5)
+
+ expect(result).to eq('Created order #ORD-789 for Widget')
+ end
+ end
+ end
+end
diff --git a/spec/enterprise/models/captain/custom_tool_spec.rb b/spec/enterprise/models/captain/custom_tool_spec.rb
new file mode 100644
index 000000000..c7c0451b1
--- /dev/null
+++ b/spec/enterprise/models/captain/custom_tool_spec.rb
@@ -0,0 +1,386 @@
+require 'rails_helper'
+
+RSpec.describe Captain::CustomTool, type: :model do
+ describe 'associations' do
+ it { is_expected.to belong_to(:account) }
+ end
+
+ describe 'validations' do
+ it { is_expected.to validate_presence_of(:title) }
+ it { is_expected.to validate_presence_of(:endpoint_url) }
+ it { is_expected.to define_enum_for(:http_method).with_values('GET' => 'GET', 'POST' => 'POST').backed_by_column_of_type(:string) }
+
+ it {
+ expect(subject).to define_enum_for(:auth_type).with_values('none' => 'none', 'bearer' => 'bearer', 'basic' => 'basic',
+ 'api_key' => 'api_key').backed_by_column_of_type(:string).with_prefix(:auth)
+ }
+
+ describe 'slug uniqueness' do
+ let(:account) { create(:account) }
+
+ it 'validates uniqueness of slug scoped to account' do
+ create(:captain_custom_tool, account: account, slug: 'custom_test-tool')
+ duplicate = build(:captain_custom_tool, account: account, slug: 'custom_test-tool')
+
+ expect(duplicate).not_to be_valid
+ expect(duplicate.errors[:slug]).to include('has already been taken')
+ end
+
+ it 'allows same slug across different accounts' do
+ account2 = create(:account)
+ create(:captain_custom_tool, account: account, slug: 'custom_test-tool')
+ different_account_tool = build(:captain_custom_tool, account: account2, slug: 'custom_test-tool')
+
+ expect(different_account_tool).to be_valid
+ end
+ end
+
+ describe 'param_schema validation' do
+ let(:account) { create(:account) }
+
+ it 'is valid with proper param_schema' do
+ tool = build(:captain_custom_tool, account: account, param_schema: [
+ { 'name' => 'order_id', 'type' => 'string', 'description' => 'Order ID', 'required' => true }
+ ])
+
+ expect(tool).to be_valid
+ end
+
+ it 'is valid with empty param_schema' do
+ tool = build(:captain_custom_tool, account: account, param_schema: [])
+
+ expect(tool).to be_valid
+ end
+
+ it 'is invalid when param_schema is missing name' do
+ tool = build(:captain_custom_tool, account: account, param_schema: [
+ { 'type' => 'string', 'description' => 'Order ID' }
+ ])
+
+ expect(tool).not_to be_valid
+ end
+
+ it 'is invalid when param_schema is missing type' do
+ tool = build(:captain_custom_tool, account: account, param_schema: [
+ { 'name' => 'order_id', 'description' => 'Order ID' }
+ ])
+
+ expect(tool).not_to be_valid
+ end
+
+ it 'is invalid when param_schema is missing description' do
+ tool = build(:captain_custom_tool, account: account, param_schema: [
+ { 'name' => 'order_id', 'type' => 'string' }
+ ])
+
+ expect(tool).not_to be_valid
+ end
+
+ it 'is invalid with additional properties in param_schema' do
+ tool = build(:captain_custom_tool, account: account, param_schema: [
+ { 'name' => 'order_id', 'type' => 'string', 'description' => 'Order ID', 'extra_field' => 'value' }
+ ])
+
+ expect(tool).not_to be_valid
+ end
+
+ it 'is valid when required field is omitted (defaults to optional param)' do
+ tool = build(:captain_custom_tool, account: account, param_schema: [
+ { 'name' => 'order_id', 'type' => 'string', 'description' => 'Order ID' }
+ ])
+
+ expect(tool).to be_valid
+ end
+ end
+ end
+
+ describe 'scopes' do
+ let(:account) { create(:account) }
+
+ describe '.enabled' do
+ it 'returns only enabled custom tools' do
+ enabled_tool = create(:captain_custom_tool, account: account, enabled: true)
+ disabled_tool = create(:captain_custom_tool, account: account, enabled: false)
+
+ expect(described_class.enabled).to include(enabled_tool)
+ expect(described_class.enabled).not_to include(disabled_tool)
+ end
+ end
+ end
+
+ describe 'slug generation' do
+ let(:account) { create(:account) }
+
+ it 'generates slug from title on creation' do
+ tool = create(:captain_custom_tool, account: account, title: 'Fetch Order Status')
+
+ expect(tool.slug).to eq('custom_fetch-order-status')
+ end
+
+ it 'adds custom_ prefix to generated slug' do
+ tool = create(:captain_custom_tool, account: account, title: 'My Tool')
+
+ expect(tool.slug).to start_with('custom_')
+ end
+
+ it 'does not override manually set slug' do
+ tool = create(:captain_custom_tool, account: account, title: 'Test Tool', slug: 'custom_manual-slug')
+
+ expect(tool.slug).to eq('custom_manual-slug')
+ end
+
+ it 'handles slug collisions by appending counter' do
+ create(:captain_custom_tool, account: account, title: 'Test Tool', slug: 'custom_test-tool')
+ tool2 = create(:captain_custom_tool, account: account, title: 'Test Tool')
+
+ expect(tool2.slug).to eq('custom_test-tool-1')
+ end
+
+ it 'handles multiple slug collisions' do
+ create(:captain_custom_tool, account: account, title: 'Test Tool', slug: 'custom_test-tool')
+ create(:captain_custom_tool, account: account, title: 'Test Tool', slug: 'custom_test-tool-1')
+ tool3 = create(:captain_custom_tool, account: account, title: 'Test Tool')
+
+ expect(tool3.slug).to eq('custom_test-tool-2')
+ end
+
+ it 'generates slug with UUID when title is blank' do
+ tool = build(:captain_custom_tool, account: account, title: nil)
+ tool.valid?
+
+ expect(tool.slug).to match(/^custom_[0-9a-f-]+$/)
+ end
+
+ it 'parameterizes title correctly' do
+ tool = create(:captain_custom_tool, account: account, title: 'Fetch Order Status & Details!')
+
+ expect(tool.slug).to eq('custom_fetch-order-status-details')
+ end
+ end
+
+ describe 'factory' do
+ it 'creates a valid custom tool with default attributes' do
+ tool = create(:captain_custom_tool)
+
+ expect(tool).to be_valid
+ expect(tool.title).to be_present
+ expect(tool.slug).to be_present
+ expect(tool.endpoint_url).to be_present
+ expect(tool.http_method).to eq('GET')
+ expect(tool.auth_type).to eq('none')
+ expect(tool.enabled).to be true
+ end
+
+ it 'creates valid tool with POST trait' do
+ tool = create(:captain_custom_tool, :with_post)
+
+ expect(tool.http_method).to eq('POST')
+ expect(tool.request_template).to be_present
+ end
+
+ it 'creates valid tool with bearer auth trait' do
+ tool = create(:captain_custom_tool, :with_bearer_auth)
+
+ expect(tool.auth_type).to eq('bearer')
+ expect(tool.auth_config['token']).to eq('test_bearer_token_123')
+ end
+
+ it 'creates valid tool with basic auth trait' do
+ tool = create(:captain_custom_tool, :with_basic_auth)
+
+ expect(tool.auth_type).to eq('basic')
+ expect(tool.auth_config['username']).to eq('test_user')
+ expect(tool.auth_config['password']).to eq('test_pass')
+ end
+
+ it 'creates valid tool with api key trait' do
+ tool = create(:captain_custom_tool, :with_api_key)
+
+ expect(tool.auth_type).to eq('api_key')
+ expect(tool.auth_config['key']).to eq('test_api_key')
+ expect(tool.auth_config['location']).to eq('header')
+ end
+ end
+
+ describe 'Toolable concern' do
+ let(:account) { create(:account) }
+
+ describe '#build_request_url' do
+ it 'returns static URL when no template variables present' do
+ tool = create(:captain_custom_tool, account: account, endpoint_url: 'https://api.example.com/orders')
+
+ expect(tool.build_request_url({})).to eq('https://api.example.com/orders')
+ end
+
+ it 'renders URL template with params' do
+ tool = create(:captain_custom_tool, account: account, endpoint_url: 'https://api.example.com/orders/{{ order_id }}')
+
+ expect(tool.build_request_url({ order_id: '12345' })).to eq('https://api.example.com/orders/12345')
+ end
+
+ it 'handles multiple template variables' do
+ tool = create(:captain_custom_tool, account: account,
+ endpoint_url: 'https://api.example.com/{{ resource }}/{{ id }}?details={{ show_details }}')
+
+ result = tool.build_request_url({ resource: 'orders', id: '123', show_details: 'true' })
+ expect(result).to eq('https://api.example.com/orders/123?details=true')
+ end
+ end
+
+ describe '#build_request_body' do
+ it 'returns nil when request_template is blank' do
+ tool = create(:captain_custom_tool, account: account, request_template: nil)
+
+ expect(tool.build_request_body({})).to be_nil
+ end
+
+ it 'renders request body template with params' do
+ tool = create(:captain_custom_tool, account: account,
+ request_template: '{ "order_id": "{{ order_id }}", "source": "chatwoot" }')
+
+ result = tool.build_request_body({ order_id: '12345' })
+ expect(result).to eq('{ "order_id": "12345", "source": "chatwoot" }')
+ end
+ end
+
+ describe '#build_auth_headers' do
+ it 'returns empty hash for none auth type' do
+ tool = create(:captain_custom_tool, account: account, auth_type: 'none')
+
+ expect(tool.build_auth_headers).to eq({})
+ end
+
+ it 'returns bearer token header' do
+ tool = create(:captain_custom_tool, :with_bearer_auth, account: account)
+
+ expect(tool.build_auth_headers).to eq({ 'Authorization' => 'Bearer test_bearer_token_123' })
+ end
+
+ it 'returns API key header when location is header' do
+ tool = create(:captain_custom_tool, :with_api_key, account: account)
+
+ expect(tool.build_auth_headers).to eq({ 'X-API-Key' => 'test_api_key' })
+ end
+
+ it 'returns empty hash for API key when location is not header' do
+ tool = create(:captain_custom_tool, account: account, auth_type: 'api_key',
+ auth_config: { key: 'test_key', location: 'query', name: 'api_key' })
+
+ expect(tool.build_auth_headers).to eq({})
+ end
+
+ it 'returns empty hash for basic auth' do
+ tool = create(:captain_custom_tool, :with_basic_auth, account: account)
+
+ expect(tool.build_auth_headers).to eq({})
+ end
+ end
+
+ describe '#build_basic_auth_credentials' do
+ it 'returns nil for non-basic auth types' do
+ tool = create(:captain_custom_tool, account: account, auth_type: 'none')
+
+ expect(tool.build_basic_auth_credentials).to be_nil
+ end
+
+ it 'returns username and password array for basic auth' do
+ tool = create(:captain_custom_tool, :with_basic_auth, account: account)
+
+ expect(tool.build_basic_auth_credentials).to eq(%w[test_user test_pass])
+ end
+ end
+
+ describe '#format_response' do
+ it 'returns raw response when no response_template' do
+ tool = create(:captain_custom_tool, account: account, response_template: nil)
+
+ expect(tool.format_response('raw response')).to eq('raw response')
+ end
+
+ it 'renders response template with JSON response' do
+ tool = create(:captain_custom_tool, account: account,
+ response_template: 'Order status: {{ response.status }}')
+ raw_response = '{"status": "shipped", "tracking": "123ABC"}'
+
+ result = tool.format_response(raw_response)
+ expect(result).to eq('Order status: shipped')
+ end
+
+ it 'handles response template with multiple fields' do
+ tool = create(:captain_custom_tool, account: account,
+ response_template: 'Order {{ response.id }} is {{ response.status }}. Tracking: {{ response.tracking }}')
+ raw_response = '{"id": "12345", "status": "delivered", "tracking": "ABC123"}'
+
+ result = tool.format_response(raw_response)
+ expect(result).to eq('Order 12345 is delivered. Tracking: ABC123')
+ end
+
+ it 'handles non-JSON response' do
+ tool = create(:captain_custom_tool, account: account,
+ response_template: 'Response: {{ response }}')
+ raw_response = 'plain text response'
+
+ result = tool.format_response(raw_response)
+ expect(result).to eq('Response: plain text response')
+ end
+ end
+
+ describe '#to_tool_metadata' do
+ it 'returns tool metadata hash with custom flag' do
+ tool = create(:captain_custom_tool, account: account,
+ slug: 'custom_test-tool',
+ title: 'Test Tool',
+ description: 'A test tool')
+
+ metadata = tool.to_tool_metadata
+ expect(metadata).to eq({
+ id: 'custom_test-tool',
+ title: 'Test Tool',
+ description: 'A test tool',
+ custom: true
+ })
+ end
+ end
+
+ describe '#tool' do
+ let(:assistant) { create(:captain_assistant, account: account) }
+
+ it 'returns HttpTool instance' do
+ tool = create(:captain_custom_tool, account: account)
+
+ tool_instance = tool.tool(assistant)
+ expect(tool_instance).to be_a(Captain::Tools::HttpTool)
+ end
+
+ it 'sets description on the tool class' do
+ tool = create(:captain_custom_tool, account: account, description: 'Fetches order data')
+
+ tool_instance = tool.tool(assistant)
+ expect(tool_instance.description).to eq('Fetches order data')
+ end
+
+ it 'sets parameters on the tool class' do
+ tool = create(:captain_custom_tool, :with_params, account: account)
+
+ tool_instance = tool.tool(assistant)
+ params = tool_instance.parameters
+
+ expect(params.keys).to contain_exactly(:order_id, :include_details)
+ expect(params[:order_id].name).to eq(:order_id)
+ expect(params[:order_id].type).to eq('string')
+ expect(params[:order_id].description).to eq('The order ID')
+ expect(params[:order_id].required).to be true
+
+ expect(params[:include_details].name).to eq(:include_details)
+ expect(params[:include_details].required).to be false
+ end
+
+ it 'works with empty param_schema' do
+ tool = create(:captain_custom_tool, account: account, param_schema: [])
+
+ tool_instance = tool.tool(assistant)
+ expect(tool_instance.parameters).to be_empty
+ end
+ end
+ end
+end
diff --git a/spec/enterprise/models/captain/scenario_spec.rb b/spec/enterprise/models/captain/scenario_spec.rb
index 7a39559c3..45009a3b0 100644
--- a/spec/enterprise/models/captain/scenario_spec.rb
+++ b/spec/enterprise/models/captain/scenario_spec.rb
@@ -48,9 +48,9 @@ RSpec.describe Captain::Scenario, type: :model do
before do
# Mock available tools
- allow(described_class).to receive(:available_tool_ids).and_return(%w[
- add_contact_note add_private_note update_priority
- ])
+ allow(described_class).to receive(:built_in_tool_ids).and_return(%w[
+ add_contact_note add_private_note update_priority
+ ])
end
describe 'validate_instruction_tools' do
@@ -102,6 +102,49 @@ RSpec.describe Captain::Scenario, type: :model do
expect(scenario).not_to be_valid
expect(scenario.errors[:instruction]).not_to include(/contains invalid tools/)
end
+
+ it 'is valid with custom tool references' do
+ create(:captain_custom_tool, account: account, slug: 'custom_fetch-order')
+ scenario = build(:captain_scenario,
+ assistant: assistant,
+ account: account,
+ instruction: 'Use [@Fetch Order](tool://custom_fetch-order) to get order details')
+
+ expect(scenario).to be_valid
+ end
+
+ it 'is invalid with custom tool from different account' do
+ other_account = create(:account)
+ create(:captain_custom_tool, account: other_account, slug: 'custom_fetch-order')
+ scenario = build(:captain_scenario,
+ assistant: assistant,
+ account: account,
+ instruction: 'Use [@Fetch Order](tool://custom_fetch-order) to get order details')
+
+ expect(scenario).not_to be_valid
+ expect(scenario.errors[:instruction]).to include('contains invalid tools: custom_fetch-order')
+ end
+
+ it 'is invalid with disabled custom tool' do
+ create(:captain_custom_tool, account: account, slug: 'custom_fetch-order', enabled: false)
+ scenario = build(:captain_scenario,
+ assistant: assistant,
+ account: account,
+ instruction: 'Use [@Fetch Order](tool://custom_fetch-order) to get order details')
+
+ expect(scenario).not_to be_valid
+ expect(scenario.errors[:instruction]).to include('contains invalid tools: custom_fetch-order')
+ end
+
+ it 'is valid with mixed static and custom tool references' do
+ create(:captain_custom_tool, account: account, slug: 'custom_fetch-order')
+ scenario = build(:captain_scenario,
+ assistant: assistant,
+ account: account,
+ instruction: 'Use [@Add Note](tool://add_contact_note) and [@Fetch Order](tool://custom_fetch-order)')
+
+ expect(scenario).to be_valid
+ end
end
describe 'resolve_tool_references' do
@@ -146,6 +189,140 @@ RSpec.describe Captain::Scenario, type: :model do
end
end
+ describe 'custom tool integration' do
+ let(:account) { create(:account) }
+ let(:assistant) { create(:captain_assistant, account: account) }
+
+ before do
+ allow(described_class).to receive(:built_in_tool_ids).and_return(%w[add_contact_note])
+ allow(described_class).to receive(:built_in_agent_tools).and_return([
+ { id: 'add_contact_note', title: 'Add Contact Note',
+ description: 'Add a note' }
+ ])
+ end
+
+ describe '#resolved_tools' do
+ it 'includes custom tool metadata' do
+ create(:captain_custom_tool, account: account, slug: 'custom_fetch-order',
+ title: 'Fetch Order', description: 'Gets order details')
+ scenario = create(:captain_scenario,
+ assistant: assistant,
+ account: account,
+ instruction: 'Use [@Fetch Order](tool://custom_fetch-order)')
+
+ resolved = scenario.send(:resolved_tools)
+ expect(resolved.length).to eq(1)
+ expect(resolved.first[:id]).to eq('custom_fetch-order')
+ expect(resolved.first[:title]).to eq('Fetch Order')
+ expect(resolved.first[:description]).to eq('Gets order details')
+ end
+
+ it 'includes both static and custom tools' do
+ create(:captain_custom_tool, account: account, slug: 'custom_fetch-order')
+ scenario = create(:captain_scenario,
+ assistant: assistant,
+ account: account,
+ instruction: 'Use [@Add Note](tool://add_contact_note) and [@Fetch Order](tool://custom_fetch-order)')
+
+ resolved = scenario.send(:resolved_tools)
+ expect(resolved.length).to eq(2)
+ expect(resolved.map { |t| t[:id] }).to contain_exactly('add_contact_note', 'custom_fetch-order')
+ end
+
+ it 'excludes disabled custom tools' do
+ custom_tool = create(:captain_custom_tool, account: account, slug: 'custom_fetch-order', enabled: true)
+ scenario = create(:captain_scenario,
+ assistant: assistant,
+ account: account,
+ instruction: 'Use [@Fetch Order](tool://custom_fetch-order)')
+
+ custom_tool.update!(enabled: false)
+
+ resolved = scenario.send(:resolved_tools)
+ expect(resolved).to be_empty
+ end
+ end
+
+ describe '#resolve_tool_instance' do
+ it 'returns HttpTool instance for custom tools' do
+ create(:captain_custom_tool, account: account, slug: 'custom_fetch-order')
+ scenario = create(:captain_scenario, assistant: assistant, account: account)
+
+ tool_metadata = { id: 'custom_fetch-order', custom: true }
+ tool_instance = scenario.send(:resolve_tool_instance, tool_metadata)
+ expect(tool_instance).to be_a(Captain::Tools::HttpTool)
+ end
+
+ it 'returns nil for disabled custom tools' do
+ create(:captain_custom_tool, account: account, slug: 'custom_fetch-order', enabled: false)
+ scenario = create(:captain_scenario, assistant: assistant, account: account)
+
+ tool_metadata = { id: 'custom_fetch-order', custom: true }
+ tool_instance = scenario.send(:resolve_tool_instance, tool_metadata)
+ expect(tool_instance).to be_nil
+ end
+
+ it 'returns static tool instance for non-custom tools' do
+ scenario = create(:captain_scenario, assistant: assistant, account: account)
+ allow(described_class).to receive(:resolve_tool_class).with('add_contact_note').and_return(
+ Class.new do
+ def initialize(_assistant); end
+ end
+ )
+
+ tool_metadata = { id: 'add_contact_note' }
+ tool_instance = scenario.send(:resolve_tool_instance, tool_metadata)
+ expect(tool_instance).not_to be_nil
+ expect(tool_instance).not_to be_a(Captain::Tools::HttpTool)
+ end
+ end
+
+ describe '#agent_tools' do
+ it 'returns array of tool instances including custom tools' do
+ create(:captain_custom_tool, account: account, slug: 'custom_fetch-order')
+ scenario = create(:captain_scenario,
+ assistant: assistant,
+ account: account,
+ instruction: 'Use [@Fetch Order](tool://custom_fetch-order)')
+
+ tools = scenario.send(:agent_tools)
+ expect(tools.length).to eq(1)
+ expect(tools.first).to be_a(Captain::Tools::HttpTool)
+ end
+
+ it 'excludes disabled custom tools from execution' do
+ custom_tool = create(:captain_custom_tool, account: account, slug: 'custom_fetch-order', enabled: true)
+ scenario = create(:captain_scenario,
+ assistant: assistant,
+ account: account,
+ instruction: 'Use [@Fetch Order](tool://custom_fetch-order)')
+
+ custom_tool.update!(enabled: false)
+
+ tools = scenario.send(:agent_tools)
+ expect(tools).to be_empty
+ end
+
+ it 'returns mixed static and custom tool instances' do
+ create(:captain_custom_tool, account: account, slug: 'custom_fetch-order')
+ scenario = create(:captain_scenario,
+ assistant: assistant,
+ account: account,
+ instruction: 'Use [@Add Note](tool://add_contact_note) and [@Fetch Order](tool://custom_fetch-order)')
+
+ allow(described_class).to receive(:resolve_tool_class).with('add_contact_note').and_return(
+ Class.new do
+ def initialize(_assistant); end
+ end
+ )
+
+ tools = scenario.send(:agent_tools)
+ expect(tools.length).to eq(2)
+ expect(tools.last).to be_a(Captain::Tools::HttpTool)
+ end
+ end
+ end
+
describe 'factory' do
it 'creates a valid scenario with associations' do
account = create(:account)
diff --git a/spec/enterprise/models/concerns/captain_tools_helpers_spec.rb b/spec/enterprise/models/concerns/captain_tools_helpers_spec.rb
index afe482385..7e36e9006 100644
--- a/spec/enterprise/models/concerns/captain_tools_helpers_spec.rb
+++ b/spec/enterprise/models/concerns/captain_tools_helpers_spec.rb
@@ -42,58 +42,6 @@ RSpec.describe Concerns::CaptainToolsHelpers, type: :concern do
end
end
- describe '.available_agent_tools' do
- before do
- # Mock the YAML file loading
- allow(YAML).to receive(:load_file).and_return([
- {
- 'id' => 'add_contact_note',
- 'title' => 'Add Contact Note',
- 'description' => 'Add a note to a contact',
- 'icon' => 'note-add'
- },
- {
- 'id' => 'invalid_tool',
- 'title' => 'Invalid Tool',
- 'description' => 'This tool does not exist',
- 'icon' => 'invalid'
- }
- ])
-
- # Mock class resolution - only add_contact_note exists
- allow(test_class).to receive(:resolve_tool_class) do |tool_id|
- case tool_id
- when 'add_contact_note'
- Captain::Tools::AddContactNoteTool
- end
- end
- end
-
- it 'returns only resolvable tools' do
- tools = test_class.available_agent_tools
-
- expect(tools.length).to eq(1)
- expect(tools.first).to eq({
- id: 'add_contact_note',
- title: 'Add Contact Note',
- description: 'Add a note to a contact',
- icon: 'note-add'
- })
- end
-
- it 'logs warnings for unresolvable tools' do
- expect(Rails.logger).to receive(:warn).with('Tool class not found for ID: invalid_tool')
-
- test_class.available_agent_tools
- end
-
- it 'memoizes the result' do
- expect(YAML).to receive(:load_file).once.and_return([])
-
- 2.times { test_class.available_agent_tools }
- end
- end
-
describe '.resolve_tool_class' do
it 'resolves valid tool classes' do
# Mock the constantize to return a class
@@ -116,28 +64,6 @@ RSpec.describe Concerns::CaptainToolsHelpers, type: :concern do
end
end
- describe '.available_tool_ids' do
- before do
- allow(test_class).to receive(:available_agent_tools).and_return([
- { id: 'add_contact_note', title: 'Add Contact Note', description: '...',
- icon: 'note' },
- { id: 'update_priority', title: 'Update Priority', description: '...',
- icon: 'priority' }
- ])
- end
-
- it 'returns array of tool IDs' do
- ids = test_class.available_tool_ids
- expect(ids).to eq(%w[add_contact_note update_priority])
- end
-
- it 'memoizes the result' do
- expect(test_class).to receive(:available_agent_tools).once.and_return([])
-
- 2.times { test_class.available_tool_ids }
- end
- end
-
describe '#extract_tool_ids_from_text' do
it 'extracts tool IDs from text' do
text = 'First [@Add Contact Note](tool://add_contact_note) then [@Update Priority](tool://update_priority)'
diff --git a/spec/factories/captain/custom_tool.rb b/spec/factories/captain/custom_tool.rb
new file mode 100644
index 000000000..2bfcbf360
--- /dev/null
+++ b/spec/factories/captain/custom_tool.rb
@@ -0,0 +1,51 @@
+FactoryBot.define do
+ factory :captain_custom_tool, class: 'Captain::CustomTool' do
+ sequence(:title) { |n| "Custom Tool #{n}" }
+ description { 'A custom HTTP tool for external API integration' }
+ endpoint_url { 'https://api.example.com/endpoint' }
+ http_method { 'GET' }
+ auth_type { 'none' }
+ auth_config { {} }
+ param_schema { [] }
+ enabled { true }
+ association :account
+
+ trait :with_post do
+ http_method { 'POST' }
+ request_template { '{ "key": "{{ value }}" }' }
+ end
+
+ trait :with_bearer_auth do
+ auth_type { 'bearer' }
+ auth_config { { token: 'test_bearer_token_123' } }
+ end
+
+ trait :with_basic_auth do
+ auth_type { 'basic' }
+ auth_config { { username: 'test_user', password: 'test_pass' } }
+ end
+
+ trait :with_api_key do
+ auth_type { 'api_key' }
+ auth_config { { key: 'test_api_key', location: 'header', name: 'X-API-Key' } }
+ end
+
+ trait :with_templates do
+ request_template { '{ "order_id": "{{ order_id }}", "source": "chatwoot" }' }
+ response_template { 'Order status: {{ response.status }}' }
+ end
+
+ trait :with_params do
+ param_schema do
+ [
+ { 'name' => 'order_id', 'type' => 'string', 'description' => 'The order ID', 'required' => true },
+ { 'name' => 'include_details', 'type' => 'boolean', 'description' => 'Include order details', 'required' => false }
+ ]
+ end
+ end
+
+ trait :disabled do
+ enabled { false }
+ end
+ end
+end
From 9fb0dfa4a7b1f5bc962290589113b7b8f982829c Mon Sep 17 00:00:00 2001
From: Shivam Mishra
Date: Mon, 6 Oct 2025 21:35:54 +0530
Subject: [PATCH 159/182] feat: Add UI for custom tools (#12585)
### Tools list
### Tools form
## Response
---------
Co-authored-by: Pranav
Co-authored-by: Pranav
---
.../dashboard/api/captain/customTools.js | 36 +++
.../captain/pageComponents/DeleteDialog.vue | 8 +-
.../pageComponents/customTool/AuthConfig.vue | 73 +++++
.../customTool/CreateCustomToolDialog.vue | 87 ++++++
.../customTool/CustomToolCard.vue | 125 ++++++++
.../customTool/CustomToolForm.vue | 271 +++++++++++++++++
.../pageComponents/customTool/ParamRow.vue | 113 +++++++
.../emptyStates/CustomToolsPageEmptyState.vue | 29 ++
.../components-next/sidebar/Sidebar.vue | 5 +
.../i18n/locale/en/integrations.json | 109 +++++++
.../dashboard/i18n/locale/en/settings.json | 1 +
.../dashboard/captain/captain.routes.js | 14 +
.../routes/dashboard/captain/tools/Index.vue | 138 +++++++++
.../dashboard/store/captain/customTools.js | 35 +++
.../dashboard/store/captain/tools.js | 2 +-
app/javascript/dashboard/store/index.js | 2 +
config/locales/en.yml | 2 +
config/routes.rb | 1 +
.../captain/custom_tools_controller.rb | 49 +++
enterprise/app/models/captain/custom_tool.rb | 19 +-
enterprise/app/models/concerns/toolable.rb | 13 +
.../policies/captain/custom_tool_policy.rb | 21 ++
.../captain/custom_tools/create.json.jbuilder | 1 +
.../captain/custom_tools/index.json.jbuilder | 10 +
.../captain/custom_tools/show.json.jbuilder | 1 +
.../captain/custom_tools/update.json.jbuilder | 1 +
.../models/captain/_custom_tool.json.jbuilder | 15 +
.../captain/custom_tools_controller_spec.rb | 281 ++++++++++++++++++
.../models/captain/custom_tool_spec.rb | 36 +--
29 files changed, 1474 insertions(+), 24 deletions(-)
create mode 100644 app/javascript/dashboard/api/captain/customTools.js
create mode 100644 app/javascript/dashboard/components-next/captain/pageComponents/customTool/AuthConfig.vue
create mode 100644 app/javascript/dashboard/components-next/captain/pageComponents/customTool/CreateCustomToolDialog.vue
create mode 100644 app/javascript/dashboard/components-next/captain/pageComponents/customTool/CustomToolCard.vue
create mode 100644 app/javascript/dashboard/components-next/captain/pageComponents/customTool/CustomToolForm.vue
create mode 100644 app/javascript/dashboard/components-next/captain/pageComponents/customTool/ParamRow.vue
create mode 100644 app/javascript/dashboard/components-next/captain/pageComponents/emptyStates/CustomToolsPageEmptyState.vue
create mode 100644 app/javascript/dashboard/routes/dashboard/captain/tools/Index.vue
create mode 100644 app/javascript/dashboard/store/captain/customTools.js
create mode 100644 enterprise/app/controllers/api/v1/accounts/captain/custom_tools_controller.rb
create mode 100644 enterprise/app/policies/captain/custom_tool_policy.rb
create mode 100644 enterprise/app/views/api/v1/accounts/captain/custom_tools/create.json.jbuilder
create mode 100644 enterprise/app/views/api/v1/accounts/captain/custom_tools/index.json.jbuilder
create mode 100644 enterprise/app/views/api/v1/accounts/captain/custom_tools/show.json.jbuilder
create mode 100644 enterprise/app/views/api/v1/accounts/captain/custom_tools/update.json.jbuilder
create mode 100644 enterprise/app/views/api/v1/models/captain/_custom_tool.json.jbuilder
create mode 100644 spec/enterprise/controllers/api/v1/accounts/captain/custom_tools_controller_spec.rb
diff --git a/app/javascript/dashboard/api/captain/customTools.js b/app/javascript/dashboard/api/captain/customTools.js
new file mode 100644
index 000000000..d0818d941
--- /dev/null
+++ b/app/javascript/dashboard/api/captain/customTools.js
@@ -0,0 +1,36 @@
+/* global axios */
+import ApiClient from '../ApiClient';
+
+class CaptainCustomTools extends ApiClient {
+ constructor() {
+ super('captain/custom_tools', { accountScoped: true });
+ }
+
+ get({ page = 1, searchKey } = {}) {
+ return axios.get(this.url, {
+ params: { page, searchKey },
+ });
+ }
+
+ show(id) {
+ return axios.get(`${this.url}/${id}`);
+ }
+
+ create(data = {}) {
+ return axios.post(this.url, {
+ custom_tool: data,
+ });
+ }
+
+ update(id, data = {}) {
+ return axios.put(`${this.url}/${id}`, {
+ custom_tool: data,
+ });
+ }
+
+ delete(id) {
+ return axios.delete(`${this.url}/${id}`);
+ }
+}
+
+export default new CaptainCustomTools();
diff --git a/app/javascript/dashboard/components-next/captain/pageComponents/DeleteDialog.vue b/app/javascript/dashboard/components-next/captain/pageComponents/DeleteDialog.vue
index 31e18394f..8d67344e1 100644
--- a/app/javascript/dashboard/components-next/captain/pageComponents/DeleteDialog.vue
+++ b/app/javascript/dashboard/components-next/captain/pageComponents/DeleteDialog.vue
@@ -10,6 +10,10 @@ const props = defineProps({
type: String,
required: true,
},
+ translationKey: {
+ type: String,
+ required: true,
+ },
entity: {
type: Object,
required: true,
@@ -25,7 +29,9 @@ const emit = defineEmits(['deleteSuccess']);
const { t } = useI18n();
const store = useStore();
const deleteDialogRef = ref(null);
-const i18nKey = computed(() => props.type.toUpperCase());
+const i18nKey = computed(() => {
+ return props.translationKey || props.type.toUpperCase();
+});
const deleteEntity = async payload => {
if (!payload) return;
diff --git a/app/javascript/dashboard/components-next/captain/pageComponents/customTool/AuthConfig.vue b/app/javascript/dashboard/components-next/captain/pageComponents/customTool/AuthConfig.vue
new file mode 100644
index 000000000..208a94dba
--- /dev/null
+++ b/app/javascript/dashboard/components-next/captain/pageComponents/customTool/AuthConfig.vue
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/javascript/dashboard/components-next/captain/pageComponents/customTool/CreateCustomToolDialog.vue b/app/javascript/dashboard/components-next/captain/pageComponents/customTool/CreateCustomToolDialog.vue
new file mode 100644
index 000000000..0745c6546
--- /dev/null
+++ b/app/javascript/dashboard/components-next/captain/pageComponents/customTool/CreateCustomToolDialog.vue
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
diff --git a/app/javascript/dashboard/components-next/captain/pageComponents/customTool/CustomToolCard.vue b/app/javascript/dashboard/components-next/captain/pageComponents/customTool/CustomToolCard.vue
new file mode 100644
index 000000000..d1d1dd011
--- /dev/null
+++ b/app/javascript/dashboard/components-next/captain/pageComponents/customTool/CustomToolCard.vue
@@ -0,0 +1,125 @@
+
+
+
+
+
+
+
+
+ {{ description }}
+
+
+
+ {{ authTypeLabel }}
+
+
+
+ {{ timestamp }}
+
+
+
+
diff --git a/app/javascript/dashboard/components-next/captain/pageComponents/customTool/CustomToolForm.vue b/app/javascript/dashboard/components-next/captain/pageComponents/customTool/CustomToolForm.vue
new file mode 100644
index 000000000..14ebc6a57
--- /dev/null
+++ b/app/javascript/dashboard/components-next/captain/pageComponents/customTool/CustomToolForm.vue
@@ -0,0 +1,271 @@
+
+
+
+
+
diff --git a/app/javascript/dashboard/components-next/captain/pageComponents/customTool/ParamRow.vue b/app/javascript/dashboard/components-next/captain/pageComponents/customTool/ParamRow.vue
new file mode 100644
index 000000000..33cd64468
--- /dev/null
+++ b/app/javascript/dashboard/components-next/captain/pageComponents/customTool/ParamRow.vue
@@ -0,0 +1,113 @@
+
+
+
+
+
+
+ {{ t(`CAPTAIN.CUSTOM_TOOLS.FORM.ERRORS.${validationError}`) }}
+
+
+
diff --git a/app/javascript/dashboard/components-next/captain/pageComponents/emptyStates/CustomToolsPageEmptyState.vue b/app/javascript/dashboard/components-next/captain/pageComponents/emptyStates/CustomToolsPageEmptyState.vue
new file mode 100644
index 000000000..420f953da
--- /dev/null
+++ b/app/javascript/dashboard/components-next/captain/pageComponents/emptyStates/CustomToolsPageEmptyState.vue
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/javascript/dashboard/components-next/sidebar/Sidebar.vue b/app/javascript/dashboard/components-next/sidebar/Sidebar.vue
index ab6537031..cef4346e9 100644
--- a/app/javascript/dashboard/components-next/sidebar/Sidebar.vue
+++ b/app/javascript/dashboard/components-next/sidebar/Sidebar.vue
@@ -232,6 +232,11 @@ const menuItems = computed(() => {
label: t('SIDEBAR.CAPTAIN_RESPONSES'),
to: accountScopedRoute('captain_responses_index'),
},
+ {
+ name: 'Tools',
+ label: t('SIDEBAR.CAPTAIN_TOOLS'),
+ to: accountScopedRoute('captain_tools_index'),
+ },
],
},
{
diff --git a/app/javascript/dashboard/i18n/locale/en/integrations.json b/app/javascript/dashboard/i18n/locale/en/integrations.json
index 8a812dff3..c65d2d040 100644
--- a/app/javascript/dashboard/i18n/locale/en/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/en/integrations.json
@@ -750,6 +750,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Yes, delete",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Description",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "None",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API Key"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Password",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Type"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Number",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Required"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/en/settings.json b/app/javascript/dashboard/i18n/locale/en/settings.json
index 9ddc3b805..812b0cd8b 100644
--- a/app/javascript/dashboard/i18n/locale/en/settings.json
+++ b/app/javascript/dashboard/i18n/locale/en/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Home",
"AGENTS": "Agents",
"AGENT_BOTS": "Bots",
diff --git a/app/javascript/dashboard/routes/dashboard/captain/captain.routes.js b/app/javascript/dashboard/routes/dashboard/captain/captain.routes.js
index 52fda537b..9d5609ab7 100644
--- a/app/javascript/dashboard/routes/dashboard/captain/captain.routes.js
+++ b/app/javascript/dashboard/routes/dashboard/captain/captain.routes.js
@@ -10,6 +10,7 @@ import AssistantGuidelinesIndex from './assistants/guidelines/Index.vue';
import AssistantScenariosIndex from './assistants/scenarios/Index.vue';
import DocumentsIndex from './documents/Index.vue';
import ResponsesIndex from './responses/Index.vue';
+import CustomToolsIndex from './tools/Index.vue';
export const routes = [
{
@@ -124,4 +125,17 @@ export const routes = [
],
},
},
+ {
+ path: frontendURL('accounts/:accountId/captain/tools'),
+ component: CustomToolsIndex,
+ name: 'captain_tools_index',
+ meta: {
+ permissions: ['administrator', 'agent'],
+ featureFlag: FEATURE_FLAGS.CAPTAIN_V2,
+ installationTypes: [
+ INSTALLATION_TYPES.CLOUD,
+ INSTALLATION_TYPES.ENTERPRISE,
+ ],
+ },
+ },
];
diff --git a/app/javascript/dashboard/routes/dashboard/captain/tools/Index.vue b/app/javascript/dashboard/routes/dashboard/captain/tools/Index.vue
new file mode 100644
index 000000000..880bdbbf3
--- /dev/null
+++ b/app/javascript/dashboard/routes/dashboard/captain/tools/Index.vue
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/javascript/dashboard/store/captain/customTools.js b/app/javascript/dashboard/store/captain/customTools.js
new file mode 100644
index 000000000..3d3af03c0
--- /dev/null
+++ b/app/javascript/dashboard/store/captain/customTools.js
@@ -0,0 +1,35 @@
+import CaptainCustomTools from 'dashboard/api/captain/customTools';
+import { createStore } from './storeFactory';
+import { throwErrorMessage } from 'dashboard/store/utils/api';
+
+export default createStore({
+ name: 'CaptainCustomTool',
+ API: CaptainCustomTools,
+ actions: mutations => ({
+ update: async ({ commit }, { id, ...updateObj }) => {
+ commit(mutations.SET_UI_FLAG, { updatingItem: true });
+ try {
+ const response = await CaptainCustomTools.update(id, updateObj);
+ commit(mutations.EDIT, response.data);
+ commit(mutations.SET_UI_FLAG, { updatingItem: false });
+ return response.data;
+ } catch (error) {
+ commit(mutations.SET_UI_FLAG, { updatingItem: false });
+ return throwErrorMessage(error);
+ }
+ },
+
+ delete: async ({ commit }, id) => {
+ commit(mutations.SET_UI_FLAG, { deletingItem: true });
+ try {
+ await CaptainCustomTools.delete(id);
+ commit(mutations.DELETE, id);
+ commit(mutations.SET_UI_FLAG, { deletingItem: false });
+ return id;
+ } catch (error) {
+ commit(mutations.SET_UI_FLAG, { deletingItem: false });
+ return throwErrorMessage(error);
+ }
+ },
+ }),
+});
diff --git a/app/javascript/dashboard/store/captain/tools.js b/app/javascript/dashboard/store/captain/tools.js
index 9a9bcc330..9638e45c3 100644
--- a/app/javascript/dashboard/store/captain/tools.js
+++ b/app/javascript/dashboard/store/captain/tools.js
@@ -3,7 +3,7 @@ import CaptainToolsAPI from '../../api/captain/tools';
import { throwErrorMessage } from 'dashboard/store/utils/api';
const toolsStore = createStore({
- name: 'captainTool',
+ name: 'Tools',
API: CaptainToolsAPI,
actions: mutations => ({
getTools: async ({ commit }) => {
diff --git a/app/javascript/dashboard/store/index.js b/app/javascript/dashboard/store/index.js
index 16bcab3f9..d56958eb5 100755
--- a/app/javascript/dashboard/store/index.js
+++ b/app/javascript/dashboard/store/index.js
@@ -57,6 +57,7 @@ import copilotThreads from './captain/copilotThreads';
import copilotMessages from './captain/copilotMessages';
import captainScenarios from './captain/scenarios';
import captainTools from './captain/tools';
+import captainCustomTools from './captain/customTools';
const plugins = [];
@@ -119,6 +120,7 @@ export default createStore({
copilotMessages,
captainScenarios,
captainTools,
+ captainCustomTools,
},
plugins,
});
diff --git a/config/locales/en.yml b/config/locales/en.yml
index ca3a9e950..c106531a0 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -336,6 +336,8 @@ en:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Search for article by title or body...
diff --git a/config/routes.rb b/config/routes.rb
index bf455949c..757d20620 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -67,6 +67,7 @@ Rails.application.routes.draw do
resources :copilot_threads, only: [:index, :create] do
resources :copilot_messages, only: [:index, :create]
end
+ resources :custom_tools
resources :documents, only: [:index, :show, :create, :destroy]
end
resource :saml_settings, only: [:show, :create, :update, :destroy]
diff --git a/enterprise/app/controllers/api/v1/accounts/captain/custom_tools_controller.rb b/enterprise/app/controllers/api/v1/accounts/captain/custom_tools_controller.rb
new file mode 100644
index 000000000..3137ded09
--- /dev/null
+++ b/enterprise/app/controllers/api/v1/accounts/captain/custom_tools_controller.rb
@@ -0,0 +1,49 @@
+class Api::V1::Accounts::Captain::CustomToolsController < Api::V1::Accounts::BaseController
+ before_action :current_account
+ before_action -> { check_authorization(Captain::CustomTool) }
+ before_action :set_custom_tool, only: [:show, :update, :destroy]
+
+ def index
+ @custom_tools = account_custom_tools.enabled
+ end
+
+ def show; end
+
+ def create
+ @custom_tool = account_custom_tools.create!(custom_tool_params)
+ end
+
+ def update
+ @custom_tool.update!(custom_tool_params)
+ end
+
+ def destroy
+ @custom_tool.destroy
+ head :no_content
+ end
+
+ private
+
+ def set_custom_tool
+ @custom_tool = account_custom_tools.find(params[:id])
+ end
+
+ def account_custom_tools
+ @account_custom_tools ||= Current.account.captain_custom_tools
+ end
+
+ def custom_tool_params
+ params.require(:custom_tool).permit(
+ :title,
+ :description,
+ :endpoint_url,
+ :http_method,
+ :request_template,
+ :response_template,
+ :auth_type,
+ :enabled,
+ auth_config: {},
+ param_schema: [:name, :type, :description, :required]
+ )
+ end
+end
diff --git a/enterprise/app/models/captain/custom_tool.rb b/enterprise/app/models/captain/custom_tool.rb
index 8ad02f401..bf3f351dd 100644
--- a/enterprise/app/models/captain/custom_tool.rb
+++ b/enterprise/app/models/captain/custom_tool.rb
@@ -29,6 +29,8 @@ class Captain::CustomTool < ApplicationRecord
self.table_name = 'captain_custom_tools'
+ NAME_PREFIX = 'custom'.freeze
+ NAME_SEPARATOR = '_'.freeze
PARAM_SCHEMA_VALIDATION = {
'type': 'array',
'items': {
@@ -73,16 +75,23 @@ class Captain::CustomTool < ApplicationRecord
def generate_slug
return if slug.present?
+ return if title.blank?
- base_slug = title.present? ? "custom_#{title.parameterize}" : "custom_#{SecureRandom.uuid}"
+ paramterized_title = title.parameterize(separator: NAME_SEPARATOR)
+
+ base_slug = "#{NAME_PREFIX}#{NAME_SEPARATOR}#{paramterized_title}"
self.slug = find_unique_slug(base_slug)
end
- def find_unique_slug(base_slug, counter = 0)
- slug_candidate = counter.zero? ? base_slug : "#{base_slug}-#{counter}"
- return find_unique_slug(base_slug, counter + 1) if slug_exists?(slug_candidate)
+ def find_unique_slug(base_slug)
+ return base_slug unless slug_exists?(base_slug)
- slug_candidate
+ 5.times do
+ slug_candidate = "#{base_slug}#{NAME_SEPARATOR}#{SecureRandom.alphanumeric(6).downcase}"
+ return slug_candidate unless slug_exists?(slug_candidate)
+ end
+
+ raise ActiveRecord::RecordNotUnique, I18n.t('captain.custom_tool.slug_generation_failed')
end
def slug_exists?(candidate)
diff --git a/enterprise/app/models/concerns/toolable.rb b/enterprise/app/models/concerns/toolable.rb
index 24c16c6f4..bae1771e4 100644
--- a/enterprise/app/models/concerns/toolable.rb
+++ b/enterprise/app/models/concerns/toolable.rb
@@ -3,7 +3,10 @@ module Concerns::Toolable
def tool(assistant)
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
description custom_tool_record.description
@@ -15,6 +18,16 @@ 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)
+
tool_class.new(assistant, self)
end
diff --git a/enterprise/app/policies/captain/custom_tool_policy.rb b/enterprise/app/policies/captain/custom_tool_policy.rb
new file mode 100644
index 000000000..b88a23860
--- /dev/null
+++ b/enterprise/app/policies/captain/custom_tool_policy.rb
@@ -0,0 +1,21 @@
+class Captain::CustomToolPolicy < ApplicationPolicy
+ def index?
+ true
+ end
+
+ def show?
+ true
+ end
+
+ def create?
+ @account_user.administrator?
+ end
+
+ def update?
+ @account_user.administrator?
+ end
+
+ def destroy?
+ @account_user.administrator?
+ end
+end
diff --git a/enterprise/app/views/api/v1/accounts/captain/custom_tools/create.json.jbuilder b/enterprise/app/views/api/v1/accounts/captain/custom_tools/create.json.jbuilder
new file mode 100644
index 000000000..baf3cb3ac
--- /dev/null
+++ b/enterprise/app/views/api/v1/accounts/captain/custom_tools/create.json.jbuilder
@@ -0,0 +1 @@
+json.partial! 'api/v1/models/captain/custom_tool', custom_tool: @custom_tool
diff --git a/enterprise/app/views/api/v1/accounts/captain/custom_tools/index.json.jbuilder b/enterprise/app/views/api/v1/accounts/captain/custom_tools/index.json.jbuilder
new file mode 100644
index 000000000..c57a92261
--- /dev/null
+++ b/enterprise/app/views/api/v1/accounts/captain/custom_tools/index.json.jbuilder
@@ -0,0 +1,10 @@
+json.payload do
+ json.array! @custom_tools do |custom_tool|
+ json.partial! 'api/v1/models/captain/custom_tool', custom_tool: custom_tool
+ end
+end
+
+json.meta do
+ json.total_count @custom_tools.count
+ json.page 1
+end
diff --git a/enterprise/app/views/api/v1/accounts/captain/custom_tools/show.json.jbuilder b/enterprise/app/views/api/v1/accounts/captain/custom_tools/show.json.jbuilder
new file mode 100644
index 000000000..baf3cb3ac
--- /dev/null
+++ b/enterprise/app/views/api/v1/accounts/captain/custom_tools/show.json.jbuilder
@@ -0,0 +1 @@
+json.partial! 'api/v1/models/captain/custom_tool', custom_tool: @custom_tool
diff --git a/enterprise/app/views/api/v1/accounts/captain/custom_tools/update.json.jbuilder b/enterprise/app/views/api/v1/accounts/captain/custom_tools/update.json.jbuilder
new file mode 100644
index 000000000..baf3cb3ac
--- /dev/null
+++ b/enterprise/app/views/api/v1/accounts/captain/custom_tools/update.json.jbuilder
@@ -0,0 +1 @@
+json.partial! 'api/v1/models/captain/custom_tool', custom_tool: @custom_tool
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
new file mode 100644
index 000000000..778b30061
--- /dev/null
+++ b/enterprise/app/views/api/v1/models/captain/_custom_tool.json.jbuilder
@@ -0,0 +1,15 @@
+json.id custom_tool.id
+json.slug custom_tool.slug
+json.title custom_tool.title
+json.description custom_tool.description
+json.endpoint_url custom_tool.endpoint_url
+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.param_schema custom_tool.param_schema
+json.enabled custom_tool.enabled
+json.account_id custom_tool.account_id
+json.created_at custom_tool.created_at.to_i
+json.updated_at custom_tool.updated_at.to_i
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
new file mode 100644
index 000000000..7a1526995
--- /dev/null
+++ b/spec/enterprise/controllers/api/v1/accounts/captain/custom_tools_controller_spec.rb
@@ -0,0 +1,281 @@
+require 'rails_helper'
+
+RSpec.describe 'Api::V1::Accounts::Captain::CustomTools', type: :request do
+ let(:account) { create(:account) }
+ let(:admin) { create(:user, account: account, role: :administrator) }
+ let(:agent) { create(:user, account: account, role: :agent) }
+
+ def json_response
+ JSON.parse(response.body, symbolize_names: true)
+ end
+
+ describe 'GET /api/v1/accounts/{account.id}/captain/custom_tools' do
+ context 'when it is an un-authenticated user' do
+ it 'returns unauthorized status' do
+ get "/api/v1/accounts/#{account.id}/captain/custom_tools"
+ expect(response).to have_http_status(:unauthorized)
+ end
+ end
+
+ context 'when it is an agent' do
+ it 'returns success status' do
+ create_list(:captain_custom_tool, 3, account: account)
+ get "/api/v1/accounts/#{account.id}/captain/custom_tools",
+ headers: agent.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:success)
+ expect(json_response[:payload].length).to eq(3)
+ end
+ end
+
+ context 'when it is an admin' do
+ it 'returns success status and custom tools' do
+ create_list(:captain_custom_tool, 5, account: account)
+ get "/api/v1/accounts/#{account.id}/captain/custom_tools",
+ headers: admin.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:success)
+ expect(json_response[:payload].length).to eq(5)
+ end
+
+ it 'returns only enabled custom tools' 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",
+ headers: admin.create_new_auth_token,
+ 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)
+ end
+ end
+ end
+
+ describe 'GET /api/v1/accounts/{account.id}/captain/custom_tools/{id}' do
+ let(:custom_tool) { create(:captain_custom_tool, account: account) }
+
+ context 'when it is an un-authenticated user' do
+ it 'returns unauthorized status' do
+ get "/api/v1/accounts/#{account.id}/captain/custom_tools/#{custom_tool.id}"
+ expect(response).to have_http_status(:unauthorized)
+ end
+ end
+
+ context 'when it is an agent' do
+ it 'returns success status and custom tool' do
+ get "/api/v1/accounts/#{account.id}/captain/custom_tools/#{custom_tool.id}",
+ headers: agent.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:success)
+ expect(json_response[:id]).to eq(custom_tool.id)
+ expect(json_response[:title]).to eq(custom_tool.title)
+ end
+ end
+
+ context 'when custom tool does not exist' do
+ it 'returns not found status' do
+ get "/api/v1/accounts/#{account.id}/captain/custom_tools/999999",
+ headers: agent.create_new_auth_token
+
+ expect(response).to have_http_status(:not_found)
+ end
+ end
+ end
+
+ describe 'POST /api/v1/accounts/{account.id}/captain/custom_tools' do
+ let(:valid_attributes) do
+ {
+ custom_tool: {
+ title: 'Fetch Order Status',
+ description: 'Fetches order status from external API',
+ endpoint_url: 'https://api.example.com/orders/{{ order_id }}',
+ http_method: 'GET',
+ enabled: true,
+ param_schema: [
+ { name: 'order_id', type: 'string', description: 'The order ID', required: true }
+ ]
+ }
+ }
+ end
+
+ context 'when it is an un-authenticated user' do
+ it 'returns unauthorized status' do
+ post "/api/v1/accounts/#{account.id}/captain/custom_tools",
+ params: valid_attributes
+ expect(response).to have_http_status(:unauthorized)
+ end
+ end
+
+ context 'when it is an agent' do
+ it 'returns unauthorized status' do
+ post "/api/v1/accounts/#{account.id}/captain/custom_tools",
+ params: valid_attributes,
+ headers: agent.create_new_auth_token
+ expect(response).to have_http_status(:unauthorized)
+ end
+ end
+
+ context 'when it is an admin' do
+ it 'creates a new custom tool and returns success status' do
+ post "/api/v1/accounts/#{account.id}/captain/custom_tools",
+ params: valid_attributes,
+ headers: admin.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:success)
+ expect(json_response[:title]).to eq('Fetch Order Status')
+ expect(json_response[:description]).to eq('Fetches order status from external API')
+ expect(json_response[:enabled]).to be(true)
+ expect(json_response[:slug]).to eq('custom_fetch_order_status')
+ expect(json_response[:param_schema]).to eq([
+ { name: 'order_id', type: 'string', description: 'The order ID', required: true }
+ ])
+ end
+
+ context 'with invalid parameters' do
+ let(:invalid_attributes) do
+ {
+ custom_tool: {
+ title: '',
+ endpoint_url: ''
+ }
+ }
+ end
+
+ it 'returns unprocessable entity status' do
+ post "/api/v1/accounts/#{account.id}/captain/custom_tools",
+ params: invalid_attributes,
+ headers: admin.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:unprocessable_entity)
+ end
+ end
+
+ context 'with invalid endpoint URL' do
+ let(:invalid_url_attributes) do
+ {
+ custom_tool: {
+ title: 'Test Tool',
+ endpoint_url: 'http://localhost/api',
+ http_method: 'GET'
+ }
+ }
+ end
+
+ it 'returns unprocessable entity status' do
+ post "/api/v1/accounts/#{account.id}/captain/custom_tools",
+ params: invalid_url_attributes,
+ headers: admin.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:unprocessable_entity)
+ end
+ end
+ end
+ end
+
+ describe 'PATCH /api/v1/accounts/{account.id}/captain/custom_tools/{id}' do
+ let(:custom_tool) { create(:captain_custom_tool, account: account) }
+ let(:update_attributes) do
+ {
+ custom_tool: {
+ title: 'Updated Tool Title',
+ enabled: false
+ }
+ }
+ end
+
+ context 'when it is an un-authenticated user' do
+ it 'returns unauthorized status' do
+ patch "/api/v1/accounts/#{account.id}/captain/custom_tools/#{custom_tool.id}",
+ params: update_attributes
+ expect(response).to have_http_status(:unauthorized)
+ end
+ end
+
+ context 'when it is an agent' do
+ it 'returns unauthorized status' do
+ patch "/api/v1/accounts/#{account.id}/captain/custom_tools/#{custom_tool.id}",
+ params: update_attributes,
+ headers: agent.create_new_auth_token
+ expect(response).to have_http_status(:unauthorized)
+ end
+ end
+
+ context 'when it is an admin' do
+ it 'updates the custom tool and returns success status' do
+ patch "/api/v1/accounts/#{account.id}/captain/custom_tools/#{custom_tool.id}",
+ params: update_attributes,
+ headers: admin.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:success)
+ expect(json_response[:title]).to eq('Updated Tool Title')
+ expect(json_response[:enabled]).to be(false)
+ end
+
+ context 'with invalid parameters' do
+ let(:invalid_attributes) do
+ {
+ custom_tool: {
+ title: ''
+ }
+ }
+ end
+
+ it 'returns unprocessable entity status' do
+ patch "/api/v1/accounts/#{account.id}/captain/custom_tools/#{custom_tool.id}",
+ params: invalid_attributes,
+ headers: admin.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:unprocessable_entity)
+ end
+ end
+ end
+ end
+
+ describe 'DELETE /api/v1/accounts/{account.id}/captain/custom_tools/{id}' do
+ let!(:custom_tool) { create(:captain_custom_tool, account: account) }
+
+ context 'when it is an un-authenticated user' do
+ it 'returns unauthorized status' do
+ delete "/api/v1/accounts/#{account.id}/captain/custom_tools/#{custom_tool.id}"
+ expect(response).to have_http_status(:unauthorized)
+ end
+ end
+
+ context 'when it is an agent' do
+ it 'returns unauthorized status' do
+ delete "/api/v1/accounts/#{account.id}/captain/custom_tools/#{custom_tool.id}",
+ headers: agent.create_new_auth_token
+ expect(response).to have_http_status(:unauthorized)
+ end
+ end
+
+ context 'when it is an admin' do
+ it 'deletes the custom tool and returns no content status' do
+ expect do
+ delete "/api/v1/accounts/#{account.id}/captain/custom_tools/#{custom_tool.id}",
+ headers: admin.create_new_auth_token
+ end.to change(Captain::CustomTool, :count).by(-1)
+
+ expect(response).to have_http_status(:no_content)
+ end
+
+ context 'when custom tool does not exist' do
+ it 'returns not found status' do
+ delete "/api/v1/accounts/#{account.id}/captain/custom_tools/999999",
+ headers: admin.create_new_auth_token
+
+ expect(response).to have_http_status(:not_found)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/enterprise/models/captain/custom_tool_spec.rb b/spec/enterprise/models/captain/custom_tool_spec.rb
index c7c0451b1..5f6c7b19a 100644
--- a/spec/enterprise/models/captain/custom_tool_spec.rb
+++ b/spec/enterprise/models/captain/custom_tool_spec.rb
@@ -19,8 +19,8 @@ RSpec.describe Captain::CustomTool, type: :model do
let(:account) { create(:account) }
it 'validates uniqueness of slug scoped to account' do
- create(:captain_custom_tool, account: account, slug: 'custom_test-tool')
- duplicate = build(:captain_custom_tool, account: account, slug: 'custom_test-tool')
+ create(:captain_custom_tool, account: account, slug: 'custom_test_tool')
+ duplicate = build(:captain_custom_tool, account: account, slug: 'custom_test_tool')
expect(duplicate).not_to be_valid
expect(duplicate.errors[:slug]).to include('has already been taken')
@@ -28,8 +28,8 @@ RSpec.describe Captain::CustomTool, type: :model do
it 'allows same slug across different accounts' do
account2 = create(:account)
- create(:captain_custom_tool, account: account, slug: 'custom_test-tool')
- different_account_tool = build(:captain_custom_tool, account: account2, slug: 'custom_test-tool')
+ create(:captain_custom_tool, account: account, slug: 'custom_test_tool')
+ different_account_tool = build(:captain_custom_tool, account: account2, slug: 'custom_test_tool')
expect(different_account_tool).to be_valid
end
@@ -114,7 +114,7 @@ RSpec.describe Captain::CustomTool, type: :model do
it 'generates slug from title on creation' do
tool = create(:captain_custom_tool, account: account, title: 'Fetch Order Status')
- expect(tool.slug).to eq('custom_fetch-order-status')
+ expect(tool.slug).to eq('custom_fetch_order_status')
end
it 'adds custom_ prefix to generated slug' do
@@ -124,37 +124,39 @@ RSpec.describe Captain::CustomTool, type: :model do
end
it 'does not override manually set slug' do
- tool = create(:captain_custom_tool, account: account, title: 'Test Tool', slug: 'custom_manual-slug')
+ tool = create(:captain_custom_tool, account: account, title: 'Test Tool', slug: 'custom_manual_slug')
- expect(tool.slug).to eq('custom_manual-slug')
+ expect(tool.slug).to eq('custom_manual_slug')
end
- it 'handles slug collisions by appending counter' do
- create(:captain_custom_tool, account: account, title: 'Test Tool', slug: 'custom_test-tool')
+ it 'handles slug collisions by appending random suffix' do
+ create(:captain_custom_tool, account: account, title: 'Test Tool', slug: 'custom_test_tool')
tool2 = create(:captain_custom_tool, account: account, title: 'Test Tool')
- expect(tool2.slug).to eq('custom_test-tool-1')
+ expect(tool2.slug).to match(/^custom_test_tool_[a-z0-9]{6}$/)
end
it 'handles multiple slug collisions' do
- create(:captain_custom_tool, account: account, title: 'Test Tool', slug: 'custom_test-tool')
- create(:captain_custom_tool, account: account, title: 'Test Tool', slug: 'custom_test-tool-1')
+ create(:captain_custom_tool, account: account, title: 'Test Tool', slug: 'custom_test_tool')
+ create(:captain_custom_tool, account: account, title: 'Test Tool', slug: 'custom_test_tool_abc123')
tool3 = create(:captain_custom_tool, account: account, title: 'Test Tool')
- expect(tool3.slug).to eq('custom_test-tool-2')
+ expect(tool3.slug).to match(/^custom_test_tool_[a-z0-9]{6}$/)
+ expect(tool3.slug).not_to eq('custom_test_tool')
+ expect(tool3.slug).not_to eq('custom_test_tool_abc123')
end
- it 'generates slug with UUID when title is blank' do
+ it 'does not generate slug when title is blank' do
tool = build(:captain_custom_tool, account: account, title: nil)
- tool.valid?
- expect(tool.slug).to match(/^custom_[0-9a-f-]+$/)
+ expect(tool).not_to be_valid
+ expect(tool.errors[:title]).to include("can't be blank")
end
it 'parameterizes title correctly' do
tool = create(:captain_custom_tool, account: account, title: 'Fetch Order Status & Details!')
- expect(tool.slug).to eq('custom_fetch-order-status-details')
+ expect(tool.slug).to eq('custom_fetch_order_status_details')
end
end
From 0974aea30071ce464e7ef4a749b8957b383cca1e Mon Sep 17 00:00:00 2001
From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Date: Mon, 6 Oct 2025 23:11:26 +0530
Subject: [PATCH 160/182] chore: Increase custom filter limit from 50 to 1000
per user (#12603)
# Pull Request Template
## Description
This PR increases the custom filter limit from 50 to 1000 per user
## Type of change
- [x] Bug fix (non-breaking change which fixes an issue)
## How Has This Been Tested?
### Screenshot
## 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
- [ ] Any dependent changes have been merged and published in downstream
modules
---
app/models/custom_filter.rb | 3 +--
config/locales/en.yml | 2 +-
lib/limits.rb | 1 +
.../api/v1/accounts/custom_filters_controller_spec.rb | 6 +++---
4 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/app/models/custom_filter.rb b/app/models/custom_filter.rb
index b3d58fd17..6d64c0447 100644
--- a/app/models/custom_filter.rb
+++ b/app/models/custom_filter.rb
@@ -17,7 +17,6 @@
# index_custom_filters_on_user_id (user_id)
#
class CustomFilter < ApplicationRecord
- MAX_FILTER_PER_USER = 50
belongs_to :user
belongs_to :account
@@ -25,7 +24,7 @@ class CustomFilter < ApplicationRecord
validate :validate_number_of_filters
def validate_number_of_filters
- return true if account.custom_filters.where(user_id: user_id).size < MAX_FILTER_PER_USER
+ return true if account.custom_filters.where(user_id: user_id).size < Limits::MAX_CUSTOM_FILTERS_PER_USER
errors.add :account_id, I18n.t('errors.custom_filters.number_of_records')
end
diff --git a/config/locales/en.yml b/config/locales/en.yml
index c106531a0..0c76f8beb 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -100,7 +100,7 @@ en:
validations:
name: should not start or end with symbols, and it should not have < > / \ @ characters.
custom_filters:
- number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 50.
+ 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".
diff --git a/lib/limits.rb b/lib/limits.rb
index 7a2371207..5da178bf4 100644
--- a/lib/limits.rb
+++ b/lib/limits.rb
@@ -6,6 +6,7 @@ module Limits
GREETING_MESSAGE_MAX_LENGTH = 10_000
CATEGORIES_PER_PAGE = 1000
AUTO_ASSIGNMENT_BULK_LIMIT = 100
+ MAX_CUSTOM_FILTERS_PER_USER = 1000
def self.conversation_message_per_minute_limit
ENV.fetch('CONVERSATION_MESSAGE_PER_MINUTE_LIMIT', '200').to_i
diff --git a/spec/controllers/api/v1/accounts/custom_filters_controller_spec.rb b/spec/controllers/api/v1/accounts/custom_filters_controller_spec.rb
index 760100cf3..9c9469090 100644
--- a/spec/controllers/api/v1/accounts/custom_filters_controller_spec.rb
+++ b/spec/controllers/api/v1/accounts/custom_filters_controller_spec.rb
@@ -93,9 +93,9 @@ RSpec.describe 'Custom Filters API', type: :request do
expect(json_response['name']).to eq 'vip-customers'
end
- it 'gives the error for 51st record' do
+ it 'gives the error for 1001st record' do
CustomFilter.delete_all
- CustomFilter::MAX_FILTER_PER_USER.times do
+ Limits::MAX_CUSTOM_FILTERS_PER_USER.times do
create(:custom_filter, user: user, account: account)
end
@@ -107,7 +107,7 @@ RSpec.describe 'Custom Filters API', type: :request do
expect(response).to have_http_status(:unprocessable_entity)
json_response = response.parsed_body
expect(json_response['message']).to include(
- 'Account Limit reached. The maximum number of allowed custom filters for a user per account is 50.'
+ 'Account Limit reached. The maximum number of allowed custom filters for a user per account is 1000.'
)
end
end
From 3a71829b46444bf06177b17a9eeac49aeb726558 Mon Sep 17 00:00:00 2001
From: Shivam Mishra
Date: Mon, 6 Oct 2025 23:21:58 +0530
Subject: [PATCH 161/182] feat: Improve captain conversation handling (#12599)
Co-authored-by: Pranav
---
app/javascript/dashboard/featureFlags.js | 1 -
config/initializers/ai_agents.rb | 1 +
.../conversation/response_builder_job.rb | 21 ++++++++---
enterprise/app/models/captain/assistant.rb | 1 +
enterprise/app/models/captain/scenario.rb | 11 +++---
enterprise/app/models/concerns/toolable.rb | 2 +-
.../captain/assistant/agent_runner_service.rb | 7 +++-
.../lib/captain/prompts/assistant.liquid | 35 ++++++++++---------
.../lib/captain/prompts/scenario.liquid | 30 ++++++++++++++--
.../assistant/agent_runner_service_spec.rb | 9 ++---
10 files changed, 81 insertions(+), 37 deletions(-)
diff --git a/app/javascript/dashboard/featureFlags.js b/app/javascript/dashboard/featureFlags.js
index 0fb2322d2..87227e74b 100644
--- a/app/javascript/dashboard/featureFlags.js
+++ b/app/javascript/dashboard/featureFlags.js
@@ -49,6 +49,5 @@ export const PREMIUM_FEATURES = [
FEATURE_FLAGS.CUSTOM_ROLES,
FEATURE_FLAGS.AUDIT_LOGS,
FEATURE_FLAGS.HELP_CENTER,
- FEATURE_FLAGS.CAPTAIN_V2,
FEATURE_FLAGS.SAML,
];
diff --git a/config/initializers/ai_agents.rb b/config/initializers/ai_agents.rb
index 37bdd589f..099d637ae 100644
--- a/config/initializers/ai_agents.rb
+++ b/config/initializers/ai_agents.rb
@@ -15,6 +15,7 @@ Rails.application.config.after_initialize do
config.openai_api_base = api_base
end
config.default_model = model
+ config.max_turns = 30
config.debug = false
end
end
diff --git a/enterprise/app/jobs/captain/conversation/response_builder_job.rb b/enterprise/app/jobs/captain/conversation/response_builder_job.rb
index 7ede1201d..15f2ace56 100644
--- a/enterprise/app/jobs/captain/conversation/response_builder_job.rb
+++ b/enterprise/app/jobs/captain/conversation/response_builder_job.rb
@@ -49,10 +49,15 @@ class Captain::Conversation::ResponseBuilderJob < ApplicationJob
.where(message_type: [:incoming, :outgoing])
.where(private: false)
.map do |message|
- {
+ message_hash = {
content: prepare_multimodal_message_content(message),
role: determine_role(message)
}
+
+ # Include agent_name if present in additional_attributes
+ message_hash[:agent_name] = message.additional_attributes['agent_name'] if message.additional_attributes&.dig('agent_name').present?
+
+ message_hash
end
end
@@ -79,25 +84,31 @@ class Captain::Conversation::ResponseBuilderJob < ApplicationJob
end
def create_handoff_message
- create_outgoing_message(@assistant.config['handoff_message'].presence || I18n.t('conversations.captain.handoff'))
+ create_outgoing_message(
+ @assistant.config['handoff_message'].presence || I18n.t('conversations.captain.handoff')
+ )
end
def create_messages
validate_message_content!(@response['response'])
- create_outgoing_message(@response['response'])
+ create_outgoing_message(@response['response'], agent_name: @response['agent_name'])
end
def validate_message_content!(content)
raise ArgumentError, 'Message content cannot be blank' if content.blank?
end
- def create_outgoing_message(message_content)
+ def create_outgoing_message(message_content, agent_name: nil)
+ additional_attrs = {}
+ additional_attrs[:agent_name] = agent_name if agent_name.present?
+
@conversation.messages.create!(
message_type: :outgoing,
account_id: account.id,
inbox_id: inbox.id,
sender: @assistant,
- content: message_content
+ content: message_content,
+ additional_attributes: additional_attrs
)
end
diff --git a/enterprise/app/models/captain/assistant.rb b/enterprise/app/models/captain/assistant.rb
index 21ecf05c4..771360659 100644
--- a/enterprise/app/models/captain/assistant.rb
+++ b/enterprise/app/models/captain/assistant.rb
@@ -105,6 +105,7 @@ class Captain::Assistant < ApplicationRecord
product_name: config['product_name'] || 'this product',
scenarios: scenarios.enabled.map do |scenario|
{
+ title: scenario.title,
key: scenario.title.parameterize.underscore,
description: scenario.description
}
diff --git a/enterprise/app/models/captain/scenario.rb b/enterprise/app/models/captain/scenario.rb
index d04990199..d876a7127 100644
--- a/enterprise/app/models/captain/scenario.rb
+++ b/enterprise/app/models/captain/scenario.rb
@@ -38,7 +38,7 @@ class Captain::Scenario < ApplicationRecord
scope :enabled, -> { where(enabled: true) }
- delegate :temperature, :feature_faq, :feature_memory, :product_name, to: :assistant
+ delegate :temperature, :feature_faq, :feature_memory, :product_name, :response_guidelines, :guardrails, to: :assistant
before_save :resolve_tool_references
@@ -46,7 +46,10 @@ class Captain::Scenario < ApplicationRecord
{
title: title,
instructions: resolved_instructions,
- tools: resolved_tools
+ tools: resolved_tools,
+ assistant_name: assistant.name.downcase.gsub(/\s+/, '_'),
+ response_guidelines: response_guidelines || [],
+ guardrails: guardrails || []
}
end
@@ -61,9 +64,7 @@ class Captain::Scenario < ApplicationRecord
end
def resolved_instructions
- instruction.gsub(TOOL_REFERENCE_REGEX) do |match|
- "#{match} tool "
- end
+ instruction.gsub(TOOL_REFERENCE_REGEX, '`\1` tool')
end
def resolved_tools
diff --git a/enterprise/app/models/concerns/toolable.rb b/enterprise/app/models/concerns/toolable.rb
index bae1771e4..ad047e8f8 100644
--- a/enterprise/app/models/concerns/toolable.rb
+++ b/enterprise/app/models/concerns/toolable.rb
@@ -70,7 +70,7 @@ module Concerns::Toolable
return raw_response_body if response_template.blank?
response_data = parse_response_body(raw_response_body)
- render_template(response_template, { 'response' => response_data })
+ render_template(response_template, { 'response' => response_data, 'r' => response_data })
end
private
diff --git a/enterprise/app/services/captain/assistant/agent_runner_service.rb b/enterprise/app/services/captain/assistant/agent_runner_service.rb
index 7a35e6d07..11a7dcad1 100644
--- a/enterprise/app/services/captain/assistant/agent_runner_service.rb
+++ b/enterprise/app/services/captain/assistant/agent_runner_service.rb
@@ -74,7 +74,12 @@ class Captain::Assistant::AgentRunnerService
# Response formatting methods
def process_agent_result(result)
Rails.logger.info "[Captain V2] Agent result: #{result.inspect}"
- format_response(result.output)
+ response = format_response(result.output)
+
+ # Extract agent name from context
+ response['agent_name'] = result.context&.dig(:current_agent)
+
+ response
end
def format_response(output)
diff --git a/enterprise/lib/captain/prompts/assistant.liquid b/enterprise/lib/captain/prompts/assistant.liquid
index 69c967d73..0dc7d8577 100644
--- a/enterprise/lib/captain/prompts/assistant.liquid
+++ b/enterprise/lib/captain/prompts/assistant.liquid
@@ -2,12 +2,13 @@
You are part of Captain, a multi-agent AI system designed for seamless agent coordination and task execution. You can transfer conversations to specialized agents using handoff functions (e.g., `handoff_to_[agent_name]`). These transfers happen in the background - never mention or draw attention to them in your responses.
# Your Identity
-You are {{name}}, a helpful and knowledgeable assistant. Your role is to provide accurate information, assist with tasks, and ensure users get the help they need.
+You are {{name}}, a helpful and knowledgeable assistant. Your role is to primarily act as a orchestrator handling multiple scenarios by using handoff tools. Your job also involves providing accurate information, assisting with tasks, and ensuring the customer get the help they need.
{{ description }}
-Don't digress away from your instructions, and use all the available tools at your disposal for solving customer issues. If you are to state something factual about {{product_name}} ensure you source that information from the FAQs only. Use the faq_lookup tool for this.
+Don't digress away from your instructions, and use all the available tools at your disposal for solving customer issues. If you are to state something factual about {{product_name}} ensure you source that information from the FAQs only. Use the `captain--tools--faq_lookup` tool for this.
+{% if conversation || contact -%}
# Current Context
Here's the metadata we have about the current conversation and the contact associated with it:
@@ -19,12 +20,16 @@ Here's the metadata we have about the current conversation and the contact assoc
{% if contact -%}
{% render 'contact' %}
{% endif -%}
+{% endif -%}
{% if response_guidelines.size > 0 -%}
# Response Guidelines
Your responses should follow these guidelines:
{% for guideline in response_guidelines -%}
- {{ guideline }}
+- Be conversational but professional
+- Provide actionable information
+- Include relevant details from tool responses
{% endfor %}
{% endif -%}
@@ -45,30 +50,26 @@ First, understand what the user is asking:
- **Complexity**: Can you handle it or does it need specialized expertise?
## 2. Check for Specialized Scenarios First
-Before using any tools, check if the request matches any of these scenarios. If unclear, ask clarifying questions to determine if a scenario applies:
+
+Before using any tools, check if the request matches any of these scenarios. If it seems like a particular scenario matches, use the specific handoff tool to transfer the conversation to the specific agent. The following are the scenario agents that are available to you.
{% for scenario in scenarios -%}
-### handoff_to_{{ scenario.key }}
-{{ scenario.description }}
-{% endfor -%}
+- {{ scenario.title }}: {{ scenario.description }}, use the `handoff_to_{{ scenario.key }}` tool to transfer the conversation to the {{ scenario.title }} agent.
+{% endfor %}
+If unclear, ask clarifying questions to determine if a scenario applies:
## 3. Handle the Request
-If no specialized scenario clearly matches, handle it yourself:
+If no specialized scenario clearly matches, handle it yourself in the following way
### For Questions and Information Requests
-1. **First, check existing knowledge**: Use `faq_lookup` tool to search for relevant information
-2. **If not found in FAQs**: Provide your best answer based on available context
-3. **If unable to answer**: Use `handoff` tool to transfer to a human expert
+1. **First, check existing knowledge**: Use `captain--tools--faq_lookup` tool to search for relevant information
+2. **If not found in FAQs**: Try to ask clarifying questions to gather more information
+3. **If unable to answer**: Use `captain--tools--handoff` tool to transfer to a human expert
### For Complex or Unclear Requests
1. **Ask clarifying questions**: Gather more information if needed
2. **Break down complex tasks**: Handle step by step or hand off if too complex
-3. **Escalate when necessary**: Use `handoff` tool for issues beyond your capabilities
-
-## Response Best Practices
-- Be conversational but professional
-- Provide actionable information
-- Include relevant details from tool responses
+3. **Escalate when necessary**: Use `captain--tools--handoff` tool for issues beyond your capabilities
# Human Handoff Protocol
Transfer to a human agent when:
@@ -77,4 +78,4 @@ Transfer to a human agent when:
- The issue requires specialized knowledge or permissions you don't have
- Multiple attempts to help have been unsuccessful
-When using the `handoff` tool, provide a clear reason that helps the human agent understand the context.
+When using the `captain--tools--handoff` tool, provide a clear reason that helps the human agent understand the context.
diff --git a/enterprise/lib/captain/prompts/scenario.liquid b/enterprise/lib/captain/prompts/scenario.liquid
index 339820b83..1148a7c3a 100644
--- a/enterprise/lib/captain/prompts/scenario.liquid
+++ b/enterprise/lib/captain/prompts/scenario.liquid
@@ -1,20 +1,44 @@
# System context
-You are part of a multi-agent system where you've been handed off a conversation to handle a specific task.
-The handoff was seamless - the user is not aware of any transfer. Continue the conversation naturally.
+You are part of a multi-agent system where you've been handed off a conversation to handle a specific task. The handoff was seamless - the user is not aware of any transfer. Continue the conversation naturally.
# Your Role
-You are a specialized agent called {{ title }}, your task is to handle the following scenario:
+You are a specialized agent called "{{ title }}", your task is to handle the following scenario:
{{ instructions }}
+If you believe the user's request is not within the scope of your role, you can assign this conversation back to the orchestrator agent using the `handoff_to_{{ assistant_name }}` tool
+
+{% if conversation || contact %}
+# Current Context
+
+Here's the metadata we have about the current conversation and the contact associated with it:
+
{% if conversation -%}
{% render 'conversation' %}
+{% endif -%}
{% if contact -%}
{% render 'contact' %}
{% endif -%}
{% endif -%}
+
+{% if response_guidelines.size > 0 -%}
+# Response Guidelines
+Your responses should follow these guidelines:
+{% for guideline in response_guidelines -%}
+- {{ guideline }}
+{% endfor %}
+{% endif -%}
+
+{% if guardrails.size > 0 -%}
+# Guardrails
+Always respect these boundaries:
+{% for guardrail in guardrails -%}
+- {{ guardrail }}
+{% endfor %}
+{% endif -%}
+
{% if tools.size > 0 -%}
# Available Tools
You have access to these tools:
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 f31177fc2..4ee269c48 100644
--- a/spec/enterprise/services/captain/assistant/agent_runner_service_spec.rb
+++ b/spec/enterprise/services/captain/assistant/agent_runner_service_spec.rb
@@ -13,7 +13,7 @@ RSpec.describe Captain::Assistant::AgentRunnerService do
let(:mock_runner) { instance_double(Agents::Runner) }
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' }) }
+ let(:mock_result) { instance_double(Agents::RunResult, output: { 'response' => 'Test response' }, context: nil) }
let(:message_history) do
[
@@ -99,7 +99,7 @@ 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' })
+ expect(result).to eq({ 'response' => 'Test response', 'agent_name' => nil })
end
context 'when no scenarios are enabled' do
@@ -118,14 +118,15 @@ RSpec.describe Captain::Assistant::AgentRunnerService do
end
context 'when agent result is a string' do
- let(:mock_result) { instance_double(Agents::RunResult, output: 'Simple string response') }
+ let(:mock_result) { instance_double(Agents::RunResult, output: 'Simple string response', context: nil) }
it 'formats string response correctly' do
result = service.generate_response(message_history: message_history)
expect(result).to eq({
'response' => 'Simple string response',
- 'reasoning' => 'Processed by agent'
+ 'reasoning' => 'Processed by agent',
+ 'agent_name' => nil
})
end
end
From 829142c808d0908b17051ffba539daae52266174 Mon Sep 17 00:00:00 2001
From: Pranav
Date: Mon, 6 Oct 2025 22:51:18 -0700
Subject: [PATCH 162/182] fix: Update max_turns config (#12604)
Pass max_turns in the run config than during the initialization.
---------
Co-authored-by: Shivam Mishra
---
config/initializers/ai_agents.rb | 1 -
.../app/services/captain/assistant/agent_runner_service.rb | 2 +-
.../services/captain/assistant/agent_runner_service_spec.rb | 3 ++-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/config/initializers/ai_agents.rb b/config/initializers/ai_agents.rb
index 099d637ae..37bdd589f 100644
--- a/config/initializers/ai_agents.rb
+++ b/config/initializers/ai_agents.rb
@@ -15,7 +15,6 @@ Rails.application.config.after_initialize do
config.openai_api_base = api_base
end
config.default_model = model
- config.max_turns = 30
config.debug = false
end
end
diff --git a/enterprise/app/services/captain/assistant/agent_runner_service.rb b/enterprise/app/services/captain/assistant/agent_runner_service.rb
index 11a7dcad1..9c4e56841 100644
--- a/enterprise/app/services/captain/assistant/agent_runner_service.rb
+++ b/enterprise/app/services/captain/assistant/agent_runner_service.rb
@@ -23,7 +23,7 @@ class Captain::Assistant::AgentRunnerService
message_to_process = extract_last_user_message(message_history)
runner = Agents::Runner.with_agents(*agents)
runner = add_callbacks_to_runner(runner) if @callbacks.any?
- result = runner.run(message_to_process, context: context)
+ result = runner.run(message_to_process, context: context, max_turns: 100)
process_agent_result(result)
rescue StandardError => e
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 4ee269c48..2c05860e2 100644
--- a/spec/enterprise/services/captain/assistant/agent_runner_service_spec.rb
+++ b/spec/enterprise/services/captain/assistant/agent_runner_service_spec.rb
@@ -90,7 +90,8 @@ RSpec.describe Captain::Assistant::AgentRunnerService do
expect(mock_runner).to receive(:run).with(
'I need help with my account',
- context: expected_context
+ context: expected_context,
+ max_turns: 100
)
service.generate_response(message_history: message_history)
From c4c1f3eb63e178f40621614a1a56bd5a20f58492 Mon Sep 17 00:00:00 2001
From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Date: Tue, 7 Oct 2025 18:43:54 +0530
Subject: [PATCH 163/182] chore: Adjust debounce timeouts for conversation
stats fetch (#12609)
---
app/javascript/dashboard/store/modules/conversationStats.js | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/app/javascript/dashboard/store/modules/conversationStats.js b/app/javascript/dashboard/store/modules/conversationStats.js
index 917781bbf..353c1e59a 100644
--- a/app/javascript/dashboard/store/modules/conversationStats.js
+++ b/app/javascript/dashboard/store/modules/conversationStats.js
@@ -25,8 +25,8 @@ const fetchMetaData = async (commit, params) => {
}
};
-const debouncedFetchMetaData = debounce(fetchMetaData, 500, false, 1000);
-const longDebouncedFetchMetaData = debounce(fetchMetaData, 500, false, 5000);
+const debouncedFetchMetaData = debounce(fetchMetaData, 500, false, 1500);
+const longDebouncedFetchMetaData = debounce(fetchMetaData, 1000, false, 8000);
const superLongDebouncedFetchMetaData = debounce(
fetchMetaData,
1500,
@@ -36,7 +36,7 @@ const superLongDebouncedFetchMetaData = debounce(
export const actions = {
get: async ({ commit, state: $state }, params) => {
- if ($state.allCount > 10000) {
+ if ($state.allCount > 5000) {
superLongDebouncedFetchMetaData(commit, params);
} else if ($state.allCount > 100) {
longDebouncedFetchMetaData(commit, params);
From 4b2ebb8877bd050b61c25032b6c3780974c13410 Mon Sep 17 00:00:00 2001
From: Chatwoot Bot <92152627+chatwoot-bot@users.noreply.github.com>
Date: Tue, 7 Oct 2025 06:47:38 -0700
Subject: [PATCH 164/182] chore: Update translations (#12598)
---
.../dashboard/i18n/locale/am/inboxMgmt.json | 6 +-
.../i18n/locale/am/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/am/settings.json | 1 +
.../dashboard/i18n/locale/ar/inboxMgmt.json | 6 +-
.../i18n/locale/ar/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/ar/settings.json | 1 +
.../dashboard/i18n/locale/az/inboxMgmt.json | 6 +-
.../i18n/locale/az/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/az/settings.json | 1 +
.../dashboard/i18n/locale/bg/inboxMgmt.json | 6 +-
.../i18n/locale/bg/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/bg/settings.json | 1 +
.../dashboard/i18n/locale/ca/inboxMgmt.json | 6 +-
.../i18n/locale/ca/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/ca/settings.json | 1 +
.../dashboard/i18n/locale/cs/inboxMgmt.json | 6 +-
.../i18n/locale/cs/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/cs/settings.json | 1 +
.../dashboard/i18n/locale/da/inboxMgmt.json | 6 +-
.../i18n/locale/da/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/da/settings.json | 1 +
.../dashboard/i18n/locale/de/inboxMgmt.json | 6 +-
.../i18n/locale/de/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/de/settings.json | 1 +
.../dashboard/i18n/locale/el/inboxMgmt.json | 6 +-
.../i18n/locale/el/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/el/settings.json | 1 +
.../dashboard/i18n/locale/es/inboxMgmt.json | 6 +-
.../i18n/locale/es/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/es/settings.json | 1 +
.../dashboard/i18n/locale/fa/inboxMgmt.json | 6 +-
.../i18n/locale/fa/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/fa/settings.json | 1 +
.../dashboard/i18n/locale/fi/inboxMgmt.json | 6 +-
.../i18n/locale/fi/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/fi/settings.json | 1 +
.../dashboard/i18n/locale/fr/inboxMgmt.json | 6 +-
.../i18n/locale/fr/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/fr/settings.json | 1 +
.../dashboard/i18n/locale/he/inboxMgmt.json | 6 +-
.../i18n/locale/he/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/he/settings.json | 1 +
.../dashboard/i18n/locale/hi/inboxMgmt.json | 6 +-
.../i18n/locale/hi/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/hi/settings.json | 1 +
.../dashboard/i18n/locale/hr/inboxMgmt.json | 6 +-
.../i18n/locale/hr/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/hr/settings.json | 1 +
.../dashboard/i18n/locale/hu/inboxMgmt.json | 6 +-
.../i18n/locale/hu/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/hu/settings.json | 1 +
.../dashboard/i18n/locale/hy/inboxMgmt.json | 6 +-
.../i18n/locale/hy/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/hy/settings.json | 1 +
.../dashboard/i18n/locale/id/inboxMgmt.json | 6 +-
.../i18n/locale/id/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/id/settings.json | 1 +
.../dashboard/i18n/locale/is/inboxMgmt.json | 6 +-
.../i18n/locale/is/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/is/settings.json | 1 +
.../dashboard/i18n/locale/it/general.json | 2 +-
.../dashboard/i18n/locale/it/inboxMgmt.json | 6 +-
.../i18n/locale/it/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/it/settings.json | 1 +
.../dashboard/i18n/locale/ja/inboxMgmt.json | 6 +-
.../i18n/locale/ja/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/ja/settings.json | 1 +
.../dashboard/i18n/locale/ka/inboxMgmt.json | 6 +-
.../i18n/locale/ka/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/ka/settings.json | 1 +
.../dashboard/i18n/locale/ko/inboxMgmt.json | 6 +-
.../i18n/locale/ko/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/ko/settings.json | 1 +
.../dashboard/i18n/locale/lt/inboxMgmt.json | 6 +-
.../i18n/locale/lt/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/lt/settings.json | 1 +
.../dashboard/i18n/locale/lv/inboxMgmt.json | 6 +-
.../i18n/locale/lv/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/lv/settings.json | 1 +
.../dashboard/i18n/locale/ml/inboxMgmt.json | 6 +-
.../i18n/locale/ml/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/ml/settings.json | 1 +
.../dashboard/i18n/locale/ms/inboxMgmt.json | 6 +-
.../i18n/locale/ms/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/ms/settings.json | 1 +
.../dashboard/i18n/locale/ne/inboxMgmt.json | 6 +-
.../i18n/locale/ne/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/ne/settings.json | 1 +
.../dashboard/i18n/locale/nl/inboxMgmt.json | 6 +-
.../i18n/locale/nl/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/nl/settings.json | 1 +
.../dashboard/i18n/locale/no/inboxMgmt.json | 6 +-
.../i18n/locale/no/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/no/settings.json | 1 +
.../dashboard/i18n/locale/pl/inboxMgmt.json | 6 +-
.../i18n/locale/pl/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/pl/settings.json | 1 +
.../dashboard/i18n/locale/pt/inboxMgmt.json | 6 +-
.../i18n/locale/pt/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/pt/settings.json | 1 +
.../i18n/locale/pt_BR/inboxMgmt.json | 6 +-
.../i18n/locale/pt_BR/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/pt_BR/settings.json | 1 +
.../dashboard/i18n/locale/ro/inboxMgmt.json | 6 +-
.../i18n/locale/ro/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/ro/settings.json | 1 +
.../dashboard/i18n/locale/ru/inboxMgmt.json | 6 +-
.../i18n/locale/ru/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/ru/settings.json | 1 +
.../dashboard/i18n/locale/sh/inboxMgmt.json | 6 +-
.../i18n/locale/sh/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/sh/settings.json | 1 +
.../dashboard/i18n/locale/sk/inboxMgmt.json | 6 +-
.../i18n/locale/sk/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/sk/settings.json | 1 +
.../dashboard/i18n/locale/sl/inboxMgmt.json | 6 +-
.../i18n/locale/sl/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/sl/settings.json | 1 +
.../dashboard/i18n/locale/sq/inboxMgmt.json | 6 +-
.../i18n/locale/sq/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/sq/settings.json | 1 +
.../dashboard/i18n/locale/sr/inboxMgmt.json | 6 +-
.../i18n/locale/sr/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/sr/settings.json | 1 +
.../dashboard/i18n/locale/sv/inboxMgmt.json | 6 +-
.../i18n/locale/sv/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/sv/settings.json | 1 +
.../dashboard/i18n/locale/ta/inboxMgmt.json | 6 +-
.../i18n/locale/ta/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/ta/settings.json | 1 +
.../dashboard/i18n/locale/th/inboxMgmt.json | 6 +-
.../i18n/locale/th/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/th/settings.json | 1 +
.../dashboard/i18n/locale/tl/inboxMgmt.json | 6 +-
.../i18n/locale/tl/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/tl/settings.json | 1 +
.../dashboard/i18n/locale/tr/inboxMgmt.json | 6 +-
.../i18n/locale/tr/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/tr/settings.json | 1 +
.../dashboard/i18n/locale/uk/inboxMgmt.json | 6 +-
.../i18n/locale/uk/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/uk/settings.json | 1 +
.../dashboard/i18n/locale/ur/inboxMgmt.json | 6 +-
.../i18n/locale/ur/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/ur/settings.json | 1 +
.../i18n/locale/ur_IN/inboxMgmt.json | 6 +-
.../i18n/locale/ur_IN/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/ur_IN/settings.json | 1 +
.../dashboard/i18n/locale/vi/inboxMgmt.json | 6 +-
.../i18n/locale/vi/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/vi/settings.json | 1 +
.../i18n/locale/zh_CN/inboxMgmt.json | 6 +-
.../i18n/locale/zh_CN/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/zh_CN/settings.json | 1 +
.../i18n/locale/zh_TW/inboxMgmt.json | 6 +-
.../i18n/locale/zh_TW/integrations.json | 109 ++++++++++++++++++
.../dashboard/i18n/locale/zh_TW/settings.json | 1 +
config/locales/am.yml | 4 +-
config/locales/ar.yml | 4 +-
config/locales/az.yml | 4 +-
config/locales/bg.yml | 4 +-
config/locales/ca.yml | 4 +-
config/locales/cs.yml | 4 +-
config/locales/da.yml | 4 +-
config/locales/de.yml | 4 +-
config/locales/el.yml | 4 +-
config/locales/es.yml | 4 +-
config/locales/fa.yml | 4 +-
config/locales/fi.yml | 4 +-
config/locales/fr.yml | 4 +-
config/locales/he.yml | 4 +-
config/locales/hi.yml | 4 +-
config/locales/hr.yml | 4 +-
config/locales/hu.yml | 4 +-
config/locales/hy.yml | 4 +-
config/locales/id.yml | 4 +-
config/locales/is.yml | 4 +-
config/locales/it.yml | 4 +-
config/locales/ja.yml | 4 +-
config/locales/ka.yml | 4 +-
config/locales/ko.yml | 4 +-
config/locales/lt.yml | 4 +-
config/locales/lv.yml | 4 +-
config/locales/ml.yml | 4 +-
config/locales/ms.yml | 4 +-
config/locales/ne.yml | 4 +-
config/locales/nl.yml | 4 +-
config/locales/no.yml | 4 +-
config/locales/pl.yml | 4 +-
config/locales/pt.yml | 4 +-
config/locales/pt_BR.yml | 4 +-
config/locales/ro.yml | 4 +-
config/locales/ru.yml | 4 +-
config/locales/sh.yml | 4 +-
config/locales/sk.yml | 4 +-
config/locales/sl.yml | 4 +-
config/locales/sq.yml | 4 +-
config/locales/sr.yml | 4 +-
config/locales/sv.yml | 4 +-
config/locales/ta.yml | 4 +-
config/locales/th.yml | 4 +-
config/locales/tl.yml | 4 +-
config/locales/tr.yml | 4 +-
config/locales/uk.yml | 4 +-
config/locales/ur.yml | 4 +-
config/locales/ur_IN.yml | 4 +-
config/locales/vi.yml | 4 +-
config/locales/zh_CN.yml | 4 +-
config/locales/zh_TW.yml | 4 +-
209 files changed, 6085 insertions(+), 157 deletions(-)
diff --git a/app/javascript/dashboard/i18n/locale/am/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/am/inboxMgmt.json
index 60038253c..87fe57564 100644
--- a/app/javascript/dashboard/i18n/locale/am/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/am/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/am/integrations.json b/app/javascript/dashboard/i18n/locale/am/integrations.json
index c59ec66df..6c1c9e484 100644
--- a/app/javascript/dashboard/i18n/locale/am/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/am/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Yes, delete",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Description",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "None",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API Key"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Password",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Type"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Number",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Required"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/am/settings.json b/app/javascript/dashboard/i18n/locale/am/settings.json
index 9ddc3b805..812b0cd8b 100644
--- a/app/javascript/dashboard/i18n/locale/am/settings.json
+++ b/app/javascript/dashboard/i18n/locale/am/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Home",
"AGENTS": "Agents",
"AGENT_BOTS": "Bots",
diff --git a/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json
index 1314ed561..61bfaa199 100644
--- a/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/ar/integrations.json b/app/javascript/dashboard/i18n/locale/ar/integrations.json
index ca7e7c553..f5cc4427b 100644
--- a/app/javascript/dashboard/i18n/locale/ar/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ar/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "نعم، احذف",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "الوصف",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "لا شيء",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "مفتاح API"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "كلمة المرور",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "النوع"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "العدد",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "مطلوب"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/ar/settings.json b/app/javascript/dashboard/i18n/locale/ar/settings.json
index 1a24cf67f..22b9cb254 100644
--- a/app/javascript/dashboard/i18n/locale/ar/settings.json
+++ b/app/javascript/dashboard/i18n/locale/ar/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "الرئيسية",
"AGENTS": "وكيل الدعم",
"AGENT_BOTS": "الروبوتات",
diff --git a/app/javascript/dashboard/i18n/locale/az/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/az/inboxMgmt.json
index 60038253c..87fe57564 100644
--- a/app/javascript/dashboard/i18n/locale/az/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/az/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/az/integrations.json b/app/javascript/dashboard/i18n/locale/az/integrations.json
index c59ec66df..6c1c9e484 100644
--- a/app/javascript/dashboard/i18n/locale/az/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/az/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Yes, delete",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Description",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "None",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API Key"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Password",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Type"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Number",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Required"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/az/settings.json b/app/javascript/dashboard/i18n/locale/az/settings.json
index 9ddc3b805..812b0cd8b 100644
--- a/app/javascript/dashboard/i18n/locale/az/settings.json
+++ b/app/javascript/dashboard/i18n/locale/az/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Home",
"AGENTS": "Agents",
"AGENT_BOTS": "Bots",
diff --git a/app/javascript/dashboard/i18n/locale/bg/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/bg/inboxMgmt.json
index e540e8c1e..46f61010e 100644
--- a/app/javascript/dashboard/i18n/locale/bg/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/bg/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/bg/integrations.json b/app/javascript/dashboard/i18n/locale/bg/integrations.json
index 0ebfc0fc8..1d9c9c370 100644
--- a/app/javascript/dashboard/i18n/locale/bg/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/bg/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Yes, delete",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Описание",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "None",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API Key"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Password",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Тип"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Number",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Required"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/bg/settings.json b/app/javascript/dashboard/i18n/locale/bg/settings.json
index 1b7fabeaf..7879190b6 100644
--- a/app/javascript/dashboard/i18n/locale/bg/settings.json
+++ b/app/javascript/dashboard/i18n/locale/bg/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Home",
"AGENTS": "Агенти",
"AGENT_BOTS": "Bots",
diff --git a/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json
index c8670b02d..30614f2dd 100644
--- a/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/ca/integrations.json b/app/javascript/dashboard/i18n/locale/ca/integrations.json
index 29d1d9546..e354ccc2e 100644
--- a/app/javascript/dashboard/i18n/locale/ca/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ca/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Sí, esborra",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Descripció",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "Ningú",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API Key"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Contrasenya",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Tipus"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Número",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Necessari"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/ca/settings.json b/app/javascript/dashboard/i18n/locale/ca/settings.json
index f843b0b6d..bf9ec5edc 100644
--- a/app/javascript/dashboard/i18n/locale/ca/settings.json
+++ b/app/javascript/dashboard/i18n/locale/ca/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Inici",
"AGENTS": "Agents",
"AGENT_BOTS": "Bots",
diff --git a/app/javascript/dashboard/i18n/locale/cs/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/cs/inboxMgmt.json
index 9bced9936..ac45d9edd 100644
--- a/app/javascript/dashboard/i18n/locale/cs/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/cs/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/cs/integrations.json b/app/javascript/dashboard/i18n/locale/cs/integrations.json
index 5480257cc..97744ae27 100644
--- a/app/javascript/dashboard/i18n/locale/cs/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/cs/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Yes, delete",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Description",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "Nic",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API Key"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Heslo",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Type"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Number",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Required"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/cs/settings.json b/app/javascript/dashboard/i18n/locale/cs/settings.json
index c0a307d56..616e16942 100644
--- a/app/javascript/dashboard/i18n/locale/cs/settings.json
+++ b/app/javascript/dashboard/i18n/locale/cs/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Domů",
"AGENTS": "Agenti",
"AGENT_BOTS": "Bots",
diff --git a/app/javascript/dashboard/i18n/locale/da/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/da/inboxMgmt.json
index 03345d326..5fc3eb6e9 100644
--- a/app/javascript/dashboard/i18n/locale/da/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/da/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/da/integrations.json b/app/javascript/dashboard/i18n/locale/da/integrations.json
index f0ee6e29f..4f5290ba6 100644
--- a/app/javascript/dashboard/i18n/locale/da/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/da/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Yes, delete",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Beskrivelse",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "Ingen",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API Nøgle"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Adgangskode",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Type"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Nummer",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Påkrævet"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/da/settings.json b/app/javascript/dashboard/i18n/locale/da/settings.json
index 3c312894d..b2db02ef5 100644
--- a/app/javascript/dashboard/i18n/locale/da/settings.json
+++ b/app/javascript/dashboard/i18n/locale/da/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Hjem",
"AGENTS": "Agenter",
"AGENT_BOTS": "Bots",
diff --git a/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json
index ad1134cb3..1b23f7613 100644
--- a/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/de/integrations.json b/app/javascript/dashboard/i18n/locale/de/integrations.json
index a8c115ea1..485ab7110 100644
--- a/app/javascript/dashboard/i18n/locale/de/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/de/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Ja, löschen",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Beschreibung",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "Keine",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API-Schlüssel"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Passwort",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Typ"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Nummer",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Benötigt"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/de/settings.json b/app/javascript/dashboard/i18n/locale/de/settings.json
index 5a97adb72..190880321 100644
--- a/app/javascript/dashboard/i18n/locale/de/settings.json
+++ b/app/javascript/dashboard/i18n/locale/de/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Hauptseite",
"AGENTS": "Agenten",
"AGENT_BOTS": "Bots",
diff --git a/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json
index 92b7e5c59..bc15d16ab 100644
--- a/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/el/integrations.json b/app/javascript/dashboard/i18n/locale/el/integrations.json
index f0e2bf220..a79ab4253 100644
--- a/app/javascript/dashboard/i18n/locale/el/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/el/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Yes, delete",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Περιγραφή",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "Κανένα",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "Κλειδί API"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Κωδικός",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Τύπος"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Αριθμός",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Υποχρεωτικό"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/el/settings.json b/app/javascript/dashboard/i18n/locale/el/settings.json
index a71c447f9..da4c4dec5 100644
--- a/app/javascript/dashboard/i18n/locale/el/settings.json
+++ b/app/javascript/dashboard/i18n/locale/el/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Αρχική",
"AGENTS": "Πράκτορες",
"AGENT_BOTS": "Bots",
diff --git a/app/javascript/dashboard/i18n/locale/es/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/es/inboxMgmt.json
index b1aac6d09..a6decf95f 100644
--- a/app/javascript/dashboard/i18n/locale/es/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/es/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/es/integrations.json b/app/javascript/dashboard/i18n/locale/es/integrations.json
index aa720521d..c81a18d41 100644
--- a/app/javascript/dashboard/i18n/locale/es/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/es/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Sí, eliminar",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Descripción",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "Ninguna",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "Clave de API"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Contraseña",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Tipo"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Número",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Requerido"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "Preguntas frecuentes",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/es/settings.json b/app/javascript/dashboard/i18n/locale/es/settings.json
index 35be4335c..37a1bfda4 100644
--- a/app/javascript/dashboard/i18n/locale/es/settings.json
+++ b/app/javascript/dashboard/i18n/locale/es/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Asistentes",
"CAPTAIN_DOCUMENTS": "Documentos",
"CAPTAIN_RESPONSES": "Preguntas frecuentes",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Inicio",
"AGENTS": "Agentes",
"AGENT_BOTS": "Bots",
diff --git a/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json
index 3a8e24b35..de1ebdb78 100644
--- a/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/fa/integrations.json b/app/javascript/dashboard/i18n/locale/fa/integrations.json
index e911eb7e3..18402ea9c 100644
--- a/app/javascript/dashboard/i18n/locale/fa/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/fa/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "بله، حذف شود",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "توضیحات",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "هیچکدام",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API key"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "رمز عبور",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "نوع"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "شماره",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "ضروری"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/fa/settings.json b/app/javascript/dashboard/i18n/locale/fa/settings.json
index 84c1c7455..ae309c5bc 100644
--- a/app/javascript/dashboard/i18n/locale/fa/settings.json
+++ b/app/javascript/dashboard/i18n/locale/fa/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "صفحه اصلی",
"AGENTS": "ایجنت ها",
"AGENT_BOTS": "رباتها",
diff --git a/app/javascript/dashboard/i18n/locale/fi/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/fi/inboxMgmt.json
index 8409f4bab..3d352511e 100644
--- a/app/javascript/dashboard/i18n/locale/fi/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/fi/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/fi/integrations.json b/app/javascript/dashboard/i18n/locale/fi/integrations.json
index c49e18379..270dcd525 100644
--- a/app/javascript/dashboard/i18n/locale/fi/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/fi/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Yes, delete",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Kuvaus",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "None",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API Key"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Salasana",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Type"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Number",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Required"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/fi/settings.json b/app/javascript/dashboard/i18n/locale/fi/settings.json
index f5755c52a..3fbcfe345 100644
--- a/app/javascript/dashboard/i18n/locale/fi/settings.json
+++ b/app/javascript/dashboard/i18n/locale/fi/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Koti",
"AGENTS": "Edustajat",
"AGENT_BOTS": "Bots",
diff --git a/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json
index 583de65a9..f974e2cd6 100644
--- a/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/fr/integrations.json b/app/javascript/dashboard/i18n/locale/fr/integrations.json
index 379f91eb9..3ee092519 100644
--- a/app/javascript/dashboard/i18n/locale/fr/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/fr/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Outils",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Oui, supprimer",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Description",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "Aucun",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "Clé de l'API"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Mot de passe",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Type"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Nombre",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Obligatoire"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/fr/settings.json b/app/javascript/dashboard/i18n/locale/fr/settings.json
index a951d668b..f04045ea6 100644
--- a/app/javascript/dashboard/i18n/locale/fr/settings.json
+++ b/app/javascript/dashboard/i18n/locale/fr/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Outils",
"HOME": "Accueil",
"AGENTS": "Agents",
"AGENT_BOTS": "Bots",
diff --git a/app/javascript/dashboard/i18n/locale/he/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/he/inboxMgmt.json
index 7bb57e2e7..32c03ad13 100644
--- a/app/javascript/dashboard/i18n/locale/he/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/he/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/he/integrations.json b/app/javascript/dashboard/i18n/locale/he/integrations.json
index a1b30db1a..37ca8a139 100644
--- a/app/javascript/dashboard/i18n/locale/he/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/he/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Yes, delete",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "תיאור",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "כלום",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "מפתח API"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "סיסמה",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "סוג"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "מספר",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "נדרש"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/he/settings.json b/app/javascript/dashboard/i18n/locale/he/settings.json
index bc4a2ec7c..1601016eb 100644
--- a/app/javascript/dashboard/i18n/locale/he/settings.json
+++ b/app/javascript/dashboard/i18n/locale/he/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "בית",
"AGENTS": "סוכנים",
"AGENT_BOTS": "בוטים",
diff --git a/app/javascript/dashboard/i18n/locale/hi/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/hi/inboxMgmt.json
index 00a9c78f0..e85b262c0 100644
--- a/app/javascript/dashboard/i18n/locale/hi/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/hi/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/hi/integrations.json b/app/javascript/dashboard/i18n/locale/hi/integrations.json
index f2d79d5d7..97fffa5c8 100644
--- a/app/javascript/dashboard/i18n/locale/hi/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/hi/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Yes, delete",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Description",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "None",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API Key"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Password",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Type"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Number",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Required"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/hi/settings.json b/app/javascript/dashboard/i18n/locale/hi/settings.json
index 52f28443b..256f77c04 100644
--- a/app/javascript/dashboard/i18n/locale/hi/settings.json
+++ b/app/javascript/dashboard/i18n/locale/hi/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Home",
"AGENTS": "Agents",
"AGENT_BOTS": "Bots",
diff --git a/app/javascript/dashboard/i18n/locale/hr/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/hr/inboxMgmt.json
index 2b64f5d43..f2bb07484 100644
--- a/app/javascript/dashboard/i18n/locale/hr/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/hr/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/hr/integrations.json b/app/javascript/dashboard/i18n/locale/hr/integrations.json
index d73281dbb..8976cbb2a 100644
--- a/app/javascript/dashboard/i18n/locale/hr/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/hr/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Da, izbriši",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Description",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "None",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API Key"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Password",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Type"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Broj",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Required"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/hr/settings.json b/app/javascript/dashboard/i18n/locale/hr/settings.json
index 4c9d58c66..51e35e25b 100644
--- a/app/javascript/dashboard/i18n/locale/hr/settings.json
+++ b/app/javascript/dashboard/i18n/locale/hr/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Home",
"AGENTS": "Agenti",
"AGENT_BOTS": "Botovi",
diff --git a/app/javascript/dashboard/i18n/locale/hu/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/hu/inboxMgmt.json
index 3f585db3e..7d719877d 100644
--- a/app/javascript/dashboard/i18n/locale/hu/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/hu/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/hu/integrations.json b/app/javascript/dashboard/i18n/locale/hu/integrations.json
index 544358514..2112ef0c8 100644
--- a/app/javascript/dashboard/i18n/locale/hu/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/hu/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Igen, törlés",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Leírás",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "Nincs",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API kulcs"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Jelszó",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Típus"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Szám",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Kötelező"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/hu/settings.json b/app/javascript/dashboard/i18n/locale/hu/settings.json
index 1788fbdcd..0bda60edd 100644
--- a/app/javascript/dashboard/i18n/locale/hu/settings.json
+++ b/app/javascript/dashboard/i18n/locale/hu/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Nyitólap",
"AGENTS": "Ügynökök",
"AGENT_BOTS": "Botok",
diff --git a/app/javascript/dashboard/i18n/locale/hy/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/hy/inboxMgmt.json
index e8cf88458..1f9aeae27 100644
--- a/app/javascript/dashboard/i18n/locale/hy/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/hy/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/hy/integrations.json b/app/javascript/dashboard/i18n/locale/hy/integrations.json
index 03898d278..081ddbde8 100644
--- a/app/javascript/dashboard/i18n/locale/hy/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/hy/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Yes, delete",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Description",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "None",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API Key"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Password",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Type"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Number",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Required"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/hy/settings.json b/app/javascript/dashboard/i18n/locale/hy/settings.json
index 9ddc3b805..812b0cd8b 100644
--- a/app/javascript/dashboard/i18n/locale/hy/settings.json
+++ b/app/javascript/dashboard/i18n/locale/hy/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Home",
"AGENTS": "Agents",
"AGENT_BOTS": "Bots",
diff --git a/app/javascript/dashboard/i18n/locale/id/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/id/inboxMgmt.json
index 5409c4bb7..9ddc88efe 100644
--- a/app/javascript/dashboard/i18n/locale/id/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/id/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/id/integrations.json b/app/javascript/dashboard/i18n/locale/id/integrations.json
index 9dd89b13b..4da713720 100644
--- a/app/javascript/dashboard/i18n/locale/id/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/id/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Ya, hapus",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Deskripsi",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "Tidak ada",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API Key"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Kata Sandi",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Tipe"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Nomor",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Diperlukan"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/id/settings.json b/app/javascript/dashboard/i18n/locale/id/settings.json
index 863f7e562..75324f02f 100644
--- a/app/javascript/dashboard/i18n/locale/id/settings.json
+++ b/app/javascript/dashboard/i18n/locale/id/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Beranda",
"AGENTS": "Agen",
"AGENT_BOTS": "Bot Agen",
diff --git a/app/javascript/dashboard/i18n/locale/is/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/is/inboxMgmt.json
index e78d89c1a..5db8fe769 100644
--- a/app/javascript/dashboard/i18n/locale/is/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/is/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/is/integrations.json b/app/javascript/dashboard/i18n/locale/is/integrations.json
index 53a81dc2f..e8193f541 100644
--- a/app/javascript/dashboard/i18n/locale/is/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/is/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Yes, delete",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Description",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "Enginn",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API Lykill"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Lykilorð",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Type"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Number",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Nauðsynlegt"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/is/settings.json b/app/javascript/dashboard/i18n/locale/is/settings.json
index 776cbf10a..076f19542 100644
--- a/app/javascript/dashboard/i18n/locale/is/settings.json
+++ b/app/javascript/dashboard/i18n/locale/is/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Home",
"AGENTS": "Þjónustufulltrúar",
"AGENT_BOTS": "Bots",
diff --git a/app/javascript/dashboard/i18n/locale/it/general.json b/app/javascript/dashboard/i18n/locale/it/general.json
index aca059969..3c3d2f0fa 100644
--- a/app/javascript/dashboard/i18n/locale/it/general.json
+++ b/app/javascript/dashboard/i18n/locale/it/general.json
@@ -7,6 +7,6 @@
},
"CLOSE": "Chiudi",
"BETA": "Beta",
- "BETA_DESCRIPTION": "This feature is in beta and may change as we improve it."
+ "BETA_DESCRIPTION": "Questa funzione è in beta e può cambiare mentre la miglioriamo."
}
}
diff --git a/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json
index b4ba15a0d..0443b482a 100644
--- a/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/it/integrations.json b/app/javascript/dashboard/i18n/locale/it/integrations.json
index 7b6dee7f7..390923320 100644
--- a/app/javascript/dashboard/i18n/locale/it/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/it/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Yes, delete",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Descrizione",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "Nessuno",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "Chiave API"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Password",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Tipo"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Numero",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Obbligatorio"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/it/settings.json b/app/javascript/dashboard/i18n/locale/it/settings.json
index 7dc7d5d01..8a014ceae 100644
--- a/app/javascript/dashboard/i18n/locale/it/settings.json
+++ b/app/javascript/dashboard/i18n/locale/it/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Home",
"AGENTS": "Agenti",
"AGENT_BOTS": "Bots",
diff --git a/app/javascript/dashboard/i18n/locale/ja/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ja/inboxMgmt.json
index 99953d1cc..25c9b494b 100644
--- a/app/javascript/dashboard/i18n/locale/ja/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ja/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "承認済み",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/ja/integrations.json b/app/javascript/dashboard/i18n/locale/ja/integrations.json
index 978ab5172..e287b8bb9 100644
--- a/app/javascript/dashboard/i18n/locale/ja/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ja/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "はい、削除します",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "説明",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "なし",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "APIキー"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "パスワード",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "タイプ"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "数値",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "必須"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQ",
"ADD_NEW": "新しいFAQを作成",
diff --git a/app/javascript/dashboard/i18n/locale/ja/settings.json b/app/javascript/dashboard/i18n/locale/ja/settings.json
index 7020d5f38..297fb854a 100644
--- a/app/javascript/dashboard/i18n/locale/ja/settings.json
+++ b/app/javascript/dashboard/i18n/locale/ja/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "アシスタント",
"CAPTAIN_DOCUMENTS": "ドキュメント",
"CAPTAIN_RESPONSES": "FAQ",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "ホーム",
"AGENTS": "担当者",
"AGENT_BOTS": "ボット",
diff --git a/app/javascript/dashboard/i18n/locale/ka/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ka/inboxMgmt.json
index 00a9c78f0..e85b262c0 100644
--- a/app/javascript/dashboard/i18n/locale/ka/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ka/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/ka/integrations.json b/app/javascript/dashboard/i18n/locale/ka/integrations.json
index 03898d278..081ddbde8 100644
--- a/app/javascript/dashboard/i18n/locale/ka/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ka/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Yes, delete",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Description",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "None",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API Key"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Password",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Type"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Number",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Required"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/ka/settings.json b/app/javascript/dashboard/i18n/locale/ka/settings.json
index 52f28443b..256f77c04 100644
--- a/app/javascript/dashboard/i18n/locale/ka/settings.json
+++ b/app/javascript/dashboard/i18n/locale/ka/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Home",
"AGENTS": "Agents",
"AGENT_BOTS": "Bots",
diff --git a/app/javascript/dashboard/i18n/locale/ko/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ko/inboxMgmt.json
index 1e21c4d18..f459867e6 100644
--- a/app/javascript/dashboard/i18n/locale/ko/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ko/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/ko/integrations.json b/app/javascript/dashboard/i18n/locale/ko/integrations.json
index 929cecfc0..bb4e23b89 100644
--- a/app/javascript/dashboard/i18n/locale/ko/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ko/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Yes, delete",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "내용",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "없음",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API Key"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "비밀번호",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Type"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "숫자",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Required"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/ko/settings.json b/app/javascript/dashboard/i18n/locale/ko/settings.json
index c24c08f1b..4e4af2242 100644
--- a/app/javascript/dashboard/i18n/locale/ko/settings.json
+++ b/app/javascript/dashboard/i18n/locale/ko/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "홈",
"AGENTS": "에이전트",
"AGENT_BOTS": "봇",
diff --git a/app/javascript/dashboard/i18n/locale/lt/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/lt/inboxMgmt.json
index 20e34fa24..6331e3e72 100644
--- a/app/javascript/dashboard/i18n/locale/lt/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/lt/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/lt/integrations.json b/app/javascript/dashboard/i18n/locale/lt/integrations.json
index c655e1868..d1ee89a6f 100644
--- a/app/javascript/dashboard/i18n/locale/lt/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/lt/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Taip, Trinti",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Aprašymas",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "Nėra",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API raktas"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Slaptažodis",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Tipas"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Numeris",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Reikalingas"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/lt/settings.json b/app/javascript/dashboard/i18n/locale/lt/settings.json
index 53fd20b6d..7b0b24e1c 100644
--- a/app/javascript/dashboard/i18n/locale/lt/settings.json
+++ b/app/javascript/dashboard/i18n/locale/lt/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Pagrindinis",
"AGENTS": "Agentai",
"AGENT_BOTS": "Botai",
diff --git a/app/javascript/dashboard/i18n/locale/lv/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/lv/inboxMgmt.json
index 888760213..365c91af1 100644
--- a/app/javascript/dashboard/i18n/locale/lv/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/lv/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Apstiprināts",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/lv/integrations.json b/app/javascript/dashboard/i18n/locale/lv/integrations.json
index a6d4764ee..35df60e06 100644
--- a/app/javascript/dashboard/i18n/locale/lv/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/lv/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Jā, dzēst",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Apraksts",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "Nav",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API atslēga"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Parole",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Tips"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Numurs",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Nepieciešams"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "Bieži uzdotie jautājumi",
"ADD_NEW": "Izveidot jaunu sarakstu ar bieži uzdotiem jautājumiem",
diff --git a/app/javascript/dashboard/i18n/locale/lv/settings.json b/app/javascript/dashboard/i18n/locale/lv/settings.json
index 94c2307e9..663754aec 100644
--- a/app/javascript/dashboard/i18n/locale/lv/settings.json
+++ b/app/javascript/dashboard/i18n/locale/lv/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Asistenti",
"CAPTAIN_DOCUMENTS": "Dokumenti",
"CAPTAIN_RESPONSES": "Bieži uzdotie jautājumi",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Sākums",
"AGENTS": "Aģenti",
"AGENT_BOTS": "Bots",
diff --git a/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json
index b957d22c7..5543d4cf2 100644
--- a/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/ml/integrations.json b/app/javascript/dashboard/i18n/locale/ml/integrations.json
index b9011e415..e09e2008d 100644
--- a/app/javascript/dashboard/i18n/locale/ml/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ml/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Yes, delete",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "വിവരണം",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "None",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API Key"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "പാസ്വേഡ്",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Type"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Number",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Required"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/ml/settings.json b/app/javascript/dashboard/i18n/locale/ml/settings.json
index f698f0dd7..4fa67d25e 100644
--- a/app/javascript/dashboard/i18n/locale/ml/settings.json
+++ b/app/javascript/dashboard/i18n/locale/ml/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "ഹോം",
"AGENTS": "ഏജന്റുമാർ",
"AGENT_BOTS": "Bots",
diff --git a/app/javascript/dashboard/i18n/locale/ms/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ms/inboxMgmt.json
index 389123146..b63a7df5c 100644
--- a/app/javascript/dashboard/i18n/locale/ms/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ms/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/ms/integrations.json b/app/javascript/dashboard/i18n/locale/ms/integrations.json
index 572e58b04..bc6839c3c 100644
--- a/app/javascript/dashboard/i18n/locale/ms/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ms/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Yes, delete",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Description",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "None",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API Key"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Password",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Type"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Nombor",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Required"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/ms/settings.json b/app/javascript/dashboard/i18n/locale/ms/settings.json
index 36df89c78..57032fa82 100644
--- a/app/javascript/dashboard/i18n/locale/ms/settings.json
+++ b/app/javascript/dashboard/i18n/locale/ms/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Home",
"AGENTS": "Ejen",
"AGENT_BOTS": "Bots",
diff --git a/app/javascript/dashboard/i18n/locale/ne/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ne/inboxMgmt.json
index d9fc7e643..21a0d4986 100644
--- a/app/javascript/dashboard/i18n/locale/ne/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ne/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/ne/integrations.json b/app/javascript/dashboard/i18n/locale/ne/integrations.json
index cfdd76b7c..9bdcfa2b2 100644
--- a/app/javascript/dashboard/i18n/locale/ne/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ne/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Yes, delete",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Description",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "None",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API Key"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Password",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Type"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Number",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Required"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/ne/settings.json b/app/javascript/dashboard/i18n/locale/ne/settings.json
index 5779c540b..28cc081e0 100644
--- a/app/javascript/dashboard/i18n/locale/ne/settings.json
+++ b/app/javascript/dashboard/i18n/locale/ne/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Home",
"AGENTS": "Agents",
"AGENT_BOTS": "Bots",
diff --git a/app/javascript/dashboard/i18n/locale/nl/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/nl/inboxMgmt.json
index 24f4701bd..d333bac2d 100644
--- a/app/javascript/dashboard/i18n/locale/nl/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/nl/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/nl/integrations.json b/app/javascript/dashboard/i18n/locale/nl/integrations.json
index 73fe8761c..d75ac2e3a 100644
--- a/app/javascript/dashboard/i18n/locale/nl/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/nl/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Ja, verwijderen",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Beschrijving",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "Geen",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API sleutel"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Wachtwoord",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Type"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Getal",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Required"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/nl/settings.json b/app/javascript/dashboard/i18n/locale/nl/settings.json
index 0b2d4ac90..e75351d6d 100644
--- a/app/javascript/dashboard/i18n/locale/nl/settings.json
+++ b/app/javascript/dashboard/i18n/locale/nl/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Startpagina",
"AGENTS": "Medewerkers",
"AGENT_BOTS": "Bots",
diff --git a/app/javascript/dashboard/i18n/locale/no/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/no/inboxMgmt.json
index beca8fb5a..f8f0bb64f 100644
--- a/app/javascript/dashboard/i18n/locale/no/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/no/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/no/integrations.json b/app/javascript/dashboard/i18n/locale/no/integrations.json
index 62e54852c..80eb47d35 100644
--- a/app/javascript/dashboard/i18n/locale/no/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/no/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Yes, delete",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Beskrivelse",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "None",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API Key"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Passord",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Type"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Number",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Required"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/no/settings.json b/app/javascript/dashboard/i18n/locale/no/settings.json
index f4e7d03dd..7ed01e244 100644
--- a/app/javascript/dashboard/i18n/locale/no/settings.json
+++ b/app/javascript/dashboard/i18n/locale/no/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Hjem",
"AGENTS": "Agenter",
"AGENT_BOTS": "Bots",
diff --git a/app/javascript/dashboard/i18n/locale/pl/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/pl/inboxMgmt.json
index 7ee2d9779..e848df371 100644
--- a/app/javascript/dashboard/i18n/locale/pl/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/pl/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/pl/integrations.json b/app/javascript/dashboard/i18n/locale/pl/integrations.json
index b3f26646a..eab58299c 100644
--- a/app/javascript/dashboard/i18n/locale/pl/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/pl/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Tak, usuń",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Opis",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "Brak",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "Klucz API"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Hasło",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Typ"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Numer",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Wymagane"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/pl/settings.json b/app/javascript/dashboard/i18n/locale/pl/settings.json
index 5fecc7f77..0314c4375 100644
--- a/app/javascript/dashboard/i18n/locale/pl/settings.json
+++ b/app/javascript/dashboard/i18n/locale/pl/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Strona główna",
"AGENTS": "Agenci",
"AGENT_BOTS": "Boty",
diff --git a/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json
index 3c0bbf337..d6032baa3 100644
--- a/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/pt/integrations.json b/app/javascript/dashboard/i18n/locale/pt/integrations.json
index 785036a76..992991440 100644
--- a/app/javascript/dashboard/i18n/locale/pt/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/pt/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Ferramentas",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Sim, excluir",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Descrição",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "Nenhuma",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "Chave da API"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Palavra-passe",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Tipo"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Número",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Obrigatório"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/pt/settings.json b/app/javascript/dashboard/i18n/locale/pt/settings.json
index 72b46a67a..8e71ed9a2 100644
--- a/app/javascript/dashboard/i18n/locale/pt/settings.json
+++ b/app/javascript/dashboard/i18n/locale/pt/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Ferramentas",
"HOME": "Principal",
"AGENTS": "Agentes",
"AGENT_BOTS": "Bots",
diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json
index 5212f63d4..13153cedf 100644
--- a/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Aceito",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/integrations.json b/app/javascript/dashboard/i18n/locale/pt_BR/integrations.json
index 63a4bc0a3..fba12cd5f 100644
--- a/app/javascript/dashboard/i18n/locale/pt_BR/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/pt_BR/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Ferramentas",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Sim, excluir",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Descrição",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "Nenhuma",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "Chave API"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Senha",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Tipo"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Número",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Obrigatório"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Criar nova FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/settings.json b/app/javascript/dashboard/i18n/locale/pt_BR/settings.json
index 7f5944967..8c4f3050c 100644
--- a/app/javascript/dashboard/i18n/locale/pt_BR/settings.json
+++ b/app/javascript/dashboard/i18n/locale/pt_BR/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistentes",
"CAPTAIN_DOCUMENTS": "Documentos",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Ferramentas",
"HOME": "Principal",
"AGENTS": "Agentes",
"AGENT_BOTS": "Robôs",
diff --git a/app/javascript/dashboard/i18n/locale/ro/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ro/inboxMgmt.json
index 049398332..343024e17 100644
--- a/app/javascript/dashboard/i18n/locale/ro/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ro/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/ro/integrations.json b/app/javascript/dashboard/i18n/locale/ro/integrations.json
index 9d192cd77..bd460905d 100644
--- a/app/javascript/dashboard/i18n/locale/ro/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ro/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Yes, delete",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Descriere",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "Nimic",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "Cheie API"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Parola",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Tip"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Număr",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Necesar"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/ro/settings.json b/app/javascript/dashboard/i18n/locale/ro/settings.json
index 2ae1524e6..def3181f6 100644
--- a/app/javascript/dashboard/i18n/locale/ro/settings.json
+++ b/app/javascript/dashboard/i18n/locale/ro/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Acasa",
"AGENTS": "Agenți",
"AGENT_BOTS": "Boți",
diff --git a/app/javascript/dashboard/i18n/locale/ru/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ru/inboxMgmt.json
index 3b0a8802b..2033217a8 100644
--- a/app/javascript/dashboard/i18n/locale/ru/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ru/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Одобрено",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/ru/integrations.json b/app/javascript/dashboard/i18n/locale/ru/integrations.json
index 929c76186..3ff5e6d4e 100644
--- a/app/javascript/dashboard/i18n/locale/ru/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ru/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Да, удалить",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Описание",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "Ничего",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "Ключ API"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Пароль",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Тип"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Число",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Обязательно"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQ",
"ADD_NEW": "Создать новый FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/ru/settings.json b/app/javascript/dashboard/i18n/locale/ru/settings.json
index 788f86940..8651142e8 100644
--- a/app/javascript/dashboard/i18n/locale/ru/settings.json
+++ b/app/javascript/dashboard/i18n/locale/ru/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Ассистенты",
"CAPTAIN_DOCUMENTS": "Документы",
"CAPTAIN_RESPONSES": "FAQ",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Главная",
"AGENTS": "Операторы",
"AGENT_BOTS": "Боты",
diff --git a/app/javascript/dashboard/i18n/locale/sh/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/sh/inboxMgmt.json
index 77024f23c..29c36f7be 100644
--- a/app/javascript/dashboard/i18n/locale/sh/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/sh/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/sh/integrations.json b/app/javascript/dashboard/i18n/locale/sh/integrations.json
index 03898d278..081ddbde8 100644
--- a/app/javascript/dashboard/i18n/locale/sh/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/sh/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Yes, delete",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Description",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "None",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API Key"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Password",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Type"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Number",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Required"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/sh/settings.json b/app/javascript/dashboard/i18n/locale/sh/settings.json
index 9ddc3b805..812b0cd8b 100644
--- a/app/javascript/dashboard/i18n/locale/sh/settings.json
+++ b/app/javascript/dashboard/i18n/locale/sh/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Home",
"AGENTS": "Agents",
"AGENT_BOTS": "Bots",
diff --git a/app/javascript/dashboard/i18n/locale/sk/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/sk/inboxMgmt.json
index fa3214620..9b4950a7e 100644
--- a/app/javascript/dashboard/i18n/locale/sk/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/sk/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/sk/integrations.json b/app/javascript/dashboard/i18n/locale/sk/integrations.json
index 1bf86ffe2..efb87fb1b 100644
--- a/app/javascript/dashboard/i18n/locale/sk/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/sk/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Yes, delete",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Description",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "Žiadne",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API kľúč"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Password",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Type"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Number",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Povinné"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/sk/settings.json b/app/javascript/dashboard/i18n/locale/sk/settings.json
index 44457e288..719146e9e 100644
--- a/app/javascript/dashboard/i18n/locale/sk/settings.json
+++ b/app/javascript/dashboard/i18n/locale/sk/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Home",
"AGENTS": "Agenti",
"AGENT_BOTS": "Bots",
diff --git a/app/javascript/dashboard/i18n/locale/sl/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/sl/inboxMgmt.json
index 69290a1a2..9871ec605 100644
--- a/app/javascript/dashboard/i18n/locale/sl/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/sl/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/sl/integrations.json b/app/javascript/dashboard/i18n/locale/sl/integrations.json
index e4216f051..660e1cf2c 100644
--- a/app/javascript/dashboard/i18n/locale/sl/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/sl/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Da, izbriši",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Description",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "None",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API Key"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Geslo",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Type"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Številka",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Required"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/sl/settings.json b/app/javascript/dashboard/i18n/locale/sl/settings.json
index f137e56c9..b5df89409 100644
--- a/app/javascript/dashboard/i18n/locale/sl/settings.json
+++ b/app/javascript/dashboard/i18n/locale/sl/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Home",
"AGENTS": "Agents",
"AGENT_BOTS": "Boti",
diff --git a/app/javascript/dashboard/i18n/locale/sq/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/sq/inboxMgmt.json
index 0cf3267ff..f79a29e5b 100644
--- a/app/javascript/dashboard/i18n/locale/sq/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/sq/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/sq/integrations.json b/app/javascript/dashboard/i18n/locale/sq/integrations.json
index a4c2bb121..7e94c3097 100644
--- a/app/javascript/dashboard/i18n/locale/sq/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/sq/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Yes, delete",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Description",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "None",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API Key"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Password",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Type"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Number",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Required"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/sq/settings.json b/app/javascript/dashboard/i18n/locale/sq/settings.json
index dda91af84..a05b4a5d8 100644
--- a/app/javascript/dashboard/i18n/locale/sq/settings.json
+++ b/app/javascript/dashboard/i18n/locale/sq/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Home",
"AGENTS": "Agents",
"AGENT_BOTS": "Bots",
diff --git a/app/javascript/dashboard/i18n/locale/sr/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/sr/inboxMgmt.json
index a4fece97a..c8a2c6f55 100644
--- a/app/javascript/dashboard/i18n/locale/sr/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/sr/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/sr/integrations.json b/app/javascript/dashboard/i18n/locale/sr/integrations.json
index 97bbdcb69..ab939f0d1 100644
--- a/app/javascript/dashboard/i18n/locale/sr/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/sr/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Yes, delete",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Opis",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "Niko",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API ključ"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Lozinka",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Tip"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Broj",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Obavezno"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/sr/settings.json b/app/javascript/dashboard/i18n/locale/sr/settings.json
index 070361cd9..2bcf552c1 100644
--- a/app/javascript/dashboard/i18n/locale/sr/settings.json
+++ b/app/javascript/dashboard/i18n/locale/sr/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Početak",
"AGENTS": "Agenti",
"AGENT_BOTS": "Bots",
diff --git a/app/javascript/dashboard/i18n/locale/sv/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/sv/inboxMgmt.json
index cfa768b2d..9ef4bb21c 100644
--- a/app/javascript/dashboard/i18n/locale/sv/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/sv/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/sv/integrations.json b/app/javascript/dashboard/i18n/locale/sv/integrations.json
index c9eef1a7f..a77873a93 100644
--- a/app/javascript/dashboard/i18n/locale/sv/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/sv/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Yes, delete",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Beskrivning",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "None",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API Key"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Lösenord",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Type"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Number",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Required"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/sv/settings.json b/app/javascript/dashboard/i18n/locale/sv/settings.json
index 1041ef3d9..f545647b2 100644
--- a/app/javascript/dashboard/i18n/locale/sv/settings.json
+++ b/app/javascript/dashboard/i18n/locale/sv/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Hem",
"AGENTS": "Agenter",
"AGENT_BOTS": "Bots",
diff --git a/app/javascript/dashboard/i18n/locale/ta/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ta/inboxMgmt.json
index 32f0db539..93713c076 100644
--- a/app/javascript/dashboard/i18n/locale/ta/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ta/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/ta/integrations.json b/app/javascript/dashboard/i18n/locale/ta/integrations.json
index ada1a1f10..8f4a50584 100644
--- a/app/javascript/dashboard/i18n/locale/ta/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ta/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Yes, delete",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Description",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "None",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API Key"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "பாஸ்வேர்ட்",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Type"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Number",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Required"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/ta/settings.json b/app/javascript/dashboard/i18n/locale/ta/settings.json
index 9f3df3486..8881d2028 100644
--- a/app/javascript/dashboard/i18n/locale/ta/settings.json
+++ b/app/javascript/dashboard/i18n/locale/ta/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "முகப்பு",
"AGENTS": "ஏஜென்ட்கள்",
"AGENT_BOTS": "Bots",
diff --git a/app/javascript/dashboard/i18n/locale/th/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/th/inboxMgmt.json
index 3ed841223..b158f3d9d 100644
--- a/app/javascript/dashboard/i18n/locale/th/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/th/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/th/integrations.json b/app/javascript/dashboard/i18n/locale/th/integrations.json
index 295e55571..5fc74f233 100644
--- a/app/javascript/dashboard/i18n/locale/th/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/th/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Yes, delete",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "คำอธิบาย",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "ไม่มี",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API Key"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "หรัสผ่าน",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "ประเภท"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "ตัวเลข",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "โปรดระบุ"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/th/settings.json b/app/javascript/dashboard/i18n/locale/th/settings.json
index 49cb4e087..065d9fcb2 100644
--- a/app/javascript/dashboard/i18n/locale/th/settings.json
+++ b/app/javascript/dashboard/i18n/locale/th/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "หน้าหลัก",
"AGENTS": "พนักงาน",
"AGENT_BOTS": "บอท",
diff --git a/app/javascript/dashboard/i18n/locale/tl/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/tl/inboxMgmt.json
index 60038253c..87fe57564 100644
--- a/app/javascript/dashboard/i18n/locale/tl/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/tl/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/tl/integrations.json b/app/javascript/dashboard/i18n/locale/tl/integrations.json
index c59ec66df..6c1c9e484 100644
--- a/app/javascript/dashboard/i18n/locale/tl/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/tl/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Yes, delete",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Description",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "None",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API Key"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Password",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Type"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Number",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Required"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/tl/settings.json b/app/javascript/dashboard/i18n/locale/tl/settings.json
index 9ddc3b805..812b0cd8b 100644
--- a/app/javascript/dashboard/i18n/locale/tl/settings.json
+++ b/app/javascript/dashboard/i18n/locale/tl/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Home",
"AGENTS": "Agents",
"AGENT_BOTS": "Bots",
diff --git a/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json
index cb131e8fc..e8c39e733 100644
--- a/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Değerlendirme mevcut değil"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Mevcut değil"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/tr/integrations.json b/app/javascript/dashboard/i18n/locale/tr/integrations.json
index c214105c6..74c9fd61e 100644
--- a/app/javascript/dashboard/i18n/locale/tr/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/tr/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Araçlar",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Evet, sil",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Açıklama",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "Hiç",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API Anahtarı"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Parola",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Tip"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Sayı",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Zorunlu"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/tr/settings.json b/app/javascript/dashboard/i18n/locale/tr/settings.json
index 22cc50c9c..120acd2f4 100644
--- a/app/javascript/dashboard/i18n/locale/tr/settings.json
+++ b/app/javascript/dashboard/i18n/locale/tr/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Araçlar",
"HOME": "Anasayfa",
"AGENTS": "Kullanıcılar",
"AGENT_BOTS": "Botlar",
diff --git a/app/javascript/dashboard/i18n/locale/uk/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/uk/inboxMgmt.json
index b3b2108b0..7b63997e5 100644
--- a/app/javascript/dashboard/i18n/locale/uk/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/uk/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/uk/integrations.json b/app/javascript/dashboard/i18n/locale/uk/integrations.json
index 52d74e197..d08bbf1c7 100644
--- a/app/javascript/dashboard/i18n/locale/uk/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/uk/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Так, видалити",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Опис",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "Нiчого",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API ключ"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Пароль",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Тип"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Номер",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Обов'язково"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/uk/settings.json b/app/javascript/dashboard/i18n/locale/uk/settings.json
index d973668e9..6d480d63b 100644
--- a/app/javascript/dashboard/i18n/locale/uk/settings.json
+++ b/app/javascript/dashboard/i18n/locale/uk/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Головна",
"AGENTS": "Агенти",
"AGENT_BOTS": "Боти",
diff --git a/app/javascript/dashboard/i18n/locale/ur/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ur/inboxMgmt.json
index 7c36d716f..fabfa956f 100644
--- a/app/javascript/dashboard/i18n/locale/ur/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ur/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/ur/integrations.json b/app/javascript/dashboard/i18n/locale/ur/integrations.json
index 5b33237af..4bae35b73 100644
--- a/app/javascript/dashboard/i18n/locale/ur/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ur/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Yes, delete",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Description",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "None",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API Key"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Password",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Type"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Number",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Required"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/ur/settings.json b/app/javascript/dashboard/i18n/locale/ur/settings.json
index a91b5c96e..dda7ab163 100644
--- a/app/javascript/dashboard/i18n/locale/ur/settings.json
+++ b/app/javascript/dashboard/i18n/locale/ur/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Home",
"AGENTS": "ایجنٹ",
"AGENT_BOTS": "Bots",
diff --git a/app/javascript/dashboard/i18n/locale/ur_IN/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ur_IN/inboxMgmt.json
index 757ba2ca8..b683eacff 100644
--- a/app/javascript/dashboard/i18n/locale/ur_IN/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ur_IN/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/ur_IN/integrations.json b/app/javascript/dashboard/i18n/locale/ur_IN/integrations.json
index 03898d278..081ddbde8 100644
--- a/app/javascript/dashboard/i18n/locale/ur_IN/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/ur_IN/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Yes, delete",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Description",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "None",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API Key"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Password",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Type"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Number",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Required"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/ur_IN/settings.json b/app/javascript/dashboard/i18n/locale/ur_IN/settings.json
index 52f28443b..256f77c04 100644
--- a/app/javascript/dashboard/i18n/locale/ur_IN/settings.json
+++ b/app/javascript/dashboard/i18n/locale/ur_IN/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Home",
"AGENTS": "Agents",
"AGENT_BOTS": "Bots",
diff --git a/app/javascript/dashboard/i18n/locale/vi/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/vi/inboxMgmt.json
index 81bc1b8eb..8c56eccf7 100644
--- a/app/javascript/dashboard/i18n/locale/vi/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/vi/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/vi/integrations.json b/app/javascript/dashboard/i18n/locale/vi/integrations.json
index 4968ebfc6..6d8fee8ae 100644
--- a/app/javascript/dashboard/i18n/locale/vi/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/vi/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "Có, xoá",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "Mô tả",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "Không có",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "Khoá API"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "Mật khẩu",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "Kiểu"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "Số",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Bắt buộc"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/vi/settings.json b/app/javascript/dashboard/i18n/locale/vi/settings.json
index 6196b02bf..1f5c43834 100644
--- a/app/javascript/dashboard/i18n/locale/vi/settings.json
+++ b/app/javascript/dashboard/i18n/locale/vi/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "Trang Chủ",
"AGENTS": "Đại lý",
"AGENT_BOTS": "Bots",
diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/zh_CN/inboxMgmt.json
index 93e79d04d..009ac5eff 100644
--- a/app/javascript/dashboard/i18n/locale/zh_CN/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/zh_CN/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "已批准",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/integrations.json b/app/javascript/dashboard/i18n/locale/zh_CN/integrations.json
index 6558e5a4b..fdc96f2ba 100644
--- a/app/javascript/dashboard/i18n/locale/zh_CN/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/zh_CN/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "工具",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "是的,删除",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "描述信息",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "啥都没有",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API 密钥"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "密码",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "类型"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "号码",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "必填项"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "常见问题",
"ADD_NEW": "创建新常见问题",
diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/settings.json b/app/javascript/dashboard/i18n/locale/zh_CN/settings.json
index 25c7e3f0d..478816f53 100644
--- a/app/javascript/dashboard/i18n/locale/zh_CN/settings.json
+++ b/app/javascript/dashboard/i18n/locale/zh_CN/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "助手",
"CAPTAIN_DOCUMENTS": "文档",
"CAPTAIN_RESPONSES": "常见问题",
+ "CAPTAIN_TOOLS": "工具",
"HOME": "首页",
"AGENTS": "客服代理",
"AGENT_BOTS": "机器人",
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json
index 02fd64aff..95a0f6f20 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json
@@ -648,14 +648,16 @@
"TIER_1K": "1K customers per 24h",
"TIER_10K": "10K customers per 24h",
"TIER_100K": "100K customers per 24h",
- "TIER_UNLIMITED": "Unlimited customers per 24h"
+ "TIER_UNLIMITED": "Unlimited customers per 24h",
+ "UNKNOWN": "Rating not available"
},
"STATUSES": {
"APPROVED": "Approved",
"PENDING_REVIEW": "Pending Review",
"AVAILABLE_WITHOUT_REVIEW": "Available Without Review",
"REJECTED": "Rejected",
- "DECLINED": "Declined"
+ "DECLINED": "Declined",
+ "NON_EXISTS": "Non exists"
},
"MODES": {
"SANDBOX": "Sandbox",
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json b/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json
index cf00f291a..a781e7728 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json
@@ -752,6 +752,115 @@
}
}
},
+ "CUSTOM_TOOLS": {
+ "HEADER": "Tools",
+ "ADD_NEW": "Create a new tool",
+ "EMPTY_STATE": {
+ "TITLE": "No custom tools available",
+ "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
+ "FEATURE_SPOTLIGHT": {
+ "TITLE": "Custom Tools",
+ "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities."
+ }
+ },
+ "FORM_DESCRIPTION": "Configure your custom tool to connect with external APIs",
+ "OPTIONS": {
+ "EDIT_TOOL": "Edit tool",
+ "DELETE_TOOL": "Delete tool"
+ },
+ "CREATE": {
+ "TITLE": "Create Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool created successfully",
+ "ERROR_MESSAGE": "Failed to create custom tool"
+ },
+ "EDIT": {
+ "TITLE": "Edit Custom Tool",
+ "SUCCESS_MESSAGE": "Custom tool updated successfully",
+ "ERROR_MESSAGE": "Failed to update custom tool"
+ },
+ "DELETE": {
+ "TITLE": "Delete Custom Tool",
+ "DESCRIPTION": "Are you sure you want to delete this custom tool? This action cannot be undone.",
+ "CONFIRM": "是的,刪除",
+ "SUCCESS_MESSAGE": "Custom tool deleted successfully",
+ "ERROR_MESSAGE": "Failed to delete custom tool"
+ },
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tool Name",
+ "PLACEHOLDER": "Order Lookup",
+ "ERROR": "Tool name is required"
+ },
+ "DESCRIPTION": {
+ "LABEL": "描述資訊",
+ "PLACEHOLDER": "Looks up order details by order ID"
+ },
+ "HTTP_METHOD": {
+ "LABEL": "Method"
+ },
+ "ENDPOINT_URL": {
+ "LABEL": "Endpoint URL",
+ "PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
+ "ERROR": "Valid URL is required"
+ },
+ "AUTH_TYPE": {
+ "LABEL": "Authentication Type"
+ },
+ "AUTH_TYPES": {
+ "NONE": "無",
+ "BEARER": "Bearer Token",
+ "BASIC": "Basic Auth",
+ "API_KEY": "API Key"
+ },
+ "AUTH_CONFIG": {
+ "BEARER_TOKEN": "Bearer Token",
+ "BEARER_TOKEN_PLACEHOLDER": "Enter your bearer token",
+ "USERNAME": "Username",
+ "USERNAME_PLACEHOLDER": "Enter username",
+ "PASSWORD": "密碼",
+ "PASSWORD_PLACEHOLDER": "Enter password",
+ "API_KEY": "Header Name",
+ "API_KEY_PLACEHOLDER": "X-API-Key",
+ "API_VALUE": "Header Value",
+ "API_VALUE_PLACEHOLDER": "Enter API key value"
+ },
+ "PARAMETERS": {
+ "LABEL": "Parameters",
+ "HELP_TEXT": "Define the parameters that will be extracted from user queries"
+ },
+ "ADD_PARAMETER": "Add Parameter",
+ "PARAM_NAME": {
+ "PLACEHOLDER": "Parameter name (e.g., order_id)"
+ },
+ "PARAM_TYPE": {
+ "PLACEHOLDER": "類別"
+ },
+ "PARAM_TYPES": {
+ "STRING": "String",
+ "NUMBER": "數字",
+ "BOOLEAN": "Boolean",
+ "ARRAY": "Array",
+ "OBJECT": "Object"
+ },
+ "PARAM_DESCRIPTION": {
+ "PLACEHOLDER": "Description of the parameter"
+ },
+ "PARAM_REQUIRED": {
+ "LABEL": "Required"
+ },
+ "REQUEST_TEMPLATE": {
+ "LABEL": "Request Body Template (Optional)",
+ "PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
+ },
+ "RESPONSE_TEMPLATE": {
+ "LABEL": "Response Template (Optional)",
+ "PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
+ },
+ "ERRORS": {
+ "PARAM_NAME_REQUIRED": "Parameter name is required"
+ }
+ }
+ },
"RESPONSES": {
"HEADER": "FAQs",
"ADD_NEW": "Create new FAQ",
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/settings.json b/app/javascript/dashboard/i18n/locale/zh_TW/settings.json
index 3a544d72f..7840c4bad 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/settings.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/settings.json
@@ -304,6 +304,7 @@
"CAPTAIN_ASSISTANTS": "Assistants",
"CAPTAIN_DOCUMENTS": "Documents",
"CAPTAIN_RESPONSES": "FAQs",
+ "CAPTAIN_TOOLS": "Tools",
"HOME": "首頁",
"AGENTS": "客服",
"AGENT_BOTS": "機器人",
diff --git a/config/locales/am.yml b/config/locales/am.yml
index c91f19922..28b6f375a 100644
--- a/config/locales/am.yml
+++ b/config/locales/am.yml
@@ -86,7 +86,7 @@ am:
validations:
name: should not start or end with symbols, and it should not have < > / \ @ characters.
custom_filters:
- number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 50.
+ 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".
@@ -322,6 +322,8 @@ am:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Search for article by title or body...
diff --git a/config/locales/ar.yml b/config/locales/ar.yml
index 777216dd5..369e73507 100644
--- a/config/locales/ar.yml
+++ b/config/locales/ar.yml
@@ -86,7 +86,7 @@ ar:
validations:
name: لا ينبغي أن تبدأ أو تنتهي بالرموز، ولا ينبغي أن يكون أقل من > / \ أحرف @ .
custom_filters:
- number_of_records: تم الوصول إلى الحد الأقصى. الحد الأقصى لعدد عوامل التصفية المخصصة المسموح به للمستخدم لكل حساب هو 50.
+ number_of_records: تم الوصول إلى الحد الأقصى. الحد الأقصى لعدد عوامل التصفية المخصصة المسموح به للمستخدم لكل حساب هو 1000.
invalid_attribute: مفتاح السمة غير صالح - [%{key}]. يجب أن يكون المفتاح واحد من [%{allowed_keys}] أو سمة مخصصة محددة في الحساب.
invalid_operator: مشغل غير صالح. المشغل المسموح به لـ %{attribute_name} هو [%{allowed_keys}].
invalid_query_operator: Query operator must be either "AND" or "OR".
@@ -322,6 +322,8 @@ ar:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: البحث عن مقالة حسب العنوان أو الجسم...
diff --git a/config/locales/az.yml b/config/locales/az.yml
index 582e5d233..3b04a2a82 100644
--- a/config/locales/az.yml
+++ b/config/locales/az.yml
@@ -86,7 +86,7 @@ az:
validations:
name: should not start or end with symbols, and it should not have < > / \ @ characters.
custom_filters:
- number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 50.
+ 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".
@@ -322,6 +322,8 @@ az:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Search for article by title or body...
diff --git a/config/locales/bg.yml b/config/locales/bg.yml
index be1ebaf87..0b65acf7e 100644
--- a/config/locales/bg.yml
+++ b/config/locales/bg.yml
@@ -86,7 +86,7 @@ bg:
validations:
name: should not start or end with symbols, and it should not have < > / \ @ characters.
custom_filters:
- number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 50.
+ 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".
@@ -322,6 +322,8 @@ bg:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Search for article by title or body...
diff --git a/config/locales/ca.yml b/config/locales/ca.yml
index e678aa96d..62537fbb2 100644
--- a/config/locales/ca.yml
+++ b/config/locales/ca.yml
@@ -86,7 +86,7 @@ ca:
validations:
name: no hauria de començar ni acabar amb símbols, i no hauria de tenir caràcters < > / \ @.
custom_filters:
- number_of_records: S'ha arribat al límit. El nombre màxim de filtres personalitzats permesos per a un usuari per compte és de 50.
+ number_of_records: S'ha arribat al límit. El nombre màxim de filtres personalitzats permesos per a un usuari per compte és de 1000.
invalid_attribute: 'Clau d''atribut no vàlida: [%{key}]. La clau hauria de ser una de [%{allowed_keys}] o un atribut personalitzat definit al compte.'
invalid_operator: Operador no vàlid. Els operadors permesos per a %{attribute_name} son [%{allowed_keys}].
invalid_query_operator: Query operator must be either "AND" or "OR".
@@ -322,6 +322,8 @@ ca:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Cerca l'article per títol o cos...
diff --git a/config/locales/cs.yml b/config/locales/cs.yml
index 270a955c6..39d56b284 100644
--- a/config/locales/cs.yml
+++ b/config/locales/cs.yml
@@ -86,7 +86,7 @@ cs:
validations:
name: should not start or end with symbols, and it should not have < > / \ @ characters.
custom_filters:
- number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 50.
+ 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".
@@ -322,6 +322,8 @@ cs:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Search for article by title or body...
diff --git a/config/locales/da.yml b/config/locales/da.yml
index d449604c7..b15244766 100644
--- a/config/locales/da.yml
+++ b/config/locales/da.yml
@@ -86,7 +86,7 @@ da:
validations:
name: bør ikke starte eller slutte med symboler, og det skal ikke have < > / \ @ tegn.
custom_filters:
- number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 50.
+ 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".
@@ -322,6 +322,8 @@ da:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Search for article by title or body...
diff --git a/config/locales/de.yml b/config/locales/de.yml
index d9d6fb23d..44863a78f 100644
--- a/config/locales/de.yml
+++ b/config/locales/de.yml
@@ -86,7 +86,7 @@ de:
validations:
name: Sollte nicht mit Symbolen beginnen oder enden, und es sollte keine < > / \ @ Zeichen enthalten.
custom_filters:
- number_of_records: Limit erreicht. Die maximale Anzahl an benutzerdefinierten Filtern pro Benutzerkonto beträgt 50.
+ number_of_records: Limit erreicht. Die maximale Anzahl an benutzerdefinierten Filtern pro Benutzerkonto beträgt 1000.
invalid_attribute: Ungültiger Attribut schlüssel - [%{key}]. Der Schlüssel sollte einer von [%{allowed_keys}] oder ein benutzerdefiniertes Attribut sein, das im Konto definiert ist.
invalid_operator: Ungültiger Operator. Die erlaubten Operatoren für %{attribute_name} sind [%{allowed_keys}].
invalid_query_operator: Query operator must be either "AND" or "OR".
@@ -322,6 +322,8 @@ de:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Artikel nach Titel oder Text suchen...
diff --git a/config/locales/el.yml b/config/locales/el.yml
index 034462107..c9578bbbf 100644
--- a/config/locales/el.yml
+++ b/config/locales/el.yml
@@ -86,7 +86,7 @@ el:
validations:
name: δεν πρέπει να ξεκινά ή να τελειώνει με σύμβολα, και δεν πρέπει να περιέχει τους χαρακτήρες < > / \ @
custom_filters:
- number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 50.
+ 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".
@@ -322,6 +322,8 @@ el:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Αναζήτηση άρθρου με τίτλο ή περιεχόμενο...
diff --git a/config/locales/es.yml b/config/locales/es.yml
index 6f81f1d67..6e679273d 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -86,7 +86,7 @@ es:
validations:
name: no debe comenzar ni terminar con símbolos, y no debe tener caracteres < > / \ @.
custom_filters:
- number_of_records: Límite alcanzado. El número máximo de filtros personalizados permitidos para un usuario por cuenta es de 50.
+ number_of_records: Límite alcanzado. El número máximo de filtros personalizados permitidos para un usuario por cuenta es de 1000.
invalid_attribute: Clave de atributo no válida - [%{key}]. La clave debe ser una de [%{allowed_keys}] o un atributo personalizado definido en la cuenta.
invalid_operator: Operador no válido. Los operadores permitidos para %{attribute_name} son [%{allowed_keys}].
invalid_query_operator: El operador de consulta debe ser "Y" o "O".
@@ -322,6 +322,8 @@ es:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Buscar artículo por título o cuerpo...
diff --git a/config/locales/fa.yml b/config/locales/fa.yml
index 232396757..bbe2fc8cf 100644
--- a/config/locales/fa.yml
+++ b/config/locales/fa.yml
@@ -86,7 +86,7 @@ fa:
validations:
name: نباید با نمادها شروع یا ختم شود و نباید دارای کاراکترهای < > / \ @ باشد.
custom_filters:
- number_of_records: سررسید محدودیت. حداکثر تعداد قابل قبول فیلترها برای یک کاربر در هر اکانت 50 می باشند.
+ number_of_records: سررسید محدودیت. حداکثر تعداد قابل قبول فیلترها برای یک کاربر در هر اکانت 1000 می باشند.
invalid_attribute: کلید ویژگی معتبر نیست (%{key}). کلید باید یکی از %{allowed_keys} باشد یا یک ویژگی سفارشی ایجاد شده در حساب.
invalid_operator: این عملیات مجاز نیست. عملیات های مجاز برای %{attribute_name} شامل %{allowed_keys} می باشد.
invalid_query_operator: Query operator must be either "AND" or "OR".
@@ -322,6 +322,8 @@ fa:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: جستجوی مقاله براساس عنوان یا متن...
diff --git a/config/locales/fi.yml b/config/locales/fi.yml
index 6e7db9ad7..09d6451d3 100644
--- a/config/locales/fi.yml
+++ b/config/locales/fi.yml
@@ -86,7 +86,7 @@ fi:
validations:
name: should not start or end with symbols, and it should not have < > / \ @ characters.
custom_filters:
- number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 50.
+ 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".
@@ -322,6 +322,8 @@ fi:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Search for article by title or body...
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index edab001cb..284a87ac0 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -86,7 +86,7 @@ fr:
validations:
name: 'ne doit pas commencer ou se terminer par des symboles, et ne doit pas comporter les caractères suivants : "< > / \ @".'
custom_filters:
- number_of_records: Limite atteinte. Le nombre maximum de filtres personnalisés autorisés pour un utilisateur par compte est de 50.
+ number_of_records: Limite atteinte. Le nombre maximum de filtres personnalisés autorisés pour un utilisateur par compte est de 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".
@@ -322,6 +322,8 @@ fr:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Rechercher un article par titre ou contenu...
diff --git a/config/locales/he.yml b/config/locales/he.yml
index a2f309a3a..f006ed806 100644
--- a/config/locales/he.yml
+++ b/config/locales/he.yml
@@ -86,7 +86,7 @@ he:
validations:
name: should not start or end with symbols, and it should not have < > / \ @ characters.
custom_filters:
- number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 50.
+ 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".
@@ -322,6 +322,8 @@ he:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Search for article by title or body...
diff --git a/config/locales/hi.yml b/config/locales/hi.yml
index 82f962f92..98bbda2ec 100644
--- a/config/locales/hi.yml
+++ b/config/locales/hi.yml
@@ -86,7 +86,7 @@ hi:
validations:
name: should not start or end with symbols, and it should not have < > / \ @ characters.
custom_filters:
- number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 50.
+ 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".
@@ -322,6 +322,8 @@ hi:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Search for article by title or body...
diff --git a/config/locales/hr.yml b/config/locales/hr.yml
index 3828ebd40..2eb2b7756 100644
--- a/config/locales/hr.yml
+++ b/config/locales/hr.yml
@@ -86,7 +86,7 @@ hr:
validations:
name: should not start or end with symbols, and it should not have < > / \ @ characters.
custom_filters:
- number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 50.
+ 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".
@@ -322,6 +322,8 @@ hr:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Search for article by title or body...
diff --git a/config/locales/hu.yml b/config/locales/hu.yml
index 8ded57a47..901148f83 100644
--- a/config/locales/hu.yml
+++ b/config/locales/hu.yml
@@ -86,7 +86,7 @@ hu:
validations:
name: nem kezdődhet vagy végződhet szimbólummal, és nem tartalmazhat < > / \ @ karaktereket.
custom_filters:
- number_of_records: Limit túllépve. Maximum 50 speciális szűrőt használhat egy fiók.
+ number_of_records: Limit túllépve. Maximum 1000 speciális szűrőt használhat egy fiók.
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".
@@ -322,6 +322,8 @@ hu:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Keress a bejegyzések címében és tartalmában...
diff --git a/config/locales/hy.yml b/config/locales/hy.yml
index 3119df585..b1a0ca023 100644
--- a/config/locales/hy.yml
+++ b/config/locales/hy.yml
@@ -86,7 +86,7 @@ hy:
validations:
name: should not start or end with symbols, and it should not have < > / \ @ characters.
custom_filters:
- number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 50.
+ 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".
@@ -322,6 +322,8 @@ hy:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Search for article by title or body...
diff --git a/config/locales/id.yml b/config/locales/id.yml
index ffe340f74..3b4527420 100644
--- a/config/locales/id.yml
+++ b/config/locales/id.yml
@@ -86,7 +86,7 @@ id:
validations:
name: tidak boleh dimulai atau diakhiri dengan simbol, dan tidak boleh memiliki karakter < > / \ @.
custom_filters:
- number_of_records: Batas tercapai. Jumlah maksimum filter ubahsuaian yang diizinkan untuk satu pengguna per akun adalah 50.
+ number_of_records: Batas tercapai. Jumlah maksimum filter ubahsuaian yang diizinkan untuk satu pengguna per akun adalah 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".
@@ -322,6 +322,8 @@ id:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Telusuri artikel menurut judul atau isi...
diff --git a/config/locales/is.yml b/config/locales/is.yml
index c9b96fd74..24c01f849 100644
--- a/config/locales/is.yml
+++ b/config/locales/is.yml
@@ -86,7 +86,7 @@ is:
validations:
name: ætti ekki að byrja eða enda á táknum, og það ætti ekki að hafa < > / \ @ táknin.
custom_filters:
- number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 50.
+ 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".
@@ -322,6 +322,8 @@ is:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Search for article by title or body...
diff --git a/config/locales/it.yml b/config/locales/it.yml
index 2d2720acd..806c3e0a9 100644
--- a/config/locales/it.yml
+++ b/config/locales/it.yml
@@ -86,7 +86,7 @@ it:
validations:
name: non dovrebbe iniziare o terminare con i simboli, e non dovrebbe avere < > / \ @ caratteri.
custom_filters:
- number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 50.
+ 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".
@@ -322,6 +322,8 @@ it:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Search for article by title or body...
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index 5e44bda34..336f70b91 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -86,7 +86,7 @@ ja:
validations:
name: 記号で開始または終了しないでください。< > / \ @ を使用しないでください。
custom_filters:
- number_of_records: 制限に達しました。1つのアカウントにつき、ユーザーごとに許可されるカスタムフィルターの最大数は 50 です。
+ number_of_records: 制限に達しました。1つのアカウントにつき、ユーザーごとに許可されるカスタムフィルターの最大数は 1000 です。
invalid_attribute: 無効な属性キー - [%{key}]。キーは[%{allowed_keys}]のいずれかである必要があります。または、アカウント内で定義されたカスタム属性でなければなりません。
invalid_operator: 無効な演算子です。%{attribute_name} に許可されている演算子は [%{allowed_keys}] です。
invalid_query_operator: クエリ演算子は "AND" または "OR" でなければなりません。
@@ -322,6 +322,8 @@ ja:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: タイトルまたは本文で記事を検索...
diff --git a/config/locales/ka.yml b/config/locales/ka.yml
index cb3d5637b..c8f9d200d 100644
--- a/config/locales/ka.yml
+++ b/config/locales/ka.yml
@@ -86,7 +86,7 @@ ka:
validations:
name: should not start or end with symbols, and it should not have < > / \ @ characters.
custom_filters:
- number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 50.
+ 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".
@@ -322,6 +322,8 @@ ka:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Search for article by title or body...
diff --git a/config/locales/ko.yml b/config/locales/ko.yml
index 2a655fcce..042e2fae4 100644
--- a/config/locales/ko.yml
+++ b/config/locales/ko.yml
@@ -86,7 +86,7 @@ ko:
validations:
name: should not start or end with symbols, and it should not have < > / \ @ characters.
custom_filters:
- number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 50.
+ 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".
@@ -322,6 +322,8 @@ ko:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: 게시물을 제목이나 내용으로 검색하세요...
diff --git a/config/locales/lt.yml b/config/locales/lt.yml
index 51018d3aa..63b508066 100644
--- a/config/locales/lt.yml
+++ b/config/locales/lt.yml
@@ -86,7 +86,7 @@ lt:
validations:
name: neturėtų prasidėti ar baigtis simboliais ir jame neturėtų būti simbolių < > / \ @.
custom_filters:
- number_of_records: Pasiekta riba. Didžiausias leistinas personalizuotų filtrų skaičius vienam vartotojui yra 50.
+ number_of_records: Pasiekta riba. Didžiausias leistinas personalizuotų filtrų skaičius vienam vartotojui yra 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".
@@ -322,6 +322,8 @@ lt:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Ieškokite straipsnio pagal pavadinimą arba turinį...
diff --git a/config/locales/lv.yml b/config/locales/lv.yml
index 639194239..12b1d85a7 100644
--- a/config/locales/lv.yml
+++ b/config/locales/lv.yml
@@ -86,7 +86,7 @@ lv:
validations:
name: nevajadzētu sākties vai beigties ar simboliem, un nevajadzētu saturēt <> / \ @ rakstzīmes.
custom_filters:
- number_of_records: Sasniegts limits. Maksimālais atļauto pielāgoto filtru skaits vienam lietotājam ir 50.
+ number_of_records: Sasniegts limits. Maksimālais atļauto pielāgoto filtru skaits vienam lietotājam ir 1000.
invalid_attribute: Nederīga atribūta atslēga - [%{key}]. Atslēgai ir jābūt vienai no [%{allowed_keys}] vai pielāgotam atribūtam, kas definēts kontā.
invalid_operator: Nederīgs operators. Atļautie operatori priekš %{attribute_name} ir [%{allowed_keys}].
invalid_query_operator: Vaicājuma operatoram ir jābūt "UN" vai "VAI".
@@ -322,6 +322,8 @@ lv:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Meklēt rakstu pēc nosaukuma vai pamatteksta...
diff --git a/config/locales/ml.yml b/config/locales/ml.yml
index 2f411ea56..80bd12a50 100644
--- a/config/locales/ml.yml
+++ b/config/locales/ml.yml
@@ -86,7 +86,7 @@ ml:
validations:
name: should not start or end with symbols, and it should not have < > / \ @ characters.
custom_filters:
- number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 50.
+ 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".
@@ -322,6 +322,8 @@ ml:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Search for article by title or body...
diff --git a/config/locales/ms.yml b/config/locales/ms.yml
index 7a1902b8e..5d6963421 100644
--- a/config/locales/ms.yml
+++ b/config/locales/ms.yml
@@ -86,7 +86,7 @@ ms:
validations:
name: should not start or end with symbols, and it should not have < > / \ @ characters.
custom_filters:
- number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 50.
+ 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".
@@ -322,6 +322,8 @@ ms:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Search for article by title or body...
diff --git a/config/locales/ne.yml b/config/locales/ne.yml
index 2690a7d47..b4477805a 100644
--- a/config/locales/ne.yml
+++ b/config/locales/ne.yml
@@ -86,7 +86,7 @@ ne:
validations:
name: should not start or end with symbols, and it should not have < > / \ @ characters.
custom_filters:
- number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 50.
+ 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".
@@ -322,6 +322,8 @@ ne:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Search for article by title or body...
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index 641516129..1d361f807 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -86,7 +86,7 @@ nl:
validations:
name: mag niet beginnen of eindigen met symbolen, en mag geen < > / \ @ karakters hebben.
custom_filters:
- number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 50.
+ 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".
@@ -322,6 +322,8 @@ nl:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Search for article by title or body...
diff --git a/config/locales/no.yml b/config/locales/no.yml
index c1b736fb3..ebb23976d 100644
--- a/config/locales/no.yml
+++ b/config/locales/no.yml
@@ -86,7 +86,7 @@
validations:
name: ikke kan starte eller slutte med symboler, og den kan ikke ha < > / \ @ tegn.
custom_filters:
- number_of_records: Grense nådd. Maksimalt antall tillatte filtre for en bruker per konto er 50.
+ number_of_records: Grense nådd. Maksimalt antall tillatte filtre for en bruker per konto er 1000.
invalid_attribute: Ugyldig attributtnøkkel - [%{key}]. Nøkkelen bør være en av [%{allowed_keys}] eller en egendefinert attributt definert på kontoen.
invalid_operator: Ugyldig operatør. De tillatte operatørene for %{attribute_name} er [%{allowed_keys}].
invalid_query_operator: Spørrings-operatør må være enten "AND" eller "OR".
@@ -322,6 +322,8 @@
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Search for article by title or body...
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index c21d42d0f..9ade3104a 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -86,7 +86,7 @@ pl:
validations:
name: nie powinno zaczynać się ani kończyć symbolami i nie powinno zawierać znaków < > / \ @.
custom_filters:
- number_of_records: Osiągnięto limit. Maksymalna liczba dozwolonych filtrów niestandardowych dla użytkownika na konto wynosi 50.
+ number_of_records: Osiągnięto limit. Maksymalna liczba dozwolonych filtrów niestandardowych dla użytkownika na konto wynosi 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".
@@ -322,6 +322,8 @@ pl:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Wyszukaj artykuł według tytułu lub treści...
diff --git a/config/locales/pt.yml b/config/locales/pt.yml
index 8b78ee036..cf5b51e07 100644
--- a/config/locales/pt.yml
+++ b/config/locales/pt.yml
@@ -86,7 +86,7 @@ pt:
validations:
name: não deve iniciar ou terminar com símbolos, nem deve ter < > / \ @ caracteres.
custom_filters:
- number_of_records: Limite atingido. O número máximo de filtros personalizados permitidos para um utilizador por conta é de 50.
+ number_of_records: Limite atingido. O número máximo de filtros personalizados permitidos para um utilizador por conta é de 1000.
invalid_attribute: Chave de atributo inválida - [%{key}]. A chave deve ser uma das [%{allowed_keys}] ou um atributo personalizado definido na conta.
invalid_operator: Operador inválido. Os operadores permitidos para %{attribute_name} são [%{allowed_keys}].
invalid_query_operator: Query operator must be either "AND" or "OR".
@@ -322,6 +322,8 @@ pt:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Pesquisar artigo por título ou corpo...
diff --git a/config/locales/pt_BR.yml b/config/locales/pt_BR.yml
index 80c4eb574..01e532aad 100644
--- a/config/locales/pt_BR.yml
+++ b/config/locales/pt_BR.yml
@@ -86,7 +86,7 @@ pt_BR:
validations:
name: 'não deve iniciar ou terminar com símbolos e não deve ter os caracteres: < > / \ @.'
custom_filters:
- number_of_records: Limite atingido. O número máximo de filtros personalizados permitidos para um usuário por conta é de 50.
+ number_of_records: Limite atingido. O número máximo de filtros personalizados permitidos para um usuário por conta é de 1000.
invalid_attribute: Chave de atributo inválido - [%{key}]. A chave deve ser uma das [%{allowed_keys}] ou um atributo personalizado definido na conta.
invalid_operator: Operador inválido. Os operadores permitidos para %{attribute_name} são [%{allowed_keys}].
invalid_query_operator: Operador de consulta deve ser "E" ou "OU".
@@ -322,6 +322,8 @@ pt_BR:
processing_pages: 'Processando páginas %{start}-%{end} (iteração %{iteration})'
chunk_generated: 'Chunk generated %{chunk_faqs} FAQs. Total so far: %{total_faqs}'
page_processing_error: 'Erro ao processar as páginas %{start}-%{end}: %{error}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Pesquisar por artigo por título ou corpo...
diff --git a/config/locales/ro.yml b/config/locales/ro.yml
index bdf8f6237..ae7ca5605 100644
--- a/config/locales/ro.yml
+++ b/config/locales/ro.yml
@@ -86,7 +86,7 @@ ro:
validations:
name: nu ar trebui să înceapă sau să se termine cu simboluri și nu ar trebui să aibă < > / \ @ caractere.
custom_filters:
- number_of_records: Limita atinsă. Numărul maxim de filtre personalizate permise pentru un utilizator per cont este de 50.
+ number_of_records: Limita atinsă. Numărul maxim de filtre personalizate permise pentru un utilizator per cont este de 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".
@@ -322,6 +322,8 @@ ro:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Căutați articol după titlu sau corp...
diff --git a/config/locales/ru.yml b/config/locales/ru.yml
index ee104a126..3dc011305 100644
--- a/config/locales/ru.yml
+++ b/config/locales/ru.yml
@@ -86,7 +86,7 @@ ru:
validations:
name: Не должен начинаться или заканчиваться символами, и у него Не должно быть < > / \ @ символов.
custom_filters:
- number_of_records: Достигнут лимит. Максимальное количество разрешенных пользовательских фильтров для каждого пользователя - 50.
+ number_of_records: Достигнут лимит. Максимальное количество разрешенных пользовательских фильтров для каждого пользователя - 1000.
invalid_attribute: Недопустимый ключ атрибута - [%{key}]. Ключ должен быть одним из [%{allowed_keys}] или пользовательским атрибутом, указанным в учетной записи.
invalid_operator: Неверный оператор. Допустимыми операторами для %{attribute_name} являются [%{allowed_keys}].
invalid_query_operator: Оператор запроса должен быть "AND" или "OR".
@@ -322,6 +322,8 @@ ru:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Поиск статьи по названию или содержанию...
diff --git a/config/locales/sh.yml b/config/locales/sh.yml
index e4598bccf..b52dd4af5 100644
--- a/config/locales/sh.yml
+++ b/config/locales/sh.yml
@@ -86,7 +86,7 @@ sh:
validations:
name: should not start or end with symbols, and it should not have < > / \ @ characters.
custom_filters:
- number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 50.
+ 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".
@@ -322,6 +322,8 @@ sh:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Search for article by title or body...
diff --git a/config/locales/sk.yml b/config/locales/sk.yml
index 09067eed7..9c0b5c0a3 100644
--- a/config/locales/sk.yml
+++ b/config/locales/sk.yml
@@ -86,7 +86,7 @@ sk:
validations:
name: should not start or end with symbols, and it should not have < > / \ @ characters.
custom_filters:
- number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 50.
+ 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".
@@ -322,6 +322,8 @@ sk:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Search for article by title or body...
diff --git a/config/locales/sl.yml b/config/locales/sl.yml
index 1e4c32133..76b21fb83 100644
--- a/config/locales/sl.yml
+++ b/config/locales/sl.yml
@@ -86,7 +86,7 @@ sl:
validations:
name: se ne sme začeti ali končati s simboli in ne sme vsebovati znakov < > / \ @.
custom_filters:
- number_of_records: Omejitev dosežena. Največje dovoljeno število filtrov po meri za uporabnika na račun je 50.
+ number_of_records: Omejitev dosežena. Največje dovoljeno število filtrov po meri za uporabnika na račun je 1000.
invalid_attribute: Neveljaven ključ atributa - [%{key}]. Ključ mora biti eden od [%{allowed_keys}] ali atribut po meri, določen v računu.
invalid_operator: Neveljaven operater. Dovoljeni operaterji za %{attribute_name} so [%{allowed_keys}].
invalid_query_operator: Query operator must be either "AND" or "OR".
@@ -322,6 +322,8 @@ sl:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Iskanje članka po naslovu ali telesu ...
diff --git a/config/locales/sq.yml b/config/locales/sq.yml
index 8717b39fa..d87ab44e2 100644
--- a/config/locales/sq.yml
+++ b/config/locales/sq.yml
@@ -86,7 +86,7 @@ sq:
validations:
name: should not start or end with symbols, and it should not have < > / \ @ characters.
custom_filters:
- number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 50.
+ 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".
@@ -322,6 +322,8 @@ sq:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Search for article by title or body...
diff --git a/config/locales/sr.yml b/config/locales/sr.yml
index 99140fa02..a8f9b23a8 100644
--- a/config/locales/sr.yml
+++ b/config/locales/sr.yml
@@ -86,7 +86,7 @@ sr-Latn:
validations:
name: ne treba početi ili se završiti sa simbolima i ne treba da sadrži < > / \ @ karaktere.
custom_filters:
- number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 50.
+ 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".
@@ -322,6 +322,8 @@ sr-Latn:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Search for article by title or body...
diff --git a/config/locales/sv.yml b/config/locales/sv.yml
index fc0170c3a..77a3a1e84 100644
--- a/config/locales/sv.yml
+++ b/config/locales/sv.yml
@@ -86,7 +86,7 @@ sv:
validations:
name: should not start or end with symbols, and it should not have < > / \ @ characters.
custom_filters:
- number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 50.
+ 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".
@@ -322,6 +322,8 @@ sv:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Sök efter artikel baserat på rubrik eller brödtext...
diff --git a/config/locales/ta.yml b/config/locales/ta.yml
index 2323ab68e..2af7ba7bb 100644
--- a/config/locales/ta.yml
+++ b/config/locales/ta.yml
@@ -86,7 +86,7 @@ ta:
validations:
name: should not start or end with symbols, and it should not have < > / \ @ characters.
custom_filters:
- number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 50.
+ 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".
@@ -322,6 +322,8 @@ ta:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Search for article by title or body...
diff --git a/config/locales/th.yml b/config/locales/th.yml
index 137cfd4fd..287f6d4f2 100644
--- a/config/locales/th.yml
+++ b/config/locales/th.yml
@@ -86,7 +86,7 @@ th:
validations:
name: should not start or end with symbols, and it should not have < > / \ @ characters.
custom_filters:
- number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 50.
+ 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".
@@ -322,6 +322,8 @@ th:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Search for article by title or body...
diff --git a/config/locales/tl.yml b/config/locales/tl.yml
index 947ca15f9..fb6de4e8c 100644
--- a/config/locales/tl.yml
+++ b/config/locales/tl.yml
@@ -86,7 +86,7 @@ tl:
validations:
name: should not start or end with symbols, and it should not have < > / \ @ characters.
custom_filters:
- number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 50.
+ 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".
@@ -322,6 +322,8 @@ tl:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Search for article by title or body...
diff --git a/config/locales/tr.yml b/config/locales/tr.yml
index ab3fce25d..f046ee82e 100644
--- a/config/locales/tr.yml
+++ b/config/locales/tr.yml
@@ -86,7 +86,7 @@ tr:
validations:
name: sembollerle başlamamalı veya bitmemeli, < > / \ @ karakterlerini içermemeli.
custom_filters:
- number_of_records: Limit aşıldı. Bir kullanıcının bir hesap için izin verilen özel filtre sayısı 50'dir.
+ number_of_records: Limit aşıldı. Bir kullanıcının bir hesap için izin verilen özel filtre sayısı 1000'dir.
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".
@@ -322,6 +322,8 @@ tr:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Başlık veya içerikle makale arayın...
diff --git a/config/locales/uk.yml b/config/locales/uk.yml
index da1f328ac..29006859a 100644
--- a/config/locales/uk.yml
+++ b/config/locales/uk.yml
@@ -86,7 +86,7 @@ uk:
validations:
name: не повинно починатись або закінчуватися символами, і він не повинен мати < > / \ @ символів.
custom_filters:
- number_of_records: Досягнуто ліміту. Максимальна кількість дозволених користувацьких фільтрів для користувача на рахунок становить 50.
+ number_of_records: Досягнуто ліміту. Максимальна кількість дозволених користувацьких фільтрів для користувача на рахунок становить 1000.
invalid_attribute: Некоректний ключ атрибута - [%{key}]. Ключ повинен бути одним з [%{allowed_keys}] або налаштованим атрибутом, визначеним в обліковому записі.
invalid_operator: Некоректний оператор. Дозволені оператори для %{attribute_name} є [%{allowed_keys}].
invalid_query_operator: Query operator must be either "AND" or "OR".
@@ -322,6 +322,8 @@ uk:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Пошук статті за заголовком або змістом...
diff --git a/config/locales/ur.yml b/config/locales/ur.yml
index 5fd822348..1f033f2a6 100644
--- a/config/locales/ur.yml
+++ b/config/locales/ur.yml
@@ -86,7 +86,7 @@ ur:
validations:
name: should not start or end with symbols, and it should not have < > / \ @ characters.
custom_filters:
- number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 50.
+ 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".
@@ -322,6 +322,8 @@ ur:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Search for article by title or body...
diff --git a/config/locales/ur_IN.yml b/config/locales/ur_IN.yml
index 3ed18d377..304c8f405 100644
--- a/config/locales/ur_IN.yml
+++ b/config/locales/ur_IN.yml
@@ -86,7 +86,7 @@ ur:
validations:
name: should not start or end with symbols, and it should not have < > / \ @ characters.
custom_filters:
- number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 50.
+ 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".
@@ -322,6 +322,8 @@ ur:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Search for article by title or body...
diff --git a/config/locales/vi.yml b/config/locales/vi.yml
index 9f2597037..ba84f6bbd 100644
--- a/config/locales/vi.yml
+++ b/config/locales/vi.yml
@@ -86,7 +86,7 @@ vi:
validations:
name: không nên bắt đầu hoặc kết thúc bằng các ký hiệu và không nên có kí tự < > / \ @.
custom_filters:
- number_of_records: Đã đạt giới hạn. Số lượng tuỳ chọn lọc tối đa cho mỗi mỗi người dùng mỗi tài khoản là 50.
+ number_of_records: Đã đạt giới hạn. Số lượng tuỳ chọn lọc tối đa cho mỗi mỗi người dùng mỗi tài khoản là 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".
@@ -322,6 +322,8 @@ vi:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Tìm bài viết theo tiêu đề hoặc nội dung...
diff --git a/config/locales/zh_CN.yml b/config/locales/zh_CN.yml
index 4702af460..234c3758d 100644
--- a/config/locales/zh_CN.yml
+++ b/config/locales/zh_CN.yml
@@ -86,7 +86,7 @@ zh_CN:
validations:
name: 不应该以符号开头或结尾,它不应该有 < > / \ @ 字符。
custom_filters:
- number_of_records: 已达到上限。每个账户允许用户自定义过滤器的最大数目为50个。
+ number_of_records: 已达到上限。每个账户允许用户自定义过滤器的最大数目为1000个。
invalid_attribute: 无效的属性键 - [%{key}]。键应为 [%{allowed_keys}] 之一或帐户中定义的自定义属性。
invalid_operator: 无效的操作符。%{attribute_name} 允许的操作符为 [%{allowed_keys}]。
invalid_query_operator: 查询操作符必须为 "AND" 或 "OR"。
@@ -322,6 +322,8 @@ zh_CN:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: 搜索文章的标题或正文...
diff --git a/config/locales/zh_TW.yml b/config/locales/zh_TW.yml
index ad47d8333..572271664 100644
--- a/config/locales/zh_TW.yml
+++ b/config/locales/zh_TW.yml
@@ -86,7 +86,7 @@ zh_TW:
validations:
name: should not start or end with symbols, and it should not have < > / \ @ characters.
custom_filters:
- number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 50.
+ 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".
@@ -322,6 +322,8 @@ zh_TW:
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}'
+ custom_tool:
+ slug_generation_failed: 'Unable to generate unique slug after 5 attempts'
public_portal:
search:
search_placeholder: Search for article by title or body...
From 978f4c431a36bfe9d2d7b4413218200dcd5231a0 Mon Sep 17 00:00:00 2001
From: Shivam Mishra
Date: Tue, 7 Oct 2025 20:32:29 +0530
Subject: [PATCH 165/182] feat: Add relay state for SAML SSO (#12597)
Co-authored-by: Muhsin Keloth
---
.../omniauth_callbacks_controller.rb | 13 +++++++
app/javascript/v3/views/login/Index.vue | 2 +
app/javascript/v3/views/login/Saml.vue | 5 +++
app/javascript/v3/views/routes.js | 1 +
.../app/controllers/api/v1/auth_controller.rb | 17 ++++++++-
.../omniauth_callbacks_controller.rb | 38 ++++++++++++++++++-
.../config/initializers/omniauth_saml.rb | 4 ++
.../api/v1/auth_controller_spec.rb | 24 ++++++++++++
8 files changed, 101 insertions(+), 3 deletions(-)
diff --git a/app/controllers/devise_overrides/omniauth_callbacks_controller.rb b/app/controllers/devise_overrides/omniauth_callbacks_controller.rb
index fd3dba87c..900125670 100644
--- a/app/controllers/devise_overrides/omniauth_callbacks_controller.rb
+++ b/app/controllers/devise_overrides/omniauth_callbacks_controller.rb
@@ -19,6 +19,19 @@ class DeviseOverrides::OmniauthCallbacksController < DeviseTokenAuth::OmniauthCa
redirect_to login_page_url(email: encoded_email, sso_auth_token: @resource.generate_sso_auth_token)
end
+ def sign_in_user_on_mobile
+ @resource.skip_confirmation! if confirmable_enabled?
+
+ # once the resource is found and verified
+ # we can just send them to the login page again with the SSO params
+ # that will log them in
+ encoded_email = ERB::Util.url_encode(@resource.email)
+ params = { email: encoded_email, sso_auth_token: @resource.generate_sso_auth_token }.to_query
+
+ mobile_deep_link_base = GlobalConfigService.load('MOBILE_DEEP_LINK_BASE', 'chatwootapp')
+ redirect_to "#{mobile_deep_link_base}://auth/saml?#{params}", allow_other_host: true
+ end
+
def sign_up_user
return redirect_to login_page_url(error: 'no-account-found') unless account_signup_allowed?
return redirect_to login_page_url(error: 'business-account-only') unless validate_signup_email_is_business_domain?
diff --git a/app/javascript/v3/views/login/Index.vue b/app/javascript/v3/views/login/Index.vue
index 028af4f72..04fb939c8 100644
--- a/app/javascript/v3/views/login/Index.vue
+++ b/app/javascript/v3/views/login/Index.vue
@@ -22,6 +22,8 @@ import MfaVerification from 'dashboard/components/auth/MfaVerification.vue';
const ERROR_MESSAGES = {
'no-account-found': 'LOGIN.OAUTH.NO_ACCOUNT_FOUND',
'business-account-only': 'LOGIN.OAUTH.BUSINESS_ACCOUNTS_ONLY',
+ 'saml-authentication-failed': 'LOGIN.SAML.API.ERROR_MESSAGE',
+ 'saml-not-enabled': 'LOGIN.SAML.API.ERROR_MESSAGE',
};
const IMPERSONATION_URL_SEARCH_KEY = 'impersonation';
diff --git a/app/javascript/v3/views/login/Saml.vue b/app/javascript/v3/views/login/Saml.vue
index bbb61914d..95749d7e2 100644
--- a/app/javascript/v3/views/login/Saml.vue
+++ b/app/javascript/v3/views/login/Saml.vue
@@ -15,6 +15,10 @@ const props = defineProps({
type: String,
default: '',
},
+ target: {
+ type: String,
+ default: 'web',
+ },
});
const store = useStore();
@@ -107,6 +111,7 @@ onMounted(async () => {
name="authenticity_token"
:value="csrfToken"
/>
+
({
authError: route.query.error,
+ target: route.query.target,
}),
},
{
diff --git a/enterprise/app/controllers/api/v1/auth_controller.rb b/enterprise/app/controllers/api/v1/auth_controller.rb
index 091d4f8f8..b0d8e1366 100644
--- a/enterprise/app/controllers/api/v1/auth_controller.rb
+++ b/enterprise/app/controllers/api/v1/auth_controller.rb
@@ -5,7 +5,9 @@ class Api::V1::AuthController < Api::BaseController
def saml_login
return if @account.nil?
- saml_initiation_url = "/auth/saml?account_id=#{@account.id}"
+ relay_state = params[:target] || 'web'
+
+ saml_initiation_url = "/auth/saml?account_id=#{@account.id}&RelayState=#{relay_state}"
redirect_to saml_initiation_url, status: :temporary_redirect
end
@@ -44,7 +46,18 @@ class Api::V1::AuthController < Api::BaseController
end
def render_saml_error
- redirect_to sso_login_page_url(error: 'saml-authentication-failed')
+ error = 'saml-authentication-failed'
+
+ if mobile_target?
+ mobile_deep_link_base = GlobalConfigService.load('MOBILE_DEEP_LINK_BASE', 'chatwootapp')
+ redirect_to "#{mobile_deep_link_base}://auth/saml?error=#{ERB::Util.url_encode(error)}", allow_other_host: true
+ else
+ redirect_to sso_login_page_url(error: error)
+ end
+ end
+
+ def mobile_target?
+ params[:target]&.casecmp('mobile')&.zero?
end
def sso_login_page_url(error: nil)
diff --git a/enterprise/app/controllers/enterprise/devise_overrides/omniauth_callbacks_controller.rb b/enterprise/app/controllers/enterprise/devise_overrides/omniauth_callbacks_controller.rb
index 973f26650..4856ca443 100644
--- a/enterprise/app/controllers/enterprise/devise_overrides/omniauth_callbacks_controller.rb
+++ b/enterprise/app/controllers/enterprise/devise_overrides/omniauth_callbacks_controller.rb
@@ -32,17 +32,40 @@ module Enterprise::DeviseOverrides::OmniauthCallbacksController
end
end
+ def omniauth_failure
+ return super unless params[:provider] == 'saml'
+
+ relay_state = saml_relay_state
+ error = params[:message] || 'authentication-failed'
+
+ if for_mobile?(relay_state)
+ redirect_to_mobile_error(error, relay_state)
+ else
+ redirect_to login_page_url(error: "saml-#{error}")
+ end
+ end
+
private
def handle_saml_auth
account_id = extract_saml_account_id
- return redirect_to login_page_url(error: 'saml-not-enabled') unless saml_enabled_for_account?(account_id)
+ relay_state = saml_relay_state
+
+ unless saml_enabled_for_account?(account_id)
+ return redirect_to_mobile_error('saml-not-enabled') if for_mobile?(relay_state)
+
+ return redirect_to login_page_url(error: 'saml-not-enabled')
+ end
@resource = SamlUserBuilder.new(auth_hash, account_id).perform
if @resource.persisted?
+ return sign_in_user_on_mobile if for_mobile?(relay_state)
+
sign_in_user
else
+ return redirect_to_mobile_error('saml-authentication-failed') if for_mobile?(relay_state)
+
redirect_to login_page_url(error: 'saml-authentication-failed')
end
end
@@ -51,6 +74,19 @@ module Enterprise::DeviseOverrides::OmniauthCallbacksController
params[:account_id] || session[:saml_account_id] || request.env['omniauth.params']&.dig('account_id')
end
+ def saml_relay_state
+ session[:saml_relay_state] || request.env['omniauth.params']&.dig('RelayState')
+ end
+
+ def for_mobile?(relay_state)
+ relay_state.to_s.casecmp('mobile').zero?
+ end
+
+ def redirect_to_mobile_error(error)
+ mobile_deep_link_base = GlobalConfigService.load('MOBILE_DEEP_LINK_BASE', 'chatwootapp')
+ redirect_to "#{mobile_deep_link_base}://auth/saml?error=#{ERB::Util.url_encode(error)}", allow_other_host: true
+ end
+
def saml_enabled_for_account?(account_id)
return false if account_id.blank?
diff --git a/enterprise/config/initializers/omniauth_saml.rb b/enterprise/config/initializers/omniauth_saml.rb
index f73e3a109..f39e9d511 100644
--- a/enterprise/config/initializers/omniauth_saml.rb
+++ b/enterprise/config/initializers/omniauth_saml.rb
@@ -9,18 +9,22 @@ SAML_SETUP_PROC = proc do |env|
account_id = request.params['account_id'] ||
request.session[:saml_account_id] ||
env['omniauth.params']&.dig('account_id')
+ relay_state = request.params['RelayState'] || ''
if account_id
# Store in session and omniauth params for callback
request.session[:saml_account_id] = account_id
+ request.session[:saml_relay_state] = relay_state
env['omniauth.params'] ||= {}
env['omniauth.params']['account_id'] = account_id
+ env['omniauth.params']['RelayState'] = relay_state
# Find SAML settings for this account
settings = AccountSamlSettings.find_by(account_id: account_id)
if settings
# Configure the strategy options dynamically
+ env['omniauth.strategy'].options[:idp_sso_service_url_runtime_params] = { RelayState: :RelayState }
env['omniauth.strategy'].options[:assertion_consumer_service_url] = "#{ENV.fetch('FRONTEND_URL', 'http://localhost:3000')}/omniauth/saml/callback?account_id=#{account_id}"
env['omniauth.strategy'].options[:sp_entity_id] = settings.sp_entity_id
env['omniauth.strategy'].options[:idp_entity_id] = settings.idp_entity_id
diff --git a/spec/enterprise/controllers/api/v1/auth_controller_spec.rb b/spec/enterprise/controllers/api/v1/auth_controller_spec.rb
index f1e2ef1c7..767011a50 100644
--- a/spec/enterprise/controllers/api/v1/auth_controller_spec.rb
+++ b/spec/enterprise/controllers/api/v1/auth_controller_spec.rb
@@ -36,6 +36,12 @@ RSpec.describe 'Api::V1::Auth', type: :request do
expect(response.location).to eq('http://www.example.com/app/login/sso?error=saml-authentication-failed')
end
+
+ it 'redirects to mobile deep link with error when target is mobile' do
+ post '/api/v1/auth/saml_login', params: { email: 'nonexistent@example.com', target: 'mobile' }
+
+ expect(response.location).to eq('chatwootapp://auth/saml?error=saml-authentication-failed')
+ end
end
context 'when user exists but has no SAML enabled accounts' do
@@ -48,6 +54,12 @@ RSpec.describe 'Api::V1::Auth', type: :request do
expect(response.location).to eq('http://www.example.com/app/login/sso?error=saml-authentication-failed')
end
+
+ it 'redirects to mobile deep link with error when target is mobile' do
+ post '/api/v1/auth/saml_login', params: { email: user.email, target: 'mobile' }
+
+ expect(response.location).to eq('chatwootapp://auth/saml?error=saml-authentication-failed')
+ end
end
context 'when user has account without SAML feature enabled' do
@@ -65,6 +77,12 @@ RSpec.describe 'Api::V1::Auth', type: :request do
expect(response.location).to eq('http://www.example.com/app/login/sso?error=saml-authentication-failed')
end
+
+ it 'redirects to mobile deep link with error when target is mobile' do
+ post '/api/v1/auth/saml_login', params: { email: user.email, target: 'mobile' }
+
+ expect(response.location).to eq('chatwootapp://auth/saml?error=saml-authentication-failed')
+ end
end
context 'when user has valid SAML configuration' do
@@ -82,6 +100,12 @@ RSpec.describe 'Api::V1::Auth', type: :request do
expect(response.location).to include("/auth/saml?account_id=#{account.id}")
end
+
+ it 'redirects to SAML initiation URL with mobile relay state' do
+ post '/api/v1/auth/saml_login', params: { email: user.email, target: 'mobile' }
+
+ expect(response.location).to include("/auth/saml?account_id=#{account.id}&RelayState=mobile")
+ end
end
context 'when user has multiple accounts with SAML' do
From 78ebdbbbd857c30bff09a4573183a3496618659b Mon Sep 17 00:00:00 2001
From: Aguinaldo Tupy <44652991+aguinaldotupy@users.noreply.github.com>
Date: Wed, 8 Oct 2025 07:03:06 -0300
Subject: [PATCH 166/182] fix: Normalize URLs with spaces in WhatsApp template
parameters (#12594)
This PR fixes URL parsing errors when WhatsApp template parameters
contain URLs with spaces or special characters. The solution adds proper
URL normalization using Addressable::URI before validation, which
automatically handles space encoding and special character
normalization.
Related with https://github.com/chatwoot/chatwoot/pull/12462
## Type of change
- [x] Bug fix (non-breaking change which fixes an issue)
## 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
---------
Co-authored-by: Muhsin Keloth
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---
.../populate_template_parameters_service.rb | 16 ++++-
...pulate_template_parameters_service_spec.rb | 70 +++++++++++++++++++
2 files changed, 84 insertions(+), 2 deletions(-)
create mode 100644 spec/services/whatsapp/populate_template_parameters_service_spec.rb
diff --git a/app/services/whatsapp/populate_template_parameters_service.rb b/app/services/whatsapp/populate_template_parameters_service.rb
index 3f9f64b91..6ea3e6e05 100644
--- a/app/services/whatsapp/populate_template_parameters_service.rb
+++ b/app/services/whatsapp/populate_template_parameters_service.rb
@@ -34,8 +34,9 @@ class Whatsapp::PopulateTemplateParametersService
return nil if url.blank?
sanitized_url = sanitize_parameter(url)
- validate_url(sanitized_url)
- build_media_type_parameter(sanitized_url, media_type.downcase, media_name)
+ normalized_url = normalize_url(sanitized_url)
+ validate_url(normalized_url)
+ build_media_type_parameter(normalized_url, media_type.downcase, media_name)
end
def build_named_parameter(parameter_name, value)
@@ -138,9 +139,20 @@ class Whatsapp::PopulateTemplateParametersService
sanitized[0...1000] # Limit length to prevent DoS
end
+ def normalize_url(url)
+ # Use Addressable::URI for better URL normalization
+ # It handles spaces, special characters, and encoding automatically
+ Addressable::URI.parse(url).normalize.to_s
+ rescue Addressable::URI::InvalidURIError
+ # Fallback: simple space encoding if Addressable fails
+ url.gsub(' ', '%20')
+ end
+
def validate_url(url)
return if url.blank?
+ # url is already normalized by the caller
+
uri = URI.parse(url)
raise ArgumentError, "Invalid URL scheme: #{uri.scheme}. Only http and https are allowed" unless %w[http https].include?(uri.scheme)
raise ArgumentError, 'URL too long (max 2000 characters)' if url.length > 2000
diff --git a/spec/services/whatsapp/populate_template_parameters_service_spec.rb b/spec/services/whatsapp/populate_template_parameters_service_spec.rb
new file mode 100644
index 000000000..05390bd90
--- /dev/null
+++ b/spec/services/whatsapp/populate_template_parameters_service_spec.rb
@@ -0,0 +1,70 @@
+require 'rails_helper'
+
+describe Whatsapp::PopulateTemplateParametersService do
+ let(:service) { described_class.new }
+
+ describe '#normalize_url' do
+ it 'normalizes URLs with spaces' do
+ url_with_spaces = 'https://example.com/path with spaces'
+ normalized = service.send(:normalize_url, url_with_spaces)
+
+ expect(normalized).to eq('https://example.com/path%20with%20spaces')
+ end
+
+ it 'handles URLs with special characters' do
+ url = 'https://example.com/path?query=test value'
+ normalized = service.send(:normalize_url, url)
+
+ expect(normalized).to include('https://example.com/path')
+ expect(normalized).not_to include(' ')
+ end
+
+ it 'returns valid URLs unchanged' do
+ url = 'https://example.com/valid-path'
+ normalized = service.send(:normalize_url, url)
+
+ expect(normalized).to eq(url)
+ end
+ end
+
+ describe '#build_media_parameter' do
+ context 'when URL contains spaces' do
+ it 'normalizes the URL before building media parameter' do
+ url_with_spaces = 'https://example.com/image with spaces.jpg'
+ result = service.build_media_parameter(url_with_spaces, 'IMAGE')
+
+ expect(result[:type]).to eq('image')
+ expect(result[:image][:link]).to eq('https://example.com/image%20with%20spaces.jpg')
+ end
+ end
+
+ context 'when URL contains special characters in query string' do
+ it 'normalizes the URL correctly' do
+ url = 'https://example.com/video.mp4?title=My Video'
+ result = service.build_media_parameter(url, 'VIDEO', 'test_video')
+
+ expect(result[:type]).to eq('video')
+ expect(result[:video][:link]).not_to include(' ')
+ end
+ end
+
+ context 'when URL is already valid' do
+ it 'builds media parameter without changing URL' do
+ url = 'https://example.com/document.pdf'
+ result = service.build_media_parameter(url, 'DOCUMENT', 'test.pdf')
+
+ expect(result[:type]).to eq('document')
+ expect(result[:document][:link]).to eq(url)
+ expect(result[:document][:filename]).to eq('test.pdf')
+ end
+ end
+
+ context 'when URL is blank' do
+ it 'returns nil' do
+ result = service.build_media_parameter('', 'IMAGE')
+
+ expect(result).to be_nil
+ end
+ end
+ end
+end
From e9c1c61fe4b5b3f27348aa30b616a1f8ad07a042 Mon Sep 17 00:00:00 2001
From: Vishnu Narayanan
Date: Wed, 8 Oct 2025 17:27:52 +0530
Subject: [PATCH 167/182] chore(deps): bump uri from 1.0.3 to 1.0.4 (#12619)
fix CVE-2025-61594
---
Gemfile.lock | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Gemfile.lock b/Gemfile.lock
index 105bf8c13..283cf3b83 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -935,7 +935,7 @@ GEM
unicode-emoji (~> 4.0, >= 4.0.4)
unicode-emoji (4.0.4)
uniform_notifier (1.17.0)
- uri (1.0.3)
+ uri (1.0.4)
uri_template (0.7.0)
valid_email2 (5.2.6)
activemodel (>= 3.2)
From 606adffeeb2e5a18b981cce44da2200aa06a9763 Mon Sep 17 00:00:00 2001
From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Date: Wed, 8 Oct 2025 18:39:51 +0530
Subject: [PATCH 168/182] fix: I18n::MissingInterpolationArgument for assignee
activity messages (#12617)
# Pull Request Template
## Description
This PR fixes the following error:
`I18n::MissingInterpolationArgument: missing interpolation argument
:assignee_name in "Asignado a %{assignee_name} por %{user_name}"
({user_name: "Marketing Telpronet"} given)
(I18n::MissingInterpolationArgument)`
**Issue**
In the Spanish locale, an `I18n::MissingInterpolationArgument` error
occurred during bulk assignee operations.
This happened because `assignee&.name` was returning `nil`, and the
`.compact` method removed the `assignee_name` key entirely from the
params.
**Solution**
* Always include the `assignee_name` key with an empty string (`''`)
when its value is `nil`.
* Removed the `.compact` method call to ensure the interpolation key is
always present.
Fixes
https://linear.app/chatwoot/issue/CW-5747/i18nmissinginterpolationargument-missing-interpolation-argument
## Type of change
- [x] Bug fix (non-breaking change which fixes an issue)
## 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
---
app/models/concerns/activity_message_handler.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/models/concerns/activity_message_handler.rb b/app/models/concerns/activity_message_handler.rb
index 54e58b4d9..c25aba47f 100644
--- a/app/models/concerns/activity_message_handler.rb
+++ b/app/models/concerns/activity_message_handler.rb
@@ -106,7 +106,7 @@ module ActivityMessageHandler
end
def generate_assignee_change_activity_content(user_name)
- params = { assignee_name: assignee&.name, user_name: user_name }.compact
+ params = { assignee_name: assignee&.name || '', user_name: user_name }
key = assignee_id ? 'assigned' : 'removed'
key = 'self_assigned' if self_assign? assignee_id
I18n.t("conversations.activity.assignee.#{key}", **params)
From 170ea7691f10ff4ef130ab288fdc126ff09b727d Mon Sep 17 00:00:00 2001
From: Vinay Keerthi <11478411+stonecharioteer@users.noreply.github.com>
Date: Wed, 8 Oct 2025 20:23:43 +0530
Subject: [PATCH 169/182] feat: Add company model and API with tests (#12548)
# Pull Request Template
## Description
* add Company model with validations for name, domain, description and
avatar
* Add database migration fo
* Implement endpoints for company CRUD operations
* Add optional company relationship for contacts
* Add test for models, controllers, factories and policies
* Add authorization policies restricting delete to admins
* support JSON API responses
Please include a summary of the change and issue(s) fixed. Also, mention
relevant motivation, context, and any dependencies that this change
requires.
Fixes #(cw-5650)
## 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?
Tests are implemented using `RSpec`
```
$ bundle exec rails db:migrate
$ bundle exec rspec spec/models/company_spec.rb spec/controllers/api/v1/accounts/companies_controller_spec.rb
```
## 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
- [ ] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules
---
app/models/contact.rb | 3 +
app/models/super_admin.rb | 2 +-
app/models/user.rb | 2 +-
config/locales/en.yml | 3 +
config/routes.rb | 1 +
db/migrate/20250929105219_create_companies.rb | 14 ++
.../20250929132305_add_company_to_contacts.rb | 5 +
db/schema.rb | 14 ++
.../api/v1/accounts/companies_controller.rb | 40 +++++
enterprise/app/models/company.rb | 33 ++++
.../app/models/enterprise/concerns/account.rb | 1 +
.../app/models/enterprise/concerns/contact.rb | 6 +
enterprise/app/policies/company_policy.rb | 21 +++
.../accounts/companies/_company.json.jbuilder | 7 +
.../accounts/companies/create.json.jbuilder | 3 +
.../v1/accounts/companies/index.json.jbuilder | 5 +
.../v1/accounts/companies/show.json.jbuilder | 3 +
.../accounts/companies/update.json.jbuilder | 3 +
lib/limits.rb | 2 +
.../v1/accounts/companies_controller_spec.rb | 141 ++++++++++++++++++
spec/enterprise/models/company_spec.rb | 38 +++++
.../policies/company_policy_spec.rb | 33 ++++
spec/factories/companies.rb | 20 +++
23 files changed, 398 insertions(+), 2 deletions(-)
create mode 100644 db/migrate/20250929105219_create_companies.rb
create mode 100644 db/migrate/20250929132305_add_company_to_contacts.rb
create mode 100644 enterprise/app/controllers/api/v1/accounts/companies_controller.rb
create mode 100644 enterprise/app/models/company.rb
create mode 100644 enterprise/app/models/enterprise/concerns/contact.rb
create mode 100644 enterprise/app/policies/company_policy.rb
create mode 100644 enterprise/app/views/api/v1/accounts/companies/_company.json.jbuilder
create mode 100644 enterprise/app/views/api/v1/accounts/companies/create.json.jbuilder
create mode 100644 enterprise/app/views/api/v1/accounts/companies/index.json.jbuilder
create mode 100644 enterprise/app/views/api/v1/accounts/companies/show.json.jbuilder
create mode 100644 enterprise/app/views/api/v1/accounts/companies/update.json.jbuilder
create mode 100644 spec/enterprise/controllers/api/v1/accounts/companies_controller_spec.rb
create mode 100644 spec/enterprise/models/company_spec.rb
create mode 100644 spec/enterprise/policies/company_policy_spec.rb
create mode 100644 spec/factories/companies.rb
diff --git a/app/models/contact.rb b/app/models/contact.rb
index a3570b2af..0dc92b51e 100644
--- a/app/models/contact.rb
+++ b/app/models/contact.rb
@@ -21,6 +21,7 @@
# created_at :datetime not null
# updated_at :datetime not null
# account_id :integer not null
+# company_id :bigint
#
# Indexes
#
@@ -28,6 +29,7 @@
# index_contacts_on_account_id_and_contact_type (account_id,contact_type)
# index_contacts_on_account_id_and_last_activity_at (account_id,last_activity_at DESC NULLS LAST)
# index_contacts_on_blocked (blocked)
+# index_contacts_on_company_id (company_id)
# index_contacts_on_lower_email_account_id (lower((email)::text), account_id)
# index_contacts_on_name_email_phone_number_identifier (name,email,phone_number,identifier) USING gin
# index_contacts_on_nonempty_fields (account_id,email,phone_number,identifier) WHERE (((email)::text <> ''::text) OR ((phone_number)::text <> ''::text) OR ((identifier)::text <> ''::text))
@@ -244,3 +246,4 @@ class Contact < ApplicationRecord
Rails.configuration.dispatcher.dispatch(CONTACT_DELETED, Time.zone.now, contact: self)
end
end
+Contact.include_mod_with('Concerns::Contact')
diff --git a/app/models/super_admin.rb b/app/models/super_admin.rb
index 316d60c7b..9bcee9b8a 100644
--- a/app/models/super_admin.rb
+++ b/app/models/super_admin.rb
@@ -19,7 +19,7 @@
# message_signature :text
# name :string not null
# otp_backup_codes :text
-# otp_required_for_login :boolean default(FALSE), not null
+# otp_required_for_login :boolean default(FALSE)
# otp_secret :string
# provider :string default("email"), not null
# pubsub_token :string
diff --git a/app/models/user.rb b/app/models/user.rb
index 4923d0a35..cc25357f6 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -19,7 +19,7 @@
# message_signature :text
# name :string not null
# otp_backup_codes :text
-# otp_required_for_login :boolean default(FALSE), not null
+# otp_required_for_login :boolean default(FALSE)
# otp_secret :string
# provider :string default("email"), not null
# pubsub_token :string
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 0c76f8beb..6afab9253 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -76,6 +76,9 @@ en:
invalid: Invalid email
phone_number:
invalid: should be in e164 format
+ companies:
+ domain:
+ invalid: must be a valid domain name
categories:
locale:
unique: should be unique in the category and portal
diff --git a/config/routes.rb b/config/routes.rb
index 757d20620..639c51da7 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -153,6 +153,7 @@ Rails.application.routes.draw do
end
end
+ resources :companies, only: [:index, :show, :create, :update, :destroy]
resources :contacts, only: [:index, :show, :update, :create, :destroy] do
collection do
get :active
diff --git a/db/migrate/20250929105219_create_companies.rb b/db/migrate/20250929105219_create_companies.rb
new file mode 100644
index 000000000..10fa415c1
--- /dev/null
+++ b/db/migrate/20250929105219_create_companies.rb
@@ -0,0 +1,14 @@
+class CreateCompanies < ActiveRecord::Migration[7.1]
+ def change
+ create_table :companies do |t|
+ t.string :name, null: false
+ t.string :domain
+ t.text :description
+ t.references :account, null: false
+
+ t.timestamps
+ end
+ add_index :companies, [:name, :account_id]
+ add_index :companies, [:domain, :account_id]
+ end
+end
diff --git a/db/migrate/20250929132305_add_company_to_contacts.rb b/db/migrate/20250929132305_add_company_to_contacts.rb
new file mode 100644
index 000000000..e79de34b8
--- /dev/null
+++ b/db/migrate/20250929132305_add_company_to_contacts.rb
@@ -0,0 +1,5 @@
+class AddCompanyToContacts < ActiveRecord::Migration[7.1]
+ def change
+ add_reference :contacts, :company, null: true
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index f31d05cc3..c0d539f6a 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -570,6 +570,18 @@ ActiveRecord::Schema[7.1].define(version: 2025_10_03_091242) do
t.index ["phone_number"], name: "index_channel_whatsapp_on_phone_number", unique: true
end
+ create_table "companies", force: :cascade do |t|
+ t.string "name", null: false
+ t.string "domain"
+ t.text "description"
+ t.bigint "account_id", null: false
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.index ["account_id"], name: "index_companies_on_account_id"
+ t.index ["domain", "account_id"], name: "index_companies_on_domain_and_account_id"
+ t.index ["name", "account_id"], name: "index_companies_on_name_and_account_id"
+ end
+
create_table "contact_inboxes", force: :cascade do |t|
t.bigint "contact_id"
t.bigint "inbox_id"
@@ -602,6 +614,7 @@ ActiveRecord::Schema[7.1].define(version: 2025_10_03_091242) do
t.string "location", default: ""
t.string "country_code", default: ""
t.boolean "blocked", default: false, null: false
+ t.bigint "company_id"
t.index "lower((email)::text), account_id", name: "index_contacts_on_lower_email_account_id"
t.index ["account_id", "contact_type"], name: "index_contacts_on_account_id_and_contact_type"
t.index ["account_id", "email", "phone_number", "identifier"], name: "index_contacts_on_nonempty_fields", where: "(((email)::text <> ''::text) OR ((phone_number)::text <> ''::text) OR ((identifier)::text <> ''::text))"
@@ -609,6 +622,7 @@ ActiveRecord::Schema[7.1].define(version: 2025_10_03_091242) do
t.index ["account_id"], name: "index_contacts_on_account_id"
t.index ["account_id"], name: "index_resolved_contact_account_id", where: "(((email)::text <> ''::text) OR ((phone_number)::text <> ''::text) OR ((identifier)::text <> ''::text))"
t.index ["blocked"], name: "index_contacts_on_blocked"
+ t.index ["company_id"], name: "index_contacts_on_company_id"
t.index ["email", "account_id"], name: "uniq_email_per_account_contact", unique: true
t.index ["identifier", "account_id"], name: "uniq_identifier_per_account_contact", unique: true
t.index ["name", "email", "phone_number", "identifier"], name: "index_contacts_on_name_email_phone_number_identifier", opclass: :gin_trgm_ops, using: :gin
diff --git a/enterprise/app/controllers/api/v1/accounts/companies_controller.rb b/enterprise/app/controllers/api/v1/accounts/companies_controller.rb
new file mode 100644
index 000000000..a33e4c6b2
--- /dev/null
+++ b/enterprise/app/controllers/api/v1/accounts/companies_controller.rb
@@ -0,0 +1,40 @@
+class Api::V1::Accounts::CompaniesController < Api::V1::Accounts::EnterpriseAccountsController
+ before_action :check_authorization
+ before_action :fetch_company, only: [:show, :update, :destroy]
+
+ def index
+ @companies = Current.account.companies.ordered_by_name
+ end
+
+ def show; end
+
+ def create
+ @company = Current.account.companies.build(company_params)
+ @company.save!
+ end
+
+ def update
+ @company.update!(company_params)
+ end
+
+ def destroy
+ @company.destroy!
+ head :ok
+ end
+
+ private
+
+ def check_authorization
+ raise Pundit::NotAuthorizedError unless ChatwootApp.enterprise?
+
+ authorize(Company)
+ end
+
+ def fetch_company
+ @company = Current.account.companies.find(params[:id])
+ end
+
+ def company_params
+ params.require(:company).permit(:name, :domain, :description, :avatar)
+ end
+end
diff --git a/enterprise/app/models/company.rb b/enterprise/app/models/company.rb
new file mode 100644
index 000000000..764cb2a9c
--- /dev/null
+++ b/enterprise/app/models/company.rb
@@ -0,0 +1,33 @@
+# == Schema Information
+#
+# Table name: companies
+#
+# id :bigint not null, primary key
+# description :text
+# domain :string
+# name :string not null
+# created_at :datetime not null
+# updated_at :datetime not null
+# account_id :bigint not null
+#
+# Indexes
+#
+# index_companies_on_account_id (account_id)
+# index_companies_on_domain_and_account_id (domain,account_id)
+# index_companies_on_name_and_account_id (name,account_id)
+#
+class Company < ApplicationRecord
+ include Avatarable
+ validates :account_id, presence: true
+ validates :name, presence: true, length: { maximum: Limits::COMPANY_NAME_LENGTH_LIMIT }
+ validates :domain, allow_blank: true, format: {
+ with: /\A[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?)+\z/,
+ message: I18n.t('errors.companies.domain.invalid')
+ }
+ validates :description, length: { maximum: Limits::COMPANY_DESCRIPTION_LENGTH_LIMIT }
+
+ belongs_to :account
+ has_many :contacts, dependent: :nullify
+
+ scope :ordered_by_name, -> { order(:name) }
+end
diff --git a/enterprise/app/models/enterprise/concerns/account.rb b/enterprise/app/models/enterprise/concerns/account.rb
index b82d84b0a..cae32e86c 100644
--- a/enterprise/app/models/enterprise/concerns/account.rb
+++ b/enterprise/app/models/enterprise/concerns/account.rb
@@ -13,6 +13,7 @@ module Enterprise::Concerns::Account
has_many :captain_custom_tools, dependent: :destroy_async, class_name: 'Captain::CustomTool'
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_one :saml_settings, dependent: :destroy_async, class_name: 'AccountSamlSettings'
diff --git a/enterprise/app/models/enterprise/concerns/contact.rb b/enterprise/app/models/enterprise/concerns/contact.rb
new file mode 100644
index 000000000..9139fc67e
--- /dev/null
+++ b/enterprise/app/models/enterprise/concerns/contact.rb
@@ -0,0 +1,6 @@
+module Enterprise::Concerns::Contact
+ extend ActiveSupport::Concern
+ included do
+ belongs_to :company, optional: true
+ end
+end
diff --git a/enterprise/app/policies/company_policy.rb b/enterprise/app/policies/company_policy.rb
new file mode 100644
index 000000000..1c252967c
--- /dev/null
+++ b/enterprise/app/policies/company_policy.rb
@@ -0,0 +1,21 @@
+class CompanyPolicy < ApplicationPolicy
+ def index?
+ true
+ end
+
+ def show?
+ true
+ end
+
+ def create?
+ true
+ end
+
+ def update?
+ true
+ end
+
+ def destroy?
+ @account_user.administrator?
+ end
+end
diff --git a/enterprise/app/views/api/v1/accounts/companies/_company.json.jbuilder b/enterprise/app/views/api/v1/accounts/companies/_company.json.jbuilder
new file mode 100644
index 000000000..71c4d3b9b
--- /dev/null
+++ b/enterprise/app/views/api/v1/accounts/companies/_company.json.jbuilder
@@ -0,0 +1,7 @@
+json.id company.id
+json.name company.name
+json.domain company.domain
+json.description company.description
+json.avatar_url company.avatar_url
+json.created_at company.created_at
+json.updated_at company.updated_at
diff --git a/enterprise/app/views/api/v1/accounts/companies/create.json.jbuilder b/enterprise/app/views/api/v1/accounts/companies/create.json.jbuilder
new file mode 100644
index 000000000..b3bc80cfd
--- /dev/null
+++ b/enterprise/app/views/api/v1/accounts/companies/create.json.jbuilder
@@ -0,0 +1,3 @@
+json.payload do
+ json.partial! 'company', company: @company
+end
diff --git a/enterprise/app/views/api/v1/accounts/companies/index.json.jbuilder b/enterprise/app/views/api/v1/accounts/companies/index.json.jbuilder
new file mode 100644
index 000000000..e68bd8543
--- /dev/null
+++ b/enterprise/app/views/api/v1/accounts/companies/index.json.jbuilder
@@ -0,0 +1,5 @@
+json.payload do
+ json.array! @companies do |company|
+ json.partial! 'company', company: company
+ end
+end
diff --git a/enterprise/app/views/api/v1/accounts/companies/show.json.jbuilder b/enterprise/app/views/api/v1/accounts/companies/show.json.jbuilder
new file mode 100644
index 000000000..b3bc80cfd
--- /dev/null
+++ b/enterprise/app/views/api/v1/accounts/companies/show.json.jbuilder
@@ -0,0 +1,3 @@
+json.payload do
+ json.partial! 'company', company: @company
+end
diff --git a/enterprise/app/views/api/v1/accounts/companies/update.json.jbuilder b/enterprise/app/views/api/v1/accounts/companies/update.json.jbuilder
new file mode 100644
index 000000000..b3bc80cfd
--- /dev/null
+++ b/enterprise/app/views/api/v1/accounts/companies/update.json.jbuilder
@@ -0,0 +1,3 @@
+json.payload do
+ json.partial! 'company', company: @company
+end
diff --git a/lib/limits.rb b/lib/limits.rb
index 5da178bf4..c0fc03806 100644
--- a/lib/limits.rb
+++ b/lib/limits.rb
@@ -6,6 +6,8 @@ module Limits
GREETING_MESSAGE_MAX_LENGTH = 10_000
CATEGORIES_PER_PAGE = 1000
AUTO_ASSIGNMENT_BULK_LIMIT = 100
+ COMPANY_NAME_LENGTH_LIMIT = 100
+ COMPANY_DESCRIPTION_LENGTH_LIMIT = 1000
MAX_CUSTOM_FILTERS_PER_USER = 1000
def self.conversation_message_per_minute_limit
diff --git a/spec/enterprise/controllers/api/v1/accounts/companies_controller_spec.rb b/spec/enterprise/controllers/api/v1/accounts/companies_controller_spec.rb
new file mode 100644
index 000000000..f62991ad1
--- /dev/null
+++ b/spec/enterprise/controllers/api/v1/accounts/companies_controller_spec.rb
@@ -0,0 +1,141 @@
+require 'rails_helper'
+
+RSpec.describe 'Companies API', type: :request do
+ let(:account) { create(:account) }
+
+ describe 'GET /api/v1/accounts/{account.id}/companies' do
+ context 'when it is an unauthenticated user' do
+ it 'returns unauthorized' do
+ get "/api/v1/accounts/#{account.id}/companies"
+ expect(response).to have_http_status(:unauthorized)
+ end
+ end
+
+ context 'when it is an authenticated user' do
+ let(:admin) { create(:user, account: account, role: :administrator) }
+ let!(:company1) { create(:company, name: 'Company 1', account: account) }
+ let!(:company2) { create(:company, account: account) }
+
+ it 'returns all companies' do
+ get "/api/v1/accounts/#{account.id}/companies",
+ headers: admin.create_new_auth_token,
+ as: :json
+ expect(response).to have_http_status(:success)
+ response_body = response.parsed_body
+ expect(response_body['payload'].size).to eq(2)
+ expect(response_body['payload'].map { |c| c['name'] }).to contain_exactly(company1.name, company2.name)
+ end
+ end
+ end
+
+ describe 'GET /api/v1/accounts/{account.id}/companies/{id}' do
+ context 'when it is an authenticated user' do
+ let(:admin) { create(:user, account: account, role: :administrator) }
+ let(:company) { create(:company, account: account) }
+
+ it 'returns the company' do
+ get "/api/v1/accounts/#{account.id}/companies/#{company.id}",
+ headers: admin.create_new_auth_token,
+ as: :json
+ expect(response).to have_http_status(:success)
+ response_body = response.parsed_body
+ expect(response_body['payload']['name']).to eq(company.name)
+ expect(response_body['payload']['id']).to eq(company.id)
+ end
+ end
+ end
+
+ describe 'POST /api/v1/accounts/{account.id}/companies' do
+ context 'when it is an authenticated user' do
+ let(:admin) { create(:user, account: account, role: :administrator) }
+ let(:valid_params) do
+ {
+ company: {
+ name: 'New Company',
+ domain: 'newcompany.com',
+ description: 'A new company'
+ }
+ }
+ end
+
+ it 'creates a new company' do
+ expect do
+ post "/api/v1/accounts/#{account.id}/companies",
+ params: valid_params,
+ headers: admin.create_new_auth_token,
+ as: :json
+ end.to change(Company, :count).by(1)
+
+ expect(response).to have_http_status(:success)
+ response_body = response.parsed_body
+ expect(response_body['payload']['name']).to eq('New Company')
+ expect(response_body['payload']['domain']).to eq('newcompany.com')
+ end
+
+ it 'returns error for invalid params' do
+ invalid_params = { company: { name: '' } }
+
+ post "/api/v1/accounts/#{account.id}/companies",
+ params: invalid_params,
+ headers: admin.create_new_auth_token,
+ as: :json
+ expect(response).to have_http_status(:unprocessable_entity)
+ end
+ end
+ end
+
+ describe 'PATCH /api/v1/accounts/{account.id}/companies/{id}' do
+ context 'when it is an authenticated user' do
+ let(:admin) { create(:user, account: account, role: :administrator) }
+ let(:company) { create(:company, account: account) }
+ let(:update_params) do
+ {
+ company: {
+ name: 'Updated Company Name',
+ domain: 'updated.com'
+ }
+ }
+ end
+
+ it 'updates the company' do
+ patch "/api/v1/accounts/#{account.id}/companies/#{company.id}",
+ params: update_params,
+ headers: admin.create_new_auth_token,
+ as: :json
+ expect(response).to have_http_status(:success)
+ response_body = response.parsed_body
+ expect(response_body['payload']['name']).to eq('Updated Company Name')
+ expect(response_body['payload']['domain']).to eq('updated.com')
+ end
+ end
+ end
+
+ describe 'DELETE /api/v1/accounts/{account.id}/companies/{id}' do
+ context 'when it is an authenticated administrator' do
+ let(:admin) { create(:user, account: account, role: :administrator) }
+ let(:company) { create(:company, account: account) }
+
+ it 'deletes the company' do
+ company
+ expect do
+ delete "/api/v1/accounts/#{account.id}/companies/#{company.id}",
+ headers: admin.create_new_auth_token,
+ as: :json
+ end.to change(Company, :count).by(-1)
+ expect(response).to have_http_status(:ok)
+ end
+ end
+
+ context 'when it is a regular agent' do
+ let(:agent) { create(:user, account: account, role: :agent) }
+ let(:company) { create(:company, account: account) }
+
+ it 'returns unauthorized' do
+ delete "/api/v1/accounts/#{account.id}/companies/#{company.id}",
+ headers: agent.create_new_auth_token,
+ as: :json
+ expect(response).to have_http_status(:unauthorized)
+ end
+ end
+ end
+end
diff --git a/spec/enterprise/models/company_spec.rb b/spec/enterprise/models/company_spec.rb
new file mode 100644
index 000000000..820e6ee7d
--- /dev/null
+++ b/spec/enterprise/models/company_spec.rb
@@ -0,0 +1,38 @@
+require 'rails_helper'
+
+RSpec.describe Company, type: :model do
+ context 'with validations' do
+ it { is_expected.to validate_presence_of(:account_id) }
+ it { is_expected.to validate_presence_of(:name) }
+ it { is_expected.to validate_length_of(:name).is_at_most(100) }
+ it { is_expected.to validate_length_of(:description).is_at_most(1000) }
+
+ describe 'domain validation' do
+ it { is_expected.to allow_value('example.com').for(:domain) }
+ it { is_expected.to allow_value('sub.example.com').for(:domain) }
+ it { is_expected.to allow_value('').for(:domain) }
+ it { is_expected.to allow_value(nil).for(:domain) }
+ it { is_expected.not_to allow_value('invalid-domain').for(:domain) }
+ it { is_expected.not_to allow_value('.example.com').for(:domain) }
+ end
+ end
+
+ context 'with associations' do
+ it { is_expected.to belong_to(:account) }
+ it { is_expected.to have_many(:contacts).dependent(:nullify) }
+ end
+
+ describe 'scopes' do
+ let(:account) { create(:account) }
+ let!(:company_b) { create(:company, name: 'B Company', account: account) }
+ let!(:company_a) { create(:company, name: 'A Company', account: account) }
+ let!(:company_c) { create(:company, name: 'C Company', account: account) }
+
+ describe '.ordered_by_name' do
+ it 'orders companies by name alphabetically' do
+ companies = described_class.where(account: account).ordered_by_name
+ expect(companies.map(&:name)).to eq([company_a.name, company_b.name, company_c.name])
+ end
+ end
+ end
+end
diff --git a/spec/enterprise/policies/company_policy_spec.rb b/spec/enterprise/policies/company_policy_spec.rb
new file mode 100644
index 000000000..9f7d9f0cc
--- /dev/null
+++ b/spec/enterprise/policies/company_policy_spec.rb
@@ -0,0 +1,33 @@
+require 'rails_helper'
+
+RSpec.describe CompanyPolicy, type: :policy do
+ subject(:company_policy) { described_class }
+
+ let(:account) { create(:account) }
+ let(:administrator) { create(:user, :administrator, account: account) }
+ let(:agent) { create(:user, account: account) }
+ let(:company) { create(:company, account: account) }
+
+ let(:administrator_context) { { user: administrator, account: account, account_user: account.account_users.first } }
+ let(:agent_context) { { user: agent, account: account, account_user: account.account_users.first } }
+
+ permissions :index?, :show?, :create?, :update? do
+ context 'when administrator' do
+ it { expect(company_policy).to permit(administrator_context, company) }
+ end
+
+ context 'when agent' do
+ it { expect(company_policy).to permit(agent_context, company) }
+ end
+ end
+
+ permissions :destroy? do
+ context 'when administrator' do
+ it { expect(company_policy).to permit(administrator_context, company) }
+ end
+
+ context 'when agent' do
+ it { expect(company_policy).not_to permit(agent_context, company) }
+ end
+ end
+end
diff --git a/spec/factories/companies.rb b/spec/factories/companies.rb
new file mode 100644
index 000000000..bdf7e9e9f
--- /dev/null
+++ b/spec/factories/companies.rb
@@ -0,0 +1,20 @@
+FactoryBot.define do
+ factory :company do
+ sequence(:name) { |n| "Company #{n}" }
+ sequence(:domain) { |n| "company#{n}.com" }
+ description { 'A sample company description' }
+ account
+
+ trait :without_domain do
+ domain { nil }
+ end
+
+ trait :with_avatar do
+ avatar { fixture_file_upload(Rails.root.join('spec/assets/avatar.png'), 'image/png') }
+ end
+
+ trait :with_long_description do
+ description { 'A' * 500 }
+ end
+ end
+end
From 7c5bb343c67ae371ee47eeb4fadb354794a0505d Mon Sep 17 00:00:00 2001
From: Vishnu Narayanan
Date: Thu, 9 Oct 2025 16:04:50 +0530
Subject: [PATCH 170/182] fix: Optimize message reindexing to reduce sidekiq
job creation (#12618)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Changes searchkick callback behavior to check `should_index?` before
creating reindex jobs, preventing unnecessary job creation for messages
that don't need indexing (activity messages, unpaid accounts, etc.).
Previously, `callbacks: :async` created reindex jobs for all messages
(~5,100/min or 7.3M/day in production), which were then filtered by
`should_index?` inside the job worker - resulting in 98% wasted jobs,
Redis memory pressure, and avoidable p0 alerts.
Now, `should_index?` is checked before job creation via `after_commit`
callback, reducing job creation to actual incoming/outgoing messages
from paid accounts.
Changes:
- Disable automatic searchkick callbacks
- Add manual `after_commit` callback with `should_index?` condition
- Add specs to verify callback behavior
Expected impact:
- 98% reduction in sidekiq job creation (~7.3M → ~150K jobs/day)
- Reduced redis memory usage
- Same async indexing behavior for eligible messages
---
app/models/message.rb | 7 ++++-
spec/models/message_spec.rb | 56 +++++++++++++++++++++++++++++++++++++
2 files changed, 62 insertions(+), 1 deletion(-)
diff --git a/app/models/message.rb b/app/models/message.rb
index dbab19df3..2079e31a9 100644
--- a/app/models/message.rb
+++ b/app/models/message.rb
@@ -39,7 +39,7 @@
#
class Message < ApplicationRecord
- searchkick callbacks: :async if ChatwootApp.advanced_search_allowed?
+ searchkick callbacks: false if ChatwootApp.advanced_search_allowed?
include MessageFilterHelpers
include Liquidable
@@ -135,6 +135,7 @@ class Message < ApplicationRecord
after_create_commit :execute_after_create_commit_callbacks
after_update_commit :dispatch_update_event
+ after_commit :reindex_for_search, if: :should_index?, on: [:create, :update]
def channel_token
@token ||= inbox.channel.try(:page_access_token)
@@ -436,6 +437,10 @@ class Message < ApplicationRecord
conversation.update_columns(last_activity_at: created_at)
# rubocop:enable Rails/SkipsModelValidations
end
+
+ def reindex_for_search
+ reindex(mode: :async)
+ end
end
Message.prepend_mod_with('Message')
diff --git a/spec/models/message_spec.rb b/spec/models/message_spec.rb
index a0bd48e39..c5e080677 100644
--- a/spec/models/message_spec.rb
+++ b/spec/models/message_spec.rb
@@ -4,6 +4,12 @@ require 'rails_helper'
require Rails.root.join 'spec/models/concerns/liquidable_shared.rb'
RSpec.describe Message do
+ before do
+ # rubocop:disable RSpec/AnyInstance
+ allow_any_instance_of(described_class).to receive(:reindex_for_search).and_return(true)
+ # rubocop:enable RSpec/AnyInstance
+ end
+
context 'with validations' do
it { is_expected.to validate_presence_of(:inbox_id) }
it { is_expected.to validate_presence_of(:conversation_id) }
@@ -678,4 +684,54 @@ RSpec.describe Message do
end
end
end
+
+ describe '#reindex_for_search callback' do
+ let(:account) { create(:account) }
+ let(:conversation) { create(:conversation, account: account) }
+
+ before do
+ allow(ChatwootApp).to receive(:advanced_search_allowed?).and_return(true)
+ account.enable_features('advanced_search_indexing')
+ end
+
+ context 'when message should be indexed' do
+ it 'calls reindex_for_search for incoming message on create' do
+ message = build(:message, conversation: conversation, account: account, message_type: :incoming)
+ expect(message).to receive(:reindex_for_search)
+ message.save!
+ end
+
+ it 'calls reindex_for_search for outgoing message on update' do
+ # rubocop:disable RSpec/AnyInstance
+ allow_any_instance_of(described_class).to receive(:reindex_for_search).and_return(true)
+ # rubocop:enable RSpec/AnyInstance
+ message = create(:message, conversation: conversation, account: account, message_type: :outgoing)
+ expect(message).to receive(:reindex_for_search).and_return(true)
+ message.update!(content: 'Updated content')
+ end
+ end
+
+ context 'when message should not be indexed' do
+ it 'does not call reindex_for_search for activity message' do
+ message = build(:message, conversation: conversation, account: account, message_type: :activity)
+ expect(message).not_to receive(:reindex_for_search)
+ message.save!
+ end
+
+ it 'does not call reindex_for_search for unpaid account on cloud' do
+ allow(ChatwootApp).to receive(:chatwoot_cloud?).and_return(true)
+ account.disable_features('advanced_search_indexing')
+ message = build(:message, conversation: conversation, account: account, message_type: :incoming)
+ expect(message).not_to receive(:reindex_for_search)
+ message.save!
+ end
+
+ it 'does not call reindex_for_search when advanced search is not allowed' do
+ allow(ChatwootApp).to receive(:advanced_search_allowed?).and_return(false)
+ message = build(:message, conversation: conversation, account: account, message_type: :incoming)
+ expect(message).not_to receive(:reindex_for_search)
+ message.save!
+ end
+ end
+ end
end
From f89ed562586a27dfc13877c12ac519a8b26245ca Mon Sep 17 00:00:00 2001
From: Shivam Mishra
Date: Thu, 9 Oct 2025 16:50:28 +0530
Subject: [PATCH 171/182] feat: update rack version (#12628)
Fixes CI failing at bundle audit for a [rack
vulnerability](https://github.com/rack/rack/security/advisories/GHSA-wpv5-97wm-hp9c)
---
Gemfile.lock | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Gemfile.lock b/Gemfile.lock
index 283cf3b83..18eeffc3b 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -644,7 +644,7 @@ GEM
activesupport (>= 3.0.0)
raabro (1.4.0)
racc (1.8.1)
- rack (3.2.0)
+ rack (3.2.2)
rack-attack (6.7.0)
rack (>= 1.0, < 4)
rack-contrib (2.5.0)
From 6cc69f444b83d4a0db11f14b8ff1ee75510daab8 Mon Sep 17 00:00:00 2001
From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Date: Thu, 9 Oct 2025 16:51:25 +0530
Subject: [PATCH 172/182] chore: Include 11:59 PM slot in business hours
display (#12610)
---
.../settings/inbox/components/BusinessDay.vue | 13 +++--
.../settings/inbox/helpers/businessHour.js | 8 +++
.../inbox/helpers/specs/businessHour.spec.js | 58 ++++++++++++++++++-
3 files changed, 70 insertions(+), 9 deletions(-)
diff --git a/app/javascript/dashboard/routes/dashboard/settings/inbox/components/BusinessDay.vue b/app/javascript/dashboard/routes/dashboard/settings/inbox/components/BusinessDay.vue
index 14ba5b371..b90ea92ad 100644
--- a/app/javascript/dashboard/routes/dashboard/settings/inbox/components/BusinessDay.vue
+++ b/app/javascript/dashboard/routes/dashboard/settings/inbox/components/BusinessDay.vue
@@ -96,11 +96,12 @@ export default {
return parse(this.toTime, 'hh:mm a', new Date());
},
totalHours() {
- if (this.timeSlot.openAllDay) {
- return 24;
- }
- const totalHours = differenceInMinutes(this.toDate, this.fromDate) / 60;
- return totalHours;
+ if (this.timeSlot.openAllDay) return '24h';
+
+ const totalMinutes = differenceInMinutes(this.toDate, this.fromDate);
+ const [h, m] = [Math.floor(totalMinutes / 60), totalMinutes % 60];
+
+ return [h && `${h}h`, m && `${m}m`].filter(Boolean).join(' ') || '0m';
},
hasError() {
return !this.timeSlot.valid;
@@ -211,7 +212,7 @@ export default {
v-if="isDayEnabled && !hasError"
class="label bg-n-brand/10 dark:bg-n-brand/30 text-n-blue-text text-xs inline-block px-2 py-1 rounded-lg cursor-default whitespace-nowrap"
>
- {{ totalHours }} {{ $t('INBOX_MGMT.BUSINESS_HOURS.DAY.HOURS') }}
+ {{ totalHours }}
diff --git a/app/javascript/dashboard/routes/dashboard/settings/inbox/helpers/businessHour.js b/app/javascript/dashboard/routes/dashboard/settings/inbox/helpers/businessHour.js
index 69089bf3c..b73368035 100644
--- a/app/javascript/dashboard/routes/dashboard/settings/inbox/helpers/businessHour.js
+++ b/app/javascript/dashboard/routes/dashboard/settings/inbox/helpers/businessHour.js
@@ -53,6 +53,7 @@ export const generateTimeSlots = (step = 15) => {
Generates a list of time strings from 12:00 AM to next 24 hours. Each new string
will be generated by adding `step` minutes to the previous one.
The list is generated by starting with a random day and adding step minutes till end of the same day.
+ Always includes 11:59 PM as the final slot to complete the day.
*/
const date = new Date(1970, 1, 1);
const slots = [];
@@ -66,6 +67,13 @@ export const generateTimeSlots = (step = 15) => {
);
date.setMinutes(date.getMinutes() + step);
}
+
+ // Always add 11:59 PM as the final slot if it's not already included
+ const lastSlot = '11:59 PM';
+ if (!slots.includes(lastSlot)) {
+ slots.push(lastSlot);
+ }
+
return slots;
};
diff --git a/app/javascript/dashboard/routes/dashboard/settings/inbox/helpers/specs/businessHour.spec.js b/app/javascript/dashboard/routes/dashboard/settings/inbox/helpers/specs/businessHour.spec.js
index 077337ae6..c9cfa2d24 100644
--- a/app/javascript/dashboard/routes/dashboard/settings/inbox/helpers/specs/businessHour.spec.js
+++ b/app/javascript/dashboard/routes/dashboard/settings/inbox/helpers/specs/businessHour.spec.js
@@ -7,10 +7,19 @@ import {
} from '../businessHour';
describe('#generateTimeSlots', () => {
- it('returns correct number of time slots', () => {
- expect(generateTimeSlots(15).length).toStrictEqual((60 / 15) * 24);
+ it('returns correct number of time slots for 15-minute intervals', () => {
+ const slots = generateTimeSlots(15);
+ // 24 hours * 4 slots per hour + 1 for 11:59 PM = 97 slots
+ expect(slots.length).toStrictEqual(97);
});
- it('returns correct time slots', () => {
+
+ it('returns correct number of time slots for 30-minute intervals', () => {
+ const slots = generateTimeSlots(30);
+ // 24 hours * 2 slots per hour + 1 for 11:59 PM = 49 slots
+ expect(slots.length).toStrictEqual(49);
+ });
+
+ it('returns correct time slots for 4-hour intervals', () => {
expect(generateTimeSlots(240)).toStrictEqual([
'12:00 AM',
'04:00 AM',
@@ -18,8 +27,51 @@ describe('#generateTimeSlots', () => {
'12:00 PM',
'04:00 PM',
'08:00 PM',
+ '11:59 PM',
]);
});
+
+ it('always starts with 12:00 AM', () => {
+ expect(generateTimeSlots(15)[0]).toStrictEqual('12:00 AM');
+ expect(generateTimeSlots(30)[0]).toStrictEqual('12:00 AM');
+ expect(generateTimeSlots(60)[0]).toStrictEqual('12:00 AM');
+ });
+
+ it('always ends with 11:59 PM', () => {
+ const slots15 = generateTimeSlots(15);
+ const slots30 = generateTimeSlots(30);
+ const slots60 = generateTimeSlots(60);
+
+ expect(slots15[slots15.length - 1]).toStrictEqual('11:59 PM');
+ expect(slots30[slots30.length - 1]).toStrictEqual('11:59 PM');
+ expect(slots60[slots60.length - 1]).toStrictEqual('11:59 PM');
+ });
+
+ it('includes 11:59 PM even when it would not be in regular intervals', () => {
+ const slots = generateTimeSlots(30);
+ expect(slots).toContain('11:59 PM');
+ expect(slots).toContain('11:30 PM'); // Regular interval
+ });
+
+ it('does not duplicate 11:59 PM if it already exists in regular intervals', () => {
+ // Test with a step that would naturally include 11:59 PM
+ const slots = generateTimeSlots(1); // 1-minute intervals
+ const count11_59 = slots.filter(slot => slot === '11:59 PM').length;
+ expect(count11_59).toStrictEqual(1);
+ });
+
+ it('generates correct time format', () => {
+ const slots = generateTimeSlots(60);
+ expect(slots).toContain('01:00 AM');
+ expect(slots).toContain('12:00 PM');
+ expect(slots).toContain('01:00 PM');
+ expect(slots).toContain('11:00 PM');
+ });
+
+ it('handles edge case with very large step', () => {
+ const slots = generateTimeSlots(1440); // 24 hours
+ expect(slots).toStrictEqual(['12:00 AM', '11:59 PM']);
+ });
});
describe('#getTime', () => {
From 6829328182df37a66e4afe5cff50bf60ab8b87d2 Mon Sep 17 00:00:00 2001
From: Shivam Mishra
Date: Thu, 9 Oct 2025 18:19:20 +0530
Subject: [PATCH 173/182] fix(filters): correct null matching logic [CW-5741]
(#12627)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This PR fixes a bug came from assuming the old null check only mattered
for the `is_not_present` filter.
The fix keeps `not_equal_to` working but lets each operator decide what
to do with `null`. Presence filters look at a shared `isNullish` flag,
text filters still rely on `contains`, and date filters skip
conversations with no timestamp. The new spec covers the null-assignee
scenario for both `equal_to` and `not_equal_to` so we don’t miss this
again.
---
.../conversations/helpers/filterHelpers.js | 19 +++--
.../helpers/specs/filterHelpers.spec.js | 78 +++++++++++++++++++
2 files changed, 90 insertions(+), 7 deletions(-)
diff --git a/app/javascript/dashboard/store/modules/conversations/helpers/filterHelpers.js b/app/javascript/dashboard/store/modules/conversations/helpers/filterHelpers.js
index 3d627e3ef..96f4a0123 100644
--- a/app/javascript/dashboard/store/modules/conversations/helpers/filterHelpers.js
+++ b/app/javascript/dashboard/store/modules/conversations/helpers/filterHelpers.js
@@ -154,7 +154,10 @@ const equalTo = (filterValue, conversationValue) => {
* It only works with string values and returns false for non-string types.
*/
const contains = (filterValue, conversationValue) => {
- if (typeof conversationValue === 'string') {
+ if (
+ typeof conversationValue === 'string' &&
+ typeof filterValue === 'string'
+ ) {
return conversationValue.toLowerCase().includes(filterValue.toLowerCase());
}
return false;
@@ -190,10 +193,8 @@ const compareDates = (conversationValue, filterValue, compareFn) => {
const matchesCondition = (conversationValue, filter) => {
const { filter_operator: filterOperator, values } = filter;
- // Handle null/undefined values
- if (conversationValue === null || conversationValue === undefined) {
- return filterOperator === 'is_not_present';
- }
+ const isNullish =
+ conversationValue === null || conversationValue === undefined;
const filterValue = Array.isArray(values)
? values.map(resolveValue)
@@ -213,10 +214,10 @@ const matchesCondition = (conversationValue, filter) => {
return !contains(filterValue, conversationValue);
case 'is_present':
- return true; // We already handled null/undefined above
+ return !isNullish;
case 'is_not_present':
- return false; // We already handled null/undefined above
+ return isNullish;
case 'is_greater_than':
return compareDates(conversationValue, filterValue, (a, b) => a > b);
@@ -225,6 +226,10 @@ const matchesCondition = (conversationValue, filter) => {
return compareDates(conversationValue, filterValue, (a, b) => a < b);
case 'days_before': {
+ if (isNullish) {
+ return false;
+ }
+
const today = new Date();
const daysInMilliseconds = filterValue * 24 * 60 * 60 * 1000;
const targetDate = new Date(today.getTime() - daysInMilliseconds);
diff --git a/app/javascript/dashboard/store/modules/conversations/helpers/specs/filterHelpers.spec.js b/app/javascript/dashboard/store/modules/conversations/helpers/specs/filterHelpers.spec.js
index 096481c69..db1017407 100644
--- a/app/javascript/dashboard/store/modules/conversations/helpers/specs/filterHelpers.spec.js
+++ b/app/javascript/dashboard/store/modules/conversations/helpers/specs/filterHelpers.spec.js
@@ -192,6 +192,32 @@ describe('filterHelpers', () => {
expect(matchesFilters(conversation, filters)).toBe(true);
});
+ it('should not match conversation with equal_to operator when assignee is null', () => {
+ const conversation = { meta: { assignee: null } };
+ const filters = [
+ {
+ attribute_key: 'assignee_id',
+ filter_operator: 'equal_to',
+ values: { id: 1, name: 'John Doe' },
+ query_operator: 'and',
+ },
+ ];
+ expect(matchesFilters(conversation, filters)).toBe(false);
+ });
+
+ it('should match conversation with not_equal_to operator when assignee is null', () => {
+ const conversation = { meta: { assignee: null } };
+ const filters = [
+ {
+ attribute_key: 'assignee_id',
+ filter_operator: 'not_equal_to',
+ values: { id: 1, name: 'John Doe' },
+ query_operator: 'and',
+ },
+ ];
+ expect(matchesFilters(conversation, filters)).toBe(true);
+ });
+
it('should match conversation with is_not_present operator for assignee_id', () => {
const conversation = { meta: { assignee: null } };
const filters = [
@@ -285,6 +311,58 @@ describe('filterHelpers', () => {
expect(matchesFilters(conversation, filters)).toBe(false);
});
+ it('should not match contains operator when display_id is null', () => {
+ const conversation = { id: null };
+ const filters = [
+ {
+ attribute_key: 'display_id',
+ filter_operator: 'contains',
+ values: '234',
+ query_operator: 'and',
+ },
+ ];
+ expect(matchesFilters(conversation, filters)).toBe(false);
+ });
+
+ it('should not match contains operator when filter value is null', () => {
+ const conversation = { id: '12345' };
+ const filters = [
+ {
+ attribute_key: 'display_id',
+ filter_operator: 'contains',
+ values: null,
+ query_operator: 'and',
+ },
+ ];
+ expect(matchesFilters(conversation, filters)).toBe(false);
+ });
+
+ it('should match does_not_contain operator when display_id is null', () => {
+ const conversation = { id: null };
+ const filters = [
+ {
+ attribute_key: 'display_id',
+ filter_operator: 'does_not_contain',
+ values: '234',
+ query_operator: 'and',
+ },
+ ];
+ expect(matchesFilters(conversation, filters)).toBe(true);
+ });
+
+ it('should match does_not_contain operator when filter value is null', () => {
+ const conversation = { id: '12345' };
+ const filters = [
+ {
+ attribute_key: 'display_id',
+ filter_operator: 'does_not_contain',
+ values: null,
+ query_operator: 'and',
+ },
+ ];
+ expect(matchesFilters(conversation, filters)).toBe(true);
+ });
+
it('should match conversation with does_not_contain operator when value is not present', () => {
const conversation = { id: '12345' };
const filters = [
From d8da1f5bf30a6485f644eee3f7ff056717ad23b8 Mon Sep 17 00:00:00 2001
From: Muhsin Keloth
Date: Thu, 9 Oct 2025 21:05:53 +0530
Subject: [PATCH 174/182] fix: Handle video file types in Slack file shares
(#12630)
Fixes https://linear.app/chatwoot/issue/CW-5752/fix-nomethoderror-when-processing-video-files-in-slack-integration
#### Problem
When users shared video files (like MP4) through Slack, the `file_type`
method in `SlackMessageHelper` would return `nil` for unsupported file
types. This caused a `NoMethodError (undefined method 'to_sym' for nil)`
when the attachment was being processed, as the system expected a symbol
value for the `file_type` attribute.
#### Solution
- Added video file type support in the `file_type` method case statement
- Added `else` clause to default unknown file types to `:file` instead
of returning `nil`
- This ensures `file_type` always returns a symbol, preventing the
`to_sym` error
---
lib/integrations/slack/slack_message_helper.rb | 4 +++-
.../slack/incoming_message_builder_spec.rb | 13 +++++++++++++
2 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/lib/integrations/slack/slack_message_helper.rb b/lib/integrations/slack/slack_message_helper.rb
index 52ec4caad..0ee328fb3 100644
--- a/lib/integrations/slack/slack_message_helper.rb
+++ b/lib/integrations/slack/slack_message_helper.rb
@@ -70,7 +70,9 @@ module Integrations::Slack::SlackMessageHelper
case attachment[:filetype]
when 'png', 'jpeg', 'gif', 'bmp', 'tiff', 'jpg'
:image
- when 'pdf'
+ when 'mp4', 'avi', 'mov', 'wmv', 'flv', 'webm'
+ :video
+ else
:file
end
end
diff --git a/spec/lib/integrations/slack/incoming_message_builder_spec.rb b/spec/lib/integrations/slack/incoming_message_builder_spec.rb
index 608324e8f..2ce206489 100644
--- a/spec/lib/integrations/slack/incoming_message_builder_spec.rb
+++ b/spec/lib/integrations/slack/incoming_message_builder_spec.rb
@@ -157,6 +157,19 @@ describe Integrations::Slack::IncomingMessageBuilder do
expect(conversation.messages.count).to eql(messages_count)
end
+
+ it 'handles different file types correctly' do
+ expect(hook).not_to be_nil
+ video_attachment_params = message_with_attachments.deep_dup
+ video_attachment_params[:event][:files][0][:filetype] = 'mp4'
+ video_attachment_params[:event][:files][0][:mimetype] = 'video/mp4'
+
+ builder = described_class.new(video_attachment_params)
+ allow(builder).to receive(:sender).and_return(nil)
+
+ expect { builder.perform }.not_to raise_error
+ expect(conversation.messages.last.attachments).to be_any
+ end
end
context 'when link shared' do
From cb65d615eaa7a20acfc6a29783a82a35c82faae1 Mon Sep 17 00:00:00 2001
From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Date: Thu, 9 Oct 2025 23:27:30 +0530
Subject: [PATCH 175/182] chore: Add auto-refresh and self-hosted redirect
logic to the billing page (#12615)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
# Pull Request Template
## Description
This PR includes billing page improvements with the following updates:
### Self-hosted Users
* Automatically redirected to the dashboard when accessing the billing
page.
### Cloud Users – No Billing Plan (First Visit)
* Shows a loading spinner with the `Your billing account is being
configured. Please refresh the page and try again.` message.
* Automatically refreshes the page after 5 seconds to check for billing
setup.
### Cloud Users – No Billing Plan (After Refresh)
* Prevents infinite refresh loops using `sessionStorage` tracking.
* Displays the standard `Your billing account is being configured.
Please refresh the page and try again.` message without further refresh
attempts.
* Cleans up session flags for future visits.
### Cloud Users – With Billing Plan
* Displays the existing billing page normally with no refresh or
redirection logic.
Fixes
https://linear.app/chatwoot/issue/CW-5559/your-billing-page-is-being-set-up-message-on-billing-page-is-confusing
## Type of change
- [x] New feature (non-breaking change which adds functionality)
## How Has This Been Tested?
### Loom video
https://www.loom.com/share/d0ea13d6b90b4ab1acbc581b524f6382?sid=d3dd19f3-85aa-4127-9233-7eecb1be0884
## 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
---
.../dashboard/settings/billing/Index.vue | 61 ++++++++++++++++---
1 file changed, 54 insertions(+), 7 deletions(-)
diff --git a/app/javascript/dashboard/routes/dashboard/settings/billing/Index.vue b/app/javascript/dashboard/routes/dashboard/settings/billing/Index.vue
index fc3905014..8ba3d69a9 100644
--- a/app/javascript/dashboard/routes/dashboard/settings/billing/Index.vue
+++ b/app/javascript/dashboard/routes/dashboard/settings/billing/Index.vue
@@ -1,9 +1,11 @@
From 610495123eb217ea766802b5243093599e95b995 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sat, 11 Oct 2025 17:05:38 +0530
Subject: [PATCH 176/182] chore(deps): bump rack from 3.2.2 to 3.2.3 (#12642)
Bumps rack from 3.2.2 to 3.2.3.
---
Gemfile.lock | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Gemfile.lock b/Gemfile.lock
index 18eeffc3b..80a78c6b6 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -644,7 +644,7 @@ GEM
activesupport (>= 3.0.0)
raabro (1.4.0)
racc (1.8.1)
- rack (3.2.2)
+ rack (3.2.3)
rack-attack (6.7.0)
rack (>= 1.0, < 4)
rack-contrib (2.5.0)
From cdd3b73fc9e9cd15785446025d78be839aa3534c Mon Sep 17 00:00:00 2001
From: Karim <58488518+KarimNajul@users.noreply.github.com>
Date: Mon, 13 Oct 2025 02:37:07 -0300
Subject: [PATCH 177/182] fix: Duplicate contacts creating for Argentina
numbers (#11173)
---
.../incoming_message_service_helpers.rb | 9 ++++
.../argentina_phone_normalizer.rb | 18 +++++++
.../phone_number_normalization_service.rb | 5 +-
.../whatsapp/incoming_message_service_spec.rb | 52 +++++++++++++++++++
4 files changed, 82 insertions(+), 2 deletions(-)
create mode 100644 app/services/whatsapp/phone_normalizers/argentina_phone_normalizer.rb
diff --git a/app/services/whatsapp/incoming_message_service_helpers.rb b/app/services/whatsapp/incoming_message_service_helpers.rb
index e40dc408f..705babbba 100644
--- a/app/services/whatsapp/incoming_message_service_helpers.rb
+++ b/app/services/whatsapp/incoming_message_service_helpers.rb
@@ -47,6 +47,15 @@ module Whatsapp::IncomingMessageServiceHelpers
%w[reaction ephemeral unsupported request_welcome].include?(message_type)
end
+ def argentina_phone_number?(phone_number)
+ phone_number.match(/^54/)
+ end
+
+ def normalised_argentina_mobil_number(phone_number)
+ # Remove 9 before country code
+ phone_number.sub(/^549/, '54')
+ end
+
def processed_waid(waid)
Whatsapp::PhoneNumberNormalizationService.new(inbox).normalize_and_find_contact(waid)
end
diff --git a/app/services/whatsapp/phone_normalizers/argentina_phone_normalizer.rb b/app/services/whatsapp/phone_normalizers/argentina_phone_normalizer.rb
new file mode 100644
index 000000000..109a0683f
--- /dev/null
+++ b/app/services/whatsapp/phone_normalizers/argentina_phone_normalizer.rb
@@ -0,0 +1,18 @@
+# Handles Argentina phone number normalization
+#
+# Argentina phone numbers can appear with or without "9" after country code
+# This normalizer removes the "9" when present to create consistent format: 54 + area + number
+class Whatsapp::PhoneNormalizers::ArgentinaPhoneNormalizer < Whatsapp::PhoneNormalizers::BasePhoneNormalizer
+ def normalize(waid)
+ return waid unless handles_country?(waid)
+
+ # Remove "9" after country code if present (549 → 54)
+ waid.sub(/^549/, '54')
+ end
+
+ private
+
+ def country_code_pattern
+ /^54/
+ end
+end
diff --git a/app/services/whatsapp/phone_number_normalization_service.rb b/app/services/whatsapp/phone_number_normalization_service.rb
index b8e416794..cd10db0d0 100644
--- a/app/services/whatsapp/phone_number_normalization_service.rb
+++ b/app/services/whatsapp/phone_number_normalization_service.rb
@@ -1,5 +1,5 @@
# Service to handle phone number normalization for WhatsApp messages
-# Currently supports Brazil phone number format variations
+# Currently supports Brazil and Argentina phone number format variations
# Designed to be extensible for additional countries in future PRs
#
# Usage: Whatsapp::PhoneNumberNormalizationService.new(inbox).normalize_and_find_contact(waid)
@@ -34,6 +34,7 @@ class Whatsapp::PhoneNumberNormalizationService
end
NORMALIZERS = [
- Whatsapp::PhoneNormalizers::BrazilPhoneNormalizer
+ Whatsapp::PhoneNormalizers::BrazilPhoneNormalizer,
+ Whatsapp::PhoneNormalizers::ArgentinaPhoneNormalizer
].freeze
end
diff --git a/spec/services/whatsapp/incoming_message_service_spec.rb b/spec/services/whatsapp/incoming_message_service_spec.rb
index ede1ba824..6c23e9b71 100644
--- a/spec/services/whatsapp/incoming_message_service_spec.rb
+++ b/spec/services/whatsapp/incoming_message_service_spec.rb
@@ -341,6 +341,58 @@ describe Whatsapp::IncomingMessageService do
end
end
+ describe 'When the incoming waid is an Argentine number with 9 after country code' do
+ let(:wa_id) { '5491123456789' }
+
+ it 'creates appropriate conversations, message and contacts if contact does not exist' do
+ described_class.new(inbox: whatsapp_channel.inbox, params: params).perform
+ expect(whatsapp_channel.inbox.conversations.count).not_to eq(0)
+ expect(Contact.all.first.name).to eq('Sojan Jose')
+ expect(whatsapp_channel.inbox.messages.first.content).to eq('Test')
+ expect(whatsapp_channel.inbox.contact_inboxes.first.source_id).to eq(wa_id)
+ end
+
+ it 'appends to existing contact if contact inbox exists with normalized format' do
+ # Normalized format removes the 9 after country code
+ normalized_wa_id = '541123456789'
+ contact_inbox = create(:contact_inbox, inbox: whatsapp_channel.inbox, source_id: normalized_wa_id)
+ last_conversation = create(:conversation, inbox: whatsapp_channel.inbox, contact_inbox: contact_inbox)
+ described_class.new(inbox: whatsapp_channel.inbox, params: params).perform
+ # no new conversation should be created
+ expect(whatsapp_channel.inbox.conversations.count).to eq(1)
+ # message appended to the last conversation
+ expect(last_conversation.messages.last.content).to eq(params[:messages].first[:text][:body])
+ # should use the normalized wa_id from existing contact
+ expect(whatsapp_channel.inbox.contact_inboxes.first.source_id).to eq(normalized_wa_id)
+ end
+ end
+
+ describe 'When incoming waid is an Argentine number without 9 after country code' do
+ let(:wa_id) { '541123456789' }
+
+ context 'when a contact inbox exists with the same format' do
+ it 'appends to existing contact' do
+ contact_inbox = create(:contact_inbox, inbox: whatsapp_channel.inbox, source_id: wa_id)
+ last_conversation = create(:conversation, inbox: whatsapp_channel.inbox, contact_inbox: contact_inbox)
+ described_class.new(inbox: whatsapp_channel.inbox, params: params).perform
+ # no new conversation should be created
+ expect(whatsapp_channel.inbox.conversations.count).to eq(1)
+ # message appended to the last conversation
+ expect(last_conversation.messages.last.content).to eq(params[:messages].first[:text][:body])
+ end
+ end
+
+ context 'when a contact inbox does not exist' do
+ it 'creates contact inbox with the incoming waid' do
+ described_class.new(inbox: whatsapp_channel.inbox, params: params).perform
+ expect(whatsapp_channel.inbox.conversations.count).not_to eq(0)
+ expect(Contact.all.first.name).to eq('Sojan Jose')
+ expect(whatsapp_channel.inbox.messages.first.content).to eq('Test')
+ expect(whatsapp_channel.inbox.contact_inboxes.first.source_id).to eq(wa_id)
+ end
+ end
+ end
+
describe 'when message processing is in progress' do
it 'ignores the current message creation request' do
params = { 'contacts' => [{ 'profile' => { 'name' => 'Kedar' }, 'wa_id' => '919746334593' }],
From ec9a82a0176f53aacba23a65a7522065f25ef9b8 Mon Sep 17 00:00:00 2001
From: Sojan Jose
Date: Mon, 13 Oct 2025 15:59:59 +0530
Subject: [PATCH 178/182] feat: Open conversation when agent bot webhook fails
(#12379)
# Changelog
When an agent bot webhook fails, we now flip any pending conversation
back to an open state so a human agent can pick
it up immediately. There will be an clear activity message giving the
team clear visibility into what went
wrong. This keeps customers from getting stuck in limbo when their
connected bot goes offline.
# Testing instructions
1. Initial setup: Create an agent bot with a working webhook URL and
connect it to a test inbox. Send a message from a
contact (e.g., via the widget) so a conversation is created; it should
enter the Pending state while the bot handles
the reply.
2. Introduce failure: Edit that agent bot and swap the webhook URL for a
dummy endpoint that will fail. Have the same
contact send another message in the existing conversation. Because the
webhook call now fails, the conversation should flip from Pending back
to Open, making it visible to agents. Also verify the activity message
3. New conversation check: With the dummy URL still in place, start a
brand-new conversation from a contact. When the
bot tries (and fails) to respond, confirm that the conversation appears
immediately as Open rather than remaining Pending. Also the activity
message is visible
4. Subsequent messages in open conversations will show no change
---------
Co-authored-by: Muhsin Keloth
---
app/jobs/agent_bots/webhook_job.rb | 4 ++
config/locales/en.yml | 2 +
lib/webhooks/trigger.rb | 27 +++++++++++--
spec/lib/webhooks/trigger_spec.rb | 65 +++++++++++++++++++++++++++++-
4 files changed, 93 insertions(+), 5 deletions(-)
diff --git a/app/jobs/agent_bots/webhook_job.rb b/app/jobs/agent_bots/webhook_job.rb
index d0c4e7959..b3a3d6cc1 100644
--- a/app/jobs/agent_bots/webhook_job.rb
+++ b/app/jobs/agent_bots/webhook_job.rb
@@ -1,3 +1,7 @@
class AgentBots::WebhookJob < WebhookJob
queue_as :high
+
+ def perform(url, payload, webhook_type = :agent_bot_webhook)
+ super(url, payload, webhook_type)
+ end
end
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 6afab9253..ad54b8dfa 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -202,6 +202,8 @@ en:
captain:
resolved: 'Conversation was marked resolved by %{user_name} due to inactivity'
open: 'Conversation was marked open by %{user_name}'
+ 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}'
diff --git a/lib/webhooks/trigger.rb b/lib/webhooks/trigger.rb
index 41b3a415d..95c399d54 100644
--- a/lib/webhooks/trigger.rb
+++ b/lib/webhooks/trigger.rb
@@ -31,14 +31,33 @@ class Webhooks::Trigger
end
def handle_error(error)
- return unless should_handle_error?
+ return unless SUPPORTED_ERROR_HANDLE_EVENTS.include?(@payload[:event])
return unless message
- update_message_status(error)
+ case @webhook_type
+ when :agent_bot_webhook
+ conversation = message.conversation
+ return unless conversation&.pending?
+
+ conversation.open!
+ create_agent_bot_error_activity(conversation)
+ when :api_inbox_webhook
+ update_message_status(error)
+ end
end
- def should_handle_error?
- @webhook_type == :api_inbox_webhook && SUPPORTED_ERROR_HANDLE_EVENTS.include?(@payload[:event])
+ def create_agent_bot_error_activity(conversation)
+ content = I18n.t('conversations.activity.agent_bot.error_moved_to_open')
+ Conversations::ActivityMessageJob.perform_later(conversation, activity_message_params(conversation, content))
+ end
+
+ def activity_message_params(conversation, content)
+ {
+ account_id: conversation.account_id,
+ inbox_id: conversation.inbox_id,
+ message_type: :activity,
+ content: content
+ }
end
def update_message_status(error)
diff --git a/spec/lib/webhooks/trigger_spec.rb b/spec/lib/webhooks/trigger_spec.rb
index 8ff2a21a5..224a35e07 100644
--- a/spec/lib/webhooks/trigger_spec.rb
+++ b/spec/lib/webhooks/trigger_spec.rb
@@ -1,6 +1,8 @@
require 'rails_helper'
describe Webhooks::Trigger do
+ include ActiveJob::TestHelper
+
subject(:trigger) { described_class }
let!(:account) { create(:account) }
@@ -8,8 +10,18 @@ describe Webhooks::Trigger do
let!(:conversation) { create(:conversation, inbox: inbox) }
let!(:message) { create(:message, account: account, inbox: inbox, conversation: conversation) }
- let!(:webhook_type) { :api_inbox_webhook }
+ let(:webhook_type) { :api_inbox_webhook }
let!(:url) { 'https://test.com' }
+ let(:agent_bot_error_content) { I18n.t('conversations.activity.agent_bot.error_moved_to_open') }
+
+ before do
+ ActiveJob::Base.queue_adapter = :test
+ end
+
+ after do
+ clear_enqueued_jobs
+ clear_performed_jobs
+ end
describe '#execute' do
it 'triggers webhook' do
@@ -54,6 +66,57 @@ describe Webhooks::Trigger do
).and_raise(RestClient::ExceptionWithResponse.new('error', 500)).once
expect { trigger.execute(url, payload, webhook_type) }.to change { message.reload.status }.from('sent').to('failed')
end
+
+ context 'when webhook type is agent bot' do
+ let(:webhook_type) { :agent_bot_webhook }
+
+ it 'reopens conversation and enqueues activity message if pending' do
+ conversation.update(status: :pending)
+ payload = { event: 'message_created', conversation: { id: conversation.id }, id: message.id }
+
+ expect(RestClient::Request).to receive(:execute)
+ .with(
+ method: :post,
+ url: url,
+ payload: payload.to_json,
+ headers: { content_type: :json, accept: :json },
+ timeout: 5
+ ).and_raise(RestClient::ExceptionWithResponse.new('error', 500)).once
+
+ expect do
+ perform_enqueued_jobs do
+ trigger.execute(url, payload, webhook_type)
+ end
+ end.not_to(change { message.reload.status })
+
+ expect(conversation.reload.status).to eq('open')
+
+ activity_message = conversation.reload.messages.order(:created_at).last
+ expect(activity_message.message_type).to eq('activity')
+ expect(activity_message.content).to eq(agent_bot_error_content)
+ end
+
+ it 'does not change message status or enqueue activity when conversation is not pending' do
+ payload = { event: 'message_created', conversation: { id: conversation.id }, id: message.id }
+
+ expect(RestClient::Request).to receive(:execute)
+ .with(
+ method: :post,
+ url: url,
+ payload: payload.to_json,
+ headers: { content_type: :json, accept: :json },
+ timeout: 5
+ ).and_raise(RestClient::ExceptionWithResponse.new('error', 500)).once
+
+ expect do
+ trigger.execute(url, payload, webhook_type)
+ end.not_to(change { message.reload.status })
+
+ expect(Conversations::ActivityMessageJob).not_to have_been_enqueued
+
+ expect(conversation.reload.status).to eq('open')
+ end
+ end
end
it 'does not update message status if webhook fails for other events' do
From e7b01d80b3ddb08da96f4e6b346f8782267ee811 Mon Sep 17 00:00:00 2001
From: Vishnu Narayanan
Date: Mon, 13 Oct 2025 16:21:45 +0530
Subject: [PATCH 179/182] chore: add script to throttle bulkreindex job
creation and increase meta timeouts(#12626)
- scripts to throttle reindex job creation and monitor progress
```
RAILS_ENV=production POSTGRES_STATEMENT_TIMEOUT=6000s bundle exec rails runner script/bulk_reindex_messages.rb
RAILS_ENV=production bundle exec rails runner script/monitor_reindex.rb
```
---------
Co-authored-by: Pranav
---
.../store/modules/conversationStats.js | 6 +-
config/sidekiq.yml | 1 +
script/bulk_reindex_messages.rb | 58 +++++++++++++++++++
script/monitor_reindex.rb | 19 ++++++
script/reindex_single_account.rb | 58 +++++++++++++++++++
5 files changed, 139 insertions(+), 3 deletions(-)
create mode 100644 script/bulk_reindex_messages.rb
create mode 100644 script/monitor_reindex.rb
create mode 100644 script/reindex_single_account.rb
diff --git a/app/javascript/dashboard/store/modules/conversationStats.js b/app/javascript/dashboard/store/modules/conversationStats.js
index 353c1e59a..ba3e5c455 100644
--- a/app/javascript/dashboard/store/modules/conversationStats.js
+++ b/app/javascript/dashboard/store/modules/conversationStats.js
@@ -26,12 +26,12 @@ const fetchMetaData = async (commit, params) => {
};
const debouncedFetchMetaData = debounce(fetchMetaData, 500, false, 1500);
-const longDebouncedFetchMetaData = debounce(fetchMetaData, 1000, false, 8000);
+const longDebouncedFetchMetaData = debounce(fetchMetaData, 5000, false, 10000);
const superLongDebouncedFetchMetaData = debounce(
fetchMetaData,
- 1500,
+ 10000,
false,
- 10000
+ 20000
);
export const actions = {
diff --git a/config/sidekiq.yml b/config/sidekiq.yml
index 50a47a20b..138cf78b3 100644
--- a/config/sidekiq.yml
+++ b/config/sidekiq.yml
@@ -27,6 +27,7 @@
- purgable
- housekeeping
- async_database_migration
+ - bulk_reindex_low
- active_storage_analysis
- active_storage_purge
- action_mailbox_incineration
diff --git a/script/bulk_reindex_messages.rb b/script/bulk_reindex_messages.rb
new file mode 100644
index 000000000..1e19f70a7
--- /dev/null
+++ b/script/bulk_reindex_messages.rb
@@ -0,0 +1,58 @@
+# Bulk reindex all messages with throttling to prevent DB overload
+# This creates jobs slowly to avoid overwhelming the database connection pool
+# Usage: RAILS_ENV=production POSTGRES_STATEMENT_TIMEOUT=6000s bundle exec rails runner script/bulk_reindex_messages.rb
+
+JOBS_PER_MINUTE = 50 # Adjust based on your DB capacity
+BATCH_SIZE = 1000 # Messages per job
+
+batch_count = 0
+total_batches = (Message.count / BATCH_SIZE.to_f).ceil
+start_time = Time.zone.now
+
+index_name = Message.searchkick_index.name
+
+puts '=' * 80
+puts "Bulk Reindex Started at #{start_time}"
+puts '=' * 80
+puts "Total messages: #{Message.count}"
+puts "Batch size: #{BATCH_SIZE}"
+puts "Total batches: #{total_batches}"
+puts "Index name: #{index_name}"
+puts "Rate: #{JOBS_PER_MINUTE} jobs/minute (#{JOBS_PER_MINUTE * BATCH_SIZE} messages/minute)"
+puts "Estimated time: #{(total_batches / JOBS_PER_MINUTE.to_f / 60).round(2)} hours"
+puts '=' * 80
+puts ''
+
+sleep(15)
+
+Message.find_in_batches(batch_size: BATCH_SIZE).with_index do |batch, index|
+ batch_count += 1
+
+ # Enqueue to low priority queue with proper format
+ Searchkick::BulkReindexJob.set(queue: :bulk_reindex_low).perform_later(
+ class_name: 'Message',
+ index_name: index_name,
+ batch_id: index,
+ record_ids: batch.map(&:id) # Keep as integers like Message.reindex does
+ )
+
+ # Throttle: wait after every N jobs
+ if (batch_count % JOBS_PER_MINUTE).zero?
+ elapsed = Time.zone.now - start_time
+ progress = (batch_count.to_f / total_batches * 100).round(2)
+ queue_size = Sidekiq::Queue.new('bulk_reindex_low').size
+
+ puts "[#{Time.zone.now.strftime('%Y-%m-%d %H:%M:%S')}] Progress: #{batch_count}/#{total_batches} (#{progress}%)"
+ puts " Queue size: #{queue_size}"
+ puts " Elapsed: #{(elapsed / 3600).round(2)} hours"
+ puts " ETA: #{((elapsed / batch_count * (total_batches - batch_count)) / 3600).round(2)} hours remaining"
+ puts ''
+
+ sleep(60)
+ end
+end
+
+puts '=' * 80
+puts "Done! Created #{batch_count} jobs"
+puts "Total time: #{((Time.zone.now - start_time) / 3600).round(2)} hours"
+puts '=' * 80
diff --git a/script/monitor_reindex.rb b/script/monitor_reindex.rb
new file mode 100644
index 000000000..6a2c1ee6c
--- /dev/null
+++ b/script/monitor_reindex.rb
@@ -0,0 +1,19 @@
+# Monitor bulk reindex progress
+# RAILS_ENV=production bundle exec rails runner script/monitor_reindex.rb
+
+puts 'Monitoring bulk reindex progress (Ctrl+C to stop)...'
+puts ''
+
+loop do
+ bulk_queue = Sidekiq::Queue.new('bulk_reindex_low')
+ prod_queue = Sidekiq::Queue.new('async_database_migration')
+ retry_set = Sidekiq::RetrySet.new
+
+ puts "[#{Time.zone.now.strftime('%Y-%m-%d %H:%M:%S')}]"
+ puts " Bulk Reindex Queue: #{bulk_queue.size} jobs"
+ puts " Production Queue: #{prod_queue.size} jobs"
+ puts " Retry Queue: #{retry_set.size} jobs"
+ puts " #{('-' * 60)}"
+
+ sleep(30)
+end
diff --git a/script/reindex_single_account.rb b/script/reindex_single_account.rb
new file mode 100644
index 000000000..cb7dd8c87
--- /dev/null
+++ b/script/reindex_single_account.rb
@@ -0,0 +1,58 @@
+# Reindex messages for a single account
+# Usage: bundle exec rails runner script/reindex_single_account.rb ACCOUNT_ID [DAYS_BACK]
+
+#account_id = ARGV[0]&.to_i
+days_back = (ARGV[1] || 30).to_i
+
+# if account_id.nil? || account_id.zero?
+# puts "Usage: bundle exec rails runner script/reindex_single_account.rb ACCOUNT_ID [DAYS_BACK]"
+# puts "Example: bundle exec rails runner script/reindex_single_account.rb 93293 30"
+# exit 1
+# end
+
+# account = Account.find(account_id)
+# puts "=" * 80
+# puts "Reindexing messages for: #{account.name} (ID: #{account.id})"
+# puts "=" * 80
+
+# Enable feature if not already enabled
+# unless account.feature_enabled?('advanced_search_indexing')
+# puts "Enabling advanced_search_indexing feature..."
+# account.enable_features(:advanced_search_indexing)
+# account.save!
+# end
+
+# Get messages to index
+# messages = Message.where(account_id: account.id)
+# .where(message_type: [0, 1]) # incoming/outgoing only
+# .where('created_at >= ?', days_back.days.ago)
+
+messages = Message.where('created_at >= ?', days_back.days.ago)
+
+puts "Found #{messages.count} messages to index (last #{days_back} days)"
+puts ''
+
+sleep(15)
+
+# Create bulk reindex jobs
+index_name = Message.searchkick_index.name
+batch_count = 0
+
+messages.find_in_batches(batch_size: 1000).with_index do |batch, index|
+ Searchkick::BulkReindexJob.set(queue: :bulk_reindex_low).perform_later(
+ class_name: 'Message',
+ index_name: index_name,
+ batch_id: index,
+ record_ids: batch.map(&:id)
+ )
+
+ batch_count += 1
+ print '.'
+ sleep(0.5) # Small delay
+end
+
+puts ''
+puts '=' * 80
+puts "Done! Created #{batch_count} bulk reindex jobs"
+puts 'Messages will be indexed shortly via the bulk_reindex_low queue'
+puts '=' * 80
From 38f16ba677bd5328ab9baaab562f8f536c94e760 Mon Sep 17 00:00:00 2001
From: Sojan Jose
Date: Mon, 13 Oct 2025 18:05:12 +0530
Subject: [PATCH 180/182] feat: Secure external credentials with database
encryption (#12648)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
## Changelog
- Added conditional Active Record encryption to every external
credential we store (SMTP/IMAP passwords, Twilio tokens,
Slack/OpenAI hook tokens, Facebook/Instagram tokens, LINE/Telegram keys,
Twitter secrets) so new writes are encrypted
whenever Chatwoot.encryption_configured? is true; legacy installs still
receive plaintext until their secrets are
updated.
- Tuned encryption settings in config/application.rb to allow legacy
reads (support_unencrypted_data) and to extend
deterministic queries so lookups continue to match plaintext rows during
the rollout; added TODOs to retire the
fallback once encryption becomes mandatory.
- Introduced an MFA-pipeline test suite
(spec/models/external_credentials_encryption_spec.rb) plus shared
examples to
verify each attribute encrypts at rest and that plaintext records
re-encrypt on update, with a dedicated Telegram case.
The existing MFA GitHub workflow now runs these tests using the
preconfigured encryption keys.
fixes:
https://linear.app/chatwoot/issue/CW-5453/encrypt-sensitive-credentials-stored-in-plain-text-in-database
## Testing Instructions
1. Instance without encryption keys
- Unset ACTIVE_RECORD_ENCRYPTION_* vars (or run in an environment where
they’re absent).
- Create at least one credentialed channel (e.g., Email SMTP).
- Confirm workflows still function (send/receive mail or a similar
sanity check).
- In the DB you should still see plaintext values—this confirms the
guard prevents encryption when keys are missing.
2. Instance with encryption keys
- Configure the three encryption env vars and restart.
- Pick a couple of representative integrations (e.g., Email SMTP +
Twilio SMS).
- Legacy channel check:
- Use existing records created before enabling keys. Trigger their
workflow (send an email / SMS, or hit the
webhook) to ensure they still authenticate.
- Inspect the raw column—value remains plaintext until changed.
- Update legacy channel:
- Edit one legacy channel’s credential (e.g., change SMTP password).
- Verify the operation still works and the stored value is now encrypted
(raw column differs, accessor returns
original).
- New channel creation:
- Create a new channel of the same type; confirm functionality and that
the stored credential is encrypted from
the start.
---------
Co-authored-by: Muhsin Keloth
---
.github/workflows/run_mfa_spec.yml | 1 +
app/models/channel/email.rb | 6 +
app/models/channel/facebook_page.rb | 6 +
app/models/channel/instagram.rb | 3 +
app/models/channel/line.rb | 6 +
app/models/channel/telegram.rb | 3 +
app/models/channel/twilio_sms.rb | 3 +
app/models/channel/twitter_profile.rb | 6 +
app/models/integrations/hook.rb | 3 +
config/application.rb | 6 +
...rd_external_credentials_encryption_spec.rb | 113 ++++++++++++++++++
.../encrypted_external_credential_examples.rb | 21 ++++
12 files changed, 177 insertions(+)
create mode 100644 spec/models/application_record_external_credentials_encryption_spec.rb
create mode 100644 spec/support/examples/encrypted_external_credential_examples.rb
diff --git a/.github/workflows/run_mfa_spec.yml b/.github/workflows/run_mfa_spec.yml
index 61b406f8a..69d019cc9 100644
--- a/.github/workflows/run_mfa_spec.yml
+++ b/.github/workflows/run_mfa_spec.yml
@@ -70,6 +70,7 @@ jobs:
spec/services/mfa/authentication_service_spec.rb \
spec/requests/api/v1/profile/mfa_controller_spec.rb \
spec/controllers/devise_overrides/sessions_controller_spec.rb \
+ spec/models/application_record_external_credentials_encryption_spec.rb \
--profile=10 \
--format documentation
env:
diff --git a/app/models/channel/email.rb b/app/models/channel/email.rb
index a8fadb61e..b1124dd75 100644
--- a/app/models/channel/email.rb
+++ b/app/models/channel/email.rb
@@ -40,6 +40,12 @@ class Channel::Email < ApplicationRecord
AUTHORIZATION_ERROR_THRESHOLD = 10
+ # TODO: Remove guard once encryption keys become mandatory (target 3-4 releases out).
+ if Chatwoot.encryption_configured?
+ encrypts :imap_password
+ encrypts :smtp_password
+ end
+
self.table_name = 'channel_email'
EDITABLE_ATTRS = [:email, :imap_enabled, :imap_login, :imap_password, :imap_address, :imap_port, :imap_enable_ssl,
:smtp_enabled, :smtp_login, :smtp_password, :smtp_address, :smtp_port, :smtp_domain, :smtp_enable_starttls_auto,
diff --git a/app/models/channel/facebook_page.rb b/app/models/channel/facebook_page.rb
index 1b6e151cb..1866d245b 100644
--- a/app/models/channel/facebook_page.rb
+++ b/app/models/channel/facebook_page.rb
@@ -21,6 +21,12 @@ class Channel::FacebookPage < ApplicationRecord
include Channelable
include Reauthorizable
+ # TODO: Remove guard once encryption keys become mandatory (target 3-4 releases out).
+ if Chatwoot.encryption_configured?
+ encrypts :page_access_token
+ encrypts :user_access_token
+ end
+
self.table_name = 'channel_facebook_pages'
validates :page_id, uniqueness: { scope: :account_id }
diff --git a/app/models/channel/instagram.rb b/app/models/channel/instagram.rb
index 964a4c1a2..7e6444b30 100644
--- a/app/models/channel/instagram.rb
+++ b/app/models/channel/instagram.rb
@@ -19,6 +19,9 @@ class Channel::Instagram < ApplicationRecord
include Reauthorizable
self.table_name = 'channel_instagram'
+ # TODO: Remove guard once encryption keys become mandatory (target 3-4 releases out).
+ encrypts :access_token if Chatwoot.encryption_configured?
+
AUTHORIZATION_ERROR_THRESHOLD = 1
validates :access_token, presence: true
diff --git a/app/models/channel/line.rb b/app/models/channel/line.rb
index a417dbf64..63b0924da 100644
--- a/app/models/channel/line.rb
+++ b/app/models/channel/line.rb
@@ -18,6 +18,12 @@
class Channel::Line < ApplicationRecord
include Channelable
+ # TODO: Remove guard once encryption keys become mandatory (target 3-4 releases out).
+ if Chatwoot.encryption_configured?
+ encrypts :line_channel_secret
+ encrypts :line_channel_token
+ end
+
self.table_name = 'channel_line'
EDITABLE_ATTRS = [:line_channel_id, :line_channel_secret, :line_channel_token].freeze
diff --git a/app/models/channel/telegram.rb b/app/models/channel/telegram.rb
index b00897614..b18c6dbc9 100644
--- a/app/models/channel/telegram.rb
+++ b/app/models/channel/telegram.rb
@@ -17,6 +17,9 @@
class Channel::Telegram < ApplicationRecord
include Channelable
+ # TODO: Remove guard once encryption keys become mandatory (target 3-4 releases out).
+ encrypts :bot_token, deterministic: true if Chatwoot.encryption_configured?
+
self.table_name = 'channel_telegram'
EDITABLE_ATTRS = [:bot_token].freeze
diff --git a/app/models/channel/twilio_sms.rb b/app/models/channel/twilio_sms.rb
index 73e5c873e..2f9130cbb 100644
--- a/app/models/channel/twilio_sms.rb
+++ b/app/models/channel/twilio_sms.rb
@@ -28,6 +28,9 @@ class Channel::TwilioSms < ApplicationRecord
self.table_name = 'channel_twilio_sms'
+ # TODO: Remove guard once encryption keys become mandatory (target 3-4 releases out).
+ encrypts :auth_token if Chatwoot.encryption_configured?
+
validates :account_sid, presence: true
# The same parameter is used to store api_key_secret if api_key authentication is opted
validates :auth_token, presence: true
diff --git a/app/models/channel/twitter_profile.rb b/app/models/channel/twitter_profile.rb
index d0f765e9f..4ec167ce5 100644
--- a/app/models/channel/twitter_profile.rb
+++ b/app/models/channel/twitter_profile.rb
@@ -19,6 +19,12 @@
class Channel::TwitterProfile < ApplicationRecord
include Channelable
+ # TODO: Remove guard once encryption keys become mandatory (target 3-4 releases out).
+ if Chatwoot.encryption_configured?
+ encrypts :twitter_access_token
+ encrypts :twitter_access_token_secret
+ end
+
self.table_name = 'channel_twitter_profiles'
validates :profile_id, uniqueness: { scope: :account_id }
diff --git a/app/models/integrations/hook.rb b/app/models/integrations/hook.rb
index ca77fa13d..97d3f91ae 100644
--- a/app/models/integrations/hook.rb
+++ b/app/models/integrations/hook.rb
@@ -21,6 +21,9 @@ class Integrations::Hook < ApplicationRecord
before_validation :ensure_hook_type
after_create :trigger_setup_if_crm
+ # TODO: Remove guard once encryption keys become mandatory (target 3-4 releases out).
+ encrypts :access_token, deterministic: true if Chatwoot.encryption_configured?
+
validates :account_id, presence: true
validates :app_id, presence: true
validates :inbox_id, presence: true, if: -> { hook_type == 'inbox' }
diff --git a/config/application.rb b/config/application.rb
index d644dd28f..aa150794a 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -75,7 +75,11 @@ module Chatwoot
config.active_record.encryption.primary_key = ENV['ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY']
config.active_record.encryption.deterministic_key = ENV.fetch('ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY', nil)
config.active_record.encryption.key_derivation_salt = ENV.fetch('ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT', nil)
+ # TODO: Remove once encryption is mandatory and legacy plaintext is migrated.
config.active_record.encryption.support_unencrypted_data = true
+ # Extend deterministic queries so they match both encrypted and plaintext rows
+ config.active_record.encryption.extend_queries = true
+ # Store a per-row key reference to support future key rotation
config.active_record.encryption.store_key_references = true
end
end
@@ -94,6 +98,8 @@ module Chatwoot
end
def self.encryption_configured?
+ # TODO: Once Active Record encryption keys are mandatory (target 3-4 releases out),
+ # remove this guard and assume encryption is always enabled.
# Check if proper encryption keys are configured
# MFA/2FA features should only be enabled when proper keys are set
ENV['ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY'].present? &&
diff --git a/spec/models/application_record_external_credentials_encryption_spec.rb b/spec/models/application_record_external_credentials_encryption_spec.rb
new file mode 100644
index 000000000..65c347434
--- /dev/null
+++ b/spec/models/application_record_external_credentials_encryption_spec.rb
@@ -0,0 +1,113 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe ApplicationRecord do
+ it_behaves_like 'encrypted external credential',
+ factory: :channel_email,
+ attribute: :smtp_password,
+ value: 'smtp-secret'
+
+ it_behaves_like 'encrypted external credential',
+ factory: :channel_email,
+ attribute: :imap_password,
+ value: 'imap-secret'
+
+ it_behaves_like 'encrypted external credential',
+ factory: :channel_twilio_sms,
+ attribute: :auth_token,
+ value: 'twilio-secret'
+
+ it_behaves_like 'encrypted external credential',
+ factory: :integrations_hook,
+ attribute: :access_token,
+ value: 'hook-secret'
+
+ it_behaves_like 'encrypted external credential',
+ factory: :channel_facebook_page,
+ attribute: :page_access_token,
+ value: 'fb-page-secret'
+
+ it_behaves_like 'encrypted external credential',
+ factory: :channel_facebook_page,
+ attribute: :user_access_token,
+ value: 'fb-user-secret'
+
+ it_behaves_like 'encrypted external credential',
+ factory: :channel_instagram,
+ attribute: :access_token,
+ value: 'ig-secret'
+
+ it_behaves_like 'encrypted external credential',
+ factory: :channel_line,
+ attribute: :line_channel_secret,
+ value: 'line-secret'
+
+ it_behaves_like 'encrypted external credential',
+ factory: :channel_line,
+ attribute: :line_channel_token,
+ value: 'line-token-secret'
+
+ it_behaves_like 'encrypted external credential',
+ factory: :channel_telegram,
+ attribute: :bot_token,
+ value: 'telegram-secret'
+
+ it_behaves_like 'encrypted external credential',
+ factory: :channel_twitter_profile,
+ attribute: :twitter_access_token,
+ value: 'twitter-access-secret'
+
+ it_behaves_like 'encrypted external credential',
+ factory: :channel_twitter_profile,
+ attribute: :twitter_access_token_secret,
+ value: 'twitter-secret-secret'
+
+ context 'when backfilling legacy plaintext' do
+ before do
+ skip('encryption keys missing; see run_mfa_spec workflow') unless Chatwoot.encryption_configured?
+ end
+
+ it 'reads existing plaintext and encrypts on update' do
+ account = create(:account)
+ channel = create(:channel_email, account: account, smtp_password: nil)
+
+ # Simulate legacy plaintext by updating the DB directly
+ sql = ActiveRecord::Base.send(
+ :sanitize_sql_array,
+ ['UPDATE channel_email SET smtp_password = ? WHERE id = ?', 'legacy-plain', channel.id]
+ )
+ ActiveRecord::Base.connection.execute(sql)
+
+ legacy_record = Channel::Email.find(channel.id)
+ expect(legacy_record.smtp_password).to eq('legacy-plain')
+
+ legacy_record.update!(smtp_password: 'encrypted-now')
+
+ stored_value = legacy_record.reload.read_attribute_before_type_cast(:smtp_password)
+ expect(stored_value).to be_present
+ expect(stored_value).not_to include('encrypted-now')
+ expect(legacy_record.smtp_password).to eq('encrypted-now')
+ end
+ end
+
+ context 'when looking up telegram legacy records' do
+ before do
+ skip('encryption keys missing; see run_mfa_spec workflow') unless Chatwoot.encryption_configured?
+ end
+
+ it 'finds plaintext records via fallback lookup' do
+ channel = create(:channel_telegram, bot_token: 'legacy-token')
+
+ # Simulate legacy plaintext by updating the DB directly
+ sql = ActiveRecord::Base.send(
+ :sanitize_sql_array,
+ ['UPDATE channel_telegram SET bot_token = ? WHERE id = ?', 'legacy-token', channel.id]
+ )
+ ActiveRecord::Base.connection.execute(sql)
+
+ found = Channel::Telegram.find_by(bot_token: 'legacy-token')
+ expect(found).to eq(channel)
+ end
+ end
+end
diff --git a/spec/support/examples/encrypted_external_credential_examples.rb b/spec/support/examples/encrypted_external_credential_examples.rb
new file mode 100644
index 000000000..c67d814a9
--- /dev/null
+++ b/spec/support/examples/encrypted_external_credential_examples.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'encrypted external credential' do |factory:, attribute:, value: 'secret-token'|
+ before do
+ skip('encryption keys missing; see run_mfa_spec workflow') unless Chatwoot.encryption_configured?
+ if defined?(Facebook::Messenger::Subscriptions)
+ allow(Facebook::Messenger::Subscriptions).to receive(:subscribe).and_return(true)
+ allow(Facebook::Messenger::Subscriptions).to receive(:unsubscribe).and_return(true)
+ end
+ end
+
+ it "encrypts #{attribute} at rest" do
+ record = create(factory, attribute => value)
+
+ raw_stored_value = record.reload.read_attribute_before_type_cast(attribute).to_s
+ expect(raw_stored_value).to be_present
+ expect(raw_stored_value).not_to include(value)
+ expect(record.public_send(attribute)).to eq(value)
+ expect(record.encrypted_attribute?(attribute)).to be(true)
+ end
+end
From f1f1ce644c5262e37266f5d506b06659946bb13f Mon Sep 17 00:00:00 2001
From: Shivam Mishra
Date: Mon, 13 Oct 2025 19:15:57 +0530
Subject: [PATCH 181/182] feat: Overview heatmap improvements (#12359)
This PR adds inbox filtering to the conversation traffic heatmap,
allowing users to analyze patterns for specific inboxes. Additionally,
it also adds a new resolution count heatmap that shows when support
teams are most active in resolving conversations, using a green color to
distinguish it from the blue conversation heatmap.
The PR also reorganizes heatmap components into a cleaner structure with
a shared `BaseHeatmapContainer` that handles common functionality like
date range selection, inbox filtering, and data fetching. This makes it
easy to add new heatmap metrics in the future - just create a wrapper
component specifying the metric type and color scheme.
Unrelated change, the data seeder conversation resolution would not work
correctly, we've fixed it.
---------
Co-authored-by: Muhsin Keloth
---
.../dashboard/i18n/locale/en/report.json | 10 +
.../settings/reports/LiveReports.vue | 6 +-
.../settings/reports/components/Heatmap.vue | 175 ------------
.../reports/components/HeatmapContainer.vue | 119 --------
.../components/heatmaps/BaseHeatmap.vue | 214 ++++++++++++++
.../heatmaps/BaseHeatmapContainer.vue | 265 ++++++++++++++++++
.../heatmaps/ConversationHeatmapContainer.vue | 18 ++
.../components/heatmaps/HeatmapTooltip.vue | 57 ++++
.../heatmaps/ResolutionHeatmapContainer.vue | 18 ++
.../heatmaps/composables/useHeatmapTooltip.js | 34 +++
.../dashboard/store/modules/reports.js | 21 ++
.../dashboard/store/mutation-types.js | 2 +
lib/seeders/reports/conversation_creator.rb | 36 ++-
13 files changed, 668 insertions(+), 307 deletions(-)
delete mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/Heatmap.vue
delete mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/HeatmapContainer.vue
create mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/heatmaps/BaseHeatmap.vue
create mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/heatmaps/BaseHeatmapContainer.vue
create mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/heatmaps/ConversationHeatmapContainer.vue
create mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/heatmaps/HeatmapTooltip.vue
create mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/heatmaps/ResolutionHeatmapContainer.vue
create mode 100644 app/javascript/dashboard/routes/dashboard/settings/reports/components/heatmaps/composables/useHeatmapTooltip.js
diff --git a/app/javascript/dashboard/i18n/locale/en/report.json b/app/javascript/dashboard/i18n/locale/en/report.json
index 7c42fdfba..c622170b0 100644
--- a/app/javascript/dashboard/i18n/locale/en/report.json
+++ b/app/javascript/dashboard/i18n/locale/en/report.json
@@ -51,6 +51,7 @@
},
"DATE_RANGE_OPTIONS": {
"LAST_7_DAYS": "Last 7 days",
+ "LAST_14_DAYS": "Last 14 days",
"LAST_30_DAYS": "Last 30 days",
"LAST_3_MONTHS": "Last 3 months",
"LAST_6_MONTHS": "Last 6 months",
@@ -266,6 +267,8 @@
"NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
"DOWNLOAD_INBOX_REPORTS": "Download inbox reports",
"FILTER_DROPDOWN_LABEL": "Select Inbox",
+ "ALL_INBOXES": "All Inboxes",
+ "SEARCH_INBOX": "Search Inbox",
"METRICS": {
"CONVERSATIONS": {
"NAME": "Conversations",
@@ -467,6 +470,13 @@
"CONVERSATIONS": "{count} conversations",
"DOWNLOAD_REPORT": "Download report"
},
+ "RESOLUTION_HEATMAP": {
+ "HEADER": "Resolutions",
+ "NO_CONVERSATIONS": "No conversations",
+ "CONVERSATION": "{count} conversation",
+ "CONVERSATIONS": "{count} conversations",
+ "DOWNLOAD_REPORT": "Download report"
+ },
"AGENT_CONVERSATIONS": {
"HEADER": "Conversations by agents",
"LOADING_MESSAGE": "Loading agent metrics...",
diff --git a/app/javascript/dashboard/routes/dashboard/settings/reports/LiveReports.vue b/app/javascript/dashboard/routes/dashboard/settings/reports/LiveReports.vue
index a0eeb3ab9..1eb9640ac 100644
--- a/app/javascript/dashboard/routes/dashboard/settings/reports/LiveReports.vue
+++ b/app/javascript/dashboard/routes/dashboard/settings/reports/LiveReports.vue
@@ -1,6 +1,7 @@
-
-
-
-
diff --git a/app/javascript/dashboard/routes/dashboard/settings/reports/components/HeatmapContainer.vue b/app/javascript/dashboard/routes/dashboard/settings/reports/components/HeatmapContainer.vue
deleted file mode 100644
index 280e1d6ee..000000000
--- a/app/javascript/dashboard/routes/dashboard/settings/reports/components/HeatmapContainer.vue
+++ /dev/null
@@ -1,119 +0,0 @@
-
-
-
-
-
diff --git a/app/javascript/dashboard/routes/dashboard/settings/reports/components/heatmaps/BaseHeatmap.vue b/app/javascript/dashboard/routes/dashboard/settings/reports/components/heatmaps/BaseHeatmap.vue
new file mode 100644
index 000000000..3f9dd9db4
--- /dev/null
+++ b/app/javascript/dashboard/routes/dashboard/settings/reports/components/heatmaps/BaseHeatmap.vue
@@ -0,0 +1,214 @@
+
+
+
+
+
+
diff --git a/app/javascript/dashboard/routes/dashboard/settings/reports/components/heatmaps/BaseHeatmapContainer.vue b/app/javascript/dashboard/routes/dashboard/settings/reports/components/heatmaps/BaseHeatmapContainer.vue
new file mode 100644
index 000000000..2a692b12a
--- /dev/null
+++ b/app/javascript/dashboard/routes/dashboard/settings/reports/components/heatmaps/BaseHeatmapContainer.vue
@@ -0,0 +1,265 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/javascript/dashboard/routes/dashboard/settings/reports/components/heatmaps/ConversationHeatmapContainer.vue b/app/javascript/dashboard/routes/dashboard/settings/reports/components/heatmaps/ConversationHeatmapContainer.vue
new file mode 100644
index 000000000..394b7cdc2
--- /dev/null
+++ b/app/javascript/dashboard/routes/dashboard/settings/reports/components/heatmaps/ConversationHeatmapContainer.vue
@@ -0,0 +1,18 @@
+
+
+
+
+
diff --git a/app/javascript/dashboard/routes/dashboard/settings/reports/components/heatmaps/HeatmapTooltip.vue b/app/javascript/dashboard/routes/dashboard/settings/reports/components/heatmaps/HeatmapTooltip.vue
new file mode 100644
index 000000000..79377a6a3
--- /dev/null
+++ b/app/javascript/dashboard/routes/dashboard/settings/reports/components/heatmaps/HeatmapTooltip.vue
@@ -0,0 +1,57 @@
+
+
+
+
+
+ {{ tooltipText }}
+
+
diff --git a/app/javascript/dashboard/routes/dashboard/settings/reports/components/heatmaps/ResolutionHeatmapContainer.vue b/app/javascript/dashboard/routes/dashboard/settings/reports/components/heatmaps/ResolutionHeatmapContainer.vue
new file mode 100644
index 000000000..24530d0c7
--- /dev/null
+++ b/app/javascript/dashboard/routes/dashboard/settings/reports/components/heatmaps/ResolutionHeatmapContainer.vue
@@ -0,0 +1,18 @@
+
+
+
+
+
diff --git a/app/javascript/dashboard/routes/dashboard/settings/reports/components/heatmaps/composables/useHeatmapTooltip.js b/app/javascript/dashboard/routes/dashboard/settings/reports/components/heatmaps/composables/useHeatmapTooltip.js
new file mode 100644
index 000000000..28b050542
--- /dev/null
+++ b/app/javascript/dashboard/routes/dashboard/settings/reports/components/heatmaps/composables/useHeatmapTooltip.js
@@ -0,0 +1,34 @@
+import { ref } from 'vue';
+
+export function useHeatmapTooltip() {
+ const visible = ref(false);
+ const x = ref(0);
+ const y = ref(0);
+ const value = ref(null);
+
+ let timeoutId = null;
+
+ const show = (event, cellValue) => {
+ clearTimeout(timeoutId);
+
+ // Update position immediately for smooth movement
+ const rect = event.target.getBoundingClientRect();
+ x.value = rect.left + rect.width / 2;
+ y.value = rect.top;
+
+ // Only delay content update and visibility
+ timeoutId = setTimeout(() => {
+ value.value = cellValue;
+ visible.value = true;
+ }, 100);
+ };
+
+ const hide = () => {
+ clearTimeout(timeoutId);
+ timeoutId = setTimeout(() => {
+ visible.value = false;
+ }, 50);
+ };
+
+ return { visible, x, y, value, show, hide };
+}
diff --git a/app/javascript/dashboard/store/modules/reports.js b/app/javascript/dashboard/store/modules/reports.js
index bb5364bb5..99b2acf18 100644
--- a/app/javascript/dashboard/store/modules/reports.js
+++ b/app/javascript/dashboard/store/modules/reports.js
@@ -57,11 +57,13 @@ const state = {
uiFlags: {
isFetchingAccountConversationMetric: false,
isFetchingAccountConversationsHeatmap: false,
+ isFetchingAccountResolutionsHeatmap: false,
isFetchingAgentConversationMetric: false,
isFetchingTeamConversationMetric: false,
},
accountConversationMetric: {},
accountConversationHeatmap: [],
+ accountResolutionHeatmap: [],
agentConversationMetric: [],
teamConversationMetric: [],
},
@@ -89,6 +91,9 @@ const getters = {
getAccountConversationHeatmapData(_state) {
return _state.overview.accountConversationHeatmap;
},
+ getAccountResolutionHeatmapData(_state) {
+ return _state.overview.accountResolutionHeatmap;
+ },
getAgentConversationMetric(_state) {
return _state.overview.agentConversationMetric;
},
@@ -130,6 +135,16 @@ export const actions = {
commit(types.default.TOGGLE_HEATMAP_LOADING, false);
});
},
+ fetchAccountResolutionHeatmap({ commit }, reportObj) {
+ commit(types.default.TOGGLE_RESOLUTION_HEATMAP_LOADING, true);
+ Report.getReports({ ...reportObj, groupBy: 'hour' }).then(heatmapData => {
+ let { data } = heatmapData;
+ data = clampDataBetweenTimeline(data, reportObj.from, reportObj.to);
+
+ commit(types.default.SET_RESOLUTION_HEATMAP_DATA, data);
+ commit(types.default.TOGGLE_RESOLUTION_HEATMAP_LOADING, false);
+ });
+ },
fetchAccountSummary({ commit }, reportObj) {
commit(types.default.SET_ACCOUNT_SUMMARY_STATUS, STATUS.FETCHING);
Report.getSummary(
@@ -287,6 +302,9 @@ const mutations = {
[types.default.SET_HEATMAP_DATA](_state, heatmapData) {
_state.overview.accountConversationHeatmap = heatmapData;
},
+ [types.default.SET_RESOLUTION_HEATMAP_DATA](_state, heatmapData) {
+ _state.overview.accountResolutionHeatmap = heatmapData;
+ },
[types.default.TOGGLE_ACCOUNT_REPORT_LOADING](_state, { metric, value }) {
_state.accountReport.isFetching[metric] = value;
},
@@ -299,6 +317,9 @@ const mutations = {
[types.default.TOGGLE_HEATMAP_LOADING](_state, flag) {
_state.overview.uiFlags.isFetchingAccountConversationsHeatmap = flag;
},
+ [types.default.TOGGLE_RESOLUTION_HEATMAP_LOADING](_state, flag) {
+ _state.overview.uiFlags.isFetchingAccountResolutionsHeatmap = flag;
+ },
[types.default.SET_ACCOUNT_SUMMARY](_state, summaryData) {
_state.accountSummary = summaryData;
},
diff --git a/app/javascript/dashboard/store/mutation-types.js b/app/javascript/dashboard/store/mutation-types.js
index 4f361e140..68ff79e66 100644
--- a/app/javascript/dashboard/store/mutation-types.js
+++ b/app/javascript/dashboard/store/mutation-types.js
@@ -187,6 +187,8 @@ export default {
SET_ACCOUNT_REPORTS: 'SET_ACCOUNT_REPORTS',
SET_HEATMAP_DATA: 'SET_HEATMAP_DATA',
TOGGLE_HEATMAP_LOADING: 'TOGGLE_HEATMAP_LOADING',
+ SET_RESOLUTION_HEATMAP_DATA: 'SET_RESOLUTION_HEATMAP_DATA',
+ TOGGLE_RESOLUTION_HEATMAP_LOADING: 'TOGGLE_RESOLUTION_HEATMAP_LOADING',
SET_ACCOUNT_SUMMARY: 'SET_ACCOUNT_SUMMARY',
SET_BOT_SUMMARY: 'SET_BOT_SUMMARY',
TOGGLE_ACCOUNT_REPORT_LOADING: 'TOGGLE_ACCOUNT_REPORT_LOADING',
diff --git a/lib/seeders/reports/conversation_creator.rb b/lib/seeders/reports/conversation_creator.rb
index b6259de7d..1cd11ef33 100644
--- a/lib/seeders/reports/conversation_creator.rb
+++ b/lib/seeders/reports/conversation_creator.rb
@@ -16,8 +16,11 @@ class Seeders::Reports::ConversationCreator
@priorities = [nil, 'urgent', 'high', 'medium', 'low']
end
+ # rubocop:disable Metrics/MethodLength
def create_conversation(created_at:)
conversation = nil
+ should_resolve = false
+ resolution_time = nil
ActiveRecord::Base.transaction do
travel_to(created_at) do
@@ -26,14 +29,35 @@ class Seeders::Reports::ConversationCreator
add_labels_to_conversation(conversation)
create_messages_for_conversation(conversation)
- resolve_conversation_if_needed(conversation)
+
+ # Determine if should resolve but don't update yet
+ should_resolve = rand > 0.3
+ if should_resolve
+ resolution_delay = rand((30.minutes)..(24.hours))
+ resolution_time = created_at + resolution_delay
+ end
end
travel_back
end
+ # Now resolve outside of time travel if needed
+ if should_resolve && resolution_time
+ # rubocop:disable Rails/SkipsModelValidations
+ conversation.update_column(:status, :resolved)
+ conversation.update_column(:updated_at, resolution_time)
+ # rubocop:enable Rails/SkipsModelValidations
+
+ # Trigger the event with proper timestamp
+ travel_to(resolution_time) do
+ trigger_conversation_resolved_event(conversation)
+ end
+ travel_back
+ end
+
conversation
end
+ # rubocop:enable Metrics/MethodLength
private
@@ -85,16 +109,6 @@ class Seeders::Reports::ConversationCreator
message_creator.create_messages
end
- def resolve_conversation_if_needed(conversation)
- return unless rand < 0.7
-
- resolution_delay = rand((30.minutes)..(24.hours))
- travel(resolution_delay)
- conversation.update!(status: :resolved)
-
- trigger_conversation_resolved_event(conversation)
- end
-
def trigger_conversation_resolved_event(conversation)
event_data = { conversation: conversation }
From 368d7c4608e9de49a75f0e9d512da203ebd52178 Mon Sep 17 00:00:00 2001
From: Pranav
Date: Wed, 15 Oct 2025 00:52:23 -0700
Subject: [PATCH 182/182] feat: Add support for HTML emails in outgoing
messages (#12662)
This PR adds sending custom HTML content in outgoing email messages
through Chatwoot's Email channels, while maintaining backward
compatibility with existing markdown rendering.
### API Usage
**Endpoint:** `POST
/api/v1/accounts/{account_id}/conversations/{conversation_id}/messages`
```json
{
"content": "Fallback text content",
"email_html_content": "Welcome! This is custom HTML
"
}
```
---------
Co-authored-by: Muhsin
---
app/builders/messages/message_builder.rb | 21 +++-
.../email_reply.html.erb | 14 ++-
.../builders/messages/message_builder_spec.rb | 57 +++++++++
.../mailers/conversation_reply_mailer_spec.rb | 112 ++++++++++++++++++
4 files changed, 197 insertions(+), 7 deletions(-)
diff --git a/app/builders/messages/message_builder.rb b/app/builders/messages/message_builder.rb
index 86bcee54e..12a74ed9c 100644
--- a/app/builders/messages/message_builder.rb
+++ b/app/builders/messages/message_builder.rb
@@ -178,7 +178,13 @@ class Messages::MessageBuilder
email_attributes = ensure_indifferent_access(@message.content_attributes[:email] || {})
normalized_content = normalize_email_body(@message.content)
- email_attributes[:html_content] = build_html_content(normalized_content)
+ # Use custom HTML content if provided, otherwise generate from message content
+ email_attributes[:html_content] = if custom_email_content_provided?
+ build_custom_html_content
+ else
+ build_html_content(normalized_content)
+ end
+
email_attributes[:text_content] = build_text_content(normalized_content)
email_attributes
end
@@ -213,4 +219,17 @@ class Messages::MessageBuilder
ChatwootMarkdownRenderer.new(content).render_message.to_s
end
+
+ def custom_email_content_provided?
+ @params[:email_html_content].present?
+ end
+
+ def build_custom_html_content
+ html_content = ensure_indifferent_access(@message.content_attributes.dig(:email, :html_content) || {})
+
+ html_content[:full] = @params[:email_html_content]
+ html_content[:reply] = @params[:email_html_content]
+
+ html_content
+ end
end
diff --git a/app/views/mailers/conversation_reply_mailer/email_reply.html.erb b/app/views/mailers/conversation_reply_mailer/email_reply.html.erb
index feb5dff96..f5f827e4c 100644
--- a/app/views/mailers/conversation_reply_mailer/email_reply.html.erb
+++ b/app/views/mailers/conversation_reply_mailer/email_reply.html.erb
@@ -1,9 +1,11 @@
-<% if @message.content %>
- <%= ChatwootMarkdownRenderer.new(@message.outgoing_content).render_message %>
+<% if @message.content_attributes.dig('email', 'html_content', 'reply').present? %>
+<%= @message.content_attributes.dig('email', 'html_content', 'reply').html_safe %>
+<% elsif @message.content %>
+<%= ChatwootMarkdownRenderer.new(@message.outgoing_content).render_message %>
<% end %>
<% if @large_attachments.present? %>
- Attachments:
- <% @large_attachments.each do |attachment| %>
- <%= attachment.file.filename.to_s %>
- <% end %>
+Attachments:
+<% @large_attachments.each do |attachment| %>
+<%= attachment.file.filename.to_s %>
+<% end %>
<% end %>
diff --git a/spec/builders/messages/message_builder_spec.rb b/spec/builders/messages/message_builder_spec.rb
index 891f8eb02..2eb4dbf90 100644
--- a/spec/builders/messages/message_builder_spec.rb
+++ b/spec/builders/messages/message_builder_spec.rb
@@ -179,6 +179,63 @@ describe Messages::MessageBuilder do
expect(message.content_attributes[:cc_emails]).to eq ['test1@test.com', 'test2@test.com', 'test3@test.com']
expect(message.content_attributes[:bcc_emails]).to eq ['test1@test.com', 'test2@test.com', 'test3@test.com']
end
+
+ context 'when custom email content is provided' do
+ before do
+ account.enable_features('quoted_email_reply')
+ end
+
+ it 'creates message with custom HTML email content' do
+ params = ActionController::Parameters.new({
+ content: 'Regular message content',
+ email_html_content: 'Custom HTML content
'
+ })
+
+ message = described_class.new(user, conversation, params).perform
+
+ expect(message.content_attributes.dig('email', 'html_content', 'full')).to eq 'Custom HTML content
'
+ expect(message.content_attributes.dig('email', 'html_content', 'reply')).to eq 'Custom HTML content
'
+ expect(message.content_attributes.dig('email', 'text_content', 'full')).to eq 'Regular message content'
+ expect(message.content_attributes.dig('email', 'text_content', 'reply')).to eq 'Regular message content'
+ end
+
+ it 'does not process custom email content when quoted_email_reply feature is disabled' do
+ account.disable_features('quoted_email_reply')
+ params = ActionController::Parameters.new({
+ content: 'Regular message content',
+ email_html_content: 'Custom HTML content
'
+ })
+
+ message = described_class.new(user, conversation, params).perform
+
+ expect(message.content_attributes.dig('email', 'html_content')).to be_nil
+ expect(message.content_attributes.dig('email', 'text_content')).to be_nil
+ end
+
+ it 'does not process custom email content for private messages' do
+ params = ActionController::Parameters.new({
+ content: 'Regular message content',
+ email_html_content: 'Custom HTML content
',
+ private: true
+ })
+
+ message = described_class.new(user, conversation, params).perform
+
+ expect(message.content_attributes.dig('email', 'html_content')).to be_nil
+ expect(message.content_attributes.dig('email', 'text_content')).to be_nil
+ end
+
+ it 'falls back to default behavior when no custom email content is provided' do
+ params = ActionController::Parameters.new({
+ content: 'Regular **markdown** content'
+ })
+
+ message = described_class.new(user, conversation, params).perform
+
+ expect(message.content_attributes.dig('email', 'html_content', 'full')).to include('markdown ')
+ expect(message.content_attributes.dig('email', 'text_content', 'full')).to eq 'Regular **markdown** content'
+ end
+ end
end
end
end
diff --git a/spec/mailers/conversation_reply_mailer_spec.rb b/spec/mailers/conversation_reply_mailer_spec.rb
index ecd97333e..3f6395566 100644
--- a/spec/mailers/conversation_reply_mailer_spec.rb
+++ b/spec/mailers/conversation_reply_mailer_spec.rb
@@ -335,6 +335,118 @@ RSpec.describe ConversationReplyMailer do
expect(mail.body.encoded).not_to match(%r{]*>avatar\.png })
end
end
+
+ context 'with custom email content' do
+ it 'uses custom HTML content when available and creates multipart email' do
+ message_with_custom_content = create(:message,
+ conversation: conversation,
+ account: account,
+ message_type: 'outgoing',
+ content: 'Regular message content',
+ content_attributes: {
+ email: {
+ html_content: {
+ reply: 'Custom HTML content for email
'
+ },
+ text_content: {
+ reply: 'Custom text content for email'
+ }
+ }
+ })
+
+ mail = described_class.email_reply(message_with_custom_content).deliver_now
+
+ # Check HTML part contains custom HTML content
+ html_part = mail.html_part || mail
+ expect(html_part.body.encoded).to include('Custom HTML content for email
')
+ expect(html_part.body.encoded).not_to include('Regular message content')
+
+ # Check text part contains custom text content
+ text_part = mail.text_part
+ if text_part
+ expect(text_part.body.encoded).to include('Custom text content for email')
+ expect(text_part.body.encoded).not_to include('Regular message content')
+ end
+ end
+
+ it 'falls back to markdown rendering when custom HTML content is not available' do
+ message_without_custom_content = create(:message,
+ conversation: conversation,
+ account: account,
+ message_type: 'outgoing',
+ content: 'Regular **markdown** content')
+
+ mail = described_class.email_reply(message_without_custom_content).deliver_now
+
+ html_part = mail.html_part || mail
+ expect(html_part.body.encoded).to include('markdown ')
+ expect(html_part.body.encoded).to include('Regular')
+ end
+
+ it 'handles empty custom HTML content gracefully' do
+ message_with_empty_content = create(:message,
+ conversation: conversation,
+ account: account,
+ message_type: 'outgoing',
+ content: 'Regular **markdown** content',
+ content_attributes: {
+ email: {
+ html_content: {
+ reply: ''
+ }
+ }
+ })
+
+ mail = described_class.email_reply(message_with_empty_content).deliver_now
+
+ html_part = mail.html_part || mail
+ expect(html_part.body.encoded).to include('markdown ')
+ expect(html_part.body.encoded).to include('Regular')
+ end
+
+ it 'handles nil custom HTML content gracefully' do
+ message_with_nil_content = create(:message,
+ conversation: conversation,
+ account: account,
+ message_type: 'outgoing',
+ content: 'Regular **markdown** content',
+ content_attributes: {
+ email: {
+ html_content: {
+ reply: nil
+ }
+ }
+ })
+
+ mail = described_class.email_reply(message_with_nil_content).deliver_now
+
+ expect(mail.body.encoded).to include('markdown ')
+ expect(mail.body.encoded).to include('Regular')
+ end
+
+ it 'uses custom text content in text part when only text is provided' do
+ message_with_text_only = create(:message,
+ conversation: conversation,
+ account: account,
+ message_type: 'outgoing',
+ content: 'Regular message content',
+ content_attributes: {
+ email: {
+ text_content: {
+ reply: 'Custom text content only'
+ }
+ }
+ })
+
+ mail = described_class.email_reply(message_with_text_only).deliver_now
+
+ text_part = mail.text_part
+ if text_part
+ expect(text_part.body.encoded).to include('Custom text content only')
+ expect(text_part.body.encoded).not_to include('Regular message content')
+ end
+ end
+ end
end
context 'when smtp enabled for email channel' do