You are here

public function LocalePluralFormatTest::testPluralEditDateFormatter in Drupal 9

Same name and namespace in other branches
  1. 8 core/modules/locale/tests/src/Functional/LocalePluralFormatTest.php \Drupal\Tests\locale\Functional\LocalePluralFormatTest::testPluralEditDateFormatter()

Tests plural editing of DateFormatter strings.

File

core/modules/locale/tests/src/Functional/LocalePluralFormatTest.php, line 163

Class

LocalePluralFormatTest
Tests plural handling for various languages.

Namespace

Drupal\Tests\locale\Functional

Code

public function testPluralEditDateFormatter() {

  // Import some .po files with formulas to set up the environment.
  // These will also add the languages to the system.
  $this
    ->importPoFile($this
    ->getPoFileWithSimplePlural(), [
    'langcode' => 'fr',
  ]);

  // Set French as the site default language.
  $this
    ->config('system.site')
    ->set('default_langcode', 'fr')
    ->save();

  // Visit User Info page before updating translation strings. Change the
  // created time to ensure that the we're dealing in seconds and it can't be
  // exactly 1 minute.
  $this->adminUser
    ->set('created', time() - 1)
    ->save();
  $this
    ->drupalGet('user');

  // Member for time should be translated.
  $this
    ->assertSession()
    ->pageTextContains("seconde");
  $path = 'admin/config/regional/translate/';
  $search = [
    'langcode' => 'fr',
    // Limit to only translated strings to ensure that database ordering does
    // not break the test.
    'translation' => 'translated',
  ];
  $this
    ->drupalGet($path);
  $this
    ->submitForm($search, 'Filter');

  // Plural values for the langcode fr.
  $this
    ->assertSession()
    ->pageTextContains('@count seconde');
  $this
    ->assertSession()
    ->pageTextContains('@count secondes');

  // Inject a plural source string to the database. We need to use a specific
  // langcode here because the language will be English by default and will
  // not save our source string for performance optimization if we do not ask
  // specifically for a language.
  \Drupal::translation()
    ->formatPlural(1, '1 second', '@count seconds', [], [
    'langcode' => 'fr',
  ])
    ->render();
  $lid = Database::getConnection()
    ->select('locales_source', 'ls')
    ->fields('ls', [
    'lid',
  ])
    ->condition('source', "1 second" . PoItem::DELIMITER . "@count seconds")
    ->condition('context', '')
    ->execute()
    ->fetchField();

  // Look up editing page for this plural string and check fields.
  $search = [
    'string' => '1 second',
    'langcode' => 'fr',
  ];
  $this
    ->drupalGet('admin/config/regional/translate');
  $this
    ->submitForm($search, 'Filter');

  // Save complete translations for the string in langcode fr.
  $edit = [
    "strings[{$lid}][translations][0]" => '1 seconde updated',
    "strings[{$lid}][translations][1]" => '@count secondes updated',
  ];
  $this
    ->drupalGet($path);
  $this
    ->submitForm($edit, 'Save translations');

  // User interface input for translating seconds should not be duplicated
  $this
    ->assertSession()
    ->pageTextContainsOnce('@count seconds');

  // Member for time should be translated. Change the created time to ensure
  // that the we're dealing in multiple seconds and it can't be exactly 1
  // second or minute.
  $this->adminUser
    ->set('created', time() - 2)
    ->save();
  $this
    ->drupalGet('user');
  $this
    ->assertSession()
    ->pageTextContains("secondes updated");
}