I18N изменить язык в Next.JS

#javascript #reactjs #internationalization #next.js #i18next

#javascript #reactjs #интернационализация #next.js #i18next

Вопрос:

У меня есть некоторые проблемы с I18N и NextJS. Итак, я настроил свой I18N, все работает с языковым стандартом по умолчанию, но все выходит из строя, если я хочу изменить язык из локального хранилища.
В _app.js Я попытался использовать эту функцию:

 const { i18n } = useTranslation();
useEffect(() => {
    if(localStorage.getItem('Locale')) {
        i18n.changeLanguage(localStorage.getItem('Locale'))
    }
}, [])
  

Я импортировал:

 import './I18N/i18next';
import { useTranslation } from 'react-i18next'
  

Когда приложение загружается, оно выходит из строя и выдает ошибку:

 The above error occurred in the <MyApp> component:

at MyApp (webpack-internal:///./pages/_app.js:35:24)
at ErrorBoundary (webpack-internal:///./node_modules/@next/react-dev-overlay/lib/internal/ErrorBoundary.js:23:47)
at ReactDevOverlay (webpack-internal:///./node_modules/@next/react-dev-overlay/lib/internal/ReactDevOverlay.js:73:23)
at Container (webpack-internal:///./node_modules/next/dist/client/index.js:146:5)
at AppContainer (webpack-internal:///./node_modules/next/dist/client/index.js:623:24)
at Root (webpack-internal:///./node_modules/next/dist/client/index.js:739:25)

React will try to recreate this component tree from scratch using the error boundary you provided, ErrorBoundary.
  

Я использую новейший Next.js и I18N
Я обнаружил, что программа выходит из строя, когда код достигает i18n.changeLanguage(‘en’). Если я использую кнопку для установки новой локали, возникает та же ошибка. Я знаю, что next.js у меня есть возможность читать локаль из URL, но я хочу использовать локаль из локального хранилища. Возможно ли таким образом использовать I18N в следующем js? Я также обнаружил, что если я консольный журнал i18n, он возвращает мне, что у i18n есть функция changeLanguage.
Спасибо всем за ответы! Я вообще не знаю, что делать: (

Обновлено: next.config.js:

 const withLess = require('@zeit/next-less');
const withSass = require('@zeit/next-sass');
module.exports = withSass(withLess({
    lessLoaderOptions: {
        javascriptEnabled: true
    }
}))
  

Комментарии:

1. можете ли вы воспроизвести это с помощью песочницы?

2. Next.js codesandbox работает очень плохо. Если вам нужна дополнительная информация, просто скажите, что мне нужно вам показать 🙂

3. я думаю, что проблема в useEffect попробуйте еще для совместного использования

4. Все сохраняется, даже если я делаю это при нажатии кнопки без оператора if

Ответ №1:

Вы можете изменить локальный по умолчанию в next.config.js

в _app.js вы можете получить локальный в маршрутизаторе

 const router = useRouter();
const { locale } = router;
const { i18n } = useTranslation();

useEffect(() => {
    i18n.changeLanguage(locale);
  }, [locale]);
  

я полагаю, что у вас есть две локали (fr, en)

next.config.js

 const withLess = require('@zeit/next-less');
const withSass = require('@zeit/next-sass');
module.exports = withSass(withLess({
    lessLoaderOptions: {
        javascriptEnabled: true
    },
    i18n: {
        locales: ["fr", "en"],
        defaultLocale: "fr",
    },
}))
  

Комментарии:

1. Язык по умолчанию установлен в конфигурации i18n, даже если я это сделаю, проблема будет, когда я попытаюсь динамически изменить язык с помощью функции changeLanguage. Или эта конфигурация поможет?

2. Next.js обрабатывает этот случай автоматически. он определяет язык навигатора, поэтому вам не нужно определять это динамически

3. Но если я хочу иметь кнопки типа: LT EN RU, которые меняют язык, но не хотят указывать его в URL? Что я должен был делать?

4. Спасибо, это решение помогло мне! 🙂

5. @EvaldDoda каким было ваше решение?