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

@ -47,6 +47,7 @@ import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.navigationBars
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
@ -71,6 +72,7 @@ import androidx.compose.material.icons.filled.Info
import androidx.compose.material.icons.filled.Menu
import androidx.compose.material.icons.filled.MoreVert
import androidx.compose.material.icons.filled.PhoneAndroid
import androidx.compose.material.icons.filled.Search
import androidx.compose.material.icons.filled.Settings
import androidx.compose.material.icons.filled.VerifiedUser
import androidx.compose.material.icons.outlined.AccountCircle
@ -2183,31 +2185,78 @@ fun CreateAppThemeDialog(
@Composable
fun LanguageSelectionDialog(onDismiss: () -> Unit) {
val context = LocalContext.current
val currentLocales = AppCompatDelegate.getApplicationLocales()
val currentTag = if (!currentLocales.isEmpty) currentLocales.get(0)?.toLanguageTag() else null
var languageSearchQuery by remember { mutableStateOf("") }
val languageRows = appLanguageSelectionOptions
.map { language -> language to stringResource(language.labelRes) }
.filter { (language, label) ->
language.matchesLanguageSearch(label = label, query = languageSearchQuery)
}
AlertDialog(
onDismissRequest = onDismiss,
title = { Text(stringResource(R.string.options_language)) },
text = {
Column {
appLanguageSelectionOptions.forEach { language ->
Row(
androidx.compose.material3.OutlinedTextField(
value = languageSearchQuery,
onValueChange = { languageSearchQuery = it },
modifier = Modifier.fillMaxWidth(),
singleLine = true,
label = { Text(stringResource(R.string.action_search)) },
leadingIcon = {
Icon(Icons.Default.Search, contentDescription = null)
},
trailingIcon = {
if (languageSearchQuery.isNotBlank()) {
IconButton(onClick = { languageSearchQuery = "" }) {
Icon(
Icons.Default.Close,
contentDescription = stringResource(R.string.action_clear)
)
}
}
}
)
Spacer(modifier = Modifier.height(12.dp))
if (languageRows.isEmpty()) {
Text(
text = stringResource(R.string.search_no_results_simple),
modifier = Modifier.padding(vertical = 12.dp),
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant
)
} else {
LazyColumn(
modifier = Modifier
.fillMaxWidth()
.clickable {
val locales = language.tag?.let { tag ->
LocaleListCompat.forLanguageTags(tag)
} ?: LocaleListCompat.getEmptyLocaleList()
AppCompatDelegate.setApplicationLocales(locales)
onDismiss()
}
.padding(vertical = 12.dp),
verticalAlignment = Alignment.CenterVertically
.heightIn(max = 360.dp)
) {
RadioButton(selected = currentTag == language.tag, onClick = null)
Spacer(modifier = Modifier.width(16.dp))
Text(stringResource(language.labelRes))
items(
items = languageRows,
key = { (language, _) -> language.tag ?: "system" }
) { (language, label) ->
Row(
modifier = Modifier
.fillMaxWidth()
.clickable {
val locales = language.tag?.let { tag ->
LocaleListCompat.forLanguageTags(tag)
} ?: LocaleListCompat.getEmptyLocaleList()
AppCompatDelegate.setApplicationLocales(locales)
onDismiss()
context.findActivity()?.recreate()
}
.padding(vertical = 12.dp),
verticalAlignment = Alignment.CenterVertically
) {
RadioButton(selected = currentTag == language.tag, onClick = null)
Spacer(modifier = Modifier.width(16.dp))
Text(label)
}
}
}
}
}

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

View file

@ -644,5 +644,12 @@
<string name="sign_in_to_purchase_credits">يرجى تسجيل الدخول إلى حساب Google الخاص بك لشراء رصيد.</string>
<string name="language_system_default">لغة النظام</string>
<string name="language_english">English (الإنجليزية)</string>
<string name="language_belarusian">Беларуская (البيلاروسية)</string>
<string name="language_spanish">Español (الإسبانية)</string>
<string name="language_portuguese_brazilian">Português (Brasil) (البرتغالية البرازيلية)</string>
<string name="language_italian">Italiano (الإيطالية)</string>
<string name="language_polish">Polski (البولندية)</string>
<string name="language_vietnamese">Tiếng Việt (الفيتنامية)</string>
<string name="language_hindi">हिन्दी (الهندية)</string>
<string name="language_chinese_simplified">简体中文 (الصينية المبسطة)</string>
</resources>

View file

@ -4,78 +4,78 @@
<item quantity="one">%1$d кніга</item>
<item quantity="few">%1$d кнігі</item>
<item quantity="many">%1$d кніг</item>
<item quantity="other">%1$d кніг</item>
<item quantity="other">%1$d кнігі</item>
</plurals>
<plurals name="book_word">
<item quantity="one">кніга</item>
<item quantity="few">кнігі</item>
<item quantity="many">кніг</item>
<item quantity="other">кніг</item>
<item quantity="other">кнігі</item>
</plurals>
<plurals name="shelf_count">
<item quantity="one">%1$d паліца</item>
<item quantity="few">%1$d паліцы</item>
<item quantity="many">%1$d паліц</item>
<item quantity="other">%1$d паліц</item>
<item quantity="other">%1$d паліцы</item>
</plurals>
<plurals name="search_results_count">
<item quantity="one">Знойдзены %1$d вынік</item>
<item quantity="few">Знойдзена %1$d выніку</item>
<item quantity="many">Знойдзены %1$d вынікаў</item>
<item quantity="other">Знойдзены %1$d вынікаў</item>
<item quantity="few">Знойдзены %1$d вынікі</item>
<item quantity="many">Знойдзена %1$d вынікаў</item>
<item quantity="other">Знойдзена %1$d выніку</item>
</plurals>
<plurals name="search_matches_count">
<item quantity="one">Знойдзена %1$d супадзенне</item>
<item quantity="few">Знойдзена %1$d супадзення</item>
<item quantity="few">Знойдзены %1$d супадзенні</item>
<item quantity="many">Знойдзена %1$d супадзенняў</item>
<item quantity="other">Знойдзена %1$d супадзенняў</item>
<item quantity="other">Знойдзена %1$d супадзення</item>
</plurals>
<plurals name="dialog_delete_permanently">
<item quantity="one">Назаўсёды выдаліць файл</item>
<item quantity="few">Назаўсёды выдаліць файлы</item>
<item quantity="many">Назаўсёды выдаліць файлы</item>
<item quantity="other">Назаўсёды выдаліць файлы</item>
<item quantity="one">Выдаліць файл назаўсёды</item>
<item quantity="few">Выдаліць файлы назаўсёды</item>
<item quantity="many">Выдаліць файлы назаўсёды</item>
<item quantity="other">Выдаліць файлы назаўсёды</item>
</plurals>
<plurals name="dialog_permanently_delete_desc">
<item quantity="one">Вы сапраўды хочаце выдаліць %1$d выбраны файл з вашай прылады? Гэта дзеянне немагчыма адрабіць.</item>
<item quantity="few">Вы сапраўды хочаце выдаліць %1$d выбраных файла з вашай прылады? Гэта дзеянне немагчыма адрабіць.</item>
<item quantity="many">Вы сапраўды хочаце выдаліць %1$d выбраных файлаў з вашай прылады? Гэта дзеянне немагчыма адрабіць.</item>
<item quantity="other">Вы сапраўды хочаце выдаліць %1$d выбраных файлаў з вашай прылады? Гэта дзеянне немагчыма адрабіць.</item>
<item quantity="one">Вы хочаце назаўсёды выдаліць %1$d выбраны файл з прылады? Гэта дзеянне нельга адрабіць.</item>
<item quantity="few">Вы хочаце назаўсёды выдаліць %1$d выбраныя файлы з прылады? Гэта дзеянне нельга адрабіць.</item>
<item quantity="many">Вы хочаце назаўсёды выдаліць %1$d выбраных файлаў з прылады? Гэта дзеянне нельга адрабіць.</item>
<item quantity="other">Вы хочаце назаўсёды выдаліць %1$d выбранага файла з прылады? Гэта дзеянне нельга адрабіць.</item>
</plurals>
<plurals name="dialog_remove_recents_desc">
<item quantity="one">Вы сапраўды хочаце прыбраць %1$d выбраны файл са спісу нядаўніх? Ён з\'явіцца зноў, калі вы адкрыеце яго праз бібліятэку.</item>
<item quantity="few">Вы сапраўды хочаце прыбраць %1$d выбраных файла са спісу нядаўніх? Яны з\'явіцца зноў, калі вы адкрыеце іх праз бібліятэку.</item>
<item quantity="many">Вы сапраўды хочаце прыбраць %1$d выбраных файлаў са спісу нядаўніх? Яны з\'явіцца зноў, калі вы адкрыеце іх праз бібліятэку.</item>
<item quantity="other">Вы сапраўды хочаце прыбраць %1$d выбраных файлаў са спісу нядаўніх? Яны з\'явіцца зноў, калі вы адкрыеце іх праз бібліятэку.</item>
<item quantity="one">Вы хочаце прыбраць %1$d выбраны файл са спіса нядаўніх файлаў? Ён з’явіцца зноў, калі вы адкрыеце яго з бібліятэкі.</item>
<item quantity="few">Вы хочаце прыбраць %1$d выбраныя файлы са спіса нядаўніх файлаў? Яны з’явяцца зноў, калі вы адкрыеце іх з бібліятэкі.</item>
<item quantity="many">Вы хочаце прыбраць %1$d выбраных файлаў са спіса нядаўніх файлаў? Яны з’явяцца зноў, калі вы адкрыеце іх з бібліятэкі.</item>
<item quantity="other">Вы хочаце прыбраць %1$d выбранага файла са спіса нядаўніх файлаў? Ён з’явіцца зноў, калі вы адкрыеце яго з бібліятэкі.</item>
</plurals>
<plurals name="dialog_remove_from_shelf_desc">
<item quantity="one">Вы ўпэўненыя, што хочаце прыбраць %1$d кнігу з паліцы «%2$s»? Кнігі застануцца ў вашай бібліятэцы і з\'явяцца ў раздзеле «Без паліцы».</item>
<item quantity="few">Вы ўпэўненыя, што хочаце прыбраць %1$d кнігі з паліцы «%2$s»? Кнігі застануцца ў вашай бібліятэцы і з\'явяцца ў раздзеле «Без паліцы».</item>
<item quantity="many">Вы ўпэўненыя, што хочаце прыбраць %1$d кніг з паліцы «%2$s»? Кнігі застануцца ў вашай бібліятэцы і з\'явяцца ў раздзеле «Без паліцы».</item>
<item quantity="other">Вы ўпэўненыя, што хочаце прыбраць %1$d кніг з паліцы «%2$s»? Кнігі застануцца ў вашай бібліятэцы і з\'явяцца ў раздзеле «Без паліцы».</item>
<item quantity="one">Вы сапраўды хочаце прыбраць %1$d кнігу з паліцы \"%2$s\"? Кніга застанецца ў бібліятэцы і з’явіцца ў Без паліцы.</item>
<item quantity="few">Вы сапраўды хочаце прыбраць %1$d кнігі з паліцы \"%2$s\"? Кнігі застануцца ў бібліятэцы і з’явяцца ў Без паліцы.</item>
<item quantity="many">Вы сапраўды хочаце прыбраць %1$d кніг з паліцы \"%2$s\"? Кнігі застануцца ў бібліятэцы і з’явяцца ў Без паліцы.</item>
<item quantity="other">Вы сапраўды хочаце прыбраць %1$d кнігі з паліцы \"%2$s\"? Кнігі застануцца ў бібліятэцы і з’явяцца ў Без паліцы.</item>
</plurals>
<plurals name="banner_books_removed_library">
<item quantity="one">%1$d кніга прыбрана з бібліятэкі.</item>
<item quantity="few">%1$d кнігі прыбраны з бібліятэкі.</item>
<item quantity="many">%1$d кніг прыбрана з бібліятэкі.</item>
<item quantity="other">%1$d кніг прыбрана з бібліятэкі.</item>
<item quantity="other">%1$d кнігі прыбрана з бібліятэкі.</item>
</plurals>
<plurals name="folder_count">
<item quantity="one">%1$d папка</item>
<item quantity="few">%1$d папкі</item>
<item quantity="many">%1$d папак</item>
<item quantity="other">%1$d папак</item>
<item quantity="other">%1$d папкі</item>
</plurals>
<plurals name="tag_count">
<item quantity="one">%1$d цэтлік</item>
<item quantity="few">%1$d цэтліка</item>
<item quantity="many">%1$d цэтлікаў</item>
<item quantity="other">%1$d цэтлікаў</item>
<item quantity="one">%1$d тэг</item>
<item quantity="few">%1$d тэгі</item>
<item quantity="many">%1$d тэгаў</item>
<item quantity="other">%1$d тэга</item>
</plurals>
<plurals name="tts_cache_chunk_count_parenthetical">
<item quantity="one">(%1$d частка)</item>
<item quantity="few">(%1$d часткі)</item>
<item quantity="many">(%1$d частак)</item>
<item quantity="other">(%1$d частак)</item>
<item quantity="one">(%1$d фрагмент)</item>
<item quantity="few">(%1$d фрагменты)</item>
<item quantity="many">(%1$d фрагментаў)</item>
<item quantity="other">(%1$d фрагмента)</item>
</plurals>
</resources>

File diff suppressed because it is too large Load diff

View file

@ -740,7 +740,14 @@
<string name="language_turkish">Türkçe (Türkisch)</string>
<string name="language_french">Français (Französisch)</string>
<string name="language_russian">Русский (Russisch)</string>
<string name="language_belarusian">Беларуская (Belarussisch)</string>
<string name="language_spanish">Español (Spanisch)</string>
<string name="language_portuguese_brazilian">Português (Brasil) (Brasilianisches Portugiesisch)</string>
<string name="language_italian">Italiano (Italienisch)</string>
<string name="language_polish">Polski (Polnisch)</string>
<string name="language_vietnamese">Tiếng Việt (Vietnamesisch)</string>
<string name="language_hindi">हिन्दी (Hindi)</string>
<string name="language_chinese_simplified">简体中文 (Vereinfachtes Chinesisch)</string>
<string name="app_theme_title">App-Thema</string>
<string name="app_theme_text_brightness">Text-Helligkeit</string>
<string name="app_theme_color_scheme">Farbschema</string>

View file

@ -747,7 +747,14 @@
<string name="language_turkish">Türkçe (turco)</string>
<string name="language_french">Français (francés)</string>
<string name="language_russian">Русский (ruso)</string>
<string name="language_belarusian">Беларуская (bielorruso)</string>
<string name="language_spanish">Español</string>
<string name="language_portuguese_brazilian">Português (Brasil) (portugués de Brasil)</string>
<string name="language_italian">Italiano (italiano)</string>
<string name="language_polish">Polski (polaco)</string>
<string name="language_vietnamese">Tiếng Việt (vietnamita)</string>
<string name="language_hindi">हिन्दी (hindi)</string>
<string name="language_chinese_simplified">简体中文 (chino simplificado)</string>
<string name="app_theme_title">Tema de la app</string>
<string name="app_theme_appearance">Apariencia</string>
<string name="app_theme_contrast">Contraste</string>

View file

@ -713,7 +713,14 @@
<string name="language_turkish">Türkçe (Turque)</string>
<string name="language_french">Français</string>
<string name="language_russian">Русский (Russe)</string>
<string name="language_belarusian">Беларуская (Biélorusse)</string>
<string name="language_spanish">Español (Espagnol)</string>
<string name="language_portuguese_brazilian">Português (Brasil) (Portugais du Brésil)</string>
<string name="language_italian">Italiano (Italien)</string>
<string name="language_polish">Polski (Polonais)</string>
<string name="language_vietnamese">Tiếng Việt (Vietnamien)</string>
<string name="language_hindi">हिन्दी (Hindi)</string>
<string name="language_chinese_simplified">简体中文 (Chinois simplifié)</string>
<string name="app_theme_contrast">Contraste</string>
<string name="app_theme_text_brightness">Luminosité du texte</string>
<string name="app_theme_preset_ocean">Océan</string>

View file

@ -1,3 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
</resources>
<plurals name="book_count">
<item quantity="one">%1$d किताब</item>
<item quantity="other">%1$d किताबें</item>
</plurals>
<plurals name="book_word">
<item quantity="one">किताब</item>
<item quantity="other">किताबें</item>
</plurals>
<plurals name="shelf_count">
<item quantity="one">%1$d शेल्फ़</item>
<item quantity="other">%1$d शेल्फ़</item>
</plurals>
<plurals name="search_results_count">
<item quantity="one">%1$d परिणाम मिला</item>
<item quantity="other">%1$d परिणाम मिले</item>
</plurals>
<plurals name="search_matches_count">
<item quantity="one">%1$d मिलान मिला</item>
<item quantity="other">%1$d मिलान मिले</item>
</plurals>
<plurals name="dialog_delete_permanently">
<item quantity="one">फ़ाइल स्थायी रूप से हटाएं</item>
<item quantity="other">फ़ाइलें स्थायी रूप से हटाएं</item>
</plurals>
<plurals name="dialog_permanently_delete_desc">
<item quantity="one">क्या आप अपने डिवाइस से %1$d चयनित फ़ाइल स्थायी रूप से हटाना चाहते हैं? यह कार्रवाई वापस नहीं की जा सकती।</item>
<item quantity="other">क्या आप अपने डिवाइस से %1$d चयनित फ़ाइलें स्थायी रूप से हटाना चाहते हैं? यह कार्रवाई वापस नहीं की जा सकती।</item>
</plurals>
<plurals name="dialog_remove_recents_desc">
<item quantity="one">क्या आप हालिया फ़ाइलों की सूची से %1$d चयनित फ़ाइल हटाना चाहते हैं? लाइब्रेरी से फिर खोलने पर यह फिर दिखाई देगी।</item>
<item quantity="other">क्या आप हालिया फ़ाइलों की सूची से %1$d चयनित फ़ाइलें हटाना चाहते हैं? लाइब्रेरी से फिर खोलने पर ये फिर दिखाई देंगी।</item>
</plurals>
<plurals name="dialog_remove_from_shelf_desc">
<item quantity="one">क्या आप वाकई \'%2$s\' शेल्फ़ से %1$d किताब हटाना चाहते हैं? किताब आपकी लाइब्रेरी में रहेगी और बिना शेल्फ़ में दिखाई देगी।</item>
<item quantity="other">क्या आप वाकई \'%2$s\' शेल्फ़ से %1$d किताबें हटाना चाहते हैं? किताबें आपकी लाइब्रेरी में रहेंगी और बिना शेल्फ़ में दिखाई देंगी।</item>
</plurals>
<plurals name="banner_books_removed_library">
<item quantity="one">%1$d किताब लाइब्रेरी से हटाई गई।</item>
<item quantity="other">%1$d किताबें लाइब्रेरी से हटाई गईं।</item>
</plurals>
<plurals name="folder_count">
<item quantity="one">%1$d फ़ोल्डर</item>
<item quantity="other">%1$d फ़ोल्डर</item>
</plurals>
<plurals name="tag_count">
<item quantity="one">%1$d टैग</item>
<item quantity="other">%1$d टैग</item>
</plurals>
<plurals name="tts_cache_chunk_count_parenthetical">
<item quantity="one">(%1$d खंड)</item>
<item quantity="other">(%1$d खंड)</item>
</plurals>
</resources>

File diff suppressed because it is too large Load diff

View file

@ -1,3 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
</resources>
<plurals name="book_count">
<item quantity="one">%1$d libro</item>
<item quantity="other">%1$d libri</item>
</plurals>
<plurals name="book_word">
<item quantity="one">libro</item>
<item quantity="other">libri</item>
</plurals>
<plurals name="shelf_count">
<item quantity="one">%1$d scaffale</item>
<item quantity="other">%1$d scaffali</item>
</plurals>
<plurals name="search_results_count">
<item quantity="one">%1$d risultato trovato</item>
<item quantity="other">%1$d risultati trovati</item>
</plurals>
<plurals name="search_matches_count">
<item quantity="one">%1$d corrispondenza trovata</item>
<item quantity="other">%1$d corrispondenze trovate</item>
</plurals>
<plurals name="dialog_delete_permanently">
<item quantity="one">Elimina file definitivamente</item>
<item quantity="other">Elimina file definitivamente</item>
</plurals>
<plurals name="dialog_permanently_delete_desc">
<item quantity="one">Vuoi eliminare definitivamente %1$d file selezionato dal dispositivo? Questa azione non può essere annullata.</item>
<item quantity="other">Vuoi eliminare definitivamente %1$d file selezionati dal dispositivo? Questa azione non può essere annullata.</item>
</plurals>
<plurals name="dialog_remove_recents_desc">
<item quantity="one">Vuoi rimuovere %1$d file selezionato dallelenco dei file recenti? Ricomparirà se lo apri di nuovo dalla libreria.</item>
<item quantity="other">Vuoi rimuovere %1$d file selezionati dallelenco dei file recenti? Ricompariranno se li apri di nuovo dalla libreria.</item>
</plurals>
<plurals name="dialog_remove_from_shelf_desc">
<item quantity="one">Vuoi davvero rimuovere %1$d libro dallo scaffale \"%2$s\"? Il libro resterà nella libreria e apparirà in Senza scaffale.</item>
<item quantity="other">Vuoi davvero rimuovere %1$d libri dallo scaffale \"%2$s\"? I libri resteranno nella libreria e appariranno in Senza scaffale.</item>
</plurals>
<plurals name="banner_books_removed_library">
<item quantity="one">%1$d libro rimosso dalla libreria.</item>
<item quantity="other">%1$d libri rimossi dalla libreria.</item>
</plurals>
<plurals name="folder_count">
<item quantity="one">%1$d cartella</item>
<item quantity="other">%1$d cartelle</item>
</plurals>
<plurals name="tag_count">
<item quantity="one">%1$d tag</item>
<item quantity="other">%1$d tag</item>
</plurals>
<plurals name="tts_cache_chunk_count_parenthetical">
<item quantity="one">(%1$d segmento)</item>
<item quantity="other">(%1$d segmenti)</item>
</plurals>
</resources>

File diff suppressed because it is too large Load diff

View file

@ -1,3 +1,81 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
</resources>
<plurals name="book_count">
<item quantity="one">%1$d książka</item>
<item quantity="few">%1$d książki</item>
<item quantity="many">%1$d książek</item>
<item quantity="other">%1$d książki</item>
</plurals>
<plurals name="book_word">
<item quantity="one">książka</item>
<item quantity="few">książki</item>
<item quantity="many">książek</item>
<item quantity="other">książki</item>
</plurals>
<plurals name="shelf_count">
<item quantity="one">%1$d półka</item>
<item quantity="few">%1$d półki</item>
<item quantity="many">%1$d półek</item>
<item quantity="other">%1$d półki</item>
</plurals>
<plurals name="search_results_count">
<item quantity="one">Znaleziono %1$d wynik</item>
<item quantity="few">Znaleziono %1$d wyniki</item>
<item quantity="many">Znaleziono %1$d wyników</item>
<item quantity="other">Znaleziono %1$d wyniku</item>
</plurals>
<plurals name="search_matches_count">
<item quantity="one">Znaleziono %1$d dopasowanie</item>
<item quantity="few">Znaleziono %1$d dopasowania</item>
<item quantity="many">Znaleziono %1$d dopasowań</item>
<item quantity="other">Znaleziono %1$d dopasowania</item>
</plurals>
<plurals name="dialog_delete_permanently">
<item quantity="one">Usuń plik trwale</item>
<item quantity="few">Usuń pliki trwale</item>
<item quantity="many">Usuń pliki trwale</item>
<item quantity="other">Usuń pliki trwale</item>
</plurals>
<plurals name="dialog_permanently_delete_desc">
<item quantity="one">Czy chcesz trwale usunąć %1$d wybrany plik z urządzenia? Tej operacji nie można cofnąć.</item>
<item quantity="few">Czy chcesz trwale usunąć %1$d wybrane pliki z urządzenia? Tej operacji nie można cofnąć.</item>
<item quantity="many">Czy chcesz trwale usunąć %1$d wybranych plików z urządzenia? Tej operacji nie można cofnąć.</item>
<item quantity="other">Czy chcesz trwale usunąć %1$d wybranego pliku z urządzenia? Tej operacji nie można cofnąć.</item>
</plurals>
<plurals name="dialog_remove_recents_desc">
<item quantity="one">Czy chcesz usunąć %1$d wybrany plik z listy ostatnich plików? Pojawi się ponownie, jeśli otworzysz go z biblioteki.</item>
<item quantity="few">Czy chcesz usunąć %1$d wybrane pliki z listy ostatnich plików? Pojawią się ponownie, jeśli otworzysz je z biblioteki.</item>
<item quantity="many">Czy chcesz usunąć %1$d wybranych plików z listy ostatnich plików? Pojawią się ponownie, jeśli otworzysz je z biblioteki.</item>
<item quantity="other">Czy chcesz usunąć %1$d wybranego pliku z listy ostatnich plików? Pojawi się ponownie, jeśli otworzysz go z biblioteki.</item>
</plurals>
<plurals name="dialog_remove_from_shelf_desc">
<item quantity="one">Czy na pewno chcesz usunąć %1$d książkę z półki \"%2$s\"? Książka pozostanie w bibliotece i pojawi się w Bez półki.</item>
<item quantity="few">Czy na pewno chcesz usunąć %1$d książki z półki \"%2$s\"? Książki pozostaną w bibliotece i pojawią się w Bez półki.</item>
<item quantity="many">Czy na pewno chcesz usunąć %1$d książek z półki \"%2$s\"? Książki pozostaną w bibliotece i pojawią się w Bez półki.</item>
<item quantity="other">Czy na pewno chcesz usunąć %1$d książki z półki \"%2$s\"? Książki pozostaną w bibliotece i pojawią się w Bez półki.</item>
</plurals>
<plurals name="banner_books_removed_library">
<item quantity="one">%1$d książka usunięta z biblioteki.</item>
<item quantity="few">%1$d książki usunięte z biblioteki.</item>
<item quantity="many">%1$d książek usunięto z biblioteki.</item>
<item quantity="other">%1$d książki usunięto z biblioteki.</item>
</plurals>
<plurals name="folder_count">
<item quantity="one">%1$d folder</item>
<item quantity="few">%1$d foldery</item>
<item quantity="many">%1$d folderów</item>
<item quantity="other">%1$d folderu</item>
</plurals>
<plurals name="tag_count">
<item quantity="one">%1$d tag</item>
<item quantity="few">%1$d tagi</item>
<item quantity="many">%1$d tagów</item>
<item quantity="other">%1$d tagu</item>
</plurals>
<plurals name="tts_cache_chunk_count_parenthetical">
<item quantity="one">(%1$d fragment)</item>
<item quantity="few">(%1$d fragmenty)</item>
<item quantity="many">(%1$d fragmentów)</item>
<item quantity="other">(%1$d fragmentu)</item>
</plurals>
</resources>

File diff suppressed because it is too large Load diff

View file

@ -2,47 +2,54 @@
<resources>
<plurals name="book_count">
<item quantity="one">%1$d livro</item>
<item quantity="many">%1$d livros</item>
<item quantity="other">%1$d livros</item>
</plurals>
<plurals name="book_word">
<item quantity="one">livro</item>
<item quantity="many">livros</item>
<item quantity="other">livros</item>
</plurals>
<plurals name="shelf_count">
<item quantity="one">%1$d estante</item>
<item quantity="many">%1$d estantes</item>
<item quantity="other">%1$d estantes</item>
</plurals>
<plurals name="search_results_count">
<item quantity="one">%1$d resultado encontrado</item>
<item quantity="many">%1$d resultados encontrados</item>
<item quantity="other">%1$d resultados encontrados</item>
</plurals>
<plurals name="search_matches_count">
<item quantity="one">%1$d ocorrência encontrada</item>
<item quantity="other">%1$d ocorrências encontradas</item>
</plurals>
<plurals name="dialog_delete_permanently">
<item quantity="one">Excluir Arquivo Permanentemente</item>
<item quantity="many">Excluir Arquivos Permanentemente</item>
<item quantity="other">Excluir Arquivos Permanentemente</item>
<item quantity="one">Excluir arquivo permanentemente</item>
<item quantity="other">Excluir arquivos permanentemente</item>
</plurals>
<plurals name="dialog_permanently_delete_desc">
<item quantity="one">Deseja excluir permanentemente %1$d arquivo selecionado do seu dispositivo? Esta ação não pode ser desfeita.</item>
<item quantity="many">Deseja excluir permanentemente %1$d arquivos selecionados do seu dispositivo? Esta ação não pode ser desfeita.</item>
<item quantity="other">Deseja excluir permanentemente %1$d arquivos selecionados do seu dispositivo? Esta ação não pode ser desfeita.</item>
</plurals>
<plurals name="dialog_remove_recents_desc">
<item quantity="one">Deseja remover %1$d arquivo selecionado da lista de arquivos recentes? Ele reaparecerá se for aberto novamente pela biblioteca.</item>
<item quantity="many">Deseja remover %1$d arquivos selecionados da lista de arquivos recentes? Eles reaparecerão se forem abertos novamente pela biblioteca.</item>
<item quantity="other">Deseja remover %1$d arquivos selecionados da lista de arquivos recentes? Eles reaparecerão se forem abertos novamente pela biblioteca.</item>
<item quantity="one">Deseja remover %1$d arquivo selecionado da lista de arquivos recentes? Ele reaparecerá se você o abrir novamente pela biblioteca.</item>
<item quantity="other">Deseja remover %1$d arquivos selecionados da lista de arquivos recentes? Eles reaparecerão se você os abrir novamente pela biblioteca.</item>
</plurals>
<plurals name="dialog_remove_from_shelf_desc">
<item quantity="one">Tem certeza de que deseja remover %1$d livro da estante \"%2$s\"? O livro permanecerá na sua biblioteca e aparecerá em Não Catalogados.</item>
<item quantity="many">Tem certeza de que deseja remover %1$d livros da estante \"%2$s\"? Os livros permanecerão na sua biblioteca e aparecerão em Não Catalogados.</item>
<item quantity="other">Tem certeza de que deseja remover %1$d livros da estante \"%2$s\"? Os livros permanecerão na sua biblioteca e aparecerão em Não Catalogados.</item>
<item quantity="one">Tem certeza de que deseja remover %1$d livro da estante \"%2$s\"? O livro permanecerá na sua biblioteca e aparecerá em Sem estante.</item>
<item quantity="other">Tem certeza de que deseja remover %1$d livros da estante \"%2$s\"? Os livros permanecerão na sua biblioteca e aparecerão em Sem estante.</item>
</plurals>
<plurals name="banner_books_removed_library">
<item quantity="one">%1$d livro removido da biblioteca.</item>
<item quantity="many">%1$d livros removidos da biblioteca.</item>
<item quantity="other">%1$d livros removidos da biblioteca.</item>
</plurals>
<plurals name="folder_count">
<item quantity="one">%1$d pasta</item>
<item quantity="other">%1$d pastas</item>
</plurals>
<plurals name="tag_count">
<item quantity="one">%1$d tag</item>
<item quantity="other">%1$d tags</item>
</plurals>
<plurals name="tts_cache_chunk_count_parenthetical">
<item quantity="one">(%1$d trecho)</item>
<item quantity="other">(%1$d trechos)</item>
</plurals>
</resources>

File diff suppressed because it is too large Load diff

View file

@ -715,7 +715,14 @@
<string name="language_turkish">Турецкий</string>
<string name="language_french">Французский</string>
<string name="language_russian">Русский</string>
<string name="language_belarusian">Белорусский</string>
<string name="language_spanish">Испанский</string>
<string name="language_portuguese_brazilian">Португальский (Бразилия)</string>
<string name="language_italian">Итальянский</string>
<string name="language_polish">Польский</string>
<string name="language_vietnamese">Вьетнамский</string>
<string name="language_hindi">Хинди</string>
<string name="language_chinese_simplified">Китайский упрощенный</string>
<string name="app_theme_title">Тема приложения</string>
<string name="app_theme_appearance">Внешний вид</string>
<string name="app_theme_contrast">Контрастность</string>

View file

@ -715,7 +715,14 @@
<string name="language_turkish">Türkçe</string>
<string name="language_french">Français (Fransızca)</string>
<string name="language_russian">Русский (Rusça)</string>
<string name="language_belarusian">Беларуская (Belarusça)</string>
<string name="language_spanish">Español (İspanyolca)</string>
<string name="language_portuguese_brazilian">Português (Brasil) (Brezilya Portekizcesi)</string>
<string name="language_italian">Italiano (İtalyanca)</string>
<string name="language_polish">Polski (Lehçe)</string>
<string name="language_vietnamese">Tiếng Việt (Vietnamca)</string>
<string name="language_hindi">हिन्दी (Hintçe)</string>
<string name="language_chinese_simplified">简体中文 (Basitleştirilmiş Çince)</string>
<string name="app_theme_title">Uygulama Teması</string>
<string name="app_theme_appearance">Görünüm</string>
<string name="app_theme_contrast">Karşıtlık</string>

View file

@ -7,6 +7,36 @@
<item quantity="other">sách</item>
</plurals>
<plurals name="shelf_count">
<item quantity="other">%1$d ngăn</item>
<item quantity="other">%1$d kệ sách</item>
</plurals>
<plurals name="search_results_count">
<item quantity="other">Tìm thấy %1$d kết quả</item>
</plurals>
<plurals name="search_matches_count">
<item quantity="other">Tìm thấy %1$d kết quả khớp</item>
</plurals>
<plurals name="dialog_delete_permanently">
<item quantity="other">Xóa vĩnh viễn tệp</item>
</plurals>
<plurals name="dialog_permanently_delete_desc">
<item quantity="other">Bạn có muốn xóa vĩnh viễn %1$d tệp đã chọn khỏi thiết bị không? Không thể hoàn tác thao tác này.</item>
</plurals>
<plurals name="dialog_remove_recents_desc">
<item quantity="other">Bạn có muốn xóa %1$d tệp đã chọn khỏi danh sách tệp gần đây không? Tệp sẽ xuất hiện lại nếu bạn mở lại từ thư viện.</item>
</plurals>
<plurals name="dialog_remove_from_shelf_desc">
<item quantity="other">Bạn có chắc muốn xóa %1$d sách khỏi kệ \"%2$s\" không? Sách vẫn nằm trong thư viện và xuất hiện trong Chưa xếp kệ.</item>
</plurals>
<plurals name="banner_books_removed_library">
<item quantity="other">Đã xóa %1$d sách khỏi thư viện.</item>
</plurals>
<plurals name="folder_count">
<item quantity="other">%1$d thư mục</item>
</plurals>
<plurals name="tag_count">
<item quantity="other">%1$d thẻ</item>
</plurals>
<plurals name="tts_cache_chunk_count_parenthetical">
<item quantity="other">(%1$d đoạn)</item>
</plurals>
</resources>

File diff suppressed because it is too large Load diff

View file

@ -19,24 +19,24 @@
<item quantity="other">永久删除文件</item>
</plurals>
<plurals name="dialog_permanently_delete_desc">
<item quantity="other">确定要从设备中永久删除选的 %1$d 个文件吗?此操作无法撤销。</item>
<item quantity="other">确定要从设备中永久删除选的 %1$d 个文件吗?此操作无法撤销。</item>
</plurals>
<plurals name="dialog_remove_recents_desc">
<item quantity="other">是否要从“最近使用的文件”列表中删除%1$d个选定文件如果再次从书库中打开这些文件这些文件将重新显示在“最近使用的文件”列表</item>
<item quantity="other">要从最近文件列表中移除选中的 %1$d 个文件吗?如果再次从书库打开,它们会重新显示</item>
</plurals>
<plurals name="dialog_remove_from_shelf_desc">
<item quantity="other">你确定要从%2$s书架中移除 %1$d 本书吗?这些从书架中移除的书将仍旧保留在你的设备里,并显示在未分类书库下。</item>
<item quantity="other">确定要从“%2$s”书架中移除 %1$d 本书吗?这些书仍会保留在你的书库中,并显示在未归架下。</item>
</plurals>
<plurals name="banner_books_removed_library">
<item quantity="other">%1$d本书已从书库中移除</item>
<item quantity="other">已从书库移除 %1$d 本书。</item>
</plurals>
<plurals name="folder_count">
<item quantity="other">%1$d个文件</item>
<item quantity="other">%1$d 个文件</item>
</plurals>
<plurals name="tag_count">
<item quantity="other">%1$d个标签</item>
<item quantity="other">%1$d 个标签</item>
</plurals>
<plurals name="tts_cache_chunk_count_parenthetical">
<item quantity="other">%1$d个音频</item>
<item quantity="other">%1$d 个片段)</item>
</plurals>
</resources>

File diff suppressed because it is too large Load diff

View file

@ -1117,7 +1117,14 @@
<string name="language_turkish">Türkçe (Turkish)</string>
<string name="language_french">Français (French)</string>
<string name="language_russian">Русский (Russian)</string>
<string name="language_belarusian">Беларуская (Belarusian)</string>
<string name="language_spanish">Español (Spanish)</string>
<string name="language_portuguese_brazilian">Português (Brasil)</string>
<string name="language_italian">Italiano (Italian)</string>
<string name="language_polish">Polski (Polish)</string>
<string name="language_vietnamese">Tiếng Việt (Vietnamese)</string>
<string name="language_hindi">हिन्दी (Hindi)</string>
<string name="language_chinese_simplified">简体中文 (Chinese, Simplified)</string>
<!-- App-wide theme controls in HomeScreen.kt. -->
<string name="app_theme_title">App Theme</string>

View file

@ -6,5 +6,12 @@
<locale android:name="tr"/>
<locale android:name="fr"/>
<locale android:name="ru"/>
<locale android:name="be"/>
<locale android:name="es"/>
<locale android:name="pt-BR"/>
<locale android:name="it"/>
<locale android:name="pl"/>
<locale android:name="vi"/>
<locale android:name="hi"/>
<locale android:name="zh-CN"/>
</locale-config>