Skip to content

Commit

Permalink
I18N: Improve singular lookup of pluralized strings.
Browse files Browse the repository at this point in the history
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.

git-svn-id: https://develop.svn.wordpress.org/trunk@57386 602fd350-edb4-49c9-b593-d223f7449a82
  • Loading branch information
swissspidy committed Jan 30, 2024
1 parent cabfa6f commit 71b8dcb
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 2 deletions.
19 changes: 18 additions & 1 deletion src/wp-includes/l10n/class-wp-translation-file.php
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,24 @@ public function translate( string $text ) {
$this->parse_file();
}

return $this->entries[ $text ] ?? false;
if ( isset( $this->entries[ $text ] ) ) {
return $this->entries[ $text ];
}

/*
* Handle cases where a pluralized string is only used as a singular one.
* For example, when both __( 'Product' ) and _n( 'Product', 'Products' )
* are used, the entry key will have the format "ProductNULProducts".
* Fall back to looking up just "Product" to support this edge case.
*/
foreach( $this->entries as $key => $value ) {

Check failure on line 216 in src/wp-includes/l10n/class-wp-translation-file.php

View workflow job for this annotation

GitHub Actions / PHP coding standards

Space after opening control structure is required

Check failure on line 216 in src/wp-includes/l10n/class-wp-translation-file.php

View workflow job for this annotation

GitHub Actions / PHP coding standards

No space before opening parenthesis is prohibited

Check failure on line 216 in src/wp-includes/l10n/class-wp-translation-file.php

View workflow job for this annotation

GitHub Actions / PHP coding standards

Expected 1 space after FOREACH keyword; 0 found
if ( str_starts_with( $key, $text . "\0" ) ) {
$parts = explode( "\0", $value );
return $parts[0];
}
}

return false;
}

/**
Expand Down
Binary file modified tests/phpunit/data/l10n/example-simple.mo
Binary file not shown.
1 change: 1 addition & 0 deletions tests/phpunit/data/l10n/example-simple.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,6 @@
'contextoriginal with context' => ['translation with context'],
'plural0' . "\0" . 'plural1' => ['translation0', 'translation1'],
'contextplural0 with context' . "\0" . 'plural1 with context' => ['translation0 with context', 'translation1 with context'],
'Product' . "\0" . 'Products' => 'Produkt' . "\0" . 'Produkte',
],
];
5 changes: 4 additions & 1 deletion tests/phpunit/data/l10n/example-simple.po
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,7 @@ msgid_plural "plural1 with context"
msgstr[0] "translation0 with context"
msgstr[1] "translation1 with context"


msgid "Product"
msgid_plural "Products"
msgstr[0] "Produkt"
msgstr[1] "Produkte"
5 changes: 5 additions & 0 deletions tests/phpunit/tests/l10n/wpTranslationsConvert.php
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,7 @@ public function test_create_invalid_filetype() {
* @covers ::translate_plural
* @covers ::locate_translation
* @covers ::get_files
* @covers WP_Translation_File::translate
*
* @dataProvider data_simple_example_files
*
Expand All @@ -198,6 +199,10 @@ public function test_simple_translation_files( string $file ) {
$this->assertSame( 'translation1 with context', $controller->translate_plural( array( 'plural0 with context', 'plural1 with context' ), 0, 'context', 'unittest' ) );
$this->assertSame( 'translation0 with context', $controller->translate_plural( array( 'plural0 with context', 'plural1 with context' ), 1, 'context', 'unittest' ) );
$this->assertSame( 'translation1 with context', $controller->translate_plural( array( 'plural0 with context', 'plural1 with context' ), 2, 'context', 'unittest' ) );

$this->assertSame( 'Produkt', $controller->translate( 'Product', '', 'unittest' ) );
$this->assertSame( 'Produkt', $controller->translate_plural( array( 'Product', 'Products' ), 1, '', 'unittest' ) );
$this->assertSame( 'Produkte', $controller->translate_plural( array( 'Product', 'Products' ), 2, '', 'unittest' ) );
}

/**
Expand Down

0 comments on commit 71b8dcb

Please sign in to comment.