[FIX] electron: remove Electron's default English application menu

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
This commit is contained in:
Mathieu Benoit 2026-10-05 13:47:16 -04:00
parent a3354e2b0b
commit 100c0d3399
3 changed files with 27 additions and 2 deletions

View file

@ -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();
});

View file

@ -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') },

View file

@ -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}`);