diff --git a/core/modules/content_translation/config/schema/content_translation.field_settings.schema.yml b/core/modules/content_translation/config/schema/content_translation.field_settings.schema.yml new file mode 100644 index 0000000..c41b7c4 --- /dev/null +++ b/core/modules/content_translation/config/schema/content_translation.field_settings.schema.yml @@ -0,0 +1,12 @@ +# Schema for field settings for the Content Translation module. + +content_translation.field_settings: + type: mapping + label: 'Field settings' + mapping: + translation_sync: + type: sequence + label: 'Fields that have translation synchronisation enabled' + sequence: + - type: string + label: 'Field' diff --git a/core/modules/content_translation/content_translation.admin.inc b/core/modules/content_translation/content_translation.admin.inc index 96b8d3c..313feb8 100644 --- a/core/modules/content_translation/content_translation.admin.inc +++ b/core/modules/content_translation/content_translation.admin.inc @@ -36,12 +36,18 @@ function content_translation_field_sync_widget(FieldDefinitionInterface $field) $settings = array('dependent_selectors' => array('instance[settings][translation_sync]' => array('file'))); - $translation_sync = $field->getSetting('translation_sync'); + // Create an associative array of column groups, keyed on column name, with + // the value of disabled columns set to FALSE. + $translation_sync = \Drupal::config('content_translation.field_settings')->get('translation_sync.' . $field->id()) ?: array(); + $default = array_map(function ($value) use ($translation_sync) { + return in_array($value, $translation_sync) ? $value : FALSE; + }, array_combine(array_keys($default), array_keys($default))); + $element = array( '#type' => 'checkboxes', '#title' => t('Translatable elements'), '#options' => $options, - '#default_value' => !empty($translation_sync) ? $translation_sync : $default, + '#default_value' => $default, '#attached' => array( 'library' => array( 'content_translation/drupal.content_translation.admin', diff --git a/core/modules/content_translation/content_translation.module b/core/modules/content_translation/content_translation.module index 469c1ea..961f476 100644 --- a/core/modules/content_translation/content_translation.module +++ b/core/modules/content_translation/content_translation.module @@ -751,29 +751,29 @@ function content_translation_form_field_ui_field_edit_form_submit($form, array & * Implements hook_form_FORM_ID_alter() for 'field_ui_field_instance_edit_form'. */ function content_translation_form_field_ui_field_instance_edit_form_alter(array &$form, array &$form_state, $form_id) { - if ($form['#field']->isTranslatable()) { + if ($form_state['instance']->isTranslatable()) { module_load_include('inc', 'content_translation', 'content_translation.admin'); - $element = content_translation_field_sync_widget($form['#field']); + $element = content_translation_field_sync_widget($form_state['instance']); if ($element) { $form['instance']['settings']['translation_sync'] = $element; + $form['#submit'][] = 'content_translation_form_field_ui_field_instance_edit_form_submit'; } } } /** + * Form submission handler for 'field_ui_field_instance_edit_form'. + */ +function content_translation_form_field_ui_field_instance_edit_form_submit($form, array &$form_state) { + $key = 'translation_sync.' . $form_state['instance']->id(); + $value = array_keys(array_filter($form_state['values']['instance']['settings']['translation_sync'])); + \Drupal::config('content_translation.field_settings')->set($key, $value)->save(); +} + +/** * Implements hook_entity_presave(). */ function content_translation_entity_presave(EntityInterface $entity) { - // By default no column has to be synchronized. - // @todo Replace with own storage in https://drupal.org/node/2224761 - if ($entity->getEntityTypeId() === 'field_config') { - $entity->settings += array('translation_sync' => FALSE); - } - // Synchronization can be enabled per instance. - // @todo Replace with own storage in https://drupal.org/node/2224761 - if ($entity->getEntityTypeId() === 'field_instance_config') { - $entity->settings += array('translation_sync' => FALSE); - } if ($entity instanceof ContentEntityInterface && $entity->isTranslatable()) { // @todo Avoid using request attributes once translation metadata become // regular fields. @@ -934,14 +934,16 @@ function content_translation_save_settings($settings) { // Store whether fields have translation enabled or not. if (!empty($bundle_settings['columns'])) { foreach ($bundle_settings['columns'] as $field_name => $column_settings) { + $column_settings = array_keys(array_filter($column_settings)); $instance = field_info_instance($entity_type, $field_name, $bundle); if ($instance->isTranslatable()) { - $instance->settings['translation_sync'] = $column_settings; + \Drupal::config('content_translation.field_settings')->set('translation_sync.' . $entity_type . '.' . $bundle . '.' . $field_name, $column_settings)->save(); } // If the field does not have translatable enabled we need to reset // the sync settings to their defaults. else { - unset($instance->settings['translation_sync']); + $key = 'translation_sync.' . $entity_type . '.' . $bundle . '.' . $field_name; + \Drupal::config('content_translation.field_settings')->clear($key)->save(); } $instance->save(); } diff --git a/core/modules/content_translation/lib/Drupal/content_translation/FieldTranslationSynchronizer.php b/core/modules/content_translation/lib/Drupal/content_translation/FieldTranslationSynchronizer.php index 196512b..4d42d9e 100644 --- a/core/modules/content_translation/lib/Drupal/content_translation/FieldTranslationSynchronizer.php +++ b/core/modules/content_translation/lib/Drupal/content_translation/FieldTranslationSynchronizer.php @@ -61,10 +61,11 @@ public function synchronizeFields(ContentEntityInterface $entity, $sync_langcode // Sync if the field is translatable, not empty, and the synchronization // setting is enabled. - if ($field_definition->isTranslatable() && !$items->isEmpty() && $translation_sync = $field_definition->getSetting('translation_sync')) { + $key = 'translation_sync.' . $entity->getEntityTypeId() . '.' . $entity->bundle() . '.' . $field_name; + if ($field_definition->isTranslatable() && !$items->isEmpty() && $translation_sync = \Drupal::config('content_translation.field_settings')->get($key)) { // Retrieve all the untranslatable column groups and merge them into // single list. - $groups = array_keys(array_diff($translation_sync, array_filter($translation_sync))); + $groups = array_diff(array_keys($field_type_definition['column_groups']), $translation_sync); if (!empty($groups)) { $columns = array(); foreach ($groups as $group) { diff --git a/core/modules/content_translation/lib/Drupal/content_translation/Tests/ContentTranslationSyncImageTest.php b/core/modules/content_translation/lib/Drupal/content_translation/Tests/ContentTranslationSyncImageTest.php index 3f990db..eb93da9 100644 --- a/core/modules/content_translation/lib/Drupal/content_translation/Tests/ContentTranslationSyncImageTest.php +++ b/core/modules/content_translation/lib/Drupal/content_translation/Tests/ContentTranslationSyncImageTest.php @@ -69,14 +69,25 @@ protected function setupTestFields() { 'field_name' => $this->fieldName, 'bundle' => $this->entityTypeId, 'label' => 'Test translatable image field', - 'settings' => array( - 'translation_sync' => array( - 'file' => FALSE, - 'alt' => 'alt', - 'title' => 'title', + ))->save(); + + // Enable content translation for image field on the test entity. + $settings = array( + 'content_translation' => array( + 'enabled' => TRUE, + 'fields' => array( + $this->fieldName => TRUE, ), ), - ))->save(); + ); + $key = $this->entityTypeId . '.' . $this->entityTypeId; + \Drupal::config('content_translation.settings')->set($key, $settings)->save(); + + // Enable content translation for the 'alt' and 'title' properties on the + // image field. + $settings = array('alt', 'title'); + $key = 'translation_sync.' . $this->entityTypeId . '.' . $this->entityTypeId . '.' . $this->fieldName; + \Drupal::config('content_translation.field_settings')->set($key, $settings)->save(); } /**