i18n(fr): extract platform stubs + audit FR quality (pass 4)

Extract hardcoded strings (23 sites in 9 platform-specific files):
- AppUpdaterPlatform stubs (iOS, Desktop, Android Playstore)
- PluginRepository stubs (iOS App Store, Android Playstore) + main fullCommonMain
- AddonRepository.normalizeManifestUrl require message
- CollectionEditorRepository dynamic titles (TMDB Collection/List/Production/
  Network/Person/Director + Trakt List fallback)
- ExternalPlayerPlatform.android.kt (Android system player label)

New keys added (2):
- collections_editor_trakt_list_title_format (Trakt List %1$s)
- external_player_android_system (Android system player)

Reused existing keys (8): updates_not_available, plugins_error_unavailable_build,
plugins_error_enter_valid_url, plugins_error_provider_not_found,
plugins_error_enter_repo_url, addons_error_enter_url, and 6 tmdb_*_title_format.

Audit FR quality (1719 strings) — 26 corrections + 68 apostrophe normalizations:
- Fix 3 residual vouvoiement (Controlez/Enrichissez/Programmez → tu)
- Fix 2 imperative conjugations (Parcoure→Parcours, Inclut→Inclus)
- Fix 2 placeholder type bugs (%1$d→%1$s where String input)
- Fix 1 trailing space, 1 double negation calque
- Harmonize "Plus comme ceci"→"À voir aussi", flux→stream, Jun/Jul→Juin/Juil.,
  rate limit "debit"→"requetes", "Crédits de personne TMDB"→"Crédits TMDB de la personne"
- Improve 7 anglicisms (en focus→focus sur, indice→indication UI, etc.)
- Normalize 68 lines: ' → ’ typographic (192 typo / 0 droite)

Parity EN ↔ FR: 1719 strings, 2 plurals.
Builds: composeApp:compileFullDebugKotlinAndroid + compilePlaystoreDebugKotlinAndroid
both SUCCESSFUL. xmllint OK on both XML files.

Merged origin/cmp-rewrite to integrate PR #1173 (release alert badge + dropped-show
filtering for CW section), resolving conflicts in strings.xml EN+FR.
This commit is contained in:
Stéphane 2026-05-25 21:12:33 +02:00
parent fa9528d3a7
commit a258b8c12e
11 changed files with 164 additions and 117 deletions

View file

