diff -urp nodequeue.bak/nodequeue.install nodequeue/nodequeue.install
--- nodequeue.bak/nodequeue.install	2008-10-22 20:58:22.000000000 +0200
+++ nodequeue/nodequeue.install	2008-10-22 21:15:24.000000000 +0200
@@ -350,10 +350,32 @@ function nodequeue_update_6000() {
   return $ret;
 }
 
+function nodequeue_update_6001() {
+  $ret = array();
+  db_add_field($ret, 'nodequeue_queue', 'i18n', array('description' => '', 'type' => 'int', 'size' => 'tiny', 'default' => 1));
+  return $ret;
+}
+
 function nodequeue_install() {
   drupal_install_schema('nodequeue');
 }
 
 function nodequeue_uninstall() {
   drupal_uninstall_schema('nodequeue');
-}
\ No newline at end of file
+}
+
+/**
+ * Implementation of hook_requirements().
+ *
+ * We need the translation_helpers module to enable internationalization for queues.
+ */
+function nodequeue_requirements($phase) {
+  $requirements = array();
+  $t = get_t();
+  if ($phase == 'install' && module_exists('translation') && !module_exists('translation_helpers')) {
+    $requirements['flag_translation']['title'] = $t('Nodequeue');
+    $requirements['flag_translation']['severity'] = REQUIREMENT_ERROR;
+    $requirements['flag_translation']['description'] = $t('To have the nodequeue module work with translations, you need to install and enable the !url module.', array('!url' => l('translation_helpers', 'http://drupal.org/project/translation_helpers')));
+  }
+  return $requirements;
+}
diff -urp nodequeue.bak/nodequeue.module nodequeue/nodequeue.module
--- nodequeue.bak/nodequeue.module	2008-10-22 20:58:22.000000000 +0200
+++ nodequeue/nodequeue.module	2008-10-23 21:15:35.000000000 +0200
@@ -207,13 +207,27 @@ function nodequeue_nodeapi(&$node, $op, 
   switch ($op) {
     case 'delete':
       // If a node is being deleted, ensure it's also removed from any queues.
-      $result = db_query("SELECT * FROM {nodequeue_nodes} WHERE nid = %d", $node->nid);
+      $result = db_query("SELECT qid, sqid FROM {nodequeue_nodes} WHERE nid = %d", $node->nid);
       while ($obj = db_fetch_object($result)) {
-        // This removes by nid, not position, because if we happen to have a
-        // node in a queue twice, the 2nd position would be wrong.
-        nodequeue_subqueue_remove_node($obj->sqid, $node->nid);
+        // If the queue is being tracked by translation set and the node is part
+        // of a translation set, don't delete the queue record.
+        // Instead, data will be updated in the 'translation_change' op, below.
+        $queues = nodequeue_load_queues(array($obj->qid));
+        $queue = nodequeue_load_queue($obj->qid);
+        if (!$queue->i18n || empty($node->tnid)) {
+          // This removes by nid, not position, because if we happen to have a
+          // node in a queue twice, the 2nd position would be wrong.
+          nodequeue_subqueue_remove_node($obj->sqid, $node->nid);
+        }
       }
       break;
+    case 'translation_change':
+      if (isset($node->translation_change)) {
+        // If there is only one node remaining, track by nid rather than tnid.
+        // Otherwise, use the new tnid.
+        $content_id = $node->translation_change['new_tnid'] == 0 ? $node->translation_change['remaining_nid'] : $node->translation_change['new_tnid'];
+        db_query("UPDATE {nodequeue_nodes} SET nid = %d WHERE nid = %d", $content_id, $node->translation_change['old_tnid']);
+      }
   }
 }
 
@@ -242,22 +256,30 @@ function nodequeue_link($type, $node = N
       unset($subqueues[$id]->position);
     }
 
