Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,8 @@ function wp_options_connectors_wp_admin_enqueue_scripts( $hook_suffix ) {
// 2. It initializes the boot module as an inline script.
wp_register_script( 'options-connectors-wp-admin-prerequisites', '', $asset['dependencies'], $asset['version'], true );

_wp_add_inline_route_content_script_translations( 'options-connectors-wp-admin-prerequisites', 'connectors-home' );

// Add inline script to initialize the app using initSinglePage (no menuItems)
wp_add_inline_script(
'options-connectors-wp-admin-prerequisites',
Expand Down
2 changes: 2 additions & 0 deletions src/wp-includes/build/pages/options-connectors/page.php
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,8 @@ function wp_options_connectors_render_page() {
// 2. It initializes the boot module as an inline script.
wp_register_script( 'options-connectors-prerequisites', '', $asset['dependencies'], $asset['version'], true );

_wp_add_inline_route_content_script_translations( 'options-connectors-prerequisites', 'connectors-home' );

// Add inline script to initialize the app
$init_modules = [];
wp_add_inline_script(
Expand Down
58 changes: 57 additions & 1 deletion src/wp-includes/connectors.php
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,13 @@ function _wp_connectors_init(): void {
* @param WP_Connector_Registry $registry The connector registry instance.
*/
function _wp_connectors_register_default_ai_providers( WP_Connector_Registry $registry ): void {
// English source strings for built-in descriptions (used to avoid replacing translated defaults with duplicate English from provider metadata).
$default_ai_provider_description_i18n = array(
'anthropic' => 'Text generation with Claude.',
'google' => 'Text and image generation with Gemini and Imagen.',
'openai' => 'Text and image generation with GPT and Dall-E.',
);

// Built-in connectors.
$defaults = array(
'anthropic' => array(
Expand Down Expand Up @@ -324,7 +331,13 @@ function _wp_connectors_register_default_ai_providers( WP_Connector_Registry $re
$defaults[ $connector_id ]['name'] = $name;
}
if ( $description ) {
$defaults[ $connector_id ]['description'] = $description;
// Keep the translated default when metadata repeats the same English string.
if (
! isset( $default_ai_provider_description_i18n[ $connector_id ] ) ||
$description !== $default_ai_provider_description_i18n[ $connector_id ]
) {
$defaults[ $connector_id ]['description'] = $description;
}
}
if ( $logo_url ) {
$defaults[ $connector_id ]['logo_url'] = $logo_url;
Expand Down Expand Up @@ -690,4 +703,47 @@ function _wp_connectors_get_connector_script_module_data( array $data ): array {
$data['connectors'] = $connectors;
return $data;
}

/**
* Outputs wp.i18n locale data for a route content script module by inlining it on the
* page prerequisites script. Route content is loaded as an ES module, which is not
* registered in {@see WP_Scripts}, so {@see wp_set_script_translations()} cannot attach
* JSON translations to it without a companion script handle sharing the same source URL.
*
* @since 7.0.1
* @access private
*
* @param string $prerequisites_script_handle Registered script handle for the page prerequisites script.
* @param string $route_name Route directory name under `wp-includes/build/routes/`.
*/
function _wp_add_inline_route_content_script_translations( $prerequisites_script_handle, $route_name ) {
$asset_path = ABSPATH . WPINC . '/build/routes/' . $route_name . '/content.min.asset.php';
if ( ! file_exists( $asset_path ) ) {
return;
}

$content_asset = require $asset_path;
$extension = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '.js' : '.min.js';
$translation_handle = 'wp-routes-' . str_replace( '/', '-', $route_name ) . '-content';
$content_src = includes_url( 'build/routes/' . $route_name . '/content' . $extension );

wp_register_script(
$translation_handle,
$content_src,
array( 'wp-i18n' ),
$content_asset['version'] ?? false,
true
);
wp_set_script_translations( $translation_handle, 'default' );

$translations = wp_scripts()->print_translations( $translation_handle, false );
wp_deregister_script( $translation_handle );

if ( ! $translations ) {
return;
}

wp_add_inline_script( $prerequisites_script_handle, $translations, 'before' );
}

add_filter( 'script_module_data_options-connectors-wp-admin', '_wp_connectors_get_connector_script_module_data' );
Loading