我使用react-i18next&i18n实现Reaction本地化,I18Next LanguageChanged触发,但我在其中使用函数t()的组件不会自动重新呈现,只有在手动重新加载页面时,UI才会更改.

i18n.js

import i18n from "i18next";
import { initReactI18next } from "react-i18next";
import LanguageDetector from "i18next-browser-languagedetector";
i18n
  // detect user language
  .use(LanguageDetector)
  // pass the i18n instance to react-i18next.
  .use(initReactI18next)
  // init i18next
  .init({
    debug: true,
    fallbackLng: "en",
    interpolation: {
      escapeValue: false,
    },
    resources: {
      en: {
        translation: {
          greeting: "Hello",
        },
      },
      ar: {
        translation: {
          greeting: "مرحبا",
        },
      },
    },
  });

export default i18n;

main.jsx

import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App.jsx";
import "./i18n";
import "./index.css";

ReactDOM.createRoot(document.getElementById("root")).render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);

App.jsx

import { Suspense } from "react";
import LanguageSelector from "@/components/language/LanguageSelector";
import Home from "@/pages/root/Home";

function App() {
  return (
    <Suspense fallback={<p>laoding</p>}>
      <LanguageSelector />
      <Home />
    </Suspense>
  );
}

export default App;

LanguageSelector.jsx,更改语言的组件:

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

const languages = [
  { code: "en", nativeName: "English" },
  { code: "ar", nativeName: "العربية" },
];

const LanguageSelector = () => {
  const { i18n } = useTranslation();

  useEffect(() => {
    document.body.dir = i18n.dir();
  }, [i18n, i18n.language]);

  return (
    <div className="flex-center mt-10 gap-5">
      {languages.map((lng) => (
        <button
          className={`${
            lng.code === i18n.resolvedLanguage ? "bg-green-100" : ""
          } border rounded-xl p-3`}
          key={lng.code}
          onClick={() => i18n.changeLanguage(lng.code)}
        >
          {lng.nativeName}
        </button>
      ))}
    </div>
  );
};

export default LanguageSelector;

Home.jsx,使用t()且不在语言上重新呈现的组件Change:

import React from "react";
import { useTranslation } from "react-i18next";

const Home = () => {
  const { t } = useTranslation();
  return (
    <h1 className="flex-center h-full-screen text-4xl">{t("greeting")}</h1>
  );
};

export default Home;

我已经try 了这个Issue英寸S的解决方案,并在i18n.js init中添加了以下选项:

react: {
      bindI18n: "loaded languageChanged",
      bindI18nStore: "added",
      useSuspense: true,
    },

但这并没有帮助. 我错过了什么?

推荐答案

自从昨天我将Reaction-I18Next从v12.3.1升级到v14.0.2后,我也遇到了这个问题.我决定降级到以前的版本,现在可以了.

Reactjs相关问答推荐

Reaction Axios多部分/表单-数据数组不工作

更改购物车中的产品数量后,PayPal Reaction/Next JS按钮未更新

Reaction中的数据加载不一致

不同步渲染

如何动态地改变<; Select >;React和Tailwind元素?

我无法通过 useContext 显示值

获取 不能显示为 的后代.错误,但不太确定如何构建我的代码以避免此警告

Chakra UI:如何在选中状态下设置复选框 colored颜色

从ReactDataGridtry 将数据传递给父组件

使用D3.js绘制和展示弦图的右下方象限

在遵循 react-navigation 的官方文档时收到警告消息

即使配置了 webpack.config.js,html-loader 也不起作用

在按钮单击中将动态参数传递给 React Query

将 useState 设置为组件内部的值

如何在 ChartJS 中操作 Y 轴

Github 页面无法正确呈现 CSS,因为它是本地的

如何通过 id 从 useSprings 数组中删除元素

具有自动完成功能的 Formik material ui 无法按预期工作

npm init vite@latest 和 npm init vite 有什么区别?

我可以在类组件中使用 useState 挂钩吗?