diff --git a/src/wp-includes/l10n/class-wp-translation-file.php b/src/wp-includes/l10n/class-wp-translation-file.php index 93842bec10..f920ab1388 100644 --- a/src/wp-includes/l10n/class-wp-translation-file.php +++ b/src/wp-includes/l10n/class-wp-translation-file.php @@ -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; } /** diff --git a/tests/phpunit/data/l10n/example-simple.mo b/tests/phpunit/data/l10n/example-simple.mo index 73fb5f21ab..cf39269a46 100644 Binary files a/tests/phpunit/data/l10n/example-simple.mo and b/tests/phpunit/data/l10n/example-simple.mo differ diff --git a/tests/phpunit/data/l10n/example-simple.php b/tests/phpunit/data/l10n/example-simple.php index e9c2f73ad6..4eb71d4405 100644 --- a/tests/phpunit/data/l10n/example-simple.php +++ b/tests/phpunit/data/l10n/example-simple.php @@ -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', ], ]; diff --git a/tests/phpunit/data/l10n/example-simple.po b/tests/phpunit/data/l10n/example-simple.po index b40fcda69b..9aff39e121 100644 --- a/tests/phpunit/data/l10n/example-simple.po +++ b/tests/phpunit/data/l10n/example-simple.po @@ -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" diff --git a/tests/phpunit/tests/l10n/wpTranslationsConvert.php b/tests/phpunit/tests/l10n/wpTranslationsConvert.php index 8f3aa41c05..ea318eb329 100644 --- a/tests/phpunit/tests/l10n/wpTranslationsConvert.php +++ b/tests/phpunit/tests/l10n/wpTranslationsConvert.php @@ -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' ) ); } /**