如何使用钩子在反应 i18next 中修复“未指定回退 UI”

Posted

技术标签:

【中文标题】如何使用钩子在反应 i18next 中修复“未指定回退 UI”【英文标题】:How to fix 'no fallback UI was specified' in react i18next using hooks 【发布时间】:2020-04-15 07:21:36 【问题描述】:

我正在尝试使用 useTranslation 挂钩在我的反应组件中实现 i18next,但它一直说:

未捕获的错误:渲染时暂停测试,但未指定回退 UI。

在树的较高位置添加一个<Suspense fallback=...> 组件,以提供加载指示器或占位符来显示。

如何将<Suspense> 添加到比我所拥有的更高的位置?我究竟做错了什么?我该如何解决?当我使用 <Translation> 组件时,它似乎工作正常。当然,如果我关闭 Suspense 并尝试自己处理它似乎也可以正常工作,但我认为这有点违背目的。我怎样才能使它真正起作用?我的 Fetch 后端是否配置错误?

Test.js

import React,  Suspense, useState, useEffect, lazy  from "react";
import PropTypes from "prop-types";

import i18n from './i18n';
import  useTranslation  from 'react-i18next';

export default function Test( props )
  const  t, i18n  = useTranslation( 'bingo_game' );

    return (
    <Suspense fallback=<div>Loading...</div>>
      <div>
        Pant leg
      </div>
    </Suspense>
    )


Test.propTypes = 
  token: PropTypes.string.isRequired,
;

i18n.js

import i18n from "i18next";
import LngDetector from "i18next-browser-languagedetector";
import  initReactI18next  from "react-i18next";

import Fetch from "i18next-fetch-backend";

  i18n
    .use(LngDetector) //language detector
    .use(Fetch)
    .use(initReactI18next)
    .init(
      backend: 
        loadPath: "/infra/locales/ns.json",
        // path to post missing resources
        addPath: "locales/add/ns",
        // define how to stringify the data when adding missing resources
        stringify: JSON.stringify
      ,
      defaultNS: "base",
      fallbackLng: "en",
      debug: true,
      initImmediate: false
    );

export default i18n;

我已经查看了我可以找到的文档以及 this SO post that is not my issue。

【问题讨论】:

你在哪个组件上使用 Lazy? docs 没有显示Lazy 的使用,但添加了这个:const t, i18n = lazy(() =&gt; useTranslation( 'bingo_game' )); 似乎在这里修复它,但不是在更复杂的组件中 - 这应该是这样吗完成了吗? 【参考方案1】:

在你的i18n 文件中添加这个,它会变魔术:)

.init(
   react: 
     useSuspense: false,
     ...

  );

【讨论】:

这与之前的答案非常相似,但我仍然不急于禁用 Suspense。最终,我通过将所有组件包装在一种 Suspense 包装器中解决了这个问题。我认为从长远来看,我可能想要的是转移到 React Router 选项之一...... 是的,确实如此【参考方案2】:

这不是最好的方法,但我可以建议您通过将此行添加到您的配置来关闭悬念

i18n
  .init(
  ...
  // react i18next special options (optional)
  react: 
    useSuspense: false,
    wait: false,
  ,
);

【讨论】:

是的,我试过了,它工作了,但我不想禁用该功能,我希望它正常工作。 在某些时候你会想要在你的项目中添加测试,但 suspense 不能正常工作 您能否进一步解释一下(@travinkov)?我在我的应用程序的 rails 端进行了一系列测试,还有一些战略性的 try/catch(或等效的 rails - 我忘了)和 sleep 语句似乎正在处理迄今为止的所有事情。我还有什么需要注意的吗?

以上是关于如何使用钩子在反应 i18next 中修复“未指定回退 UI”的主要内容,如果未能解决你的问题,请参考以下文章

在 JSON 字符串中反应 i18n 换行符

React.js:如何在保存后强制反应表再次呈现? (钩子)

如何在带有 TypeScript 的 next.config.js 中使用 i18n 和 next/image?

如何将输入值从子表单组件传递到其父组件的状态以使用反应钩子提交?

如何在 React Native 中导入 i18next?

如何在 next.js 中管理 i18n 路由以使用斜杠而不是破折号