69 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import
 | 
						|
  supportedLanguages,
 | 
						|
  { langTagRegex }
 | 
						|
from '../../common/utils/supported-languages';
 | 
						|
import passthroughs from '../utils/lang-passthrough-urls';
 | 
						|
import debug from 'debug';
 | 
						|
 | 
						|
const log = debug('fcc:middlewares:lang');
 | 
						|
const toLowerCase = String.prototype.toLowerCase;
 | 
						|
 | 
						|
// redirect(statusOrUrl: String|Number, url?: String) => Void
 | 
						|
function langRedirect(...args) {
 | 
						|
  const url = args.length === 2 ? args[1] : args[0];
 | 
						|
  const { lang } = this.req;
 | 
						|
  const maybeLang = toLowerCase.call((url.split('/')[1] || ''));
 | 
						|
 | 
						|
  if (
 | 
						|
    passthroughs[maybeLang] ||
 | 
						|
    supportedLanguages[maybeLang]
 | 
						|
  ) {
 | 
						|
    return this._oldRedirect(...arguments);
 | 
						|
  }
 | 
						|
 | 
						|
  // if language present add to url
 | 
						|
  if (lang) {
 | 
						|
    return this._oldRedirect(`/${lang}${url}`);
 | 
						|
  }
 | 
						|
 | 
						|
  // default to english
 | 
						|
  return this._oldRedirect(`/en${url}`);
 | 
						|
}
 | 
						|
 | 
						|
// prefer url lang over user lang
 | 
						|
// if url lang is not supported move to user lang
 | 
						|
// if user lang is not supported default to english
 | 
						|
export default function addLang() {
 | 
						|
  return function(req, res, next) {
 | 
						|
    const { url, user = {} } = req;
 | 
						|
    const maybeLang = url.split('/')[1];
 | 
						|
    const restUrl = url.split('/').slice(2).join('/');
 | 
						|
    const userLang = user.languageTag;
 | 
						|
    let finalLang;
 | 
						|
    if (supportedLanguages[maybeLang]) {
 | 
						|
      finalLang = maybeLang;
 | 
						|
    } else if (supportedLanguages[userLang]) {
 | 
						|
      finalLang = userLang;
 | 
						|
    } else {
 | 
						|
      finalLang = 'en';
 | 
						|
    }
 | 
						|
    // found url lang tag that is not yet supported
 | 
						|
    // redirect to fix url with supported lang tag
 | 
						|
    if (langTagRegex.test(maybeLang) && !supportedLanguages[maybeLang]) {
 | 
						|
      log(`unsupported lang tag ${maybeLang}`);
 | 
						|
      return res.redirect(`/${finalLang}/${restUrl}`);
 | 
						|
    }
 | 
						|
    res.locals.supportedLanguages = supportedLanguages;
 | 
						|
 | 
						|
    if (supportedLanguages[finalLang]) {
 | 
						|
      req.lang = finalLang;
 | 
						|
      res.locals.lang = finalLang;
 | 
						|
    }
 | 
						|
 | 
						|
    res._oldRedirect = res.redirect;
 | 
						|
    res.redirect = langRedirect;
 | 
						|
 | 
						|
    return next();
 | 
						|
  };
 | 
						|
}
 |