-    nodequeue_set_subqueue_positions($subqueues, $node->nid);
+    if(!module_exists('translation')) {
+      nodequeue_set_subqueue_positions($subqueues, $node->nid);
+    }
 
     foreach ($subqueues as $subqueue) {
       $queue = $queues[$subqueue->qid];
-      $query_string = nodequeue_get_query_string($node->nid, TRUE);
+      $id = nodequeue_get_content_id($queue, $node);
+      if(module_exists('translation')) {
+      	$subqueue = array($subqueue->sqid => $subqueue);
+        nodequeue_set_subqueue_positions($subqueue, $id);
+        $subqueue = array_shift($subqueue);
+      }
+      $query_string = nodequeue_get_query_string($id, TRUE);
       if (!isset($subqueue->position)) {
         $links['nodequeue-ajax-toggle-'. $subqueue->sqid] = array(
           'title' => nodequeue_title_substitute($queue->link, $queue, $subqueue),
-          'href' => "admin/content/nodequeue/$queue->qid/add/$subqueue->sqid/$node->nid",
+          'href' => "admin/content/nodequeue/$queue->qid/add/$subqueue->sqid/$id",
           'attributes' => array('class' => 'nodequeue-ajax-toggle'),
           'query' => $query_string);
       }
       else if ($queue->link_remove) {
         $links['nodequeue-ajax-toggle-'. $subqueue->sqid] = array(
           'title' => nodequeue_title_substitute($queue->link_remove, $queue, $subqueue),
-          'href' => "admin/content/nodequeue/$queue->qid/remove-node/$subqueue->sqid/$node->nid",
+          'href' => "admin/content/nodequeue/$queue->qid/remove-node/$subqueue->sqid/$id",
           'attributes' => array('class' => 'nodequeue-ajax-toggle'),
           'query' => $query_string);
       }
@@ -301,13 +323,21 @@ function nodequeue_js_output($label, $hr
 }
 
 /**
+ * Return content id based on i18n settings
+ */
+function nodequeue_get_content_id($queue, $node) {
+  return ($queue->i18n && !empty($node->tnid)) ? $node->tnid : $node->nid;
+}
+
+/**
  * Page callback to add a node to a queue.
  */
 function nodequeue_admin_add_node($queue, $subqueue, $node) {
   if (!nodequeue_check_token($node->nid)) {
     return drupal_goto();
   }
-  nodequeue_subqueue_add($queue, $subqueue, $node->nid);
+  $id = nodequeue_get_content_id($queue, $node);
+  nodequeue_subqueue_add($queue, $subqueue, $id);
 
   // Provide a response if this is javascript.
   if (!empty($_POST['js'])) {
@@ -334,8 +364,8 @@ function nodequeue_admin_remove_node($qu
   if (!nodequeue_check_token($node->nid)) {
     return drupal_goto();
   }
-
-  nodequeue_subqueue_remove_node($subqueue->sqid, $node->nid);
+  $id = nodequeue_get_content_id($queue, $node);
+  nodequeue_subqueue_remove_node($subqueue->sqid, $id);
 
   // Provide a response if this is javascript.
   if (!empty($_POST['js'])) {
@@ -667,6 +697,18 @@ function nodequeue_edit_queue_form(&$for
     '#description' => t('Check each node type that can be added to this queue.'),
   );
 
+  $form['i18n'] = array(
+    '#type' => 'radios',
+    '#title' => t('Internationalization'),
+    '#options' => array(
+      '1' => t('Add translations of content to the queue as a group'),
+      '0' => t('Add each translation of content to the queue separately'),
+    ),
+    '#default_value' => empty($fqueue->qid) && module_exists('translation_helpers') ? 1 : $queue->i18n,
+    '#description' => t('Adding translations as a group effectively allows users to queue the original piece of content regardless of the translation they are viewing. Changing this setting will <strong>not</strong> update content that has been added to the queue already.'),
+    '#access' => module_exists('translation_helpers'),
+  );
+
   $form['submit'] = array(
     '#type' => 'submit',
     '#value' => t('Submit'),
@@ -1474,6 +1516,7 @@ class nodequeue_queue {
   var $show_in_tab = TRUE;
   var $show_in_ui = TRUE;
   var $reference = 0;
+  var $i18n = 1;
 
   var $subqueue_title = '';
   var $reverse = FALSE;
@@ -1634,7 +1677,7 @@ function nodequeue_get_qids($type, $acco
       $roles_where .= "AND nr.rid IN (". db_placeholders($roles, 'int') .")";
     }
 
-    $sql = 'SELECT nq.qid, nq.show_in_tab, nq.show_in_links, show_in_ui '.
+    $sql = 'SELECT nq.qid, nq.show_in_tab, nq.show_in_links, nq.show_in_ui, nq.i18n '.
       'FROM {nodequeue_queue} nq '.
       'INNER JOIN {nodequeue_types} nt ON nt.qid = nq.qid '. $roles_join .
       "WHERE nt.type = '%s' ". $roles_where;
@@ -1912,14 +1955,14 @@ function nodequeue_load_subqueues_by_ref
  */
 function nodequeue_save(&$queue) {
   if (!isset($queue->qid)) {
-    db_query("INSERT INTO {nodequeue_queue} (title, subqueue_title, size, link, link_remove, owner, show_in_links, show_in_tab, show_in_ui, reverse, reference) VALUES ('%s', '%s', %d, '%s', '%s', '%s', %d, %d, %d, %d, '%s')", $queue->title, $queue->subqueue_title, $queue->size, $queue->link, $queue->link_remove, $queue->owner, $queue->show_in_links, $queue->show_in_tab, $queue->show_in_ui, $queue->reverse, $queue->reference);
+    db_query("INSERT INTO {nodequeue_queue} (title, subqueue_title, size, link, link_remove, owner, show_in_links, show_in_tab, show_in_ui, i18n, reverse, reference) VALUES ('%s', '%s', %d, '%s', '%s', '%s', %d, %d, %d, %d, '%s')", $queue->title, $queue->subqueue_title, $queue->size, $queue->link, $queue->link_remove, $queue->owner, $queue->show_in_links, $queue->show_in_tab, $queue->show_in_ui, $queue->i18n, $queue->reverse, $queue->reference);
     $queue->qid = db_last_insert_id('nodequeue_queue', 'qid');
     if (function_exists('views_invalidate_cache')) {
       views_invalidate_cache();
     }
   }
   else {
-    db_query("UPDATE {nodequeue_queue} set size = %d, title = '%s', subqueue_title = '%s', link = '%s', link_remove = '%s', owner = '%s', show_in_links = %d, show_in_tab = %d, show_in_ui = %d, reverse = %d, reference = '%s' WHERE qid = %d", $queue->size, $queue->title, $queue->subqueue_title, $queue->link, $queue->link_remove, $queue->owner, $queue->show_in_links, $queue->show_in_tab, $queue->show_in_ui, $queue->reverse, $queue->reference, $queue->qid);
+    db_query("UPDATE {nodequeue_queue} set size = %d, title = '%s', subqueue_title = '%s', link = '%s', link_remove = '%s', owner = '%s', show_in_links = %d, show_in_tab = %d, show_in_ui = %d, i18n = %d, reverse = %d, reference = '%s' WHERE qid = %d", $queue->size, $queue->title, $queue->subqueue_title, $queue->link, $queue->link_remove, $queue->owner, $queue->show_in_links, $queue->show_in_tab, $queue->show_in_ui, $queue->i18n, $queue->reverse, $queue->reference, $queue->qid);
     db_query("DELETE FROM {nodequeue_roles} WHERE qid = %d", $queue->qid);
     db_query("DELETE FROM {nodequeue_types} WHERE qid = %d", $queue->qid);
     if ($nodes) {
