From 93f9636916bb38c7603e5e86335f2fe33bc9e66e Mon Sep 17 00:00:00 2001 From: Koitharu Date: Wed, 6 Jul 2022 19:43:43 +0300 Subject: [PATCH 1/5] Improve webtoon reader performance --- .../ui/pager/webtoon/WebtoonLayoutManager.kt | 41 +++++++++++++++ .../ui/pager/webtoon/WebtoonReaderFragment.kt | 11 +++- .../ui/pager/webtoon/WebtoonRecyclerView.kt | 50 ++++++++++++++++--- .../org/koitharu/kotatsu/utils/ext/ViewExt.kt | 16 ------ .../res/layout/fragment_reader_webtoon.xml | 2 +- 5 files changed, 95 insertions(+), 25 deletions(-) create mode 100644 app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonLayoutManager.kt diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonLayoutManager.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonLayoutManager.kt new file mode 100644 index 000000000..29f21d08e --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonLayoutManager.kt @@ -0,0 +1,41 @@ +package org.koitharu.kotatsu.reader.ui.pager.webtoon + +import android.content.Context +import android.util.AttributeSet +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import kotlin.math.sign + +class WebtoonLayoutManager : LinearLayoutManager { + + private var scrollDirection: Int = 0 + + constructor(context: Context) : super(context) + constructor( + context: Context, + orientation: Int, + reverseLayout: Boolean, + ) : super(context, orientation, reverseLayout) + + constructor( + context: Context, + attrs: AttributeSet?, + defStyleAttr: Int, + defStyleRes: Int, + ) : super(context, attrs, defStyleAttr, defStyleRes) + + override fun scrollVerticallyBy(dy: Int, recycler: RecyclerView.Recycler?, state: RecyclerView.State): Int { + scrollDirection = dy.sign + return super.scrollVerticallyBy(dy, recycler, state) + } + + override fun calculateExtraLayoutSpace(state: RecyclerView.State, extraLayoutSpace: IntArray) { + if (state.hasTargetScrollPosition()) { + super.calculateExtraLayoutSpace(state, extraLayoutSpace) + return + } + val pageSize = height + extraLayoutSpace[0] = if (scrollDirection < 0) pageSize else 0 + extraLayoutSpace[1] = if (scrollDirection < 0) 0 else pageSize + } +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonReaderFragment.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonReaderFragment.kt index 5a9721124..d0c25311d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonReaderFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonReaderFragment.kt @@ -12,7 +12,6 @@ import org.koitharu.kotatsu.reader.ui.ReaderState import org.koitharu.kotatsu.reader.ui.pager.BaseReader import org.koitharu.kotatsu.reader.ui.pager.BaseReaderAdapter import org.koitharu.kotatsu.reader.ui.pager.ReaderPage -import org.koitharu.kotatsu.utils.ext.doOnCurrentItemChanged import org.koitharu.kotatsu.utils.ext.findCenterViewPosition import org.koitharu.kotatsu.utils.ext.firstVisibleItemPosition import org.koitharu.kotatsu.utils.ext.viewLifecycleScope @@ -33,7 +32,7 @@ class WebtoonReaderFragment : BaseReader() { with(binding.recyclerView) { setHasFixedSize(true) adapter = webtoonAdapter - doOnCurrentItemChanged(::notifyPageChanged) + addOnPageScrollListener(PageScrollListener()) } } @@ -93,4 +92,12 @@ class WebtoonReaderFragment : BaseReader() { override fun switchPageTo(position: Int, smooth: Boolean) { binding.recyclerView.firstVisibleItemPosition = position } + + private inner class PageScrollListener : WebtoonRecyclerView.OnPageScrollListener() { + + override fun onPageChanged(recyclerView: WebtoonRecyclerView, index: Int) { + super.onPageChanged(recyclerView, index) + notifyPageChanged(index) + } + } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonRecyclerView.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonRecyclerView.kt index dfb0bad8c..aa28971af 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonRecyclerView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonRecyclerView.kt @@ -2,25 +2,27 @@ package org.koitharu.kotatsu.reader.ui.pager.webtoon import android.content.Context import android.util.AttributeSet -import androidx.core.view.ViewCompat +import androidx.core.view.ViewCompat.TYPE_TOUCH import androidx.recyclerview.widget.RecyclerView +import org.koitharu.kotatsu.utils.ext.findCenterViewPosition +import java.util.* class WebtoonRecyclerView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : RecyclerView(context, attrs, defStyleAttr) { - override fun startNestedScroll(axes: Int) = startNestedScroll(axes, ViewCompat.TYPE_TOUCH) + private var onPageScrollListeners: MutableList? = null - override fun startNestedScroll(axes: Int, type: Int): Boolean { - return true - } + override fun startNestedScroll(axes: Int) = startNestedScroll(axes, TYPE_TOUCH) + + override fun startNestedScroll(axes: Int, type: Int): Boolean = true override fun dispatchNestedPreScroll( dx: Int, dy: Int, consumed: IntArray?, offsetInWindow: IntArray? - ) = dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow, ViewCompat.TYPE_TOUCH) + ) = dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow, TYPE_TOUCH) override fun dispatchNestedPreScroll( dx: Int, @@ -34,6 +36,7 @@ class WebtoonRecyclerView @JvmOverloads constructor( consumed[0] = 0 consumed[1] = consumedY } + notifyScrollChanged(dy) return consumedY != 0 || dy == 0 } @@ -75,4 +78,39 @@ class WebtoonRecyclerView @JvmOverloads constructor( } return 0 } + + fun addOnPageScrollListener(listener: OnPageScrollListener) { + val list = onPageScrollListeners ?: LinkedList().also { onPageScrollListeners = it } + list.add(listener) + } + + fun removeOnPageScrollListener(listener: OnPageScrollListener) { + onPageScrollListeners?.remove(listener) + } + + private fun notifyScrollChanged(dy: Int) { + val listeners = onPageScrollListeners + if (listeners.isNullOrEmpty()) { + return + } + val centerPosition = findCenterViewPosition() + listeners.forEach { it.dispatchScroll(this, dy, centerPosition) } + } + + abstract class OnPageScrollListener { + + private var lastPosition = NO_POSITION + + fun dispatchScroll(recyclerView: WebtoonRecyclerView, dy: Int, centerPosition: Int) { + onScroll(recyclerView, dy) + if (centerPosition != NO_POSITION && centerPosition != lastPosition) { + lastPosition = centerPosition + onPageChanged(recyclerView, centerPosition) + } + } + + open fun onScroll(recyclerView: WebtoonRecyclerView, dy: Int) = Unit + + open fun onPageChanged(recyclerView: WebtoonRecyclerView, index: Int) = Unit + } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt index 586e40eef..bfd3959a9 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt @@ -91,22 +91,6 @@ fun View.resetTransformations() { rotationY = 0f } -inline fun RecyclerView.doOnCurrentItemChanged(crossinline callback: (Int) -> Unit) { - addOnScrollListener(object : RecyclerView.OnScrollListener() { - - private var lastItem = -1 - - override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { - super.onScrolled(recyclerView, dx, dy) - val item = recyclerView.findCenterViewPosition() - if (item != RecyclerView.NO_POSITION && item != lastItem) { - lastItem = item - callback(item) - } - } - }) -} - fun RecyclerView.findCenterViewPosition(): Int { val centerX = width / 2f val centerY = height / 2f diff --git a/app/src/main/res/layout/fragment_reader_webtoon.xml b/app/src/main/res/layout/fragment_reader_webtoon.xml index bf60f0a5a..2a3020690 100644 --- a/app/src/main/res/layout/fragment_reader_webtoon.xml +++ b/app/src/main/res/layout/fragment_reader_webtoon.xml @@ -6,4 +6,4 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" - app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> \ No newline at end of file + app:layoutManager="org.koitharu.kotatsu.reader.ui.pager.webtoon.WebtoonLayoutManager" /> \ No newline at end of file From 2a35ca609467e30ae31b69da7149d761aaf67fa6 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Thu, 7 Jul 2022 09:14:50 +0300 Subject: [PATCH 2/5] Fix landscape details view #197 --- .../main/res/layout-w600dp/fragment_details.xml | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/layout-w600dp/fragment_details.xml b/app/src/main/res/layout-w600dp/fragment_details.xml index 5bf8629f4..e45f03909 100644 --- a/app/src/main/res/layout-w600dp/fragment_details.xml +++ b/app/src/main/res/layout-w600dp/fragment_details.xml @@ -42,9 +42,8 @@ + + + app:layout_constraintTop_toBottomOf="@+id/barrier_header" /> From f0b222140efed0402d2138004315b430a48e65d6 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Thu, 7 Jul 2022 10:17:58 +0300 Subject: [PATCH 3/5] Update parsers --- app/build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c55d86047..f74ad33c4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,8 +14,8 @@ android { applicationId 'org.koitharu.kotatsu' minSdkVersion 21 targetSdkVersion 32 - versionCode 412 - versionName '3.4' + versionCode 413 + versionName '3.4.1' generatedDensities = [] testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -77,7 +77,7 @@ afterEvaluate { } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar']) - implementation('com.github.nv95:kotatsu-parsers:da3b0ae0cf') { + implementation('com.github.nv95:kotatsu-parsers:8c26f3c790') { exclude group: 'org.json', module: 'json' } From 20ac12ca0dc3f49cd25ab0ccf7af35677d69490c Mon Sep 17 00:00:00 2001 From: Koitharu Date: Thu, 7 Jul 2022 10:50:27 +0300 Subject: [PATCH 4/5] Update readme and metadata --- README.md | 27 ++++++++++++--------------- metadata/en-US/full_description.txt | 8 +++++--- metadata/ru/full_description.txt | 6 +++++- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 1d693109e..82e4fada7 100644 --- a/README.md +++ b/README.md @@ -10,9 +10,9 @@ Kotatsu is a free and open source manga reader for Android. alt="Get it on F-Droid" height="80">](https://f-droid.org/packages/org.koitharu.kotatsu) -Download APK from GitHub Releases: +Download APK directly from GitHub: -- [Latest release](https://github.com/KotatsuApp/Kotatsu/releases/latest) +- **[Latest release](https://github.com/KotatsuApp/Kotatsu/releases/latest)** ### Main Features @@ -24,8 +24,8 @@ Download APK from GitHub Releases: * Tablet-optimized material design UI * Standard and Webtoon-optimized reader * Notifications about new chapters with updates feed -* Available in multiple languages -* Password protect access to the app +* Shikimori integration (manga tracking) +* Password/fingerprint protect access to the app ### Screenshots @@ -38,23 +38,20 @@ Download APK from GitHub Releases: ### Localization - -Translation status - +[Translation status](https://hosted.weblate.org/engage/kotatsu/) Kotatsu is localized in a number of different languages, if you would like to help improve these or add new languages, -please head over to the Weblate project page +please head over to the [Weblate project page](https://hosted.weblate.org/engage/kotatsu/) ### License [![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](http://www.gnu.org/licenses/gpl-3.0.en.html) -Kotatsu is Free Software: You can use, study share and improve it at your -will. Specifically you can redistribute and/or modify it under the terms of the -[GNU General Public License](https://www.gnu.org/licenses/gpl.html) as -published by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. +You may copy, distribute and modify the software as long as you track changes/dates in source files. Any modifications +to or software including (via compiler) GPL-licensed code must also be made available under the GPL along with build & +install instructions. -### Disclaimer +### DMCA disclaimer -The developers of this application does not have any affiliation with the content providers available. +The developers of this application does not have any affiliation with the content available in the app. +It is collecting from the sources freely available through any web browser. diff --git a/metadata/en-US/full_description.txt b/metadata/en-US/full_description.txt index 8c4f8945c..7fe456248 100644 --- a/metadata/en-US/full_description.txt +++ b/metadata/en-US/full_description.txt @@ -1,4 +1,6 @@ -Kotatsu is a free and open source manga reader for Android.
+Kotatsu is a free and open source manga reader for Android. + + **Main Features:** - Online manga catalogues @@ -9,5 +11,5 @@ Kotatsu is a free and open source manga reader for Android.
- Tablet-optimized material design UI - Standard and Webtoon-optimized reader - Notifications about new chapters with updates feed -- Available in multiple languages -- Password protect access to the app +- Shikimori integration (manga tracking) +- Password/fingerprint protect access to the app \ No newline at end of file diff --git a/metadata/ru/full_description.txt b/metadata/ru/full_description.txt index df079ccdd..2ccccbf51 100644 --- a/metadata/ru/full_description.txt +++ b/metadata/ru/full_description.txt @@ -1,4 +1,6 @@ -Kotatsu - приложения для чтения манги с открытым исходным кодом.
+Kotatsu - приложения для чтения манги с открытым исходным кодом. + + **Основные возможности:** - Онлайн каталоги с мангой @@ -9,3 +11,5 @@ Kotatsu - приложения для чтения манги с открыты - Интерфейс также оптимизирован для планшетов - Поддержка манхвы (Webtoon) - Уведомления о новых главах и лента обновлений +- Интеграция с Shikimori +- Защита доступа в приложение паролем/отпечатком пальца From 3121532217d8a2f12a380a7ee7b2a46485851c21 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Thu, 7 Jul 2022 10:34:55 +0200 Subject: [PATCH 5/5] Translated using Weblate (Russian) Currently translated at 100.0% (320 of 320 strings) Co-authored-by: Koitharu Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/ru/ Translation: Kotatsu/Strings --- app/src/main/res/values-ru/strings.xml | 617 +++++++++++++------------ 1 file changed, 316 insertions(+), 301 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index e1f523b01..07ab4f6bb 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -1,305 +1,320 @@ - Закрыть меню - Открыть меню - На устройстве - Избранное - История - Произошла ошибка - Не удалось подключиться к интернету - Подробности - Главы - Список - Подробный список - Таблица - Вид списка - Настройки - Онлайн каталоги - Загрузка… - Глава %1$d из %2$d - Закрыть - Повторить - Очистить историю - Ничего не найдено - Истории пока нет - Читать - Избранного пока нет - В избранное - Новая категория - Добавить - Введите название - Сохранить - Поделиться - Создать ярлык… - Поделиться %s - Поиск - Поиск манги - Загрузка… - Обработка… - Загружено - Загрузки - Имя - Популярная - Обновлённая - Новая - Рейтинг - Порядок сортировки - Фильтр - Тема - Светлая - Тёмная - Как в системе - Страницы - Очистить - Очистить всю историю чтения полностью\? - Удалить - «%s» удалено из истории - «%s» удалено с устройства - Дождитесь завершения загрузки… - Сохранить страницу - Сохранено - Поделиться изображением - Импорт - Удалить - Операция не поддерживается - Выберите CBZ-файл или ZIP - Нет описания - История и кэш - Очистить кэш страниц - Кэш - Б|кБ|МБ|ГБ|ТБ - Стандартный - Манхва - Режим чтения - Размер таблицы - Поиск по %s - Удалить мангу - Удалить \"%s\" с устройства навсегда\? - Настройки чтения - Листание страниц - Нажатия по краям - Кнопки громкости - Продолжить - Предупреждение - Это может привести к расходу большого количества трафика - Больше не спрашивать - Отмена… - Ошибка - Очистить кэш миниатюр - Очистить историю поиска - Очищено - Только жесты - Внутренний накопитель - Внешнее хранилище - Домен - Проверять наличие новых версий приложения - Доступна новая версия приложения - Показывать уведомление, если доступна новая версия - Открыть в веб-браузере - В этой манге %s. Сохранить их все\? - Сохранить - Уведомления - Включено %1$d из %2$d - Новые главы - Загрузить - Читать с начала - Перезапустить - Настройки уведомлений - Звук уведомления - Светодиодная индикация - Вибросигнал - Категории избранного - Категории… - Переименовать - Удалить категорию \"%s\" из избранного\? + Закрыть меню + Открыть меню + На устройстве + Избранное + История + Произошла ошибка + Не удалось подключиться к интернету + Подробности + Главы + Список + Подробный список + Таблица + Вид списка + Настройки + Онлайн каталоги + Загрузка… + Глава %1$d из %2$d + Закрыть + Повторить + Очистить историю + Ничего не найдено + Истории пока нет + Читать + Избранного пока нет + В избранное + Новая категория + Добавить + Введите название + Сохранить + Поделиться + Создать ярлык… + Поделиться %s + Поиск + Поиск манги + Загрузка… + Обработка… + Загружено + Загрузки + Имя + Популярная + Обновлённая + Новая + Рейтинг + Порядок сортировки + Фильтр + Тема + Светлая + Тёмная + Как в системе + Страницы + Очистить + Очистить всю историю чтения полностью\? + Удалить + «%s» удалено из истории + «%s» удалено с устройства + Дождитесь завершения загрузки… + Сохранить страницу + Сохранено + Поделиться изображением + Импорт + Удалить + Операция не поддерживается + Выберите CBZ-файл или ZIP + Нет описания + История и кэш + Очистить кэш страниц + Кэш + Б|кБ|МБ|ГБ|ТБ + Стандартный + Манхва + Режим чтения + Размер таблицы + Поиск по %s + Удалить мангу + Удалить \"%s\" с устройства навсегда\? + Настройки чтения + Листание страниц + Нажатия по краям + Кнопки громкости + Продолжить + Предупреждение + Это может привести к расходу большого количества трафика + Больше не спрашивать + Отмена… + Ошибка + Очистить кэш миниатюр + Очистить историю поиска + Очищено + Только жесты + Внутренний накопитель + Внешнее хранилище + Домен + Проверять наличие новых версий приложения + Доступна новая версия приложения + Показывать уведомление, если доступна новая версия + Открыть в веб-браузере + В этой манге %s. Сохранить их все\? + Сохранить + Уведомления + Включено %1$d из %2$d + Новые главы + Загрузить + Читать с начала + Перезапустить + Настройки уведомлений + Звук уведомления + Светодиодная индикация + Вибросигнал + Категории избранного + Категории… + Переименовать + Удалить категорию \"%s\" из избранного\? \nВся манга в ней будет потеряна. - Удалить - Как-то здесь пусто… - Попробуйте переформулировать запрос. - Вы можете использовать категории для организации своих избранных. Нажмите «+», чтобы создать категорию - То, что вы прочитаете, будет отображено здесь - Найдите, что почитать, в боковом меню. - Сохраните что-нибудь - Сохраните что-нибудь из онлайн-каталога или импортируйте из файла. - Полка - Недавнее - Анимация листания - Папка для загрузок - Недоступно - Нет доступного хранилища - Другое хранилище - Готово - Всё избранное - Категория пуста - Прочитать позже - Обновления - Новые главы из того, что вы читаете, будут показаны здесь - Результаты поиска - Похожие - Новая версия: %s - Размер: %s - Ожидание подключения… - Очистить ленту обновлений - Очищено - Повернуть экран - Обновить - Обновление скоро начнётся - Следить за обновлениями - Не проверять - Введите пароль - Неверный пароль - Защитить приложение - Запрашивать пароль при запуске Kotatsu - Повторите пароль - Пароли не совпадают - О программе - Версия %s - Проверить обновления - Проверка обновления… - Не удалось проверить обновления - Нет доступных обновлений - Справа налево (←) - Создать категорию - Масштабирование - Вписать в экран - Подогнать по высоте - Подогнать по ширине - Исходный размер - Чёрная - Потребляет меньше энергии на экранах AMOLED - Резервное копирование и восстановление - Создать резервную копию - Восстановить данные - Восстановлено - Подготовка… - Файл не найден - Все данные были восстановлены - Данные были восстановлены, но возникли некоторые ошибки - Вы можете создать резервную копию избранного и истории и потом восстановить их - Только что - Вчера - Давно - Группировать - Сегодня - Попробовать ещё раз - Выбранный режим будет сохранён для текущей манги - Без звука - Необходимо пройти CAPTCHA - Пройти - Очистить куки - Все файлы cookie были удалены - Проверка новых глав: %1$d из %2$d - Очистить ленту - Удалить всю историю обновлений навсегда\? - Проверка новых глав - В обратном порядке - Войти - Авторизуйтесь, чтобы просмотреть этот контент - По умолчанию: %s - …и ещё %1$d - Далее - Введите пароль для запуска приложения - Подтвердить - Пароль должен состоять из 4 символов или более - Поиск только по %s - Другие - Добро пожаловать - Удалить все последние поисковые запросы навсегда\? - Резервная копия сохранена - Некоторые устройства имеют различное поведение системы, что может привести к нарушению фоновых задач. - Подробнее - В очереди - Нет активных загрузок - Глава отсутствует - Скачайте или прочитайте эту недостающую главу онлайн. - Помочь с переводом приложения - Перевод - Тема на 4PDA - Обратная связь - Авторизация выполнена - Вход в %s не поддерживается - Вы выйдете из всех источников - Жанры - Завершено - Онгоинг - Формат даты - По умолчанию - Исключить NSFW мангу из истории - Вы должны ввести имя - Показывать номера страницы - Включенные источники - Доступные источники - Динамическая тема - Применяет тему приложения, основанную на цветовой палитре обоев на устройстве - Политика скриншотов - Разрешить - Запретить для NSFW - Всегда блокировать - Рекомендации - Включить рекомендации - Предлагать мангу на основе Ваших предпочтений - Все данные анализируются локально на устройстве. Ваши персональные данные не передаются в какие-либо сервисы - Начните читать мангу, чтобы получать персональные предложения - Не предлагать NSFW мангу - Включено - Выключено - Не удалось загрузить список жанров - Вычисление… - Создать проблему на GitHub - Импорт манги: %1$d из %2$d - Сбросить фильтр - Поиск по жанрам - Выберите языки, на которых Вы хоите читать мангу. Это можно будет изменить позже в настройках. - Никогда - Только по Wi-Fi - Всегда - Предварительная загрузка страниц - Вы авторизованы как %s - 18+ - Разные языки - Найти главу - В этой манге нет глав - Оформление - Контент - Обновление рекомендаций - Исключить жанры - Укажите жанры, которые Вы не хотите видеть в рекомендациях - Удалить выбранную мангу с накопителя? - Удаление завершено - Загрузить выбранную мангу со всеми главами? Это может привести к большому расходу трафика и места на накопителе - Загружать параллельно - Замедление загрузки - Помогает избежать блокировки IP-адреса - Обработка сохранённой манги - Главы будут удалены в фоновом режиме. Это может занять какое-то время - Скрыть - Доступны новые источники манги - Проверять новые главы и уведомлять о них - Вы будете получать уведомления об обновлении манги, которую Вы читаете - Вы не будете получать уведомления, но новые главы будут отображаться в списке - Включить уведомления - Название - Изменить - Изменить категорию - Отслеживание - Нет категорий избранного - Добавить закладку - Удалить закладку - Закладки - Закладка удалена - Закладка добавлена - Отменить - Удалено из истории - DNS через HTTPS - Режим по умолчанию - Автоопределение режима чтения - Автоматически определяет, является ли манга веб-комиксом - Отключить оптимизацию батареи - Помогает с фоновой проверкой обновлений - Что-то пошло не так. Пожалуйста, отправьте отчёт разработчикам, чтобы помочь всё исправить - Отправить - Отключить все - Использовать отпечаток пальца, если доступно - Манга из Вашего избранного - Манга, которую Вы недавно читали + Удалить + Как-то здесь пусто… + Попробуйте переформулировать запрос. + Вы можете использовать категории для организации своих избранных. Нажмите «+», чтобы создать категорию + То, что вы прочитаете, будет отображено здесь + Найдите, что почитать, в боковом меню. + Сохраните что-нибудь + Сохраните что-нибудь из онлайн-каталога или импортируйте из файла. + Полка + Недавнее + Анимация листания + Папка для загрузок + Недоступно + Нет доступного хранилища + Другое хранилище + Готово + Всё избранное + Категория пуста + Прочитать позже + Обновления + Новые главы из того, что вы читаете, будут показаны здесь + Результаты поиска + Похожие + Новая версия: %s + Размер: %s + Ожидание подключения… + Очистить ленту обновлений + Очищено + Повернуть экран + Обновить + Обновление скоро начнётся + Следить за обновлениями + Не проверять + Введите пароль + Неверный пароль + Защитить приложение + Запрашивать пароль при запуске Kotatsu + Повторите пароль + Пароли не совпадают + О программе + Версия %s + Проверить обновления + Проверка обновления… + Не удалось проверить обновления + Нет доступных обновлений + Справа налево (←) + Создать категорию + Масштабирование + Вписать в экран + Подогнать по высоте + Подогнать по ширине + Исходный размер + Чёрная + Потребляет меньше энергии на экранах AMOLED + Резервное копирование и восстановление + Создать резервную копию + Восстановить данные + Восстановлено + Подготовка… + Файл не найден + Все данные были восстановлены + Данные были восстановлены, но возникли некоторые ошибки + Вы можете создать резервную копию избранного и истории и потом восстановить их + Только что + Вчера + Давно + Группировать + Сегодня + Попробовать ещё раз + Выбранный режим будет сохранён для текущей манги + Без звука + Необходимо пройти CAPTCHA + Пройти + Очистить куки + Все файлы cookie были удалены + Проверка новых глав: %1$d из %2$d + Очистить ленту + Удалить всю историю обновлений навсегда\? + Проверка новых глав + В обратном порядке + Войти + Авторизуйтесь, чтобы просмотреть этот контент + По умолчанию: %s + …и ещё %1$d + Далее + Введите пароль для запуска приложения + Подтвердить + Пароль должен состоять из 4 символов или более + Поиск только по %s + Другие + Добро пожаловать + Удалить все последние поисковые запросы навсегда\? + Резервная копия сохранена + Некоторые устройства имеют различное поведение системы, что может привести к нарушению фоновых задач. + Подробнее + В очереди + Нет активных загрузок + Глава отсутствует + Скачайте или прочитайте эту недостающую главу онлайн. + Помочь с переводом приложения + Перевод + Тема на 4PDA + Обратная связь + Авторизация выполнена + Вход в %s не поддерживается + Вы выйдете из всех источников + Жанры + Завершено + Онгоинг + Формат даты + По умолчанию + Исключить NSFW мангу из истории + Вы должны ввести имя + Показывать номера страницы + Включенные источники + Доступные источники + Динамическая тема + Применяет тему приложения, основанную на цветовой палитре обоев на устройстве + Политика скриншотов + Разрешить + Запретить для NSFW + Всегда блокировать + Рекомендации + Включить рекомендации + Предлагать мангу на основе Ваших предпочтений + Все данные анализируются локально на устройстве. Ваши персональные данные не передаются в какие-либо сервисы + Начните читать мангу, чтобы получать персональные предложения + Не предлагать NSFW мангу + Включено + Выключено + Не удалось загрузить список жанров + Вычисление… + Создать проблему на GitHub + Импорт манги: %1$d из %2$d + Сбросить фильтр + Поиск по жанрам + Выберите языки, на которых Вы хоите читать мангу. Это можно будет изменить позже в настройках. + Никогда + Только по Wi-Fi + Всегда + Предварительная загрузка страниц + Вы авторизованы как %s + 18+ + Разные языки + Найти главу + В этой манге нет глав + Оформление + Контент + Обновление рекомендаций + Исключить жанры + Укажите жанры, которые Вы не хотите видеть в рекомендациях + Удалить выбранную мангу с накопителя? + Удаление завершено + Загрузить выбранную мангу со всеми главами? Это может привести к большому расходу трафика и места на накопителе + Загружать параллельно + Замедление загрузки + Помогает избежать блокировки IP-адреса + Обработка сохранённой манги + Главы будут удалены в фоновом режиме. Это может занять какое-то время + Скрыть + Доступны новые источники манги + Проверять новые главы и уведомлять о них + Вы будете получать уведомления об обновлении манги, которую Вы читаете + Вы не будете получать уведомления, но новые главы будут отображаться в списке + Включить уведомления + Название + Изменить + Изменить категорию + Отслеживание + Нет категорий избранного + Добавить закладку + Удалить закладку + Закладки + Закладка удалена + Закладка добавлена + Отменить + Удалено из истории + DNS через HTTPS + Режим по умолчанию + Автоопределение режима чтения + Автоматически определяет, является ли манга веб-комиксом + Отключить оптимизацию батареи + Помогает с фоновой проверкой обновлений + Что-то пошло не так. Пожалуйста, отправьте отчёт разработчикам, чтобы помочь всё исправить + Отправить + Отключить все + Использовать отпечаток пальца, если доступно + Манга из Вашего избранного + Манга, которую Вы недавно читали + Читаю + Запланировано + Отложено + Заброшено + Завершено + Показать процент прочитанного в истории и избранном + Манга, помеченная как NSFW, никогда не будет добавлена в историю и ваш прогресс чтения не будет сохранен + %1$s%% + Отчёт + Выйти + Перечитываю + Показать индикаторы прогресса чтения + Удаление данных + Может помочь в случае каких-либо проблем. Все авторизации будут аннулированы + Показать все \ No newline at end of file