Skip to content

🔖(minor) release version 0.9.0#761

Open
jbpenrath wants to merge 2 commits into
mainfrom
release/0.9.0
Open

🔖(minor) release version 0.9.0#761
jbpenrath wants to merge 2 commits into
mainfrom
release/0.9.0

Conversation

@jbpenrath

@jbpenrath jbpenrath commented Jul 22, 2026

Copy link
Copy Markdown
Contributor

Update all version files and changelog for minor release.

Purpose

Bump to version 0.9.0

Added

  • Push notification system for iOS, Android and Web
  • Bootstrap Capacitor mobile apps (iOS/Android) sharing the existing SPA
  • Self-hosted OTA update chain for mobile apps
  • Mobile OIDC session handoff via a one-time token on an allowlisted deep link
  • Inbound webhooks and message postmarks
  • Host allowlist to bypass SSRF checks on internal networks
  • Detect raw text links in HTML bodies and warn the user before redirect ✨(frontend) detect text link in html body and warn user before redirect #744
  • Support a next param at login to restore the requested route after auth
  • Display unread count in the mailbox dropdown display the number of unread emails in the list of mailboxes #738
  • Add X-Mailer header on outbound messages
  • Cache-busting source version in build
  • Full documentation on spam processing

Changed

Removed

  • Remove the TESTDOMAIN feature, superseded by autojoin domains
  • Remove the react-email component from outbound message rendering

Fixed

Security

Summary by CodeRabbit

  • Documentation
    • Added a v0.9.0 changelog entry with detailed Added/Changed/Removed/Fixed/Security items, including a Keycloak security component update.
    • Updated release compare links for the new version range.
  • Localization
    • Refreshed Russian and Ukrainian UI translations with improved pluralization/count summaries, mailbox/template/signature wording, webhook/integration help text, validation prompts, and empty-state/session guidance.
  • Chores
    • Updated component versions to v0.9.0 and improved the release automation to consistently discover manifests and regenerate lockfiles/changelog links.

@jbpenrath jbpenrath self-assigned this Jul 22, 2026
@coderabbitai

coderabbitai Bot commented Jul 22, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Version metadata, release automation, changelog references, and Russian and Ukrainian frontend locales were updated for the 0.9.0 release. The jmap-email package version was set to 0.1.0, and release manifest filtering was centralized.

Changes

0.9.0 Release Updates

Layer / File(s) Summary
Release metadata and package versions
CHANGELOG.md, src/backend/pyproject.toml, src/e2e/package.json, src/frontend/package.json, src/jmap-email/pyproject.toml, src/mta-in/pyproject.toml, src/mta-out/pyproject.toml
Package versions and changelog release references were updated; jmap-email was set to version 0.1.0.
Release manifest discovery
bin/release.py
Manifest discovery and exclusion rules were centralized and reused for package version and lockfile updates; repository-based links were added for changelog and pull-request URLs.
Russian frontend localization
src/frontend/public/locales/common/ru-RU.json
Russian translations were expanded and revised across counts, mailbox access, authentication, integrations, webhooks, validation, security, and session messaging.
Ukrainian frontend localization
src/frontend/public/locales/common/uk-UA.json
Ukrainian translations were expanded and revised across counts, mailbox access, authentication, integrations, webhooks, validation, security, and session messaging.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Suggested reviewers: sylvinus

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely identifies the main change: a minor release to version 0.9.0.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 Checkov (3.3.8)
src/e2e/package.json

Traceback (most recent call last):
File "/usr/local/bin/checkov", line 2, in
from checkov.main import Checkov
ModuleNotFoundError: No module named 'checkov'

src/frontend/package.json

Traceback (most recent call last):
File "/usr/local/bin/checkov", line 2, in
from checkov.main import Checkov
ModuleNotFoundError: No module named 'checkov'

src/frontend/public/locales/common/ru-RU.json

