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:
parent
056485a140
commit
70c272baa7
26 changed files with 7931 additions and 301 deletions
|
|
@ -1,7 +1,9 @@
|
|||
@file:Suppress("UnstableApiUsage")
|
||||
|
||||
import java.util.Properties
|
||||
import java.io.StringReader
|
||||
import javax.xml.parsers.DocumentBuilderFactory
|
||||
import org.xml.sax.InputSource
|
||||
|
||||
plugins {
|
||||
alias(libs.plugins.android.application)
|
||||
|
|
@ -20,12 +22,15 @@ if (localPropertiesFile.exists()) {
|
|||
}
|
||||
|
||||
fun configuredAppLocaleTags(): Set<String> {
|
||||
val localesConfig = file("src/main/res/xml/locales_config.xml")
|
||||
val localesConfigXml = providers
|
||||
.fileContents(layout.projectDirectory.file("src/main/res/xml/locales_config.xml"))
|
||||
.asText
|
||||
.get()
|
||||
val androidNamespace = "http://schemas.android.com/apk/res/android"
|
||||
val document = DocumentBuilderFactory.newInstance()
|
||||
.apply { isNamespaceAware = true }
|
||||
.newDocumentBuilder()
|
||||
.parse(localesConfig)
|
||||
.parse(InputSource(StringReader(localesConfigXml)))
|
||||
val localeNodes = document.getElementsByTagName("locale")
|
||||
|
||||
return buildSet {
|
||||
|
|
@ -56,6 +61,7 @@ android {
|
|||
versionName = "1.0.47"
|
||||
|
||||
resourceConfigurations += configuredAppLocaleTags()
|
||||
.map { it.toAndroidResourceConfiguration() }
|
||||
|
||||
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||
externalNativeBuild {
|
||||
|
|
@ -174,6 +180,15 @@ android {
|
|||
}
|
||||
}
|
||||
|
||||
fun String.toAndroidResourceConfiguration(): String {
|
||||
val languageTagParts = split("-")
|
||||
return if (languageTagParts.size == 2 && languageTagParts[1].length == 2) {
|
||||
"${languageTagParts[0]}-r${languageTagParts[1].uppercase()}"
|
||||
} else {
|
||||
this
|
||||
}
|
||||
}
|
||||
|
||||
kover {
|
||||
reports {
|
||||
filters {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -1,3 +1,55 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<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
|
|
@ -1,3 +1,55 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<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 dall’elenco dei file recenti? Ricomparirà se lo apri di nuovo dalla libreria.</item>
|
||||
<item quantity="other">Vuoi rimuovere %1$d file selezionati dall’elenco 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
|
|
@ -1,3 +1,81 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<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
|
|
@ -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
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -3,17 +3,19 @@ package com.aryan.reader
|
|||
import java.io.File
|
||||
import javax.xml.parsers.DocumentBuilderFactory
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Assert.assertFalse
|
||||
import org.junit.Assert.assertTrue
|
||||
import org.junit.Test
|
||||
|
||||
class AppLanguageOptionsTest {
|
||||
|
||||
@Test
|
||||
fun `supported app languages include Spanish`() {
|
||||
fun `supported app languages expose configured locale order`() {
|
||||
assertEquals(
|
||||
listOf("en", "ar", "de", "tr", "fr", "ru", "es"),
|
||||
listOf("en", "ar", "de", "tr", "fr", "ru", "be", "es", "pt-BR", "it", "pl", "vi", "hi", "zh-CN"),
|
||||
supportedAppLanguageOptions.mapNotNull { it.tag }
|
||||
)
|
||||
assertEquals(R.string.language_spanish, supportedAppLanguageOptions.last().labelRes)
|
||||
assertEquals(R.string.language_chinese_simplified, supportedAppLanguageOptions.last().labelRes)
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
@ -23,6 +25,35 @@ class AppLanguageOptionsTest {
|
|||
assertEquals(supportedAppLanguageOptions, appLanguageSelectionOptions.drop(1))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `app language search matches labels tags and aliases`() {
|
||||
val chinese = supportedAppLanguageOptions.first { it.tag == "zh-CN" }
|
||||
|
||||
assertTrue(chinese.matchesLanguageSearch(label = "简体中文(简体中文)", query = "zh cn"))
|
||||
assertTrue(chinese.matchesLanguageSearch(label = "简体中文(简体中文)", query = "mandarin"))
|
||||
assertTrue(chinese.matchesLanguageSearch(label = "简体中文(简体中文)", query = "简体"))
|
||||
assertTrue(systemAppLanguageOption.matchesLanguageSearch(label = "System default", query = "device"))
|
||||
assertFalse(chinese.matchesLanguageSearch(label = "简体中文(简体中文)", query = "korean"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `app language search normalizes accents`() {
|
||||
val turkish = supportedAppLanguageOptions.first { it.tag == "tr" }
|
||||
val belarusian = supportedAppLanguageOptions.first { it.tag == "be" }
|
||||
val portugueseBrazilian = supportedAppLanguageOptions.first { it.tag == "pt-BR" }
|
||||
val vietnamese = supportedAppLanguageOptions.first { it.tag == "vi" }
|
||||
|
||||
assertTrue(turkish.matchesLanguageSearch(label = "Türkçe (Turkish)", query = "turkce"))
|
||||
assertTrue(belarusian.matchesLanguageSearch(label = "Беларуская", query = "belarusian"))
|
||||
assertTrue(
|
||||
portugueseBrazilian.matchesLanguageSearch(
|
||||
label = "Português (Brasil)",
|
||||
query = "portugues brasileiro"
|
||||
)
|
||||
)
|
||||
assertTrue(vietnamese.matchesLanguageSearch(label = "Tiếng Việt", query = "tieng viet"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `supported app language tags are unique`() {
|
||||
val tags = supportedAppLanguageOptions.mapNotNull { it.tag }
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue