embroidery-viewer/src/i18n/index.js

35 lines
1.1 KiB
JavaScript

import { derived, writable } from "svelte/store";
import translations from "./translations";
const browserLocale = navigator.language || "en";
const [baseLang, region] = browserLocale.split("-");
export const DEFAULT_LOCALE = translations[browserLocale] ? browserLocale : translations[baseLang] ? baseLang :"en";
export const locale = writable(DEFAULT_LOCALE);
export const locales = Object.entries(translations).map(([key, lang]) => [key, lang.name]);
function translate(locale, key, vars = {}) {
if (!key) throw new Error("Translation key is required.");
const validLocale = translations[locale]
? locale
: translations[baseLang]
? baseLang
: "en";
let text = translations[validLocale][key] || translations["en"][key];
if (!text) {
console.error(`Missing translation for key "${key}" in locale "${validLocale}".`);
return key;
}
return Object.entries(vars).reduce(
(str, [varKey, value]) => str.replaceAll(`{{${varKey}}}`, value),
text
);
}
export const t = derived(locale, ($locale) => (key, vars = {}) =>
translate($locale, key, vars)
);