Component cannot listen language from context ReactJs i18next

问题描述 投票:0回答:0

我正在使用i18next来切换语言,我想使用useContext来避免prop drilling,这样项目中的所有组件和页面都可以知道选择的语言,但是我有这个问题是组件无法监听上下文,我搜索了原因并试图解决它但失败了。

我有另一个用于用户身份验证的上下文并且运行良好,我在 languageContext 中执行了相同的步骤但仍然发生错误。

错误:

TypeError:无法读取未定义的属性(读取“handleLanguage”)

上下文页面

import React,{ createContext, useContext, useEffect, useState } from "react";
import { useTranslation } from "react-i18next";

const languageContext = createContext();

export function languageContextProvider({ children }) {
    const { i18n } = useTranslation();
    const [language, setLanguage] = useState(i18n.language);
    const [loading ,setLoading] = useState(true);
    function handleLanguage () {

      if(language === 'en')
      {
          i18n.changeLanguage('ar');
          setLanguage('ar');
          setLoading(false)
      }
      else
      {
          i18n.changeLanguage('en');
          setLanguage('en');
          setLoading(false)
      }
  }

  useEffect(() => {
    console.log(language,'lang');
  }, []);

  return (
    <languageContext.Provider
      value={{ language,handleLanguage}}
    >
    {!loading && children}
    </languageContext.Provider>
  );
}

export function useLanguage() {
  return useContext(languageContext);
}

应用页面

import React, { useState } from "react";
import { BrowserRouter, Route, Routes, Navigate } from "react-router-dom";
import Login from "./components/login";
import {UserAuthContextProvider} from './context/userContext'
import AuthRoute from './components/authRoute';
import { languageContextProvider } from "./context/languageContext";
function App() {
  return (
    <languageContextProvider>
    <BrowserRouter>
    <UserAuthContextProvider>
    <Routes>
    <Route path="/" element={<Navigate to='/login' />} />
    <Route path="/login" element={<AuthRoute><Login/> </AuthRoute>} />
    <Route path="/forgotPassword" element={<AuthRoute><Forgot/> </AuthRoute>} />
    <Route path="/cost-center" element={<ProtectedRoute><CostCenterPage/></ProtectedRoute>} />
    <Route path="/cost-center/:id" element={<ProtectedRoute><CostCenterDetails /></ProtectedRoute>} />
    <Route path="/cost-center/:id/:invoiceID" element={<ProtectedRoute><CostCenterDetails /></ProtectedRoute>} />
    <Route path="/admin" element={<ProtectedRoute><Admin /></ProtectedRoute>} />
    <Route path="*" element={<Navigate to="/" />} />
    </Routes>
    </UserAuthContextProvider>
    </BrowserRouter>
    </languageContextProvider>
  );
}

export default App;

索引页

import React, { Suspense } from 'react';
import ReactDOM from 'react-dom';
import "../node_modules/bootstrap/dist/css/bootstrap.min.css";
import "./css/fonts.css";
import "./css/style.css";
import App from './App';
import Loader from './components/Loader';
import './i18n'

ReactDOM.render(
    <Suspense fallback={Loader}>
        <App />
    </Suspense>,
    document.getElementById('root')
);

i18n 页面

import i18n from 'i18next';
import Backend from 'i18next-http-backend';
import LanguageDetector from 'i18next-browser-languagedetector';
import { initReactI18next } from 'react-i18next';

i18n.use(Backend).use(LanguageDetector).use(initReactI18next).init({
    fallbackLng: 'ar',
    // lng: 'en',
    debug: true,
    interpolation: {
        escapeValue: false
    }
});

export default i18n;

最后一个组件布局

import React from 'react'
import { useTranslation } from 'react-i18next';
import {useLanguage} from '../context/languageContext'
const Layout = ({children,classBackground}) => {
    const { user,accessAPIs } = useUserAuth();
    const { handleLanguage,language } = useLanguage();
    const {t} = useTranslation();
return("test")
}

我尝试在 reactjs 中使用 useContext 以便所有组件都可以在该上下文中使用变量和函数,但它失败了并且组件无法使用它们。

reactjs internationalization react-context i18next
© www.soinside.com 2019 - 2024. All rights reserved.