Index: src/wp-admin/includes/media.php
===================================================================
--- src/wp-admin/includes/media.php	(revision 53139)
+++ src/wp-admin/includes/media.php	(working copy)
@@ -1714,8 +1714,7 @@
 		<tr><td colspan='2' class='imgedit-response' id='imgedit-response-$post->ID'></td></tr>\n
 		<tr><td style='display:none' colspan='2' class='image-editor' id='image-editor-$post->ID'></td></tr>\n
 		<tr><td colspan='2'><p class='media-types media-types-required-info'>" .
-			/* translators: %s: Asterisk symbol (*). */
-			sprintf( __( 'Required fields are marked %s' ), '<span class="required">*</span>' ) .
+			wp_required_field_message( '' ) .
 		"</p></td></tr>\n";
 
 	$defaults = array(
@@ -1795,7 +1794,7 @@
 			continue;
 		}
 
-		$required      = $field['required'] ? '<span class="required">*</span>' : '';
+		$required      = $field['required'] ? wp_required_field_indicator( '' ) : '';
 		$required_attr = $field['required'] ? ' required' : '';
 		$class         = $id;
 		$class        .= $field['required'] ? ' form-required' : '';
@@ -1986,7 +1985,7 @@
 		}
 
 		$readonly      = ! $user_can_edit && ! empty( $field['taxonomy'] ) ? " readonly='readonly' " : '';
-		$required      = $field['required'] ? '<span class="required">*</span>' : '';
+		$required      = $field['required'] ? wp_required_field_indicator( '' ) : '';
 		$required_attr = $field['required'] ? ' required' : '';
 		$class         = 'compat-field-' . $id;
 		$class        .= $field['required'] ? ' form-required' : '';
@@ -2042,8 +2041,7 @@
 
 	if ( $item ) {
 		$item = '<p class="media-types media-types-required-info">' .
-			/* translators: %s: Asterisk symbol (*). */
-			sprintf( __( 'Required fields are marked %s' ), '<span class="required">*</span>' ) .
+			wp_required_field_message( '' ) .
 			'</p>' .
 			'<table class="compat-attachment-fields">' . $item . '</table>';
 	}
@@ -2940,13 +2938,12 @@
 	return '
 	<p class="media-types"><label><input type="radio" name="media_type" value="image" id="image-only"' . checked( 'image-only', $view, false ) . ' /> ' . __( 'Image' ) . '</label> &nbsp; &nbsp; <label><input type="radio" name="media_type" value="generic" id="not-image"' . checked( 'not-image', $view, false ) . ' /> ' . __( 'Audio, Video, or Other File' ) . '</label></p>
 	<p class="media-types media-types-required-info">' .
-		/* translators: %s: Asterisk symbol (*). */
-		sprintf( __( 'Required fields are marked %s' ), '<span class="required">*</span>' ) .
+		wp_required_field_message( '' ) .
 	'</p>
 	<table class="describe ' . $table_class . '"><tbody>
 		<tr>
 			<th scope="row" class="label" style="width:130px;">
-				<label for="src"><span class="alignleft">' . __( 'URL' ) . '</span> <span class="required">*</span></label>
+				<label for="src"><span class="alignleft">' . __( 'URL' ) . '</span>' . wp_required_field_indicator() . '</label>
 				<span class="alignright" id="status_img"></span>
 			</th>
 			<td class="field"><input id="src" name="src" value="" type="text" required onblur="addExtImage.getImageData()" /></td>
@@ -2954,7 +2951,7 @@
 
 		<tr>
 			<th scope="row" class="label">
-				<label for="title"><span class="alignleft">' . __( 'Title' ) . '</span> <span class="required">*</span></label>
+				<label for="title"><span class="alignleft">' . __( 'Title' ) . '</span>' . wp_required_field_indicator() . '</label>
 			</th>
 			<td class="field"><input id="title" name="title" value="" type="text" required /></td>
 		</tr>
@@ -2963,7 +2960,7 @@
 
 		<tr class="image-only">
 			<th scope="row" class="label">
-				<label for="alt"><span class="alignleft">' . __( 'Alternative Text' ) . '</span></label>
+				<label for="alt"><span class="alignleft">' . __( 'Alternative Text' ) . '</span>' . wp_required_field_indicator() . '</label>
 			</th>
 			<td class="field"><input id="alt" name="alt" value="" type="text" required />
 			<p class="help">' . __( 'Alt text for the image, e.g. &#8220;The Mona Lisa&#8221;' ) . '</p></td>
Index: src/wp-admin/network/site-new.php
===================================================================
--- src/wp-admin/network/site-new.php	(revision 53139)
+++ src/wp-admin/network/site-new.php	(working copy)
@@ -194,19 +194,13 @@
 }
 ?>
 <p>
-<?php
-printf(
-	/* translators: %s: Asterisk symbol (*). */
-	__( 'Required fields are marked %s' ),
-	'<span class="required">*</span>'
-);
-?>
+<?php wp_required_field_message( '', true ); ?>
 </p>
 <form method="post" action="<?php echo esc_url( network_admin_url( 'site-new.php?action=add-site' ) ); ?>" novalidate="novalidate">
 <?php wp_nonce_field( 'add-blog', '_wpnonce_add-blog' ); ?>
 	<table class="form-table" role="presentation">
 		<tr class="form-field form-required">
