This commit is contained in:
Javier Casares 2026-05-25 17:12:22 +00:00
commit 02cd01e862
20 changed files with 1365 additions and 646 deletions

View file

@ -30,7 +30,7 @@
/**
* Calls the REST endpoint to translate the selected fields of the saved post.
*
* @param {Array<string>} fields Field names to translate ('title', 'content').
* @param {Array<string>} fields Field names to translate ('title', 'content', 'excerpt').
* @param {string} targetLocale WordPress locale code.
* @returns {Promise<Object>} Promise resolving to the translated values.
*/
@ -50,7 +50,7 @@
} );
}
function resolveFields( wantTitle, wantContent ) {
function resolveFields( wantTitle, wantContent, wantExcerpt ) {
var fields = [];
if ( wantTitle && data.settings.translateTitle ) {
fields.push( 'title' );
@ -58,6 +58,9 @@
if ( wantContent && data.settings.translateContent ) {
fields.push( 'content' );
}
if ( wantExcerpt && data.settings.translateExcerpt ) {
fields.push( 'excerpt' );
}
return fields;
}
@ -72,7 +75,7 @@
* Applies a translation response using the right method for the current editor.
*
* In the block editor, uses wp.data dispatch (and wp.blocks.parse for content).
* In the classic editor, updates the DOM directly (title input + TinyMCE).
* In the classic editor, updates the DOM directly (title input + TinyMCE + excerpt textarea).
*
* @param {Object} response Translation response.
* @param {Document} doc Document where the metabox lives (for classic fallback).
@ -98,6 +101,9 @@
wp.data.dispatch( 'core/editor' ).editPost( { content: response.content } );
}
}
if ( response.excerpt !== undefined ) {
wp.data.dispatch( 'core/editor' ).editPost( { excerpt: response.excerpt } );
}
return;
}
@ -111,6 +117,12 @@
if ( response.content !== undefined ) {
applyContentToClassic( response.content, doc );
}
if ( response.excerpt !== undefined ) {
var excerptTextarea = doc.getElementById( 'excerpt' );
if ( excerptTextarea ) {
excerptTextarea.value = response.excerpt;
}
}
}
function applyContentToClassic( content, doc ) {
@ -159,7 +171,11 @@
return;
}
var fields = resolveFields( data.settings.translateTitle, data.settings.translateContent );
var fields = resolveFields(
data.settings.translateTitle,
data.settings.translateContent,
data.settings.translateExcerpt
);
if ( fields.length === 0 ) {
setStatus( labels.noFields || '', 'warning' );
return;
@ -244,6 +260,10 @@
var translateContent = contentState[0];
var setTranslateContent = contentState[1];
var excerptState = useState( !! data.settings.translateExcerpt );
var translateExcerpt = excerptState[0];
var setTranslateExcerpt = excerptState[1];
var coreEditor = dataStore.select( 'core/editor' );
var isDirty = coreEditor && typeof coreEditor.isEditedPostDirty === 'function' ? coreEditor.isEditedPostDirty() : false;
@ -253,7 +273,7 @@
);
}
if ( ! data.settings.translateTitle && ! data.settings.translateContent ) {
if ( ! data.settings.translateTitle && ! data.settings.translateContent && ! data.settings.translateExcerpt ) {
return el( 'div', { className: 'ai-translator-sidebar' },
el( components.Notice, { status: 'info', isDismissible: false }, labels.noFields || '' )
);
@ -270,7 +290,7 @@
} );
function runTranslate() {
var fields = resolveFields( translateTitle, translateContent );
var fields = resolveFields( translateTitle, translateContent, translateExcerpt );
if ( fields.length === 0 ) {
setNotice( { status: 'warning', message: labels.noFields || '' } );
@ -350,6 +370,17 @@
} ) );
}
if ( data.settings.translateExcerpt ) {
children.push( el( components.CheckboxControl, {
key: 'excerpt',
label: labels.translateExcerpt || '',
checked: translateExcerpt,
onChange: function ( value ) {
setTranslateExcerpt( !! value );
},
} ) );
}
children.push( el( components.Button, {
key: 'submit',
variant: 'primary',