@ -6,6 +6,10 @@ import android.content.Intent
import android.net.Uri
import android.os.Bundle
import androidx.core.content.FileProvider
import kotlinx.coroutines.runBlocking
import nuvio.composeapp.generated.resources.Res
import nuvio.composeapp.generated.resources.external_player_android_system
import org.jetbrains.compose.resources.getString
import java.io.File
import java.net.URI
@ -21,7 +25,12 @@ internal actual object ExternalPlayerPlatform {
actual fun defaultPlayerId(): String? = AndroidSystemPlayerId
actual fun availablePlayers(): List<ExternalPlayerApp> =
listOf(ExternalPlayerApp(AndroidSystemPlayerId, "Android system player"))
listOf(
ExternalPlayerApp(
AndroidSystemPlayerId,
runBlocking { getString(Res.string.external_player_android_system) },
),
)
actual fun open(
request: ExternalPlayerPlaybackRequest,

View file

@ -3,6 +3,9 @@ package com.nuvio.app.features.plugins
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import nuvio.composeapp.generated.resources.Res
import nuvio.composeapp.generated.resources.plugins_error_unavailable_build
import org.jetbrains.compose.resources.getString
actual object PluginRepository {
private val disabledState = MutableStateFlow(PluginsUiState(pluginsEnabled = false))
@ -18,7 +21,7 @@ actual object PluginRepository {
actual suspend fun pullFromServer(profileId: Int) = Unit
actual suspend fun addRepository(rawUrl: String): AddPluginRepositoryResult =
AddPluginRepositoryResult.Error("Plugins are not available in this build.")
AddPluginRepositoryResult.Error(getString(Res.string.plugins_error_unavailable_build))
actual fun removeRepository(manifestUrl: String) = Unit
@ -35,7 +38,7 @@ actual object PluginRepository {
actual fun getEnabledScrapersForType(type: String): List<PluginScraper> = emptyList()
actual suspend fun testScraper(scraperId: String): Result<List<PluginRuntimeResult>> =
Result.failure(UnsupportedOperationException("Plugins are not available in this build."))
Result.failure(UnsupportedOperationException(getString(Res.string.plugins_error_unavailable_build)))
actual suspend fun executeScraper(
scraper: PluginScraper,
@ -44,5 +47,5 @@ actual object PluginRepository {
season: Int?,
episode: Int?,
): Result<List<PluginRuntimeResult>> =
Result.failure(UnsupportedOperationException("Plugins are not available in this build."))
Result.failure(UnsupportedOperationException(getString(Res.string.plugins_error_unavailable_build)))
}

View file

@ -1,5 +1,10 @@
package com.nuvio.app.features.updater
import kotlinx.coroutines.runBlocking
import nuvio.composeapp.generated.resources.Res
import nuvio.composeapp.generated.resources.updates_not_available
import org.jetbrains.compose.resources.getString
actual object AppUpdaterPlatform {
actual val isSupported: Boolean = false
@ -13,12 +18,12 @@ actual object AppUpdaterPlatform {
assetUrl: String,
assetName: String,
onProgress: (downloadedBytes: Long, totalBytes: Long?) -> Unit,
): Result<String> = Result.failure(IllegalStateException("In-app updates are unavailable on this build."))
): Result<String> = Result.failure(IllegalStateException(getString(Res.string.updates_not_available)))
actual fun canRequestPackageInstalls(): Boolean = false
actual fun openUnknownSourcesSettings() = Unit
actual fun installDownloadedApk(path: String): Result<Unit> =
Result.failure(IllegalStateException("In-app updates are unavailable on this build."))
Result.failure(IllegalStateException(runBlocking { getString(Res.string.updates_not_available) }))
}

View file

@ -30,13 +30,13 @@
<string name="addons_badge_refreshing">Actualisation</string>
<string name="addons_badge_resources">%1$d ressources</string>
<string name="addons_badge_unavailable">Indisponible</string>
<string name="addons_configure">Configurer l'addon</string>
<string name="addons_delete">Supprimer l'addon</string>
<string name="addons_configure">Configurer laddon</string>
<string name="addons_delete">Supprimer laddon</string>
<string name="addons_empty_subtitle">Ajoute une URL de manifeste pour commencer à charger des catalogues, métadonnées, streams ou sous-titres dans Nuvio.</string>
<string name="addons_empty_title">Aucun addon installé.</string>
<string name="addons_error_enter_url">Saisis une URL d'addon.</string>
<string name="addons_input_placeholder">URL de l'addon</string>
<string name="addons_install_button">Installer l'addon</string>
<string name="addons_error_enter_url">Saisis une URL daddon.</string>
<string name="addons_input_placeholder">URL de laddon</string>
<string name="addons_install_button">Installer laddon</string>
<string name="addons_loading_manifest_details">Chargement des détails du manifeste…</string>
<string name="addons_modal_checking_message">Validation de lURL du manifeste et chargement des détails de laddon avant installation.</string>
<string name="addons_modal_checking_title">Vérification de laddon</string>
@ -62,7 +62,7 @@
<string name="collections_editor_add_catalog">Ajouter un catalogue</string>
<string name="collections_editor_add_folder">Ajouter un dossier</string>
<string name="collections_editor_all_genres">Tous les genres</string>
<string name="collections_editor_catalog_sources_empty_subtitle">Ajoute des catalogues depuis tes addons installés pour définir ce qu'affiche ce dossier.</string>
<string name="collections_editor_catalog_sources_empty_subtitle">Ajoute des catalogues depuis tes addons installés pour définir ce quaffiche ce dossier.</string>
<string name="collections_editor_catalog_sources_empty_title">Aucune source de catalogue</string>
<string name="collections_editor_choose_genre">Choisir</string>
<string name="collections_editor_cover_emoji">Emoji</string>
@ -73,7 +73,7 @@
<string name="collections_editor_done">Terminé</string>
<string name="collections_editor_edit_collection">Modifier la collection</string>
<string name="collections_editor_edit_folder">Modifier le dossier</string>
<string name="collections_editor_folder_editor_help">Configure l'identité, la présentation et les sources de catalogue du dossier avec la même structure que l'éditeur principal de collections.</string>
<string name="collections_editor_folder_editor_help">Configure lidentité, la présentation et les sources de catalogue du dossier avec la même structure que léditeur principal de collections.</string>
<string name="collections_editor_folder_empty_subtitle">Ajoutes-en un pour commencer.</string>
<string name="collections_editor_folder_empty_title">Aucun dossier</string>
<string name="collections_editor_folders">Dossiers</string>
@ -92,7 +92,7 @@
<string name="collections_editor_section_appearance">Apparence</string>
<string name="collections_editor_section_basics">Informations de base</string>
<string name="collections_editor_section_catalog_sources">Sources de catalogue</string>
<string name="collections_editor_select_catalogs_description">Choisis les catalogues d'addon que ce dossier doit regrouper.</string>
<string name="collections_editor_select_catalogs_description">Choisis les catalogues daddon que ce dossier doit regrouper.</string>
<string name="collections_editor_select_catalogs">Sélectionner des catalogues</string>
<string name="collections_editor_select_genre">Sélectionner un genre</string>
<string name="collections_editor_selected_count">%1$d sélectionné(s)</string>
@ -118,14 +118,14 @@
<string name="collections_editor_tmdb_person_mode">Personne</string>
<string name="collections_editor_tmdb_director_mode">Réalisateur</string>
<string name="collections_editor_tmdb_custom_mode">Personnalisé</string>
<string name="collections_editor_tmdb_help_presets">Choisis une source prédéfinie. Tu peux la modifier ou la supprimer après l'avoir ajoutée.</string>
<string name="collections_editor_tmdb_help_list">Colle une URL de liste publique TMDB ou uniquement le numéro de l'URL.</string>
<string name="collections_editor_tmdb_help_presets">Choisis une source prédéfinie. Tu peux la modifier ou la supprimer après lavoir ajoutée.</string>
<string name="collections_editor_tmdb_help_list">Colle une URL de liste publique TMDB ou uniquement le numéro de lURL.</string>
<string name="collections_editor_tmdb_help_production">Cherche par nom de studio, ou colle un ID/URL de société TMDB et ajoute-le directement.</string>
<string name="collections_editor_tmdb_help_network">Saisis un ID de chaîne. Les chaînes courantes sont disponibles dans les préréglages et les filtres rapides.</string>
<string name="collections_editor_tmdb_help_collection">Cherche le nom d'une collection de films ou colle l'ID de collection TMDB.</string>
<string name="collections_editor_tmdb_help_collection">Cherche le nom dune collection de films ou colle lID de collection TMDB.</string>
<string name="collections_editor_tmdb_help_person">Saisis un ID ou une URL de personne TMDB pour créer une ligne à partir des crédits de casting.</string>
<string name="collections_editor_tmdb_help_director">Saisis un ID ou une URL de personne TMDB pour créer une ligne à partir des crédits de réalisation.</string>
<string name="collections_editor_tmdb_help_discover">Crée une ligne TMDB dynamique avec des filtres optionnels. Laisse les champs vides si tu n'as pas besoin de ce filtre.</string>
<string name="collections_editor_tmdb_help_discover">Crée une ligne TMDB dynamique avec des filtres optionnels. Laisse les champs vides si tu nas pas besoin de ce filtre.</string>
<string name="collections_editor_tmdb_public_list">Liste publique TMDB</string>
<string name="collections_editor_tmdb_network_id">ID de chaîne</string>
<string name="collections_editor_tmdb_collection_id">ID de collection</string>
@ -158,7 +158,7 @@
<string name="collections_editor_tmdb_both">Les deux</string>
<string name="collections_editor_tmdb_sort">Tri</string>
<string name="collections_editor_tmdb_filters">Filtres</string>
<string name="collections_editor_tmdb_filters_helper">Laisse les champs vides si tu n'as pas besoin de ce filtre.</string>
<string name="collections_editor_tmdb_filters_helper">Laisse les champs vides si tu nas pas besoin de ce filtre.</string>
<string name="collections_editor_tmdb_quick_genres">Genres rapides</string>
<string name="collections_editor_tmdb_quick_languages">Langues rapides</string>
<string name="collections_editor_tmdb_quick_countries">Pays rapides</string>
@ -168,7 +168,7 @@
<string name="collections_editor_tmdb_genres">ID de genre</string>
<string name="collections_editor_tmdb_genres_helper">Utilise des numéros de genre TMDB. Sépare plusieurs valeurs par des virgules pour ET, ou des barres verticales pour OU.</string>
<string name="collections_editor_tmdb_date_from">Date de sortie ou de diffusion depuis</string>
<string name="collections_editor_tmdb_date_to">Date de sortie ou de diffusion jusqu'au</string>
<string name="collections_editor_tmdb_date_to">Date de sortie ou de diffusion jusquau</string>
<string name="collections_editor_tmdb_date_helper">Utilise le format AAAA-MM-JJ, ex. 2024-01-01.</string>
<string name="collections_editor_tmdb_rating_min">Note minimale</string>
<string name="collections_editor_tmdb_rating_max">Note maximale</string>
@ -179,7 +179,7 @@
<string name="collections_editor_tmdb_votes_helper">Utilise ceci pour éviter les titres peu connus avec peu de votes. Exemple : 100.</string>
<string name="collections_editor_tmdb_language">Langue originale</string>
<string name="collections_editor_tmdb_language_helper">Utilise des codes de langue à deux lettres, ex. en, ko, ja, hi.</string>
<string name="collections_editor_tmdb_country">Pays d'origine</string>
<string name="collections_editor_tmdb_country">Pays dorigine</string>
<string name="collections_editor_tmdb_country_helper">Utilise des codes de pays à deux lettres, ex. US, KR, JP, IN.</string>
<string name="collections_editor_tmdb_keywords">ID de mots-clés</string>
<string name="collections_editor_tmdb_keywords_helper">Utilise des numéros de mots-clés TMDB. Les puces rapides remplissent des exemples courants.</string>
@ -263,7 +263,7 @@
<string name="collections_editor_tmdb_watch_region_helper">Code pays ISO 3166-1 où le titre est disponible. Exemple : US, GB.</string>
<string name="collections_editor_tmdb_quick_watch_regions">Régions rapides</string>
<string name="collections_editor_tmdb_watch_providers">ID des fournisseurs de visionnage</string>
<string name="collections_editor_tmdb_watch_providers_helper">Utilise les ID de fournisseurs de visionnage TMDB. Sépare-les par des virgules pour ET, ou par des pipes pour OU.</string>
<string name="collections_editor_tmdb_watch_providers_helper">Utilise les ID de fournisseurs de visionnage TMDB. Sépare-les par des virgules pour ET, ou par des barres verticales pour OU.</string>
<string name="collections_editor_tmdb_watch_providers_placeholder">8|337|350</string>
<string name="collections_editor_tmdb_quick_watch_providers">Fournisseurs rapides</string>
<string name="collections_editor_tmdb_watch_provider_netflix">Netflix</string>
@ -298,7 +298,7 @@
<string name="compose_action_on">Activé</string>
<string name="compose_action_pause">Pause</string>
<string name="compose_action_reload">Recharger</string>
<string name="compose_auth_already_have_account">Tu as déjà un compte ? </string>
<string name="compose_auth_already_have_account">Tu as déjà un compte ?</string>
<string name="compose_auth_continue_without_account">Continuer sans compte</string>
<string name="compose_auth_create_account">Créer un compte</string>
<string name="compose_auth_dont_have_account">Pas encore de compte ? </string>
@ -308,7 +308,7 @@
<string name="compose_auth_sign_in_subtitle">Connecte-toi pour accéder à ta bibliothèque et ta progression</string>
<string name="compose_auth_sign_in">Se connecter</string>
<string name="compose_auth_sign_up_subtitle">Inscris-toi pour synchroniser tes données entre appareils</string>
<string name="compose_auth_sign_up">S'inscrire</string>
<string name="compose_auth_sign_up">Sinscrire</string>
<string name="compose_auth_store_locally">Tes données seront uniquement stockées localement</string>
<string name="compose_auth_tagline">Regarde tout, partout</string>
<string name="compose_auth_welcome_back">Bon retour</string>
@ -377,7 +377,7 @@
<string name="compose_search_empty_no_active_addons_title">Aucun addon actif</string>
<string name="compose_search_empty_no_results_message">Les catalogues installés nont retourné aucun résultat pour cette requête.</string>
<string name="compose_search_empty_no_results_title">Aucun résultat trouvé</string>
<string name="compose_search_empty_no_search_catalogs_message">Tes addons installés n'exposent pas de catalogue de recherche.</string>
<string name="compose_search_empty_no_search_catalogs_message">Tes addons installés nexposent pas de catalogue de recherche.</string>
<string name="compose_search_empty_no_search_catalogs_title">Aucun catalogue de recherche</string>
<string name="compose_search_placeholder">Rechercher des films, séries…</string>
<string name="compose_search_recent_searches">Recherches récentes</string>
@ -390,7 +390,7 @@
<string name="compose_settings_page_content_discovery">Contenu et découverte</string>
<string name="compose_settings_page_continue_watching">Continuer à regarder</string>
<string name="compose_settings_page_debrid">Services connectés</string>
<string name="compose_settings_page_homescreen">Écran d'accueil</string>
<string name="compose_settings_page_homescreen">Écran daccueil</string>
<string name="compose_settings_page_integrations">Intégrations</string>
<string name="compose_settings_page_licenses_attributions">Licences et attributions</string>
<string name="compose_settings_page_mdblist_ratings">Notes MDBList</string>
@ -406,15 +406,15 @@
<string name="compose_settings_root_about_section">À PROPOS</string>
<string name="compose_settings_root_account_description">Gère ton compte, déconnecte-toi ou supprime-le.</string>
<string name="compose_settings_root_account_section">COMPTE</string>
<string name="compose_settings_root_appearance_description">Ajuste la présentation de l'accueil et les préférences visuelles.</string>
<string name="compose_settings_root_check_updates_description">Rechercher de nouvelles versions de l'application.</string>
<string name="compose_settings_root_appearance_description">Ajuste la présentation de laccueil et les préférences visuelles.</string>
<string name="compose_settings_root_check_updates_description">Rechercher de nouvelles versions de lapplication.</string>
<string name="compose_settings_root_check_updates_title">Vérifier les mises à jour</string>
<string name="compose_settings_root_content_discovery_description">Gère les addons et sources de découverte.</string>
<string name="compose_settings_root_downloads_description">Gère tes films et épisodes téléchargés.</string>
<string name="compose_settings_root_downloads_title">Téléchargements</string>
<string name="compose_settings_root_general_section">GÉNÉRAL</string>
<string name="compose_settings_root_integrations_description">Connecte les services TMDB et MDBList.</string>
<string name="compose_settings_root_notifications_description">Gère les alertes de sortie d'épisodes et envoie une notification de test.</string>
<string name="compose_settings_root_notifications_description">Gère les alertes de sortie dépisodes et envoie une notification de test.</string>
<string name="compose_settings_root_switch_profile_description">Basculer vers un profil différent.</string>
<string name="compose_settings_root_switch_profile_title">Changer de profil</string>
<string name="compose_settings_root_trakt_description">Connecte Trakt, synchronise des listes et enregistre des titres directement dans Trakt.</string>
@ -495,7 +495,7 @@
<string name="settings_account_email">Adresse e-mail</string>
<string name="settings_account_not_signed_in">Non connecté</string>
<string name="settings_account_sign_out">Se déconnecter</string>
<string name="settings_account_sign_out_confirm_message">Tu seras redirigé vers l'écran de connexion.</string>
<string name="settings_account_sign_out_confirm_message">Tu seras redirigé vers lécran de connexion.</string>
<string name="settings_account_sign_out_confirm_title">Se déconnecter ?</string>
<string name="settings_account_status">Statut</string>
<string name="settings_account_status_anonymous">Anonyme</string>
@ -513,11 +513,11 @@
<string name="settings_appearance_section_theme">THÈME</string>
<string name="settings_homescreen_collection_with_addon">Collection • %1$s</string>
<string name="settings_homescreen_display_name">Nom affiché</string>
<string name="settings_homescreen_empty_message">Installe un addon avec des catalogues compatibles avec les tableaux pour configurer les lignes de l'écran d'accueil.</string>
<string name="settings_homescreen_empty_title">Aucun catalogue d'accueil</string>
<string name="settings_homescreen_empty_message">Installe un addon avec des catalogues compatibles avec les tableaux pour configurer les lignes de lécran daccueil.</string>
<string name="settings_homescreen_empty_title">Aucun catalogue daccueil</string>
<string name="settings_homescreen_hero_source">Source Hero</string>
<string name="settings_homescreen_hidden">Masqué</string>
<string name="settings_homescreen_keep_home_focused">Garder laccueil en focus</string>
<string name="settings_homescreen_keep_home_focused">Garder le focus sur laccueil</string>
<string name="settings_homescreen_limit_reached">%1$s • Limite atteinte (max. %2$d)</string>
<string name="settings_homescreen_no_sources_selected">Aucune source Hero sélectionnée</string>
<string name="settings_homescreen_not_in_hero">Absent du Hero</string>
@ -532,7 +532,7 @@
<string name="settings_homescreen_section_hero_sources">SOURCES HERO</string>
<string name="settings_homescreen_selected_count">%1$d sur %2$d sélectionnés</string>
<string name="settings_homescreen_show_hero">Afficher le Hero</string>
<string name="settings_homescreen_show_hero_description">Afficher un carrousel Hero en vedette en haut de l'accueil. Choisis jusqu'à 2 catalogues sources ci-dessous.</string>
<string name="settings_homescreen_show_hero_description">Afficher un carrousel Hero en vedette en haut de laccueil. Choisis jusquà 2 catalogues sources ci-dessous.</string>
<string name="layout_hide_unreleased">Masquer le contenu non sorti</string>
<string name="layout_hide_unreleased_sub">Masque les films et séries qui ne sont pas encore sortis.</string>
<string name="settings_homescreen_hide_catalog_underline">Masquer le soulignement des catalogues</string>
@ -548,7 +548,7 @@
<string name="settings_poster_custom">Personnalisé</string>
<string name="settings_poster_description">Ajuste la largeur des cartes et le rayon des coins.</string>
<string name="settings_poster_hide_labels">Masquer les étiquettes</string>
<string name="settings_poster_landscape_mode">Mode paysage pour les affiches dans les rayons</string>
<string name="settings_poster_landscape_mode">Affiches en mode paysage</string>
<string name="settings_poster_live_preview">Aperçu en direct</string>
<string name="settings_poster_option_with_value">%1$s (%2$s)</string>
<string name="settings_poster_preview_corner_radius">Rayon de coin : %1$ddp</string>
@ -566,11 +566,11 @@
<string name="settings_poster_width_large">Grand</string>
<string name="settings_poster_width_standard">Standard</string>
<string name="settings_show_secret">Afficher la valeur</string>
<string name="settings_continue_watching_resume_prompt_description">Afficher une invite pour reprendre là où tu en étais à l'ouverture de l'application après avoir quitté le lecteur.</string>
<string name="settings_continue_watching_resume_prompt_description">Afficher une invite pour reprendre là où tu en étais à louverture de lapplication après avoir quitté le lecteur.</string>
<string name="settings_continue_watching_resume_prompt_title">Invite de reprise au démarrage</string>
<string name="settings_continue_watching_blur_next_up_description">Floute les vignettes du prochain épisode dans Continuer à regarder pour éviter les spoilers.</string>
<string name="settings_continue_watching_blur_next_up_title">Flouter le contenu non vu dans Continuer à regarder</string>
<string name="settings_continue_watching_show_unaired_next_up_description">Inclut les épisodes à venir dans Continuer à regarder avant leur diffusion.</string>
<string name="settings_continue_watching_show_unaired_next_up_description">Inclus les épisodes à venir dans Continuer à regarder avant leur diffusion.</string>
<string name="settings_continue_watching_show_unaired_next_up_title">Afficher les épisodes à venir non diffusés</string>
<string name="settings_continue_watching_section_sort_order">ORDRE DE TRI</string>
<string name="settings_continue_watching_sort_mode_title">Ordre de tri</string>
@ -578,7 +578,7 @@
<string name="settings_continue_watching_sort_mode_default_desc">Trier tous les éléments par récence</string>
<string name="settings_continue_watching_sort_mode_streaming">Style streaming</string>
<string name="settings_continue_watching_sort_mode_streaming_desc">Éléments sortis dabord, à venir à la fin</string>
<string name="settings_continue_watching_section_card_style">STYLE DE CARTE D'AFFICHE</string>
<string name="settings_continue_watching_section_card_style">STYLE DE CARTE DAFFICHE</string>
<string name="settings_continue_watching_section_on_launch">AU DÉMARRAGE</string>
<string name="settings_continue_watching_section_up_next_behavior">COMPORTEMENT DE LA SUITE</string>
<string name="settings_continue_watching_section_visibility">VISIBILITÉ</string>
@ -588,25 +588,25 @@
<string name="settings_continue_watching_style_poster_description">Carte daffiche centrée sur la couverture</string>
<string name="settings_continue_watching_style_wide">Large</string>
<string name="settings_continue_watching_style_wide_description">Carte horizontale riche en informations</string>
<string name="settings_continue_watching_up_next_description">Quand activé, La suite reprend toujours depuis l'épisode le plus avancé vu. Quand désactivé, suit l'épisode le plus récemment visionné. Utile si tu revois des épisodes précédents.</string>
<string name="settings_continue_watching_up_next_title">La suite depuis l'épisode le plus avancé</string>
<string name="settings_continue_watching_up_next_description">Quand activé, La suite reprend toujours depuis lépisode le plus avancé vu. Quand désactivé, suit lépisode le plus récemment visionné. Utile si tu revois des épisodes précédents.</string>
<string name="settings_continue_watching_up_next_title">La suite depuis lépisode le plus avancé</string>
<string name="settings_continue_watching_use_episode_thumbnails_description">Préfère les vignettes dépisode quand elles sont disponibles.</string>
<string name="settings_continue_watching_use_episode_thumbnails_title">Préférer les vignettes dépisode dans Continuer à regarder</string>
<string name="settings_content_discovery_section_home">ACCUEIL</string>
<string name="settings_content_discovery_section_sources">SOURCES</string>
<string name="settings_content_discovery_addons_description">Installe, supprime, mets à jour et ordonne tes sources de contenu.</string>
<string name="settings_content_discovery_plugins_description">Installe des dépôts de scrapers JavaScript et teste des fournisseurs en interne.</string>
<string name="settings_content_discovery_homescreen_description">Contrôlez quels catalogues apparaissent à l'accueil et dans quel ordre.</string>
<string name="settings_content_discovery_homescreen_description">Contrôle quels catalogues apparaissent à laccueil et dans quel ordre.</string>
<string name="settings_content_discovery_meta_screen_description">Désactive des sections de détails et réorganise tout sous le Hero.</string>
<string name="settings_content_discovery_collections_description">Crée des regroupements de catalogues personnalisés avec des dossiers affichés à l'accueil.</string>
<string name="settings_content_discovery_collections_description">Crée des regroupements de catalogues personnalisés avec des dossiers affichés à laccueil.</string>
<string name="settings_integrations_section_title">INTÉGRATIONS</string>
<string name="settings_integrations_tmdb_description">Enrichissez les pages de détails avec de l'art, des crédits, des métadonnées d'épisodes et plus depuis TMDB.</string>
<string name="settings_integrations_mdblist_description">Ajoute des notes externes d'IMDb, Rotten Tomatoes, Metacritic et d'autres aux pages de détails.</string>
<string name="settings_integrations_tmdb_description">Enrichis les pages de détails avec de lart, des crédits, des métadonnées dépisodes et plus depuis TMDB.</string>
<string name="settings_integrations_mdblist_description">Ajoute des notes externes dIMDb, Rotten Tomatoes, Metacritic et dautres aux pages de détails.</string>
<string name="settings_integrations_debrid_description">Connecte des comptes pour les liens et laccès à la bibliothèque</string>
<string name="settings_debrid_section_title">Services connectés</string>
<string name="settings_debrid_experimental_notice">Ces intégrations sont expérimentales et peuvent être conservées, modifiées ou supprimées plus tard.</string>
<string name="settings_debrid_cloud_library">Cloud library</string>
<string name="settings_debrid_cloud_library_description">Parcoure et lis les fichiers déjà présents dans tes comptes connectés.</string>
<string name="settings_debrid_cloud_library_description">Parcours et lis les fichiers déjà présents dans tes comptes connectés.</string>
<string name="settings_debrid_enable">Résoudre les liens lisibles</string>
<string name="settings_debrid_enable_description">Demande à un service connecté des liens lisibles quand un résultat le nécessite. Cela peut ajouter lélément à ce service.</string>
<string name="settings_debrid_resolve_with">Résoudre avec</string>
@ -648,7 +648,7 @@
<string name="settings_debrid_formatter_reset_subtitle">Restaurer la mise en forme par défaut des résultats.</string>
<string name="settings_debrid_key_valid">Clé API validée.</string>
<string name="settings_debrid_key_invalid">Impossible de valider cette clé API.</string>
<string name="settings_mdb_add_api_key_first">Ajoute ta clé API MDBList ci-dessous avant d'activer les notes.</string>
<string name="settings_mdb_add_api_key_first">Ajoute ta clé API MDBList ci-dessous avant dactiver les notes.</string>
<string name="settings_mdb_api_key_description">Obtiens une clé sur https://mdblist.com/preferences et colle-la ici.</string>
<string name="settings_mdb_api_key_label">Clé API</string>
<string name="settings_mdb_api_key_title">Clé API MDBList</string>
@ -658,7 +658,7 @@
<string name="settings_mdb_section_rating_providers">FOURNISSEURS DE NOTES</string>
<string name="settings_mdb_section_title">MDBLIST</string>
<string name="settings_meta_actions">Actions</string>
<string name="settings_meta_actions_description">Contrôles de lecture et d'enregistrement.</string>
<string name="settings_meta_actions_description">Contrôles de lecture et denregistrement.</string>
<string name="settings_meta_cast">Casting</string>
<string name="settings_meta_cast_description">Liste principale du casting.</string>
<string name="settings_meta_cinematic_background">Fond cinématographique</string>
@ -669,18 +669,18 @@
<string name="settings_meta_comments_description">Section de commentaires Trakt.</string>
<string name="settings_meta_details">Détails</string>
<string name="settings_meta_details_description">Durée, statut, date de sortie, langue et informations associées.</string>
<string name="settings_meta_episode_cards">Cartes d'épisodes</string>
<string name="settings_meta_episode_cards_description">Choisis comment les épisodes sont affichés sur l'écran de métadonnées.</string>
<string name="settings_meta_episode_cards">Cartes dépisodes</string>
<string name="settings_meta_episode_cards_description">Choisis comment les épisodes sont affichés sur lécran de métadonnées.</string>
<string name="settings_meta_episode_style_horizontal">Horizontal</string>
<string name="settings_meta_episode_style_horizontal_description">Cartes en ligne style fond</string>
<string name="settings_meta_episode_style_list">Liste</string>
<string name="settings_meta_episode_style_list_description">Cartes empilées centrées sur les détails</string>
<string name="settings_meta_episodes">Épisodes</string>
<string name="settings_meta_episodes_description">Saisons et liste d'épisodes pour les séries.</string>
<string name="settings_meta_episodes_description">Saisons et liste dépisodes pour les séries.</string>
<string name="settings_meta_blur_unwatched_episodes">Flouter les épisodes non vus</string>
<string name="settings_meta_blur_unwatched_episodes_description">Floute les vignettes dépisodes jusquà leur visionnage pour éviter les spoilers.</string>
<string name="settings_meta_group_label">Groupe %1$d</string>
<string name="settings_meta_more_like_this">Plus comme ceci</string>
<string name="settings_meta_more_like_this">À voir aussi</string>
<string name="settings_meta_more_like_this_description">Visuels de recommandations TMDB sur la page de détail.</string>
<string name="settings_meta_none">Aucun</string>
<string name="settings_meta_overview">Aperçu</string>
@ -695,8 +695,8 @@
<string name="settings_meta_trailers">Bandes-annonces</string>
<string name="settings_meta_trailers_description">Rayon de bandes-annonces et raccourcis de lecture.</string>
<string name="settings_notifications_disabled_in_app">Les notifications sont actuellement désactivées dans Nuvio.</string>
<string name="settings_notifications_episode_release_alerts">Alertes de sortie d'épisodes</string>
<string name="settings_notifications_episode_release_alerts_description">Programmez des notifications locales lorsqu'un nouvel épisode d'une série sauvegardée est disponible.</string>
<string name="settings_notifications_episode_release_alerts">Alertes de sortie dépisodes</string>
<string name="settings_notifications_episode_release_alerts_description">Programme des notifications locales lorsquun nouvel épisode dune série sauvegardée est disponible.</string>
<string name="settings_notifications_permission_disabled">Les notifications système sont désactivées pour Nuvio. Active-les pour recevoir des alertes et des notifications de test.</string>
<string name="settings_notifications_scheduled_count">Il y a actuellement %1$d alertes de sortie programmées sur cet appareil.</string>
<string name="settings_notifications_section_alerts">ALERTES</string>
@ -704,11 +704,11 @@
<string name="settings_notifications_send_test">Envoyer une notification de test</string>
<string name="settings_notifications_sending_test">Envoi de la notification de test…</string>
<string name="settings_notifications_test_for_title">Envoyer une notification locale de test pour %1$s.</string>
<string name="settings_notifications_test_requires_saved_show">Sauvegarde d'abord une série dans ta bibliothèque pour tester les notifications.</string>
<string name="settings_notifications_test_requires_saved_show">Enregistre dabord une série dans ta bibliothèque pour tester les notifications.</string>
<string name="settings_notifications_test_title">Notification de test</string>
<string name="community_section_title">Communauté</string>
<string name="community_section_description">Découvre les personnes qui construisent et soutiennent Nuvio sur Mobile, TV et Web.</string>
<string name="community_supporters_not_configured">L'API des supporters n'est pas configurée. Ajoute DONATIONS_BASE_URL dans local.properties.</string>
<string name="community_supporters_not_configured">LAPI des supporters nest pas configurée. Ajoute DONATIONS_BASE_URL dans local.properties.</string>
<string name="community_tab_contributors">Contributeurs</string>
<string name="community_tab_supporters">Supporters</string>
<string name="community_open_github">Ouvrir GitHub</string>
@ -730,8 +730,8 @@
<string name="community_month_mar">Mar</string>
<string name="community_month_apr">Avr</string>
<string name="community_month_may">Mai</string>
<string name="community_month_jun">Jun</string>
<string name="community_month_jul">Jul</string>
<string name="community_month_jun">Juin</string>
<string name="community_month_jul">Juil.</string>
<string name="community_month_aug">Aoû</string>
<string name="community_month_sep">Sep</string>
<string name="community_month_oct">Oct</string>
@ -775,10 +775,10 @@
<string name="settings_playback_invalid_regex_pattern">Modèle regex invalide</string>
<string name="settings_playback_last_link_cache_duration">Durée du cache du dernier lien</string>
<string name="settings_playback_map_dv7_to_hevc">Mapper DV7 vers HEVC</string>
<string name="settings_playback_map_dv7_to_hevc_description">Utiliser Dolby Vision Profil 7 vers HEVC comme alternative pour les appareils non compatibles.</string>
<string name="settings_playback_map_dv7_to_hevc_description">Convertir Dolby Vision Profil 7 en HEVC standard pour les appareils non compatibles.</string>
<string name="settings_playback_minutes_before_end">Minutes avant la fin</string>
<string name="settings_playback_minutes_before_end_description">Afficher la carte de lépisode suivant ce nombre de minutes avant la fin.</string>
<string name="settings_playback_minutes_value">%1$d min</string>
<string name="settings_playback_minutes_value">%1$s min</string>
<string name="settings_playback_no_items_available">Aucun élément disponible</string>
<string name="settings_playback_not_set">Non défini</string>
<string name="settings_playback_option_default">Par défaut</string>
@ -855,16 +855,16 @@
<string name="settings_playback_threshold_mode_percentage">Pourcentage</string>
<string name="settings_playback_threshold_percentage">Pourcentage de seuil</string>
<string name="settings_playback_threshold_percentage_description">Afficher la carte de lépisode suivant lorsque la lecture atteint ce pourcentage.</string>
<string name="settings_playback_threshold_percentage_value">%1$d%</string>
<string name="settings_playback_threshold_percentage_value">%1$s %</string>
<string name="settings_playback_timeout_instant">Instantané</string>
<string name="settings_playback_timeout_seconds">%1$ds</string>
<string name="settings_playback_timeout_unlimited">Illimité</string>
<string name="settings_playback_tunneled_playback">Lecture tunnelisée</string>
<string name="settings_playback_tunneled_playback_description">Active la lecture tunnelisée pour une latence réduite dans la synchronisation audio/vidéo.</string>
<string name="settings_tmdb_add_api_key_first">Ajoute ta propre clé API TMDB ci-dessous avant d'activer l'enrichissement.</string>
<string name="settings_tmdb_add_api_key_first">Ajoute ta propre clé API TMDB ci-dessous avant dactiver lenrichissement.</string>
<string name="settings_tmdb_api_key_label">Clé API TMDB</string>
<string name="settings_tmdb_enable_enrichment">Activer l'enrichissement TMDB</string>
<string name="settings_tmdb_enable_enrichment_description">Utiliser ta clé API TMDB pour enrichir les métadonnées de l'addon sur l'écran de détails lorsqu'un ID TMDB ou IMDb est disponible.</string>
<string name="settings_tmdb_enable_enrichment">Activer lenrichissement TMDB</string>
<string name="settings_tmdb_enable_enrichment_description">Utiliser ta clé API TMDB pour enrichir les métadonnées de laddon sur lécran de détails lorsquun ID TMDB ou IMDb est disponible.</string>
<string name="settings_tmdb_enter_api_key">Saisis ta clé API v3 TMDB.</string>
<string name="settings_tmdb_language_code_label">Code de langue</string>
<string name="settings_tmdb_module_artwork">Visuels</string>
@ -879,7 +879,7 @@
<string name="settings_tmdb_module_details_description">Utiliser les informations de sortie, durée, classification, statut, pays et langue de TMDB.</string>
<string name="settings_tmdb_module_episodes">Épisodes</string>
<string name="settings_tmdb_module_episodes_description">Utiliser les titres, miniatures, descriptions et durées des épisodes de TMDB pour les séries.</string>
<string name="settings_tmdb_module_more_like_this">Plus comme ceci</string>
<string name="settings_tmdb_module_more_like_this">À voir aussi</string>
<string name="settings_tmdb_module_more_like_this_description">Visuels de recommandations TMDB sur la page de détail.</string>
<string name="settings_tmdb_module_networks">Chaînes</string>
<string name="settings_tmdb_module_networks_description">Utiliser les métadonnées des chaînes TMDB pour les titres TV.</string>
@ -910,8 +910,8 @@
<string name="settings_trakt_intro_description">Suis ce que tu regardes, enregistre dans ta liste ou tes listes personnalisées et garde ta bibliothèque synchronisée avec Trakt.</string>
<string name="settings_trakt_missing_credentials">Identifiants Trakt manquants dans local.properties (TRAKT_CLIENT_ID / TRAKT_CLIENT_SECRET).</string>
<string name="settings_trakt_open_login">Ouvrir la connexion Trakt</string>
<string name="settings_trakt_save_actions_description">Tes actions d'enregistrement peuvent maintenant cibler la watchlist Trakt et tes listes personnelles.</string>
<string name="settings_trakt_sign_in_description">Connecte-toi avec Trakt pour activer la sauvegarde basée sur les listes et le mode bibliothèque Trakt.</string>
<string name="settings_trakt_save_actions_description">Tes actions denregistrement peuvent maintenant cibler la watchlist Trakt et tes listes personnelles.</string>
<string name="settings_trakt_sign_in_description">Connecte-toi à Trakt pour activer lenregistrement par liste et le mode bibliothèque Trakt.</string>
<string name="trakt_library_source_title">Source de la bibliothèque</string>
<string name="trakt_library_source_subtitle">Choisis quelle bibliothèque utiliser pour enregistrer et consulter ta collection</string>
<string name="trakt_library_source_dialog_title">Source de la bibliothèque</string>
@ -1045,19 +1045,19 @@
<string name="action_no">Non</string>
<string name="action_update">Mettre à jour</string>
<string name="action_yes">Oui</string>
<string name="app_exit_message">Veux-tu quitter l'application ?</string>
<string name="app_exit_title">Quitter l'application</string>
<string name="catalog_empty_message">Ce catalogue n'a renvoyé aucun élément.</string>
<string name="app_exit_message">Veux-tu quitter lapplication ?</string>
<string name="app_exit_title">Quitter lapplication</string>
<string name="catalog_empty_message">Ce catalogue na renvoyé aucun élément.</string>
<string name="catalog_empty_title">Aucun titre trouvé</string>
<string name="details_check_connection">Vérifie ta connexion WiFi ou données mobiles et réessaie.</string>
<string name="details_director">Réalisateur</string>
<string name="details_failed_to_load">Échec du chargement</string>
<string name="details_more_like_this">À voir aussi</string>
<string name="details_seasons">Saisons</string>
<string name="details_series_missing_numbers">Cet addon a renvoyé des vidéos pour la série, mais aucune n'incluait de numéros de saison ou d'épisode.</string>
<string name="details_series_no_metadata">Cet addon n'a fourni aucune métadonnée d'épisode pour cette série.</string>
<string name="details_series_unpublished">Cet addon n'a pas encore publié d'épisodes.</string>
<string name="details_servers_unreachable">Ton appareil est en ligne, mais Nuvio n'a pas pu se connecter aux serveurs nécessaires.</string>
<string name="details_series_missing_numbers">Cet addon a renvoyé des vidéos pour la série, mais aucune nincluait de numéros de saison ou dépisode.</string>
<string name="details_series_no_metadata">Cet addon na fourni aucune métadonnée dépisode pour cette série.</string>
<string name="details_series_unpublished">Cet addon na pas encore publié dépisodes.</string>
<string name="details_servers_unreachable">Ton appareil est en ligne, mais Nuvio na pas pu se connecter aux serveurs nécessaires.</string>
<string name="details_show_less">Afficher moins</string>
<string name="details_show_more">Afficher plus ▾</string>
<string name="details_writer">Scénariste</string>
@ -1070,7 +1070,7 @@
<string name="discover_empty_no_catalogs_title">Aucun catalogue de découverte</string>
<string name="discover_empty_no_results_message">Le catalogue et les filtres sélectionnés nont retourné aucun élément.</string>
<string name="discover_empty_no_results_title">Aucun titre trouvé</string>
<string name="discover_empty_no_active_addons_message">Installe et valide au moins un addon avant d'explorer les catalogues dans Découvrir.</string>
<string name="discover_empty_no_active_addons_message">Installe et valide au moins un addon avant dexplorer les catalogues dans Découvrir.</string>
<string name="discover_select_catalog">Sélectionner un catalogue</string>
<string name="discover_select_genre">Sélectionner un genre</string>
<string name="discover_select_type">Sélectionner un type</string>
@ -1084,11 +1084,11 @@
<string name="episode_mark_watched">Marquer comme vu</string>
<string name="home_continue_watching_up_next">À suivre</string>
<string name="home_continue_watching_watched">%1$s vu</string>
<string name="home_empty_no_active_addons_message">Installe et valide au moins un addon avant de charger des lignes de catalogue à l'accueil.</string>
<string name="home_empty_no_rows_message">Les addons installés n'exposent actuellement aucun catalogue compatible avec le tableau sans extras requis.</string>
<string name="home_empty_no_rows_title">Aucune ligne d'accueil disponible</string>
<string name="home_empty_no_active_addons_message">Installe et valide au moins un addon avant de charger des lignes de catalogue à laccueil.</string>
<string name="home_empty_no_rows_message">Les addons installés nexposent actuellement aucun catalogue compatible avec le tableau sans extras requis.</string>
<string name="home_empty_no_rows_title">Aucune ligne daccueil disponible</string>
<string name="home_view_details">Voir les détails</string>
<string name="meta_section_actions_description">Contrôles de lecture et d'enregistrement.</string>
<string name="meta_section_actions_description">Contrôles de lecture et denregistrement.</string>
<string name="meta_section_actions_title">Actions</string>
<string name="meta_section_cast_description">Liste principale du casting.</string>
<string name="meta_section_collection_description">Rayon de collection ou de franchise associée.</string>
@ -1125,7 +1125,7 @@
<string name="pin_forgot">Code PIN oublié ?</string>
<string name="pin_incorrect">Code PIN incorrect</string>
<string name="pin_locked_try_again">Bloqué. Réessaie dans %1$ds</string>
<string name="profile_avatar_options_pending">Les options d'avatar apparaîtront ici une fois le catalogue chargé.</string>
<string name="profile_avatar_options_pending">Les options davatar apparaîtront ici une fois le catalogue chargé.</string>
<string name="profile_avatar_selected">Avatar : %1$s</string>
<string name="profile_avatar_url_invalid">Saisis une URL dimage http:// ou https:// valide.</string>
<string name="profile_choose_avatar">Choisir un avatar</string>
@ -1152,7 +1152,7 @@
<string name="profile_remove_pin_lock">Supprimer le verrouillage PIN</string>
<string name="profile_saving">Enregistrement…</string>
<string name="profile_security">Sécurité</string>
<string name="profile_security_pin_disabled">Ajoute un code PIN si tu souhaites que ce profil soit verrouillé avant d'y accéder.</string>
<string name="profile_security_pin_disabled">Ajoute un code PIN si tu souhaites que ce profil soit verrouillé avant dy accéder.</string>
<string name="profile_security_pin_enabled">Ce profil est protégé par un code PIN.</string>
<string name="profile_select_avatar">Sélectionne un avatar pour ce profil.</string>
<string name="profile_set_pin_lock">Configurer le verrouillage PIN</string>
@ -1168,12 +1168,12 @@
<string name="streams_download_file">Télécharger le fichier</string>
<string name="streams_open_external_player">Ouvrir dans le lecteur externe</string>
<string name="streams_open_internal_player">Ouvrir dans le lecteur interne</string>
<string name="streams_empty_load_failed_message">Les addons de streams installés n'ont pas renvoyé de réponse valide.</string>
<string name="streams_empty_load_failed_message">Les addons de streams installés nont pas renvoyé de réponse valide.</string>
<string name="streams_empty_load_failed_title">Impossible de charger les streams</string>
<string name="streams_empty_no_addons_message">Installe d'abord un addon pour charger les streams de ce titre.</string>
<string name="streams_empty_no_addons_message">Installe dabord un addon pour charger les streams de ce titre.</string>
<string name="streams_empty_no_stream_addon_message">Tes addons installés ne fournissent pas de streams pour ce type de titre.</string>
<string name="streams_empty_no_stream_addon_title">Aucun addon de streams disponible</string>
<string name="streams_empty_no_streams_message">Aucun de tes addons installés n'a renvoyé de stream pour ce titre.</string>
<string name="streams_empty_no_streams_message">Aucun de tes addons installés na renvoyé de stream pour ce titre.</string>
<string name="streams_episode_badge">S%1$d E%2$d</string>
<string name="streams_episode_fallback_title">Épisode</string>
<string name="streams_episode_title_with_name">S%1$dE%2$d - %3$s</string>
@ -1203,9 +1203,9 @@
<string name="updates_check_failed">Échec de la vérification des mises à jour</string>
<string name="updates_download_failed">Échec du téléchargement</string>
<string name="updates_downloading_progress">Téléchargement %1$d %</string>
<string name="updates_install_failed">Impossible de démarrer l'installation</string>
<string name="updates_install_failed">Impossible de démarrer linstallation</string>
<string name="updates_latest_version">Tu utilises la version la plus récente.</string>
<string name="updates_message_allow_installs">Active l'installation d'applications pour Nuvio puis reviens pour continuer.</string>
<string name="updates_message_allow_installs">Active linstallation dapplications pour Nuvio puis reviens pour continuer.</string>
<string name="updates_message_downloading">Téléchargement de la mise à jour…</string>
<string name="updates_message_no_updates">Aucune mise à jour trouvée.</string>
<string name="updates_message_ready">Une nouvelle version est prête à être installée.</string>
@ -1216,7 +1216,7 @@
<string name="updates_title_available">Mise à jour disponible</string>
<string name="updates_title_status">Statut de la mise à jour</string>
<string name="addon_already_installed">Cet addon est déjà installé.</string>
<string name="addon_invalid_url">Saisis une URL d'addon valide</string>
<string name="addon_invalid_url">Saisis une URL daddon valide</string>
<string name="addon_load_manifest_failed">Impossible de charger le manifeste</string>
<string name="app_brand_name">Nuvio</string>
<string name="auth_account_deletion_failed">Impossible de supprimer le compte</string>
@ -1228,7 +1228,7 @@
<string name="continue_watching_up_next_episode">À suivre • S%1$dE%2$d</string>
<string name="detail_logo_content_description">Logo de %1$s</string>
<string name="details_comments_load_failed">Impossible de charger les commentaires</string>
<string name="details_load_failed_all_addons">Impossible de charger les détails depuis aucun addon.</string>
<string name="details_load_failed_all_addons">Impossible de charger les détails depuis les addons disponibles.</string>
<string name="details_networks">Chaînes</string>
<string name="details_no_addon_meta">Aucun addon ne fournit de métadonnées pour ce contenu.</string>
<string name="download_failed">Échec du téléchargement</string>
@ -1253,7 +1253,7 @@
<string name="profile_pin_changed_requires_refresh">Le code PIN de ce profil a changé. Connecte-toi une fois pour mettre à jour le verrouillage sur cet appareil.</string>
<string name="profile_pin_clear_failed">Impossible de supprimer le verrouillage PIN. Réessaie.</string>
<string name="profile_pin_clear_requires_internet">Connecte-toi à Internet pour supprimer le verrouillage PIN.</string>
<string name="profile_pin_offline_verification_requires_online">Ce code PIN ne peut pas encore être vérifié hors ligne sur cet appareil. Connecte-toi une fois et déverrouille-le en ligne d'abord.</string>
<string name="profile_pin_offline_verification_requires_online">Ce code PIN ne peut pas encore être vérifié hors ligne sur cet appareil. Connecte-toi une fois et déverrouille-le en ligne dabord.</string>
<string name="profile_pin_set_failed">Impossible de définir le code PIN. Réessaie.</string>
<string name="profile_pin_set_requires_internet">Connecte-toi à Internet pour définir un code PIN.</string>
<string name="profile_primary_addons_required">Ce profil utilise les addons principaux.</string>
@ -1278,7 +1278,7 @@
<string name="trakt_public_list_missing_id">ID de liste Trakt manquant</string>
<string name="trakt_public_list_missing_numeric_id">La liste Trakt ninclut pas dID numérique</string>
<string name="trakt_public_list_not_found_or_not_public">Liste Trakt introuvable ou non publique</string>
<string name="trakt_public_list_rate_limit_reached">Limite de débit Trakt atteinte</string>
<string name="trakt_public_list_rate_limit_reached">Limite de requêtes Trakt atteinte</string>
<string name="trakt_public_list_request_failed">Échec de la requête Trakt</string>
<string name="trakt_sign_in_complete_failed">Impossible de terminer la connexion Trakt</string>
<string name="trakt_user_fallback">Utilisateur Trakt</string>
@ -1300,7 +1300,7 @@
<string name="tmdb_sources_missing_person_id">ID de personne TMDB manquant</string>
<string name="tmdb_sources_network_fallback_title">Chaîne TMDB %1$d</string>
<string name="tmdb_sources_network_not_found">Chaîne TMDB introuvable</string>
<string name="tmdb_sources_person_credits_not_found">Crédits de personne TMDB introuvables</string>
<string name="tmdb_sources_person_credits_not_found">Crédits TMDB de la personne introuvables</string>
<string name="tmdb_sources_person_fallback_title">Personne TMDB %1$d</string>
<string name="tmdb_sources_person_not_found">Personne TMDB introuvable</string>
<string name="generic_trailer">Bande-annonce</string>
@ -1337,8 +1337,8 @@
<string name="date_month_short_mar">Mar</string>
<string name="date_month_short_apr">Avr</string>
<string name="date_month_short_may">Mai</string>
<string name="date_month_short_jun">Jun</string>
<string name="date_month_short_jul">Jul</string>
<string name="date_month_short_jun">Juin</string>
<string name="date_month_short_jul">Juil.</string>
<string name="date_month_short_aug">Aoû</string>
<string name="date_month_short_sep">Sep</string>
<string name="date_month_short_oct">Oct</string>
@ -1425,7 +1425,7 @@
<string name="notifications_episode_release_body_code_title">%1$s • %2$s est maintenant disponible</string>
<string name="notifications_episode_release_body_generic">Un nouvel épisode est maintenant disponible</string>
<string name="notifications_episode_release_body_title">%1$s est maintenant disponible</string>
<string name="notifications_channel_episode_releases_name">Sorties d'épisodes</string>
<string name="notifications_channel_episode_releases_name">Sorties dépisodes</string>
<string name="parental_alcohol">Alcool/Drogues</string>
<string name="parental_frightening">Effrayant</string>
<string name="parental_nudity">Nudité</string>
@ -1470,7 +1470,7 @@
<string name="player_ios_preset_sdr_tone_mapped_label">SDR tone mapped</string>
<string name="player_ios_preset_sdr_tone_mapped_desc">Blancs et noirs plus prévisibles sur une sortie de type SDR.</string>
<string name="player_ios_preset_compatibility_label">Compatibilité</string>
<string name="player_ios_preset_compatibility_desc">Au plus proche de lancien comportement MPV iOS.</string>
<string name="player_ios_preset_compatibility_desc">Au plus près de lancien comportement MPV iOS.</string>
<string name="player_ios_preset_custom_label">Personnalisé</string>
<string name="player_ios_preset_custom_desc">Utilise tes valeurs avancées ci-dessous.</string>
<string name="player_ios_hardware_decoder_off">Désactivé</string>
@ -1479,7 +1479,7 @@
<string name="settings_playback_ios_hardware_decoder">Décodeur matériel</string>
<string name="settings_playback_ios_extended_dynamic_range">Plage dynamique étendue</string>
<string name="settings_playback_ios_extended_dynamic_range_desc">Mode de sortie Metal par défaut pour les nouvelles sessions de lecture.</string>
<string name="settings_playback_ios_display_color_hint">Indice de couleur daffichage</string>
<string name="settings_playback_ios_display_color_hint">Indication de couleur daffichage</string>
<string name="settings_playback_ios_display_color_hint_desc">Permettre à mpv de cibler par défaut lespace colorimétrique de lécran actif.</string>
<string name="settings_playback_ios_target_primaries">Primaires cibles</string>
<string name="settings_playback_ios_target_transfer">Transfert cible</string>
@ -1502,7 +1502,7 @@
<!-- Debrid sort profiles -->
<string name="settings_debrid_sort_default">Par défaut</string>
<string name="settings_debrid_sort_largest">Plus gros dabord</string>
<string name="settings_debrid_sort_smallest">Plus petit dabord</string>
<string name="settings_debrid_sort_smallest">Plus petits dabord</string>
<string name="settings_debrid_sort_best_audio">Meilleur audio dabord</string>
<string name="settings_debrid_sort_language">Langue dabord</string>
<!-- Debrid selection labels -->
@ -1629,7 +1629,7 @@
<string name="collections_editor_tmdb_production_title_format">Production TMDB %1$s</string>
<string name="collections_editor_tmdb_source_load_failed">Impossible de charger la source TMDB</string>
<string name="collections_editor_trakt_list_id_format">ID %1$s</string>
<string name="collections_tmdb_api_key_required">Ajoute une clé API TMDB dans les Paramètres pour utiliser les sources TMDB.</string>
<string name="collections_tmdb_api_key_required">Ajoute une clé API TMDB dans les paramètres pour utiliser les sources TMDB.</string>
<string name="collections_tmdb_collection_not_found">Collection TMDB introuvable</string>
<string name="collections_tmdb_company_not_found">Société TMDB introuvable</string>
<string name="collections_tmdb_discover_no_data">Découverte TMDB na retourné aucune donnée</string>
@ -1666,7 +1666,7 @@
<string name="network_request_failed_http">Échec de la requête (HTTP %1$d)</string>
<string name="player_addon_subtitle_display_format">%1$s (%2$s)</string>
<string name="player_error_mpv_unavailable">Moteur de lecture MPV indisponible. Reconstruis lapp.</string>
<string name="player_error_unable_to_play_stream">Impossible de lire ce flux.</string>
<string name="player_error_unable_to_play_stream">Impossible de lire ce stream.</string>
<string name="plugins_badge_disabled">Plugins désactivés</string>
<string name="plugins_badge_enabled">Plugins activés</string>
<string name="plugins_badge_providers">%1$d fournisseurs</string>
@ -1756,4 +1756,7 @@
</plurals>
<string name="cw_new_episode">Nouvel épisode</string>
<string name="cw_new_season">Nouvelle saison</string>
<!-- Pass 4 — platform stubs and dynamic title fallbacks -->
<string name="collections_editor_trakt_list_title_format">Liste Trakt %1$s</string>
<string name="external_player_android_system">Lecteur système Android</string>
</resources>

View file

@ -1752,4 +1752,7 @@
</plurals>
<string name="cw_new_episode">New Episode</string>
<string name="cw_new_season">New Season</string>
<!-- Pass 4 — platform stubs and dynamic title fallbacks -->
<string name="collections_editor_trakt_list_title_format">Trakt List %1$s</string>
<string name="external_player_android_system">Android system player</string>
</resources>

View file

@ -16,6 +16,7 @@ import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@ -497,7 +498,7 @@ private fun ensureManifestSuffix(url: String): String {
private fun normalizeManifestUrl(rawUrl: String): String {
val trimmed = rawUrl.trim()
require(trimmed.isNotEmpty()) { "Enter an addon URL." }
require(trimmed.isNotEmpty()) { runBlocking { getString(Res.string.addons_error_enter_url) } }
val normalizedScheme = when {
trimmed.startsWith("http://") || trimmed.startsWith("https://") -> trimmed

View file

@ -15,11 +15,18 @@ import nuvio.composeapp.generated.resources.Res
import nuvio.composeapp.generated.resources.collections_editor_media_movies_suffix
import nuvio.composeapp.generated.resources.collections_editor_media_series_suffix
import nuvio.composeapp.generated.resources.collections_editor_resolved_trakt_list
import nuvio.composeapp.generated.resources.collections_editor_tmdb_collection_title_format
import nuvio.composeapp.generated.resources.collections_editor_tmdb_director_title_format
import nuvio.composeapp.generated.resources.collections_editor_tmdb_discover
import nuvio.composeapp.generated.resources.collections_editor_tmdb_invalid_id_error
import nuvio.composeapp.generated.resources.collections_editor_tmdb_list_title_format
import nuvio.composeapp.generated.resources.collections_editor_tmdb_load_error
import nuvio.composeapp.generated.resources.collections_editor_tmdb_network_title_format
import nuvio.composeapp.generated.resources.collections_editor_tmdb_person_title_format
import nuvio.composeapp.generated.resources.collections_editor_tmdb_production_title_format
import nuvio.composeapp.generated.resources.collections_editor_trakt_id_url_required
import nuvio.composeapp.generated.resources.collections_editor_trakt_input_required
import nuvio.composeapp.generated.resources.collections_editor_trakt_list_title_format
import nuvio.composeapp.generated.resources.collections_editor_trakt_load_error
import nuvio.composeapp.generated.resources.collections_editor_trakt_no_lists_found
import org.jetbrains.compose.resources.getString
@ -423,7 +430,7 @@ object CollectionEditorRepository {
listOf(
TraktPublicListSearchResult(
traktListId = id,
title = metadata.title ?: "Trakt List $id",
title = metadata.title ?: getString(Res.string.collections_editor_trakt_list_title_format, id),
subtitle = getString(Res.string.collections_editor_resolved_trakt_list),
coverImageUrl = metadata.coverImageUrl,
),
@ -654,12 +661,12 @@ object CollectionEditorRepository {
val seriesSuffix = getString(Res.string.collections_editor_media_series_suffix)
val baseTitle = state.tmdbTitleInput.ifBlank {
when (sourceType) {
TmdbCollectionSourceType.LIST -> "TMDB List ${id ?: ""}".trim()
TmdbCollectionSourceType.COLLECTION -> "TMDB Collection ${id ?: ""}".trim()
TmdbCollectionSourceType.COMPANY -> "TMDB Production ${id ?: ""}".trim()
TmdbCollectionSourceType.NETWORK -> "TMDB Network ${id ?: ""}".trim()
TmdbCollectionSourceType.PERSON -> "TMDB Person ${id ?: ""}".trim()
TmdbCollectionSourceType.DIRECTOR -> "TMDB Director ${id ?: ""}".trim()
TmdbCollectionSourceType.LIST -> getString(Res.string.collections_editor_tmdb_list_title_format, id ?: "").trim()
TmdbCollectionSourceType.COLLECTION -> getString(Res.string.collections_editor_tmdb_collection_title_format, id ?: "").trim()
TmdbCollectionSourceType.COMPANY -> getString(Res.string.collections_editor_tmdb_production_title_format, id ?: "").trim()
TmdbCollectionSourceType.NETWORK -> getString(Res.string.collections_editor_tmdb_network_title_format, id ?: "").trim()
TmdbCollectionSourceType.PERSON -> getString(Res.string.collections_editor_tmdb_person_title_format, id ?: "").trim()
TmdbCollectionSourceType.DIRECTOR -> getString(Res.string.collections_editor_tmdb_director_title_format, id ?: "").trim()
TmdbCollectionSourceType.DISCOVER -> getString(Res.string.collections_editor_tmdb_discover)
}
}
@ -747,7 +754,7 @@ object CollectionEditorRepository {
return@launch
}
val title = state.traktTitleInput.ifBlank { resolved.title ?: "Trakt List $listId" }
val title = state.traktTitleInput.ifBlank { resolved.title ?: getString(Res.string.collections_editor_trakt_list_title_format, listId) }
addTraktSourcesToFolder(
sources = selectedTraktMediaTypes(state).map { mediaType ->
CollectionSource(

View file

@ -1,5 +1,10 @@
package com.nuvio.app.features.updater
import kotlinx.coroutines.runBlocking
import nuvio.composeapp.generated.resources.Res
import nuvio.composeapp.generated.resources.updates_not_available
import org.jetbrains.compose.resources.getString
actual object AppUpdaterPlatform {
actual val isSupported: Boolean = false
@ -13,12 +18,12 @@ actual object AppUpdaterPlatform {
assetUrl: String,
assetName: String,
onProgress: (downloadedBytes: Long, totalBytes: Long?) -> Unit,
): Result<String> = Result.failure(IllegalStateException("In-app updates are unavailable on this build."))
): Result<String> = Result.failure(IllegalStateException(getString(Res.string.updates_not_available)))
actual fun canRequestPackageInstalls(): Boolean = false
actual fun openUnknownSourcesSettings() = Unit
actual fun installDownloadedApk(path: String): Result<Unit> =
Result.failure(IllegalStateException("In-app updates are unavailable on this build."))
Result.failure(IllegalStateException(runBlocking { getString(Res.string.updates_not_available) }))
}

View file

@ -27,6 +27,9 @@ import kotlinx.serialization.json.buildJsonObject
import kotlinx.serialization.json.encodeToJsonElement
import kotlinx.serialization.json.put
import nuvio.composeapp.generated.resources.Res
import nuvio.composeapp.generated.resources.plugins_error_enter_repo_url
import nuvio.composeapp.generated.resources.plugins_error_enter_valid_url
import nuvio.composeapp.generated.resources.plugins_error_provider_not_found
import nuvio.composeapp.generated.resources.plugins_repository_already_installed
import nuvio.composeapp.generated.resources.plugins_repository_install_failed
import nuvio.composeapp.generated.resources.plugins_repository_refresh_failed
@ -151,7 +154,7 @@ actual object PluginRepository {
val manifestUrl = try {
normalizeManifestUrl(rawUrl)
} catch (error: IllegalArgumentException) {
return AddPluginRepositoryResult.Error(error.message ?: "Enter a valid plugin URL")
return AddPluginRepositoryResult.Error(error.message ?: getString(Res.string.plugins_error_enter_valid_url))
}
if (_uiState.value.repositories.any { it.manifestUrl == manifestUrl }) {
@ -300,7 +303,7 @@ actual object PluginRepository {
actual suspend fun testScraper(scraperId: String): Result<List<PluginRuntimeResult>> {
initialize()
val scraper = _uiState.value.scrapers.find { it.id == scraperId }
?: return Result.failure(IllegalArgumentException("Provider not found"))
?: return Result.failure(IllegalArgumentException(getString(Res.string.plugins_error_provider_not_found)))
val mediaType = if (scraper.supportsType("movie")) "movie" else "tv"
val season = if (mediaType == "tv") 1 else null
@ -570,7 +573,7 @@ actual object PluginRepository {
private fun normalizeManifestUrl(rawUrl: String): String {
val trimmed = rawUrl.trim()
require(trimmed.isNotEmpty()) { "Enter a plugin repository URL." }
require(trimmed.isNotEmpty()) { runBlocking { getString(Res.string.plugins_error_enter_repo_url) } }
val normalizedScheme = when {
trimmed.startsWith("http://") || trimmed.startsWith("https://") -> trimmed

View file

@ -3,6 +3,9 @@ package com.nuvio.app.features.plugins
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import nuvio.composeapp.generated.resources.Res
import nuvio.composeapp.generated.resources.plugins_error_unavailable_build
import org.jetbrains.compose.resources.getString
actual object PluginRepository {
private val disabledState = MutableStateFlow(PluginsUiState(pluginsEnabled = false))
@ -18,7 +21,7 @@ actual object PluginRepository {
actual suspend fun pullFromServer(profileId: Int) = Unit
actual suspend fun addRepository(rawUrl: String): AddPluginRepositoryResult =
AddPluginRepositoryResult.Error("Plugins are not available in this build.")
AddPluginRepositoryResult.Error(getString(Res.string.plugins_error_unavailable_build))
actual fun removeRepository(manifestUrl: String) = Unit
@ -35,7 +38,7 @@ actual object PluginRepository {
actual fun getEnabledScrapersForType(type: String): List<PluginScraper> = emptyList()
actual suspend fun testScraper(scraperId: String): Result<List<PluginRuntimeResult>> =
Result.failure(UnsupportedOperationException("Plugins are not available in this build."))
Result.failure(UnsupportedOperationException(getString(Res.string.plugins_error_unavailable_build)))
actual suspend fun executeScraper(
scraper: PluginScraper,
@ -44,5 +47,5 @@ actual object PluginRepository {
season: Int?,
episode: Int?,
): Result<List<PluginRuntimeResult>> =
Result.failure(UnsupportedOperationException("Plugins are not available in this build."))
Result.failure(UnsupportedOperationException(getString(Res.string.plugins_error_unavailable_build)))
}

View file

@ -1,5 +1,10 @@
package com.nuvio.app.features.updater
import kotlinx.coroutines.runBlocking
import nuvio.composeapp.generated.resources.Res
import nuvio.composeapp.generated.resources.updates_not_available
import org.jetbrains.compose.resources.getString
actual object AppUpdaterPlatform {
actual val isSupported: Boolean = false
@ -13,12 +18,12 @@ actual object AppUpdaterPlatform {
assetUrl: String,
assetName: String,
onProgress: (downloadedBytes: Long, totalBytes: Long?) -> Unit,
): Result<String> = Result.failure(IllegalStateException("In-app updates are unavailable on this build."))
): Result<String> = Result.failure(IllegalStateException(getString(Res.string.updates_not_available)))
actual fun canRequestPackageInstalls(): Boolean = false
actual fun openUnknownSourcesSettings() = Unit
actual fun installDownloadedApk(path: String): Result<Unit> =
Result.failure(IllegalStateException("In-app updates are unavailable on this build."))
Result.failure(IllegalStateException(runBlocking { getString(Res.string.updates_not_available) }))
}