From 4476b2a9370835b481b4cfab50e7b4306916c05d Mon Sep 17 00:00:00 2001
From: Katherine Bailey <katherine@katbailey.net>
Date: Tue, 9 Aug 2011 14:44:44 -0700
Subject: [PATCH] Issue #340833 by robin.puga, thegreat and katbailey: translatable tab titles for D7

---
 plugins/QuickAccordion.inc |    2 +-
 plugins/QuickQuicktabs.inc |    4 +-
 plugins/QuickUiTabs.inc    |    2 +-
 quicktabs.admin.inc        |    1 +
 quicktabs.classes.inc      |   20 +++++++++++++-
 quicktabs.install          |    1 +
 quicktabs.module           |   58 ++++++++++++++++++++++++++++++++++++++++++++
 7 files changed, 82 insertions(+), 6 deletions(-)

diff --git a/plugins/QuickAccordion.inc b/plugins/QuickAccordion.inc
index ea383a8..dd74868 100644
--- a/plugins/QuickAccordion.inc
+++ b/plugins/QuickAccordion.inc
@@ -34,7 +34,7 @@ class QuickAccordion extends QuickRenderer {
     foreach ($quickset->getContents() as $key => $item) {
       if (!empty($item)) {
         $render_array['content']['divs'][] = array(
-          '#prefix' => '<h3><a href= "#">'. $item->getTitle() .'</a></h3><div>',
+          '#prefix' => '<h3><a href= "#">'. $quickset->translateString($item->getTitle(), 'tab', $key) .'</a></h3><div>',
           '#suffix' => '</div>',
           'content' => $item->render(),
         );
diff --git a/plugins/QuickQuicktabs.inc b/plugins/QuickQuicktabs.inc
index 2ae9538..36b4005 100644
--- a/plugins/QuickQuicktabs.inc
+++ b/plugins/QuickQuicktabs.inc
@@ -66,7 +66,7 @@ class QuickQuicktabs extends QuickRenderer {
       if (!empty($tab)) {
         $tablink = array(
           '#type' => 'link',
-          '#title' => $tab->getTitle(),
+          '#title' => $quickset->translateString($tab->getTitle(), 'tab', $i),
           '#href' =>  $_GET['q'],
           '#options' => $this->construct_link_options($i),
         );
@@ -89,7 +89,7 @@ class QuickQuicktabs extends QuickRenderer {
     }
     return $tabs;
   }
-  
+
   /**
    * Add any necessary js, css and libraries for the render array.
    */
diff --git a/plugins/QuickUiTabs.inc b/plugins/QuickUiTabs.inc
index d9e4643..1a5c1ba 100644
--- a/plugins/QuickUiTabs.inc
+++ b/plugins/QuickUiTabs.inc
@@ -53,7 +53,7 @@ class QuickUiTabs extends QuickRenderer {
 	// be escaped. Sad panda is sad.
 	$href = '#qt-'. $qt_name .'-ui-tabs' . ($i+1);
 	$tablink = array(
-	  '#markup' => '<a href="'. $href .'">'. $tab->getTitle() .'</a>',
+	  '#markup' => '<a href="'. $href .'">'. $this->quickset->translateString($tab->getTitle(), 'tab', $i) .'</a>',
 	);
 	$tabs[$i] = $tablink;
       }
diff --git a/quicktabs.admin.inc b/quicktabs.admin.inc
index b401cf8..1b6d886 100644
--- a/quicktabs.admin.inc
+++ b/quicktabs.admin.inc
@@ -496,6 +496,7 @@ function quicktabs_form_submit($form, &$form_state) {
         drupal_set_message(t('The Quicktabs instance has been created.'));
       }
     }
+    quicktabs_i18n_update_strings(array($qt->machine_name));
     drupal_goto('admin/structure/quicktabs');
   }
 }
diff --git a/quicktabs.classes.inc b/quicktabs.classes.inc
index 54fce03..bba6700 100644
--- a/quicktabs.classes.inc
+++ b/quicktabs.classes.inc
@@ -47,7 +47,7 @@ class QuickSet {
   }
 
   public function getTitle() {
-    return isset($this->settings['title']) ? $this->settings['title'] : $this->name;
+    return isset($this->settings['title']) ? $this->translateString($this->settings['title'], 'title') : $this->name;
   }
 
   /**
@@ -152,6 +152,22 @@ class QuickSet {
   }
 
   /**
+   * Translates Quicktabs user-defined strings if the i18n module is
+   * enabled.
+   */
+  public function translateString($string, $type = 'tab', $index = 0) {
+    switch ($type) {
+      case 'tab':
+        $name = "tab:{$this->name}-{$index}:title";
+        break;
+      case 'title':
+        $name = "title:{$this->name}";
+        break;
+    }
+    return quicktabs_translate($name, $string);
+  }
+
+  /**
    * This method does some initial set-up of the tab contents, such as hiding
    * tabs with no content if the hide_empty_tabs option is set. It also makes sure
    * that prerendered contents are never attempted to be loaded via ajax.
@@ -444,7 +460,7 @@ class QuickPreRenderedContent implements QuickContentRenderable {
       $contents = array('#markup' => $contents);
     }
     $this->rendered_content = $contents;
-    
+
     $this->title = isset($item['title']) ? $item['title'] : '';
   }
   
diff --git a/quicktabs.install b/quicktabs.install
index dc8e0cd..c8b30a3 100644
--- a/quicktabs.install
+++ b/quicktabs.install
@@ -21,6 +21,7 @@ function quicktabs_schema() {
         'minimum_version' => 1,
         'current_version' => 1,
       ),
+      'export callback' => 'quicktabs_export',
     ),
     'fields' => array(
       'machine_name' => array(
diff --git a/quicktabs.module b/quicktabs.module
index 53af402..0e87068 100644
--- a/quicktabs.module
+++ b/quicktabs.module
@@ -284,6 +284,64 @@ function quicktabs_load_multiple($names = array()) {
 }
 
 /**
+ * Exports the specified Quicktabs instance with translatable strings.
+ */
+function quicktabs_export($qt, $indent = '') {
+  $output = ctools_export_object('quicktabs', $qt, $indent);
+  $translatables = array();
+  if (!empty($qt->title)) {
+    $translatables[] = $qt->title;
+  }
+  foreach ($qt->tabs as $tab) {
+    $translatables[] = $tab['title'];
+  }
+  $translatables = array_filter(array_unique($translatables));
+  if (!empty($translatables)) {
+    $output .= "\n";
+    $output .= "{$indent}// Translatables\n";
+    $output .= "{$indent}// Included for use with string extractors like potx.\n";
+    sort($translatables);
+    foreach ($translatables as $string) {
+      $output .= "{$indent}t(" . ctools_var_export($string) . ");\n";
+    }
+    $output .= "\n";
+  }
+  return $output;
+}
+
+/**
+* Implements hook_i18n_string_info()
+*/
+function quicktabs_i18n_string_info() {
+  $groups['quicktabs'] = array(
+    'title' => t('Quicktabs'),
+    'description' => t('Vocabulary titles and term names for localizable quicktabs.'),
+    'format' => FALSE, // This group doesn't have strings with format
+    'list' => TRUE, // This group can list all strings
+    //'refresh callback' => 'quicktabs_i18n_string_refresh',
+  );
+  return $groups;
+}
+
+function quicktabs_translate($name, $string, $langcode = NULL, $textgroup = 'quicktabs') {
+  return function_exists('i18n_string') ? i18n_string($textgroup . ':' . $name, $string, array('langcode' => $langcode)) : $string; 
+}
+
+/**
+ * Update translatable strings.
+ */
+function quicktabs_i18n_update_strings($names = array()) {
+  if (!function_exists('i18n_string_update')) return;
+  $qts = quicktabs_load_multiple($names);
+  foreach ($qts as $name => $quicktabs) {
+    i18n_string_update("quicktabs:title:$name", $quicktabs->title);
+    foreach ($quicktabs->tabs as $tabkey => $tab) {
+      i18n_string_update("quicktabs:tab:$name-$tabkey:title", $tab['title']);
+    }
+  }
+}
+
+/**
  * Implements hook_ctools_plugin_type().
  */
 function quicktabs_ctools_plugin_type() {
-- 
1.7.4.1

