Index: l10n_community/export.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/l10n_server/l10n_community/Attic/export.inc,v
retrieving revision 1.1.2.15.2.24.2.15
diff -u -p -r1.1.2.15.2.24.2.15 export.inc
--- l10n_community/export.inc	11 Aug 2010 11:19:25 -0000	1.1.2.15.2.24.2.15
+++ l10n_community/export.inc	22 Dec 2010 18:53:30 -0000
@@ -464,7 +464,7 @@ function l10n_community_export($uri, $re
     // Only include suggestions if requested, otherwise filter out.
     $is_suggestion = ($suggestions ? '' : 'AND t.is_suggestion = 0');
     // We only export active translations, not suggestions.
-    $sql = "SELECT s.sid, s.value, s.context, f.location, f.revision, l.lineno, l.type, t.translation, t.uid_approved, t.time_approved, t.is_suggestion, st.has_suggestion FROM {l10n_server_file} f INNER JOIN {l10n_server_line} l ON f.fid = l.fid INNER JOIN {l10n_server_string} s ON l.sid = s.sid LEFT JOIN {l10n_server_status_flag} st ON st.sid = s.sid AND st.language = '%s' $translation_join {l10n_server_translation} t ON s.sid = t.sid AND t.language = '%s' AND t.is_active = 1 $is_suggestion WHERE f.pid = %d $type_limit";
+    $sql = "SELECT s.sid, s.value, s.context, f.location, f.revision, l.lineno, l.type, t.translation, t.is_suggestion, st.has_suggestion FROM {l10n_server_file} f INNER JOIN {l10n_server_line} l ON f.fid = l.fid INNER JOIN {l10n_server_string} s ON l.sid = s.sid LEFT JOIN {l10n_server_status_flag} st ON st.sid = s.sid AND st.language = '%s' $translation_join {l10n_server_translation} t ON s.sid = t.sid AND t.language = '%s' AND t.is_active = 1 $is_suggestion WHERE f.pid = %d $type_limit";
     $sql_args = array($language->language, $language->language, $project->pid);
   }
 
Index: l10n_community/import.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/l10n_server/l10n_community/Attic/import.inc,v
retrieving revision 1.1.2.5.2.18.2.8
diff -u -p -r1.1.2.5.2.18.2.8 import.inc
--- l10n_community/import.inc	18 May 2010 10:39:43 -0000	1.1.2.5.2.18.2.8
+++ l10n_community/import.inc	22 Dec 2010 18:53:30 -0000
@@ -183,7 +183,7 @@ function _l10n_community_import_one_stri
       $value['msgstr'] = is_array($value['msgstr']) ? join("\0", $value['msgstr']) : $value['msgstr'];
 
       // Add this as a suggestion first.
