Index: views.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/views/views.module,v
retrieving revision 1.324
diff -u -p -r1.324 views.module
--- views.module	8 Jan 2009 20:01:00 -0000	1.324
+++ views.module	13 Jan 2009 16:59:51 -0000
@@ -1023,6 +1023,7 @@ function drupal_build_form($form_id, &$f
 function views_views_query_substitutions($view) {
   global $language;
   return array(
+    '***CURRENT_VERSION***' => VERSION,
     '***CURRENT_TIME***' => time(),
     '***CURRENT_LANGUAGE***' => $language->language,
     '***DEFAULT_LANGUAGE***' => language_default('language'),
@@ -1144,4 +1145,4 @@ function views_views_exportables($op = '
 function views_microtime() {
   list($usec, $sec) = explode(' ', microtime());
   return (float)$sec + (float)$usec;
-}
\ No newline at end of file
+}
Index: includes/handlers.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/views/includes/handlers.inc,v
retrieving revision 1.104
diff -u -p -r1.104 handlers.inc
--- includes/handlers.inc	7 Jan 2009 23:31:12 -0000	1.104
+++ includes/handlers.inc	13 Jan 2009 16:59:54 -0000
@@ -1319,6 +1319,8 @@ function book_views_api() { return views
 
 function comment_views_api() { return views_views_api(); }
 
+function locale_views_api() { return views_views_api(); }
+
 function node_views_api() { return views_views_api(); }
 
 function poll_views_api() { return views_views_api(); }
Index: modules/locale.views.inc
===================================================================
RCS file: modules/locale.views.inc
diff -N modules/locale.views.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/locale.views.inc	13 Jan 2009 16:59:54 -0000
@@ -0,0 +1,247 @@
+<?php
+// $Id: translation.views.inc,v 1.7 2008/12/03 00:25:59 merlinofchaos Exp $
+
+/**
+ * @file
+ *
+ * Provides views data and handlers for locale.module.
+ */
+
+/**
+ * @defgroup views_locale_module locale.module handlers
+ *
+ * @{
+ */
+
+/**
+ * Implementation of hook_views_data().
+ */
+function locale_views_data() {
+  // Basic table information.
+
+  // Define the base group of this table.
+  $data['locales_source']['table']['group']  = t('Locale source');
+
+  // Advertise this table as a possible base table.
+  $data['locales_source']['table']['base'] = array(
+    'field' => 'lid',
+    'title' => t('Locale source'),
+    'help' => t('A source string for translation, in English or the default site language.'),
+  );
+
+  // lid
+  $data['locales_source']['lid'] = array(
+    'title' => t('LID'),
+    'help' => t('The ID of the source string.'),
+    'field' => array(
+      'handler' => 'views_handler_field',
+      'click sortable' => TRUE,
+    ),
+    'argument' => array(
+      'handler' => 'views_handler_argument_numeric',
+      'numeric' => TRUE,
+      'validate type' => 'lid',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_numeric',
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+  );
+
+  // location
+  $data['locales_source']['location'] = array(
+    'group' => t('Locale source'),
+    'title' => t('Location'),
+    'help' => t('A description of the location or context of the string.'),
+    'field' => array(
+      'handler' => 'views_handler_field',
+      'click sortable' => TRUE,
+     ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_string',
+    ),
+    'argument' => array(
+      'handler' => 'views_handler_argument_string',
+    ),
+  );
+
+  // Group field
+  $data['locales_source']['textgroup'] = array(
+    'group' => t('Locale source'),
+    'title' => t('Group'),
+    'help' => t('The group the translation is in.'),
+    'field' => array(
+      'handler' => 'views_handler_field_locale_group',
+      'click sortable' => TRUE,
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_locale_group',
+    ),
+    'argument' => array(
+      'handler' => 'views_handler_argument_locale_group',
+    ),
+  );
+
+  // Source field
+  $data['locales_source']['source'] = array(
+    'group' => t('Locale source'),
+    'title' => t('Source'),
+    'help' => t('The full original string.'),
+    'field' => array(
+      'handler' => 'views_handler_field',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_string',
+    ),
+  );
+
+  // Version field
+  $data['locales_source']['version'] = array(
+    'group' => t('Locale source'),
+    'title' => t('Version'),
+    'help' => t('The version of Drupal core that this string is for.'),
+    'field' => array(
+      'handler' => 'views_handler_field',
+      'click sortable' => TRUE,
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_locale_version',
+    ),
+    'argument' => array(
+      'handler' => 'views_handler_argument_string',
+    ),
+  );
+
+  $data['locales_source']['edit_lid'] = array(
+    'group' => t('Locale source'),
+    'field' => array(
+      'title' => t('Edit link'),
+      'help' => t('Provide a simple link to edit the translations.'),
+      'handler' => 'views_handler_field_locale_link_edit',
+    ),
+  );
+
+  // ----------------------------------------------------------------------
+  // Locales target table
+
+  // Define the base group of this table. Fields that don't
+  // have a group defined will go into this field by default.
+  $data['locales_target']['table']['group']  = t('Locale target');
+
+  // Join information
+  $data['locales_target']['table']['join'] = array(
+    'locales_source' => array(
+      'left_field' => 'lid',
+      'field' => 'lid',
+    ),
+  );
+
+  // Translation field
+  $data['locales_target']['translation'] = array(
+    'group' => t('Locale target'),
+    'title' => t('Translation'),
+    'help' => t('The full translation string.'),
+    'field' => array(
+      'handler' => 'views_handler_field',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_string',
+    ),
+  );
+
+  // Language field
+  $data['locales_target']['language'] = array(
+    'group' => t('Locale target'),
+    'title' => t('Language'),
+    'help' => t('The language this translation is in.'),
+    'field' => array(
+      'handler' => 'views_handler_field_locale_language',
+      'click sortable' => TRUE,
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_locale_language',
+    ),
+    'argument' => array(
+      'handler' => 'views_handler_argument_locale_language',
+    ),
+  );
+
+  $data['locales_target']['plid'] = array(
+    'group' => t('Locale target'),
+    'title' => t('Singular LID'),
+    'help' => t('The ID of the parent translation.'),
+    'field' => array(
+      'handler' => 'views_handler_field',
+    ),
+  );
+
+  // Plural
+  $data['locales_target']['plural'] = array(
+    'group' => t('Locale target'),
+    'title' => t('Plural'),
+    'help' => t('Whether or not the translation is plural.'),
+    'field' => array(
+      'handler' => 'views_handler_field_boolean',
+      'click sortable' => TRUE,
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_boolean_operator',
+      'label' => t('Plural'),
+      'type' => 'yes-no',
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+  );
+
+  return $data;
+}
+
+/**
+ * Implementation of hook_views_handlers().
+ */
+function locale_views_handlers() {
+  return array(
+    'info' => array(
+      'path' => drupal_get_path('module', 'views') . '/modules/locale',
+    ),
+    'handlers' => array(
+      // Field handlers.
+      'views_handler_field_locale_group' => array(
+        'parent' => 'views_handler_field',
+      ),
+      'views_handler_field_locale_language' => array(
+        'parent' => 'views_handler_field',
+      ),
+      'views_handler_field_locale_link_edit' => array(
+        'parent' => 'views_handler_field',
+      ),
+      // Argument handlers.
+      'views_handler_argument_locale_group' => array(
+        'parent' => 'views_handler_argument',
+      ),
+      'views_handler_argument_locale_language' => array(
+        'parent' => 'views_handler_argument',
+      ),
+      // Filters.
+      'views_handler_filter_locale_group' => array(
+        'parent' => 'views_handler_filter_in_operator',
+      ),
+      'views_handler_filter_locale_language' => array(
+        'parent' => 'views_handler_filter_in_operator',
+      ),
+      'views_handler_filter_locale_version' => array(
+        'parent' => 'views_handler_filter_in_operator',
+      ),
+    ),
+  );
+}
+
+/**
+ * @}
+ */
Index: modules/locale/views_handler_argument_locale_group.inc
===================================================================
RCS file: modules/locale/views_handler_argument_locale_group.inc
diff -N modules/locale/views_handler_argument_locale_group.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/locale/views_handler_argument_locale_group.inc	13 Jan 2009 16:59:55 -0000
@@ -0,0 +1,35 @@
+<?php
+// $Id: views_handler_argument_node_language.inc,v 1.1 2008/09/30 22:07:15 merlinofchaos Exp $
+
+/**
+ * Argument handler to accept a language.
+ */
+class views_handler_argument_locale_group extends views_handler_argument {
+  function construct() {
+    parent::construct('group');
+  }
+
+  /**
+   * Override the behavior of summary_name(). Get the user friendly version
+   * of the group.
+   */
+  function summary_name($data) {
+    return $this->locale_group($data->{$this->name_alias});
+  }
+
+  /**
+   * Override the behavior of title(). Get the user friendly version
+   * of the language.
+   */
+  function title() {
+    return $this->locale_group($this->argument);
+  }
+
+  function locale_group($group) {
+    $groups = module_invoke_all('locale', 'groups');
+    // Sort the list.
+    asort($groups);
+    return isset($groups[$group]) ? $groups[$group] : t('Unknown group');
+  }
+}
+
Index: modules/locale/views_handler_argument_locale_language.inc
===================================================================
RCS file: modules/locale/views_handler_argument_locale_language.inc
diff -N modules/locale/views_handler_argument_locale_language.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/locale/views_handler_argument_locale_language.inc	13 Jan 2009 16:59:55 -0000
@@ -0,0 +1,33 @@
+<?php
+// $Id: views_handler_argument_node_language.inc,v 1.1 2008/09/30 22:07:15 merlinofchaos Exp $
+
+/**
+ * Argument handler to accept a language.
+ */
+class views_handler_argument_locale_language extends views_handler_argument {
+  function construct() {
+    parent::construct('language');
+  }
+
+  /**
+   * Override the behavior of summary_name(). Get the user friendly version
+   * of the language.
+   */
+  function summary_name($data) {
+    return $this->locale_language($data->{$this->name_alias});
+  }
+
+  /**
+   * Override the behavior of title(). Get the user friendly version
+   * of the language.
+   */
+  function title() {
+    return $this->locale_language($this->argument);
+  }
+
+  function locale_language($langcode) {
+    $languages = locale_language_list();
+    return isset($languages[$langcode]) ? $languages[$langcode] : t('Unknown language');
+  }
+}
+
Index: modules/locale/views_handler_field_locale_group.inc
===================================================================
RCS file: modules/locale/views_handler_field_locale_group.inc
diff -N modules/locale/views_handler_field_locale_group.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/locale/views_handler_field_locale_group.inc	13 Jan 2009 16:59:55 -0000
@@ -0,0 +1,14 @@
+<?php
+// $Id: views_handler_field_node_language.inc,v 1.2 2008/10/28 17:46:14 merlinofchaos Exp $
+
+/**
+ * Field handler to translate a group into its readable form.
+ */
+class views_handler_field_locale_group extends views_handler_field {
+  function render($values) {
+    $groups = module_invoke_all('locale', 'groups');
+    // Sort the list.
+    asort($groups);
+    return isset($groups[$values->{$this->field_alias}]) ? $groups[$values->{$this->field_alias}] : '';
+  }
+}
Index: modules/locale/views_handler_field_locale_language.inc
===================================================================
RCS file: modules/locale/views_handler_field_locale_language.inc
diff -N modules/locale/views_handler_field_locale_language.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/locale/views_handler_field_locale_language.inc	13 Jan 2009 16:59:55 -0000
@@ -0,0 +1,12 @@
+<?php
+// $Id: views_handler_field_node_language.inc,v 1.2 2008/10/28 17:46:14 merlinofchaos Exp $
+
+/**
+ * Field handler to translate a language into its readable form.
+ */
+class views_handler_field_locale_language extends views_handler_field {
+  function render($values) {
+    $languages = language_list();
+    return isset($languages[$values->{$this->field_alias}]) ? $languages[$values->{$this->field_alias}]->name : '';
+  }
+}
Index: modules/locale/views_handler_field_locale_link_edit.inc
===================================================================
RCS file: modules/locale/views_handler_field_locale_link_edit.inc
diff -N modules/locale/views_handler_field_locale_link_edit.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/locale/views_handler_field_locale_link_edit.inc	13 Jan 2009 16:59:55 -0000
@@ -0,0 +1,45 @@
+<?php
+// $Id: views_handler_field_node_link_edit.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos Exp $
+
+/**
+ * Field handler to present a link to edit a translation.
+ */
+class views_handler_field_locale_link_edit extends views_handler_field {
+  function construct() {
+    parent::construct();
+    $this->additional_fields['lid'] = 'lid';
+  }
+
+  function option_definition() {
+    $options = parent::option_definition();
+
+    $options['text'] = array('default' => '', 'translatable' => TRUE);
+
+    return $options;
+  }
+
+  function options_form(&$form, &$form_state) {
+    parent::options_form($form, $form_state);
+    $form['text'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Text to display'),
+      '#default_value' => $this->options['text'],
+    );
+  }
+
+  function query() {
+    $this->ensure_my_table();
+    $this->add_additional_fields();
+  }
+
+  function render($values) {
+    // Ensure user has access to edit translations.
+    if (!user_access('translate interface')) {
+      return;
+    }
+
+    $text = !empty($this->options['text']) ? $this->options['text'] : t('edit');
+    return l($text, 'admin/build/translate/edit/' . $values->{$this->aliases['lid']}, array('query' => drupal_get_destination()));
+  }
+}
+
Index: modules/locale/views_handler_filter_locale_group.inc
===================================================================
RCS file: modules/locale/views_handler_filter_locale_group.inc
diff -N modules/locale/views_handler_filter_locale_group.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/locale/views_handler_filter_locale_group.inc	13 Jan 2009 16:59:55 -0000
@@ -0,0 +1,18 @@
+<?php
+// $Id: views_handler_filter_node_language.inc,v 1.1 2008/09/30 22:07:15 merlinofchaos Exp $
+
+/**
+ * Filter by locale group.
+ */
+class views_handler_filter_locale_group extends views_handler_filter_in_operator {
+  function get_value_options() {
+    if (!isset($this->value_options)) {
+      $this->value_title = t('Group');
+      $groups = module_invoke_all('locale', 'groups');
+      // Sort the list.
+      asort($groups);
+      $this->value_options = $groups;
+    }
+  }
+}
+
Index: modules/locale/views_handler_filter_locale_language.inc
===================================================================
RCS file: modules/locale/views_handler_filter_locale_language.inc
diff -N modules/locale/views_handler_filter_locale_language.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/locale/views_handler_filter_locale_language.inc	13 Jan 2009 16:59:55 -0000
@@ -0,0 +1,17 @@
+<?php
+// $Id: views_handler_filter_node_language.inc,v 1.1 2008/09/30 22:07:15 merlinofchaos Exp $
+
+/**
+ * Filter by language.
+ */
+class views_handler_filter_locale_language extends views_handler_filter_in_operator {
+  function get_value_options() {
+    if (!isset($this->value_options)) {
+      $this->value_title = t('Language');
+      $languages = array('***CURRENT_LANGUAGE***' => t("Current user's language"), '***DEFAULT_LANGUAGE***' => t("Default site language"), '***NO_LANGUAGE***' => t('No language'));
+      $languages = array_merge($languages, locale_language_list());
+      $this->value_options = $languages;
+    }
+  }
+}
+
Index: modules/locale/views_handler_filter_locale_version.inc
===================================================================
RCS file: modules/locale/views_handler_filter_locale_version.inc
diff -N modules/locale/views_handler_filter_locale_version.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/locale/views_handler_filter_locale_version.inc	13 Jan 2009 16:59:55 -0000
@@ -0,0 +1,22 @@
+<?php
+// $Id: views_handler_filter_node_language.inc,v 1.1 2008/09/30 22:07:15 merlinofchaos Exp $
+
+/**
+ * Filter by version.
+ */
+class views_handler_filter_locale_version extends views_handler_filter_in_operator {
+  function get_value_options() {
+    if (!isset($this->value_options)) {
+      $this->value_title = t('Version');
+      // Enable filtering by the current installed Drupal version.
+      $versions = array('***CURRENT_VERSION***' => t('Current installed version'));
+      $result = db_query('SELECT DISTINCT(version) FROM {locales_source} ORDER BY  version');
+      while ($row = db_fetch_array($result)) {
+        if (!empty($row['version'])) {
+          $versions[$row['version']] = $row['version'];
+        }
+      }
+      $this->value_options = $versions;
+    }
+  }
+}
