Make WordPress Core


Ignore:
Timestamp:
02/01/2024 08:57:03 PM (2 years ago)
Author:
swissspidy
Message:

I18N: Fix plural forms parsing in WP_Translation_File.

Ensures the plural expression from the translation file header is correctly parsed.
Prevents silent failures in the attempt to create the plural form function.

Adds additional tests.

Props Chouby.
See #59656.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/l10n/class-wp-translation-file.php

    r57505 r57518  
    208208
    209209    /**
    210      * Returns the plural form for a count.
     210     * Returns the plural form for a given number.
    211211     *
    212212     * @since 6.5.0
     
    220220        }
    221221
    222         // In case a plural form is specified as a header, but no function included, build one.
    223222        if ( null === $this->plural_forms && isset( $this->headers['plural-forms'] ) ) {
    224             $this->plural_forms = $this->make_plural_form_function( $this->headers['plural-forms'] );
     223            $expression         = $this->get_plural_expression_from_header( $this->headers['plural-forms'] );
     224            $this->plural_forms = $this->make_plural_form_function( $expression );
    225225        }
    226226
     
    232232             */
    233233            $result = call_user_func( $this->plural_forms, $number );
     234
    234235            return $result;
    235236        }
     
    240241
    241242    /**
     243     * Returns the plural forms expression as a tuple.
     244     *
     245     * @since 6.5.0
     246     *
     247     * @param string $header Plural-Forms header string.
     248     * @return string Plural forms expression.
     249     */
     250    protected function get_plural_expression_from_header( $header ) {
     251        if ( preg_match( '/^\s*nplurals\s*=\s*(\d+)\s*;\s+plural\s*=\s*(.+)$/', $header, $matches ) ) {
     252            return trim( $matches[2] );
     253        }
     254
     255        return 'n != 1';
     256    }
     257
     258    /**
    242259     * Makes a function, which will return the right translation index, according to the
    243260     * plural forms header.
     
    248265     * @return callable(int $num): int Plural forms function.
    249266     */
    250     public function make_plural_form_function( string $expression ): callable {
     267    protected function make_plural_form_function( string $expression ): callable {
    251268        try {
    252269            $handler = new Plural_Forms( rtrim( $expression, ';' ) );
Note: See TracChangeset for help on using the changeset viewer.