New languages (#318)

* Added Hindi language support

* Added Simplified Chinese support and implemented search in language selection dialog

* Added support for Italian, Polish, Vietnamese, and Brazilian Portuguese languages

* Added Belarusian language support and fixed activity recreation on locale change
This commit is contained in:
Aryan 2026-05-16 20:07:59 +05:30 committed by GitHub
parent 056485a140
commit 70c272baa7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
26 changed files with 7931 additions and 301 deletions

View file

@ -1,26 +1,99 @@
package com.aryan.reader
import androidx.annotation.StringRes
import java.text.Normalizer
import java.util.Locale
data class AppLanguageOption(
val tag: String?,
@StringRes val labelRes: Int
@StringRes val labelRes: Int,
val searchAliases: List<String> = emptyList()
)
val systemAppLanguageOption = AppLanguageOption(null, R.string.language_system_default)
val systemAppLanguageOption = AppLanguageOption(
tag = null,
labelRes = R.string.language_system_default,
searchAliases = listOf("system", "default", "device", "automatic")
)
val supportedAppLanguageOptions = listOf(
AppLanguageOption("en", R.string.language_english),
AppLanguageOption("ar", R.string.language_arabic),
AppLanguageOption("de", R.string.language_german),
AppLanguageOption("tr", R.string.language_turkish),
AppLanguageOption("fr", R.string.language_french),
AppLanguageOption("ru", R.string.language_russian),
AppLanguageOption("es", R.string.language_spanish)
AppLanguageOption("en", R.string.language_english, listOf("english")),
AppLanguageOption("ar", R.string.language_arabic, listOf("arabic", "arabi")),
AppLanguageOption("de", R.string.language_german, listOf("german", "deutsch")),
AppLanguageOption("tr", R.string.language_turkish, listOf("turkish", "turkce", "turkçe")),
AppLanguageOption("fr", R.string.language_french, listOf("french", "francais", "français")),
AppLanguageOption("ru", R.string.language_russian, listOf("russian", "russkiy", "русский")),
AppLanguageOption("be", R.string.language_belarusian, listOf("belarusian", "belarus", "belaruskaya")),
AppLanguageOption("es", R.string.language_spanish, listOf("spanish", "espanol", "español")),
AppLanguageOption(
"pt-BR",
R.string.language_portuguese_brazilian,
listOf(
"portuguese",
"brazilian portuguese",
"portugues",
"português",
"portugues brasileiro",
"português brasileiro",
"brasil",
"brazil",
"pt-br"
)
),
AppLanguageOption("it", R.string.language_italian, listOf("italian", "italiano", "italia", "italy")),
AppLanguageOption("pl", R.string.language_polish, listOf("polish", "polski", "polska")),
AppLanguageOption(
"vi",
R.string.language_vietnamese,
listOf("vietnamese", "vietnam", "tieng viet", "tiếng việt")
),
AppLanguageOption("hi", R.string.language_hindi, listOf("hindi", "devanagari", "हिंदी", "हिन्दी")),
AppLanguageOption(
tag = "zh-CN",
labelRes = R.string.language_chinese_simplified,
searchAliases = listOf(
"chinese",
"simplified chinese",
"mandarin",
"zhongwen",
"jian ti zhong wen",
"zh-hans",
"zh-cn",
"中文",
"简体中文",
)
)
)
val appLanguageSelectionOptions = listOf(systemAppLanguageOption) + supportedAppLanguageOptions
fun AppLanguageOption.matchesLanguageSearch(label: String, query: String): Boolean {
val searchTokens = query.normalizedLanguageSearchTokens()
if (searchTokens.isEmpty()) return true
val searchableText = buildString {
append(label)
append(' ')
append(tag.orEmpty())
append(' ')
append(searchAliases.joinToString(" "))
}.normalizedLanguageSearchText()
return searchTokens.all { token -> token in searchableText }
}
private fun String.normalizedLanguageSearchTokens(): List<String> =
normalizedLanguageSearchText()
.split(' ')
.filter { it.isNotBlank() }
private fun String.normalizedLanguageSearchText(): String =
Normalizer.normalize(this, Normalizer.Form.NFD)
.replace("\\p{Mn}+".toRegex(), "")
.lowercase(Locale.ROOT)
.replace("[^\\p{L}\\p{N}]+".toRegex(), " ")
.trim()
val AddBooksSource.labelRes: Int
@StringRes get() = when (this) {
AddBooksSource.UNSHELVED -> R.string.add_books_source_unshelved