Traceback (most recent call last):
File "/usr/local/bin/checkov", line 2, in
from checkov.main import Checkov
ModuleNotFoundError: No module named 'checkov'

  • 1 others

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 10

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/frontend/public/locales/common/ru-RU.json`:
- Line 309: Update the “Data will be POSTed to this URL in the format selected
below.” translation in src/frontend/public/locales/common/ru-RU.json at lines
309-309 to say the data will be sent to the URL via POST, using wording
equivalent to “Данные будут отправлены на этот URL методом POST…”. Apply the
same wording correction in src/frontend/public/locales/common/uk-UA.json at
lines 309-309, using wording equivalent to “Дані буде надіслано на цей URL
методом POST…”.
- Around line 36-37: Update the draft-delete plural messages at
src/frontend/public/locales/common/ru-RU.json:36-37 and
src/frontend/public/locales/common/uk-UA.json:36-37 by adding locale-specific
_few and _many forms alongside _one and _other. In the corresponding user-count
plural entries at src/frontend/public/locales/common/ru-RU.json:194-195 and
src/frontend/public/locales/common/uk-UA.json:194-195, replace the hardcoded one
in the _one value with {{count}}. The entries at
src/frontend/public/locales/common/ru-RU.json:74-75 and
src/frontend/public/locales/common/uk-UA.json:74-75 require no direct change.

In `@src/frontend/public/locales/common/uk-UA.json`:
- Line 682: Update the Ukrainian translation for the “Share and assign the
thread” key to use a grammatical action label with consistent imperative forms,
preserving both sharing and assignment actions.
- Line 190: Update the Ukrainian translation for the key “An error occurred
while updating the address.” to use “оновленні” for updating rather than
“відновленні,” preserving the intended meaning of the source message.
- Line 149: Update the Ukrainian translation for "{{name}} will no longer have
access to the mailbox \"{{mailboxName}}\"." by replacing the Russian spelling
"почтової" with the Ukrainian "поштової", preserving the existing placeholders
and punctuation.
- Line 789: Update the Ukrainian translation for the credential message in
common/uk-UA.json, replacing “повернути його” with wording that clearly means
the credential can be replaced or rotated later when a new one is needed.
Preserve the rest of the translation unchanged.
- Line 758: Update the Ukrainian translation for “The shared mailbox...” in
common/uk-UA.json to use the Ukrainian equivalent of “shared mailbox,” such as
“Спільна поштова скринька,” while preserving the mailboxAddress placeholder and
markup structure.
- Line 431: Update the Ukrainian translation for the key “How the receiver
authenticates our requests. The credential is shown once at creation.” to
preserve both meanings: the receiver authenticates requests, and the credential
is displayed only once when created. Replace the current “automatically accepts”
wording without changing the key or surrounding translations.
- Line 226: Update the Ukrainian translation value for the authentication
failure message to use “автентифікації” instead of “авторизації,” matching the
terminology used by the adjacent Authentication translation and the source text.
- Around line 519-520: Update the Ukrainian translation for “Message inbound —
blocking, before the spam check; can shape the message before it is scanned” so
it is grammatically clear, preserves the singular message subject, and
explicitly conveys that the inbound webhook blocks before spam checking and can
modify the message before scanning.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 0a5788ba-19a6-4955-8353-4616379b517e

📥 Commits

Reviewing files that changed from the base of the PR and between 7fdca12 and 5a25ecb.

⛔ Files ignored due to path filters (5)
  • src/backend/uv.lock is excluded by !**/*.lock
  • src/e2e/package-lock.json is excluded by !**/package-lock.json
  • src/frontend/package-lock.json is excluded by !**/package-lock.json
  • src/mta-in/uv.lock is excluded by !**/*.lock
  • src/mta-out/uv.lock is excluded by !**/*.lock
📒 Files selected for processing (9)
  • CHANGELOG.md
  • src/backend/pyproject.toml
  • src/e2e/package.json
  • src/frontend/package.json
  • src/frontend/public/locales/common/ru-RU.json
  • src/frontend/public/locales/common/uk-UA.json
  • src/jmap-email/pyproject.toml
  • src/mta-in/pyproject.toml
  • src/mta-out/pyproject.toml

Comment on lines +36 to +37
"{{count}} drafts have been deleted._one": "Черновик удалён.",
"{{count}} drafts have been deleted._other": "Удалено {{count}} черновиков.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '\n== locale file locations ==\n'
git ls-files 'src/frontend/public/locales/common/*.json'

printf '\n== relevant snippets in ru-RU ==\n'
sed -n '1,220p' src/frontend/public/locales/common/ru-RU.json | nl -ba | sed -n '1,220p'

printf '\n== relevant snippets in uk-UA ==\n'
sed -n '1,220p' src/frontend/public/locales/common/uk-UA.json | nl -ba | sed -n '1,220p'

printf '\n== i18n/pluralization usage ==\n'
rg -n --hidden -S 'i18next|plural|_one"|_few"|_many"|_other"|count' src/frontend | sed -n '1,220p'

Repository: suitenumerique/messages

Length of output: 724


🏁 Script executed:

#!/bin/bash
set -euo pipefail
echo 'ping'

Repository: suitenumerique/messages

Length of output: 166


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '\n== ru-RU relevant lines ==\n'
sed -n '30,210p' src/frontend/public/locales/common/ru-RU.json | cat -n

printf '\n== uk-UA relevant lines ==\n'
sed -n '30,210p' src/frontend/public/locales/common/uk-UA.json | cat -n

printf '\n== pluralization config / usage ==\n'
rg -n -S --hidden 'i18next|plural|Intl.PluralRules|_one"|_few"|_many"|_other"|count' src/frontend | sed -n '1,240p'

Repository: suitenumerique/messages

Length of output: 50379


Use the locale-specific plural forms.

  • src/frontend/public/locales/common/ru-RU.json#L36-L37 and src/frontend/public/locales/common/uk-UA.json#L36-L37: add _few/_many for the draft-delete message; _other alone will misrender counts like 2–4.
  • src/frontend/public/locales/common/ru-RU.json#L194-L195 and src/frontend/public/locales/common/uk-UA.json#L194-L195: replace the hardcoded 1 in _one with {{count}}, or 21 users will render as “1 user”.
📍 Affects 2 files
  • src/frontend/public/locales/common/ru-RU.json#L36-L37 (this comment)
  • src/frontend/public/locales/common/ru-RU.json#L74-L75
  • src/frontend/public/locales/common/ru-RU.json#L194-L195
  • src/frontend/public/locales/common/uk-UA.json#L36-L37
  • src/frontend/public/locales/common/uk-UA.json#L74-L75
  • src/frontend/public/locales/common/uk-UA.json#L194-L195
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/frontend/public/locales/common/ru-RU.json` around lines 36 - 37, Update
the draft-delete plural messages at
src/frontend/public/locales/common/ru-RU.json:36-37 and
src/frontend/public/locales/common/uk-UA.json:36-37 by adding locale-specific
_few and _many forms alongside _one and _other. In the corresponding user-count
plural entries at src/frontend/public/locales/common/ru-RU.json:194-195 and
src/frontend/public/locales/common/uk-UA.json:194-195, replace the hardcoded one
in the _one value with {{count}}. The entries at
src/frontend/public/locales/common/ru-RU.json:74-75 and
src/frontend/public/locales/common/uk-UA.json:74-75 require no direct change.

