diff --git a/entity_translation.admin.inc b/entity_translation.admin.inc index 9dfb505..49741be 100644 --- a/entity_translation.admin.inc +++ b/entity_translation.admin.inc @@ -21,7 +21,7 @@ function entity_translation_admin_form($form, $form_state) { $form['entity_translation_shared_labels'] = array( '#type' => 'checkbox', '#title' => t('Display shared labels'), - '#description' => t('Append a "Shared field" hint to entity form widgets shared accross translations.'), + '#description' => t('Append an "all languages" hint to entity form widgets shared accross translations.'), '#default_value' => variable_get('entity_translation_shared_labels', TRUE), ); @@ -90,15 +90,15 @@ function entity_translation_admin_form($form, $form_state) { $enabled_bundles++; $settings = entity_translation_settings($entity_type, $bundle); $settings_key = 'entity_translation_settings_' . $entity_type . '__' . $bundle; + $form['settings'][$entity_type][$settings_key] = array('#tree' => TRUE); // If the entity defines no bundle we do not need the fieldset. if (count($bundles) > 1 || $bundle != $entity_type) { - $form['settings'][$entity_type][$settings_key] = array( + $form['settings'][$entity_type][$settings_key] += array( '#type' => 'fieldset', '#title' => $info['label'], '#collapsible' => TRUE, '#collapsed' => TRUE, - '#tree' => TRUE, ); } @@ -126,6 +126,13 @@ function entity_translation_admin_form($form, $form_state) { '#title' => t('Prevent language from being changed once the entity has been created'), '#default_value' => $settings['lock_language'], ); + + $form['settings'][$entity_type][$settings_key]['shared_fields_original_only'] = array( + '#type' => 'checkbox', + '#title' => t('Hide shared fields on translation forms'), + '#description' => t('Display shared fields only on entity forms for the original language.'), + '#default_value' => $settings['shared_fields_original_only'], + ); } } diff --git a/entity_translation.module b/entity_translation.module index 33aac4f..c7b0463 100644 --- a/entity_translation.module +++ b/entity_translation.module @@ -1129,12 +1129,12 @@ function entity_translation_field_attach_form($entity_type, $entity, &$form, &$f // Handle fields shared between translations when there is at least one // translation available or a new one is being created. if (!$handler->isNewEntity() && ($new_translation || count($translations->data) > 1)) { - $access = user_access('edit translation shared fields') || user_access("edit $entity_type translation shared fields"); + $access = $handler->getSharedFieldsAccess(); list(, , $bundle) = entity_extract_ids($entity_type, $entity); foreach (field_info_instances($entity_type, $bundle) as $instance) { $field_name = $instance['field_name']; $field = field_info_field($field_name); - $form[$field_name]['#access'] = !empty($form[$field_name]['#access']) && ($field['translatable'] || $access) ; + $form[$field_name]['#access'] = !empty($form[$field_name]['#access']) && ($field['translatable'] || $access); $form[$field_name]['#multilingual'] = (boolean) $field['translatable']; } } @@ -1235,7 +1235,7 @@ function entity_translation_element_translatability_clue($element) { if (!isset($element['#attributes']['class'])) { $element['#attributes']['class'] = array(); } - $element['#attributes']['class'][] = 'entity-translation-' . ($element['#multilingual'] ? 'field-translatable' : 'field-shared'); + $element['#attributes']['class'][] = 'entity-translation-' . (!empty($element['#multilingual']) ? 'field-translatable' : 'field-shared'); return $element; } @@ -1313,8 +1313,12 @@ function entity_translation_form_alter(&$form, &$form_state) { if ($handler = entity_translation_entity_form_get_handler($form, $form_state)) { if (!$handler->isNewEntity()) { $handler->entityForm($form, $form_state); - // Hide shared form elements if the user is not allowed to edit them. - $handler->entityFormSharedElements($form); + $translations = $handler->getTranslations(); + $form_langcode = $handler->getFormLanguage(); + if (!isset($translations->data[$form_langcode]) || count($translations->data) > 1) { + // Hide shared form elements if the user is not allowed to edit them. + $handler->entityFormSharedElements($form); + } } else { $handler->entityFormLanguageWidget($form, $form_state); @@ -1543,6 +1547,7 @@ function entity_translation_settings($entity_type, $bundle) { 'hide_language_selector' => TRUE, 'exclude_language_none' => FALSE, 'lock_language' => FALSE, + 'shared_fields_original_only' => FALSE, ); return $settings; diff --git a/includes/translation.handler.inc b/includes/translation.handler.inc index 873c9f4..41ff6f9 100644 --- a/includes/translation.handler.inc +++ b/includes/translation.handler.inc @@ -206,6 +206,11 @@ interface EntityTranslationHandlerInterface { public function getTranslationAccess($langcode); /** + * Checks if a user is allowed to edit shared fields on the active form. + */ + public function getSharedFieldsAccess(); + + /** * Return TRUE if the entity supports URL aliasing. */ public function isAliasEnabled(); @@ -861,6 +866,15 @@ class EntityTranslationDefaultHandler implements EntityTranslationHandlerInterfa } /** + * @see EntityTranslationHandlerInterface::getSharedFieldsAccess() + */ + public function getSharedFieldsAccess() { + $settings = entity_translation_settings($this->entityType, $this->bundle); + return (user_access('edit translation shared fields') || user_access("edit {$this->entityType} translation shared fields")) + && ($settings['shared_fields_original_only'] == FALSE || $this->getLanguage() == $this->getFormLanguage()); + } + + /** * @see EntityTranslationHandlerInterface::isAliasEnabled() */ public function isAliasEnabled() { @@ -1098,7 +1112,7 @@ class EntityTranslationDefaultHandler implements EntityTranslationHandlerInterfa $shared_labels = variable_get('entity_translation_shared_labels', TRUE); } if (!isset($access)) { - $access = user_access('edit translation shared fields') || user_access("edit $this->entityType translation shared fields"); + $access = $this->getSharedFieldsAccess(); } foreach (element_children($element) as $key) { @@ -1111,12 +1125,10 @@ class EntityTranslationDefaultHandler implements EntityTranslationHandlerInterfa continue; } // Elements are considered to be non multilingual by default. - if (!isset($element[$key]['#multilingual'])) { - $element[$key]['#multilingual'] = FALSE; - } - // Update #access only if it has not been set already. - if (!isset($element[$key]['#access'])) { - $element[$key]['#access'] = $access || $element[$key]['#multilingual']; + // Update #access only if it has not been set already or if we have + // explicit mlutilingual support. + if (!isset($element[$key]['#access']) || isset($element[$key]['#multilingual'])) { + $element[$key]['#access'] = (!isset($element[$key]['#access']) || $element[$key]['#access']) && ($access || !empty($element[$key]['#multilingual'])); } // Add translatability clue for visible elements. if ($access && $shared_labels) { @@ -1147,8 +1159,9 @@ class EntityTranslationDefaultHandler implements EntityTranslationHandlerInterfa } $langcode = $is_new ? $this->getDefaultLanguage() : $this->getLanguage(); + $language_key = $this->getLanguageKey(); - $form[$this->getLanguageKey()] = array( + $form[$language_key] = array( '#type' => 'select', '#title' => t('Language'), '#default_value' => $langcode, @@ -1170,7 +1183,7 @@ class EntityTranslationDefaultHandler implements EntityTranslationHandlerInterfa if ($is_translation) { // @todo Consider supporting the ability to change translation language. - $form['language']['#title'] = t('Original language'); + $form[$language_key]['#title'] = t('Original language'); } array_unshift($submit, 'entity_translation_language_widget_submit'); diff --git a/includes/translation.handler.user.inc b/includes/translation.handler.user.inc index 53b353b..c6850bb 100644 --- a/includes/translation.handler.user.inc +++ b/includes/translation.handler.user.inc @@ -16,6 +16,16 @@ class EntityTranslationUserHandler extends EntityTranslationDefaultHandler { } /** + * @see EntityTranslationDefaultHandler::entityForm() + */ + public function entityForm(&$form, &$form_state) { + parent::entityForm($form, $form_state); + $form['picture']['#multilingual'] = FALSE; + $form['locale']['#multilingual'] = FALSE; + $form['locale']['#title'] = t('Preferred language settings'); + } + + /** * @see EntityTranslationDefaultHandler::getLanguageKey() */ public function getLanguageKey() {