-			<th scope="row"><label for="site-address"><?php _e( 'Site Address (URL)' ); ?> <span class="required">*</span></label></th>
+			<th scope="row"><label for="site-address"><?php _e( 'Site Address (URL)' ); wp_required_field_indicator( ' ', true ); ?></label></th>
 			<td>
 			<?php if ( is_subdomain_install() ) { ?>
 				<input name="blog[domain]" type="text" class="regular-text ltr" id="site-address" aria-describedby="site-address-desc" autocapitalize="none" autocorrect="off" required /><span class="no-break">.<?php echo preg_replace( '|^www\.|', '', get_network()->domain ); ?></span>
@@ -222,7 +216,7 @@
 			</td>
 		</tr>
 		<tr class="form-field form-required">
-			<th scope="row"><label for="site-title"><?php _e( 'Site Title' ); ?> <span class="required">*</span></label></th>
+			<th scope="row"><label for="site-title"><?php _e( 'Site Title' ); wp_required_field_indicator( ' ', true ); ?></label></th>
 			<td><input name="blog[title]" type="text" class="regular-text" id="site-title" required /></td>
 		</tr>
 		<?php
@@ -257,7 +251,7 @@
 			</tr>
 		<?php endif; // Languages. ?>
 		<tr class="form-field form-required">
-			<th scope="row"><label for="admin-email"><?php _e( 'Admin Email' ); ?> <span class="required">*</span></label></th>
+			<th scope="row"><label for="admin-email"><?php _e( 'Admin Email' ); wp_required_field_indicator( ' ', true ); ?></label></th>
 			<td><input name="blog[email]" type="email" class="regular-text wp-suggest-user" id="admin-email" data-autocomplete-type="search" data-autocomplete-field="user_email" aria-describedby="site-admin-email" required /></td>
 		</tr>
 		<tr class="form-field">
Index: src/wp-includes/comment-template.php
===================================================================
--- src/wp-includes/comment-template.php	(revision 53139)
+++ src/wp-includes/comment-template.php	(working copy)
@@ -2359,8 +2359,9 @@
 	$required_attribute = ( $html5 ? ' required' : ' required="required"' );
 	$checked_attribute  = ( $html5 ? ' checked' : ' checked="checked"' );
 
-	// Identify required fields visually.
-	$required_indicator = ' <span class="required" aria-hidden="true">*</span>';
+	// Identify required fields visually and create a message about the indicator.
+	$required_indicator = wp_required_field_indicator();
+	$required_text      = wp_required_field_message();
 
 	$fields = array(
 		'author' => sprintf(
@@ -2425,12 +2426,6 @@
 		}
 	}
 
-	$required_text = sprintf(
-		/* translators: %s: Asterisk symbol (*). */
-		' <span class="required-field-message" aria-hidden="true">' . __( 'Required fields are marked %s' ) . '</span>',
-		trim( $required_indicator )
-	);
-
 	/**
 	 * Filters the default comment form fields.
 	 *
Index: src/wp-includes/functions.php
===================================================================
--- src/wp-includes/functions.php	(revision 53139)
+++ src/wp-includes/functions.php	(working copy)
@@ -8442,6 +8442,53 @@
 }
 
 /**
+ * Assign a visual indicator for required form fields.
+ *
+ * @since 6.0.0
+ *
+ * @param string $space_before Space character, entity or empty string to add before glyph. Default ' '.
+ * @param bool   $echo         Whether to output the result or instead return it. Default false.
+ * @return string Indicator glyph wrapped in a `span` tag.
+ */
+function wp_required_field_indicator( $space_before = ' ', $echo = false ) {
+	/* translators: Character to identify required form fields. */
+	$glyph     = __( '*' );
+	$indicator = sprintf(
+		'%1$s<span class="required" aria-hidden="true">%2$s</span>',
+		esc_html( $space_before ),
+		esc_html( $glyph ),
+	);
+
+	if ( ! $echo ) {
+		return $indicator;
+	}
+	echo $indicator;
+}
+
+/**
+ * Create a message to explain required form fields.
+ *
+ * @since 6.0.0
+ *
+ * @param string $space_before Space character, entity or empty string to add before glyph. Default ' '.
+ * @param bool   $echo         Whether to output the result or instead return it. Default false.
+ * @return string Message text and glyph wrapped in a `span` tag.
+ */
+function wp_required_field_message( $space_before = ' ', $echo = false ) {
+	$message = sprintf(
+		'%1$s<span class="required-field-message" aria-hidden="true">%2$s</span>',
+		esc_html( $space_before ),
+		/* translators: %s: Asterisk symbol (*). */
+		sprintf( __( 'Required fields are marked %s' ), wp_required_field_indicator( '' ) ),
+	);
+
+	if ( ! $echo ) {
+		return $message;
+	}
+	echo $message;
+}
+
+/**
  * Sorts the keys of an array alphabetically.
  * The array is passed by reference so it doesn't get returned
  * which mimics the behaviour of ksort.
