Skip to content

🔖(minor) release version 0.6.0#671

Merged
jbpenrath merged 1 commit into
mainfrom
release/0.6.0
May 26, 2026
Merged

🔖(minor) release version 0.6.0#671
jbpenrath merged 1 commit into
mainfrom
release/0.6.0

Conversation

@jbpenrath
Copy link
Copy Markdown
Contributor

@jbpenrath jbpenrath commented May 20, 2026

Purpose

Bump to version 0.6.0

Added

Changed

Fixed

Summary by CodeRabbit

  • Chores

    • Release 0.6.0 published across the project; changelog updated with a new 0.6.0 section and revised compare links.
  • Documentation

    • Updated Dutch, Russian, and Ukrainian UI translations with many new/edited messages, pluralization, relative-time labels, confirmation/error/empty-state text, permission/session prompts, and copy improvements for clearer UX.

Review Change Stack

@jbpenrath jbpenrath self-assigned this May 20, 2026
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 20, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: f61d682c-40b5-4ada-985f-7b50a16718af

📥 Commits

Reviewing files that changed from the base of the PR and between e0f290e and 2b39e21.

⛔ 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/nl-NL.json
  • src/frontend/public/locales/common/ru-RU.json
  • src/frontend/public/locales/common/uk-UA.json
  • src/mta-in/pyproject.toml
  • src/mta-out/pyproject.toml
💤 Files with no reviewable changes (1)
  • src/frontend/public/locales/common/nl-NL.json

📝 Walkthrough

Walkthrough

Adds a 0.6.0 release section to CHANGELOG.md, updates compare links, bumps project/package versions from 0.5.0→0.6.0 across multiple manifests, and applies extensive Dutch, Russian, and Ukrainian frontend locale string changes.

Changes

Version 0.6.0 Release and Localization Update

Layer / File(s) Summary
Release metadata and package version bumps
CHANGELOG.md, src/backend/pyproject.toml, src/e2e/package.json, src/frontend/package.json, src/mta-in/pyproject.toml, src/mta-out/pyproject.toml
Version bumped from 0.5.0 to 0.6.0 across package metadata. CHANGELOG.md gains a ## [0.6.0] - 2026-05-20 section with "Added", "Changed", "Fixed", and "Security" subsections and updated compare links.
Dutch locale string updates
src/frontend/public/locales/common/nl-NL.json
Extensive additions and edits: relative-time plurals, thread-scoped counters, new action/confirmation/failure strings, AI label-assignment text, mailbox/template/signature descriptions, and removal/replacement of obsolete keys (auto-reply, some weekdays, Share access).
Russian locale string updates
src/frontend/public/locales/common/ru-RU.json
Added pluralized mention/unread variants, internal comment and delete confirmations, label assignment/archive outcomes, copy/link actions, permission/2FA/import messages, many failure/empty-state strings, and removed Share access.
Ukrainian locale string updates
src/frontend/public/locales/common/uk-UA.json
Added/updated plural forms and many UI strings for assignments, mentions, internal comments, label assignment/archive confirmations, expand/collapse, permission and import/2FA guidance, sharing prompts, and removed Share access.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

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 accurately describes the pull request as a release version bump to 0.6.0, which is the primary change across all modified files (version updates in pyproject.toml, package.json files, and CHANGELOG.md).
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
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.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


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 and usage tips.

@jbpenrath jbpenrath marked this pull request as ready for review May 26, 2026 12:23
@jbpenrath jbpenrath force-pushed the release/0.6.0 branch 2 times, most recently from 4997784 to e0f290e Compare May 26, 2026 12:29
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

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 `@CHANGELOG.md`:
- Line 233: The compare link for [0.6.0] is pointing to v0.4.0...v0.6.0 and
should instead compare the immediate previous tag; update the link target for
the `[0.6.0]:` reference so it reads `.../compare/v0.5.0...v0.6.0` (i.e., change
the base tag from v0.4.0 to v0.5.0) to make the release diff accurate.