Comment thread src/frontend/public/locales/common/ru-RU.json
"An error occurred while loading maildomains.": "Помилка при завантаженні поштових доменів.",
"An error occurred while resetting the password.": "Помилка під час скидання пароля.",
"An error occurred while saving the integration.": "Помилка при збереженні інтеграції.",
"An error occurred while updating the address.": "Помилка при відновленні адреси.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Translate “updating” as “оновленні,” not “відновленні.”

The current value says an error occurred while restoring the address, changing the meaning of the original message.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/frontend/public/locales/common/uk-UA.json` at line 190, Update the
Ukrainian translation for the key “An error occurred while updating the
address.” to use “оновленні” for updating rather than “відновленні,” preserving
the intended meaning of the source message.

"Attachments": "Вкладення",
"Attachments must be less than {{size}}.": "Вкладення повинно бути менше ніж {{size}}.",
"Authentication": "Автентифікація",
"Authentication failed. Please check your credentials and ensure you have enabled IMAP connections in your account.": "Помилка авторизації. Перевірте свої облікові дані та переконайтеся, що у вас ввімкнене з'єднання IMAP у вашому обліковому записі.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟡 Minor | ⚡ Quick win

Use authentication terminology consistently.

авторизації means authorization, but this message concerns IMAP authentication. Use автентифікації to match the adjacent Authentication translation and the source text.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/frontend/public/locales/common/uk-UA.json` at line 226, Update the
Ukrainian translation value for the authentication failure message to use
“автентифікації” instead of “авторизації,” matching the terminology used by the
adjacent Authentication translation and the source text.

