From b069fab82f20d1562d4f1122043656d2c765f7f9 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 27 Oct 2025 17:17:37 +0200 Subject: [PATCH] chore(website): use static loading of translations --- apps/website/src/i18n.ts | 29 +++++++++++++++++ apps/website/src/index.tsx | 31 +++++++------------ .../translations/ar/translation.json | 0 .../translations/ca/translation.json | 0 .../translations/cs/translation.json | 0 .../translations/de/translation.json | 0 .../translations/el/translation.json | 0 .../translations/en/translation.json | 0 .../translations/es/translation.json | 0 .../translations/fa/translation.json | 0 .../translations/fi/translation.json | 0 .../translations/fr/translation.json | 0 .../translations/hr/translation.json | 0 .../translations/hu/translation.json | 0 .../translations/id/translation.json | 0 .../translations/it/translation.json | 0 .../translations/ja/translation.json | 0 .../translations/ko/translation.json | 0 .../translations/md/translation.json | 0 .../translations/nb-NO/translation.json | 0 .../translations/nl/translation.json | 0 .../translations/pl/translation.json | 0 .../translations/pt-BR/translation.json | 0 .../translations/pt/translation.json | 0 .../translations/ro/translation.json | 0 .../translations/ru/translation.json | 0 .../translations/sl/translation.json | 0 .../translations/sr/translation.json | 0 .../translations/sv/translation.json | 0 .../translations/tr/translation.json | 0 .../translations/uk/translation.json | 0 .../translations/vi/translation.json | 0 .../translations/zh-Hans/translation.json | 0 .../translations/zh-Hant/translation.json | 0 34 files changed, 40 insertions(+), 20 deletions(-) rename apps/website/{public => src}/translations/ar/translation.json (100%) rename apps/website/{public => src}/translations/ca/translation.json (100%) rename apps/website/{public => src}/translations/cs/translation.json (100%) rename apps/website/{public => src}/translations/de/translation.json (100%) rename apps/website/{public => src}/translations/el/translation.json (100%) rename apps/website/{public => src}/translations/en/translation.json (100%) rename apps/website/{public => src}/translations/es/translation.json (100%) rename apps/website/{public => src}/translations/fa/translation.json (100%) rename apps/website/{public => src}/translations/fi/translation.json (100%) rename apps/website/{public => src}/translations/fr/translation.json (100%) rename apps/website/{public => src}/translations/hr/translation.json (100%) rename apps/website/{public => src}/translations/hu/translation.json (100%) rename apps/website/{public => src}/translations/id/translation.json (100%) rename apps/website/{public => src}/translations/it/translation.json (100%) rename apps/website/{public => src}/translations/ja/translation.json (100%) rename apps/website/{public => src}/translations/ko/translation.json (100%) rename apps/website/{public => src}/translations/md/translation.json (100%) rename apps/website/{public => src}/translations/nb-NO/translation.json (100%) rename apps/website/{public => src}/translations/nl/translation.json (100%) rename apps/website/{public => src}/translations/pl/translation.json (100%) rename apps/website/{public => src}/translations/pt-BR/translation.json (100%) rename apps/website/{public => src}/translations/pt/translation.json (100%) rename apps/website/{public => src}/translations/ro/translation.json (100%) rename apps/website/{public => src}/translations/ru/translation.json (100%) rename apps/website/{public => src}/translations/sl/translation.json (100%) rename apps/website/{public => src}/translations/sr/translation.json (100%) rename apps/website/{public => src}/translations/sv/translation.json (100%) rename apps/website/{public => src}/translations/tr/translation.json (100%) rename apps/website/{public => src}/translations/uk/translation.json (100%) rename apps/website/{public => src}/translations/vi/translation.json (100%) rename apps/website/{public => src}/translations/zh-Hans/translation.json (100%) rename apps/website/{public => src}/translations/zh-Hant/translation.json (100%) diff --git a/apps/website/src/i18n.ts b/apps/website/src/i18n.ts index 10608e571..6f0ae9fbf 100644 --- a/apps/website/src/i18n.ts +++ b/apps/website/src/i18n.ts @@ -1,9 +1,38 @@ +import i18next from "i18next"; +import { initReactI18next } from "react-i18next"; + interface Locale { id: string; name: string; rtl?: boolean; } +i18next.use(initReactI18next); +const localeFiles = import.meta.glob("./translations/*/translation.json", { eager: true }); +const resources: Record> = {}; +for (const [ path, translations ] of Object.entries(localeFiles)) { + const id = path.split("/").at(-2); + if (!resources[id]) resources[id] = {}; + if ("default" in (translations as any)) { + resources[id].translation = (translations as any).default; + } else { + resources[id].translation = translations; + } +} + +export function initTranslations(lng: string) { + i18next.init({ + fallbackLng: "en", + lng, + returnEmptyString: false, + resources, + initAsync: false, + react: { + useSuspense: false + } + }); +} + export const LOCALES: Locale[] = [ { id: "en", name: "English" }, { id: "ro", name: "Română" }, diff --git a/apps/website/src/index.tsx b/apps/website/src/index.tsx index 92455792a..78dcb6556 100644 --- a/apps/website/src/index.tsx +++ b/apps/website/src/index.tsx @@ -8,9 +8,9 @@ import Footer from './components/Footer.js'; import GetStarted from './pages/GetStarted/get-started.js'; import SupportUs from './pages/SupportUs/SupportUs.js'; import { createContext } from 'preact'; -import { useLayoutEffect, useState } from 'preact/hooks'; +import { useLayoutEffect, useRef, useState } from 'preact/hooks'; import { default as i18next, changeLanguage } from 'i18next'; -import { extractLocaleFromUrl, LOCALES, mapLocale } from './i18n'; +import { extractLocaleFromUrl, initTranslations, LOCALES, mapLocale } from './i18n'; import HttpApi from 'i18next-http-backend'; import { initReactI18next } from "react-i18next"; @@ -43,29 +43,20 @@ export function App(props: {repoStargazersCount: number}) { export function LocaleProvider({ children }) { const { path } = useLocation(); const localeId = mapLocale(extractLocaleFromUrl(path) || navigator.language); - const [ loaded, setLoaded ] = useState(false); + const loadedRef = useRef(false); - useLayoutEffect(() => { - i18next - .use(HttpApi) - .use(initReactI18next); - i18next.init({ - lng: localeId, - fallbackLng: "en", - backend: { - loadPath: "/translations/{{lng}}/{{ns}}.json", - }, - returnEmptyString: false - }).then(() => setLoaded(true)) -}, []); - - useLayoutEffect(() => { - if (!loaded) return; + if (!loadedRef.current) { + initTranslations(localeId); + loadedRef.current = true; + } else { changeLanguage(localeId); + } + + useLayoutEffect(() => { const correspondingLocale = LOCALES.find(l => l.id === localeId); document.documentElement.lang = localeId; document.documentElement.dir = correspondingLocale?.rtl ? "rtl" : "ltr"; - }, [ loaded, localeId ]); + }, [ localeId ]); return ( diff --git a/apps/website/public/translations/ar/translation.json b/apps/website/src/translations/ar/translation.json similarity index 100% rename from apps/website/public/translations/ar/translation.json rename to apps/website/src/translations/ar/translation.json diff --git a/apps/website/public/translations/ca/translation.json b/apps/website/src/translations/ca/translation.json similarity index 100% rename from apps/website/public/translations/ca/translation.json rename to apps/website/src/translations/ca/translation.json diff --git a/apps/website/public/translations/cs/translation.json b/apps/website/src/translations/cs/translation.json similarity index 100% rename from apps/website/public/translations/cs/translation.json rename to apps/website/src/translations/cs/translation.json diff --git a/apps/website/public/translations/de/translation.json b/apps/website/src/translations/de/translation.json similarity index 100% rename from apps/website/public/translations/de/translation.json rename to apps/website/src/translations/de/translation.json diff --git a/apps/website/public/translations/el/translation.json b/apps/website/src/translations/el/translation.json similarity index 100% rename from apps/website/public/translations/el/translation.json rename to apps/website/src/translations/el/translation.json diff --git a/apps/website/public/translations/en/translation.json b/apps/website/src/translations/en/translation.json similarity index 100% rename from apps/website/public/translations/en/translation.json rename to apps/website/src/translations/en/translation.json diff --git a/apps/website/public/translations/es/translation.json b/apps/website/src/translations/es/translation.json similarity index 100% rename from apps/website/public/translations/es/translation.json rename to apps/website/src/translations/es/translation.json diff --git a/apps/website/public/translations/fa/translation.json b/apps/website/src/translations/fa/translation.json similarity index 100% rename from apps/website/public/translations/fa/translation.json rename to apps/website/src/translations/fa/translation.json diff --git a/apps/website/public/translations/fi/translation.json b/apps/website/src/translations/fi/translation.json similarity index 100% rename from apps/website/public/translations/fi/translation.json rename to apps/website/src/translations/fi/translation.json diff --git a/apps/website/public/translations/fr/translation.json b/apps/website/src/translations/fr/translation.json similarity index 100% rename from apps/website/public/translations/fr/translation.json rename to apps/website/src/translations/fr/translation.json diff --git a/apps/website/public/translations/hr/translation.json b/apps/website/src/translations/hr/translation.json similarity index 100% rename from apps/website/public/translations/hr/translation.json rename to apps/website/src/translations/hr/translation.json diff --git a/apps/website/public/translations/hu/translation.json b/apps/website/src/translations/hu/translation.json similarity index 100% rename from apps/website/public/translations/hu/translation.json rename to apps/website/src/translations/hu/translation.json diff --git a/apps/website/public/translations/id/translation.json b/apps/website/src/translations/id/translation.json similarity index 100% rename from apps/website/public/translations/id/translation.json rename to apps/website/src/translations/id/translation.json diff --git a/apps/website/public/translations/it/translation.json b/apps/website/src/translations/it/translation.json similarity index 100% rename from apps/website/public/translations/it/translation.json rename to apps/website/src/translations/it/translation.json diff --git a/apps/website/public/translations/ja/translation.json b/apps/website/src/translations/ja/translation.json similarity index 100% rename from apps/website/public/translations/ja/translation.json rename to apps/website/src/translations/ja/translation.json diff --git a/apps/website/public/translations/ko/translation.json b/apps/website/src/translations/ko/translation.json similarity index 100% rename from apps/website/public/translations/ko/translation.json rename to apps/website/src/translations/ko/translation.json diff --git a/apps/website/public/translations/md/translation.json b/apps/website/src/translations/md/translation.json similarity index 100% rename from apps/website/public/translations/md/translation.json rename to apps/website/src/translations/md/translation.json diff --git a/apps/website/public/translations/nb-NO/translation.json b/apps/website/src/translations/nb-NO/translation.json similarity index 100% rename from apps/website/public/translations/nb-NO/translation.json rename to apps/website/src/translations/nb-NO/translation.json diff --git a/apps/website/public/translations/nl/translation.json b/apps/website/src/translations/nl/translation.json similarity index 100% rename from apps/website/public/translations/nl/translation.json rename to apps/website/src/translations/nl/translation.json diff --git a/apps/website/public/translations/pl/translation.json b/apps/website/src/translations/pl/translation.json similarity index 100% rename from apps/website/public/translations/pl/translation.json rename to apps/website/src/translations/pl/translation.json diff --git a/apps/website/public/translations/pt-BR/translation.json b/apps/website/src/translations/pt-BR/translation.json similarity index 100% rename from apps/website/public/translations/pt-BR/translation.json rename to apps/website/src/translations/pt-BR/translation.json diff --git a/apps/website/public/translations/pt/translation.json b/apps/website/src/translations/pt/translation.json similarity index 100% rename from apps/website/public/translations/pt/translation.json rename to apps/website/src/translations/pt/translation.json diff --git a/apps/website/public/translations/ro/translation.json b/apps/website/src/translations/ro/translation.json similarity index 100% rename from apps/website/public/translations/ro/translation.json rename to apps/website/src/translations/ro/translation.json diff --git a/apps/website/public/translations/ru/translation.json b/apps/website/src/translations/ru/translation.json similarity index 100% rename from apps/website/public/translations/ru/translation.json rename to apps/website/src/translations/ru/translation.json diff --git a/apps/website/public/translations/sl/translation.json b/apps/website/src/translations/sl/translation.json similarity index 100% rename from apps/website/public/translations/sl/translation.json rename to apps/website/src/translations/sl/translation.json diff --git a/apps/website/public/translations/sr/translation.json b/apps/website/src/translations/sr/translation.json similarity index 100% rename from apps/website/public/translations/sr/translation.json rename to apps/website/src/translations/sr/translation.json diff --git a/apps/website/public/translations/sv/translation.json b/apps/website/src/translations/sv/translation.json similarity index 100% rename from apps/website/public/translations/sv/translation.json rename to apps/website/src/translations/sv/translation.json diff --git a/apps/website/public/translations/tr/translation.json b/apps/website/src/translations/tr/translation.json similarity index 100% rename from apps/website/public/translations/tr/translation.json rename to apps/website/src/translations/tr/translation.json diff --git a/apps/website/public/translations/uk/translation.json b/apps/website/src/translations/uk/translation.json similarity index 100% rename from apps/website/public/translations/uk/translation.json rename to apps/website/src/translations/uk/translation.json diff --git a/apps/website/public/translations/vi/translation.json b/apps/website/src/translations/vi/translation.json similarity index 100% rename from apps/website/public/translations/vi/translation.json rename to apps/website/src/translations/vi/translation.json diff --git a/apps/website/public/translations/zh-Hans/translation.json b/apps/website/src/translations/zh-Hans/translation.json similarity index 100% rename from apps/website/public/translations/zh-Hans/translation.json rename to apps/website/src/translations/zh-Hans/translation.json diff --git a/apps/website/public/translations/zh-Hant/translation.json b/apps/website/src/translations/zh-Hant/translation.json similarity index 100% rename from apps/website/public/translations/zh-Hant/translation.json rename to apps/website/src/translations/zh-Hant/translation.json