,
+ private val progress: StateFlow,
+) : Deferred by deferred {
+
+ val progressValue: P
+ get() = progress.value
+
+ fun progressAsFlow(): Flow = progress
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/xtimms/tokusho/utils/system/File.kt b/app/src/main/java/org/xtimms/tokusho/utils/system/File.kt
index e343b21..478b97c 100644
--- a/app/src/main/java/org/xtimms/tokusho/utils/system/File.kt
+++ b/app/src/main/java/org/xtimms/tokusho/utils/system/File.kt
@@ -60,4 +60,6 @@ fun ZipFile.readText(entry: ZipEntry) = getInputStream(entry).bufferedReader().u
fun Sequence.filterWith(filter: FileFilter): Sequence = filter { f -> filter.accept(f) }
fun File.takeIfReadable() = takeIf { it.exists() && it.canRead() }
-fun File.takeIfWriteable() = takeIf { it.exists() && it.canWrite() }
\ No newline at end of file
+fun File.takeIfWriteable() = takeIf { it.exists() && it.canWrite() }
+
+fun File.isNotEmpty() = length() != 0L
\ No newline at end of file
diff --git a/app/src/main/java/org/xtimms/tokusho/utils/system/Http.kt b/app/src/main/java/org/xtimms/tokusho/utils/system/Http.kt
index b200afc..0d4bed6 100644
--- a/app/src/main/java/org/xtimms/tokusho/utils/system/Http.kt
+++ b/app/src/main/java/org/xtimms/tokusho/utils/system/Http.kt
@@ -1,6 +1,11 @@
package org.xtimms.tokusho.utils.system
import okhttp3.Cookie
+import okhttp3.HttpUrl
+import okhttp3.Response
+import okhttp3.internal.closeQuietly
+import org.jsoup.HttpStatusException
+import java.net.HttpURLConnection
fun Cookie.newBuilder(): Cookie.Builder = Cookie.Builder().also { c ->
c.name(name)
@@ -20,4 +25,17 @@ fun Cookie.newBuilder(): Cookie.Builder = Cookie.Builder().also { c ->
if (httpOnly) {
c.httpOnly()
}
+}
+
+val HttpUrl.isHttpOrHttps: Boolean
+ get() {
+ val s = scheme.lowercase()
+ return s == "https" || s == "http"
+ }
+
+fun Response.ensureSuccess() = apply {
+ if (!isSuccessful || code == HttpURLConnection.HTTP_NO_CONTENT) {
+ closeQuietly()
+ throw HttpStatusException(message, code, request.url.toString())
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/org/xtimms/tokusho/utils/system/Locale.kt b/app/src/main/java/org/xtimms/tokusho/utils/system/Locale.kt
index 5208d0c..348548e 100644
--- a/app/src/main/java/org/xtimms/tokusho/utils/system/Locale.kt
+++ b/app/src/main/java/org/xtimms/tokusho/utils/system/Locale.kt
@@ -1,45 +1,38 @@
package org.xtimms.tokusho.utils.system
-import android.os.Build
+import androidx.appcompat.app.AppCompatDelegate
import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource
import androidx.core.os.LocaleListCompat
import org.xtimms.tokusho.R
-import org.xtimms.tokusho.core.prefs.AppSettings.getInt
-import org.xtimms.tokusho.core.prefs.LANGUAGE
-import org.xtimms.tokusho.core.prefs.SYSTEM_DEFAULT
import java.util.Locale
fun LocaleListCompat.toList(): List = List(size()) { i -> getOrThrow(i) }
fun LocaleListCompat.getOrThrow(index: Int) = get(index) ?: throw NoSuchElementException()
-private fun getLanguageNumberByCode(languageCode: String) : Int =
- languageMap.entries.find { it.value == languageCode }?.key ?: SYSTEM_DEFAULT
-
-fun getLanguageNumber(): Int {
- return if (Build.VERSION.SDK_INT >= 33)
- getLanguageNumberByCode(
- LocaleListCompat.getAdjustedDefault()[0]?.toLanguageTag().toString()
- )
- else LANGUAGE.getInt()
-}
-
@Composable
-fun getLanguageDesc(language: Int = getLanguageNumber()): String {
- return stringResource(
- when (language) {
- ENGLISH -> R.string.la_en_US
- RUSSIAN -> R.string.la_ru
- else -> R.string.follow_system
- }
- )
+fun Locale?.toDisplayName(): String = this?.getDisplayName(this) ?: stringResource(
+ id = R.string.follow_system
+)
+
+fun setLanguage(locale: Locale?) {
+ val localeList = locale?.let {
+ LocaleListCompat.create(it)
+ } ?: LocaleListCompat.getEmptyLocaleList()
+ AppCompatDelegate.setApplicationLocales(localeList)
}
// Do not modify
private const val ENGLISH = 1
private const val RUSSIAN = 2
+val LocaleLanguageCodeMap =
+ mapOf(
+ Locale("en", "US") to ENGLISH,
+ Locale("ru") to RUSSIAN
+ )
+
// Sorted alphabetically
val languageMap: Map = mapOf(
RUSSIAN to "ru",
diff --git a/app/src/main/java/org/xtimms/tokusho/utils/system/Uri.kt b/app/src/main/java/org/xtimms/tokusho/utils/system/Uri.kt
index f55c270..5d9040d 100644
--- a/app/src/main/java/org/xtimms/tokusho/utils/system/Uri.kt
+++ b/app/src/main/java/org/xtimms/tokusho/utils/system/Uri.kt
@@ -1,4 +1,33 @@
package org.xtimms.tokusho.utils.system
+import android.net.Uri
+import androidx.core.net.toFile
+import java.io.File
+import java.util.zip.ZipFile
+
const val URI_SCHEME_FILE = "file"
-const val URI_SCHEME_ZIP = "file+zip"
\ No newline at end of file
+const val URI_SCHEME_ZIP = "file+zip"
+
+fun Uri.exists(): Boolean = when (scheme) {
+ URI_SCHEME_FILE -> toFile().exists()
+ URI_SCHEME_ZIP -> {
+ val file = File(requireNotNull(schemeSpecificPart))
+ file.exists() && ZipFile(file).use { it.getEntry(fragment) != null }
+ }
+
+ else -> unsupportedUri(this)
+}
+
+fun Uri.isTargetNotEmpty(): Boolean = when (scheme) {
+ URI_SCHEME_FILE -> toFile().isNotEmpty()
+ URI_SCHEME_ZIP -> {
+ val file = File(requireNotNull(schemeSpecificPart))
+ file.exists() && ZipFile(file).use { (it.getEntry(fragment)?.size ?: 0L) != 0L }
+ }
+
+ else -> unsupportedUri(this)
+}
+
+private fun unsupportedUri(uri: Uri): Nothing {
+ throw IllegalArgumentException("Bad uri $uri: only schemes $URI_SCHEME_FILE and $URI_SCHEME_ZIP are supported")
+}
\ No newline at end of file
diff --git a/app/src/main/res/resources.properties b/app/src/main/res/resources.properties
new file mode 100644
index 0000000..d5a3ddc
--- /dev/null
+++ b/app/src/main/res/resources.properties
@@ -0,0 +1 @@
+unqualifiedResLocale=en-US
\ No newline at end of file
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
new file mode 100644
index 0000000..01f5bc0
--- /dev/null
+++ b/app/src/main/res/values-ru/strings.xml
@@ -0,0 +1,96 @@
+
+
+ Настройки
+ Лента
+ Поиск
+ Обзор
+ История
+ Полка
+ Локальное хранилище
+ Закладки
+ Рандом
+ Загрузки
+ О приложении
+ Внешний вид
+ Тема, вид списка, язык
+ Версия, автоматические обновления
+ Здесь ничего нет
+ Упс!
+ Отправить логи падения
+ Перезапустить приложение
+ Поделиться
+ Следовать системе
+ Включено
+ Выключено
+ Открыть настройки
+ Автоматические обновления
+ Автоматически проверять наличие последней версии на Gitea
+ Версия
+ Информация скопирована в буфер обмена
+ Включить автоматическое обновление
+ Канал обновления
+ Стабильный
+ Бета
+ Проверить наличие обновлений
+ Нет обновлений
+ Произошла ошибка при проверке обновлений
+ Устанавливайте предварительные сборки для предварительного просмотра новых функций и изменений. В этих версиях будет наблюдаться некоторая нестабильность, поэтому, пожалуйста, не стесняйтесь оставлять отзывы, если у вас возникнут какие-либо проблемы, чтобы помочь нам улучшить приложение в будущем.
+ Язык
+ Темная тема
+ Динамические цвета
+ Примените цвета из обоев к теме приложения
+ Отмена
+ Дополнительные настройки
+ Высококонтрастная темная тема
+ Системные настройки
+ Перевести
+ Помогите перевести это приложение на Hosted Weblate
+ Обновить
+ Отклонить
+ Продолжается
+ Завершено
+ Заброшено
+ На паузе
+ Скоро выйдет
+ Неизвестно
+ Открыть в браузере
+ Создать файл резервной копии
+ Резервная копия сохранена
+ Поддержка бэкапов Kotatsu
+ Tokusho также может обрабатывать резервные копии Kotatsu
+ Лицензии с открытым исходным кодом
+ Нет источников манги
+ Включите источники манги, чтобы читать мангу онлайн
+ Каталог
+ %1$d из %2$d включено
+ Каталог источников
+ Доступно: %1$d
+ Прочитанное вами будет отображаться здесь
+ Найдите, что почитать в разделе \"Обзор\".
+ Ничего не найдено
+ Попробуйте переформулировать запрос
+ Как-то пустовато здесь.
+ Управление источниками
+ Игнорирование ошибок SSL
+ Это может помочь в некоторых случаях
+ Показать количество манги в категориях
+ Очистить все
+ Описание
+ Источник включен
+ В этом разделе нет источников, или все они могли быть уже добавлены.
+ По вашему запросу не найдено ни одного источника манги
+ Не прочитано
+ Рейтинг
+ Читать
+ Не в избранных
+ Манга
+ Комиксы
+ Хентай
+ Другое
+ Похожая манга
+ Главы
+ Произошла ошибка
+ В избранных
+ В полке
+ Добавить в полку
+
\ No newline at end of file
diff --git a/app/src/main/res/values/plurals.xml b/app/src/main/res/values/plurals.xml
index 64b1623..511237b 100644
--- a/app/src/main/res/values/plurals.xml
+++ b/app/src/main/res/values/plurals.xml
@@ -16,4 +16,24 @@
- %1$d category
- %1$d categories
+
+ - %1$d chapter
+ - %1$d chapters
+
+
+ - %1$d minute ago
+ - %1$d minutes ago
+
+
+ - %1$d hour ago
+ - %1$d hours ago
+
+
+ - %1$d day ago
+ - %1$d days ago
+
+
+ - %1$d month ago
+ - %1$d months ago
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index e5f9081..72f7a57 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,5 +1,5 @@
- Tokusho
+ Tokusho
Settings
Feed
Search
@@ -35,13 +35,13 @@
Check for updates
No new updates
An error occurred while checking updates
- Install pre-release builds to preview new features and changes.\n\nThere will be some instability in there versions, so please don\'t hesitate to give us feedback if you experience any problems to help us improve the app for the future.
+ Install pre-release builds to preview new features and changes. There will be some instability in there versions, so please don\'t hesitate to give us feedback if you experience any problems to help us improve the app for the future.
Language
Dark theme
Dynamic color
Apply colors from wallpapers to the app theme
- English (United States)
- Русский
+ English (United States)
+ Русский
Cancel
Additional settings
High contrast dark theme