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.

git-svn-id: https://develop.svn.wordpress.org/trunk@57518 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Pascal Birchler
2024-02-01 20:57:03 +00:00
parent 9486dc1bec
commit 5e178ff9c9
4 changed files with 69 additions and 4 deletions
Binary file not shown.
@@ -0,0 +1,2 @@
<?php
return ['x-generator'=>'GlotPress/4.0.0-beta.2','translation-revision-date'=>'2024-01-18 05:40:05+0000','plural-forms'=>'nplurals=4; plural=(n % 100 == 1) ? 0 : ((n % 100 == 2) ? 1 : ((n % 100 == 3 || n % 100 == 4) ? 2 : 3));','project-id-version'=>'WordPress - 6.4.x - Development','language'=>'sl_SI','messages'=>['%s update available'=>'%s razpoložljiva posodobitev' . "\0" . '%s razpoložljivi posodobitvi' . "\0" . '%s razpoložljive posodobitve' . "\0" . '%s razpoložljivih posodobitev']];
@@ -219,6 +219,52 @@ class WP_Translations_Tests extends WP_UnitTestCase {
$this->assertTrue( $unload_successful, 'Text domain not successfully unloaded' );
}
/**
* @covers ::translate_plural
* @covers WP_Translation_File::get_plural_form
*/
public function test_translate_plural_complex() {
load_textdomain( 'wp-tests-domain', DIR_TESTDATA . '/l10n/plural-complex.mo' );
$this->assertSame( '%s razpoložljiva posodobitev', _n( '%s update available', '%s updates available', 101, 'wp-tests-domain' ) ); // 1, 101, 201
$this->assertSame( '%s razpoložljivi posodobitvi', _n( '%s update available', '%s updates available', 102, 'wp-tests-domain' ) ); // 2, 102, 202
$this->assertSame( '%s razpoložljive posodobitve', _n( '%s update available', '%s updates available', 103, 'wp-tests-domain' ) ); // 3, 4, 103
$this->assertSame( '%s razpoložljivih posodobitev', _n( '%s update available', '%s updates available', 5, 'wp-tests-domain' ) ); // 0, 5, 6
}
/**
* @covers ::translate_plural
* @covers WP_Translation_File::get_plural_form
*/
public function test_translate_plural_complex_php() {
load_textdomain( 'wp-tests-domain', DIR_TESTDATA . '/l10n/plural-complex.php' );
$this->assertSame( '%s razpoložljiva posodobitev', _n( '%s update available', '%s updates available', 101, 'wp-tests-domain' ) ); // 1, 101, 201
$this->assertSame( '%s razpoložljivi posodobitvi', _n( '%s update available', '%s updates available', 102, 'wp-tests-domain' ) ); // 2, 102, 202
$this->assertSame( '%s razpoložljive posodobitve', _n( '%s update available', '%s updates available', 103, 'wp-tests-domain' ) ); // 3, 4, 103
$this->assertSame( '%s razpoložljivih posodobitev', _n( '%s update available', '%s updates available', 5, 'wp-tests-domain' ) ); // 0, 5, 6
}
/**
* @covers WP_Translation_File::get_plural_form
*/
public function test_get_plural_form() {
$moe = WP_Translation_File::create( DIR_TESTDATA . '/l10n/plural-complex.mo' );
$this->assertSame( 0, $moe->get_plural_form( 1 ) );
$this->assertSame( 0, $moe->get_plural_form( 101 ) );
$this->assertSame( 0, $moe->get_plural_form( 201 ) );
$this->assertSame( 1, $moe->get_plural_form( 2 ) );
$this->assertSame( 1, $moe->get_plural_form( 102 ) );
$this->assertSame( 1, $moe->get_plural_form( 202 ) );
$this->assertSame( 2, $moe->get_plural_form( 3 ) );
$this->assertSame( 2, $moe->get_plural_form( 4 ) );
$this->assertSame( 2, $moe->get_plural_form( 103 ) );
$this->assertSame( 3, $moe->get_plural_form( 0 ) );
$this->assertSame( 3, $moe->get_plural_form( 5 ) );
$this->assertSame( 3, $moe->get_plural_form( 6 ) );
}
/**
* @covers ::translate_plural
*/