main
tsx 50 lines 1.19 KB
Raw
1 import {
2 createContext,
3 useContext,
4 useState,
5 useEffect,
6 ReactNode,
7 } from "react";
8 import { translations, SupportedLanguage, Translation } from "../utils/i18n";
9
10 interface LanguageContextType {
11 lang: SupportedLanguage;
12 setLang: (lang: SupportedLanguage) => void;
13 t: Translation;
14 }
15
16 const LanguageContext = createContext<LanguageContextType | undefined>(
17 undefined,
18 );
19
20 interface LanguageProviderProps {
21 children: ReactNode;
22 }
23
24 export function LanguageProvider({ children }: LanguageProviderProps) {
25 const [lang, setLang] = useState<SupportedLanguage>("en");
26 const t = translations[lang];
27
28 // Update HTML lang and dir attributes when language changes
29 useEffect(() => {
30 const htmlElement = document.documentElement;
31 const isRTL = lang === "fa";
32
33 htmlElement.lang = lang;
34 htmlElement.dir = isRTL ? "rtl" : "ltr";
35 }, [lang]);
36
37 return (
38 <LanguageContext.Provider value={{ lang, setLang, t }}>
39 {children}
40 </LanguageContext.Provider>
41 );
42 }
43
44 export function useLang(): LanguageContextType {
45 const context = useContext(LanguageContext);
46 if (context === undefined) {
47 throw new Error("useLang must be used within a LanguageProvider");
48 }
49 return context;
50 }