| 
					
				 | 
			
			
				@@ -4,14 +4,18 @@ import android.app.Activity 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import android.content.Context 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import android.os.Build 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import androidx.annotation.StringRes 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import androidx.appcompat.app.AppCompatDelegate 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import androidx.compose.runtime.Composable 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import androidx.compose.runtime.LaunchedEffect 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import androidx.compose.runtime.ReadOnlyComposable 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import androidx.compose.runtime.getValue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import androidx.compose.runtime.mutableStateOf 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import androidx.compose.runtime.remember 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import androidx.compose.runtime.setValue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import androidx.compose.ui.platform.LocalContext 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import androidx.compose.ui.res.stringResource 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import androidx.core.app.ActivityCompat 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import androidx.core.os.LocaleListCompat 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import eu.kanade.domain.ui.UiPreferences 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import eu.kanade.domain.ui.model.TabletUiMode 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import eu.kanade.domain.ui.model.ThemeMode 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -19,10 +23,12 @@ import eu.kanade.domain.ui.model.setAppCompatDelegateThemeMode 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import eu.kanade.presentation.more.settings.Preference 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import eu.kanade.presentation.util.collectAsState 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import eu.kanade.tachiyomi.R 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import eu.kanade.tachiyomi.util.system.LocaleHelper 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import eu.kanade.tachiyomi.util.system.toast 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import kotlinx.coroutines.flow.collectLatest 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import kotlinx.coroutines.flow.drop 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import kotlinx.coroutines.flow.merge 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.xmlpull.v1.XmlPullParser 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import uy.kohesive.injekt.Injekt 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import uy.kohesive.injekt.api.get 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.Date 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -103,9 +109,30 @@ object SettingsAppearanceScreen : SearchableSettings { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         context: Context, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         uiPreferences: UiPreferences, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ): Preference.PreferenceGroup { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        val langs = remember { getLangs(context) } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        var currentLanguage by remember { mutableStateOf(AppCompatDelegate.getApplicationLocales().get(0)?.toLanguageTag() ?: "") } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        LaunchedEffect(currentLanguage) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            val locale = if (currentLanguage.isEmpty()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                LocaleListCompat.getEmptyLocaleList() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                LocaleListCompat.forLanguageTags(currentLanguage) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            AppCompatDelegate.setApplicationLocales(locale) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return Preference.PreferenceGroup( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             title = stringResource(R.string.pref_category_display), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             preferenceItems = listOf( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Preference.PreferenceItem.BasicListPreference( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    value = currentLanguage, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    title = stringResource(R.string.pref_app_language), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    entries = langs, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    onValueChanged = { newValue -> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        currentLanguage = newValue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 Preference.PreferenceItem.ListPreference( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     pref = uiPreferences.tabletUiMode(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     title = stringResource(R.string.pref_tablet_ui_mode), 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -146,6 +173,31 @@ object SettingsAppearanceScreen : SearchableSettings { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             ), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private fun getLangs(context: Context): Map<String, String> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        val langs = mutableListOf<Pair<String, String>>() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        val parser = context.resources.getXml(R.xml.locales_config) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        var eventType = parser.eventType 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        while (eventType != XmlPullParser.END_DOCUMENT) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (eventType == XmlPullParser.START_TAG && parser.name == "locale") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                for (i in 0 until parser.attributeCount) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (parser.getAttributeName(i) == "name") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        val langTag = parser.getAttributeValue(i) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        val displayName = LocaleHelper.getDisplayName(langTag) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (displayName.isNotEmpty()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            langs.add(Pair(langTag, displayName)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            eventType = parser.next() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        langs.sortBy { it.second } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        langs.add(0, Pair("", context.getString(R.string.label_default))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return langs.toMap() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 private val DateFormats = listOf( 
			 |