diff --git a/app/models/concerns/localizable_order_by_slug_scope.rb b/app/models/concerns/localizable_order_by_slug_scope.rb
new file mode 100644
index 0000000000000000000000000000000000000000..815740a53219fadb9fbe424667e6369f173a2727
--- /dev/null
+++ b/app/models/concerns/localizable_order_by_slug_scope.rb
@@ -0,0 +1,29 @@
+module LocalizableOrderBySlugScope
+  extend ActiveSupport::Concern
+
+  # Cf LocalizableOrderByNameScope
+  included do
+    scope :ordered, -> (language) {
+      localization_name_select = <<-SQL
+        COALESCE(
+          MAX(CASE WHEN localizations.language_id = '#{language.id}' THEN TRIM(LOWER(UNACCENT(localizations.slug))) END),
+          MAX(TRIM(LOWER(UNACCENT(localizations.slug)))) FILTER (WHERE localizations.rank = 1)
+        ) AS localization_slug
+      SQL
+
+      joins(sanitize_sql_array([<<-SQL
+        LEFT JOIN (
+          SELECT
+            localizations.*,
+            ROW_NUMBER() OVER(PARTITION BY localizations.about_id ORDER BY localizations.created_at ASC) as rank
+          FROM
+            #{table_name.singularize}_localizations as localizations
+        ) localizations ON #{table_name}.id = localizations.about_id
+      SQL
+      ]))
+      .select("#{table_name}.*", localization_name_select)
+      .group("#{table_name}.id")
+      .order("localization_slug ASC")
+    }
+  end
+end
diff --git a/app/models/education/program.rb b/app/models/education/program.rb
index e8ea74a3f05a2699d97b8e237b4e70bf91f6bf6c..6201137514e25fe88cd30caa48fefe965ab435d5 100644
--- a/app/models/education/program.rb
+++ b/app/models/education/program.rb
@@ -30,7 +30,7 @@ class Education::Program < ApplicationRecord
   include AsIndirectObject
   include Filterable
   include Localizable
-  include LocalizableOrderByNameScope
+  include LocalizableOrderBySlugScope
   include Sanitizable
   include WebsitesLinkable
   include WithAlumni