Index: simplenews/simplenews.admin.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/simplenews/simplenews.admin.inc,v
retrieving revision 1.58
diff -u -p -r1.58 simplenews.admin.inc
--- simplenews/simplenews.admin.inc	30 Jul 2009 19:56:47 -0000	1.58
+++ simplenews/simplenews.admin.inc	16 Sep 2009 15:27:19 -0000
@@ -446,6 +446,8 @@ function simplenews_subscription_list_ad
         simplenews_subscribe_user($email, $newsletter->tid, FALSE, 'mass subscribe', $langcode);
         $added[] = $email;
       }
+      // update user data
+      simplenews_update_user($email, $langcode);
     }
     else {
       $invalid[] = $email;
@@ -606,6 +608,8 @@ function simplenews_subscription_list_re
         simplenews_unsubscribe_user($email, $newsletter->tid, FALSE, 'mass unsubscribe');
         $removed[] = $email;
       }
+      // update user data
+      simplenews_update_user($email, $langcode);
     }
     else {
       $invalid[] = $email;
@@ -707,6 +711,7 @@ function simplenews_subscription_list_fo
     $form['mail'][$subscription->snid] = array('#value' => $subscription->mail);
     $form['name'][$subscription->snid] =  array('#value' => isset($subscription->uid) ? l($subscription->name, 'user/'. $subscription->uid) : $subscription->name);
     $form['status'][$subscription->snid] = array('#value' => theme('simplenews_status', $subscription->activated, 'activated'));
+    $form['language'][$subscription->snid] = array('#value' => $subscription->language);
     $form['operations'][$subscription->snid] = array('#value' => l(t('edit'), 'admin/content/simplenews/users/edit/'. $subscription->snid, array(), drupal_get_destination()));
   }
   $form['snids'] = array('#type' => 'checkboxes', '#options' => $snids);
@@ -1211,6 +1216,7 @@ function theme_simplenews_subscription_l
     array('data' => t('Email'), 'field' => 'ss.mail', 'sort' => 'asc'),
     array('data' => t('Username'), 'field' => 'u.name'),
     array('data' => t('Status'), 'field' => 'ss.activated'),
+    array('data' => t('Language'), 'field' => 'ss.language'),
     t('Operations')
   );
 
@@ -1223,6 +1229,7 @@ function theme_simplenews_subscription_l
       $row[] = drupal_render($form['mail'][$key]);
       $row[] = drupal_render($form['name'][$key]);
       $row[] = drupal_render($form['status'][$key]);
+      $row[] = drupal_render($form['language'][$key]);
       $row[] = drupal_render($form['operations'][$key]);
       $rows[] = $row;
     }
