mirror of
https://github.com/bytedance/deer-flow.git
synced 2026-11-08 03:30:34 +00:00
* 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
60 lines
1.3 KiB
TypeScript
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;
|
|
}
|