What happened?
On production 2.3.1 (build 184), Play Vitals reports 2 crash events (1 user) with:
java.lang.IllegalArgumentException
at android.icu.text.MessagePattern.parsePluralOrSelectStyle (MessagePattern.java:1157)
at android.icu.text.MessageFormat.applyPattern (MessageFormat.java:449)
at to.bitkit.ext.StringKt.formatPlural (String.kt:35)
at to.bitkit.repositories.BackupRepo$showBackupFailureNotification$1.invokeSuspend (BackupRepo.kt:440)
When periodic backup check detects failed backups, BackupRepo.showBackupFailureNotification() formats settings__backup__failed_message via ICU MessageFormat. Parsing the pattern throws before the error toast can be shown.
Expected behavior
Failed backup notification should display localized retry message (e.g. "Retrying in 1 minute") without crashing.
Steps to Reproduce
- Use Bitkit with locale set to a language with a malformed
settings__backup__failed_message translation (suspected: Italian, Czech).
- Trigger a VSS backup failure so
showBackupFailureNotification() runs (failed backup detected on periodic check).
- App crashes with
IllegalArgumentException in formatPlural.
Suspected malformed translations in repo:
values-it/strings.xml: {interval, plural, one {# minute} o {# minutes}} — uses o instead of ICU keyword other
values-cs/strings.xml: {interval, plural, one {# minute} dalších {# minutes}} — missing other branch keyword
English pattern (valid): {interval, plural, one {# minute} other {# minutes}}
Logs / Screenshots / Recordings
- Play Vitals screenshot (2026-07-13 weekly report)
- Stack trace above
Bitkit Version
2.3.1 (build 184) — production mainnet
Device / OS
Motorola ThinkPhone 25 by motorola, Android 16 (SDK 36). Likely non-English locale given suspected malformed ICU plural translations.
Reproducibility
Rarely (once or twice) — 1 user / 2 events on 2.3.1 since Jun 29 rollout. May be Always when backup fails + affected locale.
Additional context
What happened?
On production 2.3.1 (build 184), Play Vitals reports 2 crash events (1 user) with:
When periodic backup check detects failed backups,
BackupRepo.showBackupFailureNotification()formatssettings__backup__failed_messagevia ICUMessageFormat. Parsing the pattern throws before the error toast can be shown.Expected behavior
Failed backup notification should display localized retry message (e.g. "Retrying in 1 minute") without crashing.
Steps to Reproduce
settings__backup__failed_messagetranslation (suspected: Italian, Czech).showBackupFailureNotification()runs (failed backup detected on periodic check).IllegalArgumentExceptioninformatPlural.Suspected malformed translations in repo:
values-it/strings.xml:{interval, plural, one {# minute} o {# minutes}}— usesoinstead of ICU keywordothervalues-cs/strings.xml:{interval, plural, one {# minute} dalších {# minutes}}— missingotherbranch keywordEnglish pattern (valid):
{interval, plural, one {# minute} other {# minutes}}Logs / Screenshots / Recordings
Bitkit Version
2.3.1 (build 184) — production mainnet
Device / OS
Motorola ThinkPhone 25 by motorola, Android 16 (SDK 36). Likely non-English locale given suspected malformed ICU plural translations.
Reproducibility
Rarely (once or twice) — 1 user / 2 events on 2.3.1 since Jun 29 rollout. May be Always when backup fails + affected locale.
Additional context
formatPluralhas no try/catch; invalid translation pattern is fatal.settings__backup__failed_messagefor ICU plural syntax.