koa-locale
Version:
Get locale variable from query, subdomain, the last domain, accept-languages or cookie for koa.
95 lines (80 loc) • 2.06 kB
JavaScript
/*!
* locale
* Copyright(c) 2015 Fangdun Cai
* MIT Licensed
*/
;
/**
* Module dependences.
*/
var delegate = require('delegates');
/**
* Expose
*
* @param {Object} app
* @param {String} key - locale key name.
*
* @returns {Object} app
*/
module.exports = function(app, key) {
key = key || 'locale';
var request = app.request;
// From query, `locale=en`
Object.defineProperty(request, 'getLocaleFromQuery', {
value: function() {
return this.query[key];
}
});
// From query, `locale=en`
Object.defineProperty(request, 'getLocaleFromSubdomain', {
value: function() {
return this.subdomains.pop();
}
});
// From accept-language, `Accept-Language: zh-CN`
Object.defineProperty(request, 'getLocaleFromHeader', {
value: function(multi) {
var accept = this.acceptsLanguages() || '',
reg = /(^|,\s*)([a-z-]+)/gi,
locales = [],
match;
while ((match = reg.exec(accept))) {
locales.push(match[2])
if (!multi && locales.length) {
break;
}
}
return multi ? locales : locales[0];
}
});
// From cookie, `locale=zh-CN`
Object.defineProperty(request, 'getLocaleFromCookie', {
value: function() {
return this.ctx.cookies.get(key);
}
});
// From URL, `http://koajs.com/en`
Object.defineProperty(request, 'getLocaleFromUrl', {
value: function(options) {
var segments = this.path.substring(1).split('/');
return segments[options && options.offset || 0];
}
});
// From The Latest Domain, `http://koajs.com`, `http://kojs.cn`
Object.defineProperty(request, 'getLocaleFromTLD', {
value: function() {
return this.hostname.split('.').pop();
}
});
/**
* Delegate to this.ctx.
*/
delegate(app.context, 'request')
.method('getLocaleFromQuery')
.method('getLocaleFromSubdomain')
.method('getLocaleFromHeader')
.method('getLocaleFromCookie')
.method('getLocaleFromUrl')
.method('getLocaleFromTLD');
return app;
};