* chore: Hide "Learn More" button in feature spotlight for self-hosted (#12675) * feat: single query for reporting event stats (#12664) This PR collapses multiple queries fetching stats from a single table to a single query ```sql SELECT user_id as user_id, COUNT(CASE WHEN name = 'conversation_resolved' THEN 1 END) as resolved_count, AVG(CASE WHEN name = 'conversation_resolved' THEN value END) as avg_resolution_time, AVG(CASE WHEN name = 'first_response' THEN value END) as avg_first_response_time, AVG(CASE WHEN name = 'reply_time' THEN value END) as avg_reply_time FROM "reporting_events" WHERE "reporting_events"."account_id" = <account_id> AND "reporting_events"."created_at" >= '2025-09-14 18:30:00' AND "reporting_events"."created_at" < '2025-10-14 18:29:59' GROUP BY "reporting_events"."user_id"; ``` ### Why this works? Here's why this optimization is faster based on PostgreSQL internals: - Single Table Scan vs Multiple Scans: Earlier we did 4 sequential scans (or 4 index scans) of the same data, with the same where clause, now in a single scan all 4 `CASE` expressions are evaluated in a single pass. - Shared Buffer Cache Efficiency: PostgreSQL's shared buffer cache stores recently accessed pages, with this, pages are loaded once and re-used for all aggregation, earlier with separate queries we were forced to re-read all from the disk each time - Reduced planning and network overhead (4 vs 1 query) ### How is it tested 1. The specs all pass without making any changes 2. Verified the reports side by side after generating from report seeder #### How to test Generate seed data using the following command ```bash ACCOUNT_ID=1 ENABLE_ACCOUNT_SEEDING=true bundle exec rake db:seed:reports_data ``` Once done download the reports, checkout to this branch and download the reports again and compare them * chore: Update translations (#12625) * chore: Migrate mailers from the worker to jobs (#12331) Previously, email replies were handled inside workers. There was no execution logs. This meant if emails silently failed (as reported by a customer), we had no way to trace where the issue happened, the only assumption was “no error = mail sent.” By moving email handling into jobs, we now have proper execution logs for each attempt. This makes it easier to debug delivery issues and would have better visibility when investigating customer reports. Fixes https://linear.app/chatwoot/issue/CW-5538/emails-are-not-sentdelivered-to-the-contact --------- Co-authored-by: Sojan Jose <sojan@pepalo.com> Co-authored-by: Shivam Mishra <scm.mymail@gmail.com> * chore(deps-dev): bump vite from 5.4.20 to 5.4.21 (#12700) Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.4.20 to 5.4.21. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/vitejs/vite/releases">vite's releases</a>.</em></p> <blockquote> <h2>v5.4.21</h2> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/v5.4.21/packages/vite/CHANGELOG.md">CHANGELOG.md</a> for details.</p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/vitejs/vite/blob/v5.4.21/packages/vite/CHANGELOG.md">vite's changelog</a>.</em></p> <blockquote> <h2><!-- raw HTML omitted -->5.4.21 (2025-10-20)<!-- raw HTML omitted --></h2> <ul> <li>fix(dev): trim trailing slash before <code>server.fs.deny</code> check (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/20968">#20968</a>) (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/20970">#20970</a>) (<a href="cad1d31d06">cad1d31</a>), closes <a href="https://redirect.github.com/vitejs/vite/issues/20968">#20968</a> <a href="https://redirect.github.com/vitejs/vite/issues/20970">#20970</a></li> <li>chore: update CHANGELOG (<a href="ca88ed7398">ca88ed7</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="adce3c22c6"><code>adce3c2</code></a> release: v5.4.21</li> <li><a href="cad1d31d06"><code>cad1d31</code></a> fix(dev): trim trailing slash before <code>server.fs.deny</code> check (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/20968">#20968</a>) (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/20970">#20970</a>)</li> <li><a href="ca88ed7398"><code>ca88ed7</code></a> chore: update CHANGELOG</li> <li>See full diff in <a href="https://github.com/vitejs/vite/commits/v5.4.21/packages/vite">compare view</a></li> </ul> </details> <br /> [](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 merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@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> * chore: Update translations (#12708) * chore(sidekiq): log ActiveJob class and job_id on dequeue (#12704) ## Context Sidekiq logs only showed the Sidekiq wrapper class and JID, which wasn’t helpful when debugging ActiveJobs. ## Changes - Updated `ChatwootDequeuedLogger` to log the actual `ActiveJob class` and `job_id` instead of the generic Sidekiq wrapper and JID. > Example > ``` > Dequeued ActionMailer::MailDeliveryJob 123e4567-e89b-12d3-a456-426614174000 from default > ``` - Remove sidekiq worker and unify everything to `ActiveJob` * chore: Enforce custom role permissions on conversation access (#12583) ## Summary - ensure conversation lookup uses the permission filter before fetching records - add request specs covering custom role access to unassigned conversations ## Testing - bundle exec rspec spec/enterprise/controllers/api/v1/accounts/conversations_controller_spec.rb ------ https://chatgpt.com/codex/tasks/task_e_68de1f62b9b883268a54882e608a8bb8 * fix: parameterize agent name (#12709) * chore: Remove channel icons from the create inbox page (#12727) # Pull Request Template ## Description This PR removes the frame containing all channel icons from the “Create Inbox” page. ## Type of change - [x] Bug fix (non-breaking change which fixes an issue) ## How Has This Been Tested? ### Screenshots **Before** <img width="1314" height="1016" alt="image" src="https://github.com/user-attachments/assets/2b773495-9ddb-48b4-b15d-9aef18259ce1" /> **After** <img width="1314" height="979" alt="image" src="https://github.com/user-attachments/assets/f4dc64cf-516c-4faf-a45c-2f7de05cc29b" /> ## 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 * fix: Use gap-4 instead of margins to define space between elements (#12728) We should avoid using margins to define space between elements, instead use the gap utility. The problem with this particular instance was that if Google auth was turned off and SSO is available, there is a weird spacing at the top caused by the margin from the SSO element. This PR will fix that. It also introduces a gap between the divider and the button, but that should be okay. * feat(ee): Add a service to fetch website content and prepare a persona of Captain Assistant (#12732) This PR is the first of many to simplify the process of building an assistant. The new flow will only require the user’s website. We’ll automatically crawl it, identify the business name and what the business does, and then generate a suggested assistant persona, complete with a proposed name and description. This service returns the following. Example: tooljet.com <img width="795" height="217" alt="Screenshot 2025-10-25 at 2 55 04 PM" src="https://github.com/user-attachments/assets/9cb3594a-9c9c-4970-a0a1-4c9c8869c193" /> Example: replit.com <img width="797" height="176" alt="Screenshot 2025-10-25 at 2 56 42 PM" src="https://github.com/user-attachments/assets/6a1b4266-aab6-455f-a5e3-696d3a8243c9" /> * chore: Adds URL-based search and tab selection (#12663) # Pull Request Template ## Description This PR enables URL-based search and tab selection, allowing search queries and active tabs to persist in the URL for easy sharing. Fixes [CW-5766](https://linear.app/chatwoot/issue/CW-5766/cannot-impersonate-an-account), https://github.com/chatwoot/chatwoot/issues/12623 ## Type of change - [x] New feature (non-breaking change which adds functionality) ## How Has This Been Tested? ### Loom video https://www.loom.com/share/422a1d61f3fe4278a88e352ef98d2b78?sid=35fabee7-652f-4e17-83bd-e066a3bb804c ## Checklist: - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my code - [x] I have commented on my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules * chore: Add tab params for inbox configuration (#12665) # Pull Request Template ## Description This PR enables active tabs in inbox settings to persist in the URL for easy sharing. ## Type of change - [x] New feature (non-breaking change which adds functionality) ## How Has This Been Tested? ### Loom video https://www.loom.com/share/63820ecb17ea491a9082339f8bb457b6?sid=4fef1acd-b4fd-431f-855c-7647015a330f ## Checklist: - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my code - [x] I have commented on my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --------- Co-authored-by: Muhsin <muhsinkeramam@gmail.com> * feat: Changelog card components (#12673) # Pull Request Template ## Description This PR introduces a new changelog component that can be used in the sidebar. Fixes https://linear.app/chatwoot/issue/CW-5776/changelog-card-ui-component ## Type of change - [x] New feature (non-breaking change which adds functionality) ## How Has This Been Tested? ### Screencast https://github.com/user-attachments/assets/42e77e82-388a-4fc9-9b37-f3d0ea1a9d7f ## Checklist: - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my code - [x] I have commented on my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --------- Co-authored-by: Muhsin <muhsinkeramam@gmail.com> * chore: Remove linear integration feature flag (#12716) This PR removes the linear integration feature flag since the integration is pretty much stable and we do display the Linear CTA for users who aren't connected. Fixes https://linear.app/chatwoot/issue/CW-5819/remove-linear-feature-flag-from-front-end * chore: Update translations (#12722) Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> * perf: Add database index on conversations identifier (#12715) **Problem** Slack webhook processing was failing with 500 errors due to database timeouts. The query `Conversation.where(identifier: params[:event][:thread_ts]).first` was performing full table scans and hitting PostgreSQL statement timeout. **Solution** Added database index on conversations.identifier and account_id. * fix: Extend phone number normalization to Twilio WhatsApp (#12655) ### Problem WhatsApp Cloud channels already handle Brazil/Argentina phone number format mismatches (PRs #12492, #11173), but Twilio WhatsApp channels were creating duplicate contacts when: - Template sent to new format: `whatsapp:+5541988887777` (13 digits) - User responds from old format: `whatsapp:+554188887777` (12 digits) ### Solution The solution extends the existing phone number normalization infrastructure to support both WhatsApp providers while handling their different payload formats: ### Provider Format Differences - **WhatsApp Cloud**: `wa_id: "919745786257"` (clean number) - **Twilio WhatsApp**: `From: "whatsapp:+919745786257"` (prefixed format) ### Test Coverage #### Brazil Phone Number Tests **Case 1: New Format (13 digits with "9")** - **Test 1**: No existing contact → Creates new contact with original format - **Test 2**: Contact exists in same format → Appends to existing conversation **Case 2: Old Format (12 digits without "9")** - **Test 3**: Contact exists in old format → Appends to existing conversation - **Test 4** *(Critical)*: Contact exists in new format, message in old format → Finds existing contact, prevents duplicate - **Test 5**: No contact exists → Creates new contact with incoming format #### Argentina Phone Number Tests **Case 3: With "9" after country code** - **Test 6**: No existing contact → Creates new contact - **Test 7**: Contact exists in normalized format → Uses existing contact **Case 4: Without "9" after country code** - **Test 8**: Contact exists in same format → Appends to existing - **Test 9**: No contact exists → Creates new contact Fixes https://linear.app/chatwoot/issue/CW-5565/inconsistencies-for-mobile-numbersargentina-brazil-and-mexico-numbers * fix: Timezone offset reports broken by DST transition (#12747) ## Description Fixes timezone offset parameter in V2 reports API that was broken by DST transitions. The issue occurred when UK DST ended on October 26, 2025, causing the test to fail starting October 27th. ~~**Initial diagnosis:** The root cause was that `timezone_name_from_offset` used `zone.now.utc_offset` to match timezones, which changes based on the current date's DST status rather than the data being queried.~~ **Actual root cause:** The test was accidentally passing before DST transition. During BST, `timezone_name_from_offset(0)` matched "Azores" (UTC-1) instead of "Edinburgh" (UTC+0), and the -1 hour offset coincidentally split midnight data into [1,5]. After DST ended, it correctly matched "Edinburgh" (UTC+0), but this grouped all conversations into one day [6], exposing that the test data was flawed. The real issue: Test data created all 6 conversations starting at midnight on a single day, which cannot produce a [1,5] split in true UTC. Fixes CW-5846 ## Type of change - [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? **Test that was failing:** ```bash bundle exec rspec spec/controllers/api/v2/accounts/reports_controller_spec.rb:25 ``` **Changes:** ~~1. Fixed `timezone_name_from_offset` to use January 1st as reference date instead of current date~~ ~~2. Converted timezone string to `ActiveSupport::TimeZone` object for `group_by_period` compatibility~~ **Revised approach:** 1. Freeze test time to January 2024 using `travel_to`, making timezone matching deterministic and aligned with test data period 2. Start test conversations at 23:00 instead of midnight to properly span two days and test timezone boundary grouping 3. Keep `zone.now.utc_offset` (correct behavior for real users during DST) **Why this works:** - Test runs "in January 2024" → `zone.now.utc_offset` returns January offsets consistently - Offset `-8` correctly matches Pacific Standard Time (UTC-8 in January) - Real users in PDT (summer) with offset `-7` → correctly match Pacific Daylight Time - No production impact, test is deterministic year-round **Verification:** - Test now passes consistently regardless of current DST status - Timezone matching works correctly for real users during DST periods - Reports correctly group data by timezone offset across all seasons ## 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> Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com> * fix: Captain response builder not getting triggered (#12729) ## Summary - Fix captain response builder not getting triggered for cases where responses are created as completed. ## Testing Instructions - Test articles with firecrawl - Test articles without firecrawl - Test PDF documents --------- Co-authored-by: Pranav <pranav@chatwoot.com> * chore: Update captain pending FAQ interface (#12752) # Pull Request Template ## Description **This PR includes,** - Added new pending FAQs view with approve/edit/delete actions for each response. - Implemented banner notification showing pending FAQ count on main approved responses page. - Created dedicated route for pending FAQs review at /captain/responses/pending. - Added automatic pending count updates when switching assistants or routes. - Modified ResponseCard component to show action buttons instead of dropdown in pending view. Fixes https://linear.app/chatwoot/issue/CW-5833/pending-faqs-in-a-different-ux ## Type of change - [x] New feature (non-breaking change which adds functionality) ## How Has This Been Tested? ### Loom video https://www.loom.com/share/5fe8f79b04cd4681b9360c48710b9373 ## Checklist: - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my code - [x] I have commented on my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --------- Co-authored-by: Pranav <pranav@chatwoot.com> * fix: Exclude authentication templates from WhatsApp template selection (#12753) This PR add the changes for excluding the authentication templates from the WhatsApp template selection in the frontend, as these templates are not supported at the moment. Reference: https://www.chatwoot.com/hc/user-guide/articles/1754940076-whatsapp-templates#what-is-not-supported * feat: Template types components (#12714) # Pull Request Template ## Description Fixes https://linear.app/chatwoot/issue/CW-5806/create-the-story-book-components-for-template-typestext-media-list **Pending** Need to standardize the structure to match the template/campaigns. ## Type of change - [x] New feature (non-breaking change which adds functionality) ## How Has This Been Tested? ### Screenshots <img width="669" height="179" alt="image" src="https://github.com/user-attachments/assets/42efd292-8520-4b05-81ec-8bc526fc12db" /> <img width="646" height="304" alt="image" src="https://github.com/user-attachments/assets/431dd964-006c-4877-a693-dae39b90df4c" /> <img width="646" height="380" alt="image" src="https://github.com/user-attachments/assets/9052e31f-9292-4afb-8897-13931655fa00" /> <img width="646" height="272" alt="image" src="https://github.com/user-attachments/assets/873d2488-e856-4a0d-8579-cc1bcc61cc8e" /> <img width="646" height="490" alt="image" src="https://github.com/user-attachments/assets/14c2aa42-bf27-475f-aa70-fe59c1d00e9b" /> <img width="646" height="281" alt="image" src="https://github.com/user-attachments/assets/1f42408e-03e8-4863-b4c7-715d13d67686" /> ## 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> * fix: update omniauth to latest to resolve heroku deployment issues (#12749) # Pull Request Template ## Description Fixes https://github.com/chatwoot/chatwoot/issues/12553 Heroku build was failing due to `omniauth` version mismatch. Also, added `NODE_OPTIONS=--max-old-space-size=4096` to handle OOM during Vite build. ## Type of change Please delete options that are not relevant. - [x] Bug fix (non-breaking change which fixes an issue) ## How Has This Been Tested? - Tested on heroku ## 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 * chore: Improvements in pending FAQs (#12755) # Pull Request Template ## Description **This PR includes:** 1. Added URL-based filter persistence for the responses pages, including page and search parameters. 2. Introduced a new empty state variant for pending FAQs — without a backdrop and with a “Clear Filters” option. 3. Made the actions, filter, and search row remain fixed at the top while scrolling. Fixes https://linear.app/chatwoot/issue/CW-5852/improvements-in-pending-faqs ## Type of change - [x] New feature (non-breaking change which adds functionality) ## How Has This Been Tested? ### Loom video https://www.loom.com/share/1d9eee68c0684f0ab05e08b4ca1e0ce9 ## 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 * fix: run captain v2 outside the transaction (#12756) * feat: Always process email content (#12734) Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com> * feat: Bulk actions for contacts (#12763) Introduces APIs and UI for bulk actions in contacts table. The initial action available will be assign labels Fixes: #8536 #12253 ## Screens <img width="1350" height="747" alt="Screenshot 2025-10-29 at 4 05 08 PM" src="https://github.com/user-attachments/assets/0792dff5-0371-4b2e-bdfb-cd32db773402" /> <img width="1345" height="717" alt="Screenshot 2025-10-29 at 4 05 19 PM" src="https://github.com/user-attachments/assets/ae510404-c6de-4c15-a720-f6d10cdac25b" /> --------- Co-authored-by: Muhsin <muhsinkeramam@gmail.com> Co-authored-by: iamsivin <iamsivin@gmail.com> Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> * feat: Enable opensearch on paid plans automatically (#12770) - enable `advanced_search feature` on all paid plans automatically ref: https://github.com/chatwoot/chatwoot/pull/12503 * chore: Make contacts bulk action bar sticky (#12773) # Pull Request Template ## Description This PR makes the contacts bulk action bar sticky while scrolling. ## Type of change - [x] Bug fix (non-breaking change which fixes an issue) ## How Has This Been Tested? ### Screenshots <img width="1080" height="300" alt="image" src="https://github.com/user-attachments/assets/21f8f3c6-813e-4ef6-b40a-8dd14e6ffb26" /> <img width="1080" height="300" alt="image" src="https://github.com/user-attachments/assets/bb939f1d-9a13-4f9f-953d-b9872c984b74" /> ## 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 * chore: Add dependant destroy_async for sla events (#12774) Added the destroy_async to prevent timeout during SLA policy deletion by processing SLA events asynchronously. * chore: Update translations (#12748) * feat: Add company backfill migration for existing contacts (Part 1) (#12657) ## Description Implements company backfill migration infrastructure for existing contacts. This is **Part 1 of 2** for the company model production rollout as described in [CW-5726](https://linear.app/chatwoot/issue/CW-5726/company-model-setting-it-up-on-production). Creates jobs and services to associate existing contacts with companies based on their email domains, filtering out free email providers (gmail, yahoo, etc.) and disposable addresses. **What's included:** - Business email detector service with ValidEmail2 (uses `disposable_domain?` to avoid DNS lookups) - Per-account batch job to process contacts for one account - Orchestrator job to iterate all accounts - Rake task: `bundle exec rake companies:backfill` ~~*NOTE*: I'm using a hard-coded approach to determine if something is a "business" email by filtering out emails that are usually personal. I've also added domains that are common to some of our customers' regions. This should be simpler. I looked into `Valid_Email2` and I couldn't find anything to dictate whether an email is a personal email or a business one. I don't think the approach used in the frontend is valid here.~~ UPDATE: Using `email_provider_info` gem instead. **Pending - Part 2 (separate PR):** Real-time company creation for new contacts ## Type of change - [x] New feature (non-breaking change which adds functionality) ## How Has This Been Tested? ```bash # Run all new tests bundle exec rspec spec/enterprise/services/companies/business_email_detector_service_spec.rb \\ spec/enterprise/jobs/migration/company_account_batch_job_spec.rb \\ spec/enterprise/jobs/migration/company_backfill_job_spec.rb # Run RuboCop bundle exec rubocop enterprise/app/services/companies/business_email_detector_service.rb \\ enterprise/app/jobs/migration/company_account_batch_job.rb \\ enterprise/app/jobs/migration/company_backfill_job.rb \\ lib/tasks/companies.rake ``` **Performance optimization:** - Uses `disposable_domain?` instead of `disposable?` to avoid DNS MX lookups (discovered via tcpdump analysis - `disposable?` was making network calls for every email, causing 100x slowdown) ## 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 --------- Co-authored-by: Sojan Jose <sojan@pepalo.com> * feat: Add company auto-association for contacts (CW-5726 Part 2) (#12711) ## Description Implements real-time company auto-association for contacts based on email domains. This is **Part 2** of the company model production rollout (CW-5726). **Task:** - When a contact is created with a business email, automatically create and associate a company from the email domain - When a contact is updated with an email for the first time (email was previously nil), associate with a company - Preserve existing company associations when email changes to avoid user confusion - Skip free email providers and disposable domains **Dependencies:** ⚠️ Requires PR #12657 (Part 1: Backfill migration) to be merged first **Linear ticket:** [CW-5726](https://linear.app/chatwoot/issue/CW-5726/company-model-setting-it-up-on-production) ## Type of change - [x] New feature (non-breaking change which adds functionality) ## How Has This Been Tested? - Service specs: Tests business email detection, company creation, association logic, edge cases (existing companies, free emails, nil emails) - Integration specs: Tests full callback flow for contact create/update scenarios - All tests passing: 10 examples, 0 failures - RuboCop: 0 offenses ## 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] 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 (PR #12657 pending) --------- Co-authored-by: Sojan Jose <sojan@pepalo.com> * fix: Optimize Message search_data to prevent OpenSearch field explosion (#12786) ## Description Refactored the `Message#search_data` method to prevent exceeding OpenSearch's 1000 field limit during reindex operations. **Problem:** The previous implementation serialized entire ActiveRecord objects (Inbox, Sender, Conversation) with all their JSONB fields, causing dynamic field explosion in OpenSearch. This resulted in `Searchkick::ImportError` with "Limit of total fields [1000] has been exceeded". **Solution:** Whitelisted only necessary fields for search and filtering, and flattened JSONB `custom_attributes` into key-value pair arrays to prevent unbounded field creation. Linked to: CW-5861 ## Type of change - [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? - Verified rubocop passes with no offenses - Code review of search field usage from `enterprise/app/services/enterprise/search_service.rb` - Analyzed actual search queries to determine required indexed fields **Still needed:** - Full reindex test on staging/production environment - Verify search functionality still works after reindex - Confirm field count is under 1000 limit ## Changes Made ### Before - Indexed 1000+ fields (entire AR objects with JSONB) - `inbox` = full Inbox object (23+ fields + JSONB) - `sender` = full Contact/User/AgentBot object (10+ fields + JSONB) - `conversation` = full push_event_data - Dynamic JSONB keys creating unlimited fields ### After - ~35-40 controlled fields - Whitelisted search fields: `content`, `attachment_transcribed_text`, `email_subject` - Filter fields: `account_id`, `inbox_id`, `conversation_id`, `sender_id`, `sender_type`, etc. - Flattened `custom_attributes`: `[{key, value, value_type}]` format - Helper methods: `search_conversation_data`, `search_inbox_data`, `search_sender_data`, `search_additional_data` ## Checklist: - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my code - [x] I have commented on my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules ## Post-merge Steps After merging, the following steps are required: 1. **Reindex all messages:** ```bash bundle exec rails runner "Message.reindex" ``` 2. **Verify field count:** ```bash bundle exec rails runner " client = Searchkick.client index_name = Message.searchkick_index.name mapping = client.indices.get_mapping(index: index_name) fields = mapping.dig(index_name, 'mappings', 'properties') puts 'Total fields: ' + fields.keys.count.to_s " ``` 3. **Test search functionality** to ensure queries still work as expected --------- Co-authored-by: Vishnu Narayanan <iamwishnu@gmail.com> Co-authored-by: Pranav <pranav@chatwoot.com> * fix: Avoid introducing new attributes in search (#12791) Fix `Limit of total fields [1000] has been exceeded` https://linear.app/chatwoot/issue/CW-5861/searchkickimporterror-type-=-illegal-argument-exception-reason-=-limit#comment-6b6e41bd * fix: Gate Sidekiq dequeue logger behind env (#12790) ## Summary - wrap the dequeue middleware registration in a boolean env flag - document the ENABLE_SIDEKIQ_DEQUEUE_LOGGER option in .env.example * feat: Bulk delete for contacts (#12778) Introduces a new bulk action `delete` for contacts ref: https://github.com/chatwoot/chatwoot/pull/12763 ## Screens <img width="1492" height="973" alt="Screenshot 2025-10-31 at 6 27 21 PM" src="https://github.com/user-attachments/assets/30dab1bb-2c2c-4168-9800-44e0eb5f8e3a" /> <img width="1492" height="985" alt="Screenshot 2025-10-31 at 6 27 32 PM" src="https://github.com/user-attachments/assets/5be610c4-b19e-4614-a164-103b22337382" /> * fix: Video bubble click and play issue (#12764) Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com> * feat: Differentiate bot and user in the summary (#12801) While generating the summary, use the appropriate sender type for the message. * fix: Invalid image URL issue in Help Center articles (#12806) * feat: allow bots to handle campaigns when sender_id is nil (#12805) * fix: Add empty line before signature in compose conversation editor (#12702) Co-authored-by: Shivam Mishra <scm.mymail@gmail.com> * feat: Enhance button interactions (#12738) * fix: Remove the same account validation for whatsapp channels (#12811) ## Description Modified the phone number validation in Whatsapp::ChannelCreationService to check for duplicate phone numbers across ALL accounts, not just within the current account. ## Type of change - [ ] Bug fix (non-breaking change which fixes an issue) ## How Has This Been Tested? - Added test coverage for cross-account phone number validation - Using actual UI flow <img width="1493" height="532" alt="image" src="https://github.com/user-attachments/assets/67d2bb99-2eb9-4115-8d56-449e4785e0d8" /> ## 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 * feat: Update Captain navigation structure (#12761) # Pull Request Template ## Description This PR includes an update to the Captain navigation structure. ## Route Structure ```javascript 1. captain_assistants_responses_index → /captain/:assistantId/faqs 2. captain_assistants_documents_index → /captain/:assistantId/documents 3. captain_assistants_scenarios_index → /captain/:assistantId/scenarios 4. captain_assistants_playground_index → /captain/:assistantId/playground 5. captain_assistants_inboxes_index → /captain/:assistantId/inboxes 6. captain_tools_index → /captain/tools 7. captain_assistants_settings_index → /captain/:assistantId/settings 8. captain_assistants_guardrails_index → /captain/:assistantId/settings/guardrails 9. captain_assistants_guidelines_index → /captain/:assistantId/settings/guidelines 10. captain_assistants_index → /captain/:navigationPath ``` **How it works:** 1. User clicks sidebar item → Routes to `captain_assistants_index` with `navigationPath` 2. `AssistantsIndexPage` validates route and gets last active assistant, if not redirects to assistant create page. 3. Routes to actual page: `/captain/:assistantId/:page` 4. Page loads with correct assistant context Fixes https://linear.app/chatwoot/issue/CW-5832/updating-captain-navigation ## Type of change - [x] New feature (non-breaking change which adds functionality) ## How Has This Been Tested? ## 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> Co-authored-by: Sojan Jose <sojan@pepalo.com> * fix: Handle login when there are no accounts (#12816) * chore: Update translations (#12794) * chore(docs): Fix typos in some files (#12817) This PR fixes typos in the file file using codespell. * refactor: strategy pattern for mailbox conversation finding (#12766) Co-authored-by: Pranav <pranav@chatwoot.com> Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com> * fix: Issue with processing variables in outgoing email content (#12799) Co-authored-by: Shivam Mishra <scm.mymail@gmail.com> Co-authored-by: Vinay Keerthi <11478411+stonecharioteer@users.noreply.github.com> Co-authored-by: Sojan Jose <sojan@pepalo.com> * fix: hide pdf citations in captain faq responses (#12839) * fix: Use contact_id instead of sender_id for Instagram message locks (#12841) Previously, the lock key for Instagram used sender_id, which for echo messages (outgoing) would be the account's own ID. This caused all outgoing messages to compete for the same lock, creating a bottleneck during bulk messaging. The fix introduces contact_instagram_id method that correctly identifies the contact's ID regardless of message direction: - For echo messages (outgoing): uses recipient.id (the contact) - For incoming messages: uses sender.id (the contact) This ensures each conversation has a unique lock, allowing parallel processing of webhooks while maintaining race condition protection within individual conversations. Fixes lock acquisition errors in Sidekiq when processing bulk Instagram messages. Fixes https://linear.app/chatwoot/issue/CW-5931/p0-mutexapplicationjoblockacquisitionerror-failed-to-acquire-lock-for ## Type of change - [x] Bug fix (non-breaking change which fixes an issue) * fix: label tags for contactable inboxes (#12838) * chore: Improve captain layout (#12820) * feat: allow selecting month range in overview reports (#12701) Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Co-authored-by: iamsivin <iamsivin@gmail.com> * fix: respect status parameter when creating articles via API (#12846) ## Description The Articles API was ignoring the `status` parameter when creating new articles. All articles were forced to be drafts due to a hardcoded `@article.draft!` call in the controller, even when users explicitly sent `status: 1` (published) in their API request. This PR removes the hardcoded draft enforcement and allows the status parameter to be respected while maintaining backward compatibility. Fixes #12063 ## Type of change - [x] Bug fix (non-breaking change which fixes an issue) ## How Has This Been Tested? **Before:** - API POST with `status: 1` → Created as draft (ignored parameter) - API POST without status → Created as draft **After:** - API POST with `status: 1` → Created as published ✅ - API POST without status → Created as draft (backward compatible) ✅ - UI creates articles → Still creates as draft (UI doesn't send status) ✅ **Tests run:** ```bash bundle exec rspec spec/controllers/api/v1/accounts/articles_controller_spec.rb # 17 examples, 0 failures ``` Updated tests: 1. Changed 2 existing tests that were verifying the broken behavior (expecting draft when published was sent) 2. Added new test to verify articles default to draft when status is not provided 3. All existing tests pass, confirming backward compatibility ## 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 - [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 Co-authored-by: Sojan Jose <sojan@pepalo.com> * feat: allow querying reporting events via the API (#12832) * feat(webhooks): add name to webhook (#12641) ## Description When working with webhooks, it's easy to lose track of which URL is which. Adding a `name` (optional) column to the webhook model is a straight-forward solution to make it significantly easier to identify webhooks. ## Type of change - [x] New feature (non-breaking change which adds functionality) ## How Has This Been Tested? Model and controller specs, and also running in production over several months without any issues. | Before | After | | --- | --- | | <img width="949" height="990" alt="image copy 3" src="https://github.com/user-attachments/assets/6b33c072-7d16-4a9c-a129-f9c0751299f5" /> | <img width="806" height="941" alt="image" src="https://github.com/user-attachments/assets/77f3cb3a-2eb0-41ac-95bf-d02915589690" /> | | <img width="1231" height="650" alt="image copy 2" src="https://github.com/user-attachments/assets/583374af-96e0-4436-b026-4ce79b7f9321" /> | <img width="1252" height="650" alt="image copy" src="https://github.com/user-attachments/assets/aa81fb31-fd18-4e21-a40e-d8ab0dc76b4e" /> | ## 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 * perf: speed up docker builds (#12859) - Use separate keys to avoid cache overwrites across different architecture builds https://linear.app/chatwoot/issue/CW-5945/perf-speed-up-docker-builds ### 25 mins ---> 5mins ## before <img width="971" height="452" alt="image" src="https://github.com/user-attachments/assets/535cebd6-6c16-48d1-a62d-ffb6f2fc9b08" /> ## after <img width="940" height="428" alt="image" src="https://github.com/user-attachments/assets/359eb313-4bb5-4e0e-9492-a8ad48645159" /> * chore: Update missing places with new colors (#12862) # Pull Request Template ## Description This PR updates the colors in places that were missed during the color update migration. ## 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 * fix: Brand installation name not showing (#12861) # Pull Request Template ## Description Fixes https://linear.app/chatwoot/issue/CW-5946/fix-brand-installation-name-issue-in-dyte ## 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 * fix: migrate from deprecated annotate gem to annotaterb (#12845) ## Description The `annotate` gem has been deprecated and users are experiencing annotation errors with the new Rails 7 `serialize` syntax. This PR migrates to `annotaterb`, the actively maintained fork. Users reported errors when running `make db`: ``` Unable to annotate app/models/installation_config.rb: no implicit conversion of Hash into String Unable to annotate app/models/installation_config.rb: no implicit conversion of nil into Array ``` This PR updates the Gemfile and rake configuration to use `annotaterb` instead. Fixes #11673 ## Type of change - [x] Bug fix (non-breaking change which fixes an issue) ## How Has This Been Tested? Tested locally with the following steps: 1. Run `bundle install` - successfully installed annotaterb 4.20.0 2. Run `RAILS_ENV=development bundle exec rails db:chatwoot_prepare` - completed without annotation errors 3. Run `RAILS_ENV=development bundle exec rails annotate_rb:models` - successfully annotated all models including InstallationConfig 4. Verified InstallationConfig model annotations are present and correct ## 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 - [x] New and existing unit tests pass locally with my changes * chore: disable worker MemoryHigh throttling in systemd unit (#12871) - set MemoryHigh to infinity in deployment/chatwoot-worker.1.service so the worker is throttled only by the existing MemoryMax hard limit - prevents cgroup reclaim from slowing Sidekiq under transient spikes while still keeping the hard stop at 1.5 GB * chore: Update translations (#12818) * fix: revert annotaterb migration due to persistent annotation errors (#12881) ## Description This PR reverts the migration from the `annotate` gem to `annotaterb` introduced in PR #12845. The annotation errors reported in #11673 persist with both gems, and the old `annotate` gem handles the errors more gracefully by continuing to process other models instead of crashing. **Testing reveals both gems fail with the same underlying issue:** **Old annotate gem (3.2.0):** ``` Unable to annotate app/models/installation_config.rb: no implicit conversion of Hash into String Unable to annotate app/models/installation_config.rb: no implicit conversion of nil into Array Model files unchanged. ``` (Logs error but continues processing) **New annotaterb gem (4.20.0):** ``` ❯ bundle exec annotaterb models ruby/3.4.4/lib/ruby/gems/3.4.0/gems/reline-0.3.6/lib/reline/terminfo.rb:2: warning: ruby/3.4.4/lib/ruby/3.4.0/fiddle.rb was loaded from the standard library, but will no longer be part of the default gems starting from Ruby 3.5.0. You can add fiddle to your Gemfile or gemspec to silence this warning. Also please contact the author of reline-0.3.6 to request adding fiddle into its gemspec. Annotating models bundler: failed to load command: annotaterb (ruby/3.4.4/bin/annotaterb) ruby/3.4.4/lib/ruby/3.4.0/psych/parser.rb:62:in 'Psych::Parser#_native_parse': no implicit conversion of Hash into String (TypeError) _native_parse @handler, yaml, path ^^^^^^^^^^^^^^^^^^^^ from ruby/3.4.4/lib/ruby/3.4.0/psych/parser.rb:62:in 'Psych::Parser#parse' from ruby/3.4.4/lib/ruby/3.4.0/psych.rb:457:in 'Psych.parse_stream' from ruby/3.4.4/lib/ruby/3.4.0/psych.rb:401:in 'Psych.parse' from ruby/3.4.4/lib/ruby/3.4.0/psych.rb:325:in 'Psych.safe_load' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/activerecord-7.1.5.2/lib/active_record/coders/yaml_column.rb:37:in 'ActiveRecord::Coders::YAMLColumn::SafeCoder#load' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/activerecord-7.1.5.2/lib/active_record/coders/column_serializer.rb:37:in 'ActiveRecord::Coders::ColumnSerializer#load' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/activerecord-7.1.5.2/lib/active_record/type/serialized.rb:22:in 'ActiveRecord::Type::Serialized#deserialize' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/activemodel-7.1.5.2/lib/active_model/attribute.rb:175:in 'ActiveModel::Attribute::FromDatabase#type_cast' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/activemodel-7.1.5.2/lib/active_model/attribute.rb:43:in 'ActiveModel::Attribute#value' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/activemodel-7.1.5.2/lib/active_model/attribute_set.rb:37:in 'block in ActiveModel::AttributeSet#to_hash' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/activesupport-7.1.5.2/lib/active_support/core_ext/enumerable.rb:78:in 'block in Enumerable#index_with' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/activesupport-7.1.5.2/lib/active_support/core_ext/enumerable.rb:78:in 'Array#each' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/activesupport-7.1.5.2/lib/active_support/core_ext/enumerable.rb:78:in 'Enumerable#index_with' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/activemodel-7.1.5.2/lib/active_model/attribute_set.rb:37:in 'ActiveModel::AttributeSet#to_hash' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/activerecord-7.1.5.2/lib/active_record/model_schema.rb:499:in 'ActiveRecord::ModelSchema::ClassMethods#column_defaults' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/model_wrapper.rb:68:in 'AnnotateRb::ModelAnnotator::ModelWrapper#column_defaults' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/model_wrapper.rb:139:in 'block in AnnotateRb::ModelAnnotator::ModelWrapper#built_attributes' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/model_wrapper.rb:136:in 'Array#map' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/model_wrapper.rb:136:in 'AnnotateRb::ModelAnnotator::ModelWrapper#built_attributes' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/column_annotation/annotation_builder.rb:15:in 'AnnotateRb::ModelAnnotator::ColumnAnnotation::AnnotationBuilder#build' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/annotation/annotation_builder.rb:52:in 'block in AnnotateRb::ModelAnnotator::Annotation::AnnotationBuilder::Annotation#columns' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/annotation/annotation_builder.rb:51:in 'Array#map' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/annotation/annotation_builder.rb:51:in 'AnnotateRb::ModelAnnotator::Annotation::AnnotationBuilder::Annotation#columns' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/annotation/annotation_builder.rb:26:in 'AnnotateRb::ModelAnnotator::Annotation::AnnotationBuilder::Annotation#body' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/annotation/annotation_builder.rb:35:in 'AnnotateRb::ModelAnnotator::Annotation::AnnotationBuilder::Annotation#build' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/annotation/annotation_builder.rb:71:in 'AnnotateRb::ModelAnnotator::Annotation::AnnotationBuilder#build' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/project_annotator.rb:43:in 'AnnotateRb::ModelAnnotator::ProjectAnnotator#build_instructions_for_file' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/project_annotator.rb:17:in 'block in AnnotateRb::ModelAnnotator::ProjectAnnotator#annotate' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/project_annotator.rb:13:in 'Array#map' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/project_annotator.rb:13:in 'AnnotateRb::ModelAnnotator::ProjectAnnotator#annotate' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/annotator.rb:21:in 'AnnotateRb::ModelAnnotator::Annotator#do_annotations' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/annotator.rb:8:in 'AnnotateRb::ModelAnnotator::Annotator.do_annotations' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/commands/annotate_models.rb:17:in 'AnnotateRb::Commands::AnnotateModels#call' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/runner.rb:38:in 'AnnotateRb::Runner#run' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/runner.rb:11:in 'AnnotateRb::Runner.run' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/exe/annotaterb:18:in '<top (required)>' from ruby/3.4.4/bin/annotaterb:25:in 'Kernel#load' from ruby/3.4.4/bin/annotaterb:25:in '<top (required)>' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/lib/bundler/cli/exec.rb:58:in 'Kernel.load' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/lib/bundler/cli/exec.rb:58:in 'Bundler::CLI::Exec#kernel_load' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/lib/bundler/cli/exec.rb:23:in 'Bundler::CLI::Exec#run' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/lib/bundler/cli.rb:455:in 'Bundler::CLI#exec' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/lib/bundler/vendor/thor/lib/thor/command.rb:28:in 'Bundler::Thor::Command#run' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in 'Bundler::Thor::Invocation#invoke_command' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/lib/bundler/vendor/thor/lib/thor.rb:527:in 'Bundler::Thor.dispatch' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/lib/bundler/cli.rb:35:in 'Bundler::CLI.dispatch' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/lib/bundler/vendor/thor/lib/thor/base.rb:584:in 'Bundler::Thor::Base::ClassMethods#start' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/lib/bundler/cli.rb:29:in 'Bundler::CLI.start' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/exe/bundle:28:in 'block in <top (required)>' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/lib/bundler/friendly_errors.rb:117:in 'Bundler.with_friendly_errors' from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/exe/bundle:20:in '<top (required)>' from ruby/3.4.4/bin/bundle:25:in 'Kernel#load' from ruby/3.4.4/bin/bundle:25:in '<main>' ``` (Crashes immediately, stops all processing) **Root cause:** The `InstallationConfig` model uses YAML serialization (`serialize :serialized_value, coder: YAML`) on a JSONB database column. When annotation tools read column defaults, PostgreSQL returns JSONB as a Hash, but YAML expects a String, causing the type error. The migration to annotaterb doesn't solve the problem - both gems encounter the same error. The old gem is preferable as it continues working despite the error. Reverts #12845 Related to #11673 ## Type of change - [x] Bug fix (non-breaking change which fixes an issue) ## How Has This Been Tested? 1. Reverted commit559d1b6572. Ran `bundle install` to reinstall annotate gem v3.2.0 3. Ran `RAILS_ENV=development bundle exec annotate` - Result: Logs errors for InstallationConfig but completes successfully 4. Re-applied the annotaterb changes and tested `bundle exec annotaterb models` - Result: Crashes with full stack trace and stops processing ## 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 - [x] New and existing unit tests pass locally with my changes --- *Edited to truncate environment-specific info from error dump* * chore: Hide assistant switcher on paywall screen (#12875) * feat: Assignment service (v2) (#12320) ## Linear Link ## Description This PR introduces a new robust auto-assignment system for conversations in Chatwoot. The system replaces the existing round-robin assignment with a more sophisticated service-based architecture that supports multiple assignment strategies, rate limiting, and Enterprise features like capacity-based assignment and balanced distribution. ## Type of change - [ ] New feature (non-breaking change which adds functionality) ## How Has This Been Tested? - Unit test cases - Test conversations getting assigned on status change to open - Test the job directly via rails 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 <!-- CURSOR_SUMMARY --> --- > [!NOTE] > Adds a new service-based auto-assignment system with scheduled jobs, rate limiting, enterprise capacity/balanced selection, and wiring via inbox/handler; includes Redis helpers and comprehensive tests. > > - **Auto-assignment v2 (core services)**: > - Add `AutoAssignment::AssignmentService` with bulk assignment, configurable conversation priority, RR selection, and per-agent rate limiting via `AutoAssignment::RateLimiter`. > - Add `AutoAssignment::RoundRobinSelector` for agent selection. > - **Jobs & scheduling**: > - Add `AutoAssignment::AssignmentJob` (per-inbox bulk assign; env-based limit) and `AutoAssignment::PeriodicAssignmentJob` (batch over accounts/inboxes). > - Schedule periodic run in `config/schedule.yml` (`periodic_assignment_job`). > - **Model/concerns wiring**: > - Include `InboxAgentAvailability` in `Inbox`; add `Inbox#auto_assignment_v2_enabled?`. > - Update `AutoAssignmentHandler` to trigger v2 job when `auto_assignment_v2_enabled?`, else fallback to legacy. > - **Enterprise extensions**: > - Add `Enterprise::InboxAgentAvailability` (capacity-aware filtering) and `Enterprise::Concerns::Inbox` association `inbox_capacity_limits`. > - Extend service via `Enterprise::AutoAssignment::AssignmentService` (policy-driven config, capacity filtering, exclusion rules) and add selectors/services: `BalancedSelector`, `CapacityService`. > - **Infrastructure**: > - Enhance `Redis::Alfred` with `expire`, key scan/count, and extended ZSET helpers (`zadd`, `zcount`, `zcard`, `zrangebyscore`). > - **Tests**: > - Add specs for jobs, core service, rate limiter, RR selector, and enterprise features (capacity, balanced selection, exclusions). > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 0ebe187c8aea73765b0122a44b18d6f465c2477f. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> --------- Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com> Co-authored-by: Shivam Mishra <scm.mymail@gmail.com> * fix: Change contact_inboxes.source_id to text column (#12882) ## Description Fixes CW-5961 where IMAP email processing failed with `ActiveRecord::RecordInvalid: Validation failed: Source is too long (maximum is 255 characters)` error. This changes the `contact_inboxes.source_id` column from `string` (255 character limit) to `text` (unlimited) to accommodate long email message IDs that were causing validation failures. Fixes CW-5961 ## Type of change - [x] Bug fix (non-breaking change which fixes an issue) ## How Has This Been Tested? - Added spec test validating `source_id` values longer than 255 characters (300 chars) - All existing `contact_inbox_spec.rb` tests pass (7 examples, 0 failures) - Migration applied successfully with reversible up/down methods - Verified `source_id` column type changed to `text` with `null: false` constraint preserved ## 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 - [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 * feat: allow configuring attachment upload limit (#12835) ## Summary - add a configurable MAXIMUM_FILE_UPLOAD_SIZE installation setting and surface it through super admin and global config payloads - apply the configurable limit to attachment validations and shared upload helpers on dashboard and widget - introduce a reusable helper with unit tests for parsing the limit and extend attachment specs for configurability ------ [Codex Task](https://chatgpt.com/codex/tasks/task_e_6912644786b08326bc8dee9401af6d0a) --------- Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Co-authored-by: iamsivin <iamsivin@gmail.com> * feat: Customizable webhook timeout configuration (#12777) ## Summary - Ability to configure the webhook timeout for Chatwoot self hosted installations fixes: https://github.com/chatwoot/chatwoot/issues/12754 * feat: Control the allowed login methods via Super Admin (#12892) - Control the allowed authentication methods for a chatwoot installation via super admin configs. [SAML, Google Auth etc] ------ [Codex Task](https://chatgpt.com/codex/tasks/task_e_6917d503b6e48326a261672c1de91462) --------- Co-authored-by: Pranav <pranav@chatwoot.com> Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> * chore: Update translations (#12876) * feat: Backend - Companies API endpoint with pagination and search (#12840) ## Description Adds API endpoint to list companies with pagination, search, and sorting. Fixes https://linear.app/chatwoot/issue/CW-5930/add-backend-routes-to-get-companies-result Parent issue: https://linear.app/chatwoot/issue/CW-5928/add-companies-tab-to-dashboard ## Type of change - [x] New feature (non-breaking change which adds functionality) ## How Has This Been Tested? Added comprehensive specs to `spec/enterprise/controllers/api/v1/accounts/companies_controller_spec.rb`: - Pagination (25 per page, multiple pages) - Search by name and domain (case-insensitive) - Counter cache for contacts_count - Account scoping - Authorization To reproduce: ```bash bundle exec rspec spec/enterprise/controllers/api/v1/accounts/companies_controller_spec.rb bundle exec rubocop enterprise/app/controllers/api/v1/accounts/companies_controller.rb ``` ## Checklist: - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my code - [ ] I have commented on my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [x] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --------- Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Co-authored-by: iamsivin <iamsivin@gmail.com> Co-authored-by: Shivam Mishra <scm.mymail@gmail.com> Co-authored-by: Sojan Jose <sojan@pepalo.com> * feat: Companies page (#12842) # Pull Request Template ## Description This PR introduces a new Companies section in the Chatwoot dashboard. It lists all companies associated with the account and includes features such as **search**, **sorting**, and **pagination** to enable easier navigation and efficient management. Fixes https://linear.app/chatwoot/issue/CW-5928/add-companies-tab-to-dashboard ## Type of change - [x] New feature (non-breaking change which adds functionality) ## How Has This Been Tested? ### Screenshot <img width="1619" height="1200" alt="image" src="https://github.com/user-attachments/assets/21f0a666-c3d6-4dec-bd02-1e38e0cd9542" /> ## Checklist: - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my code - [x] I have commented on my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --------- Co-authored-by: Vinay Keerthi <11478411+stonecharioteer@users.noreply.github.com> Co-authored-by: Shivam Mishra <scm.mymail@gmail.com> * feat: Add Amazon SES inbound email support (#12893) ## Summary - add AWS ActionMailbox SES gems - document SES as incoming email provider - note SES option in configuration ## Testing - `bundle exec rubocop config/initializers/mailer.rb config/environments/production.rb Gemfile` ------ [Codex Task](https://chatgpt.com/codex/tasks/task_e_68bbb7d482288326b8f04bb795af0322) --------- Co-authored-by: Pranav <pranav@chatwoot.com> Co-authored-by: Vinay Keerthi <11478411+stonecharioteer@users.noreply.github.com> * feat: hide email forwarding address if INBOUND_EMAIL_DOMAIN is not configured (#12768) #### Summary - Improved email inbox setup flow to handle cases where inbound email forwarding is not configured on the installation - Added conditional display of email forwarding address based on MAILER_INBOUND_EMAIL_DOMAIN environment variable availability - Enhanced user messaging to guide users toward configuring SMTP/IMAP settings when forwarding is unavailable #### Changes **Backend (app/views/api/v1/models/_inbox.json.jbuilder)** - Added forwarding_enabled boolean flag to inbox API response based on MAILER_INBOUND_EMAIL_DOMAIN presence - Made forward_to_email conditional - only included when forwarding is enabled **Frontend - Inbox Creation Flow** - Created new EmailInboxFinish.vue component to handle email inbox setup completion - Shows different messages based on whether forwarding is enabled: - With forwarding: displays forwarding address and encourages SMTP/IMAP configuration - Without forwarding: warns that SMTP/IMAP configuration is required for emails to be processed - Added link to configuration page for easy access to SMTP/IMAP settings <img width="988" height="312" alt="Screenshot 2025-11-18 at 3 27 27 PM" src="https://github.com/user-attachments/assets/928aff78-df73-49fa-9a26-dbbd1297b26a" /> <img width="765" height="489" alt="Screenshot 2025-11-18 at 3 24 46 PM" src="https://github.com/user-attachments/assets/6a182c7d-087f-4e88-92a5-30f147a567a7" /> Fixes https://linear.app/chatwoot/issue/CW-5881/hide-forwaring-email-section-if-inbound-email-domain-is-not-configured ## Type of change - [x] New feature (non-breaking change which adds functionality) ## How Has This Been Tested? - Tested locally ## 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: Pranav <pranav@chatwoot.com> * feat: APIs to assign agents_bots as assignee in conversations (#12836) ## Summary - add an assignee_agent_bot_id column as an initital step to prototype this before fully switching to polymorphic assignee - update assignment APIs and conversation list / show endpoints to reflect assignee as agent bot - ensure webhook payloads contains agent bot assignee [Codex Task](https://chatgpt.com/codex/tasks/task_e_6912833377e48326b6641b9eee32d50f) --------- Co-authored-by: Pranav <pranav@chatwoot.com> * Bump version to 4.8.0 * chore: remove migration --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Co-authored-by: Shivam Mishra <scm.mymail@gmail.com> Co-authored-by: Chatwoot Bot <92152627+chatwoot-bot@users.noreply.github.com> Co-authored-by: Pranav <pranav@chatwoot.com> Co-authored-by: Sojan Jose <sojan@pepalo.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Muhsin <muhsinkeramam@gmail.com> Co-authored-by: Vinay Keerthi <11478411+stonecharioteer@users.noreply.github.com> Co-authored-by: Vishnu Narayanan <iamwishnu@gmail.com> Co-authored-by: iamsivin <iamsivin@gmail.com> Co-authored-by: Tanmay Deep Sharma <32020192+tds-1@users.noreply.github.com> Co-authored-by: Lê Nam Khánh <55955273+khanhkhanhlele@users.noreply.github.com>
1093 lines
52 KiB
JSON
1093 lines
52 KiB
JSON
{
|
|
"INBOX_MGMT": {
|
|
"HEADER": "Caixas de Entrada",
|
|
"DESCRIPTION": "Um canal é o modo de comunicação que seu cliente escolhe para interagir com você. Uma caixa de entrada é onde você gerencia interações para um canal específico. Pode incluir comunicações de várias fontes, como e-mail, chat ao vivo e mídia social.",
|
|
"LEARN_MORE": "Saiba mais sobre as caixas de entrada",
|
|
"RECONNECTION_REQUIRED": "Sua caixa de entrada está desconectada. Você não receberá novas mensagens até reautorizar.",
|
|
"CLICK_TO_RECONNECT": "Clique aqui para reconectar.",
|
|
"WHATSAPP_REGISTRATION_INCOMPLETE": "Seu registro no WhatsApp Business não foi concluído. Verifique o status do seu nome de exibição no Meta Business Manager antes de reconectar.",
|
|
"COMPLETE_REGISTRATION": "Concluir registro",
|
|
"LIST": {
|
|
"404": "Não há caixas de entrada anexadas a esta conta."
|
|
},
|
|
"CREATE_FLOW": {
|
|
"CHANNEL": {
|
|
"TITLE": "Escolha o Canal",
|
|
"BODY": "Escolha o provedor que você deseja integrar com o Chatwoot."
|
|
},
|
|
"INBOX": {
|
|
"TITLE": "Criar Caixa de Entrada",
|
|
"BODY": "Autenticar sua conta e criar uma caixa de entrada."
|
|
},
|
|
"AGENT": {
|
|
"TITLE": "Adicionar Agentes",
|
|
"BODY": "Adicionar agentes à caixa de entrada criada."
|
|
},
|
|
"FINISH": {
|
|
"TITLE": "Então!",
|
|
"BODY": "Está tudo pronto para começar!"
|
|
}
|
|
},
|
|
"ADD": {
|
|
"CHANNEL_NAME": {
|
|
"LABEL": "Nome da Caixa de Entrada",
|
|
"PLACEHOLDER": "Digite o nome da caixa de entrada (ex: Acme Inc)",
|
|
"ERROR": "Por favor, insira um nome completo válido"
|
|
},
|
|
"WEBSITE_NAME": {
|
|
"LABEL": "Nome do site",
|
|
"PLACEHOLDER": "Informe o nome do seu site (por exemplo: Acme Inc)"
|
|
},
|
|
"FB": {
|
|
"HELP": "Obs: ao fazer login, apenas temos acesso às mensagens da sua página. Suas mensagens privadas nunca podem ser acessadas pelo Chatwoot.",
|
|
"CHOOSE_PAGE": "Escolher Página",
|
|
"CHOOSE_PLACEHOLDER": "Selecione uma página da lista",
|
|
"INBOX_NAME": "Nome da Caixa de Entrada",
|
|
"ADD_NAME": "Adicione um nome para sua caixa de entrada",
|
|
"PICK_NAME": "Escolha um nome para sua caixa de entrada",
|
|
"PICK_A_VALUE": "Escolha um valor",
|
|
"CREATE_INBOX": "Criar Caixa de Entrada"
|
|
},
|
|
"INSTAGRAM": {
|
|
"CONTINUE_WITH_INSTAGRAM": "Continuar com o Instagram",
|
|
"CONNECT_YOUR_INSTAGRAM_PROFILE": "Conecte seu perfil do Instagram",
|
|
"HELP": "Para adicionar seu perfil do Instagram como um canal, você precisa autenticar seu perfil do Instagram clicando em 'Continuar com o Instagram' ",
|
|
"ERROR_MESSAGE": "Houve um erro ao conectar ao Instagram, por favor, tente novamente",
|
|
"ERROR_AUTH": "Houve um erro ao conectar ao Instagram, por favor, tente novamente",
|
|
"NEW_INBOX_SUGGESTION": "Esta conta do Instagram estava conectada a uma caixa de entrada diferente e agora foi migrada para aqui. Todas as novas mensagens aparecerão aqui. A caixa de entrada antiga não poderá mais enviar ou receber mensagens para esta conta.",
|
|
"DUPLICATE_INBOX_BANNER": "Esta conta do Instagram foi migrada para a nova caixa de entrada de canal do Instagram. Você não poderá mais enviar/receber mensagens do Instagram desta caixa de entrada."
|
|
},
|
|
"TWITTER": {
|
|
"HELP": "Para adicionar seu perfil do Twitter como um canal, você precisa autenticar seu perfil do Twitter clicando em 'Entrar com o Twitter' ",
|
|
"ERROR_MESSAGE": "Houve um erro ao conectar com o Twitter, por favor, tente novamente",
|
|
"TWEETS": {
|
|
"ENABLE": "Criar conversas a partir dos Tweets mencionados"
|
|
}
|
|
},
|
|
"WEBSITE_CHANNEL": {
|
|
"TITLE": "Canal do website",
|
|
"DESC": "Crie um canal para seu site e comece a oferecer suporte a seus clientes através do nosso widget do site.",
|
|
"LOADING_MESSAGE": "Criando canal de suporte ao site",
|
|
"CHANNEL_AVATAR": {
|
|
"LABEL": "Imagem do Canal"
|
|
},
|
|
"CHANNEL_WEBHOOK_URL": {
|
|
"LABEL": "URL do webhook",
|
|
"PLACEHOLDER": "Insira o URL do seu webhook",
|
|
"ERROR": "Por favor, insira uma URL válida"
|
|
},
|
|
"CHANNEL_DOMAIN": {
|
|
"LABEL": "Domínio do website",
|
|
"PLACEHOLDER": "Informe o domínio do seu site (por exemplo: acme.com)"
|
|
},
|
|
"CHANNEL_WELCOME_TITLE": {
|
|
"LABEL": "Seja bem-vindo",
|
|
"PLACEHOLDER": "Olá !"
|
|
},
|
|
"CHANNEL_WELCOME_TAGLINE": {
|
|
"LABEL": "Bem-vindo, saudação",
|
|
"PLACEHOLDER": "Nós tornamos simples a conexão conosco. Pergunte qualquer assunto ou compartilhe seus comentários."
|
|
},
|
|
"CHANNEL_GREETING_MESSAGE": {
|
|
"LABEL": "Mensagem de saudação do canal",
|
|
"PLACEHOLDER": "Acme Inc normalmente responde em algumas horas."
|
|
},
|
|
"CHANNEL_GREETING_TOGGLE": {
|
|
"LABEL": "Ativar saudação do canal",
|
|
"HELP_TEXT": "Enviar automaticamente uma mensagem de saudação quando uma nova conversa é criada.",
|
|
"ENABLED": "Ativado",
|
|
"DISABLED": "Desativado"
|
|
},
|
|
"REPLY_TIME": {
|
|
"TITLE": "Definir o Tempo de Resposta",
|
|
"IN_A_FEW_MINUTES": "Em alguns minutos",
|
|
"IN_A_FEW_HOURS": "Em algumas horas",
|
|
"IN_A_DAY": "Em um dia",
|
|
"HELP_TEXT": "Este tempo de resposta será exibido no widget do chat"
|
|
},
|
|
"WIDGET_COLOR": {
|
|
"LABEL": "Cor do Widget",
|
|
"PLACEHOLDER": "Atualize a cor do widget"
|
|
},
|
|
"SUBMIT_BUTTON": "Criar caixa de entrada",
|
|
"API": {
|
|
"ERROR_MESSAGE": "Não conseguimos criar um canal de site, por favor, tente novamente"
|
|
}
|
|
},
|
|
"TWILIO": {
|
|
"TITLE": "Canal Twilio SMS/WhatsApp",
|
|
"DESC": "Integre o Twilio e comece a oferecer suporte a seus clientes por SMS ou WhatsApp.",
|
|
"ACCOUNT_SID": {
|
|
"LABEL": "SID da Conta",
|
|
"PLACEHOLDER": "Por favor, insira o SID sua conta no Twilio",
|
|
"ERROR": "Este campo é obrigatório"
|
|
},
|
|
"API_KEY": {
|
|
"USE_API_KEY": "Usar autenticação de chave API",
|
|
"LABEL": "Chave da API SID",
|
|
"PLACEHOLDER": "Por favor, insira sua chave de API SID",
|
|
"ERROR": "Este campo é obrigatório"
|
|
},
|
|
"API_KEY_SECRET": {
|
|
"LABEL": "Segredo da Chave API",
|
|
"PLACEHOLDER": "Por favor, use sua API Key Secret",
|
|
"ERROR": "Este campo é obrigatório"
|
|
},
|
|
"MESSAGING_SERVICE_SID": {
|
|
"LABEL": "SID do Serviço de Mensagens",
|
|
"PLACEHOLDER": "Por favor, informe seu SID do Serviço de Mensagens do Twilio",
|
|
"ERROR": "Este campo é obrigatório",
|
|
"USE_MESSAGING_SERVICE": "Usar um Serviço de Mensagens do Twilio"
|
|
},
|
|
"CHANNEL_TYPE": {
|
|
"LABEL": "Tipo de canal",
|
|
"ERROR": "Por favor, selecione seu tipo de canal"
|
|
},
|
|
"AUTH_TOKEN": {
|
|
"LABEL": "Token de autenticação",
|
|
"PLACEHOLDER": "Por favor, digite seu Token de Autenticação do Twilio",
|
|
"ERROR": "Este campo é obrigatório"
|
|
},
|
|
"CHANNEL_NAME": {
|
|
"LABEL": "Nome da Caixa de Entrada",
|
|
"PLACEHOLDER": "Por favor, digite um nome para caixa de entrada",
|
|
"ERROR": "Este campo é obrigatório"
|
|
},
|
|
"PHONE_NUMBER": {
|
|
"LABEL": "Número de Telefone",
|
|
"PLACEHOLDER": "Por favor, insira o número de telefone do qual a mensagem será enviada.",
|
|
"ERROR": "Por favor, forneça um número de telefone válido que comece com o símbolo \"+\" e não contenha espaços."
|
|
},
|
|
"API_CALLBACK": {
|
|
"TITLE": "URL de Callback",
|
|
"SUBTITLE": "Você precisa configurar a URL de Callback de mensagem no Twilio com a URL mencionada aqui."
|
|
},
|
|
"SUBMIT_BUTTON": "Criar canal Twilio",
|
|
"API": {
|
|
"ERROR_MESSAGE": "Não fomos capazes de autenticar as credenciais Twilio, por favor, tente novamente"
|
|
}
|
|
},
|
|
"SMS": {
|
|
"TITLE": "Canal SMS",
|
|
"DESC": "Comece a oferecer suporte a seus clientes por SMS.",
|
|
"PROVIDERS": {
|
|
"LABEL": "Provedor de API",
|
|
"TWILIO": "Twilio",
|
|
"BANDWIDTH": "Bandwidth"
|
|
},
|
|
"API": {
|
|
"ERROR_MESSAGE": "Não foi possível salvar o canal SMS"
|
|
},
|
|
"BANDWIDTH": {
|
|
"ACCOUNT_ID": {
|
|
"LABEL": "ID da Conta",
|
|
"PLACEHOLDER": "Por favor, insira o ID de sua conta no Bandwidth",
|
|
"ERROR": "Este campo é obrigatório"
|
|
},
|
|
"API_KEY": {
|
|
"LABEL": "Chave API",
|
|
"PLACEHOLDER": "Insira sua chave API Bandwidth",
|
|
"ERROR": "Este campo é obrigatório"
|
|
},
|
|
"API_SECRET": {
|
|
"LABEL": "Chave secreta API",
|
|
"PLACEHOLDER": "Insira sua API Secret do Bandwidth",
|
|
"ERROR": "Este campo é obrigatório"
|
|
},
|
|
"APPLICATION_ID": {
|
|
"LABEL": "ID da aplicação",
|
|
"PLACEHOLDER": "Por favor, insira o ID de sua conta no Bandwidth",
|
|
"ERROR": "Este campo é obrigatório"
|
|
},
|
|
"INBOX_NAME": {
|
|
"LABEL": "Nome da Caixa de Entrada",
|
|
"PLACEHOLDER": "Por favor, digite um nome para caixa de entrada",
|
|
"ERROR": "Este campo é obrigatório"
|
|
},
|
|
"PHONE_NUMBER": {
|
|
"LABEL": "Número de telefone",
|
|
"PLACEHOLDER": "Por favor, insira o número de telefone do qual a mensagem será enviada.",
|
|
"ERROR": "Por favor, forneça um número de telefone válido que comece com o símbolo \"+\" e não contenha espaços."
|
|
},
|
|
"SUBMIT_BUTTON": "Criar canal Bandwidth",
|
|
"API": {
|
|
"ERROR_MESSAGE": "Não pudemos autenticar as credenciais de Bandwidth, por favor, tente novamente"
|
|
},
|
|
"API_CALLBACK": {
|
|
"TITLE": "URL de Callback",
|
|
"SUBTITLE": "Você precisa configurar a URL de callback de mensagem no Bandwidth com a URL mencionada aqui."
|
|
}
|
|
}
|
|
},
|
|
"WHATSAPP": {
|
|
"TITLE": "Canal do WhatsApp",
|
|
"DESC": "Comece a oferecer suporte a seus clientes pelo WhatsApp.",
|
|
"PROVIDERS": {
|
|
"LABEL": "Provedor de API",
|
|
"WHATSAPP_EMBEDDED": "WhatsApp Business",
|
|
"TWILIO": "Twilio",
|
|
"WHATSAPP_CLOUD": "Cloud do WhatsApp",
|
|
"WHATSAPP_CLOUD_DESC": "Configuração rápida via Meta",
|
|
"TWILIO_DESC": "Conectar através de credenciais Twilio",
|
|
"360_DIALOG": "360Dialog",
|
|
"BAILEYS": "Baileys",
|
|
"BAILEYS_DESC": "Conectar via API não-oficial Baileys",
|
|
"ZAPI": "Z-API",
|
|
"ZAPI_DESC": "Conectar via API não-oficial Z-API"
|
|
},
|
|
"SELECT_PROVIDER": {
|
|
"TITLE": "Selecione seu provedor de API",
|
|
"DESCRIPTION": "Escolha seu provedor do WhatsApp. Você pode se conectar diretamente através de metade, que não requer nenhuma configuração ou se conectar pelo Twilio usando as credenciais da sua conta.",
|
|
"ZAPI_PROMO": {
|
|
"TITLE": "Procurando uma solução WhatsApp confiável?",
|
|
"DESCRIPTION": "Z-API oferece estabilidade superior comparado ao Baileys e é muito mais simples de configurar que Cloud ou Twilio - sem necessidade de configuração complexa. Perfeito para empresas que querem começar rapidamente.",
|
|
"CTA": "Usar Z-API"
|
|
}
|
|
},
|
|
"INBOX_NAME": {
|
|
"LABEL": "Nome da Caixa de Entrada",
|
|
"PLACEHOLDER": "Por favor, digite um nome para caixa de entrada",
|
|
"ERROR": "Este campo é obrigatório"
|
|
},
|
|
"PHONE_NUMBER": {
|
|
"LABEL": "Número de telefone",
|
|
"PLACEHOLDER": "Por favor, insira o número de telefone do qual a mensagem será enviada.",
|
|
"ERROR": "Por favor, forneça um número de telefone válido que comece com o símbolo \"+\" e não contém quaisquer espaços."
|
|
},
|
|
"PHONE_NUMBER_ID": {
|
|
"LABEL": "ID do número de telefone",
|
|
"PLACEHOLDER": "Por favor, insira o ID do número de telefone obtido do painel do desenvolvedor do Facebook.",
|
|
"ERROR": "Por favor, insira um valor válido."
|
|
},
|
|
"BUSINESS_ACCOUNT_ID": {
|
|
"LABEL": "ID da conta do WhatsApp Business",
|
|
"PLACEHOLDER": "Por favor, insira o ID da conta do WhatsApp Business obtido do painel do desenvolvedor do Facebook.",
|
|
"ERROR": "Por favor, insira um valor válido."
|
|
},
|
|
"WEBHOOK_VERIFY_TOKEN": {
|
|
"LABEL": "Token de verificação do Webhook",
|
|
"PLACEHOLDER": "Insira um token de verificação que você deseja configurar para webhooks do Facebook.",
|
|
"ERROR": "Por favor, insira um valor válido."
|
|
},
|
|
"API_KEY": {
|
|
"LABEL": "Chave da API",
|
|
"SUBTITLE": "Configure a chave API do WhatsApp.",
|
|
"PLACEHOLDER": "Chave da API",
|
|
"ERROR": "Por favor, insira um valor válido."
|
|
},
|
|
"API_CALLBACK": {
|
|
"TITLE": "URL de callback",
|
|
"SUBTITLE": "Você deve configurar a URL do webhook e o token de verificação no portal do desenvolvedor do Facebook com os valores mostrados abaixo.",
|
|
"WEBHOOK_URL": "URL do Webhook",
|
|
"WEBHOOK_VERIFICATION_TOKEN": "Token de verificação Webhook"
|
|
},
|
|
"PROVIDER_URL": {
|
|
"LABEL": "URL do provedor",
|
|
"PLACEHOLDER": "Se o provedor não está rodando localmente, por favor, insira a URL do provedor",
|
|
"ERROR": "Por favor, insira uma URL válida"
|
|
},
|
|
"MARK_AS_READ": {
|
|
"LABEL": "Enviar confirmações de leitura"
|
|
},
|
|
"INSTANCE_ID": {
|
|
"LABEL": "ID da instância",
|
|
"PLACEHOLDER": "Por favor, insira o ID da sua instância",
|
|
"ERROR": "Este campo é obrigatório"
|
|
},
|
|
"TOKEN": {
|
|
"LABEL": "Token",
|
|
"PLACEHOLDER": "Por favor, insira o Token da sua instância",
|
|
"ERROR": "Este campo é obrigatório"
|
|
},
|
|
"CLIENT_TOKEN": {
|
|
"LABEL": "Token de Segurança",
|
|
"PLACEHOLDER": "Por favor, insira o Token de Segurança (veja a aba Segurança no painel do Z-API)",
|
|
"ERROR": "Este campo é obrigatório"
|
|
},
|
|
"ADVANCED_OPTIONS": "Opções avançadas",
|
|
"EXTERNAL_PROVIDER": {
|
|
"SUBTITLE": "Clique abaixo para configurar o canal do WhatsApp.",
|
|
"LINK_BUTTON": "Conectar dispositivo",
|
|
"LINK_DEVICE_MODAL": {
|
|
"TITLE": "Conecte o seu dispositivo",
|
|
"SUBTITLE": "Escaneie o QR code para conectar seu dispositivo. Certifique-se de que o número de telefone esteja correto antes de escanear.",
|
|
"LOADING_QRCODE": "Carregando QR code...",
|
|
"RECONNECTING": "Conectando...",
|
|
"LINK_DEVICE": "Conectar dispositivo",
|
|
"DISCONNECT": "Desconectar",
|
|
"CONNECTED": "Seu dispositivo foi conectado com sucesso. Agora você pode começar a enviar e receber mensagens."
|
|
}
|
|
},
|
|
"SUBMIT_BUTTON": "Criar canal do WhatsApp",
|
|
"EMBEDDED_SIGNUP": {
|
|
"TITLE": "Configuração rápida com Meta",
|
|
"DESC": "Use o fluxo de inscrição incorporada do WhatsApp para conectar rapidamente novos números. Você será redirecionado para a Meta para entrar na sua conta do WhatsApp Business. Ter acesso de administrador ajudará a tornar a configuração simples e fácil.",
|
|
"BENEFITS": {
|
|
"TITLE": "Benefícios da inscrição incorporada:",
|
|
"EASY_SETUP": "Nenhuma configuração manual é necessária",
|
|
"SECURE_AUTH": "Autenticação segura baseada em OAuth",
|
|
"AUTO_CONFIG": "Configuração automática de webhook e número de telefone"
|
|
},
|
|
"LEARN_MORE": {
|
|
"TEXT": "Para saber mais sobre a inscrição integrada, preços e limitações, visite {link}.",
|
|
"LINK_TEXT": "este link"
|
|
},
|
|
"SUBMIT_BUTTON": "Conecte-se com WhatsApp Business",
|
|
"AUTH_PROCESSING": "Autenticando com Meta",
|
|
"WAITING_FOR_BUSINESS_INFO": "Por favor, complete a configuração do negócio na janela da Meta...",
|
|
"PROCESSING": "Configurando sua conta do WhatsApp Business",
|
|
"LOADING_SDK": "Carregando SDK do Facebook...",
|
|
"CANCELLED": "A inscrição no WhatsApp foi cancelada",
|
|
"SUCCESS_TITLE": "Conta do WhatsApp Business conectada!",
|
|
"WAITING_FOR_AUTH": "Aguardando autenticação...",
|
|
"INVALID_BUSINESS_DATA": "Dados de negócio inválidos recebidos do Facebook. Por favor, tente novamente.",
|
|
"SIGNUP_ERROR": "Ocorreu um erro no cadastro",
|
|
"AUTH_NOT_COMPLETED": "Autenticação não concluída. Por favor, reinicie o processo.",
|
|
"SUCCESS_FALLBACK": "A conta do WhatsApp Business foi configurada com sucesso",
|
|
"MANUAL_FALLBACK": "Se o seu número já estiver conectado à Plataforma WhatsApp Business (API) ou se você for um provedor de tecnologia integrando o seu próprio número, use o fluxo de {link}",
|
|
"MANUAL_LINK_TEXT": "fluxo de configuração manual"
|
|
},
|
|
"ZAPI_PROMO": {
|
|
"SWITCH_BANNER": {
|
|
"TITLE": "Considere mudar para Z-API para configuração mais fácil",
|
|
"DESCRIPTION": "Z-API fornece uma conexão mais estável que Baileys e requer menos configuração que Cloud/Twilio. Mude para uma integração WhatsApp sem complicações.",
|
|
"CTA": "Mudar para Z-API"
|
|
},
|
|
"SETUP_BANNER": {
|
|
"TITLE": "Ganhe 10% de desconto na sua assinatura Z-API",
|
|
"DESCRIPTION": "Crie sua conta Z-API usando nosso link de afiliado e receba 10% de desconto. Configuração simples, conexões confiáveis e ótimo suporte.",
|
|
"CTA": "Criar Conta Z-API"
|
|
}
|
|
},
|
|
"API": {
|
|
"ERROR_MESSAGE": "Não foi possível salvar o canal do WhatsApp"
|
|
}
|
|
},
|
|
"VOICE": {
|
|
"TITLE": "Canal de Voz",
|
|
"DESC": "Integre o Twilio Voice e comece a oferecer suporte a seus clientes através de chamadas telefônicas.",
|
|
"PHONE_NUMBER": {
|
|
"LABEL": "Número de Telefone",
|
|
"PLACEHOLDER": "Digite seu número de telefone (por exemplo, +551234567890)",
|
|
"ERROR": "Por favor, forneça um número de telefone válido no formato E.164 (por exemplo, +551234567890)"
|
|
},
|
|
"TWILIO": {
|
|
"ACCOUNT_SID": {
|
|
"LABEL": "SID da Conta",
|
|
"PLACEHOLDER": "Insira o SID da sua Conta Twilio",
|
|
"REQUIRED": "O SID da conta é necessário"
|
|
},
|
|
"AUTH_TOKEN": {
|
|
"LABEL": "Token de autenticação",
|
|
"PLACEHOLDER": "Por favor, digite seu Token de Autenticação do Twilio",
|
|
"REQUIRED": "Um Token de autenticação é necessário"
|
|
},
|
|
"API_KEY_SID": {
|
|
"LABEL": "Chave da API SID",
|
|
"PLACEHOLDER": "Insira sua chave de API do Twilio SID",
|
|
"REQUIRED": "API Key SID é obrigatório"
|
|
},
|
|
"API_KEY_SECRET": {
|
|
"LABEL": "Segredo da Chave API",
|
|
"PLACEHOLDER": "Digite o segredo da sua chave de API do Twilio",
|
|
"REQUIRED": "Segredo da chave da API é obrigatório"
|
|
}
|
|
},
|
|
"CONFIGURATION": {
|
|
"TWILIO_VOICE_URL_TITLE": "URL do Twilio Voice",
|
|
"TWILIO_VOICE_URL_SUBTITLE": "Configure este URL como a Voice URL no seu número de telefone da Twilio e no aplicativo TwiML.",
|
|
"TWILIO_STATUS_URL_TITLE": "Status Callback URL da Twilio",
|
|
"TWILIO_STATUS_URL_SUBTITLE": "Configure este URL como a Status Callback URL no seu número de telefone da Twilio."
|
|
},
|
|
"SUBMIT_BUTTON": "Criar Canal de Voz",
|
|
"API": {
|
|
"ERROR_MESSAGE": "Não conseguimos criar o canal de voz"
|
|
}
|
|
},
|
|
"API_CHANNEL": {
|
|
"TITLE": "Canal da API",
|
|
"DESC": "Integre com canal API e comece a ajudar seus clientes.",
|
|
"CHANNEL_NAME": {
|
|
"LABEL": "Nome do Canal",
|
|
"PLACEHOLDER": "Por favor, insira um nome de canal",
|
|
"ERROR": "Este campo é obrigatório"
|
|
},
|
|
"WEBHOOK_URL": {
|
|
"LABEL": "URL do Webhook",
|
|
"SUBTITLE": "Configure a URL onde você deseja receber callbacks em eventos.",
|
|
"PLACEHOLDER": "URL do Webhook"
|
|
},
|
|
"SUBMIT_BUTTON": "Criar canal de API",
|
|
"API": {
|
|
"ERROR_MESSAGE": "Não foi possível salvar o canal de API"
|
|
}
|
|
},
|
|
"EMAIL_CHANNEL": {
|
|
"TITLE": "Canal de e-mail",
|
|
"DESC": "Integre sua caixa de entrada de e-mail.",
|
|
"CHANNEL_NAME": {
|
|
"LABEL": "Nome do Canal",
|
|
"PLACEHOLDER": "Por favor, insira um nome de canal",
|
|
"ERROR": "Este campo é obrigatório"
|
|
},
|
|
"EMAIL": {
|
|
"LABEL": "e-mail",
|
|
"SUBTITLE": "E-mail para onde os seus clientes lhe enviam tickets de suporte",
|
|
"PLACEHOLDER": "e-mail"
|
|
},
|
|
"SUBMIT_BUTTON": "Criar canal de e-mail",
|
|
"API": {
|
|
"ERROR_MESSAGE": "Não foi possível salvar o canal de e-mail"
|
|
},
|
|
"FINISH_MESSAGE": "Comece a encaminhar seus e-mails para o seguinte endereço de e-mail."
|
|
},
|
|
"LINE_CHANNEL": {
|
|
"TITLE": "Canal LINE",
|
|
"DESC": "Integre com o canal LINE e comece a apoiar seus clientes.",
|
|
"CHANNEL_NAME": {
|
|
"LABEL": "Nome do Canal",
|
|
"PLACEHOLDER": "Por favor, insira um nome de canal",
|
|
"ERROR": "Este campo é obrigatório"
|
|
},
|
|
"LINE_CHANNEL_ID": {
|
|
"LABEL": "ID do canal LINE",
|
|
"PLACEHOLDER": "ID do canal LINE"
|
|
},
|
|
"LINE_CHANNEL_SECRET": {
|
|
"LABEL": "Canal de LINHA secreto",
|
|
"PLACEHOLDER": "Canal de LINHA secreto"
|
|
},
|
|
"LINE_CHANNEL_TOKEN": {
|
|
"LABEL": "ID do canal Token",
|
|
"PLACEHOLDER": "ID do canal Token"
|
|
},
|
|
"SUBMIT_BUTTON": "Criar Canal",
|
|
"API": {
|
|
"ERROR_MESSAGE": "Não foi possível salvar o canal da LINHA"
|
|
},
|
|
"API_CALLBACK": {
|
|
"TITLE": "URL de retorno",
|
|
"SUBTITLE": "Você precisa configurar a URL do webhook no aplicativo LINE com a URL mencionada aqui."
|
|
}
|
|
},
|
|
"TELEGRAM_CHANNEL": {
|
|
"TITLE": "Canal do Telegram",
|
|
"DESC": "Integre com o canal do Telegram e comece a apoiar seus clientes.",
|
|
"BOT_TOKEN": {
|
|
"LABEL": "Bot Token",
|
|
"SUBTITLE": "Configure o token do bot que obteve do Telegram BotFather.",
|
|
"PLACEHOLDER": "Bot Token"
|
|
},
|
|
"SUBMIT_BUTTON": "Criar canal do Telegram",
|
|
"API": {
|
|
"ERROR_MESSAGE": "Não foi possível salvar o canal de e-mail"
|
|
}
|
|
},
|
|
"AUTH": {
|
|
"TITLE": "Escolha um canal",
|
|
"DESC": "O Chatwoot suporta widgets de chats ao vivo, Facebook Messenger, perfis do Twitter, WhatsApp, E-mails, etc., como canais. Se você quiser criar um canal personalizado, você pode criá-lo usando o canal API. Para começar, escolha um dos canais abaixo.",
|
|
"TITLE_NEXT": "Concluir a configuração",
|
|
"TITLE_FINISH": "Então!",
|
|
"CHANNEL": {
|
|
"WEBSITE": {
|
|
"TITLE": "Site",
|
|
"DESCRIPTION": "Criar um widget de chat ao vivo"
|
|
},
|
|
"FACEBOOK": {
|
|
"TITLE": "Facebook",
|
|
"DESCRIPTION": "Conectar sua página do Facebook"
|
|
},
|
|
"WHATSAPP": {
|
|
"TITLE": "WhatsApp",
|
|
"DESCRIPTION": "Atenda seus clientes no WhatsApp"
|
|
},
|
|
"EMAIL": {
|
|
"TITLE": "e-mail",
|
|
"DESCRIPTION": "Conectar com Gmail, Outlook ou outros provedores"
|
|
},
|
|
"SMS": {
|
|
"TITLE": "SMS",
|
|
"DESCRIPTION": "Integrar o canal SMS com Twilio ou Bandwidth"
|
|
},
|
|
"API": {
|
|
"TITLE": "API",
|
|
"DESCRIPTION": "Crie um canal personalizado usando nossa API"
|
|
},
|
|
"TELEGRAM": {
|
|
"TITLE": "Telegram",
|
|
"DESCRIPTION": "Configure o canal do Telegram usando o token do bot"
|
|
},
|
|
"LINE": {
|
|
"TITLE": "Line",
|
|
"DESCRIPTION": "Integre seu canal do LINE"
|
|
},
|
|
"INSTAGRAM": {
|
|
"TITLE": "Instagram",
|
|
"DESCRIPTION": "Conecte sua conta do Instagram"
|
|
},
|
|
"VOICE": {
|
|
"TITLE": "Voz",
|
|
"DESCRIPTION": "Integre com o Twilio Voice"
|
|
}
|
|
}
|
|
},
|
|
"AGENTS": {
|
|
"TITLE": "Agentes",
|
|
"DESC": "Aqui você pode adicionar agentes para gerenciar sua caixa de entrada recém-criada. Somente esses agentes selecionados terão acesso à sua caixa de entrada. Os agentes que não fazem parte desta caixa de entrada não poderão ver ou responder a mensagens nessa caixa de entrada quando fizerem login. <br> <b> PS: </b> Como administrador, se você precisar acessar todas as caixas de entrada, adicione-se como agente a todas as caixas de entrada criadas.",
|
|
"VALIDATION_ERROR": "Adicione pelo menos um agente à sua nova caixa de entrada",
|
|
"PICK_AGENTS": "Escolha agentes para a caixa de entrada"
|
|
},
|
|
"DETAILS": {
|
|
"TITLE": "Detalhes da Caixa de Entrada",
|
|
"DESC": "No menu abaixo, selecione a Página do Facebook que você deseja se conectar ao Chatwoot. Você também pode dar um nome personalizado para sua caixa de entrada para uma melhor identificação."
|
|
},
|
|
"FINISH": {
|
|
"TITLE": "Tudo funcionando. Deu certo!",
|
|
"DESC": "Você concluiu a integração da sua página do Facebook com o Chatwoot. Na próxima vez que um cliente enviar uma mensagem para sua página, a conversa aparecerá automaticamente na sua caixa de entrada. <br> Também estamos fornecendo um script de widget que você pode adicionar facilmente ao seu site. Assim que estiver disponível no seu site, os clientes poderão enviar mensagens diretamente do seu site, sem a ajuda de nenhuma ferramenta externa, e a conversa aparecerá aqui, no Chatwoot. Legal, hein? Com certeza estamos tentamos ser :)"
|
|
},
|
|
"EMAIL_PROVIDER": {
|
|
"TITLE": "Selecione seu provedor de e-mail",
|
|
"DESCRIPTION": "Selecione um provedor de e-mail da lista abaixo. Se você não ver seu provedor de e-mail na lista, você pode selecionar a outra opção de provedor e fornecer as credenciais IMAP e SMTP."
|
|
},
|
|
"MICROSOFT": {
|
|
"TITLE": "Microsoft Email",
|
|
"DESCRIPTION": "Clique no botão Entrar com a Microsoft para começar. Você será redirecionado para o login do e-mail. Após aceitar as permissões solicitadas, você será redirecionado de volta para a etapa de criação da caixa de entrada.",
|
|
"EMAIL_PLACEHOLDER": "Digite o endereço de e-mail",
|
|
"SIGN_IN": "Entre com uma conta Microsoft",
|
|
"ERROR_MESSAGE": "Ocorreu um erro ao conectar com a Microsoft, por favor, tente novamente"
|
|
},
|
|
"GOOGLE": {
|
|
"TITLE": "E-mail do Google",
|
|
"DESCRIPTION": "Clique no botão Entrar com o Google para começar. Você será redirecionado para o login do e-mail. Depois que você aceitar as permissões solicitadas, você será redirecionado de volta para a etapa de criação da caixa de entrada.",
|
|
"SIGN_IN": "Entrar com o Google",
|
|
"EMAIL_PLACEHOLDER": "Digite o endereço de e-mail",
|
|
"ERROR_MESSAGE": "Houve um erro ao conectar com o Google, por favor, tente novamente"
|
|
}
|
|
},
|
|
"DETAILS": {
|
|
"LOADING_FB": "Autenticando você com o Facebook...",
|
|
"ERROR_FB_LOADING": "Erro ao carregar o SDK do Facebook. Por favor, desative qualquer bloqueador de anúncios e tente novamente de um navegador diferente.",
|
|
"ERROR_FB_AUTH": "Algo deu errado, por favor, atualize a página...",
|
|
"ERROR_FB_UNAUTHORIZED": "Você não está autorizado a realizar esta ação. ",
|
|
"ERROR_FB_UNAUTHORIZED_HELP": "A tradução é:\n\nPor favor, certifique-se de que você tem acesso à página do Facebook com controle total. Você pode ler mais sobre as funções do Facebook <a href=\" https://www.facebook.com/help/187316341316631\">aqui</a>.",
|
|
"CREATING_CHANNEL": "Criando sua caixa de entrada...",
|
|
"TITLE": "Configurar detalhes da Caixa de Entrada",
|
|
"DESC": ""
|
|
},
|
|
"AGENTS": {
|
|
"BUTTON_TEXT": "Adicionar agentes",
|
|
"ADD_AGENTS": "Adicionando agentes à sua caixa de entrada..."
|
|
},
|
|
"FINISH": {
|
|
"TITLE": "Sua caixa de entrada está pronta!",
|
|
"MESSAGE": "Agora você ja pode oferecer uma excelente experiência no atendimento de seus clientes através do seu novo Canal",
|
|
"BUTTON_TEXT": "Leva-me lá",
|
|
"MORE_SETTINGS": "Mais configurações",
|
|
"WEBSITE_SUCCESS": "Você concluiu a criação de um canal de site. Copie o código mostrado abaixo e cole-o no seu site. Na próxima vez que um cliente usar o bate-papo ao vivo, a conversa aparecerá automaticamente na sua caixa de entrada.",
|
|
"WHATSAPP_QR_INSTRUCTION": "Escaneie o código QR acima para testar rapidamente sua caixa de entrada do WhatsApp",
|
|
"MESSENGER_QR_INSTRUCTION": "Escaneie o código QR acima para testar rapidamente sua caixa de entrada do Facebook Messenger",
|
|
"TELEGRAM_QR_INSTRUCTION": "Escaneie o código QR acima para testar rapidamente sua caixa de entrada do Telegram"
|
|
},
|
|
"REAUTH": "Reautorizar",
|
|
"VIEW": "Visualizar",
|
|
"EDIT": {
|
|
"API": {
|
|
"SUCCESS_MESSAGE": "Configurações de caixa de entrada atualizadas com sucesso",
|
|
"AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Agente atualizado com sucesso",
|
|
"ERROR_MESSAGE": "Não foi possível atualizar as configurações da caixa de entrada. Por favor, tente novamente mais tarde."
|
|
},
|
|
"EMAIL_COLLECT_BOX": {
|
|
"ENABLED": "Ativado",
|
|
"DISABLED": "Desativado"
|
|
},
|
|
"ENABLE_CSAT": {
|
|
"ENABLED": "Ativado",
|
|
"DISABLED": "Desativado"
|
|
},
|
|
"SENDER_NAME_SECTION": {
|
|
"TITLE": "Nome do remetente",
|
|
"SUB_TEXT": "Selecione o nome mostrado ao seu cliente quando ele recebe e-mails dos seus agentes.",
|
|
"FOR_EG": "Por ex:",
|
|
"FRIENDLY": {
|
|
"TITLE": "Amigável",
|
|
"FROM": "de",
|
|
"SUBTITLE": "Adicione o nome do agente que enviou a resposta ao nome do remetente para torná-la amigável."
|
|
},
|
|
"PROFESSIONAL": {
|
|
"TITLE": "Profissional",
|
|
"SUBTITLE": "Utilize apenas o nome da empresa configurada como nome do remetente no cabeçalho do e-mail."
|
|
},
|
|
"BUSINESS_NAME": {
|
|
"BUTTON_TEXT": "Configure o nome da sua empresa",
|
|
"PLACEHOLDER": "Insira o nome de sua empresa",
|
|
"SAVE_BUTTON_TEXT": "Salvar"
|
|
}
|
|
},
|
|
"ALLOW_MESSAGES_AFTER_RESOLVED": {
|
|
"ENABLED": "Ativado",
|
|
"DISABLED": "Desativado"
|
|
},
|
|
"ENABLE_CONTINUITY_VIA_EMAIL": {
|
|
"ENABLED": "Ativado",
|
|
"DISABLED": "Desativado"
|
|
},
|
|
"LOCK_TO_SINGLE_CONVERSATION": {
|
|
"ENABLED": "Ativado",
|
|
"DISABLED": "Desativado"
|
|
},
|
|
"ENABLE_HMAC": {
|
|
"LABEL": "Ativar"
|
|
}
|
|
},
|
|
"DELETE": {
|
|
"BUTTON_TEXT": "Excluir",
|
|
"AVATAR_DELETE_BUTTON_TEXT": "Apagar Avatar",
|
|
"CONFIRM": {
|
|
"TITLE": "Confirmar exclusão",
|
|
"MESSAGE": "Você tem certeza que deseja excluir ",
|
|
"PLACE_HOLDER": "Digite {inboxName} para confirmar",
|
|
"YES": "Sim, excluir ",
|
|
"NO": "Não, Mantenha "
|
|
},
|
|
"API": {
|
|
"SUCCESS_MESSAGE": "Agente excluído com sucesso",
|
|
"ERROR_MESSAGE": "Não foi possível excluir a caixa de entrada. Tente novamente mais tarde.",
|
|
"AVATAR_SUCCESS_MESSAGE": "Perfil da caixa de entrada excluído com sucesso",
|
|
"AVATAR_ERROR_MESSAGE": "Não foi possível excluir o perfil da caixa de entrada. Por favor, tente novamente mais tarde."
|
|
}
|
|
},
|
|
"TABS": {
|
|
"SETTINGS": "Configurações",
|
|
"COLLABORATORS": "Agentes",
|
|
"CONFIGURATION": "Configuração",
|
|
"CAMPAIGN": "Campanhas",
|
|
"PRE_CHAT_FORM": "Formulário Chat Pré",
|
|
"BUSINESS_HOURS": "Horário de funcionamento",
|
|
"WIDGET_BUILDER": "Construtor de Widget",
|
|
"BOT_CONFIGURATION": "Configuração do Bot",
|
|
"ACCOUNT_HEALTH": "Saúde da conta",
|
|
"CSAT": "CSAT"
|
|
},
|
|
"ACCOUNT_HEALTH": {
|
|
"TITLE": "Gerencie sua conta do WhatsApp",
|
|
"DESCRIPTION": "Revise o status da sua conta do WhatsApp, os limites de mensagens e a qualidade. Atualize as configurações ou resolva problemas, se necessário",
|
|
"GO_TO_SETTINGS": "Ir para o Meta Business Manager",
|
|
"NO_DATA": "Dados de saúde não estão disponíveis",
|
|
"FIELDS": {
|
|
"DISPLAY_PHONE_NUMBER": {
|
|
"LABEL": "Número de telefone exibido",
|
|
"TOOLTIP": "Número de telefone exibido aos clientes"
|
|
},
|
|
"VERIFIED_NAME": {
|
|
"LABEL": "Nome da empresa",
|
|
"TOOLTIP": "Nome da empresa verificado pelo WhatsApp"
|
|
},
|
|
"DISPLAY_NAME_STATUS": {
|
|
"LABEL": "Status do nome de exibição",
|
|
"TOOLTIP": "Status da verificação do nome da sua empresa"
|
|
},
|
|
"QUALITY_RATING": {
|
|
"LABEL": "Classificação de qualidade",
|
|
"TOOLTIP": "Classificação de qualidade do WhatsApp para sua conta"
|
|
},
|
|
"MESSAGING_LIMIT_TIER": {
|
|
"LABEL": "Nível de limite de mensagens",
|
|
"TOOLTIP": "Limite diário de mensagens da sua conta"
|
|
},
|
|
"ACCOUNT_MODE": {
|
|
"LABEL": "Modo da conta",
|
|
"TOOLTIP": "Modo de operação atual da sua conta do WhatsApp"
|
|
}
|
|
},
|
|
"VALUES": {
|
|
"TIERS": {
|
|
"TIER_250": "250 clientes por 24 h",
|
|
"TIER_1000": "1 mil clientes por 24 h",
|
|
"TIER_1K": "1 mil clientes por 24 h",
|
|
"TIER_10K": "10K clientes a cada 24h",
|
|
"TIER_100K": "100K clientes a cada 24h",
|
|
"TIER_UNLIMITED": "Clientes ilimitados a cada 24h",
|
|
"UNKNOWN": "Classificação não disponível"
|
|
},
|
|
"STATUSES": {
|
|
"APPROVED": "Aceito",
|
|
"PENDING_REVIEW": "Revisão pendente",
|
|
"AVAILABLE_WITHOUT_REVIEW": "Disponível sem revisão",
|
|
"REJECTED": "Rejeitado",
|
|
"DECLINED": "Sandbox",
|
|
"NON_EXISTS": "Não existe"
|
|
},
|
|
"MODES": {
|
|
"SANDBOX": "Sandbox",
|
|
"LIVE": "Em tempo real"
|
|
}
|
|
}
|
|
},
|
|
"SETTINGS": "Configurações",
|
|
"FEATURES": {
|
|
"LABEL": "Funcionalidades",
|
|
"DISPLAY_FILE_PICKER": "Exibir seletor de arquivos no widget",
|
|
"DISPLAY_EMOJI_PICKER": "Exibir seletor de emoji no widget",
|
|
"ALLOW_END_CONVERSATION": "Permitir que usuários terminem a conversa a partir do widget",
|
|
"USE_INBOX_AVATAR_FOR_BOT": "Use o nome da caixa de entrada e avatar do bot"
|
|
},
|
|
"SETTINGS_POPUP": {
|
|
"MESSENGER_HEADING": "Código Menssageiro <scripit>",
|
|
"MESSENGER_SUB_HEAD": "Favor, insira essse código <script> dentro da tag Body de sua página html",
|
|
"ALLOWED_DOMAINS": {
|
|
"TITLE": "Domínios permitidos",
|
|
"SUBTITLE": "Adicione coringa ou domínios separados por vírgula (deixe em branco para permitir todos), ex: *.chatwoot.dev, chatwoot.com.",
|
|
"PLACEHOLDER": "Insira domínios separados por vírgula (ex: *.chatwoot.dev, chatwoot.com)"
|
|
},
|
|
"INBOX_AGENTS": "Agentes",
|
|
"INBOX_AGENTS_SUB_TEXT": "Adicionar ou remover agentes dessa caixa de entrada",
|
|
"AGENT_ASSIGNMENT": "Atribuição de conversa",
|
|
"AGENT_ASSIGNMENT_SUB_TEXT": "Atualizar configurações de atribuição de conversa",
|
|
"UPDATE": "Atualizar",
|
|
"ENABLE_EMAIL_COLLECT_BOX": "Ativar caixa de coleta de e-mail",
|
|
"ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Ativar ou desativar caixa de coleta de e-mails em novas conversas",
|
|
"AUTO_ASSIGNMENT": "Habilitar atribuição automática",
|
|
"SENDER_NAME_SECTION": "Habilitar o Nome do Agente no E-mail",
|
|
"SENDER_NAME_SECTION_TEXT": "Ativar/Desativar exibição do nome do agente no e-mail, se estiver desativado, exibirá o nome da empresa",
|
|
"ENABLE_CONTINUITY_VIA_EMAIL": "Habilitar continuidade das conversas por e-mail",
|
|
"ENABLE_CONTINUITY_VIA_EMAIL_SUB_TEXT": "As conversas continuarão sobre o e-mail se o endereço de e-mail de contato estiver disponível.",
|
|
"LOCK_TO_SINGLE_CONVERSATION": "Bloquear para conversa única",
|
|
"LOCK_TO_SINGLE_CONVERSATION_SUB_TEXT": "Ativar ou desativar várias conversas para o mesmo contato nesta caixa de entrada",
|
|
"INBOX_UPDATE_TITLE": "Configurações da Caixa de Entrada",
|
|
"INBOX_UPDATE_SUB_TEXT": "Atualize suas configurações de caixa de entrada",
|
|
"AUTO_ASSIGNMENT_SUB_TEXT": "Ativar ou desativar a atribuição automática de novas conversas aos agentes adicionados a essa caixa de entrada.",
|
|
"HMAC_VERIFICATION": "Validação de Identidade do Usuário",
|
|
"HMAC_DESCRIPTION": "Para validar a identidade do usuário, você pode passar um `identifier_hash` para cada usuário. Você pode gerar um hash HMAC sha256 usando o `identifier` com a chave mostrada aqui.",
|
|
"HMAC_LINK_TO_DOCS": "Você pode ler mais aqui.",
|
|
"HMAC_MANDATORY_VERIFICATION": "Forçar validação de identidade do usuário",
|
|
"HMAC_MANDATORY_DESCRIPTION": "Se ativado, as solicitações sem o 'identifier_hash' serão rejeitadas.",
|
|
"INBOX_IDENTIFIER": "Identificador da caixa de entrada",
|
|
"INBOX_IDENTIFIER_SUB_TEXT": "Use o token 'inbox_identifier' mostrado aqui para autenticar os seus clientes API.",
|
|
"FORWARD_EMAIL_TITLE": "Encaminhar para o E-mail",
|
|
"FORWARD_EMAIL_SUB_TEXT": "Comece a encaminhar seus e-mails para o seguinte endereço de e-mail.",
|
|
"ALLOW_MESSAGES_AFTER_RESOLVED": "Permitir mensagens após a resolução da conversa",
|
|
"ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Permite que os usuários finais enviem mensagens mesmo depois que a conversa for resolvida.",
|
|
"WHATSAPP_SECTION_SUBHEADER": "Esta chave de API é usada para a integração com as APIs do WhatsApp.",
|
|
"WHATSAPP_SECTION_UPDATE_SUBHEADER": "Insira a nova chave API a ser utilizada para integração com as APIs do WhatsApp.",
|
|
"WHATSAPP_SECTION_TITLE": "Chave API",
|
|
"WHATSAPP_SECTION_UPDATE_TITLE": "Atualizar Chave de API",
|
|
"WHATSAPP_SECTION_UPDATE_PLACEHOLDER": "Digite a nova chave de API aqui",
|
|
"WHATSAPP_SECTION_UPDATE_BUTTON": "Atualizar",
|
|
"WHATSAPP_EMBEDDED_SIGNUP_TITLE": "Inscrição incorporada do WhatsApp",
|
|
"WHATSAPP_EMBEDDED_SIGNUP_SUBHEADER": "Esta caixa de entrada está conectada através da inscrição incorporada do WhatsApp.",
|
|
"WHATSAPP_EMBEDDED_SIGNUP_DESCRIPTION": "Você pode reconfigurar esta caixa de entrada para atualizar suas configurações do WhatsApp Business.",
|
|
"WHATSAPP_RECONFIGURE_BUTTON": "Reconfigurar",
|
|
"WHATSAPP_CONNECT_TITLE": "Conectar ao WhatsApp Business",
|
|
"WHATSAPP_CONNECT_SUBHEADER": ".",
|
|
"WHATSAPP_CONNECT_DESCRIPTION": "Conecte esta caixa de entrada ao WhatsApp Business para ter recursos aprimorados e um gerenciamento mais fácil.",
|
|
"WHATSAPP_CONNECT_BUTTON": "Conectar",
|
|
"WHATSAPP_CONNECT_SUCCESS": "Conectado com sucesso ao WhatsApp Business!",
|
|
"WHATSAPP_CONNECT_ERROR": "Não foi possível reconfigurar o WhatsApp Business. Tente novamente.",
|
|
"WHATSAPP_RECONFIGURE_SUCCESS": "WhatsApp Business reconfigurado com sucesso!",
|
|
"WHATSAPP_RECONFIGURE_ERROR": "Não foi possível reconfigurar o WhatsApp Business. Tente novamente.",
|
|
"WHATSAPP_APP_ID_MISSING": "O ID do WhatsApp não está configurado. Por favor, contate o administrador.",
|
|
"WHATSAPP_CONFIG_ID_MISSING": "O ID de Configuração do WhatsApp não está configurado. Por favor, contate o administrador.",
|
|
"WHATSAPP_LOGIN_CANCELLED": "O login do WhatsApp foi cancelado. Por favor, tente novamente.",
|
|
"WHATSAPP_WEBHOOK_TITLE": "Token de verificação Webhook",
|
|
"WHATSAPP_WEBHOOK_SUBHEADER": "Este token é usado para verificar a autenticidade do webhook endpoint.",
|
|
"WHATSAPP_TEMPLATES_SYNC_TITLE": "Sincronizar Modelos",
|
|
"WHATSAPP_TEMPLATES_SYNC_SUBHEADER": "Sincronize manualmente os modelos de mensagens do WhatsApp para atualizar seus modelos disponíveis.",
|
|
"WHATSAPP_TEMPLATES_SYNC_BUTTON": "Sincronizar Modelos",
|
|
"WHATSAPP_TEMPLATES_SYNC_SUCCESS": "Sincronização de modelos iniciada com sucesso. Pode demorar alguns minutos para atualizar.",
|
|
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Atualizar configurações do Formulário Pre Chat",
|
|
"WHATSAPP_MANAGE_PROVIDER_CONNECTION_TITLE": "Gerenciar Conexão do Provedor",
|
|
"WHATSAPP_MANAGE_PROVIDER_CONNECTION_SUBHEADER": "Conecte o seu dispositivo e gerencie a conexão do provedor.",
|
|
"WHATSAPP_MANAGE_PROVIDER_CONNECTION_BUTTON": "Gerenciar conexão",
|
|
"WHATSAPP_PROVIDER_URL_TITLE": "URL do provedor",
|
|
"WHATSAPP_PROVIDER_URL_SUBHEADER": "Se o provedor não estiver rodando localmente, por favor, forneça a URL.",
|
|
"WHATSAPP_PROVIDER_URL_PLACEHOLDER": "Digite a URL do provedor",
|
|
"WHATSAPP_PROVIDER_URL_ERROR": "Por favor, insira uma URL válida",
|
|
"WHATSAPP_MARK_AS_READ_TITLE": "Confirmações de leitura",
|
|
"WHATSAPP_MARK_AS_READ_SUBHEADER": "Se essa opção estiver desativada, ao visualizar uma mensagem pelo Chatwoot, não será enviada uma confirmação de leitura para o remetente. As suas mensagens ainda poderão receber confirmações de leitura.",
|
|
"WHATSAPP_MARK_AS_READ_LABEL": "Enviar confirmações de leitura",
|
|
"WHATSAPP_INSTANCE_ID_TITLE": "ID da Instância",
|
|
"WHATSAPP_INSTANCE_ID_SUBHEADER": "Seu ID da Instância Z-API.",
|
|
"WHATSAPP_INSTANCE_ID_UPDATE_TITLE": "Atualizar ID da Instância",
|
|
"WHATSAPP_INSTANCE_ID_UPDATE_SUBHEADER": "Digite o novo ID da Instância aqui",
|
|
"WHATSAPP_TOKEN_TITLE": "Token",
|
|
"WHATSAPP_TOKEN_SUBHEADER": "Seu Token da Instância Z-API.",
|
|
"WHATSAPP_TOKEN_UPDATE_TITLE": "Atualizar Token",
|
|
"WHATSAPP_TOKEN_UPDATE_SUBHEADER": "Digite o novo Token aqui",
|
|
"WHATSAPP_CLIENT_TOKEN_TITLE": "Token de Segurança",
|
|
"WHATSAPP_CLIENT_TOKEN_SUBHEADER": "Seu Token de Segurança Z-API (veja a aba Segurança no painel do Z-API).",
|
|
"WHATSAPP_CLIENT_TOKEN_UPDATE_TITLE": "Atualizar Token de Segurança",
|
|
"WHATSAPP_CLIENT_TOKEN_UPDATE_SUBHEADER": "Digite o novo Token de Segurança aqui"
|
|
},
|
|
"HELP_CENTER": {
|
|
"LABEL": "Centro de Ajuda",
|
|
"PLACEHOLDER": "Selecionar Centro de Ajuda",
|
|
"SELECT_PLACEHOLDER": "Selecionar Centro de Ajuda",
|
|
"REMOVE": "Remover Centro de Ajuda",
|
|
"SUB_TEXT": "Anexe um Centro de Ajuda com a caixa de entrada"
|
|
},
|
|
"AUTO_ASSIGNMENT": {
|
|
"MAX_ASSIGNMENT_LIMIT": "Limite de atribuição automática",
|
|
"MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Por favor, insira um valor maior que 0",
|
|
"MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limitar o número máximo de conversas desta caixa de entrada que pode ser atribuído automaticamente a um agente"
|
|
},
|
|
"FACEBOOK_REAUTHORIZE": {
|
|
"TITLE": "Reautorizar",
|
|
"SUBTITLE": "Sua conexão com o Facebook expirou, reconecte sua página do Facebook para continuar",
|
|
"MESSAGE_SUCCESS": "Reconexão bem sucedida",
|
|
"MESSAGE_ERROR": "Ocorreu um erro, por favor tente novamente"
|
|
},
|
|
"PRE_CHAT_FORM": {
|
|
"DESCRIPTION": "Formulários de bate-papo permitem que você capture informações de usuário antes de iniciar uma conversa com você.",
|
|
"SET_FIELDS": "Campos do formulário Pré Chat",
|
|
"SET_FIELDS_HEADER": {
|
|
"FIELDS": "Campos",
|
|
"LABEL": "Nome do campo",
|
|
"PLACE_HOLDER": "Valor de exemplo",
|
|
"KEY": "Chave",
|
|
"TYPE": "Tipo",
|
|
"REQUIRED": "Obrigatório"
|
|
},
|
|
"ENABLE": {
|
|
"LABEL": "Ativar formulário de bate-papo antes",
|
|
"OPTIONS": {
|
|
"ENABLED": "Sim",
|
|
"DISABLED": "Não"
|
|
}
|
|
},
|
|
"PRE_CHAT_MESSAGE": {
|
|
"LABEL": "Mensagem pré chat",
|
|
"PLACEHOLDER": "Esta mensagem será visível para os usuários junto com o formulário"
|
|
},
|
|
"REQUIRE_EMAIL": {
|
|
"LABEL": "Os visitantes devem fornecer seu nome e endereço de e-mail antes de iniciar o bate-papo"
|
|
}
|
|
},
|
|
"CSAT": {
|
|
"TITLE": "Habilitar CSAT",
|
|
"SUBTITLE": "Iniciar automaticamente pesquisas de CSAT no final das conversas para entender como os clientes se sentem em relação à sua experiência de suporte. Acompanhe as tendências de satisfação e identifique áreas para melhoria ao longo do tempo.",
|
|
"DISPLAY_TYPE": {
|
|
"LABEL": "Tipo de exibição"
|
|
},
|
|
"MESSAGE": {
|
|
"LABEL": "Mensagem",
|
|
"PLACEHOLDER": "Digite uma mensagem para mostrar aos usuários com o formulário"
|
|
},
|
|
"SURVEY_RULE": {
|
|
"LABEL": "Regra de pesquisa",
|
|
"DESCRIPTION_PREFIX": "Enviar a pesquisa se a conversa",
|
|
"DESCRIPTION_SUFFIX": "qualquer uma das etiquetas",
|
|
"OPERATOR": {
|
|
"CONTAINS": "contém",
|
|
"DOES_NOT_CONTAINS": "não contém"
|
|
},
|
|
"SELECT_PLACEHOLDER": "selecionar etiquetas"
|
|
},
|
|
"NOTE": "Nota: pesquisas de CSAT são enviadas apenas uma vez por conversa",
|
|
"API": {
|
|
"SUCCESS_MESSAGE": "Configurações de CSAT atualizadas com sucesso",
|
|
"ERROR_MESSAGE": "Não foi possível atualizar as configurações do CSAT. Por favor, tente novamente mais tarde."
|
|
}
|
|
},
|
|
"BUSINESS_HOURS": {
|
|
"TITLE": "Definir a sua disponibilidade",
|
|
"SUBTITLE": "Defina a sua disponibilidade no widget livechat",
|
|
"WEEKLY_TITLE": "Definir horas semanais",
|
|
"TIMEZONE_LABEL": "Selecionar fuso horário",
|
|
"UPDATE": "Atualizar configurações do horário comercial",
|
|
"TOGGLE_AVAILABILITY": "Permitir a disponibilidade de negócios para essa caixa de entrada",
|
|
"UNAVAILABLE_MESSAGE_LABEL": "Mensagem indisponível para visitantes",
|
|
"TOGGLE_HELP": "Permitir a disponibilidade de negócios mostrará as horas disponíveis no widget de bate-papo ao vivo, mesmo que todos os agentes estejam offline. Os vistores disponíveis horários externos podem ser avisados com uma mensagem e um formulário de pré-bate-papo.",
|
|
"DAY": {
|
|
"ENABLE": "Permitir a disponibilidade para este dia",
|
|
"UNAVAILABLE": "Indisponível",
|
|
"HOURS": "horas",
|
|
"VALIDATION_ERROR": "Hora inicial deve ser antes de hora de fechamento.",
|
|
"CHOOSE": "Selecione"
|
|
},
|
|
"ALL_DAY": "O dia todo"
|
|
},
|
|
"IMAP": {
|
|
"TITLE": "IMAP",
|
|
"SUBTITLE": "Defina seus dados IMAP",
|
|
"NOTE_TEXT": "Para habilitar o SMTP, por favor configure o IMAP.",
|
|
"UPDATE": "Atualizar configurações do IMAP",
|
|
"TOGGLE_AVAILABILITY": "Habilitar a configuração IMAP para esta caixa de entrada",
|
|
"TOGGLE_HELP": "Ativar o IMAP ajudará o usuário a receber e-mails",
|
|
"EDIT": {
|
|
"SUCCESS_MESSAGE": "Configurações IMAP atualizadas com sucesso",
|
|
"ERROR_MESSAGE": "Não é possível atualizar as configurações IMAP"
|
|
},
|
|
"ADDRESS": {
|
|
"LABEL": "Endereço",
|
|
"PLACE_HOLDER": "Endereço (Eg: imap.gmail.com)"
|
|
},
|
|
"PORT": {
|
|
"LABEL": "Porta",
|
|
"PLACE_HOLDER": "Porta"
|
|
},
|
|
"LOGIN": {
|
|
"LABEL": "Entrar",
|
|
"PLACE_HOLDER": "Entrar"
|
|
},
|
|
"PASSWORD": {
|
|
"LABEL": "Senha",
|
|
"PLACE_HOLDER": "Senha"
|
|
},
|
|
"ENABLE_SSL": "Habilitar o SSL"
|
|
},
|
|
"MICROSOFT": {
|
|
"TITLE": "Microsoft",
|
|
"SUBTITLE": "Autorize novamente sua conta MICROSOFT"
|
|
},
|
|
"SMTP": {
|
|
"TITLE": "SMTP",
|
|
"SUBTITLE": "Defina seus detalhes do SMTP",
|
|
"UPDATE": "Atualizar configurações de SMTP",
|
|
"TOGGLE_AVAILABILITY": "Ativar a configuração SMTP para esta caixa de entrada",
|
|
"TOGGLE_HELP": "Habilitar o SMTP ajudará o usuário a enviar e-mail",
|
|
"EDIT": {
|
|
"SUCCESS_MESSAGE": "Configurações de SMTP atualizadas com sucesso",
|
|
"ERROR_MESSAGE": "Não é possível atualizar as configurações de SMTP"
|
|
},
|
|
"ADDRESS": {
|
|
"LABEL": "Endereço",
|
|
"PLACE_HOLDER": "Endereço (Eg: smtp.gmail.com)"
|
|
},
|
|
"PORT": {
|
|
"LABEL": "Porta",
|
|
"PLACE_HOLDER": "Porta"
|
|
},
|
|
"LOGIN": {
|
|
"LABEL": "Entrar",
|
|
"PLACE_HOLDER": "Entrar"
|
|
},
|
|
"PASSWORD": {
|
|
"LABEL": "Senha",
|
|
"PLACE_HOLDER": "Senha"
|
|
},
|
|
"DOMAIN": {
|
|
"LABEL": "Domínio",
|
|
"PLACE_HOLDER": "Domínio"
|
|
},
|
|
"ENCRYPTION": "Criptografia",
|
|
"SSL_TLS": "SSL/TLS",
|
|
"START_TLS": "STARTTLS",
|
|
"OPEN_SSL_VERIFY_MODE": "Abrir modo de verificação SSL",
|
|
"AUTH_MECHANISM": "Autenticação"
|
|
},
|
|
"NOTE": "Nota: ",
|
|
"WIDGET_BUILDER": {
|
|
"WIDGET_OPTIONS": {
|
|
"AVATAR": {
|
|
"LABEL": "Avatar do site",
|
|
"DELETE": {
|
|
"API": {
|
|
"SUCCESS_MESSAGE": "Avatar excluído com sucesso",
|
|
"ERROR_MESSAGE": "Ocorreu um erro, por favor tente novamente"
|
|
}
|
|
}
|
|
},
|
|
"WEBSITE_NAME": {
|
|
"LABEL": "Nome do site",
|
|
"PLACE_HOLDER": "Informe o nome do seu site (por exemplo: Acme Inc)",
|
|
"ERROR": "Por favor, insira um nome válido para o website"
|
|
},
|
|
"WELCOME_HEADING": {
|
|
"LABEL": "Seja bem-vindo",
|
|
"PLACE_HOLDER": "Olá!"
|
|
},
|
|
"WELCOME_TAGLINE": {
|
|
"LABEL": "Bem-vindo, saudação",
|
|
"PLACE_HOLDER": "Nós tornamos simples a conexão conosco. Pergunte qualquer assunto ou compartilhe seus comentários."
|
|
},
|
|
"REPLY_TIME": {
|
|
"LABEL": "Tempo de Resposta",
|
|
"IN_A_FEW_MINUTES": "Em alguns minutos",
|
|
"IN_A_FEW_HOURS": "Em algumas horas",
|
|
"IN_A_DAY": "Em um dia"
|
|
},
|
|
"WIDGET_COLOR_LABEL": "Cor do Widget",
|
|
"WIDGET_BUBBLE_POSITION_LABEL": "Posição do Balão do Widget",
|
|
"WIDGET_BUBBLE_TYPE_LABEL": "Tipo de Balão do Widget",
|
|
"WIDGET_BUBBLE_LAUNCHER_TITLE": {
|
|
"DEFAULT": "Fale conosco no chat",
|
|
"LABEL": "Título do disparador da Bolha do Widget",
|
|
"PLACE_HOLDER": "Fale conosco no chat"
|
|
},
|
|
"UPDATE": {
|
|
"BUTTON_TEXT": "Atualizar Configurações do Widget",
|
|
"API": {
|
|
"SUCCESS_MESSAGE": "Configurações do widget atualizadas com sucesso",
|
|
"ERROR_MESSAGE": "Não é possível atualizar as configurações do widget"
|
|
}
|
|
},
|
|
"WIDGET_VIEW_OPTION": {
|
|
"PREVIEW": "Pré-visualizar",
|
|
"SCRIPT": "Script"
|
|
},
|
|
"WIDGET_BUBBLE_POSITION": {
|
|
"LEFT": "Esquerda",
|
|
"RIGHT": "Direita"
|
|
},
|
|
"WIDGET_BUBBLE_TYPE": {
|
|
"STANDARD": "Padrão",
|
|
"EXPANDED_BUBBLE": "Balão Expandido"
|
|
}
|
|
},
|
|
"WIDGET_SCREEN": {
|
|
"DEFAULT": "Padrão",
|
|
"CHAT": "Chat"
|
|
},
|
|
"REPLY_TIME": {
|
|
"IN_A_FEW_MINUTES": "Normalmente responde em alguns minutos",
|
|
"IN_A_FEW_HOURS": "Normalmente responde em algumas horas",
|
|
"IN_A_DAY": "Normalmente responde em um dia"
|
|
},
|
|
"FOOTER": {
|
|
"START_CONVERSATION_BUTTON_TEXT": "Iniciar Conversa",
|
|
"CHAT_INPUT_PLACEHOLDER": "Digite sua mensagem"
|
|
},
|
|
"BODY": {
|
|
"TEAM_AVAILABILITY": {
|
|
"ONLINE": "Estamos On-line",
|
|
"OFFLINE": "Estamos ausentes no momento"
|
|
},
|
|
"USER_MESSAGE": "Oi",
|
|
"AGENT_MESSAGE": "Olá"
|
|
},
|
|
"BRANDING_TEXT": "Desenvolvido por Chatwoot",
|
|
"SCRIPT_SETTINGS": "\n window.chatwootSettings = {options};"
|
|
},
|
|
"EMAIL_PROVIDERS": {
|
|
"MICROSOFT": {
|
|
"TITLE": "Microsoft",
|
|
"DESCRIPTION": "Conectar com Microsoft"
|
|
},
|
|
"GOOGLE": {
|
|
"TITLE": "Google",
|
|
"DESCRIPTION": "Conectar com Google"
|
|
},
|
|
"OTHER_PROVIDERS": {
|
|
"TITLE": "Outros Provedores",
|
|
"DESCRIPTION": "Conectar com outros provedores"
|
|
}
|
|
},
|
|
"CHANNELS": {
|
|
"MESSENGER": "Messenger",
|
|
"WEB_WIDGET": "Site",
|
|
"TWITTER_PROFILE": "Twitter",
|
|
"TWILIO_SMS": "SMS Twilio",
|
|
"WHATSAPP": "WhatsApp",
|
|
"WHATSAPP_BAILEYS": "WhatsApp - Baileys",
|
|
"WHATSAPP_ZAPI": "WhatsApp - Z-API",
|
|
"SMS": "SMS",
|
|
"EMAIL": "e-mail",
|
|
"TELEGRAM": "Telegram",
|
|
"LINE": "Line",
|
|
"API": "Canal da API",
|
|
"INSTAGRAM": "Instagram",
|
|
"VOICE": "Voz"
|
|
}
|
|
}
|
|
}
|