feat: localisation and multi-lang support (#95)
* feat: setup localisation with lingui * Fix hydration and locale issues * Add missing translations and tweak selector styling * Extend language support * Update lang support * Extend lang support * Fix build and add dyanmic imports
This commit is contained in:
53
apps/web/src/utils/i18n.ts
Normal file
53
apps/web/src/utils/i18n.ts
Normal file
@@ -0,0 +1,53 @@
|
||||
import { i18n } from "@lingui/core";
|
||||
|
||||
import type { Locale } from "~/locales";
|
||||
import { defaultLocale } from "~/locales";
|
||||
import { messages as enMessages } from "~/locales/en/messages";
|
||||
|
||||
const loadMessages = async (locale: Locale) => {
|
||||
switch (locale) {
|
||||
case "en":
|
||||
return enMessages;
|
||||
case "fr":
|
||||
return (await import("~/locales/fr/messages")).messages;
|
||||
case "de":
|
||||
return (await import("~/locales/de/messages")).messages;
|
||||
case "es":
|
||||
return (await import("~/locales/es/messages")).messages;
|
||||
case "it":
|
||||
return (await import("~/locales/it/messages")).messages;
|
||||
case "nl":
|
||||
return (await import("~/locales/nl/messages")).messages;
|
||||
default:
|
||||
return enMessages;
|
||||
}
|
||||
};
|
||||
|
||||
let isInitialized = false;
|
||||
const loadedLocales = new Set<string>();
|
||||
|
||||
export function initializeI18n(locale: Locale = defaultLocale) {
|
||||
if (!isInitialized) {
|
||||
i18n.load(defaultLocale, enMessages);
|
||||
i18n.activate(defaultLocale);
|
||||
loadedLocales.add(defaultLocale);
|
||||
isInitialized = true;
|
||||
}
|
||||
|
||||
return i18n;
|
||||
}
|
||||
|
||||
export async function activateLocale(locale: Locale) {
|
||||
if (!loadedLocales.has(locale)) {
|
||||
const messages = await loadMessages(locale);
|
||||
i18n.load(locale, messages);
|
||||
loadedLocales.add(locale);
|
||||
}
|
||||
|
||||
i18n.activate(locale);
|
||||
return i18n;
|
||||
}
|
||||
|
||||
initializeI18n();
|
||||
|
||||
export { i18n };
|
||||
Reference in New Issue
Block a user