In `@src/frontend/public/locales/common/ru-RU.json`:
- Around line 38-53: Fix Russian singular plural forms for the "_one" variants
of the "mentioning you" keys by replacing the current plural text with singular
forms; update the following keys: "{{count}} messages mentioning you._one" ->
"Вас упомянули в {{count}} сообщении", "{{count}} starred messages mentioning
you._one" -> "Вас упомянули в {{count}} помеченном сообщении", "{{count}} unread
messages mentioning you._one" -> "Вас упомянули в {{count}} непрочитанном
сообщении", "{{count}} unread starred messages mentioning you._one" -> "Вас
упомянули в {{count}} непрочитанном помеченном сообщении", "{{count}} results
mentioning you._one" -> "Вас упомянули в {{count}} результате поиска",
"{{count}} starred results mentioning you._one" -> "Вас упомянули в {{count}}
помеченном результате поиска", "{{count}} unread results mentioning you._one" ->
"Вас упомянули в {{count}} непрочитанном результате поиска", "{{count}} unread
starred results mentioning you._one" -> "Вас упомянули в {{count}} непрочитанном
помеченном результате поиска"; leave all corresponding "_other" forms unchanged.

In `@src/frontend/public/locales/common/uk-UA.json`:
- Around line 2-3: The Ukrainian pluralization lines use wrong noun form and
reversed word order; update the two translation values so the number comes first
and the noun uses correct singular/plural: change the "{{count}}
attachments_one" value to "{{count}} вкладення" and the "{{count}}
attachments_other" value to "{{count}} вкладень" (use these exact string values
for the keys "{{count}} attachments_one" and "{{count}} attachments_other").
- Around line 4-5: The two Ukrainian pluralization entries "{{count}}
attendees_one" and "{{count}} attendees_other" use inconsistent word order;
update "{{count}} attendees_other" to match the number-first pattern used by
"{{count}} attendees_one" (e.g., change "Учасників: {{count}}" to "{{count}}
учасників") so both keys use the same "{{count}} <noun>" structure and correct
plural form; adjust only the value for the "{{count}} attendees_other" key to
preserve pluralization behavior.
- Around line 38-53: The Ukrainian plural forms for the keys like "{{count}} out
of {{total}} messages are now starred._one/_other" (and the similar keys for
archived/deleted/reported and threads, plus the other affected groups mentioned)
are incorrect because both variants use genitive plural; update each "_one"
variant to use the singular noun form and natural word order (e.g., "_one":
"Позначено {{count}} повідомлення з {{total}} повідомлень.") and keep "_other"
as the genitive plural form (e.g., "_other": "Позначено {{count}} повідомлень з
{{total}} повідомлень."); apply the same singular vs plural adjustment for all
affected translation keys referenced in the comment (messages/threads starred,
archived, deleted, reported as spam; messages/results mentioning you; unread
variants; and "Move {{count}} threads") so the noun after {{count}} matches the
count.
🪄 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: ba28a979-861f-4f4d-ad05-a563a39d017c

📥 Commits

Reviewing files that changed from the base of the PR and between bd779a1 and 3c6c9cc.

⛔ 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/nl-NL.json
  • src/frontend/public/locales/common/ru-RU.json
  • src/frontend/public/locales/common/uk-UA.json
  • src/mta-in/pyproject.toml
  • src/mta-out/pyproject.toml
💤 Files with no reviewable changes (1)
  • src/frontend/public/locales/common/nl-NL.json

Comment thread CHANGELOG.md Outdated
Comment on lines +38 to +53
"{{count}} out of {{total}} messages are now starred._one": "Помечено {{count}} из {{total}} сообщений.",
"{{count}} out of {{total}} messages are now starred._other": "Помечено {{count}} из {{total}} сообщений.",
"{{count}} out of {{total}} messages have been archived._one": "Архивировано {{count}} из {{total}} сообщений.",
"{{count}} out of {{total}} messages have been archived._other": "Архивировано {{count}} из {{total}} сообщений.",
"{{count}} out of {{total}} messages have been deleted._one": "Удалено {{count}} из {{total}} сообщений.",
"{{count}} out of {{total}} messages have been deleted._other": "Удалено {{count}} из {{total}} сообщений.",
"{{count}} out of {{total}} messages have been reported as spam._one": "Помечено как спам {{count}} из {{total}} сообщений.",
"{{count}} out of {{total}} messages have been reported as spam._other": "Помечено как спам {{count}} из {{total}} сообщений.",
"{{count}} out of {{total}} threads are now starred._one": "Помечено {{count}} из {{total}} обсуждений.",
"{{count}} out of {{total}} threads are now starred._other": "Помечено {{count}} из {{total}} обсуждений.",
"{{count}} out of {{total}} threads have been archived._one": "Архивировано {{count}} из {{total}} обсуждений.",
"{{count}} out of {{total}} threads have been archived._other": "Архивировано {{count}} из {{total}} обсуждений.",
"{{count}} out of {{total}} threads have been deleted._one": "Удалено {{count}} из {{total}} обсуждений.",
"{{count}} out of {{total}} threads have been deleted._other": "Удалено {{count}} из {{total}} обсуждений.",
"{{count}} out of {{total}} threads have been reported as spam._one": "Помечены как спам {{count}} из {{total}} обсуждений.",
"{{count}} out of {{total}} threads have been reported as spam._other": "Помечены как спам {{count}} из {{total}} обсуждений.",
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check for pluralization keys where _one and _other have identical values in Russian locale

cat src/frontend/public/locales/common/ru-RU.json | \
  jq -r 'to_entries | 
    map(select(.key | endswith("_one"))) | 
    map({
      key_one: .key,
      value_one: .value,
      key_other: (.key | sub("_one$"; "_other")),
      value_other: (. as $item | $ARGS.named[.key | sub("_one$"; "_other")] // "")
    }) |
    map(select(.value_one == .value_other and .value_other != "")) |
    .[] | "\(.key_one) and \(.key_other) have identical values"' \
  --jsonargs $(cat src/frontend/public/locales/common/ru-RU.json)

Repository: suitenumerique/messages

Length of output: 49


🏁 Script executed:

#!/bin/bash
set -euo pipefail

FILE="src/frontend/public/locales/common/ru-RU.json"

# 1) Print the specific keys mentioned around "out of {{total}}"
python3 - <<'PY'
import json
from pathlib import Path

file_path = Path("src/frontend/public/locales/common/ru-RU.json")
data = json.loads(file_path.read_text(encoding="utf-8"))

targets = [
  "{{count}} out of {{total}} messages are now starred",
  "{{count}} out of {{total}} messages have been archived",
  "{{count}} out of {{total}} messages have been deleted",
  "{{count}} out of {{total}} messages have been reported as spam",
  "{{count}} out of {{total}} threads are now starred",
  "{{count}} out of {{total}} threads have been archived",
  "{{count}} out of {{total}} threads have been deleted",
  "{{count}} out of {{total}} threads have been reported as spam",
]
for base in targets:
  for plural in ("_one","_other"):
    key = base + plural
    if key in data:
      print(f"{key} => {data[key]}")
    else:
      print(f"{key} => <missing>")
PY

# 2) Find plural keys where _one and _other are identical, for any key ending with _one and having corresponding _other.
python3 - <<'PY'
import json
from pathlib import Path

file_path = Path("src/frontend/public/locales/common/ru-RU.json")
data = json.loads(file_path.read_text(encoding="utf-8"))

pairs = []
for k,v in data.items():
  if k.endswith("_one"):
    other_k = k[:-4] + "_other"  # replace suffix _one with _other
    if other_k in data and data[other_k] != "" and v == data[other_k]:
      pairs.append((k, other_k, v))
print(len(pairs))
for k1,k2,val in pairs[:50]:
  print(k1)
  print(k2)
  print(val)
  print("---")
PY

# 3) Narrower: only keys containing 'out of {{total}}' and checking _one/_other equality.
python3 - <<'PY'
import json
from pathlib import Path
file_path = Path("src/frontend/public/locales/common/ru-RU.json")
data = json.loads(file_path.read_text(encoding="utf-8"))
hits=[]
for k,v in data.items():
  if k.endswith("_one") and "out of {{total}}" in k:
    other_k = k[:-4] + "_other"
    if other_k in data and data[other_k] == v:
      hits.append((k, other_k, v))
print(len(hits))
for k1,k2,val in hits:
  print(f"{k1} / {k2}: {val}")
PY

Repository: suitenumerique/messages

Length of output: 9325


🏁 Script executed:

#!/bin/bash
set -euo pipefail

FILE="src/frontend/public/locales/common/ru-RU.json"

# 1) Print the specific keys mentioned around "out of {{total}}"
python3 - <<'PY'
import json
from pathlib import Path

file_path = Path("src/frontend/public/locales/common/ru-RU.json")
data = json.loads(file_path.read_text(encoding="utf-8"))

targets = [
  "{{count}} out of {{total}} messages are now starred",
  "{{count}} out of {{total}} messages have been archived",
  "{{count}} out of {{total}} messages have been deleted",
  "{{count}} out of {{total}} messages have been reported as spam",
  "{{count}} out of {{total}} threads are now starred",
  "{{count}} out of {{total}} threads have been archived",
  "{{count}} out of {{total}} threads have been deleted",
  "{{count}} out of {{total}} threads have been reported as spam",
]
for base in targets:
  for plural in ("_one","_other"):
    key = base + plural
    if key in data:
      print(f"{key} => {data[key]}")
    else:
      print(f"{key} => <missing>")
PY

# 2) Find plural keys where _one and _other are identical, for any key ending with _one and having corresponding _other.
python3 - <<'PY'
import json
from pathlib import Path

file_path = Path("src/frontend/public/locales/common/ru-RU.json")
data = json.loads(file_path.read_text(encoding="utf-8"))

pairs = []
for k,v in data.items():
  if k.endswith("_one"):
    other_k = k[:-4] + "_other"  # replace suffix _one with _other
    if other_k in data and data[other_k] != "" and v == data[other_k]:
      pairs.append((k, other_k, v))
print(len(pairs))
for k1,k2,val in pairs[:50]:
  print(k1)
  print(k2)
  print(val)
  print("---")
PY

# 3) Narrower: only keys containing 'out of {{total}}' and checking _one/_other equality.
python3 - <<'PY'
import json
from pathlib import Path
file_path = Path("src/frontend/public/locales/common/ru-RU.json")
data = json.loads(file_path.read_text(encoding="utf-8"))
hits=[]
for k,v in data.items():
  if k.endswith("_one") and "out of {{total}}" in k:
    other_k = k[:-4] + "_other"
    if other_k in data and data[other_k] == v:
      hits.append((k, other_k, v))
print(len(hits))
for k1,k2,val in hits:
  print(f"{k1} / {k2}: {val}")
PY

Repository: suitenumerique/messages

Length of output: 9325


🏁 Script executed:

#!/bin/bash
set -euo pipefail

python3 - <<'PY'
import json
from pathlib import Path

path = Path("src/frontend/public/locales/common/ru-RU.json")
data = json.loads(path.read_text(encoding="utf-8"))

substrings = [
  "messages mentioning you",
  "threads mentioning you",   # just in case
  "results mentioning you",
  "unread messages mentioning you",
  "unread results mentioning you",
  "starred messages mentioning you",
  "starred results mentioning you",
]
# collect identical one/other pairs for these categories
for s in substrings:
  hits = []
  for k,v in data.items():
    if not k.endswith("_one"): 
      continue
    if s not in k:
      continue
    other = k[:-4] + "_other"
    if other in data and data[other] != "" and data[other] == v:
      hits.append((k, other, v))
  if hits:
    print("===", s, "===", len(hits))
    for k1,k2,val in hits:
      print(k1, " / ", k2, "=>", val)
PY

Repository: suitenumerique/messages

Length of output: 2488


🏁 Script executed:

#!/bin/bash
set -euo pipefail
sed -n '30,70p' src/frontend/public/locales/common/ru-RU.json | cat -n

Repository: suitenumerique/messages

Length of output: 3518


🏁 Script executed:

#!/bin/bash
set -euo pipefail
sed -n '38,65p' src/frontend/public/locales/common/ru-RU.json | cat -n

Repository: suitenumerique/messages

Length of output: 2488


Fix Russian plural-case for “messages/results mentioning you” (ru-RU)

Keys like {{count}} messages mentioning you_(one|other) are identical ("Вас упомянули в {{count}} сообщениях"), so the {{count}}=1 form is grammatically wrong (needs singular after в, not plural).

Apply _one corrections (keep _other as-is) for the following:

  • {{count}} messages mentioning you._one: "Вас упомянули в {{count}} сообщении"
  • {{count}} starred messages mentioning you._one: "Вас упомянули в {{count}} помеченном сообщении"
  • {{count}} unread messages mentioning you._one: "Вас упомянули в {{count}} непрочитанном сообщении"
  • {{count}} unread starred messages mentioning you._one: "Вас упомянули в {{count}} непрочитанном помеченном сообщении"
  • {{count}} results mentioning you._one: "Вас упомянули в {{count}} результате поиска"
  • {{count}} starred results mentioning you._one: "Вас упомянули в {{count}} помеченном результате поиска"
  • {{count}} unread results mentioning you._one: "Вас упомянули в {{count}} непрочитанном результате поиска"
  • {{count}} unread starred results mentioning you._one: "Вас упомянули в {{count}} непрочитанном помеченном результате поиска"

The earlier claim that the “out of {{total}}” strings break via {{count}}=1 is incorrect: in these strings the noun (“сообщений/обсуждений”) comes after {{total}} (after из), not after {{count}}.

🤖 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 38 - 53, Fix
Russian singular plural forms for the "_one" variants of the "mentioning you"
keys by replacing the current plural text with singular forms; update the
following keys: "{{count}} messages mentioning you._one" -> "Вас упомянули в
{{count}} сообщении", "{{count}} starred messages mentioning you._one" -> "Вас
упомянули в {{count}} помеченном сообщении", "{{count}} unread messages
mentioning you._one" -> "Вас упомянули в {{count}} непрочитанном сообщении",
"{{count}} unread starred messages mentioning you._one" -> "Вас упомянули в
{{count}} непрочитанном помеченном сообщении", "{{count}} results mentioning
you._one" -> "Вас упомянули в {{count}} результате поиска", "{{count}} starred
results mentioning you._one" -> "Вас упомянули в {{count}} помеченном результате
поиска", "{{count}} unread results mentioning you._one" -> "Вас упомянули в
{{count}} непрочитанном результате поиска", "{{count}} unread starred results
mentioning you._one" -> "Вас упомянули в {{count}} непрочитанном помеченном
результате поиска"; leave all corresponding "_other" forms unchanged.

Comment on lines +2 to +3
"{{count}} attachments_one": "Вкладень: {{count}}",
"{{count}} attachments_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.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Correct Ukrainian noun forms and word order for attachments.

Lines 2-3 have grammatical and formatting issues:

  1. Line 2 (_one): "Вкладень: {{count}}" uses genitive plural "Вкладень" for singular count. Should be nominative singular "Вкладення".
  2. Both lines use format "Noun: {{count}}" which reverses typical Slavic word order where numbers precede nouns.

Recommended correction to match typical Ukrainian number-noun patterns:

🔧 Proposed fix
-  "{{count}} attachments_one": "Вкладень: {{count}}",
-  "{{count}} attachments_other": "Вкладень: {{count}}",
+  "{{count}} attachments_one": "{{count}} вкладення",
+  "{{count}} attachments_other": "{{count}} вкладень",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"{{count}} attachments_one": "Вкладень: {{count}}",
"{{count}} attachments_other": "Вкладень: {{count}}",
"{{count}} attachments_one": "{{count}} вкладення",
"{{count}} attachments_other": "{{count}} вкладень",
🤖 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 2 - 3, The
Ukrainian pluralization lines use wrong noun form and reversed word order;
update the two translation values so the number comes first and the noun uses
correct singular/plural: change the "{{count}} attachments_one" value to
"{{count}} вкладення" and the "{{count}} attachments_other" value to "{{count}}
вкладень" (use these exact string values for the keys "{{count}}
attachments_one" and "{{count}} attachments_other").

Comment thread src/frontend/public/locales/common/uk-UA.json Outdated
Comment on lines +38 to +53
"{{count}} out of {{total}} messages are now starred._one": "Позначено {{count}} з {{total}} повідомлень.",
"{{count}} out of {{total}} messages are now starred._other": "Позначено {{count}} з {{total}} повідомлень.",
"{{count}} out of {{total}} messages have been archived._one": "Архівовано {{count}} з {{total}} повідомлень.",
"{{count}} out of {{total}} messages have been archived._other": "Архівовано {{count}} з {{total}} повідомлень.",
"{{count}} out of {{total}} messages have been deleted._one": "Видалено {{count}} з {{total}} повідомлень.",
"{{count}} out of {{total}} messages have been deleted._other": "Видалено {{count}} з {{total}} повідомлень.",
"{{count}} out of {{total}} messages have been reported as spam._one": "Позначено як спам {{count}} з {{total}} повідомлень.",
"{{count}} out of {{total}} messages have been reported as spam._other": "Позначено як спам {{count}} з {{total}} повідомлень.",
"{{count}} out of {{total}} threads are now starred._one": "Позначено {{count}} з {{total}} обговорень.",
"{{count}} out of {{total}} threads are now starred._other": "Позначено {{count}} з {{total}} обговорень.",
"{{count}} out of {{total}} threads have been archived._one": "Архівовано {{count}} з {{total}} обговорень.",
"{{count}} out of {{total}} threads have been archived._other": "Архівовано {{count}} з {{total}} обговорень.",
"{{count}} out of {{total}} threads have been deleted._one": "Видалено {{count}} з {{total}} обговорень.",
"{{count}} out of {{total}} threads have been deleted._other": "Видалено {{count}} з {{total}} обговорень.",
"{{count}} out of {{total}} threads have been reported as spam._one": "Позначено як спам {{count}} з {{total}} обговорень.",
"{{count}} out of {{total}} threads have been reported as spam._other": "Позначено як спам {{count}} з {{total}} обговорень.",
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Correct Ukrainian pluralization forms for "out of {{total}}" messages.

The _one and _other pluralization variants have identical translations, which produces grammatically incorrect Ukrainian. The noun following {{count}} must match the number.

For example, line 38-39 currently has:

  • _one: "Позначено {{count}} з {{total}} повідомлень."
  • _other: "Позначено {{count}} з {{total}} повідомлень."

This produces incorrect text like "Позначено 1 повідомлень" (wrong: genitive plural with singular count). Should be:

  • _one: "Позначено {{count}} повідомлення з {{total}} повідомлень." (nominative singular)
  • _other: "Позначено {{count}} повідомлень з {{total}} повідомлень." (genitive plural)

This pattern affects all keys on lines 38-53 (messages/threads starred/archived/deleted/reported as spam), and similar issues appear in:

  • Lines 24-25, 28-29, 34-35: "messages mentioning you"
  • Lines 56-57, 62-63, 66-67: "results mentioning you"
  • Lines 84-85, 88-89, 92-93, 96-97: "unread messages/results mentioning you"
  • Lines 433-434: "Move {{count}} threads"
📝 Example corrections for lines 38-39
-  "{{count}} out of {{total}} messages are now starred._one": "Позначено {{count}} з {{total}} повідомлень.",
+  "{{count}} out of {{total}} messages are now starred._one": "Позначено {{count}} повідомлення з {{total}} повідомлень.",
   "{{count}} out of {{total}} messages are now starred._other": "Позначено {{count}} повідомлень з {{total}} повідомлень.",
🤖 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 38 - 53, The
Ukrainian plural forms for the keys like "{{count}} out of {{total}} messages
are now starred._one/_other" (and the similar keys for archived/deleted/reported
and threads, plus the other affected groups mentioned) are incorrect because
both variants use genitive plural; update each "_one" variant to use the
singular noun form and natural word order (e.g., "_one": "Позначено {{count}}
повідомлення з {{total}} повідомлень.") and keep "_other" as the genitive plural
form (e.g., "_other": "Позначено {{count}} повідомлень з {{total}}
повідомлень."); apply the same singular vs plural adjustment for all affected
translation keys referenced in the comment (messages/threads starred, archived,
deleted, reported as spam; messages/results mentioning you; unread variants; and
"Move {{count}} threads") so the noun after {{count}} matches the count.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 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 630-631: The Russian pluralization is wrong: update the two
translation keys so the singular form uses the correct instrumental singular and
the plural uses instrumental plural; change "Shared between {{count}}
mailboxes_one" value to "Общий доступ между {{count}} почтовым ящиком" and
change "Shared between {{count}} mailboxes_other" value to "Общий доступ между
{{count}} почтовыми ящиками" (refer to the keys "Shared between {{count}}
mailboxes_one" and "Shared between {{count}} mailboxes_other").

In `@src/frontend/public/locales/common/uk-UA.json`:
- Around line 13-14: The translation for the key "{{author}} assigned you,
themself and {{assignees}}_other" omits "вас" and thus changes the meaning;
update the value for that key to include "вас" so it mirrors the intent of
"{{author}} assigned you, themself and {{assignees}}_one" (e.g., use a phrasing
like "{{author}} призначає учасником вас, себе та {{assignees}}" or another
grammatically correct variant that includes "вас" and "{{assignees}}") while
keeping the existing "{{author}} assigned you, themself and {{assignees}}_one"
entry unchanged.
🪄 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: c28c02dd-ddb6-4245-a846-5b6edf6d2b5e

📥 Commits

Reviewing files that changed from the base of the PR and between 3c6c9cc and e0f290e.

⛔ 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/nl-NL.json
  • src/frontend/public/locales/common/ru-RU.json
  • src/frontend/public/locales/common/uk-UA.json
  • src/mta-in/pyproject.toml
  • src/mta-out/pyproject.toml
💤 Files with no reviewable changes (1)
  • src/frontend/public/locales/common/nl-NL.json

Comment on lines +630 to +631
"Shared between {{count}} mailboxes_one": "Общий доступ между {{count}} почтовых ящиков",
"Shared between {{count}} mailboxes_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.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix singular/plural grammar for “Shared between {{count}} mailboxes”.

Both variants currently use the same noun form; the _one string is incorrect for count=1.

💡 Suggested fix
-  "Shared between {{count}} mailboxes_one": "Общий доступ между {{count}} почтовых ящиков",
-  "Shared between {{count}} mailboxes_other": "Общий доступ между {{count}} почтовых ящиков",
+  "Shared between {{count}} mailboxes_one": "Общий доступ между {{count}} почтовым ящиком",
+  "Shared between {{count}} mailboxes_other": "Общий доступ между {{count}} почтовыми ящиками",
🤖 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 630 - 631, The
Russian pluralization is wrong: update the two translation keys so the singular
form uses the correct instrumental singular and the plural uses instrumental
plural; change "Shared between {{count}} mailboxes_one" value to "Общий доступ
между {{count}} почтовым ящиком" and change "Shared between {{count}}
mailboxes_other" value to "Общий доступ между {{count}} почтовыми ящиками"
(refer to the keys "Shared between {{count}} mailboxes_one" and "Shared between
{{count}} mailboxes_other").

Comment on lines +13 to +14
"{{author}} assigned you, themself and {{assignees}}_one": "{{author}} призначає учасником вас, себе та {{assignees}}",
"{{author}} assigned you, themself and {{assignees}}_other": "{{author}} призначає учасником себе та {{assignees}}",
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

_other assignment translation drops “you”.

The key includes “you, themself and {{assignees}}”, but the _other value omits “вас”, changing the intended meaning.

💡 Suggested fix
-  "{{author}} assigned you, themself and {{assignees}}_other": "{{author}} призначає учасником себе та {{assignees}}",
+  "{{author}} assigned you, themself and {{assignees}}_other": "{{author}} призначає учасником вас, себе та {{assignees}}",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"{{author}} assigned you, themself and {{assignees}}_one": "{{author}} призначає учасником вас, себе та {{assignees}}",
"{{author}} assigned you, themself and {{assignees}}_other": "{{author}} призначає учасником себе та {{assignees}}",
"{{author}} assigned you, themself and {{assignees}}_one": "{{author}} призначає учасником вас, себе та {{assignees}}",
"{{author}} assigned you, themself and {{assignees}}_other": "{{author}} призначає учасником вас, себе та {{assignees}}",
🤖 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 13 - 14, The
translation for the key "{{author}} assigned you, themself and
{{assignees}}_other" omits "вас" and thus changes the meaning; update the value
for that key to include "вас" so it mirrors the intent of "{{author}} assigned
you, themself and {{assignees}}_one" (e.g., use a phrasing like "{{author}}
призначає учасником вас, себе та {{assignees}}" or another grammatically correct
variant that includes "вас" and "{{assignees}}") while keeping the existing
"{{author}} assigned you, themself and {{assignees}}_one" entry unchanged.

Update all version files and changelog for minor release.
@jbpenrath jbpenrath merged commit 550af75 into main May 26, 2026
22 of 23 checks passed
@jbpenrath jbpenrath deleted the release/0.6.0 branch May 26, 2026 14:22
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