mirror of https://github.com/pelias/api.git
missinglink
8 years ago
committed by
Peter Johnson
3 changed files with 84 additions and 1 deletions
@ -0,0 +1,74 @@
|
||||
|
||||
/** |
||||
this middleware is responsible for negotiating HTTP locales for incoming |
||||
browser requests by reading 'Accept-Language' request headers. |
||||
|
||||
the preferred language will then be available on the $req object: |
||||
eg. for 'Accept-Language: fr': |
||||
``` |
||||
console.log( req.language ); |
||||
|
||||
{ |
||||
name: 'French', |
||||
type: 'living', |
||||
scope: 'individual', |
||||
iso6393: 'fra', |
||||
iso6392B: 'fre', |
||||
iso6392T: 'fra', |
||||
iso6391: 'fr', |
||||
defaulted: false |
||||
} |
||||
``` |
||||
|
||||
for configuration options see: |
||||
https://github.com/florrain/locale
|
||||
**/ |
||||
|
||||
const locale = require('locale'); |
||||
|
||||
/** |
||||
BCP47 language tags can contain three parts: |
||||
1. A language subtag (en, zh). |
||||
2. A script subtag (Hant, Latn). |
||||
3. A region subtag (US, CN). |
||||
|
||||
at time of writing we will only be concerned with 1. (the language subtag) with |
||||
the intention of being compatible with the language standard of whosonfirst data. |
||||
|
||||
whosonfirst data is in ISO 639-3 format so we will need to configure the library |
||||
to support all ISO 639-1 (2 char) codes and convert them to 639-1 (3-char) codes. |
||||
|
||||
see: https://github.com/whosonfirst/whosonfirst-names
|
||||
**/ |
||||
const iso6393 = require('iso-639-3'); |
||||
|
||||
// create a dictionary which maps the ISO 639-1 language subtags to a map
|
||||
// of it's represenation in several different standards.
|
||||
const language = {}; |
||||
iso6393.filter( i => !!i.iso6391 ).forEach( i => language[ i.iso6391 ] = i ); |
||||
|
||||
// a pre-processed locale list of language subtags we support (all of them).
|
||||
const allLocales = new locale.Locales( Object.keys( language ) ); |
||||
|
||||
// return the middleware
|
||||
module.exports = function middleware( req, res, next ){ |
||||
|
||||
// parse request & choose best locale
|
||||
var locales = new locale.Locales( req.headers['accept-language'] || '' ); |
||||
var best = locales.best( allLocales ); |
||||
|
||||
// set $req.language property
|
||||
req.language = language[ best.language ] || language.en; |
||||
req.language.defaulted = best.defaulted; |
||||
|
||||
// set $req.clean property in order to print language info in response header
|
||||
req.clean = req.clean || {}; |
||||
req.clean.lang = { |
||||
name: req.language.name, |
||||
iso6391: req.language.iso6391, |
||||
iso6393: req.language.iso6393, |
||||
defaulted: req.language.defaulted |
||||
}; |
||||
|
||||
next(); |
||||
}; |
Loading…
Reference in new issue