DanielWalnut 459dd78707
perf(frontend): bound delivery, bundles, and long-running UI work (#4622)
* docs: design frontend performance remediation

* docs: plan frontend performance remediation

* test(frontend): add route asset performance budgets

* perf(nginx): compress textual responses safely

* perf(frontend): lazy load case study media

* perf(frontend): bound static demo file tracing

* perf(frontend): restore static locale boundaries

* perf(frontend): defer closed workspace panels

* perf(frontend): split editors and deduplicate highlighting

* perf(frontend): index incremental message derivation

* perf(frontend): stabilize paged history cache policy

* perf(frontend): bound streaming markdown renders

* perf(frontend): virtualize message history

* perf(frontend): bound and virtualize chat lists

* perf(frontend): suspend inactive decorative animation

* perf(browser): stream latest frames as binary

* perf(artifacts): stream bounded text previews

* docs: finalize performance runtime boundaries

* style(backend): apply test formatting

* fix(frontend): keep translation functions client-side

* perf(frontend): defer decorative animation bundles

* test(frontend): lock optimized route budgets

* fix: harden frontend performance boundaries

* test(frontend): update i18n provider fixture

* fix(frontend): preserve sidebar pagination position

* style(backend): format artifact range test
2026-08-01 22:19:59 +08:00

60 lines
1.3 KiB
TypeScript

"use client";
import {
createContext,
useCallback,
useContext,
useEffect,
useState,
type ReactNode,
} from "react";
import type { Locale } from "@/core/i18n";
import type { Translations } from "@/core/i18n/locales";
import { clientTranslations } from "./client-translations";
export interface I18nContextType {
locale: Locale;
setLocale: (locale: Locale) => void;
t: Translations;
}
export const I18nContext = createContext<I18nContextType | null>(null);
export function I18nProvider({
children,
initialLocale,
}: {
children: ReactNode;
initialLocale: Locale;
}) {
const [locale, setLocale] = useState<Locale>(initialLocale);
const [t, setTranslations] = useState<Translations>(
clientTranslations[initialLocale],
);
const handleSetLocale = useCallback((newLocale: Locale) => {
setLocale(newLocale);
setTranslations(clientTranslations[newLocale]);
}, []);
useEffect(() => {
document.documentElement.lang = locale;
}, [locale]);
return (
<I18nContext.Provider value={{ locale, setLocale: handleSetLocale, t }}>
{children}
</I18nContext.Provider>
);
}
export function useI18nContext() {
const context = useContext(I18nContext);
if (!context) {
throw new Error("useI18n must be used within I18nProvider");
}
return context;
}