diff --git a/src/wp-includes/build/pages/options-connectors/page-wp-admin.php b/src/wp-includes/build/pages/options-connectors/page-wp-admin.php index 3f3048b8fb98b..cf8cae15cf195 100644 --- a/src/wp-includes/build/pages/options-connectors/page-wp-admin.php +++ b/src/wp-includes/build/pages/options-connectors/page-wp-admin.php @@ -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', diff --git a/src/wp-includes/build/pages/options-connectors/page.php b/src/wp-includes/build/pages/options-connectors/page.php index 6009dbb2570a9..01dd69e198deb 100644 --- a/src/wp-includes/build/pages/options-connectors/page.php +++ b/src/wp-includes/build/pages/options-connectors/page.php @@ -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( diff --git a/src/wp-includes/connectors.php b/src/wp-includes/connectors.php index 63e018074fd58..e59cb8e59f1fb 100644 --- a/src/wp-includes/connectors.php +++ b/src/wp-includes/connectors.php @@ -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( @@ -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; @@ -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' );