diff --git a/crates/ui-egui/src/i18n.rs b/crates/ui-egui/src/i18n.rs index 69bfc63a9..406cc3dd5 100644 --- a/crates/ui-egui/src/i18n.rs +++ b/crates/ui-egui/src/i18n.rs @@ -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] diff --git a/crates/ui-egui/src/i18n/fr.rs b/crates/ui-egui/src/i18n/fr.rs new file mode 100644 index 000000000..fdf1f891d --- /dev/null +++ b/crates/ui-egui/src/i18n/fr.rs @@ -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, + }) +}