summaryrefslogtreecommitdiff
path: root/modules/locale
diff options
context:
space:
mode:
authorDavid Rothstein <drothstein@gmail.com>2012-12-26 22:49:51 -0500
committerDavid Rothstein <drothstein@gmail.com>2012-12-26 22:49:51 -0500
commitdfed194c6393a496bceb69b83081a86c0196297a (patch)
treecb6be993d05dfb27d4c396b715e13ec73e4f1bf3 /modules/locale
parent9edacf1adce95d8aca42180ef5b90f86c0dbfaa1 (diff)
downloadbrdo-dfed194c6393a496bceb69b83081a86c0196297a.tar.gz
brdo-dfed194c6393a496bceb69b83081a86c0196297a.tar.bz2
Issue #1534674 by plach, slowflyer: Fixed Comment field language is completely broken.
Diffstat (limited to 'modules/locale')
-rw-r--r--modules/locale/locale.module66
-rw-r--r--modules/locale/locale.test42
2 files changed, 81 insertions, 27 deletions
diff --git a/modules/locale/locale.module b/modules/locale/locale.module
index 94e7cd151..b60c53120 100644
--- a/modules/locale/locale.module
+++ b/modules/locale/locale.module
@@ -386,20 +386,53 @@ function locale_form_node_form_alter(&$form, &$form_state) {
/**
* Form submit handler for node_form().
*
- * Checks if Locale is registered as a translation handler and handle possible
- * node language changes.
- *
* This submit handler needs to run before entity_form_submit_build_entity()
* is invoked by node_form_submit_build_node(), because it alters the values of
* attached fields. Therefore, it cannot be a hook_node_submit() implementation.
*/
function locale_field_node_form_submit($form, &$form_state) {
- if (field_has_translation_handler('node', 'locale')) {
- $node = (object) $form_state['values'];
- $current_language = entity_language('node', $node);
- list(, , $bundle) = entity_extract_ids('node', $node);
+ locale_field_entity_form_submit('node', $form, $form_state);
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function locale_form_comment_form_alter(&$form, &$form_state, $form_id) {
+ // If a content type has multilingual support we set the content language as
+ // comment language.
+ if ($form['language']['#value'] == LANGUAGE_NONE && locale_multilingual_node_type($form['#node']->type)) {
+ global $language_content;
+ $form['language']['#value'] = $language_content->language;
+ $submit_callback = 'locale_field_comment_form_submit';
+ array_unshift($form['actions']['preview']['#submit'], $submit_callback);
+ array_unshift($form['#submit'], $submit_callback);
+ }
+}
- foreach (field_info_instances('node', $bundle) as $instance) {
+/**
+ * Form submit handler for comment_form().
+ *
+ * This submit handler needs to run before entity_form_submit_build_entity()
+ * is invoked by comment_form_submit_build_comment(), because it alters the
+ * values of attached fields.
+ */
+function locale_field_comment_form_submit($form, &$form_state) {
+ locale_field_entity_form_submit('comment', $form, $form_state);
+}
+
+/**
+ * Handles field language on submit for the given entity type.
+ *
+ * Checks if Locale is registered as a translation handler and handle possible
+ * language changes.
+ */
+function locale_field_entity_form_submit($entity_type, $form, &$form_state ) {
+ if (field_has_translation_handler($entity_type, 'locale')) {
+ $entity = (object) $form_state['values'];
+ $current_language = entity_language($entity_type, $entity);
+ 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);
$previous_language = $form[$field_name]['#language'];
@@ -407,7 +440,7 @@ function locale_field_node_form_submit($form, &$form_state) {
// Handle a possible language change: new language values are inserted,
// previous ones are deleted.
if ($field['translatable'] && $previous_language != $current_language) {
- $form_state['values'][$field_name][$current_language] = $node->{$field_name}[$previous_language];
+ $form_state['values'][$field_name][$current_language] = $entity->{$field_name}[$previous_language];
$form_state['values'][$field_name][$previous_language] = array();
}
}
@@ -491,6 +524,9 @@ function locale_field_language_fallback(&$display_language, $entity, $langcode)
*/
function locale_entity_info_alter(&$entity_info) {
$entity_info['node']['translation']['locale'] = TRUE;
+ if (isset($entity_info['comment'])) {
+ $entity_info['comment']['translation']['locale'] = TRUE;
+ }
}
/**
@@ -1060,15 +1096,3 @@ function locale_url_outbound_alter(&$path, &$options, $original_path) {
}
}
}
-
-/**
- * Implements hook_form_FORM_ID_alter().
- */
-function locale_form_comment_form_alter(&$form, &$form_state, $form_id) {
- // If a content type has multilingual support we set the content language as
- // comment language.
- if ($form['language']['#value'] == LANGUAGE_NONE && locale_multilingual_node_type($form['#node']->type)) {
- global $language_content;
- $form['language']['#value'] = $language_content->language;
- }
-}
diff --git a/modules/locale/locale.test b/modules/locale/locale.test
index 632506e13..d88634e19 100644
--- a/modules/locale/locale.test
+++ b/modules/locale/locale.test
@@ -2758,7 +2758,7 @@ class LocaleCommentLanguageFunctionalTest extends DrupalWebTestCase {
parent::setUp('locale', 'locale_test');
// Create and login user.
- $admin_user = $this->drupalCreateUser(array('administer site configuration', 'administer languages', 'access administration pages', 'administer content types', 'create article content'));
+ $admin_user = $this->drupalCreateUser(array('administer site configuration', 'administer languages', 'access administration pages', 'administer content types', 'administer comments', 'create article content'));
$this->drupalLogin($admin_user);
// Add language.
@@ -2787,6 +2787,12 @@ class LocaleCommentLanguageFunctionalTest extends DrupalWebTestCase {
// French no matter what path prefix the URLs have.
$edit = array('language' => 'fr');
$this->drupalPost("user/{$admin_user->uid}/edit", $edit, t('Save'));
+
+ // Make comment body translatable.
+ $field = field_info_field('comment_body');
+ $field['translatable'] = TRUE;
+ field_update_field($field);
+ $this->assertTrue(field_is_translatable('comment', $field), 'Comment body is translatable.');
}
/**
@@ -2817,22 +2823,46 @@ class LocaleCommentLanguageFunctionalTest extends DrupalWebTestCase {
foreach (language_list() as $langcode => $language) {
// Post a comment with content language $langcode.
$prefix = empty($language->prefix) ? '' : $language->prefix . '/';
- $edit = array("comment_body[$language_none][0][value]" => $this->randomName());
- $this->drupalPost("{$prefix}node/{$node->nid}", $edit, t('Save'));
+ $comment_values[$node_langcode][$langcode] = $this->randomName();
+ // Initially field form widgets have no language.
+ $edit = array(
+ 'subject' => $this->randomName(),
+ "comment_body[$language_none][0][value]" => $comment_values[$node_langcode][$langcode],
+ );
+ $this->drupalPost("{$prefix}node/{$node->nid}", $edit, t('Preview'));
+ // After the first submit the submitted entity language is taken into
+ // account.
+ $edit = array(
+ 'subject' => $edit['subject'],
+ "comment_body[$langcode][0][value]" => $comment_values[$node_langcode][$langcode],
+ );
+ $this->drupalPost(NULL, $edit, t('Save'));
// Check that comment language matches the current content language.
- $comment = db_select('comment', 'c')
- ->fields('c')
+ $cid = db_select('comment', 'c')
+ ->fields('c', array('cid'))
->condition('nid', $node->nid)
->orderBy('cid', 'DESC')
+ ->range(0, 1)
->execute()
- ->fetchObject();
+ ->fetchField();
+ $comment = comment_load($cid);
$comment_langcode = entity_language('comment', $comment);
$args = array('%node_language' => $node_langcode, '%comment_language' => $comment_langcode, '%langcode' => $langcode);
$this->assertEqual($comment_langcode, $langcode, t('The comment posted with content language %langcode and belonging to the node with language %node_language has language %comment_language', $args));
+ $this->assertEqual($comment->comment_body[$langcode][0]['value'], $comment_values[$node_langcode][$langcode], 'Comment body correctly stored.');
+ }
+ }
+
+ // Check that comment bodies appear in the administration UI.
+ $this->drupalGet('admin/content/comment');
+ foreach ($comment_values as $node_values) {
+ foreach ($node_values as $value) {
+ $this->assertRaw($value);
}
}
}
+
}
/**