LanguageContext.tsx 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import React from 'react';
  2. import { translations, Language } from '../utils/translations';
  3. interface LanguageContextType {
  4. language: Language;
  5. setLanguage: (lang: Language) => void;
  6. t: (key: keyof typeof translations['zh'], ...args: any[]) => string;
  7. }
  8. const LanguageContext = React.createContext<LanguageContextType | undefined>(undefined);
  9. export const LanguageProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
  10. const [language, setLanguage] = React.useState<Language>(() => {
  11. const saved = localStorage.getItem('userLanguage');
  12. const envDefault = (import.meta as any).env.VITE_DEFAULT_LANGUAGE as Language;
  13. return (saved as Language) || envDefault || 'en';
  14. });
  15. const handleSetLanguage = (lang: Language) => {
  16. setLanguage(lang);
  17. localStorage.setItem('userLanguage', lang);
  18. };
  19. const t = (key: keyof typeof translations['zh'], ...args: any[]) => {
  20. let str = translations[language][key] || key;
  21. if (args.length > 0) {
  22. args.forEach((arg, i) => {
  23. str = str.replace(new RegExp(`\\$${i + 1}`, 'g'), String(arg));
  24. });
  25. }
  26. return str;
  27. };
  28. return React.createElement(
  29. LanguageContext.Provider,
  30. { value: { language, setLanguage: handleSetLanguage, t } },
  31. children
  32. );
  33. };
  34. export const useLanguage = () => {
  35. const context = React.useContext(LanguageContext);
  36. if (!context) {
  37. throw new Error('useLanguage must be used within a LanguageProvider');
  38. }
  39. return context;
  40. };