From 100c0d3399941bc1bb43e0c858acb8eb55b20f02 Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Mon, 5 Oct 2026 13:47:16 -0400 Subject: [PATCH] [FIX] electron: remove Electron's default English application menu MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Without a menu set by the application, Electron installs its own: in English, while the interface is French, and offering Reload and the developer tools to the operator. The shell now sets a null menu before its first window, which also removes the menu bar on Windows. Checked: the shell test fails without the call and passes with it; the rebuilt exe, run under Wine 11, shows the version banner and no menu bar. --- FR --- [FIX] electron : retirer le menu anglais par défaut d'Electron Sans menu posé par l'application, Electron installe le sien : en anglais, alors que l'interface est en français, et offrant à l'opérateur le rechargement et les outils de développement. La coquille pose désormais un menu nul avant sa première fenêtre, ce qui retire aussi la barre de menu sous Windows. Vérifié : l'épreuve de la coquille échoue sans l'appel et passe avec ; l'exécutable reconstruit, lancé sous Wine 11, montre le bandeau de version et aucune barre de menu. Assisted-by: Claude Opus 5.5 --- electron/main.js | 12 ++++++++++-- test/coquille.test.js | 8 ++++++++ test/electron_factice.js | 9 +++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/electron/main.js b/electron/main.js index f8d7d6b..dd0b6c3 100644 --- a/electron/main.js +++ b/electron/main.js @@ -10,7 +10,7 @@ // processus principal que par les canaux que ce module traite. Un nom importé // interprété comme du balisage reste ainsi une faute d'affichage, et non un // accès au disque. -import { app, BrowserWindow, ipcMain } from 'electron'; +import { app, BrowserWindow, ipcMain, Menu } from 'electron'; import { fileURLToPath } from 'node:url'; // Chemins relatifs à ce module : ils valent dans le dépôt comme dans @@ -45,4 +45,12 @@ function creerFenetre() { fenetre.loadFile(PAGE); } -app.whenReady().then(creerFenetre); +// Sans menu posé par l'application, Electron installe le sien : en anglais, +// alors que l'interface est en français (§ 2), et porteur de « Reload » et +// des outils de développement. null le retire, et retire avec lui la barre +// de menu des fenêtres sous Windows et Linux ; il est posé avant la première +// fenêtre, qui naîtrait sinon avec la barre. +app.whenReady().then(() => { + Menu.setApplicationMenu(null); + creerFenetre(); +}); diff --git a/test/coquille.test.js b/test/coquille.test.js index 14629ae..55965ac 100644 --- a/test/coquille.test.js +++ b/test/coquille.test.js @@ -92,6 +92,14 @@ describe('coquille : processus principal', () => { assert.ok(existsSync(webPreferences.preload), `${webPreferences.preload} absent`); }); + test("aucun menu d'application : le menu par défaut d'Electron, en anglais, est retiré avant la première fenêtre (§ 2)", () => { + const { menus, sequence } = journalDeLaCoquille(); + assert.deepEqual(menus, [null]); + const retrait = sequence.indexOf('Menu.setApplicationMenu'); + const fenetre = sequence.indexOf('new BrowserWindow'); + assert.ok(retrait !== -1 && fenetre !== -1 && retrait < fenetre, `ordre des appels : ${sequence.join(', ')}`); + }); + test('la fenêtre charge la page que Vite construit dans www/', () => { assert.deepEqual(journalDeLaCoquille().chargements, [ { loadFile: join(RACINE, 'www', 'index.html') }, diff --git a/test/electron_factice.js b/test/electron_factice.js index 94dbba9..dcf6d9b 100644 --- a/test/electron_factice.js +++ b/test/electron_factice.js @@ -48,6 +48,8 @@ const journal = { sequence: [], // Options de chaque new BrowserWindow. fenetres: [], + // Argument de chaque Menu.setApplicationMenu. + menus: [], // { loadFile: chemin } ou { loadURL: adresse }, par appel. chargements: [], // Canal de chaque ipcMain.handle ou ipcMain.on. @@ -124,6 +126,13 @@ export class BrowserWindow { } } +export const Menu = { + setApplicationMenu(menu) { + journal.sequence.push('Menu.setApplicationMenu'); + journal.menus.push(menu); + }, +}; + export const ipcMain = { handle(canal, gestionnaire) { journal.sequence.push(`ipcMain.handle:${canal}`);