Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/components/video-editor/SettingsPanel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -487,6 +487,7 @@ const CAPTION_LANGUAGE_OPTIONS = [
const APP_LANGUAGE_LABELS: Record<AppLocale, string> = {
en: "English",
es: "Español",
fr: "Français",
nl: "Nederlands",
ko: "한국어",
"zh-CN": "中文",
Expand Down
18 changes: 18 additions & 0 deletions src/contexts/I18nContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down Expand Up @@ -80,6 +88,16 @@ const messages: Record<AppLocale, LocaleBundle> = {
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,
Expand Down
2 changes: 1 addition & 1 deletion src/i18n/config.ts
Original file line number Diff line number Diff line change
@@ -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;
Comment thread
coderabbitai[bot] marked this conversation as resolved.

export const I18N_NAMESPACES = [
"common",
Expand Down
26 changes: 26 additions & 0 deletions src/i18n/locales/fr/common.json
Original file line number Diff line number Diff line change
@@ -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."
}
}
62 changes: 62 additions & 0 deletions src/i18n/locales/fr/dialogs.json
Original file line number Diff line number Diff line change
@@ -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 <strong>{{action}}</strong>",
"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"
}
}
137 changes: 137 additions & 0 deletions src/i18n/locales/fr/editor.json
Original file line number Diff line number Diff line change
@@ -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"
}
60 changes: 60 additions & 0 deletions src/i18n/locales/fr/extensions.json
Original file line number Diff line number Diff line change
@@ -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"
}
}
Loading