diff --git a/web/public/locales/fr/audio.json b/web/public/locales/fr/audio.json
new file mode 100644
index 000000000..199ff24fe
--- /dev/null
+++ b/web/public/locales/fr/audio.json
@@ -0,0 +1,30 @@
+{
+ "speech": "Voic",
+ "babbling": "Babillages",
+ "yell": "Cri",
+ "bicycle": "Vélo",
+ "car": "Voiture",
+ "bellow": "Beuglement",
+ "whispering": "Chuchotements",
+ "laughter": "Rires",
+ "snicker": "Ricanement",
+ "crying": "Pleurs",
+ "boat": "Bateau",
+ "bus": "Bus",
+ "train": "Train",
+ "motorcycle": "Moto",
+ "whoop": "Cri",
+ "sigh": "Soupir",
+ "singing": "Chants",
+ "choir": "Chorale",
+ "yodeling": "Yodel",
+ "chant": "Chants",
+ "mantra": "Mantra",
+ "child_singing": "Chant d'enfant",
+ "bird": "Oiseau",
+ "cat": "Chat",
+ "synthetic_singing": "Chant synthétique",
+ "rapping": "Rap",
+ "horse": "Cheval",
+ "dog": "Chien"
+}
diff --git a/web/public/locales/fr/common.json b/web/public/locales/fr/common.json
new file mode 100644
index 000000000..dbbd99784
--- /dev/null
+++ b/web/public/locales/fr/common.json
@@ -0,0 +1,173 @@
+{
+ "time": {
+ "untilForRestart": "Jusqu'au redémarrage de Frigate.",
+ "untilRestart": "Jusqu'au redémarrage",
+ "untilForTime": "Jusqu'à {{time}}",
+ "justNow": "À l'instant",
+ "today": "Aujourd'hui",
+ "last7": "7 derniers jours",
+ "last14": "14 derniers jours",
+ "ago": "{{timeAgo}} avant",
+ "yesterday": "Hier",
+ "last30": "30 derniers jours",
+ "thisWeek": "Cette semaine",
+ "lastWeek": "Semaine dernière",
+ "thisMonth": "Ce mois-ci",
+ "lastMonth": "Mois dernier",
+ "10minutes": "10 minutes",
+ "5minutes": "5 minutes",
+ "30minutes": "30 minutes",
+ "12hours": "12 heures",
+ "h": "{{time}}h",
+ "pm": "PM",
+ "am": "AM",
+ "yr": "{{time}}a",
+ "year": "{{time}} années",
+ "mo": "{{time}}m",
+ "month": "{{time}} mois",
+ "s": "{{time}}s",
+ "second": "{{time}} secondes",
+ "m": "{{time}}m",
+ "hour": "{{time}} heures",
+ "24hours": "24 heures",
+ "minute": "{{time}} minutes",
+ "d": "{{time}}j",
+ "day": "{{time}} jours",
+ "1hour": "1 heure"
+ },
+ "button": {
+ "apply": "Appliquer",
+ "reset": "Réinitialiser",
+ "disabled": "Désactivé",
+ "save": "Sauvegarder",
+ "saving": "Sauvegarde ...",
+ "close": "Fermer",
+ "copy": "Copier",
+ "back": "Retour",
+ "history": "Historique",
+ "pictureInPicture": "Image en incrustation",
+ "twoWayTalk": "Discussion dans les 2 sens",
+ "off": "Inactif",
+ "edit": "Editer",
+ "copyCoordinates": "Copier les coordonnées",
+ "delete": "Supprimer",
+ "yes": "Oui",
+ "no": "Non",
+ "unsuspended": "Ré-activer",
+ "play": "Play",
+ "unselect": "Désélectionner",
+ "suspended": "Suspendu",
+ "enable": "Activer",
+ "enabled": "Activé",
+ "info": "Info",
+ "disable": "Désactiver",
+ "cancel": "Annuler",
+ "fullscreen": "Plein écran",
+ "next": "Suivant",
+ "exitFullscreen": "Sortir du mode plein écran",
+ "cameraAudio": "Son de la caméra",
+ "on": "Actif",
+ "export": "Exporter",
+ "deleteNow": "Supprimer immédiatement",
+ "download": "Télécharger",
+ "done": "Terminé"
+ },
+ "menu": {
+ "configuration": "Configuration",
+ "language": {
+ "en": "Anglais"
+ },
+ "appearance": "Apparence",
+ "darkMode": {
+ "light": "Mode clair",
+ "dark": "Sombre",
+ "withSystem": {
+ "label": "Utiliser les paramètres système pour le mode clair ou sombre"
+ },
+ "label": "Mode sombre"
+ },
+ "review": "Contrôler",
+ "explore": "Explorer",
+ "export": "Exporter",
+ "user": {
+ "account": "Compte",
+ "logout": "Se déconnecter",
+ "setPassword": "Configurer un mot de passe",
+ "current": "Utilisateur : {{user}}",
+ "title": "Utilisateur",
+ "anonymous": "anonyme"
+ },
+ "systemLogs": "Journaux système",
+ "documentation": {
+ "title": "Documentation",
+ "label": "Documentation de Frigate"
+ },
+ "system": "Système",
+ "help": "Aide",
+ "configurationEditor": "Editeur de configuration",
+ "theme": {
+ "contrast": "Contraste élevé",
+ "blue": "Bleu",
+ "green": "Vert",
+ "nord": "Nord",
+ "red": "Rouge",
+ "default": "Défaut",
+ "label": "Thème"
+ },
+ "systemMetrics": "Indicateurs systèmes",
+ "settings": "Paramètres",
+ "withSystem": "Système",
+ "restart": "Redémarrer Frigate",
+ "live": {
+ "cameras": {
+ "count_one": "{{count}} Camera",
+ "count_many": "{{count}} Cameras",
+ "count_other": "",
+ "title": "Caméras"
+ },
+ "allCameras": "Toutes les caméras",
+ "title": "Temps réel"
+ },
+ "uiPlayground": "Gestion de l'interface",
+ "faceLibrary": "Librairie des visages",
+ "languages": "Langues"
+ },
+ "toast": {
+ "save": {
+ "title": "Sauvegarder"
+ },
+ "copyUrlToClipboard": "Lien copié dans le presse-papier."
+ },
+ "role": {
+ "title": "Rôle",
+ "viewer": "Spectateur",
+ "admin": "Administrateur",
+ "desc": "Les Administrateurs accèdent à l'ensemble des fonctionnalités de l'interface Frigate. Les Spectateurs sont limités à la consultation des caméras, au contrôle des évènements et à l'historique des enregistrements."
+ },
+ "pagination": {
+ "next": {
+ "title": "Suivant",
+ "label": "Aller à la page suivante"
+ },
+ "more": "Plus de pages",
+ "previous": {
+ "label": "Aller à la page précédente",
+ "title": "Précédent"
+ },
+ "label": "pagination"
+ },
+ "notFound": {
+ "title": "404",
+ "documentTitle": "Non trouvé - Frigate",
+ "desc": "Page non trouvée"
+ },
+ "selectItem": "Sélectionner {{item}}",
+ "accessDenied": {
+ "title": "Accés refusé",
+ "documentTitle": "Accés refusé - Frigate",
+ "desc": "Vous n'avez pas l'autorisation de voir cette page."
+ },
+ "label": {
+ "back": "Retour"
+ }
+}
diff --git a/web/public/locales/fr/components/auth.json b/web/public/locales/fr/components/auth.json
new file mode 100644
index 000000000..a3bfff3fd
--- /dev/null
+++ b/web/public/locales/fr/components/auth.json
@@ -0,0 +1,15 @@
+{
+ "form": {
+ "password": "Mot de passe",
+ "login": "Identifiant",
+ "user": "Nom d'utilisateur",
+ "errors": {
+ "unknownError": "Erreur inconnue. Vérifiez les journaux.",
+ "webUnknownError": "Erreur inconnue. Vérifiez les journaux de la console.",
+ "passwordRequired": "Un mot de passe est requis",
+ "loginFailed": "Échec de l'identification",
+ "usernameRequired": "Un nom d'utilisateur est requis",
+ "rateLimit": "Limite de débit dépassée. Réessayez plus tard."
+ }
+ }
+}
diff --git a/web/public/locales/fr/components/camera.json b/web/public/locales/fr/components/camera.json
new file mode 100644
index 000000000..565f4022d
--- /dev/null
+++ b/web/public/locales/fr/components/camera.json
@@ -0,0 +1,36 @@
+{
+ "group": {
+ "edit": "Éditer le groupe de caméras",
+ "label": "Groupe de caméras",
+ "add": "Ajouter un groupe de caméras",
+ "delete": {
+ "label": "Supprimer le groupe de caméras",
+ "confirm": {
+ "title": "Confirmer la suppression",
+ "desc": "Êtes-vous sûr de vouloir supprimer le groupe de caméras {{name}}?"
+ }
+ },
+ "name": {
+ "placeholder": "Saisissez un nom...",
+ "label": "Nom",
+ "errorMessage": {
+ "mustLeastCharacters": "Le nom du groupe de caméras doit comporter au moins 2 caractères.",
+ "exists": "Le nom du groupe de caméras existe déjà.",
+ "nameMustNotPeriod": "Le nom de groupe de caméras ne doit pas contenir de période.",
+ "invalid": "Nom de groupe de caméras invalide."
+ }
+ },
+ "cameras": {
+ "label": "Caméras",
+ "desc": "Sélectionner les caméras pour ce groupe."
+ },
+ "success": "Le groupe de caméras ({{name}}) a été enregistré.",
+ "icon": "Icône",
+ "camera": {
+ "setting": {
+ "label": "Paramètres de flux de caméra",
+ "title": "{{cameraName}} Paramètres de flux"
+ }
+ }
+ }
+}
diff --git a/web/public/locales/fr/components/dialog.json b/web/public/locales/fr/components/dialog.json
new file mode 100644
index 000000000..fc36e1778
--- /dev/null
+++ b/web/public/locales/fr/components/dialog.json
@@ -0,0 +1,74 @@
+{
+ "restart": {
+ "title": "Êtes-vous sûr de vouloir redémarrer Frigate ?",
+ "restarting": {
+ "title": "Frigate redémarre",
+ "content": "Cette page sera rechargée dans {{countdown}} secondes.",
+ "button": "Forcer le rechargement maintenant"
+ },
+ "button": "Redémarrer"
+ },
+ "explore": {
+ "plus": {
+ "submitToPlus": {
+ "label": "Soumettre à Frigate+",
+ "desc": "Les objets situés dans des endroits que vous souhaitez éviter ne sont pas des faux positifs. Les soumettre comme faux positifs perturberait le modèle."
+ },
+ "review": {
+ "true": {
+ "label": "Confirmez cette étiquette pour Frigate Plus",
+ "true_one": "C'est un {{label}}",
+ "true_many": "Ce sont des {{label}}",
+ "true_other": ""
+ },
+ "false": {
+ "false_one": "Ceci n'est pas un {{label}}",
+ "false_many": "Ceci n'est pas une {{label}}",
+ "false_other": "",
+ "label": "Ne pas confirmer cette étiquette pour Frigate Plus"
+ },
+ "state": {
+ "submitted": "Soumis"
+ }
+ }
+ },
+ "video": {
+ "viewInHistory": "Afficher dans l'historique"
+ }
+ },
+ "export": {
+ "time": {
+ "custom": "Personnalisé",
+ "fromTimeline": "Sélectionner depuis la chronologie",
+ "lastHour_one": "Dernière heure",
+ "lastHour_many": "{{count}} dernières heures",
+ "lastHour_other": "",
+ "end": {
+ "label": "Sélectionner l'instant de fin",
+ "title": "Instant de fin"
+ },
+ "start": {
+ "label": "Sélectionner l'instant de démarrage",
+ "title": "Instant de démarrage"
+ }
+ },
+ "selectOrExport": "Sélectionner ou Exporter",
+ "toast": {
+ "error": {
+ "failed": "Impossible de démarrer l'export : {{error}}"
+ },
+ "success": "Exportation démarrée. Consulter le fichier dans le dossier /exports."
+ },
+ "select": "Sélectionner",
+ "name": {
+ "placeholder": "Nommer l'export"
+ },
+ "export": "Exporter"
+ },
+ "search": {
+ "saveSearch": {
+ "desc": "Fournir un nom pour cette recherche sauvegardée.",
+ "label": "Sauvergarder la recherche"
+ }
+ }
+}
diff --git a/web/public/locales/fr/components/filter.json b/web/public/locales/fr/components/filter.json
new file mode 100644
index 000000000..cea8b3f7c
--- /dev/null
+++ b/web/public/locales/fr/components/filter.json
@@ -0,0 +1,35 @@
+{
+ "labels": {
+ "label": "Étiquettes",
+ "all": {
+ "title": "Toutes les étiquettes",
+ "short": "Étiquettes"
+ },
+ "count": "{{count}} Étiquettes"
+ },
+ "filter": "Filtre",
+ "zones": {
+ "label": "Zones",
+ "all": {
+ "title": "Toutes les zones",
+ "short": "Zones"
+ }
+ },
+ "dates": {
+ "all": {
+ "title": "Toutes les dates",
+ "short": "Dates"
+ }
+ },
+ "more": "Plus de filtres",
+ "reset": {
+ "label": "Réinitialiser les filtres aux valeurs par défaut"
+ },
+ "timeRange": "Plage de temps",
+ "subLabels": {
+ "label": "Sous-étiquettes",
+ "all": "Toutes les sous-étiquettes"
+ },
+ "score": "Score",
+ "estimatedSpeed": "Vitesse estimée ({{unit}})"
+}
diff --git a/web/public/locales/fr/components/icons.json b/web/public/locales/fr/components/icons.json
new file mode 100644
index 000000000..cb29e936c
--- /dev/null
+++ b/web/public/locales/fr/components/icons.json
@@ -0,0 +1,8 @@
+{
+ "iconPicker": {
+ "search": {
+ "placeholder": "Chercher une icône..."
+ },
+ "selectIcon": "Sélectionnez une icône"
+ }
+}
diff --git a/web/public/locales/fr/components/input.json b/web/public/locales/fr/components/input.json
new file mode 100644
index 000000000..d0e5bacd6
--- /dev/null
+++ b/web/public/locales/fr/components/input.json
@@ -0,0 +1,10 @@
+{
+ "button": {
+ "downloadVideo": {
+ "label": "Télécharger la vidéo",
+ "toast": {
+ "success": "Le téléchargement de votre vidéo de revue a commencé."
+ }
+ }
+ }
+}
diff --git a/web/public/locales/fr/components/player.json b/web/public/locales/fr/components/player.json
new file mode 100644
index 000000000..306228bf2
--- /dev/null
+++ b/web/public/locales/fr/components/player.json
@@ -0,0 +1,33 @@
+{
+ "noRecordingsFoundForThisTime": "Aucun enregistrement trouvé pour cette heure",
+ "noPreviewFoundFor": "Aucun aperçu trouvé pour {{cameraName}}",
+ "noPreviewFound": "Aucun aperçu trouvé",
+ "submitFrigatePlus": {
+ "title": "Soumettre cette image à Frigate+?",
+ "submit": "Soumettre"
+ },
+ "streamOffline": {
+ "title": "Flux hors ligne",
+ "desc": "Aucune image n'a été reçue sur le flux {{cameraName}} detect
, vérifiez le journal d'erreurs"
+ },
+ "livePlayerRequiredIOSVersion": "iOS 17.1 ou une version ultérieure est requis pour ce type de flux en direct.",
+ "cameraDisabled": "La caméra est désactivée",
+ "stats": {
+ "streamType": {
+ "title": "Type de flux :",
+ "short": "Type"
+ },
+ "bandwidth": {
+ "title": "Bande passante :",
+ "short": "Bande passante"
+ },
+ "latency": {
+ "title": "Latence :",
+ "value": "{{seconds}} secondes",
+ "short": {
+ "title": "Latence",
+ "value": "{{seconds}} sec"
+ }
+ }
+ }
+}
diff --git a/web/public/locales/fr/objects.json b/web/public/locales/fr/objects.json
new file mode 100644
index 000000000..40b7163a1
--- /dev/null
+++ b/web/public/locales/fr/objects.json
@@ -0,0 +1,20 @@
+{
+ "bicycle": "Vélo",
+ "car": "Voiture",
+ "person": "Personne",
+ "motorcycle": "Moto",
+ "airplane": "Avion",
+ "bus": "Bus",
+ "train": "Train",
+ "boat": "Bateau",
+ "traffic_light": "Feu de circulation",
+ "fire_hydrant": "Bouche d'incendie",
+ "street_sign": "Plaque de rue",
+ "parking_meter": "Parcmètre",
+ "bench": "Banc",
+ "bird": "Oiseau",
+ "cat": "Chat",
+ "stop_sign": "Panneau de stop",
+ "dog": "Chien",
+ "horse": "Cheval"
+}
diff --git a/web/public/locales/fr/views/configEditor.json b/web/public/locales/fr/views/configEditor.json
new file mode 100644
index 000000000..a8fe75f31
--- /dev/null
+++ b/web/public/locales/fr/views/configEditor.json
@@ -0,0 +1,15 @@
+{
+ "configEditor": "Éditeur de configuration",
+ "documentTitle": "Éditeur de configuration - Frigate",
+ "copyConfig": "Copier la configuration",
+ "saveOnly": "Sauvegarder seulement",
+ "saveAndRestart": "Sauvegarder & redémarrer",
+ "toast": {
+ "success": {
+ "copyToClipboard": "Configuration copiée dans le presse-papiers."
+ },
+ "error": {
+ "savingError": "Erreur lors de l'enregistrement de la configuration"
+ }
+ }
+}
diff --git a/web/public/locales/fr/views/events.json b/web/public/locales/fr/views/events.json
new file mode 100644
index 000000000..59766dd28
--- /dev/null
+++ b/web/public/locales/fr/views/events.json
@@ -0,0 +1,29 @@
+{
+ "detections": "Détections",
+ "motion": {
+ "label": "Mouvement",
+ "only": "Mouvement seulement"
+ },
+ "alerts": "Alertes",
+ "allCameras": "Toutes les caméras",
+ "empty": {
+ "alert": "Il n'y a aucune alerte à passer en revue",
+ "detection": "Il n'y a aucune détection à passer en revue",
+ "motion": "Aucune donnée de mouvement trouvée"
+ },
+ "timeline": "Chronologie",
+ "events": {
+ "label": "Événements",
+ "aria": "Sélectionner les événements",
+ "noFoundForTimePeriod": "Aucun événement trouvé pour cette plage de temps."
+ },
+ "documentTitle": "Revue - Frigate",
+ "recordings": {
+ "documentTitle": "Enregistrements - Frigate"
+ },
+ "calendarFilter": {
+ "last24Hours": "Dernières 24 heures"
+ },
+ "timeline.aria": "Sélectionner une chronologie",
+ "markAsReviewed": "Marqué comme révisé"
+}
diff --git a/web/public/locales/fr/views/explore.json b/web/public/locales/fr/views/explore.json
new file mode 100644
index 000000000..12a72837a
--- /dev/null
+++ b/web/public/locales/fr/views/explore.json
@@ -0,0 +1,33 @@
+{
+ "generativeAI": "IA générative",
+ "documentTitle": "Explorer - Frigate",
+ "exploreIsUnavailable": {
+ "title": "L'exploration est indisponible",
+ "embeddingsReindexing": {
+ "estimatedTime": "Temps restant estimé :",
+ "finishingShortly": "Termine bientôt",
+ "context": "L'exploration peut être utilisée une fois la réindexation des objets suivis terminée",
+ "startingUp": "Démarrage...",
+ "step": {
+ "thumbnailsEmbedded": "Vignettes intégrées : ",
+ "descriptionsEmbedded": "Descriptions intégrées : ",
+ "trackedObjectsProcessed": "Objets suivis traités : "
+ }
+ },
+ "downloadingModels": {
+ "context": "Frigate télécharge les modèles de représentation vectorielle nécessaires à la prise en charge de la recherche sémantique. Cette opération peut prendre plusieurs minutes selon la vitesse de votre connexion réseau.",
+ "setup": {
+ "visionModelFeatureExtractor": "Extracteur de caractéristiques de modèle de vision",
+ "textTokenizer": "Tokeniseur de texte",
+ "visionModel": "Modèle de vision",
+ "textModel": "Modèle de texte"
+ },
+ "tips": {
+ "documentation": "Lire la documentation"
+ }
+ }
+ },
+ "details": {
+ "timestamp": "Horodatage"
+ }
+}
diff --git a/web/public/locales/fr/views/exports.json b/web/public/locales/fr/views/exports.json
new file mode 100644
index 000000000..3c572ba4f
--- /dev/null
+++ b/web/public/locales/fr/views/exports.json
@@ -0,0 +1,17 @@
+{
+ "documentTitle": "Exporter - Frigate",
+ "search": "Chercher",
+ "noExports": "Aucune exportation trouvée",
+ "deleteExport": "Supprimer l'export",
+ "deleteExport.desc": "Êtes-vous sûr de vouloir supprimer {{exportName}}?",
+ "editExport": {
+ "title": "Renommer l'export",
+ "desc": "Saisissez un nouveau nom pour cet export.",
+ "saveExport": "Enregistrer l'export"
+ },
+ "toast": {
+ "error": {
+ "renameExportFailed": "Échec du renommage de l'export : {{errorMessage}}"
+ }
+ }
+}
diff --git a/web/public/locales/fr/views/faceLibrary.json b/web/public/locales/fr/views/faceLibrary.json
new file mode 100644
index 000000000..37e11770e
--- /dev/null
+++ b/web/public/locales/fr/views/faceLibrary.json
@@ -0,0 +1,38 @@
+{
+ "description": {
+ "addFace": "Tutoriel ajouter une nouvelle collection à la librairie de visages",
+ "placeholder": "Saisissez un nom pour cette collection"
+ },
+ "details": {
+ "person": "Personne",
+ "confidence": "Confiance",
+ "face": "Détails du visage",
+ "timestamp": "Horodatage",
+ "faceDesc": "Détails du visage et de l'objet associé"
+ },
+ "documentTitle": "Librairie de visages - Frigate",
+ "uploadFaceImage": {
+ "title": "Télécharger l'image du visage",
+ "desc": "Téléchargez une image pour rechercher des visages et l'inclure dans {{pageToggle}}"
+ },
+ "createFaceLibrary": {
+ "title": "Créer une collection",
+ "desc": "Créer une nouvelle collection",
+ "new": "Créer un nouveau visage",
+ "nextSteps": "Pour construire une base solide :