Skip to content

Commit

Permalink
Blocks: Translate metadata loaded from block.json
Browse files Browse the repository at this point in the history
  • Loading branch information
gziolo committed Apr 13, 2021
1 parent a9f04c6 commit a0bba9e
Show file tree
Hide file tree
Showing 3 changed files with 122 additions and 5 deletions.
1 change: 1 addition & 0 deletions packages/blocks/README.md
Expand Up @@ -726,6 +726,7 @@ _Parameters_

- _metadata_ `Object`: Block metadata loaded from `block.json`.
- _metadata.name_ `string`: Block name.
- _metadata.textdomain_ `string`: Textdomain to use with translations.
- _additionalSettings_ `Object`: Additional block settings.

_Returns_
Expand Down
82 changes: 77 additions & 5 deletions packages/blocks/src/api/registration.js
Expand Up @@ -5,9 +5,13 @@
*/
import {
camelCase,
isArray,
isEmpty,
isFunction,
isNil,
isObject,
isPlainObject,
isString,
mapKeys,
omit,
pick,
Expand All @@ -25,6 +29,7 @@ import { blockDefault } from '@wordpress/icons';
/**
* Internal dependencies
*/
import i18nBlockSchema from './i18n-block.json';
import { isValidIcon, normalizeIconObject } from './utils';
import { DEPRECATED_ENTRY_KEYS } from './constants';
import { store as blocksStore } from '../store';
Expand Down Expand Up @@ -308,21 +313,73 @@ export function registerBlockType( name, settings ) {
return settings;
}

/**
* Translates block settings provided with metadata using the i18n schema.
*
* @param {string|string[]|Object[]} settingSchema I18n schema for the block setting.
* @param {string|string[]|Object[]} settingValue Value for the block setting.
* @param {string} textdomain Textdomain to use with translations.
*
* @return {string|string[]|Object[]} Translated setting.
*/
function translateBlockSettingUsingI18nSchema(
settingSchema,
settingValue,
textdomain
) {
if ( isString( settingSchema ) && isString( settingValue ) ) {
return settingValue + ':' + settingSchema + ':' + textdomain;
}
if (
isArray( settingSchema ) &&
! isEmpty( settingSchema ) &&
isArray( settingValue )
) {
return settingValue.map( ( value ) =>
translateBlockSettingUsingI18nSchema(
settingSchema[ 0 ],
value,
textdomain
)
);
}
if (
isObject( settingSchema ) &&
! isEmpty( settingSchema ) &&
isObject( settingValue )
) {
return Object.keys( settingValue ).reduce( ( accumulator, key ) => {
if ( ! settingSchema[ key ] ) {
accumulator[ key ] = settingValue[ key ];
return accumulator;
}
accumulator[ key ] = translateBlockSettingUsingI18nSchema(
settingSchema[ key ],
settingValue[ key ],
textdomain
);
return accumulator;
}, {} );
}
return settingValue;
}

/**
* Registers a new block provided from metadata stored in `block.json` file.
* It uses `registerBlockType` internally.
*
* @see registerBlockType
*
* @param {Object} metadata Block metadata loaded from `block.json`.
* @param {string} metadata.name Block name.
* @param {Object} additionalSettings Additional block settings.
* @param {Object} metadata Block metadata loaded from `block.json`.
* @param {string} metadata.name Block name.
* @param {string} metadata.textdomain Textdomain to use with translations.
* @param {Object} additionalSettings Additional block settings.
*
* @return {?WPBlock} The block, if it has been successfully registered;
* otherwise `undefined`.
*/
export function registerBlockTypeFromMetadata(
{ name, ...metadata },
{ name, textdomain, ...metadata },
additionalSettings
) {
const allowedFields = [
Expand All @@ -341,8 +398,23 @@ export function registerBlockTypeFromMetadata(
'apiVersion',
];

const settings = pick( metadata, allowedFields );

if ( textdomain ) {
Object.keys( i18nBlockSchema ).forEach( ( key ) => {
if ( ! settings[ key ] ) {
return;
}
settings[ key ] = translateBlockSettingUsingI18nSchema(
i18nBlockSchema[ key ],
settings[ key ],
textdomain
);
} );
}

unstable__bootstrapServerSideBlockDefinitions( {
[ name ]: pick( metadata, allowedFields ),
[ name ]: settings,
} );

return registerBlockType( name, additionalSettings );
Expand Down
44 changes: 44 additions & 0 deletions packages/blocks/src/api/test/registration.js
Expand Up @@ -835,6 +835,50 @@ describe( 'blocks', () => {
save: noop,
} );
} );
test( 'registers block from metadata with translation', () => {
const Edit = () => 'test';
const block = registerBlockTypeFromMetadata(
{
name: 'test/block-from-metadata-i18n',
title: 'I18n title from metadata',
description: 'I18n description from metadata',
keywords: [ 'i18n', 'metadata' ],
styles: [
{
label: 'i18n-metadata',
title: 'I18n Metadata',
},
],
textdomain: 'i18n',
icon: 'palmtree',
},
{
edit: Edit,
save: noop,
}
);
expect( block ).toEqual( {
name: 'test/block-from-metadata-i18n',
title: 'I18n title from metadata',
description: 'I18n description from metadata',
icon: {
src: 'palmtree',
},
keywords: [ 'i18n', 'metadata' ],
attributes: {},
providesContext: {},
usesContext: [],
supports: {},
styles: [
{
label: 'i18n-metadata',
title: 'I18n Metadata',
},
],
edit: Edit,
save: noop,
} );
} );
} );

describe( 'registerBlockCollection()', () => {
Expand Down

0 comments on commit a0bba9e

Please sign in to comment.