diff --git a/core/modules/config_translation/config_translation.api.php b/core/modules/config_translation/config_translation.api.php index e6ca187..8878c34 100644 --- a/core/modules/config_translation/config_translation.api.php +++ b/core/modules/config_translation/config_translation.api.php @@ -34,9 +34,9 @@ function hook_config_translation_group_info() { $items[] = new ConfigGroupMapper('admin/config/development/otherconfig', t('My module additional settings'), array('mymodule.other_key', 'mymodule.yet_another_key'), MENU_LOCAL_TASK, TRUE); // Provide menu path with path position for entity placeholder, entity - // machine name, title with @label placeholder for the entity and config name - // prefix for storage. Optionally provide the created menu item type and - // whether to include an additional edit tab. + // machine name, title with @label placeholder for the entity and + // configuration name prefix for storage. Optionally provide the created menu + // item type and whether to include an additional edit tab. $items[] = new ConfigEntityMapper('admin/config/development/myconfig/list/%myentity', 5, 'myentity', t('@label my entity'), 'myentity.entity'); return $items; } diff --git a/core/modules/config_translation/config_translation.module b/core/modules/config_translation/config_translation.module index 0960018..cf17244 100644 --- a/core/modules/config_translation/config_translation.module +++ b/core/modules/config_translation/config_translation.module @@ -72,36 +72,12 @@ function config_translation_theme() { return array( 'config_translation_manage_form_element' => array( 'render element' => 'element', + 'template' => 'config_translation_manage_form_element', ), ); } /** - * Returns HTML for translation manage element. - * - * @param array $variables - * An associative array containing: - * - element: The element that contains the source and translation childs - * - * @see ConfigTranslationManageForm::buildConfigForm - * @ingroup themeable - */ -function theme_config_translation_manage_form_element($variables){ - $element = $variables['element']; - $result = ' -
-
- ' . drupal_render($element['source']) . ' -
-
- ' . drupal_render($element['translation']) . ' -
-
- '; - return $result; -} - -/** * Returns TRUE if a configuration key has schema coverage. * * @param string $name @@ -173,7 +149,7 @@ function config_translation_original_langcode($name) { } /** - * Checks whether a language has config translation. + * Checks whether a language has configuration translation. * * @param string $name * Configuration name. @@ -181,7 +157,7 @@ function config_translation_original_langcode($name) { * A language object. * * @return bool - * A boolean indicating if a language has config translations. + * A boolean indicating if a language has configuration translations. */ function config_translation_exists($name, Language $language) { $config_translation = config('locale.config.' . $language->id . '.' . $name)->get(); @@ -228,18 +204,48 @@ function config_translation_config_translation_group_info() { // Contact. $items[] = new ConfigEntityMapper('admin/structure/contact/manage/{contact_category}', 'contact_category', t('@label contact category')); + // Content types. + $items[] = new ConfigEntityMapper('admin/structure/types/manage/{node_type}', 'node_type', t('@label content type'), MENU_CALLBACK); + + // Date format. + $items[] = new ConfigEntityMapper('admin/config/regional/date-time/formats/manage/{date_format}', 'date_format', t('@label date format')); + + // Fields. + $entity_manager = Drupal::entityManager(); + foreach ($entity_manager->getDefinitions() as $entity_type => $entity_info) { + // Make sure entity type is fieldable and has base path. + if ($entity_info['fieldable'] && isset($entity_info['route_base_path'])) { + // Get all available bundles available for this entity type. + foreach (entity_get_bundles($entity_type) as $bundle => $bundle_info) { + if ($path = $entity_manager->getAdminPath($entity_type, $bundle)) { + $items[] = new ConfigEntityMapper($path . '/fields/{field_instance}' , 'field_instance', t('@label field'), MENU_CALLBACK); + } + } + } + } + // Filter. $items[] = new ConfigEntityMapper('admin/config/content/formats/manage/{filter_format}', 'filter_format', t('@label text format'), MENU_LOCAL_TASK, TRUE); + // Images. + $items[] = new ConfigEntityMapper('admin/config/media/image-styles/manage/{image_style}', 'image_style', t('@label image style'), MENU_LOCAL_TASK); + + // Language. + $items[] = new ConfigEntityMapper('admin/config/regional/language/edit/{language_entity}', 'language_entity', t('@label language'), MENU_CALLBACK); + // Menu. $items[] = new ConfigEntityMapper('admin/structure/menu/manage/{menu}', 'menu', t('@label menu')); + // Picture. + $items[] = new ConfigEntityMapper('admin/config/media/picturemapping/{picture_mapping}', 'picture_mapping', t('@label picture mapping'), MENU_LOCAL_TASK); + // Shortcut. - $items[] = new ConfigEntityMapper('admin/config/user-interface/shortcut/manage/{shortcut}', 'shortcut', t('@label shortcut set')); + $items[] = new ConfigEntityMapper('admin/config/user-interface/shortcut/manage/{shortcut_set}', 'shortcut_set', t('@label shortcut set')); // System. $items[] = new ConfigGroupMapper('admin/config/development/maintenance', t('System maintenance'), array('system.maintenance'), MENU_LOCAL_TASK, TRUE); $items[] = new ConfigGroupMapper('admin/config/system/site-information', t('Site information'), array('system.site'), MENU_LOCAL_TASK, TRUE); + $items[] = new ConfigGroupMapper('admin/config/services/rss-publishing', t('RSS publishing'), array('system.rss'), MENU_LOCAL_TASK, TRUE); // Taxonomy. $items[] = new ConfigEntityMapper('admin/structure/taxonomy/manage/{taxonomy_vocabulary}', 'taxonomy_vocabulary', t('@label vocabulary')); @@ -251,23 +257,6 @@ function config_translation_config_translation_group_info() { // Views. $items[] = new ConfigEntityMapper('admin/structure/views/view/{view}', 'view', t('@label view'), MENU_CALLBACK); - // Language. - $items[] = new ConfigEntityMapper('admin/config/regional/language/edit/{language_entity}', 'language_entity', t('@label view'), MENU_CALLBACK); - - // Fields. - $entity_manager = Drupal::entityManager(); - foreach ($entity_manager->getDefinitions() as $entity_type => $entity_info) { - // Make sure entity type is fieldable and has base path. - if ($entity_info['fieldable'] && isset($entity_info['route_base_path'])) { - // Get all available bundles available for this entity type. - foreach (entity_get_bundles($entity_type) as $bundle => $bundle_info) { - if ($path = $entity_manager->getAdminPath($entity_type, $bundle)) { - $items[] = new ConfigEntityMapper($path . '/fields/{field_instance}' , 'field_instance', t('@label field'), MENU_CALLBACK); - } - } - } - } - return $items; } @@ -285,28 +274,3 @@ function config_translation_entity_operation_alter(array &$operations, \Drupal\C ); } } - -/** - * Alters form operations since there is no operations API. - * - * @todo Rework this in favor of an operations API. See - * http://drupal.org/node/2004428 - */ -function config_translation_form_alter(&$form, &$form_state, $form_id) { - if (!user_access('translate configuration')) { - // Do not alter forms with links to translations, if no access. - return; - } - - // Alter the blocks form to add translation links. - if ($form_id == 'block_admin_display_form') { - foreach ($form['blocks'] as $id => &$block) { - if (is_array($block) && isset($block['operations'])) { - $block['operations']['#links']['translate'] = array( - 'title' => t('Translate'), - 'href' => 'admin/structure/block/manage/' . $id . '/translate', - ); - } - } - } -} diff --git a/core/modules/config_translation/lib/Drupal/config_translation/Access/ConfigNameCheck.php b/core/modules/config_translation/lib/Drupal/config_translation/Access/ConfigNameCheck.php index 5281883..e068181 100644 --- a/core/modules/config_translation/lib/Drupal/config_translation/Access/ConfigNameCheck.php +++ b/core/modules/config_translation/lib/Drupal/config_translation/Access/ConfigNameCheck.php @@ -12,7 +12,7 @@ use Symfony\Component\HttpFoundation\Request; /** - * Checks access for displaying config translation page. + * Checks access for displaying configuration translation page. */ class ConfigNameCheck implements AccessCheckInterface { @@ -38,11 +38,10 @@ public function access(Route $route, Request $request) { $language = language_load($request->query->get('langcode')); } - // Only allow access to translate configuration, if proper permissions are // granted, the configuration has translatable pieces, the source language // and target language are not locked, and the target language is not the - // original submission language. Although technically config can be + // original submission language. Although technically configuration can be // overlayed with translations in the same language, that is logically not // a good idea. return ( diff --git a/core/modules/config_translation/lib/Drupal/config_translation/ConfigEntityMapper.php b/core/modules/config_translation/lib/Drupal/config_translation/ConfigEntityMapper.php index 69bf07c..bed5a50 100644 --- a/core/modules/config_translation/lib/Drupal/config_translation/ConfigEntityMapper.php +++ b/core/modules/config_translation/lib/Drupal/config_translation/ConfigEntityMapper.php @@ -108,9 +108,9 @@ public function getMenuItemType() { * {@inheritdoc} */ public function getConfigGroup($arg = NULL) { - // In this implementation, $arg is the config entity loaded via the menu - // (for contact module for example) or a string (config entity ID), in - // which case we need to load the entity (for views for example). + // In this implementation, $arg is the configuration entity loaded via the + // menu (for contact module for example) or a string (configuration entity + // ID), in which case we need to load the entity (for views for example). if (!isset($arg)) { return NULL; } @@ -127,7 +127,7 @@ public function getConfigGroup($arg = NULL) { // Replace entity label in template title. $title = format_string($this->title, array('@label' => $entity->label())); - // The list of config IDs belonging to this entity. + // The list of configuration IDs belonging to this entity. $entity_type_info = entity_get_info($this->entityType); $names = array($entity_type_info['config_prefix'] . '.' . $entity->id()); diff --git a/core/modules/config_translation/lib/Drupal/config_translation/ConfigGroupMapper.php b/core/modules/config_translation/lib/Drupal/config_translation/ConfigGroupMapper.php index 3d993c0..44c83aa 100644 --- a/core/modules/config_translation/lib/Drupal/config_translation/ConfigGroupMapper.php +++ b/core/modules/config_translation/lib/Drupal/config_translation/ConfigGroupMapper.php @@ -126,7 +126,7 @@ public function getMenuItemType() { * {@inheritdoc} */ public function getConfigGroup($arg = NULL) { - // This is already a config group. + // This is a ConfigGroupMapper already. return $this; } diff --git a/core/modules/config_translation/lib/Drupal/config_translation/Controller/ConfigTranslationController.php b/core/modules/config_translation/lib/Drupal/config_translation/Controller/ConfigTranslationController.php index a3f601f..bf07df0 100644 --- a/core/modules/config_translation/lib/Drupal/config_translation/Controller/ConfigTranslationController.php +++ b/core/modules/config_translation/lib/Drupal/config_translation/Controller/ConfigTranslationController.php @@ -18,7 +18,7 @@ use Symfony\Component\HttpFoundation\Request; /** - * Provides page callbacks for the config translation interface. + * Provides page callbacks for the configuration translation interface. */ class ConfigTranslationController implements ControllerInterface { @@ -166,7 +166,7 @@ public function itemTranslatePage(Request $request, $action, ConfigMapperInterfa break; } - // Make sure we are in the override free config context. For example, + // Make sure we are in the override free configuration context. For example, // visiting the configuration page in another language would make those // language overrides active by default. But we need the original values. config_context_enter('config.context.free'); @@ -202,7 +202,7 @@ public function itemDeletePage(Request $request, ConfigMapperInterface $mapper) } /** - * Gets the config group. + * Gets the configuration group. * * @param \Symfony\Component\HttpFoundation\Request $request * Page request object. @@ -210,7 +210,7 @@ public function itemDeletePage(Request $request, ConfigMapperInterface $mapper) * Configuration mapper. * * @return \Drupal\config_translation\ConfigGroupMapper - * The config group. + * The configuration group. */ protected function getConfigGroup(Request $request, ConfigMapperInterface $mapper) { // Get configuration group for this mapper. diff --git a/core/modules/config_translation/lib/Drupal/config_translation/Form/ConfigTranslationDeleteForm.php b/core/modules/config_translation/lib/Drupal/config_translation/Form/ConfigTranslationDeleteForm.php index a4c9905..a1d647b 100644 --- a/core/modules/config_translation/lib/Drupal/config_translation/Form/ConfigTranslationDeleteForm.php +++ b/core/modules/config_translation/lib/Drupal/config_translation/Form/ConfigTranslationDeleteForm.php @@ -14,19 +14,19 @@ use Symfony\Component\Routing\Route; /** - * Builds a form to delete config translation. + * Builds a form to delete configuration translation. */ class ConfigTranslationDeleteForm extends ConfirmFormBase { /** - * The group of config translation to be deleted. + * The group of configuration translation to be deleted. * * @var \Drupal\config_translation\ConfigMapperInterface */ protected $group; /** - * The language of config translation. + * The language of configuration translation. * * @var \Drupal\Core\Language\Language */ @@ -78,7 +78,7 @@ public function submitForm(array &$form, array &$form_state) { $storage->delete('locale.config.' . $this->language->id . '.' . $name); } // @todo Do we need to flush caches with drupal_flush_all_caches()? The - // config change may affect page display. + // configuration change may affect page display. drupal_set_message(t('@language translation of %label was deleted', array('%label' => $this->group->getTitle(), '@language' => $this->language->name))); $form_state['redirect'] = $this->group->getBasePath() . '/translate'; diff --git a/core/modules/config_translation/lib/Drupal/config_translation/Form/ConfigTranslationManageForm.php b/core/modules/config_translation/lib/Drupal/config_translation/Form/ConfigTranslationManageForm.php index 6c74162..bad96f3 100644 --- a/core/modules/config_translation/lib/Drupal/config_translation/Form/ConfigTranslationManageForm.php +++ b/core/modules/config_translation/lib/Drupal/config_translation/Form/ConfigTranslationManageForm.php @@ -77,11 +77,11 @@ public function getFormID() { * language. * * @param \Drupal\config_translation\ConfigMapperInterface $group - * The config group the form is being built for. + * The configuration group the form is being built for. * @param Language $language * The language the form is adding or editing. * @param array $base_config_data - * The base config in the source language. + * The base configuration in the source language. */ public function buildForm(array $form, array &$form_state, ConfigMapperInterface $group = NULL, Language $language = NULL, array $base_config_data = NULL) { $this->group = $group; @@ -119,14 +119,14 @@ public function submitForm(array &$form, array &$form_state) { config_context_enter('config.context.free'); foreach ($this->group->getNames() as $id => $name) { - // Set config values based on form submission and source values. + // Set configuration values based on form submission and source values. $base_config = config($name); $translation_config = config('locale.config.' . $this->language->id . '.' . $name); $locations = $this->localeStorage->getLocations(array('type' => 'configuration', 'name' => $name)); $this->setConfig($this->language, $base_config, $translation_config, $form_values[$id], !empty($locations)); - // If no overrides, delete language specific config file. + // If no overrides, delete language specific configuration file. $saved_config = $translation_config->get(); if (empty($saved_config)) { $translation_config->delete(); @@ -219,7 +219,7 @@ protected function buildConfigForm($schema, $config_data, $base_config_data, $co ); $build[$element_key]['source'] = array( '#markup' => $base_config_data[$key] ? ('' . nl2br($base_config_data[$key] . '')) : t('(Empty)'), - '#title' => t($definition['label']) . ' ('. $this->sourceLanguage->name . ')', + '#title' => t($definition['label']) . ' ('. $this->sourceLanguage->name . ')', '#type' => 'item', ); @@ -231,7 +231,7 @@ protected function buildConfigForm($schema, $config_data, $base_config_data, $co $build[$element_key]['translation'] = array( '#type' => $this->getFormElementType($definition['type']), '#default_value' => $value, - '#title' => t($definition['label']) . ' (' . $this->language->name . ')', + '#title' => t($definition['label']) . ' (' . $this->language->name . ')', '#rows' => $rows, '#attributes' => array('lang' => $this->language->id), ); @@ -244,7 +244,7 @@ protected function buildConfigForm($schema, $config_data, $base_config_data, $co * Sets configuration based on a nested form value array. * * @param \Drupal\Core\Language\Language $language - * Set the config in this language. + * Set the configuration in this language. * @param \Drupal\Core\Config\Config $base_config * Base configuration values, in the source language. * @param \Drupal\Core\Config\Config $translation_config @@ -273,9 +273,9 @@ protected function setConfig(Language $language, Config $base_config, Config $tr } else { - // If the config file being translated was originally shipped, we should - // update the locale translation storage. The string should already be - // there, but we make sure to check. + // If the configuration file being translated was originally shipped, we + // should update the locale translation storage. The string should + // already be there, but we make sure to check. if ($shipped_config && $source_string = $this->localeStorage->findString(array('source' => $base_config->get($key)))) { // Get the translation for this original source string from locale. diff --git a/core/modules/config_translation/lib/Drupal/config_translation/Tests/ConfigTranslationListUITest.php b/core/modules/config_translation/lib/Drupal/config_translation/Tests/ConfigTranslationListUITest.php index 75f958b..f11aa3c 100644 --- a/core/modules/config_translation/lib/Drupal/config_translation/Tests/ConfigTranslationListUITest.php +++ b/core/modules/config_translation/lib/Drupal/config_translation/Tests/ConfigTranslationListUITest.php @@ -31,6 +31,8 @@ class ConfigTranslationListUITest extends WebTestBase { 'menu', 'shortcut', 'taxonomy', + 'image', + 'picture', ); public static function getInfo() { @@ -55,6 +57,7 @@ public function setUp() { 'access site-wide contact form', 'administer blocks', 'administer contact forms', + 'administer content types', 'administer filters', 'administer menu', 'administer permissions', @@ -63,6 +66,8 @@ public function setUp() { 'administer taxonomy', 'administer users', 'administer languages', + 'administer image styles', + 'administer pictures', 'translate configuration', ); @@ -91,10 +96,8 @@ protected function doBlockListTest() { $this->assertLinkByHref($translate_link); // Test if the link to translate actually goes to the translate page. - // @todo does not work yet, see https://drupal.org/node/2027857 When it is - // fixed, uncomment the tests below. - //$this->drupalGet($translate_link); - //$this->assertRaw('' . t('Language') . ''); + $this->drupalGet($translate_link); + $this->assertRaw('' . t('Language') . ''); } /** @@ -221,6 +224,31 @@ function doContactFormsListTest() { $this->assertRaw('' . t('Language') . ''); } + + /** + * Tests the content type listing for the translate operation. + */ + function doContentTypeListTest() { + // Create a test content type to decouple looking for translate operations + // link so this does not test more than necessary. + $content_type = entity_create('node_type', array( + 'type' => Unicode::strtolower($this->randomName(16)), + 'name' => $this->randomName(), + )); + $content_type->save(); + + // Get the content type listing. + $this->drupalGet('admin/structure/types'); + + $translate_link = 'admin/structure/types/manage/' . $content_type->id() . '/translate'; + // Test if the link to translate the content type is on the page. + $this->assertLinkByHref($translate_link); + + // Test if the link to translate actually goes to the translate page. + $this->drupalGet($translate_link); + $this->assertRaw('' . t('Language') . ''); + } + /** * Tests the formats listing for the translate operation. */ @@ -251,7 +279,7 @@ function doFormatsListTest() { function doShortcutListTest() { // Create a test shortcut to decouple looking for translate operations // link so this does not test more than necessary. - $shortcut = entity_create('shortcut', array( + $shortcut = entity_create('shortcut_set', array( 'id' => Unicode::strtolower($this->randomName(16)), 'label' => $this->randomString(), )); @@ -302,14 +330,68 @@ function doLanguageListTest() { // Get the language listing. $this->drupalGet('admin/config/regional/language'); - // @todo does not work yet, see https://drupal.org/node/2005778#comment-7599069 - //$translate_link = 'admin/config/regional/language/edit/ga/translate'; + $translate_link = 'admin/config/regional/language/edit/ga/translate'; // Test if the link to translate the language is on the page. - //$this->assertLinkByHref($translate_link); + $this->assertLinkByHref($translate_link); // Test if the link to translate actually goes to the translate page. - //$this->drupalGet($translate_link); - //$this->assertRaw('' . t('Language') . ''); + $this->drupalGet($translate_link); + $this->assertRaw('' . t('Language') . ''); + } + + /** + * Tests the image style listing for the translate operation. + */ + function doImageStyleListTest() { + // Get the image style listing. + $this->drupalGet('admin/config/media/image-styles'); + + $translate_link = 'admin/config/media/image-styles/manage/medium/translate'; + // Test if the link to translate the style is on the page. + $this->assertLinkByHref($translate_link); + + // Test if the link to translate actually goes to the translate page. + $this->drupalGet($translate_link); + $this->assertRaw('' . t('Language') . ''); + } + + /** + * Tests the picture mapping listing for the translate operation. + */ + function doPictureListTest() { + $edit = array(); + $edit['label'] = $this->randomName(); + $edit['id'] = strtolower($edit['label']); + + $this->drupalPost('admin/config/media/picturemapping/add', $edit, t('Save')); + $this->assertRaw(t('Picture mapping %label saved.', array('%label' => $edit['label']))); + + // Get the picture mapping listing. + $this->drupalGet('admin/config/media/picturemapping'); + + $translate_link = 'admin/config/media/picturemapping/' . $edit['id'] . '/translate'; + // Test if the link to translate the style is on the page. + $this->assertLinkByHref($translate_link); + + // Test if the link to translate actually goes to the translate page. + $this->drupalGet($translate_link); + $this->assertRaw('' . t('Language') . ''); + } + + /** + * Tests the date format listing for the translate operation. + */ + function doDateFormatListTest() { + // Get the date format listing. + $this->drupalGet('admin/config/regional/date-time'); + + $translate_link = 'admin/config/regional/date-time/formats/manage/long/translate'; + // Test if the link to translate the format is on the page. + $this->assertLinkByHref($translate_link); + + // Test if the link to translate actually goes to the translate page. + $this->drupalGet($translate_link); + $this->assertRaw('' . t('Language') . ''); } /** @@ -331,8 +413,8 @@ function doSettingsPageTest($link) { $this->assertRaw('' . t('Language') . ''); } - /* - * Tests all lists of config to see if translate link is added to operations. + /** + * Tests if translate link is added to operations in all configuration lists. */ public function testTranslateOperationInListUI() { @@ -343,10 +425,16 @@ public function testTranslateOperationInListUI() { $this->doVocabularyListTest(); $this->doCustomBlockTypeListTest(); $this->doContactFormsListTest(); + $this->doContentTypeListTest(); $this->doFormatsListTest(); $this->doShortcutListTest(); $this->doUserRoleListTest(); $this->doLanguageListTest(); + $this->doImageStyleListTest(); + $this->doPictureListTest(); + $this->doDateFormatListTest(); + + // Views is tested in Drupal\config_translation\Tests\ConfigTranslationViewListUITest // Test the maintenance settings page. $this->doSettingsPageTest('admin/config/development/maintenance'); @@ -354,6 +442,8 @@ public function testTranslateOperationInListUI() { $this->doSettingsPageTest('admin/config/system/site-information'); // Test the account settings page. $this->doSettingsPageTest('admin/config/people/accounts'); + // Test the RSS settings page. + $this->doSettingsPageTest('admin/config/services/rss-publishing'); } diff --git a/core/modules/config_translation/lib/Drupal/config_translation/Tests/ConfigTranslationUITest.php b/core/modules/config_translation/lib/Drupal/config_translation/Tests/ConfigTranslationUITest.php index c7f1a0b..16c8819 100644 --- a/core/modules/config_translation/lib/Drupal/config_translation/Tests/ConfigTranslationUITest.php +++ b/core/modules/config_translation/lib/Drupal/config_translation/Tests/ConfigTranslationUITest.php @@ -186,7 +186,7 @@ function testSourceValueDuplicateSave() { function testContactConfigEntityTranslation() { $this->drupalGet('admin/structure/contact'); - // Check for default contact form config entity from Contact module. + // Check for default contact form configuration entity from Contact module. $this->assertLinkByHref('admin/structure/contact/manage/feedback'); // Save default language configuration. @@ -238,9 +238,9 @@ function testContactConfigEntityTranslation() { /** * Tests the account settings translation interface. * - * This is the only special case so far where we have multiple config names - * involved building up one configuration translation form. Test that the - * translations are saved for all configuration names properly. + * This is the only special case so far where we have multiple configuration + * names involved building up one configuration translation form. Test that + * the translations are saved for all configuration names properly. */ function testAccountSettingsConfigurationTranslation() { $this->drupalGet('admin/config/people/accounts/translate'); @@ -297,7 +297,7 @@ function testSourceAndTargetLanguage() { ->set('langcode', Language::LANGCODE_NOT_SPECIFIED) ->save(); - // Make sure translation tab does not exist on the config page. + // Make sure translation tab does not exist on the configuration page. $this->drupalGet('admin/config/system/site-information'); $this->assertNoLinkByHref('admin/config/system/site-information/translate'); @@ -420,7 +420,7 @@ function testSingleLanguageUI() { * @param $config_name * Configuration object. * @param $key - * Translation config field key. + * Translation configuration field key. * @param $langcode * String language code to load translation. *