Description
🐛 Bug Report
Note
I do not think this is a bug, more of a configuration issue/documentation issue, because clearly, I am doing something wrong
Language is not set during tests with vitest
. In a dependency I import, this code exists:
function useI18N() {
var _useTranslation = reactI18next.useTranslation(),
t = _useTranslation.t,
language = _useTranslation.i18n.language;
if (language !== 'nb' && language !== 'en') {
throw Error('Language must be either nb or en.');
}
return t;
}
function withI18n(Component) {
return function WrappedComponent(props) {
var t = useI18N();
return /*#__PURE__*/React__default["default"].createElement(Component, _extends({}, props, {
i18n: t
}));
};
}
This code throws throw Error('Language must be either nb or en.');
when testing using vitest
. It does not throw for building with vite
nor with the previous test runner jest
(with practically same config).
That code is wrapping a component that is consumed by several components up until the file I am testing, which is using this:
export const renderWithI18NContext = (
component: ReactNode,
organisation?: Organisation,
locale = 'nb'
) => {
return render(componentWithI18NContext(component, organisation, locale));
};
const componentWithI18NContext = (
…
) => {
store.dispatch(…);
i18n.changeLanguage(locale);
return (
<Provider store={store}>
{/* @ts-ignore */}
<MemoryRouter>
<SWRConfig value={{ dedupingInterval: 0 }}>
<Some.Provider value={something}>
{component}
</Some.Provider>
</SWRConfig>
</MemoryRouter>
</Provider>
);
};
With an import i18n
that looks like this:
use(initReactI18next).init({
lng: 'nb',
fallbackLng: 'nb',
resources: {
nb: {
translation: {
…
}
},
en: {
translation: {
…
}
}
},
interpolation: {
escapeValue: false // not needed for react as it escapes by default
}
});
export default i18n;
Which is consumed like this:
it('should pass', async () => {
renderWithI18NContext(
<ComponentTestContainer>
…
component={<ComponentToTest {...props} />}
/>
);
expect(…);
});
I've narrowed it down to react-i18next
is not picking up language, i.e., that use(initReactI18next).init({…})
is not called, or something..
To Reproduce
I cannot produce a reproduction case due to the complexity of the internal (non public) dependencies, which I also think has something to do with this. As stated, I think this is a misconfiguration on my part, not a bug itself.
Expected behavior
That language is set.
Your Environment
- runtime version: node 20
- i18next version: "react-i18next": "14.0.5", "i18next": "23.7.16"
- os: Linux
- any other relevant information