Я работаю над приложением React, в котором я хотел бы использовать i18next.Для этого я добавил i18next
и react-i18next
в свое приложение, и все, кажется, работает как шарм.
Мое приложение использует BrowserRouter
из реагирующий маршрутизатор переключаться между различными взглядами.Когда я загружаю корневой URL на http://localhost:3000,, все работает как чудо.Я могу переключать страницы, которые затем переводятся без проблем.BrowserRouter
отправляет изменения URL в историю браузера, чтобы пользователи могли использовать кнопки «Назад» и «Вперед» в своем браузере для навигации.Это означает, что как только пользователь нажимает на один из пунктов меню в приложении, URL-адрес изменяется, то есть с http://localhost:3000 на http://localhost:3000/suppliers.
Если после такого изменения я нажимаю обновить, возникает проблемапроисходит: консоль показывает i18next::translator: missingKey undefined translation
и представление не переведено.Такое же поведение проявляется при добавлении перенаправления с корневого URL на страницу по умолчанию.Странно то, что весь корневой пользовательский интерфейс приложения (заголовок, боковая панель) переведен, это только часть страницы, которой управляет реагирующий маршрутизатор (каждый компонент, вложенный в соответствующий <Route>
), который показывает непереведенный.Это также только факт загрузки браузера, поэтому после полного обновления страницы или после первоначального перехода на страницу.Если я перехожу в свое приложение после загрузки и даже в том же виде, то вместо этого отображается переведенный вид.
Я завернул все в свой <App>
-компонент в <Suspense>
-блок, включая <BrowserRouter>
, но проблема все еще возникает.Моя JSX-структура выглядит примерно так:
<App>
<Suspense fallback={<Loader /}>
<BrowserRouter>
<SideMenu>
{/* Translated objects are shown here */}
</SideMenu>
<HeaderBar>
{/* Translated objects are shown here as well */}
</HeaderBar>
<Views>
<Route path="/sample" component={SampleComponent} /> {/* SampleComponent will not be translated after changing language or navigating to `/sample` immediately/by refreshing` */}
</Views>
</BrowserRouter>
</Suspense>
</App>
Я использую очень простую конфигурацию:
import i18n from 'i18next';
import Backend from 'i18next-xhr-backend';
import { initReactI18next } from 'react-i18next';
i18n
.use(Backend)
.use(initReactI18next)
.init({
fallbackLng: 'nl',
debug: true,
interpolation: {
escapeValue: false
}
});
export default i18n;
Я обнаружил более старую проблему на GitHub (https://github.com/i18next/react-i18next/issues/322)без четкого решения и для более старой версии реакции-i18следующий. Я не совсем уверен, как интегрировать реактив-маршрутизатор с реактив-i18следующий, чтобы предотвратить это поведение.
Редактировать еще один странныйДело в том, что вызов i18n.changeLanguage
распространяется на все представления, кроме компонентов, вложенных в <Route>
... Я думаю, что это может быть связано, но я все еще не смог найти решение ...