# i18next-express-middleware

> express middleware for i18next

Latest version **2.0.0** (published 2020-04-19) · MIT license · 0 weekly downloads

> **Deprecated.** This package is deprecated.

## Install

```sh
npm install i18next-express-middleware
pnpm add i18next-express-middleware
yarn add i18next-express-middleware
bun add i18next-express-middleware
```

## Health

**Score 10/100 (F)** — status: deprecated.

Negative: deprecated.

## Facts

| | |
|---|---|
| Version | 2.0.0 |
| Published | 2020-04-19 |
| First published | 2015-11-03 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | CommonJS |
| Dependencies | 1 |
| Unpacked size | 32.4 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 203 |
| Author | Jan Mühlemann |
| Maintainers | jamuhl |
| Keywords | i18next, i18next-express, express, middleware |

## Links

- npm: https://www.npmjs.com/package/i18next-express-middleware
- Repository: https://github.com/i18next/i18next-express-middleware
- Issues: https://github.com/i18next/i18next-express-middleware/issues
- npm.io page: https://npm.io/package/i18next-express-middleware

## Dependencies (1)

- [cookies](https://npm.io/package/cookies.md) 0.7.1

## Alternatives

- [@sindresorhus/slugify](https://npm.io/package/@sindresorhus/slugify.md) — 3.7M weekly downloads
- [solid-js](https://npm.io/package/solid-js.md) — 2.7M weekly downloads
- [expo-glass-effect](https://npm.io/package/expo-glass-effect.md) — 2.5M weekly downloads
- [nanoassert](https://npm.io/package/nanoassert.md) — 780.8K weekly downloads
- [@ffmpeg/ffmpeg](https://npm.io/package/@ffmpeg/ffmpeg.md) — 529.5K weekly downloads

## Recent versions

- 2.0.0 (latest) — 2020-04-19
- 1.9.1 — 2019-12-03
- 1.9.0 — 2019-12-03
- 1.8.2 — 2019-09-02
- 1.8.1 — 2019-08-22
- 1.8.0 — 2019-04-18
- 1.7.3 — 2019-03-19
- 1.7.2 — 2019-03-18
- 1.7.1 — 2019-01-07
- 1.7.0 — 2018-12-31
- 1.6.0 — 2018-12-29
- 1.5.0 — 2018-11-07
- 1.4.1 — 2018-10-12
- 1.4.0 — 2018-09-18
- 1.3.2 — 2018-08-22
- … 43 more at https://npm.io/package/i18next-express-middleware/versions

## README

# Introduction

This is a middleware to use i18next in express.js.

# Getting started

Source can be loaded via [npm](https://www.npmjs.com/package/i18next-express-middleware).

```
# npm package
$ npm install i18next-express-middleware
```

## wire up i18next to request object

```js
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"], // or function(req, res, options, i18next) { /* return true to ignore */ }
    removeLngFromUrl: false
  })
);

// in your request handler
app.get("myRoute", function(req, res) {
  var lng = req.language; // 'de-CH'
  var lngs = req.languages; // ['de-CH', 'de', 'en']
  req.i18n.changeLanguage("en"); // will not load that!!! assert it was preloaded

  var exists = req.i18n.exists("myKey");
  var translation = req.t("myKey");
});

// in your views, eg. in pug (ex. jade)
div = t("myKey");
```

## add routes

```js
// missing keys; make sure the body is parsed (i.e. with [body-parser](https://github.com/expressjs/body-parser#bodyparserjsonoptions))
app.post("/locales/add/:lng/:ns", middleware.missingKeyHandler(i18next));

// multiload backend route
app.get("/locales/resources.json", middleware.getResourcesHandler(i18next));
```

## add localized routes

You can add your routes directly to the express app

```js
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) {
        //endpoint function
      }
    );
  });
app.use(i18nextMiddleware.handle(i18next));
app.listen(port, function() {
  console.log("Server listening on port", port);
});
```

or to an express router

```js
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) {
        //endpoint function
      }
    );
    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:

```js
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

```js
{
  // order and from where user language should be detected
  order: [/*'path', 'session', */ 'querystring', 'cookie', 'header'],

  // keys or params to lookup language from
  lookupQuerystring: 'lng',
  lookupCookie: 'i18next',
  lookupHeader: 'accept-language',
  lookupSession: 'lng',
  lookupPath: 'lng',
  lookupFromPathIndex: 0,

  // cache user language
  caches: false, // ['cookie']

  // optional expire and domain for set cookie
  cookieExpirationDate: new Date(),
  cookieDomain: 'myDomain',
  cookieSecure: true // if need secure cookie
}
```

Options can be passed in:

**preferred** - by setting options.detection in i18next.init:

```js
var i18next = require("i18next");
var middleware = require("i18next-express-middleware");

i18next.use(middleware.LanguageDetector).init({
  detection: options
});
```

on construction:

```js
var middleware = require("i18next-express-middleware");
var lngDetector = new middleware.LanguageDetector(null, options);
```

via calling init:

```js
var middleware = require("i18next-express-middleware");

var lngDetector = new middleware.LanguageDetector();
lngDetector.init(options);
```

## Adding own detection functionality

### interface

```js
module.exports = {
  name: 'myDetectorsName',

  lookup: function(req, res, options) {
    // options -> are passed in options
    return 'en';
  },

  cacheUserLanguage: function(req, res, lng, options) {
    // options -> are passed in options
    // lng -> current language, will be called after init and on changeLanguage

    // store it
  }
};
```

### adding it

```js
var i18next = require("i18next");
var middleware = require("i18next-express-middleware");

var lngDetector = new middleware.LanguageDetector();
lngDetector.addDetector(myDetector);

i18next.use(lngDetector).init({
  detection: options
});
```

---

<h3 align="center">Gold Sponsors</h3>

<p align="center">
  <a href="https://locize.com/" target="_blank">
    <img src="https://raw.githubusercontent.com/i18next/i18next/master/assets/locize_sponsor_240.gif" width="240px">
  </a>
</p>

---
_Source: https://npm.io/package/i18next-express-middleware · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
