Add full set of locale translations

Generated using Claude Code / Codex so there may be errors
This commit is contained in:
2026-03-17 05:05:32 +00:00
parent 6d5de33f55
commit 84f4aabdff
20 changed files with 8748 additions and 47 deletions

457
locales/fr.yml Normal file
View File

@@ -0,0 +1,457 @@
# Menu principal
menu:
subtitle: 'Tuteur de Frappe en Terminal'
adaptive_drill: 'Exercice Adaptatif'
adaptive_drill_desc: 'Mots phonétiques avec déverrouillage adaptatif des touches'
code_drill: 'Exercice de Code'
code_drill_desc: 'Entraînez-vous à taper la syntaxe du code'
passage_drill: 'Exercice de Passage'
passage_drill_desc: 'Tapez des passages de livres'
skill_tree: 'Arbre de Compétences'
skill_tree_desc: 'Voir les branches de progression et lancer des exercices'
keyboard: 'Clavier'
keyboard_desc: 'Explorer la disposition du clavier et les statistiques'
statistics: 'Statistiques'
statistics_desc: 'Voir vos statistiques de frappe'
settings: 'Paramètres'
settings_desc: 'Configurer keydr'
day_streak: ' | %{days} jours consécutifs'
key_progress: ' Progression %{unlocked}/%{total} (%{mastered} maîtrisées) | Objectif %{target} WPM%{streak}'
hint_start: '[1-3] Démarrer'
hint_skill_tree: '[t] Arbre de Compétences'
hint_keyboard: '[b] Clavier'
hint_stats: '[s] Statistiques'
hint_settings: '[c] Paramètres'
hint_quit: '[q] Quitter'
# Écran d'exercice
drill:
title: ' Exercice '
mode_adaptive: 'Adaptatif'
mode_code: 'Code (Non classé)'
mode_passage: 'Passage (Non classé)'
focus_char: 'Focus : ''%{ch}'''
focus_bigram: 'Focus : "%{bigram}"'
focus_both: 'Focus : ''%{ch}'' + "%{bigram}"'
header_wpm: 'WPM'
header_acc: 'Pré'
header_err: 'Err'
code_source: ' Source du code '
passage_source: ' Source du passage '
footer: '[ESC] Fin [Backspace] Effacer'
keys_reenabled: 'Touches réactivées en %{ms}ms'
hint_end: '[ESC] Fin de l''exercice'
hint_backspace: '[Backspace] Effacer'
# Tableau de bord / résultat de l'exercice
dashboard:
title: ' Exercice Terminé '
results: 'Résultats'
unranked_note_prefix: ' (Non classé'
unranked_note_suffix: ' ne compte pas pour l''arbre de compétences)'
speed: ' Vitesse : '
accuracy_label: ' Précision : '
time_label: ' Temps : '
errors_label: ' Erreurs : '
correct_detail: ' (%{correct}/%{total} corrects)'
input_blocked: ' Saisie temporairement bloquée '
input_blocked_ms: '(%{ms}ms restantes)'
hint_continue: '[c/Enter/Space] Continuer'
hint_retry: '[r] Réessayer'
hint_menu: '[q] Menu'
hint_stats: '[s] Statistiques'
hint_delete: '[x] Supprimer'
# Barre latérale de statistiques (pendant l'exercice)
sidebar:
title: ' Statistiques '
wpm: 'WPM : '
target: 'Objectif : '
target_wpm: '%{wpm} WPM'
accuracy: 'Précision : '
progress: 'Progression : '
correct: 'Corrects : '
errors: 'Erreurs : '
time: 'Temps : '
last_drill: ' Dernier Exercice '
vs_avg: ' vs moy : '
# Tableau de bord des statistiques
stats:
title: ' Statistiques '
empty: 'Aucun exercice terminé. Commencez à taper !'
tab_dashboard: '[1] Tableau de bord'
tab_history: '[2] Historique'
tab_activity: '[3] Activité'
tab_accuracy: '[4] Précision'
tab_timing: '[5] Chronométrage'
tab_ngrams: '[6] N-grammes'
hint_back: '[ESC] Retour'
hint_next_tab: '[Tab] Onglet suivant'
hint_switch_tab: '[1-6] Changer d''onglet'
hint_navigate: '[j/k] Naviguer'
hint_page: '[PgUp/PgDn] Défiler'
hint_delete: '[x] Supprimer'
summary_title: ' Résumé '
drills: ' Exercices : '
avg_wpm: ' WPM Moy : '
best_wpm: ' Meilleur WPM : '
accuracy_label: ' Précision : '
total_time: ' Temps total : '
wpm_chart_title: ' WPM par Exercice (20 derniers, Objectif : %{target}) '
accuracy_chart_title: ' Précision %% (50 derniers Exercices) '
chart_drill: 'Exercice #'
chart_accuracy_pct: 'Précision %%'
sessions_title: ' Sessions Récentes '
session_header: ' # WPM Raw Pré%% Temps Date/Heure Mode Classé Partiel'
session_separator: ' ─────────────────────────────────────────────────────────────────────'
delete_confirm: 'Supprimer la session #%{idx} ? (y/n)'
confirm_title: ' Confirmer '
yes: 'oui'
no: 'non'
keyboard_accuracy_title: ' Précision du Clavier %% '
keyboard_timing_title: ' Chronométrage du Clavier (ms) '
slowest_keys_title: ' Touches les plus Lentes (ms) '
fastest_keys_title: ' Touches les plus Rapides (ms) '
worst_accuracy_title: ' Pire Précision (%%) '
best_accuracy_title: ' Meilleure Précision (%%) '
not_enough_data: ' Données insuffisantes'
streaks_title: ' Séries '
current_streak: ' Actuelle : '
best_streak: ' Meilleure : '
active_days: ' Jours actifs : '
top_days_none: ' Meilleurs jours : aucun'
top_days: ' Meilleurs jours : %{days}'
wpm_label: ' WPM : %{avg}/%{target} (%{pct}%%)'
acc_label: ' Pré : %{pct}%%'
keys_label: ' Touches : %{unlocked}/%{total} (%{mastered} maîtrisées)'
ngram_empty: 'Terminez des exercices adaptatifs pour voir les données de n-grammes'
ngram_header_speed_narrow: ' Bgrm Vit Att Anom%'
ngram_header_error_narrow: ' Bgrm Err Éch Taux Att Anom%'
ngram_header_speed: ' Bigramme Vit Att Échan. Anom%'
ngram_header_error: ' Bigramme Erreurs Échan. Taux Att Anom%'
focus_title: ' Focus Actif '
focus_char_label: ' Focus : '
focus_bigram_value: 'Bigramme %{label}'
focus_plus: ' + '
anomaly_error: 'erreur'
anomaly_speed: 'vitesse'
focus_detail_both: ' Caractère ''%{ch}'' : touche la plus faible | Bigramme %{label} : anomalie de %{type} %{pct}%%'
focus_detail_char_only: ' Caractère ''%{ch}'' : touche la plus faible, aucune anomalie de bigramme confirmée'
focus_detail_bigram_only: ' (anomalie de %{type} : %{pct}%%)'
focus_empty: ' Terminez des exercices adaptatifs pour voir les données de focus'
error_anomalies_title: ' Anomalies d''Erreur (%{count}) '
no_error_anomalies: ' Aucune anomalie d''erreur détectée'
speed_anomalies_title: ' Anomalies de Vitesse (%{count}) '
no_speed_anomalies: ' Aucune anomalie de vitesse détectée'
scope_label_prefix: ' '
bi_label: ' | Bi : %{count}'
tri_label: ' | Tri : %{count}'
hes_label: ' | Hés : >%{ms}ms'
gain_label: ' | Gain : %{value}'
gain_interval: ' (tous les 50)'
focus_char_value: 'Caractère ''%{ch}'''
# Carte d'activité
heatmap:
title: ' Activité Quotidienne (Sessions par Jour) '
jan: 'Jan'
feb: 'Fév'
mar: 'Mar'
apr: 'Avr'
may: 'Mai'
jun: 'Jun'
jul: 'Jul'
aug: 'Aoû'
sep: 'Sep'
oct: 'Oct'
nov: 'Nov'
dec: 'Déc'
# Graphique
chart:
wpm_over_time: ' WPM au fil du temps '
drill_number: 'Exercice #'
# Paramètres
settings:
title: ' Paramètres '
subtitle: 'Utilisez les flèches pour naviguer, Entrée/Droite pour changer, ESC pour sauvegarder et quitter'
target_wpm: 'WPM Objectif'
theme: 'Thème'
word_count: 'Nombre de Mots'
ui_language: 'Langue de l''Interface'
dictionary_language: 'Langue du Dictionnaire'
keyboard_layout: 'Disposition du Clavier'
code_language: 'Langage de Code'
code_downloads: 'Téléchargements de Code'
on: 'Oui'
off: 'Non'
code_download_dir: 'Rép. Téléchargement Code'
snippets_per_repo: 'Extraits par Dépôt'
unlimited: 'Illimité'
download_code_now: 'Télécharger Code Maintenant'
run_downloader: 'Lancer le téléchargeur'
passage_downloads: 'Téléchargements de Passages'
passage_download_dir: 'Rép. Téléchargement Passages'
paragraphs_per_book: 'Paragraphes par Livre'
whole_book: 'Livre entier'
download_passages_now: 'Télécharger Passages Maintenant'
export_path: 'Chemin d''Export'
export_data: 'Exporter les Données'
export_now: 'Exporter maintenant'
import_path: 'Chemin d''Import'
import_data: 'Importer les Données'
import_now: 'Importer maintenant'
hint_save_back: '[ESC] Sauvegarder et retour'
hint_change_value: '[Enter/flèches] Changer la valeur'
hint_edit_path: '[Enter sur chemin] Éditer'
hint_move: '[←→] Déplacer'
hint_tab_complete: '[Tab] Compléter (à la fin)'
hint_confirm: '[Enter] Confirmer'
hint_cancel: '[Esc] Annuler'
success_title: ' Succès '
error_title: ' Erreur '
press_any_key: 'Appuyez sur une touche'
file_exists_title: ' Fichier Existant '
file_exists: 'Un fichier existe déjà à ce chemin.'
overwrite_rename: '[d] Écraser [r] Renommer [Esc] Annuler'
erase_warning: 'Ceci effacera vos données actuelles.'
export_first: 'Exportez d''abord si vous voulez les conserver.'
proceed_yn: 'Continuer ? (y/n)'
confirm_import_title: ' Confirmer l''Importation '
# Écrans de sélection
select:
dictionary_language_title: ' Sélectionner la Langue du Dictionnaire '
keyboard_layout_title: ' Sélectionner la Disposition du Clavier '
code_language_title: ' Sélectionner le Langage de Code '
passage_source_title: ' Sélectionner la Source de Passages '
ui_language_title: ' Sélectionner la Langue de l''Interface '
more_above: '... %{count} de plus au-dessus ...'
more_below: '... %{count} de plus en-dessous ...'
current: ' (actuel)'
disabled: ' (désactivé)'
enabled_default: ' (activé, par défaut : %{layout})'
enabled: ' (activé)'
disabled_blocked: ' (désactivé : bloqué)'
built_in: ' (intégré)'
cached: ' (en cache)'
disabled_download: ' (désactivé : téléchargement requis)'
download_required: ' (téléchargement requis)'
hint_navigate: '[Up/Down/PgUp/PgDn] Naviguer'
hint_confirm: '[Enter] Confirmer'
hint_back: '[ESC] Retour'
language_resets_layout: 'Sélectionner une langue réinitialise la disposition à celle par défaut de cette langue.'
layout_no_language_change: 'Changer la disposition ne change pas la langue du dictionnaire.'
disabled_network_notice: 'Certaines langues sont désactivées : activez les téléchargements dans intro/paramètres.'
disabled_sources_notice: 'Certaines sources sont désactivées : activez les téléchargements dans intro/paramètres.'
passage_all: 'Tous (Intégrés + tous les livres)'
passage_builtin: 'Passages intégrés uniquement'
passage_book_prefix: 'Livre : %{title}'
# Progression
progress:
overall_key_progress: 'Progression Globale des Touches'
unlocked_mastered: '%{unlocked}/%{total} déverrouillées (%{mastered} maîtrisées)'
# Arbre de compétences
skill_tree:
title: ' Arbre de Compétences '
locked: 'Verrouillé'
unlocked: 'déverrouillé'
mastered: 'maîtrisé'
in_progress: 'en cours'
complete: 'terminé'
locked_status: 'verrouillé'
locked_notice: 'Terminez %{count} lettres primaires pour débloquer les branches'
branches_separator: 'Branches (disponibles après %{count} lettres primaires)'
unlocked_letters: 'Déverrouillées %{unlocked}/%{total} lettres'
level: 'Niveau %{current}/%{total}'
level_zero: 'Niveau 0/%{total}'
in_focus: ' en focus'
hint_navigate: '[↑↓/jk] Naviguer'
hint_scroll: '[PgUp/PgDn ou Ctrl+U/Ctrl+D] Défiler'
hint_back: '[q] Retour'
hint_unlock: '[Enter] Déverrouiller'
hint_start_drill: '[Enter] Lancer l''Exercice'
unlock_msg_1: 'Une fois déverrouillé, l''exercice adaptatif inclura les touches de cette branche qui sont déverrouillées.'
unlock_msg_2: 'Si vous voulez vous concentrer sur cette branche, lancez un exercice directement depuis cette branche dans l''Arbre de Compétences.'
confirm_unlock: 'Déverrouiller %{branch} ?'
confirm_yn: '[y] Déverrouiller [n/ESC] Annuler'
lvl_prefix: 'Niv'
branch_primary_letters: 'Lettres Primaires'
branch_capital_letters: 'Lettres Majuscules'
branch_numbers: 'Chiffres 0-9'
branch_prose_punctuation: 'Ponctuation de Prose'
branch_whitespace: 'Espaces Blancs'
branch_code_symbols: 'Symboles de Code'
level_frequency_order: 'Ordre de Fréquence'
level_common_sentence_capitals: 'Majuscules de Phrases Courantes'
level_name_capitals: 'Majuscules de Noms'
level_remaining_capitals: 'Majuscules Restantes'
level_common_digits: 'Chiffres Courants'
level_all_digits: 'Tous les Chiffres'
level_essential: 'Essentiel'
level_common: 'Courant'
level_expressive: 'Expressif'
level_enter_return: 'Entrée/Retour'
level_tab_indent: 'Tab/Indentation'
level_arithmetic_assignment: 'Arithmétique et Affectation'
level_grouping: 'Groupement'
level_logic_reference: 'Logique et Référence'
level_special: 'Spécial'
# Jalons
milestones:
unlock_title: ' Touche Déverrouillée ! '
mastery_title: ' Touche Maîtrisée ! '
branches_title: ' Nouvelles Branches Disponibles ! '
branch_complete_title: ' Branche Terminée ! '
all_unlocked_title: ' Toutes les Touches Déverrouillées ! '
all_mastered_title: ' Maîtrise Totale du Clavier ! '
unlocked: 'déverrouillée'
mastered: 'maîtrisée'
use_finger: 'Utilisez votre %{finger}'
hold_right_shift: 'Maintenez Shift Droit (auriculaire droit)'
hold_left_shift: 'Maintenez Shift Gauche (auriculaire gauche)'
congratulations_all_letters: 'Félicitations ! Vous avez maîtrisé les %{count} lettres primaires'
new_branches_available: 'De nouvelles branches de compétences sont disponibles :'
visit_skill_tree: 'Visitez l''Arbre de Compétences pour déverrouiller une nouvelle branche'
and_start_training: 'et commencez l''entraînement !'
open_skill_tree: 'Appuyez sur [t] pour ouvrir l''Arbre de Compétences'
branch_complete_msg: 'Vous avez terminé la branche %{branch} !'
all_levels_mastered: 'Les %{count} niveaux sont maîtrisés.'
all_keys_confident: 'Chaque touche de cette branche est à confiance maximale.'
all_unlocked_msg: 'Vous avez déverrouillé toutes les touches du clavier !'
all_unlocked_desc: 'Chaque caractère, symbole et modificateur est disponible dans vos exercices.'
keep_practicing_mastery: 'Continuez à pratiquer pour atteindre la maîtrise — quand chaque touche atteindra'
confidence_complete: 'la confiance maximale, vous aurez atteint la maîtrise totale du clavier !'
all_mastered_msg: 'Félicitations — vous avez atteint la maîtrise totale du clavier !'
all_mastered_desc: 'Chaque touche du clavier est à confiance maximale.'
mastery_takes_practice: 'La maîtrise n''est pas une destination — elle nécessite une pratique continue.'
keep_drilling: 'Continuez à vous entraîner pour garder votre niveau.'
hint_skill_tree_continue: '[t] Ouvrir l''Arbre de Compétences [Autre touche] Continuer'
hint_any_key: 'Appuyez sur une touche pour continuer'
input_blocked: 'Saisie temporairement bloquée (%{ms}ms restantes)'
unlock_msg_1: 'Bon travail ! Continuez à améliorer vos compétences.'
unlock_msg_2: 'Une touche de plus dans votre arsenal !'
unlock_msg_3: 'Votre clavier s''agrandit ! Continuez !'
unlock_msg_4: 'Un pas de plus vers la maîtrise totale !'
mastery_msg_1: 'Cette touche est à confiance maximale !'
mastery_msg_2: 'Vous maîtrisez cette touche parfaitement !'
mastery_msg_3: 'Mémoire musculaire acquise !'
mastery_msg_4: 'Une touche de plus conquise !'
# Explorateur de clavier
keyboard:
title: ' Clavier '
subtitle: 'Appuyez ou cliquez sur une touche'
hint_navigate: '[←→↑↓/hjkl/Tab] Naviguer'
hint_back: '[q/ESC] Retour'
key_label: 'Touche : '
finger_label: 'Doigt : '
hand_left: 'Gauche'
hand_right: 'Droite'
finger_index: 'Indicateur'
finger_middle: 'Majeur'
finger_ring: 'Annulaire'
finger_pinky: 'Auriculaire'
finger_thumb: 'Pouce'
overall_accuracy: ' Précision globale : %{correct}/%{total} (%{pct}%%)'
ranked_accuracy: ' Précision classée : %{correct}/%{total} (%{pct}%%)'
confidence: 'Confiance : '
no_data: 'Pas encore de données'
no_data_short: 'Pas de données'
key_details: ' Détails de la Touche '
key_details_char: ' Détails de la Touche : ''%{ch}'' '
key_details_name: ' Détails de la Touche : %{name} '
press_key_hint: 'Appuyez sur une touche pour voir ses détails'
shift_label: 'Shift : '
shift_no: 'Non'
overall_avg_time: 'Temps Moy. Global : '
overall_best_time: 'Meilleur Temps Global : '
overall_samples: 'Échantillons Globaux : '
overall_accuracy_label: 'Précision Globale : '
branch_label: 'Branche : '
level_label: 'Niveau : '
built_in_key: 'Touche Intégrée'
unlocked_label: 'Déverrouillée : '
yes: 'Oui'
no: 'Non'
in_focus_label: 'En Focus ? : '
mastery_label: 'Maîtrise : '
mastery_locked: 'Verrouillé'
ranked_avg_time: 'Temps Moy. Classé : '
ranked_best_time: 'Meilleur Temps Classé : '
ranked_samples: 'Échantillons Classés : '
ranked_accuracy_label: 'Précision Classée : '
# Dialogues d'introduction
intro:
passage_title: ' Configuration Téléchargement de Passages '
code_title: ' Configuration Téléchargement de Code '
enable_downloads: 'Activer les téléchargements réseau'
download_dir: 'Répertoire de téléchargement'
paragraphs_per_book: 'Paragraphes par livre (0 = entier)'
whole_book: 'livre entier'
snippets_per_repo: 'Extraits par dépôt (0 = illimité)'
unlimited: 'illimité'
start_passage_drill: 'Lancer l''exercice de passage'
start_code_drill: 'Lancer l''exercice de code'
confirm: 'Confirmer'
hint_navigate: '[Up/Down] Naviguer'
hint_adjust: '[Left/Right] Ajuster'
hint_edit: '[Type/Backspace] Éditer'
hint_confirm: '[Enter] Confirmer'
hint_cancel: '[ESC] Annuler'
preparing_download: 'Préparation du téléchargement...'
download_passage_title: ' Téléchargement de la Source de Passage '
download_code_title: ' Téléchargement de la Source de Code '
book_label: ' Livre : %{name}'
repo_label: ' Dépôt : %{name}'
progress_bytes: '[%{name}] %{downloaded}/%{total} bytes'
downloaded_bytes: 'Téléchargé : %{bytes} bytes'
downloading_book_progress: 'Téléchargement du livre : [%{bar}] %{downloaded}/%{total} bytes'
downloading_book_bytes: 'Téléchargement du livre : %{bytes} bytes'
downloading_code_progress: 'Téléchargement : [%{bar}] %{downloaded}/%{total} bytes'
downloading_code_bytes: 'Téléchargement : %{bytes} bytes'
current_book: 'Actuel : %{name} (livre %{done}/%{total})'
current_repo: 'Actuel : %{name} (dépôt %{done}/%{total})'
passage_instructions_1: 'keydr peut télécharger des passages de Project Gutenberg pour la pratique de frappe.'
passage_instructions_2: 'Les livres sont téléchargés une fois et mis en cache localement.'
passage_instructions_3: 'Configurez les paramètres ci-dessous, puis lancez un exercice de passage.'
code_instructions_1: 'keydr peut télécharger du code open-source de GitHub pour la pratique de frappe.'
code_instructions_2: 'Le code est téléchargé une fois et mis en cache localement.'
code_instructions_3: 'Configurez les paramètres ci-dessous, puis lancez un exercice de code.'
# Messages de statut (de app.rs)
status:
recovery_files: 'Fichiers de récupération trouvés suite à une importation interrompue. Les données peuvent être incohérentes — envisagez de réimporter.'
dir_not_exist: 'Le répertoire n''existe pas : %{path}'
no_data_store: 'Aucun stockage de données disponible'
serialization_error: 'Erreur de sérialisation : %{error}'
exported_to: 'Exporté vers %{path}'
export_failed: 'Échec de l''exportation : %{error}'
could_not_read: 'Impossible de lire le fichier : %{error}'
invalid_export: 'Fichier d''export invalide : %{error}'
unsupported_version: 'Version d''export non supportée : %{got} (attendue %{expected})'
import_failed: 'Échec de l''importation : %{error}'
imported_theme_fallback: 'Importé avec succès (thème ''%{theme}'' introuvable, utilisation du défaut)'
imported_success: 'Importé avec succès'
adaptive_unavailable: 'Mode adaptatif classé non disponible : %{error}'
switched_to: 'Basculé vers %{name}'
layout_changed: 'Disposition changée en %{name}'
# Erreurs (pour traduction des limites d'UI)
errors:
unknown_language: 'Langue inconnue : %{key}'
unknown_layout: 'Disposition de clavier inconnue : %{key}'
unsupported_pair: 'Paire langue/disposition non supportée : %{language} + %{layout}'
language_blocked: 'Langue bloquée par le niveau de support : %{key}'
# Commun
common:
wpm: 'WPM'
cpm: 'CPM'
back: 'Retour'