diff --git a/History.md b/History.md index 94f19a3..fd8bc69 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,3 @@ - 1.2.0 / 2015-08-31 ================== diff --git a/README.md b/README.md index 5099936..7cfe105 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ var locales = require('koa-locales'); var app = koa(); app.use(locales({ - dir: __dirname + '/locales' + dirs: [__dirname + '/locales', __dirname + '/foo/locales'] })); ``` @@ -61,7 +61,7 @@ Patch locales functions to koa app. ```js locales({ app: app, - dir: __dirname + '/app/locales', + dirs: [__dirname + '/app/locales'], defaultLocale: 'zh-CN' })); ``` diff --git a/index.js b/index.js index d17f039..d1fde27 100644 --- a/index.js +++ b/index.js @@ -20,6 +20,7 @@ var util = require('util'); var fs = require('fs'); var path = require('path'); var ms = require('humanize-ms'); +var merge = require('merge-descriptors'); module.exports = function (app, options) { options = options || {}; @@ -27,26 +28,43 @@ module.exports = function (app, options) { var queryField = options.queryField || 'locale'; var cookieField = options.cookieField || 'locale'; 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 resources = {}; - if (fs.existsSync(localeDir)) { - var names = fs.readdirSync(localeDir); - for (var i = 0; i < names.length; i++) { - var name = names[i]; - var filepath = path.join(localeDir, name); + if (localeDir && localeDirs.indexOf(localeDir) === -1) { + localeDirs.push(localeDir); + } + + 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 var locale = formatLocale(name.split('.')[0]); + var resource = {}; if (name.endsWith('.js') || name.endsWith('.json')) { - resources[locale] = require(filepath); + resource = require(filepath); } 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)); var ARRAY_INDEX_RE = /\{(\d+)\}/g; diff --git a/package.json b/package.json index 7059a81..bfc9288 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,8 @@ "mm": "~1.1.0", "mocha": "*", "pedding": "~1.0.0", - "supertest": "~1.0.1" + "supertest": "~1.0.1", + "merge-descriptors": "~1.0.0" }, "homepage": "https://github.com/koajs/locales", "repository": { diff --git a/test/index.test.js b/test/index.test.js index 707368f..86fa387 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -53,7 +53,7 @@ describe('koa-locales.test.js', function () { describe('custom options', function () { var app = createApp({ - dir: __dirname + '/locales' + dirs: [__dirname + '/locales', __dirname + '/other-locales'] }); it('should use default locale: en-US', function (done) { @@ -83,7 +83,7 @@ describe('koa-locales.test.js', function () { request(app.callback()) .get('/?locale=zh-CN') .expect({ - email: '邮箱', + email: '邮箱1', hello: 'fengmk2,今天过得如何?', message: 'Hello fengmk2, how are you today? How was your 18.', empty: '', @@ -128,7 +128,7 @@ describe('koa-locales.test.js', function () { .get('/?locale=zh-CN') .set('cookie', 'locale=zh-TW') .expect({ - email: '邮箱', + email: '邮箱1', hello: 'fengmk2,今天过得如何?', message: 'Hello fengmk2, how are you today? How was your 18.', empty: '', @@ -175,7 +175,7 @@ describe('koa-locales.test.js', function () { .get('/?locale=') .set('cookie', 'locale=zh-cn') .expect({ - email: '邮箱', + email: '邮箱1', hello: 'fengmk2,今天过得如何?', message: 'Hello fengmk2, how are you today? How was your 18.', empty: '', @@ -204,7 +204,7 @@ describe('koa-locales.test.js', function () { .get('/?locale=') .set('Accept-Language', 'zh-CN') .expect({ - email: '邮箱', + email: '邮箱1', hello: 'fengmk2,今天过得如何?', message: 'Hello fengmk2, how are you today? How was your 18.', empty: '', @@ -225,7 +225,7 @@ describe('koa-locales.test.js', function () { .get('/?locale=') .set('Accept-Language', 'zh-CN,zh;q=0.8') .expect({ - email: '邮箱', + email: '邮箱1', hello: 'fengmk2,今天过得如何?', message: 'Hello fengmk2, how are you today? How was your 18.', empty: '', @@ -246,7 +246,7 @@ describe('koa-locales.test.js', function () { .get('/?locale=') .set('Accept-Language', 'en;q=0.8, es, zh_CN') .expect({ - email: '邮箱', + email: '邮箱1', hello: 'fengmk2,今天过得如何?', message: 'Hello fengmk2, how are you today? How was your 18.', empty: '', diff --git a/test/other-locales/zh-CN.js b/test/other-locales/zh-CN.js new file mode 100644 index 0000000..61ca2c0 --- /dev/null +++ b/test/other-locales/zh-CN.js @@ -0,0 +1,3 @@ +module.exports = { + Email: '邮箱1' +}