77 lines
2.2 KiB
JavaScript
77 lines
2.2 KiB
JavaScript
const i18n = require( '@wordpress/i18n' );
|
|
const { default: md5 } = require( 'md5-es' );
|
|
|
|
const locationMap = {
|
|
plugin: 'plugins/',
|
|
theme: 'themes/',
|
|
core: '',
|
|
};
|
|
|
|
const hasOwn = ( obj, prop ) => Object.prototype.hasOwnProperty.call( obj, prop );
|
|
|
|
module.exports = {
|
|
state: {
|
|
baseUrl: null,
|
|
locale: null,
|
|
domainMap: {},
|
|
domainPaths: {},
|
|
},
|
|
|
|
/**
|
|
* Download and register translations for a bundle.
|
|
*
|
|
* @param {string} path - Bundle path being fetched. May have a query part.
|
|
* @param {string} domain - Text domain to register into.
|
|
* @param {string} location - Location for the translation: 'plugin', 'theme', or 'core'.
|
|
* @returns {Promise} Resolved when the translations are registered, or rejected with an `Error`.
|
|
*/
|
|
async downloadI18n( path, domain, location ) {
|
|
const state = this.state;
|
|
if ( ! state || typeof state.baseUrl !== 'string' ) {
|
|
throw new Error( 'wp.jpI18nLoader.state is not set' );
|
|
}
|
|
|
|
// "en_US" is the default, no translations are needed.
|
|
if ( state.locale === 'en_US' ) {
|
|
return;
|
|
}
|
|
|
|
// Check that fetch is available.
|
|
if ( typeof fetch === 'undefined' ) {
|
|
throw new Error( 'Fetch API is not available.' );
|
|
}
|
|
|
|
// Extract any query part and hash the script name like WordPress does.
|
|
const pathPrefix = hasOwn( state.domainPaths, domain ) ? state.domainPaths[ domain ] : '';
|
|
let hash, query;
|
|
const i = path.indexOf( '?' );
|
|
if ( i >= 0 ) {
|
|
hash = md5.hash( pathPrefix + path.substring( 0, i ) );
|
|
query = path.substring( i );
|
|
} else {
|
|
hash = md5.hash( pathPrefix + path );
|
|
query = '';
|
|
}
|
|
|
|
// Download.
|
|
const locationAndDomain = hasOwn( state.domainMap, domain )
|
|
? state.domainMap[ domain ]
|
|
: locationMap[ location ] + domain;
|
|
const res = await fetch(
|
|
// prettier-ignore
|
|
`${ state.baseUrl }${ locationAndDomain }-${ state.locale }-${ hash }.json${ query }`
|
|
);
|
|
if ( ! res.ok ) {
|
|
throw new Error( `HTTP request failed: ${ res.status } ${ res.statusText }` );
|
|
}
|
|
const data = await res.json();
|
|
|
|
// Extract the messages from the file and register them.
|
|
const localeData = hasOwn( data.locale_data, domain )
|
|
? data.locale_data[ domain ]
|
|
: data.locale_data.messages;
|
|
localeData[ '' ].domain = domain;
|
|
i18n.setLocaleData( localeData, domain );
|
|
},
|
|
};
|