#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 каким было ваше решение?