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;
+ }
+
}