diff --git a/src/i18n/index.js b/src/i18n/index.js index 1f2721f92..b9b687b9d 100644 --- a/src/i18n/index.js +++ b/src/i18n/index.js @@ -28,7 +28,7 @@ * * @module I18n */ -import { keys } from 'underscore'; +import { keys, isUndefined } from 'underscore'; import messages from './messages'; export default () => { @@ -183,10 +183,24 @@ export default () => { const { em } = this; const param = params || {}; const locale = opts.l || this.getLocale(); - const msgSet = this.getMessages(locale, opts) || {}; + const msgSet = this.getMessages(locale, opts); + + // Lang set is missing + if (!msgSet) return; + const reg = new RegExp(`\{([\\w\\d-]*)\}`, 'g'); let result = msgSet[key]; - !result && this._warn(`'${key}' i18n key not found`, opts); + + // Check for nested getter + if (!result && key.indexOf('.') > 0) { + result = key.split('.').reduce((lang, key) => { + if (isUndefined(lang)) return; + return lang[key]; + }, msgSet); + } + + !result && + this._warn(`'${key}' i18n key not found in '${locale}' lang`, opts); result = result ? result.replace(reg, (m, val) => param[val] || '').trim() : result; diff --git a/test/specs/i18n/index.js b/test/specs/i18n/index.js index bf1079fa8..e9f79aade 100644 --- a/test/specs/i18n/index.js +++ b/test/specs/i18n/index.js @@ -70,6 +70,7 @@ describe('I18n', () => { }); test('Translate method with object structure', () => { + const opts = { noWarn: 1 }; const msg1 = 'Msg level 1'; const msg2 = 'Msg level 2'; obj.setLocale('en'); @@ -85,6 +86,8 @@ describe('I18n', () => { }); expect(obj.t('key1.msg1')).toBe(msg1); expect(obj.t('key1.key2.msg2')).toBe(msg2); + expect(obj.t('key1.key2.msg3', 0, opts)).toBe(undefined); + expect(obj.t('key1.key3.msg2', 0, opts)).toBe(undefined); }); test('Translate method with custom locale', () => {