Search code examples
node.jsinternationalizationazure-functionsserverless

How to use i18next in serverless node js?


I am using Node JS Azure functions. I am trying to internationalize the error messages returned by the functions with i18next. I could find examples with express or plain node server. In these cases middleware pattern can be used.

But for functions, I need a way to call i18next.t('key') with probably a language parameter which I am not able to find. Calling i18next.changeLanguage() before every call to i18next.t('key') doesn't seem practical.

My skeleton code is as follows

const i18next = require("i18next");
const backend = require("i18next-node-fs-backend");

const options = {
    // path where resources get loaded from
    loadPath: '../locales/{{lng}}/{{ns}}.json',
    // path to post missing resources
    addPath: '../locales/{{lng}}/{{ns}}.missing.json',
    // jsonIndent to use when storing json files
    jsonIndent: 4
};

i18next.use(backend).init(options);

exports.getString = (key, lang) => {
   //i18next.changeLanguage(lang,
   return i18next.t(key);
}

It is possible to fetch translations without doing changeLanguage each time?


Solution

  • As pointed out in the comments you need to call the i18next.changeLanguage(lang) function whenever the language needs to be defined or changed.

    You can take a look to the documentation here.

    The code could look like this

    const i18next = require('i18next')
    const backend = require('i18next-node-fs-backend')
    
    const options = {
        // path where resources get loaded from
        loadPath: '../locales/{{lng}}/{{ns}}.json',
        // path to post missing resources
        addPath: '../locales/{{lng}}/{{ns}}.missing.json',
        // jsonIndent to use when storing json files
        jsonIndent: 4
    }
    
    i18next.use(backend).init(options)
    
    exports.getString = (key, lang) => {
        return i18next
            .changeLanguage(lang)
            .then((t) => {
                t(key) // -> same as i18next.t
            })
    }