Introduction
This is a middleware to use i18next in express.js.
Getting started
Source can be loaded via npm.
# npm package
$ npm install i18next-express-middleware
wire up i18next to request object
var i18next = require("i18next");
var middleware = require("i18next-express-middleware");
var express = require("express");
i18next.use(middleware.LanguageDetector).init({
preload: ["en", "de", "it"],
...otherOptions
});
var app = express();
app.use(
middleware.handle(i18next, {
ignoreRoutes: ["/foo"],
removeLngFromUrl: false
})
);
app.get("myRoute", function(req, res) {
var lng = req.language;
var lngs = req.languages;
req.i18n.changeLanguage("en");
var exists = req.i18n.exists("myKey");
var translation = req.t("myKey");
});
div = t("myKey");
add routes
app.post("/locales/add/:lng/:ns", middleware.missingKeyHandler(i18next));
app.get("/locales/resources.json", middleware.getResourcesHandler(i18next));
add localized routes
You can add your routes directly to the express app
var express = require("express"),
app = express(),
i18next = require("i18next"),
FilesystemBackend = require("i18next-node-fs-backend"),
i18nextMiddleware = require("i18next-express-middleware"),
port = 3000;
i18next
.use(i18nextMiddleware.LanguageDetector)
.use(FilesystemBackend)
.init({ preload: ["en", "de", "it"], ...otherOptions }, function() {
i18nextMiddleware.addRoute(
i18next,
"/:lng/key-to-translate",
["en", "de", "it"],
app,
"get",
function(req, res) {
}
);
});
app.use(i18nextMiddleware.handle(i18next));
app.listen(port, function() {
console.log("Server listening on port", port);
});
or to an express router
var express = require("express"),
app = express(),
i18next = require("i18next"),
FilesystemBackend = require("i18next-node-fs-backend"),
i18nextMiddleware = require("i18next-express-middleware"),
router = require("express").Router(),
port = 3000;
i18next
.use(i18nextMiddleware.LanguageDetector)
.use(FilesystemBackend)
.init({ preload: ["en", "de", "it"], ...otherOptions }, function() {
i18nextMiddleware.addRoute(
i18next,
"/:lng/key-to-translate",
["en", "de", "it"],
router,
"get",
function(req, res) {
}
);
app.use("/", router);
});
app.use(i18nextMiddleware.handle(i18next));
app.listen(port, function() {
console.log("Server listening on port", port);
});
language detection
Detects user language from current request. Comes with support for:
- path
- cookie
- header
- querystring
- session
Wiring up:
var i18next = require("i18next");
var middleware = require("i18next-express-middleware");
i18next.use(middleware.LanguageDetector).init(i18nextOptions);
As with all modules you can either pass the constructor function (class) to the i18next.use or a concrete instance.
Detector Options
{
order: [ 'querystring', 'cookie', 'header'],
lookupQuerystring: 'lng',
lookupCookie: 'i18next',
lookupHeader: 'accept-language',
lookupSession: 'lng',
lookupPath: 'lng',
lookupFromPathIndex: 0,
caches: false,
cookieExpirationDate: new Date(),
cookieDomain: 'myDomain',
cookieSecure: true
}
Options can be passed in:
preferred - by setting options.detection in i18next.init:
var i18next = require("i18next");
var middleware = require("i18next-express-middleware");
i18next.use(middleware.LanguageDetector).init({
detection: options
});
on construction:
var middleware = require("i18next-express-middleware");
var lngDetector = new middleware.LanguageDetector(null, options);
via calling init:
var middleware = require("i18next-express-middleware");
var lngDetector = new middleware.LanguageDetector();
lngDetector.init(options);
Adding own detection functionality
interface
module.exports = {
name: 'myDetectorsName',
lookup: function(req, res, options) {
return 'en';
},
cacheUserLanguage: function(req, res, lng, options) {
}
};
adding it
var i18next = require("i18next");
var middleware = require("i18next-express-middleware");
var lngDetector = new middleware.LanguageDetector();
lngDetector.addDetector(myDetector);
i18next.use(lngDetector).init({
detection: options
});