View source
<?php
namespace Drupal\Tests\config_translation\Functional;
use Drupal\Component\Utility\Html;
use Drupal\Component\Render\FormattableMarkup;
use Drupal\Core\Language\Language;
use Drupal\Core\Language\LanguageInterface;
use Drupal\Core\Test\AssertMailTrait;
use Drupal\field\Entity\FieldConfig;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\filter\Entity\FilterFormat;
use Drupal\language\Entity\ConfigurableLanguage;
use Drupal\node\Entity\NodeType;
use Drupal\Tests\BrowserTestBase;
class ConfigTranslationUiTest extends BrowserTestBase {
use AssertMailTrait;
protected static $modules = [
'block',
'config_translation',
'config_translation_test',
'contact',
'contact_test',
'contextual',
'entity_test',
'field_test',
'field_ui',
'filter',
'filter_test',
'node',
'views',
'views_ui',
'menu_ui',
];
protected $defaultTheme = 'stark';
protected $langcodes = [
'fr',
'ta',
'tyv',
];
protected $adminUser;
protected $translatorUser;
protected $localeStorage;
protected function setUp() : void {
parent::setUp();
$translator_permissions = [
'translate configuration',
];
$filter_test_format = FilterFormat::load('filter_test');
$filtered_html_format = FilterFormat::load('filtered_html');
$full_html_format = FilterFormat::load('full_html');
$admin_permissions = array_merge($translator_permissions, [
'administer languages',
'administer site configuration',
'link to any page',
'administer contact forms',
'administer filters',
$filtered_html_format
->getPermissionName(),
$full_html_format
->getPermissionName(),
$filter_test_format
->getPermissionName(),
'access site-wide contact form',
'access contextual links',
'administer views',
'administer account settings',
'administer themes',
'bypass node access',
'administer content types',
'translate interface',
]);
$this->translatorUser = $this
->drupalCreateUser($translator_permissions);
$this->adminUser = $this
->drupalCreateUser($admin_permissions);
foreach ($this->langcodes as $langcode) {
ConfigurableLanguage::createFromLangcode($langcode)
->save();
}
$this->localeStorage = $this->container
->get('locale.storage');
$this
->drupalPlaceBlock('local_tasks_block');
$this
->drupalPlaceBlock('page_title_block');
}
public function testSiteInformationTranslationUi() {
$this
->drupalLogin($this->adminUser);
$site_name = 'Name of the site for testing configuration translation';
$site_slogan = 'Site slogan for testing configuration translation';
$site_name_label = 'Site name';
$fr_site_name = 'Nom du site pour tester la configuration traduction';
$fr_site_slogan = 'Slogan du site pour tester la traduction de configuration';
$fr_site_name_label = 'Libellé du champ "Nom du site"';
$translation_base_url = 'admin/config/system/site-information/translate';
$this
->setSiteInformation($site_name, $site_slogan);
$this
->drupalGet('admin/config/system/site-information');
$this
->assertSession()
->linkByHrefExists($translation_base_url);
$this
->drupalGet($translation_base_url);
$this
->clickLink('Edit');
$this
->submitForm([], 'Save configuration');
$this
->assertSession()
->addressEquals($translation_base_url);
$this
->assertSession()
->linkByHrefExists("{$translation_base_url}/fr/add");
$this
->clickLink('Add');
$this
->assertSession()
->pageTextContains($site_name);
$this
->assertSession()
->pageTextContains($site_slogan);
$edit = [
'translation[config_names][system.site][name]' => $fr_site_name,
'translation[config_names][system.site][slogan]' => $fr_site_slogan,
];
$this
->drupalGet("{$translation_base_url}/fr/add");
$this
->submitForm($edit, 'Save translation');
$this
->assertSession()
->pageTextContains('Successfully saved French translation.');
$this
->assertSession()
->linkByHrefNotExists("{$translation_base_url}/fr/add");
$this
->assertSession()
->linkByHrefExists("{$translation_base_url}/fr/edit");
$this
->assertSession()
->linkByHrefExists("{$translation_base_url}/fr/delete");
$this
->drupalGet("{$translation_base_url}/fr/edit");
$this
->assertSession()
->fieldValueEquals('translation[config_names][system.site][name]', $fr_site_name);
$this
->assertSession()
->fieldValueEquals('translation[config_names][system.site][slogan]', $fr_site_slogan);
$this
->drupalPlaceBlock('system_branding_block', [
'region' => 'header',
]);
$this
->drupalGet('fr');
$this
->assertSession()
->pageTextContains($fr_site_name);
$this
->assertSession()
->pageTextContains($fr_site_slogan);
$this
->drupalGet("fr/{$translation_base_url}/fr/edit");
$this
->assertSession()
->pageTextContains($site_name);
$this
->assertSession()
->pageTextContains($site_slogan);
$search = [
'string' => $site_name_label,
'langcode' => 'fr',
'translation' => 'untranslated',
];
$this
->drupalGet('admin/config/regional/translate');
$this
->submitForm($search, 'Filter');
$textarea = $this
->assertSession()
->elementExists('xpath', '//textarea');
$lid = $textarea
->getAttribute('name');
$edit = [
$lid => $fr_site_name_label,
];
$this
->drupalGet('admin/config/regional/translate');
$this
->submitForm($edit, 'Save translations');
$this
->drupalGet("fr/{$translation_base_url}/fr/edit");
$this
->assertSession()
->pageTextContains($fr_site_name_label);
$this
->assertSession()
->pageTextNotContains($site_name_label);
$this
->drupalGet("fr/{$translation_base_url}/ta/edit");
$this
->assertSession()
->pageTextContains($fr_site_name_label);
$this
->assertSession()
->pageTextNotContains($site_name_label);
$this
->drupalGet("{$translation_base_url}/fr/edit");
$this
->assertSession()
->pageTextContains($site_name_label);
$this
->assertSession()
->pageTextNotContains($fr_site_name_label);
}
public function testSourceValueDuplicateSave() {
$this
->drupalLogin($this->adminUser);
$site_name = 'Site name for testing configuration translation';
$site_slogan = 'Site slogan for testing configuration translation';
$translation_base_url = 'admin/config/system/site-information/translate';
$this
->setSiteInformation($site_name, $site_slogan);
$this
->drupalGet($translation_base_url);
$edit = [
'translation[config_names][system.site][name]' => 'FR ' . $site_name,
'translation[config_names][system.site][slogan]' => 'FR ' . $site_slogan,
];
$this
->drupalGet("{$translation_base_url}/fr/add");
$this
->submitForm($edit, 'Save translation');
$override = \Drupal::languageManager()
->getLanguageConfigOverride('fr', 'system.site');
$expected = [
'name' => 'FR ' . $site_name,
'slogan' => 'FR ' . $site_slogan,
];
$this
->assertEquals($expected, $override
->get());
$this
->drupalGet("{$translation_base_url}/fr/edit");
$this
->assertSession()
->pageTextNotContains('FR ' . $site_name);
$this
->assertSession()
->pageTextNotContains('FR ' . $site_slogan);
$edit = [
'translation[config_names][system.site][name]' => $site_name,
'translation[config_names][system.site][slogan]' => 'FR ' . $site_slogan,
];
$this
->submitForm($edit, 'Save translation');
$this
->assertSession()
->pageTextContains('Successfully updated French translation.');
$override = \Drupal::languageManager()
->getLanguageConfigOverride('fr', 'system.site');
$expected = 'FR ' . $site_slogan;
$this
->assertEquals($expected, $override
->get('slogan'));
$this
->drupalGet("{$translation_base_url}/fr/edit");
$this
->assertSession()
->pageTextNotContains('FR ' . $site_slogan);
$edit = [
'translation[config_names][system.site][name]' => $site_name,
'translation[config_names][system.site][slogan]' => $site_slogan,
];
$this
->submitForm($edit, 'Save translation');
$override = \Drupal::languageManager()
->getLanguageConfigOverride('fr', 'system.site');
$this
->assertTrue($override
->isNew());
$this
->drupalLogout();
$this
->drupalLogin($this->translatorUser);
$this
->drupalGet('admin/config/system/site-information');
$this
->assertSession()
->statusCodeEquals(403);
$this
->drupalGet($translation_base_url);
$this
->assertSession()
->linkNotExists('Edit');
$this
->assertSession()
->linkByHrefExists("{$translation_base_url}/fr/add");
}
public function testContactConfigEntityTranslation() {
$this
->drupalLogin($this->adminUser);
$this
->drupalGet('admin/structure/contact');
$this
->assertSession()
->linkByHrefExists('admin/structure/contact/manage/feedback');
$label = 'Send your feedback';
$edit = [
'label' => $label,
'recipients' => 'sales@example.com,support@example.com',
'reply' => 'Thank you for your mail',
];
$this
->drupalGet('admin/structure/contact/manage/feedback');
$this
->submitForm($edit, 'Save');
$translation_base_url = 'admin/structure/contact/manage/feedback/translate';
$this
->assertSession()
->linkByHrefExists($translation_base_url);
$this
->drupalGet('admin/structure/contact/manage/feedback');
$this
->assertSession()
->linkExists('Translate contact form');
$this
->drupalGet('contact/feedback');
$this
->assertSession()
->pageTextContains($label);
foreach ($this->langcodes as $langcode) {
$this
->drupalGet($translation_base_url);
$this
->assertSession()
->linkExists('Translate contact form');
$translation_page_url = "{$translation_base_url}/{$langcode}/add";
$this
->assertSession()
->linkByHrefExists($translation_page_url);
$this
->drupalGet($translation_page_url);
$this
->assertSession()
->pageTextContains($label);
$edit = [
'translation[config_names][contact.form.feedback][label]' => 'Website feedback - ' . $langcode,
'translation[config_names][contact.form.feedback][reply]' => 'Thank you for your mail - ' . $langcode,
];
$this
->drupalGet($translation_page_url);
$this
->submitForm($edit, 'Save translation');
$override = \Drupal::languageManager()
->getLanguageConfigOverride($langcode, 'contact.form.feedback');
$expected = [
'label' => 'Website feedback - ' . $langcode,
'reply' => 'Thank you for your mail - ' . $langcode,
];
$this
->assertEquals($expected, $override
->get());
$this
->assertSession()
->linkByHrefNotExists("{$translation_base_url}/{$langcode}/add");
$this
->assertSession()
->linkByHrefExists("{$translation_base_url}/{$langcode}/edit");
$this
->assertSession()
->linkByHrefExists("{$translation_base_url}/{$langcode}/delete");
$this
->drupalGet($langcode . '/contact/feedback');
$this
->assertSession()
->pageTextContains('Website feedback - ' . $langcode);
$edit = [
'subject[0][value]' => 'Test subject',
'message[0][value]' => 'Test message',
];
$this
->submitForm($edit, 'Send message');
}
foreach ($this->langcodes as $langcode) {
$langcode_prefixes = array_merge([
'',
], $this->langcodes);
foreach ($langcode_prefixes as $langcode_prefix) {
$this
->drupalGet(ltrim("{$langcode_prefix}/{$translation_base_url}/{$langcode}/edit", '/'));
$this
->assertSession()
->fieldValueEquals('translation[config_names][contact.form.feedback][label]', 'Website feedback - ' . $langcode);
$this
->assertSession()
->pageTextContains($label);
}
}
$captured_emails = $this
->getMails();
foreach ($captured_emails as $email) {
if ($email['id'] == 'contact_page_autoreply') {
$this
->assertEquals('Thank you for your mail - ' . $email['langcode'], trim($email['body']));
}
}
foreach ($this->langcodes as $langcode) {
$language = \Drupal::languageManager()
->getLanguage($langcode)
->getName();
$this
->drupalGet("{$translation_base_url}/{$langcode}/delete");
$this
->assertSession()
->pageTextContains("Are you sure you want to delete the {$language} translation of {$label} contact form?");
$this
->assertSession()
->linkByHrefExists($translation_base_url);
$this
->submitForm([], 'Delete');
$this
->assertSession()
->pageTextContains("{$language} translation of {$label} contact form was deleted");
$this
->assertSession()
->linkByHrefExists("{$translation_base_url}/{$langcode}/add");
$this
->assertSession()
->linkByHrefNotExists("translation_base_url/{$langcode}/edit");
$this
->assertSession()
->linkByHrefNotExists("{$translation_base_url}/{$langcode}/delete");
$override = \Drupal::languageManager()
->getLanguageConfigOverride($langcode, 'contact.form.feedback');
$this
->assertTrue($override
->isNew());
}
$this
->drupalLogout();
$this
->drupalLogin($this->translatorUser);
$this
->drupalGet('admin/structure/contact/manage/feedback');
$this
->assertSession()
->statusCodeEquals(403);
$this
->drupalGet($translation_base_url);
$this
->assertSession()
->linkNotExists('Edit');
$this
->assertSession()
->linkByHrefExists("{$translation_base_url}/fr/add");
}
public function testDateFormatTranslation() {
$this
->drupalLogin($this->adminUser);
$this
->drupalGet('admin/config/regional/date-time');
$this
->assertSession()
->linkByHrefExists('admin/config/regional/date-time/formats/manage/medium');
$edit = [
'label' => 'Custom medium date',
'id' => 'custom_medium',
'date_format_pattern' => 'Y. m. d. H:i',
];
$this
->drupalGet('admin/config/regional/date-time/formats/add');
$this
->submitForm($edit, 'Add format');
$formats = [
'medium' => 'Default medium date',
'custom_medium' => 'Custom medium date',
];
foreach ($formats as $id => $label) {
$translation_base_url = 'admin/config/regional/date-time/formats/manage/' . $id . '/translate';
$this
->drupalGet($translation_base_url);
$translation_page_url = "{$translation_base_url}/fr/add";
$this
->assertSession()
->linkByHrefExists($translation_page_url);
$this
->drupalGet($translation_page_url);
$this
->assertSession()
->pageTextContains($label);
$this
->assertSession()
->responseContains('core/modules/system/js/system.date.js');
$edit = [
'translation[config_names][core.date_format.' . $id . '][label]' => $id . ' - FR',
'translation[config_names][core.date_format.' . $id . '][pattern]' => 'D',
];
$this
->drupalGet($translation_page_url);
$this
->submitForm($edit, 'Save translation');
$override = \Drupal::languageManager()
->getLanguageConfigOverride('fr', 'core.date_format.' . $id);
$expected = [
'label' => $id . ' - FR',
'pattern' => 'D',
];
$this
->assertEquals($expected, $override
->get());
$formatted_date = $this->container
->get('date.formatter')
->format(494015820, $id, NULL, 'America/New_York', 'fr');
$this
->assertEquals('Tue', $formatted_date, 'Got the right formatted date using the date format translation pattern.');
}
}
public function testAccountSettingsConfigurationTranslation() {
$this
->drupalLogin($this->adminUser);
$this
->drupalGet('admin/config/people/accounts');
$this
->assertSession()
->linkExists('Translate account settings');
$this
->drupalGet('admin/config/people/accounts/translate');
$this
->assertSession()
->linkExists('Translate account settings');
$this
->assertSession()
->linkByHrefExists('admin/config/people/accounts/translate/fr/add');
$edit = [
'translation[config_names][user.settings][anonymous]' => 'Anonyme',
'translation[config_names][user.mail][status_blocked][subject]' => 'Testing, your account is blocked.',
'translation[config_names][user.mail][status_blocked][body]' => 'Testing account blocked body.',
];
$this
->drupalGet('admin/config/people/accounts/translate/fr/add');
$this
->submitForm($edit, 'Save translation');
$this
->drupalGet('admin/config/people/accounts/translate/fr/edit');
foreach ($edit as $key => $value) {
$this
->assertSession()
->fieldValueEquals($key, $value);
}
$this
->assertSession()
->pageTextContains('Account cancellation confirmation');
$this
->assertSession()
->pageTextContains('Password recovery');
}
public function testSourceAndTargetLanguage() {
$this
->drupalLogin($this->adminUser);
$this
->drupalGet('admin/config/system/site-information/translate/und/add');
$this
->assertSession()
->statusCodeEquals(403);
$this
->drupalGet('admin/config/system/site-information/translate');
$this
->assertSession()
->linkByHrefNotExists('admin/config/system/site-information/translate/en/edit');
$this
->assertSession()
->linkByHrefNotExists('admin/config/system/site-information/translate/en/add');
$this
->assertSession()
->linkByHrefNotExists('admin/config/system/site-information/translate/en/delete');
$this
->assertSession()
->linkByHrefExists('admin/config/system/site-information');
$this
->drupalGet('admin/config/system/site-information/translate/en/add');
$this
->assertSession()
->statusCodeEquals(403);
$this
->drupalGet('admin/config/system/site-information/translate/en/edit');
$this
->assertSession()
->statusCodeEquals(403);
$this
->drupalGet('admin/config/system/site-information/translate/en/delete');
$this
->assertSession()
->statusCodeEquals(403);
$this
->config('system.site')
->set('langcode', LanguageInterface::LANGCODE_NOT_SPECIFIED)
->save();
$this
->drupalGet('admin/config/system/site-information');
$this
->assertSession()
->linkByHrefNotExists('admin/config/system/site-information/translate');
$this
->drupalGet('admin/config/system/site-information/translate');
$this
->assertSession()
->statusCodeEquals(403);
}
public function testViewsTranslationUI() {
$this
->drupalLogin($this->adminUser);
$description = 'All content promoted to the front page.';
$human_readable_name = 'Frontpage';
$display_settings_default = 'Default';
$display_options_default = '(Empty)';
$translation_base_url = 'admin/structure/views/view/frontpage/translate';
$this
->drupalGet($translation_base_url);
$this
->assertSession()
->linkByHrefExists("{$translation_base_url}/fr/add");
$this
->clickLink('Add');
$this
->assertSession()
->pageTextContains($description);
$this
->assertSession()
->pageTextContains($human_readable_name);
$edit = [
'translation[config_names][views.view.frontpage][description]' => $description . " FR",
'translation[config_names][views.view.frontpage][label]' => $human_readable_name . " FR",
'translation[config_names][views.view.frontpage][display][default][display_title]' => $display_settings_default . " FR",
'translation[config_names][views.view.frontpage][display][default][display_options][title]' => $display_options_default . " FR",
];
$this
->drupalGet("{$translation_base_url}/fr/add");
$this
->submitForm($edit, 'Save translation');
$this
->assertSession()
->pageTextContains('Successfully saved French translation.');
$this
->assertSession()
->linkByHrefNotExists("{$translation_base_url}/fr/add");
$this
->assertSession()
->linkByHrefExists("{$translation_base_url}/fr/edit");
$this
->assertSession()
->linkByHrefExists("{$translation_base_url}/fr/delete");
$this
->drupalGet("{$translation_base_url}/fr/edit");
$this
->assertSession()
->fieldValueEquals('translation[config_names][views.view.frontpage][description]', $description . " FR");
$this
->assertSession()
->fieldValueEquals('translation[config_names][views.view.frontpage][label]', $human_readable_name . " FR");
$this
->assertSession()
->fieldValueEquals('translation[config_names][views.view.frontpage][display][default][display_title]', $display_settings_default . " FR");
$this
->assertSession()
->fieldValueEquals('translation[config_names][views.view.frontpage][display][default][display_options][title]', $display_options_default . " FR");
}
public function testPluralConfigStringsSourceElements() {
$this
->drupalLogin($this->adminUser);
$languages = [
'vi' => [
'plurals' => 1,
'expected' => [
TRUE,
FALSE,
FALSE,
FALSE,
],
],
'fr' => [
'plurals' => 2,
'expected' => [
TRUE,
TRUE,
FALSE,
FALSE,
],
],
'sl' => [
'plurals' => 4,
'expected' => [
TRUE,
TRUE,
TRUE,
TRUE,
],
],
];
foreach ($languages as $langcode => $data) {
$name = \Drupal::service('file_system')
->tempnam('temporary://', $langcode . '_') . '.po';
file_put_contents($name, $this
->getPoFile($data['plurals']));
$this
->drupalGet('admin/config/regional/translate/import');
$this
->submitForm([
'langcode' => $langcode,
'files[file]' => $name,
], 'Import');
$config = \Drupal::service('config.factory')
->getEditable('views.view.files');
$config
->set('langcode', $langcode);
$config
->save();
$translation_url = 'admin/structure/views/view/files/translate/en/add';
$this
->drupalGet($translation_url);
foreach ($data['expected'] as $index => $expected) {
if ($expected) {
$this
->assertSession()
->responseContains('edit-source-config-names-viewsviewfiles-display-default-display-options-fields-count-format-plural-string-' . $index);
}
else {
$this
->assertSession()
->responseNotContains('edit-source-config-names-viewsviewfiles-display-default-display-options-fields-count-format-plural-string-' . $index);
}
}
}
}
public function testPluralConfigStrings() {
$this
->drupalLogin($this->adminUser);
$name = \Drupal::service('file_system')
->tempnam('temporary://', "sl_") . '.po';
file_put_contents($name, $this
->getPoFile(4));
$this
->drupalGet('admin/config/regional/translate/import');
$this
->submitForm([
'langcode' => 'sl',
'files[file]' => $name,
], 'Import');
$description = 'Singular form';
$field_value = '1 place';
$field_value_plural = '@count places';
$translation_url = 'admin/structure/views/view/files/translate/sl/add';
$this
->drupalGet($translation_url);
$this
->assertSession()
->pageTextContains($description);
$this
->assertSession()
->fieldValueEquals('translation[config_names][views.view.files][display][default][display_options][fields][count][format_plural_string][0]', $field_value);
$this
->assertSession()
->fieldValueEquals('translation[config_names][views.view.files][display][default][display_options][fields][count][format_plural_string][1]', $field_value_plural);
$this
->assertSession()
->fieldValueEquals('translation[config_names][views.view.files][display][default][display_options][fields][count][format_plural_string][2]', '');
$this
->assertSession()
->fieldValueEquals('translation[config_names][views.view.files][display][default][display_options][fields][count][format_plural_string][3]', '');
$edit = [
'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
->drupalGet($translation_url);
$this
->submitForm($edit, 'Save translation');
$this
->drupalGet($translation_url);
$this
->assertSession()
->fieldValueEquals('translation[config_names][views.view.files][display][default][display_options][fields][count][format_plural_string][0]', "{$field_value} SL");
$this
->assertSession()
->fieldValueEquals('translation[config_names][views.view.files][display][default][display_options][fields][count][format_plural_string][1]', "{$field_value_plural} 1 SL");
$this
->assertSession()
->fieldValueEquals('translation[config_names][views.view.files][display][default][display_options][fields][count][format_plural_string][2]', "{$field_value_plural} 2 SL");
$this
->assertSession()
->fieldValueEquals('translation[config_names][views.view.files][display][default][display_options][fields][count][format_plural_string][3]', "{$field_value_plural} 3 SL");
}
public function testFieldConfigTranslation() {
$field_name = strtolower($this
->randomMachineName());
$field_storage = FieldStorageConfig::create([
'field_name' => $field_name,
'entity_type' => 'entity_test',
'type' => 'test_field',
]);
$translatable_storage_setting = $this
->randomString();
$field_storage
->setSetting('translatable_storage_setting', $translatable_storage_setting);
$field_storage
->save();
$bundle = strtolower($this
->randomMachineName());
entity_test_create_bundle($bundle);
$field = FieldConfig::create([
'field_name' => $field_name,
'entity_type' => 'entity_test',
'bundle' => $bundle,
]);
$translatable_field_setting = $this
->randomString();
$field
->setSetting('translatable_field_setting', $translatable_field_setting);
$field
->save();
$this
->drupalLogin($this->translatorUser);
$this
->drupalGet("/entity_test/structure/{$bundle}/fields/entity_test.{$bundle}.{$field_name}/translate");
$this
->clickLink('Add');
$this
->assertSession()
->pageTextContains('Translatable field setting');
$this
->assertSession()
->assertEscaped($translatable_field_setting);
$this
->assertSession()
->pageTextContains('Translatable storage setting');
$this
->assertSession()
->assertEscaped($translatable_storage_setting);
}
public function testBooleanFieldConfigTranslation() {
$field_name = strtolower($this
->randomMachineName());
FieldStorageConfig::create([
'field_name' => $field_name,
'entity_type' => 'entity_test',
'type' => 'boolean',
])
->save();
$bundle = strtolower($this
->randomMachineName());
entity_test_create_bundle($bundle);
$field = FieldConfig::create([
'field_name' => $field_name,
'entity_type' => 'entity_test',
'bundle' => $bundle,
]);
$on_label = 'On label (with <em>HTML</em> & things)';
$field
->setSetting('on_label', $on_label);
$off_label = 'Off label (with <em>HTML</em> & things)';
$field
->setSetting('off_label', $off_label);
$field
->save();
$this
->drupalLogin($this->translatorUser);
$this
->drupalGet("/entity_test/structure/{$bundle}/fields/entity_test.{$bundle}.{$field_name}/translate");
$this
->clickLink('Add');
$this
->assertSession()
->responseContains(Html::escape(strip_tags($on_label)) . ' Boolean settings');
$this
->assertSession()
->assertEscaped($on_label);
$this
->assertSession()
->assertEscaped($off_label);
}
public function testLocaleDBStorage() {
$this
->config('locale.settings')
->set('translation.import_enabled', TRUE)
->set('translation.use_source', LOCALE_TRANSLATION_USE_SOURCE_LOCAL)
->save();
$this
->drupalLogin($this->adminUser);
$langcode = 'xx';
$name = $this
->randomMachineName(16);
$edit = [
'predefined_langcode' => 'custom',
'langcode' => $langcode,
'label' => $name,
'direction' => Language::DIRECTION_LTR,
];
$this
->drupalGet('admin/config/regional/language/add');
$this
->submitForm($edit, 'Add custom language');
$translation = $this
->getTranslation('user.settings', 'anonymous', 'fr');
$this
->assertTrue(empty($translation));
$edit = [
'translation[config_names][user.settings][anonymous]' => 'Anonyme',
];
$this
->drupalGet('admin/config/people/accounts/translate/fr/add');
$this
->submitForm($edit, 'Save translation');
$translation = $this
->getTranslation('user.settings', 'anonymous', 'fr');
$this
->assertEquals('Anonyme', $translation
->getString());
$edit = [
'translation[config_names][user.settings][anonymous]' => 'Anonymous',
];
$this
->drupalGet('admin/config/people/accounts/translate/fr/edit');
$this
->submitForm($edit, 'Save translation');
$translation = $this
->getTranslation('user.settings', 'anonymous', 'fr');
$this
->assertEquals('Anonymous', $translation
->getString());
}
public function testSingleLanguageUI() {
$this
->drupalLogin($this->adminUser);
$this
->drupalGet('admin/config/regional/language/delete/fr');
$this
->submitForm([], 'Delete');
$this
->assertSession()
->pageTextContains('The French (fr) language has been removed.');
$edit = [
'site_default_language' => 'ta',
];
$this
->drupalGet('admin/config/regional/language');
$this
->submitForm($edit, 'Save configuration');
$this
->assertSession()
->pageTextContains('Configuration saved.');
$this
->drupalGet('admin/config/regional/language/delete/en');
$this
->submitForm([], 'Delete');
$this
->assertSession()
->pageTextContains('The English (en) language has been removed.');
$this
->drupalGet('admin/config/people/accounts/translate');
$this
->assertSession()
->statusCodeEquals(200);
}
public function testAlterInfo() {
$this
->drupalLogin($this->adminUser);
$this->container
->get('state')
->set('config_translation_test_config_translation_info_alter', TRUE);
$this->container
->get('plugin.manager.config_translation.mapper')
->clearCachedDefinitions();
$this
->drupalGet('admin/config/people/accounts/translate/fr/add');
$this
->assertSession()
->pageTextContains('Name');
$this
->assertSession()
->pageTextNotContains('Account cancellation confirmation');
$this
->assertSession()
->pageTextNotContains('Password recovery');
}
public function testSequenceTranslation() {
$this
->drupalLogin($this->adminUser);
$config_factory = $this->container
->get('config.factory');
$expected = [
'kitten',
'llama',
'elephant',
];
$actual = $config_factory
->getEditable('config_translation_test.content')
->get('animals');
$this
->assertEquals($expected, $actual);
$edit = [
'translation[config_names][config_translation_test.content][content][value]' => '<p><strong>Hello World</strong> - FR</p>',
'translation[config_names][config_translation_test.content][animals][0]' => 'kitten - FR',
'translation[config_names][config_translation_test.content][animals][1]' => 'llama - FR',
'translation[config_names][config_translation_test.content][animals][2]' => 'elephant - FR',
];
$this
->drupalGet('admin/config/media/file-system/translate/fr/add');
$this
->submitForm($edit, 'Save translation');
$this->container
->get('language.config_factory_override')
->setLanguage(new Language([
'id' => 'fr',
]));
$expected = [
'kitten - FR',
'llama - FR',
'elephant - FR',
];
$actual = $config_factory
->get('config_translation_test.content')
->get('animals');
$this
->assertEquals($expected, $actual);
}
public function testTextFormatTranslation() {
$this
->drupalLogin($this->adminUser);
$config_factory = $this->container
->get('config.factory');
$expected = [
'value' => '<p><strong>Hello World</strong></p>',
'format' => 'plain_text',
];
$actual = $config_factory
->get('config_translation_test.content')
->getOriginal('content', FALSE);
$this
->assertEquals($expected, $actual);
$translation_base_url = 'admin/config/media/file-system/translate';
$this
->drupalGet($translation_base_url);
$translation_page_url = "{$translation_base_url}/fr/add";
$this
->assertSession()
->linkByHrefExists($translation_page_url);
$this
->drupalGet($translation_page_url);
$this
->assertSession()
->fieldNotExists('translation[config_names][config_translation_test.content][content][format]');
$edit = [
'translation[config_names][config_translation_test.content][content][value]' => '<p><strong>Hello World</strong> - FR</p>',
];
$this
->drupalGet($translation_page_url);
$this
->submitForm($edit, 'Save translation');
$expected = [
'value' => '<p><strong>Hello World</strong> - FR</p>',
'format' => 'plain_text',
];
$this->container
->get('language.config_factory_override')
->setLanguage(new Language([
'id' => 'fr',
]));
$actual = $config_factory
->get('config_translation_test.content')
->get('content');
$this
->assertEquals($expected, $actual);
$config_factory
->getEditable('config_translation_test.content')
->set('content.format', 'full_html')
->save();
$actual = $config_factory
->get('config_translation_test.content')
->get('content');
$this
->assertEquals($expected, $actual);
$translation_page_url = "{$translation_base_url}/fr/edit";
$this
->drupalLogin($this->translatorUser);
$this
->drupalGet($translation_page_url);
$this
->assertDisabledTextarea('edit-translation-config-names-config-translation-testcontent-content-value');
$this
->submitForm([], 'Save translation');
$actual = $config_factory
->get('config_translation_test.content')
->get('content');
$this
->assertEquals($expected, $actual);
$this
->drupalLogin($this->adminUser);
$edit = [
'translation[config_names][config_translation_test.content][content][format]' => 'full_html',
];
$this
->drupalGet($translation_page_url);
$this
->submitForm($edit, 'Save translation');
$expected = [
'value' => '<p><strong>Hello World</strong> - FR</p>',
'format' => 'full_html',
];
$actual = $config_factory
->get('config_translation_test.content')
->get('content');
$this
->assertEquals($expected, $actual);
}
public function testNodeFieldTranslation() {
NodeType::create([
'type' => 'article',
'name' => 'Article',
])
->save();
$field_name = 'translatable_field';
$field_storage = FieldStorageConfig::create([
'field_name' => $field_name,
'entity_type' => 'node',
'type' => 'text',
]);
$field_storage
->setSetting('translatable_storage_setting', 'translatable_storage_setting');
$field_storage
->save();
$field = FieldConfig::create([
'field_name' => $field_name,
'entity_type' => 'node',
'bundle' => 'article',
]);
$field
->save();
$this
->drupalLogin($this->translatorUser);
$this
->drupalGet("/entity_test/structure/article/fields/node.article.{$field_name}/translate");
$this
->clickLink('Add');
$form_values = [
'translation[config_names][field.field.node.article.translatable_field][description]' => 'FR Help text.',
'translation[config_names][field.field.node.article.translatable_field][label]' => 'FR label',
];
$this
->submitForm($form_values, 'Save translation');
$this
->assertSession()
->pageTextContains('Successfully saved French translation.');
$this
->clickLink('Add');
$this
->assertSession()
->responseContains('FR label');
}
public function testMenuTranslationWithoutChange() {
$this
->drupalLogin($this->adminUser);
$this
->drupalGet('admin/structure/menu/manage/main/translate/tyv/add');
$this
->submitForm([], 'Save translation');
$this
->assertSession()
->pageTextContains('Tuvan translation was not added. To add a translation, you must modify the configuration.');
$this
->drupalGet('admin/structure/menu/manage/main/translate/tyv/add');
$edit = [
'translation[config_names][system.menu.main][label]' => 'Main navigation Translation',
'translation[config_names][system.menu.main][description]' => 'Site section links Translation',
];
$this
->submitForm($edit, 'Save translation');
$this
->assertSession()
->pageTextContains('Successfully saved Tuvan translation.');
}
protected function getTranslation($config_name, $key, $langcode) {
$settings_locations = $this->localeStorage
->getLocations([
'type' => 'configuration',
'name' => $config_name,
]);
$this
->assertTrue(!empty($settings_locations), new FormattableMarkup('Configuration locations found for %config_name.', [
'%config_name' => $config_name,
]));
if (!empty($settings_locations)) {
$source = $this->container
->get('config.factory')
->get($config_name)
->get($key);
$source_string = $this->localeStorage
->findString([
'source' => $source,
'type' => 'configuration',
]);
$this
->assertTrue(!empty($source_string), new FormattableMarkup('Found string for %config_name.%key.', [
'%config_name' => $config_name,
'%key' => $key,
]));
if (!empty($source_string)) {
$conditions = [
'lid' => $source_string->lid,
'language' => $langcode,
];
$translations = $this->localeStorage
->getTranslations($conditions + [
'translated' => TRUE,
]);
return reset($translations);
}
}
return FALSE;
}
protected function setSiteInformation($site_name, $site_slogan) {
$edit = [
'site_name' => $site_name,
'site_slogan' => $site_slogan,
];
$this
->drupalGet('admin/config/system/site-information');
$this
->submitForm($edit, 'Save configuration');
$this
->assertSession()
->pageTextContains('The configuration options have been saved.');
}
protected function renderContextualLinks($ids, $current_path) {
$post = [];
for ($i = 0; $i < count($ids); $i++) {
$post['ids[' . $i . ']'] = $ids[$i];
}
return $this
->drupalPostWithFormat('contextual/render', 'json', $post, [
'query' => [
'destination' => $current_path,
],
]);
}
protected function assertDisabledTextarea($id) {
$textarea = $this
->assertSession()
->fieldDisabled($id);
$this
->assertSame('textarea', $textarea
->getTagName());
$this
->assertSame('This field has been disabled because you do not have sufficient permissions to edit it.', $textarea
->getText());
$select_id = str_replace('value', 'format--2', $id);
$xpath = $this
->assertSession()
->buildXPathQuery('//select[@id=:id]', [
':id' => $select_id,
]);
$this
->assertSession()
->elementNotExists('xpath', $xpath);
}
public function getPoFile($plurals) {
$po_file = [];
$po_file[1] = <<<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=1; plural=0;\\n"
EOF;
$po_file[2] = <<<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=2; plural=(n>1);\\n"
EOF;
$po_file[4] = <<<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;
return $po_file[$plurals];
}
}