- Add New Episode / New Season badge to the Continue Watching next-up
cards, matching the NuvioTV implementation. Badge fires when a new
episode has aired after the user's last watched timestamp and within
the 60-day recency window.
- Filter shows that are marked as 'dropped' on Trakt from the Continue
Watching in-progress list, next-up seed candidates, and the
enrichment disk cache, matching NuvioTV behaviour.
- Add AirDateUtils.kt with calculateReleaseAlertState() and
parseReleaseDateToEpochMs() helpers used for both badge logic and
correct next-up sort ordering when a release alert is active.
- Persist isReleaseAlert / isNewSeasonRelease in CachedNextUpItem so
badge state survives cold starts without waiting for a full re-fetch.
- Extend translations for the badge strings (airs today / tomorrow /
in N days / on date) across de, el, es, fr, id, it, nb, pl, pt, tr,
cs and the default English strings.
- Add unit tests for parseReleaseDateToEpochMs, calculateReleaseAlertState
inputs/outputs, formatReleaseDateWithoutYear, isoCalendarDateOrNull,
daysUntilExplicitRelease, and isoEpochDay.
After cherry-picking pass3 changes on top of the 3 merged i18n PRs:
- Combined imports & merged code from both versions where compatible
- For CollectionEditorRepository.kt: kept pass3 version entirely (cleaner
scope.launch + getString flow vs runBlocking in #1025)
- For SubmitIntroDialog.kt: kept #943 convention (_label/_button suffixes)
- For TmdbCollectionSourceResolver.kt: merged all imports (#1025 + pass3)
- For PlayerControls.kt: kept #943 submit_intro_action key
- For PlaybackSettingsPage.kt: kept #943 pre-loaded invalidKeyMessage
- For CollectionEditorScreen.kt: kept new tmdb_country_placeholder key
- Added missing import in SubtitleRepository.kt
Strings.xml result: 1709 EN ↔ 1709 FR, 0 missing, 0 orphan, 0 vouvoiement.
Switch Norwegian locale code from "no" to the ISO 639-1 code "nb" for consistency. Updated Android locale_config.xml, renamed resource folder values-no to values-nb (strings moved/renamed accordingly), and changed the AppLanguage enum to use "nb". Also removed a now-duplicate media_series string entry in the renamed resources.
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.
8 EN keys added by upstream during the rebase had no FR counterpart:
- action_saving
- settings_debrid_dialog_placeholder / subtitle / title (Torbox API key dialog)
- settings_debrid_formatter_reset_title / subtitle (reset formatting row)
- settings_debrid_not_set
- settings_debrid_prepare_stream_count_warning (rate-limit warning copy)
Parity restored: 1459 keys EN ↔ FR.
PlayerControls.kt:271 (player header button to open SubmitIntroDialog)
now uses stringResource(Res.string.submit_intro_action), the existing
key already present in upstream strings (cmp-rewrite).