I have set up the i18n middleware in my Express Node js server like this:
// server.js import i18nMiddleware from 'i18next-express-middleware'; import i18n from 'i18next'; import Backend from 'i18next-node-fs-backend'; import { LanguageDetector } from 'i18next-express-middleware'; i18n .use(Backend) .use(LanguageDetector) .init({ whitelist: ['en', 'my'], fallbackLng: 'en', // have a common namespace used around the full app ns: ['common'], defaultNS: 'common', debug: false, backend: { loadPath: './locales/{{lng}}/{{ns}}.json', // jsonIndent: 2 } }); app.use(i18nMiddleware.handle(i18n))
Here is the translation test file:
// test.js import i18next from "i18next"; const test = (req, res) =>{ const t = req.i18n.t.bind(i18next); console.log(req.i18n.language) // language set correctly :) console.log(t('title')) // translation not working :( }
The value of title in English is title and for Malaysian, it’s tajuk
As per the express middleware documentation, I’m passing my as the accept-language header , and console.log(req.i18n.language)
is correctly printing it.
However, console.log(t('title'))
is still printing title instead of tajuk
Advertisement
Answer
This looks crazy but this solved the problem:
const i18n = req.i18n; console.log(i18n.t('title'))