refactor(locale): Simplify locale list parsing

This commit is contained in:
Ahmad Ansori Palembani 2024-11-27 13:24:44 +07:00
parent 0c6f86c1ae
commit 65682bb5bd
Signed by: null2264
GPG key ID: BA64F8B60AF3EFB6
5 changed files with 53 additions and 65 deletions

View file

@ -88,7 +88,7 @@ class ExtensionHolder(view: View, val adapter: ExtensionAdapter) :
append(extension.name + " ")
color(binding.extTitle.context.getResourceColor(AR.attr.textColorSecondary)) {
scale(0.75f) {
append(LocaleHelper.getDisplayName(extension.lang))
append(LocaleHelper.getLocalizedDisplayName(extension.lang))
}
}
}
@ -97,7 +97,7 @@ class ExtensionHolder(view: View, val adapter: ExtensionAdapter) :
}
binding.version.text = infoText.joinToString("")
binding.lang.text = LocaleHelper.getDisplayName(extension.lang)
binding.lang.text = LocaleHelper.getLocalizedDisplayName(extension.lang)
binding.warning.text = when {
extension.isNsfw -> itemView.context.getString(MR.strings.nsfw_short)
else -> ""

View file

@ -493,7 +493,7 @@ class StatsDetailsPresenter(
} else {
sourceManager.get(source)?.lang
} ?: return context.getString(MR.strings.unknown)
return LocaleHelper.getDisplayName(code)
return LocaleHelper.getLocalizedDisplayName(code)
}
/**

View file

@ -13,7 +13,6 @@ import eu.kanade.tachiyomi.BuildConfig
import eu.kanade.tachiyomi.R
import yokai.i18n.MR
import yokai.util.lang.getString
import dev.icerock.moko.resources.compose.stringResource
import eu.kanade.tachiyomi.data.updater.AppDownloadInstallJob
import eu.kanade.tachiyomi.ui.setting.SettingsLegacyController
import eu.kanade.tachiyomi.ui.setting.ThemePreference
@ -31,6 +30,7 @@ import eu.kanade.tachiyomi.ui.setting.switchPreference
import eu.kanade.tachiyomi.ui.setting.titleMRes as titleRes
import eu.kanade.tachiyomi.util.lang.addBetaTag
import eu.kanade.tachiyomi.util.lang.compareToCaseInsensitiveNaturalOrder
import eu.kanade.tachiyomi.util.system.LocaleHelper
import eu.kanade.tachiyomi.util.system.systemLangContext
import yokai.domain.base.BasePreferences
import java.util.*
@ -159,7 +159,7 @@ class SettingsGeneralController : SettingsLegacyController() {
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
listPreference(activity) {
key = "language"
bindTo(preferences.appLanguage())
isPersistent = false
title = context.getString(MR.strings.language).let {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
@ -169,50 +169,35 @@ class SettingsGeneralController : SettingsLegacyController() {
}
}
dialogTitleRes = MR.strings.language
val locales = mutableListOf<String>()
val availLocales = Locale.getAvailableLocales()
resources?.getXml(R.xml.locales_config).use { parser ->
parser ?: return@use
while (parser.next() != XmlResourceParser.END_DOCUMENT) {
if (parser.eventType == XmlResourceParser.START_TAG && parser.name == "locale") {
val locale = parser.getAttributeValue(
"http://schemas.android.com/apk/res/android",
"name",
) ?: continue
if (availLocales.contains(Locale.forLanguageTag(locale))) {
locales.add(locale)
val langs = mutableListOf<Language>()
val parser = context.resources.getXml(R.xml.locales_config)
var eventType = parser.eventType
while (eventType != XmlResourceParser.END_DOCUMENT) {
if (eventType == XmlResourceParser.START_TAG && parser.name == "locale") {
for (i in 0..<parser.attributeCount) {
if (parser.getAttributeName(i) == "name") {
val langTag = parser.getAttributeValue(i)
val displayName = LocaleHelper.getLocalizedDisplayName(langTag)
if (displayName.isNotEmpty()) {
langs.add(Language(langTag, displayName, LocaleHelper.getDisplayName(langTag)))
}
}
}
}
eventType = parser.next()
}
val localesMap = locales.associateBy { Locale.forLanguageTag(it) }
.toSortedMap { locale1, locale2 ->
val l1 = locale1.getDisplayName(locale1)
.replaceFirstChar { it.uppercase(locale1) }
val l2 = locale2.getDisplayName(locale2)
.replaceFirstChar { it.uppercase(locale2) }
l1.compareToCaseInsensitiveNaturalOrder(l2)
}
val localArray = localesMap.keys.filterNotNull().toTypedArray()
val localeList = LocaleListCompat.create(*localArray)
val sysDef = context.systemLangContext.getString(MR.strings.system_default)
entries = listOf(sysDef) + localesMap.keys.map { locale ->
locale.getDisplayName(locale).replaceFirstChar { it.uppercase(locale) }
}
entryValues = listOf("") + localesMap.values
langs.sortBy { it.displayName }
langs.add(0, Language("", context.systemLangContext.getString(MR.strings.system_default), null))
entries = langs.map { it.localizedDisplayName }
entryValues = langs.map { it.tag }
defaultValue = ""
val locale = AppCompatDelegate.getApplicationLocales()
.getFirstMatch(locales.toTypedArray())
val locale = AppCompatDelegate.getApplicationLocales().get(0)?.toLanguageTag()
if (locale != null) {
tempValue = localArray.indexOf(
if (locales.contains(locale.toLanguageTag())) {
locale
} else {
localeList.getFirstMatch(arrayOf(locale.toLanguageTag()))
},
) + 1
tempEntry =
locale.getDisplayName(locale).replaceFirstChar { it.uppercase(locale) }
langs.find { it.tag == locale }?.let { tempValue = langs.indexOf(it) + 1 }
}
onChange {
@ -277,4 +262,10 @@ class SettingsGeneralController : SettingsLegacyController() {
themePreference?.lastScrollPostionLight = lastThemeXLight
themePreference?.lastScrollPostionDark = lastThemeXDark
}
data class Language(
val tag: String,
val localizedDisplayName: String,
val displayName: String?,
)
}

View file

@ -57,7 +57,7 @@ class GlobalSearchHolder(view: View, val adapter: GlobalSearchAdapter) :
// Set Title with country code if available.
binding.title.text = titlePrefix + source.name + langSuffix
binding.subtitle.isVisible = source !is LocalSource
binding.subtitle.text = LocaleHelper.getDisplayName(source.lang)
binding.subtitle.text = LocaleHelper.getLocalizedDisplayName(source.lang)
when {
results == null -> {

View file

@ -2,10 +2,8 @@ package eu.kanade.tachiyomi.util.system
import android.content.Context
import androidx.core.os.LocaleListCompat
import eu.kanade.tachiyomi.R
import yokai.i18n.MR
import yokai.util.lang.getString
import dev.icerock.moko.resources.compose.stringResource
import eu.kanade.tachiyomi.ui.source.SourcePresenter
import java.util.Locale
@ -23,37 +21,36 @@ object LocaleHelper {
SourcePresenter.LAST_USED_KEY -> context.getString(MR.strings.last_used)
SourcePresenter.PINNED_KEY -> context.getString(MR.strings.pinned)
"all" -> context.getString(MR.strings.all)
else -> getDisplayName(lang)
else -> getLocalizedDisplayName(lang)
}
}
fun getDisplayName(lang: String): String {
val normalizedLang = when (lang) {
"zh-CN" -> "zh-Hans"
"zh-TW" -> "zh-Hant"
else -> lang
}
return Locale.forLanguageTag(normalizedLang).displayName
}
/**
* Returns Display name of a string language code
*
* @param lang empty for system language
*/
fun getDisplayName(lang: String?): String {
fun getLocalizedDisplayName(lang: String?): String {
if (lang == null) {
return ""
}
val locale = if (lang.isEmpty()) {
LocaleListCompat.getAdjustedDefault()[0]
} else {
getLocale(lang)
} ?: Locale.getDefault()
return locale.getDisplayName(locale).replaceFirstChar { it.uppercase(locale) }
}
/**
* Return Locale from string language code
*/
private fun getLocale(lang: String): Locale {
val sp = lang.split("_", "-")
return when (sp.size) {
2 -> Locale(sp[0], sp[1])
3 -> Locale(sp[0], sp[1], sp[2])
else -> Locale(lang)
val locale = when (lang) {
"" -> LocaleListCompat.getAdjustedDefault()[0]
"zh-CN" -> Locale.forLanguageTag("zh-Hans")
"zh-TW" -> Locale.forLanguageTag("zh-Hant")
else -> Locale.forLanguageTag(lang)
}
return locale!!.getDisplayName(locale).replaceFirstChar { it.uppercase(locale) }
}
}