Hebrew, Polish, Simplified Chinese, Traditional Chinese, Malay, Tamil,
and Ukrainian were only 10-12% translated (38-48 of 395 string keys),
falling back to English for nearly everything. Backfill each to 100%
(395/395 keys), including the two shared plurals (notification_and_more,
people_count) with locale-correct CLDR plural categories.
Also:
- Fix values-zh-rTW: ~27 keys in the verify_*/fingerprint_* block were
Simplified Chinese pasted into the Traditional Chinese file (e.g. 验证
instead of 驗證); corrected to proper Traditional Chinese script.
- Fix a leftover English verify_*/fingerprint_* block (~30 keys) present
in pl, ms, ta, uk that predated this change and wasn't part of the
originally-missing-key set.
- Fix values-pl version_prefix, mistranslated as "w%1$s" instead of
preserving the literal version-string prefix "v%1$s".
- Fix a duplicate-key bug in values-ms where a stale untranslated
<string name="notification_and_more"> coexisted with the new
<plurals name="notification_and_more">.
All translations are machine-translated (flagged as such via an
in-file comment: "pending native-speaker review") and should be
reviewed by fluent speakers before being considered final. Verified:
well-formed XML, exactly 395/395 keys with no duplicates in all 7
files, zero placeholder (%1$s/%2$d/etc.) mismatches against the
English source, and a clean `./gradlew :app:processDebugResources`
resource compile.
Relates to #737 (multilingual support request) — this addresses the
"languages already added but barely translated" half of that issue;
an in-app language switcher / android:localeConfig and a proper
community-translation pipeline (e.g. Weblate) are separate follow-ups.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Align the background location footer with the battery optimization layout so primary, check-again, and skip stay at the same height when navigating between them.
Co-authored-by: Cursor <cursoragent@cursor.com>
Addresses review feedback: the size-cap error was posted to the main
mesh timeline, so a user sending from a private chat or channel never
saw it. rejectIfOversized now posts to the private conversation
(addPrivateMessageNoUnread) or channel (addChannelMessage) the send
originated from, falling back to the main timeline for public sends.
Adds regression tests for both routings.
- MediaSendingManager: surface a chat system message when a picked file
exceeds the ~10 MiB send cap instead of silently dropping the send
(voice/image/file paths), completing the 'user-visible failure'
requirement of the rollout gate
- BinaryProtocol: catch Exception instead of Throwable in decodeCore so
OutOfMemoryError is never swallowed and masked as a parse failure
- docs/file_transfer.md: mark the compressed-expansion rollout gate
resolved; support for legacy >10 MiB compressed transfers is
explicitly ended
Extract PeerColorStyle so each palette owns saturation/value, keeping
hues stable while dark mode stays bright-but-muted and light mode avoids
neon labels. New themes only need to supply their own style.
Co-authored-by: Cursor <cursoragent@cursor.com>
Keep disable at the sheet footer so enabling is next to nearby channels while turning location off stays a secondary action.
Co-authored-by: Cursor <cursoragent@cursor.com>
- header star wobbles and its outline turns orange when the peer
favorites you; it only fills once you favorite them back
- mirror the 'favorited you' system notice into the private
conversation (mesh path), matching the main chat
- expose reactive peerFavoritedUs state driven by
FavoritesPersistenceService; keep system notices silent
(no unread badge, read receipt or push)
Show ic_spec_lock_open while idle or handshaking, then Crossfade to the
closed lock on success or failure — timed with the existing tint wash so
the shackle settling reads as one smooth transition.
Co-authored-by: Cursor <cursoragent@cursor.com>