diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
index a5d456928..f39734eb4 100644
--- a/.idea/inspectionProfiles/Project_Default.xml
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -1,16 +1,12 @@
 
   
     
-    
-    
     
     
       
     
     
-    
     
-    
     
       
       
@@ -25,13 +21,11 @@
       
     
     
-    
     
     
       
       
     
-    
     
     
     
@@ -47,6 +41,5 @@
     
     
     
-    
   
 
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index a9c0c498c..7d0e3b04e 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -380,7 +380,7 @@ android {
         compose true
     }
     composeOptions {
-        kotlinCompilerExtensionVersion '1.3.2'
+        kotlinCompilerExtensionVersion '1.5.8'
     }
     namespace 'fr.free.nrw.commons'
     lint {
diff --git a/app/src/main/java/fr/free/nrw/commons/customselector/database/NotForUploadStatusDao.kt b/app/src/main/java/fr/free/nrw/commons/customselector/database/NotForUploadStatusDao.kt
index b75a6e1d4..872388f40 100644
--- a/app/src/main/java/fr/free/nrw/commons/customselector/database/NotForUploadStatusDao.kt
+++ b/app/src/main/java/fr/free/nrw/commons/customselector/database/NotForUploadStatusDao.kt
@@ -15,19 +15,19 @@ abstract class NotForUploadStatusDao {
      * Insert into Not For Upload status.
      */
     @Insert(onConflict = OnConflictStrategy.REPLACE)
-    abstract suspend fun insert(notForUploadStatus: NotForUploadStatus)
+    abstract fun insert(notForUploadStatus: NotForUploadStatus)
 
     /**
      * Delete Not For Upload status entry.
      */
     @Delete
-    abstract suspend fun delete(notForUploadStatus: NotForUploadStatus)
+    abstract fun delete(notForUploadStatus: NotForUploadStatus)
 
     /**
      * Query Not For Upload status with image sha1.
      */
     @Query("SELECT * FROM images_not_for_upload_table WHERE imageSHA1 = (:imageSHA1) ")
-    abstract suspend fun getFromImageSHA1(imageSHA1: String): NotForUploadStatus?
+    abstract fun getFromImageSHA1(imageSHA1: String): NotForUploadStatus?
 
     /**
      * Asynchronous image sha1 query.
@@ -38,7 +38,7 @@ abstract class NotForUploadStatusDao {
      * Deletion Not For Upload status with image sha1.
      */
     @Query("DELETE FROM images_not_for_upload_table WHERE imageSHA1 = (:imageSHA1) ")
-    abstract suspend fun deleteWithImageSHA1(imageSHA1: String)
+    abstract fun deleteWithImageSHA1(imageSHA1: String)
 
     /**
      * Asynchronous image sha1 deletion.
@@ -49,5 +49,5 @@ abstract class NotForUploadStatusDao {
      * Check whether the imageSHA1 is present in database
      */
     @Query("SELECT COUNT() FROM images_not_for_upload_table WHERE imageSHA1 = (:imageSHA1) ")
-    abstract suspend fun find(imageSHA1: String): Int
+    abstract fun find(imageSHA1: String): Int
 }
diff --git a/app/src/main/java/fr/free/nrw/commons/customselector/database/UploadedStatusDao.kt b/app/src/main/java/fr/free/nrw/commons/customselector/database/UploadedStatusDao.kt
index 378af5b8d..03cbb176f 100644
--- a/app/src/main/java/fr/free/nrw/commons/customselector/database/UploadedStatusDao.kt
+++ b/app/src/main/java/fr/free/nrw/commons/customselector/database/UploadedStatusDao.kt
@@ -17,31 +17,31 @@ abstract class UploadedStatusDao {
      * Insert into uploaded status.
      */
     @Insert(onConflict = OnConflictStrategy.REPLACE)
-    abstract suspend fun insert(uploadedStatus: UploadedStatus)
+    abstract fun insert(uploadedStatus: UploadedStatus)
 
     /**
      * Update uploaded status entry.
      */
     @Update
-    abstract suspend fun update(uploadedStatus: UploadedStatus)
+    abstract fun update(uploadedStatus: UploadedStatus)
 
     /**
      * Delete uploaded status entry.
      */
     @Delete
-    abstract suspend fun delete(uploadedStatus: UploadedStatus)
+    abstract fun delete(uploadedStatus: UploadedStatus)
 
     /**
      * Query uploaded status with image sha1.
      */
     @Query("SELECT * FROM uploaded_table WHERE imageSHA1 = (:imageSHA1) ")
-    abstract suspend fun getFromImageSHA1(imageSHA1: String): UploadedStatus?
+    abstract fun getFromImageSHA1(imageSHA1: String): UploadedStatus?
 
     /**
      * Query uploaded status with modified image sha1.
      */
     @Query("SELECT * FROM uploaded_table WHERE modifiedImageSHA1 = (:modifiedImageSHA1) ")
-    abstract suspend fun getFromModifiedImageSHA1(modifiedImageSHA1: String): UploadedStatus?
+    abstract fun getFromModifiedImageSHA1(modifiedImageSHA1: String): UploadedStatus?
 
     /**
      * Asynchronous insert into uploaded status table.
@@ -55,7 +55,7 @@ abstract class UploadedStatusDao {
      * Check whether the imageSHA1 is present in database
      */
     @Query("SELECT COUNT() FROM uploaded_table WHERE imageSHA1 = (:imageSHA1) AND imageResult = (:imageResult) ")
-    abstract suspend fun findByImageSHA1(
+    abstract fun findByImageSHA1(
         imageSHA1: String,
         imageResult: Boolean,
     ): Int
@@ -66,7 +66,7 @@ abstract class UploadedStatusDao {
     @Query(
         "SELECT COUNT() FROM uploaded_table WHERE modifiedImageSHA1 = (:modifiedImageSHA1) AND modifiedImageResult = (:modifiedImageResult) ",
     )
-    abstract suspend fun findByModifiedImageSHA1(
+    abstract fun findByModifiedImageSHA1(
         modifiedImageSHA1: String,
         modifiedImageResult: Boolean,
     ): Int
diff --git a/app/src/main/java/fr/free/nrw/commons/settings/Prefs.java b/app/src/main/java/fr/free/nrw/commons/settings/Prefs.java
index 334214347..d0451e24c 100644
--- a/app/src/main/java/fr/free/nrw/commons/settings/Prefs.java
+++ b/app/src/main/java/fr/free/nrw/commons/settings/Prefs.java
@@ -8,6 +8,8 @@ public class Prefs {
     public static final String UPLOADS_SHOWING = "uploadsshowing";
     public static final String MANAGED_EXIF_TAGS = "managed_exif_tags";
     public static final String DESCRIPTION_LANGUAGE = "languageDescription";
+    public static final String SECONDARY_LANGUAGE = "languageSecondary";
+
     public static final String APP_UI_LANGUAGE = "appUiLanguage";
     public static final String KEY_THEME_VALUE = "appThemePref";
 
diff --git a/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java b/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java
index 94e799aa2..fee322644 100644
--- a/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java
+++ b/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java
@@ -79,6 +79,7 @@ public class SettingsFragment extends PreferenceFragmentCompat {
 
     private ListPreference themeListPreference;
     private Preference descriptionLanguageListPreference;
+    private Preference descriptionSecondaryLanguageListPreference;
     private Preference appUiLanguageListPreference;
     private String keyLanguageListPreference;
     private TextView recentLanguagesTextView;
@@ -152,6 +153,7 @@ public class SettingsFragment extends PreferenceFragmentCompat {
         appUiLanguageListPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
             @Override
             public boolean onPreferenceClick(Preference preference) {
+                System.out.println("Clicked appui");
                 prepareAppLanguages(appUiLanguageListPreference.getKey());
                 return true;
             }
@@ -178,6 +180,28 @@ public class SettingsFragment extends PreferenceFragmentCompat {
             }
         });
 
+        descriptionSecondaryLanguageListPreference = findPreference("descriptionSecondaryLanguagePref");
+        assert descriptionSecondaryLanguageListPreference != null;
+        keyLanguageListPreference = descriptionSecondaryLanguageListPreference.getKey();
+        languageCode = getCurrentLanguageCode(keyLanguageListPreference);
+        assert languageCode != null;
+        if (languageCode.equals("")) {
+            // If current language code is empty, means none selected by user yet so use phone local
+            descriptionSecondaryLanguageListPreference.setSummary(Locale.getDefault().getDisplayLanguage());
+        } else {
+            // If any language is selected by user previously, use it
+            Locale defLocale = createLocale(languageCode);
+            descriptionSecondaryLanguageListPreference.setSummary(defLocale.getDisplayLanguage(defLocale));
+        }
+        descriptionSecondaryLanguageListPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
+            @Override
+            public boolean onPreferenceClick(Preference preference) {
+                System.out.println("clickedseco");
+                prepareAppLanguages(descriptionSecondaryLanguageListPreference.getKey());
+                return true;
+            }
+        });
+
         Preference betaTesterPreference = findPreference("becomeBetaTester");
         betaTesterPreference.setOnPreferenceClickListener(preference -> {
             Utils.handleWebUrl(getActivity(), Uri.parse(getResources().getString(R.string.beta_opt_in_link)));
@@ -205,6 +229,7 @@ public class SettingsFragment extends PreferenceFragmentCompat {
             findPreference("useAuthorName").setEnabled(false);
             findPreference("displayNearbyCardView").setEnabled(false);
             findPreference("descriptionDefaultLanguagePref").setEnabled(false);
+            findPreference("descriptionSecondaryLanguagePref").setEnabled(false);
             findPreference("displayLocationPermissionForCardView").setEnabled(false);
             findPreference(CampaignView.CAMPAIGNS_DEFAULT_PREFERENCE).setEnabled(false);
             findPreference("managed_exif_tags").setEnabled(false);
@@ -278,6 +303,8 @@ public class SettingsFragment extends PreferenceFragmentCompat {
      */
     private void prepareAppLanguages(final String keyListPreference) {
 
+        System.out.println("gets to prepare app languages");
+
         // Gets current language code from shared preferences
         final String languageCode = getCurrentLanguageCode(keyListPreference);
         final List recentLanguages = recentLanguagesDao.getRecentLanguages();
@@ -300,7 +327,16 @@ public class SettingsFragment extends PreferenceFragmentCompat {
             } else {
                 selectedLanguages.put(0, languageCode);
             }
+        } else if (keyListPreference.equals("descriptionSecondaryLanguagePref")) {
+
+        assert languageCode != null;
+        if (languageCode.equals("")) {
+            selectedLanguages.put(0, Locale.getDefault().getLanguage());
+
+        } else {
+            selectedLanguages.put(0, languageCode);
         }
+    }
 
         LanguagesAdapter languagesAdapter = new LanguagesAdapter(
             getActivity(),
@@ -368,9 +404,12 @@ public class SettingsFragment extends PreferenceFragmentCompat {
                     getActivity().recreate();
                     final Intent intent = new Intent(getActivity(), MainActivity.class);
                     startActivity(intent);
-                }else {
+                }else if(keyListPreference.equals("descriptionDefaultLanguagePref")){
                     descriptionLanguageListPreference.setSummary(defLocale.getDisplayLanguage(defLocale));
                 }
+                else{
+                    descriptionSecondaryLanguageListPreference.setSummary(defLocale.getDisplayLanguage(defLocale));
+                }
                 dialog.dismiss();
             }
         });
@@ -496,6 +535,8 @@ public class SettingsFragment extends PreferenceFragmentCompat {
             defaultKvStore.putString(Prefs.APP_UI_LANGUAGE, userSelectedValue);
         } else if (preferenceKey.equals("descriptionDefaultLanguagePref")) {
             defaultKvStore.putString(Prefs.DESCRIPTION_LANGUAGE, userSelectedValue);
+        } else if (preferenceKey.equals("descriptionSecondaryLanguagePref")) {
+            defaultKvStore.putString(Prefs.SECONDARY_LANGUAGE, userSelectedValue);
         }
     }
 
@@ -511,6 +552,9 @@ public class SettingsFragment extends PreferenceFragmentCompat {
         if (preferenceKey.equals("descriptionDefaultLanguagePref")) {
             return defaultKvStore.getString(Prefs.DESCRIPTION_LANGUAGE, "");
         }
+        if (preferenceKey.equals("descriptionSecondaryLanguagePref")) {
+            return defaultKvStore.getString(Prefs.SECONDARY_LANGUAGE, "");
+        }
         return null;
     }
 
diff --git a/app/src/main/java/fr/free/nrw/commons/upload/categories/BaseDelegateAdapter.kt b/app/src/main/java/fr/free/nrw/commons/upload/categories/BaseDelegateAdapter.kt
index f1e4917a0..d20129475 100644
--- a/app/src/main/java/fr/free/nrw/commons/upload/categories/BaseDelegateAdapter.kt
+++ b/app/src/main/java/fr/free/nrw/commons/upload/categories/BaseDelegateAdapter.kt
@@ -10,16 +10,14 @@ abstract class BaseDelegateAdapter(
     areContentsTheSame: (T, T) -> Boolean = { old, new -> old == new },
 ) : AsyncListDifferDelegationAdapter(
         object : DiffUtil.ItemCallback() {
-            override fun areItemsTheSame(
-                oldItem: T,
-                newItem: T,
-            ) = areItemsTheSame(oldItem, newItem)
+            override fun areItemsTheSame(oldItem: T & Any, newItem: T & Any): Boolean {
+                return areItemsTheSame(oldItem, newItem)
+            }
 
-            override fun areContentsTheSame(
-                oldItem: T,
-                newItem: T,
-            ) = areContentsTheSame(oldItem, newItem)
-        },
+            override fun areContentsTheSame(oldItem: T & Any, newItem: T & Any): Boolean {
+                return areContentsTheSame(oldItem, newItem)
+            }
+            },
         *delegates,
     ) {
     fun addAll(newResults: List) {
diff --git a/app/src/main/java/fr/free/nrw/commons/upload/depicts/DepictsDao.kt b/app/src/main/java/fr/free/nrw/commons/upload/depicts/DepictsDao.kt
index 684400301..c20d65abf 100644
--- a/app/src/main/java/fr/free/nrw/commons/upload/depicts/DepictsDao.kt
+++ b/app/src/main/java/fr/free/nrw/commons/upload/depicts/DepictsDao.kt
@@ -22,16 +22,16 @@ abstract class DepictsDao {
     private val maxItemsAllowed = 10
 
     @Insert(onConflict = OnConflictStrategy.REPLACE)
-    abstract suspend fun insert(depictedItem: Depicts)
+    abstract fun insert(depictedItem: Depicts)
 
     @Query("Select * From depicts_table order by lastUsed DESC")
-    abstract suspend fun getAllDepicts(): List
+    abstract fun getAllDepicts(): List
 
     @Query("Select * From depicts_table order by lastUsed DESC LIMIT :n OFFSET 10")
-    abstract suspend fun getDepictsForDeletion(n: Int): List
+    abstract fun getDepictsForDeletion(n: Int): List
 
     @Delete
-    abstract suspend fun delete(depicts: Depicts)
+    abstract fun delete(depicts: Depicts)
 
     /**
      * Gets all Depicts objects from the database, ordered by lastUsed in descending order.
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 0c6be3129..9cf667e46 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -544,6 +544,7 @@ Upload your first media by tapping on the add button.
   Why should %1$s be deleted?
   %1$s is uploaded by: %2$s
   Default description language
+  Secondary Description Language
   Nominating for deletion
   Success
   Nominated %1$s for deletion.
diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml
index 8ac890545..aeca0d45c 100644
--- a/app/src/main/res/xml/preferences.xml
+++ b/app/src/main/res/xml/preferences.xml
@@ -25,12 +25,20 @@
           app:singleLineTitle="false"
           android:title="@string/app_ui_language" />
 
+
         
 
+        
+        
+