goosemusic 1.3.2

A music player with YouTube search, local playback, and OS media controls
use super::Strings;
use crate::providers::ProviderId;

pub const STRINGS: Strings = Strings {
    search: "Rechercher",
    downloads: "Téléchargements",
    settings: "Paramètres",
    library: "Bibliothèque",
    nothing_saved_yet: "Rien n'est encore enregistré",
    new_playlist_name: "Nom de la nouvelle playlist",

    queue: "File d'attente",
    recently_played: "Écoutés récemment",
    now_playing_from: "Lecture en cours depuis",
    now_playing: "En lecture",
    up_next: "À venir",
    no_track_playing: "Aucune piste en lecture",
    no_more_tracks_in_queue: "Plus de pistes dans la file",
    no_recently_played_tracks: "Aucune piste écoutée récemment",

    not_playing: "Aucune lecture",
    no_tracks_found: "Aucune piste trouvée",

    searching: "Recherche…",
    loading: "Chargement…",
    load_more: "Charger plus",
    no_results_found: "Aucun résultat",
    no_recent_searches: "Aucune recherche récente",
    generating_radio: "Génération de la radio…",

    not_an_artist_page: "Ce n'est pas une page d'artiste",
    provided_by: "Fourni par",
    retry: "Réessayer",
    nothing_here: "Rien par ici",
    most_popular_songs: "Titres les plus populaires",
    albums: "Albums",
    playlists: "Playlists",
    fans_also_like: "Les fans aiment aussi",

    looking_up_lyrics: "Recherche des paroles…",
    play_a_track_for_lyrics: "Lisez une piste pour voir ses paroles.",
    lyrics_selectable: "Sélectionnable",
    lyrics_synced: "Synchronisées",
    lyrics_plain: "Simple",
    lyrics_translations: "Traductions",
    lyrics_original: "Original",
    add_custom: "Ajouter des paroles",
    lyrics_name: "Nom",
    translate_with_ai: "Traduire avec l'IA",
    translate_title: "Traduire les paroles avec l'IA",
    translate_language_lbl: "Langue cible",
    translate_prompt_lbl: "Prompt",
    translate_submit: "Traduire",
    translate_reset: "Réinitialiser le prompt",
    translating: "Traduction en cours…",
    translation_ready: "Traduction prête — relisez et enregistrez",
    translation_language_empty: "Saisissez une langue cible",
    no_lyrics_to_translate: "Aucunes paroles à traduire pour ce titre.",
    translation_not_configured: "Définissez l'URL du serveur et le modèle dans les paramètres.",
    translation_failed: |e| format!("Échec de la traduction : {e}"),
    sec_translation: "Traduction IA",
    translation_base_url_lbl: "URL du serveur (compatible OpenAI)",
    translation_api_key_lbl: "Clé API (vide pour les serveurs locaux)",
    translation_model_lbl: "Modèle",
    translation_refresh_models: "Récupérer la liste des modèles",
    translation_no_models: "Aucun modèle trouvé sur ce serveur.",
    translation_models_failed: |e| format!("Impossible de charger la liste des modèles : {e}"),
    edit_lyrics: "Modifier les paroles",
    lyrics_editor_hint: "Une ligne par parole. Préfixez avec [mm:ss.xx] pour des paroles synchronisées, ou laissez en clair. Ajoutez une ligne `# note` sous une parole pour afficher une note sous les paroles.",

    playlist_not_found: "Playlist introuvable",
    add_local: "Ajouter local",
    downloaded_tracks: "Pistes téléchargées",
    no_downloaded_tracks: "Aucune piste téléchargée",

    ctx_play: "Lire",
    ctx_play_local: "Lire le fichier local",
    ctx_edit: "Modifier",
    ctx_go_to_artist: "Aller à l'artiste",
    ctx_add_to_queue: "Ajouter à la file d'attente",
    ctx_add_to_playlist: "Ajouter à la playlist",
    ctx_download: "Télécharger",
    ctx_song_radio: "Radio du titre",
    ctx_artist_radio: "Radio de l'artiste",
    ctx_remove_from_queue: "Retirer de la file",
    ctx_remove_from_playlist: "Retirer de la playlist",
    ctx_remove_from_recent: "Retirer des récents",
    ctx_clear_cache: "Vider le cache",
    sub_play_via: "Lire via",
    sub_download_from: "Télécharger depuis",
    sub_via: "Via",
    sub_on: "Sur",
    sub_clear_cache_from: "Effacer de",
    via_search_suffix: "(recherche)",

    current: "(actuelle)",
    select: "sélectionner",
    find: "Rechercher",
    finding: "Recherche…",
    found_on: |p| format!("Trouvé sur {p}"),
    not_linked: "Non lié",
    providers: "Fournisseurs",
    no_provider_data: "Cette piste n'a aucune donnée de fournisseur.",
    save: "Enregistrer",
    cancel: "Annuler",
    edit_track: "Modifier la piste",
    lbl_title: "Titre",
    lbl_artist: "Artiste",
    ph_track_title: "Titre de la piste",
    ph_track_artist: "Artiste de la piste",
    delete: "Supprimer",
    delete_playlist_q: "Supprimer la playlist ?",
    tracks_wont_be_deleted: "Les pistes ne seront pas supprimées.",
    lbl_id: "ID",
    lbl_url: "URL",
    lbl_artist_id: "Id de l'artiste",
    lbl_duration_secs: "Durée (en secondes)",
    lbl_thumbnail: "Miniature",
    lbl_album: "Album",

    sec_playback: "Lecture",
    sec_storage: "Stockage",
    sec_history: "Historique",
    sec_appearance: "Apparence",
    sec_dependencies: "Dépendances",
    theme_lbl: "Thème",
    language_lbl: "Langue",
    default_provider_lbl: "Fournisseur de streaming et de téléchargement par défaut",
    cookie_browser_lbl: "Cookies du navigateur (vidéos soumises à une limite d’âge)",
    cookies_off: "Désactivé",
    normalize_volume_lbl: "Normaliser le volume entre les pistes",
    download_dir_lbl: "Dossier de téléchargement",
    cache_size_lbl: "Taille max. du cache de streaming (Mo)",
    hist_rows_lbl: "Lignes d'historique de recherche affichées",
    hist_entries_lbl: "Entrées d'historique de recherche conservées",
    recent_kept_lbl: "Pistes récemment écoutées conservées",
    reset_defaults: "Réinitialiser",

    find_in_list: "Rechercher dans la liste…",
    scope_songs: "Titres",
    scope_videos: "Vidéos",
    scope_artists: "Artistes",
    scope_albums: "Albums",
    scope_playlists: "Playlists",
    radio_word_song: "titre",
    radio_word_artist: "artiste",

    lyrics_copied: "Paroles copiées dans le presse-papiers",
    saved_to_library: "Enregistré dans la bibliothèque",
    removed_from_library: "Retiré de la bibliothèque",
    no_lyrics_found: "Aucune parole trouvée pour cette piste.",
    lyrics_saved: "Paroles personnalisées enregistrées",
    lyrics_deleted: "Paroles personnalisées supprimées",
    lyrics_empty: "Les paroles ne peuvent pas être vides",
    lyrics_name_empty: "Donnez un nom à vos paroles",
    select_playlist_drop: "Sélectionnez une playlist pour y déposer les pistes",
    reordered_playlist: "Playlist réorganisée",
    max_panes_reached: "Nombre maximal de volets atteint",

    n_saved: |n| format!("{n} enregistré{}", if n == 1 { "" } else { "s" }),
    n_plays: |n| format!("{} écoutes", crate::util::format_count(n)),
    search_placeholder: |p| match p {
        ProviderId::YouTube => "Rechercher sur YouTube Music…".into(),
        ProviderId::Local => "Rechercher…".into(),
        other => format!("Rechercher sur {}", other.label()),
    },
    added: |n| format!("Ajoutées {}", fr_tracks(n)),
    added_to: |n, to| format!("Ajoutées {} à {to}", fr_tracks(n)),
    removed_n: |n| format!("Retirées {}", fr_tracks(n)),
    removed_from: |n, from| format!("Retirées {} de {from}", fr_tracks(n)),
    pasted_into: |n, into| format!("Collées {} dans {into}", fr_tracks(n)),
    saved_title: |t| format!("« {t} » enregistré dans la bibliothèque"),
    playlist_created: |n| format!("Playlist « {n} » créée"),
    added_local: |n| format!("Ajoutées {} (sélectionnez une playlist pour les organiser)", fr_tracks(n)),
    downloading_n: |n| format!("Téléchargement de {}", fr_tracks(n)),
    resolving_on: |title, p| format!("Résolution de « {title} » sur {p}"),
    resolving_player_client: "Recherche d'un client lecteur compatible…",
    resolved_player_client: |c| format!("Client lecteur compatible : {c}"),
    player_client_unavailable: "Aucun client lecteur compatible trouvé, utilisation de celui par défaut…",
    provider_no_radio: |p| format!("{p} ne prend pas en charge la radio"),
    generating_radio_for: |w, name| format!("Génération de la radio pour {w} : {name}"),
    could_not_find_on: |name, p| format!("Impossible de trouver « {name} » sur {p}"),
    opening: |l| format!("Ouverture : {l}"),
    opening_artist: |name| format!("Ouverture de l'artiste : {name}"),
    download_complete: |path| format!("Téléchargement terminé ! Enregistré dans {path}"),
    failed_resolve_on: |title, p, e| format!("Échec de la résolution de « {title} » sur {p} : {e}"),
    couldnt_load: |e| format!("Impossible de charger : {e}"),
    couldnt_load_lyrics: |e| format!("Impossible de charger les paroles : {e}"),
    search_failed: |e| format!("Échec de la recherche : {e}"),
    cache_cleared_for: |p| format!("Cache effacé pour {p}"),
    radio_label: |w, name| format!("Radio ({w}) : {name}"),
    ctx_add_to_playlist_n: |n| format!("Ajouter {} à la playlist", fr_tracks(n)),
    ctx_add_to_queue_n: |n| format!("Ajouter {} à la file d'attente", fr_tracks(n)),
    ctx_download_n: |n| format!("Télécharger {}", fr_tracks(n)),
    ctx_remove_from_queue_n: |n| format!("Retirer {} de la file", fr_tracks(n)),
    ctx_remove_from_playlist_n: |n| format!("Retirer {} de la playlist", fr_tracks(n)),
    ctx_remove_from_recent_n: |n| format!("Retirer {} des récents", fr_tracks(n)),

    import_playlist: "Importer une playlist",
    import_method_native: "Native",
    import_method_filelist: "Liste de fichiers",
    import_method_csv: "CSV",
    import_native_hint: "Importe des playlists depuis un fichier playlists.json.",
    import_csv_name_col: "Colonne de nom",
    import_csv_artist_col: "Colonne d'artiste",
    import_csv_album_col: "Colonne d'album",
    import_csv_preset: "Préréglage",
    import_csv_preset_default: "Par défaut",
    import_csv_preset_exportify: "Exportify",
    import_csv_exportify_note: "Prend en charge les playlists Spotify exportées depuis https://exportify.net/.",
    import_pattern_lbl: "Motif de nom de fichier",
    import_playlist_name: "Nom de la playlist",
    import_add_pattern: "Ajouter un motif",
    import_select_file: "Sélectionner un fichier",
    import_select_folder: "Sélectionner un dossier",
    import_pattern_conflict: |a, b| {
        format!(
            "Les motifs « {a} » et « {b} » peuvent correspondre au même fichier avec des champs en conflit. Supprimez ou corrigez l'un d'eux."
        )
    },
    import_playlists_imported: |n| format!("Importées {}", fr_tracks(n)),
    import_imported_into: |n, into| format!("Importées {} dans {}", fr_tracks(n), into),
    import_no_tracks: "Aucune piste à importer.",
    import_no_match: "Aucun fichier ne correspond aux motifs.",
    import_bad_file: "Impossible de lire le fichier sélectionné.",

    deps_title: "Dépendances manquantes",
    deps_intro: "Certains outils utilisés par l'application sont manquants. Sélectionnez ceux à installer ou abandonnez pour continuer (la recherche et le streaming peuvent ne pas fonctionner tant qu'ils ne sont pas présents).",
    deps_install: "Installer",
    deps_install_selected: "Installer la sélection",
    deps_discard: "Abandonner",
    deps_installing: "Installation…",
    deps_installed: "Installé",
    deps_failed: "Échec",
    deps_installed_toast: "Dépendances sélectionnées installées.",
    deps_yt_dlp_desc: "Diffuse et télécharge l'audio (requis pour YouTube et SoundCloud)",
    deps_ytmusicapi_desc: "Recherche YouTube Music (optionnel, repli sur yt-dlp)",
    deps_python3_desc: "Requis par ytmusicapi (recherche YouTube Music)",
    deps_ytmusicapi_requires_python: "Nécessite Python 3 (à installer d'abord)",
    deps_play_requires_yt_dlp: "La lecture nécessite yt-dlp ; installez-le depuis la boîte de dialogue de démarrage pour lire ceci.",
    deps_source_not_playable: "Cette source ne peut pas être lue.",
    deps_found_section_title: "Trouvées sur votre système",
    deps_found_section_intro: "Celles-ci sont déjà disponibles. Cochez-en pour installer une copie gérée par l'application (la copie de l'application prime sur celle du système).",
    deps_found_on_system: "Trouvées sur votre système",
    deps_managed_by_app: "Installées (gérées par l'application)",
    deps_not_installed: "Non installées",
    deps_delete: "Supprimer",
    deps_deleting: "Suppression…",
    deps_deleted: "Supprimées",
    deps_delete_failed: "Échec de la suppression",

    sec_updates: "Mises à jour",
    check_for_updates: "Vérifier les mises à jour",
    checking_for_updates: "Recherche de mises à jour…",
    up_to_date: "À jour",
    current_version: |v| format!("Version {v}"),
    update_available: |v| format!("Version {v} disponible. Allez dans Paramètres pour mettre à jour."),
    update_now: "Mettre à jour",
    updating: "Mise à jour…",
    update_applied: |v| format!("Mis à jour vers {v}. Redémarrage…"),
    package_managed: "Impossible de mettre à jour automatiquement (pas d'accès en écriture dans le répertoire de l'application). Si installé via un gestionnaire de paquets, utilisez-le pour mettre à jour.",
    update_failed: |e| format!("Échec de la mise à jour : {e}"),
    percent: |pct| format!("{pct}%"),
    list_match_pos: |pos, total| format!("{pos}/{total}"),
    sub_menu_label: |base, provider, suffix| format!("{base} {provider} {suffix}"),
    deps_failed_detail: |e| format!("Failed: {e}"),
    deps_delete_failed_detail: |e| format!("Delete failed: {e}"),

    sc_title: "Raccourcis clavier",
    sc_sec_list: "Liste des titres",
    sc_move: "Naviguer dans la liste (en boucle)",
    sc_focus_panel: "Activer la file d'attente ou la liste",
    sc_first_last: "Première / dernière ligne",
    sc_page: "Page / demi-page",
    sc_play: "Lire le titre ciblé",
    sc_sec_select: "Sélection et édition",
    sc_extend: "Étendre la sélection",
    sc_toggle_sel: "Basculer la sélection de la ligne",
    sc_select_all: "Tout sélectionner dans la liste",
    sc_copy_paste: "Copier / coller les titres sélectionnés",
    sc_delete: "Supprimer les titres sélectionnés",
    sc_esc: "Fermer la fenêtre, puis effacer la sélection, puis retour à la recherche",
    sc_sec_search: "Recherche",
    sc_focus_search: "Aller à la recherche",
    sc_stage_provider: "Préparer le fournisseur (en attente)",
    sc_stage_scope: "Préparer la portée (en attente)",
    sc_run_search: "Lancer la recherche préparée",
    sc_find_list: "Recherche floue dans la liste (changer d'occurrence)",
    sc_sec_playlists: "Playlists et historique",
    sc_prev_next_pl: "Playlist précédente / suivante",
    sc_jump: "Sélecteur de playlist (Entrée ouvre, Maj+Entrée lit)",
    sc_back_fwd: "Précédent / suivant dans le volet",
    sc_sec_playback: "Lecture",
    sc_play_pause: "Lecture / pause",
    sc_next_prev: "Titre suivant / précédent",
    sc_mute: "Muet",
    sc_volume: "Baisser / monter le volume",
    sc_seek: "Reculer / avancer de 5 s (Maj : 10 s)",
    sc_toggles: "File d'attente / répétition / paroles / onglet file",
    sc_sec_panes: "Volets",
    sc_split: "Diviser côte à côte / empilé",
    sc_close_pane: "Fermer le volet",
    sc_adj_pane: "Cibler le volet adjacent",
    sc_cycle_pane: "Parcourir / sauter entre volets",
    sc_sec_menu: "Menu contextuel",
    sc_open_menu: "Ouvrir pour le titre ciblé",
    sc_nav_menu: "Naviguer dans le menu",
};

fn fr_tracks(n: usize) -> String {
    if n <= 1 {
        format!("{n} piste")
    } else {
        format!("{n} pistes")
    }
}