Browse Source

Allow objects in locales

pull/2385/head
Artur Arseniev 6 years ago
parent
commit
d1d0f36d40
  1. 20
      src/i18n/index.js
  2. 3
      test/specs/i18n/index.js

20
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;

3
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', () => {

Loading…
Cancel
Save