diff --git a/VERSIONS_HOTLINE/140061 b/VERSIONS_HOTLINE/140061
new file mode 100644
index 0000000000000000000000000000000000000000..7683b7755455709c83bb248699fca14f862ad0d9
--- /dev/null
+++ b/VERSIONS_HOTLINE/140061
@@ -0,0 +1 @@
+ - ticket #140061 : Magasin de thèmes : Correction du filtrage des articles dans les carrousels.
\ No newline at end of file
diff --git a/library/Class/Article/Loader.php b/library/Class/Article/Loader.php
index a57bfc23575e4b6ea670161c25eb2b5012a77cf6..42ab4c257f46181d76779fac01295cccc67f8973 100644
--- a/library/Class/Article/Loader.php
+++ b/library/Class/Article/Loader.php
@@ -28,7 +28,8 @@ class Class_Article_Loader extends Storm_Model_Loader {
     ORDER_COMMENTS = 'CommentCount';
 
 
-  protected $_all_articles;
+  protected $_all_articles,
+    $_filter_by_local_callback;
 
 
   public function newFromRow($row) {
@@ -82,7 +83,9 @@ class Class_Article_Loader extends Storm_Model_Loader {
             'place_town' => null,
             'display_mode' => 'Title',
             'custom_fields' => [],
-            'tag' => '' ];
+            'tag' => '',
+            'filter_by_workflow' => false,
+            'filter_by_local' => false];
   }
 
 
@@ -94,7 +97,6 @@ class Class_Article_Loader extends Storm_Model_Loader {
     $preferences = array_merge($this->getArticlesByPreferencesDefaults(),
                                $preferences);
 
-
     $select = Class_AdminVar::isModuleEnabled('ENABLE_ARTICLES_TIMINGS')
       ? new Class_Article_SelectWithTimings($this)
       : new Class_Article_Select($this);
@@ -109,8 +111,14 @@ class Class_Article_Loader extends Storm_Model_Loader {
     if ((new ZendAfi_Validate_DateFormat)->isValid($event_date))
       $articles = $this->_filterByDay($event_date, $articles);
 
-    $this->_all_articles = $articles = $this->_sortArticles($articles,
-                                                            $select->getSortOrder());
+     $articles = $this->_filter_by_local_callback
+       ? call_user_func($this->_filter_by_local_callback, $articles)
+       : $articles;
+
+     $this->_all_articles =
+       $articles = $this->_sortArticles($articles,
+                                        $select->getSortOrder());
+
 
     if (
         ($select->getSortOrder() == static::ORDER_SELECTION)
@@ -256,4 +264,8 @@ class Class_Article_Loader extends Storm_Model_Loader {
                                                  'status'=>3]));
   }
 
+
+  public function setFilterByLocalCallback($callback) {
+    $this->_filter_by_local_callback = $callback;
+  }
 }