Comment thread src/frontend/public/locales/common/uk-UA.json
Comment on lines 519 to +520
"Message from {referer_domain}": "Повідомлення від {referer_domain}",
"Message inbound — blocking, before the spam check; can shape the message before it is scanned": "У повідомленнях що приходять - блокування повідомлення перед перевіркою спаму; можуть формувати повідомлення перед його скануванням",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Correct the inbound webhook lifecycle wording.

The translation at Line 520 is grammatically unclear and changes the subject to plural “incoming messages,” making it unclear that this webhook blocks before spam checking and can modify the message before scanning.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/frontend/public/locales/common/uk-UA.json` around lines 519 - 520, Update
the Ukrainian translation for “Message inbound — blocking, before the spam
check; can shape the message before it is scanned” so it is grammatically clear,
preserves the singular message subject, and explicitly conveys that the inbound
webhook blocks before spam checking and can modify the message before scanning.

"Sent on": "Надіслано",
"Set up automatic replies sent to senders while the mailbox is unattended. Only one auto-reply can be active at a time.": "Налаштування автоматичних відповідей, які відправляються тоді, коли поштова скринька без уваги власника. Тільки один автовідповідач може бути активований за раз.",
"Settings": "Налаштування",
"Share and assign the thread": "Поділіться та призначити участь в обговоренні",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Fix the malformed action label.

Поділіться та призначити участь в обговоренні mixes imperative and infinitive forms and does not clearly express “Share and assign the thread.” Replace it with a grammatical action label preserving both actions.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/frontend/public/locales/common/uk-UA.json` at line 682, Update the
Ukrainian translation for the “Share and assign the thread” key to use a
grammatical action label with consistent imperative forms, preserving both
sharing and assignment actions.

"The personal mailbox <strong>{{mailboxAddress}}</strong> has been created successfully.": "Персональну поштову скриньку <1>{{mailboxAddress}}</1> успішно створено.",
"The PST archive is unreadable: the file is corrupt or its internal structure is incomplete. Retrying will not help — please try to re-generate the archive.": "PST архів не можна прочитати: файл пошкоджений або його внутрішня структура є неповною. Повторна спроба не допоможе - будь ласка, спробуйте повторно створити архів.",
"The redirect mailbox <strong>{{mailboxAddress}}</strong> has been created successfully.": "Перенаправлення для поштової скриньки <1>{{mailboxAddress}}</1> успішно створено.",
"The shared mailbox <strong>{{mailboxAddress}}</strong> has been created successfully.": "Публічна поштова скринька <1>{{mailboxAddress}}</1> успішно створена.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟡 Minor | ⚡ Quick win

Do not translate “shared mailbox” as “public mailbox.”

