Replaces 23 of 41 runBlocking { getString } sites in commonMain across
the meta-details, collection, Trakt, profile, and TMDB code paths.
Wrapping suspend getString in runBlocking blocks the calling thread on
every property read or recomposition and deadlocks on Kotlin/JS.
Three patterns: propagate suspend up call chains that were already
fully suspend; mark non-Composable helpers @Composable + use
stringResource; and where the call sat in a data-class property
getter, use a literal English fallback (fires only on degenerate
addon manifests with no name and no URL-derived slug).
Also fixes MetaTrailer.type defaulting to a localized "Trailer"
string when missing — UI already handles blank type with a localized
fallback at render time, so the eager localization mismatched
grouping/sort keys across locales.
The 18 remaining sites are in androidMain platform-bridge callbacks
(OkHttp / ExoPlayer / NotificationManager) and are tracked as a
follow-up.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Synchronized strings.xml with the latest source strings.
- Fixed inconsistent terms to match the current app context.
- Added missing translation keys.
Added Indonesian (Bahasa Indonesia) translation to the project.
Files updated:
- Translated strings added to the `values-id` directory.
- Hooked up the new language option in `AppLanguage.kt`.
- Registered the `id` locale in Android's `locale_config.xml`.
`updates_downloading_progress` in values-fr/strings.xml used `%1$d%%` —
Compose Multiplatform Resources does NOT interpret `%%` as an escape
for a literal `%`. The runtime substitutes `%1$d` with the integer arg
and leaves the rest of the string verbatim, so the user sees
`Téléchargement 26%%` instead of `Téléchargement 26 %`.
Same change applied to two adjacent FR keys that already only had a
single trailing `%` (no doubled bug), but now also use NBSP (U+00A0)
before the symbol to match French typography:
- `streams_resume_from_percent`: `Reprendre depuis %1$d%` → `... %1$d %`
- `settings_playback_threshold_percentage_value`: `%1$s%` → `%1$s %`
EN strings keep `Downloading %1$d%` / `Resume from %1$d%` / `%1$s%`
(English convention: no space before `%`).
Port of NuvioMedia/NuvioTV#1704.
Adds a Sort Order setting to the Continue Watching section with two modes:
- Default: sort all items by most recently watched
- Streaming Style: released/in-progress items first (by recency), unaired
next-up items pushed to the end sorted by ascending air date
Adds the coil-svg KMP module dependency and registers SvgDecoder.Factory()
on the singleton ImageLoader in App.kt. coil-svg was never declared in
libs.versions.toml, so SVG payloads silently fell through Coil's decoder
chain and ended up as empty ImageDecoderException swallowed by AsyncImage.
Coil 3.x's coil-svg is a Kotlin Multiplatform module, so registering the
factory in commonMain covers Android and iOS in one place.
Affects:
- TMDB network/channel logos (TMDB serves a mix of PNG and SVG)
- Stremio addon manifests with an SVG `logo` field
- Custom artwork URLs in the collection editor that happen to be SVG
Mirrors the equivalent fix in NuvioTV (PR #1772).