Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
@doodle/i18n / dist / src / express.js
Size: Mime:
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];
})();