Публічна поштова скринька changes the mailbox type and can imply broader visibility than a shared mailbox. Use the Ukrainian equivalent of “shared mailbox,” such as Спільна поштова скринька.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/frontend/public/locales/common/uk-UA.json` at line 758, Update the
Ukrainian translation for “The shared mailbox...” in common/uk-UA.json to use
the Ukrainian equivalent of “shared mailbox,” such as “Спільна поштова
скринька,” while preserving the mailboxAddress placeholder and markup structure.

Comment thread src/frontend/public/locales/common/uk-UA.json

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@CHANGELOG.md`:
- Around line 345-346: Update bin/release.py:update_changelog() to construct the
changelog comparison URL explicitly as v{last_version}...v{version}, rather than
replacing the previous version throughout the existing link. Preserve the
expected [unreleased] link format for each subsequent release.

In `@src/frontend/public/locales/common/ru-RU.json`:
- Line 436: Update the Russian translation for the identity-synchronization
message so “identity synchronization” uses terminology equivalent to
“синхронизация идентификации,” while preserving the existing meaning and
surrounding message content.
- Line 759: Update the Russian translation for “The text of this link does not
match its real target, it may be unsafe.” to use feminine agreement with
“ссылки,” replacing “его реальной цели” with “её реальной цели” or equivalent
neutral wording.
- Line 604: Update the “Payload format” translation in
src/frontend/public/locales/common/ru-RU.json at lines 604-604 to use technical
request-payload terminology, replacing “Формат нагрузки” with “Формат полезной
нагрузки” or an equivalent. Make the corresponding change in
src/frontend/public/locales/common/uk-UA.json at lines 604-604, replacing
“Формат навантаження” with “Формат корисного навантаження” or an equivalent.

In `@src/frontend/public/locales/common/uk-UA.json`:
- Line 302: Update the Ukrainian translation for
create_mailbox_modal.success.credential_text to use “Ваші облікові дані:” and
remove the “для повідомлень” wording, while preserving the email, password
placeholders, and remaining text.
- Line 861: Update the Ukrainian translation for the key “You are about to leave
this page and be redirected to:” to use the grammatically correct construction
“Ви збираєтеся залишити цю сторінку, і вас буде перенаправлено на:”.
- Line 833: Update the Ukrainian translation for the “URL must include a valid
host.” key to use grammatically correct wording, replacing “включати дійсного
хосту” with phrasing such as “містити коректний хост”.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 5ca5db5d-3830-43d9-be86-99543cc7f7d7

📥 Commits

Reviewing files that changed from the base of the PR and between 5a25ecb and a5aa248.

⛔ Files ignored due to path filters (5)
  • src/backend/uv.lock is excluded by !**/*.lock
  • src/e2e/package-lock.json is excluded by !**/package-lock.json
  • src/frontend/package-lock.json is excluded by !**/package-lock.json
  • src/mta-in/uv.lock is excluded by !**/*.lock
  • src/mta-out/uv.lock is excluded by !**/*.lock
📒 Files selected for processing (10)
  • CHANGELOG.md
  • bin/release.py
  • src/backend/pyproject.toml
  • src/e2e/package.json
  • src/frontend/package.json
  • src/frontend/public/locales/common/ru-RU.json
  • src/frontend/public/locales/common/uk-UA.json
  • src/jmap-email/pyproject.toml
  • src/mta-in/pyproject.toml
  • src/mta-out/pyproject.toml

