57 lines
1.6 KiB
TypeScript
57 lines
1.6 KiB
TypeScript
import { join } from "path";
|
|
import i18n from "i18next";
|
|
import fs from "fs";
|
|
import { app } from "electron";
|
|
import { __dirname } from "./utils.js";
|
|
|
|
|
|
/**
|
|
* Selects the appropriate language based on system preferences and available languages
|
|
*
|
|
* @param langs Array of available language codes
|
|
* @param fallback Fallback language code to use if no match is found
|
|
* @returns Selected language code
|
|
*/
|
|
export function detectLanguage(langs: string[], fallback: string): string {
|
|
// Get the system locale using Electron's app API
|
|
// Note: This assumes the function is used in the main process
|
|
const systemLanguage = app.getPreferredSystemLanguages()[0];
|
|
|
|
// Normalize the system locale (convert to lowercase and replace hyphens/underscores)
|
|
const normalizedLang = systemLanguage.toLowerCase().split("-")[0];
|
|
|
|
// Find a matching language
|
|
const matchedLanguage = langs.find(lang => {
|
|
if (lang.indexOf(normalizedLang) !== -1) {
|
|
return lang;
|
|
}
|
|
});
|
|
|
|
// Return matched language or fallback
|
|
return matchedLanguage || fallback;
|
|
}
|
|
|
|
export default function initI18n() {
|
|
const languages = ["en", "de", "es", "fr", "it", "ja", "ar", "ko", "zh-CN"];
|
|
|
|
const l = detectLanguage(languages, "en");
|
|
|
|
const resources = languages.reduce((acc: { [key: string]: { translation: any } }, lang) => {
|
|
acc[lang] = {
|
|
translation: JSON.parse(fs.readFileSync(join(__dirname, `./i18n/${lang}.json`), "utf8"))
|
|
};
|
|
return acc;
|
|
}, {});
|
|
|
|
i18n.init({
|
|
resources,
|
|
lng: l,
|
|
fallbackLng: "en",
|
|
interpolation: {
|
|
escapeValue: false // react already safes from xss => https://www.i18next.com/translation-function/interpolation#unescape
|
|
}
|
|
});
|
|
return i18n;
|
|
}
|
|
|