feat: Multiple locale paths support.

master
Jason Lee 2015-09-14 17:29:46 +08:00
parent 135d55773a
commit 5ffefcc982
6 changed files with 40 additions and 19 deletions

View File

@ -1,4 +1,3 @@
1.2.0 / 2015-08-31 1.2.0 / 2015-08-31
================== ==================

View File

@ -39,7 +39,7 @@ var locales = require('koa-locales');
var app = koa(); var app = koa();
app.use(locales({ app.use(locales({
dir: __dirname + '/locales' dirs: [__dirname + '/locales', __dirname + '/foo/locales']
})); }));
``` ```
@ -61,7 +61,7 @@ Patch locales functions to koa app.
```js ```js
locales({ locales({
app: app, app: app,
dir: __dirname + '/app/locales', dirs: [__dirname + '/app/locales'],
defaultLocale: 'zh-CN' defaultLocale: 'zh-CN'
})); }));
``` ```

View File

@ -20,6 +20,7 @@ var util = require('util');
var fs = require('fs'); var fs = require('fs');
var path = require('path'); var path = require('path');
var ms = require('humanize-ms'); var ms = require('humanize-ms');
var merge = require('merge-descriptors');
module.exports = function (app, options) { module.exports = function (app, options) {
options = options || {}; options = options || {};
@ -27,26 +28,43 @@ module.exports = function (app, options) {
var queryField = options.queryField || 'locale'; var queryField = options.queryField || 'locale';
var cookieField = options.cookieField || 'locale'; var cookieField = options.cookieField || 'locale';
var cookieMaxAge = ms(options.cookieMaxAge || '1y'); var cookieMaxAge = ms(options.cookieMaxAge || '1y');
var localeDir = options.dir || path.join(process.cwd(), 'locales'); var localeDir = options.dir;
var localeDirs = options.dirs || [path.join(process.cwd(), 'locales')];
var functionName = options.functionName || '__'; var functionName = options.functionName || '__';
var resources = {}; var resources = {};
if (fs.existsSync(localeDir)) { if (localeDir && localeDirs.indexOf(localeDir) === -1) {
var names = fs.readdirSync(localeDir); localeDirs.push(localeDir);
for (var i = 0; i < names.length; i++) { }
var name = names[i];
var filepath = path.join(localeDir, name); for (var i = 0; i < localeDirs.length; i ++) {
var dir = localeDirs[i];
if (!fs.existsSync(dir)) {
continue;
}
var names = fs.readdirSync(dir);
for (var j = 0; j < names.length; j++) {
var name = names[j];
var filepath = path.join(dir, name);
// support en_US.js => en-US.js // support en_US.js => en-US.js
var locale = formatLocale(name.split('.')[0]); var locale = formatLocale(name.split('.')[0]);
var resource = {};
if (name.endsWith('.js') || name.endsWith('.json')) { if (name.endsWith('.js') || name.endsWith('.json')) {
resources[locale] = require(filepath); resource = require(filepath);
} else if (name.endsWith('.properties')) { } else if (name.endsWith('.properties')) {
resources[locale] = ini.parse(fs.readFileSync(filepath, 'utf8')); resource = ini.parse(fs.readFileSync(filepath, 'utf8'));
} }
resources[locale] = resources[locale] || {};
merge(resources[locale], resource);
} }
} }
debug('init locales with %j, got %j resources', options, Object.keys(resources)); debug('init locales with %j, got %j resources', options, Object.keys(resources));
var ARRAY_INDEX_RE = /\{(\d+)\}/g; var ARRAY_INDEX_RE = /\{(\d+)\}/g;

View File

@ -30,7 +30,8 @@
"mm": "~1.1.0", "mm": "~1.1.0",
"mocha": "*", "mocha": "*",
"pedding": "~1.0.0", "pedding": "~1.0.0",
"supertest": "~1.0.1" "supertest": "~1.0.1",
"merge-descriptors": "~1.0.0"
}, },
"homepage": "https://github.com/koajs/locales", "homepage": "https://github.com/koajs/locales",
"repository": { "repository": {

View File

@ -53,7 +53,7 @@ describe('koa-locales.test.js', function () {
describe('custom options', function () { describe('custom options', function () {
var app = createApp({ var app = createApp({
dir: __dirname + '/locales' dirs: [__dirname + '/locales', __dirname + '/other-locales']
}); });
it('should use default locale: en-US', function (done) { it('should use default locale: en-US', function (done) {
@ -83,7 +83,7 @@ describe('koa-locales.test.js', function () {
request(app.callback()) request(app.callback())
.get('/?locale=zh-CN') .get('/?locale=zh-CN')
.expect({ .expect({
email: '邮箱', email: '邮箱1',
hello: 'fengmk2今天过得如何', hello: 'fengmk2今天过得如何',
message: 'Hello fengmk2, how are you today? How was your 18.', message: 'Hello fengmk2, how are you today? How was your 18.',
empty: '', empty: '',
@ -128,7 +128,7 @@ describe('koa-locales.test.js', function () {
.get('/?locale=zh-CN') .get('/?locale=zh-CN')
.set('cookie', 'locale=zh-TW') .set('cookie', 'locale=zh-TW')
.expect({ .expect({
email: '邮箱', email: '邮箱1',
hello: 'fengmk2今天过得如何', hello: 'fengmk2今天过得如何',
message: 'Hello fengmk2, how are you today? How was your 18.', message: 'Hello fengmk2, how are you today? How was your 18.',
empty: '', empty: '',
@ -175,7 +175,7 @@ describe('koa-locales.test.js', function () {
.get('/?locale=') .get('/?locale=')
.set('cookie', 'locale=zh-cn') .set('cookie', 'locale=zh-cn')
.expect({ .expect({
email: '邮箱', email: '邮箱1',
hello: 'fengmk2今天过得如何', hello: 'fengmk2今天过得如何',
message: 'Hello fengmk2, how are you today? How was your 18.', message: 'Hello fengmk2, how are you today? How was your 18.',
empty: '', empty: '',
@ -204,7 +204,7 @@ describe('koa-locales.test.js', function () {
.get('/?locale=') .get('/?locale=')
.set('Accept-Language', 'zh-CN') .set('Accept-Language', 'zh-CN')
.expect({ .expect({
email: '邮箱', email: '邮箱1',
hello: 'fengmk2今天过得如何', hello: 'fengmk2今天过得如何',
message: 'Hello fengmk2, how are you today? How was your 18.', message: 'Hello fengmk2, how are you today? How was your 18.',
empty: '', empty: '',
@ -225,7 +225,7 @@ describe('koa-locales.test.js', function () {
.get('/?locale=') .get('/?locale=')
.set('Accept-Language', 'zh-CN,zh;q=0.8') .set('Accept-Language', 'zh-CN,zh;q=0.8')
.expect({ .expect({
email: '邮箱', email: '邮箱1',
hello: 'fengmk2今天过得如何', hello: 'fengmk2今天过得如何',
message: 'Hello fengmk2, how are you today? How was your 18.', message: 'Hello fengmk2, how are you today? How was your 18.',
empty: '', empty: '',
@ -246,7 +246,7 @@ describe('koa-locales.test.js', function () {
.get('/?locale=') .get('/?locale=')
.set('Accept-Language', 'en;q=0.8, es, zh_CN') .set('Accept-Language', 'en;q=0.8, es, zh_CN')
.expect({ .expect({
email: '邮箱', email: '邮箱1',
hello: 'fengmk2今天过得如何', hello: 'fengmk2今天过得如何',
message: 'Hello fengmk2, how are you today? How was your 18.', message: 'Hello fengmk2, how are you today? How was your 18.',
empty: '', empty: '',

View File

@ -0,0 +1,3 @@
module.exports = {
Email: '邮箱1'
}