diff --git a/library/Class/Article/Select.php b/library/Class/Article/Select.php
index 670a1aac497fa6127a5a829624b415ca8da3514b..191a7dab3649de8ea9f0315659b60f5bfe1a1a1a 100644
--- a/library/Class/Article/Select.php
+++ b/library/Class/Article/Select.php
@@ -34,7 +34,9 @@ class Class_Article_Select {
     $_events_only,
     $_published,
     $_display_mode,
-    $_place_town;
+    $_place_town,
+    $_filter_by_workflow,
+    $_filter_by_local;
 
 
   public function __construct($article_loader) {
@@ -89,6 +91,8 @@ class Class_Article_Select {
     $this->_display_mode = $preferences['display_mode'];
     $this->_custom_fields = $preferences['custom_fields'];
     $this->_place_town = $preferences['place_town'];
+    $this->_filter_by_workflow = $preferences['filter_by_workflow'];
+    $this->_filter_by_local = $preferences['filter_by_local'];
 
     return $this;
   }
@@ -107,6 +111,7 @@ class Class_Article_Select {
       ->_whereEventEndAfter($this->_event_end_after)
       ->_filterByLangue()
       ->_filterByStatus()
+      ->_filterByLocal()
       ->_orderAndLimit()
       ->_getSelect();
   }
@@ -199,8 +204,8 @@ class Class_Article_Select {
 
   protected function _selectAllEvents() {
     return $this
-        ->_selectWhereEventStart('%s IS NOT NULL')
-        ->_selectWhereEventEnd('%s IS NOT NULL');
+      ->_selectWhereEventStart('%s IS NOT NULL')
+      ->_selectWhereEventEnd('%s IS NOT NULL');
   }
 
 
@@ -328,10 +333,10 @@ class Class_Article_Select {
       : 'asc';
 
     $this->_select
-        ->join('cms_rank',
-               'cms_rank.ID_CMS = cms_article.ID_ARTICLE',
-               [])
-        ->order('(cms_rank.abon_nombre_avis + cms_rank.bib_nombre_avis) ' . $order);
+      ->join('cms_rank',
+             'cms_rank.ID_CMS = cms_article.ID_ARTICLE',
+             [])
+      ->order('(cms_rank.abon_nombre_avis + cms_rank.bib_nombre_avis) ' . $order);
     return true;
   }
 
@@ -361,7 +366,6 @@ class Class_Article_Select {
   }
 
 
-
   /**
    * @param array $preferences
    * @return array
@@ -416,18 +420,61 @@ class Class_Article_Select {
 
 
   protected function _filterByStatus() {
-    if (null === $this->_status || !is_array($this->_status)) {
+    if (null === $this->_select)
       return $this;
-    }
 
-    if (null === $this->_select) {
-      return $this;
-    }
+    $filters = ($filters = $this->_getFilterByWorkflow())
+      ? $filters
+      : $this->_status;
 
-    $this->_select->where('STATUS in (?)', $this->_status);
+    if ($filters)
+      $this->_select->where('STATUS in (?)', $filters);
 
     return $this;
   }
 
 
+  protected function _getFilterByWorkflow() {
+    if (! $this->_filter_by_workflow)
+      return null;
+
+    if (!Class_AdminVar::isWorkflowEnabled())
+      return null;
+
+    $status_filter = [Class_Article::STATUS_VALIDATED];
+
+    if (Class_Users::isCurrentUserCanAccesBackend())
+      $status_filter [] = Class_Article::STATUS_DRAFT;
+
+    if ($this->_status)
+      $status_filter [] = $this->_status;
+
+    return array_unique($status_filter);
+  }
+
+
+  protected function _filterByLocal() {
+    if (! $this->_filter_by_local)
+      return $this;
+
+    if (!Class_AdminVar::isTranslationEnabled())
+      return $this;
+
+    if ( ! $langue = Zend_Registry::get('translate')->getLocale())
+      return $this;
+
+    $this->_select
+      ->where('(cms_article.langue = "' . $langue . '" or exists (select \'x\' from cms_article as translation where translation.PARENT_ID = cms_article.ID_ARTICLE and trim(translation.langue) = "' . $langue . '") or cms_article.langue = "" or cms_article.langue is null)');
+
+    $callback = function ($articles) use ($langue)
+      {
+        return array_map(function ($article) use ($langue) {
+                                                              return $article->getTraductionLangue($langue);
+                                                            },
+                         $articles);
+      };
+
+      $this->_article_loader->setFilterByLocalCallback($callback);
+      return $this;
+  }
 }
diff --git a/tests/scenarios/Templates/TemplatesWidgetCarouselTest.php b/tests/scenarios/Templates/TemplatesWidgetCarouselTest.php
index 58d89749e3245e2e3db08012e8f044b8948a3113..62b8fb83e48777ec20a570e2a132b9a979d54da6 100644
--- a/tests/scenarios/Templates/TemplatesWidgetCarouselTest.php
+++ b/tests/scenarios/Templates/TemplatesWidgetCarouselTest.php
@@ -118,8 +118,38 @@ class TemplatesWidgetCarouselArticlesNotVolatileTest
 
   /** @test */
   public function withoutLangueShouldDisplayThreeItems() {
-      Class_AdminVar::set('LANGUES', '');
-      $this->dispatch('/index');
-      $this->assertXpathCount('//div[contains(@class, "carousel-item")]', '3');
+    Class_AdminVar::set('LANGUES', '');
+    $this->dispatch('/index');
+    $this->assertXpathCount('//div[contains(@class, "carousel-item")]', '3');
   }
 }
+
+
+
+
+require_once(__DIR__ . '/../../library/Class/ArticleLoaderTest.php');
+
+
+class TemplatesWidgetCarouselLoaderTestTest extends ArticleLoaderGetArticlesByPreferencesTestCase {
+
+  public function assertQueryEquals($expected) {
+    $this->assertEquals($expected,
+                        str_replace("\n", "", $this->select->assemble()));
+  }
+
+
+  /** @test */
+  public function withFilterByWorkflowShouldFilterByStatus3() {
+    Class_AdminVar::set('WORKFLOW', 1);
+    $article = $this->getArticles(['filter_by_workflow' => true]);
+    $this->assertQueryEquals('SELECT `cms_article`.* FROM `cms_article` WHERE ((DEBUT IS NULL) OR (DEBUT <= CURDATE())) AND ((FIN IS NULL) OR (FIN >= CURDATE())) AND (PARENT_ID=0) AND (STATUS in (3)) ORDER BY `DATE_CREATION` DESC');
+  }
+
+
+  /** @test */
+  public function withFilterByLocalShouldSearchForTranslation() {
+    Class_AdminVar::set('LANGUES', 'fr;en;es;ro;it');
+    $article = $this->getArticles(['filter_by_local' => true]);
+    $this->assertQueryEquals('SELECT `cms_article`.* FROM `cms_article` WHERE ((DEBUT IS NULL) OR (DEBUT <= CURDATE())) AND ((FIN IS NULL) OR (FIN >= CURDATE())) AND (PARENT_ID=0) AND ((cms_article.langue = "fr" or exists (select \'x\' from cms_article as translation where translation.PARENT_ID = cms_article.ID_ARTICLE and trim(translation.langue) = "fr") or cms_article.langue = "" or cms_article.langue is null)) ORDER BY `DATE_CREATION` DESC');
+  }
+}
\ No newline at end of file