diff --git a/src/wp-includes/comment-template.php b/src/wp-includes/comment-template.php
index 75ed045cd3..04b443f732 100644
--- a/src/wp-includes/comment-template.php
+++ b/src/wp-includes/comment-template.php
@@ -893,6 +893,27 @@ function get_comments_number_text( $zero = false, $one = false, $more = false )
$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( '#.+?#', '', $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 ) {
diff --git a/tests/phpunit/tests/comment/template.php b/tests/phpunit/tests/comment/template.php
index 00fd2b8b95..17ec65e0e3 100644
--- a/tests/phpunit/tests/comment/template.php
+++ b/tests/phpunit/tests/comment/template.php
@@ -30,4 +30,117 @@ class Tests_Comment_Template extends WP_UnitTestCase {
$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 on Hello world!',
+ '2 Comments on Hello world!',
+ ),
+ array(
+ 2,
+ '2 Comments on Hello % world!',
+ '2 Comments on Hello 2 world!' // See #WP37103
+ ),
+ array(
+ 2,
+ __( '% Comments', 'twentyten' ),
+ sprintf( _n( '%s Comment', '%s Comments', 2 ), '2' ),
+ ),
+ array(
+ 2,
+ _x( '%', 'comments number', 'twentyeleven' ),
+ '2',
+ ),
+ array(
+ 2,
+ __( '% Replies', 'twentyeleven' ),
+ sprintf( _n( '%s Comment', '%s Comments', 2 ), '2' ),
+ ),
+ array(
+ 2,
+ __( '% comments →', 'twentyeleven' ),
+ sprintf( '2 %s →', 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' ),
+ ),
+ );
+ }
+
+}