Compare commits

...
100 Commits
Author SHA1 Message Date
PranavandGitHub 9def5f80a3 Merge branch 'develop' into inline-edit 2026-04-13 19:35:47 -07:00
Sivin VargheseandGitHub a8c8b38f51 fix: create article on title blur instead of debounce (#14037) 2026-04-13 23:23:25 +05:30
f422c83c26 feat: Add unified Call model for voice calling (#14026)
Adds a Call model to track voice call state across providers (Twilio,
WhatsApp). This replaces storing call data in
conversation.additional_attributes and provides a foundation for call
analytics multi-call-per-conversation support, and future voice
providers.

---------

Co-authored-by: Muhsin <12408980+muhsin-k@users.noreply.github.com>
2026-04-13 20:28:09 +04:00
722e68eecb fix: validate support_email format and handle parse errors in mailer (#13958)
## Description

ConversationReplyMailer#parse_email calls
Mail::Address.new(email_string).address without error handling. When an
account's support_email contains a non-email string (e.g., "Smith
Smith"), the mail gem raises Mail::Field::IncompleteParseError, crashing
conversation transcript emails.

This has caused 1,056 errors on Sentry (EXTERNAL-CHATINC-JX) since Feb
25, all from a single account that has a name stored in the
support_email field instead of a valid email address.

Closes
https://linear.app/chatwoot/issue/CW-6687/mailfieldincompleteparseerror-mailaddresslist-can-not-parse-orsmith

## Type of change

Please delete options that are not relevant.

- [ ] Bug fix (non-breaking change which fixes an issue)


## Checklist:

- [ ] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Vishnu Narayanan <iamwishnu@gmail.com>
2026-04-13 19:06:06 +07:00
Tanmay Deep SharmaandGitHub 0592cccca9 fix: prevent lost custom_attributes updates from concurrent jsonb writes (#14040)
## Linear ticket
https://linear.app/chatwoot/issue/CW-6834/billing-upgrade-didnt-work

## Description
A `customer.subscription.updated` Stripe webhook for account 76162
returned 200 OK but did not persist the new `subscribed_quantity`. Root
cause: a race condition between the webhook handler and
`increment_response_usage` (Captain usage counter), both doing
read-modify-write on the `custom_attributes` JSONB column. The webhook
wrote `quantity: 6`, then a concurrent `save` from
`increment_response_usage` overwrote the entire hash with stale data —
restoring `quantity: 5`.

Fix: use atomic `jsonb_set` so usage counter updates only touch the
single key they care about, instead of rewriting the whole
`custom_attributes` hash. `increment_custom_attribute` also performs the
increment in SQL, making concurrent increments correct as well.

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

- New regression spec in `handle_stripe_event_service_spec.rb` that
simulates concurrent webhook + `increment_response_usage` and asserts
both `subscribed_quantity` and `captain_responses_usage` survive
- Existing account, billing, captain, and topup specs all pass locally

## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules
2026-04-13 19:03:37 +07:00
Sojan JoseandGitHub 45b6ea6b3f feat: add automation condition to filter private notes (#12102)
## Summary

Adds a new automation condition to filter private notes.

This allows automation rules to explicitly include or exclude private
notes instead of relying on implicit behavior.

Fixes: #11208 

## Preview



https://github.com/user-attachments/assets/c40f6910-7bbf-4e59-aae5-ad408602927a
2026-04-13 10:40:46 +05:30
Vishnu NarayananandGitHub de0bd8e71b fix(perf): disable tags counter cache to prevent label deadlocks (#14021)
Label attach/detach against a shared label no longer deadlocks under
parallel load. During high-concurrency label writes (for example, a
broadcast script attaching a campaign label to many conversations at
once), Chatwoot previously hit periodic `ActiveRecord::Deadlocked`
errors and tail-latency spikes on the tags table. This PR removes the
contention by disabling the `acts-as-taggable-on` counter cache, which
Chatwoot never reads.

## Closes

Fixes [INF-68](https://linear.app/chatwoot/issue/INF-68) (event 2)

## How to reproduce

1. Seed an account with ~20 conversations and 5 labels.
2. Spawn 20 parallel threads, each calling
`conversation.update!(label_list: shared_labels.shuffle)` against
different conversations.
3. Observe `ActiveRecord::Deadlocked` exceptions and p99 label-write
latency well above 1s.

With the counter cache disabled, the deadlock cycle cannot form.

## How this was tested

- Ran a 20-thread synthetic load test locally, each thread attaching 5
shared labels (shuffled per request) to different conversations. With
the counter cache enabled: 8 deadlocks across 300 attempts, p99 ~2.2s.
With the counter cache disabled: zero deadlocks, p99 ~306ms (roughly 85%
tail-latency reduction). The `UPDATE tags SET taggings_count = ...`
statement disappears from the SQL log entirely.
- Verified at boot via `rails runner` that
`ActsAsTaggableOn::Tagging.reflect_on_association(:tag).options[:counter_cache]`
returns `false` after the initializer runs. The gem wires `belongs_to
:tag, counter_cache: ActsAsTaggableOn.tags_counter` at class-load time,
so the initializer must sit ahead of the `Tagging` autoload path; this
confirms it does.
2026-04-10 17:32:13 +05:30
224b1f98b0 fix: handle ioerror in imap fetch (#13960)
## Description

The IMAP email fetch job (Inboxes::FetchImapEmailsJob) crashes with an
unhandled IOError: closed stream when the mail server's SSL socket is
closed mid-write during Net::IMAP#fetch. This error was being reported
to Sentry because the rescue clause only caught EOFError, not its parent
class IOError.

Fixes
[CW-6689](https://linear.app/chatwoot/issue/CW-6689/ioerror-closed-stream-ioerror)

Widened the rescue in fetch_imap_emails_job.rb from EOFError to IOError.

In Ruby's exception hierarchy, EOFError is a subclass of IOError:
```
StandardError
  └── IOError
        └── EOFError
```
The Sentry stacktrace shows a plain IOError: closed stream raised from
OpenSSL::Buffering#do_write → Net::IMAP#put_string → Net::IMAP#fetch.
Since this is an IOError (not EOFError), it bypassed the existing rescue
and fell through to the StandardError catch-all, which reported it to
Sentry as an unhandled exception.

Rescuing IOError now catches both:

IOError: closed stream — the reported crash (parent class)
EOFError — the previously handled case (still caught as a subclass)

## Type of change

- [ ] Bug fix (non-breaking change which fixes an issue)



## Checklist:

- [ ] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 13:31:28 +05:30
PranavandGitHub 3190b29fe9 fix(revert): "fix: Ignore RoutingError in New Relic error reporting (#14030)" (#14038)
This reverts commit 42163946eb.
2026-04-10 12:27:15 +05:30
PranavandGitHub 42163946eb fix: Ignore RoutingError in New Relic error reporting (#14030)
Routing errors (404s) are expected in production and don't represent
actionable issues. Reporting them to New Relic creates noise and makes
it harder to spot real errors. Adds ActionController::RoutingError to
the New Relic error_collector.ignore_errors list so these are no longer
tracked as exceptions.
2026-04-10 11:42:44 +05:30
f13f3ba446 fix: log only on system api key failures (#13968)
Removes sentry flooding of unnecessary rubyllm logs of wrong API key.
Logs only system api key error since it would be P0.

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 18:04:52 +05:30
Tanmay Deep SharmaandGitHub f1da7b8afa feat: enable assignment v2 by default for new accounts (#14031)
## Description

Enable assignment v2 by default for new accounts

## Type of change

- [ ] New feature (non-breaking change which adds functionality)


## Checklist:

- [ ] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules
2026-04-09 16:14:17 +05:30
Sivin VargheseandGitHub bd14e96ed9 chore: allow article to create without content (#14007) 2026-04-09 10:40:37 +05:30
00837019b5 fix(captain): display handoff message to customer in V2 flow (#13885)
HandoffTool changes conversation status but only posts a private note.
ResponseBuilderJob now detects the tool flag and creates the public
handoff message that was previously only shown in V1.

# Pull Request Template

## Description

Captain V2 was silently forwarding conversations to humans without
showing a handoff message to the customer. The conversation appeared to
just stop
responding.

Root cause: In V2, HandoffTool calls bot_handoff! during agent
execution, which changes conversation status from pending to open. By
the time control returns
to ResponseBuilderJob#process_response, the conversation_pending? guard
returns early - skipping create_handoff_message entirely. The V1 flow
didn't have this
problem because AssistantChatService just returns a string token
(conversation_handoff) and lets ResponseBuilderJob handle everything.

What changed:

1. AgentRunnerService now surfaces the handoff_tool_called flag (already
tracked internally for usage metadata) in its response hash.
2. ResponseBuilderJob#handoff_requested? detects handoffs from both V1
(response token) and V2 (tool flag).
3. ResponseBuilderJob#process_response checks handoff_requested? before
the conversation_pending? guard, so V2 handoffs are processed even when
the status has
already changed.
4. ResponseBuilderJob#process_action('handoff') captures
conversation_pending? before calling bot_handoff! and uses that snapshot
to guard both bot_handoff!
and the OOO message - preventing double-execution when V2's HandoffTool
already ran them.

New V2 handoff flow:
AgentRunnerService
  → agent calls HandoffTool (creates private note, calls bot_handoff!)
  → returns response with handoff_tool_called: true

ResponseBuilderJob#process_response
  → handoff_requested? detects the flag
  → process_action('handoff')
    → create_handoff_message (public message for customer)
    → bot_handoff! skipped (conversation_pending? is false)
    → OOO skipped (conversation_pending? is false)

Fixes #13881

## Type of change

Please delete options that are not relevant.

- [x] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality not to work as expected)
- [ ] This change requires a documentation update

## How Has This Been Tested?

- Update existing response_builder_job_spec.rb covering the V2 handoff
path, V2 normal response path, and V1 regression
- Updated existing agent_runner_service_spec.rb expectations for the new
handoff_tool_called key and added a context for when the flag is true

## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [x] Any dependent changes have been merged and published in downstream
modules

---------

Co-authored-by: Aakash Bakhle <48802744+aakashb95@users.noreply.github.com>
Co-authored-by: aakashb95 <aakashbakhle@gmail.com>
2026-04-08 17:30:07 +05:30
YJack0000andGitHub 45124c3b41 fix(i18n): improve zh-TW translation coverage and quality (#14004)
Comprehensive update to Traditional Chinese (Taiwan) translations. As a
native zh-TW speaker and active user based in Taiwan, I found the
existing translations were quite incomplete (~54% overall) with many
strings still in English. Some existing translations also used
Simplified Chinese terms or unnatural phrasing.

I chose to submit this as a direct PR rather than going through Crowdin
because working through all the files at once is much faster and lets me
ensure consistent terminology across the entire locale.

Closes #14003

## What changed

**Backend (`config/locales/zh_TW.yml`)**
- Translated all ~259 previously untranslated strings (was ~19%
complete, now 100%)
- Covers: error messages, notifications, activity logs, integration
descriptions, Captain AI, public portal, reports

**Frontend (42 JSON files under `dashboard/i18n/locale/zh_TW/`)**
- Translated ~2,627 previously untranslated strings (was ~50% complete,
now ~100%)
- Most impacted files: `inboxMgmt.json`, `integrations.json`,
`settings.json`, `conversation.json`, `contact.json`, `report.json`

**Quality fixes across all files**
- Replaced Simplified Chinese terms mixed into zh-TW: 账→帳, 获→取得, 模板→範本,
收件箱→收件匣, 重置→重設, 自定義→自訂
- Standardized terminology for consistency: 客服人員 (agent), 延後 (snooze),
稽核 (audit), 巨集 (macro)
- Fixed incorrect translations (e.g., audit log table headers were
swapped, availability label was wrong)

## How to test

1. Set account/user language to 中文(台灣)
2. Navigate through the dashboard — settings, inbox management,
integrations, reports, conversations
3. Verify strings display in natural Traditional Chinese with no
remaining English gaps
4. Check that all placeholders (names, counts, dates) render correctly
2026-04-08 13:42:20 +05:30
699b12b1d3 fix: Block inline images in message signatures (#13772)
# Pull Request Template

## Description

This PR includes, block inline images in message signatures and prevent
auto signature insertion when editor is disabled.

- Strip inline base64 images from signature on save and show warning
message
- Add `INLINE_IMAGE_WARNING` translation key for signature inline image
removal notification
- Add disabled check to `addSignature()` to prevent signature insertion
when editor is disabled
- Add `isEditorDisabled` checks to signature toggle logic in
`toggleSignatureForDraft()`, `replaceText()`, and `clearMessage()`
- Remove unused `replaceText` from the codebase, which belongs to old
`textarea` editor

Fixes
https://linear.app/chatwoot/issue/CW-6588/the-browser-hangs-when-the-message-signature-contains-inline-image

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

### Loom video
https://www.loom.com/share/fb556b46a12a4308a737eed732d5ed73


## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

---------

Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>
2026-04-08 12:17:19 +05:30
Shivam MishraandGitHub e5107604a0 feat: account enrichment using context.dev [UPM-27] (#13978)
## Account branding enrichment during signup

This PR does the following

### Replace Firecrawl with Context.dev

Switches the enterprise brand lookup from Firecrawl to Context.dev for
better data quality, built-in caching, and automatic filtering of
free/disposable email providers. The service interface changes from URL
to email input to match Context.dev's email endpoint. OSS still falls
back to basic HTML scraping with a normalized output shape across both
paths.

The enterprise path intentionally does not fall back to HTML scraping on
failure — speed matters more than completeness. We want the user on the
editable onboarding form fast, and a slow fallback scrape is worse than
letting them fill it in.

Requires `CONTEXT_DEV_API_KEY` in Super Admin → App Config. Without it,
falls back to OSS HTML scraping.

### Add job to enrich account details

After account creation, `Account::BrandingEnrichmentJob` looks up the
signup email and pre-fills the account name, colors, logos, social
links, and industry into `custom_attributes['brand_info']`.

The job signals completion via a short-lived Redis key (30s TTL) + an
ActionCable broadcast (`account.enrichment_completed`). The Redis key
lets the frontend distinguish "still running" from "finished with no
results."
2026-04-08 11:16:52 +05:30
Shivam MishraandGitHub 871f2f4d56 fix: harden fetching on upload endpoint (#14012) 2026-04-08 10:47:54 +05:30
iamsivin d92b278b60 chore: Minor fix 2026-04-08 10:37:30 +05:30
Sivin VargheseandGitHub d26b6e0e64 Merge branch 'develop' into inline-edit 2026-04-08 10:35:05 +05:30
4f94ad4a75 feat: ensure signup verification [UPM-14] (#13858)
Previously, signing up gave immediate access to the app. Now,
unconfirmed users are redirected to a verification page where they can
resend the confirmation email.

- After signup, the user is routed to `/auth/verify-email` instead of
the dashboard
- After login, unconfirmed users are redirected to the verification page
- The dashboard route guard catches unconfirmed users and redirects them
- `active_for_authentication?` is removed from the sessions controller
so unconfirmed users can authenticate — the frontend gates access
instead
- If the user visits the verification page after already confirming,
they're automatically redirected to the dashboard
- No session is issued until the user is verified

<details><summary>Demo</summary>
<p>

#### Fresh Signup


https://github.com/user-attachments/assets/abb735e5-7c8e-44a2-801c-96d9e4823e51

#### Google Fresh Signup


https://github.com/user-attachments/assets/ab9e389a-a604-4a9d-b492-219e6d94ee3f


#### Create new account from Dashboard


https://github.com/user-attachments/assets/c456690d-1946-4e0b-834b-ad8efcea8369



</p>
</details>

---------

Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>
2026-04-07 13:45:17 +05:30
fbe3560b7a feat(captain): Add paywall and expose Custom Tools (#13977)
# Pull Request Template

## Description

Custom tools is now discoverable on all plans

## Type of change
- [x] Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

Before:
<img width="390" height="446" alt="CleanShot 2026-04-02 at 13 40 11@2x"
src="https://github.com/user-attachments/assets/0a751954-f3ad-47d6-85b8-1e2f1476a646"
/>


After:

<img width="392" height="522" alt="CleanShot 2026-04-02 at 13 40 47@2x"
src="https://github.com/user-attachments/assets/62a252f6-2551-47a9-b50c-be949f08c456"
/>

<img width="1826" height="638" alt="CleanShot 2026-04-02 at 13 37 39@2x"
src="https://github.com/user-attachments/assets/77dc2a75-3d76-44cf-8579-8d3457879bd0"
/>


## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] I have commented on my code, particularly in hard-to-understand
areas
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [x] Any dependent changes have been merged and published in downstream
modules

---------

Co-authored-by: Shivam Mishra <scm.mymail@gmail.com>
2026-04-07 10:58:29 +05:30
118270d2e8 fix(agent-bot): Update listener spec to match signed webhook arguments (#14006)
Fixes failing `agent_bot_listener_spec.rb` tests for
`conversation_status_changed` events. After #13892 added webhook
signing, `process_webhook_bot_event` passes `:agent_bot_webhook` and
`secret:`/`delivery_id:` kwargs to
`AgentBots::WebhookJob.perform_later`, but two spec expectations were
not updated to match the new call signature.

## What changed
- Updated `perform_later` expectations in `conversation_status_changed`
specs to include the `:agent_bot_webhook` type and `secret` keyword
arguments.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Muhsin <12408980+muhsin-k@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 16:45:47 +04:00
8c0c0fd32c chore: Update translations (#13990)
Co-authored-by: Sojan Jose <sojan.official@gmail.com>
Co-authored-by: Sojan Jose <sojan@pepalo.com>
2026-04-06 15:35:59 +05:30
50d6ebaaca fix(agent-bot): Dispatch conversation_status_changed event to agent bots (#14002)
Agent bots assigned to a conversation were not receiving
`conversation_status_changed` webhook events. This meant bots could not
react to status transitions like moving a conversation to **pending**.
The deprecated `conversation_opened` and `conversation_resolved` events
were still being delivered, but the newer unified
`conversation_status_changed` event was silently dropped because
`AgentBotListener` had no handler for it.


## What changed

- Added `conversation_status_changed` handler to `AgentBotListener`,
matching the pattern already used by `WebhookListener`. The payload
includes `changed_attributes` so bots know which status transition
occurred.

## How to test

1. Configure an agent bot with an `outgoing_url` (e.g. a webhook.site
endpoint).
2. Assign the bot to an inbox or conversation.
3. Change a conversation's status to **pending** (or any other status).
4. Verify the bot receives a `conversation_status_changed` event with
the correct `changed_attributes`.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Muhsin <12408980+muhsin-k@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 14:05:50 +04:00
95463230cb feat: sign webhooks for API channel and agentbots (#13892)
Account webhooks sign outgoing payloads with HMAC-SHA256, but agent bot
and API inbox webhooks were delivered unsigned. This PR adds the same
signing to both.

Each model gets a dedicated `secret` column rather than reusing the
agent bot's `access_token` (for API auth back into Chatwoot) or the API
inbox's `hmac_token` (for inbound contact identity verification). These
serve different trust boundaries and shouldn't be coupled — rotating a
signing secret shouldn't invalidate API access or contact verification.

The existing `Webhooks::Trigger` already signs when a secret is present,
so the backend change is just passing `secret:` through to the jobs.
Shared token logic is extracted into a `WebhookSecretable` concern
included by `Webhook`, `AgentBot`, and `Channel::Api`. The frontend
reuses the existing `AccessToken` component for secret display. Secrets
are admin-only and excluded from enterprise audit logs.

### How to test

Point an agent bot or API inbox webhook URL at a request inspector. Send
a message and verify `X-Chatwoot-Signature` and `X-Chatwoot-Timestamp`
headers are present. Reset the secret from settings and confirm
subsequent deliveries use the new value.

---------

Co-authored-by: Sojan Jose <sojan@pepalo.com>
2026-04-06 15:28:25 +05:30
Sivin VargheseandGitHub dd641aeef3 Merge branch 'develop' into inline-edit 2026-04-06 12:46:03 +05:30
f4d66566d0 fix(agent-bot): Include changed_attributes in conversation_updated webhook (#14001)
The `conversation_updated` webhook sent to AgentBots did not include
`changed_attributes`, making it impossible for bots to distinguish
between different types of conversation updates (e.g. bot assignment vs
label change vs status change).

This aligns the AgentBot webhook payload with the existing
`WebhookListener` behavior, which already includes `changed_attributes`.

## How to reproduce

1. Assign an AgentBot to a conversation
2. Then update the conversation (e.g. add a label)
3. **Before fix:** Both events arrive with identical payload structure —
bot cannot tell them apart
4. **After fix:** Each event includes `changed_attributes` showing
exactly what changed

## What changed

- **`AgentBotListener#conversation_updated`**: Added
`changed_attributes` to the webhook payload using
`extract_changed_attributes` (same pattern as `WebhookListener`)

## How to test

1. Assign an AgentBot to a conversation via API
2. Check the webhook payload — should include:
   ```json
   "changed_attributes": [
{ "assignee_agent_bot_id": { "previous_value": null, "current_value": 7
} }
   ]
   ```
3. Update the conversation (e.g. add a label)
4. Check the webhook payload — `changed_attributes` should reflect the
label change, not bot assignment

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Muhsin <12408980+muhsin-k@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 11:14:09 +04:00
Sivin VargheseandGitHub 9119e947f0 Merge branch 'develop' into inline-edit 2026-04-06 12:36:22 +05:30
5fd3d5e036 feat: allow zero conversation limit capacity policy (#13964)
## Description

Two improvements to Agent Capacity Policy:

**1. Support exclusion via zero conversation limit**
Allow `conversation_limit` to be `0` on inbox capacity limits. Agents
with a zero limit are excluded from auto-assignment for that inbox while
remaining members for manual assignment.

**2. Fix exclusion rules duration input**
- Default changed from `10` to `null` so time-based exclusion isn't
applied unless explicitly set.
- Minimum lowered from 10 to 1 minute.
- `DurationInput` updated to handle `null` values correctly.

## Type of change

Please delete options that are not relevant.

- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)

## How Has This Been Tested?

- Added model and capacity service specs for zero-limit exclusion
behavior.
- Tested manually via UI flows 

## Checklist:

- [ ] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

---------

Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>
2026-04-06 11:39:14 +05:30
iamsivin ac60784f95 chore: Review fix 2026-04-03 00:12:58 +05:30
iamsivin 9ab45ad50e chore: Review fix 2026-04-02 23:11:47 +05:30
iamsivin 1e3be0ac24 chore: Review fix 2026-04-02 23:09:21 +05:30
Sivin VargheseandGitHub 35715ae841 Merge branch 'develop' into inline-edit 2026-04-02 22:37:56 +05:30
iamsivin 27fd2b8d86 chore: Update inline input 2026-04-02 22:37:34 +05:30
Tanmay Deep SharmaandGitHub 6f5ad8f372 fix: strip manually_managed_features from params in super admin account create (#13983)
## Summary

When a Super Admin creates a new account via the Administrate dashboard,
the `manually_managed_features` field (a virtual attribute stored in
`internal_attributes` JSON) is passed to `Account.new(...)`, raising
`ActiveModel::UnknownAttributeError`. The existing `update` action
already strips this param — this fix adds the same handling to `create`.

Closes -> https://linear.app/chatwoot/issue/INF-66
Related Sentry ->
https://chatwoot-p3.sentry.io/issues/7168237533/?project=6382945&referrer=Linear

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)

## How to reproduce

1. Log in as Super Admin
2. Navigate to Accounts → New
3. Fill in the form (with or without manually managed features selected)
4. Submit → `ActiveModel::UnknownAttributeError: unknown attribute
'manually_managed_features' for Account`

## What changed

- Added a `create` override in
`Enterprise::SuperAdmin::AccountsController` that strips
`manually_managed_features` from params before calling `super`, then
persists them via `InternalAttributesService` after the account is
saved.
2026-04-02 19:58:43 +05:30
441fe4db11 fix: scope external_url override to Instagram DM conversations only (#13982)
Previously, all incoming messages from Facebook channel with
instagram_id had their attachment data_url and thumb_url overridden with
external_url. This caused issues for non-Instagram conversations
originating from Facebook Message where the file URL should be used
instead.

Narrows the override to only apply when the conversation type is
instagram_direct_message, which is the only case where Instagram's CDN
URLs need to be used directly.

Fixes
https://linear.app/chatwoot/issue/CW-6722/videos-are-missing-in-facebook-conversation

---------

Co-authored-by: Muhsin <12408980+muhsin-k@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 19:56:23 +05:30
Shivam MishraandGitHub b9b5a18767 revert: html background for widget (#13981)
Reverts chatwoot/chatwoot#13955
2026-04-02 16:02:22 +05:30
b815eb9ce0 fix(agent-bot): Dispatch webhook event on agent bot assignment (#13975)
When an AgentBot is assigned to a conversation after the first message
has already been received, the bot does not respond because it never
receives any event. The `message_created` event fires before the bot is
assigned, and the bot has no way to know it was assigned.

Chatwoot already dispatches a `CONVERSATION_UPDATED` event when
`assignee_agent_bot_id` changes, but `AgentBotListener` wasn't listening
for it. This fix adds a `conversation_updated` handler so the bot
receives a webhook with the conversation context when assigned.

## How to reproduce

1. Customer sends a message → conversation created, `message_created`
fires
2. System processes the message (adds labels, custom attributes)
3. System assigns an AgentBot to the conversation via API
4. **Before fix:** Bot receives no event and never responds
5. **After fix:** Bot receives `conversation_updated` event with
conversation payload

## What changed

- **`AgentBotListener`**: Added `conversation_updated` handler that
sends the conversation webhook payload to the assigned bot when the
conversation is updated

## How to test

1. Create an AgentBot with an `outgoing_url` pointing to a webhook
inspector (e.g. webhook.site)
2. Send a message to create a conversation
3. Assign the AgentBot to the conversation via API:
   ```
   POST /api/v1/accounts/{id}/conversations/{id}/assignments
   { "assignee_id": <bot_id>, "assignee_type": "AgentBot" }
   ```
4. Verify the bot receives a `conversation_updated` event at its webhook
URL

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 13:55:05 +04:00
Muhsin KelothandGitHub b3d0af84c4 fix(widget): Queue SDK-set conversation attributes and labels for first message (#13912)
### Description

When integrating the web widget via the JS SDK, customers call
setConversationCustomAttributes and setLabel on chatwoot:ready — before
any conversation exists. These API calls silently fail because the
backend endpoints require an existing conversation. When the visitor
sends their first message, the conversation is created without those
attributes/labels, so the message_created webhook payload is missing the
expected metadata.

This change queues SDK-set conversation custom attributes and labels in
the widget store when no conversation exists yet, and includes them in
the API request when the first message (or attachment) creates the
conversation. The backend now permits and applies these params during
conversation creation — before the message is saved and webhooks fire.

###  How to test

  1. Configure a web widget without a pre-chat form.
2. Open the widget on a test page and run the following in the browser
console after chatwoot:ready:
`window.$chatwoot.setConversationCustomAttributes({ plan: 'enterprise'
});`
`window.$chatwoot.setLabel('vip');` // must be a label that exists in
the account
  3. Send the first message from the widget.
4. Verify in the Chatwoot dashboard that the conversation has plan:
enterprise in custom attributes and the vip label applied.
5. Set up a webhook subscriber for `message_created` confirm the first
payload includes the conversation metadata.
6. Verify that calling `setConversationCustomAttributes` / `setLabel` on
an existing conversation still works as before (direct API path, no
regression).
  7. Verify the pre-chat form flow still works as expected.
2026-04-02 12:09:24 +04:00
d83beb2148 fix: Populate extension and include content_type in attachment webhook payload (#13945)
Attachment webhook event payloads (`message_created`) were missing the
file extension and content type. The `extension` column existed but was
never populated, and `content_type` was not included in the payload at
all.

## What changed

- Added `before_save :set_extension` callback to extract file extension
from the filename when saving an attachment.
- Added `content_type` (from ActiveStorage) to the `file_metadata` used
in `push_event_data`.

### Before
```json
{
  "extension": null,
  "data_url": "...",
  "file_size": 11960
}
```

### After
```json
{
  "extension": "pdf",
  "content_type": "application/pdf",
  "data_url": "...",
  "file_size": 11960
}
```

## How to reproduce
1. Send a message with a file attachment (e.g., PDF) via any channel
2. Inspect the `message_created` webhook payload
3. Observe `extension` is `null` and `content_type` is missing

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 11:13:11 +04:00
Sivin VargheseandGitHub c71bcc2428 Merge branch 'develop' into inline-edit 2026-04-02 12:40:43 +05:30
8daf6cf6cb feat: captain custom tools v1 (#13890)
# Pull Request Template

## Description

Adds custom tool support to v1

## Type of change
- [x] New feature (non-breaking change which adds functionality)


## How Has This Been Tested?

Please describe the tests that you ran to verify your changes. Provide
instructions so we can reproduce. Please also list any relevant details
for your test configuration.

<img width="1816" height="958" alt="CleanShot 2026-03-24 at 11 37 33@2x"
src="https://github.com/user-attachments/assets/2777a953-8b65-4a2d-88ec-39f395b3fb47"
/>

<img width="378" height="488" alt="CleanShot 2026-03-24 at 11 38 18@2x"
src="https://github.com/user-attachments/assets/f6973c99-efd0-40e4-90fe-4472a2f63cea"
/>

<img width="1884" height="1452" alt="CleanShot 2026-03-24 at 11 38
32@2x"
src="https://github.com/user-attachments/assets/9fba4fc4-0c33-46da-888a-52ec6bad6130"
/>



## Checklist:

- [x] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Shivam Mishra <scm.mymail@gmail.com>
2026-04-02 12:40:11 +05:30
Shivam MishraandGitHub 211fb1102d chore: rotate oauth password if unconfirmed (#13878)
When a user signs up with an email they don't own and sets a password,
that password remains valid even after the real owner later signs in via
OAuth. This means the original registrant — who never proved ownership
of the email — retains working credentials on the account. This change
closes that gap by rotating the password to a random value whenever an
unconfirmed user completes an OAuth sign-in.

The check (`oauth_user_needs_password_reset?`) is evaluated before
`skip_confirmation!` runs, since confirmation would flip `confirmed_at`
and mask the condition. If the user was unconfirmed, the stored password
is replaced with a secure random string that satisfies the password
policy. This applies to both the web and mobile OAuth callback paths, as
well as the sign-up path where the password is rotated before the reset
token is generated.

Users who lose access to password-based login as a side effect can
recover through the standard "Forgot password" flow at any time. Since
they've already proven email ownership via OAuth, this is a low-friction
recovery path
2026-04-02 11:26:29 +05:30
Sivin VargheseandGitHub 7b09b033ef fix: Markdown tables don't render properly in help centre (#13971)
# Pull Request Template

## Description

This PR fixes an issue where markdown tables were not rendering
correctly in the Help Center.

The issue was caused by a backslash `(\)` being appended after table row
separators `(|)`, which breaks the markdown table parsing.

The issue was introduced after recent editor changes made to preserve
new lines, which unintentionally affected how table markdown is parsed
and displayed.

### https://github.com/chatwoot/prosemirror-schema/pull/44

Fixes
https://linear.app/chatwoot/issue/CW-6714/markdown-tables-dont-render-properly-in-help-centre-preview

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

**Before**
```
| Type         | What you provide              |\
|--------------|-------------------------------|\
| None         | No authentication             |\
| Bearer Token | A token string                |\
| Basic Auth   | Username and password         |\
| API Key      | A custom header name and value|
```

**After**
```
| Type         | What you provide              | 
|--------------|-------------------------------| 
| None         | No authentication             | 
| Bearer Token | A token string                | 
| Basic Auth   | Username and password         | 
| API Key      | A custom header name and value|
```




## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules
2026-04-02 11:02:21 +05:30
Vishnu NarayananandGitHub 65867b8b36 fix: exclude MutexApplicationJob::LockAcquisitionError from Sentry (#13965)
## Summary
- Add `MutexApplicationJob::LockAcquisitionError` to Sentry's
`excluded_exceptions`
- This error is expected control flow (mutex lock contention during
webhook processing), not a bug
- Generated ~131K Sentry events in March 2026, 100% from
`InstagramEventsJob`

Fixes https://linear.app/chatwoot/issue/INF-58
2026-04-01 18:02:19 +05:30
4cce7f6ad8 fix(line): Use non-expiring URLs for image and video messages (#13949)
Images and videos sent from Chatwoot to LINE inboxes fail to display on
the LINE mobile app — users see expired markers, broken thumbnails, or
missing images. This happens because LINE mobile lazy-loads images
rather than downloading them immediately, and the ActiveStorage signed
URLs expire after 5 minutes.

Closes
https://linear.app/chatwoot/issue/CW-6696/line-messaging-with-image-or-video-may-not-show-when-client-inactive

## How to reproduce

1. Create a LINE inbox and start a chat from the LINE mobile app
2. Close the LINE mobile app
3. Send an image from Chatwoot to that chat
4. Wait 7-8 minutes (past the 5-minute URL expiration)
5. Open the LINE mobile app — the image is broken/expired

## What changed

- **`originalContentUrl`**: switched from `download_url` (signed, 5-min
expiry) to `file_url` (permanent redirect-based URL)
- **`previewImageUrl`**: switched to `thumb_url` (250px resized
thumbnail meeting LINE's 1MB/240x240 recommendation), with fallback to
`file_url` for non-image attachments like video

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Sojan Jose <sojan@pepalo.com>
2026-04-01 17:29:12 +05:30
f2cb23d6e9 fix: handle Socket::ResolutionError in browser push notifications (#13957)
## Linear Ticket

https://linear.app/chatwoot/issue/CW-6707/socketresolutionerror-failed-to-open-tcp-connection-to-permanently

https://linear.app/chatwoot/issue/CW-6707/socketresolutionerror-failed-to-open-tcp-connection-to-permanently#comment-14e0f9ff

## Description

Browser push notifications fail with Socket::ResolutionError when the
push subscription endpoint's domain can't be resolved via DNS (e.g.,
defunct push service, transient DNS failure). This error wasn't handled
in handle_browser_push_error, so it fell through to the catch-all else
branch and got reported to Sentry on every notification attempt — 1,637
times in the last 7 days.
The dead subscription was never cleaned up or the error suppressed, so
every subsequent notification for the affected user triggered the same
Sentry alert.
Added Socket::ResolutionError to the existing transient network error
handler alongside Errno::ECONNRESET, Net::OpenTimeout, and
Net::ReadTimeout. The error is logged but not reported to Sentry, and
the subscription is kept intact in case it's a temporary DNS blip.

## Type of change

- [ ] Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

- Verified that Socket::ResolutionError is a subclass of StandardError
and matches the when clause

## Checklist:

- [ ] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

Co-authored-by: Vishnu Narayanan <iamwishnu@gmail.com>
2026-04-01 16:55:49 +05:30
Sivin VargheseandGitHub 8824efe0e1 fix(sentry): syntaxError: No error message (#13954) 2026-03-31 21:09:02 +05:30
Sivin VargheseandGitHub 5de7ae492c fix: html/body background not applied in appearance mode (#13955)
# Pull Request Template

## Description

This PR fixes the white background bleed visible in the widget, widget
article viewer and help center when dark mode is active.

**What was happening**

While scrolling, the `<body>` element retained a white background in
dark mode. This occurred because dark mode classes were only applied to
inner container elements, not the root.

**What changed**

* **Widget:** Updated the `useDarkMode` composable to sync the `dark`
class to `<html>` using `watchEffect`, allowing `<body>` to inherit dark
theme variables. Also added background styles to `html`, `body`, and
`#app` in `woot.scss`.
* **Help center portal:** Moved `bg-white dark:bg-slate-900` from
`<main>` to `<body>` in the portal layout so the entire page background
responds correctly to dark mode, including within the widget iframe.
* **ArticleViewer:** Replaced hardcoded `bg-white` with `bg-n-solid-1`
to ensure better theming.


Fixes
https://linear.app/chatwoot/issue/CW-6704/widget-body-colour-not-implemented

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

### Screencasts

### Before

**Widget**


https://github.com/user-attachments/assets/e0224ad1-81a6-440a-a824-e115fb806728

**Help center**


https://github.com/user-attachments/assets/40a8ded5-5360-474d-9ec5-fd23e037c845



### After

**Widget**


https://github.com/user-attachments/assets/dd37cc68-99fc-4d60-b2ae-cf41f9d4d38c

**Help center**


https://github.com/user-attachments/assets/bc998c4e-ef77-46fa-ac7f-4ea16d912ce3




## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules
2026-03-31 16:55:21 +05:30
Pranav b5db3c9512 Inline edit for phone, email, company 2026-03-31 14:58:26 +05:30
Aakash BakhleandGitHub b4b5de9b46 fix: conservative hand_off prompt on auto-resolution (#13953)
# Pull Request Template

## Description

The initial version of prompt deciding to resolve or hand-off to human
agents was too conservative especially in cases where a link or an
action was told to customer. If the customer didn't respond, Captain was
told to hand it off to the agent, but customer may actually have solved
the issue. If not, they can come back and continue the conversation.

Removed two lines about the same and now we should not see needless
handoffs.

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

Please describe the tests that you ran to verify your changes. Provide
instructions so we can reproduce. Please also list any relevant details
for your test configuration.
locally

## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [x] Any dependent changes have been merged and published in downstream
modules
2026-03-31 11:10:12 +05:30
Tanmay Deep SharmaandGitHub 1987ac3d97 fix: remove bulk_auto_assignment_job cron schedule (#13877) 2026-03-31 10:56:59 +05:30
Sivin VargheseandGitHub 0012fa2c35 fix: align message trimming with configured maxLength (#13947)
# Pull Request Template

## Description

This PR fixes 
1. Messages being trimmed to the default 1024 limit in `trimContent`
method, instead of channel-specific limits for drafts and AI tasks.
2. Telegram messages are allowed up to 10,000 characters in config, but
the API supports only 4096, causing failures for oversized messages.

Fixes
https://linear.app/chatwoot/issue/CW-6694/captain-ai-rewrite-tasks-truncate-draft-to-1024-chars-trimcontent
https://github.com/chatwoot/chatwoot/issues/13919

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

### Loom video

**Before**
https://www.loom.com/share/00e9d6b4d19247febf35dffa99da3805

**After**
https://www.loom.com/share/c4900e9effc345c79bcd8a5aa1ee277b


## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules
2026-03-31 10:39:54 +05:30
Aakash BakhleandGitHub b4ce59eea8 feat: reclaim response_bot flag for custom_tools (#13897)
Repurpose the deprecated response_bot feature flag slot for
custom_tools.

Migration disables the flag on any accounts that had response_bot
enabled so the repurposed slot starts in its default-off state.

Pre-deploy: run the disable script on production using the old flag name
(response_bot) before deploying this migration.
2026-03-31 10:35:50 +05:30
Sivin VargheseandGitHub 42441dbd28 feat: add GuideJar embed support in HC (#13944) 2026-03-30 14:19:02 +05:30
Alok DangreandGitHub b9f824b43b fix(ui): resolve unreadable select options in dark mode (#13207) 2026-03-30 13:05:28 +05:30
Shivam MishraandGitHub 7651c18b48 feat: firecrawl branding api [UPM-15] (#13903)
Adds `WebsiteBrandingService` (OSS) with an Enterprise override using
Firecrawl v2 to extract branding and business data from a URL for
onboarding auto-fill.

OSS version uses HTTParty + Nokogiri to extract:
- Business name (og:site_name or title)
- Language (html lang)
- Favicon
- Social links from `<a>` tags

Enterprise version makes a single Firecrawl call to fetch:
- Structured JSON (name, language, industry via LLM)
- Branding (favicon, primary color)
- Page links

Falls back to OSS if Firecrawl is unavailable or fails.

Social handles (WhatsApp, Facebook, Instagram, Telegram, TikTok, LINE)
are parsed deterministically via a shared `SocialLinkParser`.

> We use links for socials, since the LLM extraction was unreliable,
mostly returned empty, and hallucinated in some rare scenarios

## How to test

```ruby
# OSS (no Firecrawl key needed)
WebsiteBrandingService.new('chatwoot.com').perform

# Enterprise (requires CAPTAIN_FIRECRAWL_API_KEY)
WebsiteBrandingService.new('notion.so').perform
WebsiteBrandingService.new('postman.com').perform
```

Verify the returned hash includes business_name, language,
industry_category, social_handles, and branding with
favicon/primary_color.

<img width="908" height="393" alt="image"
src="https://github.com/user-attachments/assets/e3696887-d366-485a-89a0-8e1a9698a788"
/>
2026-03-30 11:32:03 +05:30
Tanmay Deep SharmaandGitHub 04acc16609 fix: skip pay call if invoice already paid after finalize (#13924)
## Description

When a customer downgrades from Enterprise to Business, they may retain
unused Stripe credit balance. During an AI credits topup,
Stripe::Invoice.finalize_invoice auto-applies that credit balance to the
invoice. If the credit balance fully covers the invoice amount, Stripe
marks it as paid immediately upon finalization. Calling
Stripe::Invoice.pay on an already-paid invoice throws an error, breaking
the topup flow.
This fix retrieves the invoice status after finalization and skips the
pay call if Stripe has already settled it via credits.

## Type of change

Please delete options that are not relevant.

- [ ] Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

Tested against Stripe test mode with the following scenarios:

- Full credit balance payment: Customer has enough Stripe credit balance
to cover the entire invoice. Invoice is marked paid after
finalize_invoice — pay is correctly skipped. Credits are fulfilled
successfully.
- Partial credit balance payment: Customer has some Stripe credit
balance but not enough to cover the full amount. Invoice remains open
after finalization — pay is called and charges the remaining amount to
the default payment method. Credits are fulfilled successfully.
- Zero credit balance (normal payment): Customer has no Stripe credit
balance. Invoice remains open after finalization — pay charges the full
amount. Credits are fulfilled successfully.


## 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
2026-03-30 10:37:28 +05:30
44a7a13117 fix: Add Estonian to settings language options (#13936)
Adds Estonian to the settings language dropdown so accounts can select
the existing `et` translation from the UI.

Fixes: N/A
Closes: N/A

## Why
Estonian translation files already exist in the repo and in Crowdin, but
the settings dropdown is driven by `LANGUAGES_CONFIG`, where `et` was
missing.

## What this change does
- Adds `et` / `Eesti (et)` to `LANGUAGES_CONFIG`
- Makes Estonian available in the settings language selectors backed by
`enabledLanguages`

## Validation
- `ruby -c config/initializers/languages.rb`
- Opened the local UI at `/app/accounts/1/settings/general` and verified
`Eesti (et)` appears in the `Site language` dropdown

---------

Co-authored-by: Pranav <pranav@chatwoot.com>
2026-03-29 09:44:34 +05:30
Tanmay Deep SharmaandGitHub 9efd554693 fix: resolve V2 capacity bypass in team assignment (#13904)
## Description

When Assignment V2 is enabled, the V2 capacity policies
(AgentCapacityPolicy / InboxCapacityLimit) are not respected during
team-based assignment paths. The system falls back to the legacy V1
max_assignment_limit, and since V1 is deprecated and typically
unconfigured in V2 setups, agents receive unlimited assignments
regardless of their V2 capacity.

Root cause: Inbox class directly defined
member_ids_with_assignment_capacity, which shadowed the
Enterprise::InboxAgentAvailability module override in Ruby's method
resolution order (MRO). This made the V2 capacity check unreachable
(dead code) for any code path using member_ids_with_assignment_capacity.

## Type of change

- [ ] Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

⏺ Before the fix
1. Enable assignment_v2 + advanced_assignment on account
2. Create AgentCapacityPolicy with InboxCapacityLimit = 1 for an inbox
3. Assign the policy to an agent (e.g., John)
4. Create 1 open conversation assigned to John (now at capacity)
5. Create a new unassigned conversation in the same inbox
6. Assign a team (containing John) to that conversation
7. Result: John gets assigned despite being at capacity
⏺ After the fix
Same steps 1–6.
7. Result: John is NOT assigned — conversation stays unassigned (no
agents with capacity available)


## 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
2026-03-27 15:38:17 +05:30
Sojan JoseandGitHub 2b296c06fb chore(security): ignore CVE-2026-33658 for Chatwoot storage defaults (#13922)
This ignores `CVE-2026-33658` in `bundler-audit` after validating that
Chatwoot's default and recommended storage setups do not use Active
Storage proxy mode.

Fixes: N/A
Closes: N/A

## Why
`CVE-2026-33658` is an Active Storage proxy-mode DoS issue triggered by
multi-range requests.

For Chatwoot, the default and recommended setups do not appear to route
file downloads through Rails proxy mode:
- `config/environments/production.rb` selects the Active Storage service
but does not opt into `rails_storage_proxy`
- `.env.example` defaults to `ACTIVE_STORAGE_SERVICE=local`
- Chatwoot's storage docs recommend local/cloud storage with optional
direct uploads to the storage provider
- existing specs expect redirect/disk-style Active Storage URLs rather
than proxy-mode URLs

Given that validation, ignoring this advisory is a smaller and more
accurate response than a framework-wide Rails upgrade.

## What this change does
- adds `.bundler-audit.yml`
- preserves the existing advisory ignore entries already used by
Chatwoot
- ignores `CVE-2026-33658`
- documents why the ignore is acceptable for Chatwoot's current defaults
- notes that this should be revisited if Chatwoot enables
`rails_storage_proxy` or other app-served Active Storage proxy routes

## Validation
- reviewed `config/environments/production.rb`
- reviewed `.env.example`
- reviewed Chatwoot storage docs:
https://developers.chatwoot.com/self-hosted/deployment/storage/s3-bucket
- reviewed Active Storage URL expectations in
`spec/controllers/slack_uploads_controller_spec.rb` and
`spec/services/line/send_on_line_service_spec.rb`
- ran `bundle exec bundle-audit check --no-update`
2026-03-27 13:06:17 +05:30
4381be5f3e feat: disable helpcenter on hacker plans (#12068)
This change blocks Help Center access for default/Hacker-plan accounts
and closes the downgrade gap that could leave `help_center` enabled
after a subscription falls back to the default cloud plan.

Fixes: none
Closes: none

## Why

Default-plan accounts should not be able to access the Help Center, but
the downgrade fallback path only reset the plan name and did not
reconcile premium feature flags. That meant some accounts could keep
`help_center` enabled even after landing back on the Hacker/default
plan.

## What this change does

- blocks Help Center portal and article access for default/Hacker-plan
accounts
- reconciles premium feature flags when a subscription falls back to the
default cloud plan, so `help_center` is disabled immediately instead of
waiting for a later webhook
- preserves existing account `custom_attributes` during Stripe customer
recreation instead of overwriting them
- adds Enterprise coverage for the default-plan access checks on hosted
and custom-domain Help Center routes
- fixes the public access check to use the resolved portal object so
blocked requests return the intended response instead of raising an
error

## Validation

1. Create or use an account on the default/Hacker cloud plan with an
active portal.
2. Visit the portal home page and a published article on both the
Chatwoot-hosted URL and a configured custom domain.
3. Confirm the Help Center is blocked for that account.
4. Downgrade a paid account back to the default/Hacker plan through the
Stripe webhook flow.
5. Confirm `help_center` is disabled right after the downgrade fallback
is processed and the account can no longer access the Help Center.

---------

Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>
Co-authored-by: Sojan Jose <sojan@pepalo.com>
2026-03-26 23:48:46 -07:00
Shivam MishraandGitHub 127ac0a6b2 fix: show backend error message on API channel creation failure (#13855) 2026-03-27 11:42:33 +05:30
Sivin VargheseandGitHub 5d9d754961 chore(editor): Auto-linkify URLs immediately on paste (#13900)
# Pull Request Template

## Description

This PR upgrades the ProseMirror editor and enables automatic URL
linkification on paste. Previously, URLs were only linkified after a
user input event (e.g., typing a space). With this change, URLs are now
linkified instantly when pasted.

Fixes
https://linear.app/chatwoot/issue/CW-6682/email-channel-links-are-not-working

### https://github.com/chatwoot/prosemirror-schema/pull/42

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

**Screencast**

**Before**


https://github.com/user-attachments/assets/d38725c9-a152-4c2c-8c33-3ee717f1628f



**After**


https://github.com/user-attachments/assets/9a69a0b6-93ee-421e-896b-5a4e01a167ba


## 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
2026-03-27 11:29:54 +05:30
cac7438fff fix: Email Channel links are not working (backend) (#13898)
# Pull Request Template

## Description

This PR fixes the link formatting issue on the backend by adding
`:autolink` to `ChatwootMarkdownRenderer#render_message`, ensuring all
URLs are converted to `<a>` tags.

Fixes
https://linear.app/chatwoot/issue/CW-6682/email-channel-links-are-not-working

## 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: Sojan Jose <sojan@pepalo.com>
2026-03-26 21:44:57 -07:00
Haruma HIRABAYASHIandGitHub 0b41d7f483 docs(swagger): fix operationId typo converation -> conversation (#13920)
issue: https://github.com/chatwoot/chatwoot/issues/13921

Fix a typo in the Messages API operationId where `converation` was used
instead of `conversation`. This causes cspell errors when generating
client code with tools like Orval.

## What changed

- `swagger/paths/public/inboxes/messages/index.yml`: fixed operationId
from `list-all-converation-messages` to `list-all-conversation-messages`
- `swagger/swagger.json` and `swagger/tag_groups/client_swagger.json`:
regenerated to reflect the fix


## Note

If you are using a code generator like Orval against this swagger spec,
the generated function name will change from
`listAllConverationMessages` to `listAllConversationMessages`.
2026-03-27 09:23:55 +05:30
Sivin VargheseandGitHub 4517c50227 feat: support bulk select and delete for documents (#13907) 2026-03-26 19:48:12 +05:30
Vishnu NarayananandGitHub 4c4b70da25 fix: Skip email rate limiting for self-hosted instances (#13915)
Self-hosted installations were incorrectly hitting the daily email rate
limit of 100, seeded from `installation_config`. Since self-hosted users
control their own infrastructure, email rate limiting should only apply
to Chatwoot Cloud.

Closes #13913
2026-03-26 18:06:10 +05:30
Tanmay Deep SharmaandGitHub d84ef4cfd6 fix(whatsapp): skip health check during reauthorization flow (#13911)
After a successful WhatsApp OAuth reauthorization, the health check runs
immediately and finds the phone number in a pending provisioning state
(`platform_type: NOT_APPLICABLE`). This incorrectly triggers
`prompt_reauthorization!`, re-setting the Redis disconnect flag and
sending a disconnect email — even though the reauth just succeeded.

The fix skips the health check during reauthorization flows. It still
runs for new channel creation.

Closes https://github.com/chatwoot/chatwoot/pull/12556

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)

## How to reproduce

1. Have a WhatsApp channel with a phone number in pending provisioning
state (display name not yet approved by Meta)
2. Complete the OAuth reauthorization flow
3. Observe that the user receives a "success" response but immediately
gets a disconnect email

## What changed

- `Whatsapp::EmbeddedSignupService#perform` now skips
`check_channel_health_and_prompt_reauth` when `inbox_id` is present
(reauthorization flow)


🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-03-26 15:00:09 +05:30
Sivin VargheseandGitHub 23786bcb52 chore: mark conversation notifications as read on visit (#13906) 2026-03-26 14:01:26 +05:30
Shivam MishraandGitHub e4c3f0ac2f feat: fallback on phone number to update lead (#13910)
When syncing contacts to LeadSquared, the `Lead.CreateOrUpdate` API
defaults to searching by email. If a contact has no email (or a
different email) but a phone number matching an existing lead, the API
fails with `MXDuplicateEntryException` instead of finding and updating
the existing lead. This accounted for ~69% of all LeadSquared
integration errors, and cascaded into "Lead not found" failures when
posting transcript and conversation activities (~14% of errors).

## What changed

- `LeadClient#create_or_update_lead` now catches
`MXDuplicateEntryException` and retries the request once with
`SearchBy=Phone` appended to the body, telling the API to match on phone
number instead
- Once the retry succeeds, the returned lead ID is stored on the contact
(existing behavior), so all future events use the direct `update_lead`
path and never hit the duplicate error again

## How to reproduce

1. Create a lead in LeadSquared with phone number `+91-75076767676` and
email `a@example.com`
2. In Chatwoot, create a contact with the same phone number but a
different email (or no email)
3. Trigger a contact sync (via conversation creation or contact update)
4. Before fix: `MXDuplicateEntryException` error in logs, contact fails
to sync
5. After fix: retry with `SearchBy=Phone` finds and updates the existing
lead, stores the lead ID on the contact
2026-03-26 12:32:27 +05:30
742c5cc1f4 feat(dialogflow): make language_code configurable instead of hardcoded (#13221)
# 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.
- Add language_code setting to Dialogflow integration configuration
- Support 'auto' mode to detect language from contact's
additional_attributes
- Fallback to 'en-US' when no language is configured or detected
- Include comprehensive language options (22 languages)
- Add tests for language code configuration scenarios

Fixes #3071

## Type of change

Please delete options that are not relevant.

- [ ] Bug fix (non-breaking change which fixes an issue)
- [x] 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.

<img width="815" height="506" alt="Screenshot 2026-01-10 220410"
src="https://github.com/user-attachments/assets/26d2619c-ed42-4c9a-a41d-9fb07ef91a30"
/>


## 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: Sojan Jose <sojan@pepalo.com>
2026-03-25 21:30:17 -07:00
d9e732c005 chore(v5): update priority icons (#13905)
# Pull Request Template

## Description

This PR updates the priority icons with a new set and makes them
consistent across the app.


## How Has This Been Tested?

**Screenshots**
<img width="420" height="550" alt="image"
src="https://github.com/user-attachments/assets/cb392934-6c4d-46b4-9fde-244461da62ef"
/>
<img width="358" height="340" alt="image"
src="https://github.com/user-attachments/assets/cb18df47-9a17-42f8-9367-e8b7c4e3958d"
/>
<img width="344" height="468" alt="image"
src="https://github.com/user-attachments/assets/9de92374-e732-48eb-a8a9-85c5b5100931"
/>
<img width="445" height="548" alt="image"
src="https://github.com/user-attachments/assets/ecc4ce51-165c-4593-a9a2-e70b08a29006"
/>


## 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: Pranav <pranav@chatwoot.com>
2026-03-26 09:20:36 +05:30
e0e321b8e2 fix: Annotaterb model annotation incomplete migration (#13132)
This pull request fixes the model annotation tooling due to previous
incomplete migration from `annotate` to `annotaterb` gem (#12600). It
also improves the handling of serialized values in the
`InstallationConfig` model by ensuring a default value is set,
simplifying the code, and removing a workaround for YAML
deserialization.

**Annotation tooling updates:**

* Added `.annotaterb.yml` to configure the `annotate_rb` gem with
project-specific options, centralizing annotation settings.
* Replaced the custom `auto_annotate_models.rake` task with the standard
rake task from `annotate_rb`, and added `lib/tasks/annotate_rb.rake` to
load annotation tasks in development environments.
[[1]](diffhunk://#diff-9450d2359e45f1db407b3871dde787a25d60bb721aed179a65ffd2692e95fb4bL1-L61)
[[2]](diffhunk://#diff-578cdfc7ad56637e42472ea891ea286dff8803d9a1750afdbfeafec164d9b8b2R1-R8)

**Model serialization improvements:**

* Updated the `InstallationConfig` model to set a default value for the
`serialized_value` attribute, ensuring it always has a hash with
indifferent access and removing the need for a deserialization
workaround in the `value` method.
[[1]](diffhunk://#diff-b4bdde42c1ad0f584073818bd43dbd865b1b3b50d4701b131979f900d7c68297L22-R22)
[[2]](diffhunk://#diff-b4bdde42c1ad0f584073818bd43dbd865b1b3b50d4701b131979f900d7c68297L36-L39)

---------

Co-authored-by: Sojan Jose <sojan@pepalo.com>
2026-03-25 17:51:06 -07:00
Sojan Jose ecc66e064d Merge branch 'release/4.12.1' into develop 2026-03-25 16:21:38 -07:00
Sojan Jose 7144d55334 Bump version to 4.12.1 2026-03-25 16:20:58 -07:00
250650dd7a feat(platform): Add email channel migration endpoint for bulk OAuth channel creation (#13902)
Adds a Platform API endpoint that allows migrating existing Google and
Microsoft email channels (with OAuth credentials) into Chatwoot without
requiring end-users to re-authenticate. This enables customers who lack
Rails console access to programmatically migrate email channels from
legacy systems.
    
 ### How to test

1. Create a Platform App and grant it permissible access to a target
account
2. `POST /platform/api/v1/accounts/:account_id/email_channel_migrations`
with a payload like:
  ```json
  {
    "migrations": [
      {
        "email": "support@example.com",
        "provider": "google",
        "provider_config": {
          "access_token": "...",
          "refresh_token": "...",
          "expires_on": "..."
        },
        "inbox_name": "Migrated Support"
      }
    ]
  }
```
  3. Verify channels are created with correct provider, provider_config, and IMAP defaults
  4. Verify partial failures (e.g. duplicate email) don't roll back other migrations in the batch
  5. Verify unauthenticated and non-permissible requests return 401

---------

Co-authored-by: Sojan Jose <sojan@pepalo.com>
2026-03-25 15:58:08 -07:00
608be1036b fix: Send raw content in webhook payloads instead of channel-rendered markdown (#13896)
Webhook payloads (`message_created`, `message_updated`) started sending
channel-rendered HTML in the `content` field instead of the original raw
message content after PR #12878. This broke downstream agent bots and
integrations that expected plain text or markdown. 
Closes https://linear.app/chatwoot/issue/PLA-109/webhook-payloads-send-channel-rendered-html-instead-of-raw-content

## How to reproduce

1. Connect an agent bot to a WebWidget inbox
2. Send a message with markdown formatting (e.g. `**bold**`) from the
widget
3. Observe the agent bot webhook payload — `content` field contains
`<p><strong>bold</strong></p>` instead of `**bold**`

## What changed

Split `MessageContentPresenter` into two public methods:
- `outgoing_content` — renders markdown for the target channel (used by
channel delivery services)
- `webhook_content` — returns raw content with CSAT survey URL when
applicable, no markdown rendering (used by `webhook_data`)

Updated `Message#webhook_data` to use `webhook_content` instead of
`outgoing_content`.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
2026-03-25 16:56:22 +04:00
salmonumbrellaandGitHub 6ff643b045 fix(i18n): add zh_TW snooze parser locale (#13822) 2026-03-25 16:54:18 +05:30
Vishnu NarayananandGitHub 775b73d1f9 fix: raise open file descriptor limit to prevent EMFILE errors (#13895)
## Summary
- Adds `LimitNOFILE=65536` to both web and worker systemd service units
- Fixes recurring `Errno::EMFILE` (Too many open files) errors during
peak traffic after deploys

## Context
Puma workers idle at 720-770 open FDs against the default soft limit of
1024, leaving ~250 FDs of headroom. During deploy-triggered instance
refreshes at peak traffic, concurrent requests exhaust the remaining
FDs, causing EMFILE across all web instances.

3 incidents in March 2026 with escalating event counts. The hard limit
is already 524288, so this just raises the soft limit to a standard
production value.

Self-hosted instances pick this up automatically via `cwctl --upgrade`.

Fixes
https://linear.app/chatwoot/issue/CW-6685/errnoemfile-too-many-open-files-rb-sysopen
2026-03-24 17:37:07 -07:00
14df7b3bc1 fix: ai-assist 404 on CE (#13891)
# Pull Request Template

## Description

Relocate controller from enterprise/ to app/ and add
Api::V1::Accounts::Captain::TasksController.prepend_mod_with for EE
overrides.

Fixes: Ai assist giving 404 on CE

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

Please describe the tests that you ran to verify your changes. Provide
instructions so we can reproduce. Please also list any relevant details
for your test configuration.

before:
<img width="482" height="130" alt="image"
src="https://github.com/user-attachments/assets/f51dc28a-ac54-45c4-9015-6f956fdf5057"
/>

after:
<img width="458" height="182" alt="image"
src="https://github.com/user-attachments/assets/eb86a679-5482-4157-9f4e-f3e9953d8649"
/>


## 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: Shivam Mishra <scm.mymail@gmail.com>
2026-03-24 16:58:11 +05:30
Sivin VargheseandGitHub 6946859ba4 fix: normalize "in less than a minute" to "now" in chat list timestamp (#13874)
# Pull Request Template

## Description

This PR fixes the conversation list showing raw "**in less than a
minute**" text instead of "**now**" for very recent conversations.

Fixes https://linear.app/chatwoot/issue/CW-6666/issue-with-timestamps

## 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
2026-03-24 16:16:35 +05:30
Sivin VargheseandGitHub c129ab00ba fix: normalize "in less than a minute" to "now" in chat list timestamp (#13874) 2026-03-24 15:40:31 +05:30
7edae93ee8 fix(agent-bot): Include payload in webhook retry failure logs (#13879)
Webhook retry failure logs for agent-bot now include the event payload,
making it easier to identify which event failed when debugging transient
upstream errors (429/500).

Previously the log only showed:
`[AgentBots::WebhookJob] attempt 1 failed
RestClient::InternalServerError`

Now it includes the payload:
`[AgentBots::WebhookJob] attempt 1 failed
RestClient::InternalServerError payload={"event":"message_created",...}`

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 10:52:37 +04:00
4b315bc2ec chore: Update translations (#13884)
Co-authored-by: Sojan Jose <sojan@pepalo.com>
2026-03-23 20:06:17 -07:00
Sivin VargheseandGitHub 30c0479e9a fix: show agent name in unread bubble for Captain replies (#13876) 2026-03-23 20:03:31 +05:30
Aakash BakhleandGitHub 3c0d55f87a fix: handoff only if conversation pending (#13882)
# Pull Request Template

## Description

- Skip handoff when the conversation is no longer pending. 
- Fetch conversation status with Conversation.uncached to avoid stale
query cache when checking pending state.

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

Please describe the tests that you ran to verify your changes. Provide
instructions so we can reproduce. Please also list any relevant details
for your test configuration.

Difficult to reproduce locally, but seen a couple of conversations where
bot hands off an extra time or Captain re-generates usually due to a
retry on FaradayTimeoutError but at perform time, the conversation
status is stale so it appears as if Captain responded in an open
conversation.

## 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
2026-03-23 17:09:58 +05:30
Aakash BakhleandGitHub 4af3e830fc fix: conversation completion prompt to auto-resolve gibberish/no-intent messages after inactivity (#13875)
# Pull Request Template

## Description

For our account, the conversation completion evaluator was proving to be
too conservative. This resulted in queue noise.
This PR adds a line to handle gibberish/single worded messages with no
further context.

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

Please describe the tests that you ran to verify your changes. Provide
instructions so we can reproduce. Please also list any relevant details
for your test configuration.

<img width="3012" height="978" alt="CleanShot 2026-03-23 at 11 44 55@2x"
src="https://github.com/user-attachments/assets/328195e8-6ea0-4c3a-9049-ee80196eecad"
/>

<img width="2202" height="866" alt="CleanShot 2026-03-23 at 11 47 15@2x"
src="https://github.com/user-attachments/assets/8d51cff4-b18f-4582-9455-8119ec7eff3a"
/>


## 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
2026-03-23 12:18:23 +05:30
b974993886 chore: Update translations (#13845)
Co-authored-by: Sojan Jose <sojan@pepalo.com>
2026-03-21 02:20:27 -07:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>Sojan Jose
4b849cdd11 chore(deps): bump bcrypt from 3.1.20 to 3.1.22 (#13852)
Bumps [bcrypt](https://github.com/bcrypt-ruby/bcrypt-ruby) from 3.1.20
to 3.1.22.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/bcrypt-ruby/bcrypt-ruby/releases">bcrypt's
releases</a>.</em></p>
<blockquote>
<h2>v3.1.22</h2>
<h2>What's Changed</h2>
<ul>
<li>Move compilation after bundle install by <a
href="https://github.com/tenderlove"><code>@​tenderlove</code></a> in <a
href="https://redirect.github.com/bcrypt-ruby/bcrypt-ruby/pull/291">bcrypt-ruby/bcrypt-ruby#291</a></li>
<li>Add TruffleRuby in CI by <a
href="https://github.com/tjschuck"><code>@​tjschuck</code></a> in <a
href="https://redirect.github.com/bcrypt-ruby/bcrypt-ruby/pull/293">bcrypt-ruby/bcrypt-ruby#293</a></li>
<li>fix env url by <a
href="https://github.com/tenderlove"><code>@​tenderlove</code></a> in <a
href="https://redirect.github.com/bcrypt-ruby/bcrypt-ruby/pull/294">bcrypt-ruby/bcrypt-ruby#294</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/bcrypt-ruby/bcrypt-ruby/compare/v3.1.21...v3.1.22">https://github.com/bcrypt-ruby/bcrypt-ruby/compare/v3.1.21...v3.1.22</a></p>
<h2>v3.1.21</h2>
<h2>What's Changed</h2>
<ul>
<li>Provide a 'Changelog' link on rubygems.org/gems/bcrypt by <a
href="https://github.com/mark-young-atg"><code>@​mark-young-atg</code></a>
in <a
href="https://redirect.github.com/bcrypt-ruby/bcrypt-ruby/pull/274">bcrypt-ruby/bcrypt-ruby#274</a></li>
<li>Support ruby 3.3 and 3.4.0-preview1 by <a
href="https://github.com/m-nakamura145"><code>@​m-nakamura145</code></a>
in <a
href="https://redirect.github.com/bcrypt-ruby/bcrypt-ruby/pull/276">bcrypt-ruby/bcrypt-ruby#276</a></li>
<li>Mark as ractor-safe by <a
href="https://github.com/mohamedhafez"><code>@​mohamedhafez</code></a>
in <a
href="https://redirect.github.com/bcrypt-ruby/bcrypt-ruby/pull/280">bcrypt-ruby/bcrypt-ruby#280</a></li>
<li>Add == gotcha that can be unintuitive at first by <a
href="https://github.com/federicoaldunate"><code>@​federicoaldunate</code></a>
in <a
href="https://redirect.github.com/bcrypt-ruby/bcrypt-ruby/pull/279">bcrypt-ruby/bcrypt-ruby#279</a></li>
<li>Constant compare by <a
href="https://github.com/tenderlove"><code>@​tenderlove</code></a> in <a
href="https://redirect.github.com/bcrypt-ruby/bcrypt-ruby/pull/282">bcrypt-ruby/bcrypt-ruby#282</a></li>
<li>try to modernize CI by <a
href="https://github.com/tenderlove"><code>@​tenderlove</code></a> in <a
href="https://redirect.github.com/bcrypt-ruby/bcrypt-ruby/pull/287">bcrypt-ruby/bcrypt-ruby#287</a></li>
<li>Try to deal with flaky tests by <a
href="https://github.com/tenderlove"><code>@​tenderlove</code></a> in <a
href="https://redirect.github.com/bcrypt-ruby/bcrypt-ruby/pull/288">bcrypt-ruby/bcrypt-ruby#288</a></li>
<li>Configure trusted publishing by <a
href="https://github.com/tenderlove"><code>@​tenderlove</code></a> in <a
href="https://redirect.github.com/bcrypt-ruby/bcrypt-ruby/pull/289">bcrypt-ruby/bcrypt-ruby#289</a></li>
<li>bump version by <a
href="https://github.com/tenderlove"><code>@​tenderlove</code></a> in <a
href="https://redirect.github.com/bcrypt-ruby/bcrypt-ruby/pull/290">bcrypt-ruby/bcrypt-ruby#290</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/mark-young-atg"><code>@​mark-young-atg</code></a>
made their first contribution in <a
href="https://redirect.github.com/bcrypt-ruby/bcrypt-ruby/pull/274">bcrypt-ruby/bcrypt-ruby#274</a></li>
<li><a
href="https://github.com/m-nakamura145"><code>@​m-nakamura145</code></a>
made their first contribution in <a
href="https://redirect.github.com/bcrypt-ruby/bcrypt-ruby/pull/276">bcrypt-ruby/bcrypt-ruby#276</a></li>
<li><a
href="https://github.com/mohamedhafez"><code>@​mohamedhafez</code></a>
made their first contribution in <a
href="https://redirect.github.com/bcrypt-ruby/bcrypt-ruby/pull/280">bcrypt-ruby/bcrypt-ruby#280</a></li>
<li><a
href="https://github.com/federicoaldunate"><code>@​federicoaldunate</code></a>
made their first contribution in <a
href="https://redirect.github.com/bcrypt-ruby/bcrypt-ruby/pull/279">bcrypt-ruby/bcrypt-ruby#279</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/bcrypt-ruby/bcrypt-ruby/compare/v3.1.20...v3.1.21">https://github.com/bcrypt-ruby/bcrypt-ruby/compare/v3.1.20...v3.1.21</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/bcrypt-ruby/bcrypt-ruby/blob/master/CHANGELOG">bcrypt's
changelog</a>.</em></p>
<blockquote>
<p>3.1.22 Mar 18 2026</p>
<ul>
<li>[CVE-2026-33306] Fix integer overflow in Java extension</li>
</ul>
<p>3.1.21 Dec 31 2025</p>
<ul>
<li>Use constant time comparisons</li>
<li>Mark as Ractor safe</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/bcrypt-ruby/bcrypt-ruby/commit/831ce64cb0a9502130fa93a28bfd9527a5fa45c4"><code>831ce64</code></a>
Merge commit from fork</li>
<li><a
href="https://github.com/bcrypt-ruby/bcrypt-ruby/commit/32e687ec5f62baad01a62e4634e41d97f8432a61"><code>32e687e</code></a>
bump version update changelog</li>
<li><a
href="https://github.com/bcrypt-ruby/bcrypt-ruby/commit/5faa2748331d3edc661c127ef2fbb3afcb6b02a4"><code>5faa274</code></a>
Fix integer overflow in JRuby BCrypt rounds calculation</li>
<li><a
href="https://github.com/bcrypt-ruby/bcrypt-ruby/commit/aafc0332ac1aa0d774f2c864439596436f92d18d"><code>aafc033</code></a>
Merge pull request <a
href="https://redirect.github.com/bcrypt-ruby/bcrypt-ruby/issues/294">#294</a>
from bcrypt-ruby/fix-publishing</li>
<li><a
href="https://github.com/bcrypt-ruby/bcrypt-ruby/commit/01f947a66ad8c5e20d8c89d9adbc7e3bd49afb70"><code>01f947a</code></a>
fix env url</li>
<li><a
href="https://github.com/bcrypt-ruby/bcrypt-ruby/commit/92ca1d67deeb8e64dbe779396c52b177e307bc43"><code>92ca1d6</code></a>
Merge pull request <a
href="https://redirect.github.com/bcrypt-ruby/bcrypt-ruby/issues/293">#293</a>
from bcrypt-ruby/truffleruby-ci-alt-implementation</li>
<li><a
href="https://github.com/bcrypt-ruby/bcrypt-ruby/commit/4d1d95b8ec624d0cf8ed1099402a7edd2f308da2"><code>4d1d95b</code></a>
Add TruffleRuby in CI</li>
<li><a
href="https://github.com/bcrypt-ruby/bcrypt-ruby/commit/36a04a2278fae3b38100912ff489b86cd0984b8a"><code>36a04a2</code></a>
Merge pull request <a
href="https://redirect.github.com/bcrypt-ruby/bcrypt-ruby/issues/291">#291</a>
from tenderlove/fix-publishing</li>
<li><a
href="https://github.com/bcrypt-ruby/bcrypt-ruby/commit/01cc68835f0bcdd7ef16de477471c112adb417da"><code>01cc688</code></a>
Move compilation after bundle install</li>
<li><a
href="https://github.com/bcrypt-ruby/bcrypt-ruby/commit/82e6c4c6cf81912768c68d721372e78330ff2c92"><code>82e6c4c</code></a>
Merge pull request <a
href="https://redirect.github.com/bcrypt-ruby/bcrypt-ruby/issues/290">#290</a>
from tenderlove/bump</li>
<li>Additional commits viewable in <a
href="https://github.com/bcrypt-ruby/bcrypt-ruby/compare/v3.1.20...v3.1.22">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=bcrypt&package-manager=bundler&previous-version=3.1.20&new-version=3.1.22)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/chatwoot/chatwoot/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Sojan Jose <sojan@pepalo.com>
2026-03-20 16:30:50 -07:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>Sojan Jose
310590cae3 chore(deps): bump json from 2.18.1 to 2.19.2 (#13849)
Bumps [json](https://github.com/ruby/json) from 2.18.1 to 2.19.2.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/ruby/json/releases">json's
releases</a>.</em></p>
<blockquote>
<h2>v2.19.2</h2>
<h2>What's Changed</h2>
<ul>
<li>Fix a format string injection vulnerability in <code>JSON.parse(doc,
allow_duplicate_key: false)</code>. <code>CVE-2026-33210</code></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/ruby/json/compare/v2.19.1...v2.19.2">https://github.com/ruby/json/compare/v2.19.1...v2.19.2</a></p>
<h2>v2.19.1</h2>
<h2>What's Changed</h2>
<ul>
<li>Fix a compiler dependent GC bug introduced in
<code>2.18.0</code>.</li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/ruby/json/compare/v2.19.0...v2.19.1">https://github.com/ruby/json/compare/v2.19.0...v2.19.1</a></p>
<h2>v2.19.0</h2>
<h2>What's Changed</h2>
<ul>
<li>Fix <code>allow_blank</code> parsing option to no longer allow
invalid types (e.g. <code>load([], allow_blank: true)</code> now raise a
type error).</li>
<li>Add <code>allow_invalid_escape</code> parsing option to ignore
backslashes that aren't followed by one of the valid escape
characters.</li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/ruby/json/compare/v2.18.1...v2.19.0">https://github.com/ruby/json/compare/v2.18.1...v2.19.0</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/ruby/json/blob/master/CHANGES.md">json's
changelog</a>.</em></p>
<blockquote>
<h3>2026-03-18 (2.19.2)</h3>
<ul>
<li>Fix a format string injection vulnerability in <code>JSON.parse(doc,
allow_duplicate_key: false)</code>. <code>CVE-2026-33210</code>.</li>
</ul>
<h3>2026-03-08 (2.19.1)</h3>
<ul>
<li>Fix a compiler dependent GC bug introduced in
<code>2.18.0</code>.</li>
</ul>
<h3>2026-03-06 (2.19.0)</h3>
<ul>
<li>Fix <code>allow_blank</code> parsing option to no longer allow
invalid types (e.g. <code>load([], allow_blank: true)</code> now raise a
type error).</li>
<li>Add <code>allow_invalid_escape</code> parsing option to ignore
backslashes that aren't followed by one of the valid escape
characters.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/ruby/json/commit/54f8a878aebee090476a53c851c943128894be62"><code>54f8a87</code></a>
Release 2.19.2</li>
<li><a
href="https://github.com/ruby/json/commit/393b41c3e5f87491e1e34fa59fa78ff6fa179a74"><code>393b41c</code></a>
Fix a format string injection vulnerability</li>
<li><a
href="https://github.com/ruby/json/commit/dbf6bb12aac85db939df1180028aea06c8d3b762"><code>dbf6bb1</code></a>
Merge pull request <a
href="https://redirect.github.com/ruby/json/issues/953">#953</a> from
ruby/dependabot/github_actions/actions/create-gi...</li>
<li><a
href="https://github.com/ruby/json/commit/7187315b4571ade59d68a1fad84be2794cda744d"><code>7187315</code></a>
Bump actions/create-github-app-token from 2 to 3</li>
<li><a
href="https://github.com/ruby/json/commit/4a42a04280d96d8dd94558078c16f1c078c38e1b"><code>4a42a04</code></a>
Release 2.19.1</li>
<li><a
href="https://github.com/ruby/json/commit/13689c269970f18316952541f8544830ec2dc5c4"><code>13689c2</code></a>
Add missing GC_GUARD in <code>fbuffer_append_str</code></li>
<li><a
href="https://github.com/ruby/json/commit/a11acc1ff496627e5d72c71d6d1229e8c8ffeaa1"><code>a11acc1</code></a>
Release 2.19.0</li>
<li><a
href="https://github.com/ruby/json/commit/0a4fb79cd97f535701cc2240ac736d76b9af5025"><code>0a4fb79</code></a>
fbuffer.h: Use size_t over unsigned long</li>
<li><a
href="https://github.com/ruby/json/commit/a29fcdcb4a78164daa14f6af05812690dd3ac939"><code>a29fcdc</code></a>
Add depth validation to Jruby and TruffleRuby implementations</li>
<li><a
href="https://github.com/ruby/json/commit/de993aa76639078da891f46351a36f77d51ad3d3"><code>de993aa</code></a>
Reject negative depth; add overflow guards to prevent hang/crash</li>
<li>Additional commits viewable in <a
href="https://github.com/ruby/json/compare/v2.18.1...v2.19.2">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=json&package-manager=bundler&previous-version=2.18.1&new-version=2.19.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/chatwoot/chatwoot/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Sojan Jose <sojan@pepalo.com>
2026-03-20 16:30:35 -07:00
Sivin VargheseandGitHub 251e9980fd chore: Auto-focus editor when replying to a message (#13857)
# Pull Request Template

## Description

This PR adds support to auto-focus the editor when clicking reply to
this message, the editor now automatically receives focus so users can
start typing immediately.

Fixes
https://linear.app/chatwoot/issue/CW-6661/typing-box-not-focused-after-clicking-reply-to-message

## Type of change


- [x] Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

### Screencast


https://github.com/user-attachments/assets/c5e77055-3f68-4ad8-934e-cfc465166e8a




## 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
2026-03-20 16:59:27 +05:30
Tanmay Deep SharmaandGitHub 2b50909d9b fix: use last_activity_at for orphan conversation cleanup timeframe (#13859)
## Description

The RemoveOrphanConversationsService filters orphan conversations by a
time window before deleting them. Previously it used created_at, which
could miss old conversations that still had recent activity.
Switching to last_activity_at ensures the cleanup window reflects actual
conversation activity rather than creation time.

## Type of change

Please delete options that are not relevant.

- [ ] Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

- By running Rake task 
- Run the job from console 

## 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
2026-03-20 16:28:05 +05:30
Aakash BakhleandGitHub 290dd3abf5 feat: allow captain to access contact attributes (#13850)
# Pull Request Template

## Description

Captain v1 does not have access to contact attributes. Added a toggle to
let user choose if they want contact information available to Captain.

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

Please describe the tests that you ran to verify your changes. Provide
instructions so we can reproduce. Please also list any relevant details
for your test configuration.

Specs and locally
<img width="1924" height="740" alt="CleanShot 2026-03-19 at 18 48 19@2x"
src="https://github.com/user-attachments/assets/353cfeaa-cd58-40eb-89e7-d660a1dc1185"
/>

![Uploading CleanShot 2026-03-19 at 18.53.26@2x.png…]()


## 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
2026-03-20 16:15:06 +05:30
a9123e7d66 chore(i18n): add missing pt_BR locale imports for companies, mfa, snooze, webhooks and more (#13844)
## Description

Add missing JSON imports and spread exports for `companies`,
`contentTemplates`, `mfa`, `snooze`, `webhooks`, and `yearInReview` so
these translations are properly loaded in the pt_BR locale. Without
these imports, those sections of the UI were falling back to English for
Brazilian Portuguese users.

## 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] My changes generate no new warnings

Co-authored-by: Sojan Jose <sojan@pepalo.com>
2026-03-19 01:27:37 -07:00
9967101b48 feat(rollup): add models and write path [1/3] (#13796)
## PR#1: Reporting events rollup — model and write path

Reporting queries currently hit the `reporting_events` table directly.
This works, but the table grows linearly with event volume, and
aggregation queries (counts, averages over date ranges) get
progressively slower as accounts age.

This PR introduces a pre-aggregated `reporting_events_rollups` table
that stores daily per-metric, per-dimension (account/agent/inbox)
totals. The write path is intentionally decoupled from the read path —
rollup rows are written inline from the event listener via upsert, and a
backfill service exists to rebuild historical data from raw events.
Nothing reads from this table yet.

The write path activates when an account has a `reporting_timezone` set
(new account setting). The `reporting_events_rollup` feature flag
controls only the future read path, not writes — so rollup data
accumulates silently once timezone is configured. A `MetricRegistry`
maps raw event names to rollup column semantics in one place, keeping
the write and (future) read paths aligned.

### What changed

- Migration for `reporting_events_rollups` with a unique composite index
for upsert
- `ReportingEventsRollup` model
- `reporting_timezone` account setting with IANA timezone validation
- `MetricRegistry` — single source of truth for event-to-metric mappings
- `RollupService` — real-time upsert from event listener
- `BackfillService` — rebuilds rollups for a given account + date from
raw events
- Rake tasks for interactive backfill and timezone setup
- `reporting_events_rollup` feature flag (disabled by default)

### How to test

1. Set a `reporting_timezone` on an account
(`Account.first.update!(reporting_timezone: 'Asia/Kolkata')`)
2. Resolve a conversation or trigger a first response
3. Check `ReportingEventsRollup.where(account_id: ...)` — rows should
appear
4. Run backfill: `bundle exec rake reporting_events_rollup:backfill` and
verify historical data populates

---------

Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>
2026-03-19 13:12:36 +05:30
654fcd43f2 docs(swagger): fix public API schema definitions to match jbuilder responses (#13693)
## Description

This PR updates the OpenAPI schema definitions for Public API resources
(`public_conversation`, `public_message`, `public_contact`) so they
match the actual API responses produced by the jbuilder views.

These definitions were introduced in #2417 (2021-06) with a minimal set
of fields. The jbuilder views have since been updated (e.g. `uuid` in
#7255, `agent_last_seen_at` in #4377), but the Swagger definitions were
never updated. As a result, generated API clients get incorrect or
missing types. This change fixes that by aligning the schemas with the
implementation.

**Fixes #13692**

## 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)
- [x] This change requires a documentation update

## How Has This Been Tested?

- Compared each jbuilder view
(`app/views/public/api/v1/models/_conversation.json.jbuilder`,
`_message.json.jbuilder`, `_contact.json.jbuilder`) field-by-field
against the Swagger YAML definitions.
- Cross-referenced Ruby model enums (`Conversation.status`,
`Attachment.file_type`, `Message.message_type`) for enum values.
- Ran the swagger build (via the project’s `rake swagger:build` logic /
`json_refs` resolution) to regenerate `swagger.json` and tag group
files; confirmed the generated schemas contain the correct fields and
types.
- No runtime tests were run; this is a documentation/schema-only change.

## 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 *(N/A: schema definitions)*
- [x] 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 *(N/A: documentation/schema only)*
- [ ] New and existing unit tests pass locally with my changes *(N/A: no
code under test)*
- [x] Any dependent changes have been merged and published in downstream
modules *(N/A: none)*

---

## Change summary (for reference)

### `public_conversation`
- Added missing fields: `uuid`, `status`, `contact_last_seen_at`,
`agent_last_seen_at`
- Fixed `inbox_id` type from `string` to `integer`
- Fixed `messages` items `$ref` from `message` to `public_message`
- Added property details for embedded `contact` object (`id`, `name`,
`email`, `phone_number`)
- Added `status` enum: `open`, `resolved`, `pending`, `snoozed`

### `public_message`
- Fixed `id`, `message_type`, `created_at`, `conversation_id` types
(string → integer where applicable)
- Fixed `content_attributes` type from `string` to `object`
- Added property details for `attachments` items and `sender` object
- Added `file_type` and `sender.type` enums

### `public_contact`
- Added missing `phone_number` field

---------

Co-authored-by: Sojan Jose <sojan@pepalo.com>
2026-03-19 00:03:37 -07:00
Shivam MishraandGitHub 284977687c fix: patch Devise confirmable race condition vulnerability (#13843)
Devise 4.9.x has a race condition in the reconfirmable flow where
concurrent email change requests can desynchronize the confirmation
token from `unconfirmed_email`, letting an attacker confirm an email
they don't own. We use `:confirmable` with `reconfirmable = true`, so
we're directly exposed.

The upstream fix is in Devise 5.0.3, but we can't upgrade —
`devise-two-factor` only supports Devise 5 from v6.4.0, which also
raised its Rails minimum to 7.2+. No released version supports both
Devise 5 and Rails 7.1.

This PR ports the Devise 5.0.3 fix locally by overriding
`postpone_email_change_until_confirmation_and_regenerate_confirmation_token`
on the User model to persist the record before regenerating the token.
This is a stopgap — remove it once the dependency chain allows upgrading
to Devise 5.

### How to test

Sign in as a confirmed user and change your email. The app should send a
confirmation to the new address while keeping the current email
unchanged until confirmed.
2026-03-18 21:30:09 -07:00
Sojan Jose 18dc77aa56 Merge branch 'release/4.12.0' into develop 2026-03-17 16:23:16 -07:00
666 changed files with 56653 additions and 44361 deletions
+65
View File
@@ -0,0 +1,65 @@
---
:position: before
:position_in_additional_file_patterns: before
:position_in_class: before
:position_in_factory: before
:position_in_fixture: before
:position_in_routes: before
:position_in_serializer: before
:position_in_test: before
:classified_sort: true
:exclude_controllers: true
:exclude_factories: true
:exclude_fixtures: true
:exclude_helpers: true
:exclude_scaffolds: true
:exclude_serializers: true
:exclude_sti_subclasses: false
:exclude_tests: true
:force: false
:format_markdown: false
:format_rdoc: false
:format_yard: false
:frozen: false
:grouped_polymorphic: false
:ignore_model_sub_dir: false
:ignore_unknown_models: false
:include_version: false
:show_check_constraints: false
:show_complete_foreign_keys: false
:show_foreign_keys: true
:show_indexes: true
:show_indexes_include: false
:simple_indexes: false
:sort: false
:timestamp: false
:trace: false
:with_comment: true
:with_column_comments: true
:with_table_comments: true
:position_of_column_comment: :with_name
:active_admin: false
:command:
:debug: false
:hide_default_column_types: json,jsonb,hstore
:hide_limit_column_types: integer,bigint,boolean
:timestamp_columns:
- created_at
- updated_at
:ignore_columns:
:ignore_routes:
:models: true
:routes: false
:skip_on_db_migrate: false
:target_action: :do_annotations
:wrapper:
:wrapper_close:
:wrapper_open:
:classes_default_to_s: []
:additional_file_patterns: []
:model_dir:
- app/models
- enterprise/app/models
:require: []
:root_dir:
- ''
+6
View File
@@ -1,3 +1,9 @@
---
ignore:
- CVE-2021-41098 # https://github.com/chatwoot/chatwoot/issues/3097 (update once azure blob storage is updated)
- GHSA-57hq-95w6-v4fc # Devise confirmable race condition — patched locally in User model (remove once on Devise 5+)
# Chatwoot defaults to Active Storage redirect-style URLs, and its recommended
# storage setup uses local/cloud storage with optional direct uploads to the
# storage provider rather than Rails proxy mode. Revisit if we enable
# rails_storage_proxy or other app-served Active Storage proxy routes.
- CVE-2026-33658
+2
View File
@@ -40,6 +40,8 @@ gem 'json_refs'
gem 'rack-attack', '>= 6.7.0'
# a utility tool for streaming, flexible and safe downloading of remote files
gem 'down'
# SSRF-safe URL fetching
gem 'ssrf_filter', '~> 1.5'
# authentication type to fetch and send mail over oauth2.0
gem 'gmail_xoauth'
# Lock net-smtp to 0.3.4 to avoid issues with gmail_xoauth2
+4 -2
View File
@@ -166,7 +166,7 @@ GEM
multi_json (~> 1)
statsd-ruby (~> 1.1)
base64 (0.3.0)
bcrypt (3.1.20)
bcrypt (3.1.22)
benchmark (0.4.1)
bigdecimal (3.2.2)
bindex (0.8.1)
@@ -465,7 +465,7 @@ GEM
rails-dom-testing (>= 1, < 3)
railties (>= 4.2.0)
thor (>= 0.14, < 2.0)
json (2.18.1)
json (2.19.2)
json_refs (0.1.8)
hana
json_schemer (0.2.24)
@@ -942,6 +942,7 @@ GEM
activesupport (>= 5.2)
sprockets (>= 3.0.0)
squasher (0.7.2)
ssrf_filter (1.5.0)
stackprof (0.2.25)
statsd-ruby (1.5.0)
stripe (18.0.1)
@@ -1158,6 +1159,7 @@ DEPENDENCIES
spring
spring-watcher-listen
squasher
ssrf_filter (~> 1.5)
stackprof
stripe (~> 18.0)
telephone_number
+1 -1
View File
@@ -1 +1 @@
4.12.0
4.12.1
+2 -4
View File
@@ -1,4 +1,6 @@
class Email::BaseBuilder
include EmailAddressParseable
pattr_initialize [:inbox!]
private
@@ -47,8 +49,4 @@ class Email::BaseBuilder
# can save it in the format "Name <email@domain.com>"
parse_email(account.support_email)
end
def parse_email(email_string)
Mail::Address.new(email_string).address
end
end
@@ -34,6 +34,10 @@ class Api::V1::Accounts::AgentBotsController < Api::V1::Accounts::BaseController
@agent_bot.reload
end
def reset_secret
@agent_bot.reset_secret!
end
private
def agent_bot
@@ -57,7 +57,7 @@ class Api::V1::Accounts::Captain::TasksController < Api::V1::Accounts::BaseContr
if result.nil?
render json: { message: nil }
elsif result[:error]
render json: { error: result[:error] }, status: :unprocessable_entity
render json: { error: result[:error] }, status: :unprocessable_content
else
response_data = { message: result[:message] }
response_data[:follow_up_context] = result[:follow_up_context] if result[:follow_up_context]
@@ -69,3 +69,5 @@ class Api::V1::Accounts::Captain::TasksController < Api::V1::Accounts::BaseContr
authorize(:'captain/tasks')
end
end
Api::V1::Accounts::Captain::TasksController.prepend_mod_with('Api::V1::Accounts::Captain::TasksController')
@@ -116,6 +116,8 @@ class Api::V1::Accounts::ConversationsController < Api::V1::Accounts::BaseContro
# High-traffic accounts generate excessive DB writes when agents frequently switch between conversations.
# Throttle last_seen updates to once per hour when there are no unread messages to reduce DB load.
# Always update immediately if there are unread messages to maintain accurate read/unread state.
# Visiting a conversation should clear any unread inbox notifications for this conversation.
Notification::MarkConversationReadService.new(user: Current.user, account: Current.account, conversation: @conversation).perform
return update_last_seen_on_conversation(DateTime.now.utc, true) if assignee? && @conversation.assignee_unread_messages.any?
return update_last_seen_on_conversation(DateTime.now.utc, false) if !assignee? && @conversation.unread_messages.any?
@@ -66,6 +66,12 @@ class Api::V1::Accounts::InboxesController < Api::V1::Accounts::BaseController
head :ok
end
def reset_secret
return head :not_found unless @inbox.api?
@inbox.channel.reset_secret!
end
def destroy
::DeleteObjectJob.perform_later(@inbox, Current.user, request.ip) if @inbox.present?
render status: :ok, json: { message: I18n.t('messages.inbox_deletetion_response') }
@@ -5,7 +5,7 @@ class Api::V1::Accounts::UploadController < Api::V1::Accounts::BaseController
elsif params[:external_url].present?
create_from_url
else
render_error('No file or URL provided', :unprocessable_entity)
render_error(I18n.t('errors.upload.missing_input'), :unprocessable_entity)
end
render_success(result) if result.is_a?(ActiveStorage::Blob)
@@ -19,35 +19,21 @@ class Api::V1::Accounts::UploadController < Api::V1::Accounts::BaseController
end
def create_from_url
uri = parse_uri(params[:external_url])
return if performed?
fetch_and_process_file_from_uri(uri)
end
def parse_uri(url)
uri = URI.parse(url)
validate_uri(uri)
uri
rescue URI::InvalidURIError, SocketError
render_error('Invalid URL provided', :unprocessable_entity)
nil
end
def validate_uri(uri)
raise URI::InvalidURIError unless uri.is_a?(URI::HTTP) || uri.is_a?(URI::HTTPS)
end
def fetch_and_process_file_from_uri(uri)
uri.open do |file|
create_and_save_blob(file, File.basename(uri.path), file.content_type)
SafeFetch.fetch(params[:external_url].to_s) do |result|
create_and_save_blob(result.tempfile, result.filename, result.content_type)
end
rescue OpenURI::HTTPError => e
render_error("Failed to fetch file from URL: #{e.message}", :unprocessable_entity)
rescue SocketError
render_error('Invalid URL provided', :unprocessable_entity)
rescue SafeFetch::HttpError => e
render_error(I18n.t('errors.upload.fetch_failed_with_message', message: e.message), :unprocessable_entity)
rescue SafeFetch::FetchError
render_error(I18n.t('errors.upload.fetch_failed'), :unprocessable_entity)
rescue SafeFetch::FileTooLargeError
render_error(I18n.t('errors.upload.file_too_large'), :unprocessable_entity)
rescue SafeFetch::UnsupportedContentTypeError
render_error(I18n.t('errors.upload.unsupported_content_type'), :unprocessable_entity)
rescue SafeFetch::Error
render_error(I18n.t('errors.upload.invalid_url'), :unprocessable_entity)
rescue StandardError
render_error('An unexpected error occurred', :internal_server_error)
render_error(I18n.t('errors.upload.unexpected'), :internal_server_error)
end
def create_and_save_blob(io, filename, content_type)
+32 -2
View File
@@ -30,9 +30,20 @@ class Api::V1::AccountsController < Api::BaseController
locale: account_params[:locale],
user: current_user
).perform
enqueue_branding_enrichment
if @user
send_auth_headers(@user)
render 'api/v1/accounts/create', format: :json, locals: { resource: @user }
# Authenticated users (dashboard "add account") and api_only signups
# need the full response with account_id. API-only deployments have no
# frontend to handle the email confirmation flow, so they need auth
# tokens to proceed.
# Unauthenticated web signup returns only the email — no session is
# created until the user confirms via the email link.
if current_user || api_only_signup?
send_auth_headers(@user)
render 'api/v1/accounts/create', format: :json, locals: { resource: @user }
else
render json: { email: @user.email }
end
else
render_error_response(CustomExceptions::Account::SignupFailed.new({}))
end
@@ -59,6 +70,16 @@ class Api::V1::AccountsController < Api::BaseController
private
def enqueue_branding_enrichment
return if account_params[:email].blank?
Account::BrandingEnrichmentJob.perform_later(@account.id, account_params[:email])
Redis::Alfred.set(format(Redis::Alfred::ACCOUNT_ONBOARDING_ENRICHMENT, account_id: @account.id), '1', ex: 30)
rescue StandardError => e
# Enrichment is optional — never let queue/Redis failures abort signup
ChatwootExceptionTracker.new(e).capture_exception
end
def ensure_account_name
# ensure that account_name and user_full_name is present
# this is becuase the account builder and the models validations are not triggered
@@ -103,6 +124,15 @@ class Api::V1::AccountsController < Api::BaseController
raise ActionController::RoutingError, 'Not Found' unless GlobalConfigService.account_signup_enabled?
end
def api_only_signup?
# CW_API_ONLY_SERVER is the canonical flag for API-only deployments.
# ENABLE_ACCOUNT_SIGNUP='api_only' is a legacy sentinel for the same purpose.
# Read ENABLE_ACCOUNT_SIGNUP raw from InstallationConfig because GlobalConfig.get
# typecasts it to boolean, coercing 'api_only' to true.
ActiveModel::Type::Boolean.new.cast(ENV.fetch('CW_API_ONLY_SERVER', false)) ||
InstallationConfig.find_by(name: 'ENABLE_ACCOUNT_SIGNUP')&.value.to_s == 'api_only'
end
def validate_captcha
raise ActionController::InvalidAuthenticityToken, 'Invalid Captcha' unless ChatwootCaptcha.new(params[:h_captcha_client_response]).valid?
end
@@ -43,7 +43,15 @@ class Api::V1::Widget::MessagesController < Api::V1::Widget::BaseController
end
def set_conversation
@conversation = create_conversation if conversation.nil?
return unless conversation.nil?
@conversation = create_conversation
apply_labels if permitted_params[:labels].present?
end
def apply_labels
valid_labels = inbox.account.labels.where(title: permitted_params[:labels]).pluck(:title)
@conversation.update_labels(valid_labels) if valid_labels.present?
end
def message_finder_params
@@ -64,7 +72,14 @@ class Api::V1::Widget::MessagesController < Api::V1::Widget::BaseController
def permitted_params
# timestamp parameter is used in create conversation method
params.permit(:id, :before, :after, :website_token, contact: [:name, :email], message: [:content, :referer_url, :timestamp, :echo_id, :reply_to])
# custom_attributes and labels are applied when a new conversation is created alongside the first message
params.permit(
:id, :before, :after, :website_token,
contact: [:name, :email],
message: [:content, :referer_url, :timestamp, :echo_id, :reply_to],
custom_attributes: {},
labels: []
)
end
def set_message
@@ -0,0 +1,18 @@
# Unauthenticated endpoint for resending confirmation emails during signup.
# This is a standalone controller (not on DeviseOverrides::ConfirmationsController)
# because OmniAuth middleware intercepts all POST /auth/* routes as provider
# callbacks, and Devise controller filters cause 307 redirects for custom actions.
# Inherits from ActionController::API to avoid both issues entirely.
# Rate-limited by Rack::Attack (IP + email) and gated by hCaptcha.
class Auth::ResendConfirmationsController < ActionController::API
def create
return head(:ok) unless ChatwootCaptcha.new(params[:h_captcha_client_response]).valid?
email = params[:email]
return head(:ok) unless email.is_a?(String)
user = User.from_email(email.strip.downcase)
user&.send_confirmation_instructions unless user&.confirmed?
head :ok
end
end
@@ -10,7 +10,12 @@ class DeviseOverrides::OmniauthCallbacksController < DeviseTokenAuth::OmniauthCa
private
def sign_in_user
# Capture before skip_confirmation! sets confirmed_at, which would
# make oauth_user_needs_password_reset? return false and skip the
# password reset for persisted unconfirmed users.
needs_password_reset = oauth_user_needs_password_reset?
@resource.skip_confirmation! if confirmable_enabled?
set_random_password_if_oauth_user if needs_password_reset
# once the resource is found and verified
# we can just send them to the login page again with the SSO params
@@ -20,7 +25,10 @@ class DeviseOverrides::OmniauthCallbacksController < DeviseTokenAuth::OmniauthCa
end
def sign_in_user_on_mobile
# See comment in sign_in_user for why this is captured before skip_confirmation!
needs_password_reset = oauth_user_needs_password_reset?
@resource.skip_confirmation! if confirmable_enabled?
set_random_password_if_oauth_user if needs_password_reset
# once the resource is found and verified
# we can just send them to the login page again with the SSO params
@@ -37,6 +45,7 @@ class DeviseOverrides::OmniauthCallbacksController < DeviseTokenAuth::OmniauthCa
return redirect_to login_page_url(error: 'business-account-only') unless validate_signup_email_is_business_domain?
create_account_for_user
set_random_password_if_oauth_user
token = @resource.send(:set_reset_password_token)
frontend_url = ENV.fetch('FRONTEND_URL', nil)
redirect_to "#{frontend_url}/app/auth/password/edit?config=default&reset_password_token=#{token}"
@@ -81,6 +90,15 @@ class DeviseOverrides::OmniauthCallbacksController < DeviseTokenAuth::OmniauthCa
Avatar::AvatarFromUrlJob.perform_later(@resource, auth_hash['info']['image'])
end
def oauth_user_needs_password_reset?
@resource.present? && (@resource.new_record? || !@resource.confirmed?)
end
def set_random_password_if_oauth_user
# Password must satisfy secure_password requirements (uppercase, lowercase, number, special char)
@resource.update(password: "#{SecureRandom.hex(16)}aA1!") if @resource.persisted?
end
def default_devise_mapping
'user'
end
@@ -0,0 +1,101 @@
class Platform::Api::V1::EmailChannelMigrationsController < PlatformController
before_action :set_account
before_action :validate_account_permissible
before_action :validate_feature_flag
before_action :validate_params
def create
results = migrate_email_channels
render json: { results: results }, status: :ok
end
private
def set_account
@account = Account.find(params[:account_id])
end
def validate_account_permissible
return if @platform_app.platform_app_permissibles.find_by(permissible: @account)
render json: { error: 'Non permissible resource' }, status: :unauthorized
end
def validate_feature_flag
return if ActiveModel::Type::Boolean.new.cast(ENV.fetch('EMAIL_CHANNEL_MIGRATION', false))
render json: { error: 'Email channel migration is not enabled' }, status: :forbidden
end
def validate_params
return render json: { error: 'Missing migrations parameter' }, status: :unprocessable_entity if migration_params.blank?
return unless migration_params.size > MAX_MIGRATIONS
return render json: { error: "Too many migrations (max #{MAX_MIGRATIONS})" },
status: :unprocessable_entity
end
def migrate_email_channels
migration_params.map { |entry| migrate_single(entry) }
end
MAX_MIGRATIONS = 25
SUPPORTED_PROVIDERS = %w[google microsoft].freeze
def migrate_single(entry)
validate_provider!(entry[:provider])
ActiveRecord::Base.transaction do
channel = create_channel(entry)
inbox = create_inbox(channel, entry)
{ email: entry[:email], inbox_id: inbox.id, channel_id: channel.id, status: 'success' }
end
rescue StandardError => e
{ email: entry[:email], status: 'error', message: e.message }
end
def create_channel(entry)
Channel::Email.create!(
account_id: @account.id,
email: entry[:email],
provider: entry[:provider],
provider_config: entry[:provider_config]&.to_h,
imap_enabled: entry.fetch(:imap_enabled, true),
imap_address: entry[:imap_address] || default_imap_address(entry[:provider]),
imap_port: entry[:imap_port] || 993,
imap_login: entry[:imap_login] || entry[:email],
imap_enable_ssl: entry.fetch(:imap_enable_ssl, true)
)
end
def create_inbox(channel, entry)
@account.inboxes.create!(
name: entry[:inbox_name] || "Migrated #{entry[:provider]&.capitalize}: #{entry[:email]}",
channel: channel
)
end
def validate_provider!(provider)
return if SUPPORTED_PROVIDERS.include?(provider)
raise ArgumentError, "Unsupported provider '#{provider}'. Must be one of: #{SUPPORTED_PROVIDERS.join(', ')}"
end
def default_imap_address(provider)
case provider
when 'google' then 'imap.gmail.com'
when 'microsoft' then 'outlook.office365.com'
else ''
end
end
def migration_params
params.permit(migrations: [
:email, :provider, :inbox_name,
:imap_enabled, :imap_address, :imap_port, :imap_login, :imap_enable_ssl,
{ provider_config: {} }
])[:migrations]
end
end
@@ -1,6 +1,7 @@
class Public::Api::V1::Portals::ArticlesController < Public::Api::V1::Portals::BaseController
before_action :ensure_custom_domain_request, only: [:show, :index]
before_action :portal
before_action :ensure_portal_feature_enabled
before_action :set_category, except: [:index, :show, :tracking_pixel]
before_action :set_article, only: [:show]
layout 'portal'
@@ -61,7 +62,7 @@ class Public::Api::V1::Portals::ArticlesController < Public::Api::V1::Portals::B
def set_article
@article = @portal.articles.find_by(slug: permitted_params[:article_slug])
@parsed_content = render_article_content(@article.content)
@parsed_content = render_article_content(@article.content.to_s)
end
def set_category
@@ -1,6 +1,7 @@
class Public::Api::V1::Portals::CategoriesController < Public::Api::V1::Portals::BaseController
before_action :ensure_custom_domain_request, only: [:show, :index]
before_action :portal
before_action :ensure_portal_feature_enabled
before_action :set_category, only: [:show]
layout 'portal'
@@ -1,7 +1,8 @@
class Public::Api::V1::PortalsController < Public::Api::V1::Portals::BaseController
before_action :ensure_custom_domain_request, only: [:show]
before_action :portal
before_action :redirect_to_portal_with_locale, only: [:show]
before_action :portal
before_action :ensure_portal_feature_enabled
layout 'portal'
def show
@@ -24,6 +25,7 @@ class Public::Api::V1::PortalsController < Public::Api::V1::Portals::BaseControl
def redirect_to_portal_with_locale
return if params[:locale].present?
portal
redirect_to "/hc/#{@portal.slug}/#{@portal.default_locale}"
end
end
+7
View File
@@ -18,4 +18,11 @@ class PublicController < ActionController::Base
Please send us an email at support@chatwoot.com with the custom domain name and account API key"
}, status: :unauthorized and return
end
def ensure_portal_feature_enabled
return unless ChatwootApp.chatwoot_cloud?
return if @portal.account.feature_enabled?('help_center')
render 'public/api/v1/portals/not_active', status: :payment_required
end
end
+6
View File
@@ -1,4 +1,10 @@
module TimezoneHelper
def timezone_name_from_params(timezone, offset)
return timezone if timezone.present? && ActiveSupport::TimeZone[timezone].present?
timezone_name_from_offset(offset)
end
# ActiveSupport TimeZone is not aware of the current time, so ActiveSupport::Timezone[offset]
# would return the timezone without considering day light savings. To get the correct timezone,
# this method uses zone.now.utc_offset for comparison as referenced in the issues below
+3 -1
View File
@@ -98,7 +98,9 @@ export default {
mql.onchange = e => setColorTheme(e.matches);
},
setLocale(locale) {
this.$root.$i18n.locale = locale;
if (locale) {
this.$root.$i18n.locale = locale;
}
},
async initializeAccount() {
await this.$store.dispatch('accounts/get');
@@ -25,6 +25,10 @@ class AgentBotsAPI extends ApiClient {
resetAccessToken(botId) {
return axios.post(`${this.url}/${botId}/reset_access_token`);
}
resetSecret(botId) {
return axios.post(`${this.url}/${botId}/reset_secret`);
}
}
export default new AgentBotsAPI();
@@ -31,6 +31,12 @@ class CaptainCustomTools extends ApiClient {
delete(id) {
return axios.delete(`${this.url}/${id}`);
}
test(data = {}) {
return axios.post(`${this.url}/test`, {
custom_tool: data,
});
}
}
export default new CaptainCustomTools();
+4
View File
@@ -48,6 +48,10 @@ class Inboxes extends CacheEnabledApiClient {
template,
});
}
resetSecret(inboxId) {
return axios.post(`${this.url}/${inboxId}/reset_secret`);
}
}
export default new Inboxes();
@@ -106,6 +106,10 @@ select {
&[disabled] {
@apply field-disabled;
}
option:not(:disabled) {
@apply bg-n-solid-2 text-n-slate-12;
}
}
// Textarea
@@ -20,11 +20,11 @@ const excludedLabels = defineModel('excludedLabels', {
const excludeOlderThanMinutes = defineModel('excludeOlderThanMinutes', {
type: Number,
default: 10,
default: null,
});
// Duration limits: 10 minutes to 999 days (in minutes)
const MIN_DURATION_MINUTES = 10;
// Duration limits: 1 minute to 999 days (in minutes)
const MIN_DURATION_MINUTES = 1;
const MAX_DURATION_MINUTES = 1438560; // 999 days * 24 hours * 60 minutes
const { t } = useI18n();
@@ -27,7 +27,7 @@ const { t } = useI18n();
const BASE_KEY = 'ASSIGNMENT_POLICY.AGENT_CAPACITY_POLICY';
const DEFAULT_CONVERSATION_LIMIT = 10;
const MIN_CONVERSATION_LIMIT = 1;
const MIN_CONVERSATION_LIMIT = 0;
const MAX_CONVERSATION_LIMIT = 100000;
const selectedInboxIds = computed(
@@ -42,6 +42,7 @@ const availableInboxes = computed(() =>
const isLimitValid = limit => {
return (
Number.isInteger(limit.conversationLimit) &&
limit.conversationLimit >= MIN_CONVERSATION_LIMIT &&
limit.conversationLimit <= MAX_CONVERSATION_LIMIT
);
@@ -1,207 +1,63 @@
<script setup>
import { computed } from 'vue';
import { useI18n } from 'vue-i18n';
import { CONVERSATION_PRIORITY } from 'shared/constants/messages';
defineProps({
import Icon from 'dashboard/components-next/icon/Icon.vue';
const props = defineProps({
priority: {
type: String,
default: '',
},
showEmpty: {
type: Boolean,
default: false,
},
});
const { t } = useI18n();
const icons = {
[CONVERSATION_PRIORITY.URGENT]: 'i-woot-priority-urgent',
[CONVERSATION_PRIORITY.HIGH]: 'i-woot-priority-high',
[CONVERSATION_PRIORITY.MEDIUM]: 'i-woot-priority-medium',
[CONVERSATION_PRIORITY.LOW]: 'i-woot-priority-low',
};
const priorityLabels = {
[CONVERSATION_PRIORITY.URGENT]: 'CONVERSATION.PRIORITY.OPTIONS.URGENT',
[CONVERSATION_PRIORITY.HIGH]: 'CONVERSATION.PRIORITY.OPTIONS.HIGH',
[CONVERSATION_PRIORITY.MEDIUM]: 'CONVERSATION.PRIORITY.OPTIONS.MEDIUM',
[CONVERSATION_PRIORITY.LOW]: 'CONVERSATION.PRIORITY.OPTIONS.LOW',
};
const iconName = computed(() => {
if (props.priority && icons[props.priority]) {
return icons[props.priority];
}
return props.showEmpty ? 'i-woot-priority-empty' : '';
});
const tooltipContent = computed(() => {
if (props.priority && priorityLabels[props.priority]) {
return t(priorityLabels[props.priority]);
}
if (props.showEmpty) {
return t('CONVERSATION.PRIORITY.OPTIONS.NONE');
}
return '';
});
</script>
<!-- eslint-disable vue/no-static-inline-styles -->
<template>
<div class="inline-flex items-center justify-center rounded-md">
<!-- Low Priority -->
<svg
v-if="priority === CONVERSATION_PRIORITY.LOW"
width="20"
height="20"
viewBox="0 0 20 20"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<mask
id="mask0_2030_12879"
style="mask-type: alpha"
maskUnits="userSpaceOnUse"
x="0"
y="0"
width="20"
height="20"
>
<rect width="20" height="20" fill="#D9D9D9" />
</mask>
<g mask="url(#mask0_2030_12879)">
<rect
x="3.33301"
y="10"
width="3.33333"
height="6.66667"
rx="1.66667"
class="fill-n-amber-9"
/>
<rect
x="8.33301"
y="6.6665"
width="3.33333"
height="10"
rx="1.66667"
class="fill-n-slate-6"
/>
<rect
x="13.333"
y="3.3335"
width="3.33333"
height="13.3333"
rx="1.66667"
class="fill-n-slate-6"
/>
</g>
</svg>
<!-- Medium Priority -->
<svg
v-if="priority === CONVERSATION_PRIORITY.MEDIUM"
width="20"
height="20"
viewBox="0 0 20 20"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<mask
id="mask0_2030_12879"
style="mask-type: alpha"
maskUnits="userSpaceOnUse"
x="0"
y="0"
width="20"
height="20"
>
<rect width="20" height="20" fill="#D9D9D9" />
</mask>
<g mask="url(#mask0_2030_12879)">
<rect
x="3.33301"
y="10"
width="3.33333"
height="6.66667"
rx="1.66667"
class="fill-n-amber-9"
/>
<rect
x="8.33301"
y="6.6665"
width="3.33333"
height="10"
rx="1.66667"
class="fill-n-amber-9"
/>
<rect
x="13.333"
y="3.3335"
width="3.33333"
height="13.3333"
rx="1.66667"
class="fill-n-slate-6"
/>
</g>
</svg>
<!-- High Priority -->
<svg
v-if="priority === CONVERSATION_PRIORITY.HIGH"
width="20"
height="20"
viewBox="0 0 20 20"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<mask
id="mask0_2030_12879"
style="mask-type: alpha"
maskUnits="userSpaceOnUse"
x="0"
y="0"
width="20"
height="20"
>
<rect width="20" height="20" fill="#D9D9D9" />
</mask>
<g mask="url(#mask0_2030_12879)">
<rect
x="3.33301"
y="10"
width="3.33333"
height="6.66667"
rx="1.66667"
class="fill-n-amber-9"
/>
<rect
x="8.33301"
y="6.6665"
width="3.33333"
height="10"
rx="1.66667"
class="fill-n-amber-9"
/>
<rect
x="13.333"
y="3.3335"
width="3.33333"
height="13.3333"
rx="1.66667"
class="fill-n-amber-9"
/>
</g>
</svg>
<!-- Urgent Priority -->
<svg
v-if="priority === CONVERSATION_PRIORITY.URGENT"
width="20"
height="20"
viewBox="0 0 20 20"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<mask
id="mask0_2030_12879"
style="mask-type: alpha"
maskUnits="userSpaceOnUse"
x="0"
y="0"
width="20"
height="20"
>
<rect width="20" height="20" fill="#D9D9D9" />
</mask>
<g mask="url(#mask0_2030_12879)">
<rect
x="3.33301"
y="10"
width="3.33333"
height="6.66667"
rx="1.66667"
class="fill-n-ruby-9"
/>
<rect
x="8.33301"
y="6.6665"
width="3.33333"
height="10"
rx="1.66667"
class="fill-n-ruby-9"
/>
<rect
x="13.333"
y="3.3335"
width="3.33333"
height="13.3333"
rx="1.66667"
class="fill-n-ruby-9"
/>
</g>
</svg>
</div>
<Icon
v-tooltip.top="{
content: tooltipContent,
delay: { show: 500, hide: 0 },
}"
:icon="iconName"
class="size-4 text-n-slate-5"
/>
</template>
@@ -1,5 +1,5 @@
<script setup>
import { computed } from 'vue';
import { computed, ref } from 'vue';
import { debounce } from '@chatwoot/utils';
import { useI18n } from 'vue-i18n';
import { ARTICLE_EDITOR_MENU_OPTIONS } from 'dashboard/constants/editor';
@@ -32,6 +32,7 @@ const emit = defineEmits([
'setAuthor',
'setCategory',
'previewArticle',
'createArticle',
]);
const { t } = useI18n();
@@ -57,16 +58,10 @@ const quickSave = debounce(
// Only use to save for existing articles
const saveAndSyncDebounced = debounce(saveAndSync, 2500, false);
// Debounced save for new articles
const quickSaveNewArticle = debounce(saveAndSync, 400, false);
const handleSave = value => {
if (isNewArticle.value) {
quickSaveNewArticle(value);
} else {
quickSave(value);
saveAndSyncDebounced(value);
}
if (isNewArticle.value) return;
quickSave(value);
saveAndSyncDebounced(value);
};
const articleTitle = computed({
@@ -76,9 +71,12 @@ const articleTitle = computed({
},
});
const localContent = ref(props.article.content || '');
const articleContent = computed({
get: () => props.article.content,
set: content => {
localContent.value = content;
handleSave({ content });
},
});
@@ -98,6 +96,14 @@ const setCategoryId = categoryId => {
const previewArticle = () => {
emit('previewArticle');
};
const handleCreateArticle = event => {
if (!isNewArticle.value) return;
const title = event?.target?.value || '';
if (title.trim()) {
emit('createArticle', { title, content: localContent.value });
}
};
</script>
<template>
@@ -122,6 +128,7 @@ const previewArticle = () => {
custom-text-area-wrapper-class="border-0 !bg-transparent dark:!bg-transparent !py-0 !px-0"
placeholder="Title"
autofocus
@blur="handleCreateArticle"
/>
<ArticleEditorControls
:article="article"
@@ -12,6 +12,7 @@ import {
import CardLayout from 'dashboard/components-next/CardLayout.vue';
import DropdownMenu from 'dashboard/components-next/dropdown-menu/DropdownMenu.vue';
import Button from 'dashboard/components-next/button/Button.vue';
import Checkbox from 'dashboard/components-next/checkbox/Checkbox.vue';
const props = defineProps({
id: {
@@ -34,14 +35,34 @@ const props = defineProps({
type: Number,
required: true,
},
isSelected: {
type: Boolean,
default: false,
},
selectable: {
type: Boolean,
default: false,
},
showSelectionControl: {
type: Boolean,
default: false,
},
showMenu: {
type: Boolean,
default: true,
},
});
const emit = defineEmits(['action']);
const emit = defineEmits(['action', 'select', 'hover']);
const { checkPermissions } = usePolicy();
const { t } = useI18n();
const [showActionsDropdown, toggleDropdown] = useToggle();
const modelValue = computed({
get: () => props.isSelected,
set: () => emit('select', props.id),
});
const menuItems = computed(() => {
const allOptions = [
@@ -79,12 +100,23 @@ const handleAction = ({ action, value }) => {
</script>
<template>
<CardLayout>
<CardLayout
:selectable="selectable"
class="relative"
@mouseenter="emit('hover', true)"
@mouseleave="emit('hover', false)"
>
<div
v-show="showSelectionControl"
class="absolute top-7 ltr:left-3 rtl:right-3"
>
<Checkbox v-model="modelValue" />
</div>
<div class="flex gap-1 justify-between w-full">
<span class="text-base text-n-slate-12 line-clamp-1">
{{ name }}
</span>
<div class="flex gap-2 items-center">
<div v-if="showMenu" class="flex gap-2 items-center">
<div
v-on-clickaway="() => toggleDropdown(false)"
class="flex relative items-center group"
@@ -21,16 +21,22 @@ const emit = defineEmits(['deleteSuccess']);
const { t } = useI18n();
const store = useStore();
const bulkDeleteDialogRef = ref(null);
const i18nKey = computed(() => props.type.toUpperCase());
const i18nKey = computed(() => {
const i18nTypeMap = {
AssistantResponse: 'RESPONSES',
AssistantDocument: 'DOCUMENTS',
};
return i18nTypeMap[props.type];
});
const handleBulkDelete = async ids => {
if (!ids) return;
try {
await store.dispatch(
'captainBulkActions/handleBulkDelete',
Array.from(props.bulkIds)
);
await store.dispatch('captainBulkActions/handleBulkDelete', {
ids: Array.from(props.bulkIds),
type: props.type,
});
emit('deleteSuccess');
useAlert(t(`CAPTAIN.${i18nKey.value}.BULK_DELETE.SUCCESS_MESSAGE`));
@@ -6,6 +6,13 @@ import { useAccount } from 'dashboard/composables/useAccount';
import BasePaywallModal from 'dashboard/routes/dashboard/settings/components/BasePaywallModal.vue';
defineProps({
featurePrefix: {
type: String,
default: 'CAPTAIN',
},
});
const router = useRouter();
const currentUser = useMapGetter('getCurrentUser');
@@ -31,7 +38,7 @@ const openBilling = () => {
>
<BasePaywallModal
class="mx-auto"
feature-prefix="CAPTAIN"
:feature-prefix="featurePrefix"
:i18n-key="i18nKey"
:is-super-admin="isSuperAdmin"
:is-on-chatwoot-cloud="isOnChatwootCloud"
@@ -27,6 +27,7 @@ const initialState = {
conversationFaqs: false,
memories: false,
citations: false,
contactAttributes: false,
},
};
@@ -59,6 +60,7 @@ const updateStateFromAssistant = assistant => {
conversationFaqs: config.feature_faq || false,
memories: config.feature_memory || false,
citations: config.feature_citation || false,
contactAttributes: config.feature_contact_attributes || false,
};
};
@@ -79,6 +81,7 @@ const handleBasicInfoUpdate = async () => {
feature_faq: state.features.conversationFaqs,
feature_memory: state.features.memories,
feature_citation: state.features.citations,
feature_contact_attributes: state.features.contactAttributes,
},
};
@@ -138,6 +141,10 @@ watch(
<input v-model="state.features.citations" type="checkbox" />
{{ t('CAPTAIN.ASSISTANTS.FORM.FEATURES.ALLOW_CITATIONS') }}
</label>
<label class="flex items-center gap-2">
<input v-model="state.features.contactAttributes" type="checkbox" />
{{ t('CAPTAIN.ASSISTANTS.FORM.FEATURES.ALLOW_CONTACT_ATTRIBUTES') }}
</label>
</div>
</div>
@@ -101,12 +101,9 @@ const authTypeLabel = computed(() => {
</Policy>
</div>
</div>
<div class="flex items-center justify-between w-full gap-4">
<div class="flex items-center gap-3 flex-1">
<span
v-if="description"
class="text-sm truncate text-n-slate-11 flex-1"
>
<div class="flex items-center justify-between w-full gap-4 min-w-0">
<div class="flex items-center gap-3 flex-1 min-w-0">
<span v-if="description" class="text-sm truncate text-n-slate-11">
{{ description }}
</span>
<span
@@ -1,9 +1,10 @@
<script setup>
import { reactive, computed, useTemplateRef, watch } from 'vue';
import { reactive, computed, ref, useTemplateRef, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import { useVuelidate } from '@vuelidate/core';
import { required } from '@vuelidate/validators';
import { required, maxLength } from '@vuelidate/validators';
import { useMapGetter } from 'dashboard/composables/store';
import CustomToolsAPI from 'dashboard/api/captain/customTools';
import Input from 'dashboard/components-next/input/Input.vue';
import TextArea from 'dashboard/components-next/textarea/TextArea.vue';
@@ -72,8 +73,12 @@ const DEFAULT_PARAM = {
required: false,
};
// OpenAI enforces a 64-char limit on function names. The backend slug is
// "custom_" (7 chars) + parameterized title, so cap the title conservatively.
const MAX_TOOL_NAME_LENGTH = 55;
const validationRules = {
title: { required },
title: { required, maxLength: maxLength(MAX_TOOL_NAME_LENGTH) },
endpoint_url: { required },
http_method: { required },
auth_type: { required },
@@ -103,9 +108,15 @@ const isLoading = computed(() =>
);
const getErrorMessage = (field, errorKey) => {
return v$.value[field].$error
? t(`CAPTAIN.CUSTOM_TOOLS.FORM.${errorKey}.ERROR`)
: '';
if (!v$.value[field].$error) return '';
const failedRule = v$.value[field].$errors[0]?.$validator;
if (failedRule === 'maxLength') {
return t(`CAPTAIN.CUSTOM_TOOLS.FORM.${errorKey}.MAX_LENGTH_ERROR`, {
max: MAX_TOOL_NAME_LENGTH,
});
}
return t(`CAPTAIN.CUSTOM_TOOLS.FORM.${errorKey}.ERROR`);
};
const formErrors = computed(() => ({
@@ -140,6 +151,30 @@ const handleSubmit = async () => {
emit('submit', state);
};
const isTesting = ref(false);
const testResult = ref(null);
const isTestDisabled = computed(
() => state.endpoint_url.includes('{{') || !!state.request_template
);
const handleTest = async () => {
if (!state.endpoint_url) return;
isTesting.value = true;
testResult.value = null;
try {
const { data } = await CustomToolsAPI.test(state);
const isOk = data.status >= 200 && data.status < 300;
testResult.value = { success: isOk, status: data.status };
} catch (e) {
const message =
e.response?.data?.error || t('CAPTAIN.CUSTOM_TOOLS.TEST.ERROR');
testResult.value = { success: false, message };
} finally {
isTesting.value = false;
}
};
</script>
<template>
@@ -248,6 +283,45 @@ const handleSubmit = async () => {
class="[&_textarea]:font-mono"
/>
<div class="flex flex-col gap-2">
<Button
type="button"
variant="faded"
color="slate"
icon="i-lucide-play"
:label="t('CAPTAIN.CUSTOM_TOOLS.TEST.BUTTON')"
:is-loading="isTesting"
:disabled="isTesting || !state.endpoint_url || isTestDisabled"
@click="handleTest"
/>
<p v-if="isTestDisabled" class="text-xs text-n-slate-11">
{{ t('CAPTAIN.CUSTOM_TOOLS.TEST.DISABLED_HINT') }}
</p>
<div
v-if="testResult"
class="flex items-center gap-2 px-3 py-2 text-xs rounded-lg"
:class="
testResult.success
? 'bg-n-teal-2 text-n-teal-11'
: 'bg-n-ruby-2 text-n-ruby-11'
"
>
<span
:class="
testResult.success ? 'i-lucide-check-circle' : 'i-lucide-x-circle'
"
class="size-3.5 shrink-0"
/>
{{
testResult.status
? t('CAPTAIN.CUSTOM_TOOLS.TEST.SUCCESS', {
status: testResult.status,
})
: testResult.message
}}
</div>
</div>
<div class="flex gap-3 justify-between items-center w-full">
<Button
type="button"
@@ -1,8 +1,11 @@
<script setup>
import { useAccount } from 'dashboard/composables/useAccount';
import EmptyStateLayout from 'dashboard/components-next/EmptyStateLayout.vue';
import FeatureSpotlight from 'dashboard/components-next/feature-spotlight/FeatureSpotlight.vue';
import Button from 'dashboard/components-next/button/Button.vue';
const emit = defineEmits(['click']);
const { isOnChatwootCloud } = useAccount();
const onClick = () => {
emit('click');
@@ -10,6 +13,15 @@ const onClick = () => {
</script>
<template>
<FeatureSpotlight
:title="$t('CAPTAIN.CUSTOM_TOOLS.EMPTY_STATE.FEATURE_SPOTLIGHT.TITLE')"
:note="$t('CAPTAIN.CUSTOM_TOOLS.EMPTY_STATE.FEATURE_SPOTLIGHT.NOTE')"
fallback-thumbnail="/assets/images/dashboard/captain/assistant-light.svg"
fallback-thumbnail-dark="/assets/images/dashboard/captain/assistant-dark.svg"
learn-more-url="https://chwt.app/hc/captain-tools"
class="mb-8"
:hide-actions="!isOnChatwootCloud"
/>
<EmptyStateLayout
:title="$t('CAPTAIN.CUSTOM_TOOLS.EMPTY_STATE.TITLE')"
:subtitle="$t('CAPTAIN.CUSTOM_TOOLS.EMPTY_STATE.SUBTITLE')"
@@ -36,7 +36,13 @@ const props = defineProps({
},
});
const emit = defineEmits(['enterPress', 'input', 'blur', 'focus']);
const emit = defineEmits([
'enterPress',
'escapePress',
'input',
'blur',
'focus',
]);
const modelValue = defineModel({
type: [String, Number],
@@ -49,6 +55,10 @@ const onEnterPress = () => {
emit('enterPress');
};
const onEscapePress = () => {
emit('escapePress');
};
const handleInput = event => {
emit('input', event.target.value);
modelValue.value = event.target.value;
@@ -102,6 +112,7 @@ defineExpose({
@focus="handleFocus"
@blur="handleBlur"
@keydown.enter.prevent="onEnterPress"
@keydown.escape.prevent="onEscapePress"
/>
</div>
</template>
@@ -32,6 +32,7 @@ const convertToMinutes = newValue => {
const transformedValue = computed({
get() {
if (duration.value == null) return null;
if (unit.value === DURATION_UNITS.MINUTES) return duration.value;
if (unit.value === DURATION_UNITS.HOURS)
return Math.floor(duration.value / 60);
@@ -41,6 +42,10 @@ const transformedValue = computed({
return 0;
},
set(newValue) {
if (newValue == null || newValue === '') {
duration.value = null;
return;
}
let minuteValue = convertToMinutes(newValue);
duration.value = Math.min(Math.max(minuteValue, props.min), props.max);
@@ -53,6 +58,7 @@ const transformedValue = computed({
// this might create some confusion, especially when saving
// this watcher fixes it by rounding the duration basically, to the nearest unit value
watch(unit, () => {
if (duration.value == null) return;
let adjustedValue = convertToMinutes(transformedValue.value);
duration.value = Math.min(Math.max(adjustedValue, props.min), props.max);
});
@@ -313,7 +313,12 @@ const plugins = computed(() => {
const sendWithSignature = computed(() => {
// this is considered the source of truth, we watch this property
// on change, we toggle the signature in the editor
if (props.allowSignature && !props.isPrivate && props.channelType) {
if (
props.allowSignature &&
!props.isPrivate &&
props.channelType &&
!props.disabled
) {
return fetchSignatureFlagFromUISettings(props.channelType);
}
@@ -436,6 +441,7 @@ function reloadState(content = props.modelValue) {
}
function addSignature() {
if (props.disabled) return;
let content = props.modelValue;
// see if the content is empty, if it is before appending the signature
// we need to add a paragraph node and move the cursor at the start of the editor
@@ -454,6 +460,7 @@ function addSignature() {
}
function removeSignature() {
if (props.disabled) return;
if (!props.signature) return;
let content = props.modelValue;
content = removeSignatureHelper(
@@ -806,7 +813,7 @@ watch(
watch(sendWithSignature, newValue => {
// see if the allowSignature flag is true
if (props.allowSignature) {
if (props.allowSignature && !props.disabled) {
toggleSignatureInEditor(newValue);
}
});
@@ -828,6 +835,8 @@ onMounted(() => {
}
});
defineExpose({ focusEditorInputField });
// BUS Event to insert text or markdown into the editor at the
// current cursor position.
// Components using this
@@ -79,7 +79,7 @@ export default {
created() {
state = createState(
this.modelValue,
this.modelValue || '',
this.placeholder,
this.plugins,
{ onImageUpload: this.openFileBrowser },
@@ -170,7 +170,7 @@ export default {
},
reloadState() {
state = createState(
this.modelValue,
this.modelValue || '',
this.placeholder,
this.plugins,
{ onImageUpload: this.openFileBrowser },
@@ -128,7 +128,6 @@ export default {
},
},
emits: [
'replaceText',
'toggleInsertArticle',
'selectWhatsappTemplate',
'selectContentTemplate',
@@ -277,9 +276,6 @@ export default {
toggleMessageSignature() {
this.setSignatureFlagForInbox(this.channelType, !this.sendWithSignature);
},
replaceText(text) {
this.$emit('replaceText', text);
},
toggleInsertArticle() {
this.$emit('toggleInsertArticle');
},
@@ -10,7 +10,7 @@ import InboxName from '../InboxName.vue';
import ConversationContextMenu from './contextMenu/Index.vue';
import TimeAgo from 'dashboard/components/ui/TimeAgo.vue';
import CardLabels from './conversationCardComponents/CardLabels.vue';
import PriorityMark from './PriorityMark.vue';
import CardPriorityIcon from 'dashboard/components-next/Conversation/ConversationCard/CardPriorityIcon.vue';
import SLACardLabel from './components/SLACardLabel.vue';
import ContextMenu from 'dashboard/components/ui/ContextMenu.vue';
import VoiceCallStatus from './VoiceCallStatus.vue';
@@ -305,7 +305,7 @@ const deleteConversation = () => {
>
<InboxName v-if="showInboxName" :inbox="inbox" class="flex-1 min-w-0" />
<div
class="flex items-center gap-2 flex-shrink-0"
class="flex items-baseline gap-2 flex-shrink-0"
:class="{
'flex-1 justify-between': !showInboxName,
}"
@@ -317,7 +317,10 @@ const deleteConversation = () => {
<fluent-icon icon="person" size="12" class="text-n-slate-11" />
{{ assignee.name }}
</span>
<PriorityMark :priority="chat.priority" class="flex-shrink-0" />
<CardPriorityIcon
:priority="chat.priority"
class="flex-shrink-0 !size-3.5"
/>
</div>
</div>
<h4
@@ -1,53 +0,0 @@
<script>
import { CONVERSATION_PRIORITY } from '../../../../shared/constants/messages';
export default {
name: 'PriorityMark',
props: {
priority: {
type: String,
default: '',
validate: value =>
[...Object.values(CONVERSATION_PRIORITY), ''].includes(value),
},
},
data() {
return {
CONVERSATION_PRIORITY,
};
},
computed: {
tooltipText() {
return this.$t(
`CONVERSATION.PRIORITY.OPTIONS.${this.priority.toUpperCase()}`
);
},
isUrgent() {
return this.priority === CONVERSATION_PRIORITY.URGENT;
},
},
};
</script>
<!-- eslint-disable-next-line vue/no-root-v-if -->
<template>
<span
v-if="priority"
v-tooltip="{
content: tooltipText,
delay: { show: 1500, hide: 0 },
}"
class="shrink-0 rounded-sm inline-flex items-center justify-center w-3.5 h-3.5"
:class="{
'bg-n-ruby-4 text-n-ruby-10': isUrgent,
'bg-n-slate-4 text-n-slate-11': !isUrgent,
}"
>
<fluent-icon
:icon="`priority-${priority.toLowerCase()}`"
:size="isUrgent ? 12 : 14"
class="flex-shrink-0"
view-box="0 0 14 14"
/>
</span>
</template>
@@ -27,7 +27,6 @@ import { CMD_AI_ASSIST } from 'dashboard/helper/commandbar/events';
import {
getMessageVariables,
getUndefinedVariablesInMessage,
replaceVariablesInMessage,
} from '@chatwoot/utils';
import WhatsappTemplates from './WhatsappTemplates/Modal.vue';
import ContentTemplates from './ContentTemplates/ContentTemplatesModal.vue';
@@ -99,6 +98,7 @@ export default {
} = useUISettings();
const replyEditor = useTemplateRef('replyEditor');
const messageEditor = useTemplateRef('messageEditor');
const copilot = useCopilotReply();
const shortcutKey = useKbd(['$mod', '+', 'enter']);
@@ -109,6 +109,7 @@ export default {
setQuotedReplyFlagForInbox,
fetchQuotedReplyFlagFromUISettings,
replyEditor,
messageEditor,
copilot,
shortcutKey,
};
@@ -251,6 +252,9 @@ export default {
if (this.isAnInstagramChannel) {
return MESSAGE_MAX_LENGTH.INSTAGRAM;
}
if (this.isATelegramChannel) {
return MESSAGE_MAX_LENGTH.TELEGRAM;
}
if (this.isATiktokChannel) {
return MESSAGE_MAX_LENGTH.TIKTOK;
}
@@ -507,7 +511,7 @@ export default {
);
this.fetchAndSetReplyTo();
emitter.on(BUS_EVENTS.TOGGLE_REPLY_TO_MESSAGE, this.fetchAndSetReplyTo);
emitter.on(BUS_EVENTS.TOGGLE_REPLY_TO_MESSAGE, this.onReplyToMessage);
// A hacky fix to solve the drag and drop
// Is showing on top of new conversation modal drag and drop
@@ -522,7 +526,7 @@ export default {
unmounted() {
document.removeEventListener('paste', this.onPaste);
document.removeEventListener('keydown', this.handleKeyEvents);
emitter.off(BUS_EVENTS.TOGGLE_REPLY_TO_MESSAGE, this.fetchAndSetReplyTo);
emitter.off(BUS_EVENTS.TOGGLE_REPLY_TO_MESSAGE, this.onReplyToMessage);
emitter.off(BUS_EVENTS.INSERT_INTO_NORMAL_EDITOR, this.addIntoEditor);
emitter.off(
BUS_EVENTS.NEW_CONVERSATION_MODAL,
@@ -543,7 +547,10 @@ export default {
},
setCopilotAcceptedMessage(message, replyType = this.replyType) {
const key = this.getDraftKey(this.conversationIdByRoute, replyType);
this.copilotAcceptedMessages[key] = trimContent(message || '');
this.copilotAcceptedMessages[key] = trimContent(
message || '',
this.maxLength
);
},
clearCopilotAcceptedMessage(replyType = this.replyType) {
const key = this.getDraftKey(this.conversationIdByRoute, replyType);
@@ -601,7 +608,7 @@ export default {
saveDraft(conversationId, replyType) {
if (this.message || this.message === '') {
const key = this.getDraftKey(conversationId, replyType);
const draftToSave = trimContent(this.message || '');
const draftToSave = trimContent(this.message || '', this.maxLength);
this.$store.dispatch('draftMessages/set', {
key,
@@ -628,10 +635,17 @@ export default {
return message;
}
// Even when editor is disabled (e.g. WhatsApp/API can't reply), we must
// still normalize stale signatures out of drafts when signature is off.
if (this.isEditorDisabled && this.sendWithSignature) {
return message;
}
const effectiveChannelType = getEffectiveChannelType(
this.channelType,
this.inbox?.medium || ''
);
return this.sendWithSignature
? appendSignature(message, this.messageSignature, effectiveChannelType)
: removeSignature(message, this.messageSignature, effectiveChannelType);
@@ -903,32 +917,6 @@ export default {
});
this.hideContentTemplatesModal();
},
replaceText(message) {
if (this.sendWithSignature && !this.private) {
// if signature is enabled, append it to the message
// appendSignature ensures that the signature is not duplicated
// so we don't need to check if the signature is already present
const effectiveChannelType = getEffectiveChannelType(
this.channelType,
this.inbox?.medium || ''
);
message = appendSignature(
message,
this.messageSignature,
effectiveChannelType
);
}
const updatedMessage = replaceVariablesInMessage({
message,
variables: this.messageVariables,
});
setTimeout(() => {
useTrack(CONVERSATION_EVENTS.INSERTED_A_CANNED_RESPONSE);
this.message = updatedMessage;
}, 100);
},
setReplyMode(mode = REPLY_EDITOR_MODES.REPLY) {
// Clear attachments when switching between private note and reply modes
// This is to prevent from breaking the upload rules
@@ -1191,6 +1179,15 @@ export default {
return false;
});
},
onReplyToMessage() {
this.fetchAndSetReplyTo();
if (this.inReplyTo) {
this.$nextTick(() => {
const pos = this.isSignatureEnabledForInbox ? 'start' : 'end';
this.messageEditor?.focusEditorInputField(pos);
});
}
},
resetReplyToMessage() {
const replyStorageKey = LOCAL_STORAGE_KEYS.MESSAGE_REPLY_TO;
LocalStorage.deleteFromJsonStore(replyStorageKey, this.conversationId);
@@ -1313,6 +1310,7 @@ export default {
/>
<WootMessageEditor
v-else-if="!showAudioRecorderEditor"
ref="messageEditor"
v-model="message"
:conversation-id="conversationId"
:editor-id="editorStateId"
@@ -1417,7 +1415,6 @@ export default {
:new-conversation-modal-active="newConversationModalActive"
@select-whatsapp-template="openWhatsappTemplateModal"
@select-content-template="openContentTemplateModal"
@replace-text="replaceText"
@toggle-insert-article="toggleInsertArticle"
@toggle-quoted-reply="toggleQuotedReply"
/>
@@ -32,6 +32,7 @@ const emit = defineEmits(['dismiss']);
xs
slate
icon="i-lucide-x"
class="flex-shrink-0"
@click.stop="emit('dismiss')"
/>
</div>
@@ -8,6 +8,7 @@ import {
agents,
teams,
labels,
booleanFilterOptions,
statusFilterOptions,
messageTypeOptions,
priorityOptions,
@@ -73,6 +74,8 @@ describe('useAutomation', () => {
return countries;
case 'message_type':
return messageTypeOptions;
case 'private_note':
return booleanFilterOptions;
case 'priority':
return priorityOptions;
default:
@@ -226,6 +229,9 @@ describe('useAutomation', () => {
expect(getConditionDropdownValues('message_type')).toEqual(
messageTypeOptions
);
expect(getConditionDropdownValues('private_note')).toEqual(
booleanFilterOptions
);
expect(getConditionDropdownValues('priority')).toEqual(priorityOptions);
});
@@ -0,0 +1,54 @@
import { useEditableAutomation } from '../useEditableAutomation';
import useAutomationValues from '../useAutomationValues';
vi.mock('../useAutomationValues');
describe('useEditableAutomation', () => {
beforeEach(() => {
useAutomationValues.mockReturnValue({
getConditionDropdownValues: vi.fn(attributeKey => {
if (attributeKey === 'private_note') {
return [
{ id: true, name: 'True' },
{ id: false, name: 'False' },
];
}
return [];
}),
getActionDropdownValues: vi.fn(),
});
});
it('rehydrates boolean conditions as a single selected option', () => {
const automation = {
event_name: 'message_created',
conditions: [
{
attribute_key: 'private_note',
filter_operator: 'equal_to',
values: [false],
query_operator: null,
},
],
actions: [],
};
const automationTypes = {
message_created: {
conditions: [{ key: 'private_note', inputType: 'search_select' }],
},
};
const { formatAutomation } = useEditableAutomation();
const result = formatAutomation(automation, [], automationTypes, []);
expect(result.conditions).toEqual([
{
attribute_key: 'private_note',
filter_operator: 'equal_to',
values: { id: false, name: 'False' },
query_operator: 'and',
},
]);
});
});
@@ -46,11 +46,26 @@ export function useEditableAutomation() {
if (inputType === 'comma_separated_plain_text') {
return { ...condition, values: condition.values.join(',') };
}
const dropdownValues = getConditionDropdownValues(
condition.attribute_key
);
const hasBooleanOptions =
inputType === 'search_select' &&
dropdownValues.length &&
dropdownValues.every(item => typeof item.id === 'boolean');
if (hasBooleanOptions) {
return {
...condition,
query_operator: condition.query_operator || 'and',
values: dropdownValues.find(item => item.id === condition.values[0]),
};
}
return {
...condition,
query_operator: condition.query_operator || 'and',
values: [...getConditionDropdownValues(condition.attribute_key)].filter(
item => [...condition.values].includes(item.id)
values: [...dropdownValues].filter(item =>
[...condition.values].includes(item.id)
),
};
});
+2
View File
@@ -37,6 +37,7 @@ export const FEATURE_FLAGS = {
CHANNEL_INSTAGRAM: 'channel_instagram',
CHANNEL_TIKTOK: 'channel_tiktok',
CONTACT_CHATWOOT_SUPPORT_TEAM: 'contact_chatwoot_support_team',
CAPTAIN_CUSTOM_TOOLS: 'custom_tools',
CAPTAIN_V2: 'captain_integration_v2',
CAPTAIN_TASKS: 'captain_tasks',
SAML: 'saml',
@@ -49,6 +50,7 @@ export const FEATURE_FLAGS = {
export const PREMIUM_FEATURES = [
FEATURE_FLAGS.SLA,
FEATURE_FLAGS.CAPTAIN,
FEATURE_FLAGS.CAPTAIN_CUSTOM_TOOLS,
FEATURE_FLAGS.CUSTOM_ROLES,
FEATURE_FLAGS.AUDIT_LOGS,
FEATURE_FLAGS.HELP_CENTER,
@@ -150,6 +150,7 @@ export const getConditionOptions = ({
conversation_language: languages,
country_code: countries,
message_type: messageTypeOptions,
private_note: booleanFilterOptions,
priority: priorityOptions,
labels: generateConditionOptions(labels, 'title'),
};
@@ -32,6 +32,25 @@ export function extractTextFromMarkdown(markdown) {
.trim(); // Trim any extra space
}
/**
* Removes inline base64 markdown images from signature content.
*
* @param {string} content
* @returns {{ sanitizedContent: string, hasInlineImages: boolean }}
*/
export function stripInlineBase64Images(content) {
if (!content || typeof content !== 'string') {
return { sanitizedContent: content || '', hasInlineImages: false };
}
const markdownInlineBase64ImageRegex =
/!\[[^\]]*]\(\s*data:image\/[a-zA-Z0-9.+-]+;base64,[^)]+\s*\)/gi;
const sanitizedContent = content.replace(markdownInlineBase64ImageRegex, '');
const hasInlineImages = sanitizedContent !== content;
return { sanitizedContent, hasInlineImages };
}
/**
* Strip unsupported markdown formatting based on channel capabilities.
* Uses MARKDOWN_PATTERNS from editor constants.
@@ -166,6 +166,8 @@ const TOD_TO_MERIDIEM = {
evening: 'pm',
night: 'pm',
};
const CJK_CHAR_RE =
/[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}]/u;
// ─── Translation Cache ──────────────────────────────────────────────────────
@@ -278,8 +280,13 @@ const escapeRegex = s => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
const substituteLocalTokens = (text, pairs) => {
let r = text;
pairs.forEach(([local, en]) => {
const re = new RegExp(`(?<=^|\\s)${escapeRegex(local)}(?=\\s|$)`, 'g');
r = r.replace(re, en);
if (CJK_CHAR_RE.test(local)) {
const re = new RegExp(escapeRegex(local), 'g');
r = r.replace(re, ` ${en} `);
} else {
const re = new RegExp(`(?<=^|\\s)${escapeRegex(local)}(?=\\s|$)`, 'g');
r = r.replace(re, en);
}
});
return r;
};
@@ -82,6 +82,9 @@ const ORDINAL_RE = `(\\d{1,2}(?:st|nd|rd|th)?|${ORDINAL_WORDS})`;
const HALF_UNIT_RE = /^(?:in\s+)?half\s+(?:an?\s+)?(hour|day|week|month|year)$/;
const RELATIVE_DURATION_RE = new RegExp(`^(?:in\\s+)?${NUM_RE}\\s+${UNIT_RE}$`);
const RELATIVE_DURATION_AFTER_RE = new RegExp(
`^(?:in\\s+)?${NUM_RE}\\s+${UNIT_RE}\\s+after$`
);
const DURATION_FROM_NOW_RE = new RegExp(
`^${NUM_RE}\\s+${UNIT_RE}\\s+from\\s+now$`
);
@@ -89,6 +92,9 @@ const RELATIVE_DAY_ONLY_RE = new RegExp(`^(${RELATIVE_DAYS})$`);
const RELATIVE_DAY_TOD_RE = new RegExp(
`^(${RELATIVE_DAYS})\\s+(?:at\\s+)?(${TIME_OF_DAY_NAMES})$`
);
const RELATIVE_DAY_MERIDIEM_RE = new RegExp(
`^(${RELATIVE_DAYS})\\s+(?:at\\s+)?(am|pm)$`
);
const RELATIVE_DAY_TOD_TIME_RE = new RegExp(
`^(${RELATIVE_DAYS})\\s+(?:at\\s+)?(${TIME_OF_DAY_NAMES})\\s+(\\d{1,2}(?::\\d{2})?)$`
);
@@ -245,6 +251,7 @@ const matchDuration = (text, now) => {
return (
parseDuration(text.match(DURATION_FROM_NOW_RE), now) ||
parseDuration(text.match(RELATIVE_DURATION_AFTER_RE), now) ||
parseDuration(text.match(RELATIVE_DURATION_RE), now)
);
};
@@ -303,6 +310,13 @@ const matchRelativeDay = (text, now) => {
);
}
const dayMeridiemMatch = text.match(RELATIVE_DAY_MERIDIEM_RE);
if (dayMeridiemMatch) {
const [, dayKey, meridiem] = dayMeridiemMatch;
const hours = meridiem === 'am' ? 9 : 14;
return applyTimeWithRollover(RELATIVE_DAY_MAP[dayKey], hours, 0, now);
}
const dayAtTimeMatch = text.match(RELATIVE_DAY_AT_TIME_RE);
if (dayAtTimeMatch) {
const [, dayKey, timeRaw] = dayAtTimeMatch;
@@ -178,6 +178,21 @@ describe('getConditionOptions', () => {
})
).toEqual(testOptions);
});
it('returns boolean options for private_note', () => {
const booleanOptions = [
{ id: true, name: 'True' },
{ id: false, name: 'False' },
];
expect(
helpers.getConditionOptions({
booleanFilterOptions: booleanOptions,
customAttributes,
type: 'private_note',
})
).toEqual(booleanOptions);
});
});
describe('getFileName', () => {
@@ -15,6 +15,7 @@ import {
getMenuAnchor,
calculateMenuPosition,
stripUnsupportedFormatting,
stripInlineBase64Images,
} from '../editorHelper';
import { FORMATTING } from 'dashboard/constants/editor';
import { EditorState } from '@chatwoot/prosemirror-schema';
@@ -423,6 +424,36 @@ describe('extractTextFromMarkdown', () => {
});
});
describe('stripInlineBase64Images', () => {
it('removes markdown data:image base64 images and sets hasInlineImages', () => {
const content =
'Hello\n![x](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAE)\nWorld';
const { sanitizedContent, hasInlineImages } =
stripInlineBase64Images(content);
expect(hasInlineImages).toBe(true);
expect(sanitizedContent).not.toContain('data:image/png;base64');
expect(sanitizedContent).toContain('Hello');
expect(sanitizedContent).toContain('World');
});
it('leaves hosted image markdown unchanged', () => {
const content = '![](https://example.com/logo.png)';
const { sanitizedContent, hasInlineImages } =
stripInlineBase64Images(content);
expect(hasInlineImages).toBe(false);
expect(sanitizedContent).toBe(content);
});
it('returns empty hasInlineImages for empty input', () => {
expect(stripInlineBase64Images('')).toEqual({
sanitizedContent: '',
hasInlineImages: false,
});
});
});
describe('insertAtCursor', () => {
it('should return undefined if editorView is not provided', () => {
const result = insertAtCursor(undefined, schema.text('Hello'), 0);
@@ -1626,6 +1626,24 @@ describe('generateDateSuggestions — localized input regressions', () => {
},
};
const zhTWSnoozeTranslations = {
UNITS: {
HOUR: '小時',
HOURS: '小時',
DAY: '天',
DAYS: '天',
},
HALF: '半',
RELATIVE: {
TOMORROW: '明天',
},
MERIDIEM: {
AM: '上午',
PM: '下午',
},
AFTER: '後',
};
describe('P1: short non-English tokens must NOT produce spurious half-duration suggestions', () => {
it('Arabic "غد" does not produce half-duration suggestions', () => {
const results = generateDateSuggestions('غد', now, {
@@ -1721,6 +1739,37 @@ describe('generateDateSuggestions — localized input regressions', () => {
expect(results[0].date.getHours()).toBe(6);
});
});
describe('zh_TW compact CJK inputs', () => {
const options = {
translations: zhTWSnoozeTranslations,
locale: 'zh-TW',
};
it('parses "2小時後" (2 hours from now) without spaces', () => {
const results = generateDateSuggestions('2小時後', now, options);
expect(results.length).toBeGreaterThan(0);
expect(results[0].date.getDate()).toBe(16);
expect(results[0].date.getHours()).toBe(12);
expect(results[0].date.getMinutes()).toBe(0);
});
it('parses "半天" (half day) without spaces', () => {
const results = generateDateSuggestions('半天', now, options);
expect(results.length).toBeGreaterThan(0);
expect(results[0].date.getDate()).toBe(16);
expect(results[0].date.getHours()).toBe(22);
expect(results[0].date.getMinutes()).toBe(0);
});
it('parses "明天 上午" (tomorrow AM) into tomorrow 9am', () => {
const results = generateDateSuggestions('明天 上午', now, options);
expect(results.length).toBeGreaterThan(0);
expect(results[0].date.getDate()).toBe(17);
expect(results[0].date.getHours()).toBe(9);
expect(results[0].date.getMinutes()).toBe(0);
});
});
});
describe('no-space duration suggestions', () => {
File diff suppressed because it is too large Load Diff
@@ -6,12 +6,12 @@
"SWITCH_VIEW_LAYOUT": "Switch the layout",
"DASHBOARD_APP_TAB_MESSAGES": "Messages",
"UNVERIFIED_SESSION": "The identity of this user is not verified",
"NO_MESSAGE_1": "Uh oh! Looks like there are no messages from customers in your inbox.",
"NO_MESSAGE_2": " to send a message to your page!",
"NO_INBOX_1": "Hola! Looks like you haven't added any inboxes yet.",
"NO_INBOX_2": " to get started",
"NO_INBOX_AGENT": "Uh Oh! Looks like you are not part of any inbox. Please contact your administrator",
"SEARCH_MESSAGES": "Search for messages in conversations",
"NO_MESSAGE_1": "የደንበኞች መልእክቶች በኢንቦክስዎ አልተገኙም።",
"NO_MESSAGE_2": " ወደ ገፅዎ መልእክት ለመላክ!",
"NO_INBOX_1": "እሺ! አሁን ምንም ኢንቦክስ አልጨመሩም።",
"NO_INBOX_2": " ለመጀመር",
"NO_INBOX_AGENT": "ወይ! ምንም ኢንቦክስ አባል አይደለህም። እባክዎ አስተዳዳሪዎን ያነጋግሩ",
"SEARCH_MESSAGES": "መልእክቶችን በውይይቶች ውስጥ ይፈልጉ",
"VIEW_ORIGINAL": "View original",
"VIEW_TRANSLATED": "View translated",
"EMPTY_STATE": {
@@ -19,19 +19,19 @@
"KEYBOARD_SHORTCUTS": "to view keyboard shortcuts"
},
"SEARCH": {
"TITLE": "Search messages",
"TITLE": "መልእክቶችን ይፈልጉ",
"RESULT_TITLE": "Search Results",
"LOADING_MESSAGE": "Crunching data...",
"LOADING_MESSAGE": "መረጃ በማስተናገድ ላይ...",
"PLACEHOLDER": "Type any text to search messages",
"NO_MATCHING_RESULTS": "No results found."
},
"UNREAD_MESSAGES": "Unread Messages",
"UNREAD_MESSAGE": "Unread Message",
"CLICK_HERE": "Click here",
"LOADING_INBOXES": "Loading inboxes",
"LOADING_CONVERSATIONS": "Loading Conversations",
"CANNOT_REPLY": "You cannot reply due to",
"24_HOURS_WINDOW": "24 hour message window restriction",
"CLICK_HERE": "እዚህ ጠቅ ያድርጉ",
"LOADING_INBOXES": "ኢንቦክሶች በመጫን ላይ",
"LOADING_CONVERSATIONS": "ውይይቶች በመጫን ላይ",
"CANNOT_REPLY": "ምክንያቱን በመነሳት መልስ ማድረግ አይችሉም",
"24_HOURS_WINDOW": "24 ሰዓት መልእክት ጊዜ ገደብ",
"48_HOURS_WINDOW": "48 hour message window restriction",
"API_HOURS_WINDOW": "ለዚህ ውይይት መመለስ በ{hours} ሰአታት ውስጥ ብቻ ይቻላል",
"NOT_ASSIGNED_TO_YOU": "This conversation is not assigned to you. Would you like to assign this conversation to yourself?",
@@ -44,9 +44,9 @@
"TWILIO_WHATSAPP_CAN_REPLY": "You can only reply to this conversation using a template message due to",
"TWILIO_WHATSAPP_24_HOURS_WINDOW": "24 hour message window restriction",
"OLD_INSTAGRAM_INBOX_REPLY_BANNER": "ይህ የInstagram መለያ ወደ አዲሱ የInstagram ቻናል ገቢ ሳጥን ተዛውሯል። ሁሉም አዲስ መልዕክቶች በዚያ ይታያሉ። ከአሁን ጀምሮ ከዚህ ውይይት መልዕክቶች መላክ አትችሉም።",
"REPLYING_TO": "You are replying to:",
"REMOVE_SELECTION": "Remove Selection",
"DOWNLOAD": "Download",
"REPLYING_TO": "ለዚህ ትመልሳለህ፦",
"REMOVE_SELECTION": "ምርጫ አስወግድ",
"DOWNLOAD": "አውርድ",
"UNKNOWN_FILE_TYPE": "Unknown File",
"SAVE_CONTACT": "Save Contact",
"NO_CONTENT": "No content to display",
@@ -85,13 +85,13 @@
"YOU_ANSWERED": "You answered"
},
"HEADER": {
"RESOLVE_ACTION": "Resolve",
"REOPEN_ACTION": "Reopen",
"RESOLVE_ACTION": "ተፈትኗል",
"REOPEN_ACTION": "እንደገና ክፈት",
"OPEN_ACTION": "Open",
"MORE_ACTIONS": "ተጨማሪ እርምጃዎች",
"OPEN": "More",
"CLOSE": "Close",
"DETAILS": "details",
"OPEN": "ተጨማሪ",
"CLOSE": "ዝጋ",
"DETAILS": "ዝርዝሮች",
"SNOOZED_UNTIL": "Snoozed until",
"SNOOZED_UNTIL_TOMORROW": "Snoozed until tomorrow",
"SNOOZED_UNTIL_NEXT_WEEK": "Snoozed until next week",
@@ -188,21 +188,21 @@
"MESSAGE_SIGN_TOOLTIP": "Message signature",
"ENABLE_SIGN_TOOLTIP": "Enable signature",
"DISABLE_SIGN_TOOLTIP": "Disable signature",
"MSG_INPUT": "Shift + enter for new line. Start with '/' to select a Canned Response.",
"PRIVATE_MSG_INPUT": "Shift + enter for new line. This will be visible only to Agents",
"MSG_INPUT": "አዲስ መስመር ለማስገባት Shift + enter ይጠቀሙ። '/' በመጀመር የተዘጋጀ ምላሽ ይምረጡ።",
"PRIVATE_MSG_INPUT": "አዲስ መስመር ለማስገባት Shift + enter ይጠቀሙ። ይህ ለወኪሎች ብቻ ይታያል",
"MESSAGING_RESTRICTED": "You cannot reply to this conversation",
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Message signature is not configured, please configure it in profile settings.",
"COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
"COPILOT_MSG_INPUT": "ኮፒሎት ተጨማሪ እባብነቶች ስጡው, ወይም ሌላ ማንኛውንም ጥያቄ ያቀርቡ... ተከትሎ ለማስተላለፊያ ኤንተር ይጫኑ።",
"CLICK_HERE": "Click here to update",
"WHATSAPP_TEMPLATES": "Whatsapp Templates"
},
"REPLYBOX": {
"REPLY": "Reply",
"PRIVATE_NOTE": "Private Note",
"SEND": "Send",
"CREATE": "Add Note",
"REPLY": "መልስ",
"PRIVATE_NOTE": "የግል ማስታወሻ",
"SEND": "ላክ",
"CREATE": "ማስታወሻ አክል",
"INSERT_READ_MORE": "Read more",
"DISMISS_REPLY": "Dismiss reply",
"REPLYING_TO": "Replying to:",
@@ -214,7 +214,7 @@
"DRAG_DROP": "Drag and drop here to attach",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
"COPILOT_THINKING": "Copilot is thinking",
"COPILOT_THINKING": "ኮፒሎት እየሰማራ ነው",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Add bcc",
@@ -245,10 +245,10 @@
"EXPAND": "Expand preview"
}
},
"VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team",
"CHANGE_STATUS": "Conversation status changed",
"VISIBLE_TO_AGENTS": "የግል ማስታወሻ፡ ለአንተና ቡድንህ ብቻ ይታያል",
"CHANGE_STATUS": "የውይይቱ ሁኔታ ተቀይሯል",
"CHANGE_STATUS_FAILED": "Conversation status change failed",
"CHANGE_AGENT": "Conversation Assignee changed",
"CHANGE_AGENT": "የውይይቱ ተመድብ ተቀይሯል",
"CHANGE_AGENT_FAILED": "Assignee change failed",
"ASSIGN_LABEL_SUCCESFUL": "Label assigned successfully",
"ASSIGN_LABEL_FAILED": "Label assignment failed",
@@ -300,20 +300,20 @@
}
},
"EMAIL_TRANSCRIPT": {
"TITLE": "Send conversation transcript",
"DESC": "Send a copy of the conversation transcript to the specified email address",
"SUBMIT": "Submit",
"CANCEL": "Cancel",
"SEND_EMAIL_SUCCESS": "The chat transcript was sent successfully",
"SEND_EMAIL_ERROR": "There was an error, please try again",
"TITLE": "የውይይት ጽሑፍ ላክ",
"DESC": "የውይይቱን ጽሑፍ ቅጂ ወደ ተጠቃሚው ኢሜይል ላክ",
"SUBMIT": "አስገባ",
"CANCEL": "ይቅር",
"SEND_EMAIL_SUCCESS": "የቻት አጭር መግለጫው በተሳካ ሁኔታ ተልኳል",
"SEND_EMAIL_ERROR": "ስህተት ተፈጥሯል፣ እባክዎ ደግመው ይሞክሩ",
"SEND_EMAIL_PAYMENT_REQUIRED": "Email transcript is not available on your current plan. Please upgrade to use this feature.",
"FORM": {
"SEND_TO_CONTACT": "Send the transcript to the customer",
"SEND_TO_CONTACT": "መግለጫውን ለደንበኛው ይላኩ",
"SEND_TO_AGENT": "Send the transcript to the assigned agent",
"SEND_TO_OTHER_EMAIL_ADDRESS": "Send the transcript to another email address",
"SEND_TO_OTHER_EMAIL_ADDRESS": "መግለጫውን ወደ ሌላ ኢሜይል አድራሻ ይላኩ",
"EMAIL": {
"PLACEHOLDER": "Enter an email address",
"ERROR": "Please enter a valid email address"
"PLACEHOLDER": "ኢሜይል አድራሻ ያስገቡ",
"ERROR": "ትክክለኛ ኢሜይል አድራሻ ያስገቡ"
}
}
},
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,39 +1,39 @@
{
"REPORT": {
"HEADER": "Conversations",
"LOADING_CHART": "Loading chart data...",
"NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
"LOADING_CHART": "ገበታ ውሂብ በማስጫን ላይ...",
"NO_ENOUGH_DATA": "ሪፖርት ለማመንጨት በቂ ውሂብ ነጥቦች አልደረሰንም፣ እባክዎ በኋላ ደግመው ይሞክሩ።",
"DOWNLOAD_CONVERSATION_REPORTS": "Download conversation reports",
"DATA_FETCHING_FAILED": "Failed to fetch data, please try again later.",
"SUMMARY_FETCHING_FAILED": "Failed to fetch summary, please try again later.",
"METRICS": {
"CONVERSATIONS": {
"NAME": "Conversations",
"DESC": "( Total )"
"NAME": "ውይይቶች",
"DESC": "( ጠቅላላ )"
},
"INCOMING_MESSAGES": {
"NAME": "Messages received",
"DESC": "( Total )"
"DESC": "( ጠቅላላ )"
},
"OUTGOING_MESSAGES": {
"NAME": "Messages sent",
"DESC": "( Total )"
"DESC": "( ጠቅላላ )"
},
"FIRST_RESPONSE_TIME": {
"NAME": "First Response Time",
"DESC": "( Avg )",
"DESC": "( አማካይ )",
"INFO_TEXT": "Total number of conversations used for computation:",
"TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)"
},
"RESOLUTION_TIME": {
"NAME": "Resolution Time",
"DESC": "( Avg )",
"NAME": "የመፍትሄ ጊዜ",
"DESC": "( አማካይ )",
"INFO_TEXT": "Total number of conversations used for computation:",
"TOOLTIP_TEXT": "Resolution Time is {metricValue} (based on {conversationCount} conversations)"
},
"RESOLUTION_COUNT": {
"NAME": "Resolution Count",
"DESC": "( Total )"
"NAME": "የመፍትሄ ብዛት",
"DESC": "( ጠቅላላ )"
},
"BOT_RESOLUTION_COUNT": {
"NAME": "Resolution Count",
@@ -61,8 +61,8 @@
"CUSTOM_DATE_RANGE": "Custom date range"
},
"CUSTOM_DATE_RANGE": {
"CONFIRM": "Apply",
"PLACEHOLDER": "Select date range"
"CONFIRM": "አተግባር ላይ አውርድ",
"PLACEHOLDER": "የቀን ክልል ይምረጡ"
},
"GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By",
"DURATION_FILTER_LABEL": "Duration",
@@ -127,12 +127,12 @@
}
},
"AGENT_REPORTS": {
"HEADER": "Agents Overview",
"HEADER": "የወኪሎች እይታ",
"DESCRIPTION": "Easily track agent performance with key metrics such as conversations, response times, resolution times, and resolved cases. Click an agent's name to learn more.",
"LOADING_CHART": "Loading chart data...",
"NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
"DOWNLOAD_AGENT_REPORTS": "Download agent reports",
"FILTER_DROPDOWN_LABEL": "Select Agent",
"LOADING_CHART": "የቅርጸ ቁምፊ ውሂብ በመጫን ላይ...",
"NO_ENOUGH_DATA": "ሪፖርት ለማቅረብ በቂ ውሂብ አልደረሰንም፣ እባክዎ በኋላ ደግመው ይሞክሩ።.",
"DOWNLOAD_AGENT_REPORTS": "የAgent ሪፖርቶችን አውርድ",
"FILTER_DROPDOWN_LABEL": "Agent ይምረጡ",
"FILTERS": {
"INPUT_PLACEHOLDER": {
"AGENTS": "Search agents"
@@ -140,72 +140,72 @@
},
"METRICS": {
"CONVERSATIONS": {
"NAME": "Conversations",
"DESC": "( Total )"
"NAME": "ውይይቶች",
"DESC": "( ጠቅላላ )"
},
"INCOMING_MESSAGES": {
"NAME": "Incoming Messages",
"DESC": "( Total )"
"NAME": "የመጣ መልእክቶች",
"DESC": "( ጠቅላላ )"
},
"OUTGOING_MESSAGES": {
"NAME": "Outgoing Messages",
"DESC": "( Total )"
"NAME": "የሚያልኩ መልእክቶች",
"DESC": "( ጠቅላላ )"
},
"FIRST_RESPONSE_TIME": {
"NAME": "First Response Time",
"DESC": "( Avg )",
"DESC": "( አማካይ )",
"INFO_TEXT": "Total number of conversations used for computation:",
"TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)"
},
"RESOLUTION_TIME": {
"NAME": "Resolution Time",
"DESC": "( Avg )",
"NAME": "የመፍትሄ ጊዜ",
"DESC": "( አማካይ )",
"INFO_TEXT": "Total number of conversations used for computation:",
"TOOLTIP_TEXT": "Resolution Time is {metricValue} (based on {conversationCount} conversations)"
},
"RESOLUTION_COUNT": {
"NAME": "Resolution Count",
"DESC": "( Total )"
"NAME": "የተፈታ ብዛት",
"DESC": "( ጠቅላላ )"
}
},
"DATE_RANGE": [
{
"id": 0,
"name": "Last 7 days"
"name": "ያለፉት 7 ቀናት"
},
{
"id": 1,
"name": "Last 30 days"
"name": "ያለፉት 30 ቀናት"
},
{
"id": 2,
"name": "Last 3 months"
"name": "ያለፉት 3 ወራት"
},
{
"id": 3,
"name": "Last 6 months"
"name": "ያለፉት 6 ወራት"
},
{
"id": 4,
"name": "Last year"
"name": "ያለፈው ዓመት"
},
{
"id": 5,
"name": "Custom date range"
"name": "በተለይ የተመረጠ ቀን ክልል"
}
],
"CUSTOM_DATE_RANGE": {
"CONFIRM": "Apply",
"PLACEHOLDER": "Select date range"
"CONFIRM": "ተግባሩን ተፈጽም",
"PLACEHOLDER": "የቀን ክልል ይምረጡ"
}
},
"LABEL_REPORTS": {
"HEADER": "Labels Overview",
"HEADER": "የመለያ አጠቃላይ እይታ",
"DESCRIPTION": "Track label performance with key metrics including conversations, response times, resolution times, and resolved cases. Click a label name for detailed insights.",
"LOADING_CHART": "Loading chart data...",
"NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
"DOWNLOAD_LABEL_REPORTS": "Download label reports",
"FILTER_DROPDOWN_LABEL": "Select Label",
"LOADING_CHART": "የገበታ ውሂብ በመጫን ላይ...",
"NO_ENOUGH_DATA": "የበቂ ውሂብ አልተሰበሰበም፣ እባክዎ በኋላ ይሞክሩ።",
"DOWNLOAD_LABEL_REPORTS": "የመለያ ሪፖርቶችን ይውሰዱ",
"FILTER_DROPDOWN_LABEL": "መለያ ይምረጡ",
"FILTERS": {
"INPUT_PLACEHOLDER": {
"LABELS": "Search labels"
@@ -213,71 +213,71 @@
},
"METRICS": {
"CONVERSATIONS": {
"NAME": "Conversations",
"DESC": "( Total )"
"NAME": "ውይይቶች",
"DESC": "( ድምር )"
},
"INCOMING_MESSAGES": {
"NAME": "Incoming Messages",
"DESC": "( Total )"
"NAME": "የሚገቡ መልእክቶች",
"DESC": "( ድምር )"
},
"OUTGOING_MESSAGES": {
"NAME": "Outgoing Messages",
"DESC": "( Total )"
"NAME": "የወጪ መልእክቶች",
"DESC": "( ድምር )"
},
"FIRST_RESPONSE_TIME": {
"NAME": "First Response Time",
"DESC": "( Avg )",
"DESC": "( አማካይ )",
"INFO_TEXT": "Total number of conversations used for computation:",
"TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)"
},
"RESOLUTION_TIME": {
"NAME": "Resolution Time",
"DESC": "( Avg )",
"NAME": "የመፍትሄ ጊዜ",
"DESC": "( አማካይ )",
"INFO_TEXT": "Total number of conversations used for computation:",
"TOOLTIP_TEXT": "Resolution Time is {metricValue} (based on {conversationCount} conversations)"
},
"RESOLUTION_COUNT": {
"NAME": "Resolution Count",
"DESC": "( Total )"
"NAME": "የመፍትሄ ብዛት",
"DESC": "( ድምር )"
}
},
"DATE_RANGE": [
{
"id": 0,
"name": "Last 7 days"
"name": "ያለፉ 7 ቀናት"
},
{
"id": 1,
"name": "Last 30 days"
"name": "ያለፉ 30 ቀናት"
},
{
"id": 2,
"name": "Last 3 months"
"name": "ያለፉት 3 ወራት"
},
{
"id": 3,
"name": "Last 6 months"
"name": "ያለፉት 6 ወራት"
},
{
"id": 4,
"name": "Last year"
"name": "ያለፈው ዓመት"
},
{
"id": 5,
"name": "Custom date range"
"name": "በተፈጥሮ የተመረጠ የቀን ክልል"
}
],
"CUSTOM_DATE_RANGE": {
"CONFIRM": "Apply",
"PLACEHOLDER": "Select date range"
"CONFIRM": "ተግባር አድርግ",
"PLACEHOLDER": "የቀን ክልል ይምረጡ"
}
},
"INBOX_REPORTS": {
"HEADER": "Inbox Overview",
"HEADER": "የኢንቦክስ አጠቃላይ እይታ",
"DESCRIPTION": "Quickly view your inbox performance with key metrics like conversations, response times, resolution times, and resolved cases—all in one place. Click an inbox name for more details.",
"LOADING_CHART": "Loading chart data...",
"NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
"DOWNLOAD_INBOX_REPORTS": "Download inbox reports",
"LOADING_CHART": "የገቢ ግምገማ መረጃ በመጫን ላይ...",
"NO_ENOUGH_DATA": "ሪፖርት ለማዘጋጀት በቂ መረጃ አልተደረሰም። እባክዎ በኋላ ይሞክሩ።",
"DOWNLOAD_INBOX_REPORTS": "የኢንቦክስ ሪፖርቶችን ይውሰዱ",
"FILTER_DROPDOWN_LABEL": "Select Inbox",
"ALL_INBOXES": "All Inboxes",
"SEARCH_INBOX": "Search Inbox",
@@ -424,7 +424,7 @@
}
},
"CSAT_REPORTS": {
"HEADER": "CSAT Reports",
"HEADER": "CSAT ሪፖርቶች",
"NO_RECORDS": "No responses yet",
"NO_RECORDS_DESCRIPTION": "CSAT survey responses will appear here once customers start providing feedback.",
"DOWNLOAD": "Download CSAT Reports",
@@ -454,10 +454,10 @@
},
"TABLE": {
"HEADER": {
"CONTACT_NAME": "Contact",
"CONTACT_NAME": "እውቂያ",
"AGENT_NAME": "Agent",
"RATING": "Rating",
"FEEDBACK_TEXT": "Feedback comment",
"RATING": "እምነት ደረጃ",
"FEEDBACK_TEXT": "አስተያየት አስተያየት",
"CONVERSATION": "Conversation",
"CUSTOMER": "Customer",
"RESPONSE": "Response",
@@ -469,16 +469,16 @@
"NO_FEEDBACK": "No feedback provided",
"METRIC": {
"TOTAL_RESPONSES": {
"LABEL": "Total responses",
"TOOLTIP": "Total number of responses collected"
"LABEL": "ጠቅላላ ምላሾች",
"TOOLTIP": "የተሰበሰበው ምላሾች ጠቅላላ ብዛት"
},
"SATISFACTION_SCORE": {
"LABEL": "Satisfaction score",
"TOOLTIP": "Total number of positive responses / Total number of responses * 100"
"LABEL": "የደስታ ነጥብ",
"TOOLTIP": "አጠቃላይ የአዎንታዊ ምላሾች ብዛት / አጠቃላይ የምላሾች ብዛት * 100"
},
"RESPONSE_RATE": {
"LABEL": "Response rate",
"TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100"
"LABEL": "የምላሽ ተመን",
"TOOLTIP": "አጠቃላይ የምላሾች ብዛት / አጠቃላይ የተላኩ የCSAT እቅድ መልእክቶች ብዛት * 100"
},
"RATING_DISTRIBUTION": "Rating distribution"
},
File diff suppressed because it is too large Load Diff
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "تم إزالة اللغة من البوابة بنجاح",
"ERROR_MESSAGE": "غير قادر على إزالة اللغة من البوابة. حاول مرة أخرى."
}
},
"DRAFT_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale moved to draft successfully",
"ERROR_MESSAGE": "Unable to move locale to draft. Try again."
}
},
"PUBLISH_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale published successfully",
"ERROR_MESSAGE": "Unable to publish locale. Try again."
}
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "افتراضي",
"DRAFT": "مسودة",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
"MOVE_TO_DRAFT": "Move to draft",
"PUBLISH_LOCALE": "Publish locale",
"DELETE": "حذف"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "حدد اللغة..."
},
"STATUS": {
"LABEL": "الحالة",
"OPTIONS": {
"LIVE": "نُشرت",
"DRAFT": "مسودة"
}
},
"API": {
"SUCCESS_MESSAGE": "تمت إضافة اللغة بنجاح",
"ERROR_MESSAGE": "غير قادر على إضافة اللغة . حاول مرة أخرى."
@@ -710,9 +710,21 @@
"MESSENGER_SUB_HEAD": "ضع هذا الكود داخل وسم الـ body في موقعك",
"ALLOWED_DOMAINS": {
"TITLE": "Allowed Domains",
"SUBTITLE": "Add wildcard or regular domains separated by commas (leave blank to allow all), e.g. *.chatwoot.dev, chatwoot.com.",
"DESCRIPTION": "Restrict which websites can embed your chat widget. For security, only add domains you own and trust. Add one or more domains separated by commas. Leave blank to allow all domains (not recommended for production).",
"PLACEHOLDER": "example.com, www.example.com, app.example.com"
},
"ALLOW_MOBILE_WEBVIEW": {
"LABEL": "Enable widget in mobile apps",
"SUBTITLE": "حدد هذا الخيار إذا كنت تقوم بتضمين الأداة في تطبيقات iOS أو Android. لا ترسل تطبيقات الجوال معلومات النطاق، لذا سيتم حظرها بسبب قيود النطاق ما لم يتم تفعيل هذا الخيار."
},
"IDENTITY_VALIDATION": {
"TITLE": "Identity Validation",
"DESCRIPTION": "Verify user authenticity by generating secure tokens. This prevents unauthorized users from impersonating others in your chat.",
"SECRET_KEY": "Secret Key",
"VIEW_DOCS": "View documentation",
"REQUIRE_LABEL": "Require identity validation for all conversations",
"REQUIRE_DESCRIPTION": "When enabled, users must provide a valid identity token to start conversations. Requests without valid tokens will be rejected."
},
"INBOX_AGENTS": "وكيل الدعم",
"INBOX_AGENTS_SUB_TEXT": "إضافة أو إزالة وكلاء من صندوق الوارد هذا",
"AGENT_ASSIGNMENT": "تعيين المحادثة",
@@ -126,7 +126,7 @@
},
"HELP_TEXT": {
"TITLE": "استخدام تكامل Slack",
"BODY": "With this integration, all of your incoming conversations will be synced to the ***{selectedChannelName}*** channel in your Slack workspace. You can manage all your customer conversations right within the channel and never miss a message.\n\nHere are the main features of the integration:\n\n**Respond to conversations from within Slack:** To respond to a conversation in the ***{selectedChannelName}*** Slack channel, simply type out your message and send it as a thread. This will create a response back to the customer through Chatwoot. It's that simple!\n\n **Create private notes:** If you want to create private notes instead of replies, start your message with ***`note:`***. This ensures that your message is kept private and won't be visible to the customer.\n\n**Associate an agent profile:** If the person who replied on Slack has an agent profile in Chatwoot under the same email, the replies will be associated with that agent profile automatically. This means you can easily track who said what and when. On the other hand, when the replier doesn't have an associated agent profile, the replies will appear from the bot profile to the customer.",
"BODY": "باستخدام هذا التكامل، ستتم مزامنة جميع محادثاتك الواردة مع قناة ***{selectedChannelName}*** في مساحة عمل Slack الخاصة بك. يمكنك إدارة جميع محادثات عملائك مباشرة من داخل القناة ولن تفوّت أي رسالة.\n\nفيما يلي الميزات الرئيسية لهذا التكامل:\n\n**الرد على المحادثات من داخل Slack:** للرد على محادثة في قناة Slack ***{selectedChannelName}***، ما عليك سوى كتابة رسالتك وإرسالها كسلسلة رسائل. سيؤدي ذلك إلى إنشاء رد للعميل عبر Chatwoot. الأمر بهذه البساطة!\n\n **إنشاء ملاحظات خاصة:** إذا كنت تريد إنشاء ملاحظات خاصة بدلاً من الردود، فابدأ رسالتك بـ ***`note:`***. يضمن ذلك بقاء رسالتك خاصة وعدم ظهورها للعميل.\n\n**ربط ملف وكيل:** إذا كان الشخص الذي ردّ في Slack لديه ملف وكيل في Chatwoot تحت البريد الإلكتروني نفسه، فسيتم ربط الردود تلقائيًا بذلك الملف. وهذا يعني أنه يمكنك بسهولة تتبع من قال ماذا ومتى. من ناحية أخرى، إذا لم يكن لدى الشخص الذي ردّ ملف وكيل مرتبط، فستظهر الردود للعميل على أنها صادرة من ملف البوت.",
"SELECTED": "selected"
},
"SELECT_CHANNEL": {
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "قائد",
"HEADER_KNOW_MORE": "Know more",
"HEADER_KNOW_MORE": "اعرف المزيد",
"ASSISTANT_SWITCHER": {
"ASSISTANTS": "Assistants",
"SWITCH_ASSISTANT": "Switch between assistants",
"NEW_ASSISTANT": "Create Assistant",
"EMPTY_LIST": "No assistants found, please create one to get started"
"ASSISTANTS": "المساعدون",
"SWITCH_ASSISTANT": "التبديل بين المساعدين",
"NEW_ASSISTANT": "إنشاء مساعد",
"EMPTY_LIST": "لم يتم العثور على مساعدين، يرجى إنشاء واحد للبدء"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
"PANEL_TITLE": "Get started with Copilot",
"KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilots here to speed things up.",
"PANEL_TITLE": "ابدأ مع Copilot",
"KICK_OFF_MESSAGE": "هل تحتاج إلى ملخص سريع، ترغب في مراجعة المحادثات السابقة، أو صياغة رد أفضل؟ Copilot هنا لتسريع الأمور.",
"SEND_MESSAGE": "إرسال الرسالة...",
"EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
"LOADER": "Captain is thinking",
"EMPTY_MESSAGE": "حدث خطأ أثناء توليد الاستجابة. يرجى المحاولة مرة أخرى.",
"LOADER": "يقوم Captain بالتفكير",
"YOU": "أنت",
"USE": "Use this",
"RESET": "Reset",
"SHOW_STEPS": "Show steps",
"SELECT_ASSISTANT": "Select Assistant",
"USE": "استخدام هذا",
"RESET": "إعادة تعيين",
"SHOW_STEPS": "عرض الخطوات",
"SELECT_ASSISTANT": "اختر المساعد",
"PROMPTS": {
"SUMMARIZE": {
"LABEL": "Summarize this conversation",
"CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
"LABEL": "لخص هذه المحادثة",
"CONTENT": "لخص النقاط الرئيسية التي نوقشت بين العميل ووكيل الدعم، بما في ذلك مخاوف العميل، أسئلته، والحلول أو الردود المقدمة من الوكيل."
},
"SUGGEST": {
"LABEL": "Suggest an answer",
"CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
"LABEL": "اقترح إجابة",
"CONTENT": "حلل استفسار العميل وقم بصياغة رد يعالج مخاوفه أو أسئلته بفعالية. تأكد من أن الرد واضح، موجز، ويوفر معلومات مفيدة."
},
"RATE": {
"LABEL": "Rate this conversation",
"CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
"LABEL": "قم بتقييم هذه المحادثة",
"CONTENT": "راجع المحادثة لترى مدى تلبيتها لاحتياجات العميل. شارك تقييمًا من 5 بناءً على النغمة، الوضوح، والفعالية."
},
"HIGH_PRIORITY": {
"LABEL": "High priority conversations",
"CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
"LABEL": "المحادثات ذات الأولوية العالية",
"CONTENT": "اعطني ملخصًا لجميع المحادثات المفتوحة ذات الأولوية العالية. تضمّن معرف المحادثة، اسم العميل (إن وُجد)، محتوى آخر رسالة، والوكيل المعين. قم بالتجميع حسب الحالة إذا كان ذلك مناسبًا."
},
"LIST_CONTACTS": {
"LABEL": "List contacts",
"CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
"LABEL": "قائمة جهات الاتصال",
"CONTENT": "اعرض لي قائمة بأفضل 10 جهات اتصال. تضمّن الاسم، البريد الإلكتروني أو رقم الهاتف (إن وُجد)، آخر وقت مشاهدة، العلامات (إن وجدت)."
}
}
},
"PLAYGROUND": {
"USER": "أنت",
"ASSISTANT": "Assistant",
"ASSISTANT": "مساعد",
"MESSAGE_PLACEHOLDER": "أكتب رسالتك...",
"HEADER": "Playground",
"DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
"CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
"HEADER": "ساحة اللعب",
"DESCRIPTION": "استخدم هذه الساحة لإرسال رسائل إلى مساعدك والتحقق مما إذا كان يرد بدقة وسرعة وبالنغمة التي تتوقعها.",
"CREDIT_NOTE": "الرسائل المرسلة هنا ستُحتسب ضمن رصيد Captain الخاص بك."
},
"PAYWALL": {
"TITLE": "Upgrade to use Captain AI",
"AVAILABLE_ON": "Captain is not available on the free plan.",
"UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
"TITLE": "قم بالترقية لاستخدام Captain AI",
"AVAILABLE_ON": "Captain غير متاح على الخطة المجانية.",
"UPGRADE_PROMPT": "قم بترقية خطتك للحصول على الوصول إلى مساعدينا، وcopilot، والمزيد.",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
"AVAILABLE_ON": "ولا يتوفر الكابتن AI إلا في خطط المؤسسة.",
"UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
"UPGRADE_PROMPT": "قم بترقية خطتك للحصول على الوصول إلى مساعدينا، وcopilot، والمزيد.",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"BANNER": {
"RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
"DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
"RESPONSES": "لقد استخدمت أكثر من 80٪ من حد الاستجابات الخاص بك. للاستمرار في استخدام Captain AI، يرجى الترقية.",
"DOCUMENTS": "تم الوصول إلى حد المستندات. قم بالترقية للاستمرار في استخدام Captain AI."
},
"FORM": {
"CANCEL": "إلغاء",
@@ -527,7 +527,8 @@
"TITLE": "الخصائص",
"ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations",
"ALLOW_MEMORIES": "Capture key details as memories from customer interactions.",
"ALLOW_CITATIONS": "Include source citations in responses"
"ALLOW_CITATIONS": "Include source citations in responses",
"ALLOW_CONTACT_ATTRIBUTES": "Allow access to contact information"
}
},
"EDIT": {
@@ -737,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
"SELECTED": "{count} selected",
"SELECT_ALL": "Select all ({count})",
"UNSELECT_ALL": "Unselect all ({count})",
"BULK_DELETE_BUTTON": "حذف",
"BULK_DELETE": {
"TITLE": "Delete documents?",
"DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
"CONFIRM": "Yes, delete all",
"SUCCESS_MESSAGE": "Documents deleted successfully",
"ERROR_MESSAGE": "There was an error deleting the documents, please try again."
},
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -794,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
"SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -824,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
"TEST": {
"BUTTON": "Test connection",
"SUCCESS": "Endpoint returned HTTP {status}",
"ERROR": "Connection failed",
"DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
},
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
"ERROR": "Tool name is required"
"ERROR": "Tool name is required",
"MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "الوصف",
@@ -1,31 +1,31 @@
{
"CONTACT_PANEL": {
"NOT_AVAILABLE": "Not Available",
"NOT_AVAILABLE": "Mövcud deyil",
"EMAIL_ADDRESS": "Email Address",
"PHONE_NUMBER": "Phone number",
"PHONE_NUMBER": "Telefon nömrəsi",
"IDENTIFIER": "Identifier",
"COPY_SUCCESSFUL": "Copied to clipboard successfully",
"COMPANY": "Company",
"LOCATION": "Location",
"COMPANY": "Şirkət",
"LOCATION": "Yer",
"BROWSER_LANGUAGE": "Browser Language",
"CONVERSATION_TITLE": "Conversation Details",
"VIEW_PROFILE": "View Profile",
"BROWSER": "Browser",
"OS": "Operating System",
"INITIATED_FROM": "Initiated from",
"INITIATED_AT": "Initiated at",
"IP_ADDRESS": "IP Address",
"CREATED_AT_LABEL": "Created",
"OS": "Əməliyyat Sistemi",
"INITIATED_FROM": "Başlanğıc yeri",
"INITIATED_AT": "Başlanğıc vaxtı",
"IP_ADDRESS": "IP ünvanı",
"CREATED_AT_LABEL": "Yaradılıb",
"NEW_MESSAGE": "New message",
"CALL": "Call",
"CALL": "Zəng et",
"CALL_INITIATED": "Calling the contact…",
"CALL_FAILED": "Unable to start the call. Please try again.",
"VOICE_INBOX_PICKER": {
"TITLE": "Choose a voice inbox"
},
"CONVERSATIONS": {
"NO_RECORDS_FOUND": "There are no previous conversations associated to this contact.",
"TITLE": "Previous Conversations"
"NO_RECORDS_FOUND": "Bu əlaqə ilə bağlı əvvəlki söhbətlər yoxdur.",
"TITLE": "Əvvəlki Söhbətlər"
},
"LABELS": {
"CONTACT": {
@@ -44,23 +44,23 @@
}
},
"MERGE_CONTACT": "Merge contact",
"CONTACT_ACTIONS": "Contact actions",
"CONTACT_ACTIONS": "Əlaqə əməliyyatları",
"MUTE_CONTACT": "Block Contact",
"UNMUTE_CONTACT": "Unblock Contact",
"MUTED_SUCCESS": "This contact is blocked successfully. You will not be notified of any future conversations.",
"UNMUTED_SUCCESS": "This contact is unblocked successfully.",
"SEND_TRANSCRIPT": "Send Transcript",
"EDIT_LABEL": "Edit",
"UNMUTED_SUCCESS": "Bu əlaqənin bloku uğurla açıldı.",
"SEND_TRANSCRIPT": "Mətni Göndər",
"EDIT_LABEL": "Redaktə et",
"SIDEBAR_SECTIONS": {
"CUSTOM_ATTRIBUTES": "Custom Attributes",
"CONTACT_LABELS": "Contact Labels",
"PREVIOUS_CONVERSATIONS": "Previous Conversations",
"PREVIOUS_CONVERSATIONS": "Əvvəlki Söhbətlər",
"NO_RECORDS_FOUND": "No attributes found"
}
},
"EDIT_CONTACT": {
"BUTTON_LABEL": "Edit Contact",
"TITLE": "Edit contact",
"BUTTON_LABEL": "Əlaqəni redaktə et",
"TITLE": "Əlaqəni redaktə et",
"DESC": "Edit contact details"
},
"DELETE_CONTACT": {
@@ -71,23 +71,23 @@
"TITLE": "Confirm Deletion",
"MESSAGE": "Are you sure to delete ",
"YES": "Yes, Delete",
"NO": "No, Keep"
"NO": "Xeyr, Saxla"
},
"API": {
"SUCCESS_MESSAGE": "Contact deleted successfully",
"ERROR_MESSAGE": "Could not delete contact. Please try again later."
"ERROR_MESSAGE": "Əlaqəni silmək mümkün olmadı. Zəhmət olmasa, bir az sonra yenidən cəhd edin."
}
},
"CONTACT_FORM": {
"FORM": {
"SUBMIT": "Submit",
"CANCEL": "Cancel",
"CANCEL": "Ləğv et",
"AVATAR": {
"LABEL": "Contact Avatar"
},
"NAME": {
"PLACEHOLDER": "Enter the full name of the contact",
"LABEL": "Full Name"
"PLACEHOLDER": "Əlaqənin tam adını daxil edin",
"LABEL": "Tam Ad"
},
"BIO": {
"PLACEHOLDER": "Enter the bio of the contact",
@@ -100,30 +100,30 @@
"ERROR": "Please enter a valid email address."
},
"PHONE_NUMBER": {
"PLACEHOLDER": "Enter the phone number of the contact",
"LABEL": "Phone Number",
"HELP": "Phone number should be of E.164 format eg: +1415555555 [+][country code][area code][local phone number]. You can select the dial code from the dropdown.",
"ERROR": "Phone number should be either empty or of E.164 format",
"DIAL_CODE_ERROR": "Please select a dial code from the list",
"DUPLICATE": "This phone number is in use for another contact."
"PLACEHOLDER": "Əlaqə şəxsin telefon nömrəsini daxil edin",
"LABEL": "Telefon nömrəsi",
"HELP": "Telefon nömrəsi E.164 formatında olmalıdır, məsələn: +1415555555. Ölkə kodunu siyahıdan seçə bilərsiniz.",
"ERROR": "Telefon nömrəsi ya boş olmalıdır, ya da E.164 formatında olmalıdır",
"DIAL_CODE_ERROR": "Zəhmət olmasa siyahıdan kodu seçin",
"DUPLICATE": "Bu telefon nömrəsi başqa bir əlaqə üçün istifadə olunur."
},
"LOCATION": {
"PLACEHOLDER": "Enter the location of the contact",
"LABEL": "Location"
"PLACEHOLDER": "Əlaqə yerini daxil edin",
"LABEL": "Yer"
},
"COMPANY_NAME": {
"PLACEHOLDER": "Enter the company name",
"PLACEHOLDER": "Şirkət adını daxil edin",
"LABEL": "Company Name"
},
"COUNTRY": {
"PLACEHOLDER": "Enter the country name",
"PLACEHOLDER": "Ölkə adını daxil edin",
"LABEL": "Country Name",
"SELECT_PLACEHOLDER": "Select",
"REMOVE": "Remove",
"SELECT_COUNTRY": "Select Country"
"SELECT_PLACEHOLDER": "Seçin",
"REMOVE": "Sil",
"SELECT_COUNTRY": "Ölkəni seçin"
},
"CITY": {
"PLACEHOLDER": "Enter the city name",
"PLACEHOLDER": "Şəhərin adını daxil edin",
"LABEL": "City Name"
},
"SOCIAL_PROFILES": {
@@ -155,23 +155,23 @@
"ERROR_MESSAGE": "There was an error, please try again"
},
"NEW_CONVERSATION": {
"BUTTON_LABEL": "Start conversation",
"TITLE": "New conversation",
"BUTTON_LABEL": "Söhbətə başla",
"TITLE": "Yeni söhbət",
"DESC": "Start a new conversation by sending a new message.",
"NO_INBOX": "Couldn't find an inbox to initiate a new conversation with this contact.",
"FORM": {
"TO": {
"LABEL": "To"
"LABEL": "Kimə"
},
"INBOX": {
"LABEL": "Via Inbox",
"PLACEHOLDER": "Choose source inbox",
"ERROR": "Select an inbox"
"ERROR": "Bir qutu seçin"
},
"SUBJECT": {
"LABEL": "Subject",
"PLACEHOLDER": "Subject",
"ERROR": "Subject can't be empty"
"LABEL": "Mövzu",
"PLACEHOLDER": "Mövzu",
"ERROR": "Mövzu boş ola bilməz"
},
"MESSAGE": {
"LABEL": "Message",
@@ -183,10 +183,10 @@
"HELP_TEXT": "Drag and drop files here or choose files to attach"
},
"SUBMIT": "Send message",
"CANCEL": "Cancel",
"CANCEL": "Ləğv et",
"SUCCESS_MESSAGE": "Message sent!",
"GO_TO_CONVERSATION": "View",
"ERROR_MESSAGE": "Couldn't send! try again"
"GO_TO_CONVERSATION": "Bax",
"ERROR_MESSAGE": "Göndərmək mümkün olmadı! yenidən cəhd et"
}
},
"CONTACTS_PAGE": {
@@ -204,7 +204,7 @@
"ACTIONS": {
"COPY": "Copy attribute",
"DELETE": "Delete attribute",
"EDIT": "Edit attribute"
"EDIT": "Xüsusiyyəti redaktə et"
},
"ADD": {
"TITLE": "Create custom attribute",
@@ -212,7 +212,7 @@
},
"FORM": {
"CREATE": "Add attribute",
"CANCEL": "Cancel",
"CANCEL": "Ləğv et",
"NAME": {
"LABEL": "Custom attribute name",
"PLACEHOLDER": "Eg: shopify id",
@@ -220,12 +220,12 @@
},
"VALUE": {
"LABEL": "Attribute value",
"PLACEHOLDER": "Eg: 11901 "
"PLACEHOLDER": "Məsələn: 11901 "
},
"ADD": {
"TITLE": "Create new attribute ",
"SUCCESS": "Attribute added successfully",
"ERROR": "Unable to add attribute. Please try again later"
"SUCCESS": "Xüsusiyyət uğurla əlavə edildi",
"ERROR": "Xüsusiyyəti əlavə etmək mümkün olmadı. Zəhmət olmasa, bir az sonra yenidən cəhd edin"
},
"UPDATE": {
"SUCCESS": "Attribute updated successfully",
@@ -236,52 +236,52 @@
"ERROR": "Unable to delete attribute. Please try again later"
},
"ATTRIBUTE_SELECT": {
"TITLE": "Add attributes",
"TITLE": "Xüsusiyyətlər əlavə et",
"PLACEHOLDER": "Search attributes",
"NO_RESULT": "No attributes found"
},
"ATTRIBUTE_TYPE": {
"LIST": {
"PLACEHOLDER": "Select value",
"PLACEHOLDER": "Dəyəri seçin",
"SEARCH_INPUT_PLACEHOLDER": "Search value",
"NO_RESULT": "No result found"
}
}
},
"VALIDATIONS": {
"REQUIRED": "Valid value is required",
"INVALID_URL": "Invalid URL",
"INVALID_INPUT": "Invalid Input"
"REQUIRED": "Düzgün dəyər tələb olunur",
"INVALID_URL": "Yanlış URL",
"INVALID_INPUT": "Yanlış Giriş"
}
},
"MERGE_CONTACTS": {
"TITLE": "Merge contacts",
"DESCRIPTION": "Merge contacts to combine two profiles into one, including all attributes and conversations. In case of conflict, the Primary contacts attributes will take precedence.",
"DESCRIPTION": "İki profili bütün atributlar və söhbətlər daxil olmaqla birləşdirərək əlaqələri birləşdirin. Ziddiyyət olduqda, Əsas əlaqənin atributları üstünlük təşkil edəcək.",
"PRIMARY": {
"TITLE": "Primary contact",
"TITLE": "Əsas əlaqə",
"HELP_LABEL": "To be deleted"
},
"PARENT": {
"TITLE": "Contact to merge",
"PLACEHOLDER": "Search for a contact",
"PLACEHOLDER": "Əlaqə axtar",
"HELP_LABEL": "To be kept"
},
"SUMMARY": {
"TITLE": "Summary",
"TITLE": "Yekun",
"DELETE_WARNING": "Contact of <strong>{primaryContactName}</strong> will be deleted.",
"ATTRIBUTE_WARNING": "Contact details of <strong>{primaryContactName}</strong> will be copied to <strong>{parentContactName}</strong>."
},
"SEARCH": {
"ERROR_MESSAGE": "Something went wrong. Please try again later."
"ERROR_MESSAGE": "Nəsə səhv getdi. Zəhmət olmasa, bir az sonra yenidən cəhd edin."
},
"FORM": {
"SUBMIT": " Merge contacts",
"CANCEL": "Cancel",
"CANCEL": "Ləğv et",
"CHILD_CONTACT": {
"ERROR": "Select a child contact to merge"
"ERROR": "Birləşdirmək üçün alt əlaqəni seçin"
},
"SUCCESS_MESSAGE": "Contact merged successfully",
"ERROR_MESSAGE": "Could not merge contacts, try again!"
"ERROR_MESSAGE": "Əlaqələri birləşdirmək mümkün olmadı, yenidən cəhd edin!"
},
"DROPDOWN_ITEM": {
"ID": "(ID: {identifier})"
@@ -289,68 +289,68 @@
},
"CONTACTS_LAYOUT": {
"HEADER": {
"TITLE": "Contacts",
"SEARCH_TITLE": "Search contacts",
"ACTIVE_TITLE": "Active contacts",
"SEARCH_PLACEHOLDER": "Search...",
"TITLE": "Əlaqələr",
"SEARCH_TITLE": "Əlaqələrdə axtarış",
"ACTIVE_TITLE": "Aktiv əlaqələr",
"SEARCH_PLACEHOLDER": "Axtarış...",
"MESSAGE_BUTTON": "Message",
"SEND_MESSAGE": "Send message",
"BLOCK_CONTACT": "Block contact",
"UNBLOCK_CONTACT": "Unblock contact",
"BREADCRUMB": {
"CONTACTS": "Contacts"
"CONTACTS": "Əlaqələr"
},
"ACTIONS": {
"CONTACT_CREATION": {
"ADD_CONTACT": "Add contact",
"EXPORT_CONTACT": "Export contacts",
"IMPORT_CONTACT": "Import contacts",
"SAVE_CONTACT": "Save contact",
"ADD_CONTACT": "Əlaqə əlavə et",
"EXPORT_CONTACT": "Əlaqələri ixrac et",
"IMPORT_CONTACT": "Əlaqələri idxal et",
"SAVE_CONTACT": "Əlaqəni yadda saxla",
"EMAIL_ADDRESS_DUPLICATE": "This email address is in use for another contact.",
"PHONE_NUMBER_DUPLICATE": "This phone number is in use for another contact.",
"PHONE_NUMBER_DUPLICATE": "Bu telefon nömrəsi başqa bir əlaqə üçün istifadə olunur.",
"SUCCESS_MESSAGE": "Contact saved successfully",
"ERROR_MESSAGE": "Unable to save contact. Please try again later."
"ERROR_MESSAGE": "Əlaqəni saxlamaq mümkün olmadı. Zəhmət olmasa sonra yenidən cəhd edin."
},
"BLOCK_SUCCESS_MESSAGE": "This contact is blocked successfully",
"BLOCK_ERROR_MESSAGE": "Unable to block contact. Please try again later.",
"UNBLOCK_SUCCESS_MESSAGE": "This contact is unblocked successfully",
"UNBLOCK_SUCCESS_MESSAGE": "Bu əlaqənin bloku uğurla açıldı",
"UNBLOCK_ERROR_MESSAGE": "Unable to unblock contact. Please try again later.",
"IMPORT_CONTACT": {
"TITLE": "Import contacts",
"DESCRIPTION": "Import contacts through a CSV file.",
"TITLE": "Əlaqələri idxal et",
"DESCRIPTION": "Əlaqələri CSV faylı vasitəsilə idxal edin.",
"DOWNLOAD_LABEL": "Download a sample csv.",
"LABEL": "CSV File:",
"CHOOSE_FILE": "Choose file",
"CHANGE": "Change",
"CANCEL": "Cancel",
"IMPORT": "Import",
"SUCCESS_MESSAGE": "You will be notified via email when the import is complete.",
"LABEL": "CSV faylı:",
"CHOOSE_FILE": "Fayl seçin",
"CHANGE": "Dəyiş",
"CANCEL": "Ləğv et",
"IMPORT": "İdxal et",
"SUCCESS_MESSAGE": "İdxal bitdikdə sizə elektron bildiriş göndəriləcək.",
"ERROR_MESSAGE": "There was an error, please try again"
},
"EXPORT_CONTACT": {
"TITLE": "Export contacts",
"TITLE": "Əlaqələri ixrac et",
"DESCRIPTION": "Quickly export a csv file with comprehensive details of your contacts",
"CONFIRM": "Export",
"SUCCESS_MESSAGE": "Export is in progress. You will be notified on email when the export file is ready to download.",
"CONFIRM": "İxrac et",
"SUCCESS_MESSAGE": "İxrac davam edir. Fayl hazır olanda sizə elektron bildiriş göndəriləcək.",
"ERROR_MESSAGE": "There was an error, please try again"
},
"SORT_BY": {
"LABEL": "Sort by",
"LABEL": "Sırala",
"OPTIONS": {
"NAME": "Name",
"EMAIL": "Email",
"PHONE_NUMBER": "Phone number",
"COMPANY": "Company",
"COUNTRY": "Country",
"CITY": "City",
"LAST_ACTIVITY": "Last activity",
"NAME": "Ad",
"EMAIL": "Elektron poçt",
"PHONE_NUMBER": "Telefon nömrəsi",
"COMPANY": "Şirkət",
"COUNTRY": "Ölkə",
"CITY": "Şəhər",
"LAST_ACTIVITY": "Son fəaliyyət",
"CREATED_AT": "Created at"
}
},
"ORDER": {
"LABEL": "Ordering",
"OPTIONS": {
"ASCENDING": "Ascending",
"ASCENDING": "Artan sıra ilə",
"DESCENDING": "Descending"
}
},
@@ -358,17 +358,17 @@
"CREATE_SEGMENT": {
"TITLE": "Do you want to save this filter?",
"CONFIRM": "Save filter",
"LABEL": "Name",
"LABEL": "Ad",
"PLACEHOLDER": "Enter the name of the filter",
"ERROR": "Enter a valid name",
"ERROR": "Etibarlı ad daxil edin",
"SUCCESS_MESSAGE": "Filter saved successfully",
"ERROR_MESSAGE": "Unable to save filter. Please try again later."
},
"DELETE_SEGMENT": {
"TITLE": "Confirm Deletion",
"DESCRIPTION": "Are you sure you want to delete this filter?",
"DESCRIPTION": "Bu filtrin silinməsini təsdiqləyirsiniz?",
"CONFIRM": "Yes, Delete",
"CANCEL": "No, Cancel",
"CANCEL": "Xeyr, Ləğv et",
"SUCCESS_MESSAGE": "Filter deleted successfully",
"ERROR_MESSAGE": "Unable to delete filter. Please try again later."
}
@@ -379,18 +379,18 @@
"SHOWING": "Showing {startItem} - {endItem} of {totalItems} contacts"
},
"FILTER": {
"NAME": "Name",
"EMAIL": "Email",
"PHONE_NUMBER": "Phone number",
"NAME": "Ad",
"EMAIL": "Elektron poçt",
"PHONE_NUMBER": "Telefon nömrəsi",
"IDENTIFIER": "Identifier",
"COUNTRY": "Country",
"CITY": "City",
"COUNTRY": "Ölkə",
"CITY": "Şəhər",
"CREATED_AT": "Created at",
"LAST_ACTIVITY": "Last activity",
"LAST_ACTIVITY": "Son fəaliyyət",
"REFERER_LINK": "Referer link",
"BLOCKED": "Blocked",
"BLOCKED_TRUE": "True",
"BLOCKED_FALSE": "False",
"BLOCKED_TRUE": "Doğru",
"BLOCKED_FALSE": "Yanlış",
"BUTTONS": {
"CLEAR_FILTERS": "Clear filters",
"UPDATE_SEGMENT": "Update segment",
@@ -409,7 +409,7 @@
}
},
"CARD": {
"OF": "of",
"OF": "",
"VIEW_DETAILS": "View details",
"EDIT_DETAILS_FORM": {
"TITLE": "Edit contact details",
@@ -418,27 +418,27 @@
"PLACEHOLDER": "Enter the first name"
},
"LAST_NAME": {
"PLACEHOLDER": "Enter the last name"
"PLACEHOLDER": "Soyadı daxil edin"
},
"EMAIL_ADDRESS": {
"PLACEHOLDER": "Enter the email address",
"DUPLICATE": "This email address is in use for another contact."
},
"PHONE_NUMBER": {
"PLACEHOLDER": "Enter the phone number",
"DUPLICATE": "This phone number is in use for another contact."
"PLACEHOLDER": "Telefon nömrəsini daxil edin",
"DUPLICATE": "Bu telefon nömrəsi başqa bir əlaqə üçün istifadə olunur."
},
"CITY": {
"PLACEHOLDER": "Enter the city name"
"PLACEHOLDER": "Şəhər adını daxil edin"
},
"COUNTRY": {
"PLACEHOLDER": "Select country"
"PLACEHOLDER": "Ölkəni seçin"
},
"BIO": {
"PLACEHOLDER": "Enter the bio"
},
"COMPANY_NAME": {
"PLACEHOLDER": "Enter the company name"
"PLACEHOLDER": "Şirkət adını daxil edin"
}
},
"UPDATE_BUTTON": "Update contact",
@@ -477,8 +477,8 @@
}
},
"DETAILS": {
"CREATED_AT": "Created {date}",
"LAST_ACTIVITY": "Last active {date}",
"CREATED_AT": "Yaradılıb {date}",
"LAST_ACTIVITY": "Son fəaliyyət {date}",
"DELETE_CONTACT_DESCRIPTION": "Permanently delete this contact. This action is irreversible",
"DELETE_CONTACT": "Delete contact",
"DELETE_DIALOG": {
@@ -487,7 +487,7 @@
"CONFIRM": "Yes, Delete",
"API": {
"SUCCESS_MESSAGE": "Contact deleted successfully",
"ERROR_MESSAGE": "Could not delete contact. Please try again later."
"ERROR_MESSAGE": "Əlaqəni silmək mümkün olmadı. Zəhmət olmasa sonra yenidən cəhd edin."
}
},
"AVATAR": {
@@ -496,86 +496,86 @@
"SUCCESS_MESSAGE": "Avatar uploaded successfully"
},
"DELETE": {
"SUCCESS_MESSAGE": "Avatar deleted successfully",
"SUCCESS_MESSAGE": "Avatar uğurla silindi",
"ERROR_MESSAGE": "Could not delete avatar. Please try again later."
}
}
},
"SIDEBAR": {
"TABS": {
"ATTRIBUTES": "Attributes",
"HISTORY": "History",
"NOTES": "Notes",
"ATTRIBUTES": "Xüsusiyyətlər",
"HISTORY": "Tarix",
"NOTES": "Qeydlər",
"MERGE": "Merge"
},
"HISTORY": {
"EMPTY_STATE": "There are no previous conversations associated to this contact"
"EMPTY_STATE": "Bu əlaqə ilə bağlı əvvəlki söhbətlər yoxdur"
},
"ATTRIBUTES": {
"SEARCH_PLACEHOLDER": "Search for attributes",
"UNUSED_ATTRIBUTES": "{count} Used attribute | {count} Unused attributes",
"EMPTY_STATE": "There are no contact custom attributes available in this account. You can create a custom attribute in settings.",
"YES": "Yes",
"NO": "No",
"YES": "Bəli",
"NO": "Xeyr",
"TRIGGER": {
"SELECT": "Select value",
"INPUT": "Enter value"
"SELECT": "Dəyəri seçin",
"INPUT": "Dəyər daxil edin"
},
"VALIDATIONS": {
"INVALID_NUMBER": "Invalid number",
"REQUIRED": "Valid value is required",
"INVALID_INPUT": "Invalid input",
"INVALID_URL": "Invalid URL",
"INVALID_DATE": "Invalid date"
"INVALID_NUMBER": "Yanlış nömrə",
"REQUIRED": "Düzgün dəyər tələb olunur",
"INVALID_INPUT": "Yanlış giriş",
"INVALID_URL": "Yanlış URL",
"INVALID_DATE": "Yanlış tarix"
},
"NO_ATTRIBUTES": "No attributes found",
"API": {
"SUCCESS_MESSAGE": "Attribute updated successfully",
"DELETE_SUCCESS_MESSAGE": "Attribute deleted successfully",
"UPDATE_ERROR": "Unable to update attribute. Please try again later",
"DELETE_ERROR": "Unable to delete attribute. Please try again later"
"DELETE_ERROR": "Xüsusiyyəti silmək mümkün olmadı. Zəhmət olmasa, bir az sonra yenidən cəhd edin"
}
},
"MERGE": {
"TITLE": "Merge contact",
"DESCRIPTION": "Combine two profiles into one, including all attributes and conversations. In case of conflict, the primary contacts attributes will take precedence.",
"PRIMARY": "Primary contact",
"DESCRIPTION": "İki profili bütün atributlar və söhbətlər daxil olmaqla birləşdirin. Ziddiyyət olduqda, əsas əlaqənin atributları üstünlük təşkil edəcək.",
"PRIMARY": "Əsas əlaqə",
"PRIMARY_HELP_LABEL": "To be saved",
"PRIMARY_REQUIRED_ERROR": "Please select a contact to merge with before proceeding",
"PRIMARY_REQUIRED_ERROR": "Davam etməzdən əvvəl birləşdirmək üçün əlaqə seçin",
"PARENT": "To be merged",
"PARENT_HELP_LABEL": "To be deleted",
"EMPTY_STATE": "No contacts found",
"PLACEHOLDER": "Search for primary contact",
"SEARCH_PLACEHOLDER": "Search for a contact",
"PLACEHOLDER": "Əsas əlaqəni axtar",
"SEARCH_PLACEHOLDER": "Əlaqə axtar",
"SEARCH_ERROR_MESSAGE": "Could not search for contacts. Please try again later.",
"SUCCESS_MESSAGE": "Contact merged successfully",
"ERROR_MESSAGE": "Could not merge contacts, try again!",
"ERROR_MESSAGE": "Əlaqələri birləşdirmək mümkün olmadı, yenidən cəhd edin!",
"IS_SEARCHING": "Searching...",
"BUTTONS": {
"CANCEL": "Cancel",
"CANCEL": "Ləğv et",
"CONFIRM": "Merge contact"
}
},
"NOTES": {
"PLACEHOLDER": "Add a note",
"WROTE": "wrote",
"YOU": "You",
"PLACEHOLDER": "Qeyd əlavə et",
"WROTE": "yazdı",
"YOU": "Siz",
"SAVE": "Save note",
"ADD_NOTE": "Add contact note",
"EXPAND": "Expand",
"EXPAND": "Genişləndir",
"COLLAPSE": "Collapse",
"NO_NOTES": "No notes, you can add notes from the contact details page.",
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above.",
"CONVERSATION_EMPTY_STATE": "There are no notes yet. Use the Add note button to create one."
"CONVERSATION_EMPTY_STATE": "Hələ qeydlər yoxdur. Yeni qeyd yaratmaq üçün Qeyd əlavə et düyməsini istifadə edin."
}
},
"EMPTY_STATE": {
"TITLE": "No contacts found in this account",
"SUBTITLE": "Start adding new contacts by clicking on the button below",
"BUTTON_LABEL": "Add contact",
"BUTTON_LABEL": "Əlaqə əlavə et",
"SEARCH_EMPTY_STATE_TITLE": "No contacts matches your search 🔍",
"LIST_EMPTY_STATE_TITLE": "No contacts available in this view 📋",
"ACTIVE_EMPTY_STATE_TITLE": "No contacts are active at the moment 🌙"
"LIST_EMPTY_STATE_TITLE": "Bu baxışda əlaqə mövcud deyil 📋",
"ACTIVE_EMPTY_STATE_TITLE": "Hazırda aktiv əlaqə yoxdur 🌙"
},
"LOAD_MORE": "Load more"
},
@@ -585,12 +585,12 @@
"ASSIGN_LABELS_FAILED": "Failed to assign labels",
"DESCRIPTION": "Select the labels you want to add to the selected contacts.",
"NO_LABELS_FOUND": "No labels available yet.",
"SELECTED_COUNT": "{count} selected",
"SELECTED_COUNT": "{count} seçildi",
"CLEAR_SELECTION": "Clear selection",
"SELECT_ALL": "Select all ({count})",
"DELETE_CONTACTS": "Delete",
"DELETE_SUCCESS": "Contacts deleted successfully.",
"DELETE_FAILED": "Failed to delete contacts.",
"DELETE_FAILED": "Əlaqələri silmək mümkün olmadı.",
"DELETE_DIALOG": {
"TITLE": "Delete selected contacts",
"SINGULAR_TITLE": "Delete selected contact",
@@ -605,27 +605,27 @@
"ERROR_MESSAGE": "We couldnt complete the search. Please try again."
},
"FORM": {
"GO_TO_CONVERSATION": "View",
"GO_TO_CONVERSATION": "Bax",
"SUCCESS_MESSAGE": "The message was sent successfully!",
"ERROR_MESSAGE": "An error occurred while creating the conversation. Please try again later.",
"NO_INBOX_ALERT": "There are no available inboxes to start a conversation with this contact.",
"CONTACT_SELECTOR": {
"LABEL": "To:",
"LABEL": "Kimə:",
"TAG_INPUT_PLACEHOLDER": "Enter at least 2 characters to search by name, email, or phone number",
"CONTACT_CREATING": "Creating contact..."
"CONTACT_CREATING": "Əlaqə yaradılır..."
},
"INBOX_SELECTOR": {
"LABEL": "Via:",
"BUTTON": "Show inboxes"
"BUTTON": "Qutuları göstər"
},
"EMAIL_OPTIONS": {
"SUBJECT_LABEL": "Subject :",
"SUBJECT_LABEL": "Mövzu :",
"SUBJECT_PLACEHOLDER": "Enter your email subject here",
"CC_LABEL": "Cc:",
"CC_PLACEHOLDER": "Enter at least 2 characters to search by email",
"BCC_LABEL": "Bcc:",
"BCC_PLACEHOLDER": "Enter at least 2 characters to search by email",
"BCC_BUTTON": "Bcc"
"BCC_BUTTON": "Gizli nüsxə"
},
"MESSAGE_EDITOR": {
"PLACEHOLDER": "Write your message here..."
@@ -651,8 +651,8 @@
}
},
"ACTION_BUTTONS": {
"DISCARD": "Discard",
"SEND": "Send ({keyCode})"
"DISCARD": "İmtina et",
"SEND": "Göndər ({keyCode})"
}
}
}
@@ -1,452 +1,452 @@
{
"CONVERSATION": {
"SELECT_A_CONVERSATION": "Please select a conversation from left pane",
"CSAT_REPLY_MESSAGE": "Please rate the conversation",
"404": "Sorry, we cannot find the conversation. Please try again",
"SWITCH_VIEW_LAYOUT": "Switch the layout",
"DASHBOARD_APP_TAB_MESSAGES": "Messages",
"UNVERIFIED_SESSION": "The identity of this user is not verified",
"NO_MESSAGE_1": "Uh oh! Looks like there are no messages from customers in your inbox.",
"NO_MESSAGE_2": " to send a message to your page!",
"NO_INBOX_1": "Hola! Looks like you haven't added any inboxes yet.",
"NO_INBOX_2": " to get started",
"NO_INBOX_AGENT": "Uh Oh! Looks like you are not part of any inbox. Please contact your administrator",
"SEARCH_MESSAGES": "Search for messages in conversations",
"VIEW_ORIGINAL": "View original",
"VIEW_TRANSLATED": "View translated",
"SELECT_A_CONVERSATION": "Zəhmət olmasa, soldakı paneldən bir söhbət seçin",
"CSAT_REPLY_MESSAGE": "Zəhmət olmasa söhbəti qiymətləndirin",
"404": "Bağışlayın, söhbəti tapa bilmirik. Zəhmət olmasa, yenidən cəhd edin",
"SWITCH_VIEW_LAYOUT": "Düzəni dəyişdirin",
"DASHBOARD_APP_TAB_MESSAGES": "Mesajlar",
"UNVERIFIED_SESSION": "Bu istifadəçinin şəxsiyyəti təsdiqlənməyib",
"NO_MESSAGE_1": "Uh oh! Görünür qutunuzda müştərilərdən mesaj yoxdur.",
"NO_MESSAGE_2": " səhifənizə mesaj göndərmək üçün!",
"NO_INBOX_1": "Hola! Görünür hələ heç bir poçt qutusu əlavə etməmisiniz.",
"NO_INBOX_2": " başlamaq üçün",
"NO_INBOX_AGENT": "Uh Oh! Görünür heç bir poçt qutusunun üzvü deyilsiniz. Zəhmət olmasa administratorunuzla əlaqə saxlayın",
"SEARCH_MESSAGES": "Söhbətlərdə mesajları axtarın",
"VIEW_ORIGINAL": "Orijinalı göstər",
"VIEW_TRANSLATED": "Tərcüməni göstər",
"EMPTY_STATE": {
"CMD_BAR": "to open command menu",
"KEYBOARD_SHORTCUTS": "to view keyboard shortcuts"
"CMD_BAR": "əmr menyusunu açmaq üçün",
"KEYBOARD_SHORTCUTS": "klaviatura qısa yollarını görmək üçün"
},
"SEARCH": {
"TITLE": "Search messages",
"RESULT_TITLE": "Search Results",
"LOADING_MESSAGE": "Crunching data...",
"PLACEHOLDER": "Type any text to search messages",
"NO_MATCHING_RESULTS": "No results found."
"TITLE": "Mesajları axtar",
"RESULT_TITLE": "Axtarış Nəticələri",
"LOADING_MESSAGE": "Məlumatlar işlənir...",
"PLACEHOLDER": "Mesajları axtarmaq üçün istənilən mətni yazın",
"NO_MATCHING_RESULTS": "Nəticə tapılmadı."
},
"UNREAD_MESSAGES": "Unread Messages",
"UNREAD_MESSAGE": "Unread Message",
"CLICK_HERE": "Click here",
"LOADING_INBOXES": "Loading inboxes",
"LOADING_CONVERSATIONS": "Loading Conversations",
"CANNOT_REPLY": "You cannot reply due to",
"24_HOURS_WINDOW": "24 hour message window restriction",
"48_HOURS_WINDOW": "48 hour message window restriction",
"API_HOURS_WINDOW": "You can only reply to this conversation within {hours} hours",
"NOT_ASSIGNED_TO_YOU": "This conversation is not assigned to you. Would you like to assign this conversation to yourself?",
"ASSIGN_TO_ME": "Assign to me",
"BOT_HANDOFF_MESSAGE": "You are responding to a conversation which is currently handled by an assistant or a bot.",
"BOT_HANDOFF_ACTION": "Mark open and assign to you",
"BOT_HANDOFF_REOPEN_ACTION": "Mark conversation open",
"BOT_HANDOFF_SUCCESS": "Conversation has been handed over to you",
"BOT_HANDOFF_ERROR": "Failed to take over the conversation. Please try again.",
"TWILIO_WHATSAPP_CAN_REPLY": "You can only reply to this conversation using a template message due to",
"TWILIO_WHATSAPP_24_HOURS_WINDOW": "24 hour message window restriction",
"OLD_INSTAGRAM_INBOX_REPLY_BANNER": "This Instagram account was migrated to the new Instagram channel inbox. All new messages will show up there. You wont be able to send messages from this conversation anymore.",
"REPLYING_TO": "You are replying to:",
"REMOVE_SELECTION": "Remove Selection",
"DOWNLOAD": "Download",
"UNKNOWN_FILE_TYPE": "Unknown File",
"SAVE_CONTACT": "Save Contact",
"NO_CONTENT": "No content to display",
"UNREAD_MESSAGES": "Oxunmamış Mesajlar",
"UNREAD_MESSAGE": "Oxunmamış Mesaj",
"CLICK_HERE": "Buraya klik edin",
"LOADING_INBOXES": "Qutular yüklənir",
"LOADING_CONVERSATIONS": "Söhbətlər yüklənir",
"CANNOT_REPLY": "Cavab verə bilməzsiniz, çünki",
"24_HOURS_WINDOW": "24 saatlıq mesaj pəncərəsi məhdudiyyəti",
"48_HOURS_WINDOW": "48 saatlıq mesaj pəncərəsi məhdudiyyəti",
"API_HOURS_WINDOW": "Bu söhbətə yalnız {hours} saat ərzində cavab verə bilərsiniz",
"NOT_ASSIGNED_TO_YOU": "Bu söhbət sizə təyin edilməyib. Bu söhbəti özünüzə təyin etmək istərdiniz?",
"ASSIGN_TO_ME": "Mənə təyin et",
"BOT_HANDOFF_MESSAGE": "Hazırda köməkçi və ya bot tərəfindən idarə olunan söhbətə cavab verirsiniz.",
"BOT_HANDOFF_ACTION": "Açıq kimi işarələ və özünüzə təyin et",
"BOT_HANDOFF_REOPEN_ACTION": "Söhbəti açıq kimi işarələyin",
"BOT_HANDOFF_SUCCESS": "Söhbət sizə təhvil verildi",
"BOT_HANDOFF_ERROR": "Söhbəti ələ keçirmək alınmadı. Zəhmət olmasa, yenidən cəhd edin.",
"TWILIO_WHATSAPP_CAN_REPLY": "Bu söhbətə yalnız şablon mesajı ilə cavab verə bilərsiniz, çünki",
"TWILIO_WHATSAPP_24_HOURS_WINDOW": "24 saatlıq mesaj pəncərəsi məhdudiyyəti",
"OLD_INSTAGRAM_INBOX_REPLY_BANNER": "Bu Instagram hesabı yeni Instagram kanalının daxil olan qutusuna köçürülüb. Bütün yeni mesajlar orada görünəcək. Bu söhbətdən artıq mesaj göndərə bilməyəcəksiniz.",
"REPLYING_TO": "Siz cavab verirsiniz:",
"REMOVE_SELECTION": "Seçimi sil",
"DOWNLOAD": "Yüklə",
"UNKNOWN_FILE_TYPE": "Naməlum fayl",
"SAVE_CONTACT": "Əlaqəni yadda saxla",
"NO_CONTENT": "Göstəriləcək məzmun yoxdur",
"SHARED_ATTACHMENT": {
"CONTACT": "{sender} has shared a contact",
"LOCATION": "{sender} has shared a location",
"FILE": "{sender} has shared a file",
"MEETING": "{sender} has started a meeting"
"CONTACT": "{sender} bir əlaqə paylaşıb",
"LOCATION": "{sender} bir yer paylaşıb",
"FILE": "{sender} bir fayl paylaşıb",
"MEETING": "{sender} bir görüş başlayıb"
},
"UPLOADING_ATTACHMENTS": "Uploading attachments...",
"REPLIED_TO_STORY": "Replied to your story",
"UPLOADING_ATTACHMENTS": "Əlavələr yüklənir...",
"REPLIED_TO_STORY": "Hekayənizə cavab verdi",
"UNSUPPORTED_MESSAGE": "This message is unsupported. You can view this message on the Facebook / Instagram app.",
"UNSUPPORTED_MESSAGE_FACEBOOK": "This message is unsupported. You can view this message on the Facebook Messenger app.",
"UNSUPPORTED_MESSAGE_INSTAGRAM": "This message is unsupported. You can view this message on the Instagram app.",
"UNSUPPORTED_MESSAGE_TIKTOK": "This message is unsupported. You can view this message on the TikTok app.",
"SUCCESS_DELETE_MESSAGE": "Message deleted successfully",
"FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again",
"NO_RESPONSE": "No response",
"RESPONSE": "Response",
"RATING_TITLE": "Rating",
"FEEDBACK_TITLE": "Feedback",
"REPLY_MESSAGE_NOT_FOUND": "Message not available",
"UNSUPPORTED_MESSAGE_FACEBOOK": "Bu mesaj dəstəklənmir. Bu mesajı Facebook Messenger tətbiqində görə bilərsiniz.",
"UNSUPPORTED_MESSAGE_INSTAGRAM": "Bu mesaj dəstəklənmir. Bu mesajı Instagram tətbiqində görə bilərsiniz.",
"UNSUPPORTED_MESSAGE_TIKTOK": "Bu mesaj dəstəklənmir. Bu mesajı TikTok tətbiqində görə bilərsiniz.",
"SUCCESS_DELETE_MESSAGE": "Mesaj uğurla silindi",
"FAIL_DELETE_MESSSAGE": "Mesajı silmək mümkün olmadı! Yenidən cəhd edin",
"NO_RESPONSE": "Cavab yoxdur",
"RESPONSE": "Cavab",
"RATING_TITLE": "Qiymətləndirmə",
"FEEDBACK_TITLE": "Rəy",
"REPLY_MESSAGE_NOT_FOUND": "Mesaj mövcud deyil",
"CARD": {
"SHOW_LABELS": "Show labels",
"HIDE_LABELS": "Hide labels"
"SHOW_LABELS": "Etiketləri göstər",
"HIDE_LABELS": "Etiketləri gizlədin"
},
"VOICE_CALL": {
"INCOMING_CALL": "Incoming call",
"OUTGOING_CALL": "Outgoing call",
"CALL_IN_PROGRESS": "Call in progress",
"NO_ANSWER": "No answer",
"MISSED_CALL": "Missed call",
"CALL_ENDED": "Call ended",
"NOT_ANSWERED_YET": "Not answered yet",
"THEY_ANSWERED": "They answered",
"YOU_ANSWERED": "You answered"
"INCOMING_CALL": "Gələn zəng",
"OUTGOING_CALL": "Gedən zəng",
"CALL_IN_PROGRESS": "Zəng davam edir",
"NO_ANSWER": "Cavab yoxdur",
"MISSED_CALL": "Qeyri-işlək zəng",
"CALL_ENDED": "Zəng bitdi",
"NOT_ANSWERED_YET": "Hələ cavab verilməyib",
"THEY_ANSWERED": "Onlar cavab verdi",
"YOU_ANSWERED": "Siz cavab verdiniz"
},
"HEADER": {
"RESOLVE_ACTION": "Resolve",
"REOPEN_ACTION": "Reopen",
"OPEN_ACTION": "Open",
"MORE_ACTIONS": "More actions",
"OPEN": "More",
"CLOSE": "Close",
"DETAILS": "details",
"SNOOZED_UNTIL": "Snoozed until",
"SNOOZED_UNTIL_TOMORROW": "Snoozed until tomorrow",
"SNOOZED_UNTIL_NEXT_WEEK": "Snoozed until next week",
"SNOOZED_UNTIL_NEXT_REPLY": "Snoozed until next reply",
"RESOLVE_ACTION": "Həll et",
"REOPEN_ACTION": "Yenidən aç",
"OPEN_ACTION": "",
"MORE_ACTIONS": "Daha çox əməliyyat",
"OPEN": "Daha çox",
"CLOSE": "Bağla",
"DETAILS": "təfərrüatlar",
"SNOOZED_UNTIL": "Gecikdirilib",
"SNOOZED_UNTIL_TOMORROW": "Sabaha qədər təxirə salındı",
"SNOOZED_UNTIL_NEXT_WEEK": "Gələn həftəyə qədər təxirə salındı",
"SNOOZED_UNTIL_NEXT_REPLY": "Növbəti cavaba qədər təxirə salındı",
"SLA_STATUS": {
"FRT": "FRT {status}",
"NRT": "NRT {status}",
"RT": "RT {status}",
"MISSED": "missed",
"DUE": "due"
"MISSED": "qaçırıldı",
"DUE": "vaxtı çatıb"
}
},
"RESOLVE_DROPDOWN": {
"MARK_PENDING": "Mark as pending",
"SNOOZE_UNTIL": "Snooze",
"MARK_PENDING": "Gözləmədə kimi işarələyin",
"SNOOZE_UNTIL": "Gecikdir",
"SNOOZE": {
"TITLE": "Snooze until",
"NEXT_REPLY": "Next reply",
"TOMORROW": "Tomorrow",
"NEXT_WEEK": "Next week"
"TITLE": "Gecikdirin, qədər",
"NEXT_REPLY": "Növbəti cavab",
"TOMORROW": "Sabah",
"NEXT_WEEK": "Gələn həftə"
}
},
"MENTION": {
"AGENTS": "Agents",
"TEAMS": "Teams"
"AGENTS": "Agentlər",
"TEAMS": "Komandalar"
},
"CUSTOM_SNOOZE": {
"TITLE": "Snooze until",
"APPLY": "Snooze",
"CANCEL": "Cancel"
"TITLE": "Gecikdirmə müddəti",
"APPLY": "Gecikdir",
"CANCEL": "Ləğv et"
},
"PRIORITY": {
"TITLE": "Priority",
"TITLE": "Prioritet",
"OPTIONS": {
"NONE": "None",
"URGENT": "Urgent",
"HIGH": "High",
"MEDIUM": "Medium",
"LOW": "Low"
"NONE": "Heç biri",
"URGENT": "Təcili",
"HIGH": "Yüksək",
"MEDIUM": "Orta",
"LOW": "Aşağı"
},
"CHANGE_PRIORITY": {
"SELECT_PLACEHOLDER": "None",
"INPUT_PLACEHOLDER": "Select priority",
"NO_RESULTS": "No results found",
"SUCCESSFUL": "Changed priority of conversation id {conversationId} to {priority}",
"FAILED": "Couldn't change priority. Please try again."
"SELECT_PLACEHOLDER": "Heç biri",
"INPUT_PLACEHOLDER": "Prioritet seçin",
"NO_RESULTS": "Nəticə tapılmadı",
"SUCCESSFUL": "{conversationId} söhbətinin prioriteti {priority} olaraq dəyişdirildi",
"FAILED": "Prioritet dəyişdirilə bilmədi. Zəhmət olmasa yenidən cəhd edin."
}
},
"DELETE_CONVERSATION": {
"TITLE": "Delete conversation #{conversationId}",
"DESCRIPTION": "Are you sure you want to delete this conversation?",
"CONFIRM": "Delete"
"TITLE": "#{conversationId} nömrəli söhbəti sil",
"DESCRIPTION": "Bu söhbəti silmək istədiyinizə əminsiniz?",
"CONFIRM": "Sil"
},
"CARD_CONTEXT_MENU": {
"PENDING": "Mark as pending",
"RESOLVED": "Mark as resolved",
"MARK_AS_UNREAD": "Mark as unread",
"MARK_AS_READ": "Mark as read",
"REOPEN": "Reopen conversation",
"PENDING": "Gözləyən kimi işarələyin",
"RESOLVED": "Həll olundu kimi işarələyin",
"MARK_AS_UNREAD": "Oxunmamış kimi işarələyin",
"MARK_AS_READ": "Oxunmuş kimi işarələ",
"REOPEN": "Söhbəti yenidən açın",
"SNOOZE": {
"TITLE": "Snooze",
"NEXT_REPLY": "Until next reply",
"TOMORROW": "Until tomorrow",
"NEXT_WEEK": "Until next week"
"TITLE": "Gecikdir",
"NEXT_REPLY": "Növbəti cavaba qədər",
"TOMORROW": "Sabaha qədər",
"NEXT_WEEK": "Növbəti həftəyə qədər"
},
"ASSIGN_AGENT": "Assign agent",
"ASSIGN_LABEL": "Assign label",
"AGENTS_LOADING": "Loading agents...",
"ASSIGN_TEAM": "Assign team",
"DELETE": "Delete conversation",
"OPEN_IN_NEW_TAB": "Open in new tab",
"COPY_LINK": "Copy conversation link",
"COPY_LINK_SUCCESS": "Conversation link copied to clipboard",
"ASSIGN_AGENT": "Agent təyin et",
"ASSIGN_LABEL": "Etiket təyin et",
"AGENTS_LOADING": "Agentlər yüklənir...",
"ASSIGN_TEAM": "Komandaya təyin et",
"DELETE": "Söhbəti sil",
"OPEN_IN_NEW_TAB": "Yeni nişanda aç",
"COPY_LINK": "Söhbət linkini kopyala",
"COPY_LINK_SUCCESS": "Söhbət linki panoya kopyalandı",
"API": {
"AGENT_ASSIGNMENT": {
"SUCCESFUL": "Conversation id {conversationId} assigned to \"{agentName}\"",
"FAILED": "Couldn't assign agent. Please try again."
"SUCCESFUL": "{conversationId} söhbəti \"{agentName}\" agentinə təyin edildi",
"FAILED": "Agent təyin etmək mümkün olmadı. Zəhmət olmasa yenidən cəhd edin."
},
"LABEL_ASSIGNMENT": {
"SUCCESFUL": "Assigned label #{labelName} to conversation id {conversationId}",
"FAILED": "Couldn't assign label. Please try again."
"SUCCESFUL": "{conversationId} söhbətinə #{labelName} etiketi təyin edildi",
"FAILED": "Etiket təyin etmək mümkün olmadı. Zəhmət olmasa yenidən cəhd edin."
},
"LABEL_REMOVAL": {
"SUCCESFUL": "Removed label #{labelName} from conversation id {conversationId}",
"FAILED": "Couldn't remove label. Please try again."
"SUCCESFUL": "{conversationId} nömrəli söhbətdən #{labelName} etiketi silindi",
"FAILED": "Etiketi silmək mümkün olmadı. Zəhmət olmasa yenidən cəhd edin."
},
"TEAM_ASSIGNMENT": {
"SUCCESFUL": "Assigned team \"{team}\" to conversation id {conversationId}",
"FAILED": "Couldn't assign team. Please try again."
"SUCCESFUL": "Söhbət id-si {conversationId} üçün \"{team}\" komandası təyin edildi",
"FAILED": "Komanda təyin etmək mümkün olmadı. Zəhmət olmasa yenidən cəhd edin."
}
}
},
"FOOTER": {
"MESSAGE_SIGN_TOOLTIP": "Message signature",
"ENABLE_SIGN_TOOLTIP": "Enable signature",
"DISABLE_SIGN_TOOLTIP": "Disable signature",
"MSG_INPUT": "Shift + enter for new line. Start with '/' to select a Canned Response.",
"PRIVATE_MSG_INPUT": "Shift + enter for new line. This will be visible only to Agents",
"MESSAGING_RESTRICTED": "You cannot reply to this conversation",
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Message signature is not configured, please configure it in profile settings.",
"COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
"CLICK_HERE": "Click here to update",
"WHATSAPP_TEMPLATES": "Whatsapp Templates"
"MESSAGE_SIGN_TOOLTIP": "Mesaj imzası",
"ENABLE_SIGN_TOOLTIP": "İmzaya icazə ver",
"DISABLE_SIGN_TOOLTIP": "İmzaya icazə vermə",
"MSG_INPUT": "Yeni sətr üçün Shift + enter. Canned Response seçmək üçün '/' ilə başlayın.",
"PRIVATE_MSG_INPUT": "Yeni sətr üçün Shift + enter. Bu yalnız Agentlər üçün görünəcək",
"MESSAGING_RESTRICTED": "Bu söhbətə cavab verə bilməzsiniz",
"MESSAGING_RESTRICTED_WHATSAPP": "24 saatlıq mesaj pəncərəsi məhdudiyyəti səbəbindən yalnız şablon mesajla cavab verə bilərsiniz",
"MESSAGING_RESTRICTED_API": "Mesaj pəncərəsi məhdudiyyəti səbəbindən yalnız şablon mesajla cavab verə bilərsiniz",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Mesaj imzası qurulmayıb, zəhmət olmasa profil parametrlərində qurun.",
"COPILOT_MSG_INPUT": "Copilot üçün əlavə göstərişlər verin və ya başqa sual verin... Davam etmək üçün enter düyməsini basın",
"CLICK_HERE": "Yeniləmək üçün buraya klikləyin",
"WHATSAPP_TEMPLATES": "Whatsapp Şablonları"
},
"REPLYBOX": {
"REPLY": "Reply",
"PRIVATE_NOTE": "Private Note",
"SEND": "Send",
"CREATE": "Add Note",
"INSERT_READ_MORE": "Read more",
"DISMISS_REPLY": "Dismiss reply",
"REPLYING_TO": "Replying to:",
"TIP_EMOJI_ICON": "Show emoji selector",
"TIP_ATTACH_ICON": "Attach files",
"TIP_AUDIORECORDER_ICON": "Record audio",
"TIP_AUDIORECORDER_PERMISSION": "Allow access to audio",
"TIP_AUDIORECORDER_ERROR": "Could not open the audio",
"DRAG_DROP": "Drag and drop here to attach",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
"COPILOT_THINKING": "Copilot is thinking",
"REPLY": "Cavab ver",
"PRIVATE_NOTE": "Şəxsi Qeyd",
"SEND": "Göndər",
"CREATE": "Qeyd əlavə et",
"INSERT_READ_MORE": "Daha çox oxu",
"DISMISS_REPLY": "Cavabı ləğv et",
"REPLYING_TO": "Cavab verir:",
"TIP_EMOJI_ICON": "Emoji seçicisini göstər",
"TIP_ATTACH_ICON": "Faylları əlavə et",
"TIP_AUDIORECORDER_ICON": "Səs yaz",
"TIP_AUDIORECORDER_PERMISSION": "Səsə girişə icazə ver",
"TIP_AUDIORECORDER_ERROR": "Səsi açmaq mümkün olmadı",
"DRAG_DROP": "Qoşmaq üçün buraya sürükləyin və buraxın",
"START_AUDIO_RECORDING": "Səs yazısını başla",
"STOP_AUDIO_RECORDING": "Səs yazısını dayandırın",
"COPILOT_THINKING": "Copilot düşünür",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Add bcc",
"TO": "KİMƏ",
"ADD_BCC": "Gizli nüsxə əlavə et",
"CC": {
"LABEL": "CC",
"PLACEHOLDER": "Emails separated by commas",
"ERROR": "Please enter valid email addresses"
"PLACEHOLDER": "Vergüllə ayrılmış elektron poçtlar",
"ERROR": "Zəhmət olmasa düzgün elektron poçt ünvanları daxil edin"
},
"BCC": {
"LABEL": "BCC",
"PLACEHOLDER": "Emails separated by commas",
"ERROR": "Please enter valid email addresses"
"PLACEHOLDER": "Vergüllə ayrılmış e-poçtlar",
"ERROR": "Zəhmət olmasa, düzgün e-poçt ünvanları daxil edin"
}
},
"UNDEFINED_VARIABLES": {
"TITLE": "Undefined variables",
"MESSAGE": "You have {undefinedVariablesCount} undefined variables in your message: {undefinedVariables}. Would you like to send the message anyway?",
"TITLE": "Təyin olunmamış dəyişənlər",
"MESSAGE": "Mesajınızda {undefinedVariablesCount} təyin olunmamış dəyişən var: {undefinedVariables}. Mesajı yenə də göndərmək istəyirsiniz?",
"CONFIRM": {
"YES": "Send",
"CANCEL": "Cancel"
"YES": "Göndər",
"CANCEL": "Ləğv et"
}
},
"QUOTED_REPLY": {
"ENABLE_TOOLTIP": "Include quoted email thread",
"DISABLE_TOOLTIP": "Don't include quoted email thread",
"REMOVE_PREVIEW": "Remove quoted email thread",
"COLLAPSE": "Collapse preview",
"EXPAND": "Expand preview"
"ENABLE_TOOLTIP": "Sitat gətirilmiş e-poçt mövzusunu daxil et",
"DISABLE_TOOLTIP": "Sitat gətirilmiş e-poçt mövzusunu daxil etmə",
"REMOVE_PREVIEW": "Sitat gətirilmiş e-poçt mövzusunu sil",
"COLLAPSE": "Önizləməni yığışdır",
"EXPAND": "Önizləməni genişləndir"
}
},
"VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team",
"CHANGE_STATUS": "Conversation status changed",
"CHANGE_STATUS_FAILED": "Conversation status change failed",
"CHANGE_AGENT": "Conversation Assignee changed",
"CHANGE_AGENT_FAILED": "Assignee change failed",
"ASSIGN_LABEL_SUCCESFUL": "Label assigned successfully",
"ASSIGN_LABEL_FAILED": "Label assignment failed",
"CHANGE_TEAM": "Conversation team changed",
"SUCCESS_DELETE_CONVERSATION": "Conversation deleted successfully",
"FAIL_DELETE_CONVERSATION": "Couldn't delete conversation! Try again",
"FILE_SIZE_LIMIT": "File exceeds the {MAXIMUM_SUPPORTED_FILE_UPLOAD_SIZE} MB attachment limit",
"FILE_TYPE_NOT_SUPPORTED": "This {fileName} file type is not supported in this conversation",
"MESSAGE_ERROR": "Unable to send this message, please try again later",
"SENT_BY": "Sent by:",
"VISIBLE_TO_AGENTS": "Şəxsi Qeyd: Yalnız siz və komandanız üçün görünür",
"CHANGE_STATUS": "Söhbət statusu dəyişdirildi",
"CHANGE_STATUS_FAILED": "Söhbətin statusunu dəyişmək mümkün olmadı",
"CHANGE_AGENT": "Söhbətin məsul şəxsi dəyişdirildi",
"CHANGE_AGENT_FAILED": "Təyinat dəyişdirilməsi uğursuz oldu",
"ASSIGN_LABEL_SUCCESFUL": "Etiket uğurla təyin edildi",
"ASSIGN_LABEL_FAILED": "Etiket təyini uğursuz oldu",
"CHANGE_TEAM": "Söhbət komandası dəyişdirildi",
"SUCCESS_DELETE_CONVERSATION": "Söhbət uğurla silindi",
"FAIL_DELETE_CONVERSATION": "Söhbəti silmək mümkün olmadı! Yenidən cəhd edin",
"FILE_SIZE_LIMIT": "Fayl {MAXIMUM_SUPPORTED_FILE_UPLOAD_SIZE} MB əlavə limitini aşır",
"FILE_TYPE_NOT_SUPPORTED": "Bu {fileName} fayl növü bu söhbətdə dəstəklənmir",
"MESSAGE_ERROR": "Bu mesajı göndərmək mümkün olmadı, zəhmət olmasa bir az sonra yenidən cəhd edin",
"SENT_BY": "Göndərən:",
"BOT": "Bot",
"NATIVE_APP": "Native app",
"NATIVE_APP_ADVISORY": "This message was sent from the native app. Reply from Chatwoot to maintain the message window.",
"SEND_FAILED": "Couldn't send message! Try again",
"TRY_AGAIN": "retry",
"NATIVE_APP": "Yerli tətbiq",
"NATIVE_APP_ADVISORY": "Bu mesaj yerli tətbiqdən göndərilib. Mesaj pəncərəsini saxlamaq üçün Chatwoot-dan cavab verin.",
"SEND_FAILED": "Mesaj göndərmək mümkün olmadı! Yenidən cəhd edin",
"TRY_AGAIN": "yenidən cəhd et",
"ASSIGNMENT": {
"SELECT_AGENT": "Select Agent",
"REMOVE": "Remove",
"ASSIGN": "Assign"
"SELECT_AGENT": "Agent seçin",
"REMOVE": "Sil",
"ASSIGN": "Təyin et"
},
"CONTEXT_MENU": {
"COPY": "Copy",
"REPLY_TO": "Reply to this message",
"DELETE": "Delete",
"CREATE_A_CANNED_RESPONSE": "Add to canned responses",
"TRANSLATE": "Translate",
"COPY_PERMALINK": "Copy link to the message",
"LINK_COPIED": "Message URL copied to the clipboard",
"COPY": "Kopyala",
"REPLY_TO": "Bu mesaja cavab ver",
"DELETE": "Sil",
"CREATE_A_CANNED_RESPONSE": "Hazır cavablara əlavə et",
"TRANSLATE": "Tərcümə et",
"COPY_PERMALINK": "Mesaja keçid linkini kopyalayın",
"LINK_COPIED": "Mesajın URL-i panoya kopyalandı",
"DELETE_CONFIRMATION": {
"TITLE": "Are you sure you want to delete this message?",
"MESSAGE": "You cannot undo this action",
"DELETE": "Delete",
"CANCEL": "Cancel"
"TITLE": "Bu mesajı silmək istədiyinizə əminsiniz?",
"MESSAGE": "Bu əməliyyatı geri qaytara bilməzsiniz",
"DELETE": "Sil",
"CANCEL": "Ləğv et"
}
},
"SIDEBAR": {
"CONTACT": "Contact",
"CONTACT": "Əlaqə",
"COPILOT": "Copilot"
},
"VOICE_WIDGET": {
"INCOMING_CALL": "Incoming call",
"OUTGOING_CALL": "Outgoing call",
"CALL_IN_PROGRESS": "Call in progress",
"NOT_ANSWERED_YET": "Not answered yet",
"HANDLED_IN_ANOTHER_TAB": "Being handled in another tab",
"REJECT_CALL": "Reject",
"JOIN_CALL": "Join call",
"END_CALL": "End call"
"INCOMING_CALL": "Gələn zəng",
"OUTGOING_CALL": "Gedən zəng",
"CALL_IN_PROGRESS": "Zəng davam edir",
"NOT_ANSWERED_YET": "Hələ cavab verilməyib",
"HANDLED_IN_ANOTHER_TAB": "Başqa sekmədə işlənir",
"REJECT_CALL": "İmtina et",
"JOIN_CALL": "Zəngə qoşul",
"END_CALL": "Zəngi bitir"
}
},
"EMAIL_TRANSCRIPT": {
"TITLE": "Send conversation transcript",
"DESC": "Send a copy of the conversation transcript to the specified email address",
"SUBMIT": "Submit",
"CANCEL": "Cancel",
"SEND_EMAIL_SUCCESS": "The chat transcript was sent successfully",
"SEND_EMAIL_ERROR": "There was an error, please try again",
"SEND_EMAIL_PAYMENT_REQUIRED": "Email transcript is not available on your current plan. Please upgrade to use this feature.",
"TITLE": "Söhbət transkriptini göndər",
"DESC": "Söhbət transkriptinin surətini göstərilən e-poçt ünvanına göndərin",
"SUBMIT": "Təsdiqlə",
"CANCEL": "Ləğv et",
"SEND_EMAIL_SUCCESS": "Söhbət yazısı uğurla göndərildi",
"SEND_EMAIL_ERROR": "Xəta baş verdi, zəhmət olmasa yenidən cəhd edin",
"SEND_EMAIL_PAYMENT_REQUIRED": "Cari planınızda e-poçt yazışması mövcud deyil. Bu funksiyanı istifadə etmək üçün lütfən planınızı yüksəldin.",
"FORM": {
"SEND_TO_CONTACT": "Send the transcript to the customer",
"SEND_TO_AGENT": "Send the transcript to the assigned agent",
"SEND_TO_OTHER_EMAIL_ADDRESS": "Send the transcript to another email address",
"SEND_TO_CONTACT": "Yazını müştəriyə göndər",
"SEND_TO_AGENT": "Mətni təyin olunmuş agentə göndər",
"SEND_TO_OTHER_EMAIL_ADDRESS": "Yazını başqa e-poçt ünvanına göndər",
"EMAIL": {
"PLACEHOLDER": "Enter an email address",
"ERROR": "Please enter a valid email address"
"PLACEHOLDER": "E-poçt ünvanı daxil edin",
"ERROR": "Zəhmət olmasa, düzgün e-poçt ünvanı daxil edin"
}
}
},
"ONBOARDING": {
"TITLE": "Hey 👋, Welcome to {installationName}!",
"DESCRIPTION": "Thanks for signing up. We want you to get the most out of {installationName}. Here are a few things you can do in {installationName} to make the experience delightful.",
"GREETING_MORNING": "👋 Good morning, {name}. Welcome to {installationName}.",
"GREETING_AFTERNOON": "👋 Good afternoon, {name}. Welcome to {installationName}.",
"GREETING_EVENING": "👋 Good evening, {name}. Welcome to {installationName}.",
"READ_LATEST_UPDATES": "Read our latest updates",
"TITLE": "Salam 👋, {installationName}-ə xoş gəlmisiniz!",
"DESCRIPTION": "Qeydiyyatdan keçdiyiniz üçün təşəkkür edirik. {installationName}-dən maksimum faydalanmağınızı istəyirik. Təcrübəni xoş etmək üçün {installationName}-də edə biləcəyiniz bir neçə şey var.",
"GREETING_MORNING": "👋 Sabahınız xeyir, {name}. {installationName}-ə xoş gəlmisiniz.",
"GREETING_AFTERNOON": "👋 Günortanız xeyir, {name}. {installationName}-ə xoş gəlmisiniz.",
"GREETING_EVENING": "👋 Axşamınız xeyir, {name}. {installationName}-ə xoş gəlmisiniz.",
"READ_LATEST_UPDATES": "Ən son yeniliklərimizi oxuyun",
"ALL_CONVERSATION": {
"TITLE": "All your conversations in one place",
"DESCRIPTION": "View all the conversations from your customers in one single dashboard. You can filter the conversations by the incoming channel, label and status.",
"NEW_LINK": "Click here to create an inbox"
"TITLE": "Bütün söhbətləriniz bir yerdə",
"DESCRIPTION": "Müştərilərinizdən olan bütün söhbətləri tək bir paneldə görün. Söhbətləri daxil olan kanal, etiket və vəziyyətə görə süzgəcdən keçirə bilərsiniz.",
"NEW_LINK": "Qutunu yaratmaq üçün bura klikləyin"
},
"TEAM_MEMBERS": {
"TITLE": "Invite your team members",
"DESCRIPTION": "Since you are getting ready to talk to your customer, bring in your teammates to assist you. You can invite your teammates by adding their email addresses to the agent list.",
"NEW_LINK": "Click here to invite a team member"
"TITLE": "Komanda üzvlərinizi dəvət edin",
"DESCRIPTION": "Müştərinizlə danışmağa hazırlaşdığınız üçün, sizə kömək etmək üçün komanda üzvlərinizi dəvət edin. Komanda üzvlərinizi agent siyahısına onların e-poçt ünvanlarını əlavə etməklə dəvət edə bilərsiniz.",
"NEW_LINK": "Komanda üzvünü dəvət etmək üçün buraya klikləyin"
},
"LABELS": {
"TITLE": "Organize conversations with labels",
"DESCRIPTION": "Labels provide an easier way to categorize your conversation. Create some labels like #support-enquiry, #billing-question etc., so that you can use them in a conversation later.",
"NEW_LINK": "Click here to create tags"
"TITLE": "Söhbətləri etiketlərlə təşkil edin",
"DESCRIPTION": "Etiketlər söhbətinizi kateqoriyalara ayırmağı asanlaşdırır. Sonra söhbətdə istifadə etmək üçün #support-enquiry, #billing-question və s. kimi bəzi etiketlər yaradın.",
"NEW_LINK": "Etiket yaratmaq üçün buraya klikləyin"
},
"CANNED_RESPONSES": {
"TITLE": "Create canned responses",
"DESCRIPTION": "Pre-written quick reply templates help you quickly respond to a conversation. Agents can type the '/' character followed by the shortcode to insert a response.",
"NEW_LINK": "Click here to create a canned response"
"TITLE": "Hazır cavablar yaradın",
"DESCRIPTION": "Əvvəlcədən yazılmış sürətli cavab şablonları söhbətə tez cavab verməyinizə kömək edir. Agentlər cavaba daxil etmək üçün '/' simvolunu və sonra qısa kodu yaza bilərlər.",
"NEW_LINK": "Sürətli cavab yaratmaq üçün bura klikləyin"
}
},
"CONVERSATION_SIDEBAR": {
"ASSIGNEE_LABEL": "Assigned Agent",
"SELF_ASSIGN": "Assign to me",
"TEAM_LABEL": "Assigned Team",
"ASSIGNEE_LABEL": "Təyin olunmuş agent",
"SELF_ASSIGN": "Mənə təyin et",
"TEAM_LABEL": "Təyin olunmuş komanda",
"SELECT": {
"PLACEHOLDER": "None"
"PLACEHOLDER": "Heç biri"
},
"ACCORDION": {
"CONTACT_DETAILS": "Contact Details",
"CONVERSATION_ACTIONS": "Conversation Actions",
"CONVERSATION_LABELS": "Conversation Labels",
"CONVERSATION_INFO": "Conversation Information",
"CONTACT_NOTES": "Contact Notes",
"CONTACT_ATTRIBUTES": "Contact Attributes",
"PREVIOUS_CONVERSATION": "Previous Conversations",
"MACROS": "Macros",
"LINEAR_ISSUES": "Linked Linear Issues",
"SHOPIFY_ORDERS": "Shopify Orders"
"CONTACT_DETAILS": "Əlaqə Məlumatları",
"CONVERSATION_ACTIONS": "Söhbət Əməliyyatları",
"CONVERSATION_LABELS": "Söhbət Etiketləri",
"CONVERSATION_INFO": "Söhbət Məlumatları",
"CONTACT_NOTES": "Əlaqə Qeydləri",
"CONTACT_ATTRIBUTES": "Əlaqə Xüsusiyyətləri",
"PREVIOUS_CONVERSATION": "Əvvəlki Söhbətlər",
"MACROS": "Makrolar",
"LINEAR_ISSUES": "Əlaqəli Linear məsələlər",
"SHOPIFY_ORDERS": "Shopify Sifarişləri"
},
"SHOPIFY": {
"ORDER_ID": "Order #{id}",
"ERROR": "Error loading orders",
"NO_SHOPIFY_ORDERS": "No orders found",
"ORDER_ID": "Sifariş #{id}",
"ERROR": "Sifarişlərin yüklənməsində xəta",
"NO_SHOPIFY_ORDERS": "Sifariş tapılmadı",
"FINANCIAL_STATUS": {
"PENDING": "Pending",
"AUTHORIZED": "Authorized",
"PARTIALLY_PAID": "Partially Paid",
"PAID": "Paid",
"PARTIALLY_REFUNDED": "Partially Refunded",
"REFUNDED": "Refunded",
"VOIDED": "Voided"
"PENDING": "Gözləmədə",
"AUTHORIZED": "Təsdiqlənmiş",
"PARTIALLY_PAID": "Qismən ödənilmiş",
"PAID": "Ödənilib",
"PARTIALLY_REFUNDED": "Qismən Geri Ödənilib",
"REFUNDED": "Geri Ödənilib",
"VOIDED": "Ləğv Edilib"
},
"FULFILLMENT_STATUS": {
"FULFILLED": "Fulfilled",
"PARTIALLY_FULFILLED": "Partially Fulfilled",
"UNFULFILLED": "Unfulfilled"
"FULFILLED": "Yerinə Yetirilib",
"PARTIALLY_FULFILLED": "Qismən Yerinə Yetirilib",
"UNFULFILLED": "Yerinə Yetirilməyib"
}
}
},
"CONVERSATION_CUSTOM_ATTRIBUTES": {
"ADD_BUTTON_TEXT": "Create attribute",
"NO_RECORDS_FOUND": "No attributes found",
"ADD_BUTTON_TEXT": "Xüsusiyyət yaradın",
"NO_RECORDS_FOUND": "Heç bir atribut tapılmadı",
"UPDATE": {
"SUCCESS": "Attribute updated successfully",
"ERROR": "Unable to update attribute. Please try again later"
"SUCCESS": "Xüsusiyyət uğurla yeniləndi",
"ERROR": "Xüsusiyyət yenilənə bilmədi. Zəhmət olmasa, bir az sonra yenidən cəhd edin"
},
"ADD": {
"TITLE": "Add",
"SUCCESS": "Attribute added successfully",
"ERROR": "Unable to add attribute. Please try again later"
"TITLE": "Əlavə et",
"SUCCESS": "Xüsusiyyət uğurla əlavə edildi",
"ERROR": "Xüsusiyyət əlavə edilə bilmədi. Zəhmət olmasa, bir az sonra yenidən cəhd edin"
},
"DELETE": {
"SUCCESS": "Attribute deleted successfully",
"ERROR": "Unable to delete attribute. Please try again later"
"SUCCESS": "Xüsusiyyət uğurla silindi",
"ERROR": "Atributu silmək mümkün olmadı. Zəhmət olmasa, bir az sonra yenidən cəhd edin"
},
"ATTRIBUTE_SELECT": {
"TITLE": "Add attributes",
"PLACEHOLDER": "Search attributes",
"NO_RESULT": "No attributes found"
"TITLE": "Atributlar əlavə et",
"PLACEHOLDER": "Atributlarda axtar",
"NO_RESULT": "Heç bir atribut tapılmadı"
}
},
"EMAIL_HEADER": {
"FROM": "From",
"TO": "To",
"BCC": "Bcc",
"CC": "Cc",
"SUBJECT": "Subject",
"EXPAND": "Expand email"
"FROM": "Kimdən",
"TO": "Kimə",
"BCC": "Gizli nüsxə",
"CC": "Nüsxə",
"SUBJECT": "Mövzu",
"EXPAND": "E-poçtu genişləndir"
},
"CONVERSATION_PARTICIPANTS": {
"SIDEBAR_MENU_TITLE": "Participating",
"SIDEBAR_TITLE": "Conversation participants",
"NO_RECORDS_FOUND": "No results found",
"ADD_PARTICIPANTS": "Select participants",
"REMANING_PARTICIPANTS_TEXT": "+{count} others",
"REMANING_PARTICIPANT_TEXT": "+{count} other",
"TOTAL_PARTICIPANTS_TEXT": "{count} people are participating.",
"TOTAL_PARTICIPANT_TEXT": "{count} person is participating.",
"SIDEBAR_MENU_TITLE": "İştirak edənlər",
"SIDEBAR_TITLE": "Söhbət iştirakçıları",
"NO_RECORDS_FOUND": "Nəticə tapılmadı",
"ADD_PARTICIPANTS": "İştirakçıları seçin",
"REMANING_PARTICIPANTS_TEXT": "+{count} digər",
"REMANING_PARTICIPANT_TEXT": "+{count} digər",
"TOTAL_PARTICIPANTS_TEXT": "{count} nəfər iştirak edir.",
"TOTAL_PARTICIPANT_TEXT": "{count} nəfər iştirak edir.",
"NO_PARTICIPANTS_TEXT": "No one is participating!.",
"WATCH_CONVERSATION": "Join conversation",
"YOU_ARE_WATCHING": "You are participating",
"WATCH_CONVERSATION": "Söhbətə qoşulun",
"YOU_ARE_WATCHING": "Siz iştirak edirsiniz",
"API": {
"ERROR_MESSAGE": "Could not update, try again!",
"SUCCESS_MESSAGE": "Participants updated!"
"ERROR_MESSAGE": "Yenilənmədi, yenidən cəhd edin!",
"SUCCESS_MESSAGE": "İştirakçılar yeniləndi!"
}
},
"TRANSLATE_MODAL": {
"TITLE": "View translated content",
"TITLE": "Tərcümə edilmiş məzmunu göstər",
"DESC": "You can view the translated content in each langauge.",
"ORIGINAL_CONTENT": "Original Content",
"TRANSLATED_CONTENT": "Translated Content",
"NO_TRANSLATIONS_AVAILABLE": "No translations are available for this content"
"ORIGINAL_CONTENT": "Orijinal məzmun",
"TRANSLATED_CONTENT": "Tərcümə edilmiş məzmun",
"NO_TRANSLATIONS_AVAILABLE": "Bu məzmun üçün tərcümə mövcud deyil"
},
"TYPING": {
"ONE": "{user} is typing",
"TWO": "{user} and {secondUser} are typing",
"MULTIPLE": "{user} and {count} others are typing"
"ONE": "{user} yazır",
"TWO": "{user} {secondUser} yazırlar",
"MULTIPLE": "{user} {count} başqası yazırlar"
},
"COPILOT": {
"TRY_THESE_PROMPTS": "Try these prompts"
"TRY_THESE_PROMPTS": "Bu təklifləri sınayın"
},
"GALLERY_VIEW": {
"ERROR_DOWNLOADING": "Unable to download attachment. Please try again"
"ERROR_DOWNLOADING": "Əlavəni yükləmək mümkün olmadı. Zəhmət olmasa yenidən cəhd edin"
}
}
@@ -6,156 +6,156 @@
"CREATE_PORTAL_BUTTON": "Create Portal"
},
"HEADER": {
"FILTER": "Filter by",
"SORT": "Sort by",
"LOCALE": "Locale",
"SETTINGS_BUTTON": "Settings",
"NEW_BUTTON": "New Article",
"FILTER": "Filtrlə",
"SORT": "Sırala",
"LOCALE": "Dil",
"SETTINGS_BUTTON": "Ayarlar",
"NEW_BUTTON": "Yeni Məqalə",
"DROPDOWN_OPTIONS": {
"PUBLISHED": "Published",
"DRAFT": "Draft",
"ARCHIVED": "Archived"
"PUBLISHED": "Yayımlanıb",
"DRAFT": "Qaralama",
"ARCHIVED": "Arxivlənib"
},
"TITLES": {
"ALL_ARTICLES": "All Articles",
"MINE": "My Articles",
"DRAFT": "Draft Articles",
"ARCHIVED": "Archived Articles"
"ALL_ARTICLES": "Bütün Məqalələr",
"MINE": "Mənim Məqalələrim",
"DRAFT": "Qaralama Məqalələr",
"ARCHIVED": "Arxivləşdirilmiş Məqalələr"
},
"LOCALE_SELECT": {
"TITLE": "Select locale",
"PLACEHOLDER": "Select locale",
"NO_RESULT": "No locale found",
"SEARCH_PLACEHOLDER": "Search locale"
"TITLE": "Dili seçin",
"PLACEHOLDER": "Dili seçin",
"NO_RESULT": "Dil tapılmadı",
"SEARCH_PLACEHOLDER": "Dil axtarışı"
}
},
"EDIT_HEADER": {
"ALL_ARTICLES": "All Articles",
"PUBLISH_BUTTON": "Publish",
"MOVE_TO_ARCHIVE_BUTTON": "Move to archived",
"PREVIEW": "Preview",
"ADD_TRANSLATION": "Add translation",
"OPEN_SIDEBAR": "Open sidebar",
"CLOSE_SIDEBAR": "Close sidebar",
"SAVING": "Saving...",
"SAVED": "Saved"
"ALL_ARTICLES": "Bütün məqalələr",
"PUBLISH_BUTTON": "Yayımla",
"MOVE_TO_ARCHIVE_BUTTON": "Arxivə köçür",
"PREVIEW": "Önizləmə",
"ADD_TRANSLATION": "Tərcümə əlavə et",
"OPEN_SIDEBAR": "Yan paneli aç",
"CLOSE_SIDEBAR": "Yan paneli bağla",
"SAVING": "Yadda saxlanılır...",
"SAVED": "Yadda saxlanıldı"
},
"ARTICLE_EDITOR": {
"IMAGE_UPLOAD": {
"TITLE": "Upload image",
"UPLOADING": "Uploading...",
"SUCCESS": "Image uploaded successfully",
"ERROR": "Error while uploading image",
"UN_AUTHORIZED_ERROR": "You are not authorized to upload images",
"ERROR_FILE_SIZE": "Image size should be less than {size}MB",
"ERROR_FILE_FORMAT": "Image format should be jpg, jpeg or png",
"ERROR_FILE_DIMENSIONS": "Image dimensions should be less than 2000 x 2000"
"TITLE": "Şəkil yüklə",
"UPLOADING": "Yüklənir...",
"SUCCESS": "Şəkil uğurla yükləndi",
"ERROR": "Şəkil yüklənərkən xəta baş verdi",
"UN_AUTHORIZED_ERROR": "Şəkilləri yükləmək üçün icazəniz yoxdur",
"ERROR_FILE_SIZE": "Şəkilin ölçüsü {size}MB-dən az olmalıdır",
"ERROR_FILE_FORMAT": "Şəkil formatı jpg, jpeg və ya png olmalıdır",
"ERROR_FILE_DIMENSIONS": "Şəkilin ölçüləri 2000 x 2000-dən az olmalıdır"
}
},
"ARTICLE_SETTINGS": {
"TITLE": "Article Settings",
"TITLE": "Məqalə parametrləri",
"FORM": {
"CATEGORY": {
"LABEL": "Category",
"TITLE": "Select category",
"PLACEHOLDER": "Select category",
"NO_RESULT": "No category found",
"SEARCH_PLACEHOLDER": "Search category"
"LABEL": "Kateqoriya",
"TITLE": "Kateqoriya seçin",
"PLACEHOLDER": "Kateqoriya seçin",
"NO_RESULT": "Heç bir kateqoriya tapılmadı",
"SEARCH_PLACEHOLDER": "Kateqoriya axtar"
},
"AUTHOR": {
"LABEL": "Author",
"TITLE": "Select author",
"PLACEHOLDER": "Select author",
"NO_RESULT": "No authors found",
"SEARCH_PLACEHOLDER": "Search author"
"LABEL": "Müəllif",
"TITLE": "Müəllif seçin",
"PLACEHOLDER": "Müəllifi seçin",
"NO_RESULT": "Müəllif tapılmadı",
"SEARCH_PLACEHOLDER": "Müəllifi axtar"
},
"META_TITLE": {
"LABEL": "Meta title",
"PLACEHOLDER": "Add a meta title"
"LABEL": "Meta başlıq",
"PLACEHOLDER": "Meta başlıq əlavə edin"
},
"META_DESCRIPTION": {
"LABEL": "Meta description",
"PLACEHOLDER": "Add your meta description for better SEO results..."
"LABEL": "Meta təsviri",
"PLACEHOLDER": "Daha yaxşı SEO nəticələri üçün meta təsvir əlavə edin..."
},
"META_TAGS": {
"LABEL": "Meta tags",
"PLACEHOLDER": "Add meta tags separated by comma..."
"LABEL": "Meta teqlər",
"PLACEHOLDER": "Vergüllə ayrılmış meta teqlər əlavə edin..."
}
},
"BUTTONS": {
"ARCHIVE": "Archive article",
"DELETE": "Delete article"
"ARCHIVE": "Məqaləni arxivləşdir",
"DELETE": "Məqaləni sil"
}
},
"ARTICLE_SEARCH_RESULT": {
"UNCATEGORIZED": "Uncategorized",
"UNCATEGORIZED": "Kateqoriyasız",
"SEARCH_RESULTS": "Search results for {query}",
"EMPTY_TEXT": "Search for articles to insert into replies.",
"SEARCH_LOADER": "Searching...",
"INSERT_ARTICLE": "Insert",
"NO_RESULT": "No articles found",
"COPY_LINK": "Copy article link to clipboard",
"OPEN_LINK": "Open article in new tab",
"PREVIEW_LINK": "Preview article"
"EMPTY_TEXT": "Cavablara əlavə etmək üçün məqalələri axtarın.",
"SEARCH_LOADER": "Axtarılır...",
"INSERT_ARTICLE": "Daxil et",
"NO_RESULT": "Məqalə tapılmadı",
"COPY_LINK": "Məqalə linkini panoya kopyala",
"OPEN_LINK": "Məqaləni yeni nişanda aç",
"PREVIEW_LINK": "Məqaləyə önizləmə baxışı"
},
"PORTAL": {
"HEADER": "Portals",
"DEFAULT": "Default",
"NEW_BUTTON": "New Portal",
"ACTIVE_BADGE": "active",
"CHOOSE_LOCALE_LABEL": "Choose a locale",
"LOADING_MESSAGE": "Loading portals...",
"ARTICLES_LABEL": "articles",
"NO_PORTALS_MESSAGE": "There are no available portals",
"ADD_NEW_LOCALE": "Add a new locale",
"HEADER": "Portallar",
"DEFAULT": "Defolt",
"NEW_BUTTON": "Yeni Portal",
"ACTIVE_BADGE": "aktiv",
"CHOOSE_LOCALE_LABEL": "Bir dil seçin",
"LOADING_MESSAGE": "Portallar yüklənir...",
"ARTICLES_LABEL": "məqalələr",
"NO_PORTALS_MESSAGE": "Mövcud portal yoxdur",
"ADD_NEW_LOCALE": "Yeni dil əlavə et",
"POPOVER": {
"TITLE": "Portals",
"PORTAL_SETTINGS": "Portal settings",
"SUBTITLE": "You have multiple portals and can have different locales for each portal.",
"CANCEL_BUTTON_LABEL": "Cancel",
"CHOOSE_LOCALE_BUTTON": "Choose Locale"
"TITLE": "Portallar",
"PORTAL_SETTINGS": "Portal parametrləri",
"SUBTITLE": "Bir neçə portalınız var və hər portal üçün fərqli dillər seçə bilərsiniz.",
"CANCEL_BUTTON_LABEL": "Ləğv et",
"CHOOSE_LOCALE_BUTTON": "Dil seçin"
},
"PORTAL_SETTINGS": {
"LIST_ITEM": {
"HEADER": {
"COUNT_LABEL": "articles",
"ADD": "Add locale",
"VISIT": "Visit site",
"SETTINGS": "Settings",
"DELETE": "Delete"
"COUNT_LABEL": "məqalələr",
"ADD": "Dil əlavə et",
"VISIT": "Sayta bax",
"SETTINGS": "Parametrlər",
"DELETE": "Sil"
},
"PORTAL_CONFIG": {
"TITLE": "Portal Configurations",
"TITLE": "Portal Konfiqurasiyaları",
"ITEMS": {
"NAME": "Name",
"DOMAIN": "Custom domain",
"NAME": "Ad",
"DOMAIN": "Xüsusi domen",
"SLUG": "Slug",
"TITLE": "Portal title",
"THEME": "Theme color",
"SUB_TEXT": "Portal sub text"
"TITLE": "Portal başlığı",
"THEME": "Tema rəngi",
"SUB_TEXT": "Portal alt mətni"
}
},
"AVAILABLE_LOCALES": {
"TITLE": "Available locales",
"TITLE": "Mövcud dillər",
"TABLE": {
"NAME": "Locale name",
"CODE": "Locale code",
"ARTICLE_COUNT": "No. of articles",
"CATEGORIES": "No. of categories",
"SWAP": "Swap",
"DELETE": "Delete",
"DEFAULT_LOCALE": "Default"
"NAME": "Dil adı",
"CODE": "Dil kodu",
"ARTICLE_COUNT": "Məqalələrin sayı",
"CATEGORIES": "Kateqoriyaların sayı",
"SWAP": "Dəyişdir",
"DELETE": "Sil",
"DEFAULT_LOCALE": "Əsas"
}
}
},
"DELETE_PORTAL": {
"TITLE": "Delete portal",
"MESSAGE": "Are you sure you want to delete this portal",
"YES": "Yes, delete portal",
"NO": "No, keep portal",
"TITLE": "Portalı sil",
"MESSAGE": "Bu portalı silmək istədiyinizə əminsiniz",
"YES": "Bəli, portalı sil",
"NO": "Xeyr, portalı saxla",
"API": {
"DELETE_SUCCESS": "Portal deleted successfully",
"DELETE_ERROR": "Error while deleting portal"
"DELETE_SUCCESS": "Portal uğurla silindi",
"DELETE_ERROR": "Portal silinərkən xəta baş verdi"
}
},
"SEND_CNAME_INSTRUCTIONS": {
@@ -166,192 +166,204 @@
}
},
"EDIT": {
"HEADER_TEXT": "Edit portal",
"HEADER_TEXT": "Portalı redaktə et",
"TABS": {
"BASIC_SETTINGS": {
"TITLE": "Basic information"
"TITLE": "Əsas məlumat"
},
"CUSTOMIZATION_SETTINGS": {
"TITLE": "Portal customization"
"TITLE": "Portal fərdiləşdirilməsi"
},
"CATEGORY_SETTINGS": {
"TITLE": "Categories"
"TITLE": "Kateqoriyalar"
},
"LOCALE_SETTINGS": {
"TITLE": "Locales"
"TITLE": "Dillər"
}
},
"CATEGORIES": {
"TITLE": "Categories in",
"NEW_CATEGORY": "New category",
"TITLE": "Kateqoriyalar",
"NEW_CATEGORY": "Yeni kateqoriya",
"TABLE": {
"NAME": "Name",
"DESCRIPTION": "Description",
"LOCALE": "Locale",
"ARTICLE_COUNT": "No. of articles",
"NAME": "Ad",
"DESCRIPTION": "Təsvir",
"LOCALE": "Dil",
"ARTICLE_COUNT": "Məqalələrin sayı",
"ACTION_BUTTON": {
"EDIT": "Edit category",
"DELETE": "Delete category"
"EDIT": "Kateqoriyanı redaktə et",
"DELETE": "Kateqoriyanı sil"
},
"EMPTY_TEXT": "No categories found"
"EMPTY_TEXT": "Kateqoriyalar tapılmadı"
}
},
"EDIT_BASIC_INFO": {
"BUTTON_TEXT": "Update basic settings"
"BUTTON_TEXT": "Əsas parametrləri yenilə"
}
},
"ADD": {
"CREATE_FLOW": {
"BASIC": {
"TITLE": "Help center information",
"BODY": "Basic information about portal"
"TITLE": "Kömək mərkəzi məlumatları",
"BODY": "Portal haqqında əsas məlumat"
},
"CUSTOMIZATION": {
"TITLE": "Help center customization",
"BODY": "Customize portal"
"TITLE": "Kömək mərkəzinin fərdiləşdirilməsi",
"BODY": "Portalı fərdiləşdirin"
},
"FINISH": {
"TITLE": "Voila! 🎉",
"TITLE": "Budur! 🎉",
"BODY": "You're all set!"
}
},
"CREATE_FLOW_PAGE": {
"BACK_BUTTON": "Back",
"BACK_BUTTON": "Geri",
"BASIC_SETTINGS_PAGE": {
"HEADER": "Create Portal",
"TITLE": "Help center information",
"CREATE_BASIC_SETTING_BUTTON": "Create portal basic settings"
"HEADER": "Portal yarat",
"TITLE": "Kömək mərkəzi məlumatları",
"CREATE_BASIC_SETTING_BUTTON": "Portalun əsas parametrlərini yarat"
},
"CUSTOMIZATION_PAGE": {
"HEADER": "Portal customisation",
"TITLE": "Help center customization",
"UPDATE_PORTAL_BUTTON": "Update portal settings"
"HEADER": "Portal fərdiləşdirilməsi",
"TITLE": "Kömək mərkəzinin fərdiləşdirilməsi",
"UPDATE_PORTAL_BUTTON": "Portal parametrlərini yenilə"
},
"FINISH_PAGE": {
"TITLE": "Voila!🎉 You're all set up!",
"MESSAGE": "You can now see this created portal on your all portals page.",
"FINISH": "Go to all portals page"
"TITLE": "Voila!🎉 Hər şey hazırdır!",
"MESSAGE": "İndi bu yaradılmış portala bütün portallar səhifənizdən baxa bilərsiniz.",
"FINISH": "Bütün portallar səhifəsinə keç"
}
},
"LOGO": {
"LABEL": "Logo",
"UPLOAD_BUTTON": "Upload logo",
"HELP_TEXT": "This logo will be displayed on the portal header.",
"IMAGE_UPLOAD_SUCCESS": "Logo uploaded successfully",
"IMAGE_UPLOAD_ERROR": "Logo deleted successfully",
"IMAGE_DELETE_ERROR": "Error while deleting logo"
"UPLOAD_BUTTON": "Loqonu yüklə",
"HELP_TEXT": "Bu logo portal başlığında göstəriləcək.",
"IMAGE_UPLOAD_SUCCESS": "Loqo uğurla yükləndi",
"IMAGE_UPLOAD_ERROR": "Loqo uğurla silindi",
"IMAGE_DELETE_ERROR": "Loqo silinərkən xəta baş verdi"
},
"NAME": {
"LABEL": "Name",
"PLACEHOLDER": "Portal name",
"HELP_TEXT": "The name will be used in the public facing portal internally.",
"ERROR": "Name is required"
"LABEL": "Ad",
"PLACEHOLDER": "Portal adı",
"HELP_TEXT": "Ad daxili olaraq ictimai portalda istifadə olunacaq.",
"ERROR": "Ad tələb olunur"
},
"SLUG": {
"LABEL": "Slug",
"PLACEHOLDER": "Portal slug for urls",
"ERROR": "Slug is required"
"PLACEHOLDER": "Portal slug URL-lər üçün",
"ERROR": "Slug tələb olunur"
},
"DOMAIN": {
"LABEL": "Custom Domain",
"PLACEHOLDER": "Portal custom domain",
"LABEL": "Xüsusi domen",
"PLACEHOLDER": "Portalun xüsusi domeni",
"HELP_TEXT": "Add only If you want to use a custom domain for your portals. Eg: {exampleURL}",
"ERROR": "Enter a valid domain URL"
"ERROR": "Etibarlı domen URL-si daxil edin"
},
"HOME_PAGE_LINK": {
"LABEL": "Home Page Link",
"PLACEHOLDER": "Portal home page link",
"LABEL": "Ana səhifə linki",
"PLACEHOLDER": "Portalun ana səhifə linki",
"HELP_TEXT": "The link used to return from the portal to the home page. Eg: {exampleURL}",
"ERROR": "Enter a valid home page URL"
"ERROR": "Etibarlı ana səhifə URL-si daxil edin"
},
"THEME_COLOR": {
"LABEL": "Portal theme color",
"HELP_TEXT": "This color will show as the theme color for the portal."
"LABEL": "Portal tema rəngi",
"HELP_TEXT": "Bu rəng portal üçün tema rəngi kimi göstəriləcək."
},
"PAGE_TITLE": {
"LABEL": "Page Title",
"PLACEHOLDER": "Portal page title",
"HELP_TEXT": "The page title will be used in the public facing portal.",
"ERROR": "Page title is required"
"LABEL": "Səhifə Başlığı",
"PLACEHOLDER": "Portal səhifəsinin başlığı",
"HELP_TEXT": "Səhifənin başlığı ictimai portalda istifadə olunacaq.",
"ERROR": "Səhifə başlığı tələb olunur"
},
"HEADER_TEXT": {
"LABEL": "Header Text",
"PLACEHOLDER": "Portal header text",
"HELP_TEXT": "The Portal header text will be used in the public facing portal.",
"ERROR": "Portal header text is required"
"LABEL": "Başlıq Mətn",
"PLACEHOLDER": "Portal başlıq mətni",
"HELP_TEXT": "Portal başlıq mətni ictimai portalda istifadə olunacaq.",
"ERROR": "Portal başlıq mətni tələb olunur"
},
"API": {
"SUCCESS_MESSAGE_FOR_BASIC": "Portal created successfully.",
"ERROR_MESSAGE_FOR_BASIC": "Couldn't create the portal. Try again.",
"SUCCESS_MESSAGE_FOR_UPDATE": "Portal updated successfully.",
"ERROR_MESSAGE_FOR_UPDATE": "Couldn't update the portal. Try again."
"SUCCESS_MESSAGE_FOR_BASIC": "Portal uğurla yaradıldı.",
"ERROR_MESSAGE_FOR_BASIC": "Portal yaradıla bilmədi. Yenidən cəhd edin.",
"SUCCESS_MESSAGE_FOR_UPDATE": "Portal uğurla yeniləndi.",
"ERROR_MESSAGE_FOR_UPDATE": "Portal yenilənə bilmədi. Yenidən cəhd edin."
}
},
"ADD_LOCALE": {
"TITLE": "Add a new locale",
"SUB_TITLE": "This adds a new locale to your available translation list.",
"TITLE": "Yeni dil əlavə et",
"SUB_TITLE": "Bu, mövcud tərcümə siyahınıza yeni bir dil əlavə edir.",
"PORTAL": "Portal",
"LOCALE": {
"LABEL": "Locale",
"PLACEHOLDER": "Choose a locale",
"ERROR": "Locale is required"
"LABEL": "Dil",
"PLACEHOLDER": "Dil seçin",
"ERROR": "Dil tələb olunur"
},
"BUTTONS": {
"CREATE": "Create locale",
"CANCEL": "Cancel"
"CREATE": "Dili yarat",
"CANCEL": "Ləğv et"
},
"API": {
"SUCCESS_MESSAGE": "Locale added successfully",
"ERROR_MESSAGE": "Unable to add locale. Try again."
"SUCCESS_MESSAGE": "Dil uğurla əlavə edildi",
"ERROR_MESSAGE": "Dil əlavə etmək mümkün olmadı. Yenidən cəhd edin."
}
},
"CHANGE_DEFAULT_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Default locale updated successfully",
"ERROR_MESSAGE": "Unable to update default locale. Try again."
"SUCCESS_MESSAGE": "Əsas dil uğurla yeniləndi",
"ERROR_MESSAGE": "Əsas dili yeniləmək mümkün olmadı. Yenidən cəhd edin."
}
},
"DELETE_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale removed from portal successfully",
"ERROR_MESSAGE": "Unable to remove locale from portal. Try again."
"SUCCESS_MESSAGE": "Dil portaldan uğurla silindi",
"ERROR_MESSAGE": "Dili portaldan silmək mümkün olmadı. Yenidən cəhd edin."
}
},
"DRAFT_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale moved to draft successfully",
"ERROR_MESSAGE": "Unable to move locale to draft. Try again."
}
},
"PUBLISH_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale published successfully",
"ERROR_MESSAGE": "Unable to publish locale. Try again."
}
}
},
"TABLE": {
"LOADING_MESSAGE": "Loading articles...",
"404": "No articles matches your search 🔍",
"NO_ARTICLES": "There are no available articles",
"LOADING_MESSAGE": "Məqalələr yüklənir...",
"404": "Axtarışınıza uyğun məqalə tapılmadı 🔍",
"NO_ARTICLES": "Mövcud məqalə yoxdur",
"HEADERS": {
"TITLE": "Title",
"CATEGORY": "Category",
"READ_COUNT": "Views",
"STATUS": "Status",
"LAST_EDITED": "Last edited"
"TITLE": "Başlıq",
"CATEGORY": "Kateqoriya",
"READ_COUNT": "Baxışlar",
"STATUS": "Vəziyyət",
"LAST_EDITED": "Son redaktə"
},
"COLUMNS": {
"BY": "by",
"AUTHOR_NOT_AVAILABLE": "Author is not available"
"BY": "tərəfindən",
"AUTHOR_NOT_AVAILABLE": "Müəllif mövcud deyil"
}
},
"EDIT_ARTICLE": {
"LOADING": "Loading article...",
"TITLE_PLACEHOLDER": "Article title goes here",
"CONTENT_PLACEHOLDER": "Write your article here",
"LOADING": "Məqalə yüklənir...",
"TITLE_PLACEHOLDER": "Məqalənin başlığı buraya yazılır",
"CONTENT_PLACEHOLDER": "Məqalənizi buraya yazın",
"API": {
"ERROR": "Error while saving article"
"ERROR": "Məqalə yadda saxlanarkən xəta baş verdi"
}
},
"PUBLISH_ARTICLE": {
"API": {
"ERROR": "Error while publishing article",
"SUCCESS": "Article published successfully"
"ERROR": "Məqalə yayımlanarkən xəta baş verdi",
"SUCCESS": "Məqalə uğurla dərc olundu"
}
},
"ARCHIVE_ARTICLE": {
"API": {
"ERROR": "Error while archiving article",
"SUCCESS": "Article archived successfully"
"ERROR": "Məqalə arxivlənərkən xəta baş verdi",
"SUCCESS": "Məqalə uğurla arxivləndi"
}
},
"DRAFT_ARTICLE": {
@@ -363,15 +375,15 @@
"DELETE_ARTICLE": {
"MODAL": {
"CONFIRM": {
"TITLE": "Confirm Deletion",
"MESSAGE": "Are you sure to delete the article?",
"YES": "Yes, Delete",
"NO": "No, Keep it"
"TITLE": "Silinməni təsdiqləyin",
"MESSAGE": "Məqaləni silmək istədiyinizə əminsiniz?",
"YES": "Bəli, sil",
"NO": "Xeyr, Saxla"
}
},
"API": {
"SUCCESS_MESSAGE": "Article deleted successfully",
"ERROR_MESSAGE": "Error while deleting article"
"SUCCESS_MESSAGE": "Məqalə uğurla silindi",
"ERROR_MESSAGE": "Məqaləni silərkən xəta baş verdi"
}
},
"REORDER_ARTICLE": {
@@ -385,126 +397,126 @@
}
},
"CREATE_ARTICLE": {
"ERROR_MESSAGE": "Please add the article heading and content then only you can update the settings"
"ERROR_MESSAGE": "Zəhmət olmasa məqalənin başlığını və məzmununu əlavə edin, yalnız bundan sonra parametrləri yeniləyə bilərsiniz"
},
"SIDEBAR": {
"SEARCH": {
"PLACEHOLDER": "Search for articles"
"PLACEHOLDER": "Məqalələrdə axtarış"
}
},
"CATEGORY": {
"ADD": {
"TITLE": "Create a category",
"SUB_TITLE": "The category will be used in the public facing portal to categorize articles.",
"TITLE": "Kateqoriya yaradın",
"SUB_TITLE": "Kateqoriya, məqalələri kateqoriyalara ayırmaq üçün ictimai portalda istifadə olunacaq.",
"PORTAL": "Portal",
"LOCALE": "Locale",
"LOCALE": "Dil",
"NAME": {
"LABEL": "Name",
"PLACEHOLDER": "Category name",
"HELP_TEXT": "The category name and icon will be used in the public facing portal to categorize articles.",
"ERROR": "Name is required"
"LABEL": "Ad",
"PLACEHOLDER": "Kateqoriya adı",
"HELP_TEXT": "Kateqoriya adı ikonu məqalələri kateqoriyalara ayırmaq üçün ictimai portalda istifadə olunacaq.",
"ERROR": "Ad tələb olunur"
},
"SLUG": {
"LABEL": "Slug",
"PLACEHOLDER": "Category slug for urls",
"PLACEHOLDER": "URL-lər üçün kateqoriya slug-u",
"HELP_TEXT": "app.chatwoot.com/hc/my-portal/en-US/categories/my-slug",
"ERROR": "Slug is required"
"ERROR": "Slug tələb olunur"
},
"DESCRIPTION": {
"LABEL": "Description",
"PLACEHOLDER": "Give a short description about the category.",
"ERROR": "Description is required"
"LABEL": "Təsvir",
"PLACEHOLDER": "Kateqoriya haqqında qısa təsvir verin.",
"ERROR": "Təsvir tələb olunur"
},
"BUTTONS": {
"CREATE": "Create category",
"CANCEL": "Cancel"
"CREATE": "Kateqoriya yarat",
"CANCEL": "Ləğv et"
},
"API": {
"SUCCESS_MESSAGE": "Category created successfully",
"ERROR_MESSAGE": "Unable to create category"
"SUCCESS_MESSAGE": "Kateqoriya uğurla yaradıldı",
"ERROR_MESSAGE": "Kateqoriya yaratmaq mümkün olmadı"
}
},
"EDIT": {
"TITLE": "Edit a category",
"SUB_TITLE": "Editing a category will update the category in the public facing portal.",
"TITLE": "Kateqoriyanı redaktə et",
"SUB_TITLE": "Kateqoriyanın redaktəsi ictimai portalda kateqoriyanı yeniləyəcək.",
"PORTAL": "Portal",
"LOCALE": "Locale",
"LOCALE": "Dil",
"NAME": {
"LABEL": "Name",
"PLACEHOLDER": "Category name",
"HELP_TEXT": "The category name and icon will be used in the public facing portal to categorize articles.",
"ERROR": "Name is required"
"LABEL": "Ad",
"PLACEHOLDER": "Kateqoriya adı",
"HELP_TEXT": "Kateqoriya adı ikonu məqalələri kateqoriyalara ayırmaq üçün ictimai portalda istifadə olunacaq.",
"ERROR": "Ad tələb olunur"
},
"SLUG": {
"LABEL": "Slug",
"PLACEHOLDER": "Category slug for urls",
"PLACEHOLDER": "URL-lər üçün kateqoriya slug-u",
"HELP_TEXT": "app.chatwoot.com/hc/my-portal/en-US/categories/my-slug",
"ERROR": "Slug is required"
"ERROR": "Slug tələb olunur"
},
"DESCRIPTION": {
"LABEL": "Description",
"PLACEHOLDER": "Give a short description about the category.",
"ERROR": "Description is required"
"LABEL": "Təsvir",
"PLACEHOLDER": "Kateqoriya haqqında qısa təsvir verin.",
"ERROR": "Təsvir tələb olunur"
},
"BUTTONS": {
"CREATE": "Update category",
"CANCEL": "Cancel"
"CREATE": "Kateqoriyanı yenilə",
"CANCEL": "Ləğv et"
},
"API": {
"SUCCESS_MESSAGE": "Category updated successfully",
"ERROR_MESSAGE": "Unable to update category"
"SUCCESS_MESSAGE": "Kateqoriya uğurla yeniləndi",
"ERROR_MESSAGE": "Kateqoriyanı yeniləmək mümkün olmadı"
}
},
"DELETE": {
"API": {
"SUCCESS_MESSAGE": "Category deleted successfully",
"ERROR_MESSAGE": "Unable to delete category"
"SUCCESS_MESSAGE": "Kateqoriya uğurla silindi",
"ERROR_MESSAGE": "Kateqoriyanı silmək mümkün olmadı"
}
}
},
"ARTICLE_SEARCH": {
"TITLE": "Search articles",
"PLACEHOLDER": "Search articles",
"NO_RESULT": "No articles found",
"SEARCHING": "Searching...",
"SEARCH_BUTTON": "Search",
"INSERT_ARTICLE": "Insert link",
"IFRAME_ERROR": "URL is empty or invalid. Unable to display content.",
"OPEN_ARTICLE_SEARCH": "Insert article from Help Center",
"SUCCESS_ARTICLE_INSERTED": "Article inserted successfully",
"PREVIEW_LINK": "Preview article",
"CANCEL": "Close",
"BACK": "Back",
"BACK_RESULTS": "Back to results"
"TITLE": "Məqalələrdə axtarış edin",
"PLACEHOLDER": "Məqalələrdə axtarış edin",
"NO_RESULT": "Məqalə tapılmadı",
"SEARCHING": "Axtarılır...",
"SEARCH_BUTTON": "Axtar",
"INSERT_ARTICLE": "Link əlavə et",
"IFRAME_ERROR": "URL boş və ya düzgün deyil. Məzmun göstərilə bilmir.",
"OPEN_ARTICLE_SEARCH": "Kömək Mərkəzindən məqalə əlavə et",
"SUCCESS_ARTICLE_INSERTED": "Məqalə uğurla əlavə edildi",
"PREVIEW_LINK": "Məqaləni önizləyin",
"CANCEL": "Bağla",
"BACK": "Geri",
"BACK_RESULTS": "Nəticələrə qayıdın"
},
"UPGRADE_PAGE": {
"TITLE": "Help Center",
"DESCRIPTION": "Create user-friendly self-service portals. Help your users to access the articles and get support 24/7. Upgrade your subscription to enable this feature.",
"SELF_HOSTED_DESCRIPTION": "Create user-friendly self-service portals. Help your users to access the articles and get support 24/7. Please contact your administrator to enable this feature.",
"TITLE": "Kömək Mərkəzi",
"DESCRIPTION": "İstifadəçi dostu özünə xidmət portalları yaradın. İstifadəçilərinizə məqalələrə daxil olmaq və 24/7 dəstək almaqda kömək edin. Bu funksiyanı aktivləşdirmək üçün abunəliyinizi yüksəldin.",
"SELF_HOSTED_DESCRIPTION": "İstifadəçi dostu özünə xidmət portalları yaradın. İstifadəçilərinizə məqalələrə daxil olmaq və 24/7 dəstək almaqda kömək edin. Zəhmət olmasa, bu funksiyanı aktivləşdirmək üçün administratorunuzla əlaqə saxlayın.",
"BUTTON": {
"LEARN_MORE": "Learn more",
"UPGRADE": "Upgrade"
"LEARN_MORE": "Ətraflı öyrən",
"UPGRADE": "Yenilə"
},
"FEATURES": {
"PORTALS": {
"TITLE": "Multiple portals",
"DESCRIPTION": "Create multiple help center portals for different products using the same account."
"TITLE": "Çoxsaylı portallar",
"DESCRIPTION": "Eyni hesabdan istifadə edərək müxtəlif məhsullar üçün çoxsaylı kömək mərkəzi portalları yaradın."
},
"LOCALES": {
"TITLE": "Full support for locales",
"DESCRIPTION": "Localize the portal in your language. We support all locales and allow translations for every article."
"TITLE": "Dil variantlarının tam dəstəyi",
"DESCRIPTION": "Portalı öz dilinizə uyğunlaşdırın. Bütün dil variantlarını dəstəkləyirik və hər məqalə üçün tərcümələrə imkan veririk."
},
"SEO": {
"TITLE": "SEO-friendly design",
"DESCRIPTION": "Customize your meta tags to improve your visibility on search engines with our SEO-friendly pages."
"TITLE": "SEO-ya uyğun dizayn",
"DESCRIPTION": "Meta teqlərinizi fərdiləşdirərək axtarış motorlarında görünürlüğünüzü SEO dostu səhifələrimizlə artırın."
},
"API": {
"TITLE": "Full API support",
"DESCRIPTION": "Use the portal as a headless CMS with third party front-end frameworks using our APIs."
"TITLE": "Tam API dəstəyi",
"DESCRIPTION": "Portaldan üçüncü tərəf ön çərçivələri ilə başsız CMS kimi istifadə etmək üçün API-lərimizdən yararlanın."
}
}
},
"LOADING": "Loading...",
"LOADING": "Yüklənir...",
"ARTICLES_PAGE": {
"ARTICLE_CARD": {
"CARD": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Default",
"DRAFT": "Qaralama",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
"MOVE_TO_DRAFT": "Move to draft",
"PUBLISH_LOCALE": "Publish locale",
"DELETE": "Delete"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Select locale..."
},
"STATUS": {
"LABEL": "Status",
"OPTIONS": {
"LIVE": "Yayımlanıb",
"DRAFT": "Qaralama"
}
},
"API": {
"SUCCESS_MESSAGE": "Locale added successfully",
"ERROR_MESSAGE": "Unable to add locale. Try again."
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,138 +1,138 @@
{
"REPORT": {
"HEADER": "Conversations",
"HEADER": "Söhbətlər",
"LOADING_CHART": "Loading chart data...",
"NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
"NO_ENOUGH_DATA": "Hesabat yaratmaq üçün kifayət qədər məlumat nöqtəsi alınmayıb, zəhmət olmasa bir az sonra yenidən cəhd edin.",
"DOWNLOAD_CONVERSATION_REPORTS": "Download conversation reports",
"DATA_FETCHING_FAILED": "Failed to fetch data, please try again later.",
"SUMMARY_FETCHING_FAILED": "Failed to fetch summary, please try again later.",
"DATA_FETCHING_FAILED": "Məlumatları əldə etmək mümkün olmadı, zəhmət olmasa bir az sonra yenidən cəhd edin.",
"SUMMARY_FETCHING_FAILED": "Yekunu əldə etmək mümkün olmadı, zəhmət olmasa bir az sonra yenidən cəhd edin.",
"METRICS": {
"CONVERSATIONS": {
"NAME": "Conversations",
"DESC": "( Total )"
"NAME": "Söhbətlər",
"DESC": "( Ümumi )"
},
"INCOMING_MESSAGES": {
"NAME": "Messages received",
"DESC": "( Total )"
"DESC": "( Ümumi )"
},
"OUTGOING_MESSAGES": {
"NAME": "Messages sent",
"DESC": "( Total )"
"DESC": "( Ümumi )"
},
"FIRST_RESPONSE_TIME": {
"NAME": "First Response Time",
"DESC": "( Avg )",
"INFO_TEXT": "Total number of conversations used for computation:",
"TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)"
"NAME": "İlk Cavab Vaxtı",
"DESC": "( Orta )",
"INFO_TEXT": "Hesablama üçün istifadə olunan ümumi söhbət sayı:",
"TOOLTIP_TEXT": "İlkin cavab vaxtı {metricValue}-dir ({conversationCount} söhbət əsasında)"
},
"RESOLUTION_TIME": {
"NAME": "Resolution Time",
"DESC": "( Avg )",
"INFO_TEXT": "Total number of conversations used for computation:",
"TOOLTIP_TEXT": "Resolution Time is {metricValue} (based on {conversationCount} conversations)"
"NAME": "Həll Vaxtı",
"DESC": "( Orta )",
"INFO_TEXT": "Hesablama üçün istifadə olunan ümumi söhbət sayı:",
"TOOLTIP_TEXT": "Həll vaxtı {metricValue}-dir ({conversationCount} söhbət əsasında)"
},
"RESOLUTION_COUNT": {
"NAME": "Resolution Count",
"DESC": "( Total )"
"NAME": "Həll Sayı",
"DESC": "( Ümumi )"
},
"BOT_RESOLUTION_COUNT": {
"NAME": "Resolution Count",
"DESC": "( Total )"
"NAME": "Həll sayı",
"DESC": "( Ümumi )"
},
"BOT_HANDOFF_COUNT": {
"NAME": "Handoff Count",
"DESC": "( Total )"
"NAME": "Təslim Sayı",
"DESC": "( Ümumi )"
},
"REPLY_TIME": {
"NAME": "Customer waiting time",
"TOOLTIP_TEXT": "Waiting time is {metricValue} (based on {conversationCount} replies)",
"TOOLTIP_TEXT": "Gözləmə vaxtı {metricValue}-dir ({conversationCount} cavab əsasında)",
"DESC": ""
}
},
"DATE_RANGE_OPTIONS": {
"LAST_7_DAYS": "Last 7 days",
"LAST_14_DAYS": "Last 14 days",
"LAST_30_DAYS": "Last 30 days",
"THIS_MONTH": "This month",
"LAST_MONTH": "Last month",
"LAST_3_MONTHS": "Last 3 months",
"LAST_6_MONTHS": "Last 6 months",
"LAST_YEAR": "Last year",
"LAST_7_DAYS": "Son 7 gün",
"LAST_14_DAYS": "Son 14 gün",
"LAST_30_DAYS": "Son 30 gün",
"THIS_MONTH": "Bu ay",
"LAST_MONTH": "Keçən ay",
"LAST_3_MONTHS": "Son 3 ay",
"LAST_6_MONTHS": "Son 6 ay",
"LAST_YEAR": "Keçən il",
"CUSTOM_DATE_RANGE": "Custom date range"
},
"CUSTOM_DATE_RANGE": {
"CONFIRM": "Apply",
"CONFIRM": "Tətbiq et",
"PLACEHOLDER": "Select date range"
},
"GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By",
"DURATION_FILTER_LABEL": "Duration",
"DURATION_FILTER_LABEL": "Müddət",
"GROUPING_OPTIONS": {
"DAY": "Day",
"WEEK": "Week",
"MONTH": "Month",
"YEAR": "Year"
"DAY": "Gün",
"WEEK": "Həftə",
"MONTH": "Ay",
"YEAR": "İl"
},
"GROUP_BY_DAY_OPTIONS": [
{
"id": 1,
"groupBy": "Day"
"groupBy": "Gün"
}
],
"GROUP_BY_WEEK_OPTIONS": [
{
"id": 1,
"groupBy": "Day"
"groupBy": "Gün"
},
{
"id": 2,
"groupBy": "Week"
"groupBy": "Həftə"
}
],
"GROUP_BY_MONTH_OPTIONS": [
{
"id": 1,
"groupBy": "Day"
"groupBy": "Gün"
},
{
"id": 2,
"groupBy": "Week"
"groupBy": "Həftə"
},
{
"id": 3,
"groupBy": "Month"
"groupBy": "Ay"
}
],
"GROUP_BY_YEAR_OPTIONS": [
{
"id": 2,
"groupBy": "Week"
"groupBy": "Həftə"
},
{
"id": 3,
"groupBy": "Month"
"groupBy": "Ay"
},
{
"id": 4,
"groupBy": "Year"
"groupBy": "İl"
}
],
"BUSINESS_HOURS": "Business Hours",
"BUSINESS_HOURS": "İş Saatları",
"FILTER_ACTIONS": {
"CLEAR_FILTER": "Clear filter",
"EMPTY_LIST": "No results found"
"EMPTY_LIST": "Nəticə tapılmadı"
},
"PAGINATION": {
"RESULTS": "Showing {start} to {end} of {total} results",
"PER_PAGE_TEMPLATE": "{size} / page"
"RESULTS": "{total} nəticədən {start} - {end} göstərilir",
"PER_PAGE_TEMPLATE": "{size} / səhifə"
}
},
"AGENT_REPORTS": {
"HEADER": "Agents Overview",
"DESCRIPTION": "Easily track agent performance with key metrics such as conversations, response times, resolution times, and resolved cases. Click an agent's name to learn more.",
"LOADING_CHART": "Loading chart data...",
"NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
"NO_ENOUGH_DATA": "Hesabat yaratmaq üçün kifayət qədər məlumat nöqtəsi almamışıq, zəhmət olmasa sonra yenidən cəhd edin.",
"DOWNLOAD_AGENT_REPORTS": "Download agent reports",
"FILTER_DROPDOWN_LABEL": "Select Agent",
"FILTER_DROPDOWN_LABEL": "Agent seçin",
"FILTERS": {
"INPUT_PLACEHOLDER": {
"AGENTS": "Search agents"
@@ -140,54 +140,54 @@
},
"METRICS": {
"CONVERSATIONS": {
"NAME": "Conversations",
"DESC": "( Total )"
"NAME": "Söhbətlər",
"DESC": "( Ümumi )"
},
"INCOMING_MESSAGES": {
"NAME": "Incoming Messages",
"DESC": "( Total )"
"DESC": "( Ümumi )"
},
"OUTGOING_MESSAGES": {
"NAME": "Outgoing Messages",
"DESC": "( Total )"
"DESC": "( Ümumi )"
},
"FIRST_RESPONSE_TIME": {
"NAME": "First Response Time",
"DESC": "( Avg )",
"INFO_TEXT": "Total number of conversations used for computation:",
"TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)"
"NAME": "İlk Cavab Vaxtı",
"DESC": "( Orta )",
"INFO_TEXT": "Hesablama üçün istifadə olunan ümumi söhbət sayı:",
"TOOLTIP_TEXT": "İlk cavab vaxtı {metricValue}-dir ({conversationCount} söhbət əsasında)"
},
"RESOLUTION_TIME": {
"NAME": "Resolution Time",
"DESC": "( Avg )",
"INFO_TEXT": "Total number of conversations used for computation:",
"TOOLTIP_TEXT": "Resolution Time is {metricValue} (based on {conversationCount} conversations)"
"NAME": "Həll Vaxtı",
"DESC": "( Orta )",
"INFO_TEXT": "Hesablama üçün istifadə olunan ümumi söhbət sayı:",
"TOOLTIP_TEXT": "Həll vaxtı {metricValue}-dir ({conversationCount} söhbət əsasında)"
},
"RESOLUTION_COUNT": {
"NAME": "Resolution Count",
"DESC": "( Total )"
"NAME": "Həll Sayı",
"DESC": "( Cəmi )"
}
},
"DATE_RANGE": [
{
"id": 0,
"name": "Last 7 days"
"name": "Son 7 gün"
},
{
"id": 1,
"name": "Last 30 days"
"name": "Son 30 gün"
},
{
"id": 2,
"name": "Last 3 months"
"name": "Son 3 ay"
},
{
"id": 3,
"name": "Last 6 months"
"name": "Son 6 ay"
},
{
"id": 4,
"name": "Last year"
"name": "Keçən il"
},
{
"id": 5,
@@ -195,15 +195,15 @@
}
],
"CUSTOM_DATE_RANGE": {
"CONFIRM": "Apply",
"CONFIRM": "Tətbiq et",
"PLACEHOLDER": "Select date range"
}
},
"LABEL_REPORTS": {
"HEADER": "Labels Overview",
"DESCRIPTION": "Track label performance with key metrics including conversations, response times, resolution times, and resolved cases. Click a label name for detailed insights.",
"DESCRIPTION": "Nişan nəticələrini söhbətlər, cavab müddəti, həll müddəti və həll olunmuş hallar üzrə yoxlayın. Ətraflı məlumat üçün nişan adını açın.",
"LOADING_CHART": "Loading chart data...",
"NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
"NO_ENOUGH_DATA": "Hesabat yaratmaq üçün kifayət qədər məlumat nöqtəsi almamışıq, zəhmət olmasa bir az sonra yenidən cəhd edin.",
"DOWNLOAD_LABEL_REPORTS": "Download label reports",
"FILTER_DROPDOWN_LABEL": "Select Label",
"FILTERS": {
@@ -213,62 +213,62 @@
},
"METRICS": {
"CONVERSATIONS": {
"NAME": "Conversations",
"DESC": "( Total )"
"NAME": "Söhbətlər",
"DESC": "( Ümumi )"
},
"INCOMING_MESSAGES": {
"NAME": "Incoming Messages",
"DESC": "( Total )"
"DESC": "( Cəmi )"
},
"OUTGOING_MESSAGES": {
"NAME": "Outgoing Messages",
"DESC": "( Total )"
"DESC": "( Cəmi )"
},
"FIRST_RESPONSE_TIME": {
"NAME": "First Response Time",
"DESC": "( Avg )",
"INFO_TEXT": "Total number of conversations used for computation:",
"TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)"
"NAME": "İlk Cavab Vaxtı",
"DESC": "( Orta )",
"INFO_TEXT": "Hesablama üçün istifadə olunan ümumi söhbət sayı:",
"TOOLTIP_TEXT": "İlk cavab vaxtı {metricValue}-dir ({conversationCount} söhbət əsasında)"
},
"RESOLUTION_TIME": {
"NAME": "Resolution Time",
"DESC": "( Avg )",
"INFO_TEXT": "Total number of conversations used for computation:",
"TOOLTIP_TEXT": "Resolution Time is {metricValue} (based on {conversationCount} conversations)"
"NAME": "Həll Vaxtı",
"DESC": "( Orta )",
"INFO_TEXT": "Hesablama üçün istifadə olunan ümumi söhbət sayı:",
"TOOLTIP_TEXT": "Həll vaxtı {metricValue}-dir ({conversationCount} söhbətə əsaslanır)"
},
"RESOLUTION_COUNT": {
"NAME": "Resolution Count",
"DESC": "( Total )"
"NAME": "Həll Sayı",
"DESC": "( Cəmi )"
}
},
"DATE_RANGE": [
{
"id": 0,
"name": "Last 7 days"
"name": "Son 7 gün"
},
{
"id": 1,
"name": "Last 30 days"
"name": "Son 30 gün"
},
{
"id": 2,
"name": "Last 3 months"
"name": "Son 3 ay"
},
{
"id": 3,
"name": "Last 6 months"
"name": "Son 6 ay"
},
{
"id": 4,
"name": "Last year"
"name": "Keçən il"
},
{
"id": 5,
"name": "Custom date range"
"name": "Xüsusi tarix aralığı"
}
],
"CUSTOM_DATE_RANGE": {
"CONFIRM": "Apply",
"CONFIRM": "Tətbiq et",
"PLACEHOLDER": "Select date range"
}
},
@@ -276,84 +276,84 @@
"HEADER": "Inbox Overview",
"DESCRIPTION": "Quickly view your inbox performance with key metrics like conversations, response times, resolution times, and resolved cases—all in one place. Click an inbox name for more details.",
"LOADING_CHART": "Loading chart data...",
"NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
"NO_ENOUGH_DATA": "Hesabat yaratmaq üçün kifayət qədər məlumat nöqtəsi almamışıq, zəhmət olmasa bir az sonra yenidən cəhd edin.",
"DOWNLOAD_INBOX_REPORTS": "Download inbox reports",
"FILTER_DROPDOWN_LABEL": "Select Inbox",
"ALL_INBOXES": "All Inboxes",
"SEARCH_INBOX": "Search Inbox",
"FILTER_DROPDOWN_LABEL": "Qutu seçin",
"ALL_INBOXES": "Bütün Qutular",
"SEARCH_INBOX": "Qutu üzrə axtarış",
"FILTERS": {
"INPUT_PLACEHOLDER": {
"INBOXES": "Search inboxes"
"INBOXES": "Qutuları axtar"
}
},
"METRICS": {
"CONVERSATIONS": {
"NAME": "Conversations",
"DESC": "( Total )"
"NAME": "Söhbətlər",
"DESC": "( Ümumi )"
},
"INCOMING_MESSAGES": {
"NAME": "Incoming Messages",
"DESC": "( Total )"
"DESC": "( Ümumi )"
},
"OUTGOING_MESSAGES": {
"NAME": "Outgoing Messages",
"DESC": "( Total )"
"DESC": "( Ümumi )"
},
"FIRST_RESPONSE_TIME": {
"NAME": "First Response Time",
"DESC": "( Avg )",
"INFO_TEXT": "Total number of conversations used for computation:",
"TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)"
"NAME": "İlk Cavab Vaxtı",
"DESC": "( Orta )",
"INFO_TEXT": "Hesablama üçün istifadə olunan ümumi söhbət sayı:",
"TOOLTIP_TEXT": "İlk cavab vaxtı {metricValue}-dir ({conversationCount} söhbətə əsaslanır)"
},
"RESOLUTION_TIME": {
"NAME": "Resolution Time",
"DESC": "( Avg )",
"INFO_TEXT": "Total number of conversations used for computation:",
"TOOLTIP_TEXT": "Resolution Time is {metricValue} (based on {conversationCount} conversations)"
"NAME": "Həll Vaxtı",
"DESC": "( Orta )",
"INFO_TEXT": "Hesablama üçün istifadə olunan ümumi söhbət sayı:",
"TOOLTIP_TEXT": "Həll vaxtı {metricValue}-dir ({conversationCount} söhbətə əsaslanır)"
},
"RESOLUTION_COUNT": {
"NAME": "Resolution Count",
"DESC": "( Total )"
"NAME": "Həll Sayı",
"DESC": "( Cəmi )"
}
},
"DATE_RANGE": [
{
"id": 0,
"name": "Last 7 days"
"name": "Son 7 gün"
},
{
"id": 1,
"name": "Last 30 days"
"name": "Son 30 gün"
},
{
"id": 2,
"name": "Last 3 months"
"name": "Son 3 ay"
},
{
"id": 3,
"name": "Last 6 months"
"name": "Son 6 ay"
},
{
"id": 4,
"name": "Last year"
"name": "Keçən il"
},
{
"id": 5,
"name": "Custom date range"
"name": "Xüsusi tarix aralığı"
}
],
"CUSTOM_DATE_RANGE": {
"CONFIRM": "Apply",
"CONFIRM": "Tətbiq et",
"PLACEHOLDER": "Select date range"
}
},
"TEAM_REPORTS": {
"HEADER": "Team Overview",
"DESCRIPTION": "Get a snapshot of your team's performance with essential metrics, including conversations, response times, resolution times, and resolved cases. Click a team name for more details.",
"DESCRIPTION": "Komanda nəticələrini söhbətlər, cavab müddəti, həll müddəti və həll olunmuş hallar üzrə yoxlayın. Ətraflı məlumat üçün komanda adını açın.",
"LOADING_CHART": "Loading chart data...",
"NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
"NO_ENOUGH_DATA": "Hesabat yaratmaq üçün kifayət qədər məlumat nöqtəsi almamışıq, zəhmət olmasa sonra yenidən cəhd edin.",
"DOWNLOAD_TEAM_REPORTS": "Download team reports",
"FILTER_DROPDOWN_LABEL": "Select Team",
"FILTER_DROPDOWN_LABEL": "Komandanı seçin",
"FILTERS": {
"ADD_FILTER": "Add filter",
"CLEAR_ALL": "Clear all",
@@ -364,54 +364,54 @@
},
"METRICS": {
"CONVERSATIONS": {
"NAME": "Conversations",
"DESC": "( Total )"
"NAME": "Söhbətlər",
"DESC": "( Ümumi )"
},
"INCOMING_MESSAGES": {
"NAME": "Incoming Messages",
"DESC": "( Total )"
"DESC": "( Cəmi )"
},
"OUTGOING_MESSAGES": {
"NAME": "Outgoing Messages",
"DESC": "( Total )"
"DESC": "( Cəmi )"
},
"FIRST_RESPONSE_TIME": {
"NAME": "First Response Time",
"DESC": "( Avg )",
"INFO_TEXT": "Total number of conversations used for computation:",
"TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)"
"NAME": "İlk Cavab Vaxtı",
"DESC": "( Orta )",
"INFO_TEXT": "Hesablama üçün istifadə olunan ümumi söhbət sayı:",
"TOOLTIP_TEXT": "İlk cavab vaxtı {metricValue}-dir ({conversationCount} söhbətə əsaslanır)"
},
"RESOLUTION_TIME": {
"NAME": "Resolution Time",
"DESC": "( Avg )",
"INFO_TEXT": "Total number of conversations used for computation:",
"TOOLTIP_TEXT": "Resolution Time is {metricValue} (based on {conversationCount} conversations)"
"NAME": "Həll Vaxtı",
"DESC": "( Orta )",
"INFO_TEXT": "Hesablama üçün istifadə olunan ümumi söhbət sayı:",
"TOOLTIP_TEXT": "Həll vaxtı {metricValue}-dir ({conversationCount} söhbətə əsaslanır)"
},
"RESOLUTION_COUNT": {
"NAME": "Resolution Count",
"DESC": "( Total )"
"NAME": "Həll Sayı",
"DESC": "( Ümumi )"
}
},
"DATE_RANGE": [
{
"id": 0,
"name": "Last 7 days"
"name": "Son 7 gün"
},
{
"id": 1,
"name": "Last 30 days"
"name": "Son 30 gün"
},
{
"id": 2,
"name": "Last 3 months"
"name": "Son 3 ay"
},
{
"id": 3,
"name": "Last 6 months"
"name": "Son 6 ay"
},
{
"id": 4,
"name": "Last year"
"name": "Keçən il"
},
{
"id": 5,
@@ -419,13 +419,13 @@
}
],
"CUSTOM_DATE_RANGE": {
"CONFIRM": "Apply",
"CONFIRM": "Tətbiq et",
"PLACEHOLDER": "Select date range"
}
},
"CSAT_REPORTS": {
"HEADER": "CSAT Reports",
"NO_RECORDS": "No responses yet",
"HEADER": "CSAT Hesabatları",
"NO_RECORDS": "Hələ cavab yoxdur",
"NO_RECORDS_DESCRIPTION": "CSAT survey responses will appear here once customers start providing feedback.",
"DOWNLOAD": "Download CSAT Reports",
"DOWNLOAD_FAILED": "Failed to download CSAT Reports",
@@ -435,7 +435,7 @@
"NO_FILTER": "No filters available",
"INPUT_PLACEHOLDER": {
"AGENTS": "Search agents",
"INBOXES": "Search inboxes",
"INBOXES": "Qutuları axtar",
"TEAMS": "Search teams",
"RATINGS": "Search ratings"
},
@@ -443,53 +443,53 @@
"LABEL": "Agent"
},
"INBOXES": {
"LABEL": "Inbox"
"LABEL": "Gələn qutu"
},
"TEAMS": {
"LABEL": "Team"
"LABEL": "Komanda"
},
"RATINGS": {
"LABEL": "Rating"
"LABEL": "Qiymətləndirmə"
}
},
"TABLE": {
"HEADER": {
"CONTACT_NAME": "Contact",
"CONTACT_NAME": "Əlaqə",
"AGENT_NAME": "Agent",
"RATING": "Rating",
"RATING": "Qiymətləndirmə",
"FEEDBACK_TEXT": "Feedback comment",
"CONVERSATION": "Conversation",
"CUSTOMER": "Customer",
"RESPONSE": "Response",
"HANDLED_BY": "Handled by"
"CONVERSATION": "Söhbət",
"CUSTOMER": "Müştəri",
"RESPONSE": "Cavab",
"HANDLED_BY": "Tərəfindən idarə olunur"
},
"UNKNOWN_CUSTOMER": "Unknown customer"
"UNKNOWN_CUSTOMER": "Naməlum müştəri"
},
"NO_AGENT": "No assigned agent",
"NO_FEEDBACK": "No feedback provided",
"NO_AGENT": "Təyin olunmuş agent yoxdur",
"NO_FEEDBACK": "Rəy verilməyib",
"METRIC": {
"TOTAL_RESPONSES": {
"LABEL": "Total responses",
"TOOLTIP": "Total number of responses collected"
"LABEL": "Cəmi cavablar",
"TOOLTIP": "Toplanmış cavabların ümumi sayı"
},
"SATISFACTION_SCORE": {
"LABEL": "Satisfaction score",
"TOOLTIP": "Total number of positive responses / Total number of responses * 100"
"LABEL": "Məmnunluq balı",
"TOOLTIP": "Müsbət cavabların ümumi sayı / Cavabların ümumi sayı * 100"
},
"RESPONSE_RATE": {
"LABEL": "Response rate",
"LABEL": "Cavab faizi",
"TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100"
},
"RATING_DISTRIBUTION": "Rating distribution"
"RATING_DISTRIBUTION": "Qiymətləndirmə paylanması"
},
"REVIEW_NOTES": {
"TITLE": "Review notes",
"PLACEHOLDER": "Add review notes about this rating...",
"SAVE": "Save",
"CANCEL": "Cancel",
"SAVING": "Saving...",
"TITLE": "Rəy qeydləri",
"PLACEHOLDER": "Bu qiymətləndirmə haqqında rəy qeydləri əlavə edin...",
"SAVE": "Yadda saxla",
"CANCEL": "Ləğv et",
"SAVING": "Yadda saxlanılır...",
"SAVED": "Notes saved successfully",
"SAVE_ERROR": "Failed to save notes",
"SAVE_ERROR": "Qeydləri yadda saxlamaq mümkün olmadı",
"UPDATED_BY": "Updated by {name} {time}",
"UPDATED_BY_LABEL": "Updated by",
"PAYWALL": {
@@ -509,42 +509,42 @@
"TOOLTIP": "Total number of conversations handled by the bot"
},
"TOTAL_RESPONSES": {
"LABEL": "Total Responses",
"LABEL": "Ümumi Cavablar",
"TOOLTIP": "Total number of responses sent by the bot"
},
"RESOLUTION_RATE": {
"LABEL": "Resolution Rate",
"LABEL": "Həll Faizi",
"TOOLTIP": "Total number of conversations resolved by the bot / Total number of conversations handled by the bot * 100"
},
"HANDOFF_RATE": {
"LABEL": "Handoff Rate",
"LABEL": "Təyinat Faizi",
"TOOLTIP": "Total number of conversations handed off to agents / Total number of conversations handled by the bot * 100"
}
}
},
"OVERVIEW_REPORTS": {
"HEADER": "Overview",
"LIVE": "Live",
"HEADER": "Ümumi Baxış",
"LIVE": "Canlı",
"ACCOUNT_CONVERSATIONS": {
"HEADER": "Open Conversations",
"HEADER": "Açıq Söhbətlər",
"LOADING_MESSAGE": "Loading conversation metrics...",
"OPEN": "Open",
"OPEN": "Açıq",
"UNATTENDED": "Unattended",
"UNASSIGNED": "Unassigned",
"PENDING": "Pending"
"UNASSIGNED": "Təyin olunmamış",
"PENDING": "Gözləyir"
},
"CONVERSATION_HEATMAP": {
"HEADER": "Conversation Traffic",
"NO_CONVERSATIONS": "No conversations",
"CONVERSATION": "{count} conversation",
"CONVERSATIONS": "{count} conversations",
"NO_CONVERSATIONS": "Söhbət yoxdur",
"CONVERSATION": "{count} söhbət",
"CONVERSATIONS": "{count} söhbət",
"DOWNLOAD_REPORT": "Download report"
},
"RESOLUTION_HEATMAP": {
"HEADER": "Resolutions",
"NO_CONVERSATIONS": "No conversations",
"CONVERSATION": "{count} conversation",
"CONVERSATIONS": "{count} conversations",
"NO_CONVERSATIONS": "Söhbət yoxdur",
"CONVERSATION": "{count} söhbət",
"CONVERSATIONS": "{count} söhbət",
"DOWNLOAD_REPORT": "Download report"
},
"AGENT_CONVERSATIONS": {
@@ -553,42 +553,42 @@
"NO_AGENTS": "There are no conversations by agents",
"TABLE_HEADER": {
"AGENT": "Agent",
"OPEN": "Open",
"OPEN": "Açıq",
"UNATTENDED": "Unattended",
"STATUS": "Status"
"STATUS": "Vəziyyət"
}
},
"TEAM_CONVERSATIONS": {
"ALL_TEAMS": "All Teams",
"HEADER": "Conversations by teams",
"LOADING_MESSAGE": "Loading team metrics...",
"NO_TEAMS": "There is no data available",
"NO_TEAMS": "Məlumat mövcud deyil",
"TABLE_HEADER": {
"TEAM": "Team",
"OPEN": "Open",
"TEAM": "Komanda",
"OPEN": "Açıq",
"UNATTENDED": "Unattended",
"STATUS": "Status"
"STATUS": "Vəziyyət"
}
},
"AGENT_STATUS": {
"HEADER": "Agent status",
"ONLINE": "Online",
"BUSY": "Busy",
"HEADER": "Agent vəziyyəti",
"ONLINE": "Onlayn",
"BUSY": "Məşğul",
"OFFLINE": "Offline"
}
},
"DAYS_OF_WEEK": {
"SUNDAY": "Sunday",
"MONDAY": "Monday",
"TUESDAY": "Tuesday",
"WEDNESDAY": "Wednesday",
"THURSDAY": "Thursday",
"FRIDAY": "Friday",
"SATURDAY": "Saturday"
"SUNDAY": "Bazar günü",
"MONDAY": "Bazar ertəsi",
"TUESDAY": "Çərşənbə axşamı",
"WEDNESDAY": "Çərşənbə",
"THURSDAY": "Cümə axşamı",
"FRIDAY": "Cümə",
"SATURDAY": "Şənbə"
},
"SLA_REPORTS": {
"HEADER": "SLA Reports",
"NO_RECORDS": "SLA applied conversations are not available.",
"HEADER": "SLA Hesabatları",
"NO_RECORDS": "Tətbiq edilmiş SLA söhbətləri mövcud deyil.",
"LOADING": "Loading SLA data...",
"DOWNLOAD_SLA_REPORTS": "Download SLA reports",
"DOWNLOAD_FAILED": "Failed to download SLA Reports",
@@ -596,7 +596,7 @@
"ADD_FIlTER": "Add filter",
"CLEAR_ALL": "Clear all",
"CLEAR_FILTER": "Clear filter",
"EMPTY_LIST": "No results found",
"EMPTY_LIST": "Nəticə tapılmadı",
"NO_FILTER": "No filters available",
"SEARCH": "Search filter",
"INPUT_PLACEHOLDER": {
@@ -606,16 +606,16 @@
"LABELS": "Label name",
"TEAMS": "Team name"
},
"SLA": "SLA Policy",
"INBOXES": "Inbox",
"SLA": "SLA Siyasəti",
"INBOXES": "Gələn qutu",
"AGENTS": "Agent",
"LABELS": "Label",
"TEAMS": "Team"
"LABELS": "Etiket",
"TEAMS": "Komanda"
},
"WITH": "with",
"WITH": "ilə",
"METRICS": {
"HIT_RATE": {
"LABEL": "Hit Rate",
"LABEL": "Uğur Faizi",
"TOOLTIP": "Percentage of SLAs created were completed successfully"
},
"NO_OF_MISSES": {
@@ -624,27 +624,27 @@
},
"NO_OF_CONVERSATIONS": {
"LABEL": "Number of Conversations",
"TOOLTIP": "Total number of conversations with SLA"
"TOOLTIP": "SLA ilə ümumi söhbət sayı"
}
},
"TABLE": {
"HEADER": {
"POLICY": "Policy",
"CONVERSATION": "Conversation",
"POLICY": "Siyasət",
"CONVERSATION": "Söhbət",
"AGENT": "Agent"
},
"VIEW_DETAILS": "View Details"
"VIEW_DETAILS": "Ətraflı Bax"
}
},
"SUMMARY_REPORTS": {
"INBOX": "Inbox",
"INBOX": "Gələnlər",
"AGENT": "Agent",
"TEAM": "Team",
"LABEL": "Label",
"AVG_RESOLUTION_TIME": "Avg. Resolution Time",
"AVG_FIRST_RESPONSE_TIME": "Avg. First Response Time",
"AVG_REPLY_TIME": "Avg. Customer Waiting Time",
"RESOLUTION_COUNT": "Resolution Count",
"TEAM": "Komanda",
"LABEL": "Etiket",
"AVG_RESOLUTION_TIME": "Orta Həll Vaxtı",
"AVG_FIRST_RESPONSE_TIME": "Orta İlk Cavab Vaxtı",
"AVG_REPLY_TIME": "Orta Müştəri Gözləmə Vaxtı",
"RESOLUTION_COUNT": "Həll Sayı",
"CONVERSATIONS": "No. of conversations"
}
}
File diff suppressed because it is too large Load Diff
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Message signature is not configured, please configure it in profile settings.",
"COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
"COPILOT_MSG_INPUT": "Дайте на copilot допълнителни инструкции или питайте нещо друго... Натиснете enter, за да изпратите последващо съобщение",
"CLICK_HERE": "Click here to update",
"WHATSAPP_TEMPLATES": "Whatsapp Templates"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Drag and drop here to attach",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
"COPILOT_THINKING": "Copilot is thinking",
"COPILOT_THINKING": "Copilot мисли",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Add bcc",
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Locale removed from portal successfully",
"ERROR_MESSAGE": "Unable to remove locale from portal. Try again."
}
},
"DRAFT_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale moved to draft successfully",
"ERROR_MESSAGE": "Unable to move locale to draft. Try again."
}
},
"PUBLISH_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale published successfully",
"ERROR_MESSAGE": "Unable to publish locale. Try again."
}
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Default",
"DRAFT": "Draft",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
"MOVE_TO_DRAFT": "Move to draft",
"PUBLISH_LOCALE": "Publish locale",
"DELETE": "Изтрий"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Select locale..."
},
"STATUS": {
"LABEL": "Статус",
"OPTIONS": {
"LIVE": "Published",
"DRAFT": "Draft"
}
},
"API": {
"SUCCESS_MESSAGE": "Locale added successfully",
"ERROR_MESSAGE": "Unable to add locale. Try again."
@@ -710,9 +710,21 @@
"MESSENGER_SUB_HEAD": "Place this button inside your body tag",
"ALLOWED_DOMAINS": {
"TITLE": "Allowed Domains",
"SUBTITLE": "Add wildcard or regular domains separated by commas (leave blank to allow all), e.g. *.chatwoot.dev, chatwoot.com.",
"DESCRIPTION": "Restrict which websites can embed your chat widget. For security, only add domains you own and trust. Add one or more domains separated by commas. Leave blank to allow all domains (not recommended for production).",
"PLACEHOLDER": "example.com, www.example.com, app.example.com"
},
"ALLOW_MOBILE_WEBVIEW": {
"LABEL": "Enable widget in mobile apps",
"SUBTITLE": "Check this if you embed the widget in iOS or Android apps. Mobile apps don't send domain information, so they would be blocked by domain restrictions unless this is enabled."
},
"IDENTITY_VALIDATION": {
"TITLE": "Identity Validation",
"DESCRIPTION": "Verify user authenticity by generating secure tokens. This prevents unauthorized users from impersonating others in your chat.",
"SECRET_KEY": "Secret Key",
"VIEW_DOCS": "View documentation",
"REQUIRE_LABEL": "Require identity validation for all conversations",
"REQUIRE_DESCRIPTION": "When enabled, users must provide a valid identity token to start conversations. Requests without valid tokens will be rejected."
},
"INBOX_AGENTS": "Агенти",
"INBOX_AGENTS_SUB_TEXT": "Add or remove agents from this inbox",
"AGENT_ASSIGNMENT": "Conversation Assignment",
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Captain",
"HEADER_KNOW_MORE": "Know more",
"HEADER_KNOW_MORE": "Научете повече",
"ASSISTANT_SWITCHER": {
"ASSISTANTS": "Assistants",
"SWITCH_ASSISTANT": "Switch between assistants",
"NEW_ASSISTANT": "Create Assistant",
"EMPTY_LIST": "No assistants found, please create one to get started"
"ASSISTANTS": "Асистенти",
"SWITCH_ASSISTANT": "Превключване между асистенти",
"NEW_ASSISTANT": "Създайте асистент",
"EMPTY_LIST": "Не са намерени асистенти, моля създайте един, за да започнете"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
"PANEL_TITLE": "Get started with Copilot",
"KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilots here to speed things up.",
"PANEL_TITLE": "Започнете с Copilot",
"KICK_OFF_MESSAGE": "Имате нужда от бързо резюме, искате да проверите минали разговори или да създадете по-добър отговор? Copilot е тук, за да ускори нещата.",
"SEND_MESSAGE": "Изпрати съобщение...",
"EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
"LOADER": "Captain is thinking",
"EMPTY_MESSAGE": "Възникна грешка при генериране на отговора. Моля, опитайте отново.",
"LOADER": "Captain мисли",
"YOU": "You",
"USE": "Use this",
"RESET": "Reset",
"SHOW_STEPS": "Show steps",
"SELECT_ASSISTANT": "Select Assistant",
"USE": "Използвай това",
"RESET": "Нулиране",
"SHOW_STEPS": "Покажи стъпки",
"SELECT_ASSISTANT": "Изберете асистент",
"PROMPTS": {
"SUMMARIZE": {
"LABEL": "Summarize this conversation",
"CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
"LABEL": "Обобщете този разговор",
"CONTENT": "Обобщете основните точки, обсъдени между клиента и поддържащия агент, включително притесненията на клиента, въпросите и решенията или отговорите, предоставени от агента."
},
"SUGGEST": {
"LABEL": "Suggest an answer",
"CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
"LABEL": "Предложете отговор",
"CONTENT": "Анализирайте запитването на клиента и създайте отговор, който ефективно адресира техните притеснения или въпроси. Уверете се, че отговорът е ясен, кратък и предоставя полезна информация."
},
"RATE": {
"LABEL": "Rate this conversation",
"CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
"LABEL": "Оценете този разговор",
"CONTENT": "Прегледайте разговора, за да видите доколко отговаря на нуждите на клиента. Споделете оценка от 5 въз основа на тон, яснота и ефективност."
},
"HIGH_PRIORITY": {
"LABEL": "High priority conversations",
"CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
"LABEL": "Разговори с висок приоритет",
"CONTENT": "Дайте ми резюме на всички отворени разговори с висок приоритет. Включете ID на разговора, името на клиента (ако е налично), съдържанието на последното съобщение и назначен агент. Групирайте по статус, ако е приложимо."
},
"LIST_CONTACTS": {
"LABEL": "List contacts",
"CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
"LABEL": "Списък с контакти",
"CONTENT": "Покажете ми списък с топ 10 контакта. Включете име, имейл или телефонен номер (ако е наличен), време на последно виждане, етикети (ако има такива)."
}
}
},
"PLAYGROUND": {
"USER": "You",
"ASSISTANT": "Assistant",
"ASSISTANT": "Асистент",
"MESSAGE_PLACEHOLDER": "Напишете вашето съобщение...",
"HEADER": "Playground",
"DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
"CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
"HEADER": "Площадка",
"DESCRIPTION": "Използвайте тази площадка, за да изпращате съобщения до вашия асистент и да проверите дали отговаря точно, бързо и в очаквания тон.",
"CREDIT_NOTE": "Изпратените съобщения тук ще се броят към вашите кредити на Captain."
},
"PAYWALL": {
"TITLE": "Upgrade to use Captain AI",
"AVAILABLE_ON": "Captain is not available on the free plan.",
"UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
"TITLE": "Надградете, за да използвате Captain AI",
"AVAILABLE_ON": "Captain не е наличен в безплатния план.",
"UPGRADE_PROMPT": "Надградете вашия план, за да получите достъп до нашите асистенти, copilot и още.",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
"AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
"UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
"AVAILABLE_ON": "Captain AI е наличен само в Enterprise плановете.",
"UPGRADE_PROMPT": "Надградете вашия план, за да получите достъп до нашите асистенти, copilot и още.",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"BANNER": {
"RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
"DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
"RESPONSES": "Използвали сте над 80% от лимита си за отговори. За да продължите да използвате Captain AI, моля надградете.",
"DOCUMENTS": "Достигнат е лимитът за документи. Надградете, за да продължите да използвате Captain AI."
},
"FORM": {
"CANCEL": "Отмени",
@@ -527,7 +527,8 @@
"TITLE": "Features",
"ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations",
"ALLOW_MEMORIES": "Capture key details as memories from customer interactions.",
"ALLOW_CITATIONS": "Include source citations in responses"
"ALLOW_CITATIONS": "Include source citations in responses",
"ALLOW_CONTACT_ATTRIBUTES": "Allow access to contact information"
}
},
"EDIT": {
@@ -737,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
"SELECTED": "{count} selected",
"SELECT_ALL": "Select all ({count})",
"UNSELECT_ALL": "Unselect all ({count})",
"BULK_DELETE_BUTTON": "Изтрий",
"BULK_DELETE": {
"TITLE": "Delete documents?",
"DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
"CONFIRM": "Yes, delete all",
"SUCCESS_MESSAGE": "Documents deleted successfully",
"ERROR_MESSAGE": "There was an error deleting the documents, please try again."
},
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -794,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
"SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -824,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
"TEST": {
"BUTTON": "Test connection",
"SUCCESS": "Endpoint returned HTTP {status}",
"ERROR": "Connection failed",
"DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
},
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
"ERROR": "Tool name is required"
"ERROR": "Tool name is required",
"MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Описание",
@@ -1,125 +1,125 @@
{
"AGENT_MGMT": {
"HEADER": "Agents",
"HEADER_BTN_TXT": "Add Agent",
"LOADING": "Fetching Agent List",
"DESCRIPTION": "An agent is a member of your customer support team who can view and respond to user messages. The list below shows all the agents in your account.",
"LEARN_MORE": "Learn about user roles",
"HEADER": "এজেন্ট",
"HEADER_BTN_TXT": "এজেন্ট যোগ করুন",
"LOADING": "এজেন্ট তালিকা আনছে",
"DESCRIPTION": "একজন এজেন্ট হলেন আপনার গ্রাহক সাপোর্ট দলের সদস্য যিনি ব্যবহারকারীর বার্তা দেখতে এবং উত্তর দিতে পারেন। নিচের তালিকায় আপনার অ্যাকাউন্টের সব এজেন্ট দেখানো হয়েছে।",
"LEARN_MORE": "ব্যবহারকারীর ভূমিকা সম্পর্কে জানুন",
"AGENT_TYPES": {
"ADMINISTRATOR": "Administrator",
"AGENT": "Agent"
"ADMINISTRATOR": "প্রশাসক",
"AGENT": "এজেন্ট"
},
"COUNT": "{n} agent | {n} agents",
"COUNT": "{n} এজেন্ট | {n} এজেন্ট",
"LIST": {
"404": "There are no agents associated to this account",
"TITLE": "Manage agents in your team",
"DESC": "You can add/remove agents to/in your team.",
"NAME": "Name",
"EMAIL": "EMAIL",
"STATUS": "Status",
"ACTIONS": "Actions",
"VERIFIED": "Verified",
"VERIFICATION_PENDING": "Verification Pending",
"AVAILABLE_CUSTOM_ROLE": "Available custom role permissions"
"404": "এই অ্যাকাউন্টে কোনো এজেন্ট নেই",
"TITLE": "আপনার দলের এজেন্ট পরিচালনা করুন",
"DESC": "আপনি আপনার দলে এজেন্ট যোগ/অপসারণ করতে পারেন।",
"NAME": "নাম",
"EMAIL": "ইমেইল",
"STATUS": "অবস্থা",
"ACTIONS": "কর্ম",
"VERIFIED": "যাচাই করা হয়েছে",
"VERIFICATION_PENDING": "যাচাই প্রক্রিয়াধীন",
"AVAILABLE_CUSTOM_ROLE": "উপলব্ধ কাস্টম ভূমিকার অনুমতিসমূহ"
},
"ADD": {
"TITLE": "Add agent to your team",
"DESC": "You can add people who will be able to handle support for your inboxes.",
"CANCEL_BUTTON_TEXT": "Cancel",
"TITLE": "আপনার দলে এজেন্ট যোগ করুন",
"DESC": "আপনি এমন ব্যক্তিদের যোগ করতে পারেন যারা আপনার ইনবক্সের জন্য সাপোর্ট পরিচালনা করতে পারবেন।",
"CANCEL_BUTTON_TEXT": "বাতিল করুন",
"FORM": {
"NAME": {
"LABEL": "Agent Name",
"PLACEHOLDER": "Please enter a name of the agent"
"LABEL": "এজেন্টের নাম",
"PLACEHOLDER": "এজেন্টের নাম লিখুন"
},
"AGENT_TYPE": {
"LABEL": "Role",
"PLACEHOLDER": "Please select a role",
"ERROR": "Role is required"
"LABEL": "ভূমিকা",
"PLACEHOLDER": "একটি ভূমিকা নির্বাচন করুন",
"ERROR": "ভূমিকা আবশ্যক"
},
"EMAIL": {
"LABEL": "Email Address",
"PLACEHOLDER": "Please enter an email address of the agent"
"LABEL": "ইমেইল ঠিকানা",
"PLACEHOLDER": "এজেন্টের ইমেইল ঠিকানা লিখুন"
},
"SUBMIT": "Add Agent"
"SUBMIT": "এজেন্ট যোগ করুন"
},
"API": {
"SUCCESS_MESSAGE": "Agent added successfully",
"EXIST_MESSAGE": "Agent email already in use, Please try another email address",
"ERROR_MESSAGE": "Could not connect to Woot Server, Please try again later"
"SUCCESS_MESSAGE": "এজেন্ট সফলভাবে যোগ করা হয়েছে",
"EXIST_MESSAGE": "এজেন্টের ইমেইল ইতিমধ্যে ব্যবহৃত, অনুগ্রহ করে অন্য ইমেইল ঠিকানা ব্যবহার করুন",
"ERROR_MESSAGE": "Woot Server-এ সংযোগ করা যায়নি, অনুগ্রহ করে পরে আবার চেষ্টা করুন"
}
},
"DELETE": {
"BUTTON_TEXT": "Delete",
"BUTTON_TEXT": "মুছে ফেলুন",
"API": {
"SUCCESS_MESSAGE": "Agent deleted successfully",
"ERROR_MESSAGE": "Could not connect to Woot Server, Please try again later"
"SUCCESS_MESSAGE": "এজেন্ট সফলভাবে মুছে ফেলা হয়েছে",
"ERROR_MESSAGE": "Woot Server-এ সংযোগ করা যায়নি, অনুগ্রহ করে পরে আবার চেষ্টা করুন"
},
"CONFIRM": {
"TITLE": "Confirm Deletion",
"MESSAGE": "Are you sure to delete ",
"YES": "Yes, Delete ",
"NO": "No, Keep "
"TITLE": "মুছে ফেলা নিশ্চিত করুন",
"MESSAGE": "আপনি কি নিশ্চিত যে মুছে ফেলতে চান ",
"YES": "হ্যাঁ, মুছে ফেলুন ",
"NO": "না, রাখুন "
}
},
"EDIT": {
"TITLE": "Edit agent",
"TITLE": "এজেন্ট সম্পাদনা করুন",
"FORM": {
"NAME": {
"LABEL": "Agent Name",
"PLACEHOLDER": "Please enter a name of the agent"
"LABEL": "এজেন্টের নাম",
"PLACEHOLDER": "এজেন্টের নাম লিখুন"
},
"AGENT_TYPE": {
"LABEL": "Role",
"PLACEHOLDER": "Please select a role",
"ERROR": "Role is required"
"LABEL": "ভূমিকা",
"PLACEHOLDER": "একটি ভূমিকা নির্বাচন করুন",
"ERROR": "ভূমিকা আবশ্যক"
},
"EMAIL": {
"LABEL": "Email Address",
"PLACEHOLDER": "Please enter an email address of the agent"
"LABEL": "ইমেইল ঠিকানা",
"PLACEHOLDER": "এজেন্টের ইমেইল ঠিকানা লিখুন"
},
"AGENT_AVAILABILITY": {
"LABEL": "Availability",
"PLACEHOLDER": "Please select an availability status",
"ERROR": "Availability is required"
"LABEL": "উপলব্ধতা",
"PLACEHOLDER": "একটি উপলব্ধতা অবস্থা নির্বাচন করুন",
"ERROR": "উপলব্ধতা আবশ্যক"
},
"SUBMIT": "Edit Agent"
"SUBMIT": "এজেন্ট সম্পাদনা করুন"
},
"BUTTON_TEXT": "Edit",
"CANCEL_BUTTON_TEXT": "Cancel",
"BUTTON_TEXT": "সম্পাদনা করুন",
"CANCEL_BUTTON_TEXT": "বাতিল করুন",
"API": {
"SUCCESS_MESSAGE": "Agent updated successfully",
"ERROR_MESSAGE": "Could not connect to Woot Server, Please try again later"
"SUCCESS_MESSAGE": "এজেন্ট সফলভাবে আপডেট হয়েছে",
"ERROR_MESSAGE": "Woot Server-এ সংযোগ করা যায়নি, অনুগ্রহ করে পরে আবার চেষ্টা করুন"
},
"PASSWORD_RESET": {
"ADMIN_RESET_BUTTON": "Reset Password",
"ADMIN_SUCCESS_MESSAGE": "An email with reset password instructions has been sent to the agent",
"SUCCESS_MESSAGE": "Agent password reset successfully",
"ERROR_MESSAGE": "Could not connect to Woot Server, Please try again later"
"ADMIN_RESET_BUTTON": "পাসওয়ার্ড রিসেট করুন",
"ADMIN_SUCCESS_MESSAGE": "পাসওয়ার্ড রিসেট নির্দেশনা সহ একটি ইমেইল এজেন্টকে পাঠানো হয়েছে",
"SUCCESS_MESSAGE": "এজেন্টের পাসওয়ার্ড সফলভাবে রিসেট হয়েছে",
"ERROR_MESSAGE": "Woot Server-এ সংযোগ করা যায়নি, অনুগ্রহ করে পরে আবার চেষ্টা করুন"
}
},
"SEARCH_PLACEHOLDER": "Search agents...",
"NO_RESULTS": "No agents found matching your search",
"SEARCH_PLACEHOLDER": "এজেন্ট অনুসন্ধান করুন...",
"NO_RESULTS": "আপনার অনুসন্ধানের সাথে মিলিত কোনো এজেন্ট পাওয়া যায়নি",
"SEARCH": {
"NO_RESULTS": "No results found."
"NO_RESULTS": "কোনো ফলাফল পাওয়া যায়নি।"
},
"MULTI_SELECTOR": {
"PLACEHOLDER": "None",
"PLACEHOLDER": "কিছুই নয়",
"TITLE": {
"AGENT": "Select agent",
"TEAM": "Select team"
"AGENT": "এজেন্ট নির্বাচন করুন",
"TEAM": "দল নির্বাচন করুন"
},
"LIST": {
"NONE": "None"
"NONE": "কিছুই নয়"
},
"SEARCH": {
"NO_RESULTS": {
"AGENT": "No agents found",
"TEAM": "No teams found"
"AGENT": "কোনো এজেন্ট পাওয়া যায়নি",
"TEAM": "কোনো দল পাওয়া যায়নি"
},
"PLACEHOLDER": {
"AGENT": "Search agents",
"TEAM": "Search teams",
"INPUT": "Search for agents"
"AGENT": "এজেন্ট অনুসন্ধান করুন",
"TEAM": "দল অনুসন্ধান করুন",
"INPUT": "এজেন্টদের জন্য অনুসন্ধান করুন"
}
}
}
@@ -1,22 +1,22 @@
{
"CONTACT_PANEL": {
"NOT_AVAILABLE": "Not Available",
"EMAIL_ADDRESS": "Email Address",
"PHONE_NUMBER": "Phone number",
"IDENTIFIER": "Identifier",
"COPY_SUCCESSFUL": "Copied to clipboard successfully",
"COMPANY": "Company",
"LOCATION": "Location",
"BROWSER_LANGUAGE": "Browser Language",
"CONVERSATION_TITLE": "Conversation Details",
"VIEW_PROFILE": "View Profile",
"BROWSER": "Browser",
"OS": "Operating System",
"INITIATED_FROM": "Initiated from",
"INITIATED_AT": "Initiated at",
"IP_ADDRESS": "IP Address",
"CREATED_AT_LABEL": "Created",
"NEW_MESSAGE": "New message",
"NOT_AVAILABLE": "উপলব্ধ নেই",
"EMAIL_ADDRESS": "ইমেইল ঠিকানা",
"PHONE_NUMBER": "ফোন নম্বর",
"IDENTIFIER": "পরিচিতি নম্বর",
"COPY_SUCCESSFUL": "ক্লিপবোর্ডে সফলভাবে কপি হয়েছে",
"COMPANY": "কোম্পানি",
"LOCATION": "অবস্থান",
"BROWSER_LANGUAGE": "ব্রাউজারের ভাষা",
"CONVERSATION_TITLE": "কথোপকথনের বিবরণ",
"VIEW_PROFILE": "প্রোফাইল দেখুন",
"BROWSER": "ব্রাউজার",
"OS": "অপারেটিং সিস্টেম",
"INITIATED_FROM": "শুরু করা হয়েছে",
"INITIATED_AT": "শুরু করার সময়",
"IP_ADDRESS": "আইপি ঠিকানা",
"CREATED_AT_LABEL": "তৈরি হয়েছে",
"NEW_MESSAGE": "নতুন বার্তা",
"CALL": "Call",
"CALL_INITIATED": "Calling the contact…",
"CALL_FAILED": "Unable to start the call. Please try again.",
@@ -24,353 +24,353 @@
"TITLE": "Choose a voice inbox"
},
"CONVERSATIONS": {
"NO_RECORDS_FOUND": "There are no previous conversations associated to this contact.",
"TITLE": "Previous Conversations"
"NO_RECORDS_FOUND": "এই কন্টাক্টের সাথে পূর্বের কোনো আলাপ নেই।",
"TITLE": "পূর্বের আলাপ"
},
"LABELS": {
"CONTACT": {
"TITLE": "Contact Labels",
"ERROR": "Couldn't update labels"
"TITLE": "যোগাযোগ লেবেল",
"ERROR": "লেবেল আপডেট করা যায়নি"
},
"CONVERSATION": {
"TITLE": "Conversation Labels",
"ADD_BUTTON": "Add Labels"
"TITLE": "কথোপকথনের লেবেল",
"ADD_BUTTON": "লেবেল যোগ করুন"
},
"LABEL_SELECT": {
"TITLE": "Add Labels",
"PLACEHOLDER": "Search labels",
"NO_RESULT": "No labels found",
"CREATE_LABEL": "Create new label"
"TITLE": "লেবেল যোগ করুন",
"PLACEHOLDER": "লেবেল অনুসন্ধান করুন",
"NO_RESULT": "কোন লেবেল পাওয়া যায়নি",
"CREATE_LABEL": "নতুন লেবেল তৈরি করুন"
}
},
"MERGE_CONTACT": "Merge contact",
"CONTACT_ACTIONS": "Contact actions",
"MUTE_CONTACT": "Block Contact",
"UNMUTE_CONTACT": "Unblock Contact",
"MUTED_SUCCESS": "This contact is blocked successfully. You will not be notified of any future conversations.",
"UNMUTED_SUCCESS": "This contact is unblocked successfully.",
"SEND_TRANSCRIPT": "Send Transcript",
"EDIT_LABEL": "Edit",
"MERGE_CONTACT": "যোগাযোগ একত্রিত করুন",
"CONTACT_ACTIONS": "যোগাযোগের কার্যক্রম",
"MUTE_CONTACT": "কন্টাক্ট ব্লক করুন",
"UNMUTE_CONTACT": "কন্টাক্ট আনব্লক করুন",
"MUTED_SUCCESS": "এই কন্টাক্ট সফলভাবে ব্লক করা হয়েছে। ভবিষ্যতে কোনো কথোপকথনের জন্য আপনাকে আর জানানো হবে না।",
"UNMUTED_SUCCESS": "এই কন্টাক্টের ব্লক সফলভাবে সরানো হয়েছে.",
"SEND_TRANSCRIPT": "ট্রান্সক্রিপ্ট পাঠান",
"EDIT_LABEL": "সম্পাদনা করুন",
"SIDEBAR_SECTIONS": {
"CUSTOM_ATTRIBUTES": "Custom Attributes",
"CONTACT_LABELS": "Contact Labels",
"PREVIOUS_CONVERSATIONS": "Previous Conversations",
"NO_RECORDS_FOUND": "No attributes found"
"CUSTOM_ATTRIBUTES": "কাস্টম অ্যাট্রিবিউট",
"CONTACT_LABELS": "যোগাযোগের লেবেলসমূহ",
"PREVIOUS_CONVERSATIONS": "পূর্ববর্তী কথোপকথনসমূহ",
"NO_RECORDS_FOUND": "কোনো অ্যাট্রিবিউট পাওয়া যায়নি"
}
},
"EDIT_CONTACT": {
"BUTTON_LABEL": "Edit Contact",
"TITLE": "Edit contact",
"DESC": "Edit contact details"
"BUTTON_LABEL": "যোগাযোগ সম্পাদনা করুন",
"TITLE": "যোগাযোগ সম্পাদনা করুন",
"DESC": "যোগাযোগের বিস্তারিত সম্পাদনা করুন"
},
"DELETE_CONTACT": {
"BUTTON_LABEL": "Delete Contact",
"TITLE": "Delete contact",
"DESC": "Delete contact details",
"BUTTON_LABEL": "যোগাযোগ মুছুন",
"TITLE": "যোগাযোগ মুছুন",
"DESC": "যোগাযোগের বিবরণ মুছে ফেলুন",
"CONFIRM": {
"TITLE": "Confirm Deletion",
"MESSAGE": "Are you sure to delete ",
"YES": "Yes, Delete",
"NO": "No, Keep"
"TITLE": "মুছে ফেলা নিশ্চিত করুন",
"MESSAGE": "আপনি কি নিশ্চিত যে মুছে ফেলতে চান ",
"YES": "হ্যাঁ, মুছে ফেলুন",
"NO": "না, রাখুন"
},
"API": {
"SUCCESS_MESSAGE": "Contact deleted successfully",
"ERROR_MESSAGE": "Could not delete contact. Please try again later."
"SUCCESS_MESSAGE": "যোগাযোগ সফলভাবে মুছে ফেলা হয়েছে",
"ERROR_MESSAGE": "যোগাযোগ মুছে ফেলা যায়নি। অনুগ্রহ করে পরে আবার চেষ্টা করুন।."
}
},
"CONTACT_FORM": {
"FORM": {
"SUBMIT": "Submit",
"CANCEL": "Cancel",
"SUBMIT": "জমা দিন",
"CANCEL": "বাতিল করুন",
"AVATAR": {
"LABEL": "Contact Avatar"
"LABEL": "যোগাযোগের অ্যাভাটার"
},
"NAME": {
"PLACEHOLDER": "Enter the full name of the contact",
"LABEL": "Full Name"
"PLACEHOLDER": "যোগাযোগের পূর্ণ নাম লিখুন",
"LABEL": "পূর্ণ নাম"
},
"BIO": {
"PLACEHOLDER": "Enter the bio of the contact",
"LABEL": "Bio"
"PLACEHOLDER": "যোগাযোগের জীবনী লিখুন",
"LABEL": "জীবনবৃত্তান্ত"
},
"EMAIL_ADDRESS": {
"PLACEHOLDER": "Enter the email address of the contact",
"LABEL": "Email Address",
"DUPLICATE": "This email address is in use for another contact.",
"ERROR": "Please enter a valid email address."
"PLACEHOLDER": "যোগাযোগের ইমেইল ঠিকানা লিখুন",
"LABEL": "ইমেইল ঠিকানা",
"DUPLICATE": "এই ইমেল ঠিকানাটি অন্য একটি যোগাযোগের জন্য ব্যবহৃত হচ্ছে।.",
"ERROR": "একটি বৈধ ইমেল ঠিকানা লিখুন।."
},
"PHONE_NUMBER": {
"PLACEHOLDER": "Enter the phone number of the contact",
"LABEL": "Phone Number",
"HELP": "Phone number should be of E.164 format eg: +1415555555 [+][country code][area code][local phone number]. You can select the dial code from the dropdown.",
"ERROR": "Phone number should be either empty or of E.164 format",
"DIAL_CODE_ERROR": "Please select a dial code from the list",
"DUPLICATE": "This phone number is in use for another contact."
"PLACEHOLDER": "যোগাযোগের ফোন নম্বর লিখুন",
"LABEL": "ফোন নম্বর",
"HELP": "ফোন নম্বরটি অবশ্যই E.164 ফরম্যাটে হতে হবে যেমন: +1415555555 [+][দেশের কোড][এরিয়া কোড][স্থানীয় ফোন নম্বর]. আপনি ড্রপডাউন থেকে ডায়াল কোড নির্বাচন করতে পারেন.",
"ERROR": "ফোন নম্বরটি খালি অথবা E.164 ফরম্যাটে হতে হবে",
"DIAL_CODE_ERROR": "অনুগ্রহ করে তালিকা থেকে একটি ডায়াল কোড নির্বাচন করুন",
"DUPLICATE": "এই ফোন নম্বরটি অন্য একটি যোগাযোগের জন্য ব্যবহৃত হচ্ছে।."
},
"LOCATION": {
"PLACEHOLDER": "Enter the location of the contact",
"LABEL": "Location"
"PLACEHOLDER": "যোগাযোগের অবস্থান লিখুন",
"LABEL": "অবস্থান"
},
"COMPANY_NAME": {
"PLACEHOLDER": "Enter the company name",
"LABEL": "Company Name"
"PLACEHOLDER": "কোম্পানির নাম লিখুন",
"LABEL": "কোম্পানির নাম"
},
"COUNTRY": {
"PLACEHOLDER": "Enter the country name",
"LABEL": "Country Name",
"SELECT_PLACEHOLDER": "Select",
"REMOVE": "Remove",
"SELECT_COUNTRY": "Select Country"
"PLACEHOLDER": "দেশের নাম লিখুন",
"LABEL": "দেশের নাম",
"SELECT_PLACEHOLDER": "নির্বাচন করুন",
"REMOVE": "অপসারণ করুন",
"SELECT_COUNTRY": "দেশ নির্বাচন করুন"
},
"CITY": {
"PLACEHOLDER": "Enter the city name",
"LABEL": "City Name"
"PLACEHOLDER": "শহরের নাম লিখুন",
"LABEL": "শহরের নাম"
},
"SOCIAL_PROFILES": {
"FACEBOOK": {
"PLACEHOLDER": "Enter the Facebook username",
"PLACEHOLDER": "Facebook ব্যবহারকারীর নাম লিখুন",
"LABEL": "Facebook"
},
"TWITTER": {
"PLACEHOLDER": "Enter the Twitter username",
"PLACEHOLDER": "Twitter ব্যবহারকারীর নাম লিখুন",
"LABEL": "Twitter"
},
"LINKEDIN": {
"PLACEHOLDER": "Enter the LinkedIn username",
"PLACEHOLDER": "LinkedIn ব্যবহারকারীর নাম লিখুন",
"LABEL": "LinkedIn"
},
"GITHUB": {
"PLACEHOLDER": "Enter the Github username",
"PLACEHOLDER": "Github ব্যবহারকারীর নাম লিখুন",
"LABEL": "Github"
}
}
},
"DELETE_AVATAR": {
"API": {
"SUCCESS_MESSAGE": "Contact avatar deleted successfully",
"ERROR_MESSAGE": "Could not delete the contact avatar. Please try again later."
"SUCCESS_MESSAGE": "যোগাযোগের অবতার সফলভাবে মুছে ফেলা হয়েছে",
"ERROR_MESSAGE": "যোগাযোগের অবতার মুছে ফেলা যায়নি। অনুগ্রহ করে পরে আবার চেষ্টা করুন।."
}
},
"SUCCESS_MESSAGE": "Contact saved successfully",
"ERROR_MESSAGE": "There was an error, please try again"
"SUCCESS_MESSAGE": "যোগাযোগ সফলভাবে সংরক্ষণ করা হয়েছে",
"ERROR_MESSAGE": "একটি ত্রুটি হয়েছে, অনুগ্রহ করে আবার চেষ্টা করুন"
},
"NEW_CONVERSATION": {
"BUTTON_LABEL": "Start conversation",
"TITLE": "New conversation",
"DESC": "Start a new conversation by sending a new message.",
"NO_INBOX": "Couldn't find an inbox to initiate a new conversation with this contact.",
"BUTTON_LABEL": "আলাপ শুরু করুন",
"TITLE": "নতুন আলাপ",
"DESC": "নতুন বার্তা পাঠিয়ে একটি নতুন কথোপকথন শুরু করুন।",
"NO_INBOX": "এই যোগাযোগের সাথে একটি নতুন কথোপকথন শুরু করার জন্য কোনো ইনবক্স পাওয়া যায়নি।",
"FORM": {
"TO": {
"LABEL": "To"
"LABEL": "প্রাপক"
},
"INBOX": {
"LABEL": "Via Inbox",
"PLACEHOLDER": "Choose source inbox",
"ERROR": "Select an inbox"
"LABEL": "ইনবক্সের মাধ্যমে",
"PLACEHOLDER": "উৎস ইনবক্স নির্বাচন করুন",
"ERROR": "একটি ইনবক্স নির্বাচন করুন"
},
"SUBJECT": {
"LABEL": "Subject",
"PLACEHOLDER": "Subject",
"ERROR": "Subject can't be empty"
"LABEL": "বিষয়",
"PLACEHOLDER": "বিষয়",
"ERROR": "বিষয় খালি রাখা যাবে না"
},
"MESSAGE": {
"LABEL": "Message",
"PLACEHOLDER": "Write your message here",
"ERROR": "Message can't be empty"
"LABEL": "বার্তা",
"PLACEHOLDER": "এখানে আপনার বার্তা লিখুন",
"ERROR": "বার্তাটি খালি রাখা যাবে না"
},
"ATTACHMENTS": {
"SELECT": "Choose files",
"HELP_TEXT": "Drag and drop files here or choose files to attach"
"SELECT": "ফাইল নির্বাচন করুন",
"HELP_TEXT": "এখানে ফাইল টেনে আনুন অথবা সংযুক্ত করার জন্য ফাইল নির্বাচন করুন"
},
"SUBMIT": "Send message",
"CANCEL": "Cancel",
"SUCCESS_MESSAGE": "Message sent!",
"GO_TO_CONVERSATION": "View",
"ERROR_MESSAGE": "Couldn't send! try again"
"SUBMIT": "বার্তা পাঠান",
"CANCEL": "বাতিল করুন",
"SUCCESS_MESSAGE": "বার্তা পাঠানো হয়েছে!",
"GO_TO_CONVERSATION": "দেখুন",
"ERROR_MESSAGE": "পাঠানো যায়নি! আবার চেষ্টা করুন"
}
},
"CONTACTS_PAGE": {
"LIST": {
"TABLE_HEADER": {
"SOCIAL_PROFILES": "Social Profiles"
"SOCIAL_PROFILES": "সামাজিক প্রোফাইল"
}
}
},
"CUSTOM_ATTRIBUTES": {
"BUTTON": "Add custom attribute",
"COPY_SUCCESSFUL": "Copied to clipboard successfully",
"SHOW_MORE": "Show all attributes",
"SHOW_LESS": "Show less attributes",
"BUTTON": "কাস্টম অ্যাট্রিবিউট যোগ করুন",
"COPY_SUCCESSFUL": "ক্লিপবোর্ডে সফলভাবে কপি হয়েছে",
"SHOW_MORE": "সব অ্যাট্রিবিউট দেখান",
"SHOW_LESS": "কম অ্যাট্রিবিউট দেখান",
"ACTIONS": {
"COPY": "Copy attribute",
"DELETE": "Delete attribute",
"EDIT": "Edit attribute"
"COPY": "অ্যাট্রিবিউট কপি করুন",
"DELETE": "অ্যাট্রিবিউট মুছুন",
"EDIT": "অ্যাট্রিবিউট সম্পাদনা করুন"
},
"ADD": {
"TITLE": "Create custom attribute",
"DESC": "Add custom information to this contact."
"TITLE": "কাস্টম অ্যাট্রিবিউট তৈরি করুন",
"DESC": "এই যোগাযোগে কাস্টম তথ্য যোগ করুন।."
},
"FORM": {
"CREATE": "Add attribute",
"CANCEL": "Cancel",
"CREATE": "অ্যাট্রিবিউট যোগ করুন",
"CANCEL": "বাতিল করুন",
"NAME": {
"LABEL": "Custom attribute name",
"PLACEHOLDER": "Eg: shopify id",
"ERROR": "Invalid custom attribute name"
"LABEL": "কাস্টম অ্যাট্রিবিউটের নাম",
"PLACEHOLDER": "উদাহরণ: shopify id",
"ERROR": "অবৈধ কাস্টম অ্যাট্রিবিউট নাম"
},
"VALUE": {
"LABEL": "Attribute value",
"PLACEHOLDER": "Eg: 11901 "
"LABEL": "অ্যাট্রিবিউটের মান",
"PLACEHOLDER": "উদাহরণ: 11901 "
},
"ADD": {
"TITLE": "Create new attribute ",
"SUCCESS": "Attribute added successfully",
"ERROR": "Unable to add attribute. Please try again later"
"TITLE": "নতুন অ্যাট্রিবিউট তৈরি করুন ",
"SUCCESS": "অ্যাট্রিবিউট সফলভাবে যোগ করা হয়েছে",
"ERROR": "অ্যাট্রিবিউট যোগ করা সম্ভব হয়নি। অনুগ্রহ করে পরে আবার চেষ্টা করুন"
},
"UPDATE": {
"SUCCESS": "Attribute updated successfully",
"ERROR": "Unable to update attribute. Please try again later"
"SUCCESS": "অ্যাট্রিবিউট সফলভাবে আপডেট হয়েছে",
"ERROR": "অ্যাট্রিবিউট আপডেট করা সম্ভব হয়নি। অনুগ্রহ করে পরে আবার চেষ্টা করুন"
},
"DELETE": {
"SUCCESS": "Attribute deleted successfully",
"ERROR": "Unable to delete attribute. Please try again later"
"SUCCESS": "অ্যাট্রিবিউট সফলভাবে মুছে ফেলা হয়েছে",
"ERROR": "অ্যাট্রিবিউট মুছে ফেলা যায়নি। অনুগ্রহ করে পরে আবার চেষ্টা করুন"
},
"ATTRIBUTE_SELECT": {
"TITLE": "Add attributes",
"PLACEHOLDER": "Search attributes",
"NO_RESULT": "No attributes found"
"TITLE": "অ্যাট্রিবিউট যোগ করুন",
"PLACEHOLDER": "অ্যাট্রিবিউট অনুসন্ধান করুন",
"NO_RESULT": "কোনো অ্যাট্রিবিউট পাওয়া যায়নি"
},
"ATTRIBUTE_TYPE": {
"LIST": {
"PLACEHOLDER": "Select value",
"SEARCH_INPUT_PLACEHOLDER": "Search value",
"NO_RESULT": "No result found"
"PLACEHOLDER": "মান নির্বাচন করুন",
"SEARCH_INPUT_PLACEHOLDER": "মান অনুসন্ধান করুন",
"NO_RESULT": "কোন ফলাফল পাওয়া যায়নি"
}
}
},
"VALIDATIONS": {
"REQUIRED": "Valid value is required",
"INVALID_URL": "Invalid URL",
"INVALID_INPUT": "Invalid Input"
"REQUIRED": "বৈধ মান আবশ্যক",
"INVALID_URL": "অবৈধ URL",
"INVALID_INPUT": "অবৈধ ইনপুট"
}
},
"MERGE_CONTACTS": {
"TITLE": "Merge contacts",
"DESCRIPTION": "Merge contacts to combine two profiles into one, including all attributes and conversations. In case of conflict, the Primary contacts attributes will take precedence.",
"TITLE": "যোগাযোগ একত্রিত করুন",
"DESCRIPTION": "দুটি প্রোফাইল একত্রিত করতে কন্টাক্ট মার্জ করুন, এতে সব অ্যাট্রিবিউট ও কথোপকথন একত্রিত হবে। কোনো দ্বন্দ্ব হলে, প্রাইমারি কন্টাক্টের অ্যাট্রিবিউট অগ্রাধিকার পাবে।.",
"PRIMARY": {
"TITLE": "Primary contact",
"HELP_LABEL": "To be deleted"
"TITLE": "প্রাথমিক যোগাযোগ",
"HELP_LABEL": "মুছে ফেলা হবে"
},
"PARENT": {
"TITLE": "Contact to merge",
"PLACEHOLDER": "Search for a contact",
"HELP_LABEL": "To be kept"
"TITLE": "যে কন্টাক্ট মার্জ করা হবে",
"PLACEHOLDER": "একটি যোগাযোগ খুঁজুন",
"HELP_LABEL": "রাখা হবে"
},
"SUMMARY": {
"TITLE": "Summary",
"DELETE_WARNING": "Contact of <strong>{primaryContactName}</strong> will be deleted.",
"ATTRIBUTE_WARNING": "Contact details of <strong>{primaryContactName}</strong> will be copied to <strong>{parentContactName}</strong>."
"TITLE": "সারাংশ",
"DELETE_WARNING": "<strong>{primaryContactName}</strong> এর কন্টাক্ট মুছে ফেলা হবে.",
"ATTRIBUTE_WARNING": "<strong>{primaryContactName}</strong> এর কন্টাক্টের বিস্তারিত <strong>{parentContactName}</strong> এ কপি করা হবে."
},
"SEARCH": {
"ERROR_MESSAGE": "Something went wrong. Please try again later."
},
"FORM": {
"SUBMIT": " Merge contacts",
"CANCEL": "Cancel",
"SUBMIT": " যোগাযোগসমূহ একত্রিত করুন",
"CANCEL": "বাতিল করুন",
"CHILD_CONTACT": {
"ERROR": "Select a child contact to merge"
"ERROR": "একত্রিত করার জন্য একটি চাইল্ড কন্টাক্ট নির্বাচন করুন"
},
"SUCCESS_MESSAGE": "Contact merged successfully",
"ERROR_MESSAGE": "Could not merge contacts, try again!"
"SUCCESS_MESSAGE": "যোগাযোগ সফলভাবে একত্রিত হয়েছে",
"ERROR_MESSAGE": "যোগাযোগগুলো একত্রিত করা যায়নি, আবার চেষ্টা করুন!"
},
"DROPDOWN_ITEM": {
"ID": "(ID: {identifier})"
"ID": "(আইডি: {identifier})"
}
},
"CONTACTS_LAYOUT": {
"HEADER": {
"TITLE": "Contacts",
"SEARCH_TITLE": "Search contacts",
"TITLE": "যোগাযোগসমূহ",
"SEARCH_TITLE": "যোগাযোগ অনুসন্ধান করুন",
"ACTIVE_TITLE": "Active contacts",
"SEARCH_PLACEHOLDER": "Search...",
"MESSAGE_BUTTON": "Message",
"SEARCH_PLACEHOLDER": "অনুসন্ধান করুন...",
"MESSAGE_BUTTON": "বার্তা পাঠান",
"SEND_MESSAGE": "Send message",
"BLOCK_CONTACT": "Block contact",
"UNBLOCK_CONTACT": "Unblock contact",
"BREADCRUMB": {
"CONTACTS": "Contacts"
"CONTACTS": "যোগাযোগসমূহ"
},
"ACTIONS": {
"CONTACT_CREATION": {
"ADD_CONTACT": "Add contact",
"EXPORT_CONTACT": "Export contacts",
"IMPORT_CONTACT": "Import contacts",
"SAVE_CONTACT": "Save contact",
"EMAIL_ADDRESS_DUPLICATE": "This email address is in use for another contact.",
"PHONE_NUMBER_DUPLICATE": "This phone number is in use for another contact.",
"SUCCESS_MESSAGE": "Contact saved successfully",
"ERROR_MESSAGE": "Unable to save contact. Please try again later."
"ADD_CONTACT": "যোগাযোগ যুক্ত করুন",
"EXPORT_CONTACT": "যোগাযোগসমূহ রপ্তানি করুন",
"IMPORT_CONTACT": "কন্টাক্ট আমদানি করুন",
"SAVE_CONTACT": "যোগাযোগ সংরক্ষণ করুন",
"EMAIL_ADDRESS_DUPLICATE": "এই ইমেইল ঠিকানাটি অন্য একটি যোগাযোগের জন্য ব্যবহৃত হচ্ছে।",
"PHONE_NUMBER_DUPLICATE": "এই ফোন নম্বরটি অন্য একটি যোগাযোগের জন্য ব্যবহৃত হচ্ছে।",
"SUCCESS_MESSAGE": "যোগাযোগ সফলভাবে সংরক্ষণ করা হয়েছে",
"ERROR_MESSAGE": "যোগাযোগ সংরক্ষণ করা যায়নি। অনুগ্রহ করে পরে আবার চেষ্টা করুন।"
},
"BLOCK_SUCCESS_MESSAGE": "This contact is blocked successfully",
"BLOCK_ERROR_MESSAGE": "Unable to block contact. Please try again later.",
"UNBLOCK_SUCCESS_MESSAGE": "This contact is unblocked successfully",
"UNBLOCK_ERROR_MESSAGE": "Unable to unblock contact. Please try again later.",
"IMPORT_CONTACT": {
"TITLE": "Import contacts",
"DESCRIPTION": "Import contacts through a CSV file.",
"DOWNLOAD_LABEL": "Download a sample csv.",
"LABEL": "CSV File:",
"CHOOSE_FILE": "Choose file",
"CHANGE": "Change",
"CANCEL": "Cancel",
"IMPORT": "Import",
"SUCCESS_MESSAGE": "You will be notified via email when the import is complete.",
"ERROR_MESSAGE": "There was an error, please try again"
"TITLE": "কন্টাক্ট আমদানি করুন",
"DESCRIPTION": "CSV ফাইলের মাধ্যমে কন্টাক্ট আমদানি করুন.",
"DOWNLOAD_LABEL": "একটি নমুনা CSV ডাউনলোড করুন.",
"LABEL": "CSV ফাইল:",
"CHOOSE_FILE": "ফাইল নির্বাচন করুন",
"CHANGE": "পরিবর্তন করুন",
"CANCEL": "বাতিল করুন",
"IMPORT": "আমদানি করুন",
"SUCCESS_MESSAGE": "আমদানি সম্পন্ন হলে আপনাকে ইমেইলে জানানো হবে.",
"ERROR_MESSAGE": "একটি সমস্যা হয়েছে, অনুগ্রহ করে আবার চেষ্টা করুন"
},
"EXPORT_CONTACT": {
"TITLE": "Export contacts",
"DESCRIPTION": "Quickly export a csv file with comprehensive details of your contacts",
"CONFIRM": "Export",
"SUCCESS_MESSAGE": "Export is in progress. You will be notified on email when the export file is ready to download.",
"ERROR_MESSAGE": "There was an error, please try again"
"TITLE": "যোগাযোগসমূহ রপ্তানি করুন",
"DESCRIPTION": "আপনার পরিচিতিগুলোর বিস্তারিত তথ্যসহ দ্রুত একটি csv ফাইল রপ্তানি করুন",
"CONFIRM": "রপ্তানি করুন",
"SUCCESS_MESSAGE": "রপ্তানি চলছে. ডাউনলোডের জন্য ফাইল প্রস্তুত হলে আপনাকে ইমেইলে জানানো হবে.",
"ERROR_MESSAGE": "একটি ত্রুটি হয়েছে, অনুগ্রহ করে আবার চেষ্টা করুন"
},
"SORT_BY": {
"LABEL": "Sort by",
"LABEL": "সাজান",
"OPTIONS": {
"NAME": "Name",
"EMAIL": "Email",
"PHONE_NUMBER": "Phone number",
"COMPANY": "Company",
"COUNTRY": "Country",
"CITY": "City",
"LAST_ACTIVITY": "Last activity",
"CREATED_AT": "Created at"
"NAME": "নাম",
"EMAIL": "ইমেইল",
"PHONE_NUMBER": "ফোন নম্বর",
"COMPANY": "কোম্পানি",
"COUNTRY": "দেশ",
"CITY": "শহর",
"LAST_ACTIVITY": "সর্বশেষ কার্যকলাপ",
"CREATED_AT": "তৈরি হয়েছে"
}
},
"ORDER": {
"LABEL": "Ordering",
"LABEL": "অর্ডারিং",
"OPTIONS": {
"ASCENDING": "Ascending",
"DESCENDING": "Descending"
"ASCENDING": "আরোহী",
"DESCENDING": "নিম্নক্রমে"
}
},
"FILTERS": {
"CREATE_SEGMENT": {
"TITLE": "Do you want to save this filter?",
"CONFIRM": "Save filter",
"LABEL": "Name",
"PLACEHOLDER": "Enter the name of the filter",
"ERROR": "Enter a valid name",
"SUCCESS_MESSAGE": "Filter saved successfully",
"ERROR_MESSAGE": "Unable to save filter. Please try again later."
"TITLE": "আপনি কি এই ফিল্টারটি সংরক্ষণ করতে চান?",
"CONFIRM": "ফিল্টার সংরক্ষণ করুন",
"LABEL": "নাম",
"PLACEHOLDER": "ফিল্টারের নাম লিখুন",
"ERROR": "একটি বৈধ নাম লিখুন",
"SUCCESS_MESSAGE": "ফিল্টার সফলভাবে সংরক্ষণ করা হয়েছে",
"ERROR_MESSAGE": "ফিল্টার সংরক্ষণ করা যায়নি। অনুগ্রহ করে পরে আবার চেষ্টা করুন।."
},
"DELETE_SEGMENT": {
"TITLE": "Confirm Deletion",
"DESCRIPTION": "Are you sure you want to delete this filter?",
"CONFIRM": "Yes, Delete",
"CANCEL": "No, Cancel",
"SUCCESS_MESSAGE": "Filter deleted successfully",
"ERROR_MESSAGE": "Unable to delete filter. Please try again later."
"TITLE": "মুছে ফেলার নিশ্চয়তা দিন",
"DESCRIPTION": "আপনি কি নিশ্চিত যে আপনি এই ফিল্টারটি মুছে ফেলতে চান?",
"CONFIRM": "হ্যাঁ, মুছে ফেলুন",
"CANCEL": "না, বাতিল করুন",
"SUCCESS_MESSAGE": "ফিল্টার সফলভাবে মুছে ফেলা হয়েছে",
"ERROR_MESSAGE": "ফিল্টার মুছে ফেলা যায়নি। অনুগ্রহ করে পরে আবার চেষ্টা করুন।."
}
}
}
@@ -379,83 +379,83 @@
"SHOWING": "Showing {startItem} - {endItem} of {totalItems} contacts"
},
"FILTER": {
"NAME": "Name",
"EMAIL": "Email",
"PHONE_NUMBER": "Phone number",
"IDENTIFIER": "Identifier",
"COUNTRY": "Country",
"CITY": "City",
"CREATED_AT": "Created at",
"LAST_ACTIVITY": "Last activity",
"REFERER_LINK": "Referer link",
"BLOCKED": "Blocked",
"BLOCKED_TRUE": "True",
"BLOCKED_FALSE": "False",
"NAME": "নাম",
"EMAIL": "ইমেইল",
"PHONE_NUMBER": "ফোন নম্বর",
"IDENTIFIER": "আইডেন্টিফায়ার",
"COUNTRY": "দেশ",
"CITY": "শহর",
"CREATED_AT": "তৈরি হয়েছে",
"LAST_ACTIVITY": "সর্বশেষ কার্যকলাপ",
"REFERER_LINK": "রেফারার লিঙ্ক",
"BLOCKED": "ব্লক করা হয়েছে",
"BLOCKED_TRUE": "সত্য",
"BLOCKED_FALSE": "ফলস",
"BUTTONS": {
"CLEAR_FILTERS": "Clear filters",
"UPDATE_SEGMENT": "Update segment",
"APPLY_FILTERS": "Apply filters",
"ADD_FILTER": "Add filter"
"CLEAR_FILTERS": "ফিল্টার মুছুন",
"UPDATE_SEGMENT": "সেগমেন্ট আপডেট করুন",
"APPLY_FILTERS": "ফিল্টারগুলি প্রয়োগ করুন",
"ADD_FILTER": "ফিল্টার যোগ করুন"
},
"TITLE": "Filter contacts",
"EDIT_SEGMENT": "Edit segment",
"TITLE": "যোগাযোগ ফিল্টার করুন",
"EDIT_SEGMENT": "সেগমেন্ট সম্পাদনা করুন",
"SEGMENT": {
"LABEL": "Segment name",
"INPUT_PLACEHOLDER": "Enter the name of the segment"
"LABEL": "সেগমেন্টের নাম",
"INPUT_PLACEHOLDER": "সেগমেন্টের নাম লিখুন"
},
"ACTIVE_FILTERS": {
"MORE_FILTERS": "+ {count} more filters",
"CLEAR_FILTERS": "Clear filters"
"MORE_FILTERS": "+ {count} টি আরও ফিল্টার",
"CLEAR_FILTERS": "ফিল্টারগুলি মুছে ফেলুন"
}
},
"CARD": {
"OF": "of",
"VIEW_DETAILS": "View details",
"OF": "এর",
"VIEW_DETAILS": "বিস্তারিত দেখুন",
"EDIT_DETAILS_FORM": {
"TITLE": "Edit contact details",
"TITLE": "কন্টাক্টের বিস্তারিত সম্পাদনা করুন",
"FORM": {
"FIRST_NAME": {
"PLACEHOLDER": "Enter the first name"
"PLACEHOLDER": "প্রথম নাম লিখুন"
},
"LAST_NAME": {
"PLACEHOLDER": "Enter the last name"
"PLACEHOLDER": "শেষ নাম লিখুন"
},
"EMAIL_ADDRESS": {
"PLACEHOLDER": "Enter the email address",
"DUPLICATE": "This email address is in use for another contact."
"PLACEHOLDER": "ইমেইল ঠিকানা লিখুন",
"DUPLICATE": "এই ইমেইল ঠিকানাটি অন্য একটি যোগাযোগের জন্য ব্যবহৃত হচ্ছে।."
},
"PHONE_NUMBER": {
"PLACEHOLDER": "Enter the phone number",
"DUPLICATE": "This phone number is in use for another contact."
"PLACEHOLDER": "ফোন নম্বর লিখুন",
"DUPLICATE": "এই ফোন নম্বরটি অন্য একটি যোগাযোগের জন্য ব্যবহৃত হচ্ছে।."
},
"CITY": {
"PLACEHOLDER": "Enter the city name"
"PLACEHOLDER": "শহরের নাম লিখুন"
},
"COUNTRY": {
"PLACEHOLDER": "Select country"
"PLACEHOLDER": "দেশ নির্বাচন করুন"
},
"BIO": {
"PLACEHOLDER": "Enter the bio"
"PLACEHOLDER": "জীবনবৃত্তান্ত লিখুন"
},
"COMPANY_NAME": {
"PLACEHOLDER": "Enter the company name"
"PLACEHOLDER": "কোম্পানির নাম লিখুন"
}
},
"UPDATE_BUTTON": "Update contact",
"SUCCESS_MESSAGE": "Contact updated successfully",
"ERROR_MESSAGE": "Unable to update contact. Please try again later."
"UPDATE_BUTTON": "যোগাযোগ আপডেট করুন",
"SUCCESS_MESSAGE": "যোগাযোগ সফলভাবে আপডেট হয়েছে",
"ERROR_MESSAGE": "যোগাযোগ আপডেট করা যাচ্ছে না। অনুগ্রহ করে পরে আবার চেষ্টা করুন।."
},
"SOCIAL_MEDIA": {
"TITLE": "Edit social links",
"TITLE": "সামাজিক লিঙ্ক সম্পাদনা করুন",
"FORM": {
"FACEBOOK": {
"PLACEHOLDER": "Add Facebook"
"PLACEHOLDER": "Facebook যোগ করুন"
},
"GITHUB": {
"PLACEHOLDER": "Add Github"
"PLACEHOLDER": "Github যোগ করুন"
},
"INSTAGRAM": {
"PLACEHOLDER": "Add Instagram"
"PLACEHOLDER": "Instagram যোগ করুন"
},
"TELEGRAM": {
"PLACEHOLDER": "Add Telegram"
@@ -464,10 +464,10 @@
"PLACEHOLDER": "Add TikTok"
},
"LINKEDIN": {
"PLACEHOLDER": "Add LinkedIn"
"PLACEHOLDER": "LinkedIn যোগ করুন"
},
"TWITTER": {
"PLACEHOLDER": "Add Twitter"
"PLACEHOLDER": "Twitter যোগ করুন"
}
}
},
@@ -477,34 +477,34 @@
}
},
"DETAILS": {
"CREATED_AT": "Created {date}",
"LAST_ACTIVITY": "Last active {date}",
"DELETE_CONTACT_DESCRIPTION": "Permanently delete this contact. This action is irreversible",
"DELETE_CONTACT": "Delete contact",
"CREATED_AT": "তৈরি হয়েছে {date}",
"LAST_ACTIVITY": "সর্বশেষ সক্রিয় {date}",
"DELETE_CONTACT_DESCRIPTION": "এই যোগাযোগ স্থায়ীভাবে মুছে ফেলুন। এই ক্রিয়াটি অপরিবর্তনীয়।",
"DELETE_CONTACT": "যোগাযোগ মুছুন",
"DELETE_DIALOG": {
"TITLE": "Confirm Deletion",
"DESCRIPTION": "Are you sure you want to delete this contact?",
"CONFIRM": "Yes, Delete",
"TITLE": "মুছে ফেলার নিশ্চিতকরণ",
"DESCRIPTION": "আপনি কি নিশ্চিত যে আপনি এই যোগাযোগটি মুছে ফেলতে চান?",
"CONFIRM": "হ্যাঁ, মুছে ফেলুন",
"API": {
"SUCCESS_MESSAGE": "Contact deleted successfully",
"ERROR_MESSAGE": "Could not delete contact. Please try again later."
"SUCCESS_MESSAGE": "যোগাযোগ সফলভাবে মুছে ফেলা হয়েছে",
"ERROR_MESSAGE": "যোগাযোগ মুছে ফেলা যায়নি। অনুগ্রহ করে পরে আবার চেষ্টা করুন।"
}
},
"AVATAR": {
"UPLOAD": {
"ERROR_MESSAGE": "Could not upload avatar. Please try again later.",
"SUCCESS_MESSAGE": "Avatar uploaded successfully"
"ERROR_MESSAGE": "অবতার আপলোড করা যায়নি। অনুগ্রহ করে পরে আবার চেষ্টা করুন।",
"SUCCESS_MESSAGE": "অবতার সফলভাবে আপলোড হয়েছে"
},
"DELETE": {
"SUCCESS_MESSAGE": "Avatar deleted successfully",
"ERROR_MESSAGE": "Could not delete avatar. Please try again later."
"SUCCESS_MESSAGE": "অবতার সফলভাবে মুছে ফেলা হয়েছে",
"ERROR_MESSAGE": "অবতার মুছে ফেলা যায়নি। অনুগ্রহ করে পরে আবার চেষ্টা করুন।"
}
}
},
"SIDEBAR": {
"TABS": {
"ATTRIBUTES": "Attributes",
"HISTORY": "History",
"ATTRIBUTES": "বৈশিষ্ট্যসমূহ",
"HISTORY": "ইতিহাস",
"NOTES": "Notes",
"MERGE": "Merge"
},
@@ -512,69 +512,69 @@
"EMPTY_STATE": "There are no previous conversations associated to this contact"
},
"ATTRIBUTES": {
"SEARCH_PLACEHOLDER": "Search for attributes",
"UNUSED_ATTRIBUTES": "{count} Used attribute | {count} Unused attributes",
"EMPTY_STATE": "There are no contact custom attributes available in this account. You can create a custom attribute in settings.",
"YES": "Yes",
"NO": "No",
"SEARCH_PLACEHOLDER": "বৈশিষ্ট্য অনুসন্ধান করুন",
"UNUSED_ATTRIBUTES": "{count} ব্যবহৃত বৈশিষ্ট্য | {count} অব্যবহৃত বৈশিষ্ট্য",
"EMPTY_STATE": "এই অ্যাকাউন্টে কোনো কাস্টম কন্টাক্ট অ্যাট্রিবিউট নেই। আপনি সেটিংসে একটি কাস্টম অ্যাট্রিবিউট তৈরি করতে পারেন।.",
"YES": "হ্যাঁ",
"NO": "না",
"TRIGGER": {
"SELECT": "Select value",
"INPUT": "Enter value"
"SELECT": "মান নির্বাচন করুন",
"INPUT": "মান লিখুন"
},
"VALIDATIONS": {
"INVALID_NUMBER": "Invalid number",
"REQUIRED": "Valid value is required",
"INVALID_INPUT": "Invalid input",
"INVALID_URL": "Invalid URL",
"INVALID_DATE": "Invalid date"
"INVALID_NUMBER": "অবৈধ সংখ্যা",
"REQUIRED": "বৈধ মান আবশ্যক",
"INVALID_INPUT": "অবৈধ ইনপুট প্রদান",
"INVALID_URL": "অবৈধ URL",
"INVALID_DATE": "অবৈধ তারিখ"
},
"NO_ATTRIBUTES": "No attributes found",
"NO_ATTRIBUTES": "কোনো বৈশিষ্ট্য পাওয়া যায়নি",
"API": {
"SUCCESS_MESSAGE": "Attribute updated successfully",
"DELETE_SUCCESS_MESSAGE": "Attribute deleted successfully",
"UPDATE_ERROR": "Unable to update attribute. Please try again later",
"DELETE_ERROR": "Unable to delete attribute. Please try again later"
"SUCCESS_MESSAGE": "বৈশিষ্ট্য সফলভাবে আপডেট হয়েছে",
"DELETE_SUCCESS_MESSAGE": "বৈশিষ্ট্য সফলভাবে মুছে ফেলা হয়েছে",
"UPDATE_ERROR": "বৈশিষ্ট্য আপডেট করা যায়নি। অনুগ্রহ করে পরে আবার চেষ্টা করুন",
"DELETE_ERROR": "বৈশিষ্ট্য মুছে ফেলা যায়নি। অনুগ্রহ করে পরে আবার চেষ্টা করুন"
}
},
"MERGE": {
"TITLE": "Merge contact",
"DESCRIPTION": "Combine two profiles into one, including all attributes and conversations. In case of conflict, the primary contacts attributes will take precedence.",
"PRIMARY": "Primary contact",
"PRIMARY_HELP_LABEL": "To be saved",
"PRIMARY_REQUIRED_ERROR": "Please select a contact to merge with before proceeding",
"PARENT": "To be merged",
"PARENT_HELP_LABEL": "To be deleted",
"EMPTY_STATE": "No contacts found",
"PLACEHOLDER": "Search for primary contact",
"SEARCH_PLACEHOLDER": "Search for a contact",
"SEARCH_ERROR_MESSAGE": "Could not search for contacts. Please try again later.",
"SUCCESS_MESSAGE": "Contact merged successfully",
"ERROR_MESSAGE": "Could not merge contacts, try again!",
"IS_SEARCHING": "Searching...",
"TITLE": "কন্টাক্ট একত্রিত করুন",
"DESCRIPTION": "দুটি প্রোফাইলের সব বৈশিষ্ট্য ও কথোপকথন একত্র করে একটি প্রোফাইল বানান. কোনো দ্বন্দ্ব হলে, প্রধান কন্টাক্টের তথ্য আগে ধরা হবে.",
"PRIMARY": "প্রধান কন্টাক্ট",
"PRIMARY_HELP_LABEL": "সংরক্ষণ করা হবে",
"PRIMARY_REQUIRED_ERROR": "অনুগ্রহ করে আগে একত্র করার জন্য একটি কন্টাক্ট বেছে নিন",
"PARENT": "একত্রিত করা হবে",
"PARENT_HELP_LABEL": "মুছে ফেলা হবে",
"EMPTY_STATE": "কোনো কন্টাক্ট পাওয়া যায়নি",
"PLACEHOLDER": "প্রধান কন্টাক্ট খুঁজুন",
"SEARCH_PLACEHOLDER": "একটি কন্টাক্ট খুঁজুন",
"SEARCH_ERROR_MESSAGE": "কন্টাক্ট খোঁজা যায়নি. অনুগ্রহ করে পরে আবার চেষ্টা করুন.",
"SUCCESS_MESSAGE": "যোগাযোগ সফলভাবে একত্রিত হয়েছে",
"ERROR_MESSAGE": "যোগাযোগ একত্রিত করা যায়নি, আবার চেষ্টা করুন!",
"IS_SEARCHING": "অনুসন্ধান চলছে...",
"BUTTONS": {
"CANCEL": "Cancel",
"CONFIRM": "Merge contact"
"CANCEL": "বাতিল করুন",
"CONFIRM": "কন্টাক্ট একত্রিত করুন"
}
},
"NOTES": {
"PLACEHOLDER": "Add a note",
"WROTE": "wrote",
"YOU": "You",
"SAVE": "Save note",
"PLACEHOLDER": "নোট যোগ করুন",
"WROTE": "লিখেছেন",
"YOU": "আপনি",
"SAVE": "নোট সংরক্ষণ করুন",
"ADD_NOTE": "Add contact note",
"EXPAND": "Expand",
"COLLAPSE": "Collapse",
"NO_NOTES": "No notes, you can add notes from the contact details page.",
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above.",
"EMPTY_STATE": "এই যোগাযোগের সাথে কোনো নোট যুক্ত নেই। উপরের বাক্সে লিখে আপনি একটি নোট যোগ করতে পারেন।.",
"CONVERSATION_EMPTY_STATE": "There are no notes yet. Use the Add note button to create one."
}
},
"EMPTY_STATE": {
"TITLE": "No contacts found in this account",
"SUBTITLE": "Start adding new contacts by clicking on the button below",
"BUTTON_LABEL": "Add contact",
"SEARCH_EMPTY_STATE_TITLE": "No contacts matches your search 🔍",
"LIST_EMPTY_STATE_TITLE": "No contacts available in this view 📋",
"TITLE": "এই অ্যাকাউন্টে কোনো যোগাযোগ পাওয়া যায়নি",
"SUBTITLE": "নিচের বোতামে ক্লিক করে নতুন কন্টাক্ট যোগ করা শুরু করুন",
"BUTTON_LABEL": "কন্টাক্ট যোগ করুন",
"SEARCH_EMPTY_STATE_TITLE": "আপনার অনুসন্ধানের সাথে কোনো কন্টাক্ট মেলে নি 🔍",
"LIST_EMPTY_STATE_TITLE": "এই ভিউতে কোনো কন্টাক্ট নেই 📋",
"ACTIVE_EMPTY_STATE_TITLE": "No contacts are active at the moment 🌙"
},
"LOAD_MORE": "Load more"
@@ -1,319 +1,319 @@
{
"CONVERSATION": {
"SELECT_A_CONVERSATION": "Please select a conversation from left pane",
"CSAT_REPLY_MESSAGE": "Please rate the conversation",
"404": "Sorry, we cannot find the conversation. Please try again",
"SWITCH_VIEW_LAYOUT": "Switch the layout",
"DASHBOARD_APP_TAB_MESSAGES": "Messages",
"UNVERIFIED_SESSION": "The identity of this user is not verified",
"NO_MESSAGE_1": "Uh oh! Looks like there are no messages from customers in your inbox.",
"NO_MESSAGE_2": " to send a message to your page!",
"NO_INBOX_1": "Hola! Looks like you haven't added any inboxes yet.",
"NO_INBOX_2": " to get started",
"NO_INBOX_AGENT": "Uh Oh! Looks like you are not part of any inbox. Please contact your administrator",
"SEARCH_MESSAGES": "Search for messages in conversations",
"VIEW_ORIGINAL": "View original",
"VIEW_TRANSLATED": "View translated",
"SELECT_A_CONVERSATION": "বাম পাশ থেকে একটি কনভার্সেশন নির্বাচন করুন",
"CSAT_REPLY_MESSAGE": "অনুগ্রহ করে কথোপকথনের মূল্যায়ন করুন",
"404": "দুঃখিত, আমরা কনভার্সেশনটি খুঁজে পাচ্ছি না। আবার চেষ্টা করুন",
"SWITCH_VIEW_LAYOUT": "লেআউট পরিবর্তন করুন",
"DASHBOARD_APP_TAB_MESSAGES": "বার্তা",
"UNVERIFIED_SESSION": "এই ব্যবহারকারীর পরিচয় যাচাই করা হয়নি",
"NO_MESSAGE_1": "ওহ! আপনার ইনবক্সে কোনো গ্রাহকের বার্তা নেই।",
"NO_MESSAGE_2": " আপনার পেজে বার্তা পাঠাতে!",
"NO_INBOX_1": "হ্যালো! আপনি এখনো কোনো ইনবক্স যোগ করেননি।",
"NO_INBOX_2": " শুরু করতে",
"NO_INBOX_AGENT": "ওহ! আপনি কোনো ইনবক্সের সদস্য নন। অনুগ্রহ করে আপনার অ্যাডমিনের সাথে যোগাযোগ করুন।",
"SEARCH_MESSAGES": "কথোপকথনে বার্তা অনুসন্ধান করুন",
"VIEW_ORIGINAL": "মূল দেখুন",
"VIEW_TRANSLATED": "অনুবাদ দেখুন",
"EMPTY_STATE": {
"CMD_BAR": "to open command menu",
"KEYBOARD_SHORTCUTS": "to view keyboard shortcuts"
"CMD_BAR": "কমান্ড মেনু খুলতে",
"KEYBOARD_SHORTCUTS": "কীবোর্ড শর্টকাট দেখতে"
},
"SEARCH": {
"TITLE": "Search messages",
"RESULT_TITLE": "Search Results",
"LOADING_MESSAGE": "Crunching data...",
"PLACEHOLDER": "Type any text to search messages",
"NO_MATCHING_RESULTS": "No results found."
"TITLE": "বার্তা অনুসন্ধান",
"RESULT_TITLE": "অনুসন্ধান ফলাফল",
"LOADING_MESSAGE": "ডেটা বিশ্লেষণ হচ্ছে...",
"PLACEHOLDER": "বার্তা খুঁজতে যেকোনো লেখা টাইপ করুন",
"NO_MATCHING_RESULTS": "কোন ফলাফল পাওয়া যায়নি।"
},
"UNREAD_MESSAGES": "Unread Messages",
"UNREAD_MESSAGE": "Unread Message",
"CLICK_HERE": "Click here",
"LOADING_INBOXES": "Loading inboxes",
"LOADING_CONVERSATIONS": "Loading Conversations",
"CANNOT_REPLY": "You cannot reply due to",
"24_HOURS_WINDOW": "24 hour message window restriction",
"48_HOURS_WINDOW": "48 hour message window restriction",
"UNREAD_MESSAGES": "অপঠিত বার্তা",
"UNREAD_MESSAGE": "অপঠিত বার্তা",
"CLICK_HERE": "এখানে ক্লিক করুন",
"LOADING_INBOXES": "ইনবক্স লোড হচ্ছে",
"LOADING_CONVERSATIONS": "কথোপকথন লোড হচ্ছে",
"CANNOT_REPLY": "আপনি উত্তর দিতে পারবেন না কারণ",
"24_HOURS_WINDOW": "২৪ ঘণ্টার মেসেজ সীমাবদ্ধতা",
"48_HOURS_WINDOW": "৪৮ ঘণ্টার মেসেজ সীমাবদ্ধতা",
"API_HOURS_WINDOW": "You can only reply to this conversation within {hours} hours",
"NOT_ASSIGNED_TO_YOU": "This conversation is not assigned to you. Would you like to assign this conversation to yourself?",
"ASSIGN_TO_ME": "Assign to me",
"BOT_HANDOFF_MESSAGE": "You are responding to a conversation which is currently handled by an assistant or a bot.",
"BOT_HANDOFF_ACTION": "Mark open and assign to you",
"BOT_HANDOFF_REOPEN_ACTION": "Mark conversation open",
"BOT_HANDOFF_SUCCESS": "Conversation has been handed over to you",
"BOT_HANDOFF_ERROR": "Failed to take over the conversation. Please try again.",
"TWILIO_WHATSAPP_CAN_REPLY": "You can only reply to this conversation using a template message due to",
"TWILIO_WHATSAPP_24_HOURS_WINDOW": "24 hour message window restriction",
"OLD_INSTAGRAM_INBOX_REPLY_BANNER": "This Instagram account was migrated to the new Instagram channel inbox. All new messages will show up there. You wont be able to send messages from this conversation anymore.",
"REPLYING_TO": "You are replying to:",
"REMOVE_SELECTION": "Remove Selection",
"DOWNLOAD": "Download",
"UNKNOWN_FILE_TYPE": "Unknown File",
"SAVE_CONTACT": "Save Contact",
"NO_CONTENT": "No content to display",
"NOT_ASSIGNED_TO_YOU": "এই কথোপকথনটি আপনার কাছে বরাদ্দ নয়। আপনি কি এটি নিজের কাছে বরাদ্দ করতে চান?",
"ASSIGN_TO_ME": "নিজের কাছে বরাদ্দ করুন",
"BOT_HANDOFF_MESSAGE": "আপনি এমন একটি কথোপকথনে উত্তর দিচ্ছেন যা বর্তমানে সহকারী বা বট দ্বারা পরিচালিত হচ্ছে।",
"BOT_HANDOFF_ACTION": "ওপেন করুন এবং নিজের কাছে অ্যাসাইন করুন",
"BOT_HANDOFF_REOPEN_ACTION": "কথোপকথন ওপেন করুন",
"BOT_HANDOFF_SUCCESS": "কথোপকথনটি আপনার কাছে হস্তান্তর করা হয়েছে",
"BOT_HANDOFF_ERROR": "কথোপকথনটি নেওয়া যায়নি। আবার চেষ্টা করুন।",
"TWILIO_WHATSAPP_CAN_REPLY": "আপনি শুধুমাত্র টেমপ্লেট বার্তা ব্যবহার করে এই আলাপে উত্তর দিতে পারবেন কারণ",
"TWILIO_WHATSAPP_24_HOURS_WINDOW": "২৪ ঘণ্টার বার্তা সীমাবদ্ধতা",
"OLD_INSTAGRAM_INBOX_REPLY_BANNER": "এই Instagram অ্যাকাউন্টটি নতুন Instagram চ্যানেল ইনবক্সে স্থানান্তরিত হয়েছে। সব নতুন বার্তা সেখানে দেখা যাবে। আপনি আর এই কথোপকথন থেকে বার্তা পাঠাতে পারবেন না।",
"REPLYING_TO": "আপনি যাকে উত্তর দিচ্ছেন:",
"REMOVE_SELECTION": "নির্বাচন সরান",
"DOWNLOAD": "ডাউনলোড",
"UNKNOWN_FILE_TYPE": "অজানা ফাইল",
"SAVE_CONTACT": "যোগাযোগ সংরক্ষণ করুন",
"NO_CONTENT": "দেখানোর জন্য কোনো বিষয়বস্তু নেই",
"SHARED_ATTACHMENT": {
"CONTACT": "{sender} has shared a contact",
"LOCATION": "{sender} has shared a location",
"FILE": "{sender} has shared a file",
"MEETING": "{sender} has started a meeting"
},
"UPLOADING_ATTACHMENTS": "Uploading attachments...",
"REPLIED_TO_STORY": "Replied to your story",
"UPLOADING_ATTACHMENTS": "সংযুক্তি আপলোড হচ্ছে...",
"REPLIED_TO_STORY": "আপনার স্টোরিতে উত্তর দিয়েছে",
"UNSUPPORTED_MESSAGE": "This message is unsupported. You can view this message on the Facebook / Instagram app.",
"UNSUPPORTED_MESSAGE_FACEBOOK": "This message is unsupported. You can view this message on the Facebook Messenger app.",
"UNSUPPORTED_MESSAGE_INSTAGRAM": "This message is unsupported. You can view this message on the Instagram app.",
"UNSUPPORTED_MESSAGE_TIKTOK": "This message is unsupported. You can view this message on the TikTok app.",
"SUCCESS_DELETE_MESSAGE": "Message deleted successfully",
"FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again",
"NO_RESPONSE": "No response",
"RESPONSE": "Response",
"RATING_TITLE": "Rating",
"FEEDBACK_TITLE": "Feedback",
"REPLY_MESSAGE_NOT_FOUND": "Message not available",
"UNSUPPORTED_MESSAGE_FACEBOOK": "এই বার্তাটি সমর্থিত নয়। আপনি Facebook Messenger অ্যাপে এই বার্তাটি দেখতে পারেন।",
"UNSUPPORTED_MESSAGE_INSTAGRAM": "এই বার্তাটি সমর্থিত নয়। আপনি Instagram অ্যাপে এই বার্তাটি দেখতে পারেন।",
"UNSUPPORTED_MESSAGE_TIKTOK": "এই বার্তাটি সমর্থিত নয়। TikTok অ্যাপে এই বার্তাটি দেখতে পারেন।",
"SUCCESS_DELETE_MESSAGE": "বার্তা সফলভাবে মুছে ফেলা হয়েছে",
"FAIL_DELETE_MESSSAGE": "বার্তা মুছে ফেলা যায়নি! আবার চেষ্টা করুন",
"NO_RESPONSE": "কোনো উত্তর নেই",
"RESPONSE": "উত্তর",
"RATING_TITLE": "রেটিং",
"FEEDBACK_TITLE": "মতামত",
"REPLY_MESSAGE_NOT_FOUND": "বার্তাটি পাওয়া যায়নি",
"CARD": {
"SHOW_LABELS": "Show labels",
"HIDE_LABELS": "Hide labels"
"SHOW_LABELS": "লেবেল দেখান",
"HIDE_LABELS": "লেবেল লুকান"
},
"VOICE_CALL": {
"INCOMING_CALL": "Incoming call",
"OUTGOING_CALL": "Outgoing call",
"CALL_IN_PROGRESS": "Call in progress",
"NO_ANSWER": "No answer",
"MISSED_CALL": "Missed call",
"CALL_ENDED": "Call ended",
"NOT_ANSWERED_YET": "Not answered yet",
"THEY_ANSWERED": "They answered",
"YOU_ANSWERED": "You answered"
"INCOMING_CALL": "ইনকামিং কল",
"OUTGOING_CALL": "আউটগোয়িং কল",
"CALL_IN_PROGRESS": "কল চলছে",
"NO_ANSWER": "উত্তর নেই",
"MISSED_CALL": "মিসড কল",
"CALL_ENDED": "কল শেষ হয়েছে",
"NOT_ANSWERED_YET": "এখনও উত্তর পাওয়া যায়নি",
"THEY_ANSWERED": "তারা উত্তর দিয়েছে",
"YOU_ANSWERED": "আপনি উত্তর দিয়েছেন"
},
"HEADER": {
"RESOLVE_ACTION": "Resolve",
"REOPEN_ACTION": "Reopen",
"OPEN_ACTION": "Open",
"MORE_ACTIONS": "More actions",
"OPEN": "More",
"CLOSE": "Close",
"DETAILS": "details",
"SNOOZED_UNTIL": "Snoozed until",
"SNOOZED_UNTIL_TOMORROW": "Snoozed until tomorrow",
"SNOOZED_UNTIL_NEXT_WEEK": "Snoozed until next week",
"SNOOZED_UNTIL_NEXT_REPLY": "Snoozed until next reply",
"RESOLVE_ACTION": "সমাধান করুন",
"REOPEN_ACTION": "পুনরায় খুলুন",
"OPEN_ACTION": "খুলুন",
"MORE_ACTIONS": "আরও অপশন",
"OPEN": "আরও",
"CLOSE": "বন্ধ করুন",
"DETAILS": "বিস্তারিত",
"SNOOZED_UNTIL": "স্নুজ করা হয়েছে পর্যন্ত",
"SNOOZED_UNTIL_TOMORROW": "আগামীকাল পর্যন্ত স্থগিত",
"SNOOZED_UNTIL_NEXT_WEEK": "পরবর্তী সপ্তাহ পর্যন্ত স্থগিত",
"SNOOZED_UNTIL_NEXT_REPLY": "পরবর্তী উত্তর পর্যন্ত স্থগিত",
"SLA_STATUS": {
"FRT": "FRT {status}",
"NRT": "NRT {status}",
"RT": "RT {status}",
"MISSED": "missed",
"DUE": "due"
"MISSED": "মিস হয়েছে",
"DUE": "বাকি"
}
},
"RESOLVE_DROPDOWN": {
"MARK_PENDING": "Mark as pending",
"SNOOZE_UNTIL": "Snooze",
"MARK_PENDING": "পেন্ডিং হিসেবে চিহ্নিত করুন",
"SNOOZE_UNTIL": "স্নুজ",
"SNOOZE": {
"TITLE": "Snooze until",
"NEXT_REPLY": "Next reply",
"TOMORROW": "Tomorrow",
"NEXT_WEEK": "Next week"
"TITLE": "স্নুজ করুন যতক্ষণ না",
"NEXT_REPLY": "পরবর্তী উত্তর",
"TOMORROW": "আগামীকাল",
"NEXT_WEEK": "পরবর্তী সপ্তাহ"
}
},
"MENTION": {
"AGENTS": "Agents",
"TEAMS": "Teams"
"AGENTS": "এজেন্টরা",
"TEAMS": "টিমসমূহ"
},
"CUSTOM_SNOOZE": {
"TITLE": "Snooze until",
"APPLY": "Snooze",
"CANCEL": "Cancel"
"TITLE": "স্নুজ করা হবে পর্যন্ত",
"APPLY": "স্নুজ",
"CANCEL": "বাতিল"
},
"PRIORITY": {
"TITLE": "Priority",
"TITLE": "অগ্রাধিকার",
"OPTIONS": {
"NONE": "None",
"URGENT": "Urgent",
"HIGH": "High",
"MEDIUM": "Medium",
"LOW": "Low"
"NONE": "কিছুই না",
"URGENT": "জরুরি",
"HIGH": "উচ্চ",
"MEDIUM": "মাঝারি",
"LOW": "নিম্ন"
},
"CHANGE_PRIORITY": {
"SELECT_PLACEHOLDER": "None",
"INPUT_PLACEHOLDER": "Select priority",
"NO_RESULTS": "No results found",
"SELECT_PLACEHOLDER": "কিছুই না",
"INPUT_PLACEHOLDER": "অগ্রাধিকার নির্বাচন করুন",
"NO_RESULTS": "কোন ফলাফল পাওয়া যায়নি",
"SUCCESSFUL": "Changed priority of conversation id {conversationId} to {priority}",
"FAILED": "Couldn't change priority. Please try again."
"FAILED": "প্রাধান্য পরিবর্তন করা যায়নি। আবার চেষ্টা করুন।"
}
},
"DELETE_CONVERSATION": {
"TITLE": "Delete conversation #{conversationId}",
"DESCRIPTION": "Are you sure you want to delete this conversation?",
"CONFIRM": "Delete"
"DESCRIPTION": "আপনি কি নিশ্চিতভাবে এই কথোপকথনটি মুছে ফেলতে চান?",
"CONFIRM": "মুছে ফেলুন"
},
"CARD_CONTEXT_MENU": {
"PENDING": "Mark as pending",
"RESOLVED": "Mark as resolved",
"MARK_AS_UNREAD": "Mark as unread",
"MARK_AS_READ": "Mark as read",
"REOPEN": "Reopen conversation",
"PENDING": "বিচারাধীন হিসেবে চিহ্নিত করুন",
"RESOLVED": "সমাধান হয়েছে হিসেবে চিহ্নিত করুন",
"MARK_AS_UNREAD": "অপঠিত হিসেবে চিহ্নিত করুন",
"MARK_AS_READ": "পড়া হয়েছে হিসেবে চিহ্নিত করুন",
"REOPEN": "আলোচনা পুনরায় খুলুন",
"SNOOZE": {
"TITLE": "Snooze",
"NEXT_REPLY": "Until next reply",
"TOMORROW": "Until tomorrow",
"NEXT_WEEK": "Until next week"
"TITLE": "স্নুজ",
"NEXT_REPLY": "পরবর্তী উত্তর পর্যন্ত",
"TOMORROW": "আগামীকাল পর্যন্ত",
"NEXT_WEEK": "পরবর্তী সপ্তাহ পর্যন্ত"
},
"ASSIGN_AGENT": "Assign agent",
"ASSIGN_LABEL": "Assign label",
"AGENTS_LOADING": "Loading agents...",
"ASSIGN_TEAM": "Assign team",
"DELETE": "Delete conversation",
"OPEN_IN_NEW_TAB": "Open in new tab",
"COPY_LINK": "Copy conversation link",
"COPY_LINK_SUCCESS": "Conversation link copied to clipboard",
"ASSIGN_AGENT": "এজেন্ট নির্ধারণ করুন",
"ASSIGN_LABEL": "লেবেল নির্ধারণ করুন",
"AGENTS_LOADING": "এজেন্ট লোড হচ্ছে...",
"ASSIGN_TEAM": "টিম নির্ধারণ করুন",
"DELETE": "কথোপকথন মুছে ফেলুন",
"OPEN_IN_NEW_TAB": "নতুন ট্যাবে খুলুন",
"COPY_LINK": "কথোপকথনের লিংক কপি করুন",
"COPY_LINK_SUCCESS": "কথোপকথনের লিংক ক্লিপবোর্ডে কপি হয়েছে",
"API": {
"AGENT_ASSIGNMENT": {
"SUCCESFUL": "Conversation id {conversationId} assigned to \"{agentName}\"",
"FAILED": "Couldn't assign agent. Please try again."
"FAILED": "এজেন্ট নির্ধারণ করা যায়নি। আবার চেষ্টা করুন।"
},
"LABEL_ASSIGNMENT": {
"SUCCESFUL": "Assigned label #{labelName} to conversation id {conversationId}",
"FAILED": "Couldn't assign label. Please try again."
"FAILED": "লেবেল নির্ধারণ করা যায়নি। আবার চেষ্টা করুন।"
},
"LABEL_REMOVAL": {
"SUCCESFUL": "Removed label #{labelName} from conversation id {conversationId}",
"FAILED": "Couldn't remove label. Please try again."
"FAILED": "লেবেল সরানো যায়নি। অনুগ্রহ করে আবার চেষ্টা করুন।"
},
"TEAM_ASSIGNMENT": {
"SUCCESFUL": "Assigned team \"{team}\" to conversation id {conversationId}",
"FAILED": "Couldn't assign team. Please try again."
"FAILED": "টিম নির্ধারণ করা যায়নি। আবার চেষ্টা করুন।"
}
}
},
"FOOTER": {
"MESSAGE_SIGN_TOOLTIP": "Message signature",
"ENABLE_SIGN_TOOLTIP": "Enable signature",
"DISABLE_SIGN_TOOLTIP": "Disable signature",
"MSG_INPUT": "Shift + enter for new line. Start with '/' to select a Canned Response.",
"PRIVATE_MSG_INPUT": "Shift + enter for new line. This will be visible only to Agents",
"MESSAGING_RESTRICTED": "You cannot reply to this conversation",
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Message signature is not configured, please configure it in profile settings.",
"COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
"CLICK_HERE": "Click here to update",
"WHATSAPP_TEMPLATES": "Whatsapp Templates"
"MESSAGE_SIGN_TOOLTIP": "বার্তার স্বাক্ষর",
"ENABLE_SIGN_TOOLTIP": "স্বাক্ষর চালু করুন",
"DISABLE_SIGN_TOOLTIP": "স্বাক্ষর বন্ধ করুন",
"MSG_INPUT": "নতুন লাইনের জন্য Shift + Enter চাপুন। Canned Response বাছাই করতে '/' দিয়ে শুরু করুন।",
"PRIVATE_MSG_INPUT": "নতুন লাইনের জন্য Shift + Enter চাপুন। এটি শুধু এজেন্টদের জন্য দৃশ্যমান হবে",
"MESSAGING_RESTRICTED": "আপনি এই কথোপকথনে উত্তর দিতে পারবেন না",
"MESSAGING_RESTRICTED_WHATSAPP": "২৪ ঘণ্টার বার্তা সীমাবদ্ধতার কারণে শুধু টেমপ্লেট বার্তা দিয়ে উত্তর দিতে পারবেন",
"MESSAGING_RESTRICTED_API": "বার্তা উইন্ডো সীমাবদ্ধতার কারণে শুধু টেমপ্লেট বার্তা দিয়ে উত্তর দিতে পারবেন",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "বার্তার স্বাক্ষর কনফিগার করা হয়নি, প্রোফাইল সেটিংসে কনফিগার করুন।",
"COPILOT_MSG_INPUT": "Copilot-কে আরও নির্দেশ দিন বা অন্য কিছু জিজ্ঞাসা করুন... ফলো-আপ পাঠাতে এন্টার চাপুন",
"CLICK_HERE": "আপডেট করতে এখানে ক্লিক করুন",
"WHATSAPP_TEMPLATES": "Whatsapp টেমপ্লেট"
},
"REPLYBOX": {
"REPLY": "Reply",
"PRIVATE_NOTE": "Private Note",
"SEND": "Send",
"CREATE": "Add Note",
"INSERT_READ_MORE": "Read more",
"DISMISS_REPLY": "Dismiss reply",
"REPLYING_TO": "Replying to:",
"TIP_EMOJI_ICON": "Show emoji selector",
"TIP_ATTACH_ICON": "Attach files",
"TIP_AUDIORECORDER_ICON": "Record audio",
"TIP_AUDIORECORDER_PERMISSION": "Allow access to audio",
"TIP_AUDIORECORDER_ERROR": "Could not open the audio",
"DRAG_DROP": "Drag and drop here to attach",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
"COPILOT_THINKING": "Copilot is thinking",
"REPLY": "উত্তর দিন",
"PRIVATE_NOTE": "ব্যক্তিগত নোট",
"SEND": "পাঠান",
"CREATE": "নোট যোগ করুন",
"INSERT_READ_MORE": "আরও পড়ুন",
"DISMISS_REPLY": "উত্তর বাতিল করুন",
"REPLYING_TO": "উত্তর দিচ্ছেন:",
"TIP_EMOJI_ICON": "ইমোজি সিলেক্টর দেখান",
"TIP_ATTACH_ICON": "ফাইল সংযুক্ত করুন",
"TIP_AUDIORECORDER_ICON": "অডিও রেকর্ড করুন",
"TIP_AUDIORECORDER_PERMISSION": "অডিও অ্যাক্সেসের অনুমতি দিন",
"TIP_AUDIORECORDER_ERROR": "অডিও খোলা যায়নি",
"DRAG_DROP": "সংযুক্ত করতে এখানে ড্র্যাগ ও ড্রপ করুন",
"START_AUDIO_RECORDING": "অডিও রেকর্ডিং শুরু করুন",
"STOP_AUDIO_RECORDING": "অডিও রেকর্ডিং বন্ধ করুন",
"COPILOT_THINKING": "Copilot ভাবছে",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Add bcc",
"ADD_BCC": "বিসিসি যোগ করুন",
"CC": {
"LABEL": "CC",
"PLACEHOLDER": "Emails separated by commas",
"ERROR": "Please enter valid email addresses"
"PLACEHOLDER": "কমা দিয়ে আলাদা ইমেইল",
"ERROR": "সঠিক ইমেইল ঠিকানা দিন"
},
"BCC": {
"LABEL": "BCC",
"PLACEHOLDER": "Emails separated by commas",
"ERROR": "Please enter valid email addresses"
"PLACEHOLDER": "কমা দিয়ে আলাদা ইমেইল",
"ERROR": "বৈধ ইমেইল ঠিকানা দিন"
}
},
"UNDEFINED_VARIABLES": {
"TITLE": "Undefined variables",
"TITLE": "অনির্ধারিত ভেরিয়েবল",
"MESSAGE": "You have {undefinedVariablesCount} undefined variables in your message: {undefinedVariables}. Would you like to send the message anyway?",
"CONFIRM": {
"YES": "Send",
"CANCEL": "Cancel"
"YES": "পাঠান",
"CANCEL": "বাতিল"
}
},
"QUOTED_REPLY": {
"ENABLE_TOOLTIP": "Include quoted email thread",
"DISABLE_TOOLTIP": "Don't include quoted email thread",
"REMOVE_PREVIEW": "Remove quoted email thread",
"COLLAPSE": "Collapse preview",
"EXPAND": "Expand preview"
"ENABLE_TOOLTIP": "উদ্ধৃত ইমেইল থ্রেড যুক্ত করুন",
"DISABLE_TOOLTIP": "উদ্ধৃত ইমেইল থ্রেড যুক্ত করবেন না",
"REMOVE_PREVIEW": "উদ্ধৃত ইমেইল থ্রেড সরান",
"COLLAPSE": "প্রিভিউ সংকুচিত করুন",
"EXPAND": "প্রিভিউ বড় করুন"
}
},
"VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team",
"CHANGE_STATUS": "Conversation status changed",
"CHANGE_STATUS_FAILED": "Conversation status change failed",
"CHANGE_AGENT": "Conversation Assignee changed",
"CHANGE_AGENT_FAILED": "Assignee change failed",
"ASSIGN_LABEL_SUCCESFUL": "Label assigned successfully",
"ASSIGN_LABEL_FAILED": "Label assignment failed",
"CHANGE_TEAM": "Conversation team changed",
"SUCCESS_DELETE_CONVERSATION": "Conversation deleted successfully",
"FAIL_DELETE_CONVERSATION": "Couldn't delete conversation! Try again",
"VISIBLE_TO_AGENTS": "ব্যক্তিগত নোট: শুধু আপনি ও আপনার টিম দেখতে পারবেন",
"CHANGE_STATUS": "কথোপকথনের অবস্থা পরিবর্তিত হয়েছে",
"CHANGE_STATUS_FAILED": "কনভার্সেশনের স্ট্যাটাস পরিবর্তন ব্যর্থ হয়েছে",
"CHANGE_AGENT": "কথোপকথনের দায়িত্বপ্রাপ্ত ব্যক্তি পরিবর্তিত হয়েছে",
"CHANGE_AGENT_FAILED": "অ্যাসাইনি পরিবর্তন ব্যর্থ হয়েছে",
"ASSIGN_LABEL_SUCCESFUL": "লেবেল সফলভাবে নির্ধারণ হয়েছে",
"ASSIGN_LABEL_FAILED": "লেবেল নির্ধারণ ব্যর্থ হয়েছে",
"CHANGE_TEAM": "আলাপের টিম পরিবর্তন হয়েছে",
"SUCCESS_DELETE_CONVERSATION": "কথোপকথন সফলভাবে মুছে ফেলা হয়েছে",
"FAIL_DELETE_CONVERSATION": "কথোপকথন মুছে ফেলা যায়নি! আবার চেষ্টা করুন",
"FILE_SIZE_LIMIT": "File exceeds the {MAXIMUM_SUPPORTED_FILE_UPLOAD_SIZE} MB attachment limit",
"FILE_TYPE_NOT_SUPPORTED": "This {fileName} file type is not supported in this conversation",
"MESSAGE_ERROR": "Unable to send this message, please try again later",
"SENT_BY": "Sent by:",
"MESSAGE_ERROR": "বার্তাটি পাঠানো যায়নি, পরে আবার চেষ্টা করুন",
"SENT_BY": "প্রেরক:",
"BOT": "Bot",
"NATIVE_APP": "Native app",
"NATIVE_APP_ADVISORY": "This message was sent from the native app. Reply from Chatwoot to maintain the message window.",
"SEND_FAILED": "Couldn't send message! Try again",
"TRY_AGAIN": "retry",
"NATIVE_APP": "নেটিভ অ্যাপ",
"NATIVE_APP_ADVISORY": "এই বার্তাটি নেটিভ অ্যাপ থেকে পাঠানো হয়েছে। বার্তা উইন্ডো বজায় রাখতে Chatwoot থেকে উত্তর দিন।",
"SEND_FAILED": "বার্তা পাঠানো যায়নি! আবার চেষ্টা করুন",
"TRY_AGAIN": "পুনরায় চেষ্টা করুন",
"ASSIGNMENT": {
"SELECT_AGENT": "Select Agent",
"REMOVE": "Remove",
"ASSIGN": "Assign"
"SELECT_AGENT": "এজেন্ট নির্বাচন করুন",
"REMOVE": "সরান",
"ASSIGN": "নিয়োগ করুন"
},
"CONTEXT_MENU": {
"COPY": "Copy",
"REPLY_TO": "Reply to this message",
"DELETE": "Delete",
"CREATE_A_CANNED_RESPONSE": "Add to canned responses",
"TRANSLATE": "Translate",
"COPY_PERMALINK": "Copy link to the message",
"LINK_COPIED": "Message URL copied to the clipboard",
"COPY": "কপি করুন",
"REPLY_TO": "এই বার্তায় উত্তর দিন",
"DELETE": "মুছুন",
"CREATE_A_CANNED_RESPONSE": "ক্যানড রেসপন্সে যোগ করুন",
"TRANSLATE": "অনুবাদ করুন",
"COPY_PERMALINK": "বার্তার লিঙ্ক কপি করুন",
"LINK_COPIED": "বার্তার URL ক্লিপবোর্ডে কপি হয়েছে",
"DELETE_CONFIRMATION": {
"TITLE": "Are you sure you want to delete this message?",
"MESSAGE": "You cannot undo this action",
"DELETE": "Delete",
"CANCEL": "Cancel"
"TITLE": "আপনি কি নিশ্চিত এই বার্তাটি মুছে ফেলতে চান?",
"MESSAGE": "এই কাজটি পূর্বাবস্থায় ফেরানো যাবে না",
"DELETE": "মুছে ফেলুন",
"CANCEL": "বাতিল করুন"
}
},
"SIDEBAR": {
"CONTACT": "Contact",
"CONTACT": "যোগাযোগ",
"COPILOT": "Copilot"
},
"VOICE_WIDGET": {
"INCOMING_CALL": "Incoming call",
"OUTGOING_CALL": "Outgoing call",
"CALL_IN_PROGRESS": "Call in progress",
"NOT_ANSWERED_YET": "Not answered yet",
"HANDLED_IN_ANOTHER_TAB": "Being handled in another tab",
"REJECT_CALL": "Reject",
"JOIN_CALL": "Join call",
"END_CALL": "End call"
"INCOMING_CALL": "আসন্ন কল",
"OUTGOING_CALL": "প্রেরিত কল",
"CALL_IN_PROGRESS": "কল চলছে",
"NOT_ANSWERED_YET": "এখনও উত্তর পাওয়া যায়নি",
"HANDLED_IN_ANOTHER_TAB": "অন্য ট্যাবে পরিচালিত হচ্ছে",
"REJECT_CALL": "প্রত্যাখ্যান করুন",
"JOIN_CALL": "কলে যোগ দিন",
"END_CALL": "কল শেষ করুন"
}
},
"EMAIL_TRANSCRIPT": {
"TITLE": "Send conversation transcript",
"DESC": "Send a copy of the conversation transcript to the specified email address",
"SUBMIT": "Submit",
"CANCEL": "Cancel",
"SEND_EMAIL_SUCCESS": "The chat transcript was sent successfully",
"SEND_EMAIL_ERROR": "There was an error, please try again",
"SEND_EMAIL_PAYMENT_REQUIRED": "Email transcript is not available on your current plan. Please upgrade to use this feature.",
"TITLE": "কথোপকথনের ট্রান্সক্রিপ্ট পাঠান",
"DESC": "নির্দিষ্ট ইমেইল ঠিকানায় কথোপকথনের ট্রান্সক্রিপ্ট পাঠান",
"SUBMIT": "জমা দিন",
"CANCEL": "বাতিল করুন",
"SEND_EMAIL_SUCCESS": "চ্যাট ট্রান্সক্রিপ্ট সফলভাবে পাঠানো হয়েছে",
"SEND_EMAIL_ERROR": "একটি ত্রুটি হয়েছে, অনুগ্রহ করে আবার চেষ্টা করুন",
"SEND_EMAIL_PAYMENT_REQUIRED": "আপনার বর্তমান প্ল্যানে ইমেইল ট্রান্সক্রিপ্ট সুবিধা নেই। এই ফিচারটি ব্যবহার করতে প্ল্যান আপগ্রেড করুন।",
"FORM": {
"SEND_TO_CONTACT": "Send the transcript to the customer",
"SEND_TO_AGENT": "Send the transcript to the assigned agent",
"SEND_TO_OTHER_EMAIL_ADDRESS": "Send the transcript to another email address",
"SEND_TO_CONTACT": "গ্রাহককে ট্রান্সক্রিপ্ট পাঠান",
"SEND_TO_AGENT": "নিয়োজিত এজেন্টকে ট্রান্সক্রিপ্ট পাঠান",
"SEND_TO_OTHER_EMAIL_ADDRESS": "অন্য ইমেইল ঠিকানায় ট্রান্সক্রিপ্ট পাঠান",
"EMAIL": {
"PLACEHOLDER": "Enter an email address",
"ERROR": "Please enter a valid email address"
"PLACEHOLDER": "ইমেইল ঠিকানা লিখুন",
"ERROR": "একটি বৈধ ইমেইল ঠিকানা লিখুন"
}
}
},
@@ -323,120 +323,120 @@
"GREETING_MORNING": "👋 Good morning, {name}. Welcome to {installationName}.",
"GREETING_AFTERNOON": "👋 Good afternoon, {name}. Welcome to {installationName}.",
"GREETING_EVENING": "👋 Good evening, {name}. Welcome to {installationName}.",
"READ_LATEST_UPDATES": "Read our latest updates",
"READ_LATEST_UPDATES": "আমাদের সর্বশেষ আপডেট পড়ুন",
"ALL_CONVERSATION": {
"TITLE": "All your conversations in one place",
"DESCRIPTION": "View all the conversations from your customers in one single dashboard. You can filter the conversations by the incoming channel, label and status.",
"NEW_LINK": "Click here to create an inbox"
"TITLE": "আপনার সব কথোপকথন এক জায়গায়",
"DESCRIPTION": "একটি ড্যাশবোর্ডে আপনার গ্রাহকদের সব কথোপকথন দেখুন। আপনি চ্যানেল, লেবেল ও স্ট্যাটাস অনুযায়ী ফিল্টার করতে পারবেন।",
"NEW_LINK": "ইনবক্স তৈরি করতে এখানে ক্লিক করুন"
},
"TEAM_MEMBERS": {
"TITLE": "Invite your team members",
"DESCRIPTION": "Since you are getting ready to talk to your customer, bring in your teammates to assist you. You can invite your teammates by adding their email addresses to the agent list.",
"NEW_LINK": "Click here to invite a team member"
"TITLE": "আপনার টিম সদস্যদের আমন্ত্রণ জানান",
"DESCRIPTION": "আপনি যখন গ্রাহকের সাথে কথা বলার জন্য প্রস্তুতি নিচ্ছেন, তখন সহায়তার জন্য আপনার টিমমেটদের যুক্ত করুন। এজেন্ট তালিকায় তাদের ইমেইল ঠিকানা যোগ করে আমন্ত্রণ জানাতে পারেন।",
"NEW_LINK": "টিম সদস্য আমন্ত্রণ জানাতে এখানে ক্লিক করুন"
},
"LABELS": {
"TITLE": "Organize conversations with labels",
"DESCRIPTION": "Labels provide an easier way to categorize your conversation. Create some labels like #support-enquiry, #billing-question etc., so that you can use them in a conversation later.",
"NEW_LINK": "Click here to create tags"
"TITLE": "লেবেল দিয়ে কথোপকথন সাজান",
"DESCRIPTION": "লেবেল ব্যবহার করে সহজেই কথোপকথন শ্রেণিবদ্ধ করুন। যেমন #support-enquiry, #billing-question ইত্যাদি লেবেল তৈরি করুন, পরে কথোপকথনে ব্যবহার করতে পারবেন।",
"NEW_LINK": "ট্যাগ তৈরি করতে এখানে ক্লিক করুন"
},
"CANNED_RESPONSES": {
"TITLE": "Create canned responses",
"DESCRIPTION": "Pre-written quick reply templates help you quickly respond to a conversation. Agents can type the '/' character followed by the shortcode to insert a response.",
"NEW_LINK": "Click here to create a canned response"
"TITLE": "ক্যানড রেসপন্স তৈরি করুন",
"DESCRIPTION": "আগে থেকে লেখা দ্রুত উত্তর টেমপ্লেট দিয়ে সহজেই কথোপকথনে উত্তর দিন। এজেন্টরা '/' চিহ্ন ও শর্টকোড লিখে দ্রুত উত্তর যোগ করতে পারেন।",
"NEW_LINK": "ক্যানড রেসপন্স তৈরি করতে এখানে ক্লিক করুন"
}
},
"CONVERSATION_SIDEBAR": {
"ASSIGNEE_LABEL": "Assigned Agent",
"SELF_ASSIGN": "Assign to me",
"TEAM_LABEL": "Assigned Team",
"ASSIGNEE_LABEL": "নিযুক্ত এজেন্ট",
"SELF_ASSIGN": "নিজেকে নির্ধারণ করুন",
"TEAM_LABEL": "নিযুক্ত টিম",
"SELECT": {
"PLACEHOLDER": "None"
"PLACEHOLDER": "কিছুই না"
},
"ACCORDION": {
"CONTACT_DETAILS": "Contact Details",
"CONVERSATION_ACTIONS": "Conversation Actions",
"CONVERSATION_LABELS": "Conversation Labels",
"CONVERSATION_INFO": "Conversation Information",
"CONTACT_NOTES": "Contact Notes",
"CONTACT_ATTRIBUTES": "Contact Attributes",
"PREVIOUS_CONVERSATION": "Previous Conversations",
"MACROS": "Macros",
"LINEAR_ISSUES": "Linked Linear Issues",
"SHOPIFY_ORDERS": "Shopify Orders"
"CONTACT_DETAILS": "যোগাযোগের বিবরণ",
"CONVERSATION_ACTIONS": "আলোচনার কার্যক্রম",
"CONVERSATION_LABELS": "আলোচনার লেবেল",
"CONVERSATION_INFO": "আলোচনার তথ্য",
"CONTACT_NOTES": "যোগাযোগ নোট",
"CONTACT_ATTRIBUTES": "যোগাযোগের বৈশিষ্ট্য",
"PREVIOUS_CONVERSATION": "পূর্বের আলোচনা",
"MACROS": "ম্যাক্রো",
"LINEAR_ISSUES": "সংযুক্ত Linear সমস্যা",
"SHOPIFY_ORDERS": "Shopify অর্ডার"
},
"SHOPIFY": {
"ORDER_ID": "Order #{id}",
"ERROR": "Error loading orders",
"NO_SHOPIFY_ORDERS": "No orders found",
"ERROR": "অর্ডার লোড করতে সমস্যা হয়েছে",
"NO_SHOPIFY_ORDERS": "কোনো অর্ডার পাওয়া যায়নি",
"FINANCIAL_STATUS": {
"PENDING": "Pending",
"AUTHORIZED": "Authorized",
"PARTIALLY_PAID": "Partially Paid",
"PAID": "Paid",
"PARTIALLY_REFUNDED": "Partially Refunded",
"REFUNDED": "Refunded",
"VOIDED": "Voided"
"PENDING": "অপেক্ষমাণ",
"AUTHORIZED": "অনুমোদিত",
"PARTIALLY_PAID": "আংশিক পরিশোধিত",
"PAID": "পরিশোধিত",
"PARTIALLY_REFUNDED": "আংশিক ফেরত",
"REFUNDED": "ফেরত",
"VOIDED": "বাতিল"
},
"FULFILLMENT_STATUS": {
"FULFILLED": "Fulfilled",
"PARTIALLY_FULFILLED": "Partially Fulfilled",
"UNFULFILLED": "Unfulfilled"
"FULFILLED": "সম্পন্ন",
"PARTIALLY_FULFILLED": "আংশিক সম্পন্ন",
"UNFULFILLED": "অসম্পন্ন"
}
}
},
"CONVERSATION_CUSTOM_ATTRIBUTES": {
"ADD_BUTTON_TEXT": "Create attribute",
"NO_RECORDS_FOUND": "No attributes found",
"ADD_BUTTON_TEXT": "অ্যাট্রিবিউট তৈরি করুন",
"NO_RECORDS_FOUND": "কোনো অ্যাট্রিবিউট পাওয়া যায়নি",
"UPDATE": {
"SUCCESS": "Attribute updated successfully",
"ERROR": "Unable to update attribute. Please try again later"
"SUCCESS": "অ্যাট্রিবিউট সফলভাবে আপডেট হয়েছে",
"ERROR": "অ্যাট্রিবিউট আপডেট করা যায়নি। পরে আবার চেষ্টা করুন"
},
"ADD": {
"TITLE": "Add",
"SUCCESS": "Attribute added successfully",
"ERROR": "Unable to add attribute. Please try again later"
"TITLE": "যোগ করুন",
"SUCCESS": "অ্যাট্রিবিউট সফলভাবে যোগ হয়েছে",
"ERROR": "অ্যাট্রিবিউট যোগ করা যায়নি। পরে আবার চেষ্টা করুন"
},
"DELETE": {
"SUCCESS": "Attribute deleted successfully",
"ERROR": "Unable to delete attribute. Please try again later"
"SUCCESS": "অ্যাট্রিবিউট সফলভাবে মুছে ফেলা হয়েছে",
"ERROR": "অ্যাট্রিবিউট মুছে ফেলা যায়নি। পরে আবার চেষ্টা করুন"
},
"ATTRIBUTE_SELECT": {
"TITLE": "Add attributes",
"PLACEHOLDER": "Search attributes",
"NO_RESULT": "No attributes found"
"TITLE": "অ্যাট্রিবিউট যোগ করুন",
"PLACEHOLDER": "অ্যাট্রিবিউট অনুসন্ধান করুন",
"NO_RESULT": "কোনো অ্যাট্রিবিউট পাওয়া যায়নি"
}
},
"EMAIL_HEADER": {
"FROM": "From",
"TO": "To",
"BCC": "Bcc",
"CC": "Cc",
"SUBJECT": "Subject",
"EXPAND": "Expand email"
"FROM": "প্রেরক",
"TO": "প্রাপক",
"BCC": "বিসিসি",
"CC": "সিসি",
"SUBJECT": "বিষয়",
"EXPAND": "ইমেইল প্রসারিত করুন"
},
"CONVERSATION_PARTICIPANTS": {
"SIDEBAR_MENU_TITLE": "Participating",
"SIDEBAR_TITLE": "Conversation participants",
"NO_RECORDS_FOUND": "No results found",
"ADD_PARTICIPANTS": "Select participants",
"SIDEBAR_MENU_TITLE": "অংশগ্রহণকারী",
"SIDEBAR_TITLE": "আলোচনার অংশগ্রহণকারীরা",
"NO_RECORDS_FOUND": "কোনো ফলাফল পাওয়া যায়নি",
"ADD_PARTICIPANTS": "অংশগ্রহণকারী নির্বাচন করুন",
"REMANING_PARTICIPANTS_TEXT": "+{count} others",
"REMANING_PARTICIPANT_TEXT": "+{count} other",
"TOTAL_PARTICIPANTS_TEXT": "{count} people are participating.",
"TOTAL_PARTICIPANT_TEXT": "{count} person is participating.",
"NO_PARTICIPANTS_TEXT": "No one is participating!.",
"WATCH_CONVERSATION": "Join conversation",
"YOU_ARE_WATCHING": "You are participating",
"WATCH_CONVERSATION": "আলাপচারিতায় যোগ দিন",
"YOU_ARE_WATCHING": "আপনি অংশগ্রহণ করছেন",
"API": {
"ERROR_MESSAGE": "Could not update, try again!",
"SUCCESS_MESSAGE": "Participants updated!"
"ERROR_MESSAGE": "আপডেট করা যায়নি, আবার চেষ্টা করুন!",
"SUCCESS_MESSAGE": "অংশগ্রহণকারীরা আপডেট হয়েছে!"
}
},
"TRANSLATE_MODAL": {
"TITLE": "View translated content",
"TITLE": "অনুবাদিত বিষয়বস্তু দেখুন",
"DESC": "You can view the translated content in each langauge.",
"ORIGINAL_CONTENT": "Original Content",
"TRANSLATED_CONTENT": "Translated Content",
"NO_TRANSLATIONS_AVAILABLE": "No translations are available for this content"
"ORIGINAL_CONTENT": "মূল বিষয়বস্তু",
"TRANSLATED_CONTENT": "অনুবাদিত বিষয়বস্তু",
"NO_TRANSLATIONS_AVAILABLE": "এই বিষয়বস্তুর জন্য কোনো অনুবাদ নেই"
},
"TYPING": {
"ONE": "{user} is typing",
@@ -444,9 +444,9 @@
"MULTIPLE": "{user} and {count} others are typing"
},
"COPILOT": {
"TRY_THESE_PROMPTS": "Try these prompts"
"TRY_THESE_PROMPTS": "এই পরামর্শগুলো চেষ্টা করুন"
},
"GALLERY_VIEW": {
"ERROR_DOWNLOADING": "Unable to download attachment. Please try again"
"ERROR_DOWNLOADING": "সংযুক্তি ডাউনলোড করা যাচ্ছে না। আবার চেষ্টা করুন"
}
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,106 +1,106 @@
{
"MFA_SETTINGS": {
"TITLE": "Two-Factor Authentication",
"SUBTITLE": "Protect your account from unauthorized access with TOTP-based authentication. This adds an extra layer of security to your account.",
"DESCRIPTION": "Add an extra layer of security to your account using a time-based one-time password (TOTP)",
"STATUS_TITLE": "Authentication Status",
"STATUS_DESCRIPTION": "Manage your two-factor authentication settings and backup recovery codes",
"ENABLED": "Enabled",
"DISABLED": "Disabled",
"STATUS_ENABLED": "Two-factor authentication is active",
"STATUS_ENABLED_DESC": "Your account is protected with an additional layer of security",
"ENABLE_BUTTON": "Enable Two-Factor Authentication",
"ENHANCE_SECURITY": "Enhance Your Account Security",
"ENHANCE_SECURITY_DESC": "Two-factor authentication adds an extra layer of security by requiring a verification code from your authenticator app in addition to your password.",
"TITLE": "দ্বি-স্তরীয় প্রমাণীকরণ",
"SUBTITLE": "TOTP-ভিত্তিক প্রমাণীকরণের মাধ্যমে আপনার অ্যাকাউন্টকে অননুমোদিত প্রবেশ থেকে সুরক্ষিত করুন। এটি আপনার অ্যাকাউন্টে অতিরিক্ত নিরাপত্তা যোগ করে.",
"DESCRIPTION": "সময়-ভিত্তিক একবারের পাসওয়ার্ড (TOTP) ব্যবহার করে আপনার অ্যাকাউন্টে অতিরিক্ত নিরাপত্তা যোগ করুন",
"STATUS_TITLE": "প্রমাণীকরণের অবস্থা",
"STATUS_DESCRIPTION": "আপনার দ্বি-স্তরীয় প্রমাণীকরণ সেটিংস এবং ব্যাকআপ পুনরুদ্ধার কোডগুলি পরিচালনা করুন",
"ENABLED": "সক্রিয়",
"DISABLED": "নিষ্ক্রিয়",
"STATUS_ENABLED": "দ্বি-স্তরীয় প্রমাণীকরণ সক্রিয় আছে",
"STATUS_ENABLED_DESC": "আপনার অ্যাকাউন্ট অতিরিক্ত নিরাপত্তা স্তর দ্বারা সুরক্ষিত",
"ENABLE_BUTTON": "দ্বি-স্তরীয় প্রমাণীকরণ চালু করুন",
"ENHANCE_SECURITY": "আপনার অ্যাকাউন্টের নিরাপত্তা বৃদ্ধি করুন",
"ENHANCE_SECURITY_DESC": "দ্বি-স্তরীয় প্রমাণীকরণ আপনার নিরাপত্তা আরও বাড়ায়, কারণ এটি আপনার পাসওয়ার্ডের পাশাপাশি আপনার authenticator অ্যাপ থেকে একটি যাচাইকরণ কোড চায়.",
"SETUP": {
"STEP_NUMBER_1": "1",
"STEP_NUMBER_2": "2",
"STEP1_TITLE": "Scan QR Code with Your Authenticator App",
"STEP1_DESCRIPTION": "Use Google Authenticator, Authy, or any TOTP-compatible app",
"LOADING_QR": "Loading...",
"MANUAL_ENTRY": "Can't scan? Enter code manually",
"SECRET_KEY": "Secret Key",
"COPY": "Copy",
"ENTER_CODE": "Enter the 6-digit code from your authenticator app",
"ENTER_CODE_PLACEHOLDER": "000000",
"VERIFY_BUTTON": "Verify & Continue",
"CANCEL": "Cancel",
"ERROR_STARTING": "MFA not enabled. Please contact administrator.",
"INVALID_CODE": "Invalid verification code",
"SECRET_COPIED": "Secret key copied to clipboard",
"SUCCESS": "Two-factor authentication has been enabled successfully"
"STEP_NUMBER_1": "",
"STEP_NUMBER_2": "",
"STEP1_TITLE": "আপনার Authenticator অ্যাপ দিয়ে QR কোড স্ক্যান করুন",
"STEP1_DESCRIPTION": "Google Authenticator, Authy, অথবা যেকোনো TOTP-সামঞ্জস্যপূর্ণ অ্যাপ ব্যবহার করুন",
"LOADING_QR": "লোড হচ্ছে...",
"MANUAL_ENTRY": "স্ক্যান করতে পারছেন না? কোডটি ম্যানুয়ালি লিখুন",
"SECRET_KEY": "সিক্রেট কী",
"COPY": "কপি করুন",
"ENTER_CODE": "আপনার অথেন্টিকেটর অ্যাপ থেকে ৬-সংখ্যার কোডটি লিখুন",
"ENTER_CODE_PLACEHOLDER": "০০০০০০",
"VERIFY_BUTTON": "যাচাই করুন ও চালিয়ে যান",
"CANCEL": "বাতিল করুন",
"ERROR_STARTING": "MFA সক্রিয় নয়। অনুগ্রহ করে প্রশাসকের সাথে যোগাযোগ করুন.",
"INVALID_CODE": "ভুল যাচাইকরণ কোড",
"SECRET_COPIED": "সিক্রেট কী ক্লিপবোর্ডে কপি করা হয়েছে",
"SUCCESS": "দ্বৈত-ধাপ যাচাইকরণ সফলভাবে সক্রিয় করা হয়েছে"
},
"BACKUP": {
"TITLE": "Save Your Backup Codes",
"DESCRIPTION": "Keep these codes safe. Each can be used once if you lose access to your authenticator",
"IMPORTANT": "Important:",
"IMPORTANT_NOTE": " Save these codes in a secure location. You won't be able to see them again.",
"DOWNLOAD": "Download",
"COPY_ALL": "Copy All",
"CONFIRM": "I have saved my backup codes in a secure location and understand that I won't be able to see them again",
"COMPLETE_SETUP": "Complete Setup",
"CODES_COPIED": "Backup codes copied to clipboard"
"TITLE": "আপনার ব্যাকআপ কোড সংরক্ষণ করুন",
"DESCRIPTION": "এই কোডগুলো নিরাপদে রাখুন। আপনার অথেন্টিকেটরে প্রবেশ হারালে প্রতিটি কোড একবার করে ব্যবহার করা যাবে",
"IMPORTANT": "গুরুত্বপূর্ণ:",
"IMPORTANT_NOTE": " এই কোডগুলো নিরাপদ স্থানে সংরক্ষণ করুন। আপনি এগুলো আর দেখতে পারবেন না.",
"DOWNLOAD": "ডাউনলোড করুন",
"COPY_ALL": "সব কপি করুন",
"CONFIRM": "আমি আমার ব্যাকআপ কোডগুলো নিরাপদ স্থানে সংরক্ষণ করেছি এবং বুঝতে পেরেছি যে এগুলো আমি আর দেখতে পারব না",
"COMPLETE_SETUP": "সেটআপ সম্পন্ন করুন",
"CODES_COPIED": "ব্যাকআপ কোডগুলো ক্লিপবোর্ডে কপি করা হয়েছে"
},
"MANAGEMENT": {
"BACKUP_CODES": "Backup Codes",
"BACKUP_CODES_DESC": "Generate new codes if you've lost or used your existing ones",
"REGENERATE": "Regenerate Backup Codes",
"DISABLE_MFA": "Disable 2FA",
"DISABLE_MFA_DESC": "Remove two-factor authentication from your account",
"DISABLE_BUTTON": "Disable Two-Factor Authentication"
"BACKUP_CODES": "ব্যাকআপ কোড",
"BACKUP_CODES_DESC": "আপনার বিদ্যমান কোডগুলো হারিয়ে গেলে বা ব্যবহার হয়ে গেলে নতুন কোড তৈরি করুন",
"REGENERATE": "ব্যাকআপ কোড পুনরায় তৈরি করুন",
"DISABLE_MFA": "২এফএ নিষ্ক্রিয় করুন",
"DISABLE_MFA_DESC": "আপনার অ্যাকাউন্ট থেকে দুই-ধাপ যাচাইকরণ সরান",
"DISABLE_BUTTON": "দুই-ধাপ যাচাইকরণ নিষ্ক্রিয় করুন"
},
"DISABLE": {
"TITLE": "Disable Two-Factor Authentication",
"DESCRIPTION": "You'll need to enter your password and a verification code to disable two-factor authentication.",
"PASSWORD": "Password",
"OTP_CODE": "Verification Code",
"OTP_CODE_PLACEHOLDER": "000000",
"CONFIRM": "Disable 2FA",
"CANCEL": "Cancel",
"SUCCESS": "Two-factor authentication has been disabled",
"ERROR": "Failed to disable MFA. Please check your credentials."
"TITLE": "দুই-ধাপ যাচাইকরণ নিষ্ক্রিয় করুন",
"DESCRIPTION": "দুই-ধাপ যাচাইকরণ নিষ্ক্রিয় করতে আপনাকে আপনার পাসওয়ার্ড এবং একটি যাচাইকরণ কোড প্রবেশ করতে হবে.",
"PASSWORD": "পাসওয়ার্ড",
"OTP_CODE": "ভেরিফিকেশন কোড",
"OTP_CODE_PLACEHOLDER": "০০০০০০",
"CONFIRM": "2FA নিষ্ক্রিয় করুন",
"CANCEL": "বাতিল করুন",
"SUCCESS": "টু-ফ্যাক্টর অথেন্টিকেশন নিষ্ক্রিয় করা হয়েছে",
"ERROR": "MFA নিষ্ক্রিয় করতে ব্যর্থ হয়েছে। অনুগ্রহ করে আপনার শংসাপত্র যাচাই করুন."
},
"REGENERATE": {
"TITLE": "Regenerate Backup Codes",
"DESCRIPTION": "This will invalidate your existing backup codes and generate new ones. Enter your verification code to continue.",
"OTP_CODE": "Verification Code",
"OTP_CODE_PLACEHOLDER": "000000",
"CONFIRM": "Generate New Codes",
"CANCEL": "Cancel",
"NEW_CODES_TITLE": "New Backup Codes Generated",
"NEW_CODES_DESC": "Your old backup codes have been invalidated. Save these new codes in a secure location.",
"CODES_IMPORTANT": "Important:",
"CODES_IMPORTANT_NOTE": " Each code can only be used once. Save them before closing this window.",
"DOWNLOAD_CODES": "Download Codes",
"COPY_ALL_CODES": "Copy All Codes",
"CODES_SAVED": "I've Saved My Codes",
"SUCCESS": "New backup codes have been generated",
"ERROR": "Failed to regenerate backup codes"
"TITLE": "ব্যাকআপ কোড পুনরায় তৈরি করুন",
"DESCRIPTION": "এটি আপনার বর্তমান ব্যাকআপ কোডসমূহ বাতিল করবে এবং নতুন কোড তৈরি করবে। চালিয়ে যেতে আপনার যাচাইকরণ কোড দিন.",
"OTP_CODE": "যাচাইকরণ কোড",
"OTP_CODE_PLACEHOLDER": "০০০০০০",
"CONFIRM": "নতুন কোড তৈরি করুন",
"CANCEL": "বাতিল করুন",
"NEW_CODES_TITLE": "নতুন ব্যাকআপ কোড তৈরি হয়েছে",
"NEW_CODES_DESC": "আপনার পুরোনো ব্যাকআপ কোডগুলো বাতিল করা হয়েছে। এই নতুন কোডগুলো নিরাপদ স্থানে সংরক্ষণ করুন.",
"CODES_IMPORTANT": "গুরুত্বপূর্ণ:",
"CODES_IMPORTANT_NOTE": " প্রতিটি কোড শুধুমাত্র একবার ব্যবহার করা যাবে। এই উইন্ডো বন্ধ করার আগে কোডগুলো সংরক্ষণ করুন.",
"DOWNLOAD_CODES": "কোড ডাউনলোড করুন",
"COPY_ALL_CODES": "সব কোড কপি করুন",
"CODES_SAVED": "আমি আমার কোডগুলো সংরক্ষণ করেছি",
"SUCCESS": "নতুন ব্যাকআপ কোড তৈরি হয়েছে",
"ERROR": "ব্যাকআপ কোড পুনরায় তৈরি করতে ব্যর্থ হয়েছে"
}
},
"MFA_VERIFICATION": {
"TITLE": "Two-Factor Authentication",
"DESCRIPTION": "Enter your verification code to continue",
"AUTHENTICATOR_APP": "Authenticator App",
"BACKUP_CODE": "Backup Code",
"ENTER_OTP_CODE": "Enter 6-digit code from your authenticator app",
"ENTER_BACKUP_CODE": "Enter one of your backup codes",
"BACKUP_CODE_PLACEHOLDER": "000000",
"VERIFY_BUTTON": "Verify",
"TRY_ANOTHER_METHOD": "Try another verification method",
"CANCEL_LOGIN": "Cancel and return to login",
"HELP_TEXT": "Having trouble signing in?",
"LEARN_MORE": "Learn more about 2FA",
"TITLE": "দ্বি-স্তরীয় প্রমাণীকরণ",
"DESCRIPTION": "চালিয়ে যেতে আপনার যাচাইকরণ কোড দিন",
"AUTHENTICATOR_APP": "অথেন্টিকেটর অ্যাপ",
"BACKUP_CODE": "ব্যাকআপ কোড",
"ENTER_OTP_CODE": "আপনার authenticator অ্যাপ থেকে ৬-সংখ্যার কোডটি লিখুন",
"ENTER_BACKUP_CODE": "আপনার ব্যাকআপ কোডগুলোর মধ্যে একটি লিখুন",
"BACKUP_CODE_PLACEHOLDER": "০০০০০০",
"VERIFY_BUTTON": "যাচাই করুন",
"TRY_ANOTHER_METHOD": "অন্য একটি যাচাইকরণ পদ্ধতি চেষ্টা করুন",
"CANCEL_LOGIN": "বাতিল করুন এবং লগইন পৃষ্ঠায় ফিরে যান",
"HELP_TEXT": "সাইন ইন করতে সমস্যা হচ্ছে?",
"LEARN_MORE": "2FA সম্পর্কে আরও জানুন",
"HELP_MODAL": {
"TITLE": "Two-Factor Authentication Help",
"AUTHENTICATOR_TITLE": "Using an Authenticator App",
"AUTHENTICATOR_DESC": "Open your authenticator app (Google Authenticator, Authy, etc.) and enter the 6-digit code shown for your account.",
"BACKUP_TITLE": "Using a Backup Code",
"BACKUP_DESC": "If you don't have access to your authenticator app, you can use one of the backup codes you saved when setting up 2FA. Each code can only be used once.",
"CONTACT_TITLE": "Need More Help?",
"CONTACT_DESC_CLOUD": "If you've lost access to both your authenticator app and backup codes, please reach out to Chatwoot support for assistance.",
"CONTACT_DESC_SELF_HOSTED": "If you've lost access to both your authenticator app and backup codes, please contact your administrator for assistance."
"TITLE": "টু-ফ্যাক্টর অথেন্টিকেশন সহায়তা",
"AUTHENTICATOR_TITLE": "অথেন্টিকেটর অ্যাপ ব্যবহার করা হচ্ছে",
"AUTHENTICATOR_DESC": "আপনার authenticator অ্যাপ (Google Authenticator, Authy, ইত্যাদি) খুলুন এবং আপনার অ্যাকাউন্টের জন্য দেখানো ৬-সংখ্যার কোডটি লিখুন.",
"BACKUP_TITLE": "ব্যাকআপ কোড ব্যবহার করুন",
"BACKUP_DESC": "যদি আপনার authenticator অ্যাপে প্রবেশাধিকার না থাকে, তাহলে 2FA সেটআপ করার সময় সংরক্ষণ করা ব্যাকআপ কোডগুলোর যেকোনো একটি ব্যবহার করতে পারেন। প্রতিটি কোড কেবল একবারই ব্যবহার করা যাবে.",
"CONTACT_TITLE": "আরও সাহায্য দরকার?",
"CONTACT_DESC_CLOUD": "আপনি যদি আপনার authenticator অ্যাপ এবং ব্যাকআপ কোড দুটোই হারিয়ে ফেলেন, তাহলে সহায়তার জন্য অনুগ্রহ করে Chatwoot সাপোর্ট টিমের সাথে যোগাযোগ করুন.",
"CONTACT_DESC_SELF_HOSTED": "আপনি যদি আপনার authenticator অ্যাপ এবং ব্যাকআপ কোড দুটোই হারিয়ে ফেলেন, সহায়তার জন্য অনুগ্রহ করে আপনার অ্যাডমিনিস্ট্রেটরের সাথে যোগাযোগ করুন."
},
"VERIFICATION_FAILED": "Verification failed. Please try again."
"VERIFICATION_FAILED": "ভেরিফিকেশন ব্যর্থ হয়েছে। অনুগ্রহ করে আবার চেষ্টা করুন."
}
}
@@ -1,125 +1,125 @@
{
"REPORT": {
"HEADER": "Conversations",
"LOADING_CHART": "Loading chart data...",
"NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
"DOWNLOAD_CONVERSATION_REPORTS": "Download conversation reports",
"DATA_FETCHING_FAILED": "Failed to fetch data, please try again later.",
"SUMMARY_FETCHING_FAILED": "Failed to fetch summary, please try again later.",
"HEADER": "কথোপকথন",
"LOADING_CHART": "চার্ট ডেটা লোড হচ্ছে...",
"NO_ENOUGH_DATA": "রিপোর্ট তৈরি করার জন্য যথেষ্ট ডেটা নেই, পরে আবার চেষ্টা করুন।",
"DOWNLOAD_CONVERSATION_REPORTS": "কথোপকথনের রিপোর্ট ডাউনলোড করুন",
"DATA_FETCHING_FAILED": "তথ্য আনতে ব্যর্থ হয়েছে, পরে আবার চেষ্টা করুন।",
"SUMMARY_FETCHING_FAILED": "সারাংশ আনতে ব্যর্থ হয়েছে, পরে আবার চেষ্টা করুন।",
"METRICS": {
"CONVERSATIONS": {
"NAME": "Conversations",
"DESC": "( Total )"
"NAME": "কনভার্সেশন",
"DESC": "( মোট )"
},
"INCOMING_MESSAGES": {
"NAME": "Messages received",
"DESC": "( Total )"
"NAME": "প্রাপ্ত বার্তা",
"DESC": "( মোট )"
},
"OUTGOING_MESSAGES": {
"NAME": "Messages sent",
"DESC": "( Total )"
"NAME": "প্রেরিত বার্তা",
"DESC": "( মোট )"
},
"FIRST_RESPONSE_TIME": {
"NAME": "First Response Time",
"DESC": "( Avg )",
"INFO_TEXT": "Total number of conversations used for computation:",
"NAME": "প্রথম সাড়া দেওয়ার সময়",
"DESC": "( গড় )",
"INFO_TEXT": "গণনার জন্য ব্যবহৃত মোট কথোপকথনের সংখ্যা:",
"TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)"
},
"RESOLUTION_TIME": {
"NAME": "Resolution Time",
"DESC": "( Avg )",
"INFO_TEXT": "Total number of conversations used for computation:",
"NAME": "সমাধানের সময়",
"DESC": "( গড় )",
"INFO_TEXT": "গণনার জন্য ব্যবহৃত মোট কথোপকথনের সংখ্যা:",
"TOOLTIP_TEXT": "Resolution Time is {metricValue} (based on {conversationCount} conversations)"
},
"RESOLUTION_COUNT": {
"NAME": "Resolution Count",
"DESC": "( Total )"
"NAME": "সমাধানের সংখ্যা",
"DESC": "( মোট )"
},
"BOT_RESOLUTION_COUNT": {
"NAME": "Resolution Count",
"DESC": "( Total )"
"NAME": "সমাধানের সংখ্যা",
"DESC": "( মোট )"
},
"BOT_HANDOFF_COUNT": {
"NAME": "Handoff Count",
"DESC": "( Total )"
"NAME": "হস্তান্তরের সংখ্যা",
"DESC": "( মোট )"
},
"REPLY_TIME": {
"NAME": "Customer waiting time",
"NAME": "গ্রাহকের অপেক্ষার সময়",
"TOOLTIP_TEXT": "Waiting time is {metricValue} (based on {conversationCount} replies)",
"DESC": ""
}
},
"DATE_RANGE_OPTIONS": {
"LAST_7_DAYS": "Last 7 days",
"LAST_14_DAYS": "Last 14 days",
"LAST_30_DAYS": "Last 30 days",
"THIS_MONTH": "This month",
"LAST_MONTH": "Last month",
"LAST_3_MONTHS": "Last 3 months",
"LAST_6_MONTHS": "Last 6 months",
"LAST_YEAR": "Last year",
"CUSTOM_DATE_RANGE": "Custom date range"
"LAST_7_DAYS": "গত দিন",
"LAST_14_DAYS": "গত ১৪ দিন",
"LAST_30_DAYS": "গত ৩০ দিন",
"THIS_MONTH": "এই মাস",
"LAST_MONTH": "গত মাস",
"LAST_3_MONTHS": "গত ৩ মাস",
"LAST_6_MONTHS": "গত ৬ মাস",
"LAST_YEAR": "গত বছর",
"CUSTOM_DATE_RANGE": "কাস্টম তারিখ পরিসর"
},
"CUSTOM_DATE_RANGE": {
"CONFIRM": "Apply",
"PLACEHOLDER": "Select date range"
"CONFIRM": "প্রয়োগ করুন",
"PLACEHOLDER": "তারিখ নির্বাচন করুন"
},
"GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By",
"DURATION_FILTER_LABEL": "Duration",
"GROUP_BY_FILTER_DROPDOWN_LABEL": "গ্রুপ করুন",
"DURATION_FILTER_LABEL": "সময়কাল",
"GROUPING_OPTIONS": {
"DAY": "Day",
"WEEK": "Week",
"MONTH": "Month",
"YEAR": "Year"
"DAY": "দিন",
"WEEK": "সপ্তাহ",
"MONTH": "মাস",
"YEAR": "বছর"
},
"GROUP_BY_DAY_OPTIONS": [
{
"id": 1,
"groupBy": "Day"
"groupBy": "দিন"
}
],
"GROUP_BY_WEEK_OPTIONS": [
{
"id": 1,
"groupBy": "Day"
"groupBy": "দিন"
},
{
"id": 2,
"groupBy": "Week"
"groupBy": "সপ্তাহ"
}
],
"GROUP_BY_MONTH_OPTIONS": [
{
"id": 1,
"groupBy": "Day"
"groupBy": "দিন"
},
{
"id": 2,
"groupBy": "Week"
"groupBy": "সপ্তাহ"
},
{
"id": 3,
"groupBy": "Month"
"groupBy": "মাস"
}
],
"GROUP_BY_YEAR_OPTIONS": [
{
"id": 2,
"groupBy": "Week"
"groupBy": "সপ্তাহ"
},
{
"id": 3,
"groupBy": "Month"
"groupBy": "মাস"
},
{
"id": 4,
"groupBy": "Year"
"groupBy": "বছর"
}
],
"BUSINESS_HOURS": "Business Hours",
"BUSINESS_HOURS": "ব্যবসায়িক সময়",
"FILTER_ACTIONS": {
"CLEAR_FILTER": "Clear filter",
"EMPTY_LIST": "No results found"
"CLEAR_FILTER": "ফিল্টার পরিষ্কার করুন",
"EMPTY_LIST": "কোনও ফলাফল পাওয়া যায়নি"
},
"PAGINATION": {
"RESULTS": "Showing {start} to {end} of {total} results",
@@ -127,524 +127,524 @@
}
},
"AGENT_REPORTS": {
"HEADER": "Agents Overview",
"DESCRIPTION": "Easily track agent performance with key metrics such as conversations, response times, resolution times, and resolved cases. Click an agent's name to learn more.",
"LOADING_CHART": "Loading chart data...",
"NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
"DOWNLOAD_AGENT_REPORTS": "Download agent reports",
"FILTER_DROPDOWN_LABEL": "Select Agent",
"HEADER": "এজেন্ট সংক্ষিপ্ত বিবরণ",
"DESCRIPTION": "কথোপকথন, সাড়া দেওয়ার সময়, সমাধানের সময় ও সমাধানকৃত কেসসহ গুরুত্বপূর্ণ মেট্রিক্সে সহজেই এজেন্ট পারফরম্যান্স ট্র্যাক করুন। আরও জানতে এজেন্টের নাম ক্লিক করুন।",
"LOADING_CHART": "চার্ট ডেটা লোড হচ্ছে...",
"NO_ENOUGH_DATA": "রিপোর্ট তৈরি করার জন্য যথেষ্ট ডেটা নেই, পরে আবার চেষ্টা করুন।",
"DOWNLOAD_AGENT_REPORTS": "এজেন্ট রিপোর্ট ডাউনলোড করুন",
"FILTER_DROPDOWN_LABEL": "এজেন্ট নির্বাচন করুন",
"FILTERS": {
"INPUT_PLACEHOLDER": {
"AGENTS": "Search agents"
"AGENTS": "এজেন্ট খুঁজুন"
}
},
"METRICS": {
"CONVERSATIONS": {
"NAME": "Conversations",
"DESC": "( Total )"
"NAME": "কনভার্সেশন",
"DESC": "( মোট )"
},
"INCOMING_MESSAGES": {
"NAME": "Incoming Messages",
"DESC": "( Total )"
"NAME": "আসা বার্তা",
"DESC": "( মোট )"
},
"OUTGOING_MESSAGES": {
"NAME": "Outgoing Messages",
"DESC": "( Total )"
"NAME": "প্রেরিত বার্তা",
"DESC": "( মোট )"
},
"FIRST_RESPONSE_TIME": {
"NAME": "First Response Time",
"DESC": "( Avg )",
"INFO_TEXT": "Total number of conversations used for computation:",
"NAME": "প্রথম সাড়া দেওয়ার সময়",
"DESC": "( গড় )",
"INFO_TEXT": "গণনার জন্য ব্যবহৃত মোট কথোপকথনের সংখ্যা:",
"TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)"
},
"RESOLUTION_TIME": {
"NAME": "Resolution Time",
"DESC": "( Avg )",
"INFO_TEXT": "Total number of conversations used for computation:",
"NAME": "সমাধান সময়",
"DESC": "( গড় )",
"INFO_TEXT": "গণনার জন্য ব্যবহৃত মোট কথোপকথনের সংখ্যা:",
"TOOLTIP_TEXT": "Resolution Time is {metricValue} (based on {conversationCount} conversations)"
},
"RESOLUTION_COUNT": {
"NAME": "Resolution Count",
"DESC": "( Total )"
"NAME": "সমাধান সংখ্যা",
"DESC": "( মোট )"
}
},
"DATE_RANGE": [
{
"id": 0,
"name": "Last 7 days"
"name": "গত দিন"
},
{
"id": 1,
"name": "Last 30 days"
"name": "গত ৩০ দিন"
},
{
"id": 2,
"name": "Last 3 months"
"name": "গত ৩ মাস"
},
{
"id": 3,
"name": "Last 6 months"
"name": "গত ৬ মাস"
},
{
"id": 4,
"name": "Last year"
"name": "গত বছর"
},
{
"id": 5,
"name": "Custom date range"
"name": "কাস্টম তারিখ পরিসর"
}
],
"CUSTOM_DATE_RANGE": {
"CONFIRM": "Apply",
"PLACEHOLDER": "Select date range"
"CONFIRM": "প্রয়োগ করুন",
"PLACEHOLDER": "তারিখ পরিসর নির্বাচন করুন"
}
},
"LABEL_REPORTS": {
"HEADER": "Labels Overview",
"DESCRIPTION": "Track label performance with key metrics including conversations, response times, resolution times, and resolved cases. Click a label name for detailed insights.",
"LOADING_CHART": "Loading chart data...",
"NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
"DOWNLOAD_LABEL_REPORTS": "Download label reports",
"FILTER_DROPDOWN_LABEL": "Select Label",
"HEADER": "লেবেল সংক্ষিপ্তসার",
"DESCRIPTION": "কথোপকথন, সাড়া দেওয়ার সময়, সমাধানের সময় ও সমাধানকৃত কেসসহ মূল পরিসংখ্যান দিয়ে লেবেলের কার্যকারিতা ট্র্যাক করুন। বিস্তারিত জানতে লেবেলের নাম ক্লিক করুন।",
"LOADING_CHART": "চার্ট ডেটা লোড হচ্ছে...",
"NO_ENOUGH_DATA": "রিপোর্ট তৈরি করার জন্য যথেষ্ট ডেটা নেই, পরে আবার চেষ্টা করুন।",
"DOWNLOAD_LABEL_REPORTS": "লেবেল রিপোর্ট ডাউনলোড করুন",
"FILTER_DROPDOWN_LABEL": "লেবেল নির্বাচন করুন",
"FILTERS": {
"INPUT_PLACEHOLDER": {
"LABELS": "Search labels"
"LABELS": "লেবেল খুঁজুন"
}
},
"METRICS": {
"CONVERSATIONS": {
"NAME": "Conversations",
"DESC": "( Total )"
"NAME": "কনভার্সেশন",
"DESC": "( মোট )"
},
"INCOMING_MESSAGES": {
"NAME": "Incoming Messages",
"DESC": "( Total )"
"NAME": "ইনকামিং মেসেজ",
"DESC": "( মোট )"
},
"OUTGOING_MESSAGES": {
"NAME": "Outgoing Messages",
"DESC": "( Total )"
"NAME": "আউটগোয়িং মেসেজ",
"DESC": "( মোট )"
},
"FIRST_RESPONSE_TIME": {
"NAME": "First Response Time",
"DESC": "( Avg )",
"INFO_TEXT": "Total number of conversations used for computation:",
"NAME": "প্রথম সাড়া সময়",
"DESC": "( গড় )",
"INFO_TEXT": "গণনার জন্য ব্যবহৃত মোট কথোপকথনের সংখ্যা:",
"TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)"
},
"RESOLUTION_TIME": {
"NAME": "Resolution Time",
"DESC": "( Avg )",
"INFO_TEXT": "Total number of conversations used for computation:",
"NAME": "সমাধানের সময়",
"DESC": "( গড় )",
"INFO_TEXT": "গণনার জন্য ব্যবহৃত মোট কথোপকথনের সংখ্যা:",
"TOOLTIP_TEXT": "Resolution Time is {metricValue} (based on {conversationCount} conversations)"
},
"RESOLUTION_COUNT": {
"NAME": "Resolution Count",
"DESC": "( Total )"
"NAME": "সমাধান সংখ্যা",
"DESC": "( মোট )"
}
},
"DATE_RANGE": [
{
"id": 0,
"name": "Last 7 days"
"name": "গত দিন"
},
{
"id": 1,
"name": "Last 30 days"
"name": "গত ৩০ দিন"
},
{
"id": 2,
"name": "Last 3 months"
"name": "গত ৩ মাস"
},
{
"id": 3,
"name": "Last 6 months"
"name": "গত ৬ মাস"
},
{
"id": 4,
"name": "Last year"
"name": "গত বছর"
},
{
"id": 5,
"name": "Custom date range"
"name": "কাস্টম তারিখ পরিসর"
}
],
"CUSTOM_DATE_RANGE": {
"CONFIRM": "Apply",
"PLACEHOLDER": "Select date range"
"CONFIRM": "প্রয়োগ করুন",
"PLACEHOLDER": "তারিখের পরিসর নির্বাচন করুন"
}
},
"INBOX_REPORTS": {
"HEADER": "Inbox Overview",
"DESCRIPTION": "Quickly view your inbox performance with key metrics like conversations, response times, resolution times, and resolved cases—all in one place. Click an inbox name for more details.",
"LOADING_CHART": "Loading chart data...",
"NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
"DOWNLOAD_INBOX_REPORTS": "Download inbox reports",
"FILTER_DROPDOWN_LABEL": "Select Inbox",
"ALL_INBOXES": "All Inboxes",
"SEARCH_INBOX": "Search Inbox",
"HEADER": "ইনবক্স সংক্ষিপ্ত বিবরণ",
"DESCRIPTION": "কথোপকথন, সাড়া দেওয়ার সময়, সমাধানের সময় ও সমাধানকৃত কেসসহ গুরুত্বপূর্ণ মেট্রিক্সে আপনার ইনবক্সের পারফরম্যান্স এক জায়গায় দ্রুত দেখুন। আরও জানতে ইনবক্সের নাম ক্লিক করুন।",
"LOADING_CHART": "চার্ট ডেটা লোড হচ্ছে...",
"NO_ENOUGH_DATA": "রিপোর্ট তৈরির জন্য যথেষ্ট ডেটা নেই, পরে আবার চেষ্টা করুন।",
"DOWNLOAD_INBOX_REPORTS": "ইনবক্স রিপোর্ট ডাউনলোড করুন",
"FILTER_DROPDOWN_LABEL": "ইনবক্স নির্বাচন করুন",
"ALL_INBOXES": "সব ইনবক্স",
"SEARCH_INBOX": "ইনবক্সে খুঁজুন",
"FILTERS": {
"INPUT_PLACEHOLDER": {
"INBOXES": "Search inboxes"
"INBOXES": "ইনবক্স খুঁজুন"
}
},
"METRICS": {
"CONVERSATIONS": {
"NAME": "Conversations",
"DESC": "( Total )"
"NAME": "কনভার্সেশন",
"DESC": "( মোট )"
},
"INCOMING_MESSAGES": {
"NAME": "Incoming Messages",
"DESC": "( Total )"
"NAME": "ইনকামিং মেসেজ",
"DESC": "( মোট )"
},
"OUTGOING_MESSAGES": {
"NAME": "Outgoing Messages",
"DESC": "( Total )"
"NAME": "প্রেরিত বার্তা",
"DESC": "(মোট)"
},
"FIRST_RESPONSE_TIME": {
"NAME": "First Response Time",
"DESC": "( Avg )",
"INFO_TEXT": "Total number of conversations used for computation:",
"NAME": "প্রথম সাড়া সময়",
"DESC": "(গড়)",
"INFO_TEXT": "গণনার জন্য ব্যবহৃত মোট কথোপকথনের সংখ্যা:",
"TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)"
},
"RESOLUTION_TIME": {
"NAME": "Resolution Time",
"DESC": "( Avg )",
"INFO_TEXT": "Total number of conversations used for computation:",
"NAME": "সমাধানের সময়",
"DESC": "(গড়)",
"INFO_TEXT": "গণনার জন্য ব্যবহৃত মোট কথোপকথনের সংখ্যা:",
"TOOLTIP_TEXT": "Resolution Time is {metricValue} (based on {conversationCount} conversations)"
},
"RESOLUTION_COUNT": {
"NAME": "Resolution Count",
"DESC": "( Total )"
"NAME": "সমাধানের সংখ্যা",
"DESC": "(মোট)"
}
},
"DATE_RANGE": [
{
"id": 0,
"name": "Last 7 days"
"name": "গত দিন"
},
{
"id": 1,
"name": "Last 30 days"
"name": "গত ৩০ দিন"
},
{
"id": 2,
"name": "Last 3 months"
"name": "গত ৩ মাস"
},
{
"id": 3,
"name": "Last 6 months"
"name": "গত ৬ মাস"
},
{
"id": 4,
"name": "Last year"
"name": "গত বছর"
},
{
"id": 5,
"name": "Custom date range"
"name": "কাস্টম তারিখ পরিসর"
}
],
"CUSTOM_DATE_RANGE": {
"CONFIRM": "Apply",
"PLACEHOLDER": "Select date range"
"CONFIRM": "প্রয়োগ করুন",
"PLACEHOLDER": "তারিখ পরিসর নির্বাচন করুন"
}
},
"TEAM_REPORTS": {
"HEADER": "Team Overview",
"DESCRIPTION": "Get a snapshot of your team's performance with essential metrics, including conversations, response times, resolution times, and resolved cases. Click a team name for more details.",
"LOADING_CHART": "Loading chart data...",
"NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
"DOWNLOAD_TEAM_REPORTS": "Download team reports",
"FILTER_DROPDOWN_LABEL": "Select Team",
"HEADER": "টিমের সারসংক্ষেপ",
"DESCRIPTION": "কথোপকথন, সাড়া দেওয়ার সময়, সমাধানের সময় ও সমাধানকৃত কেসসহ গুরুত্বপূর্ণ মেট্রিক্সে আপনার টিমের পারফরম্যান্সের সারসংক্ষেপ দেখুন। আরও জানতে টিমের নাম ক্লিক করুন।",
"LOADING_CHART": "চার্ট ডেটা লোড হচ্ছে...",
"NO_ENOUGH_DATA": "রিপোর্ট তৈরির জন্য যথেষ্ট ডেটা নেই, পরে আবার চেষ্টা করুন।",
"DOWNLOAD_TEAM_REPORTS": "টিম রিপোর্ট ডাউনলোড করুন",
"FILTER_DROPDOWN_LABEL": "টিম নির্বাচন করুন",
"FILTERS": {
"ADD_FILTER": "Add filter",
"CLEAR_ALL": "Clear all",
"NO_FILTER": "No filters available",
"ADD_FILTER": "ফিল্টার যোগ করুন",
"CLEAR_ALL": "সব মুছুন",
"NO_FILTER": "কোনো ফিল্টার নেই",
"INPUT_PLACEHOLDER": {
"TEAMS": "Search teams"
"TEAMS": "টিম খুঁজুন"
}
},
"METRICS": {
"CONVERSATIONS": {
"NAME": "Conversations",
"DESC": "( Total )"
"NAME": "আলোচনা",
"DESC": "(মোট)"
},
"INCOMING_MESSAGES": {
"NAME": "Incoming Messages",
"DESC": "( Total )"
"NAME": "প্রাপ্ত বার্তা",
"DESC": "(মোট)"
},
"OUTGOING_MESSAGES": {
"NAME": "Outgoing Messages",
"DESC": "( Total )"
"NAME": "প্রেরিত বার্তা",
"DESC": "(মোট)"
},
"FIRST_RESPONSE_TIME": {
"NAME": "First Response Time",
"DESC": "( Avg )",
"INFO_TEXT": "Total number of conversations used for computation:",
"NAME": "প্রথম সাড়া সময়",
"DESC": "(গড়)",
"INFO_TEXT": "গণনার জন্য ব্যবহৃত মোট কথোপকথনের সংখ্যা:",
"TOOLTIP_TEXT": "First Response Time is {metricValue} (based on {conversationCount} conversations)"
},
"RESOLUTION_TIME": {
"NAME": "Resolution Time",
"DESC": "( Avg )",
"INFO_TEXT": "Total number of conversations used for computation:",
"NAME": "সমাধানের সময়",
"DESC": "(গড়)",
"INFO_TEXT": "গণনার জন্য ব্যবহৃত মোট কথোপকথনের সংখ্যা:",
"TOOLTIP_TEXT": "Resolution Time is {metricValue} (based on {conversationCount} conversations)"
},
"RESOLUTION_COUNT": {
"NAME": "Resolution Count",
"NAME": "সমাধানের সংখ্যা",
"DESC": "( Total )"
}
},
"DATE_RANGE": [
{
"id": 0,
"name": "Last 7 days"
"name": "গত দিন"
},
{
"id": 1,
"name": "Last 30 days"
"name": "গত ৩০ দিন"
},
{
"id": 2,
"name": "Last 3 months"
"name": "গত ৩ মাস"
},
{
"id": 3,
"name": "Last 6 months"
"name": "গত ৬ মাস"
},
{
"id": 4,
"name": "Last year"
"name": "গত বছর"
},
{
"id": 5,
"name": "Custom date range"
"name": "কাস্টম তারিখ পরিসর"
}
],
"CUSTOM_DATE_RANGE": {
"CONFIRM": "Apply",
"PLACEHOLDER": "Select date range"
"CONFIRM": "প্রয়োগ করুন",
"PLACEHOLDER": "তারিখ পরিসর নির্বাচন করুন"
}
},
"CSAT_REPORTS": {
"HEADER": "CSAT Reports",
"NO_RECORDS": "No responses yet",
"NO_RECORDS_DESCRIPTION": "CSAT survey responses will appear here once customers start providing feedback.",
"DOWNLOAD": "Download CSAT Reports",
"DOWNLOAD_FAILED": "Failed to download CSAT Reports",
"HEADER": "CSAT রিপোর্ট",
"NO_RECORDS": "এখনও কোনো উত্তর নেই",
"NO_RECORDS_DESCRIPTION": "গ্রাহকরা ফিডব্যাক দিলে এখানে CSAT জরিপের উত্তর দেখা যাবে।",
"DOWNLOAD": "CSAT রিপোর্ট ডাউনলোড করুন",
"DOWNLOAD_FAILED": "CSAT রিপোর্ট ডাউনলোড ব্যর্থ হয়েছে",
"FILTERS": {
"ADD_FILTER": "Add filter",
"CLEAR_ALL": "Clear all",
"NO_FILTER": "No filters available",
"ADD_FILTER": "ফিল্টার যোগ করুন",
"CLEAR_ALL": "সব মুছুন",
"NO_FILTER": "কোনো ফিল্টার নেই",
"INPUT_PLACEHOLDER": {
"AGENTS": "Search agents",
"INBOXES": "Search inboxes",
"TEAMS": "Search teams",
"RATINGS": "Search ratings"
"AGENTS": "এজেন্ট খুঁজুন",
"INBOXES": "ইনবক্স খুঁজুন",
"TEAMS": "টিম খুঁজুন",
"RATINGS": "রেটিং খুঁজুন"
},
"AGENTS": {
"LABEL": "Agent"
"LABEL": "এজেন্ট"
},
"INBOXES": {
"LABEL": "Inbox"
"LABEL": "ইনবক্স"
},
"TEAMS": {
"LABEL": "Team"
"LABEL": "টিম"
},
"RATINGS": {
"LABEL": "Rating"
"LABEL": "রেটিং"
}
},
"TABLE": {
"HEADER": {
"CONTACT_NAME": "Contact",
"AGENT_NAME": "Agent",
"RATING": "Rating",
"FEEDBACK_TEXT": "Feedback comment",
"CONVERSATION": "Conversation",
"CUSTOMER": "Customer",
"RESPONSE": "Response",
"HANDLED_BY": "Handled by"
"CONTACT_NAME": "যোগাযোগ",
"AGENT_NAME": "এজেন্ট",
"RATING": "রেটিং",
"FEEDBACK_TEXT": "মতামত",
"CONVERSATION": "কথোপকথন",
"CUSTOMER": "গ্রাহক",
"RESPONSE": "প্রতিক্রিয়া",
"HANDLED_BY": "যিনি পরিচালনা করেছেন"
},
"UNKNOWN_CUSTOMER": "Unknown customer"
"UNKNOWN_CUSTOMER": "অজানা গ্রাহক"
},
"NO_AGENT": "No assigned agent",
"NO_FEEDBACK": "No feedback provided",
"NO_AGENT": "কোনো এজেন্ট নির্ধারিত নেই",
"NO_FEEDBACK": "কোনো মতামত দেওয়া হয়নি",
"METRIC": {
"TOTAL_RESPONSES": {
"LABEL": "Total responses",
"TOOLTIP": "Total number of responses collected"
"LABEL": "মোট উত্তর",
"TOOLTIP": "মোট সংগৃহীত উত্তর"
},
"SATISFACTION_SCORE": {
"LABEL": "Satisfaction score",
"TOOLTIP": "Total number of positive responses / Total number of responses * 100"
"LABEL": "সন্তুষ্টি স্কোর",
"TOOLTIP": "মোট ইতিবাচক প্রতিক্রিয়া / মোট প্রতিক্রিয়া * ১০০"
},
"RESPONSE_RATE": {
"LABEL": "Response rate",
"TOOLTIP": "Total number of responses / Total number of CSAT survey messages sent * 100"
"LABEL": "প্রতিক্রিয়া হার",
"TOOLTIP": "মোট প্রতিক্রিয়া / মোট CSAT জরিপ বার্তা * ১০০"
},
"RATING_DISTRIBUTION": "Rating distribution"
"RATING_DISTRIBUTION": "রেটিং বণ্টন"
},
"REVIEW_NOTES": {
"TITLE": "Review notes",
"PLACEHOLDER": "Add review notes about this rating...",
"SAVE": "Save",
"CANCEL": "Cancel",
"SAVING": "Saving...",
"SAVED": "Notes saved successfully",
"SAVE_ERROR": "Failed to save notes",
"TITLE": "নোটসমূহ পর্যালোচনা করুন",
"PLACEHOLDER": "এই রেটিং সম্পর্কে পর্যালোচনার নোট যোগ করুন...",
"SAVE": "সংরক্ষণ করুন",
"CANCEL": "বাতিল করুন",
"SAVING": "সংরক্ষণ করা হচ্ছে...",
"SAVED": "নোট সফলভাবে সংরক্ষিত হয়েছে",
"SAVE_ERROR": "নোট সংরক্ষণে ব্যর্থ হয়েছে",
"UPDATED_BY": "Updated by {name} {time}",
"UPDATED_BY_LABEL": "Updated by",
"UPDATED_BY_LABEL": "আপডেট করেছেন",
"PAYWALL": {
"TITLE": "Upgrade to add review notes",
"AVAILABLE_ON": "The review notes feature is only available in the Business and Enterprise plans.",
"UPGRADE_PROMPT": "Add internal context to every CSAT response with review notes. Capture what really happened, spot patterns faster, and make better decisions from your feedback.",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
"TITLE": "পর্যালোচনার নোট যোগ করতে আপগ্রেড করুন",
"AVAILABLE_ON": "পর্যালোচনার নোট ফিচারটি শুধুমাত্র Business এবং Enterprise প্ল্যানে উপলব্ধ।",
"UPGRADE_PROMPT": "প্রতি CSAT প্রতিক্রিয়ায় রিভিউ নোট যোগ করে অভ্যন্তরীণ তথ্য যুক্ত করুন। কী ঘটেছিল তা ধরুন, দ্রুত প্যাটার্ন চিনুন এবং আপনার ফিডব্যাক থেকে আরও ভালো সিদ্ধান্ত নিন।",
"UPGRADE_NOW": "এখনই আপগ্রেড করুন",
"CANCEL_ANYTIME": "আপনি যেকোনো সময় আপনার প্ল্যান পরিবর্তন বা বাতিল করতে পারেন"
}
}
},
"BOT_REPORTS": {
"HEADER": "Bot Reports",
"HEADER": "বট রিপোর্ট",
"METRIC": {
"TOTAL_CONVERSATIONS": {
"LABEL": "No. of Conversations",
"TOOLTIP": "Total number of conversations handled by the bot"
"LABEL": "কথোপকথনের সংখ্যা",
"TOOLTIP": "বট দ্বারা পরিচালিত মোট কথোপকথন"
},
"TOTAL_RESPONSES": {
"LABEL": "Total Responses",
"TOOLTIP": "Total number of responses sent by the bot"
"LABEL": "মোট উত্তর",
"TOOLTIP": "বট দ্বারা পাঠানো মোট উত্তর"
},
"RESOLUTION_RATE": {
"LABEL": "Resolution Rate",
"TOOLTIP": "Total number of conversations resolved by the bot / Total number of conversations handled by the bot * 100"
"LABEL": "সমাধান হার",
"TOOLTIP": "বট দ্বারা সমাধানকৃত মোট কথোপকথন / বট দ্বারা পরিচালিত মোট কথোপকথন * ১০০"
},
"HANDOFF_RATE": {
"LABEL": "Handoff Rate",
"TOOLTIP": "Total number of conversations handed off to agents / Total number of conversations handled by the bot * 100"
"LABEL": "হ্যান্ডঅফ হার",
"TOOLTIP": "এজেন্টদের কাছে হ্যান্ডঅফ করা মোট কথোপকথন / বট দ্বারা পরিচালিত মোট কথোপকথন * ১০০"
}
}
},
"OVERVIEW_REPORTS": {
"HEADER": "Overview",
"LIVE": "Live",
"HEADER": "সংক্ষিপ্ত বিবরণ",
"LIVE": "লাইভ",
"ACCOUNT_CONVERSATIONS": {
"HEADER": "Open Conversations",
"LOADING_MESSAGE": "Loading conversation metrics...",
"OPEN": "Open",
"UNATTENDED": "Unattended",
"UNASSIGNED": "Unassigned",
"PENDING": "Pending"
"HEADER": "খোলা কথোপকথন",
"LOADING_MESSAGE": "কথোপকথনের পরিসংখ্যান লোড হচ্ছে...",
"OPEN": "খোলা",
"UNATTENDED": "অবহেলিত",
"UNASSIGNED": "অবরোধহীন",
"PENDING": "অপেক্ষমাণ"
},
"CONVERSATION_HEATMAP": {
"HEADER": "Conversation Traffic",
"NO_CONVERSATIONS": "No conversations",
"HEADER": "কথোপকথনের ট্রাফিক",
"NO_CONVERSATIONS": "কোনো কথোপকথন নেই",
"CONVERSATION": "{count} conversation",
"CONVERSATIONS": "{count} conversations",
"DOWNLOAD_REPORT": "Download report"
"DOWNLOAD_REPORT": "রিপোর্ট ডাউনলোড করুন"
},
"RESOLUTION_HEATMAP": {
"HEADER": "Resolutions",
"NO_CONVERSATIONS": "No conversations",
"HEADER": "সমাধানসমূহ",
"NO_CONVERSATIONS": "কোনো কথোপকথন নেই",
"CONVERSATION": "{count} conversation",
"CONVERSATIONS": "{count} conversations",
"DOWNLOAD_REPORT": "Download report"
"DOWNLOAD_REPORT": "রিপোর্ট ডাউনলোড করুন"
},
"AGENT_CONVERSATIONS": {
"HEADER": "Conversations by agents",
"LOADING_MESSAGE": "Loading agent metrics...",
"NO_AGENTS": "There are no conversations by agents",
"HEADER": "এজেন্ট অনুযায়ী কথোপকথন",
"LOADING_MESSAGE": "এজেন্টের পরিসংখ্যান লোড হচ্ছে...",
"NO_AGENTS": "এজেন্টদের কোনো কথোপকথন নেই",
"TABLE_HEADER": {
"AGENT": "Agent",
"OPEN": "Open",
"UNATTENDED": "Unattended",
"STATUS": "Status"
"AGENT": "এজেন্ট",
"OPEN": "খোলা",
"UNATTENDED": "অযত্নে",
"STATUS": "অবস্থা"
}
},
"TEAM_CONVERSATIONS": {
"ALL_TEAMS": "All Teams",
"HEADER": "Conversations by teams",
"LOADING_MESSAGE": "Loading team metrics...",
"NO_TEAMS": "There is no data available",
"ALL_TEAMS": "সব টিম",
"HEADER": "দলের ভিত্তিতে কথোপকথন",
"LOADING_MESSAGE": "দলের পরিসংখ্যান লোড হচ্ছে...",
"NO_TEAMS": "কোনো তথ্য নেই",
"TABLE_HEADER": {
"TEAM": "Team",
"OPEN": "Open",
"UNATTENDED": "Unattended",
"STATUS": "Status"
"TEAM": "দল",
"OPEN": "খোলা",
"UNATTENDED": "অবহেলিত",
"STATUS": "অবস্থা"
}
},
"AGENT_STATUS": {
"HEADER": "Agent status",
"ONLINE": "Online",
"BUSY": "Busy",
"OFFLINE": "Offline"
"HEADER": "এজেন্টের অবস্থা",
"ONLINE": "অনলাইন",
"BUSY": "ব্যস্ত",
"OFFLINE": "অফলাইন"
}
},
"DAYS_OF_WEEK": {
"SUNDAY": "Sunday",
"MONDAY": "Monday",
"TUESDAY": "Tuesday",
"WEDNESDAY": "Wednesday",
"THURSDAY": "Thursday",
"FRIDAY": "Friday",
"SATURDAY": "Saturday"
"SUNDAY": "রবিবার",
"MONDAY": "সোমবার",
"TUESDAY": "মঙ্গলবার",
"WEDNESDAY": "বুধবার",
"THURSDAY": "বৃহস্পতিবার",
"FRIDAY": "শুক্রবার",
"SATURDAY": "শনিবার"
},
"SLA_REPORTS": {
"HEADER": "SLA Reports",
"NO_RECORDS": "SLA applied conversations are not available.",
"LOADING": "Loading SLA data...",
"DOWNLOAD_SLA_REPORTS": "Download SLA reports",
"DOWNLOAD_FAILED": "Failed to download SLA Reports",
"HEADER": "SLA রিপোর্ট",
"NO_RECORDS": "SLA প্রয়োগকৃত কোনো কথোপকথন নেই।",
"LOADING": "SLA ডেটা লোড হচ্ছে...",
"DOWNLOAD_SLA_REPORTS": "SLA রিপোর্ট ডাউনলোড করুন",
"DOWNLOAD_FAILED": "SLA রিপোর্ট ডাউনলোড ব্যর্থ হয়েছে",
"DROPDOWN": {
"ADD_FIlTER": "Add filter",
"CLEAR_ALL": "Clear all",
"CLEAR_FILTER": "Clear filter",
"EMPTY_LIST": "No results found",
"NO_FILTER": "No filters available",
"SEARCH": "Search filter",
"ADD_FIlTER": "ফিল্টার যোগ করুন",
"CLEAR_ALL": "সব মুছুন",
"CLEAR_FILTER": "ফিল্টার মুছুন",
"EMPTY_LIST": "কোনও ফলাফল পাওয়া যায়নি",
"NO_FILTER": "কোনও ফিল্টার নেই",
"SEARCH": "ফিল্টার অনুসন্ধান করুন",
"INPUT_PLACEHOLDER": {
"SLA": "SLA name",
"AGENTS": "Agent name",
"INBOXES": "Inbox name",
"LABELS": "Label name",
"TEAMS": "Team name"
"SLA": "SLA নাম",
"AGENTS": "এজেন্টের নাম",
"INBOXES": "ইনবক্সের নাম",
"LABELS": "লেবেল নাম",
"TEAMS": "টিমের নাম"
},
"SLA": "SLA Policy",
"INBOXES": "Inbox",
"AGENTS": "Agent",
"LABELS": "Label",
"TEAMS": "Team"
"SLA": "SLA নীতি",
"INBOXES": "ইনবক্স",
"AGENTS": "এজেন্ট",
"LABELS": "লেবেল",
"TEAMS": "টিম"
},
"WITH": "with",
"WITH": "সহ",
"METRICS": {
"HIT_RATE": {
"LABEL": "Hit Rate",
"TOOLTIP": "Percentage of SLAs created were completed successfully"
"LABEL": "হিট হার",
"TOOLTIP": "তৈরি হওয়া SLA-র শতকরা কত সফলভাবে সম্পন্ন হয়েছে"
},
"NO_OF_MISSES": {
"LABEL": "Number of Misses",
"TOOLTIP": "Total SLA misses in a certain period"
"LABEL": "মিসের সংখ্যা",
"TOOLTIP": "নির্দিষ্ট সময়ে মোট SLA মিস"
},
"NO_OF_CONVERSATIONS": {
"LABEL": "Number of Conversations",
"TOOLTIP": "Total number of conversations with SLA"
"LABEL": "কথোপকথনের সংখ্যা",
"TOOLTIP": "SLA সহ মোট কথোপকথনের সংখ্যা"
}
},
"TABLE": {
"HEADER": {
"POLICY": "Policy",
"CONVERSATION": "Conversation",
"AGENT": "Agent"
"POLICY": "নীতি",
"CONVERSATION": "কথোপকথন",
"AGENT": "এজেন্ট"
},
"VIEW_DETAILS": "View Details"
"VIEW_DETAILS": "বিস্তারিত দেখুন"
}
},
"SUMMARY_REPORTS": {
"INBOX": "Inbox",
"AGENT": "Agent",
"TEAM": "Team",
"LABEL": "Label",
"AVG_RESOLUTION_TIME": "Avg. Resolution Time",
"AVG_FIRST_RESPONSE_TIME": "Avg. First Response Time",
"AVG_REPLY_TIME": "Avg. Customer Waiting Time",
"RESOLUTION_COUNT": "Resolution Count",
"CONVERSATIONS": "No. of conversations"
"INBOX": "ইনবক্স",
"AGENT": "এজেন্ট",
"TEAM": "টিম",
"LABEL": "লেবেল",
"AVG_RESOLUTION_TIME": "গড় সমাধান সময়",
"AVG_FIRST_RESPONSE_TIME": "গড় প্রথম সাড়া সময়",
"AVG_REPLY_TIME": "গড় গ্রাহক অপেক্ষার সময়",
"RESOLUTION_COUNT": "সমাধান সংখ্যা",
"CONVERSATIONS": "কথোপকথনের সংখ্যা"
}
}
File diff suppressed because it is too large Load Diff
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "La signatura del missatge no està configurada, configura-la a la configuració del perfil.",
"COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
"COPILOT_MSG_INPUT": "Dóna instruccions addicionals a copilot o pregunta qualsevol altra cosa... Prem enter per enviar un seguiment",
"CLICK_HERE": "Fes clic aquí per actualitzar",
"WHATSAPP_TEMPLATES": "Plantilles de Whatsapp"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Arrossega i deixa anar aquí per adjuntar-lo",
"START_AUDIO_RECORDING": "Inicia la gravació d'àudio",
"STOP_AUDIO_RECORDING": "Atura la gravació d'àudio",
"COPILOT_THINKING": "Copilot is thinking",
"COPILOT_THINKING": "Copilot està pensant",
"EMAIL_HEAD": {
"TO": "A",
"ADD_BCC": "Afegeix cco",
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "La localització s'ha eliminat del portal correctament",
"ERROR_MESSAGE": "No es pot eliminar la localització del portal. Torna-ho a provar."
}
},
"DRAFT_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale moved to draft successfully",
"ERROR_MESSAGE": "Unable to move locale to draft. Try again."
}
},
"PUBLISH_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale published successfully",
"ERROR_MESSAGE": "Unable to publish locale. Try again."
}
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Per defecte",
"DRAFT": "Esborrany",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
"MOVE_TO_DRAFT": "Move to draft",
"PUBLISH_LOCALE": "Publish locale",
"DELETE": "Esborrar"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Selecciona localització..."
},
"STATUS": {
"LABEL": "Estat",
"OPTIONS": {
"LIVE": "Publicat",
"DRAFT": "Esborrany"
}
},
"API": {
"SUCCESS_MESSAGE": "La localització s'ha afegit correctament",
"ERROR_MESSAGE": "No es pot afegir la localització. Torna-ho a provar."
@@ -710,9 +710,21 @@
"MESSENGER_SUB_HEAD": "Col·loca aquest botó dins de l'etiqueta body",
"ALLOWED_DOMAINS": {
"TITLE": "Allowed Domains",
"SUBTITLE": "Add wildcard or regular domains separated by commas (leave blank to allow all), e.g. *.chatwoot.dev, chatwoot.com.",
"DESCRIPTION": "Restrict which websites can embed your chat widget. For security, only add domains you own and trust. Add one or more domains separated by commas. Leave blank to allow all domains (not recommended for production).",
"PLACEHOLDER": "example.com, www.example.com, app.example.com"
},
"ALLOW_MOBILE_WEBVIEW": {
"LABEL": "Enable widget in mobile apps",
"SUBTITLE": "Check this if you embed the widget in iOS or Android apps. Mobile apps don't send domain information, so they would be blocked by domain restrictions unless this is enabled."
},
"IDENTITY_VALIDATION": {
"TITLE": "Identity Validation",
"DESCRIPTION": "Verify user authenticity by generating secure tokens. This prevents unauthorized users from impersonating others in your chat.",
"SECRET_KEY": "Secret Key",
"VIEW_DOCS": "View documentation",
"REQUIRE_LABEL": "Require identity validation for all conversations",
"REQUIRE_DESCRIPTION": "When enabled, users must provide a valid identity token to start conversations. Requests without valid tokens will be rejected."
},
"INBOX_AGENTS": "Agents",
"INBOX_AGENTS_SUB_TEXT": "Afegir o eliminar agents d'aquesta safata d'entrada",
"AGENT_ASSIGNMENT": "Conversació Assignada",
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Captain",
"HEADER_KNOW_MORE": "Know more",
"HEADER_KNOW_MORE": "Saber més",
"ASSISTANT_SWITCHER": {
"ASSISTANTS": "Assistants",
"SWITCH_ASSISTANT": "Switch between assistants",
"NEW_ASSISTANT": "Create Assistant",
"EMPTY_LIST": "No assistants found, please create one to get started"
"ASSISTANTS": "Assistents",
"SWITCH_ASSISTANT": "Canvia entre assistents",
"NEW_ASSISTANT": "Crea un assistent",
"EMPTY_LIST": "No s'ha trobat cap assistent, si us plau crea'n un per començar"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
"PANEL_TITLE": "Get started with Copilot",
"KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilots here to speed things up.",
"PANEL_TITLE": "Comença amb Copilot",
"KICK_OFF_MESSAGE": "Necessites un resum ràpid, vols revisar converses anteriors o redactar una resposta millor? Copilot és aquí per accelerar-ho.",
"SEND_MESSAGE": "Envia missatge...",
"EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
"LOADER": "Captain is thinking",
"EMPTY_MESSAGE": "Hi ha hagut un error generant la resposta. Torna-ho a provar.",
"LOADER": "Captain està pensant",
"YOU": "Tu",
"USE": "Use this",
"RESET": "Reset",
"SHOW_STEPS": "Show steps",
"SELECT_ASSISTANT": "Select Assistant",
"USE": "Utilitza això",
"RESET": "Reinicia",
"SHOW_STEPS": "Mostra passos",
"SELECT_ASSISTANT": "Selecciona Assistente",
"PROMPTS": {
"SUMMARIZE": {
"LABEL": "Summarize this conversation",
"CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
"LABEL": "Resumeix aquesta conversa",
"CONTENT": "Resumeix els punts claus que s'han discutit entre el client i l'agent de suport, incloent les preocupacions, preguntes del client i les solucions o respostes aportades per l'agent."
},
"SUGGEST": {
"LABEL": "Suggest an answer",
"CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
"LABEL": "Suggerir una resposta",
"CONTENT": "Analitza la consulta del client i redacta una resposta que atiqui eficaçment les seves preocupacions o preguntes. Assegura que la resposta sigui clara, concisa i ofereixi informació útil."
},
"RATE": {
"LABEL": "Rate this conversation",
"CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
"LABEL": "Valora aquesta conversa",
"CONTENT": "Revisa la conversa per veure com de bé s'adapta a les necessitats del client. Comparteix una valoració de 5 punts basada en to, claredat i efectivitat."
},
"HIGH_PRIORITY": {
"LABEL": "High priority conversations",
"CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
"LABEL": "Converses d'alta prioritat",
"CONTENT": "Dóna'm un resum de totes les converses obertes d'alta prioritat. Inclou la ID de la conversa, nom del client (si està disponible), contingut de l'últim missatge i agent assignat. Agrupa per estat si és rellevant."
},
"LIST_CONTACTS": {
"LABEL": "List contacts",
"CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
"LABEL": "Llista de contactes",
"CONTENT": "Mostra'm la llista dels 10 contactes principals. Inclou nom, correu electrònic o telèfon (si està disponible), última vegada que es va veure, etiquetes (si n'hi ha)."
}
}
},
"PLAYGROUND": {
"USER": "Tu",
"ASSISTANT": "Assistant",
"ASSISTANT": "Assistent",
"MESSAGE_PLACEHOLDER": "Escriu el missatge...",
"HEADER": "Playground",
"DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
"CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
"HEADER": "Zona de proves",
"DESCRIPTION": "Utilitza aquest espai de proves per enviar missatges al teu assistent i comprovar si respon de manera precisa, ràpida i amb el to que esperes.",
"CREDIT_NOTE": "Els missatges enviats aquí comptaran per als teus crèdits de Captain."
},
"PAYWALL": {
"TITLE": "Upgrade to use Captain AI",
"AVAILABLE_ON": "Captain is not available on the free plan.",
"UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
"TITLE": "Actualitza per usar Captain AI",
"AVAILABLE_ON": "Captain no està disponible en el pla gratuït.",
"UPGRADE_PROMPT": "Actualitza el teu pla per accedir als nostres assistents, copilot i més.",
"UPGRADE_NOW": "Actualitza ara",
"CANCEL_ANYTIME": "Pots canviar o cancel·lar el teu pla en qualsevol moment"
},
"ENTERPRISE_PAYWALL": {
"AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
"UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
"AVAILABLE_ON": "Captain AI només està disponible en els plans Enterprise.",
"UPGRADE_PROMPT": "Actualitza el teu pla per accedir als nostres assistents, copilot i més.",
"ASK_ADMIN": "Posa't en contacte amb el vostre administrador per obtenir l'actualització."
},
"BANNER": {
"RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
"DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
"RESPONSES": "Has utilitzat més del 80% del teu límit de respostes. Per continuar utilitzant Captain AI, si us plau actualitza.",
"DOCUMENTS": "S'ha arribat al límit de documents. Actualitza per continuar utilitzant Captain AI."
},
"FORM": {
"CANCEL": "Cancel·la",
@@ -527,7 +527,8 @@
"TITLE": "Característiques",
"ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations",
"ALLOW_MEMORIES": "Capture key details as memories from customer interactions.",
"ALLOW_CITATIONS": "Include source citations in responses"
"ALLOW_CITATIONS": "Include source citations in responses",
"ALLOW_CONTACT_ATTRIBUTES": "Allow access to contact information"
}
},
"EDIT": {
@@ -737,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
"SELECTED": "{count} selected",
"SELECT_ALL": "Select all ({count})",
"UNSELECT_ALL": "Unselect all ({count})",
"BULK_DELETE_BUTTON": "Esborrar",
"BULK_DELETE": {
"TITLE": "Delete documents?",
"DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
"CONFIRM": "Yes, delete all",
"SUCCESS_MESSAGE": "Documents deleted successfully",
"ERROR_MESSAGE": "There was an error deleting the documents, please try again."
},
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -794,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
"SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -824,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
"TEST": {
"BUTTON": "Test connection",
"SUCCESS": "Endpoint returned HTTP {status}",
"ERROR": "Connection failed",
"DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
},
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
"ERROR": "Tool name is required"
"ERROR": "Tool name is required",
"MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Descripció",
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Podpis zprávy není nakonfigurován, prosím nakonfigurujte jej v nastavení profilu.",
"COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
"COPILOT_MSG_INPUT": "Dejte copilotu další podněty nebo se zeptejte na cokoliv dalšího... Stiskněte Enter pro odeslání pokračování",
"CLICK_HERE": "Klikněte zde pro aktualizaci",
"WHATSAPP_TEMPLATES": "Whatsapp Templates"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Přetažením sem připojíte",
"START_AUDIO_RECORDING": "Spustit nahrávání zvuku",
"STOP_AUDIO_RECORDING": "Zastavit nahrávání zvuku",
"COPILOT_THINKING": "Copilot is thinking",
"COPILOT_THINKING": "Copilot přemýšlí",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Přidat bcc",
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Locale removed from portal successfully",
"ERROR_MESSAGE": "Unable to remove locale from portal. Try again."
}
},
"DRAFT_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale moved to draft successfully",
"ERROR_MESSAGE": "Unable to move locale to draft. Try again."
}
},
"PUBLISH_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale published successfully",
"ERROR_MESSAGE": "Unable to publish locale. Try again."
}
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Default",
"DRAFT": "Koncept",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
"MOVE_TO_DRAFT": "Move to draft",
"PUBLISH_LOCALE": "Publish locale",
"DELETE": "Vymazat"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Select locale..."
},
"STATUS": {
"LABEL": "Stav",
"OPTIONS": {
"LIVE": "Publikované",
"DRAFT": "Koncept"
}
},
"API": {
"SUCCESS_MESSAGE": "Locale added successfully",
"ERROR_MESSAGE": "Unable to add locale. Try again."
@@ -710,9 +710,21 @@
"MESSENGER_SUB_HEAD": "Umístěte toto tlačítko dovnitř vašeho tělesného štítku",
"ALLOWED_DOMAINS": {
"TITLE": "Allowed Domains",
"SUBTITLE": "Add wildcard or regular domains separated by commas (leave blank to allow all), e.g. *.chatwoot.dev, chatwoot.com.",
"DESCRIPTION": "Restrict which websites can embed your chat widget. For security, only add domains you own and trust. Add one or more domains separated by commas. Leave blank to allow all domains (not recommended for production).",
"PLACEHOLDER": "example.com, www.example.com, app.example.com"
},
"ALLOW_MOBILE_WEBVIEW": {
"LABEL": "Enable widget in mobile apps",
"SUBTITLE": "Check this if you embed the widget in iOS or Android apps. Mobile apps don't send domain information, so they would be blocked by domain restrictions unless this is enabled."
},
"IDENTITY_VALIDATION": {
"TITLE": "Identity Validation",
"DESCRIPTION": "Verify user authenticity by generating secure tokens. This prevents unauthorized users from impersonating others in your chat.",
"SECRET_KEY": "Secret Key",
"VIEW_DOCS": "View documentation",
"REQUIRE_LABEL": "Require identity validation for all conversations",
"REQUIRE_DESCRIPTION": "When enabled, users must provide a valid identity token to start conversations. Requests without valid tokens will be rejected."
},
"INBOX_AGENTS": "Agenti",
"INBOX_AGENTS_SUB_TEXT": "Přidat nebo odebrat agenty z této složky doručené pošty",
"AGENT_ASSIGNMENT": "Conversation Assignment",
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Captain",
"HEADER_KNOW_MORE": "Know more",
"HEADER_KNOW_MORE": "Zjistit více",
"ASSISTANT_SWITCHER": {
"ASSISTANTS": "Assistants",
"SWITCH_ASSISTANT": "Switch between assistants",
"NEW_ASSISTANT": "Create Assistant",
"EMPTY_LIST": "No assistants found, please create one to get started"
"ASSISTANTS": "Asistenti",
"SWITCH_ASSISTANT": "Přepínání mezi asistenty",
"NEW_ASSISTANT": "Vytvořit asistenta",
"EMPTY_LIST": "Nebyli nalezeni žádní asistenti, prosím vytvořte si jednoho pro začátek"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
"PANEL_TITLE": "Get started with Copilot",
"KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilots here to speed things up.",
"PANEL_TITLE": "Začněte s Copilotem",
"KICK_OFF_MESSAGE": "Potřebujete rychlý přehled, chcete zkontrolovat předchozí rozhovory, nebo vytvořit lepší odpověď? Copilot je tu, aby to zrychlil.",
"SEND_MESSAGE": "Send message...",
"EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
"LOADER": "Captain is thinking",
"EMPTY_MESSAGE": "Při generování odpovědi došlo k chybě. Zkuste to prosím znovu.",
"LOADER": "Captain přemýšlí",
"YOU": "Vy",
"USE": "Use this",
"RESET": "Reset",
"SHOW_STEPS": "Show steps",
"SELECT_ASSISTANT": "Select Assistant",
"USE": "Použít toto",
"RESET": "Resetovat",
"SHOW_STEPS": "Zobrazit kroky",
"SELECT_ASSISTANT": "Vybrat asistenta",
"PROMPTS": {
"SUMMARIZE": {
"LABEL": "Summarize this conversation",
"CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
"LABEL": "Shrň tuto konverzaci",
"CONTENT": "Shrň klíčové body diskutované mezi zákazníkem a podpůrným agentem, včetně obav zákazníka, otázek a řešení nebo odpovědí poskytnutých agentem podpory"
},
"SUGGEST": {
"LABEL": "Suggest an answer",
"CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
"LABEL": "Navrhni odpověď",
"CONTENT": "Analyzuj dotaz zákazníka a vytvoř odpověď, která efektivně řeší jeho obavy nebo otázky. Zajisti, aby byla odpověď jasná, stručná a poskytovala užitečné informace."
},
"RATE": {
"LABEL": "Rate this conversation",
"CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
"LABEL": "Ohodnoť tuto konverzaci",
"CONTENT": "Prohlédni konverzaci a zhodnoť, jak dobře odpovídá potřebám zákazníka. Sdílej hodnocení od 1 do 5 na základě tónu, srozumitelnosti a efektivity."
},
"HIGH_PRIORITY": {
"LABEL": "High priority conversations",
"CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
"LABEL": "Konverzace s vysokou prioritou",
"CONTENT": "Dej mi shrnutí všech otevřených konverzací s vysokou prioritou. Uveď ID konverzace, jméno zákazníka (pokud je k dispozici), obsah poslední zprávy a přiděleného agenta. Pokud je relevantní, seskup je podle stavu."
},
"LIST_CONTACTS": {
"LABEL": "List contacts",
"CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
"LABEL": "Seznam kontaktů",
"CONTENT": "Ukázat seznam 10 nejlepších kontaktů. Uveď jméno, email nebo telefonní číslo (pokud je k dispozici), čas posledního přístupu, štítky (pokud jsou)."
}
}
},
"PLAYGROUND": {
"USER": "Vy",
"ASSISTANT": "Assistant",
"ASSISTANT": "Asistent",
"MESSAGE_PLACEHOLDER": "Zde začněte psát...",
"HEADER": "Playground",
"DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
"CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
"HEADER": "Hřiště",
"DESCRIPTION": "Použijte toto hřiště pro odesílání zpráv vašemu asistentovi a ověřte, zda odpovídá přesně, rychle a v očekávaném tónu.",
"CREDIT_NOTE": "Zprávy odeslané zde se budou počítat do vašich kreditů Captain."
},
"PAYWALL": {
"TITLE": "Upgrade to use Captain AI",
"AVAILABLE_ON": "Captain is not available on the free plan.",
"UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
"TITLE": "Upgradujte pro používání Captain AI",
"AVAILABLE_ON": "Captain není dostupný v bezplatném plánu.",
"UPGRADE_PROMPT": "Upgradujte svůj plán, abyste získali přístup k našim asistentům, copilotu a dalším funkcím.",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
"AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
"UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
"AVAILABLE_ON": "Captain AI je dostupný pouze v podnicích plánech.",
"UPGRADE_PROMPT": "Upgradujte svůj plán, abyste získali přístup k našim asistentům, copilotu a dalším funkcím.",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"BANNER": {
"RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
"DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
"RESPONSES": "Vyčerpali jste více než 80 % svého limitu odpovědí. Pro pokračování v používání Captain AI upgradujte.",
"DOCUMENTS": "Limit dokumentů byl dosažen. Pro pokračování v používání Captain AI upgradujte."
},
"FORM": {
"CANCEL": "Zrušit",
@@ -527,7 +527,8 @@
"TITLE": "Funkce",
"ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations",
"ALLOW_MEMORIES": "Capture key details as memories from customer interactions.",
"ALLOW_CITATIONS": "Include source citations in responses"
"ALLOW_CITATIONS": "Include source citations in responses",
"ALLOW_CONTACT_ATTRIBUTES": "Allow access to contact information"
}
},
"EDIT": {
@@ -737,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
"SELECTED": "{count} selected",
"SELECT_ALL": "Select all ({count})",
"UNSELECT_ALL": "Unselect all ({count})",
"BULK_DELETE_BUTTON": "Vymazat",
"BULK_DELETE": {
"TITLE": "Delete documents?",
"DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
"CONFIRM": "Yes, delete all",
"SUCCESS_MESSAGE": "Documents deleted successfully",
"ERROR_MESSAGE": "There was an error deleting the documents, please try again."
},
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -794,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
"SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -824,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
"TEST": {
"BUTTON": "Test connection",
"SUCCESS": "Endpoint returned HTTP {status}",
"ERROR": "Connection failed",
"DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
},
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
"ERROR": "Tool name is required"
"ERROR": "Tool name is required",
"MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Description",
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Beskedsignatur er ikke konfigureret, konfigurer den i profilindstillinger.",
"COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
"COPILOT_MSG_INPUT": "Giv copilot yderligere prompts, eller spørg om noget andet... Tryk enter for at sende opfølgning",
"CLICK_HERE": "Klik her for at opdatere",
"WHATSAPP_TEMPLATES": "Whatsapp Skabeloner"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Træk og slip her for at vedhæfte",
"START_AUDIO_RECORDING": "Start lydoptagelse",
"STOP_AUDIO_RECORDING": "Stop lydoptagelse",
"COPILOT_THINKING": "Copilot is thinking",
"COPILOT_THINKING": "Copilot tænker",
"EMAIL_HEAD": {
"TO": "TO",
"ADD_BCC": "Tilføj bcc",
@@ -316,6 +316,18 @@
"SUCCESS_MESSAGE": "Landestandard fjernet fra portal",
"ERROR_MESSAGE": "Kan ikke fjerne landestandard fra portalen. Prøv igen."
}
},
"DRAFT_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale moved to draft successfully",
"ERROR_MESSAGE": "Unable to move locale to draft. Try again."
}
},
"PUBLISH_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale published successfully",
"ERROR_MESSAGE": "Unable to publish locale. Try again."
}
}
},
"TABLE": {
@@ -644,8 +656,11 @@
"ARTICLES_COUNT": "{count} article | {count} articles",
"CATEGORIES_COUNT": "{count} category | {count} categories",
"DEFAULT": "Standard",
"DRAFT": "Kladde",
"DROPDOWN_MENU": {
"MAKE_DEFAULT": "Make default",
"MOVE_TO_DRAFT": "Move to draft",
"PUBLISH_LOCALE": "Publish locale",
"DELETE": "Slet"
}
},
@@ -655,6 +670,13 @@
"COMBOBOX": {
"PLACEHOLDER": "Select locale..."
},
"STATUS": {
"LABEL": "Status",
"OPTIONS": {
"LIVE": "Publiceret",
"DRAFT": "Kladde"
}
},
"API": {
"SUCCESS_MESSAGE": "Landestandard tilføjet",
"ERROR_MESSAGE": "Kan ikke tilføje locale. Prøv igen."
@@ -710,9 +710,21 @@
"MESSENGER_SUB_HEAD": "Placer denne knap inde i din body tag",
"ALLOWED_DOMAINS": {
"TITLE": "Allowed Domains",
"SUBTITLE": "Add wildcard or regular domains separated by commas (leave blank to allow all), e.g. *.chatwoot.dev, chatwoot.com.",
"DESCRIPTION": "Restrict which websites can embed your chat widget. For security, only add domains you own and trust. Add one or more domains separated by commas. Leave blank to allow all domains (not recommended for production).",
"PLACEHOLDER": "example.com, www.example.com, app.example.com"
},
"ALLOW_MOBILE_WEBVIEW": {
"LABEL": "Enable widget in mobile apps",
"SUBTITLE": "Check this if you embed the widget in iOS or Android apps. Mobile apps don't send domain information, so they would be blocked by domain restrictions unless this is enabled."
},
"IDENTITY_VALIDATION": {
"TITLE": "Identity Validation",
"DESCRIPTION": "Verify user authenticity by generating secure tokens. This prevents unauthorized users from impersonating others in your chat.",
"SECRET_KEY": "Secret Key",
"VIEW_DOCS": "View documentation",
"REQUIRE_LABEL": "Require identity validation for all conversations",
"REQUIRE_DESCRIPTION": "When enabled, users must provide a valid identity token to start conversations. Requests without valid tokens will be rejected."
},
"INBOX_AGENTS": "Agenter",
"INBOX_AGENTS_SUB_TEXT": "Tilføj eller fjern agenter fra denne indbakke",
"AGENT_ASSIGNMENT": "Samtale Tildeling",
@@ -390,72 +390,72 @@
},
"CAPTAIN": {
"NAME": "Captain",
"HEADER_KNOW_MORE": "Know more",
"HEADER_KNOW_MORE": "Få mere at vide",
"ASSISTANT_SWITCHER": {
"ASSISTANTS": "Assistants",
"SWITCH_ASSISTANT": "Switch between assistants",
"NEW_ASSISTANT": "Create Assistant",
"EMPTY_LIST": "No assistants found, please create one to get started"
"ASSISTANTS": "Assistenter",
"SWITCH_ASSISTANT": "Skift mellem assistenter",
"NEW_ASSISTANT": "Opret assistent",
"EMPTY_LIST": "Ingen assistenter fundet, opret en for at komme i gang"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Try these prompts",
"PANEL_TITLE": "Get started with Copilot",
"KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilots here to speed things up.",
"PANEL_TITLE": "Kom godt i gang med Copilot",
"KICK_OFF_MESSAGE": "Brug for et hurtigt sammendrag, vil du tjekke tidligere samtaler eller udarbejde et bedre svar? Copilot er her for at fremskynde processen.",
"SEND_MESSAGE": "Send besked...",
"EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
"LOADER": "Captain is thinking",
"EMPTY_MESSAGE": "Der opstod en fejl ved generering af svaret. Prøv igen.",
"LOADER": "Captain tænker",
"YOU": "Dig",
"USE": "Use this",
"RESET": "Reset",
"SHOW_STEPS": "Show steps",
"SELECT_ASSISTANT": "Select Assistant",
"USE": "Brug dette",
"RESET": "Nulstil",
"SHOW_STEPS": "Vis trin",
"SELECT_ASSISTANT": "Vælg assistent",
"PROMPTS": {
"SUMMARIZE": {
"LABEL": "Summarize this conversation",
"CONTENT": "Summarize the key points discussed between the customer and the support agent, including the customer's concerns, questions, and the solutions or responses provided by the support agent"
"LABEL": "Sammenfat denne samtale",
"CONTENT": "Sammenfat hovedpunkterne diskuteret mellem kunden og supportagenten, inklusive kundens bekymringer, spørgsmål og de løsninger eller svar, supportagenten har givet"
},
"SUGGEST": {
"LABEL": "Suggest an answer",
"CONTENT": "Analyze the customer's inquiry, and draft a response that effectively addresses their concerns or questions. Ensure the reply is clear, concise, and provides helpful information."
"LABEL": "Foreslå et svar",
"CONTENT": "Analyser kundens forespørgsel, og udarbejd et svar, der effektivt imødekommer deres bekymringer eller spørgsmål. Sørg for, at svaret er klart, præcist og giver nyttige oplysninger."
},
"RATE": {
"LABEL": "Rate this conversation",
"CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
"LABEL": "Vurder denne samtale",
"CONTENT": "Gennemgå samtalen for at se, hvor godt den opfylder kundens behov. Del en vurdering ud af 5 baseret på tone, klarhed og effektivitet."
},
"HIGH_PRIORITY": {
"LABEL": "High priority conversations",
"CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
"LABEL": "Samtaler med høj prioritet",
"CONTENT": "Giv mig et sammendrag af alle åbne samtaler med høj prioritet. Inkluder samtale-ID, kundens navn (hvis tilgængeligt), indholdet af sidste besked og tildelt agent. Grupper efter status, hvis relevant."
},
"LIST_CONTACTS": {
"LABEL": "List contacts",
"CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
"LABEL": "Liste over kontakter",
"CONTENT": "Vis mig listen over de 10 bedste kontakter. Inkluder navn, e-mail eller telefonnummer (hvis tilgængeligt), sidst set tidspunkt, tags (hvis nogen)."
}
}
},
"PLAYGROUND": {
"USER": "Dig",
"ASSISTANT": "Assistant",
"ASSISTANT": "Assistent",
"MESSAGE_PLACEHOLDER": "Skriv din besked...",
"HEADER": "Playground",
"DESCRIPTION": "Use this playground to send messages to your assistant and check if it responds accurately, quickly, and in the tone you expect.",
"CREDIT_NOTE": "Messages sent here will count toward your Captain credits."
"HEADER": "Legeplads",
"DESCRIPTION": "Brug denne legeplads til at sende beskeder til din assistent og tjekke, om den svarer korrekt, hurtigt og i den tone, du forventer.",
"CREDIT_NOTE": "Beskeder sendt her tæller mod dine Captain-kreditter."
},
"PAYWALL": {
"TITLE": "Upgrade to use Captain AI",
"AVAILABLE_ON": "Captain is not available on the free plan.",
"UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
"TITLE": "Opgrader for at bruge Captain AI",
"AVAILABLE_ON": "Captain er ikke tilgængelig på gratisplanen.",
"UPGRADE_PROMPT": "Opgrader din plan for at få adgang til vores assistenter, copilot og mere.",
"UPGRADE_NOW": "Upgrade now",
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
},
"ENTERPRISE_PAYWALL": {
"AVAILABLE_ON": "Captain AI is only available in the Enterprise plans.",
"UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
"AVAILABLE_ON": "Captain AI er kun tilgængelig i Enterprise-planerne.",
"UPGRADE_PROMPT": "Opgrader din plan for at få adgang til vores assistenter, copilot og mere.",
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
},
"BANNER": {
"RESPONSES": "You've used over 80% of your response limit. To continue using Captain AI, please upgrade.",
"DOCUMENTS": "Document limit reached. Upgrade to continue using Captain AI."
"RESPONSES": "Du har brugt over 80 % af din svargrænse. For at fortsætte med at bruge Captain AI skal du opgradere.",
"DOCUMENTS": "Dokumentgrænse nået. Opgrader for at fortsætte med at bruge Captain AI."
},
"FORM": {
"CANCEL": "Annuller",
@@ -527,7 +527,8 @@
"TITLE": "Funktioner",
"ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations",
"ALLOW_MEMORIES": "Capture key details as memories from customer interactions.",
"ALLOW_CITATIONS": "Include source citations in responses"
"ALLOW_CITATIONS": "Include source citations in responses",
"ALLOW_CONTACT_ATTRIBUTES": "Allow access to contact information"
}
},
"EDIT": {
@@ -737,6 +738,17 @@
"DOCUMENTS": {
"HEADER": "Documents",
"ADD_NEW": "Create a new document",
"SELECTED": "{count} selected",
"SELECT_ALL": "Select all ({count})",
"UNSELECT_ALL": "Unselect all ({count})",
"BULK_DELETE_BUTTON": "Slet",
"BULK_DELETE": {
"TITLE": "Delete documents?",
"DESCRIPTION": "Are you sure you want to delete the selected documents? This action cannot be undone.",
"CONFIRM": "Yes, delete all",
"SUCCESS_MESSAGE": "Documents deleted successfully",
"ERROR_MESSAGE": "There was an error deleting the documents, please try again."
},
"RELATED_RESPONSES": {
"TITLE": "Related FAQs",
"DESCRIPTION": "These FAQs are generated directly from the document."
@@ -794,6 +806,7 @@
"CUSTOM_TOOLS": {
"HEADER": "Tools",
"ADD_NEW": "Create a new tool",
"SOFT_LIMIT_WARNING": "Having more than 10 tools may reduce the assistant's reliability in selecting the right tool. Consider removing unused tools for better results.",
"EMPTY_STATE": {
"TITLE": "No custom tools available",
"SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.",
@@ -824,11 +837,18 @@
"SUCCESS_MESSAGE": "Custom tool deleted successfully",
"ERROR_MESSAGE": "Failed to delete custom tool"
},
"TEST": {
"BUTTON": "Test connection",
"SUCCESS": "Endpoint returned HTTP {status}",
"ERROR": "Connection failed",
"DISABLED_HINT": "Testing is only available for endpoints without templates or request bodies."
},
"FORM": {
"TITLE": {
"LABEL": "Tool Name",
"PLACEHOLDER": "Order Lookup",
"ERROR": "Tool name is required"
"ERROR": "Tool name is required",
"MAX_LENGTH_ERROR": "Tool name must be {max} characters or fewer"
},
"DESCRIPTION": {
"LABEL": "Beskrivelse",
@@ -194,7 +194,7 @@
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
"MESSAGING_RESTRICTED_API": "You can only reply using a template message due to message window restriction",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Die Nachrichtensignatur ist nicht konfiguriert, bitte konfigurieren Sie sie in den Profileinstellungen.",
"COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
"COPILOT_MSG_INPUT": "Geben Sie Copilot zusätzliche Aufforderungen oder fragen Sie etwas anderes ... Drücken Sie Enter, um eine Folgefrage zu senden",
"CLICK_HERE": "Klicken Sie hier, um zu aktualisieren",
"WHATSAPP_TEMPLATES": "WhatsApp-Vorlagen"
},
@@ -214,7 +214,7 @@
"DRAG_DROP": "Zum Anhängen hierher ziehen und ablegen",
"START_AUDIO_RECORDING": "Audioaufzeichnung starten",
"STOP_AUDIO_RECORDING": "Audioaufzeichnung stoppen",
"COPILOT_THINKING": "Copilot is thinking",
"COPILOT_THINKING": "Copilot denkt",
"EMAIL_HEAD": {
"TO": "An",
"ADD_BCC": "BCC hinzufügen",

Some files were not shown because too many files have changed in this diff Show More