我正在做一个React项目,我已经使用i18next实现了语言切换.语言切换器工作正常,并更改语言,需要重新加载页面.然而,我希望它与我们的reload工作,并改变我的语言切换工作后,我面临一个问题,在我的组件中的动态翻译内容不更新时,语言改变.使用useTranslation翻译的静态内容会正确更新,但组件中动态生成的内容不会更新.

因此,我有一个reload Swtich是正确的工作与reload.

export default function LanguageSwitch() {
  const { i18n } = useTranslation();
  const [language, setLanguage] = useState(localStorage.getItem('lang') ?? 'en');

  function handleLangChange(lang: Key) {
    localStorage.setItem('lang', lang.toString())
    window.onload = function() {
      i18n.changeLanguage(lang.toString())
        .then(() => {
          setLanguage(lang.toString());
        })
        .catch((error) => {
          console.error('Error changing language:', error);
        });
    };
    window.location.reload();
  }

  return (
    <Dropdown aria-label='Language change switch'
              className={'language-switch'}
              onSelectionChange={handleLangChange}
              defaultSelectedKey={language}
              items={SUPPORTED_LANGUAGES}>
      {item =>
        <Item key={item.code}>{item.name}</Item>
      }
    </Dropdown>
  )
}

我改变了处理的方法,以不重新启动页面和我的动态数据现在不翻译

function handleLangChange(lang: Key) {
    localStorage.setItem('lang', lang.toString())
    i18n.changeLanguage(lang.toString())
      .then(() => {
        setLanguage(lang.toString());
      })
      .catch((error) => {
        console.error('Error changing language:', error);
      });
  }

下面是代码的例子

const Configurations = () => {
  const { t } = useTranslation();
  const [language, setLanguage] = useState(localStorage.getItem('lang') || 'en');
  const [configurations, setConfigurations] = useState([]);

  // Simulated API call to fetch configurations
  useEffect(() => {
    // Simulated configurations data
    const data = [
      { id: 1, type: 'foo' },
      { id: 2, type: 'bar' },
    ];
    setConfigurations(data);
  }, [language]); // Trigger fetch data when language changes

  return (
    <div>
      <h1>{t('Welcome')}</h1> - static data is translated correctly without reload
      <ul>
        {configurations.map((config) => (
          <li key={config.id}>
            {config.id}: {t(`TYPE_${config.type.toUpperCase()}.text`)} - dynamic data from the backend and using in the method are not translated without reload.
          </li>
        ))}
      </ul>
    </div>
  );
};

export default Configurations;

NOTE: LanguageSwitch is a part of another Header component which is using in every component as a button in header

I am thinking of rendering app without reloading, but I am not sure how to achieve this

推荐答案

你只需要使用信号使变量在组件之间更新状态

export const languageChanged = signal(false);

然后更新方法

function handleLangChange(lang: Key) {
  localStorage.setItem('lang', lang.toString());
  i18n.changeLanguage(lang.toString())
    .then(() => {
      setLanguage(lang.toString());
      languageChanged.value = !languageChanged;
    })
    .catch((error) => {
      console.error('Error changing language:', error);
    });
}

Javascript相关问答推荐

在分区内迭代分区

了解Node.js中的EventEums和浏览器中的addEventEums之间的关系

在这种情况下,如何 for each 元素添加id?

康威的生活游戏规则在我的Javascript版本中不起作用.''我做错了什么?

使用useEffect,axios和useParams进行react测试

函数返回与输入对象具有相同键的对象

Web Crypto API解密失败,RSA-OAEP

扩展类型的联合被解析为基类型

钛中的onClick事件需要在两次点击之间等待几秒钟

使用Ace编辑器对子组件实例的native-element 进行Angular 获取时面临的问题

postman 预请求中的hmac/sha256内标识-从js示例转换

使用CEPRESS截取时,cy.Wait()在等待5000ms的第一个路由请求时超时

使用Perl Selify::Remote::Driver执行Java脚本时出错

在传单的图像覆盖中重新着色特定 colored颜色 的所有像素

输入数据覆盖JSON文件

使用Java脚本在div中创建新的span标记

通过ng-绑定-html使用插入的HTML中的函数

如何从嵌套的json中获取最大值

在不使用AJAX的情况下将JavaScript数组值传递给Laravel控制器?

如何在底部重叠多个div?