typescript i18 next/i18 n更改语言不适用于整个网站

ve7v8dk2  于 2022-11-18  发布在  TypeScript
关注(0)|答案(3)|浏览(307)

我正在做一个react-typescript应用程序,我需要能够翻译网站。我正在使用i18 next库。在主页中,用户可以使用运行此方法的按钮来更改语言。

changeLang(lang:string):any{
        i18next.changeLanguage(lang).then(() => {
            this.props.close(); 
            i18next.options.lng = lang;
        });
    }

这对于改变主页的语言非常有效。但是当我转到下一页时,它又回到了原来的语言。我似乎不能让整个网站运行在不同的语言上。
我的索引.tsx文件

import React from 'react';
import ReactDOM from 'react-dom';
import './styles/index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import Amplify from 'aws-amplify';
import awsmobile from "./aws-exports";

import * as enTranslations from "./locales/en"; /* This import refers to all of the texts in english */
import * as ptTranslations from "./locales/pt" /* This import refers to all of the texts in portuguese */
import {initReactI18next, I18nextProvider} from 'react-i18next'; /* Import needed for the use of the dictionary/translation  */
import LanguageDetector from "i18next-browser-languagedetector"; /* Import needed for the use of the dictionary/translation  */
import i18next from "i18next"; /* Import needed for the use of the dictionary/translation  */

/* Configure Amplify on the client so that we can use it to interact with our backend services */
Amplify.configure(awsmobile);

/* Extract the translations */
const resources = {
  en: {messages: enTranslations}, 
  pt: {messages: ptTranslations}
};

/* Setting up the dictionary/translator */
const i18n = i18next.use(LanguageDetector).use(initReactI18next);

i18n.init({
  react: {
      wait: true,
  },
  resources: resources,
  lng: 'pt', /* Main Language */
  fallbackLng: 'en',
  keySeparator: '.',
  interpolation: {
      escapeValue: false,
  },
  ns: ['messages'],
  defaultNS: 'messages',
  fallbackNS: [],
});

ReactDOM.render(
  <I18nextProvider i18n={i18n}>
    <App />
  </I18nextProvider>,
  document.getElementById('root')
);

reportWebVitals();

我的网站上的所有页面都具有以下结构:

import { Component } from "react"
import { AuthProps } from "../../@types/auth"  // Imports Auth props used to authenticate user
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome" /* Import needed to be able to use the custom FontAwesome font */
import { faChevronLeft } from "@fortawesome/free-solid-svg-icons" /* Import needed to get the desired font elements */

import i18next from "i18next"; /* Import needed for the use of the dictionary/translation  */
import { withTranslation } from 'react-i18next'; /* Import needed for the use of the dictionary/translation  */

import '../styles/views/change-password-confirm.css';

/**
 * Simple page that tells our user that his password has been changed
 */
class ChangePasswordConfirmation extends Component<AuthProps> {
  render() {
    return (
      <div className="change-password-confirm-background">  
      <div className="change-password-confirm-main">
        <div className="change-password-confirm-container">
          {/* Button used to go back to the login page */}
          <a href="/login" className="back"><FontAwesomeIcon icon={faChevronLeft}></FontAwesomeIcon></a>  
          <h1>{i18next.t('ChangePasswordConfirm.catchphrase')}</h1>
          <p>{i18next.t('ChangePasswordConfirm.secondaryText')}</p>
        </div>
      </div>
    </div>
    )
  }
}

export default withTranslation()(ChangePasswordConfirmation)

正如你所看到的,我使用i18next.t('my-key')来获取翻译,并使用“withTranslation()"导出每个组件/页面。所以我不知道为什么整个网站不改变语言。有人能帮助我吗?

kupeojn6

kupeojn61#

所以我认为这里的问题是你在每一个页面上都从库中导入i18 next。你应该做的是导出你在索引文件中创建的i18 n,并将它导入到每一个其他文件中,而不是为那里的每一个组件导入一个新的i18 next。如果你想改变其他页面的语言,也可以试着把整个网站的语言值放在某种全局上下文中。我希望这对你有帮助!

qrjkbowd

qrjkbowd2#

我在使用i18n.changeLanguage()方法时遇到了同样的问题,所以,我最终通过获取用户在浏览器中使用的当前语言来解决这个问题,
const getUserLanguage = () => window.navigator.userLanguage || window.navigator.language;
window.navigator.language适用于大多数现代浏览器,但为了安全起见,添加window.navigator.userLanguage
现在通过调用getUserLangauge()方法得到userlanguage,并在此基础上更改语言。
像这样的东西,

i18n.use(initReactI18next).init({
 resources,
 lng: `${userLanguage}`,
 fallbackLng: 'en',
 keySeparator: false,
 interpolation: {
  escapeValue: false,
  },
});

但缺点是,当我们切换语言时,我们需要刷新页面。请注意,在生产中,它只是检查用户的浏览器设置,并基于此呈现特定的语言。用户不能切换语言(切换的唯一方法是更改浏览器中的语言设置并刷新页面)

5t7ly7z5

5t7ly7z53#

只是把那里的人可以有同样的问题,仔细检查您的导入locales/lang/translations.json。我有一个坏的复制粘贴,使我的两个语言指向同一个翻译文件,因此它没有翻译任何东西

相关问题