Index: simplenews/simplenews.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/simplenews/simplenews.module,v
retrieving revision 1.214
diff -u -p -r1.214 simplenews.module
--- simplenews/simplenews.module	30 Aug 2009 12:49:50 -0000	1.214
+++ simplenews/simplenews.module	16 Sep 2009 15:27:19 -0000
@@ -701,6 +701,7 @@ function simplenews_user($op, &$edit, &$
       if ($category == 'account' && $edit['mail']) {
         $query = "SELECT snid FROM {simplenews_subscriptions} WHERE uid = %d";
         if ($result = db_fetch_object(db_query($query, $account->uid))) {
+	  // remove anonymous mail subscription for users' new address
           db_query("DELETE FROM {simplenews_subscriptions} WHERE mail = '%s' AND uid = %d", $edit['mail'], 0);
           db_query("UPDATE {simplenews_subscriptions} SET mail = '%s', language = '%s' WHERE snid = %d", $edit['mail'], $edit['language'], $result->snid);
         }
@@ -713,6 +714,7 @@ function simplenews_user($op, &$edit, &$
       }
 
       // Activate/deactivate subscription when account is blocked/unblocked
+      // TODO visualize activated status in ui
       if ($category == 'account' && isset($edit['status'])) {
         if (variable_get('simplenews_sync_account', TRUE)) {
           db_query("UPDATE {simplenews_subscriptions} SET activated = %d WHERE uid = %d", $edit['status'], $account->uid);
@@ -941,6 +943,8 @@ function _simplenews_user_load($mail) {
  *   TRUE  = User receives an email to verify the address and complete the subscription
  * A new subscription account is created when the user is subscribed to the first newsletter
  *
+ * This function does NOT update language information if account already exists.
+ *
  * @param string $mail
  *   The email address to subscribe to the newsletter.
  * @param integer $tid
@@ -1028,6 +1032,22 @@ function simplenews_subscribe_user($mail
 }
 
 /**
+ * Update user preferences
+ */
+function simplenews_update_user($mail, $language) {
+  // currently: activated, mail, uid, language
+  // TODO update further params?
+
+  $query = "SELECT * FROM {simplenews_subscriptions} WHERE mail = '%s'";
+  if ($result = db_fetch_object(db_query($query, $mail))) {
+    // only update language for anonymous users
+    if(!$result->uid) {
+      db_query("UPDATE {simplenews_subscriptions} SET language = '%s' WHERE snid = %d", $language, $result->snid);
+    }
+  }
+}
+
+/**
  * Unsubscribe a user from a newsletter or send a confirmation mail.
  *
  * The $confirm parameter determines the action:
@@ -1233,11 +1253,6 @@ function _simplenews_subscription_manage
   if ($subscription->mail) {
     $form['subscriptions']['#title'] = t('Subscriptions for %mail', array('%mail' => $subscription->mail));
     $form['subscriptions']['mail'] = array('#type' => 'value', '#value' => $subscription->mail);
-    $form['update'] = array(
-      '#type' => 'submit',
-      '#value' => t('Update'),
-      '#weight' => 20,
-    );
   }
   else {
     $form['subscriptions']['#title'] = t('Manage your newsletter subscriptions');
@@ -1249,6 +1264,55 @@ function _simplenews_subscription_manage
       '#weight' => 10,
       '#required' => TRUE,
     );
+  }
+
+  // TODO: don't bother public users with language selections
+  // as used by simplenews_multisignup block
+  // Include language selection when the site is multilingual.
+  // Default value is the empty string which will result in receiving emails
+  // in the site's default language.
+  $options = array();
+  if (variable_get('language_count', 1) > 1) {
+    // TODO is there a better check?
+    if(arg(0)=='admin') {
+      $options[''] = t('Site default language');
+      $languages = language_list('enabled');
+      foreach ($languages[1] as $langcode => $item) {
+        $name = t($item->name);
+        $options[$langcode] = $name . ($item->native != $name ? ' ('. $item->native .')' : '');
+      }
+      // std uses have language in profile. disable 
+      $access = $subscription->uid ? FALSE : TRUE;
+      $form['language'] = array(
+        '#type' => 'fieldset',
+        '#title' => 'Preferred language',
+        '#description' => t('Language for anonymous users.'),
+        '#access' => $access
+      );
+      $form['language']['language'] = array(
+        '#type' => 'radios',
+        '#default_value' => $subscription->language->language,
+        '#options' => $options,
+        );
+    }
+    else {
+      // TODO should we fall back to current site language (if any)?
+      $form['language']['language'] = array('#type' => 'value', '#value' => '');
+    }
+  }
+  else {
+    $form['language']['language'] = array('#type' => 'value', '#value' => '');
+  }
+  
+  // Buttons
+  if ($subscription->mail) {
+    $form['update'] = array(
+      '#type' => 'submit',
+      '#value' => t('Update'),
+      '#weight' => 20,
+    );
+  }
+  else {
     $form['subscribe'] = array(
       '#type' => 'submit',
       '#value' => t('Subscribe'),
@@ -1291,6 +1355,7 @@ function simplenews_block_form(&$form_st
   global $user;
   $form = array();
 
+  // TODO Language for blocks?! Default or current language?
   if ($user->uid) {
     if (simplenews_user_is_subscribed($user->mail, $tid)) {
       $submit_text = t('Unsubscribe');
Index: simplenews/simplenews.subscription.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/simplenews/simplenews.subscription.inc,v
retrieving revision 1.13
diff -u -p -r1.13 simplenews.subscription.inc
--- simplenews/simplenews.subscription.inc	30 Jul 2009 19:56:47 -0000	1.13
+++ simplenews/simplenews.subscription.inc	16 Sep 2009 15:27:19 -0000
@@ -66,6 +66,9 @@ function simplenews_subscription_manager
           simplenews_unsubscribe_user($form_state['values']['mail'], $tid, FALSE, 'website');
         }
       }
+      // update language (and further user fields?)
+      simplenews_update_user($form_state['values']['mail'], $form_state['values']['language']);
+
       drupal_set_message(t('The newsletter subscriptions for %mail have been updated.', array('%mail' => $form_state['values']['mail'])));
       break;
     case t('Subscribe'):
