Make WordPress Core

Changeset 37987


Ignore:
Timestamp:
07/06/2016 02:45:55 PM (10 years ago)
Author:
SergeyBiryukov
Message:

I18N: Introduce an on/off switch for locales where comment number needs to be declined.

When enabled, the switch would override the theme's pseudo-plural '% Comments' string with a correct form of _n( '%s Comment', '%s Comments', $number ).

Historically, comments_popup_link() and get_comments_number_text() did not support plural forms and used a pseudo-plural style instead, so some locales were forced to come up with workarounds to display the number of comments in their language correctly.

This change should make those functions more i18n-friendly.

Fixes #13651.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/comment-template.php

    r37985 r37987  
    894894                } else {
    895895                        // % Comments
     896                        /* translators: If comment number in your language requires declension,
     897                         * translate this to 'on'. Do not translate into your own language.
     898                         */
     899                        if ( 'on' === _x( 'off', 'Comment number declension: on or off' ) ) {
     900                                $text = preg_replace( '#<span class="screen-reader-text">.+?</span>#', '', $more );
     901                                $text = preg_replace( '/&.+?;/', '', $text ); // Kill entities
     902                                $text = trim( strip_tags( $text ), '% ' );
     903
     904                                // Replace '% Comments' with a proper plural form
     905                                if ( $text && ! preg_match( '/[0-9]+/', $text ) && false !== strpos( $more, '%' ) ) {
     906                                        /* translators: %s: number of comments */
     907                                        $new_text = _n( '%s Comment', '%s Comments', $number );
     908                                        $new_text = trim( sprintf( $new_text, '' ) );
     909
     910                                        $more = str_replace( $text, $new_text, $more );
     911                                        if ( false === strpos( $more, '%' ) ) {
     912                                                $more = '% ' . $more;
     913                                        }
     914                                }
     915                        }
     916
    896917                        $output = str_replace( '%', number_format_i18n( $number ), $more );
    897918                }
  • trunk/tests/phpunit/tests/comment/template.php

    r35242 r37987  
    3131        }
    3232
     33        /**
     34         * @ticket 13651
     35         */
     36        function test_get_comments_number_text_declension_with_default_args() {
     37                $post_id = $this->factory->post->create();
     38                $permalink = get_permalink( $post_id );
     39                $this->go_to( $permalink );
     40
     41                $this->assertEquals( __( 'No Comments' ), get_comments_number_text() );
     42
     43                $this->factory->comment->create_post_comments( $post_id, 1 );
     44                $this->go_to( $permalink );
     45
     46                $this->assertEquals( __( '1 Comment' ), get_comments_number_text() );
     47
     48                $this->factory->comment->create_post_comments( $post_id, 1 );
     49                $this->go_to( $permalink );
     50
     51                $this->assertEquals( sprintf( _n( '%s Comment', '%s Comments', 2 ), '2' ), get_comments_number_text() );
     52
     53        }
     54
     55        /**
     56         * @ticket 13651
     57         * @dataProvider data_get_comments_number_text_declension
     58         */
     59        function test_get_comments_number_text_declension_with_custom_args( $number, $input, $output ) {
     60                $post_id = $this->factory->post->create();
     61                $permalink = get_permalink( $post_id );
     62
     63                $this->factory->comment->create_post_comments( $post_id, $number );
     64                $this->go_to( $permalink );
     65
     66                add_filter( 'gettext_with_context', array( $this, '_enable_comment_number_declension' ), 10, 4 );
     67
     68                $this->assertEquals( $output, get_comments_number_text( false, false, $input ) );
     69
     70                remove_filter( 'gettext_with_context', array( $this, '_enable_comment_number_declension' ), 10, 4 );
     71        }
     72
     73        function _enable_comment_number_declension( $translation, $text, $context, $domain ) {
     74                if ( 'Comment number declension: on or off' === $context ) {
     75                        $translation = 'on';
     76                }
     77
     78                return $translation;
     79        }
     80
     81        function data_get_comments_number_text_declension() {
     82                return array(
     83                        array(
     84                                2,
     85                                'Comments (%)',
     86                                sprintf( _n( '%s Comment', '%s Comments', 2 ), '2' ),
     87                        ),
     88                        array(
     89                                2,
     90                                '2 Comments',
     91                                '2 Comments',
     92                        ),
     93                        array(
     94                                2,
     95                                '2 Comments<span class="screen-reader-text"> on Hello world!</span>',
     96                                '2 Comments<span class="screen-reader-text"> on Hello world!</span>',
     97                        ),
     98                        array(
     99                                2,
     100                                '2 Comments<span class="screen-reader-text"> on Hello % world!</span>',
     101                                '2 Comments<span class="screen-reader-text"> on Hello 2 world!</span>' // See #WP37103
     102                        ),
     103                        array(
     104                                2,
     105                                __( '% Comments', 'twentyten' ),
     106                                sprintf( _n( '%s Comment', '%s Comments', 2 ), '2' ),
     107                        ),
     108                        array(
     109                                2,
     110                                _x( '%', 'comments number', 'twentyeleven' ),
     111                                '2',
     112                        ),
     113                        array(
     114                                2,
     115                                __( '<b>%</b> Replies', 'twentyeleven' ),
     116                                sprintf( _n( '%s Comment', '%s Comments', 2 ), '<b>2</b>' ),
     117                        ),
     118                        array(
     119                                2,
     120                                __( '% <span class="reply">comments &rarr;</span>', 'twentyeleven' ),
     121                                sprintf( '2 <span class="reply">%s &rarr;</span>', trim( sprintf( _n( '%s Comment', '%s Comments', 2 ), '' ) ) ),
     122                        ),
     123                        array(
     124                                2,
     125                                __( '% Replies', 'twentytwelve' ),
     126                                sprintf( _n( '%s Comment', '%s Comments', 2 ), '2' ),
     127                        ),
     128                        array(
     129                                2,
     130                                __( 'View all % comments', 'twentythirteen' ),
     131                                sprintf( _n( '%s Comment', '%s Comments', 2 ), '2' ),
     132                        ),
     133                        array(
     134                                2,
     135                                __( '% Comments', 'twentyfourteen' ),
     136                                sprintf( _n( '%s Comment', '%s Comments', 2 ), '2' ),
     137                        ),
     138                        array(
     139                                2,
     140                                __( '% Comments', 'twentyfifteen' ),
     141                                sprintf( _n( '%s Comment', '%s Comments', 2 ), '2' ),
     142                        ),
     143                );
     144        }
     145
    33146}
Note: See TracChangeset for help on using the changeset viewer.