This is an i18next library designed to work with secure-electron-template. The library is a rough copy of i18next-node-fs-backend but using IPC (inter-process-communication) to request a file be read or written from the electron's main process. The translation files that are written are written synchronously, but this should not be a problem because you should be creating translation files in development only (translation files should already exist before deploying to production environments).
npm i i18next-electron-fs-backend
Based on documentation for a i18next config, import the backend.
import i18n from "i18next";
import {
initReactI18next
} from "react-i18next";
import backend from "i18next-electron-fs-backend";
i18n
.use(backend)
.use(initReactI18next)
.init({
backend: {
loadPath: "./app/localization/locales/{{lng}}/{{ns}}.json",
addPath: "./app/localization/locales/{{lng}}/{{ns}}.missing.json",
contextBridgeApiKey: "api" // needs to match first parameter of contextBridge.exposeInMainWorld in preload file; defaults to "api"
},
// other options you might configure
debug: true,
saveMissing: true,
saveMissingTo: "current",
lng: "en"
});
export default i18n;
const {
contextBridge,
ipcRenderer
} = require("electron");
const backend = require("i18next-electron-fs-backend");
contextBridge.exposeInMainWorld(
"api", {
i18nextElectronBackend: backend.preloadBindings(ipcRenderer, process)
}
);
const {
app,
BrowserWindow,
session,
ipcMain
} = require("electron");
const backend = require("i18next-electron-fs-backend");
const fs = require("fs");
let win;
async function createWindow() {
win = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
contextIsolation: true,
preload: path.join(__dirname, "preload.js")
}
});
backend.mainBindings(ipcMain, win, fs); // <- configures the backend
// ...
}
app.on("ready", createWindow);
app.on("window-all-closed", () => {
// On macOS it is common for applications and their menu bar
// to stay active until the user quits explicitly with Cmd + Q
if (process.platform !== "darwin") {
app.quit();
} else {
i18nextBackend.clearMainBindings(ipcMain);
}
});
These are options that are configurable, all values below are defaults.
{
debug: false, // If you'd like to show diagnostic messages
loadPath: "/locales/{{lng}}/{{ns}}.json", // Where the translation files get loaded from
addPath: "/locales/{{lng}}/{{ns}}.missing.json" // Where the missing translation files get generated
}