Comment thread CHANGELOG.md
Comment thread src/frontend/public/locales/common/ru-RU.json
Comment thread src/frontend/public/locales/common/ru-RU.json
"The PST archive is unreadable: the file is corrupt or its internal structure is incomplete. Retrying will not help — please try to re-generate the archive.": "PST архив нечитаем: файл повреждён или его внутренняя структура неполная. Повторная попытка не поможет — пожалуйста, попробуйте пересоздать архив.",
"The redirect mailbox <strong>{{mailboxAddress}}</strong> has been created successfully.": "Успешно создана переадресация для почтового ящика <1>{{mailboxAddress}}</1>.",
"The shared mailbox <strong>{{mailboxAddress}}</strong> has been created successfully.": "Общий почтовый ящик <1>{{mailboxAddress}}</1> успешно создан.",
"The text of this link does not match its real target, it may be unsafe.": "Текст этой ссылки не соответствует его реальной цели, может быть небезопасным.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Fix the gender agreement in the link-safety warning.

ссылки is feminine, but the translation uses его реальной цели. Use её реальной цели or neutral wording.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/frontend/public/locales/common/ru-RU.json` at line 759, Update the
Russian translation for “The text of this link does not match its real target,
it may be unsafe.” to use feminine agreement with “ссылки,” replacing “его
реальной цели” with “её реальной цели” or equivalent neutral wording.

"Create reusable message templates shared by all users of this mailbox.": "Створити повторно використовувані шаблони повідомлень, поширені між усіма користувачами цієї поштової скриньки.",
"Create standardized signatures that can be used by all users of this mailbox.": "Створити стандартизовані підписи, які можуть бути використані усіма користувачами цієї поштової скриньки.",
"Create the label \"{{label}}\"": "Створити мітку \"{{label}}\"",
"create_mailbox_modal.success.credential_text": "Ваші облікові дані для повідомлень:\n- Електронна адреса: {{id}}\n- Пароль: {{password}}\n\nПід час першого входу вам буде запропоновано змінити пароль.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Do not add “for messages” to the credentials notice.

The source says “Your credentials”; облікові дані для повідомлень suggests a separate message-specific credential. Use Ваші облікові дані:.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/frontend/public/locales/common/uk-UA.json` at line 302, Update the
Ukrainian translation for create_mailbox_modal.success.credential_text to use
“Ваші облікові дані:” and remove the “для повідомлень” wording, while preserving
the email, password placeholders, and remaining text.

Comment thread src/frontend/public/locales/common/uk-UA.json
Comment thread src/frontend/public/locales/common/uk-UA.json
Do not upgrade jmap_email as it has its own release process.
Then ignore vite build folder than contain package.json
Update all version files and changelog for minor release.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/frontend/public/locales/common/ru-RU.json`:
- Around line 156-157: Update the Russian translations for “Access sharing” and
“Access sharing to the mailbox” to use noun phrases meaning “Общий доступ” and
“Общий доступ к почтовому ящику”, preserving the intended access-sharing UI
meaning.

In `@src/frontend/public/locales/common/uk-UA.json`:
- Line 846: Update the Ukrainian translation for the “Webhook signing secret”
key to use wording equivalent to “Секрет підпису вебобробника,” replacing the
current phrase that means “secret signature.”
- Line 149: Update the Ukrainian translation for the key "{{name}} will no
longer have access to the mailbox \"{{mailboxName}}\"." to retain the literal
quotation marks around the {{mailboxName}} placeholder, matching the source
message.
- Line 625: Update the Ukrainian translation value for the credential rotation
message so it clearly states that the receiver must be updated with the new
value before it can verify webhooks again. Replace the inaccurate wording for
“verify webhooks” and make the receiver-update sentence natural, while
preserving the immediate invalidation meaning.
- Around line 30-43: Update the "{{count}} drafts have been deleted."
pluralization entries in the locale data by adding the missing few and many
forms. Use the appropriate Ukrainian wording: few for 2–4 drafts and many for
larger counts, while preserving the existing one and correcting the other form
as needed.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 100a313a-5c2f-4e1f-9410-45f137ad4282

📥 Commits

Reviewing files that changed from the base of the PR and between a5aa248 and 3214cfb.

⛔ Files ignored due to path filters (5)
  • src/backend/uv.lock is excluded by !**/*.lock
  • src/e2e/package-lock.json is excluded by !**/package-lock.json
  • src/frontend/package-lock.json is excluded by !**/package-lock.json
  • src/mta-in/uv.lock is excluded by !**/*.lock
  • src/mta-out/uv.lock is excluded by !**/*.lock
📒 Files selected for processing (10)
  • CHANGELOG.md
  • bin/release.py
  • src/backend/pyproject.toml
  • src/e2e/package.json
  • src/frontend/package.json
  • src/frontend/public/locales/common/ru-RU.json
  • src/frontend/public/locales/common/uk-UA.json
  • src/jmap-email/pyproject.toml
  • src/mta-in/pyproject.toml
  • src/mta-out/pyproject.toml

Comment on lines +156 to +157
"Access sharing": "Поделиться доступом",
"Access sharing to the mailbox": "Поделиться почтовым ящиком",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Use noun phrases for the access-sharing labels.

These strings are rendered as the mailbox-settings tab and title. Поделиться доступом is an imperative (“share access”), while Поделиться почтовым ящиком means sharing the mailbox itself. Use wording such as Общий доступ and Общий доступ к почтовому ящику to preserve the UI meaning.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/frontend/public/locales/common/ru-RU.json` around lines 156 - 157, Update
the Russian translations for “Access sharing” and “Access sharing to the
mailbox” to use noun phrases meaning “Общий доступ” and “Общий доступ к
почтовому ящику”, preserving the intended access-sharing UI meaning.

