LanguageContext.tsx 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  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. return (saved as Language) || 'en';
  13. });
  14. const handleSetLanguage = (lang: Language) => {
  15. setLanguage(lang);
  16. localStorage.setItem('userLanguage', lang);
  17. };
  18. const t = (key: keyof typeof translations['zh'], ...args: any[]) => {
  19. let str = translations[language][key] || key;
  20. if (args.length > 0) {
  21. args.forEach((arg, i) => {
  22. str = str.replace(new RegExp(`\\$${i + 1}`, 'g'), String(arg));
  23. });
  24. }
  25. return str;
  26. };
  27. return React.createElement(
  28. LanguageContext.Provider,
  29. { value: { language, setLanguage: handleSetLanguage, t } },
  30. children
  31. );
  32. };
  33. export const useLanguage = () => {
  34. const context = React.useContext(LanguageContext);
  35. if (!context) {
  36. throw new Error('useLanguage must be used within a LanguageProvider');
  37. }
  38. return context;
  39. };