-      $tid = l10n_community_add_suggestion($sid, $value['msgstr'], $langcode, $uid);
+      $tid = l10n_community_add_suggestion($sid, $value['msgstr'], $langcode, $uid, L10N_SERVER_ACTION_ADD_IMPORT);
 
       if ($tid) {
         if ($is_suggestion) {
Index: l10n_community/l10n_community.install
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/l10n_server/l10n_community/Attic/l10n_community.install,v
retrieving revision 1.1.2.11.2.15.2.14
diff -u -p -r1.1.2.11.2.15.2.14 l10n_community.install
--- l10n_community/l10n_community.install	25 Nov 2010 13:26:02 -0000	1.1.2.11.2.15.2.14
+++ l10n_community/l10n_community.install	22 Dec 2010 18:53:30 -0000
@@ -460,3 +460,65 @@ function l10n_community_update_6021() {
   db_query("UPDATE {blocks} SET delta = 'jump' WHERE delta = 'contribute' AND module = 'l10n_community'");
   return array();
 }
+
+/**
+ * Refactor translation history tracking to a separate table.
+ */
+function l10n_community_update_6022() {
+  $ret = array();
+
+  db_create_table($ret, 'l10n_community_translation_history', array(
+    'fields' => array(
+      'tid' => array(
+        'description' => 'References {l10n_server_translation}.tid',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'disp-width' => '11'
+      ),
+      'uid_action' => array(
+        'description' => 'Reference to the {users}.uid who performed the action.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'disp-width' => '11'
+      ),
+      'time_action' => array(
+        'description' => 'Unix timestamp of time when the action happened.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'disp-width' => '11'
+      ),
+      'type_action' => array(
+        'description' => 'Numeric identifier of the action that happened.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'disp-width' => '11'
+      ),
+    ),
+    'indexes' => array(
+      'tid' => array('tid'),
+    ),
+  ));
+
+  // Save submission history data with L10N_SERVER_ACTION_ADD_UNKNOWN (0), since
+  // we don't know how was the string added really.
+  $ret[] = update_sql("INSERT INTO {l10n_server_translation_history} (tid, uid_action, type_action, time_action) SELECT tid, uid_entered, 0, time_entered FROM {l10n_server_translation}");
+
+  // Save approval history data with L10N_SERVER_ACTION_APPROVE (4).
+  $ret[] = update_sql("INSERT INTO {l10n_server_translation_history} (tid, uid_action, type_action, time_action) SELECT tid, uid_approved, 4, time_approved FROM {l10n_server_translation} WHERE is_active = 1 AND is_suggestion = 0");
+  
+  // Add the time_changed field.
+  db_add_field($ret, 'l10n_server_translation', 'time_changed', array('type' => 'int', 'not null' => TRUE, 'default' => 0, 'disp-width' => '11'));
+  
+  // The last change date we know is either the submission or approval time.
+  $ret[] = update_sql("UPDATE {l10n_server_translation} SET time_changed = GREATEST(time_entered, time_approved)");
+  
+  // Drop fields not needed anymore in the translation table, now we track these separately.
+  db_drop_field($ret, 'l10n_server_translation', 'uid_approved');
+  db_drop_field($ret, 'l10n_server_translation', 'time_approved');
+
+  return $ret;
+}
Index: l10n_community/l10n_community.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/l10n_server/l10n_community/Attic/l10n_community.module,v
retrieving revision 1.1.2.23.2.66.2.25
diff -u -p -r1.1.2.23.2.66.2.25 l10n_community.module
--- l10n_community/l10n_community.module	6 Dec 2010 12:20:18 -0000	1.1.2.23.2.66.2.25
+++ l10n_community/l10n_community.module	22 Dec 2010 18:53:30 -0000
@@ -972,9 +972,11 @@ function l10n_community_ahah_releases() 
  * @param $langcode
  *   The language of the new translation.
  * @param $uid
- *  User ID to use to save the string.
+ *   User ID to use to save the string.
+ * @param $type
+ *   Action type constant L10N_SERVER_ACTION_*
  */
-function l10n_community_add_suggestion($sid, $translation, $langcode, $uid) {
+function l10n_community_add_suggestion($sid, $translation, $langcode, $uid, $type) {
 
   // Load source string and adjust translation whitespace based on source.
   $source_string = db_result(db_query('SELECT value FROM {l10n_server_string} WHERE sid = %d', $sid));
@@ -985,13 +987,15 @@ function l10n_community_add_suggestion($
     return NULL;
   }
 
+  $time = time();
+
   // Look for an existing active translation, if any.
   // Use BINARY matching to avoid marking case-corrections as duplicate.
   $existing = db_fetch_object(db_query("SELECT tid, is_active, is_suggestion FROM {l10n_server_translation} WHERE sid = %d AND language = '%s' AND translation = BINARY '%s'", $sid, $langcode, $translation));
   if (!empty($existing)) {
     if ($existing->is_active == 0) {
       // If the existing item is not active, make it an active suggestion and clean up its possible previous approval information.
-      db_query("UPDATE {l10n_server_translation} SET is_suggestion = 1, is_active = 1, uid_approved = 0, time_approved = 0 WHERE tid = %d", $existing->tid);
+      db_query("UPDATE {l10n_server_translation} SET is_suggestion = 1, is_active = 1, time_changed = %d WHERE tid = %d", $time, $existing->tid);
       $tid = $existing->tid;
     }
     else {
@@ -1000,9 +1004,10 @@ function l10n_community_add_suggestion($
   }
   else {
     // Insert the new suggestion.
-    db_query("INSERT INTO {l10n_server_translation} (sid, translation, language, uid_entered, time_entered, is_suggestion, is_active) VALUES (%d, '%s', '%s', %d, %d, 1, 1)", $sid, $translation, $langcode, $uid, time());
+    db_query("INSERT INTO {l10n_server_translation} (sid, translation, language, uid_entered, time_entered, time_changed, is_suggestion, is_active) VALUES (%d, '%s', '%s', %d, %d, %d, 1, 1)", $sid, $translation, $langcode, $uid, $time, $time);
     $tid = db_last_insert_id('l10n_community_translation', 'tid');
   }
+  db_query("INSERT INTO {l10n_server_translation_history} (tid, uid_action, type_action, time_action) VALUES (%d, %d, %d, %d)", $tid, $uid, $type, $time);
 
   // Mark the existing or mock translation as having suggestions.
   l10n_community_update_string_status($langcode, $sid);
@@ -1019,9 +1024,13 @@ function l10n_community_add_suggestion($
  *   The string ID the translation belongs to.
  * @param $tid
  *   The translation ID of the translation.
+ * @param $uid
+ *   The user performing the action.
  */
-function l10n_community_decline_string($langcode, $sid, $tid) {
-  db_query("UPDATE {l10n_server_translation} SET is_active = 0 WHERE tid = %d", $tid);
+function l10n_community_decline_string($langcode, $sid, $tid, $uid) {
+  $time = time();
+  db_query("UPDATE {l10n_server_translation} SET is_active = 0, time_changed = %d WHERE tid = %d", $time, $tid);
+  db_query("INSERT INTO {l10n_server_translation_history} (tid, uid_action, type_action, time_action) VALUES (%d, %d, %d, %d)", $tid, $uid, L10N_SERVER_ACTION_DECLINE, $time);
   l10n_community_update_string_status($langcode, $sid);
 }
 
@@ -1061,10 +1070,18 @@ function l10n_community_update_string_st
 function l10n_community_approve_string($langcode, $sid, $tid) {
   global $user;
 
+  $time = time();
+
   // Make the existing approved string a suggestion (if applicable).
-  db_query("UPDATE {l10n_server_translation} SET is_suggestion = 1 WHERE sid = %d AND language = '%s' AND is_suggestion = 0 AND is_active = 1", $sid, $langcode);
+  // There should only ever be one string like this.
+  if ($existing_tid = db_result(db_query("SELECT tid FROM {l10n_server_translation} WHERE sid = %d AND language = '%s' AND is_suggestion = 0 AND is_active = 1", $sid, $langcode))) {
+    db_query("UPDATE {l10n_server_translation} SET is_suggestion = 1, time_changed = %d WHERE tid = %d", $time, $existing_tid);
+    db_query("INSERT INTO {l10n_server_translation_history} (tid, uid_action, type_action, time_action) VALUES (%d, %d, %d, %d)", $existing_tid, $user->uid, L10N_SERVER_ACTION_DEMOTE, $time);
+  }
 
   // Mark this exact suggestion as active translation, and set approval time.
-  db_query("UPDATE {l10n_server_translation} SET time_approved = %d, uid_approved = %d, is_suggestion = 0, is_active = 1 WHERE tid = %d;", time(), $user->uid, $tid);
+  db_query("UPDATE {l10n_server_translation} SET time_changed = %d, is_suggestion = 0, is_active = 1 WHERE tid = %d;", $time, $tid);
+  db_query("INSERT INTO {l10n_server_translation_history} (tid, uid_action, type_action, time_action) VALUES (%d, %d, %d, %d)", $tid, $user->uid, L10N_SERVER_ACTION_APPROVE, $time);
+
   l10n_community_update_string_status($langcode, $sid);
 }
Index: l10n_community/translate.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/l10n_server/l10n_community/Attic/translate.inc,v
retrieving revision 1.1.2.7.2.31.2.28
diff -u -p -r1.1.2.7.2.31.2.28 translate.inc
--- l10n_community/translate.inc	6 Dec 2010 12:20:18 -0000	1.1.2.7.2.31.2.28
+++ l10n_community/translate.inc	22 Dec 2010 18:53:30 -0000
@@ -381,7 +381,7 @@ function _l10n_community_translate_form_
 
   // When there are suggestions, load them from the database.
   if ($source->has_suggestion) {
-    $result = db_query("SELECT t.tid, t.sid, t.translation, t.uid_entered, t.time_entered, t.is_active, t.is_suggestion, u.name as username FROM {l10n_server_translation} t LEFT JOIN {users} u ON u.uid = t.uid_entered WHERE t.language = '%s' AND t.sid = %d AND t.is_active = 1 AND t.is_suggestion = 1 ORDER BY t.time_entered", $language->language, $source->sid);
+    $result = db_query("SELECT t.tid, t.sid, t.translation, t.uid_entered, t.time_entered, t.time_changed, t.is_active, t.is_suggestion, u.name as username FROM {l10n_server_translation} t LEFT JOIN {users} u ON u.uid = t.uid_entered WHERE t.language = '%s' AND t.sid = %d AND t.is_active = 1 AND t.is_suggestion = 1 ORDER BY t.time_entered", $language->language, $source->sid);
     while ($suggestion = db_fetch_object($result)) {
       $suggestion->translation = l10n_community_unpack_string($suggestion->translation);
       // Add the suggestion to the list.
@@ -532,20 +532,7 @@ function l10n_community_translate_byline
     '@date' => format_date($string->time_entered),
     '@ago' => t('@time ago', array('@time' => format_interval(time() - $string->time_entered))),
   );
-  if (!empty($string->uid_approved) && $string->uid_entered === $string->uid_approved && $string->time_entered === $string->time_approved) {
-    return t('translated and approved by !author <span title="@ago">on @date</span>', $params);
-  }
-  else {
-    $title = t('suggested by !author <span title="@ago">on @date</span>', $params);
-    if (!empty($string->uid_approved)) {
-      $title .= '<br />'. t('approved by !author <span title="@ago">on @date</span>', array(
-        '!author' => theme('username', (object)array('name' => $string->username_approved, 'uid' => $string->uid_approved)),
-        '@date' => format_date($string->time_approved),
-        '@ago' => t('@time ago', array('@time' => format_interval(time() - $string->time_approved))),
-      ));
-    }
-    return $title;
-  }
+  return t('suggested by !author <span title="@ago">on @date</span>', $params);
 }
 
 // = Translation form theming ==================================================
@@ -728,7 +715,7 @@ function l10n_community_translate_form_s
         }
         // If we had value in any of the textareas, add new suggestion.
         if ($tid === 'new' && count($options['value']) > $empty_values) {
-          $tid = l10n_community_add_suggestion($sid, l10n_community_pack_string($options['value']), $langcode, $user->uid);
+          $tid = l10n_community_add_suggestion($sid, l10n_community_pack_string($options['value']), $langcode, $user->uid, L10N_SERVER_ACTION_ADD_WEB);
           if ($tid) {
             if ($string['active'] === 'new') {
               // This new string was selected to be approved, so remember $tid
@@ -758,7 +745,7 @@ function l10n_community_translate_form_s
         elseif (!empty($options['declined'])) {
           // The decline checkbox for this suggestion was checked.
           l10n_community_counter($options['original']->is_suggestion ? L10N_COUNT_SUGGESTION_DECLINED : L10N_COUNT_DECLINED);
-          l10n_community_decline_string($langcode, $sid, $tid);
+          l10n_community_decline_string($langcode, $sid, $tid, $user->uid);
         }
       }
     }
@@ -800,13 +787,12 @@ function l10n_community_get_strings($lan
   $join = $join_args = $where = $where_args = array();
   $sql = $sql_count = '';
 
-  $select = "SELECT DISTINCT s.sid, s.value, s.context, t.tid, t.language, t.translation, t.uid_entered, t.uid_approved, t.time_entered, t.time_approved, t.is_suggestion, t.is_active, u.name as username, u2.name as username_approved, ts.has_suggestion, ts.has_translation FROM {l10n_server_string} s";
+  $select = "SELECT DISTINCT s.sid, s.value, s.context, t.tid, t.language, t.translation, t.uid_entered, t.time_entered, t.time_changed, t.is_suggestion, t.is_active, u.name as username, ts.has_suggestion, ts.has_translation FROM {l10n_server_string} s";
   $select_count = "SELECT COUNT(DISTINCT(s.sid)) FROM {l10n_server_string} s";
   $join[] = "LEFT JOIN {l10n_server_status_flag} ts ON s.sid = ts.sid AND ts.language = '%s'";
   $join_args[] = $langcode;
   $join[] = "LEFT JOIN {l10n_server_translation} t ON ts.sid = t.sid AND ts.language = t.language AND t.is_active = 1";
   $join[] = "LEFT JOIN {users} u ON u.uid = t.uid_entered";
-  $join[] = "LEFT JOIN {users} u2 ON u2.uid = t.uid_approved";
 
   // Add sid filtering.
   if (!empty($filters['sid'])) {
@@ -891,7 +877,7 @@ function l10n_community_get_strings($lan
   while ($string = db_fetch_object($strings)) {
     if ($string->is_suggestion) {
       // This string is not a translation, but we need that as a "parent" to display.
-      if ($string->has_translation && ($translation = db_fetch_array(db_query("SELECT t.tid, t.translation, t.uid_entered, t.uid_approved, t.time_entered, t.time_approved, t.is_suggestion, t.is_active, u.name as username, u2.name as username_approved FROM {l10n_server_translation} t LEFT JOIN {users} u ON u.uid = t.uid_entered LEFT JOIN {users} u2 ON u2.uid = t.uid_approved WHERE t.language = '%s' AND t.sid = %d AND t.is_active = 1 AND t.is_suggestion = 0", $string->language, $string->sid)))) {
+      if ($string->has_translation && ($translation = db_fetch_array(db_query("SELECT t.tid, t.translation, t.uid_entered, t.time_entered, t.time_changed, t.is_suggestion, t.is_active, u.name as username FROM {l10n_server_translation} t LEFT JOIN {users} u ON u.uid = t.uid_entered WHERE t.language = '%s' AND t.sid = %d AND t.is_active = 1 AND t.is_suggestion = 0", $string->language, $string->sid)))) {
         // It does have a translation however, so let's load it, and override.
         foreach ($translation as $key => $value) {
           $string->$key = $value;
Index: l10n_packager/l10n_packager.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/l10n_server/l10n_packager/Attic/l10n_packager.inc,v
retrieving revision 1.1.2.1.2.4
diff -u -p -r1.1.2.1.2.4 l10n_packager.inc
--- l10n_packager/l10n_packager.inc	29 Jul 2010 12:26:38 -0000	1.1.2.1.2.4
+++ l10n_packager/l10n_packager.inc	22 Dec 2010 18:53:30 -0000
@@ -250,7 +250,7 @@ function l10n_packager_release_name($rid
  */
 function l10n_packager_translation_last_updated($rid) {
   $updated = array();
-  $result = db_query("SELECT t.language, MAX(t.time_approved) AS latest_time FROM {l10n_server_translation} t INNER JOIN {l10n_server_line} l ON t.sid = l.sid WHERE t.is_active = 1 AND t.is_suggestion = 0 AND l.rid = %d GROUP BY t.language", $rid);
+  $result = db_query("SELECT t.language, MAX(t.time_changed) AS latest_time FROM {l10n_server_translation} t INNER JOIN {l10n_server_line} l ON t.sid = l.sid WHERE t.is_active = 1 AND t.is_suggestion = 0 AND l.rid = %d GROUP BY t.language", $rid);
   while ($latest = db_fetch_object($result)) {
     $updated[$latest->language] = $latest->latest_time;
   }
Index: l10n_remote/l10n_remote.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/l10n_server/l10n_remote/Attic/l10n_remote.module,v
retrieving revision 1.1.2.7.2.2
diff -u -p -r1.1.2.7.2.2 l10n_remote.module
--- l10n_remote/l10n_remote.module	26 Mar 2010 09:15:42 -0000	1.1.2.7.2.2
+++ l10n_remote/l10n_remote.module	22 Dec 2010 18:53:30 -0000
@@ -165,7 +165,7 @@ function l10n_remote_xmlrpc_string_submi
   }
 
   // Attempt to add this as a suggestion.
-  $tid = l10n_community_add_suggestion($sid, $translation, $langcode, $uid);
+  $tid = l10n_community_add_suggestion($sid, $translation, $langcode, $uid, L10N_SERVER_ACTION_ADD_REMOTE);
   
   if ($tid === FALSE) {
     //watchdog('l10n_community', 'Duplicate translation submitted.', NULL, WATCHDOG_WARNING);
Index: l10n_server/l10n_server.install
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/l10n_server/l10n_server/Attic/l10n_server.install,v
retrieving revision 1.1.2.3
diff -u -p -r1.1.2.3 l10n_server.install
--- l10n_server/l10n_server.install	10 Nov 2010 15:27:34 -0000	1.1.2.3
+++ l10n_server/l10n_server.install	22 Dec 2010 18:53:30 -0000
@@ -328,22 +328,15 @@ function l10n_server_schema() {
         'default' => 0,
         'disp-width' => '11'
       ),
-      'uid_approved' => array(
-        'description' => 'Reference to the {users}.uid who approved this translation or suggestion.',
-        'type' => 'int',
-        'not null' => TRUE,
-        'default' => 0,
-        'disp-width' => '11'
-      ),
       'time_entered' => array(
-        'description' => 'Unix timestamp of time when the translation or suggestion was entered.',
+        'description' => 'Unix timestamp of when the string was entered into the database.',
         'type' => 'int',
         'not null' => TRUE,
         'default' => 0,
         'disp-width' => '11'
       ),
-      'time_approved' => array(
-        'description' => 'Unix timestamp of time when the translation or suggestion was approved.',
+      'time_changed' => array(
+        'description' => 'Unix timestamp of last action (cached version of MAX({l10n_server_translation_history}.time_action) for this tid).',
         'type' => 'int',
         'not null' => TRUE,
         'default' => 0,
@@ -371,6 +364,42 @@ function l10n_server_schema() {
       'sid_language_is_suggestion_is_active' => array('sid', 'language', 'is_suggestion', 'is_active')
     ),
   );
+  
+  $schema['l10n_server_translation_history'] = array(
+    'fields' => array(
+      'tid' => array(
+        'description' => 'References {l10n_server_translation}.tid',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'disp-width' => '11'
+      ),
+      'uid_action' => array(
+        'description' => 'Reference to the {users}.uid who performed the action.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'disp-width' => '11'
+      ),
+      'time_action' => array(
+        'description' => 'Unix timestamp of time when the action happened.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'disp-width' => '11'
+      ),
+      'type_action' => array(
+        'description' => 'Numeric identifier of the action that happened.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'disp-width' => '11'
+      ),
+    ),
+    'indexes' => array(
+      'tid' => array('tid'),
+    ),
+  );
 
   $schema['l10n_server_status_flag'] = array(
     'fields' => array(
Index: l10n_server/l10n_server.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/l10n_server/l10n_server/Attic/l10n_server.module,v
retrieving revision 1.1.2.9
diff -u -p -r1.1.2.9 l10n_server.module
--- l10n_server/l10n_server.module	26 May 2010 12:21:08 -0000	1.1.2.9
+++ l10n_server/l10n_server.module	22 Dec 2010 18:53:30 -0000
@@ -6,6 +6,41 @@
  *   Base localization server module.
  */
 
+/**
+ * Action flag for backwards compatibility.
+ */
+define('L10N_SERVER_ACTION_ADD_UNKNOWN', 0);
+
+/**
+ * Action flag for web based addition.
+ */
+define('L10N_SERVER_ACTION_ADD_WEB', 1);
+
+/**
+ * Action flag for web based import.
+ */
+define('L10N_SERVER_ACTION_ADD_IMPORT', 2);
+
+/**
+ * Action flag for remote addition.
+ */
+define('L10N_SERVER_ACTION_ADD_REMOTE', 3);
+
+/**
+ * Action flag for approval.
+ */
+define('L10N_SERVER_ACTION_APPROVE', 4);
+
+/**
+ * Action flag for denial.
+ */
+define('L10N_SERVER_ACTION_DECLINE', 3);
+
+/**
+ * Action flag for demotes.
+ */
+define('L10N_SERVER_ACTION_DEMOTE', 5);
+
 // = Core hooks ================================================================
 
 /**
