Repository URL to install this package:
|
Version:
4.2.0 ▾
|
const fs = require('fs');
const path = require('path');
const acceptLanguageParser = require('accept-language-parser');
const { Router } = require('express');
const cookieParser = require('cookie-parser');
const defaultLocales = require('./locales');
const DEFAULT_LOCALE = 'en';
const COOKIE_MAX_AGE = 13824000;
/**
* Exports
*/
module.exports = (() => (
nodeModulesPath = path.resolve(__dirname, './node_modules'),
i18nPath = './i18n',
apiPrefix = '',
cookieDomain = null,
locales = defaultLocales
) => {
const normalizeLocale = locale => locale.split('_')[0];
const getLocaleFromAcceptedLanguages = req => {
const acceptedLanguages = acceptLanguageParser.parse(req.headers['accept-language']);
if (acceptedLanguages && acceptedLanguages.length && acceptedLanguages[0].code) {
return acceptedLanguages[0].code === '*' ? DEFAULT_LOCALE : acceptedLanguages[0].code;
}
return DEFAULT_LOCALE;
};
/**
* Cookie middleware
*/
const cookie = (req, res, next) => {
let locale;
const cookieOptions = {
maxAge: COOKIE_MAX_AGE,
};
if (cookieDomain) {
cookieOptions.domain = cookieDomain;
}
if (req.cookies && req.cookies.locale) {
locale = normalizeLocale(req.cookies.locale);
if (typeof locales[locale] === 'undefined') {
locale = DEFAULT_LOCALE;
}
res.cookie('locale', locale, cookieOptions);
} else {
if (req.headers && req.headers['accept-language']) {
locale = getLocaleFromAcceptedLanguages(req);
if (locale) {
locale = normalizeLocale(locale);
}
}
if (!locale || typeof locales[locale] === 'undefined') {
locale = DEFAULT_LOCALE;
}
res.cookie('locale', locale, cookieOptions);
}
req.locale = locale;
next();
};
/**
* API middleware
*/
const api = Router();
api.get(`${apiPrefix}/i18n/localeData/:locale`, (req, res) => {
// Follows IETF language tag convention:
// https://en.wikipedia.org/wiki/IETF_language_tag
const locale = req.params.locale.split('-')[0];
res.sendFile(`${nodeModulesPath}/react-intl/locale-data/${locale}.js`);
});
api.get(`${apiPrefix}/i18n/messages/:locale`, (req, res) => {
const { locale } = req.params;
fs.readFile(`${i18nPath}/${locale}.json`, 'utf-8', (err, data) => {
if (!err) {
res[req.query.callback ? 'jsonp' : 'json'](JSON.parse(data));
} else {
res.status(404).send('Not found');
}
});
});
return [cookieParser(), cookie, api];
})();