Commit Graph
3197 Commits
Author SHA1 Message Date
Captain 70ed790098 New translations conversation.json (Latvian)
[ci skip]
[ci skip]
2026-06-03 02:44:57 -07:00
Captain 6c3e667fac New translations conversation.json (Estonian)
[ci skip]
[ci skip]
2026-06-03 02:44:55 -07:00
Captain 7494baef3c New translations conversation.json (Croatian)
[ci skip]
[ci skip]
2026-06-03 02:44:53 -07:00
Captain f2034c752f New translations conversation.json (Thai)
[ci skip]
[ci skip]
2026-06-03 02:44:51 -07:00
Captain 2d489c1c0a New translations conversation.json (Bengali)
[ci skip]
[ci skip]
2026-06-03 02:44:50 -07:00
Captain 53ede69a73 New translations conversation.json (Tamil)
[ci skip]
[ci skip]
2026-06-03 02:44:48 -07:00
Captain c2e2b320ef New translations conversation.json (Persian)
[ci skip]
[ci skip]
2026-06-03 02:44:46 -07:00
Captain cb05a318a7 New translations conversation.json (Indonesian)
[ci skip]
[ci skip]
2026-06-03 02:44:44 -07:00
Captain fd9beedb68 New translations conversation.json (Portuguese, Brazilian)
[ci skip]
[ci skip]
2026-06-03 02:44:42 -07:00
Captain e2061fb624 New translations conversation.json (Icelandic)
[ci skip]
[ci skip]
2026-06-03 02:44:40 -07:00
Captain ce5803d312 New translations conversation.json (Vietnamese)
[ci skip]
[ci skip]
2026-06-03 02:44:39 -07:00
Captain cba2647b5e New translations conversation.json (Urdu (Pakistan))
[ci skip]
[ci skip]
2026-06-03 02:44:37 -07:00
Captain c3e438b365 New translations conversation.json (Chinese Traditional)
[ci skip]
[ci skip]
2026-06-03 02:44:35 -07:00
Captain a48fea0a7f New translations conversation.json (Chinese Simplified)
[ci skip]
[ci skip]
2026-06-03 02:44:33 -07:00
Captain 80daea6054 New translations conversation.json (Ukrainian)
[ci skip]
[ci skip]
2026-06-03 02:44:32 -07:00
Captain cd93459320 New translations conversation.json (Turkish)
[ci skip]
[ci skip]
2026-06-03 02:44:30 -07:00
Captain 9801137296 New translations conversation.json (Swedish)
[ci skip]
[ci skip]
2026-06-03 02:44:28 -07:00
Captain d4890a6e52 New translations conversation.json (Albanian)
[ci skip]
[ci skip]
2026-06-03 02:44:27 -07:00
Captain 79c8df7c4f New translations conversation.json (Slovenian)
[ci skip]
[ci skip]
2026-06-03 02:44:25 -07:00
Captain e204ed95ce New translations conversation.json (Slovak)
[ci skip]
[ci skip]
2026-06-03 02:44:23 -07:00
Captain 34a3da97b2 New translations conversation.json (Russian)
[ci skip]
[ci skip]
2026-06-03 02:44:21 -07:00
Captain 5da34f916e New translations conversation.json (Portuguese)
[ci skip]
[ci skip]
2026-06-03 02:44:19 -07:00
Captain 4a31dd2120 New translations conversation.json (Polish)
[ci skip]
[ci skip]
2026-06-03 02:44:17 -07:00
Captain 6ca32faeab New translations conversation.json (Norwegian)
[ci skip]
[ci skip]
2026-06-03 02:44:15 -07:00
Captain 186d8c9462 New translations conversation.json (Dutch)
[ci skip]
[ci skip]
2026-06-03 02:44:14 -07:00
Captain 50a46d123a New translations conversation.json (Lithuanian)
[ci skip]
[ci skip]
2026-06-03 02:44:12 -07:00
Captain ec5dee5c46 New translations conversation.json (Korean)
[ci skip]
[ci skip]
2026-06-03 02:44:10 -07:00
Captain 93cc1f339a New translations conversation.json (Georgian)
[ci skip]
[ci skip]
2026-06-03 02:44:08 -07:00
Captain 3468ca48c3 New translations conversation.json (Japanese)
[ci skip]
[ci skip]
2026-06-03 02:44:06 -07:00
Captain 47e2e4371f New translations conversation.json (Italian)
[ci skip]
[ci skip]
2026-06-03 02:44:04 -07:00
Captain 9f3d2d545b New translations conversation.json (Armenian)
[ci skip]
[ci skip]
2026-06-03 02:44:01 -07:00
Captain 4e04fd3d08 New translations conversation.json (Hungarian)
[ci skip]
[ci skip]
2026-06-03 02:44:00 -07:00
Captain e064899267 New translations conversation.json (Hebrew)
[ci skip]
[ci skip]
2026-06-03 02:43:58 -07:00
Captain 3594ce9bb5 New translations conversation.json (Finnish)
[ci skip]
[ci skip]
2026-06-03 02:43:56 -07:00
Captain 03777d7cc1 New translations conversation.json (Greek)
[ci skip]
[ci skip]
2026-06-03 02:43:54 -07:00
Captain e3e238bce8 New translations conversation.json (German)
[ci skip]
[ci skip]
2026-06-03 02:43:52 -07:00
Captain e0e8a70720 New translations conversation.json (Danish)
[ci skip]
[ci skip]
2026-06-03 02:43:50 -07:00
Captain e2d1ce7554 New translations conversation.json (Czech)
[ci skip]
[ci skip]
2026-06-03 02:43:48 -07:00
Captain 1dd5eb64cf New translations conversation.json (Catalan)
[ci skip]
[ci skip]
2026-06-03 02:43:46 -07:00
Captain 0c6d2cc0b7 New translations conversation.json (Bulgarian)
[ci skip]
[ci skip]
2026-06-03 02:43:45 -07:00
Captain b6ff4f54be New translations conversation.json (Arabic)
[ci skip]
[ci skip]
2026-06-03 02:43:43 -07:00
Captain 07c92c6097 New translations conversation.json (Spanish)
[ci skip]
[ci skip]
2026-06-03 02:43:41 -07:00
Captain cafa486c18 New translations conversation.json (French)
[ci skip]
[ci skip]
2026-06-03 02:43:40 -07:00
Captain baea194f6b New translations conversation.json (Romanian)
[ci skip]
[ci skip]
2026-06-03 02:43:38 -07:00
Captain 23cad33d96 New translations conversation.json (Portuguese, Brazilian)
[ci skip]
[ci skip]
2026-06-02 11:13:36 -07:00
0a181b0cea chore: Update translations (#14498)
Updates dashboard, widget, and backend locale files with the latest
translation sync from Crowdin.

## Closes

N/A

## What changed

- Refreshes translated dashboard JSON locale files across supported
languages.
- Adds the latest backend Help Center/public portal locale strings.
- Keeps the branch current with `develop` and resolves the `ar`, `fr`,
and `pt_BR` locale conflicts.

## Validation

- Parsed all changed JSON and YAML locale files successfully.
- Checked for leftover merge conflict markers.
- Ran `git diff --check`.

---------

Co-authored-by: Sojan Jose <sojan@pepalo.com>
2026-06-02 21:21:50 +05:30
Sony MathewandGitHub 87df43bdd0 revert: restore conversation unread count feature flag (#14623)
This reverts #14610 so conversation unread counts are again controlled
by the `conversation_unread_counts` feature flag across the API,
ActionCable broadcasts, notifier/listener paths, and dashboard sidebar
fetching.

## Closes
- None

## What changed
- Restores feature-flag checks for conversation unread count reads and
broadcasts.
- Restores the dashboard feature flag constant and sidebar/store
behavior for disabled unread counts.
- Restores the specs that cover disabled-feature behavior.

## How to test
- In an account with `conversation_unread_counts` enabled, verify
sidebar unread counts are fetched and updated in real time.
- Disable `conversation_unread_counts` for the account and verify unread
count requests/broadcasts are skipped.
2026-06-02 21:11:48 +05:30
28f87d2fca fix(widget): translate zh_CN availability keys (#14288)
Translate missing Simplified Chinese live-chat widget availability and
reply-time strings so visitors using `zh_CN` no longer see English
fallbacks in offline and pre-chat states.

## Closes

N/A

## How to test

- Open the widget with `Widget Locale = 中文 (zh_CN)` and set the team
offline. The availability card should stay in Chinese.
- Configure working hours so the widget shows minute, hour, tomorrow,
and day-specific return states. The `{time}`, `{n}`, and `{day}`
placeholders should render correctly.

## What changed

- Translated missing `THUMBNAIL.AUTHOR.NOT_AVAILABLE`,
`TEAM_AVAILABILITY.BACK_AS_SOON_AS_POSSIBLE`, and `REPLY_TIME.*` strings
in `app/javascript/widget/i18n/locale/zh_CN.json`.
- Kept the scope limited to Simplified Chinese.

Co-authored-by: Sojan Jose <sojan@pepalo.com>
2026-06-02 21:10:44 +05:30
37eed5de1e feat(whatsapp): Add support for voice messages (#14606)
> Reopened from #13613, now from a personal fork
(`gabrieljablonski/chatwoot`) so maintainers can push edits —
organization-owned forks don't support "Allow edits from maintainers".
The previous PR is closed in favor of this one; same commits, same diff.

## Description

This PR adds support for sending voice messages (voice notes) through
the WhatsApp Cloud API. When agents record audio in Chatwoot, it is now
transcoded in the browser from WebM/Opus to OGG/Opus and sent with the
`voice: true` flag, so it appears as a native voice note bubble on
WhatsApp — not as a file/document attachment.

Closes #13283

**Key Changes:**
- Added `webmOpusToOgg.js` — a pure JS EBML parser + OGG page builder
that remuxes browser-recorded WebM/Opus audio into OGG/Opus entirely
client-side, with no server-side dependencies.
- Updated `AudioRecorder.vue` to use an explicit `mimeType` hint, proper
resource cleanup, and an `AUDIO_EXTENSION_MAP` for correct file
extensions.
- Renamed `mp3ConversionUtils.js` → `audioConversionUtils.js` and added
OGG conversion support via the new remuxer.
- Updated `ReplyBox.vue` to request OGG format for WhatsApp channels,
pass `isVoiceMessage` per-attachment, and handle recording errors with a
user-facing alert.
- Updated `MessageBuilder` to read the `is_voice_message` param and
persist it in attachment metadata.
- Updated `WhatsappCloudService` to:
- Normalize `audio/opus` → `audio/ogg` content type on ActiveStorage
blobs (works around Marcel gem re-detection).
- Send the `voice: true` flag when the attachment is a voice message
with `audio/ogg` content type.
  - Use WhatsApp Cloud API `v24.0` for the attachment endpoint.
- Added `AUDIO_CONVERSION_FAILED` i18n key.

**How it works:**
1. The browser records audio as WebM/Opus (Chrome/Firefox default).
2. `audioConversionUtils.js` remuxes it to OGG/Opus using the pure-JS
`webmOpusToOgg` remuxer — no server transcoding needed.
3. The OGG file is uploaded with `is_voice_message: true` in the form
payload.
4. `MessageBuilder` persists `is_voice_message` in the attachment's
`meta` hash.
5. `WhatsappCloudService` normalizes the blob content type if needed,
then sends the attachment with `voice: true` so WhatsApp renders it as a
voice note.

## Type of change

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

## How Has This Been Tested?

1. Record a voice message in a WhatsApp Cloud conversation.
2. Verify the audio is transcoded to OGG (check file extension in the
attachment preview).
3. Verify the message arrives on WhatsApp as a voice note bubble (not a
document/file).
4. Send an image or document attachment and verify it still works as
before (no `voice` flag).
5. Send a regular (non-voice) audio file and verify it arrives without
the voice flag.

---------

Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>
Co-authored-by: Muhsin <12408980+muhsin-k@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-02 15:33:32 +04:00
170b64d1f1 chore: upgrade to vite 6 (#14363)
Upgrades the frontend toolchain to Vite 6 and tidies up the build config
along the way. Behavior is unchanged for end users; this is dev/build
infra.

## What changed
- `vite` 5.4 → 6.4, `@vitejs/plugin-vue` → 5.2, `vite-plugin-ruby` → 5.2
(with matching `vite_rails`/`vite_ruby` gem bumps).
- Dropped the `vite-node` 2.0.1 pnpm override — no longer needed now
that vitest 3 runs on Vite 6 directly.
- Split the single `vite.config.ts` into:
- `vite.config.ts` (app), `vite.lib.config.ts` (SDK), `vite.shared.ts`
(aliases / Vue options), `vitest.config.ts` (tests).
- `pnpm build:sdk` now selects the SDK config explicitly instead of
branching on `BUILD_MODE=library`. SDK output path is unchanged
(`public/packs/js/sdk.js`).

No changes needed to Docker images, deployment scripts, or CI — Node 24
and pnpm 10 are already past Vite 6's floor, and the rake
`assets:precompile` hook still drives the SDK build via `pnpm`.

## How to test
- `pnpm dev` and verify the dashboard, widget, and survey routes load
and HMR works.
- Load a Chatwoot site widget on a test page and confirm `sdk.js` is
served and the widget mounts.
- `RAILS_ENV=production bundle exec rake assets:precompile` and confirm
`public/packs/js/sdk.js` plus the rest of the manifest are produced.
- `pnpm test` for the JS suite.

---------

Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Co-authored-by: Sony Mathew <2040199+sony-mathew@users.noreply.github.com>
2026-06-02 17:01:37 +05:30