diff --git a/ATTRIBUTION.md b/ATTRIBUTION.md index 886581a7..b9449908 100644 --- a/ATTRIBUTION.md +++ b/ATTRIBUTION.md @@ -89,6 +89,7 @@ Editable drawing code, native projects and shipped exports are collected under ` | assets/icons/ui/source/pointer.rs | SolidCraft contributors | Original SolidCraft resource data or drawing code, collected without redesign | MIT OR Apache-2.0 | | assets/locales/de.json | SolidCraft contributors | Original SolidCraft resource data or drawing code, collected without redesign | MIT OR Apache-2.0 | | assets/locales/en.json | SolidCraft contributors | Original SolidCraft resource data or drawing code, collected without redesign | MIT OR Apache-2.0 | +| assets/locales/fr.json | rlartot | French translation of the English catalog, contributed upstream | MIT OR Apache-2.0 | | assets/locales/ja.json | SolidCraft contributors | Original SolidCraft resource data or drawing code, collected without redesign | MIT OR Apache-2.0 | | assets/locales/ko.json | SolidCraft contributors | Original SolidCraft resource data or drawing code, collected without redesign | MIT OR Apache-2.0 | | assets/locales/ru.json | Alex Pro (del000) | Russian translation of the English catalog, contributed upstream | MIT OR Apache-2.0 | diff --git a/assets/locales/fr.json b/assets/locales/fr.json new file mode 100644 index 00000000..cb1e6f09 --- /dev/null +++ b/assets/locales/fr.json @@ -0,0 +1,1032 @@ +{ + "Send your report on GitHub": "Envoyer votre rapport sur GitHub", + "1. Open GitHub draft below, then paste the report copied to your clipboard.": "1. Ouvrir le brouillon GitHub ci-dessous, puis coller le rapport copié dans le presse-papiers.", + "1. Open GitHub draft below. Your title and report will be filled in.": "1. Ouvrir le brouillon GitHub ci-dessous. Votre titre et votre rapport y seront déjà remplis.", + "2. Attach your screenshot: copy and paste it, or save and upload the PNG.": "2. Joindre votre capture d'écran : la copier-coller, ou enregistrer le PNG puis le téléverser.", + "3. Click Submit new issue on GitHub to send your report.": "3. Cliquer sur Submit new issue sur GitHub pour envoyer votre rapport.", + "browser.body_name": "Corps{number}", + "browser.component_name": "Composant{number}", + "browser.parameters": "Paramètres ({count})", + "browser.precision": "Précision : {precision}", + "browser.sketch_name": "Esquisse{number}", + "browser.units": "Unités : {units}", + "cmd.appearance_assign": "Apparence", + "cmd.appearance_library": "Bibliothèque d'apparences", + "cmd.appearance_list": "Lister les apparences", + "cmd.body_rename": "Renommer le corps", + "cmd.browser_group": "Nouveau groupe", + "cmd.browser_move": "Déplacer des éléments du navigateur", + "cmd.browser_order": "Réordonner les éléments du navigateur", + "cmd.browser_rename_group": "Renommer le groupe", + "cmd.browser_ungroup": "Dissocier", + "cmd.browser_visibility": "Afficher/Masquer", + "cmd.canvas_calibrate": "Étalonner le canevas", + "cmd.canvas_decal": "Décalcomanie", + "cmd.canvas_delete": "Supprimer le canevas", + "cmd.canvas_edit": "Modifier le canevas", + "cmd.canvas_insert": "Canevas", + "cmd.component_activate": "Activer le composant", + "cmd.component_break_link": "Rompre le lien", + "cmd.component_capture_position": "Capturer la position", + "cmd.component_create": "Nouveau composant", + "cmd.component_delete": "Supprimer le composant", + "cmd.component_from_bodies": "Créer des composants à partir des corps", + "cmd.component_insert_design": "Insérer une conception", + "cmd.component_links": "Lister les liens", + "cmd.component_list": "Lister les composants", + "cmd.component_move_bodies": "Déplacer les corps vers le composant", + "cmd.component_move_sketches": "Déplacer les esquisses vers le composant", + "cmd.component_paste_new": "Coller comme nouveau", + "cmd.component_properties": "Propriétés physiques du composant", + "cmd.component_rename": "Renommer le composant", + "cmd.component_revert_position": "Rétablir la position", + "cmd.component_update_links": "Mettre à jour les liens", + "cmd.config_activate": "Activer la configuration", + "cmd.config_column": "Colonne de configuration", + "cmd.config_configure": "Configurer", + "cmd.config_preview": "Aperçu de la configuration", + "cmd.config_row": "Ligne de configuration", + "cmd.config_rule": "Règle de configuration", + "cmd.config_rules": "Règles de configuration", + "cmd.config_table": "Afficher la table des configurations", + "cmd.construct_axis_edge": "Axe passant par une arête", + "cmd.construct_axis_normal_to_face": "Axe perpendiculaire à une face", + "cmd.construct_axis_through_cylinder": "Axe d'un cylindre/cône/tore", + "cmd.construct_axis_two_planes": "Axe par deux plans", + "cmd.construct_axis_two_points": "Axe par deux points", + "cmd.construct_plane_along_path": "Plan le long d'une trajectoire", + "cmd.construct_plane_midplane": "Plan médian", + "cmd.construct_plane_perpendicular": "Plan perpendiculaire", + "cmd.construct_plane_tangent": "Plan tangent", + "cmd.construct_plane_three_points": "Plan par trois points", + "cmd.construct_plane_two_edges": "Plan par deux arêtes", + "cmd.construct_point_along_path": "Point le long d'une trajectoire", + "cmd.construct_point_center": "Point au centre d'un cercle/sphère/tore", + "cmd.construct_point_edge_plane": "Point à l'intersection arête/plan", + "cmd.construct_point_three_planes": "Point par trois plans", + "cmd.construct_point_two_edges": "Point par deux arêtes", + "cmd.construct_point_vertex": "Point sur un sommet", + "cmd.contact_check": "Vérifier le contact", + "cmd.contact_create": "Nouveau jeu de contact", + "cmd.contact_disable_all": "Désactiver le contact", + "cmd.contact_edit": "Modifier le jeu de contact", + "cmd.contact_enable_all": "Activer tous les contacts", + "cmd.contact_enable_sets": "Activer les jeux de contact", + "cmd.contact_list": "Lister les jeux de contact", + "cmd.diagnostics_crash_report": "Rapport de plantage", + "cmd.diagnostics_crash_reports": "Rapports de plantage", + "cmd.diagnostics_crash_reports_clear": "Supprimer les rapports de plantage", + "cmd.diagnostics_crash_test": "Test de plantage", + "cmd.doc_recover": "Récupérer la conception", + "cmd.doc_recovery_discard": "Abandonner la conception récupérée", + "cmd.doc_recovery_list": "Conceptions récupérables", + "cmd.document_inspect": "Inspecter la conception", + "cmd.document_units": "Changer les unités de la conception", + "cmd.edit_checkpoint": "Point de restauration", + "cmd.edit_restore_checkpoint": "Revenir au point de restauration", + "cmd.engine_commands": "Lister les commandes", + "cmd.explode_create": "Vue éclatée", + "cmd.explode_delete": "Supprimer la vue éclatée", + "cmd.explode_list": "Lister les vues éclatées", + "cmd.explode_show": "Afficher la vue éclatée", + "cmd.expr_evaluate": "Évaluer une expression", + "cmd.face_delete": "Supprimer la face", + "cmd.file_export": "Exporter", + "cmd.file_insert_mesh": "Insérer un maillage", + "cmd.file_insert_step": "Insérer un STEP", + "cmd.file_save_mesh": "Enregistrer comme maillage", + "cmd.inspect_accessibility": "Analyse d'accessibilité", + "cmd.inspect_center_of_mass": "Centre de gravité", + "cmd.inspect_curvature_comb": "Analyse par peigne de courbure", + "cmd.inspect_curvature_map": "Analyse par carte de courbure", + "cmd.inspect_draft": "Analyse de dépouille", + "cmd.inspect_environment_map": "Analyse par carte d'environnement", + "cmd.inspect_interference": "Interférence", + "cmd.inspect_isocurve": "Analyse des isocourbes", + "cmd.inspect_minimum_radius": "Analyse du rayon minimal", + "cmd.inspect_zebra": "Analyse zébrée", + "cmd.joint_as_built": "Liaison telle que construite", + "cmd.joint_create": "Liaison", + "cmd.joint_delete": "Supprimer la liaison", + "cmd.joint_drive": "Piloter les liaisons", + "cmd.joint_edit": "Modifier la liaison", + "cmd.joint_limits": "Limites de liaison", + "cmd.joint_list": "Lister les liaisons", + "cmd.joint_motion_link": "Lien de mouvement", + "cmd.joint_origin": "Origine de liaison", + "cmd.joint_rigid_group": "Groupe rigide", + "cmd.joint_solve": "Résoudre les liaisons", + "cmd.material_assign": "Matériau physique", + "cmd.material_create": "Nouveau matériau physique", + "cmd.material_delete": "Supprimer le matériau physique", + "cmd.material_edit": "Modifier le matériau physique", + "cmd.material_list": "Lister les matériaux", + "cmd.mesh_convert": "Convertir le maillage", + "cmd.model_edges": "Lister les arêtes", + "cmd.model_faces": "Lister les faces", + "cmd.model_threads": "Lister les filetages", + "cmd.motion_delete": "Supprimer l'étude de mouvement", + "cmd.motion_export": "Exporter l'étude de mouvement", + "cmd.motion_list": "Lister les études de mouvement", + "cmd.motion_play": "Lire l'étude de mouvement", + "cmd.motion_study": "Étude de mouvement", + "cmd.occurrence_copy": "Coller (instance)", + "cmd.occurrence_ground": "Fixer", + "cmd.occurrence_move": "Déplacer l'occurrence", + "cmd.occurrence_properties": "Propriétés physiques de l'occurrence", + "cmd.parameters_add": "Ajouter un paramètre utilisateur", + "cmd.parameters_change": "Modifier les paramètres", + "cmd.parameters_comment": "Commenter le paramètre", + "cmd.parameters_complete": "Compléter l'expression", + "cmd.parameters_delete": "Supprimer le paramètre", + "cmd.parameters_export": "Exporter les paramètres", + "cmd.parameters_favorite": "Paramètre favori", + "cmd.parameters_graph": "Graphe des paramètres", + "cmd.parameters_import": "Importer des paramètres", + "cmd.parameters_list": "Lister les paramètres", + "cmd.parameters_rename": "Renommer le paramètre", + "cmd.parameters_users": "Utilisations du paramètre", + "cmd.parts_fastener": "Insérer une fixation", + "cmd.parts_insert": "Insérer une pièce", + "cmd.parts_library": "Pièces standard", + "cmd.parts_resize": "Changer la taille de la pièce", + "cmd.plastic_assign_rule": "Affecter une règle plastique", + "cmd.plastic_boss": "Bossage", + "cmd.plastic_lip": "Lèvre", + "cmd.plastic_manage_rules": "Gérer les règles plastique", + "cmd.plastic_rest": "Appui", + "cmd.plastic_rules": "Lister les règles plastique", + "cmd.plastic_snap_fit": "Clip", + "cmd.select_clear": "Effacer la sélection", + "cmd.sheet_convert": "Convertir en tôlerie", + "cmd.sheet_export_bend_table": "Exporter la table des plis", + "cmd.sheet_export_dxf": "Exporter la mise à plat en DXF", + "cmd.sheet_flange": "Bord tombé", + "cmd.sheet_flat_pattern": "Créer la mise à plat", + "cmd.sheet_fold": "Plier", + "cmd.sheet_hem": "Ourlet", + "cmd.sheet_manage_rules": "Règles de tôlerie", + "cmd.sheet_perforate": "Perforer", + "cmd.sheet_refold": "Replier", + "cmd.sheet_rules": "Lister les règles de tôlerie", + "cmd.sheet_unfold": "Déplier", + "cmd.sketch_arc_center_point": "Arc par centre", + "cmd.sketch_arc_tangent": "Arc tangent", + "cmd.sketch_arc_three_point": "Arc par 3 points", + "cmd.sketch_auto_constrain": "Contraintes automatiques", + "cmd.sketch_auto_constrain_from_datum": "Contraintes automatiques depuis la référence", + "cmd.sketch_auto_project": "Projeter automatiquement les arêtes de référence", + "cmd.sketch_blend_curve": "Courbe de raccordement", + "cmd.sketch_chain": "Chaîne", + "cmd.sketch_chamfer_distance_angle": "Chanfrein distance et angle", + "cmd.sketch_chamfer_equal_distance": "Chanfrein à distances égales", + "cmd.sketch_chamfer_two_distance": "Chanfrein à deux distances", + "cmd.sketch_circle_center": "Cercle par centre et diamètre", + "cmd.sketch_circle_three_point": "Cercle par 3 points", + "cmd.sketch_circle_three_tangent": "Cercle tangent à 3 éléments", + "cmd.sketch_circle_two_point": "Cercle par 2 points", + "cmd.sketch_circle_two_tangent": "Cercle tangent à 2 éléments", + "cmd.sketch_constrainer": "Contraintes d'esquisse", + "cmd.sketch_constraint_fix": "Fixer/Libérer", + "cmd.sketch_constraint_midpoint": "Point milieu", + "cmd.sketch_construction": "Normal/Construction", + "cmd.sketch_delete": "Supprimer des entités d'esquisse", + "cmd.sketch_dimension_text": "Déplacer le texte de cote", + "cmd.sketch_drag": "Faire glisser la géométrie d'esquisse", + "cmd.sketch_drag_end": "Terminer le glissement d'esquisse", + "cmd.sketch_draw_dimensioned": "Dessiner une géométrie cotée", + "cmd.sketch_edit": "Modifier l'esquisse", + "cmd.sketch_edit_text": "Modifier le texte", + "cmd.sketch_export_dxf": "Enregistrer en DXF", + "cmd.sketch_finish_auto_constrain": "Terminer avec contraintes automatiques", + "cmd.sketch_fit_curves_to_section": "Ajuster des courbes à la section du maillage", + "cmd.sketch_glyphs": "Symboles de contraintes", + "cmd.sketch_include_3d": "Inclure une géométrie 3D", + "cmd.sketch_insert_dxf": "Insérer un DXF", + "cmd.sketch_insert_svg": "Insérer un SVG", + "cmd.sketch_inspect": "Inspecter l'esquisse", + "cmd.sketch_intersection_curve": "Courbe d'intersection", + "cmd.sketch_isoparametric_curve": "Courbe isoparamétrique", + "cmd.sketch_line3d": "Ligne 3D", + "cmd.sketch_line_midpoint": "Ligne par point milieu", + "cmd.sketch_move": "Déplacer/Copier des entités d'esquisse", + "cmd.sketch_move3d": "Déplacer un point 3D", + "cmd.sketch_move_point": "Faire glisser un point d'esquisse", + "cmd.sketch_offset_break": "Rompre l'association du décalage", + "cmd.sketch_options": "Options de la palette d'esquisse", + "cmd.sketch_point3d": "Point 3D", + "cmd.sketch_polygon_circumscribed": "Polygone circonscrit", + "cmd.sketch_polygon_edge": "Polygone par côté", + "cmd.sketch_polygon_inscribed": "Polygone inscrit", + "cmd.sketch_project_to_surface": "Projeter sur une surface", + "cmd.sketch_rectangle_center": "Rectangle par centre", + "cmd.sketch_rectangle_rounded": "Rectangle arrondi", + "cmd.sketch_rectangle_three_point": "Rectangle par 3 points", + "cmd.sketch_rectangle_two_point": "Rectangle par 2 points", + "cmd.sketch_redefine": "Redéfinir le plan d'esquisse", + "cmd.sketch_slot_arc_center": "Rainure en arc par centre", + "cmd.sketch_slot_arc_three_point": "Rainure en arc par 3 points", + "cmd.sketch_slot_center_point": "Rainure par centre", + "cmd.sketch_slot_center_to_center": "Rainure de centre à centre", + "cmd.sketch_slot_overall": "Rainure hors tout", + "cmd.sketch_snap": "Accrochage et inférence", + "cmd.sketch_solve": "Résoudre l'esquisse", + "cmd.sketch_spline3d": "Spline 3D", + "cmd.sketch_spline_control_point": "Spline par points de contrôle", + "cmd.sketch_spline_control_point_5": "Spline par points de contrôle (degré 5)", + "cmd.sketch_spline_fit_point": "Spline par points", + "cmd.sketch_spun_profile": "Profil de révolution", + "cmd.sketch_toggle_driven": "Basculer en cote pilotée", + "cmd.solid_align": "Aligner", + "cmd.solid_boundary_fill": "Remplissage de frontière", + "cmd.solid_bounding_solid": "Solide englobant", + "cmd.solid_emboss": "Embossage", + "cmd.solid_move": "Déplacer/Copier", + "cmd.solid_offset_face": "Décaler la face", + "cmd.solid_press_pull": "Appuyer/Tirer", + "cmd.solid_remove": "Retirer", + "cmd.solid_replace_face": "Remplacer la face", + "cmd.solid_rib": "Nervure", + "cmd.solid_split_face": "Scinder la face", + "cmd.solid_web": "Voile", + "cmd.surface_patch": "Surface de remplissage", + "cmd.surface_stitch": "Coudre", + "cmd.surface_thicken": "Épaissir", + "cmd.surface_extrude": "Extrusion de surface", + "cmd.surface_revolve": "Révolution de surface", + "cmd.surface_sweep": "Balayage de surface", + "cmd.surface_loft": "Lissage de surface", + "cmd.surface_ruled": "Surface réglée", + "cmd.surface_boundary": "Surface frontière", + "cmd.surface_offset": "Surface décalée", + "cmd.surface_blend": "Surface de raccordement", + "cmd.surface_fillet": "Congé de surface", + "cmd.surface_untrim": "Annuler l'ajustement", + "cmd.surface_unstitch": "Découdre", + "cmd.surface_reverse_normal": "Inverser la normale", + "cmd.inspect_continuity": "Analyse de continuité", + "cmd.timeline_add": "Ajouter une fonction enregistrée", + "cmd.timeline_compute_all": "Tout recalculer", + "cmd.timeline_copy": "Copier les fonctions", + "cmd.timeline_dependents": "Dépendances de la fonction", + "cmd.timeline_export_script": "Exporter le script de commandes", + "cmd.timeline_inspect": "Inspecter la fonction", + "cmd.timeline_paste": "Coller les fonctions", + "cmd.timeline_redefine": "Modifier la fonction", + "cmd.timeline_rename": "Renommer", + "cmd.timeline_reorder": "Réordonner la fonction", + "cmd.timeline_roll_to": "Déplacer le marqueur d'historique", + "cmd.timeline_rollback": "Déplacer le marqueur de chronologie", + "cmd.timeline_suppress": "Désactiver la fonction", + "cmd.view_apply": "Restaurer la vue nommée", + "cmd.view_delete": "Supprimer la vue nommée", + "cmd.view_list": "Lister les vues nommées", + "cmd.view_rename": "Renommer la vue nommée", + "cmd.view_save": "Nouvelle vue nommée", + "dialog.custom_axis": "↖ Axe personnalisé", + "dialog.edit_title": "MODIFIER {title}", + "dialog.select": "↖ Sélectionner", + "dialog.selected_count": "↖ {count} sélectionné(s)", + "dialog.step": "Étape", + "dialog.selection_step": "{step} sur {total} : sélectionner {input}", + "dialog.selection_guidance": "Sélectionner une entrée pour la modifier. Cliquer sur un objet sélectionné pour le retirer ; Ctrl/Cmd-clic le bascule aussi. Vérifier l'aperçu, puis appuyer sur OK.", + "document.save_changes": "Enregistrer les modifications de {name} ?", + "document.unsaved_changes": "{name} contient des modifications non enregistrées. Si vous n'enregistrez pas, elles seront perdues.", + "settings.msaa_applies_on_restart": "L'anticrénelage s'appliquera au prochain démarrage de SolidCraft", + "settings.msaa_reset": "{setting} : {requested}× n'est pas pris en charge par ce périphérique graphique ; la valeur est désormais {reset}× (pris en charge : {supported}).", + "settings.msaa_unsupported": "Non pris en charge par ce périphérique graphique", + "settings.reset_intro": "Ces réglages ne fonctionnent pas sur cet ordinateur et empêcheraient SolidCraft de démarrer ; ils ont donc été modifiés :", + "settings.reset_title": "Des réglages ont été modifiés", + "sketch.degrees_of_freedom": "{count} degrés de liberté", + "sketch.draw_curves": "Dessiner en {linetype}", + "sketch.make_selection": "Convertir la sélection en {linetype}", + "ui.1_degree_of_freedom": "1 degré de liberté", + "ui.3d_mouse_speed": "Vitesse de la souris 3D", + "ui.3d_mouse_windows": "Souris 3D (Windows)", + "ui.3d_sketch": "Esquisse 3D", + "ui.about": "À propos", + "ui.activate": "Activer", + "ui.active_component": "Composant actif", + "ui.agent_cursor": "Curseur de l'agent", + "ui.agent_cursor_speed": "Vitesse du curseur de l'agent", + "ui.all": "Tout", + "ui.analysis": "Analyse", + "ui.angle": "Angle", + "ui.angle_decimals": "Décimales des angles", + "ui.animate_view_changes": "Animer les changements de vue", + "ui.animation": "Animation", + "ui.animation_speed": "Vitesse d'animation", + "ui.anti_aliasing": "Anticrénelage", + "ui.apply": "Appliquer", + "ui.arc": "Arc", + "ui.assemble": "Assembler", + "ui.autosave_every": "Enregistrement automatique toutes les", + "ui.axes": "Axes", + "ui.axis": "Axe", + "ui.base_point": "Point de base", + "ui.bodies": "Corps", + "ui.box": "Boîte", + "ui.break": "Fractionner", + "ui.cancel": "Annuler", + "ui.canvases": "Canevas", + "ui.center": "Centre", + "ui.centerline": "Ligne de construction", + "ui.chain": "Chaîne", + "ui.chamfer": "Chanfrein", + "ui.chamfer_type": "Type de chanfrein", + "ui.change_workspace": "Changer d'espace de travail", + "ui.chord_length": "Longueur de corde", + "ui.curvature_g2": "Courbure (G2)", + "ui.equivalent_radius": "Rayon équivalent", + "ui.circle": "Cercle", + "ui.circular_pattern": "Réseau circulaire", + "ui.clear": "Effacer", + "ui.clear_recent": "Effacer les récents", + "ui.clear_the_selection": "Effacer la sélection", + "ui.click_selects_whole_bodies": "Un clic sélectionne des corps entiers", + "ui.click_then_press_key": "Cliquer, puis appuyer sur la nouvelle touche", + "ui.close": "Fermer", + "ui.coil": "Hélice", + "ui.coincident": "Coïncidence", + "ui.collapse": "Réduire", + "ui.collinear": "Colinéarité", + "ui.colour_vision": "Vision des couleurs", + "ui.colour_vision_deutan": "Deutan", + "ui.colour_vision_deutan_tip": "Pour une perception du vert faible ou absente", + "ui.colour_vision_failed": "En échec", + "ui.colour_vision_fixed": "Fixe", + "ui.colour_vision_mode": "Mode", + "ui.colour_vision_note": "Modifie les couleurs porteuses de sens : états d'esquisse, axes, plis, analyses et icônes. Si vous utilisez les filtres de couleur de Windows, laissez ce réglage sur Désactivé.", + "ui.colour_vision_off": "Désactivé", + "ui.colour_vision_off_tip": "Les couleurs propres au thème", + "ui.colour_vision_projected": "Projeté", + "ui.colour_vision_protan": "Protan", + "ui.colour_vision_protan_tip": "Pour une perception du rouge faible ou absente", + "ui.colour_vision_sample": "Exemple", + "ui.colour_vision_tritan": "Tritan", + "ui.colour_vision_tritan_tip": "Pour une perception du bleu faible ou absente", + "ui.combine": "Combiner", + "ui.coming_later": "bientôt disponible", + "ui.concentric": "Concentricité", + "ui.configurations": "Configurations", + "ui.conic_curve": "Courbe conique", + "ui.constant": "Constant", + "ui.constraints_conflict": "Contraintes en conflit", + "ui.construct": "Construire", + "ui.construction": "Construction", + "ui.context_menu": "Menu contextuel", + "ui.copy": "Copier", + "ui.corner": "Angle", + "ui.corners": "Angles", + "ui.counterbore": "Lamage", + "ui.countersink": "Fraisure", + "ui.create": "Créer", + "ui.create_copy": "Créer une copie", + "ui.create_sketch": "Créer une esquisse", + "ui.current": "actuel", + "ui.curvature": "Courbure", + "ui.curves": "Courbes", + "ui.cut": "Couper", + "ui.cylinder": "Cylindre", + "ui.dark": "Sombre", + "ui.default_modelling_orientation": "Orientation de modélisation par défaut", + "ui.degrees_of_freedom": "degrés de liberté", + "ui.delete": "Supprimer", + "ui.depth": "Profondeur", + "ui.design": "Conception", + "ui.diameter": "Diamètre", + "ui.dimension": "Cote", + "ui.direction": "Direction", + "ui.distance": "Distance", + "ui.distance_1": "Distance 1", + "ui.distance_2": "Distance 2", + "ui.document_settings": "Réglages du document", + "ui.don_t_save": "Ne pas enregistrer", + "ui.draft": "Dépouille", + "ui.drawing": "Mise en plan", + "ui.drill_point": "Pointe de foret", + "ui.edit": "Modifier", + "ui.edit_section_analysis": "Modifier l'analyse de coupe", + "ui.ellipse": "Ellipse", + "ui.end_radius": "Rayon final", + "ui.entities": "Entités", + "ui.equal": "Égalité", + "ui.expand": "Développer", + "ui.export_ellipsis": "Exporter...", + "ui.export_ellipsis_keymap": "Exporter…", + "ui.export_keymap_tip": "Raccourcis, favoris de la boîte S et barre d'outils, dans un fichier", + "ui.extend": "Prolonger", + "ui.extent_type": "Type de limite", + "ui.extrude": "Extrusion", + "ui.factor": "Facteur", + "ui.feature_history": "Historique des fonctions", + "ui.feature_options": "Options de la fonction", + "ui.features": "Fonctions", + "ui.file": "Fichier", + "ui.fillet": "Congé", + "ui.filter_commands_or_keys": "Filtrer les commandes ou les touches", + "ui.finish_sketch": "Terminer l'esquisse", + "ui.fix_unfix": "Fixer/Libérer", + "ui.flat": "Plat", + "ui.flip": "Inverser", + "ui.front": "Avant", + "ui.fully_constrained": "Entièrement contrainte", + "ui.general": "Général", + "ui.graphics": "Graphisme", + "ui.ground_shadow": "Ombre au sol", + "ui.heading_add_ins": "COMPLÉMENTS", + "ui.heading_assemble": "ASSEMBLER", + "ui.heading_box": "BOÎTE", + "ui.heading_chamfer": "CHANFREIN", + "ui.heading_circular_pattern": "RÉSEAU CIRCULAIRE", + "ui.heading_coil": "HÉLICE", + "ui.heading_combine": "COMBINER", + "ui.heading_configure": "CONFIGURER", + "ui.heading_constraints": "CONTRAINTES", + "ui.heading_construct": "CONSTRUIRE", + "ui.heading_create": "CRÉER", + "ui.heading_create_sketch": "CRÉER UNE ESQUISSE", + "ui.heading_cylinder": "CYLINDRE", + "ui.heading_design": "DESIGN", + "ui.heading_draft": "DÉPOUILLE", + "ui.heading_edit": "ÉDITION", + "ui.heading_extrude": "EXTRUSION", + "ui.heading_fillet": "CONGÉ", + "ui.heading_finish_sketch": "TERMINER L'ESQUISSE", + "ui.heading_front": "AVANT", + "ui.heading_hole": "PERÇAGE", + "ui.heading_home": "ACCUEIL", + "ui.heading_insert": "INSÉRER", + "ui.heading_inspect": "INSPECTER", + "ui.heading_loft": "LISSAGE", + "ui.heading_make": "FABRIQUER", + "ui.heading_measure": "MESURER", + "ui.heading_mesh": "MAILLAGE", + "ui.heading_mirror": "SYMÉTRIE", + "ui.heading_modify": "MODIFIER", + "ui.heading_move": "DÉPLACER", + "ui.heading_offset": "DÉCALAGE", + "ui.heading_move_copy": "DÉPLACER/COPIER", + "ui.heading_offset_plane": "PLAN DÉCALÉ", + "ui.heading_ok": "OK", + "ui.heading_parameters": "PARAMÈTRES", + "ui.heading_pattern_on_path": "RÉSEAU SUR TRAJECTOIRE", + "ui.heading_pipe": "TUYAU", + "ui.heading_plane_at_angle": "PLAN INCLINÉ", + "ui.heading_plastic": "PLASTIQUE", + "ui.heading_prepare": "PRÉPARER", + "ui.heading_rectangular_pattern": "RÉSEAU RECTANGULAIRE", + "ui.heading_revolve": "RÉVOLUTION", + "ui.heading_right": "DROITE", + "ui.heading_scale": "ÉCHELLE", + "ui.heading_section_analysis": "ANALYSE DE COUPE", + "ui.heading_select": "SÉLECTIONNER", + "ui.heading_sheet_metal": "TÔLERIE", + "ui.heading_shell": "COQUE", + "ui.heading_sketch": "ESQUISSE", + "ui.heading_sketch_palette": "PALETTE D'ESQUISSE", + "ui.heading_sketch_scale": "ÉCHELLE D'ESQUISSE", + "ui.heading_solid": "SOLIDE", + "ui.heading_sphere": "SPHÈRE", + "ui.heading_split_body": "SCINDER LE CORPS", + "ui.heading_surface": "SURFACE", + "ui.heading_sweep": "BALAYAGE", + "ui.heading_thread": "FILETAGE", + "ui.heading_top": "DESSUS", + "ui.heading_torus": "TORE", + "ui.heading_utilities": "UTILITAIRES", + "ui.heading_utility": "UTILITAIRE", + "ui.help": "Aide", + "ui.hide": "Masquer", + "ui.hole": "Perçage", + "ui.hole_tap_type": "Type de taraudage", + "ui.hole_type": "Type de perçage", + "ui.home": "Accueil", + "ui.horizontal_vertical": "Horizontale/Verticale", + "ui.import_ellipsis": "Importer…", + "ui.insert": "Insérer", + "ui.inspect": "Inspecter", + "ui.intersect": "Intersection", + "ui.join": "Joindre", + "ui.joints": "Liaisons", + "ui.keyboard_shortcuts": "Raccourcis clavier", + "ui.language": "Langue", + "ui.length_decimals": "Décimales des longueurs", + "ui.light": "Clair", + "ui.line": "Ligne", + "ui.linetype": "Type de ligne", + "ui.loft": "Lissage", + "ui.look_at": "Vue normale", + "ui.look_at_anim_desc": "Vue d'axe, Vue normale, Accueil et Cadrer", + "ui.manufacture": "Fabrication", + "ui.measure": "Mesurer", + "ui.midpoint": "Point milieu", + "ui.mirror": "Symétrie", + "ui.mirror_line": "Ligne de symétrie", + "ui.modify": "Modifier", + "ui.move": "Déplacer", + "ui.multiple": "Multiple", + "ui.named_views": "Vues nommées", + "ui.navigation": "Navigation", + "ui.needs_design": "{command} : ouvrez d'abord une conception", + "ui.new_body": "Nouveau corps", + "ui.new_design": "Nouvelle conception", + "ui.normal": "Normal", + "ui.object_type": "Type d'objet", + "ui.objects": "Objets", + "ui.offer_to_stand_up_y_up_files": "Proposer de redresser les fichiers Y vers le haut", + "ui.offset": "Décalage", + "ui.offset_plane": "Plan décalé", + "ui.one_side": "Un côté", + "ui.open": "Ouvrir", + "ui.open_ellipsis": "Ouvrir...", + "ui.open_preferences": "Ouvrir les préférences", + "ui.open_recent": "Ouvrir un fichier récent", + "ui.operation": "Opération", + "ui.options": "Options", + "ui.orbit_around": "Orbite autour de", + "ui.origin": "Origine", + "ui.palette_points": "Points", + "ui.palette_profile": "Profil", + "ui.pan_zoom_orbit": "Panoramique, zoom, orbite", + "ui.parallel": "Parallélisme", + "ui.parameters": "Paramètres", + "ui.paste": "Coller", + "ui.path": "Trajectoire", + "ui.pattern_on_path": "Réseau sur trajectoire", + "ui.perpendicular": "Perpendicularité", + "ui.perspective_view": "Vue en perspective", + "ui.pipe": "Tuyau", + "ui.placement": "Placement", + "ui.plane": "Plan", + "ui.plane_at_angle": "Plan incliné", + "ui.point": "Point", + "ui.point_under_the_cursor": "Point sous le curseur", + "ui.points": "Points", + "ui.polygon": "Polygone", + "ui.preferences": "Préférences", + "ui.press_a_key": "appuyez sur une touche…", + "ui.profile": "Profil", + "ui.profile_plane": "Plan du profil", + "ui.profiles": "Profils", + "ui.project": "Projeter", + "ui.project_face_edges_sketch": "Projeter les arêtes de la face dans les nouvelles esquisses", + "ui.quantity": "Quantité", + "ui.quantity_2": "Quantité 2", + "ui.quit": "Quitter", + "ui.radial_context_menu": "Menu contextuel radial", + "ui.radius": "Rayon", + "ui.radius_type": "Type de rayon", + "ui.rectangle": "Rectangle", + "ui.rectangular_pattern": "Réseau rectangulaire", + "ui.redo": "Rétablir", + "ui.render": "Rendu", + "ui.renderer": "Moteur de rendu", + "ui.reset": "Réinitialiser", + "ui.reset_all": "Tout réinitialiser", + "ui.reset_the_settings_on_this_page": "Réinitialiser les réglages de cette page", + "ui.restore_defaults": "Rétablir les valeurs par défaut", + "ui.reverse_zoom_direction": "Inverser le sens du zoom", + "ui.revolve": "Révolution", + "ui.right": "Droite", + "ui.save": "Enregistrer", + "ui.save_as": "Enregistrer sous", + "ui.save_as_ellipsis": "Enregistrer sous...", + "ui.scale": "Échelle", + "ui.section_analysis": "Analyse de coupe", + "ui.select": "Sélectionner", + "ui.select_other_hint": "Sélectionner un autre élément : maintenir le bouton gauche immobile sur le modèle (ou clic droit › Sélectionner un autre…) pour lister tout ce qui se trouve sous le curseur ; cliquer de nouveau au même endroit pour sélectionner l'élément suivant.", + "ui.selection": "Sélection", + "ui.shell": "Coque", + "ui.show": "Afficher", + "ui.show_constraints": "Contraintes", + "ui.show_dimensions": "Cotes", + "ui.show_points": "Afficher les points", + "ui.show_profile": "Afficher le profil", + "ui.show_projected_geometries": "Géométries projetées", + "ui.simple": "Simple", + "ui.simulation": "Simulation", + "ui.single": "Unique", + "ui.sketch": "Esquisse", + "ui.sketch_dimension": "Cote d'esquisse", + "ui.sketch_grid": "Grille d'esquisse", + "ui.sketch_scale": "Échelle d'esquisse", + "ui.sketch_status": "État de l'esquisse", + "ui.sketches": "Esquisses", + "ui.slice": "Trancher", + "ui.slot": "Rainure", + "ui.smooth": "Lisse", + "ui.smooth_wheel_zoom": "Zoom fluide à la molette", + "ui.smooth_wheel_zoom_tip": "Désactiver pour appliquer chaque cran de molette immédiatement, sans lissage", + "ui.snap": "Accrochage", + "ui.space_mouse_hint": "Déplace et fait pivoter la vue en même temps ; dans les esquisses, seuls le panoramique et le zoom sont utilisés.", + "ui.space_mouse_navigate": "Naviguer avec SpaceNavigator / SpaceMouse", + "ui.spacing": "Espacement", + "ui.spacing_2": "Espacement 2", + "ui.sphere": "Sphère", + "ui.spline": "Spline", + "ui.split_body": "Scinder le corps", + "ui.stand_up_tip": "Après l'ouverture d'un fichier STEP ou IGES avec Z vers le haut, proposer un quart de tour autour de X", + "ui.start": "Début", + "ui.start_radius": "Rayon initial", + "ui.sweep": "Balayage", + "ui.symmetric": "Symétrique", + "ui.symmetry": "Symétrie", + "ui.system": "Système", + "ui.tangent": "Tangence", + "ui.taper_angle": "Angle de dépouille", + "ui.tapped": "Taraudé", + "ui.text": "Texte", + "ui.theme": "Thème", + "ui.thickness": "Épaisseur", + "ui.thread": "Filetage", + "ui.timeline_bottom": "Chronologie en bas", + "ui.timeline_left_note": "La disposition à gauche affiche la barre de retour en arrière au-dessus du navigateur des pièces et de la scène.", + "ui.timeline_left_sidebar": "Barre latérale gauche", + "ui.tip_angle": "Angle de pointe", + "ui.to_object": "Jusqu'à l'objet", + "ui.top": "Dessus", + "ui.torus": "Tore", + "ui.trackpad_pan_tip": "Les gestes du pavé tactile font un panoramique (désactivé : ils zooment comme la molette) ; la molette zoome, la molette latérale fait un panoramique horizontal, le pincement zoome toujours", + "ui.trim": "Ajuster", + "ui.two_finger_scroll_pans": "Défilement à deux doigts pour le panoramique", + "ui.two_sides": "Deux côtés", + "ui.ui_scale": "Échelle de l'interface", + "ui.undo": "Annuler", + "ui.units": "Unités", + "ui.units_of_new_designs": "Unités des nouvelles conceptions", + "ui.untitled": "Sans titre", + "ui.up_axis_note": "Axe orienté vers le haut dans les vues (vue d'axe, Accueil, Vue normale). Les conceptions ne sont pas modifiées.", + "ui.variable": "Variable", + "ui.view_centre": "Centre de la vue", + "ui.visual_shaded_hidden_edges": "Ombré avec arêtes cachées", + "ui.visual_shaded_with_edges": "Ombré avec arêtes", + "ui.visual_style": "Style visuel", + "ui.visual_wireframe": "Filaire", + "ui.workspace": "espace de travail", + "ui.x_distance": "Distance X", + "ui.y_distance": "Distance Y", + "ui.y_up": "Y vers le haut", + "ui.z_up": "Z vers le haut", + "ui.zoom_to_cursor_tip": "La molette zoome vers le point sous le curseur (désactivé : vers le centre de la vue)", + "ui.zoom_to_the_cursor": "Zoom vers le curseur", + "A new configuration, a copy of the active one": "Nouvelle configuration, copie de la configuration active", + "About SolidCraft": "À propos de SolidCraft", + "Active": "Actif", + "Active rule": "Règle active", + "Add": "Ajouter", + "Add Key": "Ajouter une image clé", + "Add Mid Radius": "Ajouter un rayon intermédiaire", + "Add Row": "Ajouter une ligne", + "All Sketch Points": "Tous les points d'esquisse", + "All open designs": "Toutes les conceptions ouvertes", + "Allowed expressions, separated by semicolons": "Expressions autorisées, séparées par des points-virgules", + "Also deletes": "Supprime aussi", + "Angle 2": "Angle 2", + "Animate": "Animer", + "Appearance name": "Nom de l'apparence", + "Applied Radius": "Rayon appliqué", + "Apply To": "Appliquer à", + "Area": "Aire", + "Attachment": "Rattachement", + "BROWSER": "NAVIGATEUR", + "Bend Line Position": "Position de la ligne de pli", + "Bend Position": "Position du pli", + "Bend Radius": "Rayon de pliage", + "Bends": "Plis", + "Body": "Corps", + "Bounding box": "Boîte englobante", + "CSV or JSON: updates existing parameters, adds new ones": "CSV ou JSON : met à jour les paramètres existants, ajoute les nouveaux", + "Capture All Positions": "Capturer toutes les positions", + "Catch Direction": "Direction de l'ergot", + "Cells": "Cellules", + "Center X": "Centre X", + "Center Y": "Centre Y", + "Center of mass": "Centre de gravité", + "Chamfer Type": "Type de chanfrein", + "Check collisions": "Vérifier les collisions", + "Checked": "Vérifié", + "Choose a new plane. Sketch geometry and dimensions stay unchanged in its two-dimensional coordinates.": "Choisir un nouveau plan. La géométrie et les cotes de l'esquisse restent inchangées dans ses coordonnées bidimensionnelles.", + "Close draft": "Fermer le brouillon", + "Collisions": "Collisions", + "Colour": "Couleur", + "Component1": "Composant1", + "Configuration": "Configuration", + "Configuration rules": "Règles de configuration", + "Contact": "Contact", + "Copy all licences": "Copier toutes les licences", + "Copy diagnostic information": "Copier les informations de diagnostic", + "Copy report": "Copier le rapport", + "Corner Relief Shape": "Forme du dégagement d'angle", + "Counterbore depth": "Profondeur du lamage", + "Countersink angle": "Angle de la fraisure", + "Create Issue — review draft": "Créer un ticket — relire le brouillon", + "Customize Toolbar": "Personnaliser la barre d'outils", + "Delete all": "Tout supprimer", + "Delete rule": "Supprimer la règle", + "Delete the row": "Supprimer la ligne", + "Delete the set": "Supprimer le jeu", + "Delete this parameter": "Supprimer ce paramètre", + "Density": "Masse volumique", + "Designs you open or save appear here.": "Les conceptions que vous ouvrez ou enregistrez apparaissent ici.", + "Determined by To Object. Choose Angle to edit the angular extent.": "Déterminé par Jusqu'à l'objet. Choisir Angle pour modifier l'étendue angulaire.", + "Discard": "Abandonner", + "Double-click to rename": "Double-cliquer pour renommer", + "Drive Joint": "Piloter la liaison", + "Edit Profile Sketch": "Modifier l'esquisse du profil", + "Enable rule": "Activer la règle", + "Enabled": "Activé", + "Explode": "Éclater", + "Extents": "Étendues", + "Face attachment lost": "Rattachement à la face perdu", + "Faces / edges / vertices": "Faces / arêtes / sommets", + "Favourite": "Favori", + "Files from many CAD programs have Y up, so they open lying on their back here (Z up).": "Les fichiers de nombreux logiciels de CAO ont Y vers le haut : ils s'ouvrent donc couchés ici (Z vers le haut).", + "Filter": "Filtrer", + "Find in Browser": "Trouver dans le navigateur", + "Flat size": "Dimensions à plat", + "Follow camera (Look At sketches)": "Suivre la caméra (vue normale aux esquisses)", + "Font": "Police", + "Full Length": "Longueur totale", + "Gap": "Jeu", + "Grid": "Grille", + "Height": "Hauteur", + "Home view": "Vue d'accueil", + "In This Design": "Dans cette conception", + "Interferes": "Interfère", + "Issue title": "Titre du ticket", + "Joint Origin1": "Origine de liaison1", + "Keep Tools": "Conserver les outils", + "Later": "Plus tard", + "Leave it": "Laisser tel quel", + "Legacy face attachment. Rebinding to a certified face creates an exact attachment.": "Rattachement à la face hérité. Le relier à une face certifiée crée un rattachement exact.", + "Length": "Longueur", + "Length units": "Unités de longueur", + "Library": "Bibliothèque", + "Loop": "Boucle", + "Margin": "Marge", + "Mass": "Masse", + "Material": "Matériau", + "Mid Radius": "Rayon intermédiaire", + "Modeled": "Modélisé", + "More toolbar panels": "Autres groupes de la barre d'outils", + "Motion": "Mouvement", + "Move Type": "Type de déplacement", + "Move earlier": "Déplacer plus tôt", + "Move later": "Déplacer plus tard", + "Name": "Nom", + "No crash reports.": "Aucun rapport de plantage.", + "No matching appearances": "Aucune apparence correspondante", + "Not available yet": "Pas encore disponible", + "Opacity": "Opacité", + "Open GitHub draft": "Ouvrir le brouillon GitHub", + "Open-source parametric 3D CAD in Rust. Licensed MIT OR Apache-2.0.": "CAO 3D paramétrique open source en Rust. Sous licence MIT OR Apache-2.0.", + "Other side": "Autre côté", + "Parameter values": "Valeurs des paramètres", + "Per Edge": "Par arête", + "Pick the tool bodies": "Choisir les corps outils", + "Place at the origin instead": "Placer plutôt à l'origine", + "Playback": "Lecture", + "Position": "Position", + "Position (0 to 1)": "Position (0 à 1)", + "Position along the edge, 0 at the start end, 1 at the other": "Position le long de l'arête : 0 à l'extrémité de départ, 1 à l'autre", + "Preview leaves the current design unchanged.": "L'aperçu ne modifie pas la conception actuelle.", + "RECENT": "RÉCENTS", + "Radius Fit": "Ajustement du rayon", + "Ratio": "Rapport", + "Recover": "Récupérer", + "Recover unsaved design?": "Récupérer la conception non enregistrée ?", + "Remove Tools": "Retirer les outils", + "Remove from list": "Retirer de la liste", + "Remove private design details or paths before sharing.": "Retirez les détails privés de la conception et les chemins avant de partager.", + "Remove the column": "Retirer la colonne", + "Remove the track": "Retirer la piste", + "Remove this point": "Retirer ce point", + "Report a bug — review a screenshot and open a GitHub draft": "Signaler un bug — relire une capture d'écran et ouvrir un brouillon GitHub", + "Reset Toolbar": "Réinitialiser la barre d'outils", + "Restore the inherited component or physical material appearance": "Rétablir l'apparence héritée du composant ou du matériau physique", + "Result": "Résultat", + "Retake screenshot": "Reprendre la capture d'écran", + "Reverse": "Inverser", + "Reverse Direction": "Inverser la direction", + "Revert": "Rétablir", + "Revert All Positions": "Rétablir toutes les positions", + "Review the report and screenshot before opening GitHub.": "Relisez le rapport et la capture d'écran avant d'ouvrir GitHub.", + "Rim Edge": "Arête du bord", + "Roll History Marker Here": "Placer le marqueur d'historique ici", + "Rule": "Règle", + "Saved preview. Geometry is being checked before editing.": "Aperçu enregistré. La géométrie est en cours de vérification avant modification.", + "Scale factor": "Facteur d'échelle", + "Search": "Rechercher", + "Search commands": "Rechercher des commandes", + "Select bodies (a face picks its body)": "Sélectionner des corps (une face sélectionne son corps)", + "Select bodies or faces instead": "Sélectionner plutôt des corps ou des faces", + "Selection filter": "Filtre de sélection", + "Semantic faces share their appearance across instances.": "Les faces sémantiques partagent leur apparence entre les instances.", + "Shape": "Forme", + "Show Agent Cursor": "Afficher le curseur de l'agent", + "Show in folder": "Afficher dans le dossier", + "Size": "Taille", + "Sketch plane has no body-face attachment.": "Le plan d'esquisse n'est rattaché à aucune face de corps.", + "SolidCraft closed before these designs were saved. Their last autosave can be opened.": "SolidCraft s'est fermé avant l'enregistrement de ces conceptions. Leur dernier enregistrement automatique peut être ouvert.", + "Speed": "Vitesse", + "Stand it up": "Redresser", + "Stand it up: a quarter turn about X, as one Move feature you can undo.": "Redresser : un quart de tour autour de X, sous forme d'une fonction Déplacer que vous pouvez annuler.", + "Stand this part up?": "Redresser cette pièce ?", + "Step": "Étape", + "Steps": "Étapes", + "Suppressed": "Désactivé", + "Swap Ends": "Permuter les extrémités", + "Tangent Chain": "Chaîne tangente", + "The dashed sketch is a saved plane guide. Select a new face to repair the attachment.": "L'esquisse en pointillés est un guide de plan enregistré. Sélectionnez une nouvelle face pour réparer le rattachement.", + "The saved author occurrence is missing. Select a valid author placement before rebinding.": "L'occurrence d'auteur enregistrée est introuvable. Sélectionnez un placement d'auteur valide avant de relier.", + "Then": "Alors", + "These features will be deleted:": "Ces fonctions seront supprimées :", + "These features will fail:": "Ces fonctions échoueront :", + "This child is shared. Deleting it removes it from every copy of its parent.": "Cet enfant est partagé. Le supprimer le retire de toutes les copies de son parent.", + "This child is shared. Position changes apply to every copy of its parent.": "Cet enfant est partagé. Les changements de position s'appliquent à toutes les copies de son parent.", + "This face cannot provide a durable attachment. Choose another face or explicitly use a fixed plane.": "Cette face ne peut pas fournir de rattachement durable. Choisissez une autre face ou utilisez explicitement un plan fixe.", + "To Offset": "Jusqu'au décalage", + "Tolerance": "Tolérance", + "Type": "Type", + "Updating the preview": "Mise à jour de l'aperçu", + "Use fixed plane": "Utiliser un plan fixe", + "VIEW": "VUE", + "Value": "Valeur", + "Volume": "Volume", + "Wall": "Paroi", + "When": "Quand", + "Width": "Largeur", + "Will fail": "Échouera", + "angle, height": "angle, hauteur", + "command name": "nom de la commande", + "expression, e.g. 25 mm": "expression, par ex. 25 mm", + "fits the face, e.g. M8": "adapté à la face, par ex. M8", + "from the rule": "selon la règle", + "needs two joints": "nécessite deux liaisons", + "new configuration": "nouvelle configuration", + "new name": "nouveau nom", + "new parameter": "nouveau paramètre", + "no interference": "aucune interférence", + "no joint that moves yet": "aucune liaison mobile pour l'instant", + "no picture": "aucune image", + "pick a hole to seat it, or OK places it at the origin": "choisir un trou pour la loger, ou OK la place à l'origine", + "pick one or two vertices, edges or faces": "choisir un ou deux sommets, arêtes ou faces", + "the parts library is not available": "la bibliothèque de pièces n'est pas disponible", + "to the next face": "jusqu'à la face suivante", + "Revert Position": "Rétablir la position", + "Construction": "Construction", + "Faces": "Faces", + "Edges": "Arêtes", + "Vertices": "Sommets", + "Sketch geometry and profiles": "Géométrie et profils d'esquisse", + "Sketch curves": "Courbes d'esquisse", + "Sketch points": "Points d'esquisse", + "Sketch dimensions": "Cotes d'esquisse", + "Sketch constraints": "Contraintes d'esquisse", + "0 turns it off": "0 le désactive", + "Show the pointer an AI agent moves (#35)": "Afficher le pointeur déplacé par un agent IA (#35)", + "Follow the camera (Look At sketches)": "Suivre la caméra (vue normale aux esquisses)", + "Flat": "Plat", + "Save Rule": "Enregistrer la règle", + "Preview Row": "Aperçu de la ligne", + "Add condition": "Ajouter une condition", + "Apply to selection": "Appliquer à la sélection", + "Remove override": "Retirer le remplacement", + "Copy screenshot": "Copier la capture d'écran", + "Remove screenshot": "Retirer la capture d'écran", + "Use active author placement": "Utiliser le placement d'auteur actif", + "Reattach selected face": "Rattacher la face sélectionnée", + "Use saved fixed plane": "Utiliser le plan fixe enregistré", + "Use selected face as fixed plane": "Utiliser la face sélectionnée comme plan fixe", + "View navigator": "Repère de navigation", + "Signed axes": "Axes signés", + "Cube": "Cube", + "Middle double-click": "Double-clic milieu", + "Double-clicking the middle button in the view: Home (the home view, framing what is shown), Fit (frame what is shown, keeping the orientation) or nothing": "Double-clic sur le bouton du milieu dans la vue : Accueil (vue d'accueil, cadrant ce qui est affiché), Cadrer (cadrer ce qui est affiché en gardant l'orientation) ou rien", + "Select Other: hold the left button still on the model (or right-click › Select Other…) to list everything under the cursor; click again on the same spot to select the next thing there. Double-click the middle button to go Home (Preferences › Navigation).": "Sélectionner un autre élément : maintenir le bouton gauche immobile sur le modèle (ou clic droit › Sélectionner un autre…) pour lister tout ce qui se trouve sous le curseur ; cliquer de nouveau au même endroit pour sélectionner l'élément suivant. Double-cliquer avec le bouton du milieu pour revenir à l'accueil (Préférences › Navigation).", + "cmd.render_backends": "Moteurs de rendu", + "cmd.view_navigate": "Naviguer dans la vue", + "ui.animateJoint": "Animer la liaison", + "ui.calibrate": "Étalonner", + "ui.customizeToolbar": "Personnaliser la barre d'outils…", + "ui.editJointLimits": "Modifier les limites de liaison", + "ui.exportDxf": "Exporter en DXF…", + "ui.findInTimeline": "Trouver dans la chronologie", + "ui.findInWindow": "Trouver dans la fenêtre", + "ui.fit": "Cadrer", + "ui.groupSelected": "Grouper la sélection", + "ui.hideAxes": "Masquer les axes", + "ui.hideDimension": "Masquer la cote", + "ui.hideOrigin": "Masquer l'origine", + "ui.hidePlanes": "Masquer les plans", + "ui.hideProfile": "Masquer le profil", + "ui.homeView": "Vue d'accueil", + "ui.isolate": "Isoler", + "ui.lock": "Verrouiller", + "ui.newSketchGroup": "Nouveau groupe d'esquisses", + "ui.normalConstruction": "Normal / Construction", + "ui.orbit": "Orbite", + "ui.heading_position": "POSITION", + "ui.pan": "Panoramique", + "ui.pinToShortcuts": "Épingler aux raccourcis", + "ui.pinToToolbar": "Épingler à la barre d'outils", + "ui.properties": "Propriétés", + "ui.removeSection": "Retirer la coupe", + "ui.removeFromToolbar": "Retirer de la barre d'outils", + "ui.repeat": "Répéter", + "ui.report_a_bug": "Signaler un bug", + "ui.restore": "Restaurer", + "ui.heading_setup": "RÉGLAGES", + "ui.selectOther": "Sélectionner un autre…", + "ui.selectTangentChain": "Sélectionner la chaîne tangente", + "ui.showAll": "Tout afficher", + "ui.showAllBodies": "Afficher tous les corps", + "ui.showAxes": "Afficher les axes", + "ui.showDimension": "Afficher la cote", + "ui.showOrigin": "Afficher l'origine", + "ui.showPlanes": "Afficher les plans", + "ui.suppress": "Désactiver", + "ui.command_palette_hint": "Tapez une commande, ex. {example} — ou S pour chercher", + "ui.unground": "Libérer", + "ui.unisolate": "Annuler l'isolement", + "ui.unlock": "Déverrouiller", + "ui.unsuppress": "Réactiver", + "ui.updateToCurrentView": "Mettre à jour avec la vue actuelle", + "ui.zoom": "Zoom", + "ui.command_done": "{command} terminé", + "timeline.group": "Nouveau dossier de fonctions", + "timeline.ungroup": "Supprimer les dossiers de fonctions", + "timeline.rename_group": "Renommer le dossier de fonctions", + "timeline.move_to_group": "Déplacer les fonctions vers le dossier", + "timeline.move_many": "Déplacer des éléments de la chronologie", + "timeline.reorder_many": "Réordonner les fonctions", + "ui.show_construction_geometries": "Géométries de construction", + "ui.total_angle": "Angle total", + "sketch_text.builtin_font": "{family} (intégrée)", + "sketch_text.font_search": "Rechercher des polices", + "sketch_text.loading_fonts": "Recherche des polices installées…", + "sketch_text.use_font_file": "Utiliser le fichier de police {path}", + "sketch_text.bold": "Gras", + "sketch_text.italic": "Italique", + "sketch_text.align_left": "Gauche", + "sketch_text.align_center": "Centre", + "sketch_text.align_right": "Droite", + "sketch_text.path_hint": "Une courbe de l'esquisse que le texte suit : cliquer ici, puis sur la courbe", + "sketch_text.path_clear": "Détacher le texte de sa courbe", + "Style": "Style", + "Alignment": "Alignement", + "Letter Spacing": "Espacement des lettres", + "Line Spacing": "Interligne", + "Path": "Trajectoire", + "sketch_text.on_path": "Le texte suit sa trajectoire : la courbe le positionne", + "cmd.library_inspect": "Inspecter la bibliothèque locale", + "cmd.library_export": "Exporter la bibliothèque de la conception", + "cmd.library_apply": "Appliquer une entrée de la bibliothèque locale", + "Thin": "Mince", + "Thin Extrude": "Extrusion mince", + "Wall Location": "Position de la paroi", + "Wall Thickness": "Épaisseur de paroi", + "Thickness Outside": "Épaisseur extérieure", + "Inside": "Intérieur", + "Outside": "Extérieur", + "Profiles/Curves": "Profils/Courbes", + "cmd.material_properties_validate": "Valider les données du matériau physique", + "cmd.material_properties_directional": "Module d'élasticité directionnel", + "update.button": "Mettre à jour", + "update.button_tip": "SolidCraft {version} est disponible", + "update.title": "Mise à jour disponible", + "update.available": "SolidCraft {version} est disponible", + "update.you_have": "Vous avez la version {version}.", + "update.no_notes": "Cette version n'a pas de notes.", + "update.system_hint": "Cette copie est un {kind}. Mettez-la à jour avec :", + "update.package_hint": "Cette copie provient d'un {kind}. Téléchargez le nouveau paquet, puis installez-le avec :", + "update.copy": "Copier", + "update.file": "Le téléchargement récupère {file}.", + "update.download": "Télécharger", + "update.release_page": "Ouvrir la page de la version", + "update.skip": "Ignorer cette version", + "update.later": "Me le rappeler plus tard", + "update.prefs_label": "Mises à jour", + "update.check_automatically": "Rechercher automatiquement les mises à jour", + "update.check_now": "Vérifier maintenant", + "update.checking": "Vérification…", + "update.failed": "Vérification impossible : {error}", + "update.up_to_date": "SolidCraft est à jour.", + "update.prefs_note": "Ceci est SolidCraft {version} ({kind}). Une vérification interroge GitHub sur la dernière version et n'envoie rien d'autre.", + "update.prefs_dev": "Ceci est une version de développement ({version}) : elle ne vérifie pas les mises à jour.", + "update.show": "Afficher la mise à jour vers {version}", + "update.prefs_flatpak": "Flatpak met à jour cette copie ({version}) : exécutez {command} ou utilisez votre logithèque. SolidCraft ne vérifie pas.", + "update.update_now": "Mettre à jour maintenant", + "update.install_msi": "Installer (ferme SolidCraft)", + "update.download_open": "Télécharger et ouvrir", + "update.downloading": "Téléchargement et vérification… {done} sur {total} Mo", + "update.installed": "SolidCraft {version} est installé. Redémarrez pour l'utiliser.", + "update.restart": "Redémarrer maintenant", + "update.restart_later": "Plus tard", + "update.installer_started": "L'installateur démarre à la fermeture de SolidCraft.", + "update.dmg_opened": "L'image disque est ouverte et vérifiée : faites glisser SolidCraft dans Applications en remplaçant l'ancienne copie, puis redémarrez SolidCraft.", + "update.install_failed": "La mise à jour ne s'est pas installée : {error}. Rien n'a été modifié ; Télécharger récupère plutôt le paquet.", + "cmd.render_settings_get": "Réglages de rendu", + "cmd.render_settings_set": "Enregistrer les réglages de rendu" +} diff --git a/crates/ui-egui/src/i18n.rs b/crates/ui-egui/src/i18n.rs index eecd8eee..782f401c 100644 --- a/crates/ui-egui/src/i18n.rs +++ b/crates/ui-egui/src/i18n.rs @@ -34,10 +34,11 @@ impl Catalog { static ENGLISH: Catalog = Catalog::new("en", "English", include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/../../assets/locales/en.json"))); static JAPANESE: Catalog = Catalog::new("ja", "日本語", include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/../../assets/locales/ja.json"))); static GERMAN: Catalog = Catalog::new("de", "Deutsch", include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/../../assets/locales/de.json"))); +static FRENCH: Catalog = Catalog::new("fr", "Français", include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/../../assets/locales/fr.json"))); static KOREAN: Catalog = Catalog::new("ko", "한국어", include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/../../assets/locales/ko.json"))); static RUSSIAN: Catalog = Catalog::new("ru", "Русский", include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/../../assets/locales/ru.json"))); static CHINESE: Catalog = Catalog::new("zh", "中文", include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/../../assets/locales/zh.json"))); -pub const LOCALES: &[&Catalog] = &[&ENGLISH, &JAPANESE, &GERMAN, &KOREAN, &RUSSIAN, &CHINESE]; +pub const LOCALES: &[&Catalog] = &[&ENGLISH, &JAPANESE, &GERMAN, &FRENCH, &KOREAN, &RUSSIAN, &CHINESE]; pub fn is_supported(id: &str) -> bool { LOCALES.iter().any(|catalog| catalog.id == id) @@ -188,9 +189,9 @@ mod tests { } /// Catalogs delivered complete. English is the source catalog; Japanese was completed - /// upstream and Chinese lands complete here. German, Korean and Russian are partial - /// (German and Korean predate the coverage guards; Russian is kept partial so a new label - /// doesn't need a sixth translation), so their gaps fall back to English and are reported by + /// upstream and Chinese lands complete here. German, Korean, Russian and French are partial + /// (German and Korean predate the coverage guards; Russian and French are kept partial so a + /// new label doesn't need more translations), so their gaps fall back to English and are reported by /// `cargo xtask i18n` without failing the build, while nothing in the complete catalogs may /// regress. const COMPLETE: &[&str] = &["ja", "zh"]; @@ -260,6 +261,7 @@ mod tests { ("de", "Flansch", "Zebra-Analyse", "Bewegungsuntersuchung"), ("ko", "플랜지", "얼룩말줄무늬 분석", "운동 연구"), ("ru", "Фланец", "Зебра-анализ", "Исследование движения"), + ("fr", "Bord tombé", "Analyse zébrée", "Étude de mouvement"), ]; for (lang, flange, zebra, motion) in cases { let locale = Locale::for_language(lang); @@ -335,9 +337,13 @@ mod tests { /// non-empty string" would not catch that. #[test] fn id_labels_resolve_to_their_own_translation_not_an_english_fallback() { - for (lang, profile, points) in - [("de", "Profil", "Punkte"), ("ja", "プロファイル", "点"), ("ko", "프로파일", "점"), ("ru", "Профиль", "Точки")] - { + for (lang, profile, points) in [ + ("de", "Profil", "Punkte"), + ("ja", "プロファイル", "点"), + ("ko", "프로파일", "점"), + ("ru", "Профиль", "Точки"), + ("fr", "Profil", "Points"), + ] { let locale = Locale::for_language(lang); assert_eq!(locale.label("ui.palette_profile"), profile, "{lang}"); assert_eq!(locale.label("ui.palette_points"), points, "{lang}"); @@ -355,7 +361,13 @@ mod tests { /// the row's two-word text must reach its own entry rather than that one. #[test] fn the_construction_geometries_row_reaches_its_own_entry_not_the_line_type() { - let rows = [("de", "Konstruktionsgeometrien"), ("ja", "構築ジオメトリ"), ("ko", "구성 형상"), ("ru", "Вспомогательная геометрия")]; + let rows = [ + ("de", "Konstruktionsgeometrien"), + ("ja", "構築ジオメトリ"), + ("ko", "구성 형상"), + ("ru", "Вспомогательная геометрия"), + ("fr", "Géométries de construction"), + ]; for (lang, want) in rows { let locale = Locale::for_language(lang); assert_eq!(locale.label("Construction Geometries"), want, "{lang}"); @@ -428,6 +440,29 @@ mod tests { assert_eq!(ru.dynamic("Sketch of bracket"), "Sketch of bracket"); } + #[test] + fn french_catalog_translates_keys_labels_and_browser_patterns() { + let fr = Locale::for_language("fr"); + assert_eq!(fr.name(), "Français"); + assert!(is_supported("fr")); + assert_eq!(fr.text("ui.preferences"), "Préférences"); + assert_eq!(fr.label("Extrude"), "Extrusion"); + assert_eq!(fr.label("Fillet"), "Congé"); + assert_eq!(fr.label("CREATE SKETCH"), "CRÉER UNE ESQUISSE"); + assert_eq!(fr.label("NonExistentKey"), "NonExistentKey"); + // French puts a no-break space before the two-part punctuation marks. + assert_eq!(fr.format("document.save_changes", &[("name", "My {design}")]), "Enregistrer les modifications de My {design}\u{a0}?"); + assert_eq!(fr.format("dialog.selected_count", &[("count", "2")]), "↖ 2 sélectionné(s)"); + assert_eq!(fr.dynamic("Sketch1"), "Esquisse1"); + assert_eq!(fr.dynamic("Body2"), "Corps2"); + assert_eq!(fr.dynamic("Component12"), "Composant12"); + assert_eq!(fr.dynamic("Units: mm"), "Unités\u{a0}: mm"); + assert_eq!(fr.dynamic("Precision: 3"), "Précision\u{a0}: 3"); + assert_eq!(fr.dynamic("Parameters (5)"), "Paramètres (5)"); + assert_eq!(fr.dynamic("4 degrees of freedom"), "4 degrés de liberté"); + assert_eq!(fr.dynamic("Sketch of bracket"), "Sketch of bracket"); + } + #[test] fn render_scopes_restore_the_previous_language() { let _english = scope("en"); diff --git a/crates/ui-egui/src/i18n_ui_tests.rs b/crates/ui-egui/src/i18n_ui_tests.rs index 210cc879..46d7d0d6 100644 --- a/crates/ui-egui/src/i18n_ui_tests.rs +++ b/crates/ui-egui/src/i18n_ui_tests.rs @@ -65,6 +65,7 @@ fn window_chrome_renders_in_the_active_language() { ("de", "BROWSER", "Auswahlfilter", "Flächen"), ("ko", "브라우저", "선택 필터", "면"), ("ru", "БРАУЗЕР", "Фильтр выделения", "Грани"), + ("fr", "NAVIGATEUR", "Filtre de sélection", "Faces"), ] { let mut h = Harness::new(); h.app.preferences.language = lang.into(); diff --git a/crates/ui-egui/src/prefs.rs b/crates/ui-egui/src/prefs.rs index 738b76f4..d27fb239 100644 --- a/crates/ui-egui/src/prefs.rs +++ b/crates/ui-egui/src/prefs.rs @@ -1584,7 +1584,7 @@ mod tests { assert!(control(&mut app, &json!({"open": "Plugins"})).is_err()); assert!(set(&mut app, &json!({"up_axis": "x"})).is_err()); assert!(set(&mut app, &json!({"theme": "sepia"})).is_err()); - assert!(set(&mut app, &json!({"language": "fr"})).is_err()); + assert!(set(&mut app, &json!({"language": "xx"})).is_err()); } #[test] diff --git a/docs/control-protocol.md b/docs/control-protocol.md index 387a6516..e5c98082 100644 --- a/docs/control-protocol.md +++ b/docs/control-protocol.md @@ -127,7 +127,7 @@ unit regardless of the design, pass an expression with one: `"value": "50 mm"` o | `ui.home` | `open?`: bool; `sample?`: index | the start page: show or hide it, open a built-in sample (once built); returns `open` and the recent designs | | `ui.shortcut` | `command`, `key?`, `replace?` | a command's key, or rebinds it (`""` clears; a key another command uses is refused unless `replace`) | | `ui.help` | `item?`: `about`, `shortcuts` (read only), `report` (opens a report draft for review), `crashes` (the Crash Reports window) | the version, commit, build date and diagnostic text | -| `ui.prefs` | any of `default_units`, `nav` (`fusion`, `solidworks`, `inventor`, `alias`, `tinkercad`, `openscad`), `zoom_reverse`, `zoom_to_cursor`, `smooth_wheel_zoom` (default true), `trackpad_pan` (default true: two-finger scroll pans, pinch zooms), `orbit_cursor`, `look_at_anim`, `look_at_speed`, `middle_double_click` (`home` (default), `fit`, `off`), `msaa`, `length_decimals`, `angle_decimals`, `theme` (`dark`, `light`, `system`), `language` (`en`, `ja`, `de`, `ko`, `ru`, `zh`; see [localization](localization.md)), `ui_scale`, `up_axis` (`z`, `y`), `offer_stand_up`, `color_vision` (`off` (default), `protan`, `deutan`, `tritan`: colour vision modes, #778), `check_updates` (default true; [updates](book/src/guide/updates.md)); `open` (a page: General, Navigation, Keyboard Shortcuts, Design, Graphics, Sketch, Selection) opens the Preferences dialog there; `button`: `ok`, `cancel`, `apply`, `defaults`; `stand_up: true` stands up a just-opened Y-up file | sets preferences (kept between runs), returns them all plus `dialog` (the open page or null), `dark` and `stand_up_offer` | +| `ui.prefs` | any of `default_units`, `nav` (`fusion`, `solidworks`, `inventor`, `alias`, `tinkercad`, `openscad`), `zoom_reverse`, `zoom_to_cursor`, `smooth_wheel_zoom` (default true), `trackpad_pan` (default true: two-finger scroll pans, pinch zooms), `orbit_cursor`, `look_at_anim`, `look_at_speed`, `middle_double_click` (`home` (default), `fit`, `off`), `msaa`, `length_decimals`, `angle_decimals`, `theme` (`dark`, `light`, `system`), `language` (`en`, `ja`, `de`, `fr`, `ko`, `ru`, `zh`; see [localization](localization.md)), `ui_scale`, `up_axis` (`z`, `y`), `offer_stand_up`, `color_vision` (`off` (default), `protan`, `deutan`, `tritan`: colour vision modes, #778), `check_updates` (default true; [updates](book/src/guide/updates.md)); `open` (a page: General, Navigation, Keyboard Shortcuts, Design, Graphics, Sketch, Selection) opens the Preferences dialog there; `button`: `ok`, `cancel`, `apply`, `defaults`; `stand_up: true` stands up a just-opened Y-up file | sets preferences (kept between runs), returns them all plus `dialog` (the open page or null), `dark` and `stand_up_offer` | | `ui.capture` | `action?`: `capture`, `revert`, `cancel` | answers the Capture Position question (asked when a command starts or the design is saved while components were moved without capturing); without `action`, what waits | | `ui.window` | `action`: minimize, maximize, restore, toggle, close | what the title bar's caption buttons do (on Windows and Linux the application bar is the title bar); close asks about unsaved designs first | | `ui.agent_cursor` | `show` (bool), `speed`: a number from 1 to 5 (times the normal speed) or `"instant"` (no animation: the command runs at once and the pointer jumps to where it acted), `follow_camera` (bool); all optional | the settings. While the cursor is shown, `engine.execute` first glides to the command's toolbar button and to each pick, then runs and replies; later requests wait their turn. `"animate": false` on a call skips it | diff --git a/docs/localization.md b/docs/localization.md index 5f069de9..54347b36 100644 --- a/docs/localization.md +++ b/docs/localization.md @@ -1,7 +1,7 @@ # UI localization -SolidCraft embeds its translations and works offline. English, Japanese, German, Korean, Russian and -Chinese are currently registered in `crates/ui-egui/src/i18n.rs`. Adding a language requires an +SolidCraft embeds its translations and works offline. English, Japanese, German, French, Korean, Russian +and Chinese are currently registered in `crates/ui-egui/src/i18n.rs`. Adding a language requires an embedded catalog and one registration there; the preferences selector and validation use the same registry. @@ -31,9 +31,9 @@ that looks untranslated. Two guards catch that in the build: - `every_complete_catalog_carries_every_english_message` — adding a key to `en.json` without giving it to a complete catalog fails the tests. English is the source catalog, - Japanese and Chinese are delivered complete; German, Korean and Russian are partial — their + Japanese and Chinese are delivered complete; German, Korean, Russian and French are partial — their gaps fall back to English and are reported by `cargo xtask i18n` without failing the build. A - new label needs en, ja, zh, de and ko; Russian may follow later. + new label needs en, ja, zh, de and ko; Russian and French may follow later. - `every_toolbar_tab_and_panel_is_in_the_english_catalog` — tabs and panels reach the UI as bare source strings, resolved only by the English-label adapter, so a heading missing from `en.json` can never translate.