diff --git a/README.md b/README.md index f830cc3..c78ef4d 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,7 @@ Patch locales functions to koa app. - {String} defaultLocale: default locale. Optional, default is `en-US`. - {String} queryField: locale field name on query. Optional, default is `locale`. - {String} cookieField: locale field name on cookie. Optional, default is `locale`. + - {Object} localeAlias: locale cookie value map. Optional, default is {}. - {String|Number} cookieMaxAge: set locale cookie value max age. Optional, default is `1y`, expired after one year. ```js diff --git a/index.js b/index.js index f6dcfb5..892c0b6 100644 --- a/index.js +++ b/index.js @@ -24,6 +24,7 @@ const DEFAULT_OPTIONS = { defaultLocale: 'en-US', queryField: 'locale', cookieField: 'locale', + localeAlias: {}, cookieMaxAge: '1y', dir: undefined, dirs: [path.join(process.cwd(), 'locales')], @@ -35,6 +36,7 @@ module.exports = function (app, options) { const defaultLocale = formatLocale(options.defaultLocale); const queryField = options.queryField; const cookieField = options.cookieField; + const localeAlias = options.localeAlias; const cookieMaxAge = ms(options.cookieMaxAge); const localeDir = options.dir; const localeDirs = options.dirs; @@ -172,6 +174,9 @@ module.exports = function (app, options) { } } + // cookie alias + if (locale in localeAlias) locale = localeAlias[locale]; + locale = formatLocale(locale); // validate locale diff --git a/test/index.test.js b/test/index.test.js index cb664d4..310e668 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -66,6 +66,13 @@ describe('koa-locales.test.js', function () { const app = createApp({ dirs: [__dirname + '/locales', __dirname + '/other-locales'], }); + const cookieFieldMapApp = createApp({ + dirs: [__dirname + '/locales', __dirname + '/other-locales'], + localeAlias: { + 'en': 'en-US', + 'de-de': 'de', + }, + }); it('should use default locale: en-US', function (done) { request(app.callback()) @@ -193,6 +200,31 @@ describe('koa-locales.test.js', function () { .expect('Set-Cookie', /^locale=en\-us; path=\/; expires=\w+/) .expect(200, done); }); + + it('should use localeAlias', function (done) { + request(cookieFieldMapApp.callback()) + .get('/?locale=de-de') + .expect({ + email: 'Emailde', + hello: 'Hallo fengmk2, wie geht es dir heute?', + message: 'Hallo fengmk2, wie geht es dir heute? Wie war dein 18.', + empty: '', + notexists_key: 'key not exists', + empty_string: '', + empty_value: 'emptyValue', + novalue: 'key %s ok', + arguments3: '1 2 3', + arguments4: '1 2 3 4', + arguments5: '1 2 3 4 5', + arguments6: '1 2 3 4 5. 6', + values: 'foo bar foo bar {2} {100}', + object: 'foo bar foo bar {z}', + 'gender': 'model.user.fields.gender', + 'name': 'model.user.fields.name', + }) + .expect('Set-Cookie', /^locale=de; path=\/; expires=\w+/) + .expect(200, done); + }); }); describe('cookie.locale', function () {