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.

git-svn-id: https://develop.svn.wordpress.org/trunk@57386 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Pascal Birchler 2024-01-30 13:59:46 +00:00
parent cabfa6f52c
commit 71b8dcb08c
5 changed files with 28 additions and 2 deletions

View File

@ -203,7 +203,24 @@ abstract class WP_Translation_File {
$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 ) {
if ( str_starts_with( $key, $text . "\0" ) ) {
$parts = explode( "\0", $value );
return $parts[0];
}
}
return false;
}
/**

View File

@ -6,5 +6,6 @@ return [
'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',
],
];

View File

@ -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"

View File

@ -173,6 +173,7 @@ class WP_Translation_Controller_Convert_Tests extends WP_UnitTestCase {
* @covers ::translate_plural
* @covers ::locate_translation
* @covers ::get_files
* @covers WP_Translation_File::translate
*
* @dataProvider data_simple_example_files
*
@ -198,6 +199,10 @@ class WP_Translation_Controller_Convert_Tests extends WP_UnitTestCase {
$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' ) );
}
/**