From 5675a45bf30af0386fe70e0103ab63eebb8d88c0 Mon Sep 17 00:00:00 2001 From: Ewazer Date: Mon, 20 Apr 2026 13:16:44 +0200 Subject: [PATCH 1/8] Add files via upload --- src/i18n/locales/fr/common.json | 26 +++++ src/i18n/locales/fr/dialogs.json | 62 ++++++++++ src/i18n/locales/fr/editor.json | 137 ++++++++++++++++++++++ src/i18n/locales/fr/extensions.json | 60 ++++++++++ src/i18n/locales/fr/launch.json | 77 ++++++++++++ src/i18n/locales/fr/settings.json | 174 ++++++++++++++++++++++++++++ src/i18n/locales/fr/shortcuts.json | 16 +++ src/i18n/locales/fr/timeline.json | 41 +++++++ 8 files changed, 593 insertions(+) create mode 100644 src/i18n/locales/fr/common.json create mode 100644 src/i18n/locales/fr/dialogs.json create mode 100644 src/i18n/locales/fr/editor.json create mode 100644 src/i18n/locales/fr/extensions.json create mode 100644 src/i18n/locales/fr/launch.json create mode 100644 src/i18n/locales/fr/settings.json create mode 100644 src/i18n/locales/fr/shortcuts.json create mode 100644 src/i18n/locales/fr/timeline.json diff --git a/src/i18n/locales/fr/common.json b/src/i18n/locales/fr/common.json new file mode 100644 index 00000000..38daaa82 --- /dev/null +++ b/src/i18n/locales/fr/common.json @@ -0,0 +1,26 @@ +{ + "app": { + "name": "Recordly", + "editorTitle": "Recordly Editor", + "subtitle": "Enregistrement et édition d’écran", + "language": "Langue", + "manageRecordings": "Ouvrir le dossier des enregistrements" + }, + "actions": { + "cancel": "Annuler", + "close": "Fermer", + "export": "Exporter", + "load": "Charger", + "redo": "Rétablir", + "reset": "Réinitialiser", + "save": "Enregistrer", + "undo": "Annuler", + "delete": "Supprimer", + "done": "Terminé" + }, + "errors": { + "invalidFileType": "Type de fichier invalide", + "failedToUploadImage": "Échec du téléchargement de l’image", + "fileReadError": "Une erreur s’est produite lors de la lecture du fichier." + } +} diff --git a/src/i18n/locales/fr/dialogs.json b/src/i18n/locales/fr/dialogs.json new file mode 100644 index 00000000..436e007a --- /dev/null +++ b/src/i18n/locales/fr/dialogs.json @@ -0,0 +1,62 @@ +{ + "export": { + "pleaseTryAgain": "Veuillez réessayer", + "compilingGifProgress": "Compilation du GIF... {{progress}} %", + "compilingGifWait": "Compilation du GIF... Cela peut prendre un moment", + "takeMoment": "Cela peut prendre un moment...", + "exportFailed": "Échec de l’exportation", + "compilingGifTitle": "Compilation du GIF", + "exportingFormat": "Exportation en {{format}}", + "exportComplete": "Exportation terminée", + "formatReady": "Votre {{format}} est prêt", + "showInFolder": "Afficher dans le dossier", + "compiling": "Compilation", + "renderingFrames": "Rendu des images", + "processing": "Traitement...", + "status": "État", + "format": "Format", + "compilingStatus": "Compilation...", + "frames": "Images", + "cancelExport": "Annuler l’exportation", + "reopenSaveDialog": "Rouvrir la boîte de dialogue d’enregistrement", + "savedSuccess": "{{format}} enregistré avec succès !" + }, + "addFont": { + "title": "Ajouter une police Google", + "heading": "Ajouter une police Google", + "description": "Ajoutez une police personnalisée depuis Google Fonts pour l’utiliser dans vos annotations.", + "urlLabel": "URL d’importation Google Fonts", + "urlPlaceholder": "https://fonts.googleapis.com/css2?family=Roboto&display=swap", + "urlHelp": "Récupérez-la sur Google Fonts : sélectionnez une police → cliquez sur « Obtenir la police » → copiez l’URL @import", + "nameLabel": "Nom affiché", + "namePlaceholder": "Ma police personnalisée", + "nameHelp": "C’est ainsi que la police apparaîtra dans le sélecteur de polices", + "adding": "Ajout...", + "addFont": "Ajouter la police", + "enterUrl": "Veuillez entrer une URL d’importation Google Fonts", + "invalidUrl": "Veuillez entrer une URL Google Fonts valide", + "enterName": "Veuillez entrer un nom de police", + "extractFailed": "Impossible d’extraire la famille de police depuis l’URL", + "addSuccess": "Police « {{name}} » ajoutée avec succès", + "addFailed": "Échec de l’ajout de la police", + "loadTimeout": "Le chargement de la police a pris trop de temps. Veuillez vérifier l’URL et réessayer.", + "loadFailed": "La police n’a pas pu être chargée. Veuillez vérifier que l’URL Google Fonts est correcte." + }, + "shortcutsConfig": { + "title": "Raccourcis clavier", + "configurable": "Configurable", + "fixed": "Fixe", + "pressEscToCancel": "Appuyez sur Échap pour annuler", + "clickToChange": "Cliquez pour modifier", + "pressAKey": "Appuyez sur une touche…", + "alreadyUsedBy": "Déjà utilisé par {{action}}", + "swap": "Échanger", + "reserved": "Ce raccourci est réservé à « {{label}} » et ne peut pas être réassigné.", + "saved": "Raccourcis clavier enregistrés", + "resetNotice": "Réinitialisation aux raccourcis par défaut — cliquez sur Enregistrer pour appliquer", + "instructions": "Cliquez sur un raccourci puis appuyez sur la nouvelle combinaison de touches. Appuyez sur Échap pour annuler.", + "resetToDefaults": "Réinitialiser par défaut", + "cancel": "Annuler", + "save": "Enregistrer" + } +} \ No newline at end of file diff --git a/src/i18n/locales/fr/editor.json b/src/i18n/locales/fr/editor.json new file mode 100644 index 00000000..9c04cb77 --- /dev/null +++ b/src/i18n/locales/fr/editor.json @@ -0,0 +1,137 @@ +{ + "playback": { + "play": "Lecture", + "pause": "Pause", + "skipBack": "Reculer", + "skipForward": "Avancer", + "muteUnmute": "Activer/Désactiver le son" + }, + "annotations": { + "settings": "Paramètres des annotations", + "active": "Actif", + "text": "Texte", + "image": "Image", + "arrow": "Flèche", + "blur": "Flou", + "textContent": "Contenu du texte", + "textPlaceholder": "Entrez votre texte...", + "fontStyle": "Style de police", + "selectStyle": "Sélectionner un style", + "size": "Taille", + "toggleBold": "Activer/désactiver le gras", + "toggleItalic": "Activer/désactiver l’italique", + "toggleUnderline": "Activer/désactiver le soulignement", + "alignLeft": "Aligner à gauche", + "alignCenter": "Centrer", + "alignRight": "Aligner à droite", + "textColor": "Couleur du texte", + "background": "Arrière-plan", + "none": "Aucun", + "clearBackground": "Supprimer l’arrière-plan", + "uploadImage": "Importer une image", + "supportedFormats": "Formats pris en charge : JPG, PNG, GIF, WebP", + "arrowDirection": "Direction de la flèche", + "strokeWidth": "Épaisseur du trait : {{width}} px", + "arrowColor": "Couleur de la flèche", + "deleteAnnotation": "Supprimer l’annotation", + "shortcutsAndTips": "Raccourcis et conseils", + "tipSelectAnnotation": "Déplacez la tête de lecture vers une zone d’annotations superposées et sélectionnez un élément.", + "tipCycleForward": "Utilisez Tab pour parcourir les éléments superposés.", + "tipCycleBackward": "Utilisez Maj+Tab pour parcourir en arrière.", + "imageUploadSuccess": "Image importée avec succès !", + "imageUploadError": "Veuillez importer une image JPG, PNG, GIF ou WebP.", + "blurStrength": "Intensité du flou : {{strength}}", + "solidColor": "Couleur unie (censure)", + "borderRadius": "Rayon de bordure" + }, + + "fontStyles": { + "classic": "Classique", + "editor": "Éditeur", + "strong": "Fort", + "typewriter": "Machine à écrire", + "deco": "Décoratif", + "simple": "Simple", + "modern": "Moderne", + "clean": "Épuré" + }, + "format": { + "mp4Video": "Vidéo MP4", + "mp4Description": "Fichier vidéo de haute qualité", + "gifAnimation": "Animation GIF", + "gifDescription": "Image animée à partager" + }, + "gifOptions": { + "frameRate": "Fréquence d’images", + "outputSize": "Taille de sortie", + "outputDimensions": "Sortie : {{width}} × {{height}} px", + "loopAnimation": "Boucler l’animation", + "loopDescription": "Le GIF sera lu en continu" + }, + "tutorial": { + "howTrimmingWorks": "Fonctionnement du découpage", + "title": "Comment fonctionne le découpage", + "understanding": "Comprendre comment supprimer les parties indésirables de votre vidéo.", + "descriptionP1": "L’outil de découpage fonctionne en définissant les segments que vous souhaitez", + "descriptionRemove": "supprimer", + "descriptionP2": "de votre vidéo.", + "descriptionP3": "Toute partie de la timeline couverte par un segment rouge sera supprimée lors de l’exportation.", + "visualExample": "Exemple visuel", + "removed": "SUPPRIMÉ", + "kept": "Conservé", + "finalVideo": "Vidéo finale", + "part": "Partie {{number}}", + "addTrimStep": "1. Ajouter un découpage", + "addTrimDesc": "Appuyez sur T ou cliquez sur l’icône des ciseaux pour marquer une section à supprimer.", + "adjustStep": "2. Ajuster", + "adjustDesc": "Faites glisser les bords de la zone rouge pour couvrir exactement ce que vous souhaitez retirer." + }, + "feedback": { + "trigger": "Retour", + "title": "Retour et contact", + "description": "Contactez-nous directement ou ouvrez un ticket si quelque chose ne fonctionne pas ou manque.", + "emailLabel": "Email", + "xLabel": "X", + "reportIssue": "Signaler un problème / envoyer un retour", + "openFailed": "Échec de l’ouverture du lien." + }, + "keyboardShortcuts": { + "trigger": "Raccourcis", + "title": "Raccourcis clavier", + "description": "Référence rapide pour la timeline et les contrôles de l’éditeur.", + "customizeTooltip": "Personnaliser les raccourcis", + "customize": "Personnaliser", + "panTimeline": "Déplacer la timeline", + "zoomTimeline": "Zoomer la timeline", + "cycleAnnotations": "Parcourir les annotations", + "tab": "Tab" + }, + "actions": { + "saveAgain": "Enregistrer à nouveau", + "showInFolder": "Afficher dans le dossier" + }, + "project": { + "untitled": "Sans titre" + }, + "exportStatus": { + "exporting": "Exportation", + "renderingFile": "Rendu de votre fichier.", + "preparing": "Préparation de l’export...", + "completePercent": "{{percent}} % terminé", + "issue": "Problème d’exportation", + "complete": "Exportation terminée", + "savedSuccessfully": "Votre fichier a été enregistré avec succès." + }, + "export": { + "processingAudioEdits": "Traitement de l’audio avec modifications de vitesse/superposition" + }, + "toolbar": { + "addLayer": "Ajouter une couche", + "splitClip": "Diviser le clip (C)" + }, + "timeline": { + "expand": "Développer la timeline", + "collapse": "Réduire la timeline" + }, + "openRecordingsFolder": "Ouvrir le dossier des enregistrements" +} \ No newline at end of file diff --git a/src/i18n/locales/fr/extensions.json b/src/i18n/locales/fr/extensions.json new file mode 100644 index 00000000..a0166e35 --- /dev/null +++ b/src/i18n/locales/fr/extensions.json @@ -0,0 +1,60 @@ +{ + "title": "Extensions", + "tabs": { + "browse": "Parcourir", + "installed": "Installées" + }, + "actions": { + "submit": "Soumettre une extension", + "docs": "Documentation des extensions", + "refresh": "Actualiser", + "openFolder": "Ouvrir le dossier des extensions", + "uninstall": "Désinstaller", + "install": "Installer", + "installing": "Installation", + "add": "Ajouter", + "retry": "Réessayer", + "close": "Fermer", + "folder": "Dossier" + }, + "status": { + "enabled": "Activée", + "disabled": "Désactivée", + "installed": "Installée" + }, + "detail": { + "by": "Par {{author}}", + "unknownAuthor": "Auteur inconnu", + "noDescription": "Aucune description", + "downloads": "{{count}} téléchargements", + "preview": "Aperçu", + "screenshotAlt": "Capture d’écran {{number}}", + "description": "Description", + "tags": "Tags", + "permissions": "Autorisations", + "location": "Emplacement", + "error": "Erreur : {{message}}" + }, + "empty": { + "title": "Aucune extension", + "description": "Installez des extensions pour ajouter des cadres, des effets de curseur et des outils d’édition." + }, + "search": { + "placeholder": "Rechercher des extensions...", + "noResults": "Aucune extension trouvée", + "noMarketplace": "Aucune extension disponible sur le marketplace pour le moment", + "count": "{{count}} extension", + "countPlural": "{{count}} extensions" + }, + "toast": { + "installedAndEnabled": "Extension installée et activée", + "uninstalled": "{{name}} désinstallée", + "uninstallFailed": "Échec de la désinstallation de {{name}}", + "searchFailed": "Échec de la recherche sur le marketplace", + "refreshed": "Extensions actualisées", + "refreshFailed": "Échec de l’actualisation des extensions", + "marketplaceInstalled": "{{name}} installée et activée", + "marketplaceInstallFailed": "Échec de l’installation de {{name}}", + "enableFailed": "Échec de l’activation de l’extension" + } +} \ No newline at end of file diff --git a/src/i18n/locales/fr/launch.json b/src/i18n/locales/fr/launch.json new file mode 100644 index 00000000..b38092c4 --- /dev/null +++ b/src/i18n/locales/fr/launch.json @@ -0,0 +1,77 @@ +{ + "recording": { + "disableSystemAudio": "Disable system audio", + "enableSystemAudio": "Enable system audio", + "disableMicrophone": "Disable microphone", + "enableMicrophone": "Enable microphone", + "disableWebcam": "Disable webcam overlay", + "enableWebcam": "Enable webcam overlay", + "countdownDelay": "Countdown delay", + "noDelay": "No delay", + "record": "Record", + "recordingFolder": "Recordings Path: {{path}}", + "chooseRecordingsFolder": "Choose recordings path", + "folderPath": "Path: /{{name}}/", + "openVideoFile": "Open video file", + "openProject": "Open project", + "hideHudFromVideo": "Hide HUD from recording", + "showHudInVideo": "Show HUD in recording", + "hideHud": "Hide HUD", + "closeApp": "Close App", + "screens": "Screens", + "windows": "Windows", + "noSourcesFound": "No sources found", + "microphone": "Microphone", + "turnOffMicrophone": "Turn Off Microphone", + "selectMicToEnable": "Select a microphone to enable", + "noMicrophonesFound": "No microphones found", + "webcam": "Webcam", + "turnOffWebcam": "Turn Off Webcam", + "hideFloatingWebcamPreview": "Hide Floating Preview", + "showFloatingWebcamPreview": "Show Floating Preview", + "selectWebcamToEnable": "Select a webcam to enable", + "noWebcamsFound": "No webcams found", + "recordingsFolder": "Recordings Path", + "language": "Language", + "paused": "PAUSED", + "rec": "REC", + "resume": "Resume", + "pause": "Pause", + "stop": "Stop", + "cancel": "Cancel", + "more": "More", + "update": { + "update": "Update", + "updated": "Updated", + "idleTitle": "Check for updates.", + "checkingTitle": "Checking for updates...", + "downloadingTitle": "Downloading update...", + "errorTitle": "Update check failed. Click to retry.", + "upToDateTitle": "Recordly {{version}} is up to date.", + "availableTitle": "Recordly {{version}} is available.", + "availableGenericTitle": "An update is available." + } + }, + "sourceSelector": { + "loadingSources": "Loading sources...", + "screens": "Screens", + "windows": "Windows", + "noScreensAvailable": "No screens available", + "noWindowsAvailable": "No windows available", + "windowsNote": "Only visible (non-minimized) windows can be recorded.", + "windowPlaceholder": "Window", + "cancel": "Cancel", + "share": "Share" + }, + "permissions": { + "screenRecordingNeeded": "Recordly needs Screen Recording permission before you start. System Settings has been opened. After enabling it, quit and reopen Recordly.", + "screenRecordingMissing": "Screen Recording permission is still missing. System Settings has been opened again. Enable it, then quit and reopen Recordly before recording.", + "accessibilityNeeded": "Recordly also needs Accessibility permission for cursor tracking. System Settings has been opened. After enabling it, quit and reopen Recordly.", + "accessibilityMissing": "Accessibility permission is still missing. System Settings has been opened again. Enable it, then quit and reopen Recordly before recording.", + "selectSource": "Please select a source to record", + "systemAudioUnavailable": "System audio is not available for this source. Recording will continue without system audio.", + "microphoneDenied": "Microphone access was denied. Recording will continue without microphone audio.", + "failedToStart": "Failed to start recording: {{error}}", + "failedToStartGeneric": "Failed to start recording" + } +} \ No newline at end of file diff --git a/src/i18n/locales/fr/settings.json b/src/i18n/locales/fr/settings.json new file mode 100644 index 00000000..2bbed508 --- /dev/null +++ b/src/i18n/locales/fr/settings.json @@ -0,0 +1,174 @@ +{ + "zoom": { + "level": "Niveau de zoom", + "selectRegion": "Sélectionnez une zone de zoom à ajuster", + "deleteZoom": "Supprimer le zoom", + "modeAuto": "Automatique", + "modeManual": "Manuel", + "modeManualDescription": "Définir un point de focus fixe pour ce zoom", + "modeAutoDescription": "La caméra suit automatiquement le curseur" + }, + "trim": { + "deleteRegion": "Supprimer la zone de découpe" + }, + "speed": { + "playbackSpeed": "Vitesse de lecture", + "selectRegion": "Sélectionnez une zone de vitesse à ajuster", + "deleteRegion": "Supprimer la zone de vitesse", + "label": "Vitesse" + }, + "clip": { + "title": "Clip", + "muteAudio": "Couper le son", + "delete": "Supprimer le clip" + }, + "effects": { + "title": "Effets vidéo", + "show": "Afficher", + "showCursor": "Afficher le curseur", + "loopCursor": "Boucler le curseur", + "cursorStyle": "Style du curseur", + "cursorStyleOptions": { + "tahoe": "Tahoe", + "dot": "Point", + "figma": "Minimal", + "mono": "Inversé", + "lavender": "Lavande", + "parched": "Parched", + "chooper": "Chooper", + "amongus": "Among Us", + "turtle": "Tortue" + }, + "backgroundBlur": "Flou d’arrière-plan", + "zoomMotionBlur": "Flou de mouvement du zoom", + "connectZooms": "Relier les zooms", + "connectZoomsDescription": "Lisse les zones de zoom consécutives pour créer un mouvement de caméra continu.", + "autoApplyFreshRecordingZooms": "Appliquer automatiquement les zooms des nouveaux enregistrements", + "autoApplyFreshRecordingZoomsDescription": "Suggérer automatiquement des zooms suivant le curseur lorsque vous ouvrez un nouvel enregistrement.", + "zoomGeneralTitle": "Général", + "zoomGeneralDescription": "Paramètres globaux de mouvement pour chaque transition de zoom.", + "zoomInTitle": "Zoom avant", + "zoomInDescription": "Contrôle la manière dont la caméra entre dans une zone de zoom.", + "zoomOutTitle": "Zoom arrière", + "zoomOutDescription": "Contrôle la manière dont la caméra sort d’une zone de zoom.", + "connectedZoomTitle": "Entre les zooms", + "connectedZoomDescription": "Ajuste la transition entre des zones de zoom consécutives lorsque la connexion est activée.", + "zoomInDuration": "Durée du zoom avant", + "zoomInOverlap": "Chevauchement du zoom avant", + "zoomOutDuration": "Durée du zoom arrière", + "zoomInEasing": "Courbe du zoom avant", + "zoomOutEasing": "Courbe du zoom arrière", + "connectedZoomGap": "Intervalle entre zooms connectés", + "connectedZoomDuration": "Durée du zoom connecté", + "connectedZoomEasing": "Courbe du pan connecté", + "zoomEasingOptions": { + "recordly": "Recordly", + "glide": "Glide", + "smooth": "Lisse", + "snappy": "Rapide", + "linear": "Linéaire" + }, + "cursorSize": "Taille du curseur", + "cursorSmoothing": "Lissage du curseur", + "off": "Désactivé", + "cursorMotionBlur": "Flou de mouvement du curseur", + "cursorClickBounce": "Rebond au clic du curseur", + "cursorClickBounceDuration": "Vitesse du rebond", + "cursorSway": "Oscillation du curseur", + "webcam": "Incrustation webcam", + "webcamFootage": "Vidéo de la webcam", + "webcamFootageDescription": "Aucune vidéo de webcam liée à cette vidéo", + "uploadWebcamFootage": "Importer une vidéo", + "replaceWebcamFootage": "Remplacer la vidéo", + "removeWebcamFootage": "Supprimer la vidéo", + "webcamFootageAdded": "Vidéo de webcam liée", + "webcamFootageRemoved": "Vidéo de webcam supprimée", + "webcamSize": "Taille de la webcam", + "webcamReactToZoom": "La webcam réagit au zoom", + "webcamRoundness": "Arrondi de la webcam", + "webcamShadow": "Ombre de la webcam", + "shadow": "Ombre", + "radius": "Rayon", + "roundness": "Arrondi", + "padding": "Marge intérieure", + "removeBackground": "Supprimer l’arrière-plan" + }, + "sections": { + "scene": "Scène", + "captions": "Sous-titres", + "zoom": "Zoom", + "cursor": "Curseur", + "webcam": "Webcam", + "frame": "Cadre", + "crop": "Recadrage" + }, + "captions": { + "enabled": "Afficher", + "language": "Langue", + "downloading": "Téléchargement...", + "deleteModel": "Supprimer le modèle", + "clearModel": "Effacer le modèle", + "downloadModel": "Télécharger le modèle", + "generating": "Génération...", + "generateFull": "Générer les sous-titres", + "regenerateFull": "Régénérer les sous-titres", + "clearFull": "Effacer les sous-titres", + "fontSettings": "Paramètres de police", + "defaultFont": "Par défaut", + "fontFamily": "Police", + "fontSize": "Taille de police", + "rowCount": "Lignes", + "animation": "Animation", + "animationOff": "Désactivée", + "animationFade": "Fondu", + "animationRise": "Remontée", + "animationPop": "Apparition", + "bottomOffset": "Décalage inférieur", + "maxWidth": "Largeur max", + "boxRadius": "Rayon de la boîte", + "backgroundOpacity": "Opacité de l’arrière-plan", + "textColor": "Couleur du texte" + }, + "crop": { + "title": "Recadrer la vidéo", + "instruction": "Faites glisser chaque côté pour ajuster la zone de recadrage", + "top": "Haut", + "bottom": "Bas", + "left": "Gauche", + "right": "Droite", + "openEditor": "Ouvrir l’éditeur de recadrage" + }, + "background": { + "title": "Arrière-plan", + "image": "Image", + "color": "Couleur", + "gradient": "Dégradé", + "wallpaperPreview": "Aperçu du fond d’écran", + "uploadCustom": "Importer un fond personnalisé", + "uploadSuccess": "Image personnalisée importée avec succès !", + "uploadError": "Veuillez importer un fichier image JPG ou JPEG.", + "uploadErrorDescription": "Seules les images JPG et JPEG sont prises en charge." + }, + "export": { + "title": "Exportation", + "mp4": "MP4", + "gif": "GIF", + "quality": { + "low": "Faible", + "medium": "Moyenne", + "high": "Élevée", + "original": "Originale" + }, + "fpsTitle": "IPS", + "loop": "Boucle", + "outputDimensions": "Sortie : {{dimensions}} px", + "sizePresetOriginalShort": "Orig", + "sizePresetMediumShort": "Moy", + "sizePresetLargeShort": "Grd", + "loadProject": "Charger le projet", + "saveProject": "Enregistrer le projet", + "exportVideo": "Exporter en {{format}}", + "reportBug": "Signaler un bug", + "starOnGithub": "Mettre une étoile sur GitHub" + } +} \ No newline at end of file diff --git a/src/i18n/locales/fr/shortcuts.json b/src/i18n/locales/fr/shortcuts.json new file mode 100644 index 00000000..23e2d15f --- /dev/null +++ b/src/i18n/locales/fr/shortcuts.json @@ -0,0 +1,16 @@ +{ + "actions": { + "addZoom": "Ajouter un zoom", + "addTrim": "Ajouter un découpage", + "addSpeed": "Ajouter une vitesse", + "addAnnotation": "Ajouter une annotation", + "addKeyframe": "Ajouter une image clé", + "deleteSelected": "Supprimer la sélection", + "playPause": "Lecture / Pause", + "cycleForward": "Parcourir les annotations vers l’avant", + "cycleBackward": "Parcourir les annotations vers l’arrière", + "deleteSelectedAlt": "Supprimer la sélection (alt)", + "panTimeline": "Déplacer la timeline", + "zoomTimeline": "Zoomer la timeline" + } +} \ No newline at end of file diff --git a/src/i18n/locales/fr/timeline.json b/src/i18n/locales/fr/timeline.json new file mode 100644 index 00000000..52fdc64e --- /dev/null +++ b/src/i18n/locales/fr/timeline.json @@ -0,0 +1,41 @@ +{ + "zoom": { + "cannotPlace": "Impossible de placer le zoom ici", + "existsOrNoSpace": "Un zoom existe déjà à cet emplacement ou il n’y a pas assez d’espace disponible.", + "suggestHandlerUnavailable": "Gestionnaire de suggestion de zoom indisponible", + "noTelemetry": "Aucune télémétrie du curseur disponible", + "recordFirst": "Enregistrez d’abord un screencast pour générer des suggestions basées sur le curseur.", + "noUsableTelemetry": "Aucune télémétrie du curseur exploitable", + "notEnoughMovement": "L’enregistrement ne contient pas assez de données de mouvement du curseur.", + "noInteractionMoments": "Aucun moment d’interaction clair trouvé", + "tryRecording": "Essayez un enregistrement avec des pauses ou des clics autour des actions importantes.", + "noAutoZoomSlots": "Aucun emplacement de zoom automatique disponible", + "dwellPointsOverlap": "Des points d’arrêt détectés se chevauchent avec des zones de zoom existantes.", + "addedSuggestions": "{{count}} suggestion(s) de zoom basée(s) sur l’interaction ajoutée(s)", + "label": "Zoom {{index}}", + "addZoom": "Ajouter un zoom (Z)", + "suggestZooms": "Suggérer des zooms à partir du curseur" + }, + "trim": { + "cannotPlace": "Impossible de placer le découpage ici", + "existsOrNoSpace": "Un découpage existe déjà à cet emplacement ou il n’y a pas assez d’espace disponible.", + "label": "Découpage {{index}}", + "addTrim": "Ajouter un découpage (T)" + }, + "speed": { + "cannotPlace": "Impossible de placer la vitesse ici", + "existsOrNoSpace": "Une zone de vitesse existe déjà à cet emplacement ou il n’y a pas assez d’espace disponible.", + "label": "Vitesse" + }, + "annotation": { + "label": "Annotation", + "image": "Image", + "addAnnotation": "Ajouter une annotation (A)" + }, + "audio": { + "label": "Audio" + }, + "addSpeed": "Ajouter une vitesse (S)", + "resizeLeft": "Redimensionner vers la gauche", + "resizeRight": "Redimensionner vers la droite" +} \ No newline at end of file From d966b9d40166712486cd8b6da7e0f9eba5350b31 Mon Sep 17 00:00:00 2001 From: Ewazer Date: Mon, 20 Apr 2026 13:35:54 +0200 Subject: [PATCH 2/8] Update config.ts --- src/i18n/config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/config.ts b/src/i18n/config.ts index 7c309d8a..9d70853d 100644 --- a/src/i18n/config.ts +++ b/src/i18n/config.ts @@ -1,6 +1,6 @@ export const DEFAULT_LOCALE = "en" as const; -export const SUPPORTED_LOCALES = ["en", "es", "nl", "ko", "zh-CN"] as const; +export const SUPPORTED_LOCALES = ["en", "es", "fr", "nl", "ko", "zh-CN"] as const; export const I18N_NAMESPACES = [ "common", From 7e54bb04f30eb181475570eed04e2e7cb53bd043 Mon Sep 17 00:00:00 2001 From: Ewazer Date: Mon, 20 Apr 2026 13:36:52 +0200 Subject: [PATCH 3/8] Add French translations to I18nContext --- src/contexts/I18nContext.tsx | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/contexts/I18nContext.tsx b/src/contexts/I18nContext.tsx index b9db5fa3..6eded091 100644 --- a/src/contexts/I18nContext.tsx +++ b/src/contexts/I18nContext.tsx @@ -30,6 +30,14 @@ import esLaunch from "@/i18n/locales/es/launch.json"; import esSettings from "@/i18n/locales/es/settings.json"; import esShortcuts from "@/i18n/locales/es/shortcuts.json"; import esTimeline from "@/i18n/locales/es/timeline.json"; +import frCommon from "@/i18n/locales/fr/common.json"; +import frDialogs from "@/i18n/locales/fr/dialogs.json"; +import frEditor from "@/i18n/locales/fr/editor.json"; +import frExtensions from "@/i18n/locales/fr/extensions.json"; +import frLaunch from "@/i18n/locales/fr/launch.json"; +import frSettings from "@/i18n/locales/fr/settings.json"; +import frShortcuts from "@/i18n/locales/fr/shortcuts.json"; +import frTimeline from "@/i18n/locales/fr/timeline.json"; import koCommon from "@/i18n/locales/ko/common.json"; import koDialogs from "@/i18n/locales/ko/dialogs.json"; import koEditor from "@/i18n/locales/ko/editor.json"; @@ -80,6 +88,16 @@ const messages: Record = { shortcuts: esShortcuts, extensions: esExtensions, }, + fr: { + common: frCommon, + launch: frLaunch, + editor: frEditor, + timeline: frTimeline, + settings: frSettings, + dialogs: frDialogs, + shortcuts: frShortcuts, + extensions: frExtensions, + }, nl: { common: nlCommon, launch: nlLaunch, From 7d82e1ecce09663ebb1edec43f40006b8c5ba3ec Mon Sep 17 00:00:00 2001 From: Ewazer Date: Mon, 20 Apr 2026 14:32:43 +0200 Subject: [PATCH 4/8] Update launch.json --- src/i18n/locales/fr/launch.json | 128 ++++++++++++++++---------------- 1 file changed, 64 insertions(+), 64 deletions(-) diff --git a/src/i18n/locales/fr/launch.json b/src/i18n/locales/fr/launch.json index b38092c4..304b97c8 100644 --- a/src/i18n/locales/fr/launch.json +++ b/src/i18n/locales/fr/launch.json @@ -1,77 +1,77 @@ { "recording": { - "disableSystemAudio": "Disable system audio", - "enableSystemAudio": "Enable system audio", - "disableMicrophone": "Disable microphone", - "enableMicrophone": "Enable microphone", - "disableWebcam": "Disable webcam overlay", - "enableWebcam": "Enable webcam overlay", - "countdownDelay": "Countdown delay", - "noDelay": "No delay", - "record": "Record", - "recordingFolder": "Recordings Path: {{path}}", - "chooseRecordingsFolder": "Choose recordings path", - "folderPath": "Path: /{{name}}/", - "openVideoFile": "Open video file", - "openProject": "Open project", - "hideHudFromVideo": "Hide HUD from recording", - "showHudInVideo": "Show HUD in recording", - "hideHud": "Hide HUD", - "closeApp": "Close App", - "screens": "Screens", - "windows": "Windows", - "noSourcesFound": "No sources found", + "disableSystemAudio": "Désactiver l’audio système", + "enableSystemAudio": "Activer l’audio système", + "disableMicrophone": "Désactiver le microphone", + "enableMicrophone": "Activer le microphone", + "disableWebcam": "Désactiver l’incrustation webcam", + "enableWebcam": "Activer l’incrustation webcam", + "countdownDelay": "Délai du compte à rebours", + "noDelay": "Aucun délai", + "record": "Enregistrer", + "recordingFolder": "Chemin des enregistrements : {{path}}", + "chooseRecordingsFolder": "Choisir le chemin des enregistrements", + "folderPath": "Chemin : /{{name}}/", + "openVideoFile": "Ouvrir le fichier vidéo", + "openProject": "Ouvrir le projet", + "hideHudFromVideo": "Masquer le HUD dans l’enregistrement", + "showHudInVideo": "Afficher le HUD dans l’enregistrement", + "hideHud": "Masquer le HUD", + "closeApp": "Fermer l’application", + "screens": "Écrans", + "windows": "Fenêtres", + "noSourcesFound": "Aucune source trouvée", "microphone": "Microphone", - "turnOffMicrophone": "Turn Off Microphone", - "selectMicToEnable": "Select a microphone to enable", - "noMicrophonesFound": "No microphones found", + "turnOffMicrophone": "Désactiver le microphone", + "selectMicToEnable": "Sélectionnez un microphone à activer", + "noMicrophonesFound": "Aucun microphone trouvé", "webcam": "Webcam", - "turnOffWebcam": "Turn Off Webcam", - "hideFloatingWebcamPreview": "Hide Floating Preview", - "showFloatingWebcamPreview": "Show Floating Preview", - "selectWebcamToEnable": "Select a webcam to enable", - "noWebcamsFound": "No webcams found", - "recordingsFolder": "Recordings Path", - "language": "Language", - "paused": "PAUSED", + "turnOffWebcam": "Désactiver la webcam", + "hideFloatingWebcamPreview": "Masquer l’aperçu flottant", + "showFloatingWebcamPreview": "Afficher l’aperçu flottant", + "selectWebcamToEnable": "Sélectionnez une webcam à activer", + "noWebcamsFound": "Aucune webcam trouvée", + "recordingsFolder": "Chemin des enregistrements", + "language": "Langue", + "paused": "EN PAUSE", "rec": "REC", - "resume": "Resume", + "resume": "Reprendre", "pause": "Pause", - "stop": "Stop", - "cancel": "Cancel", - "more": "More", + "stop": "Arrêter", + "cancel": "Annuler", + "more": "Plus", "update": { - "update": "Update", - "updated": "Updated", - "idleTitle": "Check for updates.", - "checkingTitle": "Checking for updates...", - "downloadingTitle": "Downloading update...", - "errorTitle": "Update check failed. Click to retry.", - "upToDateTitle": "Recordly {{version}} is up to date.", - "availableTitle": "Recordly {{version}} is available.", - "availableGenericTitle": "An update is available." + "update": "Mettre à jour", + "updated": "Mis à jour", + "idleTitle": "Vérifier les mises à jour.", + "checkingTitle": "Vérification des mises à jour...", + "downloadingTitle": "Téléchargement de la mise à jour...", + "errorTitle": "Échec de la vérification des mises à jour. Cliquez pour réessayer.", + "upToDateTitle": "Recordly {{version}} est à jour.", + "availableTitle": "Recordly {{version}} est disponible.", + "availableGenericTitle": "Une mise à jour est disponible." } }, "sourceSelector": { - "loadingSources": "Loading sources...", - "screens": "Screens", - "windows": "Windows", - "noScreensAvailable": "No screens available", - "noWindowsAvailable": "No windows available", - "windowsNote": "Only visible (non-minimized) windows can be recorded.", - "windowPlaceholder": "Window", - "cancel": "Cancel", - "share": "Share" + "loadingSources": "Chargement des sources...", + "screens": "Écrans", + "windows": "Fenêtres", + "noScreensAvailable": "Aucun écran disponible", + "noWindowsAvailable": "Aucune fenêtre disponible", + "windowsNote": "Seules les fenêtres visibles (non minimisées) peuvent être enregistrées.", + "windowPlaceholder": "Fenêtre", + "cancel": "Annuler", + "share": "Partager" }, "permissions": { - "screenRecordingNeeded": "Recordly needs Screen Recording permission before you start. System Settings has been opened. After enabling it, quit and reopen Recordly.", - "screenRecordingMissing": "Screen Recording permission is still missing. System Settings has been opened again. Enable it, then quit and reopen Recordly before recording.", - "accessibilityNeeded": "Recordly also needs Accessibility permission for cursor tracking. System Settings has been opened. After enabling it, quit and reopen Recordly.", - "accessibilityMissing": "Accessibility permission is still missing. System Settings has been opened again. Enable it, then quit and reopen Recordly before recording.", - "selectSource": "Please select a source to record", - "systemAudioUnavailable": "System audio is not available for this source. Recording will continue without system audio.", - "microphoneDenied": "Microphone access was denied. Recording will continue without microphone audio.", - "failedToStart": "Failed to start recording: {{error}}", - "failedToStartGeneric": "Failed to start recording" + "screenRecordingNeeded": "Recordly nécessite l’autorisation d’enregistrement d’écran avant de commencer. Les paramètres système ont été ouverts. Après l’avoir activée, quittez et relancez Recordly.", + "screenRecordingMissing": "L’autorisation d’enregistrement d’écran est toujours manquante. Les paramètres système ont été ouverts à nouveau. Activez-la, puis quittez et relancez Recordly avant d’enregistrer.", + "accessibilityNeeded": "Recordly nécessite également l’autorisation d’accessibilité pour le suivi du curseur. Les paramètres système ont été ouverts. Après l’avoir activée, quittez et relancez Recordly.", + "accessibilityMissing": "L’autorisation d’accessibilité est toujours manquante. Les paramètres système ont été ouverts à nouveau. Activez-la, puis quittez et relancez Recordly avant d’enregistrer.", + "selectSource": "Veuillez sélectionner une source à enregistrer", + "systemAudioUnavailable": "L’audio système n’est pas disponible pour cette source. L’enregistrement continuera sans audio système.", + "microphoneDenied": "L’accès au microphone a été refusé. L’enregistrement continuera sans audio du microphone.", + "failedToStart": "Échec du démarrage de l’enregistrement : {{error}}", + "failedToStartGeneric": "Échec du démarrage de l’enregistrement" } -} \ No newline at end of file +} From 2d0c25e931df81d87bcacb4f766dbe4299287cd4 Mon Sep 17 00:00:00 2001 From: Ewazer Date: Mon, 20 Apr 2026 14:40:36 +0200 Subject: [PATCH 5/8] Update SettingsPanel.tsx --- src/components/video-editor/SettingsPanel.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/video-editor/SettingsPanel.tsx b/src/components/video-editor/SettingsPanel.tsx index 1de3ebc1..c6c950bd 100644 --- a/src/components/video-editor/SettingsPanel.tsx +++ b/src/components/video-editor/SettingsPanel.tsx @@ -487,6 +487,7 @@ const CAPTION_LANGUAGE_OPTIONS = [ const APP_LANGUAGE_LABELS: Record = { en: "English", es: "Español", + fr: "Français", nl: "Nederlands", ko: "한국어", "zh-CN": "中文", From dc5352b52babe8991160403041a3af0164f041cf Mon Sep 17 00:00:00 2001 From: Ewazer Date: Mon, 20 Apr 2026 15:21:42 +0200 Subject: [PATCH 6/8] Update common.json From b2500658c2477dd1ec17fbbea5a771cde1086bc3 Mon Sep 17 00:00:00 2001 From: Ewazer Date: Mon, 20 Apr 2026 15:22:03 +0200 Subject: [PATCH 7/8] Update dialogs.json --- src/i18n/locales/fr/dialogs.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/locales/fr/dialogs.json b/src/i18n/locales/fr/dialogs.json index 436e007a..d13fe5eb 100644 --- a/src/i18n/locales/fr/dialogs.json +++ b/src/i18n/locales/fr/dialogs.json @@ -59,4 +59,4 @@ "cancel": "Annuler", "save": "Enregistrer" } -} \ No newline at end of file +} From 4484c173d01ee8484fa654e3c5a83109012f58d9 Mon Sep 17 00:00:00 2001 From: Ewazer Date: Mon, 20 Apr 2026 13:23:17 +0000 Subject: [PATCH 8/8] update --- src/i18n/locales/fr/editor.json | 2 +- src/i18n/locales/fr/extensions.json | 2 +- src/i18n/locales/fr/settings.json | 2 +- src/i18n/locales/fr/shortcuts.json | 2 +- src/i18n/locales/fr/timeline.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/i18n/locales/fr/editor.json b/src/i18n/locales/fr/editor.json index 9c04cb77..d3494ed1 100644 --- a/src/i18n/locales/fr/editor.json +++ b/src/i18n/locales/fr/editor.json @@ -134,4 +134,4 @@ "collapse": "Réduire la timeline" }, "openRecordingsFolder": "Ouvrir le dossier des enregistrements" -} \ No newline at end of file +} diff --git a/src/i18n/locales/fr/extensions.json b/src/i18n/locales/fr/extensions.json index a0166e35..28ccaec6 100644 --- a/src/i18n/locales/fr/extensions.json +++ b/src/i18n/locales/fr/extensions.json @@ -57,4 +57,4 @@ "marketplaceInstallFailed": "Échec de l’installation de {{name}}", "enableFailed": "Échec de l’activation de l’extension" } -} \ No newline at end of file +} diff --git a/src/i18n/locales/fr/settings.json b/src/i18n/locales/fr/settings.json index 2bbed508..e1b3fe42 100644 --- a/src/i18n/locales/fr/settings.json +++ b/src/i18n/locales/fr/settings.json @@ -171,4 +171,4 @@ "reportBug": "Signaler un bug", "starOnGithub": "Mettre une étoile sur GitHub" } -} \ No newline at end of file +} diff --git a/src/i18n/locales/fr/shortcuts.json b/src/i18n/locales/fr/shortcuts.json index 23e2d15f..ed9f0308 100644 --- a/src/i18n/locales/fr/shortcuts.json +++ b/src/i18n/locales/fr/shortcuts.json @@ -13,4 +13,4 @@ "panTimeline": "Déplacer la timeline", "zoomTimeline": "Zoomer la timeline" } -} \ No newline at end of file +} diff --git a/src/i18n/locales/fr/timeline.json b/src/i18n/locales/fr/timeline.json index 52fdc64e..a59234d4 100644 --- a/src/i18n/locales/fr/timeline.json +++ b/src/i18n/locales/fr/timeline.json @@ -38,4 +38,4 @@ "addSpeed": "Ajouter une vitesse (S)", "resizeLeft": "Redimensionner vers la gauche", "resizeRight": "Redimensionner vers la droite" -} \ No newline at end of file +}