From 02980ea1e62bb216b42bce6d8d350fb8ba9f93e2 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sun, 13 Feb 2022 08:50:41 +0200 Subject: [PATCH 01/70] Allow overwrite non-empty download directory #99 --- .../java/org/koitharu/kotatsu/local/data/MangaZip.kt | 2 +- .../org/koitharu/kotatsu/local/data/WritableCbzFile.kt | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/local/data/MangaZip.kt b/app/src/main/java/org/koitharu/kotatsu/local/data/MangaZip.kt index c9d93f147..533c619a8 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/data/MangaZip.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/data/MangaZip.kt @@ -16,7 +16,7 @@ class MangaZip(val file: File) { private var index = MangaIndex(null) suspend fun prepare(manga: Manga) { - writableCbz.prepare() + writableCbz.prepare(overwrite = true) index = MangaIndex(writableCbz[INDEX_ENTRY].takeIfReadable()?.readText()) index.setMangaInfo(manga, append = true) } diff --git a/app/src/main/java/org/koitharu/kotatsu/local/data/WritableCbzFile.kt b/app/src/main/java/org/koitharu/kotatsu/local/data/WritableCbzFile.kt index fbc2637aa..fe61169b2 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/data/WritableCbzFile.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/data/WritableCbzFile.kt @@ -14,9 +14,13 @@ class WritableCbzFile(private val file: File) { private val dir = File(file.parentFile, file.nameWithoutExtension) - suspend fun prepare() = withContext(Dispatchers.IO) { - check(dir.list().isNullOrEmpty()) { - "Dir ${dir.name} is not empty" + suspend fun prepare(overwrite: Boolean) = withContext(Dispatchers.IO) { + if (!dir.list().isNullOrEmpty()) { + if (overwrite) { + dir.deleteRecursively() + } else { + throw IllegalStateException("Dir ${dir.name} is not empty") + } } if (!dir.exists()) { dir.mkdir() From 51d6a073e0da9f5d9269d961063f324ac5b25e9a Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sun, 13 Feb 2022 10:21:37 +0200 Subject: [PATCH 02/70] Refactor local storage manager --- .../base/ui/dialog/StorageSelectDialog.kt | 23 +++--- .../kotatsu/core/prefs/AppSettings.kt | 11 ++- .../download/domain/DownloadManager.kt | 4 +- .../download/ui/service/DownloadService.kt | 2 +- .../org/koitharu/kotatsu/local/LocalModule.kt | 4 +- .../kotatsu/local/data/LocalStorageManager.kt | 67 ++++++++++++++++ .../local/domain/LocalMangaRepository.kt | 78 ++++++++----------- .../kotatsu/local/ui/LocalListViewModel.kt | 7 +- .../kotatsu/settings/MainSettingsFragment.kt | 26 ++++--- 9 files changed, 143 insertions(+), 79 deletions(-) create mode 100644 app/src/main/java/org/koitharu/kotatsu/local/data/LocalStorageManager.kt diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/StorageSelectDialog.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/StorageSelectDialog.kt index a72672272..3c048aa54 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/StorageSelectDialog.kt +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/StorageSelectDialog.kt @@ -8,10 +8,10 @@ import android.widget.BaseAdapter import androidx.annotation.StringRes import androidx.appcompat.app.AlertDialog import com.google.android.material.dialog.MaterialAlertDialogBuilder +import kotlinx.coroutines.runBlocking import org.koitharu.kotatsu.R import org.koitharu.kotatsu.databinding.ItemStorageBinding -import org.koitharu.kotatsu.local.domain.LocalMangaRepository -import org.koitharu.kotatsu.utils.ext.getStorageName +import org.koitharu.kotatsu.local.data.LocalStorageManager import org.koitharu.kotatsu.utils.ext.inflate import java.io.File @@ -20,15 +20,18 @@ class StorageSelectDialog private constructor(private val delegate: AlertDialog) fun show() = delegate.show() - class Builder(context: Context, defaultValue: File?, listener: OnStorageSelectListener) { + class Builder(context: Context, storageManager: LocalStorageManager, listener: OnStorageSelectListener) { - private val adapter = VolumesAdapter(context) + private val adapter = VolumesAdapter(storageManager) private val delegate = MaterialAlertDialogBuilder(context) init { if (adapter.isEmpty) { delegate.setMessage(R.string.cannot_find_available_storage) } else { + val defaultValue = runBlocking { + storageManager.getDefaultWriteableDir() + } adapter.selectedItemPosition = adapter.volumes.indexOfFirst { it.first.canonicalPath == defaultValue?.canonicalPath } @@ -57,10 +60,10 @@ class StorageSelectDialog private constructor(private val delegate: AlertDialog) fun create() = StorageSelectDialog(delegate.create()) } - private class VolumesAdapter(context: Context) : BaseAdapter() { + private class VolumesAdapter(storageManager: LocalStorageManager) : BaseAdapter() { var selectedItemPosition: Int = -1 - val volumes = getAvailableVolumes(context) + val volumes = getAvailableVolumes(storageManager) override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { val view = convertView ?: parent.inflate(R.layout.item_storage) @@ -82,9 +85,11 @@ class StorageSelectDialog private constructor(private val delegate: AlertDialog) override fun hasStableIds() = true - private fun getAvailableVolumes(context: Context): List> { - return LocalMangaRepository.getAvailableStorageDirs(context).map { - it to it.getStorageName(context) + private fun getAvailableVolumes(storageManager: LocalStorageManager): List> { + return runBlocking { + storageManager.getWriteableDirs().map { + it to storageManager.getStorageDisplayName(it) + } } } } diff --git a/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt b/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt index 8fac79601..688428ee7 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt @@ -13,7 +13,6 @@ import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.channels.trySendBlocking import kotlinx.coroutines.flow.callbackFlow import org.koitharu.kotatsu.core.model.ZoomMode -import org.koitharu.kotatsu.local.domain.LocalMangaRepository import org.koitharu.kotatsu.utils.delegates.prefs.* import java.io.File import java.text.DateFormat @@ -115,14 +114,14 @@ class AppSettings private constructor(private val prefs: SharedPreferences) : val isPagesNumbersEnabled by BoolPreferenceDelegate(KEY_PAGES_NUMBERS, false) - fun getStorageDir(context: Context): File? { - val value = prefs.getString(KEY_LOCAL_STORAGE, null)?.let { + fun getFallbackStorageDir(): File? { + return prefs.getString(KEY_LOCAL_STORAGE, null)?.let { File(it) - }?.takeIf { it.exists() && it.canWrite() } - return value ?: LocalMangaRepository.getFallbackStorageDir(context) + }?.takeIf { it.exists() } } - fun setStorageDir(context: Context, file: File?) { + @Deprecated("Use LocalStorageManager instead") + fun setStorageDir(file: File?) { prefs.edit { if (file == null) { remove(KEY_LOCAL_STORAGE) diff --git a/app/src/main/java/org/koitharu/kotatsu/download/domain/DownloadManager.kt b/app/src/main/java/org/koitharu/kotatsu/download/domain/DownloadManager.kt index 1a36ec7fc..849dca7ca 100644 --- a/app/src/main/java/org/koitharu/kotatsu/download/domain/DownloadManager.kt +++ b/app/src/main/java/org/koitharu/kotatsu/download/domain/DownloadManager.kt @@ -18,7 +18,6 @@ import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.core.network.CommonHeaders import org.koitharu.kotatsu.core.parser.MangaRepository -import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.local.data.MangaZip import org.koitharu.kotatsu.local.data.PagesCache import org.koitharu.kotatsu.local.domain.LocalMangaRepository @@ -30,7 +29,6 @@ import java.io.File class DownloadManager( private val context: Context, - private val settings: AppSettings, private val imageLoader: ImageLoader, private val okHttp: OkHttpClient, private val cache: PagesCache, @@ -50,7 +48,7 @@ class DownloadManager( fun downloadManga(manga: Manga, chaptersIds: Set?, startId: Int) = flow { emit(State.Preparing(startId, manga, null)) var cover: Drawable? = null - val destination = settings.getStorageDir(context) + val destination = localMangaRepository.getOutputDir() checkNotNull(destination) { context.getString(R.string.cannot_find_available_storage) } var output: MangaZip? = null try { diff --git a/app/src/main/java/org/koitharu/kotatsu/download/ui/service/DownloadService.kt b/app/src/main/java/org/koitharu/kotatsu/download/ui/service/DownloadService.kt index 03712d889..f5681df51 100644 --- a/app/src/main/java/org/koitharu/kotatsu/download/ui/service/DownloadService.kt +++ b/app/src/main/java/org/koitharu/kotatsu/download/ui/service/DownloadService.kt @@ -53,7 +53,7 @@ class DownloadService : BaseService() { notificationManager = NotificationManagerCompat.from(this) wakeLock = (getSystemService(Context.POWER_SERVICE) as PowerManager) .newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "kotatsu:downloading") - downloadManager = DownloadManager(this, get(), get(), get(), get(), get()) + downloadManager = DownloadManager(this, get(), get(), get(), get()) DownloadNotification.createChannel(this) registerReceiver(controlReceiver, IntentFilter(ACTION_DOWNLOAD_CANCEL)) } diff --git a/app/src/main/java/org/koitharu/kotatsu/local/LocalModule.kt b/app/src/main/java/org/koitharu/kotatsu/local/LocalModule.kt index dbe2d43e1..9b5b87822 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/LocalModule.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/LocalModule.kt @@ -6,13 +6,15 @@ import org.koin.core.qualifier.named import org.koin.dsl.module import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.core.parser.MangaRepository +import org.koitharu.kotatsu.local.data.LocalStorageManager import org.koitharu.kotatsu.local.domain.LocalMangaRepository import org.koitharu.kotatsu.local.ui.LocalListViewModel val localModule get() = module { - single { LocalMangaRepository(androidContext()) } + single { LocalStorageManager(androidContext(), get()) } + single { LocalMangaRepository(get()) } factory(named(MangaSource.LOCAL)) { get() } viewModel { LocalListViewModel(get(), get(), get(), get()) } diff --git a/app/src/main/java/org/koitharu/kotatsu/local/data/LocalStorageManager.kt b/app/src/main/java/org/koitharu/kotatsu/local/data/LocalStorageManager.kt new file mode 100644 index 000000000..b51cb2367 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/local/data/LocalStorageManager.kt @@ -0,0 +1,67 @@ +package org.koitharu.kotatsu.local.data + +import android.content.Context +import androidx.annotation.WorkerThread +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.runInterruptible +import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.utils.ext.getStorageName +import java.io.File + +private const val DIR_NAME = "manga" + +class LocalStorageManager( + private val context: Context, + private val settings: AppSettings, +) { + + suspend fun getReadableDirs(): List = runInterruptible(Dispatchers.IO) { + getConfiguredStorageDirs() + .filter { it.isReadable() } + } + + suspend fun getWriteableDirs(): List = runInterruptible(Dispatchers.IO) { + getConfiguredStorageDirs() + .filter { it.isWriteable() } + } + + suspend fun getDefaultWriteableDir(): File? = runInterruptible(Dispatchers.IO) { + val preferredDir = settings.getFallbackStorageDir()?.takeIf { it.isWriteable() } + preferredDir ?: getFallbackStorageDir()?.takeIf { it.isWriteable() } + } + + fun getStorageDisplayName(file: File) = file.getStorageName(context) + + @WorkerThread + private fun getConfiguredStorageDirs(): MutableSet { + val set = getAvailableStorageDirs() + settings.getFallbackStorageDir()?.let { + set.add(it) + } + return set + } + + @WorkerThread + private fun getAvailableStorageDirs(): MutableSet { + val result = LinkedHashSet() + result += File(context.filesDir, DIR_NAME) + result += context.getExternalFilesDirs(DIR_NAME) + result.retainAll { it.exists() || it.mkdirs() } + return result + } + + @WorkerThread + private fun getFallbackStorageDir(): File? { + return context.getExternalFilesDir(DIR_NAME) ?: File(context.filesDir, DIR_NAME).takeIf { + it.exists() || it.mkdirs() + } + } + + private fun File.isReadable() = runCatching { + canRead() + }.getOrDefault(false) + + private fun File.isWriteable() = runCatching { + canWrite() + }.getOrDefault(false) +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/local/domain/LocalMangaRepository.kt b/app/src/main/java/org/koitharu/kotatsu/local/domain/LocalMangaRepository.kt index 2dfb798f2..2b861592f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/domain/LocalMangaRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/domain/LocalMangaRepository.kt @@ -1,7 +1,6 @@ package org.koitharu.kotatsu.local.domain import android.annotation.SuppressLint -import android.content.Context import android.net.Uri import android.webkit.MimeTypeMap import androidx.collection.ArraySet @@ -9,20 +8,23 @@ import androidx.core.net.toFile import androidx.core.net.toUri import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runInterruptible -import kotlinx.coroutines.withContext import org.koitharu.kotatsu.core.model.* import org.koitharu.kotatsu.core.parser.MangaRepository import org.koitharu.kotatsu.local.data.CbzFilter +import org.koitharu.kotatsu.local.data.LocalStorageManager import org.koitharu.kotatsu.local.data.MangaIndex import org.koitharu.kotatsu.local.data.MangaZip import org.koitharu.kotatsu.utils.AlphanumComparator -import org.koitharu.kotatsu.utils.ext.* +import org.koitharu.kotatsu.utils.ext.deleteAwait +import org.koitharu.kotatsu.utils.ext.longHashCode +import org.koitharu.kotatsu.utils.ext.readText +import org.koitharu.kotatsu.utils.ext.toCamelCase import java.io.File import java.util.* import java.util.zip.ZipEntry import java.util.zip.ZipFile -class LocalMangaRepository(private val context: Context) : MangaRepository { +class LocalMangaRepository(private val storageManager: LocalStorageManager) : MangaRepository { override val source = MangaSource.LOCAL private val filenameFilter = CbzFilter() @@ -149,24 +151,26 @@ class LocalMangaRepository(private val context: Context) : MangaRepository { } } - suspend fun findSavedManga(remoteManga: Manga): Manga? = runInterruptible(Dispatchers.IO) { + suspend fun findSavedManga(remoteManga: Manga): Manga? { val files = getAllFiles() - for (file in files) { - val index = ZipFile(file).use { zip -> - val entry = zip.getEntry(MangaZip.INDEX_ENTRY) - entry?.let(zip::readText)?.let(::MangaIndex) - } ?: continue - val info = index.getMangaInfo() ?: continue - if (info.id == remoteManga.id) { - val fileUri = file.toUri().toString() - return@runInterruptible info.copy( - source = MangaSource.LOCAL, - url = fileUri, - chapters = info.chapters?.map { c -> c.copy(url = fileUri) } - ) + return runInterruptible(Dispatchers.IO) { + for (file in files) { + val index = ZipFile(file).use { zip -> + val entry = zip.getEntry(MangaZip.INDEX_ENTRY) + entry?.let(zip::readText)?.let(::MangaIndex) + } ?: continue + val info = index.getMangaInfo() ?: continue + if (info.id == remoteManga.id) { + val fileUri = file.toUri().toString() + return@runInterruptible info.copy( + source = MangaSource.LOCAL, + url = fileUri, + chapters = info.chapters?.map { c -> c.copy(url = fileUri) } + ) + } } + null } - null } private fun zipUri(file: File, entryName: String) = @@ -193,32 +197,16 @@ class LocalMangaRepository(private val context: Context) : MangaRepository { override suspend fun getTags() = emptySet() - private fun getAllFiles() = getAvailableStorageDirs(context).flatMap { dir -> + fun isFileSupported(name: String): Boolean { + val ext = name.substringAfterLast('.').lowercase(Locale.ROOT) + return ext == "cbz" || ext == "zip" + } + + suspend fun getOutputDir(): File? { + return storageManager.getDefaultWriteableDir() + } + + private suspend fun getAllFiles() = storageManager.getReadableDirs().flatMap { dir -> dir.listFiles(filenameFilter)?.toList().orEmpty() } - - companion object { - - private const val DIR_NAME = "manga" - - fun isFileSupported(name: String): Boolean { - val ext = name.substringAfterLast('.').lowercase(Locale.ROOT) - return ext == "cbz" || ext == "zip" - } - - fun getAvailableStorageDirs(context: Context): List { - val result = ArrayList(5) - result += File(context.filesDir, DIR_NAME) - result += context.getExternalFilesDirs(DIR_NAME) - return result.filterNotNull() - .distinctBy { it.canonicalPath } - .filter { it.exists() || it.mkdir() } - } - - fun getFallbackStorageDir(context: Context): File? { - return context.getExternalFilesDir(DIR_NAME) ?: context.filesDir.sub(DIR_NAME).takeIf { - (it.exists() || it.mkdir()) && it.canWrite() - } - } - } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListViewModel.kt index b1fc2493e..442591984 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListViewModel.kt @@ -20,13 +20,12 @@ import org.koitharu.kotatsu.local.domain.LocalMangaRepository import org.koitharu.kotatsu.utils.SingleLiveEvent import org.koitharu.kotatsu.utils.ext.asLiveDataDistinct import org.koitharu.kotatsu.utils.ext.resolveName -import java.io.File import java.io.IOException class LocalListViewModel( private val repository: LocalMangaRepository, private val historyRepository: HistoryRepository, - private val settings: AppSettings, + settings: AppSettings, private val shortcutsRepository: ShortcutsRepository, ) : MangaListViewModel(settings) { @@ -77,10 +76,10 @@ class LocalListViewModel( withContext(Dispatchers.IO) { val name = contentResolver.resolveName(uri) ?: throw IOException("Cannot fetch name from uri: $uri") - if (!LocalMangaRepository.isFileSupported(name)) { + if (!repository.isFileSupported(name)) { throw UnsupportedFileException("Unsupported file on $uri") } - val dest = settings.getStorageDir(context)?.let { File(it, name) } + val dest = repository.getOutputDir() ?: throw IOException("External files dir unavailable") runInterruptible { contentResolver.openInputStream(uri)?.use { source -> diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/MainSettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/MainSettingsFragment.kt index 1bc8be9fc..73f20bad6 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/MainSettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/MainSettingsFragment.kt @@ -12,18 +12,22 @@ import androidx.preference.ListPreference import androidx.preference.Preference import androidx.preference.PreferenceScreen import androidx.preference.SwitchPreference +import kotlinx.coroutines.launch import leakcanary.LeakCanary +import org.koin.android.ext.android.inject import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.BasePreferenceFragment import org.koitharu.kotatsu.base.ui.dialog.StorageSelectDialog import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.ListMode +import org.koitharu.kotatsu.local.data.LocalStorageManager import org.koitharu.kotatsu.settings.protect.ProtectSetupActivity import org.koitharu.kotatsu.settings.utils.SliderPreference import org.koitharu.kotatsu.utils.ext.getStorageName import org.koitharu.kotatsu.utils.ext.names import org.koitharu.kotatsu.utils.ext.setDefaultValueCompat +import org.koitharu.kotatsu.utils.ext.viewLifecycleScope import java.io.File import java.util.* @@ -32,6 +36,8 @@ class MainSettingsFragment : BasePreferenceFragment(R.string.settings), SharedPreferences.OnSharedPreferenceChangeListener, StorageSelectDialog.OnStorageSelectListener { + private val storageManager by inject() + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setHasOptionsMenu(true) @@ -70,10 +76,7 @@ class MainSettingsFragment : BasePreferenceFragment(R.string.settings), override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - findPreference(AppSettings.KEY_LOCAL_STORAGE)?.run { - summary = settings.getStorageDir(context)?.getStorageName(context) - ?: getString(R.string.not_available) - } + findPreference(AppSettings.KEY_LOCAL_STORAGE)?.bindStorageName() findPreference(AppSettings.KEY_PROTECT_APP)?.isChecked = !settings.appPassword.isNullOrEmpty() settings.subscribe(this) @@ -114,10 +117,7 @@ class MainSettingsFragment : BasePreferenceFragment(R.string.settings), findPreference(key)?.setSummary(R.string.restart_required) } AppSettings.KEY_LOCAL_STORAGE -> { - findPreference(key)?.run { - summary = settings.getStorageDir(context)?.getStorageName(context) - ?: getString(R.string.not_available) - } + findPreference(key)?.bindStorageName() } AppSettings.KEY_APP_PASSWORD -> { findPreference(AppSettings.KEY_PROTECT_APP) @@ -140,7 +140,7 @@ class MainSettingsFragment : BasePreferenceFragment(R.string.settings), return when (preference.key) { AppSettings.KEY_LOCAL_STORAGE -> { val ctx = context ?: return false - StorageSelectDialog.Builder(ctx, settings.getStorageDir(ctx), this) + StorageSelectDialog.Builder(ctx, storageManager, this) .setTitle(preference.title ?: "") .setNegativeButton(android.R.string.cancel) .create() @@ -162,7 +162,13 @@ class MainSettingsFragment : BasePreferenceFragment(R.string.settings), } override fun onStorageSelected(file: File) { - settings.setStorageDir(context ?: return, file) + settings.setStorageDir(file) } + private fun Preference.bindStorageName() { + viewLifecycleScope.launch { + val storage = storageManager.getDefaultWriteableDir() + summary = storage?.getStorageName(context) ?: getString(R.string.not_available) + } + } } \ No newline at end of file From 805044fcf11771fdde8e19f4b41bf8cc08ee2d51 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sun, 20 Feb 2022 18:12:04 +0200 Subject: [PATCH 03/70] Add .editorconfig file --- .editorconfig | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..ab724a305 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,17 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = tab +insert_final_newline = true +max_line_length = 120 +tab_width = 4 + +[{*.ant,*.fxml,*.jhm,*.jnlp,*.jrxml,*.rng,*.tld,*.wsdl,*.xml,*.xsd,*.xsl,*.xslt,*.xul}] +ij_continuation_indent_size = 4 + +[{*.gradle.kts,*.kt,*.kts,*.main.kts}] +ij_kotlin_allow_trailing_comma = true +ij_kotlin_code_style_defaults = KOTLIN_OFFICIAL From 7ebb98ce06f610f111b7a02f3a9ab1bdf448c795 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sun, 13 Feb 2022 08:50:41 +0200 Subject: [PATCH 04/70] Allow overwrite non-empty download directory #99 --- .../java/org/koitharu/kotatsu/local/data/MangaZip.kt | 2 +- .../org/koitharu/kotatsu/local/data/WritableCbzFile.kt | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/local/data/MangaZip.kt b/app/src/main/java/org/koitharu/kotatsu/local/data/MangaZip.kt index c9d93f147..533c619a8 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/data/MangaZip.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/data/MangaZip.kt @@ -16,7 +16,7 @@ class MangaZip(val file: File) { private var index = MangaIndex(null) suspend fun prepare(manga: Manga) { - writableCbz.prepare() + writableCbz.prepare(overwrite = true) index = MangaIndex(writableCbz[INDEX_ENTRY].takeIfReadable()?.readText()) index.setMangaInfo(manga, append = true) } diff --git a/app/src/main/java/org/koitharu/kotatsu/local/data/WritableCbzFile.kt b/app/src/main/java/org/koitharu/kotatsu/local/data/WritableCbzFile.kt index fbc2637aa..fe61169b2 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/data/WritableCbzFile.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/data/WritableCbzFile.kt @@ -14,9 +14,13 @@ class WritableCbzFile(private val file: File) { private val dir = File(file.parentFile, file.nameWithoutExtension) - suspend fun prepare() = withContext(Dispatchers.IO) { - check(dir.list().isNullOrEmpty()) { - "Dir ${dir.name} is not empty" + suspend fun prepare(overwrite: Boolean) = withContext(Dispatchers.IO) { + if (!dir.list().isNullOrEmpty()) { + if (overwrite) { + dir.deleteRecursively() + } else { + throw IllegalStateException("Dir ${dir.name} is not empty") + } } if (!dir.exists()) { dir.mkdir() From 2f3b1f397cce2d5bc442fc78d1cc1eb0d7883217 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sun, 20 Feb 2022 18:40:47 +0200 Subject: [PATCH 05/70] Fix Remanga source and check for paid chapters #101 --- .../core/parser/site/RemangaRepository.kt | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/RemangaRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/RemangaRepository.kt index 2319dfcd2..d6c047363 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/RemangaRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/RemangaRepository.kt @@ -9,6 +9,7 @@ import org.koitharu.kotatsu.core.model.* import org.koitharu.kotatsu.core.parser.MangaRepositoryAuthProvider import org.koitharu.kotatsu.core.parser.RemoteMangaRepository import org.koitharu.kotatsu.utils.ext.* +import java.text.DateFormat import java.text.SimpleDateFormat import java.util.* @@ -32,7 +33,7 @@ class RemangaRepository(loaderContext: MangaLoaderContext) : RemoteMangaReposito offset: Int, query: String?, tags: Set?, - sortOrder: SortOrder? + sortOrder: SortOrder?, ): List { copyCookies() val domain = getDomain() @@ -118,7 +119,7 @@ class RemangaRepository(loaderContext: MangaLoaderContext) : RemoteMangaReposito chapters = chapters.mapIndexed { i, jo -> val id = jo.getLong("id") val name = jo.getString("name").toTitleCase(Locale.ROOT) - val publishers = jo.getJSONArray("publishers") + val publishers = jo.optJSONArray("publishers") MangaChapter( id = generateUid(id), url = "/api/titles/chapters/$id/", @@ -135,7 +136,7 @@ class RemangaRepository(loaderContext: MangaLoaderContext) : RemoteMangaReposito } }, uploadDate = dateFormat.tryParse(jo.getString("upload_date")), - scanlator = publishers.optJSONObject(0)?.getStringOrNull("name"), + scanlator = publishers?.optJSONObject(0)?.getStringOrNull("name"), source = MangaSource.REMANGA, branch = null, ) @@ -146,16 +147,28 @@ class RemangaRepository(loaderContext: MangaLoaderContext) : RemoteMangaReposito override suspend fun getPages(chapter: MangaChapter): List { val referer = "https://${getDomain()}/" val content = loaderContext.httpGet(chapter.url.withDomain(subdomain = "api")).parseJson() - .getJSONObject("content").getJSONArray("pages") - val pages = ArrayList(content.length()) - for (i in 0 until content.length()) { - when (val item = content.get(i)) { - is JSONObject -> pages += parsePage(item, referer) - is JSONArray -> item.mapTo(pages) { parsePage(it, referer) } + .getJSONObject("content") + val pages = content.optJSONArray("pages") + if (pages == null) { + val pubDate = content.getStringOrNull("pub_date")?.let { + SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.US).tryParse(it) + } + if (pubDate != null && pubDate > System.currentTimeMillis()) { + val at = SimpleDateFormat.getDateInstance(DateFormat.LONG).format(Date(pubDate)) + parseFailed("Глава станет доступной $at") + } else { + parseFailed("Глава недоступна") + } + } + val result = ArrayList(pages.length()) + for (i in 0 until pages.length()) { + when (val item = pages.get(i)) { + is JSONObject -> result += parsePage(item, referer) + is JSONArray -> item.mapTo(result) { parsePage(it, referer) } else -> throw ParseException("Unknown json item $item") } } - return pages + return result } override suspend fun getTags(): Set { From 9089555320cc0dbab43fc491cedc8fe77a4a54fd Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sun, 20 Feb 2022 18:41:38 +0200 Subject: [PATCH 06/70] Fix internal storage sharing #98 --- app/src/main/res/xml/filepaths.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/res/xml/filepaths.xml b/app/src/main/res/xml/filepaths.xml index c6116aaa4..7dac5f16b 100644 --- a/app/src/main/res/xml/filepaths.xml +++ b/app/src/main/res/xml/filepaths.xml @@ -3,6 +3,9 @@ + From 1713efb51fda9226b0f60c87ba2ce752342bc8a8 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sun, 20 Feb 2022 18:43:12 +0200 Subject: [PATCH 07/70] Increase version --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 1f5456819..e59984b8a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId 'org.koitharu.kotatsu' minSdkVersion 21 targetSdkVersion 31 - versionCode 380 - versionName '2.1.4' + versionCode 381 + versionName '2.1.5' generatedDensities = [] testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" From 15d0addb7b56da320a0d6e9c0cf64e4155ccf14c Mon Sep 17 00:00:00 2001 From: Koitharu Date: Tue, 22 Feb 2022 19:34:00 +0200 Subject: [PATCH 08/70] Fix Remanga chapters parsing --- .../core/parser/site/RemangaRepository.kt | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/RemangaRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/RemangaRepository.kt index d6c047363..ebea9bc94 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/RemangaRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/RemangaRepository.kt @@ -98,9 +98,7 @@ class RemangaRepository(loaderContext: MangaLoaderContext) : RemoteMangaReposito } val branchId = content.getJSONArray("branches").optJSONObject(0) ?.getLong("id") ?: throw ParseException("No branches found") - val chapters = loaderContext.httpGet( - url = "https://api.$domain/api/titles/chapters/?branch_id=$branchId" - ).parseJson().getJSONArray("content") + val chapters = grabChapters(domain, branchId) val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.US) return manga.copy( description = content.getString("description"), @@ -123,7 +121,7 @@ class RemangaRepository(loaderContext: MangaLoaderContext) : RemoteMangaReposito MangaChapter( id = generateUid(id), url = "/api/titles/chapters/$id/", - number = chapters.length() - i, + number = chapters.size - i, name = buildString { append("Том ") append(jo.optString("tome", "0")) @@ -211,6 +209,26 @@ class RemangaRepository(loaderContext: MangaLoaderContext) : RemoteMangaReposito source = source, ) + private suspend fun grabChapters(domain: String, branchId: Long): List { + val result = ArrayList(100) + var page = 1 + while (true) { + val content = loaderContext.httpGet( + "https://api.$domain/api/titles/chapters/?branch_id=$branchId&page=$page&count=100" + ).parseJson().getJSONArray("content") + val len = content.length() + if (len == 0) { + break + } + result.ensureCapacity(result.size + len) + for (i in 0 until len) { + result.add(content.getJSONObject(i)) + } + page++ + } + return result + } + private companion object { const val PAGE_SIZE = 30 From 4e059c4ee3a1569fd00fd94e834cb9217cf6b1dd Mon Sep 17 00:00:00 2001 From: Luiz-bro Date: Wed, 26 Jan 2022 15:47:17 +0000 Subject: [PATCH 09/70] Translated using Weblate (Spanish) Currently translated at 68.2% (170 of 249 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/es/ --- app/src/main/res/values-es/strings.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 5deb17d71..602d55882 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -178,7 +178,7 @@ Preparando… Archivo no encontrado Todos los datos fueron restaurados con éxito - Los datos fueron restaurados, pero hay errores + Los datos fueron restaurados, pero hay errores. Puedes crear una copia de seguridad de tu historial y favoritos para restaurarla Ahora mismo Ayer @@ -214,7 +214,7 @@ Si te gusta esta aplicación, puedes ayudar económicamente a través de Yoomoney (ex. Yandex.Money) Apoyar al desarrollador Buscar sólo en %s - ¡Estas personas hacen que Kotatsu sea mejor! + Todas estas personas hicieron que Kotatsu fuera mejor. Licencia Derechos de autor y licencias Falta un capítulo @@ -237,14 +237,14 @@ En curso Ocultar la barra de herramientas al desplazarse Este capítulo no aparece en su dispositivo. Descárguelo o léalo en línea. - Autorización completa + Autorizado Tema sobre 4PDA Formato de la fecha Por defecto Algunos fabricantes pueden cambiar el comportamiento del sistema, lo que podría interrumpir las tareas en segundo plano. El nombre no debe estar vacío - Autorización en %s no es compatible - Se cerrará la sesión de todas las fuentes en las que esté autorizado + No se admite iniciar sesión en %s + Serás desconectado de todas las fuentes. Excluye manga NSFW del historial Mostrar los números de páginas Fuentes activadas From 4c911e666ea629ada56fd143aa34510d94d04775 Mon Sep 17 00:00:00 2001 From: Zakhar Timoshenko Date: Wed, 26 Jan 2022 19:53:14 +0000 Subject: [PATCH 10/70] Translated using Weblate (Russian) Currently translated at 80.3% (200 of 249 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/ru/ --- app/src/main/res/values-ru/strings.xml | 71 +++++++++++++------------- 1 file changed, 35 insertions(+), 36 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index d96032d40..1035b1443 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -6,7 +6,7 @@ Избранное История Произошла ошибка - Ошибка сетевого подключения + Не удалось подключиться к Интернету Подробности Главы Список @@ -24,7 +24,7 @@ История пуста Читать Добавить закладку - Добавьте интересующую Вас мангу в избранное, чтобы не потерять её + Избранного пока нет В избранное Создать категорию Добавить @@ -35,37 +35,37 @@ Поделиться %s Поиск Поиск манги - Загрузка манги… + Загрузка… Обработка… - Загрузка завершена + Загружено Загрузки - По имени + Имя Популярная Обновлённая Новая - По рейтингу + Рейтинг Все - Сортировка + Порядок сортировки Жанр Фильтр Тема Светлая Тёмная - Автоматически + Следовать системе Страницы Очистить - Вы уверены, что хотите очистить историю? Это действие нельзя будет отменить. + Очистить всю историю чтения полностью\? Удалить «%s» удалено из истории «%s» удалено с устройства - Дождитесь окончания загрузки + Дождитесь завершения загрузки… Сохранить страницу - Страница сохранена + Сохранено Поделиться изображением Импорт Удалить Операция не поддерживается - Неподдерживаемый файл. Поддерживаются только ZIP и CBZ. + Выберите ZIP-файл, либо файл CBZ. Нет описания История и кэш Очистить кэш страниц @@ -77,31 +77,30 @@ Размер таблицы Поиск по %s Удалить мангу - Вы уверены, что хотите удалить «%s» с устройства\? -\nЭто действие нельзя будет отменить. + Удалить \"%s\" с устройства навсегда\? Настройки чтения Листание страниц Нажатия по краям Кнопки громкости Продолжить Предупреждение - Данная операция может привести к большому расходу траффика + Это может привести к расходу большого количества трафика Больше не спрашивать Отмена… Ошибка Очистить кэш миниатюр Очистить историю поиска - История поиска очищена + Очищено Только жесты Внутренний накопитель Внешнее хранилище Домен - Проверять обновление приложения - Доступно обновление приложения - Показывать уведомление при наличии новой версии - Открыть в браузере - В этой манге %s. Вы уверены, что хотите сохранить их все? - Сохранить мангу + Проверять наличие новых версий приложения + Доступна новая версия приложения + Показывать уведомление, если доступна новая версия + Открыть в веб-браузере + В этой манге %s. Сохранить их все\? + Сохранить Уведомления Включено %1$d из %2$d Новые главы @@ -111,32 +110,32 @@ Перезапустить Настройки уведомлений Звук уведомления - Световая индикация + Светодиодная индикация Вибросигнал Категории избранного Категории… Переименовать - Вы уверены, что хотите удалить категорию «%s»\? -\nВся манга из данной категории будет утеряна. - Удалить категорию + Удалить категорию \"%s\" из избранного\? +\nВся манга в ней будет потеряна. + Удалить Как-то здесь пусто… Попробуйте переформулировать запрос. - Категории помогают упорядочивать избранную мангу. Нажмите «+», чтобы создать категорию - Здесь будет отображаться манга, которую Вы читаете - Вы можете найти, что почитать, в боковом меню. + Вы можете использовать категории для организации своих избранных. Нажмите «+», чтобы создать категорию + То, что вы прочитаете, будет отображено здесь + Найдите, что почитать, в боковом меню. У Вас пока нет сохранённой манги Вы можете сохранить мангу из онлайн каталога или импортировать из файла. - Полка с мангой - Недавняя манга + Полка + Недавнее Анимация листания - Место сохранения манги + Папка для загрузок Недоступно - Не удалось найти ни одного доступного хранилища + Нет доступного хранилища Другое хранилище - Защищённое соединение (HTTPS) + Использовать безопасное (HTTPS) соединение Готово Всё избранное - В этой категории ничего нет + Категория пуста Прочитать позже Обновления Здесь будут отображаться обновления манги, которую Вы читаете @@ -244,7 +243,7 @@ Формат даты По умолчанию Исключить NSFW мангу из истории - Имя не может быть пустым + Имя не может быть пустым Показывать номера страниц Включенные источники Доступные источники From d7541a115eca9cbbb115d16335dd08a9041e1779 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Wed, 26 Jan 2022 06:40:20 +0000 Subject: [PATCH 11/70] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegian?= =?UTF-8?q?=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 86.7% (216 of 249 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/nb_NO/ --- app/src/main/res/values-nb-rNO/strings.xml | 82 +++++++++++----------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 7adf45958..fcb50757a 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -1,9 +1,9 @@ B|kB|MB|GB|TB - Finner ikke noen tilgjengelig lagring + Ingen tilgjengelig lagring Nedlastingssted - Du kan lagre fra nettbaserte kilder, eller importere filer. + Lagre fra nettbaserte kilder, eller importer filer. Noen enheter endrer systemoppførselen, noe som kan ødelegge for bakgrunnsoppgaver. Fjern alle nylige søkespørringer for godt\? Skjul verktøylinje under rulling @@ -27,9 +27,9 @@ Tilpass sentrum Skaleringsmodus Opprett feilrapport på GitHub - Du kan sette opp lesemodus for hver fil - Høyre-til-venstre ← - Foretrekk høyre-til-venstre -leser + Lesemodus kan settes opp for hver serie + Høyre-til-venstre (←) + Foretrekk høyre-til-venstre (→)-leser Ingen tilgjengelige oppdateringer Kunne ikke se etter oppdateringer Ser etter oppdateringer … @@ -40,15 +40,15 @@ Oppdater Tømt Tøm oppdateringsflyt - Venter på nettverkstilknytning … + Venter på nettverk … Ny versjon: %s - Her kan du se nye kapitler av det du leser + Nye kapitler av det du leser vises her Oppdatering Bruk sikker (HTTPS)-tilkobling Annen lagring Hylle - Du har ikke lagret noe enda. - Du kan finne ting å lese i sidemenyen. + Lagre noe først + Finn lesestoff i sidemenyen. Det du leser vil vises her Prøv å reformulere spørringen. Bruk kategorier til å organisere mapper. Trykk «+» for å opprette en kategori. @@ -57,16 +57,16 @@ Programomstart Gi merknad om oppdateringer av det du leser Skrudde på %1$d av %2$d - Denne managaen har %s. Ønsker du å lagre hele\? - Åpne i filutforsker + Denne mangaen har %s. Lagre hele\? + Åpne i nettleser Vis merknad hvis ny versjon er tilgjengelig - Ny programversjon tilgjengelig - Se etter oppdateringer automatisk - Søkehistorikk tømt + En ny versjon av programmet er tilgjengelig + Se etter nye versjoner av programmet + Tømt Tøm miniatyrbildehurtiglager - Kan laste ned mye data - Trykk på kanter - Slett «%s» fra enhetsminne for godt\? + Kan laste ned mye data. + Kanttrykk + Slett «%s» fra enheten for godt\? Nettserie Forvalg Hurtiglager @@ -76,7 +76,7 @@ Ustøttet handling Importer Lagret - Vent på at innlastingen fullføres + Vent på at innlastingen fullføres… Fjern all lesehistorikk for godt\? Les Resultatløst @@ -110,12 +110,12 @@ Opprett sikkerhetskopi Omstart kreves Nyttig for AMOLED-skjermer - Nattsvart drakt + Svart Ny kategori Versjon %s Om Passordene samsvarer ikke - Gjenta passord + Gjenta passordet Beskytt programmet Feil passord Skriv inn passord @@ -125,17 +125,17 @@ Relatert Søkeresultater Les senere - Denne kategorien er tom + Tom kategori Alle favoritter Ferdig Ikke tilgjengelig Sideanimasjon - Nylig manga - Fjern kategori + Nylig + Fjern Gi nytt navn Kategorier … Favorittkategorier - Lysindikator + LED-indikator Vibrasjon Merknadslyd Merknadsinnstillinger @@ -143,7 +143,7 @@ Last ned Nye kapittel Merknader - Lagre manga + Lagre Domene Eksternlagring Internlagring @@ -170,7 +170,7 @@ Fjern Tøm Sider - Automatisk + Følg systemet Mørk Lys Navn @@ -186,7 +186,7 @@ Nedlastinger Nedlastet Behandler … - Laster ned manga … + Laster ned … Søk manga Søk Del %s @@ -195,11 +195,11 @@ Lagre Skriv inn kategorinavn Legg til - Legg til ny kategori - Legg til i favoritter - Du har ingen favoritter enda. + Ny kategori + Favorittmerk dette + Ingen favoritter enda Legg til bokmerke - Historikken er tom + Ingen historikk enda Tøm historikk Prøv igjen Lukk @@ -212,16 +212,16 @@ Liste Kapittel Detaljer - Nettverktilkoblingsfeil + Kunne ikke koble til Internet En feil inntraff Historikk Favoritter Lokallagring Åpne meny Lukk meny - Dette kapitlet mangler på din enhet. Last det ned eller les det på nett. - Kapittel mangler - Det er ingen aktive nedlastinger + Last ned eller les dette manglende kapittelet på nett. + Kapittelet mangler + Ingen aktive nedlastinger I kø Fullført Pågående @@ -233,18 +233,18 @@ Støtt utvikleren Hvis du liker programmet kan du kronerulle det på Yoomoney (tidligere Yandex.Money) Takk rettes til - Folk som gjorde Kotatsu enda bedre. + Folk som gjorde Kotatsu enda bedre Opphavsrett og lisenser Lisens - Identitetsbekreftelse fullført - Identitetsbekreftelse på %s støttes ikke - Du vil bli utlogget fra alle kilder du pålogget i + Identitetsbekreftet + Innlogging på %s støttes ikke + Du vil bli utlogget fra alle kilder Sjangere Utelat NSFW-manga fra historikk Datoformat Forvalg Navn må angis Tilgjengelige kilder - Vis sidenummerering - Påskrudde kilder + Sidenummerering + Brukte kilder \ No newline at end of file From c8136770413fd5f2e1994b08da15bf7e85ab377d Mon Sep 17 00:00:00 2001 From: Luiz-bro Date: Wed, 26 Jan 2022 15:27:51 +0000 Subject: [PATCH 12/70] Translated using Weblate (Portuguese) Currently translated at 100.0% (249 of 249 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/pt/ --- app/src/main/res/values-pt/strings.xml | 161 ++++++++++++------------- 1 file changed, 80 insertions(+), 81 deletions(-) diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 17fe50b16..1fa3d4a78 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -3,8 +3,8 @@ Abrir menu Armazenamento local Favoritos - Ocorreu um erro - Erro de conexão de rede + Um erro ocorreu + Não foi possível conectar à Internet Detalhes Lista Lista detalhada @@ -16,10 +16,10 @@ Tente novamente Limpar histórico Nada encontrado - Histórico vazio + Sem histórico ainda Add marca páginas - Você não tem favoritos ainda - Adicionar aos favoritos + Ainda não há favoritos + Favoritar isso Add Nomeie a categoria Salvar @@ -28,34 +28,34 @@ Compartilhar %s Pesquisar Pesquisar mangá - Baixando mangá… - Download completo + Baixando… + Baixado Downloads - Por nome + Nome Populares - Por avaliação + Avaliação Todos Ordem de classificação Gênero Filtro Escuro - Automático + Siga o sistema Páginas Limpar - Você realmente quer limpar todo o seu histórico de leitura\? Essa ação não pode ser desfeita. + Limpar todo o histórico de leitura permanentemente\? Remover \"%s\" removido do histórico \"%s\" deletado do armazenamento local - Aguarde o carregamento para finalizar + Aguarde o carregamento terminar… Salvar página - Página salva com sucesso + Salvou Compartilhar imagem Importar Utualizado Deletar Essa operação não é suportada Histórico e cache - Limpar cache de páginas + Limpar cache da página Cache B|kB|MB|GB|TB Padrão @@ -66,24 +66,24 @@ Deletar mangá Configurações de leitura Mudar páginas - Cliques na borda + Toques de borda Botões de volume - Essa operação pode consumir muito tráfego de rede + Isso pode transferir muitos dados Não pergunte novamente Cancelando… Erro Limpar cache de thumbnails - Histórico de pesquisa limpo + Limpo Apenas gestos Armazenamento interno Armazenamento externo Domínio - Verificar automaticamente se há actualizações - Actualização da aplicação está disponível - Mostrar notificação se a actualização estiver disponível - Aberto no navegador - Esta manga tem %s. Quer salvar tudo isto\? - Salvar mangá + Verifique se há novas versões do aplicativo + Uma nova versão do aplicativo está disponível + Mostrar notificação se uma nova versão estiver disponível + Abrir no navegador da web + Este mangá tem %s. Salvar tudo isso\? + Salve Notificações Novos capítulos Notifique sobre atualizações do mangá que está lendo @@ -91,7 +91,7 @@ Ler desde o início Reiniciar Configurações das notificações - Indicador luminoso + Indicador LED Fechar menu Fontes remotas Fechar @@ -104,54 +104,53 @@ Sem descrição Continuar Capítulos - Add nova categoria + Nova categoria Aviso - Você realmente quer deletar \"%s\" do armazenamento local de seu celular\? -\nEssa operação não pode ser desfeita. - Arquivo inválido. Apenas ZIP e CBZ são suportados. + Excluir \"%s\" do dispositivo permanentemente\? + Escolha um arquivo ZIP ou CBZ. Limpar histórico de pesquisa - Activado %1$d de %2$d + Ativado %1$d de %2$d Som de notificação - Mostrar números de páginas + Páginas numeradas Concluído em andamento Categorias… Renomear - Remover categoria + Remover Está meio vazio aqui… - Prateleira de manga + Estante Feito Relacionado Manter no início Limpar feed de atualizações - Feed de atualizações limpo + Limpo Atualizar A atualização do feed começará em breve - Confira as atualizações do mangá + Procure atualizações Não verifique Digite a senha Senha incorreta Repita a senha - As senhas não coincidem + Senhas incompatíveis Cerca de Versão %s Verifique se há atualizações Verificando atualizações… Nenhuma atualização disponível - Direita para esquerda + Da direita para a esquerda (←) Nova categoria Criar problema no GitHub Modo de escala Centro de ajuste Ajustar à largura É necessário reiniciar - Restauração de backup + Backup e restauração Criar backup de dados Restaurar do backup - Dados restaurados + Restaurado Preparando… Arquivo não encontrado - Todos os dados restaurados com sucesso + Todos os dados foram restaurados Os dados foram restaurados, mas há erros Agora mesmo Ontem @@ -160,13 +159,13 @@ Hoje Toque para tentar novamente Silencioso - O CAPTCHA é obrigatório + CAPTCHA obrigatório Resolver Todos os cookies foram removidos Verificando novos capítulos: %1$d de %2$d Limpar feed - Todo o histórico de atualizações será apagado e esta ação não poderá ser desfeita. Tem certeza\? - Verificação de novos capítulos + Limpar todo o histórico de atualizações permanentemente\? + Em busca de novos capítulos… Reverter Entrar Padrão: %s @@ -174,10 +173,10 @@ Próximo Digite a senha que será necessária quando o aplicativo for iniciado Confirme - A senha deve ter pelo menos 4 caracteres + A senha deve ter 4 caracteres ou mais Descrição - Cópias de segurança salvas com sucesso - Alguns fabricantes podem alterar o comportamento do sistema, o que pode quebrar as tarefas de fundo. + Backup salvo + Alguns dispositivos têm um comportamento de sistema diferente, o que pode interromper as tarefas em segundo plano. Leia mais Ocultar a barra de ferramentas ao rolar Pesquise apenas em %s @@ -185,68 +184,68 @@ Línguas Bem vindo Fontes disponíveis - Fontes ativadas + Fontes usadas Enfileirado - No momento, não há downloads ativos - O nome não deve estar vazio + Nenhum download ativo + Você deve inserir um nome Traduzir esta aplicação Autor Comentar Tópico no 4PDA Apoiar o desenvolvedor - Se gostar desta aplicação, pode ajudar financeiramente através de Yoomoney (ex. Yandex.Money) - agradecimento - Estas pessoas fazem o Kotatsu tornar-se melhor! + Se você gosta deste aplicativo, você pode enviar dinheiro através do Yoomoney (ex. Yandex.Money) + Agradecimentos + Todas essas pessoas tornaram o Kotatsu melhor Direitos de autor e licenças Licença - Este capítulo está em falta no seu dispositivo. Descarregue ou leia-o online. - Falta um capítulo - Autorização completa - A autorização em %s não é suportada + Baixe ou leia este capítulo perdido online. + O capítulo está em falta + Autorizado + O login em %s não é suportado Géneros Tradução - Será desconectado de todas as fontes em que estiver autorizado + Você será desconectado de todas as fontes Vibração - Não é possível encontrar nenhum armazenamento disponível + Sem armazenamento disponível Categorias favoritas - Quer realmente remover a categoria \"%s\" dos seus favoritos\? -\nSerá perdido todos os mangas contidos. - Pode encontrar o que ler no menu lateral. - Pode salvá-lo a partir de fontes online ou importá-lo a partir de ficheiro. - Manga recente + Remover a categoria \"%s\" dos seus favoritos\? +\nTodos os mangás nela serão perdidos.. + Encontre o que ler no menu lateral. + Salve-o de fontes online ou importe arquivos. + Recente Outro armazenamento Tente reformular a consulta. - Prefira o leitor da direita para a esquerda + Prefira o leitor da direita para a esquerda (→) Não disponível Tamanho: %s - Mangá que está a ler será afixada aqui - Ainda não tem nenhuma mangá salvo - Animação de páginas - Esta categoria está vazia + O que você ler será exibido aqui + Salve algo primeiro + Animação de página + Categoria vazia Leia mais tarde - atualizações + Atualizações Todos os favoritos À espera de rede… - Utilizar ligação segura (HTTPS) + Usar conexão segura (HTTPS) Resultados da pesquisa - Aqui verá os novos capítulos do mangá que está a ler + Novos capítulos do que você está lendo são mostrados aqui Nova versão: %s Girar a tela - Falha na verificação de atualização - Proteger aplicativo - Pedir senha no início do aplicativo + Não foi possível procurar atualizações + Proteja o aplicativo + Peça a senha ao iniciar o Kotatsu Ajustar à altura - Tema Black dark - Útil para telas AMOLED + Escuro + Usa menos energia em telas AMOLED A configuração escolhida será lembrada para este mangá Você pode criar backup de seu histórico e favoritos e restaurá-lo Limpar cookies - Você realmente deseja remover todas as consultas de pesquisa recentes\? Essa ação não pode ser desfeita. - Você deve autorizar a visualização deste conteúdo - Pode usar categorias para organizar seu mangá favorito. Pressione <<+>> para criar uma categoria - Você pode configurar o modo de leitura para cada mangá separadamente - Local onde serão armazenados os mangás baixados - Excluir manga NSFW da história + Remover todas as consultas de pesquisa recentes permanentemente\? + Faça login para ver este conteúdo + Você pode usar categorias para organizar seus favoritos. Pressione «+» para criar uma categoria + O modo de leitura pode ser configurado separadamente para cada série + Pasta para downloads + Excluir mangá NSFW do histórico Formato da data Padrão \ No newline at end of file From 9de5024930727472ba1d3e665079d6abfaacfce7 Mon Sep 17 00:00:00 2001 From: "J. Lavoie" Date: Wed, 26 Jan 2022 12:40:50 +0000 Subject: [PATCH 13/70] Translated using Weblate (French) Currently translated at 75.5% (188 of 249 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fr/ --- app/src/main/res/values-fr/strings.xml | 41 +++++++++++++------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 594f081e5..85aeec337 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -1,6 +1,6 @@ - Attendez la fin du chargement + Attendez la fin du chargement… Lire la suite Certains fabricants peuvent modifier le comportement du système, ce qui peut interrompre les tâches d\'arrière-plan. Sauvegarde enregistrée avec succès @@ -124,27 +124,26 @@ Enregistrer le manga Ouvrir dans le navigateur Afficher une notification si une mise à jour est disponible - Une mise à jour de l\'application est disponible - Vérifier les mises à jour automatiquement + Une nouvelle version de l\'application est disponible + Vérifier les nouvelles versions de l\'application Domaine Stockage externe Stockage interne Gestes uniquement - Historique des recherches effacé + Effacé Effacer l\'historique de recherche Vider le cache des miniatures Erreur Annulation… Ne plus demander - Cette opération peut consommer beaucoup de trafic réseau + Ceci peut transférer beaucoup de données Avertissement Continuer Boutons de volume - Appuis sur les bords + Appuis au bord Changer de pages Paramètres du lecteur - Voulez-vous vraiment supprimer « %s » de la mémoire locale de votre téléphone \? -\nCette opération ne peut pas être annulée. + Supprimer « %s » de l\'appareil de façon permanente \? Supprimer le manga Rechercher sur %s Taille de la grille @@ -153,23 +152,23 @@ Standard o|ko|Mo|Go|To Cache - Vider le cache des pages + Vider le cache de la page Historique et cache Aucune description - Fichier invalide. Seuls les fichiers ZIP et CBZ sont pris en charge. + Choisissez un fichier ZIP ou CBZ. Cette opération n\'est pas prise en charge Supprimer Importer Partager l\'image - Page sauvegardée avec succès + Sauvegardé Sauvegarder la page « %s » supprimé du stockage local « %s » retiré de l\'historique Retirer - Voulez-vous vraiment effacer tout votre historique de lecture \? Cette action ne peut pas être annulée. + Effacer définitivement l\'historique de lecture \? Effacer Pages - Automatique + Suivre le système Sombre Clair Thème @@ -177,15 +176,15 @@ Genre Ordre de tri Tous - Par évaluation + Évaluation Le plus récent Mis à jour Populaire - Par nom + Nom Téléchargements - Téléchargement terminé + Téléchargé Traitement… - Téléchargement de mangas… + Téléchargement… Rechercher un manga Rechercher Partager %s @@ -194,12 +193,12 @@ Enregistrer Entrez le nom de la catégorie Ajouter - Ajouter une nouvelle catégorie + Nouvelle catégorie Ajouter aux favoris - Vous n\'avez pas encore de favoris + Aucun favori pour le moment Ajouter un marque-page Lire - L\'historique est vide + Pas encore d\'historique Rien n\'a été trouvé Effacer l\'historique Réessayer @@ -214,7 +213,7 @@ Liste Chapitres Détails - Erreur de connexion au réseau + Impossible de se connecter à Internet Une erreur s\'est produite Historique Favoris From 0c83329e59d0b0b1e2ef8de53ae7234605f021a3 Mon Sep 17 00:00:00 2001 From: Zakhar Timoshenko Date: Fri, 28 Jan 2022 07:04:44 +0000 Subject: [PATCH 14/70] Translated using Weblate (Russian) Currently translated at 99.5% (248 of 249 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/ru/ --- app/src/main/res/values-ru/strings.xml | 66 +++++++++++++------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 1035b1443..c15cb6480 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -21,12 +21,12 @@ Повторить Очистить историю Ничего не найдено - История пуста + Истории еще нет Читать Добавить закладку Избранного пока нет В избранное - Создать категорию + Новая категория Добавить Введите название Сохранить @@ -123,8 +123,8 @@ Вы можете использовать категории для организации своих избранных. Нажмите «+», чтобы создать категорию То, что вы прочитаете, будет отображено здесь Найдите, что почитать, в боковом меню. - У Вас пока нет сохранённой манги - Вы можете сохранить мангу из онлайн каталога или импортировать из файла. + Сохраните что-нибудь + Сохраните что-нибудь из онлайн-каталога или импортируйте из файла. Полка Недавнее Анимация листания @@ -138,51 +138,51 @@ Категория пуста Прочитать позже Обновления - Здесь будут отображаться обновления манги, которую Вы читаете + Новые главы из того, что вы читаете, будут показаны здесь Результаты поиска Похожие Новая версия: %s Размер: %s Ожидание подключения… Очистить ленту обновлений - Лента обновлений очищена + Очищено Повернуть экран Обновить Обновление скоро начнётся - Проверять обновления манги + Следить за обновлениями Не проверять Введите пароль Неверный пароль Защитить приложение - Запрашивать пароль при запуске приложения + Запрашивать пароль при запуске Kotatsu Повторите пароль Пароли не совпадают О программе Версия %s Проверить обновления Проверка обновления… - Ошибка при проверке обновления + Не удалось проверить обновления Нет доступных обновлений - Справа налево - Предпочитать режим Справа налево - Вы можете настроить режим чтения для каждой манги отдельно + Справа налево (←) + Предпочитать читать справа налево (←) + Режим чтения может быть настроен отдельно для каждой серии Создать категорию Масштабирование Вписать в экран Подогнать по высоте Подогнать по ширине Исходный размер - Чёрная тёмная тема - Полезно для AMOLED экранов + Чёрная + Потребляет меньше энергии на экранах AMOLED Требуется перезапуск Резервное копирование и восстановление Создать резервную копию Восстановить данные - Данные восстановлены + Восстановлено Подготовка… Файл не найден - Все данные успешно восстановлены - Данные восстановлены, но возникли некоторые ошибки + Все данные были восстановлены + Данные были восстановлены, но возникли некоторые ошибки Вы можете создать резервную копию избранного и истории и потом восстановить их Только что Вчера @@ -195,34 +195,34 @@ Необходимо пройти CAPTCHA Пройти Очистить куки - Все куки удалены + Все файлы cookie были удалены Проверка новых глав: %1$d из %2$d Очистить ленту - Вся история обновлений будет очищена и её нельзя будет вернуть. Вы уверены? - Проверка новых глав + Удалить всю историю обновлений навсегда\? + Проверка новых глав… В обратном порядке Войти - Для просмотра этого контента требуется авторизация + Авторизуйтесь, чтобы просмотреть этот контент По умолчанию: %s …и ещё %1$d Далее - Введите пароль, который вам понадобится при запуске приложения + Введите пароль для запуска приложения Подтвердить - Пароль должен содержать не менее 4 символов + Пароль должен состоять из 4 символов или более Прятать заголовок при прокрутке Поиск только по %s Другие Описание Языки Добро пожаловать - Вы действительно хотите удалить все недавние поисковые запросы? Это действие не может быть отменено. - Резервная копия успешно сохранена - Некоторые производители могут изменять поведение системы, нарушая работу фоновых задач. + Удалить все последние поисковые запросы навсегда\? + Резервная копия сохранена + Некоторые устройства имеют различное поведение системы, что может привести к нарушению фоновых задач. Подробнее В очереди - На данный момент нет активных загрузок + Нет активных загрузок Глава отсутствует - Эта глава отсутствует на вашем устройстве. Загрузите её или читайте онлайн. + Скачайте или прочитайте эту недостающую главу онлайн. Помочь с переводом приложения Перевод Автор @@ -231,20 +231,20 @@ Поддержать разработчика Если вам нравится это приложение, вы можете помочь финансово с помощью ЮMoney (бывш. Яндекс.Деньги) Благодарности - Эти люди помогают Kotatsu стать лучше! + Все эти люди сделали Kotatsu лучше Авторские права и лицензии Лицензия Авторизация выполнена - Авторизация в %s не поддерживается - Вы выйдете из всех источников, в которых Вы авторизованы + Вход в %s не поддерживается + Вы выйдете из всех источников Жанры Завершено Онгоинг Формат даты По умолчанию Исключить NSFW мангу из истории - Имя не может быть пустым - Показывать номера страниц + Вы должны ввести имя + Пронумерованные страницы Включенные источники Доступные источники Динамическая тема From eae0709c0947813f31768d56ee323f823f23d8df Mon Sep 17 00:00:00 2001 From: mondstern Date: Sat, 29 Jan 2022 14:28:15 +0000 Subject: [PATCH 15/70] Translated using Weblate (German) Currently translated at 68.9% (173 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/de/ --- app/src/main/res/values-de/strings.xml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index e003283e5..ddd8691a1 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -1,7 +1,7 @@ Entfernen - Möchtest du wirklich deinen gesamten Leseverlauf löschen\? Diese Aktion kann nicht rückgängig gemacht werden. + Möchtest du wirklich deinen gesamten Leseverlauf löschen\? Design Seiten Automatisch @@ -67,8 +67,7 @@ Wird geladen … Möchtest du die Kategorie „%s“ wirklich aus deinen Favoriten entfernen\? \nAlle enthaltenen Manga gehen dabei verloren. - Möchtest du wirklich „%s“ aus dem lokalen Speicher des Telefons löschen\? -\nDieser Vorgang kann nicht rückgängig gemacht werden. + \"%s\" dauerhaft vom Gerät löschen\? „%s“ aus lokalem Speicher gelöscht „%s“ aus dem Verlauf entfernt Detaillierte Liste @@ -108,7 +107,7 @@ Standard: %s Du solltest diesen Inhalt autorisieren, um ihn zu sehen Umkehren - Neue Kapitel prüfen + Neue Kapitel prüfen… Feed löschen Anmelden Das Passwort muss mindestens 4 Zeichen lang sein @@ -116,7 +115,7 @@ Gib das Passwort ein, das beim Starten der Anwendung benötigt wird Nächste Anderes - Möchtest du wirklich alle letzten Suchanfragen entfernen\? Diese Aktion kann nicht rückgängig gemacht werden. + Möchtest du wirklich alle letzten Suchanfragen entfernen\? Nur auf %s suchen Symbolleiste beim Blättern ausblenden Mehr erfahren @@ -194,7 +193,7 @@ Bild teilen Seite erfolgreich gespeichert Seite speichern - Warte, bis der Ladevorgang beendet ist + Warte, bis der Ladevorgang beendet ist… Löschen Auf Kanten tippen Löse @@ -228,7 +227,7 @@ Wenn diese Anwendung dir gefällt, kannst du über Yoomoney (Yandex.Money) finanziell helfen Lizenz Urheberrecht und Lizenzen - Diese Leute machen Kotatsu besser! + Diese Leute machen Kotatsu besser Danksagung Den Entwickler unterstützen Thema auf 4PDA @@ -249,4 +248,6 @@ Seitenzahlen anzeigen Freigegebene Quellen Verfügbare Quellen + Dynamisches Thema + Wendet ein Thema an, das auf dem Farbschema Ihres Hintergrundbildes basiert \ No newline at end of file From 6d6f8813677b84a2a0fb42dea3396ded72d624e2 Mon Sep 17 00:00:00 2001 From: Luiz-bro Date: Fri, 28 Jan 2022 22:58:17 +0000 Subject: [PATCH 16/70] Translated using Weblate (Portuguese) Currently translated at 100.0% (251 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/pt/ --- app/src/main/res/values-pt/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 1fa3d4a78..20af10133 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -248,4 +248,6 @@ Excluir mangá NSFW do histórico Formato da data Padrão + Tema dinâmico + Aplica um tema criado no esquema de cores do seu papel de parede \ No newline at end of file From 526029507938cced5de6a9a6e5ca11cdac17b9cd Mon Sep 17 00:00:00 2001 From: "J. Lavoie" Date: Fri, 28 Jan 2022 23:14:02 +0000 Subject: [PATCH 17/70] Translated using Weblate (French) Currently translated at 82.0% (206 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fr/ --- app/src/main/res/values-fr/strings.xml | 28 ++++++++++++++------------ 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 85aeec337..73240e220 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -8,7 +8,7 @@ Bienvenue Langues Autre - Voulez-vous vraiment supprimer toutes les requêtes de recherche récentes \? Cette action ne peut pas être annulée. + Supprimer définitivement toutes les requêtes de recherche récentes \? Rechercher uniquement sur %s Masquer la barre d\'outils lors du défilement Le mot de passe doit comporter au moins 4 caractères @@ -20,7 +20,7 @@ Vous devez autoriser la visualisation de ce contenu Se connecter Inverser - Recherche de nouveaux chapitres + À la recherche de nouveaux chapitres… L\'historique des mises à jour sera effacé et cette action ne pourra pas être annulée. Êtes-vous sûr·e \? Effacer le flux Recherche de nouveaux chapitres : %1$d sur %2$d @@ -97,18 +97,18 @@ Mangas récents Étagère à mangas Vous pouvez l\'enregistrer à partir de sources en ligne ou l\'importer à partir d\'un fichier. - Vous n\'avez pas encore enregistré de manga - Vous pouvez trouver ce qu\'il faut lire dans le menu latéral. - Les mangas que vous lisez seront affichés ici + Sauvegardez d\'abord quelque chose + Trouvez ce que vous voulez lire dans le menu latéral. + Ce que vous lisez sera affiché ici Essayez de reformuler la requête. - Vous pouvez utiliser des catégories pour organiser vos mangas préférés. Appuyez sur « + » pour créer une catégorie + Vous pouvez utiliser des catégories pour organiser vos favoris. Appuyez sur « + » pour créer une catégorie C\'est un peu vide ici… - Retirer la catégorie - Voulez-vous vraiment supprimer la catégorie « %s » de vos favoris \? + Retirer + Retirer la catégorie « %s » de vos favoris \? \nTous les mangas qu\'elle contient seront perdus. Renommer Catégories… - Catégories de favoris + Catégories favorites Vibration Indicateur lumineux Son de notification @@ -120,10 +120,10 @@ Nouveaux chapitres Activé %1$d sur %2$d Notifications - Ce manga a %s. Voulez-vous l\'enregistrer en entier \? - Enregistrer le manga + Ce manga a %s. Tout sauvegarder \? + Enregistrer Ouvrir dans le navigateur - Afficher une notification si une mise à jour est disponible + Afficher une notification si une nouvelle version est disponible Une nouvelle version de l\'application est disponible Vérifier les nouvelles versions de l\'application Domaine @@ -228,7 +228,7 @@ Soutenir le concepteur Licence Droits d\'auteur et licences - Ces gens font que Kotatsu s\'améliore ! + Ces personnes ont toutes rendu Kotatsu meilleur Remerciements Sujet sur 4PDA Remarques @@ -248,4 +248,6 @@ Afficher les numéros de pages Sources activées Sources disponibles + Thème dynamique + Applique un thème créé d\'après la palette de couleurs de votre fond d\'écran \ No newline at end of file From f964dd8267342126687f041b17cc463e9c75f9b5 Mon Sep 17 00:00:00 2001 From: nzgha Date: Mon, 31 Jan 2022 20:09:25 +0000 Subject: [PATCH 18/70] Translated using Weblate (Spanish) Currently translated at 75.2% (189 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/es/ --- app/src/main/res/values-es/strings.xml | 33 +++++++++++++------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 602d55882..cddb32251 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -6,7 +6,7 @@ Favoritos Historial Ocurrió un error - Error de red + No se pudo conectar a Internet Detalles Capítulos Lista @@ -21,12 +21,12 @@ Reintentar Borrar historial No se encontró nada - Historial vacío + Aún sin historial Leer Añadir marcador - Añade tu manga favorito primero + Aún no hay favoritos Añadir a favoritos - Añadir categoría + Nueva categoría Añadir Introduce categoría Guardar @@ -35,15 +35,15 @@ Compartir %s Buscar Buscar manga - Descargar manga… + Descargando… Procesando… - Descarga completa + Descargado Descargas - Por nombre + Nombre Popularidad Actualización Recientes - Por calificación + Calificación Todo Establecer orden Género @@ -51,24 +51,24 @@ Tema Claro Oscuro - Automático + De acuerdo al sistema Páginas Borrar ¿Realmente quieres borrar todo tu historial de lectura? Esta acción no se puede deshacer. Eliminar «%s» retirado del historial «%s» borrado del almacenamiento local - Espera que termine la carga + Espere a que termine de cargar… Guardar página - Página guardada con éxito + Guardado Compartir imagen Importar Borrar Esta operación no está admitida - Archivo no válido. Sólo se admiten ZIP y CBZ. + Elija un archivo ZIP o bien un archivo CBZ. Sin descripción Historial y caché - Borrar la caché de páginas + Borrar caché de página Caché B|kB|MB|GB|TB Estándar @@ -77,11 +77,10 @@ Tamaño de la cuadrícula Buscar en %s Borrar manga - ¿Realmente quieres borrar «%s» del almacenamiento local de tu teléfono\? -\nEsta operación no se puede deshacer. + ¿Borrar \"%s\" del dispositivo permanentemente\? Ajustes del lector Cambiar de página - Tapas en los bordes + Toques de borde Botones de volumen Continuar Advertencia @@ -249,4 +248,6 @@ Mostrar los números de páginas Fuentes activadas Fuentes disponibles + Tema dinámico + Aplica un tema creado a partir del esquema de colores de su fondo de pantalla \ No newline at end of file From b2b8a62a57f46cf27f9aeb85bfd9a9d97695532f Mon Sep 17 00:00:00 2001 From: "J. Lavoie" Date: Sun, 30 Jan 2022 22:32:21 +0000 Subject: [PATCH 19/70] Translated using Weblate (French) Currently translated at 100.0% (251 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fr/ --- app/src/main/res/values-fr/strings.xml | 72 +++++++++++++------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 73240e220..fd85c76f2 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -2,8 +2,8 @@ Attendez la fin du chargement… Lire la suite - Certains fabricants peuvent modifier le comportement du système, ce qui peut interrompre les tâches d\'arrière-plan. - Sauvegarde enregistrée avec succès + Certains appareils ont un comportement différent du système, ce qui peut interrompre les tâches d\'arrière-plan. + Sauvegarde enregistrée Description Bienvenue Langues @@ -11,25 +11,25 @@ Supprimer définitivement toutes les requêtes de recherche récentes \? Rechercher uniquement sur %s Masquer la barre d\'outils lors du défilement - Le mot de passe doit comporter au moins 4 caractères + Le mot de passe doit comporter 4 caractères ou plus Confirmer - Entrez le mot de passe qui sera demandé au démarrage de l\'application + Entrez un mot de passe pour démarrer l\'application avec Suivant … et %1$d autre(s) Par défaut : %s - Vous devez autoriser la visualisation de ce contenu + Connectez-vous pour voir ce contenu Se connecter Inverser À la recherche de nouveaux chapitres… - L\'historique des mises à jour sera effacé et cette action ne pourra pas être annulée. Êtes-vous sûr·e \? + Effacer définitivement l\'historique des mises à jour \? Effacer le flux Recherche de nouveaux chapitres : %1$d sur %2$d Tous les cookies ont été retirés Effacer les cookies Résoudre - CAPTCHA est requis + CAPTCHA requis Silencieux - La configuration choisie sera mémorisée pour ce manga + On se souviendra de la configuration choisie pour ce manga Appuyez pour réessayer Aujourd\'hui Groupe @@ -38,16 +38,16 @@ À l\'instant Vous pouvez créer une sauvegarde de votre historique et de vos favoris et la restaurer Les données ont été restaurées, mais il y a des erreurs - Toutes les données ont été restaurées avec succès + Toutes les données ont été restaurées Fichier introuvable Préparation… - Données restaurées + Restauré Restaurer à partir d\'une sauvegarde Créer une sauvegarde des données Sauvegarde et restauration Redémarrage nécessaire - Utile pour les écrans AMOLED - Thème noir foncé + Utilise moins d\'énergie pour les écrans AMOLED + Noir Garder au début Ajuster à la largeur Ajuster à la hauteur @@ -55,9 +55,9 @@ Mode mise à l\'échelle Signaler un problème sur GitHub Nouvelle catégorie - Vous pouvez configurer le mode de lecture pour chaque manga séparément - Préférer le lecteur de droite à gauche - De droite à gauche + Le mode de lecture peut être configuré séparément pour chaque série + Préférer le lecteur de droite à gauche (→) + De droite à gauche (←) Aucune mise à jour disponible Échec de la recherche de mise à jour Recherche de mises à jour… @@ -66,37 +66,37 @@ À propos Les mots de passe ne correspondent pas Répéter le mot de passe - Demander le mot de passe au démarrage de l\'appli + Demander le mot de passe au démarrage de Kotatsu Protéger l\'application Mot de passe erroné Entrez le mot de passe Ne pas vérifier - Vérifier les mises à jour pour les mangas + Rechercher les mises à jour La mise à jour des flux commencera bientôt Mettre à Jour Faire pivoter l\'écran - Flux de mises à jour effacé + Effacé Effacer le flux des mises à jour En attente du réseau… Taille : %s Nouvelle version : %s Connexes Résultats de la recherche - Ici, vous verrez les nouveaux chapitres du manga que vous lisez + Les nouveaux chapitres de ce que vous lisez sont présentés ici Mises à jour Lire plus tard - Cette catégorie est vide + Catégorie vide Tous les favoris Terminé Utiliser une connexion sécurisée (HTTPS) Autre stockage - Impossible de trouver un stockage disponible + Pas de stockage disponible Non disponible - Emplacement des téléchargements de mangas - Animation des pages - Mangas récents - Étagère à mangas - Vous pouvez l\'enregistrer à partir de sources en ligne ou l\'importer à partir d\'un fichier. + Dossier pour les téléchargements + Animation de page + Récents + Étagère + Enregistrez-le à partir de sources en ligne ou importez des fichiers. Sauvegardez d\'abord quelque chose Trouvez ce que vous voulez lire dans le menu latéral. Ce que vous lisez sera affiché ici @@ -220,11 +220,11 @@ Stockage local Ouvrir le menu Fermer le menu - Chapitre manquant - Ce chapitre est manquant sur votre appareil. Téléchargez-le ou lisez-le en ligne. - Il n\'y a actuellement aucun téléchargement actif + Le chapitre est manquant + Téléchargez ou lisez ce chapitre manquant en ligne. + Aucun téléchargement actif En file d\'attente - Si vous aimez cette application, vous pouvez aider financièrement par le biais de Yoomoney (Yandex.Money) + Si vous aimez cette application, vous pouvez envoyer de l\'argent via Yoomoney (ex. Yandex.Money) Soutenir le concepteur Licence Droits d\'auteur et licences @@ -236,17 +236,17 @@ Traduction Traduire cette application Genres - Vous serez déconnecté·e de toutes les sources pour lesquelles vous avez une autorisation - L\'autorisation sur %s n\'est pas prise en charge - Autorisation complète + Vous serez déconnecté de toutes les sources + La connexion sur %s n\'est pas prise en charge + Autorisé Terminé En cours Format de la date Par défaut Exclure les mangas osés de l\'historique - Le nom ne doit pas être vide - Afficher les numéros de pages - Sources activées + Vous devez entrer un nom + Pages numérotées + Sources utilisées Sources disponibles Thème dynamique Applique un thème créé d\'après la palette de couleurs de votre fond d\'écran From 694dc7a807c63e878cebd07ef6dcd46b6335b71c Mon Sep 17 00:00:00 2001 From: nzgha Date: Wed, 2 Feb 2022 02:31:29 +0000 Subject: [PATCH 20/70] Translated using Weblate (Spanish) Currently translated at 86.0% (216 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/es/ --- app/src/main/res/values-es/strings.xml | 42 +++++++++++++------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index cddb32251..716046843 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -45,7 +45,7 @@ Recientes Calificación Todo - Establecer orden + Orden de clasificación Género Filtrar Tema @@ -95,12 +95,12 @@ Almacenamiento interno Almacenamiento externo Dominio - Comprobar actualizaciones automáticamente + Comprobar nuevas versiones de la aplicación Una nueva versión de la aplicación está disponible - Mostrar notificación si la actualización está disponible - Abrir en el navegador + Mostrar notificación si una nueva versión está disponible + Abrir en navegador web Este manga tiene %s. ¿Quieres guardarlo todo? - Guardar manga + Guardar Notificaciones Activado %1$d de %2$d Nuevos capítulos @@ -110,26 +110,26 @@ Reiniciar Configuración de las notificaciones Sonido de las notificaciones - Indicador de luz + Indicador LED Vibración Categorías favoritas Categorías… Renombrar - ¿Realmente quieres eliminar la categoría «%s» de tus favoritos\? -\nTodo el manga en ella se perderá. - Quitar categoría - Puedes usar categorías para organizar tus mangas favoritos. Pulsa «+» para crear una categoría - Estante de manga - Manga reciente - Animación de páginas - Ubicación de descarga del manga + ¿Remover la categoría \"%s\" de sus favoritos\? +\nTodo el manga en esta se perderá. + Remover + Puedes usar categorías para organizar tus favoritos. Pulsa «+» para crear una categoría + Estante + Reciente + Animación de página + Carpeta para descargas No disponible - No se puede encontrar ningún almacenamiento disponible + No hay almacenamiento disponible Otro almacenamiento Utilizar conexión segura (HTTPS) Aceptar Todos los favoritos - Esta categoría está vacía + Categoría vacía Leer más tarde Actualizaciones Aquí verás los nuevos episodios del manga que estás leyendo @@ -148,7 +148,7 @@ Introducir contraseña Contraseña incorrecta Proteger aplicación - Pide la contraseña al iniciar la aplicación + Pedir una contraseña al iniciar Kotatsu Repite la contraseña Las contraseñas no coinciden Acerca de @@ -157,8 +157,8 @@ Comprobar si hay actualizaciones… Fallo en la comprobación de actualizaciones No hay actualizaciones disponibles - Derecha a izquierda - Preferir lector de derecha a izquierda + Derecha a izquierda (←) + Preferir lector de derecha a izquierda (→) Puedes configurar el modo de lectura para cada manga por separado Nueva categoría Crear incidencia en GitHub @@ -206,8 +206,8 @@ La contraseña debe tener al menos 4 caracteres Puedes guardarlo desde fuentes in línea o importarlo desde un archivo. Todavía no tienes ningún manga guardado - Puede encontrar qué leer en el menú lateral. - El manga que estás leyendo se mostrará aquí + Encuentra qué leer en el menú lateral. + Lo que leas se mostrará aquí Está un poco vacío aquí… Agradecimientos Si te gusta esta aplicación, puedes ayudar económicamente a través de Yoomoney (ex. Yandex.Money) From dcc180eea5b688f2c6c3de16dd6a97424fc9dc16 Mon Sep 17 00:00:00 2001 From: Jakob Holkestad Molnes Date: Thu, 3 Feb 2022 20:13:55 +0000 Subject: [PATCH 21/70] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegian?= =?UTF-8?q?=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 93.2% (234 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/nb_NO/ --- app/src/main/res/values-nb-rNO/strings.xml | 35 ++++++++++++---------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index fcb50757a..5d9cebf02 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -2,23 +2,23 @@ B|kB|MB|GB|TB Ingen tilgjengelig lagring - Nedlastingssted + Mappe for nedlastninger Lagre fra nettbaserte kilder, eller importer filer. Noen enheter endrer systemoppførselen, noe som kan ødelegge for bakgrunnsoppgaver. Fjern alle nylige søkespørringer for godt\? Skjul verktøylinje under rulling - Passord må være minst fire tegn + Passordet må være minst fire tegn Skriv inn passord å kreve for å starte programmet … og %1$d til - Autoriser visning av innholdet + Logg inn for å se dette innholdet Inverter - Sjekk etter nye kapitler + Sjekker etter nye kapitler… Tøm all oppdateringshistorikk for godt\? Tøm flyt Ser etter nye kapitler: %1$d av %2$d Valgt oppsett vil bli husket for denne filen Du kan opprette en sikkerhetskopi av din historikk og favoritter å gjenopprette senere - Data gjenopprettet, men med feil + Dataene ble gjenopprettet, men med feil Fant ikke filen Sikkerhetskopiering og gjenoppretting Behold ved oppstart @@ -34,8 +34,8 @@ Kunne ikke se etter oppdateringer Ser etter oppdateringer … Se etter oppdateringer - Passord ved programoppstart - Se etter leseoppdateringer + Spør om passord ved programoppstart + Se etter oppdateringer Flytoppdatering starter snart Oppdater Tømt @@ -51,20 +51,21 @@ Finn lesestoff i sidemenyen. Det du leser vil vises her Prøv å reformulere spørringen. - Bruk kategorier til å organisere mapper. Trykk «+» for å opprette en kategori. + Du kan bruke kategorier til å organisere mapper. Trykk «+» for å opprette en kategori Det er ganske tomt her … - Fjern «%s»-kategorien fra favoritter og alt i den\? + Fjern «%s»-kategorien fra favorittene\? +\nAlle mangaer i den vil bli tapt. Programomstart Gi merknad om oppdateringer av det du leser Skrudde på %1$d av %2$d Denne mangaen har %s. Lagre hele\? Åpne i nettleser - Vis merknad hvis ny versjon er tilgjengelig + Vis merknad hvis en ny versjon er tilgjengelig En ny versjon av programmet er tilgjengelig Se etter nye versjoner av programmet Tømt Tøm miniatyrbildehurtiglager - Kan laste ned mye data. + Dette kan overføre mye data Kanttrykk Slett «%s» fra enheten for godt\? Nettserie @@ -90,9 +91,9 @@ Kun søk på %s Bekreft Neste - Forvalg: %s + Standard: %s Logg inn - Alle kaker ble fjernet + Alle cookies ble fjernet Tøm kaker Løs CAPTCHA kreves @@ -103,13 +104,13 @@ Lenge siden I går Akkurat nå - All data gjenopprettet + All data ble gjenopprettet Forbereder … Data gjenopprettet Gjenopprett fra sikkerhetskopi Opprett sikkerhetskopi Omstart kreves - Nyttig for AMOLED-skjermer + Bruker mindre strøm på AMOLED-skjermer Svart Ny kategori Versjon %s @@ -243,8 +244,10 @@ Utelat NSFW-manga fra historikk Datoformat Forvalg - Navn må angis + Du må angi ett navn Tilgjengelige kilder Sidenummerering Brukte kilder + Dynamisk tema + Bruker et tema basert på fargene til bakgrunnen din \ No newline at end of file From 735bf66593b990338599eaac7d73569be1a94c25 Mon Sep 17 00:00:00 2001 From: Luiz-bro Date: Thu, 3 Feb 2022 01:41:33 +0000 Subject: [PATCH 22/70] Translated using Weblate (Portuguese) Currently translated at 100.0% (251 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/pt/ --- app/src/main/res/values-pt/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 20af10133..8ae15ce43 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -113,7 +113,7 @@ Som de notificação Páginas numeradas Concluído - em andamento + Em andamento Categorias… Renomear Remover From 02dc6965d1299e3c76e370a00a56876e9ce00c08 Mon Sep 17 00:00:00 2001 From: Sertinel Date: Tue, 8 Feb 2022 20:54:42 +0100 Subject: [PATCH 23/70] Added translation using Weblate (Turkish) --- app/src/main/res/values-tr/strings.xml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 app/src/main/res/values-tr/strings.xml diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml new file mode 100644 index 000000000..a6b3daec9 --- /dev/null +++ b/app/src/main/res/values-tr/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file From 236c0edaaf682c649f88090e3be01c3f3689ef48 Mon Sep 17 00:00:00 2001 From: Sertinel Date: Tue, 8 Feb 2022 20:56:40 +0100 Subject: [PATCH 24/70] Added translation using Weblate (Turkish (Ottoman)) --- app/src/main/res/values-ota/strings.xml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 app/src/main/res/values-ota/strings.xml diff --git a/app/src/main/res/values-ota/strings.xml b/app/src/main/res/values-ota/strings.xml new file mode 100644 index 000000000..a6b3daec9 --- /dev/null +++ b/app/src/main/res/values-ota/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file From ba6474c7bb1520a0ad707ff664d7a58a2b428a54 Mon Sep 17 00:00:00 2001 From: Luiz-bro Date: Tue, 8 Feb 2022 00:16:36 +0000 Subject: [PATCH 25/70] Translated using Weblate (Portuguese) Currently translated at 100.0% (251 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/pt/ --- app/src/main/res/values-pt/strings.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 8ae15ce43..cb4231b57 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -17,10 +17,10 @@ Limpar histórico Nada encontrado Sem histórico ainda - Add marca páginas + Adicionar marca páginas Ainda não há favoritos Favoritar isso - Add + Adicionar Nomeie a categoria Salvar Compartilhar @@ -55,13 +55,13 @@ Deletar Essa operação não é suportada Histórico e cache - Limpar cache da página + Limpar cache de página Cache B|kB|MB|GB|TB Padrão Webtoon Modo leitura - Tamanho de grade + Tamanho da grade Pesquisar em %s Deletar mangá Configurações de leitura @@ -95,7 +95,7 @@ Fechar menu Fontes remotas Fechar - Brilho + Claro Histórico Ler Processando… From aac4d1218d38028f6c640d366addfe835804e013 Mon Sep 17 00:00:00 2001 From: Sertinel Date: Tue, 8 Feb 2022 20:00:26 +0000 Subject: [PATCH 26/70] Translated using Weblate (Turkish) Currently translated at 23.5% (59 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/tr/ --- app/src/main/res/values-tr/strings.xml | 60 +++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index a6b3daec9..1c4cd45dc 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -1,2 +1,60 @@ - \ No newline at end of file + + İnternete bağlı olduğunuzdan emin olunuz + Menüyü kapat + Menüyü aç + Dahili Depolama + Favoriler + Geçmiş + Bölümler + Liste + Detaylı liste + Izgara + Liste modu + Yükleniyor… + Kapat + Tekrar dene + Geçmişi temizle + Hiçbir şey bulunamadı + Sen geçmişiniz yok + Oku + Favorilere ekle + Henüz favorileriniz yok + Favoriniz + Yeni kategori + Ekle + Kategori ismi girin + Kaydet + Paylaş + %s Paylaş + Ara + Manga ara + İndiriliyor… + İşleniyor… + İndirildi + İndirilenler + İsim + Güncellenme + Yeniler + Puanlama + Hepsi + Tür + Litre + Tema + Açık + Koyu + Takip sistemi + Sayfalar + Temizle + Tüm okuma geçmişi kalıcı olarak silinsin mi\? + Kaldır + \"%s\" geçmişinden kaldırıldı + \"%s\" yerel depolama alanından sil + Lütfen bitmesini bekleyin… + Sayfayı kaydet + Resmi paylaş + Popüler + Detaylar + Ayarlar + Kaydet + \ No newline at end of file From 8de5c1fc3d4ac7e95622aa4a41a3d29fb74a9990 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Sat, 12 Feb 2022 05:25:08 +0000 Subject: [PATCH 27/70] Translated using Weblate (English) Currently translated at 100.0% (251 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/en/ --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4ef71fe27..bbdd6db5a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -104,7 +104,7 @@ This manga has %s. Save all of it? Save Notifications - Turned on %1$d of %2$d + %1$d of %2$d on New chapters Notify about updates of manga you are reading Download From be2d335a5b027c5f1f5a039d68d7cc302f495e61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Sat, 12 Feb 2022 05:25:28 +0000 Subject: [PATCH 28/70] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegian?= =?UTF-8?q?=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 93.2% (234 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/nb_NO/ --- app/src/main/res/values-nb-rNO/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 5d9cebf02..ba9581b85 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -57,7 +57,7 @@ \nAlle mangaer i den vil bli tapt. Programomstart Gi merknad om oppdateringer av det du leser - Skrudde på %1$d av %2$d + %1$d av %2$d påskrudd Denne mangaen har %s. Lagre hele\? Åpne i nettleser Vis merknad hvis en ny versjon er tilgjengelig From b7922d90961e7075acef0385a017a3ccf22fe870 Mon Sep 17 00:00:00 2001 From: "J. Lavoie" Date: Mon, 14 Feb 2022 12:46:20 +0000 Subject: [PATCH 29/70] Translated using Weblate (German) Currently translated at 74.5% (187 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/de/ --- app/src/main/res/values-de/strings.xml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index ddd8691a1..f9ee4484c 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -4,19 +4,19 @@ Möchtest du wirklich deinen gesamten Leseverlauf löschen\? Design Seiten - Automatisch + Nach System Dunkel Hell Filter Genre - Sortierung + Sortierreihenfolge Alle - Nach Bewertung + Bewertung Neuestes Beliebt - Nach Name + Name Heruntergeladene - Herunterladen abgeschlossen + Heruntergeladen Manga suchen Suchen Teilen %s @@ -24,12 +24,12 @@ Speichern Gib den Name der Kategorie ein Hinzufügen - Neue Kategorie hinzufügen + Neue Kategorie Zu Favoriten hinzufügen - Du hast noch keine Favoriten + Noch keine Favoriten Lesezeichen hinzufügen Lesen - Verlauf ist leer + Noch kein Verlauf Nichts gefunden Verlauf löschen Erneut versuchen @@ -62,7 +62,7 @@ Kategorien … Abbrechen … Verarbeiten … - Manga wird heruntergeladen … + Wird heruntergeladen … Verknüpfung erstellen … Wird geladen … Möchtest du die Kategorie „%s“ wirklich aus deinen Favoriten entfernen\? @@ -74,8 +74,8 @@ Liste Kapitel Einzelheiten - Fehler bei der Netzwerkverbindung - Ein Fehler ist aufgetreten + Keine Verbindung zum Internet möglich + Es ist ein Fehler aufgetreten Verlauf Favoriten Lokaler Speicher @@ -186,12 +186,12 @@ Seitencache löschen Verlauf und Cache Keine Beschreibung - Ungültige Datei. Nur ZIP und CBZ werden unterstützt. + Wählen Sie entweder eine ZIP- oder CBZ-Datei. Dieser Vorgang wird nicht unterstützt Löschen Importieren Bild teilen - Seite erfolgreich gespeichert + Gespeichert Seite speichern Warte, bis der Ladevorgang beendet ist… Löschen From 7aeb691427884a114fa47e349c2620cffe0c001e Mon Sep 17 00:00:00 2001 From: "J. Lavoie" Date: Mon, 14 Feb 2022 12:45:28 +0000 Subject: [PATCH 30/70] Translated using Weblate (French) Currently translated at 100.0% (251 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fr/ --- app/src/main/res/values-fr/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index fd85c76f2..c82b662cf 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -118,7 +118,7 @@ Télécharger Avertir des mises à jour des mangas que vous lisez Nouveaux chapitres - Activé %1$d sur %2$d + %1$d de %2$d activé(s) Notifications Ce manga a %s. Tout sauvegarder \? Enregistrer From a90580623266eb1c4ab0248b6238d7ab9dd6bcc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aliaksiej=20Razuma=C5=AD?= Date: Sat, 19 Feb 2022 12:56:26 +0000 Subject: [PATCH 31/70] Translated using Weblate (Belarusian) Currently translated at 66.5% (167 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/be/ --- app/src/main/res/values-be/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index fb9e9af25..d3a8dc06f 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -249,4 +249,6 @@ Паказваць нумары старонак Уключаныя крыніцы Даступныя крыніцы + Дынамічная тэма + Ужывае тэму праграмы, заснаваную на каляровай палітры шпалер на прыладзе \ No newline at end of file From 542deac70522974b09f1e48d6958a0a99951f70f Mon Sep 17 00:00:00 2001 From: kuragehime Date: Sun, 20 Feb 2022 17:10:19 +0100 Subject: [PATCH 32/70] Added translation using Weblate (Japanese) --- app/src/main/res/values-ja/strings.xml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 app/src/main/res/values-ja/strings.xml diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml new file mode 100644 index 000000000..a6b3daec9 --- /dev/null +++ b/app/src/main/res/values-ja/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file From 6f79bf198dd384ba6af58ed3b01c006de4b045b5 Mon Sep 17 00:00:00 2001 From: kuragehime Date: Sun, 20 Feb 2022 16:32:51 +0000 Subject: [PATCH 33/70] Translated using Weblate (Japanese) Currently translated at 29.0% (73 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/ja/ --- app/src/main/res/values-ja/strings.xml | 74 +++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index a6b3daec9..76e8dcdc2 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -1,2 +1,74 @@ - \ No newline at end of file + + 履歴 + ロード中… + チャプター %1$d of %2$d + 共有 + 履歴を削除 + 検索 + 漫画を検索 + 閉じる + お気に入り + エラーが発生しました + 詳細 + チャプター + リスト + 詳細リスト + グリッド + リストモード + リモートソース + 再試行 + 何も見つかりませんでした + まだ履歴はありません + 読む + お気に入りの本はありません + お気に入りの本 + 新たなカテゴリー + 追加 + 保存 + ショートカットを作成します… + 共有する%s + ダウンロード中… + 処理中… + ダウンロードした本 + ダウンロード + 名前 + 人気 + ローカルストレージ + 最新 + 評価 + 全て + ソート順に並べ替え + ジャンル + フォローシステム + クリア + すべての履歴を永久にクリアしますか? + 削除 + \"%s\"が履歴から削除されました + \"%s \"がローカルストレージから削除されました + 読み込みが完了するまでお待ちください… + ページを保存 + 保存しました + 画像を共有する + インポート + 消去 + この操作はサポートされていません + 説明がありません + 履歴とキャッシュ + ページのキャッシュをクリアする + B|kB|MB|GB|TB + 閉じる + 開く + 設定 + ライトテーマ + フィルター + ダークテーマ + ページ + テーマ + インターネットに接続出来ませんでした + ブックマークに追加 + カテゴリー名を入力してください + アップデート + キャッシュ + ZIPファイルまたはCBZファイルを選択してください。 + \ No newline at end of file From c376662939ad15001638eb5ebf4deae4ea213e34 Mon Sep 17 00:00:00 2001 From: kuragehime Date: Mon, 21 Feb 2022 15:07:43 +0000 Subject: [PATCH 34/70] Translated using Weblate (Japanese) Currently translated at 64.5% (162 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/ja/ --- app/src/main/res/values-ja/strings.xml | 92 +++++++++++++++++++++++++- 1 file changed, 91 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 76e8dcdc2..ea440b489 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -1,5 +1,5 @@ - + 履歴 ロード中… チャプター %1$d of %2$d @@ -71,4 +71,94 @@ アップデート キャッシュ ZIPファイルまたはCBZファイルを選択してください。 + 標準 + ウェブトゥーン + 読み取りモード + グリッドのサイズ + %sで検索 + 漫画を削除 + お使いのデバイスから「%s」を完全に削除しますか? + リーダーの設定 + ページを変更 + エッジタップ + ボリュームボタン + 続ける + 警告 + これにより大量のデータが転送される可能性があります + 二度と表示しない + キャンセル… + エラー + サムネイルキャッシュをクリア + クリア + ジェスチャーのみ + 内部ストレージ + ドメイン + Kotatsuの新しい更新を確認 + 新しい更新が利用可能かどうか通知を表示 + ブラウザーで開く + この漫画には%sがあります。 すべて保存しますか? + 保存 + 通知 + %2$dの%1$d + 新しいチャプター + ダウンロード + 最初から読む + 再開 + 通知の設定 + 通知音 + LEDインジケータ + バイブレーション + お気に入りのカテゴリー + カテゴリー… + 名前を変更 + 削除 + クエリを再定式化してみてください。 + 読んだ内容がここに表示されます + サイドメニューで何を読むかを見つけてください。 + 最初に何かを保存する + 本棚 + 最近 + ページアニメーション + ダウンロード用のフォルダ + 利用出来ません + 使用可能なストレージがありません + その他のストレージ + 安全な(HTTPS)接続を使用する + 完了 + 全てのお気に入り + 後で読む + 更新 + あなたが読んでいるものの新しいチャプターがここに示されています + の検索結果 + 関連している本 + サイズ:%s + ネットワークに接続されていません… + 更新フィードをクリア + クリア + アップデート + フィードの更新はまもなく開始されます + 更新を探す + チェックしない + Kotatsuを起動したときにパスワードを入力する + パスワードを繰り返す + パスワードが違います + この本の詳細 + 現在のバージョン%s + 検索履歴をクリア + 外部ストレージ + Kotatsuの新しい更新が利用可能です + あなたが読んでいる漫画の更新について通知 + ここは空っぽです… + カテゴリーを使用してお気に入りを整理できます。 «+»を押してカテゴリーを作成出来ます + 空のカテゴリー + お気に入りから「%s」カテゴリーを削除しますか? +\nその中のすべての漫画は失われます。 + オンラインソースから保存するかファイルをインポートします。 + 新しいバージョン:%s + 画面を回転させる + アップデートを確認しています… + パスワードを入力してください + パスワードが間違っています + アプリを保護する + 最新のアップデートを確認する \ No newline at end of file From b8e564a8d027cc04ee262af17766716eccf75412 Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" Date: Tue, 22 Feb 2022 18:47:08 +0100 Subject: [PATCH 35/70] Translations update from Hosted Weblate (#96) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Translated using Weblate (Spanish) Currently translated at 68.2% (170 of 249 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/es/ * Translated using Weblate (Russian) Currently translated at 80.3% (200 of 249 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/ru/ * Translated using Weblate (Norwegian Bokmål) Currently translated at 86.7% (216 of 249 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/nb_NO/ * Translated using Weblate (Portuguese) Currently translated at 100.0% (249 of 249 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/pt/ * Translated using Weblate (French) Currently translated at 75.5% (188 of 249 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fr/ * Translated using Weblate (Russian) Currently translated at 99.5% (248 of 249 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/ru/ * Translated using Weblate (German) Currently translated at 68.9% (173 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/de/ * Translated using Weblate (Portuguese) Currently translated at 100.0% (251 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/pt/ * Translated using Weblate (French) Currently translated at 82.0% (206 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fr/ * Translated using Weblate (Spanish) Currently translated at 75.2% (189 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/es/ * Translated using Weblate (French) Currently translated at 100.0% (251 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fr/ * Translated using Weblate (Spanish) Currently translated at 86.0% (216 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/es/ * Translated using Weblate (Norwegian Bokmål) Currently translated at 93.2% (234 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/nb_NO/ * Translated using Weblate (Portuguese) Currently translated at 100.0% (251 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/pt/ * Added translation using Weblate (Turkish) * Added translation using Weblate (Turkish (Ottoman)) * Translated using Weblate (Portuguese) Currently translated at 100.0% (251 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/pt/ * Translated using Weblate (Turkish) Currently translated at 23.5% (59 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/tr/ * Translated using Weblate (English) Currently translated at 100.0% (251 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/en/ * Translated using Weblate (Norwegian Bokmål) Currently translated at 93.2% (234 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/nb_NO/ * Translated using Weblate (German) Currently translated at 74.5% (187 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/de/ * Translated using Weblate (French) Currently translated at 100.0% (251 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fr/ * Translated using Weblate (Belarusian) Currently translated at 66.5% (167 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/be/ * Added translation using Weblate (Japanese) * Translated using Weblate (Japanese) Currently translated at 29.0% (73 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/ja/ * Translated using Weblate (Japanese) Currently translated at 64.5% (162 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/ja/ Co-authored-by: Luiz-bro Co-authored-by: Zakhar Timoshenko Co-authored-by: Allan Nordhøy Co-authored-by: J. Lavoie Co-authored-by: mondstern Co-authored-by: nzgha Co-authored-by: Jakob Holkestad Molnes Co-authored-by: Sertinel Co-authored-by: Aliaksiej Razumaŭ Co-authored-by: kuragehime --- app/src/main/res/values-be/strings.xml | 2 + app/src/main/res/values-de/strings.xml | 41 ++--- app/src/main/res/values-es/strings.xml | 85 +++++----- app/src/main/res/values-fr/strings.xml | 143 ++++++++--------- app/src/main/res/values-ja/strings.xml | 164 +++++++++++++++++++ app/src/main/res/values-nb-rNO/strings.xml | 117 +++++++------- app/src/main/res/values-ota/strings.xml | 2 + app/src/main/res/values-pt/strings.xml | 173 +++++++++++---------- app/src/main/res/values-ru/strings.xml | 135 ++++++++-------- app/src/main/res/values-tr/strings.xml | 60 +++++++ app/src/main/res/values/strings.xml | 2 +- 11 files changed, 579 insertions(+), 345 deletions(-) create mode 100644 app/src/main/res/values-ja/strings.xml create mode 100644 app/src/main/res/values-ota/strings.xml create mode 100644 app/src/main/res/values-tr/strings.xml diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index fb9e9af25..d3a8dc06f 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -249,4 +249,6 @@ Паказваць нумары старонак Уключаныя крыніцы Даступныя крыніцы + Дынамічная тэма + Ужывае тэму праграмы, заснаваную на каляровай палітры шпалер на прыладзе \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index e003283e5..f9ee4484c 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -1,22 +1,22 @@ Entfernen - Möchtest du wirklich deinen gesamten Leseverlauf löschen\? Diese Aktion kann nicht rückgängig gemacht werden. + Möchtest du wirklich deinen gesamten Leseverlauf löschen\? Design Seiten - Automatisch + Nach System Dunkel Hell Filter Genre - Sortierung + Sortierreihenfolge Alle - Nach Bewertung + Bewertung Neuestes Beliebt - Nach Name + Name Heruntergeladene - Herunterladen abgeschlossen + Heruntergeladen Manga suchen Suchen Teilen %s @@ -24,12 +24,12 @@ Speichern Gib den Name der Kategorie ein Hinzufügen - Neue Kategorie hinzufügen + Neue Kategorie Zu Favoriten hinzufügen - Du hast noch keine Favoriten + Noch keine Favoriten Lesezeichen hinzufügen Lesen - Verlauf ist leer + Noch kein Verlauf Nichts gefunden Verlauf löschen Erneut versuchen @@ -62,21 +62,20 @@ Kategorien … Abbrechen … Verarbeiten … - Manga wird heruntergeladen … + Wird heruntergeladen … Verknüpfung erstellen … Wird geladen … Möchtest du die Kategorie „%s“ wirklich aus deinen Favoriten entfernen\? \nAlle enthaltenen Manga gehen dabei verloren. - Möchtest du wirklich „%s“ aus dem lokalen Speicher des Telefons löschen\? -\nDieser Vorgang kann nicht rückgängig gemacht werden. + \"%s\" dauerhaft vom Gerät löschen\? „%s“ aus lokalem Speicher gelöscht „%s“ aus dem Verlauf entfernt Detaillierte Liste Liste Kapitel Einzelheiten - Fehler bei der Netzwerkverbindung - Ein Fehler ist aufgetreten + Keine Verbindung zum Internet möglich + Es ist ein Fehler aufgetreten Verlauf Favoriten Lokaler Speicher @@ -108,7 +107,7 @@ Standard: %s Du solltest diesen Inhalt autorisieren, um ihn zu sehen Umkehren - Neue Kapitel prüfen + Neue Kapitel prüfen… Feed löschen Anmelden Das Passwort muss mindestens 4 Zeichen lang sein @@ -116,7 +115,7 @@ Gib das Passwort ein, das beim Starten der Anwendung benötigt wird Nächste Anderes - Möchtest du wirklich alle letzten Suchanfragen entfernen\? Diese Aktion kann nicht rückgängig gemacht werden. + Möchtest du wirklich alle letzten Suchanfragen entfernen\? Nur auf %s suchen Symbolleiste beim Blättern ausblenden Mehr erfahren @@ -187,14 +186,14 @@ Seitencache löschen Verlauf und Cache Keine Beschreibung - Ungültige Datei. Nur ZIP und CBZ werden unterstützt. + Wählen Sie entweder eine ZIP- oder CBZ-Datei. Dieser Vorgang wird nicht unterstützt Löschen Importieren Bild teilen - Seite erfolgreich gespeichert + Gespeichert Seite speichern - Warte, bis der Ladevorgang beendet ist + Warte, bis der Ladevorgang beendet ist… Löschen Auf Kanten tippen Löse @@ -228,7 +227,7 @@ Wenn diese Anwendung dir gefällt, kannst du über Yoomoney (Yandex.Money) finanziell helfen Lizenz Urheberrecht und Lizenzen - Diese Leute machen Kotatsu besser! + Diese Leute machen Kotatsu besser Danksagung Den Entwickler unterstützen Thema auf 4PDA @@ -249,4 +248,6 @@ Seitenzahlen anzeigen Freigegebene Quellen Verfügbare Quellen + Dynamisches Thema + Wendet ein Thema an, das auf dem Farbschema Ihres Hintergrundbildes basiert \ No newline at end of file diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 5deb17d71..716046843 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -6,7 +6,7 @@ Favoritos Historial Ocurrió un error - Error de red + No se pudo conectar a Internet Detalles Capítulos Lista @@ -21,12 +21,12 @@ Reintentar Borrar historial No se encontró nada - Historial vacío + Aún sin historial Leer Añadir marcador - Añade tu manga favorito primero + Aún no hay favoritos Añadir a favoritos - Añadir categoría + Nueva categoría Añadir Introduce categoría Guardar @@ -35,40 +35,40 @@ Compartir %s Buscar Buscar manga - Descargar manga… + Descargando… Procesando… - Descarga completa + Descargado Descargas - Por nombre + Nombre Popularidad Actualización Recientes - Por calificación + Calificación Todo - Establecer orden + Orden de clasificación Género Filtrar Tema Claro Oscuro - Automático + De acuerdo al sistema Páginas Borrar ¿Realmente quieres borrar todo tu historial de lectura? Esta acción no se puede deshacer. Eliminar «%s» retirado del historial «%s» borrado del almacenamiento local - Espera que termine la carga + Espere a que termine de cargar… Guardar página - Página guardada con éxito + Guardado Compartir imagen Importar Borrar Esta operación no está admitida - Archivo no válido. Sólo se admiten ZIP y CBZ. + Elija un archivo ZIP o bien un archivo CBZ. Sin descripción Historial y caché - Borrar la caché de páginas + Borrar caché de página Caché B|kB|MB|GB|TB Estándar @@ -77,11 +77,10 @@ Tamaño de la cuadrícula Buscar en %s Borrar manga - ¿Realmente quieres borrar «%s» del almacenamiento local de tu teléfono\? -\nEsta operación no se puede deshacer. + ¿Borrar \"%s\" del dispositivo permanentemente\? Ajustes del lector Cambiar de página - Tapas en los bordes + Toques de borde Botones de volumen Continuar Advertencia @@ -96,12 +95,12 @@ Almacenamiento interno Almacenamiento externo Dominio - Comprobar actualizaciones automáticamente + Comprobar nuevas versiones de la aplicación Una nueva versión de la aplicación está disponible - Mostrar notificación si la actualización está disponible - Abrir en el navegador + Mostrar notificación si una nueva versión está disponible + Abrir en navegador web Este manga tiene %s. ¿Quieres guardarlo todo? - Guardar manga + Guardar Notificaciones Activado %1$d de %2$d Nuevos capítulos @@ -111,26 +110,26 @@ Reiniciar Configuración de las notificaciones Sonido de las notificaciones - Indicador de luz + Indicador LED Vibración Categorías favoritas Categorías… Renombrar - ¿Realmente quieres eliminar la categoría «%s» de tus favoritos\? -\nTodo el manga en ella se perderá. - Quitar categoría - Puedes usar categorías para organizar tus mangas favoritos. Pulsa «+» para crear una categoría - Estante de manga - Manga reciente - Animación de páginas - Ubicación de descarga del manga + ¿Remover la categoría \"%s\" de sus favoritos\? +\nTodo el manga en esta se perderá. + Remover + Puedes usar categorías para organizar tus favoritos. Pulsa «+» para crear una categoría + Estante + Reciente + Animación de página + Carpeta para descargas No disponible - No se puede encontrar ningún almacenamiento disponible + No hay almacenamiento disponible Otro almacenamiento Utilizar conexión segura (HTTPS) Aceptar Todos los favoritos - Esta categoría está vacía + Categoría vacía Leer más tarde Actualizaciones Aquí verás los nuevos episodios del manga que estás leyendo @@ -149,7 +148,7 @@ Introducir contraseña Contraseña incorrecta Proteger aplicación - Pide la contraseña al iniciar la aplicación + Pedir una contraseña al iniciar Kotatsu Repite la contraseña Las contraseñas no coinciden Acerca de @@ -158,8 +157,8 @@ Comprobar si hay actualizaciones… Fallo en la comprobación de actualizaciones No hay actualizaciones disponibles - Derecha a izquierda - Preferir lector de derecha a izquierda + Derecha a izquierda (←) + Preferir lector de derecha a izquierda (→) Puedes configurar el modo de lectura para cada manga por separado Nueva categoría Crear incidencia en GitHub @@ -178,7 +177,7 @@ Preparando… Archivo no encontrado Todos los datos fueron restaurados con éxito - Los datos fueron restaurados, pero hay errores + Los datos fueron restaurados, pero hay errores. Puedes crear una copia de seguridad de tu historial y favoritos para restaurarla Ahora mismo Ayer @@ -207,14 +206,14 @@ La contraseña debe tener al menos 4 caracteres Puedes guardarlo desde fuentes in línea o importarlo desde un archivo. Todavía no tienes ningún manga guardado - Puede encontrar qué leer en el menú lateral. - El manga que estás leyendo se mostrará aquí + Encuentra qué leer en el menú lateral. + Lo que leas se mostrará aquí Está un poco vacío aquí… Agradecimientos Si te gusta esta aplicación, puedes ayudar económicamente a través de Yoomoney (ex. Yandex.Money) Apoyar al desarrollador Buscar sólo en %s - ¡Estas personas hacen que Kotatsu sea mejor! + Todas estas personas hicieron que Kotatsu fuera mejor. Licencia Derechos de autor y licencias Falta un capítulo @@ -237,16 +236,18 @@ En curso Ocultar la barra de herramientas al desplazarse Este capítulo no aparece en su dispositivo. Descárguelo o léalo en línea. - Autorización completa + Autorizado Tema sobre 4PDA Formato de la fecha Por defecto Algunos fabricantes pueden cambiar el comportamiento del sistema, lo que podría interrumpir las tareas en segundo plano. El nombre no debe estar vacío - Autorización en %s no es compatible - Se cerrará la sesión de todas las fuentes en las que esté autorizado + No se admite iniciar sesión en %s + Serás desconectado de todas las fuentes. Excluye manga NSFW del historial Mostrar los números de páginas Fuentes activadas Fuentes disponibles + Tema dinámico + Aplica un tema creado a partir del esquema de colores de su fondo de pantalla \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 594f081e5..c82b662cf 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -1,35 +1,35 @@ - Attendez la fin du chargement + Attendez la fin du chargement… Lire la suite - Certains fabricants peuvent modifier le comportement du système, ce qui peut interrompre les tâches d\'arrière-plan. - Sauvegarde enregistrée avec succès + Certains appareils ont un comportement différent du système, ce qui peut interrompre les tâches d\'arrière-plan. + Sauvegarde enregistrée Description Bienvenue Langues Autre - Voulez-vous vraiment supprimer toutes les requêtes de recherche récentes \? Cette action ne peut pas être annulée. + Supprimer définitivement toutes les requêtes de recherche récentes \? Rechercher uniquement sur %s Masquer la barre d\'outils lors du défilement - Le mot de passe doit comporter au moins 4 caractères + Le mot de passe doit comporter 4 caractères ou plus Confirmer - Entrez le mot de passe qui sera demandé au démarrage de l\'application + Entrez un mot de passe pour démarrer l\'application avec Suivant … et %1$d autre(s) Par défaut : %s - Vous devez autoriser la visualisation de ce contenu + Connectez-vous pour voir ce contenu Se connecter Inverser - Recherche de nouveaux chapitres - L\'historique des mises à jour sera effacé et cette action ne pourra pas être annulée. Êtes-vous sûr·e \? + À la recherche de nouveaux chapitres… + Effacer définitivement l\'historique des mises à jour \? Effacer le flux Recherche de nouveaux chapitres : %1$d sur %2$d Tous les cookies ont été retirés Effacer les cookies Résoudre - CAPTCHA est requis + CAPTCHA requis Silencieux - La configuration choisie sera mémorisée pour ce manga + On se souviendra de la configuration choisie pour ce manga Appuyez pour réessayer Aujourd\'hui Groupe @@ -38,16 +38,16 @@ À l\'instant Vous pouvez créer une sauvegarde de votre historique et de vos favoris et la restaurer Les données ont été restaurées, mais il y a des erreurs - Toutes les données ont été restaurées avec succès + Toutes les données ont été restaurées Fichier introuvable Préparation… - Données restaurées + Restauré Restaurer à partir d\'une sauvegarde Créer une sauvegarde des données Sauvegarde et restauration Redémarrage nécessaire - Utile pour les écrans AMOLED - Thème noir foncé + Utilise moins d\'énergie pour les écrans AMOLED + Noir Garder au début Ajuster à la largeur Ajuster à la hauteur @@ -55,9 +55,9 @@ Mode mise à l\'échelle Signaler un problème sur GitHub Nouvelle catégorie - Vous pouvez configurer le mode de lecture pour chaque manga séparément - Préférer le lecteur de droite à gauche - De droite à gauche + Le mode de lecture peut être configuré séparément pour chaque série + Préférer le lecteur de droite à gauche (→) + De droite à gauche (←) Aucune mise à jour disponible Échec de la recherche de mise à jour Recherche de mises à jour… @@ -66,49 +66,49 @@ À propos Les mots de passe ne correspondent pas Répéter le mot de passe - Demander le mot de passe au démarrage de l\'appli + Demander le mot de passe au démarrage de Kotatsu Protéger l\'application Mot de passe erroné Entrez le mot de passe Ne pas vérifier - Vérifier les mises à jour pour les mangas + Rechercher les mises à jour La mise à jour des flux commencera bientôt Mettre à Jour Faire pivoter l\'écran - Flux de mises à jour effacé + Effacé Effacer le flux des mises à jour En attente du réseau… Taille : %s Nouvelle version : %s Connexes Résultats de la recherche - Ici, vous verrez les nouveaux chapitres du manga que vous lisez + Les nouveaux chapitres de ce que vous lisez sont présentés ici Mises à jour Lire plus tard - Cette catégorie est vide + Catégorie vide Tous les favoris Terminé Utiliser une connexion sécurisée (HTTPS) Autre stockage - Impossible de trouver un stockage disponible + Pas de stockage disponible Non disponible - Emplacement des téléchargements de mangas - Animation des pages - Mangas récents - Étagère à mangas - Vous pouvez l\'enregistrer à partir de sources en ligne ou l\'importer à partir d\'un fichier. - Vous n\'avez pas encore enregistré de manga - Vous pouvez trouver ce qu\'il faut lire dans le menu latéral. - Les mangas que vous lisez seront affichés ici + Dossier pour les téléchargements + Animation de page + Récents + Étagère + Enregistrez-le à partir de sources en ligne ou importez des fichiers. + Sauvegardez d\'abord quelque chose + Trouvez ce que vous voulez lire dans le menu latéral. + Ce que vous lisez sera affiché ici Essayez de reformuler la requête. - Vous pouvez utiliser des catégories pour organiser vos mangas préférés. Appuyez sur « + » pour créer une catégorie + Vous pouvez utiliser des catégories pour organiser vos favoris. Appuyez sur « + » pour créer une catégorie C\'est un peu vide ici… - Retirer la catégorie - Voulez-vous vraiment supprimer la catégorie « %s » de vos favoris \? + Retirer + Retirer la catégorie « %s » de vos favoris \? \nTous les mangas qu\'elle contient seront perdus. Renommer Catégories… - Catégories de favoris + Catégories favorites Vibration Indicateur lumineux Son de notification @@ -118,33 +118,32 @@ Télécharger Avertir des mises à jour des mangas que vous lisez Nouveaux chapitres - Activé %1$d sur %2$d + %1$d de %2$d activé(s) Notifications - Ce manga a %s. Voulez-vous l\'enregistrer en entier \? - Enregistrer le manga + Ce manga a %s. Tout sauvegarder \? + Enregistrer Ouvrir dans le navigateur - Afficher une notification si une mise à jour est disponible - Une mise à jour de l\'application est disponible - Vérifier les mises à jour automatiquement + Afficher une notification si une nouvelle version est disponible + Une nouvelle version de l\'application est disponible + Vérifier les nouvelles versions de l\'application Domaine Stockage externe Stockage interne Gestes uniquement - Historique des recherches effacé + Effacé Effacer l\'historique de recherche Vider le cache des miniatures Erreur Annulation… Ne plus demander - Cette opération peut consommer beaucoup de trafic réseau + Ceci peut transférer beaucoup de données Avertissement Continuer Boutons de volume - Appuis sur les bords + Appuis au bord Changer de pages Paramètres du lecteur - Voulez-vous vraiment supprimer « %s » de la mémoire locale de votre téléphone \? -\nCette opération ne peut pas être annulée. + Supprimer « %s » de l\'appareil de façon permanente \? Supprimer le manga Rechercher sur %s Taille de la grille @@ -153,23 +152,23 @@ Standard o|ko|Mo|Go|To Cache - Vider le cache des pages + Vider le cache de la page Historique et cache Aucune description - Fichier invalide. Seuls les fichiers ZIP et CBZ sont pris en charge. + Choisissez un fichier ZIP ou CBZ. Cette opération n\'est pas prise en charge Supprimer Importer Partager l\'image - Page sauvegardée avec succès + Sauvegardé Sauvegarder la page « %s » supprimé du stockage local « %s » retiré de l\'historique Retirer - Voulez-vous vraiment effacer tout votre historique de lecture \? Cette action ne peut pas être annulée. + Effacer définitivement l\'historique de lecture \? Effacer Pages - Automatique + Suivre le système Sombre Clair Thème @@ -177,15 +176,15 @@ Genre Ordre de tri Tous - Par évaluation + Évaluation Le plus récent Mis à jour Populaire - Par nom + Nom Téléchargements - Téléchargement terminé + Téléchargé Traitement… - Téléchargement de mangas… + Téléchargement… Rechercher un manga Rechercher Partager %s @@ -194,12 +193,12 @@ Enregistrer Entrez le nom de la catégorie Ajouter - Ajouter une nouvelle catégorie + Nouvelle catégorie Ajouter aux favoris - Vous n\'avez pas encore de favoris + Aucun favori pour le moment Ajouter un marque-page Lire - L\'historique est vide + Pas encore d\'historique Rien n\'a été trouvé Effacer l\'historique Réessayer @@ -214,22 +213,22 @@ Liste Chapitres Détails - Erreur de connexion au réseau + Impossible de se connecter à Internet Une erreur s\'est produite Historique Favoris Stockage local Ouvrir le menu Fermer le menu - Chapitre manquant - Ce chapitre est manquant sur votre appareil. Téléchargez-le ou lisez-le en ligne. - Il n\'y a actuellement aucun téléchargement actif + Le chapitre est manquant + Téléchargez ou lisez ce chapitre manquant en ligne. + Aucun téléchargement actif En file d\'attente - Si vous aimez cette application, vous pouvez aider financièrement par le biais de Yoomoney (Yandex.Money) + Si vous aimez cette application, vous pouvez envoyer de l\'argent via Yoomoney (ex. Yandex.Money) Soutenir le concepteur Licence Droits d\'auteur et licences - Ces gens font que Kotatsu s\'améliore ! + Ces personnes ont toutes rendu Kotatsu meilleur Remerciements Sujet sur 4PDA Remarques @@ -237,16 +236,18 @@ Traduction Traduire cette application Genres - Vous serez déconnecté·e de toutes les sources pour lesquelles vous avez une autorisation - L\'autorisation sur %s n\'est pas prise en charge - Autorisation complète + Vous serez déconnecté de toutes les sources + La connexion sur %s n\'est pas prise en charge + Autorisé Terminé En cours Format de la date Par défaut Exclure les mangas osés de l\'historique - Le nom ne doit pas être vide - Afficher les numéros de pages - Sources activées + Vous devez entrer un nom + Pages numérotées + Sources utilisées Sources disponibles + Thème dynamique + Applique un thème créé d\'après la palette de couleurs de votre fond d\'écran \ No newline at end of file diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml new file mode 100644 index 000000000..ea440b489 --- /dev/null +++ b/app/src/main/res/values-ja/strings.xml @@ -0,0 +1,164 @@ + + + 履歴 + ロード中… + チャプター %1$d of %2$d + 共有 + 履歴を削除 + 検索 + 漫画を検索 + 閉じる + お気に入り + エラーが発生しました + 詳細 + チャプター + リスト + 詳細リスト + グリッド + リストモード + リモートソース + 再試行 + 何も見つかりませんでした + まだ履歴はありません + 読む + お気に入りの本はありません + お気に入りの本 + 新たなカテゴリー + 追加 + 保存 + ショートカットを作成します… + 共有する%s + ダウンロード中… + 処理中… + ダウンロードした本 + ダウンロード + 名前 + 人気 + ローカルストレージ + 最新 + 評価 + 全て + ソート順に並べ替え + ジャンル + フォローシステム + クリア + すべての履歴を永久にクリアしますか? + 削除 + \"%s\"が履歴から削除されました + \"%s \"がローカルストレージから削除されました + 読み込みが完了するまでお待ちください… + ページを保存 + 保存しました + 画像を共有する + インポート + 消去 + この操作はサポートされていません + 説明がありません + 履歴とキャッシュ + ページのキャッシュをクリアする + B|kB|MB|GB|TB + 閉じる + 開く + 設定 + ライトテーマ + フィルター + ダークテーマ + ページ + テーマ + インターネットに接続出来ませんでした + ブックマークに追加 + カテゴリー名を入力してください + アップデート + キャッシュ + ZIPファイルまたはCBZファイルを選択してください。 + 標準 + ウェブトゥーン + 読み取りモード + グリッドのサイズ + %sで検索 + 漫画を削除 + お使いのデバイスから「%s」を完全に削除しますか? + リーダーの設定 + ページを変更 + エッジタップ + ボリュームボタン + 続ける + 警告 + これにより大量のデータが転送される可能性があります + 二度と表示しない + キャンセル… + エラー + サムネイルキャッシュをクリア + クリア + ジェスチャーのみ + 内部ストレージ + ドメイン + Kotatsuの新しい更新を確認 + 新しい更新が利用可能かどうか通知を表示 + ブラウザーで開く + この漫画には%sがあります。 すべて保存しますか? + 保存 + 通知 + %2$dの%1$d + 新しいチャプター + ダウンロード + 最初から読む + 再開 + 通知の設定 + 通知音 + LEDインジケータ + バイブレーション + お気に入りのカテゴリー + カテゴリー… + 名前を変更 + 削除 + クエリを再定式化してみてください。 + 読んだ内容がここに表示されます + サイドメニューで何を読むかを見つけてください。 + 最初に何かを保存する + 本棚 + 最近 + ページアニメーション + ダウンロード用のフォルダ + 利用出来ません + 使用可能なストレージがありません + その他のストレージ + 安全な(HTTPS)接続を使用する + 完了 + 全てのお気に入り + 後で読む + 更新 + あなたが読んでいるものの新しいチャプターがここに示されています + の検索結果 + 関連している本 + サイズ:%s + ネットワークに接続されていません… + 更新フィードをクリア + クリア + アップデート + フィードの更新はまもなく開始されます + 更新を探す + チェックしない + Kotatsuを起動したときにパスワードを入力する + パスワードを繰り返す + パスワードが違います + この本の詳細 + 現在のバージョン%s + 検索履歴をクリア + 外部ストレージ + Kotatsuの新しい更新が利用可能です + あなたが読んでいる漫画の更新について通知 + ここは空っぽです… + カテゴリーを使用してお気に入りを整理できます。 «+»を押してカテゴリーを作成出来ます + 空のカテゴリー + お気に入りから「%s」カテゴリーを削除しますか? +\nその中のすべての漫画は失われます。 + オンラインソースから保存するかファイルをインポートします。 + 新しいバージョン:%s + 画面を回転させる + アップデートを確認しています… + パスワードを入力してください + パスワードが間違っています + アプリを保護する + 最新のアップデートを確認する + \ No newline at end of file diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 7adf45958..ba9581b85 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -1,24 +1,24 @@ B|kB|MB|GB|TB - Finner ikke noen tilgjengelig lagring - Nedlastingssted - Du kan lagre fra nettbaserte kilder, eller importere filer. + Ingen tilgjengelig lagring + Mappe for nedlastninger + Lagre fra nettbaserte kilder, eller importer filer. Noen enheter endrer systemoppførselen, noe som kan ødelegge for bakgrunnsoppgaver. Fjern alle nylige søkespørringer for godt\? Skjul verktøylinje under rulling - Passord må være minst fire tegn + Passordet må være minst fire tegn Skriv inn passord å kreve for å starte programmet … og %1$d til - Autoriser visning av innholdet + Logg inn for å se dette innholdet Inverter - Sjekk etter nye kapitler + Sjekker etter nye kapitler… Tøm all oppdateringshistorikk for godt\? Tøm flyt Ser etter nye kapitler: %1$d av %2$d Valgt oppsett vil bli husket for denne filen Du kan opprette en sikkerhetskopi av din historikk og favoritter å gjenopprette senere - Data gjenopprettet, men med feil + Dataene ble gjenopprettet, men med feil Fant ikke filen Sikkerhetskopiering og gjenoppretting Behold ved oppstart @@ -27,46 +27,47 @@ Tilpass sentrum Skaleringsmodus Opprett feilrapport på GitHub - Du kan sette opp lesemodus for hver fil - Høyre-til-venstre ← - Foretrekk høyre-til-venstre -leser + Lesemodus kan settes opp for hver serie + Høyre-til-venstre (←) + Foretrekk høyre-til-venstre (→)-leser Ingen tilgjengelige oppdateringer Kunne ikke se etter oppdateringer Ser etter oppdateringer … Se etter oppdateringer - Passord ved programoppstart - Se etter leseoppdateringer + Spør om passord ved programoppstart + Se etter oppdateringer Flytoppdatering starter snart Oppdater Tømt Tøm oppdateringsflyt - Venter på nettverkstilknytning … + Venter på nettverk … Ny versjon: %s - Her kan du se nye kapitler av det du leser + Nye kapitler av det du leser vises her Oppdatering Bruk sikker (HTTPS)-tilkobling Annen lagring Hylle - Du har ikke lagret noe enda. - Du kan finne ting å lese i sidemenyen. + Lagre noe først + Finn lesestoff i sidemenyen. Det du leser vil vises her Prøv å reformulere spørringen. - Bruk kategorier til å organisere mapper. Trykk «+» for å opprette en kategori. + Du kan bruke kategorier til å organisere mapper. Trykk «+» for å opprette en kategori Det er ganske tomt her … - Fjern «%s»-kategorien fra favoritter og alt i den\? + Fjern «%s»-kategorien fra favorittene\? +\nAlle mangaer i den vil bli tapt. Programomstart Gi merknad om oppdateringer av det du leser - Skrudde på %1$d av %2$d - Denne managaen har %s. Ønsker du å lagre hele\? - Åpne i filutforsker - Vis merknad hvis ny versjon er tilgjengelig - Ny programversjon tilgjengelig - Se etter oppdateringer automatisk - Søkehistorikk tømt + %1$d av %2$d påskrudd + Denne mangaen har %s. Lagre hele\? + Åpne i nettleser + Vis merknad hvis en ny versjon er tilgjengelig + En ny versjon av programmet er tilgjengelig + Se etter nye versjoner av programmet + Tømt Tøm miniatyrbildehurtiglager - Kan laste ned mye data - Trykk på kanter - Slett «%s» fra enhetsminne for godt\? + Dette kan overføre mye data + Kanttrykk + Slett «%s» fra enheten for godt\? Nettserie Forvalg Hurtiglager @@ -76,7 +77,7 @@ Ustøttet handling Importer Lagret - Vent på at innlastingen fullføres + Vent på at innlastingen fullføres… Fjern all lesehistorikk for godt\? Les Resultatløst @@ -90,9 +91,9 @@ Kun søk på %s Bekreft Neste - Forvalg: %s + Standard: %s Logg inn - Alle kaker ble fjernet + Alle cookies ble fjernet Tøm kaker Løs CAPTCHA kreves @@ -103,19 +104,19 @@ Lenge siden I går Akkurat nå - All data gjenopprettet + All data ble gjenopprettet Forbereder … Data gjenopprettet Gjenopprett fra sikkerhetskopi Opprett sikkerhetskopi Omstart kreves - Nyttig for AMOLED-skjermer - Nattsvart drakt + Bruker mindre strøm på AMOLED-skjermer + Svart Ny kategori Versjon %s Om Passordene samsvarer ikke - Gjenta passord + Gjenta passordet Beskytt programmet Feil passord Skriv inn passord @@ -125,17 +126,17 @@ Relatert Søkeresultater Les senere - Denne kategorien er tom + Tom kategori Alle favoritter Ferdig Ikke tilgjengelig Sideanimasjon - Nylig manga - Fjern kategori + Nylig + Fjern Gi nytt navn Kategorier … Favorittkategorier - Lysindikator + LED-indikator Vibrasjon Merknadslyd Merknadsinnstillinger @@ -143,7 +144,7 @@ Last ned Nye kapittel Merknader - Lagre manga + Lagre Domene Eksternlagring Internlagring @@ -170,7 +171,7 @@ Fjern Tøm Sider - Automatisk + Følg systemet Mørk Lys Navn @@ -186,7 +187,7 @@ Nedlastinger Nedlastet Behandler … - Laster ned manga … + Laster ned … Søk manga Søk Del %s @@ -195,11 +196,11 @@ Lagre Skriv inn kategorinavn Legg til - Legg til ny kategori - Legg til i favoritter - Du har ingen favoritter enda. + Ny kategori + Favorittmerk dette + Ingen favoritter enda Legg til bokmerke - Historikken er tom + Ingen historikk enda Tøm historikk Prøv igjen Lukk @@ -212,16 +213,16 @@ Liste Kapittel Detaljer - Nettverktilkoblingsfeil + Kunne ikke koble til Internet En feil inntraff Historikk Favoritter Lokallagring Åpne meny Lukk meny - Dette kapitlet mangler på din enhet. Last det ned eller les det på nett. - Kapittel mangler - Det er ingen aktive nedlastinger + Last ned eller les dette manglende kapittelet på nett. + Kapittelet mangler + Ingen aktive nedlastinger I kø Fullført Pågående @@ -233,18 +234,20 @@ Støtt utvikleren Hvis du liker programmet kan du kronerulle det på Yoomoney (tidligere Yandex.Money) Takk rettes til - Folk som gjorde Kotatsu enda bedre. + Folk som gjorde Kotatsu enda bedre Opphavsrett og lisenser Lisens - Identitetsbekreftelse fullført - Identitetsbekreftelse på %s støttes ikke - Du vil bli utlogget fra alle kilder du pålogget i + Identitetsbekreftet + Innlogging på %s støttes ikke + Du vil bli utlogget fra alle kilder Sjangere Utelat NSFW-manga fra historikk Datoformat Forvalg - Navn må angis + Du må angi ett navn Tilgjengelige kilder - Vis sidenummerering - Påskrudde kilder + Sidenummerering + Brukte kilder + Dynamisk tema + Bruker et tema basert på fargene til bakgrunnen din \ No newline at end of file diff --git a/app/src/main/res/values-ota/strings.xml b/app/src/main/res/values-ota/strings.xml new file mode 100644 index 000000000..a6b3daec9 --- /dev/null +++ b/app/src/main/res/values-ota/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 17fe50b16..cb4231b57 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -3,8 +3,8 @@ Abrir menu Armazenamento local Favoritos - Ocorreu um erro - Erro de conexão de rede + Um erro ocorreu + Não foi possível conectar à Internet Detalhes Lista Lista detalhada @@ -16,11 +16,11 @@ Tente novamente Limpar histórico Nada encontrado - Histórico vazio - Add marca páginas - Você não tem favoritos ainda - Adicionar aos favoritos - Add + Sem histórico ainda + Adicionar marca páginas + Ainda não há favoritos + Favoritar isso + Adicionar Nomeie a categoria Salvar Compartilhar @@ -28,62 +28,62 @@ Compartilhar %s Pesquisar Pesquisar mangá - Baixando mangá… - Download completo + Baixando… + Baixado Downloads - Por nome + Nome Populares - Por avaliação + Avaliação Todos Ordem de classificação Gênero Filtro Escuro - Automático + Siga o sistema Páginas Limpar - Você realmente quer limpar todo o seu histórico de leitura\? Essa ação não pode ser desfeita. + Limpar todo o histórico de leitura permanentemente\? Remover \"%s\" removido do histórico \"%s\" deletado do armazenamento local - Aguarde o carregamento para finalizar + Aguarde o carregamento terminar… Salvar página - Página salva com sucesso + Salvou Compartilhar imagem Importar Utualizado Deletar Essa operação não é suportada Histórico e cache - Limpar cache de páginas + Limpar cache de página Cache B|kB|MB|GB|TB Padrão Webtoon Modo leitura - Tamanho de grade + Tamanho da grade Pesquisar em %s Deletar mangá Configurações de leitura Mudar páginas - Cliques na borda + Toques de borda Botões de volume - Essa operação pode consumir muito tráfego de rede + Isso pode transferir muitos dados Não pergunte novamente Cancelando… Erro Limpar cache de thumbnails - Histórico de pesquisa limpo + Limpo Apenas gestos Armazenamento interno Armazenamento externo Domínio - Verificar automaticamente se há actualizações - Actualização da aplicação está disponível - Mostrar notificação se a actualização estiver disponível - Aberto no navegador - Esta manga tem %s. Quer salvar tudo isto\? - Salvar mangá + Verifique se há novas versões do aplicativo + Uma nova versão do aplicativo está disponível + Mostrar notificação se uma nova versão estiver disponível + Abrir no navegador da web + Este mangá tem %s. Salvar tudo isso\? + Salve Notificações Novos capítulos Notifique sobre atualizações do mangá que está lendo @@ -91,11 +91,11 @@ Ler desde o início Reiniciar Configurações das notificações - Indicador luminoso + Indicador LED Fechar menu Fontes remotas Fechar - Brilho + Claro Histórico Ler Processando… @@ -104,54 +104,53 @@ Sem descrição Continuar Capítulos - Add nova categoria + Nova categoria Aviso - Você realmente quer deletar \"%s\" do armazenamento local de seu celular\? -\nEssa operação não pode ser desfeita. - Arquivo inválido. Apenas ZIP e CBZ são suportados. + Excluir \"%s\" do dispositivo permanentemente\? + Escolha um arquivo ZIP ou CBZ. Limpar histórico de pesquisa - Activado %1$d de %2$d + Ativado %1$d de %2$d Som de notificação - Mostrar números de páginas + Páginas numeradas Concluído - em andamento + Em andamento Categorias… Renomear - Remover categoria + Remover Está meio vazio aqui… - Prateleira de manga + Estante Feito Relacionado Manter no início Limpar feed de atualizações - Feed de atualizações limpo + Limpo Atualizar A atualização do feed começará em breve - Confira as atualizações do mangá + Procure atualizações Não verifique Digite a senha Senha incorreta Repita a senha - As senhas não coincidem + Senhas incompatíveis Cerca de Versão %s Verifique se há atualizações Verificando atualizações… Nenhuma atualização disponível - Direita para esquerda + Da direita para a esquerda (←) Nova categoria Criar problema no GitHub Modo de escala Centro de ajuste Ajustar à largura É necessário reiniciar - Restauração de backup + Backup e restauração Criar backup de dados Restaurar do backup - Dados restaurados + Restaurado Preparando… Arquivo não encontrado - Todos os dados restaurados com sucesso + Todos os dados foram restaurados Os dados foram restaurados, mas há erros Agora mesmo Ontem @@ -160,13 +159,13 @@ Hoje Toque para tentar novamente Silencioso - O CAPTCHA é obrigatório + CAPTCHA obrigatório Resolver Todos os cookies foram removidos Verificando novos capítulos: %1$d de %2$d Limpar feed - Todo o histórico de atualizações será apagado e esta ação não poderá ser desfeita. Tem certeza\? - Verificação de novos capítulos + Limpar todo o histórico de atualizações permanentemente\? + Em busca de novos capítulos… Reverter Entrar Padrão: %s @@ -174,10 +173,10 @@ Próximo Digite a senha que será necessária quando o aplicativo for iniciado Confirme - A senha deve ter pelo menos 4 caracteres + A senha deve ter 4 caracteres ou mais Descrição - Cópias de segurança salvas com sucesso - Alguns fabricantes podem alterar o comportamento do sistema, o que pode quebrar as tarefas de fundo. + Backup salvo + Alguns dispositivos têm um comportamento de sistema diferente, o que pode interromper as tarefas em segundo plano. Leia mais Ocultar a barra de ferramentas ao rolar Pesquise apenas em %s @@ -185,68 +184,70 @@ Línguas Bem vindo Fontes disponíveis - Fontes ativadas + Fontes usadas Enfileirado - No momento, não há downloads ativos - O nome não deve estar vazio + Nenhum download ativo + Você deve inserir um nome Traduzir esta aplicação Autor Comentar Tópico no 4PDA Apoiar o desenvolvedor - Se gostar desta aplicação, pode ajudar financeiramente através de Yoomoney (ex. Yandex.Money) - agradecimento - Estas pessoas fazem o Kotatsu tornar-se melhor! + Se você gosta deste aplicativo, você pode enviar dinheiro através do Yoomoney (ex. Yandex.Money) + Agradecimentos + Todas essas pessoas tornaram o Kotatsu melhor Direitos de autor e licenças Licença - Este capítulo está em falta no seu dispositivo. Descarregue ou leia-o online. - Falta um capítulo - Autorização completa - A autorização em %s não é suportada + Baixe ou leia este capítulo perdido online. + O capítulo está em falta + Autorizado + O login em %s não é suportado Géneros Tradução - Será desconectado de todas as fontes em que estiver autorizado + Você será desconectado de todas as fontes Vibração - Não é possível encontrar nenhum armazenamento disponível + Sem armazenamento disponível Categorias favoritas - Quer realmente remover a categoria \"%s\" dos seus favoritos\? -\nSerá perdido todos os mangas contidos. - Pode encontrar o que ler no menu lateral. - Pode salvá-lo a partir de fontes online ou importá-lo a partir de ficheiro. - Manga recente + Remover a categoria \"%s\" dos seus favoritos\? +\nTodos os mangás nela serão perdidos.. + Encontre o que ler no menu lateral. + Salve-o de fontes online ou importe arquivos. + Recente Outro armazenamento Tente reformular a consulta. - Prefira o leitor da direita para a esquerda + Prefira o leitor da direita para a esquerda (→) Não disponível Tamanho: %s - Mangá que está a ler será afixada aqui - Ainda não tem nenhuma mangá salvo - Animação de páginas - Esta categoria está vazia + O que você ler será exibido aqui + Salve algo primeiro + Animação de página + Categoria vazia Leia mais tarde - atualizações + Atualizações Todos os favoritos À espera de rede… - Utilizar ligação segura (HTTPS) + Usar conexão segura (HTTPS) Resultados da pesquisa - Aqui verá os novos capítulos do mangá que está a ler + Novos capítulos do que você está lendo são mostrados aqui Nova versão: %s Girar a tela - Falha na verificação de atualização - Proteger aplicativo - Pedir senha no início do aplicativo + Não foi possível procurar atualizações + Proteja o aplicativo + Peça a senha ao iniciar o Kotatsu Ajustar à altura - Tema Black dark - Útil para telas AMOLED + Escuro + Usa menos energia em telas AMOLED A configuração escolhida será lembrada para este mangá Você pode criar backup de seu histórico e favoritos e restaurá-lo Limpar cookies - Você realmente deseja remover todas as consultas de pesquisa recentes\? Essa ação não pode ser desfeita. - Você deve autorizar a visualização deste conteúdo - Pode usar categorias para organizar seu mangá favorito. Pressione <<+>> para criar uma categoria - Você pode configurar o modo de leitura para cada mangá separadamente - Local onde serão armazenados os mangás baixados - Excluir manga NSFW da história + Remover todas as consultas de pesquisa recentes permanentemente\? + Faça login para ver este conteúdo + Você pode usar categorias para organizar seus favoritos. Pressione «+» para criar uma categoria + O modo de leitura pode ser configurado separadamente para cada série + Pasta para downloads + Excluir mangá NSFW do histórico Formato da data Padrão + Tema dinâmico + Aplica um tema criado no esquema de cores do seu papel de parede \ 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 index d96032d40..c15cb6480 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -6,7 +6,7 @@ Избранное История Произошла ошибка - Ошибка сетевого подключения + Не удалось подключиться к Интернету Подробности Главы Список @@ -21,12 +21,12 @@ Повторить Очистить историю Ничего не найдено - История пуста + Истории еще нет Читать Добавить закладку - Добавьте интересующую Вас мангу в избранное, чтобы не потерять её + Избранного пока нет В избранное - Создать категорию + Новая категория Добавить Введите название Сохранить @@ -35,37 +35,37 @@ Поделиться %s Поиск Поиск манги - Загрузка манги… + Загрузка… Обработка… - Загрузка завершена + Загружено Загрузки - По имени + Имя Популярная Обновлённая Новая - По рейтингу + Рейтинг Все - Сортировка + Порядок сортировки Жанр Фильтр Тема Светлая Тёмная - Автоматически + Следовать системе Страницы Очистить - Вы уверены, что хотите очистить историю? Это действие нельзя будет отменить. + Очистить всю историю чтения полностью\? Удалить «%s» удалено из истории «%s» удалено с устройства - Дождитесь окончания загрузки + Дождитесь завершения загрузки… Сохранить страницу - Страница сохранена + Сохранено Поделиться изображением Импорт Удалить Операция не поддерживается - Неподдерживаемый файл. Поддерживаются только ZIP и CBZ. + Выберите ZIP-файл, либо файл CBZ. Нет описания История и кэш Очистить кэш страниц @@ -77,31 +77,30 @@ Размер таблицы Поиск по %s Удалить мангу - Вы уверены, что хотите удалить «%s» с устройства\? -\nЭто действие нельзя будет отменить. + Удалить \"%s\" с устройства навсегда\? Настройки чтения Листание страниц Нажатия по краям Кнопки громкости Продолжить Предупреждение - Данная операция может привести к большому расходу траффика + Это может привести к расходу большого количества трафика Больше не спрашивать Отмена… Ошибка Очистить кэш миниатюр Очистить историю поиска - История поиска очищена + Очищено Только жесты Внутренний накопитель Внешнее хранилище Домен - Проверять обновление приложения - Доступно обновление приложения - Показывать уведомление при наличии новой версии - Открыть в браузере - В этой манге %s. Вы уверены, что хотите сохранить их все? - Сохранить мангу + Проверять наличие новых версий приложения + Доступна новая версия приложения + Показывать уведомление, если доступна новая версия + Открыть в веб-браузере + В этой манге %s. Сохранить их все\? + Сохранить Уведомления Включено %1$d из %2$d Новые главы @@ -111,79 +110,79 @@ Перезапустить Настройки уведомлений Звук уведомления - Световая индикация + Светодиодная индикация Вибросигнал Категории избранного Категории… Переименовать - Вы уверены, что хотите удалить категорию «%s»\? -\nВся манга из данной категории будет утеряна. - Удалить категорию + Удалить категорию \"%s\" из избранного\? +\nВся манга в ней будет потеряна. + Удалить Как-то здесь пусто… Попробуйте переформулировать запрос. - Категории помогают упорядочивать избранную мангу. Нажмите «+», чтобы создать категорию - Здесь будет отображаться манга, которую Вы читаете - Вы можете найти, что почитать, в боковом меню. - У Вас пока нет сохранённой манги - Вы можете сохранить мангу из онлайн каталога или импортировать из файла. - Полка с мангой - Недавняя манга + Вы можете использовать категории для организации своих избранных. Нажмите «+», чтобы создать категорию + То, что вы прочитаете, будет отображено здесь + Найдите, что почитать, в боковом меню. + Сохраните что-нибудь + Сохраните что-нибудь из онлайн-каталога или импортируйте из файла. + Полка + Недавнее Анимация листания - Место сохранения манги + Папка для загрузок Недоступно - Не удалось найти ни одного доступного хранилища + Нет доступного хранилища Другое хранилище - Защищённое соединение (HTTPS) + Использовать безопасное (HTTPS) соединение Готово Всё избранное - В этой категории ничего нет + Категория пуста Прочитать позже Обновления - Здесь будут отображаться обновления манги, которую Вы читаете + Новые главы из того, что вы читаете, будут показаны здесь Результаты поиска Похожие Новая версия: %s Размер: %s Ожидание подключения… Очистить ленту обновлений - Лента обновлений очищена + Очищено Повернуть экран Обновить Обновление скоро начнётся - Проверять обновления манги + Следить за обновлениями Не проверять Введите пароль Неверный пароль Защитить приложение - Запрашивать пароль при запуске приложения + Запрашивать пароль при запуске Kotatsu Повторите пароль Пароли не совпадают О программе Версия %s Проверить обновления Проверка обновления… - Ошибка при проверке обновления + Не удалось проверить обновления Нет доступных обновлений - Справа налево - Предпочитать режим Справа налево - Вы можете настроить режим чтения для каждой манги отдельно + Справа налево (←) + Предпочитать читать справа налево (←) + Режим чтения может быть настроен отдельно для каждой серии Создать категорию Масштабирование Вписать в экран Подогнать по высоте Подогнать по ширине Исходный размер - Чёрная тёмная тема - Полезно для AMOLED экранов + Чёрная + Потребляет меньше энергии на экранах AMOLED Требуется перезапуск Резервное копирование и восстановление Создать резервную копию Восстановить данные - Данные восстановлены + Восстановлено Подготовка… Файл не найден - Все данные успешно восстановлены - Данные восстановлены, но возникли некоторые ошибки + Все данные были восстановлены + Данные были восстановлены, но возникли некоторые ошибки Вы можете создать резервную копию избранного и истории и потом восстановить их Только что Вчера @@ -196,34 +195,34 @@ Необходимо пройти CAPTCHA Пройти Очистить куки - Все куки удалены + Все файлы cookie были удалены Проверка новых глав: %1$d из %2$d Очистить ленту - Вся история обновлений будет очищена и её нельзя будет вернуть. Вы уверены? - Проверка новых глав + Удалить всю историю обновлений навсегда\? + Проверка новых глав… В обратном порядке Войти - Для просмотра этого контента требуется авторизация + Авторизуйтесь, чтобы просмотреть этот контент По умолчанию: %s …и ещё %1$d Далее - Введите пароль, который вам понадобится при запуске приложения + Введите пароль для запуска приложения Подтвердить - Пароль должен содержать не менее 4 символов + Пароль должен состоять из 4 символов или более Прятать заголовок при прокрутке Поиск только по %s Другие Описание Языки Добро пожаловать - Вы действительно хотите удалить все недавние поисковые запросы? Это действие не может быть отменено. - Резервная копия успешно сохранена - Некоторые производители могут изменять поведение системы, нарушая работу фоновых задач. + Удалить все последние поисковые запросы навсегда\? + Резервная копия сохранена + Некоторые устройства имеют различное поведение системы, что может привести к нарушению фоновых задач. Подробнее В очереди - На данный момент нет активных загрузок + Нет активных загрузок Глава отсутствует - Эта глава отсутствует на вашем устройстве. Загрузите её или читайте онлайн. + Скачайте или прочитайте эту недостающую главу онлайн. Помочь с переводом приложения Перевод Автор @@ -232,20 +231,20 @@ Поддержать разработчика Если вам нравится это приложение, вы можете помочь финансово с помощью ЮMoney (бывш. Яндекс.Деньги) Благодарности - Эти люди помогают Kotatsu стать лучше! + Все эти люди сделали Kotatsu лучше Авторские права и лицензии Лицензия Авторизация выполнена - Авторизация в %s не поддерживается - Вы выйдете из всех источников, в которых Вы авторизованы + Вход в %s не поддерживается + Вы выйдете из всех источников Жанры Завершено Онгоинг Формат даты По умолчанию Исключить NSFW мангу из истории - Имя не может быть пустым - Показывать номера страниц + Вы должны ввести имя + Пронумерованные страницы Включенные источники Доступные источники Динамическая тема diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml new file mode 100644 index 000000000..1c4cd45dc --- /dev/null +++ b/app/src/main/res/values-tr/strings.xml @@ -0,0 +1,60 @@ + + + İnternete bağlı olduğunuzdan emin olunuz + Menüyü kapat + Menüyü aç + Dahili Depolama + Favoriler + Geçmiş + Bölümler + Liste + Detaylı liste + Izgara + Liste modu + Yükleniyor… + Kapat + Tekrar dene + Geçmişi temizle + Hiçbir şey bulunamadı + Sen geçmişiniz yok + Oku + Favorilere ekle + Henüz favorileriniz yok + Favoriniz + Yeni kategori + Ekle + Kategori ismi girin + Kaydet + Paylaş + %s Paylaş + Ara + Manga ara + İndiriliyor… + İşleniyor… + İndirildi + İndirilenler + İsim + Güncellenme + Yeniler + Puanlama + Hepsi + Tür + Litre + Tema + Açık + Koyu + Takip sistemi + Sayfalar + Temizle + Tüm okuma geçmişi kalıcı olarak silinsin mi\? + Kaldır + \"%s\" geçmişinden kaldırıldı + \"%s\" yerel depolama alanından sil + Lütfen bitmesini bekleyin… + Sayfayı kaydet + Resmi paylaş + Popüler + Detaylar + Ayarlar + Kaydet + \ 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 4ef71fe27..bbdd6db5a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -104,7 +104,7 @@ This manga has %s. Save all of it? Save Notifications - Turned on %1$d of %2$d + %1$d of %2$d on New chapters Notify about updates of manga you are reading Download From bd11827d8b805d2076bd6b40a55804254529bc2b Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 22 Feb 2022 17:57:16 +0000 Subject: [PATCH 36/70] Translated using Weblate (Belarusian) Currently translated at 66.5% (167 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/be/ --- app/src/main/res/values-be/strings.xml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index d3a8dc06f..0b8d3bb5b 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -54,7 +54,7 @@ Аўтаматычна Старонкi Ачысціць - Вы ўпэўненыя, што жадаеце ачысціць гісторыю? Гэта дзеянне нельга будзе адмяніць. + Вы ўпэўненыя, што жадаеце ачысціць гісторыю\? Гэта дзеянне нельга будзе адмяніць. Выдаліць \"%s\" выдалена з гiсторыi \"%s\" выдалена з прылады @@ -100,7 +100,7 @@ Даступна абнаўленне праграмы Паказваць апавяшчэнне пры наяўнасці новай версіі Адкрыць у браўзеры - У гэтай манге %s. Вы ўпэўненыя, што хочаце захаваць іх усё? + У гэтай манге %s. Вы ўпэўненыя, што хочаце захаваць іх усё\? Захаваць мангу Паведамленні Уключана %1$d з %2$d @@ -194,7 +194,7 @@ Усе кукi выдалены Праверка новых частак: %1$d з %2$d Ачысціць стужку - Уся гісторыя абнаўленняў будзе ачышчана і яе нельга будзе вярнуць. Вы ўпэўненыя? + Уся гісторыя абнаўленняў будзе ачышчана і яе нельга будзе вярнуць. Вы ўпэўненыя\? Праверка новых глаў У адваротным парадку Увайсці @@ -251,4 +251,6 @@ Даступныя крыніцы Дынамічная тэма Ужывае тэму праграмы, заснаваную на каляровай палітры шпалер на прыладзе + + \ No newline at end of file From 9881f9031fd4442595cfaeb16ff7ff3458ef8c32 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 22 Feb 2022 17:57:18 +0000 Subject: [PATCH 37/70] Translated using Weblate (Spanish) Currently translated at 86.0% (216 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/es/ --- app/src/main/res/values-es/strings.xml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 716046843..c89c663a3 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -54,7 +54,7 @@ De acuerdo al sistema Páginas Borrar - ¿Realmente quieres borrar todo tu historial de lectura? Esta acción no se puede deshacer. + ¿Realmente quieres borrar todo tu historial de lectura\? Esta acción no se puede deshacer. Eliminar «%s» retirado del historial «%s» borrado del almacenamiento local @@ -99,7 +99,7 @@ Una nueva versión de la aplicación está disponible Mostrar notificación si una nueva versión está disponible Abrir en navegador web - Este manga tiene %s. ¿Quieres guardarlo todo? + Este manga tiene %s. ¿Quieres guardarlo todo\? Guardar Notificaciones Activado %1$d de %2$d @@ -170,7 +170,7 @@ Tema oscuro auténtico Útil para pantallas AMOLED Se requiere reinicio - + Respaldo y restauración Crear copia de seguridad de datos Restaurar desde la copia de seguridad Datos restaurados @@ -193,7 +193,7 @@ Se han eliminado todas las cookies Buscando nuevos capítulos: %1$d de %2$d Limpiar feed - Todo el historial de actualizaciones se borrará y esta acción no se puede deshacer. ¿Está seguro? + Todo el historial de actualizaciones se borrará y esta acción no se puede deshacer. ¿Está seguro\? Comprobación de nuevos capítulos Invertir Iniciar sesión @@ -250,4 +250,6 @@ Fuentes disponibles Tema dinámico Aplica un tema creado a partir del esquema de colores de su fondo de pantalla + + \ No newline at end of file From c53d7f953dc7d73ae04c8c37cb44a8f989ede1ed Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 22 Feb 2022 17:57:20 +0000 Subject: [PATCH 38/70] Translated using Weblate (Russian) Currently translated at 99.2% (249 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/ru/ --- app/src/main/res/values-ru/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index c15cb6480..7df2c0413 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -249,4 +249,7 @@ Доступные источники Динамическая тема Применяет тему приложения, основанную на цветовой палитре обоев на устройстве + + + \ No newline at end of file From fa8ae112adaff3b6547a4cd81ee20b250fd77836 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 22 Feb 2022 17:57:23 +0000 Subject: [PATCH 39/70] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegian?= =?UTF-8?q?=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 93.2% (234 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/nb_NO/ --- app/src/main/res/values-nb-rNO/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index ba9581b85..0a93e4a83 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -250,4 +250,6 @@ Brukte kilder Dynamisk tema Bruker et tema basert på fargene til bakgrunnen din + + \ No newline at end of file From 120f45a6c512187216fdea7b892e9ec1cc9ed836 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 22 Feb 2022 17:57:24 +0000 Subject: [PATCH 40/70] Translated using Weblate (German) Currently translated at 74.5% (187 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/de/ --- app/src/main/res/values-de/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index f9ee4484c..618e4666e 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -250,4 +250,6 @@ Verfügbare Quellen Dynamisches Thema Wendet ein Thema an, das auf dem Farbschema Ihres Hintergrundbildes basiert + + \ No newline at end of file From 25ebde1f0abbf7f451ab928b129ecf402d4779c0 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 22 Feb 2022 17:57:25 +0000 Subject: [PATCH 41/70] Translated using Weblate (Italian) Currently translated at 65.7% (165 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/it/ --- app/src/main/res/values-it/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 51c82d27e..5e6546ba6 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -249,4 +249,8 @@ Mostra i numeri delle pagine Fonti abilitate Fonti disponibili + + + + \ No newline at end of file From f24aa5af0605b99981ed23bfb1b851277b6c8926 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 22 Feb 2022 17:57:26 +0000 Subject: [PATCH 42/70] Translated using Weblate (Portuguese) Currently translated at 99.6% (250 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/pt/ --- app/src/main/res/values-pt/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index cb4231b57..deeccb1e1 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -250,4 +250,6 @@ Padrão Tema dinâmico Aplica um tema criado no esquema de cores do seu papel de parede + + \ No newline at end of file From e5e45fa40f8b7a141790223795b2668b00a90d2b Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 22 Feb 2022 17:57:27 +0000 Subject: [PATCH 43/70] Translated using Weblate (French) Currently translated at 100.0% (251 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fr/ --- app/src/main/res/values-fr/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index c82b662cf..3be71f35d 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -250,4 +250,6 @@ Sources disponibles Thème dynamique Applique un thème créé d\'après la palette de couleurs de votre fond d\'écran + + \ No newline at end of file From 35e782884d14fae77dac139d91d23be48a793bd3 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 22 Feb 2022 17:57:28 +0000 Subject: [PATCH 44/70] Translated using Weblate (Sinhala) Currently translated at 3.1% (8 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/si/ --- app/src/main/res/values-si/strings.xml | 246 ++++++++++++++++++++++++- 1 file changed, 245 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml index a14534dae..a902e6c64 100644 --- a/app/src/main/res/values-si/strings.xml +++ b/app/src/main/res/values-si/strings.xml @@ -1,5 +1,5 @@ - + පූරණය වෙමින්… සැකසුම් පරිච්ඡේද @@ -7,4 +7,248 @@ දෝෂයක් සිදුවී ඇත ඉතිහාසය ප්‍රියතමයන් + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 246e3ee7d670f4f0a4560453cace3cde9b1c15e3 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 22 Feb 2022 17:57:31 +0000 Subject: [PATCH 45/70] Translated using Weblate (Finnish) Currently translated at 65.3% (164 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fi/ --- app/src/main/res/values-fi/strings.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index bd32b7d04..6aff3bed9 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -246,4 +246,11 @@ Oletus Nimi ei saa olla tyhjä Sulje NSFW-mangat pois historiasta + + + + + + + \ No newline at end of file From 1cb5e8134e6490ce24bc6898b535f721ef5052be Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 22 Feb 2022 17:57:32 +0000 Subject: [PATCH 46/70] Translated using Weblate (Arabic) Currently translated at 0.7% (2 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/ar/ --- app/src/main/res/values-ar/strings.xml | 254 ++++++++++++++++++++++++- 1 file changed, 253 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index a6b3daec9..2780e73ce 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -1,2 +1,254 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From e8e1ab663770a2c9140f2263d9fe83d7b62bf5f5 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 22 Feb 2022 17:57:36 +0000 Subject: [PATCH 47/70] Translated using Weblate (Persian) Currently translated at 2.7% (7 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fa/ --- app/src/main/res/values-fa/strings.xml | 246 ++++++++++++++++++++++++- 1 file changed, 245 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 54bac4ed8..725ddf0d7 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -1,5 +1,5 @@ - + بستن منو بازکردن منو محل ذخیره سازی @@ -7,4 +7,248 @@ تاریخچه خطایی رخ داده است خطای اتصال به شبکه + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 0797f1809adad046ac8715816605659ac2e1007d Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 22 Feb 2022 17:57:40 +0000 Subject: [PATCH 48/70] Translated using Weblate (Turkish) Currently translated at 23.5% (59 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/tr/ --- app/src/main/res/values-tr/strings.xml | 196 ++++++++++++++++++++++++- 1 file changed, 195 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 1c4cd45dc..465ba3207 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -1,5 +1,5 @@ - + İnternete bağlı olduğunuzdan emin olunuz Menüyü kapat Menüyü aç @@ -57,4 +57,198 @@ Detaylar Ayarlar Kaydet + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From cfb4c8d66aaf2e3750f7f2764598f25a8286e8cb Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 22 Feb 2022 17:57:43 +0000 Subject: [PATCH 49/70] Translated using Weblate (Turkish (Ottoman)) Currently translated at 0.7% (2 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/ota/ --- app/src/main/res/values-ota/strings.xml | 254 +++++++++++++++++++++++- 1 file changed, 253 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-ota/strings.xml b/app/src/main/res/values-ota/strings.xml index a6b3daec9..599893cd8 100644 --- a/app/src/main/res/values-ota/strings.xml +++ b/app/src/main/res/values-ota/strings.xml @@ -1,2 +1,254 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 33b2ec7ab1131e9257f8cd1c1285984ba3ef32ac Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 22 Feb 2022 17:57:47 +0000 Subject: [PATCH 50/70] Translated using Weblate (Japanese) Currently translated at 64.5% (162 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/ja/ --- app/src/main/res/values-ja/strings.xml | 91 ++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index ea440b489..1a5f1722c 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -161,4 +161,95 @@ パスワードが間違っています アプリを保護する 最新のアップデートを確認する + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From db6a53de84cd9e44961f8a8c98835972253152c3 Mon Sep 17 00:00:00 2001 From: kuragehime Date: Wed, 23 Feb 2022 11:02:44 +0000 Subject: [PATCH 51/70] Translated using Weblate (Japanese) Currently translated at 100.0% (251 of 251 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/ja/ --- app/src/main/res/values-ja/strings.xml | 182 ++++++++++++------------- 1 file changed, 91 insertions(+), 91 deletions(-) diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 1a5f1722c..d41cb1861 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -161,95 +161,95 @@ パスワードが間違っています アプリを保護する 最新のアップデートを確認する - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + アップデートを見つける事が出来ませんでした + 利用可能なアップデートはありません + 右から左(←) + 右から左(→)の読書を好む + フィードバック + 4PDAに関する話題 + 開発者をサポートします(Yoomoneyが開きます) + このアプリが気に入ったら、Yoomoney(Yandex.Moneyなど)からサポートできます + ライセンス + 承認済み + %sへのログインはサポートされていません + 完成 + 進行中 + デフォルト + ナンバリングページ + 使用したソース + 利用可能なソース + ダイナミックなテーマ + 壁紙の配色に合わせて作成したテーマを適用する + 新しいチャプターの確認:%1$dの%2$d + 新しいカテゴリー + 高さを合わせる + スクロール時にツールバーを非表示にする + チャプターがありません + すべての更新履歴を完全に消去しますか? + この不足した章をダウンロードしたり、オンラインで読んだりすることができます。 + このコンテンツを表示するにはサインインしてください + ファイルが見つかりません + パスワードは4文字以上である必要があります + ちょうど今 + ずっと前 + バックアップを保存 + グループ + フィードをクリア + バックアップから復元 + 確認 + 履歴とお気に入りのバックアップを作成して復元できます + %sでのみ検索 + 続きを読む + ...そして%1$dさらに + ブラック + その他 + データは復元されましたがエラーが発生しました + 最近の検索クエリを全て完全に削除しますか? + 幅を合わせる + 新しいチャプターを探しています… + 言語 + アプリを起動するためのパスワードを入力してください + データバックアップを作成 + 解決しました + タップして再試行してください + CAPTCHAが必要です + デフォルト:%s + 昨日 + 翻訳 + 全てのデータが復元されました + 復元 + 著者 + 感謝の気持ち + 準備中… + 開始時に維持 + 説明 + バックアップと復元 + 著作権とライセンス + リバース + 選択した構成はこの漫画のために記憶されます + クッキーを削除 + GitHubでissueを作成する(GitHubのアカウントが必要です) + フィットセンター + アクティブなダウンロードはありません + 全てのソースからログアウトされます + 日付をフォーマット + NSFW漫画を履歴から除外する + キュー + 全てのCookieが削除されました + 読み取りモードはシリーズごとに設定できます + 再起動が必要です + 一部のデバイスはシステムでの動作が異なり、バックグラウンドタスクが中断される可能性があります。 + ジャンル + スケールモード + 名前を入力する必要があります + 今日 + この人達のお陰でKotatsuがより良くなりました + Kotatsuを翻訳する(Weblateのサイトを開きます) + 次のページ + サイレント + サインイン + ようこそ + AMOLEDスクリーンでさらに少ない電力を使用 \ No newline at end of file From f4c9d6717884e670f4c1522c6b1fd4f545c650aa Mon Sep 17 00:00:00 2001 From: Zakhar Timoshenko Date: Thu, 24 Feb 2022 17:20:57 +0300 Subject: [PATCH 52/70] Add discord badge to README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fddaf1d25..a99673f6c 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Kotatsu is a free and open source manga reader for Android. -![Android 5.0](https://img.shields.io/badge/android-5.0+-brightgreen) ![Kotlin](https://img.shields.io/github/languages/top/nv95/Kotatsu) [![Build Status](https://travis-ci.org/nv95/Kotatsu.svg?branch=master)](https://travis-ci.org/nv95/Kotatsu) ![License](https://img.shields.io/github/license/nv95/Kotatsu) [![weblate](https://hosted.weblate.org/widgets/kotatsu/-/strings/svg-badge.svg)](https://hosted.weblate.org/engage/kotatsu/) [![4pda](https://img.shields.io/badge/discuss-4pda-2982CC)](http://4pda.ru/forum/index.php?showtopic=697669) +![Android 5.0](https://img.shields.io/badge/android-5.0+-brightgreen) ![Kotlin](https://img.shields.io/github/languages/top/nv95/Kotatsu) [![Build Status](https://travis-ci.org/nv95/Kotatsu.svg?branch=master)](https://travis-ci.org/nv95/Kotatsu) ![License](https://img.shields.io/github/license/nv95/Kotatsu) [![weblate](https://hosted.weblate.org/widgets/kotatsu/-/strings/svg-badge.svg)](https://hosted.weblate.org/engage/kotatsu/) [![4pda](https://img.shields.io/badge/discuss-4pda-2982CC)](http://4pda.ru/forum/index.php?showtopic=697669) ![Discord](https://img.shields.io/discord/898363402467045416?color=5865f2&label=discord) ### Download From b8ecfb5455166760449a10ded80821be3758cecf Mon Sep 17 00:00:00 2001 From: Zakhar Timoshenko Date: Thu, 24 Feb 2022 17:22:53 +0300 Subject: [PATCH 53/70] Add link to discord badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a99673f6c..bf0ab9fee 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Kotatsu is a free and open source manga reader for Android. -![Android 5.0](https://img.shields.io/badge/android-5.0+-brightgreen) ![Kotlin](https://img.shields.io/github/languages/top/nv95/Kotatsu) [![Build Status](https://travis-ci.org/nv95/Kotatsu.svg?branch=master)](https://travis-ci.org/nv95/Kotatsu) ![License](https://img.shields.io/github/license/nv95/Kotatsu) [![weblate](https://hosted.weblate.org/widgets/kotatsu/-/strings/svg-badge.svg)](https://hosted.weblate.org/engage/kotatsu/) [![4pda](https://img.shields.io/badge/discuss-4pda-2982CC)](http://4pda.ru/forum/index.php?showtopic=697669) ![Discord](https://img.shields.io/discord/898363402467045416?color=5865f2&label=discord) +![Android 5.0](https://img.shields.io/badge/android-5.0+-brightgreen) ![Kotlin](https://img.shields.io/github/languages/top/nv95/Kotatsu) [![Build Status](https://travis-ci.org/nv95/Kotatsu.svg?branch=master)](https://travis-ci.org/nv95/Kotatsu) ![License](https://img.shields.io/github/license/nv95/Kotatsu) [![weblate](https://hosted.weblate.org/widgets/kotatsu/-/strings/svg-badge.svg)](https://hosted.weblate.org/engage/kotatsu/) [![4pda](https://img.shields.io/badge/discuss-4pda-2982CC)](http://4pda.ru/forum/index.php?showtopic=697669) [![Discord](https://img.shields.io/discord/898363402467045416?color=5865f2&label=discord)](https://discord.gg/NNJ5RgVBC5) ### Download From 38b550ecbb4079f50d4e49c40d0a49151d038c70 Mon Sep 17 00:00:00 2001 From: Zakhar Timoshenko Date: Thu, 24 Feb 2022 22:12:56 +0300 Subject: [PATCH 54/70] Add Discord link in about --- .../org/koitharu/kotatsu/core/prefs/AppSettings.kt | 3 ++- .../kotatsu/settings/about/AboutSettingsFragment.kt | 8 +++++++- app/src/main/res/xml/pref_about.xml | 11 ++++++++++- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt b/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt index 688428ee7..80ba8c927 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt @@ -209,6 +209,7 @@ class AppSettings private constructor(private val prefs: SharedPreferences) : const val KEY_APP_TRANSLATION = "about_app_translation" const val KEY_APP_GRATITUDES = "about_gratitudes" const val KEY_FEEDBACK_4PDA = "about_feedback_4pda" + const val KEY_FEEDBACK_DISCORD = "about_feedback_discord" const val KEY_FEEDBACK_GITHUB = "about_feedback_github" const val KEY_SUPPORT_DEVELOPER = "about_support_developer" @@ -219,4 +220,4 @@ class AppSettings private constructor(private val prefs: SharedPreferences) : private val isSamsung get() = Build.MANUFACTURER.equals("samsung", ignoreCase = true) } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/about/AboutSettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/about/AboutSettingsFragment.kt index e295d3bfa..a88856b15 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/about/AboutSettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/about/AboutSettingsFragment.kt @@ -48,6 +48,12 @@ class AboutSettingsFragment : BasePreferenceFragment(R.string.about) { resources.getString(R.string.about_feedback_4pda)) }) true } + AppSettings.KEY_FEEDBACK_DISCORD -> { + startActivity(context?.let { BrowserActivity.newIntent(it, + "https://discord.gg/NNJ5RgVBC5", + "Discord") }) + true + } AppSettings.KEY_FEEDBACK_GITHUB -> { startActivity(context?.let { BrowserActivity.newIntent(it, "https://github.com/nv95/Kotatsu/issues", @@ -89,4 +95,4 @@ class AboutSettingsFragment : BasePreferenceFragment(R.string.about) { } } } -} \ No newline at end of file +} diff --git a/app/src/main/res/xml/pref_about.xml b/app/src/main/res/xml/pref_about.xml index fd82426ce..985e8bbf5 100644 --- a/app/src/main/res/xml/pref_about.xml +++ b/app/src/main/res/xml/pref_about.xml @@ -47,16 +47,25 @@ + + + + + - \ No newline at end of file + From 94e9fa35e2cf4426e0d9dc17477ebc9f888e7489 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Fri, 25 Feb 2022 19:45:42 +0200 Subject: [PATCH 55/70] Remove preferences delegates --- .../kotatsu/core/prefs/AppSettings.kt | 144 ++++++++++-------- .../kotatsu/core/prefs/AppWidgetConfig.kt | 27 +--- .../kotatsu/details/ui/DetailsViewModel.kt | 6 +- .../kotatsu/reader/ui/ChaptersDialog.kt | 4 +- .../kotatsu/settings/MainSettingsFragment.kt | 4 +- .../NotificationSettingsLegacyFragment.kt | 9 +- .../kotatsu/tracker/work/TrackWorker.kt | 4 +- .../delegates/prefs/BoolPreferenceDelegate.kt | 20 --- .../delegates/prefs/EnumPreferenceDelegate.kt | 27 ---- .../prefs/IntEnumPreferenceDelegate.kt | 28 ---- .../delegates/prefs/IntPreferenceDelegate.kt | 20 --- .../delegates/prefs/LongPreferenceDelegate.kt | 20 --- .../prefs/NullableStringPreferenceDelegate.kt | 20 --- .../prefs/StringIntPreferenceDelegate.kt | 20 --- .../prefs/StringPreferenceDelegate.kt | 20 --- .../prefs/StringSetPreferenceDelegate.kt | 23 --- .../widget/shelf/ShelfConfigActivity.kt | 4 +- .../kotatsu/widget/shelf/ShelfListFactory.kt | 4 +- 18 files changed, 103 insertions(+), 301 deletions(-) delete mode 100644 app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/BoolPreferenceDelegate.kt delete mode 100644 app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/EnumPreferenceDelegate.kt delete mode 100644 app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/IntEnumPreferenceDelegate.kt delete mode 100644 app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/IntPreferenceDelegate.kt delete mode 100644 app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/LongPreferenceDelegate.kt delete mode 100644 app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/NullableStringPreferenceDelegate.kt delete mode 100644 app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/StringIntPreferenceDelegate.kt delete mode 100644 app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/StringPreferenceDelegate.kt delete mode 100644 app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/StringSetPreferenceDelegate.kt diff --git a/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt b/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt index 80ba8c927..6defc410a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt @@ -2,6 +2,7 @@ package org.koitharu.kotatsu.core.prefs import android.content.Context import android.content.SharedPreferences +import android.net.Uri import android.os.Build import android.provider.Settings import androidx.appcompat.app.AppCompatDelegate @@ -13,106 +14,113 @@ import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.channels.trySendBlocking import kotlinx.coroutines.flow.callbackFlow import org.koitharu.kotatsu.core.model.ZoomMode -import org.koitharu.kotatsu.utils.delegates.prefs.* +import org.koitharu.kotatsu.utils.ext.toUriOrNull import java.io.File import java.text.DateFormat import java.text.SimpleDateFormat import java.util.* -class AppSettings private constructor(private val prefs: SharedPreferences) : - SharedPreferences by prefs { +class AppSettings(context: Context) { - constructor(context: Context) : this( - PreferenceManager.getDefaultSharedPreferences(context) - ) + private val prefs = PreferenceManager.getDefaultSharedPreferences(context) - var listMode by EnumPreferenceDelegate( - ListMode::class.java, - KEY_LIST_MODE, - ListMode.DETAILED_LIST - ) + var listMode: ListMode + get() = prefs.getString(KEY_LIST_MODE, null)?.findEnumValue(ListMode.values()) ?: ListMode.DETAILED_LIST + set(value) = prefs.edit { putString(KEY_LIST_MODE, value.name) } - var defaultSection by IntEnumPreferenceDelegate( - AppSection::class.java, - KEY_APP_SECTION, - AppSection.HISTORY - ) + var defaultSection: AppSection + get() = prefs.getString(KEY_APP_SECTION, null)?.findEnumValue(AppSection.values()) ?: AppSection.HISTORY + set(value) = prefs.edit { putString(KEY_APP_SECTION, value.name) } - val theme by StringIntPreferenceDelegate( - KEY_THEME, - AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM - ) + val theme: Int + get() = prefs.getString(KEY_THEME, null)?.toIntOrNull() ?: AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM - val isDynamicTheme by BoolPreferenceDelegate(KEY_DYNAMIC_THEME, defaultValue = false) + val isDynamicTheme: Boolean + get() = prefs.getBoolean(KEY_DYNAMIC_THEME, false) - val isAmoledTheme by BoolPreferenceDelegate(KEY_THEME_AMOLED, defaultValue = false) + val isAmoledTheme: Boolean + get() = prefs.getBoolean(KEY_THEME_AMOLED, false) - val isToolbarHideWhenScrolling by BoolPreferenceDelegate(KEY_HIDE_TOOLBAR, defaultValue = true) + val isToolbarHideWhenScrolling: Boolean + get() = prefs.getBoolean(KEY_HIDE_TOOLBAR, true) - var gridSize by IntPreferenceDelegate(KEY_GRID_SIZE, defaultValue = 100) + var gridSize: Int + get() = prefs.getInt(KEY_GRID_SIZE, 100) + set(value) = prefs.edit { putInt(KEY_GRID_SIZE, value) } - val readerPageSwitch by StringSetPreferenceDelegate( - KEY_READER_SWITCHERS, - arraySetOf(PAGE_SWITCH_TAPS) - ) + val readerPageSwitch: Set + get() = prefs.getStringSet(KEY_READER_SWITCHERS, null) ?: setOf(PAGE_SWITCH_TAPS) - var isTrafficWarningEnabled by BoolPreferenceDelegate(KEY_TRAFFIC_WARNING, defaultValue = true) + var isTrafficWarningEnabled: Boolean + get() = prefs.getBoolean(KEY_TRAFFIC_WARNING, true) + set(value) = prefs.edit { putBoolean(KEY_TRAFFIC_WARNING, value) } - val appUpdateAuto by BoolPreferenceDelegate(KEY_APP_UPDATE_AUTO, defaultValue = true) + val appUpdateAuto: Boolean + get() = prefs.getBoolean(KEY_APP_UPDATE_AUTO, true) - var appUpdate by LongPreferenceDelegate(KEY_APP_UPDATE, defaultValue = 0L) + var appUpdate: Long + get() = prefs.getLong(KEY_APP_UPDATE, 0L) + set(value) = prefs.edit { putLong(KEY_APP_UPDATE, value) } - val trackerNotifications by BoolPreferenceDelegate( - KEY_TRACKER_NOTIFICATIONS, - defaultValue = true - ) + val trackerNotifications: Boolean + get() = prefs.getBoolean(KEY_TRACKER_NOTIFICATIONS, true) - var notificationSound by StringPreferenceDelegate( - KEY_NOTIFICATIONS_SOUND, - Settings.System.DEFAULT_NOTIFICATION_URI.toString() - ) + var notificationSound: Uri + get() = prefs.getString(KEY_NOTIFICATIONS_SOUND, null)?.toUriOrNull() + ?: Settings.System.DEFAULT_NOTIFICATION_URI + set(value) = prefs.edit { putString(KEY_NOTIFICATIONS_SOUND, value.toString()) } - val notificationVibrate by BoolPreferenceDelegate(KEY_NOTIFICATIONS_VIBRATE, false) + val notificationVibrate: Boolean + get() = prefs.getBoolean(KEY_NOTIFICATIONS_VIBRATE, false) - val notificationLight by BoolPreferenceDelegate(KEY_NOTIFICATIONS_LIGHT, true) + val notificationLight: Boolean + get() = prefs.getBoolean(KEY_NOTIFICATIONS_LIGHT, true) - val readerAnimation by BoolPreferenceDelegate(KEY_READER_ANIMATION, false) + val readerAnimation: Boolean + get() = prefs.getBoolean(KEY_READER_ANIMATION, false) - val isPreferRtlReader by BoolPreferenceDelegate(KEY_READER_PREFER_RTL, false) + val isPreferRtlReader: Boolean + get() = prefs.getBoolean(KEY_READER_PREFER_RTL, false) - var historyGrouping by BoolPreferenceDelegate(KEY_HISTORY_GROUPING, true) + var historyGrouping: Boolean + get() = prefs.getBoolean(KEY_HISTORY_GROUPING, true) + set(value) = prefs.edit { putBoolean(KEY_HISTORY_GROUPING, value) } - var isHistoryExcludeNsfw by BoolPreferenceDelegate(KEY_HISTORY_EXCLUDE_NSFW, false) + val isHistoryExcludeNsfw: Boolean + get() = prefs.getBoolean(KEY_HISTORY_EXCLUDE_NSFW, false) - var chaptersReverse by BoolPreferenceDelegate(KEY_REVERSE_CHAPTERS, false) + var chaptersReverse: Boolean + get() = prefs.getBoolean(KEY_REVERSE_CHAPTERS, false) + set(value) = prefs.edit { putBoolean(KEY_REVERSE_CHAPTERS, value) } - val zoomMode by EnumPreferenceDelegate( - ZoomMode::class.java, - KEY_ZOOM_MODE, - ZoomMode.FIT_CENTER - ) + val zoomMode: ZoomMode + get() = prefs.getString(KEY_ZOOM_MODE, null)?.findEnumValue(ZoomMode.values()) ?: ZoomMode.FIT_CENTER - val trackSources by StringSetPreferenceDelegate( - KEY_TRACK_SOURCES, - arraySetOf(TRACK_FAVOURITES, TRACK_HISTORY) - ) + val trackSources: Set + get() = prefs.getStringSet(KEY_TRACK_SOURCES, null) ?: arraySetOf(TRACK_FAVOURITES, TRACK_HISTORY) - var appPassword by NullableStringPreferenceDelegate(KEY_APP_PASSWORD) - - private var sourcesOrderStr by NullableStringPreferenceDelegate(KEY_SOURCES_ORDER) + var appPassword: String? + get() = prefs.getString(KEY_APP_PASSWORD, null) + set(value) = prefs.edit { if (value != null) putString(KEY_APP_PASSWORD, value) else remove(KEY_APP_PASSWORD) } var sourcesOrder: List - get() = sourcesOrderStr?.split('|')?.mapNotNull(String::toIntOrNull).orEmpty() - set(value) { - sourcesOrderStr = value.joinToString("|") + get() = prefs.getString(KEY_SOURCES_ORDER, null) + ?.split('|') + ?.mapNotNull(String::toIntOrNull) + .orEmpty() + set(value) = prefs.edit { + putString(KEY_SOURCES_ORDER, value.joinToString("|")) } - var hiddenSources by StringSetPreferenceDelegate(KEY_SOURCES_HIDDEN) + var hiddenSources: Set + get() = prefs.getStringSet(KEY_SOURCES_HIDDEN, null) ?: emptySet() + set(value) = prefs.edit { putStringSet(KEY_SOURCES_HIDDEN, value) } val isSourcesSelected: Boolean get() = KEY_SOURCES_HIDDEN in prefs - val isPagesNumbersEnabled by BoolPreferenceDelegate(KEY_PAGES_NUMBERS, false) + val isPagesNumbersEnabled: Boolean + get() = prefs.getBoolean(KEY_PAGES_NUMBERS, false) fun getFallbackStorageDir(): File? { return prefs.getString(KEY_LOCAL_STORAGE, null)?.let { @@ -131,7 +139,7 @@ class AppSettings private constructor(private val prefs: SharedPreferences) : } } - fun dateFormat(format: String? = prefs.getString(KEY_DATE_FORMAT, "")): DateFormat = + fun getDateFormat(format: String = prefs.getString(KEY_DATE_FORMAT, "").orEmpty()): DateFormat = when (format) { "" -> DateFormat.getDateInstance(DateFormat.SHORT) else -> SimpleDateFormat(format, Locale.getDefault()) @@ -156,6 +164,10 @@ class AppSettings private constructor(private val prefs: SharedPreferences) : } } + private fun > String.findEnumValue(values: Array): E? { + return values.find { it.name == this } + } + companion object { const val PAGE_SWITCH_TAPS = "taps" @@ -165,7 +177,7 @@ class AppSettings private constructor(private val prefs: SharedPreferences) : const val TRACK_FAVOURITES = "favourites" const val KEY_LIST_MODE = "list_mode_2" - const val KEY_APP_SECTION = "app_section" + const val KEY_APP_SECTION = "app_section_2" const val KEY_THEME = "theme" const val KEY_DYNAMIC_THEME = "dynamic_theme" const val KEY_THEME_AMOLED = "amoled_theme" @@ -215,7 +227,7 @@ class AppSettings private constructor(private val prefs: SharedPreferences) : val isDynamicColorAvailable: Boolean get() = DynamicColors.isDynamicColorAvailable() || - (isSamsung && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) + (isSamsung && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) private val isSamsung get() = Build.MANUFACTURER.equals("samsung", ignoreCase = true) diff --git a/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppWidgetConfig.kt b/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppWidgetConfig.kt index 312764f24..082266b54 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppWidgetConfig.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppWidgetConfig.kt @@ -1,26 +1,15 @@ package org.koitharu.kotatsu.core.prefs import android.content.Context -import android.content.SharedPreferences -import org.koitharu.kotatsu.utils.delegates.prefs.LongPreferenceDelegate +import androidx.core.content.edit -class AppWidgetConfig private constructor( - private val prefs: SharedPreferences, - val widgetId: Int -) : SharedPreferences by prefs { +private const val CATEGORY_ID = "cat_id" - var categoryId by LongPreferenceDelegate(CATEGORY_ID, 0L) +class AppWidgetConfig(context: Context, val widgetId: Int) { - companion object { + private val prefs = context.getSharedPreferences("appwidget_$widgetId", Context.MODE_PRIVATE) - private const val CATEGORY_ID = "cat_id" - - fun getInstance(context: Context, widgetId: Int) = AppWidgetConfig( - context.getSharedPreferences( - "appwidget_$widgetId", - Context.MODE_PRIVATE - ), widgetId - ) - } - -} \ No newline at end of file + var categoryId: Long + get() = prefs.getLong(CATEGORY_ID, 0L) + set(value) = prefs.edit { putLong(CATEGORY_ID, value) } +} diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt index 1e8e9d063..2f660e5b4 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt @@ -164,7 +164,7 @@ class DetailsViewModel( branch: String?, ): List { val result = ArrayList(chapters.size) - val dateFormat = settings.dateFormat() + val dateFormat = settings.getDateFormat() val currentIndex = chapters.indexOfFirst { it.id == currentId } val firstNewIndex = chapters.size - newCount val downloadedIds = downloadedChapters?.mapToSet { it.id } @@ -196,7 +196,7 @@ class DetailsViewModel( val result = ArrayList(sourceChapters.size) val currentIndex = sourceChapters.indexOfFirst { it.id == currentId } val firstNewIndex = sourceChapters.size - newCount - val dateFormat = settings.dateFormat() + val dateFormat = settings.getDateFormat() for (i in sourceChapters.indices) { val chapter = sourceChapters[i] if (chapter.branch != branch) { @@ -253,4 +253,4 @@ class DetailsViewModel( } return groups.maxByOrNull { it.value.size }?.key } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ChaptersDialog.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ChaptersDialog.kt index 4575e12fa..f091de3fd 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ChaptersDialog.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ChaptersDialog.kt @@ -46,7 +46,7 @@ class ChaptersDialog : AlertDialogFragment(), } val currentId = arguments?.getLong(ARG_CURRENT_ID, 0L) ?: 0L val currentPosition = chapters.indexOfFirst { it.id == currentId } - val dateFormat = get().dateFormat() + val dateFormat = get().getDateFormat() binding.recyclerViewChapters.adapter = ChaptersAdapter(this).apply { setItems(chapters.mapIndexed { index, chapter -> chapter.toListItem( @@ -96,4 +96,4 @@ class ChaptersDialog : AlertDialogFragment(), putLong(ARG_CURRENT_ID, currentId) }.show(fm, TAG) } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/MainSettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/MainSettingsFragment.kt index 73f20bad6..5b716c75b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/MainSettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/MainSettingsFragment.kt @@ -62,7 +62,7 @@ class MainSettingsFragment : BasePreferenceFragment(R.string.settings), entryValues = arrayOf("", "MM/dd/yy", "dd/MM/yy", "yyyy-MM-dd", "dd MMM yyyy", "MMM dd, yyyy") val now = Date().time entries = entryValues.map { value -> - val formattedDate = settings.dateFormat(value.toString()).format(now) + val formattedDate = settings.getDateFormat(value.toString()).format(now) if (value == "") { "${context.getString(R.string.system_default)} ($formattedDate)" } else { @@ -171,4 +171,4 @@ class MainSettingsFragment : BasePreferenceFragment(R.string.settings), summary = storage?.getStorageName(context) ?: getString(R.string.not_available) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/NotificationSettingsLegacyFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/NotificationSettingsLegacyFragment.kt index 5c021a39f..b8852f47e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/NotificationSettingsLegacyFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/NotificationSettingsLegacyFragment.kt @@ -10,14 +10,13 @@ import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.BasePreferenceFragment import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.settings.utils.RingtonePickContract -import org.koitharu.kotatsu.utils.ext.toUriOrNull class NotificationSettingsLegacyFragment : BasePreferenceFragment(R.string.notifications) { private val ringtonePickContract = registerForActivityResult( RingtonePickContract(get().getString(R.string.notification_sound)) ) { uri -> - settings.notificationSound = uri?.toString() ?: return@registerForActivityResult + settings.notificationSound = uri ?: return@registerForActivityResult findPreference(AppSettings.KEY_NOTIFICATIONS_SOUND)?.run { summary = RingtoneManager.getRingtone(context, uri)?.getTitle(context) ?: getString(R.string.silent) @@ -31,7 +30,7 @@ class NotificationSettingsLegacyFragment : BasePreferenceFragment(R.string.notif override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) findPreference(AppSettings.KEY_NOTIFICATIONS_SOUND)?.run { - val uri = settings.notificationSound.toUriOrNull() + val uri = settings.notificationSound summary = RingtoneManager.getRingtone(context, uri)?.getTitle(context) ?: getString(R.string.silent) } @@ -40,10 +39,10 @@ class NotificationSettingsLegacyFragment : BasePreferenceFragment(R.string.notif override fun onPreferenceTreeClick(preference: Preference): Boolean { return when (preference.key) { AppSettings.KEY_NOTIFICATIONS_SOUND -> { - ringtonePickContract.launch(settings.notificationSound.toUriOrNull()) + ringtonePickContract.launch(settings.notificationSound) true } else -> super.onPreferenceTreeClick(preference) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/work/TrackWorker.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/work/TrackWorker.kt index 45941f448..d345ca5e4 100644 --- a/app/src/main/java/org/koitharu/kotatsu/tracker/work/TrackWorker.kt +++ b/app/src/main/java/org/koitharu/kotatsu/tracker/work/TrackWorker.kt @@ -183,7 +183,7 @@ class TrackWorker(context: Context, workerParams: WorkerParameters) : setShortcutId(manga.id.toString()) priority = NotificationCompat.PRIORITY_DEFAULT if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { - builder.setSound(settings.notificationSound.toUriOrNull()) + builder.setSound(settings.notificationSound) var defaults = if (settings.notificationLight) { setLights(colorPrimary, 1000, 5000) NotificationCompat.DEFAULT_LIGHTS @@ -298,4 +298,4 @@ class TrackWorker(context: Context, workerParams: WorkerParameters) : } } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/BoolPreferenceDelegate.kt b/app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/BoolPreferenceDelegate.kt deleted file mode 100644 index dd554acbc..000000000 --- a/app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/BoolPreferenceDelegate.kt +++ /dev/null @@ -1,20 +0,0 @@ -package org.koitharu.kotatsu.utils.delegates.prefs - -import android.content.SharedPreferences -import androidx.core.content.edit -import kotlin.properties.ReadWriteProperty -import kotlin.reflect.KProperty - -class BoolPreferenceDelegate(private val key: String, private val defaultValue: Boolean) : - ReadWriteProperty { - - override fun getValue(thisRef: SharedPreferences, property: KProperty<*>): Boolean { - return thisRef.getBoolean(key, defaultValue) - } - - override fun setValue(thisRef: SharedPreferences, property: KProperty<*>, value: Boolean) { - thisRef.edit { - putBoolean(key, value) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/EnumPreferenceDelegate.kt b/app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/EnumPreferenceDelegate.kt deleted file mode 100644 index b164dcb8e..000000000 --- a/app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/EnumPreferenceDelegate.kt +++ /dev/null @@ -1,27 +0,0 @@ -package org.koitharu.kotatsu.utils.delegates.prefs - -import android.content.SharedPreferences -import androidx.core.content.edit -import kotlin.properties.ReadWriteProperty -import kotlin.reflect.KProperty - -class EnumPreferenceDelegate>( - private val cls: Class, - private val key: String, - private val defValue: E -) : ReadWriteProperty { - - override fun getValue(thisRef: SharedPreferences, property: KProperty<*>): E { - val name = thisRef.getString(key, null) - if (name === null) { - return defValue - } - return cls.enumConstants?.find { it.name == name } ?: defValue - } - - override fun setValue(thisRef: SharedPreferences, property: KProperty<*>, value: E) { - thisRef.edit { - putString(key, value.name) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/IntEnumPreferenceDelegate.kt b/app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/IntEnumPreferenceDelegate.kt deleted file mode 100644 index cc3dc96f1..000000000 --- a/app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/IntEnumPreferenceDelegate.kt +++ /dev/null @@ -1,28 +0,0 @@ -package org.koitharu.kotatsu.utils.delegates.prefs - -import android.content.SharedPreferences -import androidx.core.content.edit -import kotlin.properties.ReadWriteProperty -import kotlin.reflect.KProperty - -@Deprecated("") -class IntEnumPreferenceDelegate>( - private val cls: Class, - private val key: String, - private val defValue: E -) : ReadWriteProperty { - - override fun getValue(thisRef: SharedPreferences, property: KProperty<*>): E { - val ord = thisRef.getInt(key, -1) - if (ord == -1) { - return defValue - } - return cls.enumConstants?.getOrNull(ord) ?: defValue - } - - override fun setValue(thisRef: SharedPreferences, property: KProperty<*>, value: E) { - thisRef.edit { - putInt(key, value.ordinal) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/IntPreferenceDelegate.kt b/app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/IntPreferenceDelegate.kt deleted file mode 100644 index db41b62b5..000000000 --- a/app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/IntPreferenceDelegate.kt +++ /dev/null @@ -1,20 +0,0 @@ -package org.koitharu.kotatsu.utils.delegates.prefs - -import android.content.SharedPreferences -import androidx.core.content.edit -import kotlin.properties.ReadWriteProperty -import kotlin.reflect.KProperty - -class IntPreferenceDelegate(private val key: String, private val defaultValue: Int) : - ReadWriteProperty { - - override fun getValue(thisRef: SharedPreferences, property: KProperty<*>): Int { - return thisRef.getInt(key, defaultValue) - } - - override fun setValue(thisRef: SharedPreferences, property: KProperty<*>, value: Int) { - thisRef.edit { - putInt(key, value) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/LongPreferenceDelegate.kt b/app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/LongPreferenceDelegate.kt deleted file mode 100644 index 4e160a8e3..000000000 --- a/app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/LongPreferenceDelegate.kt +++ /dev/null @@ -1,20 +0,0 @@ -package org.koitharu.kotatsu.utils.delegates.prefs - -import android.content.SharedPreferences -import androidx.core.content.edit -import kotlin.properties.ReadWriteProperty -import kotlin.reflect.KProperty - -class LongPreferenceDelegate(private val key: String, private val defaultValue: Long) : - ReadWriteProperty { - - override fun getValue(thisRef: SharedPreferences, property: KProperty<*>): Long { - return thisRef.getLong(key, defaultValue) - } - - override fun setValue(thisRef: SharedPreferences, property: KProperty<*>, value: Long) { - thisRef.edit { - putLong(key, value) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/NullableStringPreferenceDelegate.kt b/app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/NullableStringPreferenceDelegate.kt deleted file mode 100644 index 0b96447bc..000000000 --- a/app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/NullableStringPreferenceDelegate.kt +++ /dev/null @@ -1,20 +0,0 @@ -package org.koitharu.kotatsu.utils.delegates.prefs - -import android.content.SharedPreferences -import androidx.core.content.edit -import kotlin.properties.ReadWriteProperty -import kotlin.reflect.KProperty - -class NullableStringPreferenceDelegate(private val key: String) : - ReadWriteProperty { - - override fun getValue(thisRef: SharedPreferences, property: KProperty<*>): String? { - return thisRef.getString(key, null) - } - - override fun setValue(thisRef: SharedPreferences, property: KProperty<*>, value: String?) { - thisRef.edit { - putString(key, value) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/StringIntPreferenceDelegate.kt b/app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/StringIntPreferenceDelegate.kt deleted file mode 100644 index 6c670921d..000000000 --- a/app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/StringIntPreferenceDelegate.kt +++ /dev/null @@ -1,20 +0,0 @@ -package org.koitharu.kotatsu.utils.delegates.prefs - -import android.content.SharedPreferences -import androidx.core.content.edit -import kotlin.properties.ReadWriteProperty -import kotlin.reflect.KProperty - -class StringIntPreferenceDelegate(private val key: String, private val defValue: Int) : - ReadWriteProperty { - - override fun getValue(thisRef: SharedPreferences, property: KProperty<*>): Int { - return thisRef.getString(key, defValue.toString())?.toIntOrNull() ?: defValue - } - - override fun setValue(thisRef: SharedPreferences, property: KProperty<*>, value: Int) { - thisRef.edit { - putString(key, value.toString()) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/StringPreferenceDelegate.kt b/app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/StringPreferenceDelegate.kt deleted file mode 100644 index 775eda94d..000000000 --- a/app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/StringPreferenceDelegate.kt +++ /dev/null @@ -1,20 +0,0 @@ -package org.koitharu.kotatsu.utils.delegates.prefs - -import android.content.SharedPreferences -import androidx.core.content.edit -import kotlin.properties.ReadWriteProperty -import kotlin.reflect.KProperty - -class StringPreferenceDelegate(private val key: String, private val defValue: String) : - ReadWriteProperty { - - override fun getValue(thisRef: SharedPreferences, property: KProperty<*>): String { - return thisRef.getString(key, defValue) ?: defValue - } - - override fun setValue(thisRef: SharedPreferences, property: KProperty<*>, value: String) { - thisRef.edit { - putString(key, value) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/StringSetPreferenceDelegate.kt b/app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/StringSetPreferenceDelegate.kt deleted file mode 100644 index e1e0ed011..000000000 --- a/app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/StringSetPreferenceDelegate.kt +++ /dev/null @@ -1,23 +0,0 @@ -package org.koitharu.kotatsu.utils.delegates.prefs - -import android.content.SharedPreferences -import androidx.core.content.edit -import kotlin.properties.ReadWriteProperty -import kotlin.reflect.KProperty - -class StringSetPreferenceDelegate( - private val key: String, - private val defValue: Set = emptySet() -) : - ReadWriteProperty> { - - override fun getValue(thisRef: SharedPreferences, property: KProperty<*>): Set { - return thisRef.getStringSet(key, defValue) ?: defValue - } - - override fun setValue(thisRef: SharedPreferences, property: KProperty<*>, value: Set) { - thisRef.edit { - putStringSet(key, value) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfConfigActivity.kt b/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfConfigActivity.kt index 00a22cc85..5caba4fef 100644 --- a/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfConfigActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfConfigActivity.kt @@ -50,7 +50,7 @@ class ShelfConfigActivity : BaseActivity(), finishAfterTransition() return } - config = AppWidgetConfig.getInstance(this, appWidgetId) + config = AppWidgetConfig(this, appWidgetId) viewModel.checkedId = config.categoryId viewModel.content.observe(this, this::onContentChanged) @@ -118,4 +118,4 @@ class ShelfConfigActivity : BaseActivity(), intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids) sendBroadcast(intent) } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfListFactory.kt b/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfListFactory.kt index dfe531baa..ac868a7f0 100644 --- a/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfListFactory.kt +++ b/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfListFactory.kt @@ -24,7 +24,7 @@ class ShelfListFactory( ) : RemoteViewsService.RemoteViewsFactory { private val dataSet = ArrayList() - private val config = AppWidgetConfig.getInstance(context, widgetId) + private val config = AppWidgetConfig(context, widgetId) override fun onCreate() { } @@ -73,4 +73,4 @@ class ShelfListFactory( override fun getViewTypeCount() = 1 override fun onDestroy() = Unit -} \ No newline at end of file +} From def2d5f49479b205104b86f08d0b24fe48b04027 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sat, 26 Feb 2022 10:14:40 +0200 Subject: [PATCH 56/70] Refactor and deprecations fixes --- .../kotatsu/base/domain/MangaIntent.kt | 30 +++++----- .../base/domain/MangaProviderFactory.kt | 24 -------- .../kotatsu/base/domain/MangaUtils.kt | 13 ++--- .../kotatsu/base/ui/AlertDialogFragment.kt | 5 +- .../koitharu/kotatsu/base/ui/BaseActivity.kt | 7 ++- .../kotatsu/base/ui/BaseBottomSheet.kt | 5 +- .../kotatsu/base/ui/BasePreferenceFragment.kt | 6 +- .../kotatsu/core/network/CommonHeaders.kt | 7 ++- .../kotatsu/core/network/NetworkModule.kt | 9 +-- .../core/parser/RemoteMangaRepository.kt | 8 +-- .../kotatsu/core/prefs/AppSettings.kt | 32 +++++++---- .../koitharu/kotatsu/core/prefs/ReaderMode.kt | 2 +- .../kotatsu/details/ui/DetailsActivity.kt | 4 +- .../kotatsu/details/ui/DetailsFragment.kt | 12 ++-- .../download/domain/DownloadManager.kt | 5 +- .../local/data/{Cache.kt => CacheDir.kt} | 4 +- .../kotatsu/local/data/LocalStorageManager.kt | 45 ++++++++++++++- .../koitharu/kotatsu/local/data/PagesCache.kt | 18 ++---- .../koitharu/kotatsu/main/ui/MainViewModel.kt | 5 +- .../kotatsu/reader/domain/PageLoader.kt | 5 +- .../kotatsu/reader/ui/ReaderActivity.kt | 4 +- .../kotatsu/reader/ui/ReaderViewModel.kt | 4 +- .../search/domain/MangaSearchRepository.kt | 5 +- .../kotatsu/settings/AppUpdateChecker.kt | 6 +- .../settings/HistorySettingsFragment.kt | 37 +++++-------- .../kotatsu/settings/MainSettingsFragment.kt | 2 +- .../sources/SourcesSettingsViewModel.kt | 5 +- .../org/koitharu/kotatsu/utils/CacheUtils.kt | 55 ------------------- .../utils/{FileSizeUtils.kt => FileSize.kt} | 21 ++++--- .../kotatsu/utils/PendingIntentCompat.kt | 4 +- .../org/koitharu/kotatsu/utils/anim/Motion.kt | 2 +- .../delegates/ParcelableArgumentDelegate.kt | 14 ----- .../utils/delegates/StringArgumentDelegate.kt | 12 ---- 33 files changed, 169 insertions(+), 248 deletions(-) delete mode 100644 app/src/main/java/org/koitharu/kotatsu/base/domain/MangaProviderFactory.kt rename app/src/main/java/org/koitharu/kotatsu/local/data/{Cache.kt => CacheDir.kt} (66%) delete mode 100644 app/src/main/java/org/koitharu/kotatsu/utils/CacheUtils.kt rename app/src/main/java/org/koitharu/kotatsu/utils/{FileSizeUtils.kt => FileSize.kt} (56%) delete mode 100644 app/src/main/java/org/koitharu/kotatsu/utils/delegates/ParcelableArgumentDelegate.kt delete mode 100644 app/src/main/java/org/koitharu/kotatsu/utils/delegates/StringArgumentDelegate.kt diff --git a/app/src/main/java/org/koitharu/kotatsu/base/domain/MangaIntent.kt b/app/src/main/java/org/koitharu/kotatsu/base/domain/MangaIntent.kt index f4dc339c9..cfd7d7b4f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/domain/MangaIntent.kt +++ b/app/src/main/java/org/koitharu/kotatsu/base/domain/MangaIntent.kt @@ -5,29 +5,29 @@ import android.net.Uri import android.os.Bundle import org.koitharu.kotatsu.core.model.Manga -class MangaIntent( +class MangaIntent private constructor( val manga: Manga?, val mangaId: Long, - val uri: Uri? + val uri: Uri?, ) { + constructor(intent: Intent?) : this( + manga = intent?.getParcelableExtra(KEY_MANGA), + mangaId = intent?.getLongExtra(KEY_ID, ID_NONE) ?: ID_NONE, + uri = intent?.data + ) + + constructor(args: Bundle?) : this( + manga = args?.getParcelable(KEY_MANGA), + mangaId = args?.getLong(KEY_ID, ID_NONE) ?: ID_NONE, + uri = null + ) + companion object { - fun from(intent: Intent?) = MangaIntent( - manga = intent?.getParcelableExtra(KEY_MANGA), - mangaId = intent?.getLongExtra(KEY_ID, ID_NONE) ?: ID_NONE, - uri = intent?.data - ) - - fun from(args: Bundle?) = MangaIntent( - manga = args?.getParcelable(KEY_MANGA), - mangaId = args?.getLong(KEY_ID, ID_NONE) ?: ID_NONE, - uri = null - ) - const val ID_NONE = 0L const val KEY_MANGA = "manga" const val KEY_ID = "id" } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/base/domain/MangaProviderFactory.kt b/app/src/main/java/org/koitharu/kotatsu/base/domain/MangaProviderFactory.kt deleted file mode 100644 index 0223031d9..000000000 --- a/app/src/main/java/org/koitharu/kotatsu/base/domain/MangaProviderFactory.kt +++ /dev/null @@ -1,24 +0,0 @@ -package org.koitharu.kotatsu.base.domain - -import org.koitharu.kotatsu.core.model.MangaSource -import org.koitharu.kotatsu.core.prefs.AppSettings - -object MangaProviderFactory { - - fun getSources(settings: AppSettings, includeHidden: Boolean): List { - val list = MangaSource.values().toList() - MangaSource.LOCAL - val order = settings.sourcesOrder - val sorted = list.sortedBy { x -> - val e = order.indexOf(x.ordinal) - if (e == -1) order.size + x.ordinal else e - } - return if (includeHidden) { - sorted - } else { - val hidden = settings.hiddenSources - sorted.filterNot { x -> - x.name in hidden - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/base/domain/MangaUtils.kt b/app/src/main/java/org/koitharu/kotatsu/base/domain/MangaUtils.kt index 25b0ac52f..52956c902 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/domain/MangaUtils.kt +++ b/app/src/main/java/org/koitharu/kotatsu/base/domain/MangaUtils.kt @@ -5,7 +5,6 @@ import android.net.Uri import android.util.Size import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runInterruptible -import kotlinx.coroutines.withContext import okhttp3.OkHttpClient import okhttp3.Request import org.koin.core.component.KoinComponent @@ -14,7 +13,6 @@ import org.koitharu.kotatsu.BuildConfig import org.koitharu.kotatsu.core.model.MangaPage import org.koitharu.kotatsu.core.network.CommonHeaders import org.koitharu.kotatsu.core.parser.MangaRepository -import org.koitharu.kotatsu.utils.CacheUtils import org.koitharu.kotatsu.utils.ext.await import org.koitharu.kotatsu.utils.ext.medianOrNull import java.io.InputStream @@ -40,15 +38,14 @@ object MangaUtils : KoinComponent { } } } else { - val client = get() val request = Request.Builder() .url(url) .get() .header(CommonHeaders.REFERER, page.referer) - .cacheControl(CacheUtils.CONTROL_DISABLED) + .cacheControl(CommonHeaders.CACHE_CONTROL_DISABLED) .build() - client.newCall(request).await().use { - withContext(Dispatchers.IO) { + get().newCall(request).await().use { + runInterruptible(Dispatchers.IO) { getBitmapSize(it.body?.byteStream()) } } @@ -66,10 +63,10 @@ object MangaUtils : KoinComponent { val options = BitmapFactory.Options().apply { inJustDecodeBounds = true } - BitmapFactory.decodeStream(input, null, options) + BitmapFactory.decodeStream(input, null, options)?.recycle() val imageHeight: Int = options.outHeight val imageWidth: Int = options.outWidth check(imageHeight > 0 && imageWidth > 0) return Size(imageWidth, imageHeight) } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/AlertDialogFragment.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/AlertDialogFragment.kt index 8077ea928..c364071bf 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/AlertDialogFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/AlertDialogFragment.kt @@ -17,8 +17,7 @@ abstract class AlertDialogFragment : DialogFragment() { get() = checkNotNull(viewBinding) final override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - val inflater = activity?.layoutInflater ?: LayoutInflater.from(requireContext()) - val binding = onInflateView(inflater, null) + val binding = onInflateView(layoutInflater, null) viewBinding = binding return MaterialAlertDialogBuilder(requireContext(), theme) .setView(binding.root) @@ -43,4 +42,4 @@ abstract class AlertDialogFragment : DialogFragment() { protected fun bindingOrNull(): B? = viewBinding protected abstract fun onInflateView(inflater: LayoutInflater, container: ViewGroup?): B -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseActivity.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseActivity.kt index 32ff25748..a617cad7e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseActivity.kt @@ -35,9 +35,10 @@ abstract class BaseActivity : AppCompatActivity(), OnApplyWindo private var lastInsets: Insets = Insets.NONE override fun onCreate(savedInstanceState: Bundle?) { + val settings = get() when { - get().isAmoledTheme -> setTheme(R.style.ThemeOverlay_Kotatsu_AMOLED) - get().isDynamicTheme -> setTheme(R.style.Theme_Kotatsu_Monet) + settings.isAmoledTheme -> setTheme(R.style.ThemeOverlay_Kotatsu_AMOLED) + settings.isDynamicTheme -> setTheme(R.style.Theme_Kotatsu_Monet) } super.onCreate(savedInstanceState) WindowCompat.setDecorFitsSystemWindows(window, false) @@ -130,4 +131,4 @@ abstract class BaseActivity : AppCompatActivity(), OnApplyWindo super.onBackPressed() } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseBottomSheet.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseBottomSheet.kt index 1a522dfb0..d5d2865c0 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseBottomSheet.kt +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseBottomSheet.kt @@ -10,8 +10,7 @@ import androidx.viewbinding.ViewBinding import com.google.android.material.bottomsheet.BottomSheetDialogFragment import org.koitharu.kotatsu.R -abstract class BaseBottomSheet : - BottomSheetDialogFragment() { +abstract class BaseBottomSheet : BottomSheetDialogFragment() { private var viewBinding: B? = null @@ -40,4 +39,4 @@ abstract class BaseBottomSheet : } protected abstract fun onInflateView(inflater: LayoutInflater, container: ViewGroup?): B -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/BasePreferenceFragment.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/BasePreferenceFragment.kt index 3be795aed..4d6a307cb 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/BasePreferenceFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/BasePreferenceFragment.kt @@ -11,8 +11,8 @@ import androidx.preference.PreferenceFragmentCompat import org.koin.android.ext.android.inject import org.koitharu.kotatsu.core.prefs.AppSettings -abstract class BasePreferenceFragment(@StringRes private val titleId: Int) : - PreferenceFragmentCompat(), OnApplyWindowInsetsListener { +abstract class BasePreferenceFragment(@StringRes private val titleId: Int) : PreferenceFragmentCompat(), + OnApplyWindowInsetsListener { protected val settings by inject(mode = LazyThreadSafetyMode.NONE) @@ -36,4 +36,4 @@ abstract class BasePreferenceFragment(@StringRes private val titleId: Int) : ) return insets } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/core/network/CommonHeaders.kt b/app/src/main/java/org/koitharu/kotatsu/core/network/CommonHeaders.kt index 18e5bbf55..2f7d73b6b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/network/CommonHeaders.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/network/CommonHeaders.kt @@ -1,5 +1,7 @@ package org.koitharu.kotatsu.core.network +import okhttp3.CacheControl + object CommonHeaders { const val REFERER = "Referer" @@ -7,4 +9,7 @@ object CommonHeaders { const val ACCEPT = "Accept" const val CONTENT_DISPOSITION = "Content-Disposition" const val COOKIE = "Cookie" -} \ No newline at end of file + + val CACHE_CONTROL_DISABLED: CacheControl + get() = CacheControl.Builder().noStore().build() +} diff --git a/app/src/main/java/org/koitharu/kotatsu/core/network/NetworkModule.kt b/app/src/main/java/org/koitharu/kotatsu/core/network/NetworkModule.kt index 5627e8637..69e1e411a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/network/NetworkModule.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/network/NetworkModule.kt @@ -2,27 +2,24 @@ package org.koitharu.kotatsu.core.network import okhttp3.CookieJar import okhttp3.OkHttpClient -import org.koin.android.ext.koin.androidContext -import org.koin.core.qualifier.named import org.koin.dsl.bind import org.koin.dsl.module import org.koitharu.kotatsu.BuildConfig import org.koitharu.kotatsu.base.domain.MangaLoaderContext -import org.koitharu.kotatsu.utils.CacheUtils +import org.koitharu.kotatsu.local.data.LocalStorageManager import org.koitharu.kotatsu.utils.DownloadManagerHelper import java.util.concurrent.TimeUnit val networkModule get() = module { single { AndroidCookieJar() } bind CookieJar::class - single(named(CacheUtils.QUALIFIER_HTTP)) { CacheUtils.createHttpCache(androidContext()) } single { OkHttpClient.Builder().apply { connectTimeout(20, TimeUnit.SECONDS) readTimeout(60, TimeUnit.SECONDS) writeTimeout(20, TimeUnit.SECONDS) cookieJar(get()) - cache(get(named(CacheUtils.QUALIFIER_HTTP))) + cache(get().createHttpCache()) addInterceptor(UserAgentInterceptor()) addInterceptor(CloudFlareInterceptor()) if (BuildConfig.DEBUG) { @@ -32,4 +29,4 @@ val networkModule } factory { DownloadManagerHelper(get(), get()) } single { MangaLoaderContext(get(), get()) } - } \ No newline at end of file + } diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/RemoteMangaRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/RemoteMangaRepository.kt index 3505c53b8..4a2c2be82 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/RemoteMangaRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/RemoteMangaRepository.kt @@ -64,10 +64,10 @@ abstract class RemoteMangaRepository( protected fun generateUid(url: String): Long { var h = 1125899906842597L source.name.forEach { c -> - h = 31 * h + c.toLong() + h = 31 * h + c.code } url.forEach { c -> - h = 31 * h + c.toLong() + h = 31 * h + c.code } return h } @@ -75,7 +75,7 @@ abstract class RemoteMangaRepository( protected fun generateUid(id: Long): Long { var h = 1125899906842597L source.name.forEach { c -> - h = 31 * h + c.toLong() + h = 31 * h + c.code } h = 31 * h + id return h @@ -84,4 +84,4 @@ abstract class RemoteMangaRepository( protected fun parseFailed(message: String? = null): Nothing { throw ParseException(message) } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt b/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt index 6defc410a..17b8adeeb 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt @@ -13,6 +13,7 @@ import com.google.android.material.color.DynamicColors import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.channels.trySendBlocking import kotlinx.coroutines.flow.callbackFlow +import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.core.model.ZoomMode import org.koitharu.kotatsu.utils.ext.toUriOrNull import java.io.File @@ -122,22 +123,17 @@ class AppSettings(context: Context) { val isPagesNumbersEnabled: Boolean get() = prefs.getBoolean(KEY_PAGES_NUMBERS, false) - fun getFallbackStorageDir(): File? { - return prefs.getString(KEY_LOCAL_STORAGE, null)?.let { + var mangaStorageDir: File? + get() = prefs.getString(KEY_LOCAL_STORAGE, null)?.let { File(it) }?.takeIf { it.exists() } - } - - @Deprecated("Use LocalStorageManager instead") - fun setStorageDir(file: File?) { - prefs.edit { - if (file == null) { + set(value) = prefs.edit { + if (value == null) { remove(KEY_LOCAL_STORAGE) } else { - putString(KEY_LOCAL_STORAGE, file.path) + putString(KEY_LOCAL_STORAGE, value.path) } } - } fun getDateFormat(format: String = prefs.getString(KEY_DATE_FORMAT, "").orEmpty()): DateFormat = when (format) { @@ -145,7 +141,21 @@ class AppSettings(context: Context) { else -> SimpleDateFormat(format, Locale.getDefault()) } - @Deprecated("Use observe()") + fun getMangaSources(includeHidden: Boolean): List { + val list = MangaSource.values().toMutableList() + list.remove(MangaSource.LOCAL) + val order = sourcesOrder + list.sortBy { x -> + val e = order.indexOf(x.ordinal) + if (e == -1) order.size + x.ordinal else e + } + if (!includeHidden) { + val hidden = hiddenSources + list.removeAll { x -> x.name in hidden } + } + return list + } + fun subscribe(listener: SharedPreferences.OnSharedPreferenceChangeListener) { prefs.registerOnSharedPreferenceChangeListener(listener) } diff --git a/app/src/main/java/org/koitharu/kotatsu/core/prefs/ReaderMode.kt b/app/src/main/java/org/koitharu/kotatsu/core/prefs/ReaderMode.kt index 9ec51d479..bfc8b7b83 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/prefs/ReaderMode.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/prefs/ReaderMode.kt @@ -10,4 +10,4 @@ enum class ReaderMode(val id: Int) { fun valueOf(id: Int) = values().firstOrNull { it.id == id } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt index 6b0b78279..d8cb87ecf 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt @@ -47,7 +47,7 @@ class DetailsActivity : BaseActivity(), TabLayoutMediator.TabConfigurationStrategy { private val viewModel by viewModel { - parametersOf(MangaIntent.from(intent)) + parametersOf(MangaIntent(intent)) } override fun onCreate(savedInstanceState: Bundle?) { @@ -280,4 +280,4 @@ class DetailsActivity : BaseActivity(), .putExtra(MangaIntent.KEY_ID, mangaId) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt index 3d6ce19f0..725cbf950 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt @@ -15,9 +15,7 @@ import androidx.core.view.updatePadding import coil.ImageLoader import coil.request.ImageRequest import coil.util.CoilUtils -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import org.koin.android.ext.android.inject import org.koin.androidx.viewmodel.ext.android.sharedViewModel import org.koitharu.kotatsu.R @@ -33,7 +31,7 @@ import org.koitharu.kotatsu.image.ui.ImageActivity import org.koitharu.kotatsu.reader.ui.ReaderActivity import org.koitharu.kotatsu.reader.ui.ReaderState import org.koitharu.kotatsu.search.ui.SearchActivity -import org.koitharu.kotatsu.utils.FileSizeUtils +import org.koitharu.kotatsu.utils.FileSize import org.koitharu.kotatsu.utils.ext.* class DetailsFragment : BaseFragment(), View.OnClickListener, @@ -114,10 +112,8 @@ class DetailsFragment : BaseFragment(), View.OnClickList val file = manga.url.toUri().toFileOrNull() if (file != null) { viewLifecycleScope.launch { - val size = withContext(Dispatchers.IO) { - file.length() - } - textViewSize.text = FileSizeUtils.formatBytes(requireContext(), size) + val size = file.computeSize() + textViewSize.text = FileSize.BYTES.format(requireContext(), size) } sizeContainer.isVisible = true } else { @@ -270,4 +266,4 @@ class DetailsFragment : BaseFragment(), View.OnClickList .lifecycle(viewLifecycleOwner) .enqueueWith(coil) } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/download/domain/DownloadManager.kt b/app/src/main/java/org/koitharu/kotatsu/download/domain/DownloadManager.kt index 849dca7ca..70a8b4db2 100644 --- a/app/src/main/java/org/koitharu/kotatsu/download/domain/DownloadManager.kt +++ b/app/src/main/java/org/koitharu/kotatsu/download/domain/DownloadManager.kt @@ -21,7 +21,6 @@ import org.koitharu.kotatsu.core.parser.MangaRepository import org.koitharu.kotatsu.local.data.MangaZip import org.koitharu.kotatsu.local.data.PagesCache import org.koitharu.kotatsu.local.domain.LocalMangaRepository -import org.koitharu.kotatsu.utils.CacheUtils import org.koitharu.kotatsu.utils.ext.await import org.koitharu.kotatsu.utils.ext.deleteAwait import org.koitharu.kotatsu.utils.ext.waitForNetwork @@ -134,7 +133,7 @@ class DownloadManager( val request = Request.Builder() .url(url) .header(CommonHeaders.REFERER, referer) - .cacheControl(CacheUtils.CONTROL_DISABLED) + .cacheControl(CommonHeaders.CACHE_CONTROL_DISABLED) .get() .build() val call = okHttp.newCall(request) @@ -234,4 +233,4 @@ class DownloadManager( private const val DOWNLOAD_ERROR_DELAY = 500L private const val TEMP_PAGE_FILE = "page.tmp" } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/local/data/Cache.kt b/app/src/main/java/org/koitharu/kotatsu/local/data/CacheDir.kt similarity index 66% rename from app/src/main/java/org/koitharu/kotatsu/local/data/Cache.kt rename to app/src/main/java/org/koitharu/kotatsu/local/data/CacheDir.kt index d675fbc2a..1cc562d7b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/data/Cache.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/data/CacheDir.kt @@ -1,7 +1,7 @@ package org.koitharu.kotatsu.local.data -enum class Cache(val dir: String) { +enum class CacheDir(val dir: String) { THUMBS("image_cache"), PAGES("pages"); -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/local/data/LocalStorageManager.kt b/app/src/main/java/org/koitharu/kotatsu/local/data/LocalStorageManager.kt index b51cb2367..b6859cea4 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/data/LocalStorageManager.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/data/LocalStorageManager.kt @@ -1,20 +1,41 @@ package org.koitharu.kotatsu.local.data import android.content.Context +import android.os.StatFs import androidx.annotation.WorkerThread import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runInterruptible +import okhttp3.Cache import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.utils.ext.computeSize import org.koitharu.kotatsu.utils.ext.getStorageName import java.io.File private const val DIR_NAME = "manga" +private const val CACHE_DISK_PERCENTAGE = 0.02 +private const val CACHE_SIZE_MIN: Long = 10 * 1024 * 1024 // 10MB +private const val CACHE_SIZE_MAX: Long = 250 * 1024 * 1024 // 250MB class LocalStorageManager( private val context: Context, private val settings: AppSettings, ) { + fun createHttpCache(): Cache { + val directory = File(context.externalCacheDir ?: context.cacheDir, "http") + directory.mkdirs() + val maxSize = calculateDiskCacheSize(directory) + return Cache(directory, maxSize) + } + + suspend fun computeCacheSize(cache: CacheDir) = runInterruptible(Dispatchers.IO) { + getCacheDirs(cache.dir).sumOf { it.computeSize() } + } + + suspend fun clearCache(cache: CacheDir) = runInterruptible(Dispatchers.IO) { + getCacheDirs(cache.dir).forEach { it.deleteRecursively() } + } + suspend fun getReadableDirs(): List = runInterruptible(Dispatchers.IO) { getConfiguredStorageDirs() .filter { it.isReadable() } @@ -26,7 +47,7 @@ class LocalStorageManager( } suspend fun getDefaultWriteableDir(): File? = runInterruptible(Dispatchers.IO) { - val preferredDir = settings.getFallbackStorageDir()?.takeIf { it.isWriteable() } + val preferredDir = settings.mangaStorageDir?.takeIf { it.isWriteable() } preferredDir ?: getFallbackStorageDir()?.takeIf { it.isWriteable() } } @@ -35,7 +56,7 @@ class LocalStorageManager( @WorkerThread private fun getConfiguredStorageDirs(): MutableSet { val set = getAvailableStorageDirs() - settings.getFallbackStorageDir()?.let { + settings.mangaStorageDir?.let { set.add(it) } return set @@ -57,6 +78,24 @@ class LocalStorageManager( } } + @WorkerThread + private fun getCacheDirs(subDir: String): MutableSet { + val result = LinkedHashSet() + result += File(context.cacheDir, subDir) + result += context.getExternalFilesDirs(subDir) + return result + } + + private fun calculateDiskCacheSize(cacheDirectory: File): Long { + return try { + val cacheDir = StatFs(cacheDirectory.absolutePath) + val size = CACHE_DISK_PERCENTAGE * cacheDir.blockCountLong * cacheDir.blockSizeLong + return size.toLong().coerceIn(CACHE_SIZE_MIN, CACHE_SIZE_MAX) + } catch (_: Exception) { + CACHE_SIZE_MIN + } + } + private fun File.isReadable() = runCatching { canRead() }.getOrDefault(false) @@ -64,4 +103,4 @@ class LocalStorageManager( private fun File.isWriteable() = runCatching { canWrite() }.getOrDefault(false) -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/local/data/PagesCache.kt b/app/src/main/java/org/koitharu/kotatsu/local/data/PagesCache.kt index 82e70a650..ceed3cd24 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/data/PagesCache.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/data/PagesCache.kt @@ -2,35 +2,25 @@ package org.koitharu.kotatsu.local.data import android.content.Context import com.tomclaw.cache.DiskLruCache -import org.koitharu.kotatsu.utils.FileSizeUtils +import org.koitharu.kotatsu.utils.FileSize import org.koitharu.kotatsu.utils.ext.longHashCode import org.koitharu.kotatsu.utils.ext.subdir import org.koitharu.kotatsu.utils.ext.takeIfReadable import java.io.File import java.io.InputStream -import java.io.OutputStream class PagesCache(context: Context) { private val cacheDir = context.externalCacheDir ?: context.cacheDir private val lruCache = DiskLruCache.create( - cacheDir.subdir(Cache.PAGES.dir), - FileSizeUtils.mbToBytes(200) + cacheDir.subdir(CacheDir.PAGES.dir), + FileSize.MEGABYTES.convert(200, FileSize.BYTES), ) operator fun get(url: String): File? { return lruCache.get(url)?.takeIfReadable() } - @Deprecated("Useless lambda") - fun put(url: String, writer: (OutputStream) -> Unit): File { - val file = File(cacheDir, url.longHashCode().toString()) - file.outputStream().use(writer) - val res = lruCache.put(url, file) - file.delete() - return res - } - fun put(url: String, inputStream: InputStream): File { val file = File(cacheDir, url.longHashCode().toString()) file.outputStream().use { out -> @@ -40,4 +30,4 @@ class PagesCache(context: Context) { file.delete() return res } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainViewModel.kt index 5c9f7a15d..ec9566e68 100644 --- a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainViewModel.kt @@ -5,7 +5,6 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onStart -import org.koitharu.kotatsu.base.domain.MangaProviderFactory import org.koitharu.kotatsu.base.ui.BaseViewModel import org.koitharu.kotatsu.core.exceptions.EmptyHistoryException import org.koitharu.kotatsu.core.model.Manga @@ -25,7 +24,7 @@ class MainViewModel( val remoteSources = settings.observe() .filter { it == AppSettings.KEY_SOURCES_ORDER || it == AppSettings.KEY_SOURCES_HIDDEN } .onStart { emit("") } - .map { MangaProviderFactory.getSources(settings, includeHidden = false) } + .map { settings.getMangaSources(includeHidden = false) } .asLiveDataDistinct(viewModelScope.coroutineContext + Dispatchers.Default) fun openLastReader() { @@ -35,4 +34,4 @@ class MainViewModel( onOpenReader.call(manga) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/domain/PageLoader.kt b/app/src/main/java/org/koitharu/kotatsu/reader/domain/PageLoader.kt index 8e4e8316d..6eb29088c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/domain/PageLoader.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/domain/PageLoader.kt @@ -15,7 +15,6 @@ import org.koitharu.kotatsu.core.model.MangaPage import org.koitharu.kotatsu.core.network.CommonHeaders import org.koitharu.kotatsu.core.parser.MangaRepository import org.koitharu.kotatsu.local.data.PagesCache -import org.koitharu.kotatsu.utils.CacheUtils import org.koitharu.kotatsu.utils.ext.await import org.koitharu.kotatsu.utils.ext.mangaRepositoryOf import java.io.File @@ -70,7 +69,7 @@ class PageLoader( .get() .header(CommonHeaders.REFERER, page.referer) .header(CommonHeaders.ACCEPT, "image/webp,image/png;q=0.9,image/jpeg,*/*;q=0.8") - .cacheControl(CacheUtils.CONTROL_DISABLED) + .cacheControl(CommonHeaders.CACHE_CONTROL_DISABLED) .build() okHttp.newCall(request).await().use { response -> check(response.isSuccessful) { @@ -103,4 +102,4 @@ class PageLoader( } private companion object Lock -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt index dc57a4fb2..b96a46284 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt @@ -56,7 +56,7 @@ class ReaderActivity : BaseFullscreenActivity(), ActivityResultCallback, ReaderControlDelegate.OnInteractionListener { private val viewModel by viewModel { - parametersOf(MangaIntent.from(intent), intent?.getParcelableExtra(EXTRA_STATE)) + parametersOf(MangaIntent(intent), intent?.getParcelableExtra(EXTRA_STATE)) } private lateinit var touchHelper: GridTouchHelper @@ -371,4 +371,4 @@ class ReaderActivity : BaseFullscreenActivity(), .putExtra(EXTRA_STATE, state) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt index fa6203f55..201e10262 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt @@ -160,7 +160,7 @@ class ReaderViewModel( val downloadId = downloadManagerHelper.downloadPage(page, pageUrl) val uri = downloadManagerHelper.awaitDownload(downloadId) onPageSaved.postCall(uri) - } catch (e: CancellationException) { + } catch (_: CancellationException) { } catch (e: Exception) { onPageSaved.postCall(null) } @@ -267,4 +267,4 @@ class ReaderViewModel( } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/search/domain/MangaSearchRepository.kt b/app/src/main/java/org/koitharu/kotatsu/search/domain/MangaSearchRepository.kt index efb736d7b..fc1f293c9 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/domain/MangaSearchRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/domain/MangaSearchRepository.kt @@ -9,7 +9,6 @@ import kotlinx.coroutines.currentCoroutineContext import kotlinx.coroutines.flow.* import kotlinx.coroutines.isActive import kotlinx.coroutines.withContext -import org.koitharu.kotatsu.base.domain.MangaProviderFactory import org.koitharu.kotatsu.core.db.MangaDatabase import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.core.model.MangaSource @@ -27,7 +26,7 @@ class MangaSearchRepository( ) { fun globalSearch(query: String, concurrency: Int = DEFAULT_CONCURRENCY): Flow = - MangaProviderFactory.getSources(settings, includeHidden = false).asFlow() + settings.getMangaSources(includeHidden = false).asFlow() .flatMapMerge(concurrency) { source -> runCatching { MangaRepository(source).getList2( @@ -128,4 +127,4 @@ class MangaSearchRepository( return false } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/AppUpdateChecker.kt b/app/src/main/java/org/koitharu/kotatsu/settings/AppUpdateChecker.kt index 90e9f9bbe..61f0e05c0 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/AppUpdateChecker.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/AppUpdateChecker.kt @@ -20,7 +20,7 @@ import org.koitharu.kotatsu.core.github.AppVersion import org.koitharu.kotatsu.core.github.GithubRepository import org.koitharu.kotatsu.core.github.VersionId import org.koitharu.kotatsu.core.prefs.AppSettings -import org.koitharu.kotatsu.utils.FileSizeUtils +import org.koitharu.kotatsu.utils.FileSize import org.koitharu.kotatsu.utils.ext.byte2HexFormatted import java.io.ByteArrayInputStream import java.io.InputStream @@ -85,7 +85,7 @@ class AppUpdateChecker(private val activity: ComponentActivity) { append( activity.getString( R.string.size_s, - FileSizeUtils.formatBytes(activity, version.apkSize) + FileSize.BYTES.format(activity, version.apkSize), ) ) appendLine() @@ -144,4 +144,4 @@ class AppUpdateChecker(private val activity: ComponentActivity) { } } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt index 82abffced..1ad2af3fd 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt @@ -5,20 +5,18 @@ import android.view.View import androidx.preference.Preference import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import org.koin.android.ext.android.get import org.koin.android.ext.android.inject import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.BasePreferenceFragment import org.koitharu.kotatsu.core.network.AndroidCookieJar import org.koitharu.kotatsu.core.prefs.AppSettings -import org.koitharu.kotatsu.local.data.Cache +import org.koitharu.kotatsu.local.data.CacheDir +import org.koitharu.kotatsu.local.data.LocalStorageManager import org.koitharu.kotatsu.search.domain.MangaSearchRepository import org.koitharu.kotatsu.tracker.domain.TrackingRepository -import org.koitharu.kotatsu.utils.CacheUtils -import org.koitharu.kotatsu.utils.FileSizeUtils +import org.koitharu.kotatsu.utils.FileSize import org.koitharu.kotatsu.utils.ext.getDisplayMessage import org.koitharu.kotatsu.utils.ext.viewLifecycleScope @@ -26,6 +24,7 @@ class HistorySettingsFragment : BasePreferenceFragment(R.string.history_and_cach private val trackerRepo by inject(mode = LazyThreadSafetyMode.NONE) private val searchRepository by inject(mode = LazyThreadSafetyMode.NONE) + private val storageManager by inject(mode = LazyThreadSafetyMode.NONE) override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { addPreferencesFromResource(R.xml.pref_history) @@ -35,18 +34,14 @@ class HistorySettingsFragment : BasePreferenceFragment(R.string.history_and_cach super.onViewCreated(view, savedInstanceState) findPreference(AppSettings.KEY_PAGES_CACHE_CLEAR)?.let { pref -> viewLifecycleScope.launchWhenResumed { - val size = withContext(Dispatchers.IO) { - CacheUtils.computeCacheSize(pref.context, Cache.PAGES.dir) - } - pref.summary = FileSizeUtils.formatBytes(pref.context, size) + val size = storageManager.computeCacheSize(CacheDir.PAGES) + pref.summary = FileSize.BYTES.format(pref.context, size) } } findPreference(AppSettings.KEY_THUMBS_CACHE_CLEAR)?.let { pref -> viewLifecycleScope.launchWhenResumed { - val size = withContext(Dispatchers.IO) { - CacheUtils.computeCacheSize(pref.context, Cache.THUMBS.dir) - } - pref.summary = FileSizeUtils.formatBytes(pref.context, size) + val size = storageManager.computeCacheSize(CacheDir.THUMBS) + pref.summary = FileSize.BYTES.format(pref.context, size) } } findPreference(AppSettings.KEY_SEARCH_HISTORY_CLEAR)?.let { pref -> @@ -68,11 +63,11 @@ class HistorySettingsFragment : BasePreferenceFragment(R.string.history_and_cach override fun onPreferenceTreeClick(preference: Preference): Boolean { return when (preference.key) { AppSettings.KEY_PAGES_CACHE_CLEAR -> { - clearCache(preference, Cache.PAGES) + clearCache(preference, CacheDir.PAGES) true } AppSettings.KEY_THUMBS_CACHE_CLEAR -> { - clearCache(preference, Cache.THUMBS) + clearCache(preference, CacheDir.THUMBS) true } AppSettings.KEY_COOKIES_CLEAR -> { @@ -100,16 +95,14 @@ class HistorySettingsFragment : BasePreferenceFragment(R.string.history_and_cach } } - private fun clearCache(preference: Preference, cache: Cache) { + private fun clearCache(preference: Preference, cache: CacheDir) { val ctx = preference.context.applicationContext viewLifecycleScope.launch { try { preference.isEnabled = false - val size = withContext(Dispatchers.IO) { - CacheUtils.clearCache(ctx, cache.dir) - CacheUtils.computeCacheSize(ctx, cache.dir) - } - preference.summary = FileSizeUtils.formatBytes(ctx, size) + storageManager.clearCache(cache) + val size = storageManager.computeCacheSize(cache) + preference.summary = FileSize.BYTES.format(ctx, size) } catch (e: Exception) { preference.summary = e.getDisplayMessage(ctx.resources) } finally { @@ -154,4 +147,4 @@ class HistorySettingsFragment : BasePreferenceFragment(R.string.history_and_cach } }.show() } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/MainSettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/MainSettingsFragment.kt index 5b716c75b..17e8b6a93 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/MainSettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/MainSettingsFragment.kt @@ -162,7 +162,7 @@ class MainSettingsFragment : BasePreferenceFragment(R.string.settings), } override fun onStorageSelected(file: File) { - settings.setStorageDir(file) + settings.mangaStorageDir = file } private fun Preference.bindStorageName() { diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/sources/SourcesSettingsViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/settings/sources/SourcesSettingsViewModel.kt index a908ccf4e..05b832038 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/sources/SourcesSettingsViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/sources/SourcesSettingsViewModel.kt @@ -3,7 +3,6 @@ package org.koitharu.kotatsu.settings.sources import androidx.core.os.LocaleListCompat import androidx.lifecycle.MutableLiveData import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.domain.MangaProviderFactory import org.koitharu.kotatsu.base.ui.BaseViewModel import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.core.prefs.AppSettings @@ -70,7 +69,7 @@ class SourcesSettingsViewModel( } private fun buildList() { - val sources = MangaProviderFactory.getSources(settings, includeHidden = true) + val sources = settings.getMangaSources(includeHidden = true) val hiddenSources = settings.hiddenSources val query = searchQuery if (!query.isNullOrEmpty()) { @@ -155,4 +154,4 @@ class SourcesSettingsViewModel( } } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/CacheUtils.kt b/app/src/main/java/org/koitharu/kotatsu/utils/CacheUtils.kt deleted file mode 100644 index 37487e297..000000000 --- a/app/src/main/java/org/koitharu/kotatsu/utils/CacheUtils.kt +++ /dev/null @@ -1,55 +0,0 @@ -package org.koitharu.kotatsu.utils - -import android.content.Context -import android.os.StatFs -import androidx.annotation.WorkerThread -import okhttp3.Cache -import okhttp3.CacheControl -import org.koitharu.kotatsu.utils.ext.computeSize -import org.koitharu.kotatsu.utils.ext.sub -import java.io.File - -object CacheUtils { - - const val QUALIFIER_HTTP = "cache_http" - - val CONTROL_DISABLED = CacheControl.Builder() - .noStore() - .build() - - fun getCacheDirs(context: Context) = (context.externalCacheDirs + context.cacheDir) - .filterNotNull() - .distinctBy { it.absolutePath } - - @WorkerThread - fun computeCacheSize(context: Context, name: String) = getCacheDirs(context) - .map { File(it, name) } - .sumOf { x -> x.computeSize() } - - @WorkerThread - fun clearCache(context: Context, name: String) = getCacheDirs(context) - .map { File(it, name) } - .forEach { it.deleteRecursively() } - - // FIXME need async implementation - fun createHttpCache(context: Context): Cache { - val directory = (context.externalCacheDir ?: context.cacheDir).sub("http") - directory.mkdirs() - val maxSize = calculateDiskCacheSize(directory) // TODO blocking call - return Cache(directory, maxSize) - } - - private fun calculateDiskCacheSize(cacheDirectory: File): Long { - return try { - val cacheDir = StatFs(cacheDirectory.absolutePath) - val size = DISK_CACHE_PERCENTAGE * cacheDir.blockCountLong * cacheDir.blockSizeLong - return size.toLong().coerceIn(MIN_DISK_CACHE_SIZE, MAX_DISK_CACHE_SIZE) - } catch (_: Exception) { - MIN_DISK_CACHE_SIZE - } - } - - private const val DISK_CACHE_PERCENTAGE = 0.02 - private const val MIN_DISK_CACHE_SIZE: Long = 10 * 1024 * 1024 // 10MB - private const val MAX_DISK_CACHE_SIZE: Long = 250 * 1024 * 1024 // 250MB -} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/FileSizeUtils.kt b/app/src/main/java/org/koitharu/kotatsu/utils/FileSize.kt similarity index 56% rename from app/src/main/java/org/koitharu/kotatsu/utils/FileSizeUtils.kt rename to app/src/main/java/org/koitharu/kotatsu/utils/FileSize.kt index 2c45c2e22..f06200dbd 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/FileSizeUtils.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/FileSize.kt @@ -6,14 +6,14 @@ import java.text.DecimalFormat import kotlin.math.log10 import kotlin.math.pow +enum class FileSize(private val multiplier: Int) { -object FileSizeUtils { + BYTES(1), KILOBYTES(1024), MEGABYTES(1024 * 1024); - fun mbToBytes(mb: Int) = 1024L * 1024L * mb + fun convert(amount: Long, target: FileSize): Long = amount * multiplier / target.multiplier - fun kbToBytes(kb: Int) = 1024L * kb - - fun formatBytes(context: Context, bytes: Long): String { + fun format(context: Context, amount: Long): String { + val bytes = amount * multiplier val units = context.getString(R.string.text_file_sizes).split('|') if (bytes <= 0) { return "0 ${units.first()}" @@ -23,10 +23,13 @@ object FileSizeUtils { append( DecimalFormat("#,##0.#").format( bytes / 1024.0.pow(digitGroups.toDouble()) - ).toString() + ) ) - append(' ') - append(units.getOrNull(digitGroups).orEmpty()) + val unit = units.getOrNull(digitGroups) + if (unit != null) { + append(' ') + append(unit) + } } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/PendingIntentCompat.kt b/app/src/main/java/org/koitharu/kotatsu/utils/PendingIntentCompat.kt index c99050819..9bdd10971 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/PendingIntentCompat.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/PendingIntentCompat.kt @@ -5,15 +5,17 @@ import android.os.Build object PendingIntentCompat { + @JvmField val FLAG_IMMUTABLE = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { PendingIntent.FLAG_IMMUTABLE } else { 0 } + @JvmField val FLAG_MUTABLE = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { PendingIntent.FLAG_MUTABLE } else { 0 } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/anim/Motion.kt b/app/src/main/java/org/koitharu/kotatsu/utils/anim/Motion.kt index ba9896400..9f90546fd 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/anim/Motion.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/anim/Motion.kt @@ -91,4 +91,4 @@ sealed class Motion { anim.interpolator = DecelerateInterpolator() } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/delegates/ParcelableArgumentDelegate.kt b/app/src/main/java/org/koitharu/kotatsu/utils/delegates/ParcelableArgumentDelegate.kt deleted file mode 100644 index 113637107..000000000 --- a/app/src/main/java/org/koitharu/kotatsu/utils/delegates/ParcelableArgumentDelegate.kt +++ /dev/null @@ -1,14 +0,0 @@ -package org.koitharu.kotatsu.utils.delegates - -import android.os.Parcelable -import androidx.fragment.app.Fragment -import kotlin.properties.ReadOnlyProperty -import kotlin.reflect.KProperty - -class ParcelableArgumentDelegate(private val name: String) : - ReadOnlyProperty { - - override fun getValue(thisRef: Fragment, property: KProperty<*>): T { - return thisRef.requireArguments().getParcelable(name)!! - } -} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/delegates/StringArgumentDelegate.kt b/app/src/main/java/org/koitharu/kotatsu/utils/delegates/StringArgumentDelegate.kt deleted file mode 100644 index 29515feb3..000000000 --- a/app/src/main/java/org/koitharu/kotatsu/utils/delegates/StringArgumentDelegate.kt +++ /dev/null @@ -1,12 +0,0 @@ -package org.koitharu.kotatsu.utils.delegates - -import androidx.fragment.app.Fragment -import kotlin.properties.ReadOnlyProperty -import kotlin.reflect.KProperty - -class StringArgumentDelegate(private val name: String) : ReadOnlyProperty { - - override fun getValue(thisRef: Fragment, property: KProperty<*>): String? { - return thisRef.arguments?.getString(name) - } -} \ No newline at end of file From 19c751d349b15f377b0865617edb2e9592014258 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sat, 26 Feb 2022 11:39:10 +0200 Subject: [PATCH 57/70] Small ui updates --- .../java/org/koitharu/kotatsu/utils/ext/StringExt.kt | 6 +++--- .../drawable/{ic_bookmark_add.xml => ic_list_add.xml} | 6 +++--- app/src/main/res/drawable/ic_loading.xml | 11 +++++++++++ app/src/main/res/layout/activity_categories.xml | 6 ++++-- .../main/res/layout/dialog_favorite_categories.xml | 4 ++-- app/src/main/res/menu/opt_reader_bottom.xml | 11 ++--------- app/src/main/res/values/styles.xml | 2 +- 7 files changed, 26 insertions(+), 20 deletions(-) rename app/src/main/res/drawable/{ic_bookmark_add.xml => ic_list_add.xml} (55%) create mode 100644 app/src/main/res/drawable/ic_loading.xml diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/StringExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/StringExt.kt index 380019019..1f7961634 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/StringExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/StringExt.kt @@ -12,13 +12,13 @@ fun String.longHashCode(): Long { var h = 1125899906842597L val len: Int = this.length for (i in 0 until len) { - h = 31 * h + this[i].toLong() + h = 31 * h + this[i].code } return h } fun String.removeSurrounding(vararg chars: Char): String { - if (length == 0) { + if (isEmpty()) { return this } for (c in chars) { @@ -224,4 +224,4 @@ inline fun StringBuilder.appendAll( } append(transform(item)) } -} \ No newline at end of file +} diff --git a/app/src/main/res/drawable/ic_bookmark_add.xml b/app/src/main/res/drawable/ic_list_add.xml similarity index 55% rename from app/src/main/res/drawable/ic_bookmark_add.xml rename to app/src/main/res/drawable/ic_list_add.xml index 81ac20eb6..7a804e7a0 100644 --- a/app/src/main/res/drawable/ic_bookmark_add.xml +++ b/app/src/main/res/drawable/ic_list_add.xml @@ -3,10 +3,10 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" - android:tint="?android:textColorPrimary" + android:tint="?attr/colorControlNormal" android:viewportWidth="24" android:viewportHeight="24"> - \ No newline at end of file + android:pathData="M2,16H10V14H2M18,14V10H16V14H12V16H16V20H18V16H22V14M14,6H2V8H14M14,10H2V12H14V10Z" /> + diff --git a/app/src/main/res/drawable/ic_loading.xml b/app/src/main/res/drawable/ic_loading.xml new file mode 100644 index 000000000..02ad35b76 --- /dev/null +++ b/app/src/main/res/drawable/ic_loading.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/layout/activity_categories.xml b/app/src/main/res/layout/activity_categories.xml index 9c05aee7f..5dcfe622d 100644 --- a/app/src/main/res/layout/activity_categories.xml +++ b/app/src/main/res/layout/activity_categories.xml @@ -41,16 +41,18 @@ android:visibility="gone" tools:visibility="visible" /> - - \ No newline at end of file + diff --git a/app/src/main/res/layout/dialog_favorite_categories.xml b/app/src/main/res/layout/dialog_favorite_categories.xml index c9ba0ebe0..a510d4c8c 100644 --- a/app/src/main/res/layout/dialog_favorite_categories.xml +++ b/app/src/main/res/layout/dialog_favorite_categories.xml @@ -42,6 +42,6 @@ android:paddingEnd="?android:listPreferredItemPaddingEnd" android:text="@string/add_new_category" android:textAppearance="?attr/textAppearanceBodyLarge" - app:drawableEndCompat="@drawable/ic_add" /> + app:drawableEndCompat="@drawable/ic_list_add" /> - \ No newline at end of file + diff --git a/app/src/main/res/menu/opt_reader_bottom.xml b/app/src/main/res/menu/opt_reader_bottom.xml index 4c72591b6..b56029f73 100644 --- a/app/src/main/res/menu/opt_reader_bottom.xml +++ b/app/src/main/res/menu/opt_reader_bottom.xml @@ -12,13 +12,6 @@ android:visible="false" app:showAsAction="always" /> - - @@ -41,4 +34,4 @@ android:title="@string/settings" app:showAsAction="never" /> - \ No newline at end of file + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 4ca1bf269..fd4d5d283 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -140,4 +140,4 @@ @layout/pref_slider - \ No newline at end of file + From 62a177fcb33078ab2e57bcfac78af22cf567443d Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sat, 26 Feb 2022 11:43:59 +0200 Subject: [PATCH 58/70] Remove empty non-translated strings --- app/src/main/res/values-ar/strings.xml | 254 --------------------- app/src/main/res/values-be/strings.xml | 4 +- app/src/main/res/values-de/strings.xml | 4 +- app/src/main/res/values-es/strings.xml | 4 +- app/src/main/res/values-fa/strings.xml | 246 +------------------- app/src/main/res/values-fi/strings.xml | 9 +- app/src/main/res/values-fr/strings.xml | 4 +- app/src/main/res/values-it/strings.xml | 6 +- app/src/main/res/values-nb-rNO/strings.xml | 4 +- app/src/main/res/values-ota/strings.xml | 254 --------------------- app/src/main/res/values-pt/strings.xml | 4 +- app/src/main/res/values-ru/strings.xml | 5 +- app/src/main/res/values-si/strings.xml | 248 +------------------- app/src/main/res/values-tr/strings.xml | 198 +--------------- 14 files changed, 14 insertions(+), 1230 deletions(-) delete mode 100644 app/src/main/res/values-ar/strings.xml delete mode 100644 app/src/main/res/values-ota/strings.xml diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml deleted file mode 100644 index 2780e73ce..000000000 --- a/app/src/main/res/values-ar/strings.xml +++ /dev/null @@ -1,254 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 0b8d3bb5b..661a3a7fd 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -251,6 +251,4 @@ Даступныя крыніцы Дынамічная тэма Ужывае тэму праграмы, заснаваную на каляровай палітры шпалер на прыладзе - - - \ No newline at end of file + diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 618e4666e..4dc78a429 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -250,6 +250,4 @@ Verfügbare Quellen Dynamisches Thema Wendet ein Thema an, das auf dem Farbschema Ihres Hintergrundbildes basiert - - - \ No newline at end of file + diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index c89c663a3..0b67f84f2 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -250,6 +250,4 @@ Fuentes disponibles Tema dinámico Aplica un tema creado a partir del esquema de colores de su fondo de pantalla - - - \ No newline at end of file + diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 725ddf0d7..e15f2aab5 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -7,248 +7,4 @@ تاریخچه خطایی رخ داده است خطای اتصال به شبکه - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 6aff3bed9..516bc1cab 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -246,11 +246,4 @@ Oletus Nimi ei saa olla tyhjä Sulje NSFW-mangat pois historiasta - - - - - - - - \ No newline at end of file + diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 3be71f35d..f539bef2e 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -250,6 +250,4 @@ Sources disponibles Thème dynamique Applique un thème créé d\'après la palette de couleurs de votre fond d\'écran - - - \ No newline at end of file + diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 5e6546ba6..e6415a28b 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -249,8 +249,4 @@ Mostra i numeri delle pagine Fonti abilitate Fonti disponibili - - - - - \ No newline at end of file + diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 0a93e4a83..9ebb04752 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -250,6 +250,4 @@ Brukte kilder Dynamisk tema Bruker et tema basert på fargene til bakgrunnen din - - - \ No newline at end of file + diff --git a/app/src/main/res/values-ota/strings.xml b/app/src/main/res/values-ota/strings.xml deleted file mode 100644 index 599893cd8..000000000 --- a/app/src/main/res/values-ota/strings.xml +++ /dev/null @@ -1,254 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index deeccb1e1..944e30a6f 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -250,6 +250,4 @@ Padrão Tema dinâmico Aplica um tema criado no esquema de cores do seu papel de parede - - - \ 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 index 7df2c0413..cd10015bf 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -249,7 +249,4 @@ Доступные источники Динамическая тема Применяет тему приложения, основанную на цветовой палитре обоев на устройстве - - - - \ No newline at end of file + diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml index a902e6c64..3b781e5da 100644 --- a/app/src/main/res/values-si/strings.xml +++ b/app/src/main/res/values-si/strings.xml @@ -1,5 +1,5 @@ - + පූරණය වෙමින්… සැකසුම් පරිච්ඡේද @@ -7,248 +7,4 @@ දෝෂයක් සිදුවී ඇත ඉතිහාසය ප්‍රියතමයන් - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 465ba3207..50c3a8acd 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -1,5 +1,5 @@ - + İnternete bağlı olduğunuzdan emin olunuz Menüyü kapat Menüyü aç @@ -57,198 +57,4 @@ Detaylar Ayarlar Kaydet - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + From a2d3b88c08b854410b005b42801e135f718454a4 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sat, 26 Feb 2022 12:06:19 +0200 Subject: [PATCH 59/70] Fix non-translatable strings --- .../kotatsu/remotelist/ui/RemoteListViewModel.kt | 4 ++-- app/src/main/res/values/constants.xml | 13 +++++++------ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListViewModel.kt index b9b1f3d3e..e92616d4c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListViewModel.kt @@ -37,7 +37,7 @@ class RemoteListViewModel( when { list.isNullOrEmpty() && error != null -> listOf(error.toErrorState(canRetry = true)) list == null -> listOf(LoadingState) - list.isEmpty() -> listOf(EmptyState(R.drawable.ic_book_cross, R.string.nothing_found, R.string._empty)) + list.isEmpty() -> listOf(EmptyState(R.drawable.ic_book_cross, R.string.nothing_found, R.string.empty)) else -> { val result = ArrayList(list.size + 3) result += headerModel @@ -128,4 +128,4 @@ class RemoteListViewModel( } } } -} \ No newline at end of file +} diff --git a/app/src/main/res/values/constants.xml b/app/src/main/res/values/constants.xml index ef43396ce..42c7b0d1d 100644 --- a/app/src/main/res/values/constants.xml +++ b/app/src/main/res/values/constants.xml @@ -1,22 +1,23 @@ - + + -1 1 2 - + taps volume - + taps - + favourites history - + favourites - \ No newline at end of file + From a932fd2cd9e8e18219c35b83e60ea8500c591e23 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sat, 26 Feb 2022 11:05:58 +0100 Subject: [PATCH 60/70] Update translation files Updated by "Cleanup translation files" hook in Weblate. Update translation files Updated by "Remove blank strings" hook in Weblate. Update translation files Updated by "Remove blank strings" hook in Weblate. Co-authored-by: Hosted Weblate Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/ Translation: Kotatsu/Strings --- app/src/main/res/values-ja/strings.xml | 2 -- app/src/main/res/values/strings.xml | 3 --- 2 files changed, 5 deletions(-) diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index d41cb1861..e7df0cc7e 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -161,8 +161,6 @@ パスワードが間違っています アプリを保護する 最新のアップデートを確認する - - アップデートを見つける事が出来ませんでした 利用可能なアップデートはありません 右から左(←) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bbdd6db5a..2ae182b95 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,7 +1,5 @@ - Kotatsu - Close menu Open menu Local storage @@ -168,7 +166,6 @@ Prefer right-to-left (→) reader Reading mode can be set up separately for each series New category - Create issue on GitHub Scale mode Fit center Fit to height From 2e26204a4eba32718b642b55767f7366097b8105 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Sat, 26 Feb 2022 11:21:07 +0100 Subject: [PATCH 61/70] Translated using Weblate (Spanish) Currently translated at 100.0% (248 of 248 strings) Translated using Weblate (Belarusian) Currently translated at 100.0% (248 of 248 strings) Co-authored-by: Anonymous Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/be/ Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/es/ Translation: Kotatsu/Strings --- app/src/main/res/values-be/strings.xml | 2 +- app/src/main/res/values-es/strings.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 661a3a7fd..42ddfca78 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -251,4 +251,4 @@ Даступныя крыніцы Дынамічная тэма Ужывае тэму праграмы, заснаваную на каляровай палітры шпалер на прыладзе - + \ No newline at end of file diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 0b67f84f2..e30f7148c 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -250,4 +250,4 @@ Fuentes disponibles Tema dinámico Aplica un tema creado a partir del esquema de colores de su fondo de pantalla - + \ No newline at end of file From e6b574d13f66270806c3b73d1aec51bb5f6ebf04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Sat, 26 Feb 2022 11:21:07 +0100 Subject: [PATCH 62/70] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegian?= =?UTF-8?q?=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (248 of 248 strings) Co-authored-by: Allan Nordhøy Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/nb_NO/ Translation: Kotatsu/Strings --- app/src/main/res/values-nb-rNO/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 9ebb04752..ba9581b85 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -250,4 +250,4 @@ Brukte kilder Dynamisk tema Bruker et tema basert på fargene til bakgrunnen din - + \ No newline at end of file From 2d387338229e2f31c2ff638759ccfec39793cb7e Mon Sep 17 00:00:00 2001 From: "J. Lavoie" Date: Sat, 26 Feb 2022 11:21:08 +0100 Subject: [PATCH 63/70] Translated using Weblate (Finnish) Currently translated at 97.9% (243 of 248 strings) Translated using Weblate (French) Currently translated at 100.0% (248 of 248 strings) Translated using Weblate (Italian) Currently translated at 99.1% (246 of 248 strings) Translated using Weblate (German) Currently translated at 100.0% (248 of 248 strings) Co-authored-by: J. Lavoie Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/de/ Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fi/ Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fr/ Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/it/ Translation: Kotatsu/Strings --- app/src/main/res/values-de/strings.xml | 2 +- app/src/main/res/values-fi/strings.xml | 2 +- app/src/main/res/values-fr/strings.xml | 2 +- app/src/main/res/values-it/strings.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 4dc78a429..f9ee4484c 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -250,4 +250,4 @@ Verfügbare Quellen Dynamisches Thema Wendet ein Thema an, das auf dem Farbschema Ihres Hintergrundbildes basiert - + \ No newline at end of file diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 516bc1cab..bd32b7d04 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -246,4 +246,4 @@ Oletus Nimi ei saa olla tyhjä Sulje NSFW-mangat pois historiasta - + \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index f539bef2e..c82b662cf 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -250,4 +250,4 @@ Sources disponibles Thème dynamique Applique un thème créé d\'après la palette de couleurs de votre fond d\'écran - + \ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index e6415a28b..51c82d27e 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -249,4 +249,4 @@ Mostra i numeri delle pagine Fonti abilitate Fonti disponibili - + \ No newline at end of file From 844418861655010d91758103c6f1a4f5d40831f4 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Sat, 26 Feb 2022 11:21:08 +0100 Subject: [PATCH 64/70] Translated using Weblate (Russian) Currently translated at 100.0% (248 of 248 strings) Translated using Weblate (Turkish) Currently translated at 22.9% (57 of 248 strings) Translated using Weblate (Persian) Currently translated at 2.8% (7 of 248 strings) Translated using Weblate (Finnish) Currently translated at 97.9% (243 of 248 strings) Translated using Weblate (Sinhala) Currently translated at 2.8% (7 of 248 strings) Translated using Weblate (Italian) Currently translated at 99.1% (246 of 248 strings) Co-authored-by: Anonymous Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fa/ Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fi/ Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/it/ Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/ru/ Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/si/ Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/tr/ Translation: Kotatsu/Strings --- app/src/main/res/values-fa/strings.xml | 243 +++++++++++++++++++++++- app/src/main/res/values-fi/strings.xml | 5 + app/src/main/res/values-it/strings.xml | 2 + app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values-si/strings.xml | 245 ++++++++++++++++++++++++- app/src/main/res/values-tr/strings.xml | 195 +++++++++++++++++++- 6 files changed, 686 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index e15f2aab5..75a7dfc12 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -7,4 +7,245 @@ تاریخچه خطایی رخ داده است خطای اتصال به شبکه - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index bd32b7d04..b47dd0196 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -246,4 +246,9 @@ Oletus Nimi ei saa olla tyhjä Sulje NSFW-mangat pois historiasta + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 51c82d27e..fa5435ab3 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -249,4 +249,6 @@ Mostra i numeri delle pagine Fonti abilitate Fonti disponibili + + \ 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 index cd10015bf..c15cb6480 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -249,4 +249,4 @@ Доступные источники Динамическая тема Применяет тему приложения, основанную на цветовой палитре обоев на устройстве - + \ No newline at end of file diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml index 3b781e5da..1509dff3f 100644 --- a/app/src/main/res/values-si/strings.xml +++ b/app/src/main/res/values-si/strings.xml @@ -1,5 +1,5 @@ - + පූරණය වෙමින්… සැකසුම් පරිච්ඡේද @@ -7,4 +7,245 @@ දෝෂයක් සිදුවී ඇත ඉතිහාසය ප්‍රියතමයන් - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 50c3a8acd..8a1c267ef 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -1,5 +1,5 @@ - + İnternete bağlı olduğunuzdan emin olunuz Menüyü kapat Menüyü aç @@ -57,4 +57,195 @@ Detaylar Ayarlar Kaydet - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 2f9364561d3476d183990c7d2ee2066bdeee57e6 Mon Sep 17 00:00:00 2001 From: Luiz-bro Date: Sat, 26 Feb 2022 11:21:09 +0100 Subject: [PATCH 65/70] Translated using Weblate (Portuguese) Currently translated at 100.0% (248 of 248 strings) Co-authored-by: Luiz-bro Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/pt/ Translation: Kotatsu/Strings --- app/src/main/res/values-pt/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 944e30a6f..cb4231b57 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -250,4 +250,4 @@ Padrão Tema dinâmico Aplica um tema criado no esquema de cores do seu papel de parede - + \ No newline at end of file From 3235141b2e6d69fc60864a7ba3bea4c5a6556593 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sat, 26 Feb 2022 11:21:09 +0100 Subject: [PATCH 66/70] Update translation files Updated by "Remove blank strings" hook in Weblate. Update translation files Updated by "Remove blank strings" hook in Weblate. Update translation files Updated by "Remove blank strings" hook in Weblate. Update translation files Updated by "Remove blank strings" hook in Weblate. Update translation files Updated by "Remove blank strings" hook in Weblate. Update translation files Updated by "Remove blank strings" hook in Weblate. Update translation files Updated by "Remove blank strings" hook in Weblate. Update translation files Updated by "Remove blank strings" hook in Weblate. Co-authored-by: Hosted Weblate Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/ Translation: Kotatsu/Strings --- app/src/main/res/values-fa/strings.xml | 241 ------------------------- app/src/main/res/values-fi/strings.xml | 5 - app/src/main/res/values-it/strings.xml | 2 - app/src/main/res/values-si/strings.xml | 241 ------------------------- app/src/main/res/values-tr/strings.xml | 191 -------------------- 5 files changed, 680 deletions(-) diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 75a7dfc12..80f3cd356 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -7,245 +7,4 @@ تاریخچه خطایی رخ داده است خطای اتصال به شبکه - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index b47dd0196..bd32b7d04 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -246,9 +246,4 @@ Oletus Nimi ei saa olla tyhjä Sulje NSFW-mangat pois historiasta - - - - - \ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index fa5435ab3..51c82d27e 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -249,6 +249,4 @@ Mostra i numeri delle pagine Fonti abilitate Fonti disponibili - - \ No newline at end of file diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml index 1509dff3f..41ba39379 100644 --- a/app/src/main/res/values-si/strings.xml +++ b/app/src/main/res/values-si/strings.xml @@ -7,245 +7,4 @@ දෝෂයක් සිදුවී ඇත ඉතිහාසය ප්‍රියතමයන් - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 8a1c267ef..ec325a3c7 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -57,195 +57,4 @@ Detaylar Ayarlar Kaydet - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From 70db9ba94a8e8e526b194979c33a852777dbe588 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sat, 26 Feb 2022 13:10:34 +0200 Subject: [PATCH 67/70] Update fast scroll --- .editorconfig | 2 +- app/src/main/res/drawable/thumb.xml | 10 ++++++---- app/src/main/res/drawable/track.xml | 11 +---------- app/src/main/res/layout-w600dp/fragment_list.xml | 5 ----- app/src/main/res/layout/fragment_chapters.xml | 5 ----- app/src/main/res/layout/fragment_list.xml | 5 ----- app/src/main/res/values-night/colors.xml | 1 + app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/strings.xml | 3 ++- app/src/main/res/values/styles.xml | 8 ++++++++ app/src/main/res/values/themes.xml | 1 + 11 files changed, 21 insertions(+), 31 deletions(-) diff --git a/.editorconfig b/.editorconfig index ab724a305..e52454a9d 100644 --- a/.editorconfig +++ b/.editorconfig @@ -5,7 +5,7 @@ charset = utf-8 end_of_line = lf indent_size = 4 indent_style = tab -insert_final_newline = true +insert_final_newline = false max_line_length = 120 tab_width = 4 diff --git a/app/src/main/res/drawable/thumb.xml b/app/src/main/res/drawable/thumb.xml index 8d1b235a1..3aef507f4 100644 --- a/app/src/main/res/drawable/thumb.xml +++ b/app/src/main/res/drawable/thumb.xml @@ -3,12 +3,14 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> - + + android:bottom="10dp" + android:left="10dp" + android:right="10dp" + android:top="10dp" /> - + \ No newline at end of file diff --git a/app/src/main/res/drawable/track.xml b/app/src/main/res/drawable/track.xml index ebffeab9b..00bd82d2e 100644 --- a/app/src/main/res/drawable/track.xml +++ b/app/src/main/res/drawable/track.xml @@ -1,13 +1,4 @@ - - - - - \ No newline at end of file + android:shape="rectangle" /> \ No newline at end of file diff --git a/app/src/main/res/layout-w600dp/fragment_list.xml b/app/src/main/res/layout-w600dp/fragment_list.xml index cc60564d7..38ca57381 100644 --- a/app/src/main/res/layout-w600dp/fragment_list.xml +++ b/app/src/main/res/layout-w600dp/fragment_list.xml @@ -20,13 +20,8 @@ android:layout_height="match_parent" android:orientation="vertical" android:padding="@dimen/grid_spacing_outer" - android:scrollbarStyle="outsideOverlay" android:scrollbars="vertical" app:fastScrollEnabled="true" - app:fastScrollHorizontalThumbDrawable="@drawable/list_thumb" - app:fastScrollHorizontalTrackDrawable="@drawable/list_track" - app:fastScrollVerticalThumbDrawable="@drawable/list_thumb" - app:fastScrollVerticalTrackDrawable="@drawable/list_track" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" tools:listitem="@layout/item_manga_list" /> diff --git a/app/src/main/res/layout/fragment_chapters.xml b/app/src/main/res/layout/fragment_chapters.xml index 72b02995e..33508fba8 100644 --- a/app/src/main/res/layout/fragment_chapters.xml +++ b/app/src/main/res/layout/fragment_chapters.xml @@ -28,12 +28,7 @@ android:layout_alignParentBottom="true" android:clipToPadding="false" android:orientation="vertical" - android:scrollbarStyle="outsideOverlay" app:fastScrollEnabled="true" - app:fastScrollHorizontalThumbDrawable="@drawable/list_thumb" - app:fastScrollHorizontalTrackDrawable="@drawable/list_track" - app:fastScrollVerticalThumbDrawable="@drawable/list_thumb" - app:fastScrollVerticalTrackDrawable="@drawable/list_track" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" tools:listitem="@layout/item_chapter" /> diff --git a/app/src/main/res/layout/fragment_list.xml b/app/src/main/res/layout/fragment_list.xml index 2cc769f1a..e74dc8654 100644 --- a/app/src/main/res/layout/fragment_list.xml +++ b/app/src/main/res/layout/fragment_list.xml @@ -18,13 +18,8 @@ android:clipToPadding="false" android:orientation="vertical" android:padding="@dimen/grid_spacing_outer" - android:scrollbarStyle="outsideOverlay" android:scrollbars="vertical" app:fastScrollEnabled="true" - app:fastScrollHorizontalThumbDrawable="@drawable/list_thumb" - app:fastScrollHorizontalTrackDrawable="@drawable/list_track" - app:fastScrollVerticalThumbDrawable="@drawable/list_thumb" - app:fastScrollVerticalTrackDrawable="@drawable/list_track" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" tools:listitem="@layout/item_manga_list" /> diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml index 57976b76a..da4b44148 100644 --- a/app/src/main/res/values-night/colors.xml +++ b/app/src/main/res/values-night/colors.xml @@ -8,5 +8,6 @@ #930006 #680003 #FFDAD4 + #66FFFFFF \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index c68f94bc0..0ff097af8 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -22,5 +22,6 @@ #212121 #99000000 #99000000 + #66000000 \ 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 2ae182b95..f090d4012 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -174,11 +174,12 @@ Black Uses less power on AMOLED screens Restart required - + Backup and restore Create data backup Restore from backup Restored Preparing… + Create issue on GitHub File not found All data was restored The data was restored, but there are errors diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index fd4d5d283..a7593b677 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -84,6 +84,14 @@ @null + + diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 46ad0e12f..ac59adba4 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -67,6 +67,7 @@ @style/Widget.Kotatsu.Tabs @style/Widget.Kotatsu.Switch @style/Widget.Material3.CardView.Elevated + @style/Widget.Kotatsu.RecyclerView ?attr/textAppearanceBodyLarge From ed4c470bdce988be2f2d8155d58baf4af1af922f Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sat, 26 Feb 2022 13:56:21 +0200 Subject: [PATCH 68/70] Support batch manga import --- .../kotatsu/local/data/LocalStorageManager.kt | 4 ++ .../local/domain/LocalMangaRepository.kt | 30 +++++++++-- .../kotatsu/local/ui/LocalListFragment.kt | 38 ++++++++++--- .../kotatsu/local/ui/LocalListViewModel.kt | 54 +++++++++---------- .../org/koitharu/kotatsu/utils/ext/FileExt.kt | 12 ----- app/src/main/res/values/strings.xml | 1 + 6 files changed, 88 insertions(+), 51 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/local/data/LocalStorageManager.kt b/app/src/main/java/org/koitharu/kotatsu/local/data/LocalStorageManager.kt index b6859cea4..813dfba4f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/data/LocalStorageManager.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/data/LocalStorageManager.kt @@ -1,5 +1,6 @@ package org.koitharu.kotatsu.local.data +import android.content.ContentResolver import android.content.Context import android.os.StatFs import androidx.annotation.WorkerThread @@ -21,6 +22,9 @@ class LocalStorageManager( private val settings: AppSettings, ) { + val contentResolver: ContentResolver + get() = context.contentResolver + fun createHttpCache(): Cache { val directory = File(context.externalCacheDir ?: context.cacheDir, "http") directory.mkdirs() diff --git a/app/src/main/java/org/koitharu/kotatsu/local/domain/LocalMangaRepository.kt b/app/src/main/java/org/koitharu/kotatsu/local/domain/LocalMangaRepository.kt index 2b861592f..04adc71f8 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/domain/LocalMangaRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/domain/LocalMangaRepository.kt @@ -8,6 +8,8 @@ import androidx.core.net.toFile import androidx.core.net.toUri import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runInterruptible +import kotlinx.coroutines.withContext +import org.koitharu.kotatsu.core.exceptions.UnsupportedFileException import org.koitharu.kotatsu.core.model.* import org.koitharu.kotatsu.core.parser.MangaRepository import org.koitharu.kotatsu.local.data.CbzFilter @@ -15,11 +17,9 @@ import org.koitharu.kotatsu.local.data.LocalStorageManager import org.koitharu.kotatsu.local.data.MangaIndex import org.koitharu.kotatsu.local.data.MangaZip import org.koitharu.kotatsu.utils.AlphanumComparator -import org.koitharu.kotatsu.utils.ext.deleteAwait -import org.koitharu.kotatsu.utils.ext.longHashCode -import org.koitharu.kotatsu.utils.ext.readText -import org.koitharu.kotatsu.utils.ext.toCamelCase +import org.koitharu.kotatsu.utils.ext.* import java.io.File +import java.io.IOException import java.util.* import java.util.zip.ZipEntry import java.util.zip.ZipFile @@ -197,6 +197,28 @@ class LocalMangaRepository(private val storageManager: LocalStorageManager) : Ma override suspend fun getTags() = emptySet() + suspend fun import(uri: Uri) { + val contentResolver = storageManager.contentResolver + withContext(Dispatchers.IO) { + val name = contentResolver.resolveName(uri) + ?: throw IOException("Cannot fetch name from uri: $uri") + if (!isFileSupported(name)) { + throw UnsupportedFileException("Unsupported file on $uri") + } + val dest = File( + getOutputDir() ?: throw IOException("External files dir unavailable"), + name, + ) + runInterruptible { + contentResolver.openInputStream(uri)?.use { source -> + dest.outputStream().use { output -> + source.copyTo(output) + } + } + } ?: throw IOException("Cannot open input stream: $uri") + } + } + fun isFileSupported(name: String): Boolean { val ext = name.substringAfterLast('.').lowercase(Locale.ROOT) return ext == "cbz" || ext == "zip" diff --git a/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListFragment.kt b/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListFragment.kt index 586e96bfc..94ef2fe21 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListFragment.kt @@ -18,14 +18,16 @@ import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.download.ui.service.DownloadService import org.koitharu.kotatsu.list.ui.MangaListFragment import org.koitharu.kotatsu.utils.ext.ellipsize +import org.koitharu.kotatsu.utils.progress.Progress -class LocalListFragment : MangaListFragment(), ActivityResultCallback { +class LocalListFragment : MangaListFragment(), ActivityResultCallback> { override val viewModel by viewModel() private val importCall = registerForActivityResult( - ActivityResultContracts.OpenDocument(), + ActivityResultContracts.OpenMultipleDocuments(), this ) + private var importSnackbar: Snackbar? = null private val downloadReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { if (intent?.action == DownloadService.ACTION_DOWNLOAD_COMPLETE) { @@ -45,6 +47,12 @@ class LocalListFragment : MangaListFragment(), ActivityResultCallback { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) viewModel.onMangaRemoved.observe(viewLifecycleOwner, ::onItemRemoved) + viewModel.importProgress.observe(viewLifecycleOwner, ::onImportProgressChanged) + } + + override fun onDestroyView() { + importSnackbar = null + super.onDestroyView() } override fun onDetach() { @@ -84,10 +92,9 @@ class LocalListFragment : MangaListFragment(), ActivityResultCallback { return context?.getString(R.string.local_storage) } - override fun onActivityResult(result: Uri?) { - if (result != null) { - viewModel.importFile(context?.applicationContext ?: return, result) - } + override fun onActivityResult(result: List<@JvmSuppressWildcards Uri>) { + if (result.isEmpty()) return + viewModel.importFiles(result) } override fun onCreatePopupMenu(inflater: MenuInflater, menu: Menu, data: Manga) { @@ -121,6 +128,25 @@ class LocalListFragment : MangaListFragment(), ActivityResultCallback { ).show() } + private fun onImportProgressChanged(progress: Progress?) { + if (progress == null) { + importSnackbar?.dismiss() + importSnackbar = null + return + } + val summaryText = getString( + R.string.importing_progress, + progress.value + 1, + progress.total, + ) + importSnackbar?.setText(summaryText) ?: run { + val snackbar = + Snackbar.make(binding.recyclerView, summaryText, Snackbar.LENGTH_INDEFINITE) + importSnackbar = snackbar + snackbar.show() + } + } + companion object { fun newInstance() = LocalListFragment() diff --git a/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListViewModel.kt index 442591984..f89f50d35 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListViewModel.kt @@ -1,15 +1,14 @@ package org.koitharu.kotatsu.local.ui -import android.content.Context import android.net.Uri +import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.runInterruptible import kotlinx.coroutines.withContext import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.core.exceptions.UnsupportedFileException import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.core.os.ShortcutsRepository import org.koitharu.kotatsu.core.prefs.AppSettings @@ -19,7 +18,7 @@ import org.koitharu.kotatsu.list.ui.model.* import org.koitharu.kotatsu.local.domain.LocalMangaRepository import org.koitharu.kotatsu.utils.SingleLiveEvent import org.koitharu.kotatsu.utils.ext.asLiveDataDistinct -import org.koitharu.kotatsu.utils.ext.resolveName +import org.koitharu.kotatsu.utils.progress.Progress import java.io.IOException class LocalListViewModel( @@ -30,9 +29,11 @@ class LocalListViewModel( ) : MangaListViewModel(settings) { val onMangaRemoved = SingleLiveEvent() + val importProgress = MutableLiveData(null) private val listError = MutableStateFlow(null) private val mangaList = MutableStateFlow?>(null) private val headerModel = ListHeader(null, R.string.local_storage) + private var importJob: Job? = null override val content = combine( mangaList, @@ -59,37 +60,23 @@ class LocalListViewModel( override fun onRefresh() { launchLoadingJob(Dispatchers.Default) { - try { - listError.value = null - mangaList.value = repository.getList2(0) - } catch (e: Throwable) { - listError.value = e - } + doRefresh() } } override fun onRetry() = onRefresh() - fun importFile(context: Context, uri: Uri) { - launchLoadingJob { - val contentResolver = context.contentResolver - withContext(Dispatchers.IO) { - val name = contentResolver.resolveName(uri) - ?: throw IOException("Cannot fetch name from uri: $uri") - if (!repository.isFileSupported(name)) { - throw UnsupportedFileException("Unsupported file on $uri") - } - val dest = repository.getOutputDir() - ?: throw IOException("External files dir unavailable") - runInterruptible { - contentResolver.openInputStream(uri)?.use { source -> - dest.outputStream().use { output -> - source.copyTo(output) - } - } - } ?: throw IOException("Cannot open input stream: $uri") + fun importFiles(uris: List) { + val previousJob = importJob + importJob = launchJob(Dispatchers.Default) { + previousJob?.join() + importProgress.postValue(Progress(0, uris.size)) + for ((i, uri) in uris.withIndex()) { + repository.import(uri) + importProgress.postValue(Progress(i + 1, uris.size)) + doRefresh() } - onRefresh() + importProgress.postValue(null) } } @@ -107,4 +94,13 @@ class LocalListViewModel( onMangaRemoved.call(manga) } } + + private suspend fun doRefresh() { + try { + listError.value = null + mangaList.value = repository.getList2(0) + } catch (e: Throwable) { + listError.value = e + } + } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/FileExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/FileExt.kt index adc5f6f0b..db6fd0f4f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/FileExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/FileExt.kt @@ -15,10 +15,6 @@ import java.io.File import java.util.zip.ZipEntry import java.util.zip.ZipFile -@Suppress("NOTHING_TO_INLINE") -@Deprecated("Useless", ReplaceWith("File(this, name)", "java.io.File")) -inline fun File.sub(name: String) = File(this, name) - fun File.subdir(name: String) = File(this, name).also { if (!it.exists()) it.mkdirs() } @@ -37,14 +33,6 @@ fun File.computeSize(): Long = listFiles()?.sumOf { x -> } } ?: 0L -inline fun File.findParent(predicate: (File) -> Boolean): File? { - var current = this - while (!predicate(current)) { - current = current.parentFile ?: return null - } - return current -} - fun File.getStorageName(context: Context): String = runCatching { val manager = context.getSystemService(Context.STORAGE_SERVICE) as StorageManager if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f090d4012..1131b5655 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -249,4 +249,5 @@ Available sources Dynamic theme Applies a theme created on the color scheme of your wallpaper + Importing manga: %1$d of %2$d \ No newline at end of file From 3c0c4ce9c0b97948d683ee31d207b6fbb639ee60 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sat, 26 Feb 2022 14:11:46 +0200 Subject: [PATCH 69/70] Fix local manga size --- .../org/koitharu/kotatsu/core/ui/uiModule.kt | 6 ++++- .../kotatsu/local/data/LocalStorageManager.kt | 7 ++++-- .../settings/HistorySettingsFragment.kt | 19 ++++++--------- .../org/koitharu/kotatsu/utils/ext/FileExt.kt | 24 ++++++++++++------- app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/pref_history.xml | 4 ++++ 6 files changed, 38 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/core/ui/uiModule.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/uiModule.kt index 148fa409d..060e748ac 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/ui/uiModule.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/uiModule.kt @@ -2,6 +2,7 @@ package org.koitharu.kotatsu.core.ui import coil.ComponentRegistry import coil.ImageLoader +import coil.util.CoilUtils import okhttp3.OkHttpClient import org.koin.android.ext.koin.androidContext import org.koin.dsl.module @@ -11,8 +12,11 @@ import org.koitharu.kotatsu.local.data.CbzFetcher val uiModule get() = module { single { + val httpClient = get().newBuilder() + .cache(CoilUtils.createDefaultCache(androidContext())) + .build() ImageLoader.Builder(androidContext()) - .okHttpClient(get()) + .okHttpClient(httpClient) .componentRegistry( ComponentRegistry.Builder() .add(CbzFetcher()) diff --git a/app/src/main/java/org/koitharu/kotatsu/local/data/LocalStorageManager.kt b/app/src/main/java/org/koitharu/kotatsu/local/data/LocalStorageManager.kt index 813dfba4f..2cbddf856 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/data/LocalStorageManager.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/data/LocalStorageManager.kt @@ -6,6 +6,7 @@ import android.os.StatFs import androidx.annotation.WorkerThread import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runInterruptible +import kotlinx.coroutines.withContext import okhttp3.Cache import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.utils.ext.computeSize @@ -32,7 +33,7 @@ class LocalStorageManager( return Cache(directory, maxSize) } - suspend fun computeCacheSize(cache: CacheDir) = runInterruptible(Dispatchers.IO) { + suspend fun computeCacheSize(cache: CacheDir) = withContext(Dispatchers.IO) { getCacheDirs(cache.dir).sumOf { it.computeSize() } } @@ -86,7 +87,9 @@ class LocalStorageManager( private fun getCacheDirs(subDir: String): MutableSet { val result = LinkedHashSet() result += File(context.cacheDir, subDir) - result += context.getExternalFilesDirs(subDir) + context.externalCacheDirs.mapTo(result) { + File(it, subDir) + } return result } diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt index 1ad2af3fd..1ff363c35 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt @@ -32,18 +32,8 @@ class HistorySettingsFragment : BasePreferenceFragment(R.string.history_and_cach override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - findPreference(AppSettings.KEY_PAGES_CACHE_CLEAR)?.let { pref -> - viewLifecycleScope.launchWhenResumed { - val size = storageManager.computeCacheSize(CacheDir.PAGES) - pref.summary = FileSize.BYTES.format(pref.context, size) - } - } - findPreference(AppSettings.KEY_THUMBS_CACHE_CLEAR)?.let { pref -> - viewLifecycleScope.launchWhenResumed { - val size = storageManager.computeCacheSize(CacheDir.THUMBS) - pref.summary = FileSize.BYTES.format(pref.context, size) - } - } + findPreference(AppSettings.KEY_PAGES_CACHE_CLEAR)?.bindSummaryToCacheSize(CacheDir.PAGES) + findPreference(AppSettings.KEY_THUMBS_CACHE_CLEAR)?.bindSummaryToCacheSize(CacheDir.THUMBS) findPreference(AppSettings.KEY_SEARCH_HISTORY_CLEAR)?.let { pref -> viewLifecycleScope.launchWhenResumed { val items = searchRepository.getSearchHistoryCount() @@ -111,6 +101,11 @@ class HistorySettingsFragment : BasePreferenceFragment(R.string.history_and_cach } } + private fun Preference.bindSummaryToCacheSize(dir: CacheDir) = viewLifecycleScope.launch { + val size = storageManager.computeCacheSize(dir) + summary = FileSize.BYTES.format(context, size) + } + private fun clearSearchHistory(preference: Preference) { MaterialAlertDialogBuilder(context ?: return) .setTitle(R.string.clear_search_history) diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/FileExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/FileExt.kt index db6fd0f4f..cab41519f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/FileExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/FileExt.kt @@ -7,8 +7,10 @@ import android.os.Build import android.os.Environment import android.os.storage.StorageManager import android.provider.OpenableColumns +import androidx.annotation.WorkerThread import androidx.core.database.getStringOrNull import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.runInterruptible import kotlinx.coroutines.withContext import org.koitharu.kotatsu.R import java.io.File @@ -25,14 +27,6 @@ fun ZipFile.readText(entry: ZipEntry) = getInputStream(entry).bufferedReader().u it.readText() } -fun File.computeSize(): Long = listFiles()?.sumOf { x -> - if (x.isDirectory) { - x.computeSize() - } else { - x.length() - } -} ?: 0L - fun File.getStorageName(context: Context): String = runCatching { val manager = context.getSystemService(Context.STORAGE_SERVICE) as StorageManager if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { @@ -66,4 +60,18 @@ fun ContentResolver.resolveName(uri: Uri): String? { } } return fallback +} + +suspend fun File.computeSize(): Long = runInterruptible(Dispatchers.IO) { + computeSizeInternal(this) +} + +@WorkerThread +private fun computeSizeInternal(file: File): Long { + if (file.isDirectory) { + val files = file.listFiles() ?: return 0L + return files.sumOf { computeSizeInternal(it) } + } else { + return file.length() + } } \ 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 1131b5655..d053d90d6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -16,6 +16,7 @@ Settings Remote sources Loading… + Computing… Chapter %1$d of %2$d Close Try again diff --git a/app/src/main/res/xml/pref_history.xml b/app/src/main/res/xml/pref_history.xml index bde082b45..50061d04a 100644 --- a/app/src/main/res/xml/pref_history.xml +++ b/app/src/main/res/xml/pref_history.xml @@ -6,12 +6,14 @@ @@ -27,12 +29,14 @@ From 1f7252fd126069cca42b378f64357d08bf6a1f9c Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sat, 26 Feb 2022 18:14:15 +0200 Subject: [PATCH 70/70] Update feed ui --- .../koitharu/kotatsu/tracker/TrackerModule.kt | 3 +-- .../kotatsu/tracker/ui/FeedFragment.kt | 5 +++++ .../kotatsu/tracker/ui/FeedViewModel.kt | 4 +--- .../kotatsu/tracker/ui/adapter/FeedItemAD.kt | 6 ++++++ .../kotatsu/tracker/ui/model/FeedItem.kt | 3 ++- .../ui/model/ListModelConversionExt.kt | 17 +++++++-------- app/src/main/res/layout/item_tracklog.xml | 21 ++++++++++++++++--- app/src/main/res/values/dimens.xml | 1 + 8 files changed, 41 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/TrackerModule.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/TrackerModule.kt index a4bdd5230..a08495f54 100644 --- a/app/src/main/java/org/koitharu/kotatsu/tracker/TrackerModule.kt +++ b/app/src/main/java/org/koitharu/kotatsu/tracker/TrackerModule.kt @@ -1,6 +1,5 @@ package org.koitharu.kotatsu.tracker -import org.koin.android.ext.koin.androidContext import org.koin.androidx.viewmodel.dsl.viewModel import org.koin.dsl.module import org.koitharu.kotatsu.tracker.domain.TrackingRepository @@ -11,5 +10,5 @@ val trackerModule single { TrackingRepository(get()) } - viewModel { FeedViewModel(androidContext(), get()) } + viewModel { FeedViewModel(get()) } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedFragment.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedFragment.kt index 510fe083b..a98bf12ad 100644 --- a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedFragment.kt @@ -4,7 +4,9 @@ import android.os.Bundle import android.view.* import androidx.core.graphics.Insets import androidx.core.view.updatePadding +import androidx.recyclerview.widget.RecyclerView import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.google.android.material.divider.MaterialDividerItemDecoration import com.google.android.material.snackbar.Snackbar import org.koin.android.ext.android.get import org.koin.androidx.viewmodel.ext.android.viewModel @@ -50,6 +52,9 @@ class FeedFragment : BaseFragment(), PaginationScrollListen adapter = feedAdapter setHasFixedSize(true) addOnScrollListener(PaginationScrollListener(4, this@FeedFragment)) + val dividerDecoration = MaterialDividerItemDecoration(context, RecyclerView.VERTICAL) + dividerDecoration.setDividerInsetStartResource(context, R.dimen.feed_dividers_offset) + addItemDecoration(dividerDecoration) } viewModel.content.observe(viewLifecycleOwner, this::onListChanged) diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedViewModel.kt index d0bee70ce..b86f62919 100644 --- a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedViewModel.kt @@ -1,6 +1,5 @@ package org.koitharu.kotatsu.tracker.ui -import android.content.Context import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope import kotlinx.coroutines.Dispatchers @@ -22,7 +21,6 @@ import org.koitharu.kotatsu.utils.ext.asLiveDataDistinct import org.koitharu.kotatsu.utils.ext.mapItems class FeedViewModel( - context: Context, private val repository: TrackingRepository ) : BaseViewModel() { @@ -34,7 +32,7 @@ class FeedViewModel( val onFeedCleared = SingleLiveEvent() val content = combine( logList.filterNotNull().mapItems { - it.toFeedItem(context.resources) + it.toFeedItem() }, hasNextPage ) { list, isHasNextPage -> diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/adapter/FeedItemAD.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/adapter/FeedItemAD.kt index 2e3bdf446..feacf2079 100644 --- a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/adapter/FeedItemAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/adapter/FeedItemAD.kt @@ -12,6 +12,7 @@ import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.tracker.ui.model.FeedItem import org.koitharu.kotatsu.utils.ext.enqueueWith import org.koitharu.kotatsu.utils.ext.newImageRequest +import org.koitharu.kotatsu.utils.ext.textAndVisible fun feedItemAD( coil: ImageLoader, @@ -39,6 +40,11 @@ fun feedItemAD( binding.textViewTitle.text = item.title binding.badge.text = item.subtitle binding.textViewChapters.text = item.chapters + binding.textViewTruncated.textAndVisible = if (item.truncated > 0) { + getString(R.string._and_x_more, item.truncated) + } else { + null + } } onViewRecycled { diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/model/FeedItem.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/model/FeedItem.kt index c3992b9f0..1c07b34d8 100644 --- a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/model/FeedItem.kt +++ b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/model/FeedItem.kt @@ -9,5 +9,6 @@ data class FeedItem( val title: String, val subtitle: String, val chapters: CharSequence, - val manga: Manga + val manga: Manga, + val truncated: Int, ) : ListModel \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/model/ListModelConversionExt.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/model/ListModelConversionExt.kt index 29ebb4790..f4552b9a7 100644 --- a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/model/ListModelConversionExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/model/ListModelConversionExt.kt @@ -1,19 +1,15 @@ package org.koitharu.kotatsu.tracker.ui.model -import android.content.res.Resources -import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.TrackingLogItem -fun TrackingLogItem.toFeedItem(resources: Resources): FeedItem { - val chaptersString = if (chapters.size > MAX_CHAPTERS) { +fun TrackingLogItem.toFeedItem(): FeedItem { + val truncate = chapters.size > MAX_CHAPTERS + val chaptersString = if (truncate) { chapters.joinToString( separator = "\n", limit = MAX_CHAPTERS - 1, - truncated = resources.getString( - R.string._and_x_more, - chapters.size - MAX_CHAPTERS + 1 - ) - ) + truncated = "", + ).trimEnd() } else { chapters.joinToString("\n") } @@ -23,7 +19,8 @@ fun TrackingLogItem.toFeedItem(resources: Resources): FeedItem { title = manga.title, subtitle = chapters.size.toString(), chapters = chaptersString, - manga = manga + manga = manga, + truncated = chapters.size - MAX_CHAPTERS + 1, ) } diff --git a/app/src/main/res/layout/item_tracklog.xml b/app/src/main/res/layout/item_tracklog.xml index b94f681b4..744c29889 100644 --- a/app/src/main/res/layout/item_tracklog.xml +++ b/app/src/main/res/layout/item_tracklog.xml @@ -6,8 +6,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?attr/selectableItemBackground" - android:paddingStart="8dp" - android:paddingEnd="8dp"> + android:paddingVertical="6dp" + android:paddingHorizontal="8dp"> + + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 6e4900beb..0f4b7d260 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -25,6 +25,7 @@ 36dp 48dp 16dp + 72dp 22sp