diff --git a/sources/i18n_string/tmgmt_i18n_string.module b/sources/i18n_string/tmgmt_i18n_string.module
index 09d5a2a..2e5be34 100644
--- a/sources/i18n_string/tmgmt_i18n_string.module
+++ b/sources/i18n_string/tmgmt_i18n_string.module
@@ -313,6 +313,24 @@ function tmgmt_i18n_string_get_wrapper($type, $i18n_string) {
 }
 
 /**
+ * Returns textgroups that are handled by the module.
+ *
+ * Used by other modules.
+ *
+ * @return array
+ *   An array of locale textgroups.
+ */
+function tmgmt_i18n_string_handled_textgroups() {
+  $textgroups = array();
+  foreach (i18n_object_info() as $info) {
+    if (isset($info['string translation']['textgroup'])) {
+      $textgroups[] = $info['string translation']['textgroup'];
+    }
+  }
+  return array_values(array_unique($textgroups));
+}
+
+/**
  * Implements hook_tmgmt_source_suggestions()
  */
 function tmgmt_i18n_string_tmgmt_source_suggestions(array $items, TMGMTJob $job) {
diff --git a/sources/locale/tmgmt_locale.module b/sources/locale/tmgmt_locale.module
index 3f08910..9c8b31c 100644
--- a/sources/locale/tmgmt_locale.module
+++ b/sources/locale/tmgmt_locale.module
@@ -21,5 +21,33 @@ function tmgmt_locale_tmgmt_source_plugin_info() {
     ),
   );
 
+  // Add all textgroups that are not processed by the tmgmt_i18n_string.
+  $all_textgroups = module_invoke_all('locale', 'groups');
+  foreach ($all_textgroups as $textgroup => $name) {
+    // Handle rare case when name is an array.
+    if (is_array($name)) {
+      $all_textgroups[$textgroup] = array_shift($name);
+    }
+  }
+  $i18n_textgroups = module_invoke('tmgmt_i18n_string', 'handled_textgroups');
+  $i18n_textgroups = $i18n_textgroups ? $i18n_textgroups : array();
+  $info['locale']['item types'] += array_diff_key($all_textgroups, array_flip($i18n_textgroups));
+
   return $info;
 }
+
+/**
+ * Returns source langcode for a textgroup.
+ *
+ * @param string $textgroup
+ *
+ * @return string
+ */
+function _tmgmt_locale_get_source_langcode($textgroup) {
+  if ($textgroup != 'default' && function_exists('i18n_string_source_language')) {
+    // Non default text groups come from i18n_string module. Their source
+    // language can differ from the default English.
+    return i18n_string_source_language();
+  }
+  return 'en';
+}
diff --git a/sources/locale/tmgmt_locale.plugin.inc b/sources/locale/tmgmt_locale.plugin.inc
index a0d210f..d924506 100644
--- a/sources/locale/tmgmt_locale.plugin.inc
+++ b/sources/locale/tmgmt_locale.plugin.inc
@@ -92,7 +92,7 @@ class TMGMTLocaleSourcePluginController extends TMGMTDefaultSourcePluginControll
       $source_language = $job_item->getSourceLangCode();
     }
 
-    if ($source_language == 'en') {
+    if ($source_language == _tmgmt_locale_get_source_langcode($job_item->item_type)) {
       $query = db_select('locales_source', 'ls');
       $query
         ->fields('ls')
@@ -101,7 +101,7 @@ class TMGMTLocaleSourcePluginController extends TMGMTDefaultSourcePluginControll
         ->execute()
         ->fetchObject();
 
-      $locale_object->language = 'en';
+      $locale_object->language = $source_language;
 
       if (empty($locale_object)) {
         return null;
@@ -223,7 +223,7 @@ class TMGMTLocaleSourcePluginController extends TMGMTDefaultSourcePluginControll
    */
   public function getSourceLangCode(TMGMTJobItem $job_item) {
     // For the locale source English is always the source language.
-    return 'en';
+    return _tmgmt_locale_get_source_langcode($job_item->item_type);
   }
 
   /**
@@ -234,7 +234,7 @@ class TMGMTLocaleSourcePluginController extends TMGMTDefaultSourcePluginControll
     $query->fields('lt', array('language'));
     $query->condition('lt.lid', $job_item->item_id);
 
-    $existing_lang_codes = array('en');
+    $existing_lang_codes = array(_tmgmt_locale_get_source_langcode($job_item->item_type));
     foreach ($query->execute() as $language) {
       $existing_lang_codes[] = $language->language;
     }
diff --git a/sources/locale/tmgmt_locale.ui.inc b/sources/locale/tmgmt_locale.ui.inc
index 4b57971..e9eeea7 100644
--- a/sources/locale/tmgmt_locale.ui.inc
+++ b/sources/locale/tmgmt_locale.ui.inc
@@ -124,8 +124,7 @@ class TMGMTLocaleSourceUIController extends TMGMTDefaultSourceUIController {
    */
   protected function getTranslationData($strings, $type) {
     $objects = array();
-    // Source language of locale strings is always english.
-    $source_language = 'en';
+    $source_language = _tmgmt_locale_get_source_langcode($type);
 
     foreach ($strings as $string) {
       $id = $string->lid;
@@ -193,8 +192,8 @@ class TMGMTLocaleSourceUIController extends TMGMTDefaultSourceUIController {
       '#default_value' => isset($default_values['label']) ? $default_values['label'] : NULL,
     );
 
-    // Unset English as it is the source language for all locale strings.
-    unset($options['en']);
+    // Unset the source language.
+    unset($options[_tmgmt_locale_get_source_langcode($type)]);
 
     $form['search_wrapper']['search']['missing_target_language'] = array(
       '#type' => 'select',
@@ -270,7 +269,7 @@ class TMGMTLocaleSourceUIController extends TMGMTDefaultSourceUIController {
     $items = array_filter($form_state['values']['items']);
     $type = $form_state['item_type'];
 
-    $source_lang = 'en';
+    $source_lang = _tmgmt_locale_get_source_langcode($type);
 
     // Create only single job for all items as the source language is just
     // the same for all.
