Skip to content

Deprecated menu.ts (Menu from electron)

marek edited this page Apr 5, 2026 · 3 revisions
import { app, BrowserWindow, Menu } from "electron";
import { isDev } from "./utils/util.js";
import { getTranslationsPath } from "./pathResolver.js";
import { readFileSync } from "fs";
import path from "path";
import { logger } from "./utils/logger.js";

export function createMenu(mainWindow: BrowserWindow, lang: Language) {
    const translations = loadLocalTranslation(lang);

    Menu.setApplicationMenu(
        Menu.buildFromTemplate([
            {
                label: process.platform === "darwin" ? undefined : "Mol* App",
                type: "submenu",
                submenu: [
                    {
                        label: translations.devtools,
                        click: () => mainWindow.webContents.openDevTools(),
                        visible: isDev(),
                    },
                    {
                        label: translations.quitElectron,
                        click: () => {
                            app.quit();
                        },
                    },
                ],
            },
        ])
    );
}

type MenuTranslations = {
    quitElectron: string;
    devtools: string;
};

// TODO: these translation should be memoized somehow
function loadLocalTranslation(lang: Language): MenuTranslations {
    const translationsPath = getTranslationsPath();

    logger.info(
        `Translations will be read from <${translationsPath}> and used for Menu creation.`
    );

    try {
        const enJson = readFileSync(
            path.join(translationsPath, "en", "translation.json"),
            "utf-8"
        );
        const deJson = readFileSync(
            path.join(translationsPath, "de", "translation.json"),
            "utf-8"
        );

        let t;
        if (lang === "en") {
            t = JSON.parse(enJson);
        } else if (lang === "de") {
            t = JSON.parse(deJson);
        }

        return {
            quitElectron: t.menu["Quit Mol* App"],
            devtools: t.menu["DevTools"],
        };
    } catch (err) {
        logger.warn(
            `Error occured when reading translations. Default values will be used. Details: <${err}>.`
        );
        return {
            quitElectron: "Quit Mol* App",
            devtools: "DevTools",
        };
    }
}

Clone this wiki locally