diff --git a/core/modules/config_translation/src/FormElement/FormElementBase.php b/core/modules/config_translation/src/FormElement/FormElementBase.php index e13cc31..7db01e1 100644 --- a/core/modules/config_translation/src/FormElement/FormElementBase.php +++ b/core/modules/config_translation/src/FormElement/FormElementBase.php @@ -91,7 +91,6 @@ public function getTranslationBuild(LanguageInterface $source_language, Language * A render array for the source value. */ protected function getSourceElement(LanguageInterface $source_language, $source_config) { - // @todo Should support singular+plurals https://www.drupal.org/node/2454829 if ($source_config) { $value = '' . nl2br($source_config) . ''; } @@ -162,7 +161,6 @@ protected function getSourceElement(LanguageInterface $source_language, $source_ */ protected function getTranslationElement(LanguageInterface $translation_language, $source_config, $translation_config) { // Add basic properties that apply to all form elements. - // @todo Should support singular+plurals https://www.drupal.org/node/2454829 return array( '#title' => $this->t('!label (!source_language)', array( '!label' => $this->t($this->definition['label']), diff --git a/core/modules/config_translation/src/FormElement/PluralString.php b/core/modules/config_translation/src/FormElement/PluralString.php index da216ee..15d88dc 100644 --- a/core/modules/config_translation/src/FormElement/PluralString.php +++ b/core/modules/config_translation/src/FormElement/PluralString.php @@ -7,12 +7,14 @@ namespace Drupal\config_translation\FormElement; +use Drupal\Component\Utility\SafeMarkup; use Drupal\Core\Config\Config; use Drupal\Core\Language\LanguageInterface; use Drupal\language\Config\LanguageConfigOverride; /** - * Defines the plural string textfield elements for the configuration translation interface. + * Defines the plural string textfield elements for the configuration + * translation interface. */ class PluralString extends FormElementBase { @@ -29,11 +31,11 @@ protected function getSourceElement(LanguageInterface $source_language, $source_ for ($i = 0; $i < 2; $i++) { $element[] = array( '#type' => 'item', - '#title' => $this->t('!label (!source_language)', array( - '!label' => ($i == 0 ? 'Singular form' : 'Plural form'), - '!source_language' => $source_language->getName(), + '#title' => $this->t('@label (@source_language)', array( + '@label' => ($i == 0 ? 'Singular form' : 'Plural form'), + '@source_language' => $source_language->getName(), )), - '#markup' => '' . nl2br($values[$i]) . '', + '#markup' => '' . SafeMarkup::format($values[$i]) . '', ); } return $element; @@ -51,13 +53,13 @@ protected function getTranslationElement(LanguageInterface $translation_language '#tree' => TRUE, ); for ($i = 0; $i < $plurals; $i++) { - $element[$i] = array( + $element[] = array( '#type' => 'textfield', - '#title' => $this->t('!label (!source_language)', array( - '!label' => ($i == 0 ? $this->t('Singular form') : $this->formatPlural($i, 'First plural form', '@count. plural form')), - '!source_language' => $translation_language->getName(), + '#title' => $this->t('@label (@source_language)', array( + '@label' => ($i == 0 ? $this->t('Singular form') : $this->formatPlural($i, 'First plural form', '@count. plural form')), + '@source_language' => $translation_language->getName(), )), - '#default_value' => $values[$i], + '#default_value' => isset($values[$i]) ? $values[$i] : '', '#attributes' => array('lang' => $translation_language->getId()), ); } diff --git a/core/modules/config_translation/src/Tests/ConfigTranslationUiTest.php b/core/modules/config_translation/src/Tests/ConfigTranslationUiTest.php index dac68fd..252da22 100644 --- a/core/modules/config_translation/src/Tests/ConfigTranslationUiTest.php +++ b/core/modules/config_translation/src/Tests/ConfigTranslationUiTest.php @@ -89,6 +89,7 @@ protected function setUp() { 'administer themes', 'bypass node access', 'administer content types', + 'translate interface', ] ); // Create and login user. @@ -607,32 +608,51 @@ public function testViewsTranslationUI() { } /** - * Test translation of plural strings in config. + * Test translation of plural strings with multiple plural forms in config. */ public function testPluralConfigStrings() { $this->drupalLogin($this->adminUser); + // First import a .po file with multiple plural forms. + // This will also automatically add the 'sl' language. + $name = tempnam('temporary://', "sl_") . '.po'; + file_put_contents($name, $this->getPoFile()); + $this->drupalPostForm('admin/config/regional/translate/import', array( + 'langcode' => 'sl', + 'files[file]' => $name, + ), t('Import')); + drupal_unlink($name); + // Translate the files view, as this one uses numeric formatters. $description = 'Singular form'; $field_value = '1 place'; $field_value_plural = '@count places'; - $translation_url = 'admin/structure/views/view/files/translate/fr/add'; + $translation_url = 'admin/structure/views/view/files/translate/sl/add'; $this->drupalGet($translation_url); - // Make sure original text is present on this page. + // Make sure original text is present on this page, in addition to 2 new + // empty fields. $this->assertRaw($description); $this->assertFieldByName('translation[config_names][views.view.files][display][default][display_options][fields][count][format_plural_string][0]', $field_value); $this->assertFieldByName('translation[config_names][views.view.files][display][default][display_options][fields][count][format_plural_string][1]', $field_value_plural); + $this->assertFieldByName('translation[config_names][views.view.files][display][default][display_options][fields][count][format_plural_string][2]', ''); + $this->assertFieldByName('translation[config_names][views.view.files][display][default][display_options][fields][count][format_plural_string][3]', ''); + // Then make sure it also works. $edit = [ - 'translation[config_names][views.view.files][display][default][display_options][fields][count][format_plural_string][0]' => $field_value . ' FR', - 'translation[config_names][views.view.files][display][default][display_options][fields][count][format_plural_string][1]' => $field_value_plural . ' FR', + 'translation[config_names][views.view.files][display][default][display_options][fields][count][format_plural_string][0]' => $field_value . ' SL', + 'translation[config_names][views.view.files][display][default][display_options][fields][count][format_plural_string][1]' => $field_value_plural . ' 1 SL', + 'translation[config_names][views.view.files][display][default][display_options][fields][count][format_plural_string][2]' => $field_value_plural . ' 2 SL', + 'translation[config_names][views.view.files][display][default][display_options][fields][count][format_plural_string][3]' => $field_value_plural . ' 3 SL', ]; $this->drupalPostForm($translation_url, $edit, t('Save translation')); - // Make sure the values has changed. + + // Make sure the values have changed. $this->drupalGet($translation_url); - $this->assertFieldByName('translation[config_names][views.view.files][display][default][display_options][fields][count][format_plural_string][0]', "$field_value FR"); - $this->assertFieldByName('translation[config_names][views.view.files][display][default][display_options][fields][count][format_plural_string][1]', "$field_value_plural FR"); + $this->assertFieldByName('translation[config_names][views.view.files][display][default][display_options][fields][count][format_plural_string][0]', "$field_value SL"); + $this->assertFieldByName('translation[config_names][views.view.files][display][default][display_options][fields][count][format_plural_string][1]', "$field_value_plural 1 SL"); + $this->assertFieldByName('translation[config_names][views.view.files][display][default][display_options][fields][count][format_plural_string][2]', "$field_value_plural 2 SL"); + $this->assertFieldByName('translation[config_names][views.view.files][display][default][display_options][fields][count][format_plural_string][3]', "$field_value_plural 3 SL"); } /** @@ -962,4 +982,19 @@ protected function assertDisabledTextarea($id) { ))); } + /** + * Helper function that returns a .po file with multiple plural forms. + */ + public function getPoFile() { + return <<< EOF +msgid "" +msgstr "" +"Project-Id-Version: Drupal 8\\n" +"MIME-Version: 1.0\\n" +"Content-Type: text/plain; charset=UTF-8\\n" +"Content-Transfer-Encoding: 8bit\\n" +"Plural-Forms: nplurals=4; plural=(((n%100)==1)?(0):(((n%100)==2)?(1):((((n%100)==3)||((n%100)==4))?(2):3)));\\n" +EOF; + } + }