Make translations work on web & native

This commit is contained in:
Zoe Roux 2025-02-25 23:16:21 +01:00
parent c7a4ab78f6
commit 3405ea9caf
No known key found for this signature in database
6 changed files with 33 additions and 30 deletions

View File

@ -1,5 +1,5 @@
import { createMiddleware, setServerData } from "one";
import { supportedLanguages } from "~/providers/translations.web.ssr";
import { supportedLanguages } from "~/providers/translations.compile";
export default createMiddleware(({ request, next }) => {
const systemLanguage = request.headers

View File

@ -7,7 +7,7 @@ import { createQueryClient } from "~/query";
import { AccountProvider } from "./account-provider";
import { ErrorConsumer } from "./error-consumer";
import { ErrorProvider } from "./error-provider";
import { TranslationsProvider } from "./translations";
import { TranslationsProvider } from "./translations.native";
const QueryProvider = ({ children }: { children: ReactNode }) => {
const [queryClient] = useState(() => createQueryClient());

View File

@ -0,0 +1,25 @@
import i18next from "i18next";
import { type ReactNode, useMemo } from "react";
import { I18nextProvider } from "react-i18next";
import { resources, supportedLanguages } from "./translations.compile";
import { setServerData } from "one";
export const TranslationsProvider = ({ children }: { children: ReactNode }) => {
const val = useMemo(() => {
const i18n = i18next.createInstance();
i18n.init({
interpolation: {
escapeValue: false,
},
returnEmptyString: false,
fallbackLng: "en",
load: "currentOnly",
supportedLngs: supportedLanguages,
resources: resources,
});
// store data for the browser
setServerData("translations", i18n.services.resourceStore.data);
return i18n;
}, []);
return <I18nextProvider i18n={val}>{children}</I18nextProvider>;
};

View File

@ -1,22 +1,4 @@
import i18next from "i18next";
import { type ReactNode, useMemo } from "react";
import { I18nextProvider } from "react-i18next";
import { resources, supportedLanguages } from "./translations.compile";
export const TranslationsProvider = ({ children }: { children: ReactNode }) => {
const val = useMemo(() => {
const i18n = i18next.createInstance();
i18n.init({
interpolation: {
escapeValue: false,
},
returnEmptyString: false,
fallbackLng: "en",
load: "currentOnly",
supportedLngs: supportedLanguages,
resources: resources,
});
return i18n;
}, []);
return <I18nextProvider i18n={val}>{children}</I18nextProvider>;
};
// use native version during ssr
export default typeof window === "undefined"
? await import("./translations.native")
: await import("./translations.web.client");

View File

@ -3,6 +3,7 @@ import HttpApi, { type HttpBackendOptions } from "i18next-http-backend";
import { getServerData } from "one";
import { type ReactNode, useMemo } from "react";
import { I18nextProvider } from "react-i18next";
import { supportedLanguages } from "./translations.compile";
export const TranslationsProvider = ({ children }: { children: ReactNode }) => {
const val = useMemo(() => {
@ -15,7 +16,7 @@ export const TranslationsProvider = ({ children }: { children: ReactNode }) => {
returnEmptyString: false,
fallbackLng: "en",
load: "currentOnly",
supportedLngs: getServerData("supportedLngs"),
supportedLngs: supportedLanguages,
// we don't need to cache resources since we always get a fresh one from ssr
backend: {
loadPath: "/translations/{{lng}}.json",

View File

@ -1,5 +0,0 @@
// use native version during ssr
export const { TranslationsProvider } =
typeof window === "undefined"
? await import("./translations")
: await import("./translations.web.client");