@wordpress/i18n
Advanced tools
Comparing version 3.0.1 to 3.1.0
@@ -0,8 +1,22 @@ | ||
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread"; | ||
/** | ||
* External dependencies | ||
*/ | ||
import Jed from 'jed'; | ||
import Tannin from 'tannin'; | ||
import memoize from 'memize'; | ||
var i18n; | ||
import sprintfjs from 'sprintf-js'; | ||
/** | ||
* Default locale data to use for Tannin domain when not otherwise provided. | ||
* Assumes an English plural forms expression. | ||
* | ||
* @type {Object} | ||
*/ | ||
var DEFAULT_LOCALE_DATA = { | ||
'': { | ||
plural_forms: 'plural=(n!=1)' | ||
} | ||
}; | ||
/** | ||
* Log to console, once per message; or more precisely, per referentially equal | ||
@@ -18,47 +32,28 @@ * argument set. Because Jed throws errors, we log these to the console instead | ||
/** | ||
* Merges locale data into the Jed instance by domain. Creates a new Jed | ||
* instance if one has not yet been assigned. | ||
* The underlying instance of Tannin to which exported functions interface. | ||
* | ||
* @see http://messageformat.github.io/Jed/ | ||
* | ||
* @param {?Object} localeData Locale data configuration. | ||
* @param {?string} domain Domain for which configuration applies. | ||
* @type {Tannin} | ||
*/ | ||
export function setLocaleData() { | ||
var localeData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { | ||
'': {} | ||
}; | ||
var domain = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'default'; | ||
if (!i18n) { | ||
i18n = new Jed({ | ||
domain: 'default', | ||
locale_data: { | ||
default: { | ||
'': {} | ||
} | ||
} | ||
}); | ||
} | ||
i18n.options.locale_data[domain] = Object.assign({}, i18n.options.locale_data[domain], localeData); | ||
} | ||
var i18n = new Tannin({}); | ||
/** | ||
* Returns the current Jed instance, initializing with a default configuration | ||
* if not already assigned. | ||
* Merges locale data into the Tannin instance by domain. Accepts data in a | ||
* Jed-formatted JSON object shape. | ||
* | ||
* @return {Jed} Jed instance. | ||
* @see http://messageformat.github.io/Jed/ | ||
* | ||
* @param {?Object} data Locale data configuration. | ||
* @param {?string} domain Domain for which configuration applies. | ||
*/ | ||
function getI18n() { | ||
if (!i18n) { | ||
setLocaleData(); | ||
} | ||
export function setLocaleData(data) { | ||
var domain = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'default'; | ||
i18n.data[domain] = _objectSpread({}, DEFAULT_LOCALE_DATA, i18n.data[domain], data); // Populate default domain configuration (supported locale date which omits | ||
// a plural forms expression). | ||
return i18n; | ||
i18n.data[domain][''] = _objectSpread({}, DEFAULT_LOCALE_DATA[''], i18n.data[domain]['']); | ||
} | ||
/** | ||
* Wrapper for Jed's `dcnpgettext`, its most qualified function. Absorbs errors | ||
* which are thrown as the result of invalid translation. | ||
* Wrapper for Tannin's `dcnpgettext`. Populates default locale data if not | ||
* otherwise previously assigned. | ||
* | ||
@@ -76,4 +71,3 @@ * @param {?string} domain Domain to retrieve the translated text. | ||
var dcnpgettext = memoize(function () { | ||
function dcnpgettext() { | ||
var domain = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'default'; | ||
@@ -85,9 +79,8 @@ var context = arguments.length > 1 ? arguments[1] : undefined; | ||
try { | ||
return getI18n().dcnpgettext(domain, context, single, plural, number); | ||
} catch (error) { | ||
logErrorOnce('Jed localization error: \n\n' + error.toString()); | ||
return single; | ||
if (!i18n.data[domain]) { | ||
setLocaleData(undefined, domain); | ||
} | ||
}); | ||
return i18n.dcnpgettext(domain, context, single, plural, number); | ||
} | ||
/** | ||
@@ -104,2 +97,3 @@ * Retrieve the translation of text. | ||
export function __(text, domain) { | ||
@@ -178,5 +172,5 @@ return dcnpgettext(domain, undefined, text); | ||
return Jed.sprintf.apply(Jed, [format].concat(args)); | ||
return sprintfjs.sprintf.apply(sprintfjs, [format].concat(args)); | ||
} catch (error) { | ||
logErrorOnce('Jed sprintf error: \n\n' + error.toString()); | ||
logErrorOnce('sprintf error: \n\n' + error.toString()); | ||
return format; | ||
@@ -183,0 +177,0 @@ } |
@@ -15,11 +15,26 @@ "use strict"; | ||
var _jed = _interopRequireDefault(require("jed")); | ||
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread")); | ||
var _tannin = _interopRequireDefault(require("tannin")); | ||
var _memize = _interopRequireDefault(require("memize")); | ||
var _sprintfJs = _interopRequireDefault(require("sprintf-js")); | ||
/** | ||
* External dependencies | ||
*/ | ||
var i18n; | ||
/** | ||
* Default locale data to use for Tannin domain when not otherwise provided. | ||
* Assumes an English plural forms expression. | ||
* | ||
* @type {Object} | ||
*/ | ||
var DEFAULT_LOCALE_DATA = { | ||
'': { | ||
plural_forms: 'plural=(n!=1)' | ||
} | ||
}; | ||
/** | ||
* Log to console, once per message; or more precisely, per referentially equal | ||
@@ -35,48 +50,28 @@ * argument set. Because Jed throws errors, we log these to the console instead | ||
/** | ||
* Merges locale data into the Jed instance by domain. Creates a new Jed | ||
* instance if one has not yet been assigned. | ||
* The underlying instance of Tannin to which exported functions interface. | ||
* | ||
* @see http://messageformat.github.io/Jed/ | ||
* | ||
* @param {?Object} localeData Locale data configuration. | ||
* @param {?string} domain Domain for which configuration applies. | ||
* @type {Tannin} | ||
*/ | ||
function setLocaleData() { | ||
var localeData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { | ||
'': {} | ||
}; | ||
var domain = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'default'; | ||
if (!i18n) { | ||
i18n = new _jed.default({ | ||
domain: 'default', | ||
locale_data: { | ||
default: { | ||
'': {} | ||
} | ||
} | ||
}); | ||
} | ||
i18n.options.locale_data[domain] = Object.assign({}, i18n.options.locale_data[domain], localeData); | ||
} | ||
var i18n = new _tannin.default({}); | ||
/** | ||
* Returns the current Jed instance, initializing with a default configuration | ||
* if not already assigned. | ||
* Merges locale data into the Tannin instance by domain. Accepts data in a | ||
* Jed-formatted JSON object shape. | ||
* | ||
* @return {Jed} Jed instance. | ||
* @see http://messageformat.github.io/Jed/ | ||
* | ||
* @param {?Object} data Locale data configuration. | ||
* @param {?string} domain Domain for which configuration applies. | ||
*/ | ||
function setLocaleData(data) { | ||
var domain = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'default'; | ||
i18n.data[domain] = (0, _objectSpread2.default)({}, DEFAULT_LOCALE_DATA, i18n.data[domain], data); // Populate default domain configuration (supported locale date which omits | ||
// a plural forms expression). | ||
function getI18n() { | ||
if (!i18n) { | ||
setLocaleData(); | ||
} | ||
return i18n; | ||
i18n.data[domain][''] = (0, _objectSpread2.default)({}, DEFAULT_LOCALE_DATA[''], i18n.data[domain]['']); | ||
} | ||
/** | ||
* Wrapper for Jed's `dcnpgettext`, its most qualified function. Absorbs errors | ||
* which are thrown as the result of invalid translation. | ||
* Wrapper for Tannin's `dcnpgettext`. Populates default locale data if not | ||
* otherwise previously assigned. | ||
* | ||
@@ -95,3 +90,3 @@ * @param {?string} domain Domain to retrieve the translated text. | ||
var dcnpgettext = (0, _memize.default)(function () { | ||
function dcnpgettext() { | ||
var domain = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'default'; | ||
@@ -103,9 +98,8 @@ var context = arguments.length > 1 ? arguments[1] : undefined; | ||
try { | ||
return getI18n().dcnpgettext(domain, context, single, plural, number); | ||
} catch (error) { | ||
logErrorOnce('Jed localization error: \n\n' + error.toString()); | ||
return single; | ||
if (!i18n.data[domain]) { | ||
setLocaleData(undefined, domain); | ||
} | ||
}); | ||
return i18n.dcnpgettext(domain, context, single, plural, number); | ||
} | ||
/** | ||
@@ -122,2 +116,3 @@ * Retrieve the translation of text. | ||
function __(text, domain) { | ||
@@ -200,5 +195,5 @@ return dcnpgettext(domain, undefined, text); | ||
return _jed.default.sprintf.apply(_jed.default, [format].concat(args)); | ||
return _sprintfJs.default.sprintf.apply(_sprintfJs.default, [format].concat(args)); | ||
} catch (error) { | ||
logErrorOnce('Jed sprintf error: \n\n' + error.toString()); | ||
logErrorOnce('sprintf error: \n\n' + error.toString()); | ||
return format; | ||
@@ -205,0 +200,0 @@ } |
@@ -0,1 +1,7 @@ | ||
## 3.1.0 (Unreleased) | ||
### Enhancements | ||
- The module has been internally refactored to use [Tannin](https://github.com/aduth/tannin) in place of [Jed](https://github.com/messageformat/Jed/). This has no impact on the public interface of the module, but should come with considerable benefit to performance, memory usage, and bundle size. | ||
## 3.0.0 (2018-09-30) | ||
@@ -2,0 +8,0 @@ |
{ | ||
"name": "@wordpress/i18n", | ||
"version": "3.0.1", | ||
"version": "3.1.0", | ||
"description": "WordPress internationalization (i18n) library.", | ||
@@ -28,5 +28,6 @@ "author": "The WordPress Contributors", | ||
"gettext-parser": "^1.3.1", | ||
"jed": "^1.1.1", | ||
"lodash": "^4.17.10", | ||
"memize": "^1.0.5" | ||
"memize": "^1.0.5", | ||
"sprintf-js": "^1.1.1", | ||
"tannin": "^1.0.1" | ||
}, | ||
@@ -39,3 +40,3 @@ "devDependencies": { | ||
}, | ||
"gitHead": "0aa5c4340f57a69ab935f9e819d74958aad2e022" | ||
"gitHead": "a177dd725495d102d24aee87394c724985bd9f72" | ||
} |
/** | ||
* External dependencies | ||
*/ | ||
import Jed from 'jed'; | ||
import Tannin from 'tannin'; | ||
import memoize from 'memize'; | ||
import sprintfjs from 'sprintf-js'; | ||
let i18n; | ||
/** | ||
* Default locale data to use for Tannin domain when not otherwise provided. | ||
* Assumes an English plural forms expression. | ||
* | ||
* @type {Object} | ||
*/ | ||
const DEFAULT_LOCALE_DATA = { | ||
'': { | ||
plural_forms: 'plural=(n!=1)', | ||
}, | ||
}; | ||
@@ -19,44 +30,35 @@ /** | ||
/** | ||
* Merges locale data into the Jed instance by domain. Creates a new Jed | ||
* instance if one has not yet been assigned. | ||
* The underlying instance of Tannin to which exported functions interface. | ||
* | ||
* @see http://messageformat.github.io/Jed/ | ||
* | ||
* @param {?Object} localeData Locale data configuration. | ||
* @param {?string} domain Domain for which configuration applies. | ||
* @type {Tannin} | ||
*/ | ||
export function setLocaleData( localeData = { '': {} }, domain = 'default' ) { | ||
if ( ! i18n ) { | ||
i18n = new Jed( { | ||
domain: 'default', | ||
locale_data: { | ||
default: { '': {} }, | ||
}, | ||
} ); | ||
} | ||
const i18n = new Tannin( {} ); | ||
i18n.options.locale_data[ domain ] = Object.assign( | ||
{}, | ||
i18n.options.locale_data[ domain ], | ||
localeData | ||
); | ||
} | ||
/** | ||
* Returns the current Jed instance, initializing with a default configuration | ||
* if not already assigned. | ||
* Merges locale data into the Tannin instance by domain. Accepts data in a | ||
* Jed-formatted JSON object shape. | ||
* | ||
* @return {Jed} Jed instance. | ||
* @see http://messageformat.github.io/Jed/ | ||
* | ||
* @param {?Object} data Locale data configuration. | ||
* @param {?string} domain Domain for which configuration applies. | ||
*/ | ||
function getI18n() { | ||
if ( ! i18n ) { | ||
setLocaleData(); | ||
} | ||
export function setLocaleData( data, domain = 'default' ) { | ||
i18n.data[ domain ] = { | ||
...DEFAULT_LOCALE_DATA, | ||
...i18n.data[ domain ], | ||
...data, | ||
}; | ||
return i18n; | ||
// Populate default domain configuration (supported locale date which omits | ||
// a plural forms expression). | ||
i18n.data[ domain ][ '' ] = { | ||
...DEFAULT_LOCALE_DATA[ '' ], | ||
...i18n.data[ domain ][ '' ], | ||
}; | ||
} | ||
/** | ||
* Wrapper for Jed's `dcnpgettext`, its most qualified function. Absorbs errors | ||
* which are thrown as the result of invalid translation. | ||
* Wrapper for Tannin's `dcnpgettext`. Populates default locale data if not | ||
* otherwise previously assigned. | ||
* | ||
@@ -73,12 +75,10 @@ * @param {?string} domain Domain to retrieve the translated text. | ||
*/ | ||
const dcnpgettext = memoize( ( domain = 'default', context, single, plural, number ) => { | ||
try { | ||
return getI18n().dcnpgettext( domain, context, single, plural, number ); | ||
} catch ( error ) { | ||
logErrorOnce( 'Jed localization error: \n\n' + error.toString() ); | ||
return single; | ||
function dcnpgettext( domain = 'default', context, single, plural, number ) { | ||
if ( ! i18n.data[ domain ] ) { | ||
setLocaleData( undefined, domain ); | ||
} | ||
} ); | ||
return i18n.dcnpgettext( domain, context, single, plural, number ); | ||
} | ||
/** | ||
@@ -163,5 +163,5 @@ * Retrieve the translation of text. | ||
try { | ||
return Jed.sprintf( format, ...args ); | ||
return sprintfjs.sprintf( format, ...args ); | ||
} catch ( error ) { | ||
logErrorOnce( 'Jed sprintf error: \n\n' + error.toString() ); | ||
logErrorOnce( 'sprintf error: \n\n' + error.toString() ); | ||
@@ -168,0 +168,0 @@ return format; |
@@ -25,9 +25,9 @@ /** | ||
'%d banana': [ 'une banane', '%d bananes' ], | ||
'%d banana': [ '%d banane', '%d bananes' ], | ||
'fruit\u0004%d apple': [ 'une pomme', '%d pommes' ], | ||
'fruit\u0004%d apple': [ '%d pomme', '%d pommes' ], | ||
}; | ||
const additionalLocaleData = { | ||
cheeseburger: [ 'hamburger au fromage' ], | ||
'%d cat': [ 'un chat', '%d chats' ], | ||
'%d cat': [ '%d chat', '%d chats' ], | ||
}; | ||
@@ -38,24 +38,2 @@ | ||
describe( 'i18n', () => { | ||
describe( 'error absorb', () => { | ||
it( '__', () => { | ||
__( 'Hello', 'domain-without-data' ); | ||
expect( console ).toHaveErrored(); | ||
} ); | ||
it( '_x', () => { | ||
_x( 'feed', 'verb', 'domain-without-data' ); | ||
expect( console ).toHaveErrored(); | ||
} ); | ||
it( '_n', () => { | ||
_n( '%d banana', '%d bananas', 3, 'domain-without-data' ); | ||
expect( console ).toHaveErrored(); | ||
} ); | ||
it( '_nx', () => { | ||
_nx( '%d apple', '%d apples', 3, 'fruit', 'domain-without-data' ); | ||
expect( console ).toHaveErrored(); | ||
} ); | ||
} ); | ||
describe( '__', () => { | ||
@@ -79,3 +57,3 @@ it( 'use the translation', () => { | ||
it( 'use the singular form', () => { | ||
expect( _n( '%d banana', '%d bananas', 1, 'test_domain' ) ).toBe( 'une banane' ); | ||
expect( _n( '%d banana', '%d bananas', 1, 'test_domain' ) ).toBe( '%d banane' ); | ||
} ); | ||
@@ -90,3 +68,3 @@ } ); | ||
it( 'use the singular form', () => { | ||
expect( _nx( '%d apple', '%d apples', 1, 'fruit', 'test_domain' ) ).toBe( 'une pomme' ); | ||
expect( _nx( '%d apple', '%d apples', 1, 'fruit', 'test_domain' ) ).toBe( '%d pomme' ); | ||
} ); | ||
@@ -110,6 +88,20 @@ } ); | ||
describe( 'setAdditionalLocale', () => { | ||
describe( 'setLocaleData', () => { | ||
beforeAll( () => { | ||
setLocaleData( additionalLocaleData, 'test_domain' ); | ||
} ); | ||
it( 'supports omitted plural forms expression', () => { | ||
setLocaleData( { | ||
'': { | ||
domain: 'test_domain2', | ||
lang: 'fr', | ||
}, | ||
'%d banana': [ '%d banane', '%d bananes' ], | ||
}, 'test_domain2' ); | ||
expect( _n( '%d banana', '%d bananes', 2, 'test_domain2' ) ).toBe( '%d bananes' ); | ||
} ); | ||
describe( '__', () => { | ||
@@ -131,3 +123,3 @@ it( 'existing translation still available', () => { | ||
it( 'new singular form was added', () => { | ||
expect( _n( '%d cat', '%d cats', 1, 'test_domain' ) ).toBe( 'un chat' ); | ||
expect( _n( '%d cat', '%d cats', 1, 'test_domain' ) ).toBe( '%d chat' ); | ||
} ); | ||
@@ -134,0 +126,0 @@ |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
64324
6
684
+ Addedsprintf-js@^1.1.1
+ Addedtannin@^1.0.1
+ Added@tannin/compile@1.1.0(transitive)
+ Added@tannin/evaluate@1.2.0(transitive)
+ Added@tannin/plural-forms@1.1.0(transitive)
+ Added@tannin/postfix@1.1.0(transitive)
+ Addedsprintf-js@1.1.3(transitive)
+ Addedtannin@1.2.0(transitive)
- Removedjed@^1.1.1
- Removedjed@1.1.1(transitive)