Comment on lines +30 to +43
"{{count}} auto-reply_one": "Автовідповідачів: {{count}}",
"{{count}} auto-reply_other": "Автовідповідачів: {{count}}",
"{{count}} conflicting events_one": "Конфліктних подій: {{count}}",
"{{count}} conflicting events_other": "Конфліктних подій: {{count}}",
"{{count}} days ago_one": "{{count}} дн. тому",
"{{count}} days ago_other": "{{count}} дн. тому",
"{{count}} drafts have been deleted._one": "Чернетку видалено.",
"{{count}} drafts have been deleted._other": "Видалено {{count}} чернеток.",
"{{count}} hours ago_one": "{{count}} год. тому",
"{{count}} hours ago_other": "{{count}} год. тому",
"{{count}} integration_one": "Інтеграцій: {{count}}",
"{{count}} integration_other": "Інтеграцій: {{count}}",
"{{count}} message template_one": "Шаблонів повідомлень: {{count}}",
"{{count}} message template_other": "Шаблонів повідомлень: {{count}}",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
rg -n '"[^"]+_(one|few|many|other)"' src/frontend/public/locales/common/uk-UA.json
rg -n 'compatibilityJSON|plural|i18next' src/frontend/src src/frontend/package.json

Repository: suitenumerique/messages

Length of output: 40583


🏁 Script executed:

#!/bin/bash
set -euo pipefail

sed -n '1,220p' src/frontend/src/features/i18n/initI18n.ts
printf '\n--- conf ---\n'
sed -n '1,220p' src/frontend/src/features/i18n/conf.ts
printf '\n--- locale samples ---\n'
for f in src/frontend/public/locales/common/en-US.json src/frontend/public/locales/common/uk-UA.json; do
  echo "### $f"
  python3 - <<'PY' "$f"
import json, sys
path = sys.argv[1]
with open(path, encoding='utf-8') as fh:
    data = json.load(fh)
for key in [
    "{{count}} days ago_one",
    "{{count}} days ago_other",
    "{{count}} drafts have been deleted._one",
    "{{count}} drafts have been deleted._other",
]:
    if key in data:
        print(f"{key}: {data[key]}")
PY
done
printf '\n--- i18next plural docs from package? ---\n'
rg -n '"pluralSeparator"|compatibilityJSON|fallbackLng|lng:|load:|plural' src/frontend/src/features/i18n src/frontend/package.json src/frontend/public/locales/common/en-US.json src/frontend/public/locales/common/uk-UA.json

