OpenRewind/src/electron/i18n.ts

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;
}