diff --git a/static/webui/translations/fr.js b/static/webui/translations/fr.js
index 6230c60d5..15d4be30c 100644
--- a/static/webui/translations/fr.js
+++ b/static/webui/translations/fr.js
@@ -1,7 +1,7 @@
 // French translation by Vitruvio
 dict = {
     general_inventoryUpdateNote: `Note : Pour voir les changements en jeu, l'inventaire doit être actualisé. Cela se fait en tapant /sync dans le tchat, en visitant un dojo/relais ou en se reconnectant.`,
-    general_inventoryUpdateNoteGameWs: `[UNTRANSLATED] Note: You may need to reopen any menu you are on for changes to be reflected.`,
+    general_inventoryUpdateNoteGameWs: `Note : Rouvrir un menu est nécessaire pour voir les changements.`,
     general_addButton: `Ajouter`,
     general_setButton: `Définir`,
     general_none: `Aucun`,
@@ -11,7 +11,7 @@ dict = {
     code_loginFail: `Connexion échouée. Vérifiez le mot de passe.`,
     code_regFail: `Enregistrement impossible. Compte existant?`,
     code_changeNameConfirm: `Nouveau nom du compte :`,
-    code_changeNameRetry: `[UNTRANSLATED] |NAME| is already taken.`,
+    code_changeNameRetry: `|NAME| est déjà pris.`,
     code_deleteAccountConfirm: `Supprimer |DISPLAYNAME| (|EMAIL|) ? Cette action est irreversible.`,
     code_archgun: `Archgun`,
     code_melee: `Melee`,
@@ -32,8 +32,8 @@ dict = {
     code_renamePrompt: `Nouveau nom :`,
     code_remove: `Retirer`,
     code_addItemsConfirm: `Ajouter |COUNT| items à l'inventaire ?`,
-    code_addTechProjectsConfirm: `[UNTRANSLATED] Are you sure you want to add |COUNT| research to your clan?`,
-    code_addDecoRecipesConfirm: `[UNTRANSLATED] Are you sure you want to add |COUNT| deco recipes to your clan?`,
+    code_addTechProjectsConfirm: `Ajouter |COUNT| recherches au clan ?`,
+    code_addDecoRecipesConfirm: `Ajouter |COUNT| décorations au clan ?`,
     code_succRankUp: `Montée de niveau effectuée.`,
     code_noEquipmentToRankUp: `Aucun équipement à monter de niveau.`,
     code_succAdded: `Ajouté.`,
@@ -66,8 +66,8 @@ dict = {
     code_pigment: `Pigment`,
     code_mature: `Maturer pour le combat`,
     code_unmature: `Régrésser l'âge génétique`,
-    code_fund: `[UNTRANSLATED] Fund`,
-    code_funded: `[UNTRANSLATED] Funded`,
+    code_fund: `Financer`,
+    code_funded: `Complété`,
     code_succChange: `Changement effectué.`,
     code_requiredInvigorationUpgrade: `Augmentation offensive et défensive requises.`,
     login_description: `Connexion avec les informations de connexion OpenWF.`,
@@ -85,8 +85,8 @@ dict = {
     navbar_cheats: `Cheats`,
     navbar_import: `Importer`,
     inventory_addItems: `Ajouter des items`,
-    inventory_addItemByItemType: `[UNTRANSLATED] Raw`,
-    inventory_addItemByItemType_warning: `[UNTRANSLATED] Use this feature at your own risk. It may break your inventory, and you will need to remove items manually if something goes wrong.`,
+    inventory_addItemByItemType: `Brut`,
+    inventory_addItemByItemType_warning: `Cette fonctionnalité comporte des risques. Il faudra rajouter les items manuellement si l'inventaire est compris.`,
     inventory_suits: `Warframes`,
     inventory_longGuns: `Armes principales`,
     inventory_pistols: `Armes secondaires`,
@@ -182,7 +182,7 @@ dict = {
     cheats_skipTutorial: `Passer le tutoriel`,
     cheats_skipAllDialogue: `Passer les dialogues`,
     cheats_unlockAllScans: `Débloquer tous les scans`,
-    cheats_unlockSuccRelog: `[UNTRANSLATED] Success. Please that you'll need to relog for the client to refresh this.`,
+    cheats_unlockSuccRelog: `Succès. Une reconnexion est requise pour appliquer les changements.`,
     cheats_unlockAllMissions: `Débloquer toutes les missions`,
     cheats_unlockAllMissions_ok: `Succès. Une actualisation de l'inventaire est nécessaire.`,
     cheats_infiniteCredits: `Crédits infinis`,
@@ -218,7 +218,7 @@ dict = {
     cheats_baroFullyStocked: `Stock de Baro au max`,
     cheats_syndicateMissionsRepeatable: `Mission syndicat répétables`,
     cheats_unlockAllProfitTakerStages: `Débloquer toutes les étapes du Preneur de Profit`,
-    cheats_unlockSuccInventory: `[UNTRANSLATED] Success. Please note that you'll need to resync your inventory, e.g. using the bootstrapper's /sync command, visiting a dojo/relay, or relogging..`,
+    cheats_unlockSuccInventory: `Succès. Une resynchronisation est nécessaire en tapant "/sync" dans le tchat, en visitant un relais ou en se reconnectant.`,
     cheats_instantFinishRivenChallenge: `Débloquer le challenge Riven instantanément`,
     cheats_instantResourceExtractorDrones: `Ressources de drones d'extraction instantannées`,
     cheats_noResourceExtractorDronesDamage: `Aucun dégâts aux drones d'extraction de resources`,
@@ -247,7 +247,7 @@ dict = {
     cheats_changeSupportedSyndicate: `Allégeance`,
     cheats_changeButton: `Changer`,
     cheats_markAllAsRead: `Marquer la boîte de réception comme lue`,
-    cheats_finishInvasionsInOneMission: `[UNTRANSLATED] Finish Invasions in One Mission`,
+    cheats_finishInvasionsInOneMission: `Compléter les invasions en une mission.`,
 
     worldState: `Carte Solaire`,
     worldState_creditBoost: `Booster de Crédit`,
@@ -257,30 +257,30 @@ dict = {
     worldState_baroTennoConRelay: `Relais Baro TennoCon`,
     worldState_starDays: `Jours Stellaires`,
     worldState_galleonOfGhouls: `Galion des Goules`,
-    worldState_anniversary: `[UNTRANSLATED] Warframe Anniversary`,
-    worldState_useAnniversaryTagForOldGoals: `[UNTRANSLATED] Use Tag from Warframe Anniversary for old Events`,
+    worldState_anniversary: `Anniversaire de Warframe`,
+    worldState_useAnniversaryTagForOldGoals: `Utiliser Tag de l'Anniversaire de Warframe pour les anciens événements`,
     worldState_ghoulEmergence: `Purge des Goules`,
     worldState_plagueStar: `Fléau Céleste`,
     worldState_dogDays: `Bataille d'Eau`,
-    worldState_dogDaysRewards: `[UNTRANSLATED] Dog Days Rewards`,
+    worldState_dogDaysRewards: `Récompenses de la Bataille d'Eau`,
     worldState_wolfHunt: `Chasse au Loup (2025)`,
     worldState_orphixVenom: `Venin Orphix`,
     worldState_longShadow: `La Propagation des Ombres`,
     worldState_hallowedFlame: `Flamme Hantée`,
     worldState_hallowedNightmares: `Cauchemars Hantés`,
-    worldState_hallowedNightmaresRewards: `[UNTRANSLATED] Hallowed Nightmares Rewards`,
+    worldState_hallowedNightmaresRewards: `Récompenses Flamme Hantée Cauchemar`,
     worldState_proxyRebellion: `Rébellion Proxy`,
-    worldState_proxyRebellionRewards: `[UNTRANSLATED] Proxy Rebellion Rewards`,
+    worldState_proxyRebellionRewards: `Récompenses Rébellion Proxy`,
     worldState_bellyOfTheBeast: `Ventre de la Bête`,
-    worldState_bellyOfTheBeastProgressOverride: `[UNTRANSLATED] Belly of the Beast Progress`,
+    worldState_bellyOfTheBeastProgressOverride: `Progrès du Ventre de la Bête`,
     worldState_eightClaw: `Huitième Griffe`,
-    worldState_eightClawProgressOverride: `[UNTRANSLATED] Eight Claw Progress`,
+    worldState_eightClawProgressOverride: `Progrès de la Huitième Griffe`,
     worldState_thermiaFractures: `Crevasses Thermia`,
-    worldState_thermiaFracturesProgressOverride: `[UNTRANSLATED] Thermia Fractures Progress`,
-    worldState_from_year: `[UNTRANSLATED] from |VAL|`,
-    worldState_pre_year: `[UNTRANSLATED] pre |VAL|`,
-    worldState_week: `[UNTRANSLATED] Week |VAL|`,
-    worldState_incompatibleWith: `[UNTRANSLATED] Incompatible with:`,
+    worldState_thermiaFracturesProgressOverride: `Progrès des Fractures Thermia`,
+    worldState_from_year: `de |VAL|`,
+    worldState_pre_year: `pre-|VAL|`,
+    worldState_week: `Semaine |VAL|`,
+    worldState_incompatibleWith: `Incompatible avec :`,
     enabled: `Activé`,
     disabled: `Désactivé`,
     worldState_we1: `Weekend 1`,
@@ -324,8 +324,8 @@ dict = {
     worldState_varziaFullyStocked: `Stock de Varzia au max`,
     worldState_varziaOverride: `Rotation de Varzia`,
 
-    import_importNote: `[UNTRANSLATED] You can provide a full or partial inventory.php or getShip.php response (client representation) here.`,
-    import_importNote2: `[UNTRANSLATED] All fields that are supported by the importer will be overwritten in your account.`,
+    import_importNote: `Une réponse partielle ou complète de inventory.php ou getShip.php peut être incluse ici.`,
+    import_importNote2: `Tous les champs sont supportés par l'outil d'import serront écrasés sur le compte.`,
     import_submit: `Soumettre`,
     import_samples: `Échantillons :`,
     import_samples_maxFocus: `Toutes les écoles de focus au rang max`,
@@ -394,7 +394,7 @@ dict = {
 
     guildView_cheats: `[UNTRANSLATED] Clan Cheats`,
     guildView_techProjects: `Recherche`,
-    guildView_vaultDecoRecipes: `[UNTRANSLATED] Dojo Deco Recipes`,
+    guildView_vaultDecoRecipes: `Schémas de décorations de dojo`,
     guildView_alliance: `Alliance`,
     guildView_members: `Members`,
     guildView_pending: `En Attente`,
@@ -414,11 +414,11 @@ dict = {
     guildView_rank_soldier: `Soldat`,
     guildView_rank_utility: `Utilitaire`,
     guildView_rank_warlord: `Seigneur de guerre`,
-    guildView_currency_owned: `[UNTRANSLATED] |COUNT| in Vault.`,
-    guildView_bulkAddTechProjects: `[UNTRANSLATED] Add Missing Research`,
-    guildView_bulkAddVaultDecoRecipes: `[UNTRANSLATED] Add Missing Dojo Deco Recipes`,
-    guildView_bulkFundTechProjects: `[UNTRANSLATED] Fund All Research`,
-    guildView_bulkCompleteTechProjects: `[UNTRANSLATED] Complete All Research`,
+    guildView_currency_owned: `|COUNT| dans le coffre.`,
+    guildView_bulkAddTechProjects: `Ajouter les recherches manquantes`,
+    guildView_bulkAddVaultDecoRecipes: `Ajouter les schémas de décorations de dojo manquantes`,
+    guildView_bulkFundTechProjects: `Financer toutes les recherches`,
+    guildView_bulkCompleteTechProjects: `Compléter toutes les recherches`,
     guildView_promote: `Promouvoir`,
     guildView_demote: `Rétrograder`,