| 
									
										
										
										
											2016-06-20 21:01:14 -07:00
										 |  |  | import | 
					
						
							|  |  |  |   supportedLanguages, | 
					
						
							|  |  |  |   { langTagRegex } | 
					
						
							|  |  |  | from '../../common/utils/supported-languages'; | 
					
						
							| 
									
										
										
										
											2016-06-17 12:35:10 -07:00
										 |  |  | 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; | 
					
						
							| 
									
										
										
										
											2016-09-09 00:39:03 -07:00
										 |  |  |   const maybeLang = toLowerCase.call((url.split('/')[1] || '')); | 
					
						
							| 
									
										
										
										
											2016-06-17 12:35:10 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   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(); | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | } |