Migrates 13 additional user-facing English literals found across 7 files
in a follow-up audit. Adds 13 new keys (EN + FR) and replaces the inline
literals with `getString(...)` / `runBlocking { getString(...) }`
depending on context.
- RuntimeFormat: episode / runtime hours+minutes template (`%dh %dm`,
`%dh`, `%dm` → resource-backed; FR uses `%d h %d min`).
- SearchRepository: `require {}` empty-result message now hits
`search_error_no_results_for_catalog` instead of the inline literal.
- PluginRepository: `already installed`, install-failed, refresh-failed
fallback messages.
- PluginManifestParser: three `require {}` validation messages (name,
version, providers).
- AddonManifestParser: `Manifest missing "<name>"` exception now uses
`addons_manifest_missing_field`.
- PlayerEngine.ios: `MPV not available — Please rebuild the app` →
`player_error_mpv_unavailable`.
- YoutubeChunkedDataSourceFactory: the developer-facing `No DataSpec`
exception is replaced by a user-friendly `Unable to play this stream.`
message that's safe to render through `onPlayerError.localizedMessage`.
FR translations follow existing conventions (tutoiement, curly apostrophes,
NBSP inside `« »`, internal branch names kept out of user-facing copy).
Migrates the long tail of user-facing English literals identified by the
audit report — 65 new keys across 14 source files plus the matching FR
translations (tutoiement, NBSP, curly apostrophes).
Categories:
- TMDB filter placeholders in CollectionEditorScreen (10 keys, "28,12",
"2020-01-01", "100", "en, ko, ja, hi", etc.)
- Collection editor titles & errors in CollectionEditorRepository
(TMDB/Trakt fallback titles, validation errors, "Could not load …")
- Folder type labels in FolderDetailRepository ("Trakt Series List",
"Trakt Movie List")
- TMDB resolver errors (api key required, not found, missing IDs, discover
no data) in TmdbCollectionSourceResolver
- Trakt public list resolver errors and search-result fallbacks in
TraktPublicListSourceResolver (rate limit, not public, items/likes
counts, credentials missing, error_with_code formatter)
- Comments load failure in TraktCommentsRepository
- Trakt status messages (Connected/Disconnected) in TraktAuthRepository
- AppUpdater exceptions (no release, github api error, missing tag,
no APK asset) — also strips the "cmp-rewrite" branch name from the
user-facing copy
- HTTP error fallbacks shared by both AddonPlatform.{android,ios}.kt
("Request failed with HTTP %d", "Empty response body")
- AndroidAppUpdaterPlatform download/install errors
- iOS DownloadsPlatformDownloader file/HTTP errors
- SubtitleRepository addon-subtitle display format
- DownloadsLiveStatusPlatform.android Pause action (reuses
compose_action_pause) and the byte-unit table (now includes
unit_bytes_tb)
Non-Composable suspend bodies use the existing `getString(...)` pattern;
synchronous bodies (constructors, lambda inits) use the established
`runBlocking { getString(...) }` pattern already in the codebase.
Keys that overlap with #943 (the FR overhaul PR) use the exact same
names so the eventual merge is a no-op on those.