Repository: suitenumerique/messages

Length of output: 3829


🏁 Script executed:

#!/bin/bash
set -euo pipefail

python3 - <<'PY'
import json
from pathlib import Path
for p in [
    Path('src/frontend/public/locales/common/en-US.json'),
    Path('src/frontend/public/locales/common/uk-UA.json'),
]:
    if not p.exists():
        print(f"missing {p}")
        continue
    data = json.loads(p.read_text(encoding='utf-8'))
    forms = sorted({k.rsplit('_',1)[-1] for k in data if k.endswith(('_one','_few','_many','_other'))})
    print(p, forms[:20], len(forms))
PY

Repository: suitenumerique/messages

Length of output: 291


🏁 Script executed:

#!/bin/bash
set -euo pipefail

cat -n src/frontend/src/features/i18n/initI18n.ts
printf '\n---\n'
cat -n src/frontend/src/features/i18n/conf.ts

Repository: suitenumerique/messages

Length of output: 3462


Add the missing few/many forms for the draft-deletion string. other currently uses чернеток, which is wrong for 2–4.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/frontend/public/locales/common/uk-UA.json` around lines 30 - 43, Update
the "{{count}} drafts have been deleted." pluralization entries in the locale
data by adding the missing few and many forms. Use the appropriate Ukrainian
wording: few for 2–4 drafts and many for larger counts, while preserving the
existing one and correcting the other form as needed.

"{{date}} at {{time}}": "{{date}} о {{time}}",
"{{name}} assigned to this thread": "{{name}} тепер є учасником цього обговорення",
"{{name}} unassigned from this thread": "{{name}} більше не є учасником цього обговорення",
"{{name}} will no longer have access to the mailbox \"{{mailboxName}}\".": "{{name}} більше не має доступу до почтової скриньки {{mailboxName}}.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Preserve the mailbox-name quotes.

The source message includes literal quotes around {{mailboxName}}, but the translation omits them.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/frontend/public/locales/common/uk-UA.json` at line 149, Update the
Ukrainian translation for the key "{{name}} will no longer have access to the
mailbox \"{{mailboxName}}\"." to retain the literal quotation marks around the
{{mailboxName}} placeholder, matching the source message.

"Refresh": "Оновити",
"Refresh summary": "Оновити дані короткого змісту",
"Regenerate credential": "Повторно створити облікові дані",
"Regenerating the credential invalidates the old one immediately. The receiver must be updated with the new value before it can verify webhooks again.": "Повторне створення облікових даних негайно скасовує старі значення. Отримувач повинен бути оновлений з новим значенням, перш ніж він зможе знову підтвердити вебобробники.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Clarify credential rotation and webhook verification.

підтвердити вебобробники means confirming handlers, not verifying webhooks, and the sentence about updating the receiver is awkward. Use wording equivalent to: “The receiver must be updated with the new value before it can verify webhooks again.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/frontend/public/locales/common/uk-UA.json` at line 625, Update the
Ukrainian translation value for the credential rotation message so it clearly
states that the receiver must be updated with the new value before it can verify
webhooks again. Replace the inaccurate wording for “verify webhooks” and make
the receiver-update sentence natural, while preserving the immediate
invalidation meaning.

"Visit the Help center": "Відвідати центр допомоги",
"Webhook": "Вебобробник",
"Webhook API key": "API ключ вебобробника",
"Webhook signing secret": "Секретний підпис вебобробника",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟡 Minor | ⚡ Quick win

Translate “signing secret” accurately.

Секретний підпис means “secret signature,” not the secret used to sign webhook requests. Use wording equivalent to Секрет підпису вебобробника.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/frontend/public/locales/common/uk-UA.json` at line 846, Update the
Ukrainian translation for the “Webhook signing secret” key to use wording
equivalent to “Секрет підпису вебобробника,” replacing the current phrase that
means “secret signature.”

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant