Enable sub-languages on app first run (#7127)
* Enable sub-languages on app first run. * Fix wrong language code string parsing. * Fix some build issues due to rebase. * Use PreferenceHelper and remove an extra preference. * Remove a constant.
This commit is contained in:
parent
532f662b05
commit
084e6a964e
@ -17,6 +17,7 @@ import eu.kanade.tachiyomi.ui.library.setting.LibrarySort
|
|||||||
import eu.kanade.tachiyomi.ui.reader.setting.OrientationType
|
import eu.kanade.tachiyomi.ui.reader.setting.OrientationType
|
||||||
import eu.kanade.tachiyomi.ui.reader.setting.ReadingModeType
|
import eu.kanade.tachiyomi.ui.reader.setting.ReadingModeType
|
||||||
import eu.kanade.tachiyomi.util.system.DeviceUtil
|
import eu.kanade.tachiyomi.util.system.DeviceUtil
|
||||||
|
import eu.kanade.tachiyomi.util.system.LocaleHelper
|
||||||
import eu.kanade.tachiyomi.util.system.isDevFlavor
|
import eu.kanade.tachiyomi.util.system.isDevFlavor
|
||||||
import eu.kanade.tachiyomi.widget.ExtendedNavigationView
|
import eu.kanade.tachiyomi.widget.ExtendedNavigationView
|
||||||
import java.io.File
|
import java.io.File
|
||||||
@ -170,7 +171,7 @@ class PreferencesHelper(val context: Context) {
|
|||||||
|
|
||||||
fun sourceDisplayMode() = flowPrefs.getObject("pref_display_mode_catalogue", LibraryDisplayMode.Serializer, LibraryDisplayMode.default)
|
fun sourceDisplayMode() = flowPrefs.getObject("pref_display_mode_catalogue", LibraryDisplayMode.Serializer, LibraryDisplayMode.default)
|
||||||
|
|
||||||
fun enabledLanguages() = flowPrefs.getStringSet("source_languages", setOf("all", "en", Locale.getDefault().language))
|
fun enabledLanguages() = flowPrefs.getStringSet("source_languages", LocaleHelper.getDefaultEnabledLanguages())
|
||||||
|
|
||||||
fun trackUsername(sync: TrackService) = prefs.getString(Keys.trackUsername(sync.id), "")
|
fun trackUsername(sync: TrackService) = prefs.getString(Keys.trackUsername(sync.id), "")
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@ import eu.kanade.domain.source.model.SourceData
|
|||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||||
import eu.kanade.tachiyomi.extension.api.ExtensionGithubApi
|
import eu.kanade.tachiyomi.extension.api.ExtensionGithubApi
|
||||||
|
import eu.kanade.tachiyomi.extension.model.AvailableSources
|
||||||
import eu.kanade.tachiyomi.extension.model.Extension
|
import eu.kanade.tachiyomi.extension.model.Extension
|
||||||
import eu.kanade.tachiyomi.extension.model.InstallStep
|
import eu.kanade.tachiyomi.extension.model.InstallStep
|
||||||
import eu.kanade.tachiyomi.extension.model.LoadResult
|
import eu.kanade.tachiyomi.extension.model.LoadResult
|
||||||
@ -27,6 +28,7 @@ import logcat.LogPriority
|
|||||||
import rx.Observable
|
import rx.Observable
|
||||||
import uy.kohesive.injekt.Injekt
|
import uy.kohesive.injekt.Injekt
|
||||||
import uy.kohesive.injekt.api.get
|
import uy.kohesive.injekt.api.get
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The manager of extensions installed as another apk which extend the available sources. It handles
|
* The manager of extensions installed as another apk which extend the available sources. It handles
|
||||||
@ -72,6 +74,8 @@ class ExtensionManager(
|
|||||||
|
|
||||||
private val installedExtensionsFlow = MutableStateFlow(installedExtensions)
|
private val installedExtensionsFlow = MutableStateFlow(installedExtensions)
|
||||||
|
|
||||||
|
private var subLanguagesEnabledOnFirstRun = preferences.enabledLanguages().isSet()
|
||||||
|
|
||||||
fun getInstalledExtensionsFlow(): StateFlow<List<Extension.Installed>> {
|
fun getInstalledExtensionsFlow(): StateFlow<List<Extension.Installed>> {
|
||||||
return installedExtensionsFlow.asStateFlow()
|
return installedExtensionsFlow.asStateFlow()
|
||||||
}
|
}
|
||||||
@ -163,9 +167,41 @@ class ExtensionManager(
|
|||||||
emptyList()
|
emptyList()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enableAdditionalSubLanguages(extensions)
|
||||||
|
|
||||||
availableExtensions = extensions
|
availableExtensions = extensions
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enables the additional sub-languages in the app first run. This addresses
|
||||||
|
* the issue where users still need to enable some specific languages even when
|
||||||
|
* the device language is inside that major group. As an example, if a user
|
||||||
|
* has a zh device language, the app will also enable zh-Hans and zh-Hant.
|
||||||
|
*
|
||||||
|
* If the user have already changed the enabledLanguages preference value once,
|
||||||
|
* the new languages will not be added to respect the user enabled choices.
|
||||||
|
*/
|
||||||
|
private fun enableAdditionalSubLanguages(extensions: List<Extension.Available>) {
|
||||||
|
if (subLanguagesEnabledOnFirstRun || extensions.isEmpty()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use the source lang as some aren't present on the extension level.
|
||||||
|
val availableLanguages = extensions
|
||||||
|
.flatMap(Extension.Available::sources)
|
||||||
|
.distinctBy(AvailableSources::lang)
|
||||||
|
.map(AvailableSources::lang)
|
||||||
|
|
||||||
|
val deviceLanguage = Locale.getDefault().language
|
||||||
|
val defaultLanguages = preferences.enabledLanguages().defaultValue
|
||||||
|
val languagesToEnable = availableLanguages.filter {
|
||||||
|
it != deviceLanguage && it.startsWith(deviceLanguage)
|
||||||
|
}
|
||||||
|
|
||||||
|
preferences.enabledLanguages().set(defaultLanguages + languagesToEnable)
|
||||||
|
subLanguagesEnabledOnFirstRun = true
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the update field of the installed extensions with the given [availableExtensions].
|
* Sets the update field of the installed extensions with the given [availableExtensions].
|
||||||
*
|
*
|
||||||
|
@ -37,20 +37,15 @@ object LocaleHelper {
|
|||||||
val locale = if (lang.isEmpty()) {
|
val locale = if (lang.isEmpty()) {
|
||||||
LocaleListCompat.getAdjustedDefault()[0]
|
LocaleListCompat.getAdjustedDefault()[0]
|
||||||
} else {
|
} else {
|
||||||
getLocale(lang)
|
Locale.forLanguageTag(lang)
|
||||||
}
|
}
|
||||||
return locale!!.getDisplayName(locale).replaceFirstChar { it.uppercase(locale) }
|
return locale!!.getDisplayName(locale).replaceFirstChar { it.uppercase(locale) }
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return Locale from string language code
|
* Return the default languages enabled for the sources.
|
||||||
*/
|
*/
|
||||||
private fun getLocale(lang: String): Locale {
|
fun getDefaultEnabledLanguages(): Set<String> {
|
||||||
val sp = lang.split("_", "-")
|
return setOf("all", "en", Locale.getDefault().language)
|
||||||
return when (sp.size) {
|
|
||||||
2 -> Locale(sp[0], sp[1])
|
|
||||||
3 -> Locale(sp[0], sp[1], sp[2])
|
|
||||||
else -> Locale(lang)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user