diff --git a/src/wp-includes/admin-bar.php b/src/wp-includes/admin-bar.php index b9c7872d0cc07..1e96ac794d8f2 100644 --- a/src/wp-includes/admin-bar.php +++ b/src/wp-includes/admin-bar.php @@ -949,16 +949,38 @@ function wp_admin_bar_command_palette_menu( WP_Admin_Bar $wp_admin_bar ): void { return; } - $is_apple_os = (bool) preg_match( '/Macintosh|Mac OS X|Mac_PowerPC/i', $_SERVER['HTTP_USER_AGENT'] ?? '' ); - $shortcut_label = $is_apple_os - ? _x( '⌘K', 'keyboard shortcut to open the command palette' ) - : _x( 'Ctrl+K', 'keyboard shortcut to open the command palette' ); - $title = sprintf( + $shortcut_labels = array( + 'appleOS' => _x( '⌘K', 'keyboard shortcut to open the command palette' ), + 'default' => _x( 'Ctrl+K', 'keyboard shortcut to open the command palette' ), + ); + $is_apple_os = (bool) preg_match( '/Macintosh|Mac OS X|Mac_PowerPC/i', $_SERVER['HTTP_USER_AGENT'] ?? '' ); + $shortcut_label = $is_apple_os ? $shortcut_labels['appleOS'] : $shortcut_labels['default']; + $title = sprintf( '%s %s', $shortcut_label, /* translators: Hidden accessibility text. */ __( 'Open command palette' ), ); + /* + * Detect Apple OS via JavaScript for sites behind a CDN blocking the UA header. + * + * Running the script as the admin bar is rendered avoids a flash of incorrect content + * for users with Apple OS when the UA header is blocked. It also prevents the need for + * wp-i18n to be loaded as a dependency. + */ + $function = <<<'JS' + ( appleOSLabel ) => { + if ( navigator.platform.startsWith("Mac") || navigator.platform === "iPhone" || navigator.platform === "iPad" ) { + document.querySelector( '#wp-admin-bar-command-palette .ab-label kbd' ).textContent = appleOSLabel; + } + } + JS; + $script = sprintf( + '( %s )( %s );', + $function, + wp_json_encode( $shortcut_labels['appleOS'], JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ) + ); + $script .= "\n//# sourceURL=" . rawurlencode( __FUNCTION__ ); $wp_admin_bar->add_node( array( 'id' => 'command-palette', @@ -967,6 +989,7 @@ function wp_admin_bar_command_palette_menu( WP_Admin_Bar $wp_admin_bar ): void { 'meta' => array( 'class' => 'hide-if-no-js', 'onclick' => 'wp.data.dispatch( "core/commands" ).open(); return false;', + 'html' => wp_get_inline_script_tag( $script ), ), ) );