Merge pull request #413 from pechnikov2026-star/i18n-fr

i18n: add French (fr) interface
This commit is contained in:
Brandon Thomas
2026-10-11 18:06:05 -04:00
2 changed files with 399 additions and 1 deletions
+13 -1
View File
@@ -12,6 +12,7 @@ use serde::{Deserialize, Serialize};
mod cs;
mod de;
mod es;
mod fr;
mod ko;
mod pt;
mod ru;
@@ -31,10 +32,11 @@ pub enum Language {
PtBr,
De,
Cs,
Fr,
}
impl Language {
pub const ALL: [Self; 9] = [Self::En, Self::Es, Self::Zh, Self::Ja, Self::Ko, Self::Ru, Self::PtBr, Self::De, Self::Cs];
pub const ALL: [Self; 10] = [Self::En, Self::Es, Self::Zh, Self::Ja, Self::Ko, Self::Ru, Self::PtBr, Self::De, Self::Cs, Self::Fr];
/// The language's own name, shown in the switcher.
pub fn name(self) -> &'static str {
@@ -48,6 +50,7 @@ impl Language {
Self::PtBr => "Português (Brasil)",
Self::De => "Deutsch",
Self::Cs => "Čeština",
Self::Fr => "Français",
}
}
@@ -63,6 +66,7 @@ impl Language {
Self::PtBr => "pt",
Self::De => "de",
Self::Cs => "cs",
Self::Fr => "fr",
}
}
@@ -81,6 +85,7 @@ impl Language {
"pt" => Some(Self::PtBr),
"de" => Some(Self::De),
"cs" => Some(Self::Cs),
"fr" => Some(Self::Fr),
_ => None,
}
}
@@ -117,6 +122,7 @@ impl Language {
Self::PtBr => pt::translate(text),
Self::De => de::translate(text),
Self::Cs => cs::translate(text),
Self::Fr => fr::translate(text),
};
translated.unwrap_or_else(|| text.rsplit_once('|').map_or(text, |(_, label)| label))
}
@@ -580,6 +586,7 @@ mod tests {
assert!(es::translate(english).is_some_and(|text| !text.is_empty()), "missing Spanish: {english}");
assert!(de::translate(english).is_some_and(|text| !text.is_empty()), "missing German: {english}");
assert!(cs::translate(english).is_some_and(|text| !text.is_empty()), "missing Czech: {english}");
assert!(fr::translate(english).is_some_and(|text| !text.is_empty()), "missing French: {english}");
}
assert_eq!(Language::Ja.tr("Data"), "データ");
assert_eq!(Language::Zh.tr("Data"), "数据");
@@ -591,6 +598,8 @@ mod tests {
assert_eq!(Language::Es.tr("Sheet1!A1"), "Sheet1!A1");
assert_eq!(Language::De.tr("Data"), "Daten");
assert_eq!(Language::De.tr("Sheet1!A1"), "Sheet1!A1");
assert_eq!(Language::Fr.tr("Data"), "Données");
assert_eq!(Language::Fr.tr("Sheet1!A1"), "Sheet1!A1");
assert_eq!(Language::PtBr.tr("Date"), "Data");
assert_eq!(Language::PtBr.tr("Sheet1!A1"), "Sheet1!A1");
assert_eq!(Language::Ja.tr("Sheet1!A1"), "Sheet1!A1");
@@ -642,6 +651,9 @@ mod tests {
assert_eq!(Language::from_tag("cs-CZ"), Some(Language::Cs));
assert_eq!(Language::from_tag("cs_CZ.UTF-8"), Some(Language::Cs));
assert_eq!(Language::parse("cs"), Some(Language::Cs));
assert_eq!(Language::from_tag("fr-FR"), Some(Language::Fr));
assert_eq!(Language::from_tag("fr_CA"), Some(Language::Fr));
assert_eq!(Language::parse("fr"), Some(Language::Fr));
}
#[test]
+386
View File
@@ -0,0 +1,386 @@
//! French translations for the interface strings in i18n.rs.
pub(super) fn translate(text: &str) -> Option<&'static str> {
Some(match text {
"Paste" => "Coller",
"Paste Values" => "Coller les valeurs",
"Paste Formulas" => "Coller les formules",
"Paste Formatting" => "Coller la mise en forme",
"Transpose" => "Transposer",
"Paste Link" => "Coller la liaison",
"Paste Special…" => "Collage spécial…",
"Insert Copied Cells" => "Insérer les cellules coupées",
"Insert Copied Cells…" => "Coller en insérant",
"Insert Cut Cells" => "Insérer des cases à cocher dans les cellules sélectionnées",
"Insert Paste" => "Taille de l’interface",
"Cut (⌘X)" => "Couper (⌘X)",
"Copy (⌘C)" => "Copier (⌘C)",
"Format Painter (double-click to keep it on)" => "Reproduire la mise en forme (double-clic pour la conserver)",
"Bold (⌘B)" => "Gras (⌘B)",
"Italic (⌘I)" => "Italique (⌘I)",
"Underline (⌘U)" => "Souligné (⌘U)",
"Double Underline" => "Double souligné",
"Strikethrough" => "Barré",
"Underline" => "Souligné",
"Increase Font Size" => "Augmenter la taille de la police",
"Decrease Font Size" => "Réduire la taille de la police",
"Wrap Text" => "Renvoyer à la ligne",
"Merge & Center" => "Fusionner et centrer",
"Merge Cells" => "Fusionner les cellules",
"Merge Across" => "Fusionner horizontalement",
"Unmerge Cells" => "Dissocier les cellules",
"Fill Color" => "Couleur de remplissage",
"Font Color" => "Couleur de police",
"Borders" => "Bordures",
"Top\nAlign" => "Aligner en haut",
"Middle\nAlign" => "Aligner au centre",
"Bottom\nAlign" => "Aligner en bas",
"Left" => "Gauche",
"Right" => "Droite",
"Center" => "Centré",
"Horizontal" => "Horizontal",
"Vertical Text" => "Texte vertical",
"Decrease Indent" => "Diminuer le retrait",
"Increase Indent" => "Augmenter le retrait",
"Orientation" => "Orientation",
"Page Layout|Orientation" => "Orientation",
"Angle Counterclockwise" => "Inclinaison vers la gauche",
"Angle Clockwise" => "Inclinaison vers la droite",
"Rotate Text Up" => "Pivoter le texte vers le haut",
"Rotate Text Down" => "Pivoter le texte vers le bas",
"Accounting Number Format" => "Format de nombre Comptabilité",
"Percent Style" => "Style de pourcentage",
"Comma Style" => "Style de virgule",
"Increase Decimal" => "Ajouter une décimale",
"Decrease Decimal" => "Retirer une décimale",
"More Accounting Formats…" => "Autres formats comptables…",
"Conditional\nFormatting" => "Mise en forme conditionnelle",
"Conditional Formatting" => "Mise en forme conditionnelle",
"Format\nas Table" => "Mettre sous forme de tableau",
"Cell\nStyles" => "Styles de cellules",
"Format Cells…" => "Format de cellules…",
"Format Cell Alignment…" => "Format d’alignement de cellule…",
"Format\nPane" => "Volet Format",
"Format" => "Format",
"Insert" => "Insertion",
"Insert Cells…" => "Insérer des cellules…",
"Delete" => "Supprimer",
"Delete Cells…" => "Supprimer des cellules…",
"Insert Sheet Rows" => "Insérer des lignes de feuille",
"Insert Sheet Columns" => "Insérer des colonnes de feuille",
"Delete Sheet Rows" => "Supprimer des lignes de feuille",
"Delete Sheet Columns" => "Supprimer des colonnes de feuille",
"Row Height…" => "Hauteur de ligne…",
"AutoFit Row Height" => "Ajustement automatique de la hauteur de ligne",
"Column Width…" => "Largeur de colonne…",
"AutoFit Column Width" => "Ajustement automatique de la largeur de colonne",
"Default Width…" => "Largeur par défaut…",
"Hide Rows" => "Masquer les lignes",
"Unhide Rows" => "Afficher les lignes",
"Hide Columns" => "Masquer les colonnes",
"Unhide Columns" => "Afficher les colonnes",
"Lock Cell" => "Verrouiller la cellule",
"Clear" => "Effacer",
"Clear All" => "Effacer tout",
"Clear Formats" => "Effacer les formats",
"Clear Contents" => "Effacer le contenu",
"Clear Comments and Notes" => "Effacer les commentaires et les notes",
"Clear Hyperlinks" => "Effacer les liens hypertexte",
"AutoSum" => "Somme automatique",
"AutoSum (⌘⇧T)" => "Somme automatique (⌘⇧T)",
"Flash\nFill" => "Remplissage instantané",
"Flash Fill" => "Remplissage instantané",
"Fill" => "Remplir",
"Clear Print Area" => "Effacer la zone d’impression",
"Find &\nSelect" => "Rechercher et sélectionner",
"Find…" => "Rechercher…",
"Replace…" => "Remplacer…",
"Go To…" => "Atteindre…",
"Go To Special…" => "Atteindre spécial…",
"PivotTable" => "Tableau croisé dynamique",
"Recommended\nCharts" => "Graphiques recommandés",
"Table" => "Tableau",
"Pictures" => "Images",
"Shapes" => "Formes",
"Icons" => "Icônes",
"Text\nBox" => "Zone de texte",
"Comment" => "Commentaire",
"New\nComment" => "Nouveau commentaire",
"New Note" => "Nouvelle note",
"Show/Hide Note" => "Afficher/masquer la note",
"Header &\nFooter" => "En-tête et pied de page",
"Text to\nColumns" => "Convertir",
"Link" => "Lien",
"Symbol" => "Symbole",
"Sparklines" => "Sparklines",
"Checkbox" => "Cliquez pour ajouter des données",
"Insert checkboxes in the selected cells" => "Mots-clés",
"Header & Footer" => "En-tête et pied de page",
"Draw with ink" => "Dessiner avec l’encre",
"Eraser" => "Gomme",
"Ink to\nShape" => "Encre vers forme",
"Select\nObjects" => "Sélection d’objets",
"Themes" => "Thèmes",
"Margins" => "Marges",
"Size" => "Taille",
"Print\nArea" => "Zone d’impression",
"Set Print Area" => "Définir la zone d’impression",
"Breaks" => "Sauts",
"Insert Page Break" => "Insérer un saut de page",
"Remove Page Break" => "Supprimer le saut de page",
"Reset All Page Breaks" => "Réinitialiser tous les sauts de page",
"Print\nTitles" => "Titres à imprimer",
"Sheet\nRight-to-Left" => "Afficher la barre de formule",
"Sheet Right-to-Left" => "Feuilles",
"Narrow" => "Étroites",
"Wide" => "Larges",
"Normal" => "Normales",
"Portrait" => "Portrait",
"Landscape" => "Paysage",
"Custom Margins…" => "Marges personnalisées…",
"Insert\nFunction" => "Insérer une fonction",
"Name\nManager" => "Gestionnaire de noms",
"Define Name" => "Définir un nom",
"Use in Formula" => "Utiliser dans la formule",
"Create from Selection" => "Créer à partir de la sélection",
"Trace Precedents" => "Repérer les antécédents",
"Trace Dependents" => "Repérer les dépendants",
"Remove Arrows" => "Supprimer les flèches",
"Show Formulas" => "Afficher les formules",
"Error Checking" => "Vérification des erreurs",
"Evaluate Formula" => "Évaluation de formule",
"Watch Window" => "Fenêtre Espion",
"Calculation\nOptions" => "Options de calcul",
"Calculate Now" => "Calculer maintenant",
"Calculate Sheet" => "Calculer la feuille",
"Automatic" => "Automatique",
"Automatic Except for Data Tables" => "Automatique sauf pour les tables de données",
"Manual" => "Manuel",
"Sort &\nFilter" => "Trier et filtrer",
"Sort" => "Trier",
"Sort A to Z" => "Trier de A à Z",
"Sort Z to A" => "Trier de Z à A",
"Custom Sort…" => "Tri personnalisé…",
"Filter" => "Filtrer",
"Reapply" => "Réappliquer",
"Get Data\n(Text/CSV)" => "Obtenir des données (Texte/CSV)",
"Remove\nDuplicates" => "Supprimer les doublons",
"Data\nValidation" => "Validation des données",
"Data Validation" => "Validation des données",
"Data Validation…" => "Validation des données…",
"Circle Invalid Data" => "Cerner les données non valides",
"Clear Validation" => "Effacer la validation",
"Group" => "Grouper",
"Ungroup" => "Dissocier",
"Show Detail" => "Titre",
"Hide Detail" => "Insérer les cellules copiées",
"Subtotal" => "Sous-total",
"Data\nAnalysis" => "Description",
"Data Analysis" => "Analyse\nde données",
"Solver" => "Page web (.html)",
"What-If\nAnalysis" => "Analyse scénarios",
"Data Table…" => "Table de données…",
"Scenario Manager…" => "Gestionnaire de scénarios…",
"Goal Seek…" => "Valeur cible…",
"Forecast\nSheet" => "Aller au pied de page",
"Spelling" => "Orthographe",
"Check\nAccessibility" => "Vérifier l’accessibilité",
"Threaded Comments" => "Commentaires threadés",
"Show\nComments" => "Afficher les commentaires",
"Previous" => "Imprimer les feuilles actives",
"Next" => "Aucun classeur récent pour le moment.",
"Previous Comment" => "Imprimer tout le classeur",
"Next Comment" => "Aucun classeur n’est ouvert.",
"Show All Notes" => "Objet",
"Convert to Comments" => "Créer un PDF",
"Protect\nWorkbook" => "Protéger le classeur",
"Allow Edit\nRanges" => "Animations",
"Allow Edit Ranges" => "Autoriser la\nmodification des plages",
"Unprotect\nSheet" => "Ôter la protection de la feuille",
"Protect Sheet…" => "Protéger la feuille…",
"Comments" => "Commentaires",
"Notes" => "Notes",
"Page Break\nPreview" => "Aperçu des sauts de page",
"Page\nLayout" => "Mise en page",
"Formula Bar" => "Barre de formule",
"Gridlines" => "Quadrillage",
"Headings" => "En-têtes",
"Zoom" => "Zoom",
"100%" => "100%",
"Zoom to\nSelection" => "Zoom sur la sélection",
"Freeze\nPanes" => "Figer les volets",
"Freeze Panes" => "Figer les volets",
"Freeze Top Row" => "Figer la ligne supérieure",
"Freeze First Column" => "Figer la première colonne",
"Unfreeze Panes" => "Libérer les volets",
"Dark Mode" => "Mode sombre",
"Display theme" => "Thème d’affichage",
"Animations" => "Auteur",
"Glide the selection outline to the cell you move to instead of jumping there" => "Aller à l’en-tête",
"System" => "Système",
"Light" => "Clair",
"Dark" => "Sombre",
"Interface language" => "Langue de l’interface",
"Interface size" => "Emplacement",
"Auto" => "Retour",
"Drag to freeze columns" => "Faites glisser pour figer les lignes",
"Drag to freeze rows" => "Activer le calcul itératif",
"Command\nPalette" => "Palette de commandes",
"Agent\nControl" => "Contrôle de l’agent",
"Action\nJournal" => "Journal des actions",
"About\nGridCraft" => "À propos de GridCraft",
"Share" => "Partager",
"Add Chart\nElement" => "Ajouter un élément de graphique",
"Change\nChart Type" => "Modifier le type de graphique",
"Switch\nRow/Column" => "Permuter ligne/colonne",
"Select\nData" => "Nom de la\nfeuille",
"Data Labels: None" => "Étiquettes de données : Aucune",
"Data Labels: Show" => "Étiquettes de données : Afficher",
"Legend: None" => "Légende : Aucune",
"Legend: Bottom" => "Légende : Bas",
"Legend: Top" => "Légende : Haut",
"Legend: Right" => "Légende : Droite",
"Gridlines: None" => "Quadrillage : Aucun",
"Gridlines: Show" => "Quadrillage : Afficher",
"Chart\nTitle" => "Titre du graphique",
"Delete\nChart" => "Supprimer le graphique",
"Convert\nto Range" => "Convertir en plage",
"Table\nStyles" => "Styles de tableau",
"Top 10 Items" => "10 premiers éléments",
"Top 10%" => "10 % les plus élevés",
"Bottom 10 Items" => "10 derniers éléments",
"Bottom 10%" => "10 % les moins élevés",
"Above Average" => "Au-dessus de la moyenne",
"Below Average" => "En dessous de la moyenne",
"Clear Rules from Entire Sheet" => "Effacer les règles de la feuille entière",
"Clear Rules from Selected Cells" => "Effacer les règles des cellules sélectionnées",
"Constants" => "Constantes",
"Data Bars" => "Barres de données",
"Color Scales" => "Échelles de couleurs",
"Icon Sets" => "Jeux d’icônes",
"Home" => "Accueil",
"Draw" => "Dessin",
"Page Layout" => "Mise en page",
"Formulas" => "Formules",
"Data" => "Données",
"Review" => "Révision",
"View" => "Affichage",
"Automate" => "Automatiser",
"Table Design" => "Création de tableau",
"Chart Design" => "Création de graphique",
"Ready" => "Prêt",
"Enter" => "Entrée",
"Edit" => "Modifier",
"Point" => "Point",
"Calculate" => "Calculer",
"Select destination and press Enter or choose Paste" => "Sélectionnez la destination et appuyez sur Entrée ou choisissez Coller",
"General" => "Standard",
"Number" => "Nombre",
"Currency" => "Monétaire",
"Accounting" => "Comptabilité",
"Date" => "Date",
"Time" => "Heure",
"Percentage" => "Pourcentage",
"Fraction" => "Fraction",
"Scientific" => "Scientifique",
"Text" => "Texte",
"Special" => "Spécial",
"Custom" => "Personnalisée",
"Short Date" => "Date courte",
"Long Date" => "Date longue",
"More Number Formats…" => "Autres formats numériques…",
"Financial" => "Financières",
"Logical" => "Logiques",
"Date &\nTime" => "Date et heure",
"Lookup &\nReference" => "Recherche et référence",
"Math &\nTrig" => "Maths et trigonométrie",
"More\nFunctions" => "Autres fonctions",
"Sheet Options|View" => "Affichage",
"Print" => "Impression",
"Click to add data" => "Fermer",
"Add header" => "Autoriser la modification des plages",
"Add footer" => "Ajouter un en-tête",
"(none)" => "(aucun)",
"Header" => "Informations",
"Footer" => "Feuille de\nprévision",
"Page\nNumber" => "Page précédente",
"Number\nof Pages" => "Général",
"Current\nDate" => "Heure\nactuelle",
"Current\nTime" => "Analyse de données",
"File\nPath" => "Ajuster la feuille sur une seule page",
"File\nName" => "Chemin\ndu fichier",
"Sheet\nName" => "Afficher le détail",
"Go to\nHeader" => "Masquer le détail",
"Go to\nFooter" => "En-tête",
"Page Number" => "Numéro\nde page",
"Number of Pages" => "Options",
"Current Date" => "Heure actuelle",
"Current Time" => "Date\nactuelle",
"File Path" => "Nom du\nfichier",
"File Name" => "Chemin du fichier",
"Sheet Name" => "Feuille de\ndroite à gauche",
"Go to Header" => "Aller à\nl’en-tête",
"Go to Footer" => "Aller au\npied de page",
"Ruler" => "Enregistrer sous",
"File" => "Nom du fichier",
"Back" => "Classeur vide",
"New" => "Page suivante",
"Open" => "Enregistrement",
"Info" => "Insérer les cellules copiées…",
"Save" => "Type de fichier",
"Save As" => "Enregistrer la feuille sous forme de document PDF en conservant sa mise en page.",
"Export" => "Fichier",
"Close" => "Société",
"Options" => "PDF (*.pdf)",
"Blank workbook" => "Parcourir…",
"Recent" => "Enregistrer automatiquement les classeurs .xlsx après chaque modification",
"No recent workbooks yet." => "Rien à imprimer.",
"More workbooks" => "Commentaire suivant",
"Browse…" => "CSV (séparé par des virgules)",
"Not saved yet" => "Nombre\nde pages",
"Location" => "Nouveau",
"Sheets" => "Solveur",
"Protect Workbook" => "Enregistrer",
"Sheet structure is locked: sheets can't be added, moved, renamed or deleted." => "Afficher toutes les notes",
"Lock the sheet structure so sheets can't be added, moved, renamed or deleted." => "Suivant",
"Properties" => "Règle",
"Title" => "Titre",
"Subject" => "Calcul du classeur",
"Author" => "Automatique",
"Company" => "Convertir en commentaires",
"Keywords" => "Plus de classeurs",
"Description" => "Télécharger",
"No workbook is open." => "Nombre de pages",
"Save as type" => "Enregistrer le classeur sous forme de page web.",
"Excel Workbook (*.xlsx)" => "Exporter",
"CSV UTF-8 (Comma delimited) (*.csv)" => "Les paramètres de calcul sont enregistrés avec le classeur.",
"Web Page (*.html)" => "Page web (*.html)",
"PDF (*.pdf)" => "Page {page} sur {pages}",
"Download" => "Faites glisser pour figer les colonnes",
"A CSV file, web page or PDF is a copy: the workbook keeps its own file." => "Ajouter un pied de page",
"Save the workbook under another name or in another folder." => "Feuille de droite à gauche",
"Print Active Sheets" => "Protéger le classeur",
"Print Entire Workbook" => "Récents",
"Fit Sheet on One Page" => "Pied de page",
"Page Setup…" => "Précédent",
"Page {page} of {pages}" => "Commentaire précédent",
"Nothing to print." => "Ouvrir",
"Previous page" => "Propriétés",
"Next page" => "Pas encore enregistré",
"Create PDF" => "Date actuelle",
"Save the sheet as a PDF document that keeps its page layout." => "Sélectionner\nles données",
"Change File Type" => "Case à cocher",
"CSV (Comma delimited)" => "CSV UTF-8 (séparé par des virgules) (*.csv)",
"Save the active sheet as comma-separated text." => "Enregistrer le classeur sous un autre nom ou dans un autre dossier.",
"Web Page (.html)" => "Page web (.html)",
"Save the workbook as a web page." => "Nom de la feuille",
"Options|General" => "Numéro de page",
"Options|Save" => "Mise en page…",
"Show formula bar" => "Page web (*.html)",
"Save .xlsx workbooks automatically after every change" => "Enregistrer la feuille active sous forme de texte séparé par des virgules.",
"Workbook calculation" => "Calcul du classeur",
"Enable iterative calculation" => "Classeur Excel (*.xlsx)",
"Calculation settings are saved with the workbook." => "Modifier le type de fichier",
_ => return None,
})
}