Make WordPress Core

Changeset 57386


Ignore:
Timestamp:
01/30/2024 01:59:46 PM (13 months ago)
Author:
swissspidy
Message:

I18N: Improve singular lookup of pluralized strings.

Ensures that looking up a singular that is also used as a pluralized string works as expected.
This improves compatibility for cases where for example both __( 'Product' ) and _n( 'Product', 'Products’, num ) are used in a project, where both will use the same translation for the singular version.

Although such usage is not really recommended nor documented, it must continue to work in the new i18n library in order to maintain backward compatibility and maintain expected behavior.

See #59656.

Location:
trunk
Files:
5 edited

Legend:

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

    r57344 r57386  
    204204        }
    205205
    206         return $this->entries[ $text ] ?? false;
     206        if ( isset( $this->entries[ $text ] ) ) {
     207            return $this->entries[ $text ];
     208        }
     209
     210        /*
     211         * Handle cases where a pluralized string is only used as a singular one.
     212         * For example, when both __( 'Product' ) and _n( 'Product', 'Products' )
     213         * are used, the entry key will have the format "ProductNULProducts".
     214         * Fall back to looking up just "Product" to support this edge case.
     215         */
     216        foreach( $this->entries as $key => $value ) {
     217            if ( str_starts_with( $key, $text . "\0" ) ) {
     218                $parts = explode( "\0", $value );
     219                return $parts[0];
     220            }
     221        }
     222
     223        return false;
    207224    }
    208225
  • trunk/tests/phpunit/data/l10n/example-simple.php

    r57337 r57386  
    77            'plural0' . "\0" . 'plural1' => ['translation0', 'translation1'],
    88            'contextplural0 with context' . "\0" . 'plural1 with context' => ['translation0 with context', 'translation1 with context'],
     9            'Product' . "\0" . 'Products' => 'Produkt' . "\0" . 'Produkte',
    910        ],
    1011];
  • trunk/tests/phpunit/data/l10n/example-simple.po

    r57337 r57386  
    2121msgstr[1] "translation1 with context"
    2222
    23 
     23msgid "Product"
     24msgid_plural "Products"
     25msgstr[0] "Produkt"
     26msgstr[1] "Produkte"
  • trunk/tests/phpunit/tests/l10n/wpTranslationsConvert.php

    r57350 r57386  
    174174     * @covers ::locate_translation
    175175     * @covers ::get_files
     176     * @covers WP_Translation_File::translate
    176177     *
    177178     * @dataProvider data_simple_example_files
     
    199200        $this->assertSame( 'translation0 with context', $controller->translate_plural( array( 'plural0 with context', 'plural1 with context' ), 1, 'context', 'unittest' ) );
    200201        $this->assertSame( 'translation1 with context', $controller->translate_plural( array( 'plural0 with context', 'plural1 with context' ), 2, 'context', 'unittest' ) );
     202
     203        $this->assertSame( 'Produkt', $controller->translate( 'Product', '', 'unittest' ) );
     204        $this->assertSame( 'Produkt', $controller->translate_plural( array( 'Product', 'Products' ), 1, '', 'unittest' ) );
     205        $this->assertSame( 'Produkte', $controller->translate_plural( array( 'Product', 'Products' ), 2, '', 'unittest' ) );
    201206    }
    202207
Note: See TracChangeset for help on using the changeset viewer.