Index: src/wp-includes/comment-template.php
===================================================================
--- src/wp-includes/comment-template.php	(revision 37695)
+++ src/wp-includes/comment-template.php	(working copy)
@@ -893,6 +893,27 @@
 			$output = sprintf( _n( '%s Comment', '%s Comments', $number ), number_format_i18n( $number ) );
 		} else {
 			// % Comments
+			/* translators: If comment number in your language requires declension,
+			 * translate this to 'on'. Do not translate into your own language.
+			 */
+			if ( 'on' === _x( 'off', 'Comment number declension: on or off' ) ) {
+				$text = preg_replace( '#<span class="screen-reader-text">.+?</span>#', '', $more );
+				$text = preg_replace( '/&.+?;/', '', $text ); // Kill entities
+				$text = trim( strip_tags( $text ), '% ' );
+
+				// Replace '% Comments' with a proper plural form
+				if ( $text && ! preg_match( '/[0-9]+/', $text ) && false !== strpos( $more, '%' ) ) {
+					/* translators: %s: number of comments */
+					$new_text = _n( '%s Comment', '%s Comments', $number );
+					$new_text = trim( sprintf( $new_text, '' ) );
+
+					$more = str_replace( $text, $new_text, $more );
+					if ( false === strpos( $more, '%' ) ) {
+						$more = '% ' . $more;
+					}
+				}
+			}
+
 			$output = str_replace( '%', number_format_i18n( $number ), $more );
 		}
 	} elseif ( $number == 0 ) {
Index: tests/phpunit/tests/comment/template.php
===================================================================
--- tests/phpunit/tests/comment/template.php	(revision 37695)
+++ tests/phpunit/tests/comment/template.php	(working copy)
@@ -30,4 +30,117 @@
 		$this->assertEquals( 12, get_comments_number() );
 	}
 
-}
\ No newline at end of file
+	/**
+	 * @ticket 13651
+	 */
+	function test_get_comments_number_text_declension_with_default_args() {
+		$post_id = $this->factory->post->create();
+		$permalink = get_permalink( $post_id );
+		$this->go_to( $permalink );
+
+		$this->assertEquals( __( 'No Comments' ), get_comments_number_text() );
+
+		$this->factory->comment->create_post_comments( $post_id, 1 );
+		$this->go_to( $permalink );
+
+		$this->assertEquals( __( '1 Comment' ), get_comments_number_text() );
+
+		$this->factory->comment->create_post_comments( $post_id, 1 );
+		$this->go_to( $permalink );
+
+		$this->assertEquals( sprintf( _n( '%s Comment', '%s Comments', 2 ), '2' ), get_comments_number_text() );
+
+	}
+
+	/**
+	 * @ticket 13651
+	 * @dataProvider data_get_comments_number_text_declension
+	 */
+	function test_get_comments_number_text_declension_with_custom_args( $number, $input, $output ) {
+		$post_id = $this->factory->post->create();
+		$permalink = get_permalink( $post_id );
+
+		$this->factory->comment->create_post_comments( $post_id, $number );
+		$this->go_to( $permalink );
+
+		add_filter( 'gettext_with_context', array( $this, '_enable_comment_number_declension' ), 10, 4 );
+
+		$this->assertEquals( $output, get_comments_number_text( false, false, $input ) );
+
+		remove_filter( 'gettext_with_context', array( $this, '_enable_comment_number_declension' ), 10, 4 );
+	}
+
+	function _enable_comment_number_declension( $translation, $text, $context, $domain ) {
+		if ( 'Comment number declension: on or off' === $context ) {
+			$translation = 'on';
+		}
+
+		return $translation;
+	}
+
+	function data_get_comments_number_text_declension() {
+		return array(
+			array(
+				2,
+				'Comments (%)',
+				sprintf( _n( '%s Comment', '%s Comments', 2 ), '2' ),
+			),
+			array(
+				2,
+				'2 Comments',
+				'2 Comments',
+			),
+			array(
+				2,
+				'2 Comments<span class="screen-reader-text"> on Hello world!</span>',
+				'2 Comments<span class="screen-reader-text"> on Hello world!</span>',
+			),
+			array(
+				2,
+				'2 Comments<span class="screen-reader-text"> on Hello % world!</span>',
+				'2 Comments<span class="screen-reader-text"> on Hello 2 world!</span>' // See #WP37103
+			),
+			array(
+				2,
+				__( '% Comments', 'twentyten' ),
+				sprintf( _n( '%s Comment', '%s Comments', 2 ), '2' ),
+			),
+			array(
+				2,
+				_x( '%', 'comments number', 'twentyeleven' ),
+				'2',
+			),
+			array(
+				2,
+				__( '<b>%</b> Replies', 'twentyeleven' ),
+				sprintf( _n( '%s Comment', '%s Comments', 2 ), '<b>2</b>' ),
+			),
+			array(
+				2,
+				__( '% <span class="reply">comments &rarr;</span>', 'twentyeleven' ),
+				sprintf( '2 <span class="reply">%s &rarr;</span>', trim( sprintf( _n( '%s Comment', '%s Comments', 2 ), '' ) ) ),
+			),
+			array(
+				2,
+				__( '% Replies', 'twentytwelve' ),
+				sprintf( _n( '%s Comment', '%s Comments', 2 ), '2' ),
+			),
+			array(
+				2,
+				__( 'View all % comments', 'twentythirteen' ),
+				sprintf( _n( '%s Comment', '%s Comments', 2 ), '2' ),
+			),
+			array(
+				2,
+				__( '% Comments', 'twentyfourteen' ),
+				sprintf( _n( '%s Comment', '%s Comments', 2 ), '2' ),
+			),
+			array(
+				2,
+				__( '% Comments', 'twentyfifteen' ),
+				sprintf( _n( '%s Comment', '%s Comments', 2 ), '2' ),
+			),
+		);
+	}
+
+}
