diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c43654dc8..84872c7da 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -29,16 +29,17 @@ + android:theme="@style/Theme.Tachiyomi"> = 0 }?.let { ComicInfo.Number(it.toString()) }, web = ComicInfo.Web(chapterUrl), summary = manga.description?.let { ComicInfo.Summary(it) }, writer = manga.author?.let { ComicInfo.Writer(it) }, diff --git a/app/src/main/java/eu/kanade/tachiyomi/App.kt b/app/src/main/java/eu/kanade/tachiyomi/App.kt index d007bc2cb..e2ac59aa6 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/App.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/App.kt @@ -29,6 +29,8 @@ import eu.kanade.domain.ui.UiPreferences import eu.kanade.domain.ui.model.setAppCompatDelegateThemeMode import eu.kanade.tachiyomi.crash.CrashActivity import eu.kanade.tachiyomi.crash.GlobalExceptionHandler +import eu.kanade.tachiyomi.data.cache.ChapterCache +import eu.kanade.tachiyomi.data.cache.EpisodeCache import eu.kanade.tachiyomi.data.coil.AnimeCoverFetcher import eu.kanade.tachiyomi.data.coil.AnimeCoverKeyer import eu.kanade.tachiyomi.data.coil.AnimeKeyer @@ -58,6 +60,7 @@ import org.acra.ktx.initAcra import org.acra.sender.HttpSender import org.conscrypt.Conscrypt import tachiyomi.core.util.system.logcat +import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.presentation.widget.entries.anime.TachiyomiAnimeWidgetManager import tachiyomi.presentation.widget.entries.manga.TachiyomiMangaWidgetManager import uy.kohesive.injekt.Injekt @@ -68,9 +71,12 @@ import java.security.Security class App : Application(), DefaultLifecycleObserver, ImageLoaderFactory { private val basePreferences: BasePreferences by injectLazy() + private val libraryPreferences: LibraryPreferences by injectLazy() private val networkPreferences: NetworkPreferences by injectLazy() private val disableIncognitoReceiver = DisableIncognitoReceiver() + private val chapterCache: ChapterCache by injectLazy() + private val episodeCache: EpisodeCache by injectLazy() @SuppressLint("LaunchActivityFromNotification") override fun onCreate() { @@ -186,6 +192,11 @@ class App : Application(), DefaultLifecycleObserver, ImageLoaderFactory { override fun onStop(owner: LifecycleOwner) { SecureActivityDelegate.onApplicationStopped() + + if (libraryPreferences.autoClearItemCache().get()) { + chapterCache.clear() + episodeCache.clear() + } } override fun getPackageName(): String { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloadCache.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloadCache.kt index bb7f0b435..b37617cec 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloadCache.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloadCache.kt @@ -23,7 +23,12 @@ import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.shareIn import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.launch +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.withTimeoutOrNull +import kotlinx.serialization.decodeFromByteArray +import kotlinx.serialization.protobuf.ProtoBuf import logcat.LogPriority import tachiyomi.core.util.lang.launchIO import tachiyomi.core.util.lang.launchNonCancellable @@ -34,6 +39,7 @@ import tachiyomi.domain.items.episode.model.Episode import tachiyomi.domain.source.anime.service.AnimeSourceManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import java.io.File import java.util.concurrent.ConcurrentHashMap import kotlin.time.Duration.Companion.hours import kotlin.time.Duration.Companion.seconds @@ -76,6 +82,10 @@ class AnimeDownloadCache( .debounce(1000L) // Don't notify if it finishes quickly enough .stateIn(scope, SharingStarted.WhileSubscribed(), false) + private val diskCacheFile: File + get() = File(context.cacheDir, "dl_index_cache") + + private val rootDownloadsDirLock = Mutex() private var rootDownloadsDir = RootDirectory(getDirectoryFromPreference()) init { @@ -85,6 +95,21 @@ class AnimeDownloadCache( invalidateCache() } .launchIn(scope) + + // Attempt to read cache file + scope.launch { + rootDownloadsDirLock.withLock { + try { + val diskCache = diskCacheFile.inputStream().use { + ProtoBuf.decodeFromByteArray(it.readBytes()) + } + rootDownloadsDir = diskCache + lastRenew = System.currentTimeMillis() + } catch (e: Throwable) { + diskCacheFile.delete() + } + } + } } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloadManager.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloadManager.kt index 59e8099cd..431e98e3a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloadManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloadManager.kt @@ -304,9 +304,11 @@ class AnimeDownloadManager( val oldFolder = provider.findSourceDir(oldSource) ?: return val newName = provider.getSourceDirName(newSource) + if (oldFolder.name == newName) return + val capitalizationChanged = oldFolder.name.equals(newName, ignoreCase = true) if (capitalizationChanged) { - val tempName = newName + "_tmp" + val tempName = newName + AnimeDownloader.TMP_DIR_SUFFIX if (oldFolder.renameTo(tempName).not()) { logcat(LogPriority.ERROR) { "Failed to rename source download folder: ${oldFolder.name}" } return @@ -336,6 +338,9 @@ class AnimeDownloadManager( .firstOrNull() val newName = provider.getEpisodeDirName(newEpisode.name, newEpisode.scanlator) + + if (oldFolder?.name == newName) return + if (oldFolder?.renameTo(newName) == true) { cache.removeEpisode(oldEpisode, anime) cache.addEpisode(newName, animeDir, anime) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloadStore.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloadStore.kt index 44daa7e3c..d756a8b10 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloadStore.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloadStore.kt @@ -59,6 +59,17 @@ class AnimeDownloadStore( } } + /** + * Removes a list of downloads from the store. + * + * @param downloads the download to remove. + */ + fun removeAll(downloads: List) { + preferences.edit { + downloads.forEach { remove(getKey(it)) } + } + } + /** * Removes all the downloads from the store. */ diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloader.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloader.kt index 495bef260..4d31df92a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloader.kt @@ -226,8 +226,14 @@ class AnimeDownloader( 5, ) .subscribe( - { completedDownload -> - completeAnimeDownload(completedDownload) + { + // Remove successful download from queue + if (it.status == AnimeDownload.State.DOWNLOADED) { + removeFromQueue(it) + } + if (areAllAnimeDownloadsFinished()) { + stop() + } }, { error -> logcat(LogPriority.ERROR, error) @@ -676,9 +682,16 @@ class AnimeDownloader( } it.delete() tmpDir.delete() - queueState.value.find { Anime -> Anime.video == video }?.let { Anime -> - Anime.status = AnimeDownload.State.DOWNLOADED - completeAnimeDownload(Anime) + queueState.value.find { Anime -> Anime.video == video }?.let { download -> + download.status = AnimeDownload.State.DOWNLOADED + // Delete successful downloads from queue + if (download.status == AnimeDownload.State.DOWNLOADED) { + // Remove downloaded episode from queue + removeFromQueue(download) + } + if (areAllAnimeDownloadsFinished()) { + stop() + } } } } @@ -750,20 +763,6 @@ class AnimeDownloader( } } - /** - * Completes a download. This method is called in the main thread. - */ - private fun completeAnimeDownload(download: AnimeDownload) { - // Delete successful downloads from queue - if (download.status == AnimeDownload.State.DOWNLOADED) { - // Remove downloaded episode from queue - removeFromQueue(download) - } - if (areAllAnimeDownloadsFinished()) { - stop() - } - } - /** * Returns true if all the queued downloads are in DOWNLOADED or ERROR state. */ @@ -807,14 +806,26 @@ class AnimeDownloader( } } - fun removeFromQueue(episodes: List) { - episodes.forEach { episode -> - queueState.value.find { it.episode.id == episode.id }?.let { removeFromQueue(it) } + private inline fun removeFromQueueByPredicate(predicate: (AnimeDownload) -> Boolean) { + _queueState.update { queue -> + val downloads = queue.filter { predicate(it) } + store.removeAll(downloads) + downloads.forEach { download -> + if (download.status == AnimeDownload.State.DOWNLOADING || download.status == AnimeDownload.State.QUEUE) { + download.status = AnimeDownload.State.NOT_DOWNLOADED + } + } + queue - downloads } } + fun removeFromQueue(episodes: List) { + val episodeIds = episodes.map { it.id } + removeFromQueueByPredicate { it.episode.id in episodeIds } + } + fun removeFromQueue(anime: Anime) { - queueState.value.filter { it.anime.id == anime.id }.forEach { removeFromQueue(it) } + removeFromQueueByPredicate { it.anime.id == anime.id } } private fun _clearQueue() { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/manga/MangaDownloadCache.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/manga/MangaDownloadCache.kt index 1733391c5..739de6bef 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/manga/MangaDownloadCache.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/manga/MangaDownloadCache.kt @@ -26,7 +26,7 @@ import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.shareIn import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.launch import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.withTimeoutOrNull @@ -97,7 +97,7 @@ class MangaDownloadCache( get() = File(context.cacheDir, "dl_index_cache") private val rootDownloadsDirLock = Mutex() - private var rootDownloadsDir: RootDirectory + private var rootDownloadsDir = RootDirectory(getDirectoryFromPreference()) init { downloadPreferences.downloadsDirectory().changes() @@ -107,20 +107,20 @@ class MangaDownloadCache( } .launchIn(scope) - rootDownloadsDir = runBlocking(Dispatchers.IO) { - try { - val diskCache = diskCacheFile.inputStream().use { - ProtoBuf.decodeFromByteArray(it.readBytes()) + // Attempt to read cache file + scope.launch { + rootDownloadsDirLock.withLock { + try { + val diskCache = diskCacheFile.inputStream().use { + ProtoBuf.decodeFromByteArray(it.readBytes()) + } + rootDownloadsDir = diskCache + lastRenew = System.currentTimeMillis() + } catch (e: Throwable) { + diskCacheFile.delete() } - lastRenew = 1 // Just so that the banner won't show up - diskCache - } catch (e: Throwable) { - diskCacheFile.delete() - null } - } ?: RootDirectory(getDirectoryFromPreference()) - - notifyChanges() + } } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/manga/MangaDownloadManager.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/manga/MangaDownloadManager.kt index 4d04be8c2..82bcb53f3 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/manga/MangaDownloadManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/manga/MangaDownloadManager.kt @@ -302,9 +302,11 @@ class MangaDownloadManager( val oldFolder = provider.findSourceDir(oldSource) ?: return val newName = provider.getSourceDirName(newSource) + if (oldFolder.name == newName) return + val capitalizationChanged = oldFolder.name.equals(newName, ignoreCase = true) if (capitalizationChanged) { - val tempName = newName + "_tmp" + val tempName = newName + MangaDownloader.TMP_DIR_SUFFIX if (oldFolder.renameTo(tempName).not()) { logcat(LogPriority.ERROR) { "Failed to rename source download folder: ${oldFolder.name}" } return @@ -338,6 +340,8 @@ class MangaDownloadManager( newName += ".cbz" } + if (oldDownload.name == newName) return + if (oldDownload.renameTo(newName)) { cache.removeChapter(oldChapter, manga) cache.addChapter(newName, mangaDir, manga) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/manga/MangaDownloadStore.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/manga/MangaDownloadStore.kt index af21a771e..350c6026e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/manga/MangaDownloadStore.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/manga/MangaDownloadStore.kt @@ -59,6 +59,17 @@ class MangaDownloadStore( } } + /** + * Removes a list of downloads from the store. + * + * @param downloads the download to remove. + */ + fun removeAll(downloads: List) { + preferences.edit { + downloads.forEach { remove(getKey(it)) } + } + } + /** * Removes all the downloads from the store. */ diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/manga/MangaDownloader.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/manga/MangaDownloader.kt index cf324bd7d..626f63129 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/manga/MangaDownloader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/manga/MangaDownloader.kt @@ -223,7 +223,13 @@ class MangaDownloader( .observeOn(AndroidSchedulers.mainThread()) .subscribe( { - completeDownload(it) + // Remove successful download from queue + if (it.status == MangaDownload.State.DOWNLOADED) { + removeFromQueue(it) + } + if (areAllDownloadsFinished()) { + stop() + } }, { error -> logcat(LogPriority.ERROR, error) @@ -375,7 +381,29 @@ class MangaDownloader( } // Do after download completes - ensureSuccessfulDownload(download, mangaDir, tmpDir, chapterDirname) + if (!isDownloadSuccessful(download, tmpDir)) { + download.status = MangaDownload.State.ERROR + return + } + + createComicInfoFile( + tmpDir, + download.manga, + download.chapter, + download.source, + ) + + // Only rename the directory if it's downloaded + if (downloadPreferences.saveChaptersAsCBZ().get()) { + archiveChapter(mangaDir, chapterDirname, tmpDir) + } else { + tmpDir.renameTo(chapterDirname) + } + cache.addChapter(chapterDirname, mangaDir, download.manga) + + DiskUtil.createNoMediaFile(tmpDir, context) + + download.status = MangaDownload.State.DOWNLOADED } catch (error: Throwable) { if (error is CancellationException) throw error // If the page list threw, it will resume here @@ -530,21 +558,15 @@ class MangaDownloader( * @param tmpDir the directory where the download is currently stored. * @param dirname the real (non temporary) directory name of the download. */ - private suspend fun ensureSuccessfulDownload( + private fun isDownloadSuccessful( download: MangaDownload, - mangaDir: UniFile, tmpDir: UniFile, - dirname: String, - ) { + ): Boolean { // Page list hasn't been initialized - val downloadPageCount = download.pages?.size ?: run { - download.status = MangaDownload.State.ERROR - return - } + val downloadPageCount = download.pages?.size ?: return false // Ensure that all pages have been downloaded if (download.downloadedImages != downloadPageCount) { - download.status = MangaDownload.State.ERROR - return + return false } // Ensure that the chapter folder has all the pages val downloadedImagesCount = tmpDir.listFiles().orEmpty().count { @@ -558,27 +580,9 @@ class MangaDownloader( } } if (downloadedImagesCount != downloadPageCount) { - download.status = MangaDownload.State.ERROR - return - } - - createComicInfoFile( - tmpDir, - download.manga, - download.chapter, - download.source, - ) - - // Only rename the directory if it's downloaded - if (downloadPreferences.saveChaptersAsCBZ().get()) { - archiveChapter(mangaDir, dirname, tmpDir) - } else { - cache.addChapter(dirname, mangaDir, download.manga) - - DiskUtil.createNoMediaFile(tmpDir, context) - - download.status = MangaDownload.State.DOWNLOADED + return false } + return true } /** @@ -634,20 +638,6 @@ class MangaDownloader( } } - /** - * Completes a download. This method is called in the main thread. - */ - private fun completeDownload(download: MangaDownload) { - // Delete successful downloads from queue - if (download.status == MangaDownload.State.DOWNLOADED) { - // Remove downloaded chapter from queue - removeFromQueue(download) - } - if (areAllDownloadsFinished()) { - stop() - } - } - /** * Returns true if all the queued downloads are in DOWNLOADED or ERROR state. */ @@ -675,14 +665,26 @@ class MangaDownloader( } } - fun removeFromQueue(chapters: List) { - chapters.forEach { chapter -> - queueState.value.find { it.chapter.id == chapter.id }?.let { removeFromQueue(it) } + private inline fun removeFromQueueByPredicate(predicate: (MangaDownload) -> Boolean) { + _queueState.update { queue -> + val downloads = queue.filter { predicate(it) } + store.removeAll(downloads) + downloads.forEach { download -> + if (download.status == MangaDownload.State.DOWNLOADING || download.status == MangaDownload.State.QUEUE) { + download.status = MangaDownload.State.NOT_DOWNLOADED + } + } + queue - downloads } } + fun removeFromQueue(chapters: List) { + val chapterIds = chapters.map { it.id } + removeFromQueueByPredicate { it.chapter.id in chapterIds } + } + fun removeFromQueue(manga: Manga) { - queueState.value.filter { it.manga.id == manga.id }.forEach { removeFromQueue(it) } + removeFromQueueByPredicate { it.manga.id == manga.id } } private fun _clearQueue() { diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/anime/AndroidAnimeSourceManager.kt b/app/src/main/java/eu/kanade/tachiyomi/source/anime/AndroidAnimeSourceManager.kt index a00da6e50..ba4d0f92a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/source/anime/AndroidAnimeSourceManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/source/anime/AndroidAnimeSourceManager.kt @@ -111,6 +111,6 @@ class AndroidAnimeSourceManager( registerStubSource(it) return it } - return StubAnimeSource(id, "", "") + return StubAnimeSource(id = id, lang = "", name = "") } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/manga/AndroidMangaSourceManager.kt b/app/src/main/java/eu/kanade/tachiyomi/source/manga/AndroidMangaSourceManager.kt index ab424854a..58822c651 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/source/manga/AndroidMangaSourceManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/source/manga/AndroidMangaSourceManager.kt @@ -111,6 +111,6 @@ class AndroidMangaSourceManager( registerStubSource(it) return it } - return StubMangaSource(id, "", "") + return StubMangaSource(id = id, lang = "", name = "") } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt index 490585398..6df9672e7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt @@ -72,8 +72,6 @@ import eu.kanade.tachiyomi.Migrations import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.animesource.model.Video import eu.kanade.tachiyomi.core.Constants -import eu.kanade.tachiyomi.data.cache.ChapterCache -import eu.kanade.tachiyomi.data.cache.EpisodeCache import eu.kanade.tachiyomi.data.download.anime.AnimeDownloadCache import eu.kanade.tachiyomi.data.download.manga.MangaDownloadCache import eu.kanade.tachiyomi.data.notification.NotificationReceiver @@ -124,9 +122,6 @@ class MainActivity : BaseActivity() { private val uiPreferences: UiPreferences by injectLazy() private val preferences: BasePreferences by injectLazy() - private val episodeCache: EpisodeCache by injectLazy() - private val chapterCache: ChapterCache by injectLazy() - private val animeDownloadCache: AnimeDownloadCache by injectLazy() private val downloadCache: MangaDownloadCache by injectLazy() @@ -493,17 +488,6 @@ class MainActivity : BaseActivity() { return true } - override fun onBackPressed() { - if (navigator?.size == 1 && - !onBackPressedDispatcher.hasEnabledCallbacks() && - libraryPreferences.autoClearItemCache().get() - ) { - chapterCache.clear() - episodeCache.clear() - } - super.onBackPressed() - } - init { registerSecureActivity(this) } diff --git a/core-metadata/src/main/java/tachiyomi/core/metadata/comicinfo/ComicInfo.kt b/core-metadata/src/main/java/tachiyomi/core/metadata/comicinfo/ComicInfo.kt index 80c0e9d4c..b215b4993 100644 --- a/core-metadata/src/main/java/tachiyomi/core/metadata/comicinfo/ComicInfo.kt +++ b/core-metadata/src/main/java/tachiyomi/core/metadata/comicinfo/ComicInfo.kt @@ -44,6 +44,7 @@ fun SManga.copyFromComicInfo(comicInfo: ComicInfo) { data class ComicInfo( val title: Title?, val series: Series?, + val number: Number?, val summary: Summary?, val writer: Writer?, val penciller: Penciller?, @@ -75,6 +76,10 @@ data class ComicInfo( @XmlSerialName("Series", "", "") data class Series(@XmlValue(true) val value: String = "") + @Serializable + @XmlSerialName("Number", "", "") + data class Number(@XmlValue(true) val value: String = "") + @Serializable @XmlSerialName("Summary", "", "") data class Summary(@XmlValue(true) val value: String = "") diff --git a/data/src/main/java/tachiyomi/data/source/anime/AnimeSourceMapper.kt b/data/src/main/java/tachiyomi/data/source/anime/AnimeSourceMapper.kt index 50dfe7ea6..f8cbf79b2 100644 --- a/data/src/main/java/tachiyomi/data/source/anime/AnimeSourceMapper.kt +++ b/data/src/main/java/tachiyomi/data/source/anime/AnimeSourceMapper.kt @@ -5,9 +5,9 @@ import tachiyomi.domain.source.anime.model.StubAnimeSource val animeSourceMapper: (eu.kanade.tachiyomi.animesource.AnimeSource) -> AnimeSource = { source -> AnimeSource( - source.id, - source.lang, - source.name, + id = source.id, + lang = source.lang, + name = source.name, supportsLatest = false, isStub = false, ) diff --git a/data/src/main/java/tachiyomi/data/source/manga/MangaSourceMapper.kt b/data/src/main/java/tachiyomi/data/source/manga/MangaSourceMapper.kt index dbb75a2a1..508bbca4c 100644 --- a/data/src/main/java/tachiyomi/data/source/manga/MangaSourceMapper.kt +++ b/data/src/main/java/tachiyomi/data/source/manga/MangaSourceMapper.kt @@ -5,9 +5,9 @@ import tachiyomi.domain.source.manga.model.StubMangaSource val mangaSourceMapper: (eu.kanade.tachiyomi.source.MangaSource) -> Source = { source -> Source( - source.id, - source.lang, - source.name, + id = source.id, + lang = source.lang, + name = source.name, supportsLatest = false, isStub = false, ) diff --git a/gradle/kotlinx.versions.toml b/gradle/kotlinx.versions.toml index 3a81629c8..3397b264f 100644 --- a/gradle/kotlinx.versions.toml +++ b/gradle/kotlinx.versions.toml @@ -1,7 +1,7 @@ [versions] kotlin_version = "1.8.21" serialization_version = "1.5.0" -xml_serialization_version = "0.85.0" +xml_serialization_version = "0.86.0" [libraries] reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin_version" } diff --git a/i18n/src/main/res/values-bn/strings.xml b/i18n/src/main/res/values-bn/strings.xml index 0603aa5d2..0342796b0 100644 --- a/i18n/src/main/res/values-bn/strings.xml +++ b/i18n/src/main/res/values-bn/strings.xml @@ -663,4 +663,5 @@ অবৈধ ডাউনলোড সমুহ এখন না ডিবাগ তথ্য + বাদ দেওয়া হয়েছে কারণ সিরিজের আপডেটের প্রয়োজন নেই৷ \ No newline at end of file diff --git a/i18n/src/main/res/values-de/strings.xml b/i18n/src/main/res/values-de/strings.xml index 838021521..aba7b93df 100644 --- a/i18n/src/main/res/values-de/strings.xml +++ b/i18n/src/main/res/values-de/strings.xml @@ -633,8 +633,8 @@ Eine neue Version ist aus dem offiziellen Repository verfügbar. Tippe, um zu erfahren, wie man aus inoffiziellen F-Droid-Versionen migriert. Keine zu sichernden Bibliothekseinträge verfügbar Auf GitHub öffnen - Webansicht-Daten löschen - Webansicht-Daten gelöscht + WebView-Daten löschen + WebView-Daten gelöscht Schließen Wenn der Akkustand nicht niedrig ist Angeheftete Quellen in ihren jeweiligen Sprachgruppen wiederholen @@ -697,7 +697,7 @@ Thema, Datums- und Zeitformat Lesemodus, Anzeige, Navigation Automatische Downloads, im Voraus herunterladen - Kategorien, globale Aktualisierungen, Kapitel-Streichen + Kategorien, globale Aktualisierungen, Kapitelstreichen Anwendung neustarten Einweg-Synchronisation, erweiterte Synchronisation Quellen, Erweiterungen, globale Suche @@ -740,9 +740,9 @@ Es könnten Kapitel fehlen Ausrichtung gedrehter breiter Seiten spiegeln Debug-Info - Kapitel-Streichen - Zur rechten Aktion streichen - Zur linken Aktion streichen + Kapitelstreichen + Aktion beim Streichen nach rechts + Aktion beim Streichen nach links Zum Zoomen doppeltippen %d pro Zeile \ No newline at end of file diff --git a/i18n/src/main/res/values-fil/strings.xml b/i18n/src/main/res/values-fil/strings.xml index 25d077376..c77a5003c 100644 --- a/i18n/src/main/res/values-fil/strings.xml +++ b/i18n/src/main/res/values-fil/strings.xml @@ -155,8 +155,8 @@ Pagkasyahin sa screen Uri ng pagsasalaki Nakapahina - Patayong tuloy-tuloy - Pa-webtoon + Pahabang strip na may puwang + Pahabang strip Pahina (patayo) Pahina (kanan pakaliwa) Pahina (kaliwa pakanan) @@ -226,7 +226,7 @@ Panlahatang update Pahiga Patayo - Item kada hilera + Laki ng grid Pagpapakita Itago ang laman ng abiso Tinatago ng seguridad sa screen ang laman ng app habang nagpapalit ng app at hinaharangan din nito ang mga screenshot @@ -621,7 +621,7 @@ Nilaktawan dahil may di pa nabasang mga kabanata Nilaktawan dahil wala pang nabasang mga kabanata Mag-zoom sa pahigang larawan - I-pan ang malapad na larawan kapag nag-tap + I-pan ang mga malalapad na larawan Matuto pa Nilaktawan Nabigo ang %1$d (na) update @@ -700,7 +700,7 @@ Manu-mano at kusang backups Lock ng app, bantayan ang screen Itambak ang mga crash log, pag-o-optimisa sa baterya - Mga kategorya, panlahatang update + Mga kategorya, panlahatang update, pag-swipe ng kabanata Mga source, extension, panlahatang paghanap Nagkaroon ng hindi inaasahang error ang %s. Iminumungkahi naming ibahagi mo ang mga crash log sa aming support channel sa Discord. Ay! diff --git a/i18n/src/main/res/values-fr/strings.xml b/i18n/src/main/res/values-fr/strings.xml index c6775f321..899dc6025 100644 --- a/i18n/src/main/res/values-fr/strings.xml +++ b/i18n/src/main/res/values-fr/strings.xml @@ -5,13 +5,13 @@ Paramètres Bibliothèque Historique - Nouveautés + Mises à jour Sauvegarder et restaurer Paramètres Filtre Téléchargés - Signets + Favori Non lus Retirer le filtre Alphabétiquement @@ -23,7 +23,7 @@ Marquer les précédents comme lus Télécharger Marquer le chapitre - Enlever le signet + Retirer des favoris Supprimer Mettre à jour la bibliothèque Modifier @@ -31,8 +31,8 @@ Ajouter une catégorie Modifier les catégories Renommer la catégorie - Déplacer vers une catégorie - Changer l\'image de couverture + Définir la catégorie + Modifier la couverture Pause Chapitre précédent Chapitre suivant @@ -61,7 +61,7 @@ Avancé À propos - Nombre de colonnes + Taille de grille Portrait Paysage Mises à jour automatiques @@ -86,8 +86,8 @@ Blanc Noir Mode de lecture par défaut - Pages (gauche à droite) - Pages (droite à gauche) + Pagé (gauche à droite) + De droite à gauche Pages (vertical) Bande continue Type de mise à l\'échelle @@ -232,7 +232,7 @@ Que voulez-vous sauvegarder \? Supprimer les chapitres téléchargés ? Suivi - Nombre de chapitres + Total de chapitres Créer une sauvegarde Peut être utilisé pour restaurer la bibliothèque actuelle Restaurer une sauvegarde @@ -507,7 +507,7 @@ Appliquer par défaut %1$s : %2$s, page %3$d Chapitres téléchargés - Rechercher des paramètres + Rechercher les paramètres Êtes-vous sûr(e) \? Tout l\'historique sera effacé. Mode navigation privée Effacer l\'historique @@ -582,7 +582,7 @@ Couverture enregistrée Couverture Manuel de suivi - Désactivé(e) + Désactivé Activé Rendre les réglages de tri et d\'affichage propres à chaque catégorie Vous n\'avez pas encore de catégories. @@ -634,11 +634,11 @@ Legacy Installateur Installation de l\'extension… - Total des entrées + Entrées totales Rapports détaillés Inclut des rapports détaillés dans les traces systèmes (réduit les performances de l\'application) Langue - Attention + Avertissement Les mises à jour importantes nuisent aux sources et peuvent entraîner un ralentissement des mises à jour ainsi qu\'une augmentation de l\'utilisation de la batterie. Appuyez pour en savoir plus. Vous devez également conserver des copies des sauvegardes à d\'autres endroits. Uniquement en Wi-Fi @@ -746,7 +746,7 @@ Redémarrer l\'application Langage d\'application, notifications Sources, extensions, recherche globale - Catégories, mise à jour globale, glissement de chapitre + Catégories, mise à jour globale, faire glisser le chapitre Mode de lecture, affichage, navigation Verrouillage des applications, écran sécurisé %s a rencontré une erreur inattendue. Nous vous suggérons de nous partager les rapports de plantage dans notre salon d\'assistance sur Discord. @@ -781,9 +781,9 @@ Inverser l\'orientation des pages larges retournées Tourner les pages larges pour qu\'elles rentrent Informations de débogage - Action de Glisser vers la gauche + Action de glisser à gauche %d par ligne Glissement de chapitre - Action de Glisser vers la droite + Action de glisser à droite Appuyez deux fois pour zoomer \ No newline at end of file diff --git a/i18n/src/main/res/values-gl/strings.xml b/i18n/src/main/res/values-gl/strings.xml index a19c5cdc6..b95e6f383 100644 --- a/i18n/src/main/res/values-gl/strings.xml +++ b/i18n/src/main/res/values-gl/strings.xml @@ -44,11 +44,11 @@ Axustar á pantalla Tipo de escala Paxinado - Vertical contínuo - Webtoon - Vertical - De dereita a esquerda - De esquerda a dereita + Tira longa con espacios + Tira longa + Por páxinas (vertical) + Páxinas (De dereita a esquerda) + Por páxinas (de esquerda a dereita) Modo de lectura por defecto Negro Gris @@ -116,7 +116,7 @@ Actualización global Horizontal Vertical - Elementos por fila + Tamaño da reixa Amosar Isto non evita que as extensións non oficiais ou mal clasificadas mostren contido NSFW (+18) dentro da aplicación. Esconde os contidos das notificacións @@ -344,7 +344,7 @@ Baixa Creando a copia de seguridade Idioma da interface, notificacións - Categorías, actualización global + Categorías, actualización global, accións ao arrastrar Modo de lectura, aparencia e navegación Baixadas automáticas e por adiantado Copias de seguridade manuais e automáticas @@ -371,7 +371,7 @@ Instala e inicia Shizuku para utilizalo como instalador de extensións. Automático En forma de L - Desprazarse polas imaxes anchas ao premer + Desprazarse polas imaxes anchas Actualizar o progreso ao rematar a lectura Servizos Cancelouse a restauración @@ -386,7 +386,7 @@ Localización da copia de seguridade Copias de seguridade automáticas Xa se está facendo unha copia de seguridade - Baixar os rexistros de erros + Compartir os rexistros de erros Error ao compartir a portada Produciuse un erro ao borrar Curto (Hoxe, Onte) @@ -634,7 +634,7 @@ Lendo Procurando capítulos novos Non hai ningunha conexión Wi-Fi dispoñible - %s pechouse por un problema inesperado. Aconsellámoste que fagas unha captura de pantalla desta mensaxe, baixes os rexistros de erros e logo os compartas na canle de soporte no Discord (en inglés). + %s pechouse por un problema inesperado. Aconsellámoste que compartas os rexistros de erros na canle de soporte no Discord (en inglés). Reinicia a aplicación Non se atopou ninguna fonte instalada Advertencia: As baixadas grandes poden facer que as fontes se volvan máis lentas e/ou bloqueen Tachiyomi. Preme para saber máis. @@ -784,4 +784,10 @@ Xirar as páxinas anchas para adaptalas á pantalla Voltear a orientación das páxinas anchas xiradas Superposición + %d por fila + Acción de arrastrar á esquerda + Amplía dando dous toques na pantalla + Arrastre de capítulo + Acción de arrastrar á dereita + Información de depuración \ No newline at end of file diff --git a/i18n/src/main/res/values-ne/strings.xml b/i18n/src/main/res/values-ne/strings.xml index 36d44c8a3..aae3d9b9f 100644 --- a/i18n/src/main/res/values-ne/strings.xml +++ b/i18n/src/main/res/values-ne/strings.xml @@ -3,7 +3,7 @@ अन अफ अँध्यारो मोड - थीम + थिम बारेमा उन्नत सेटिङहरू ट्र्याकिङ @@ -16,11 +16,11 @@ रिफ्रेस गर्नुहोस् अगाडि पछाडि - पुनर्स्थापना गर्नुहोस् + रिस्टोर गर्नुहोस् लग खोल्नुहोस् पूर्ववत गर्नुहोस् रिसेट गर्नुहोस् - बचत गर्नुहोस् + सेभ गर्नुहोस् साझा गर्नुहोस् स्थापना गर्नुहोस् तल सार्नुहोस् @@ -60,9 +60,9 @@ वर्गहरू सम्पादन गर्नुहोस् वर्ग थप्नुहोस् थप्नुहोस् - सम्पादन - सबैलाई अस्वीकार गर्नुहोस् - सबैलाई स्वीकार गर्नुहोस् + सम्पादन गर्नुहोस् + सबैलाई असक्षम गर्नुहोस् + सबैलाई सक्षम गर्नुहोस् पुस्तकालय अपडेट गर्नुहोस् हटाउनुहोस् अध्यायमा पुस्तकचिनो हटाउनुहोस् @@ -75,7 +75,7 @@ ग्लोबल खोज सेटिङमा खोज्नुहोस् खोज्नुहोस् - अन्तिम पढिएको + पछिल्लो पटक पढिएको कुल अध्यायहरू वर्णमाला अनुसार फिल्टर हटाउनुहोस् @@ -90,7 +90,7 @@ ट्र्याकिङ अध्याय पुस्तकालयका इन्ट्रीहरू - तपाईंसँग कुनै वर्गहरू छैन। तपाईंको पुस्तकालय व्यवस्थित गर्न प्लस बटन थिच्नुहोस्। + तपाईंसँग कुनै वर्गहरू छैन। वर्ग बनाएर पुस्तकालय व्यवस्थित गर्न प्लस बटन थिच्नुहोस्। तपाईंको पुस्तकालय खाली छ हालै केहि पढेको छैन कुनै नयाँ अपडेटहरू छैन @@ -100,7 +100,7 @@ एक्सटेन्शनको जानकारी एक्सटेन्शन स्थानान्तरण - ब्याकअप र पुनर्स्थापना + ब्याकअप र रिस्टोर स्रोतहरू इतिहास अपडेटहरू @@ -113,7 +113,7 @@ उल्टो चयन गर्नु राखिएको मिती अध्याय ल्याएको मिति - सबैभन्दा नयाँ अध्याय + नवीनतम अध्याय पुस्तकालय अपडेट गर्दा ट्र्याकरहरू अपडेट गर्नुहोस् ट्र्याकरहरू स्वचालित रूपमा रिफ्रेस गर्नुहोस् पुस्तकालय अपडेट गर्दा नयाँ आवरण र विवरणहरूको लागि जाँच गर्नुहोस् @@ -121,7 +121,7 @@ \"समाप्त\" स्थिति भएको प्रतिबन्धहरू: %s चार्ज हुँदा - स्वचालित अपडेटहरू को यन्त्र प्रतिबन्धहरू + स्वचालित अपडेटहरू यन्त्र प्रतिबन्धहरू साप्ताहिक प्रत्येक २ दिन दैनिक @@ -142,7 +142,7 @@ स्रोत र एक्सटेन्शन सूची मा देखाउनुहोस् NSFW (१८+) स्रोतहरू सूचना को सामग्री लुकाउनुहोस् - एपहरू स्विच गर्दा \"सुरक्षित स्क्रिनले\" एप सामग्रीहरू लुकाउँछ र स्क्रिनसटहरू रोक्छ + एपहरू स्विच गर्दा \"स्क्रिन सुरक्षित गर्नुहोस्\" ले एप सामग्रीहरू लुकाउँछ र स्क्रिनसटहरू रोक्छ स्क्रिन सुरक्षित गर्नुहोस् %1$s मिनेट पछि @@ -169,7 +169,7 @@ मिडनाइट डस्क हरियो स्याउ गतिशील - एपको थीम + एपको थिम सिस्टम पालना गर्नुहोस् रूप अहिले डाउनलोड गर्न सुरु गर्नुहोस् @@ -187,11 +187,11 @@ कुनै पनि बगहरू ठीक गर्न मद्दत गर्दछ। कुनै संवेदनशील डाटा पठाइने छैन क्रेश रिपोर्टहरू पठाउनुहोस् v%1$s मा अपडेट गरियो - अपडेटका लागि चेक गर्नुहोस् + अपडेटका लागि जाँच गर्नुहोस् छवि लोड गर्न सकिएन अध्यायहरू डाउनलोड गर्न सकिएन। तपाईं डाउनलोड कतारमा फेरि प्रयास गर्न सक्नुहुन्छ स्थापना रद्द गर्नुहोस् - तेस्रो अन्तिम अध्याय + अन्तिम पढिएको अध्याय भन्दा २ अध्याय अघि पोर्ट्रेट रङ फिल्टर मिश्रण मोड सधैं सोध्नुहोस् @@ -250,7 +250,7 @@ स्क्रिन डज / हल्का जलाउनु / अँध्यारो गर्नु - पृष्ठहरू अलग फोल्डरहरूमा बचत गर्नुहोस् + फरक फोल्डरमा पृष्ठहरू सेभ गर्नुहोस् स्क्रिन अन राख्नुहोस् इन्ट्रीहरूको शीर्षक अनुसार फोल्डरहरू सिर्जना गर्दछ कुल इन्ट्रीहरू @@ -285,13 +285,13 @@ पृष्ठबद्ध (ठाडो) लामो स्ट्रिप खाली ठाउँ भएको लामो स्ट्रिप - पछिल्लो + पहिलेको किन्डल जस्तै - पृष्ठबद्ध (दायाँ देखि बायाँ) + दायाँ देखि बायाँ दायाँ र बायाँ - अघिल्लो + अर्को बायाँ - पृष्ठबद्ध (बायाँ देखि दायाँ) + बायाँ देखि दायाँ दायाँ ब्राउज ब्याकअप सिर्जना गर्दै @@ -312,14 +312,14 @@ २५% स्क्रोलमा मेनु लुकाउनको लागि संवेदनशीलता डाउनलोड स्थान - दोस्रो अन्तिम अध्याय + अन्तिम पढिएको अध्याय भन्दा पहिले १ अध्याय स्वत: डाउनलोड गर्नुहोस् ट्र्याकिङ गाइड - पछिल्लो पढिएको अध्याय + अन्तिम पढिएको अध्याय सेवाहरू जसले विशिष्ट स्रोतहरूको लागि परिष्कृत सुविधाहरू प्रदान गर्दछ। तपाईंको पुस्तकालयमा इन्ट्री थप्दा स्वतः ट्र्याक गरिन्छ। ट्र्याक पिन गरिएका स्रोतहरू मात्र समावेश गर्नुहोस् - पुनर्स्थापना सम्पन्न भयो + रिस्टोर सम्पन्न भयो %2$s त्रुटिको साथ %1$s मा सम्पन्न भयो %2$s त्रुटिहरूसँग %1$s मा सम्पन्न भयो @@ -343,10 +343,10 @@ सेवाहरू अवैध ब्याकअप फाइल ब्याकअप सिर्जना गरियो - ब्याकअप फाइलबाट डाटा पुनर्स्थापित हुनेछ। + ब्याकअप फाइलबाट डाटा रिस्टोर हुनेछ। \n -\nतपाईंले कुनै पनि छुटेका एक्सटेन्शन स्थापना गर्न र तिनीहरूलाई प्रयोग गर्न पछि ट्र्याकिङ सेवाहरूमा लगइन गर्न आवश्यक हुनेछ। - पुनर्स्थापना पहिले नै प्रगतिमा छ +\nतपाईंले कुनै पनि छुटेको एक्सटेन्शनहरू स्थापना गर्न र तिनीहरूलाई प्रयोग गर्न पछि ट्र्याकिङ सेवाहरूमा लगइन गर्न आवश्यक हुनेछ। + रिस्टोर पहिले नै प्रगतिमा छ नेटवर्क ब्याकअप पुनर्स्थापना असफल भयो तपाईंले ब्याकअपको प्रतिलिपिहरू अन्य ठाउँहरूमा पनि राख्नु पर्छ। @@ -358,7 +358,7 @@ उच्चतम असक्षम परिष्कृत सेवाहरू - पुनर्स्थापना रद्द गरियो + रिस्टोर रद्द गरियो त्रुटि तन्काउनुहोस् स्मार्ट फिट @@ -373,8 +373,8 @@ उच्च सबैभन्दा कम कस्टम स्थान - CBZ अभिलेख को रूपमा बचत गर्नुहोस् - चौथो अन्तिम अध्याय + CBZ अभिलेख को रूपमा सेभ गर्नुहोस् + अन्तिम पढिएको अध्याय भन्दा ३ अध्याय अघि नयाँ अध्यायहरू डाउनलोड गर्नुहोस् अध्यायहरू %1$s @@ -386,14 +386,14 @@ ट्र्याकिङ सेवाहरूमा अध्याय प्रगति अपडेट गर्न एकतर्फी सिङ्क। तिनीहरूको ट्र्याकिङ बटनबाट व्यक्तिगत इन्ट्रीहरूको लागि ट्र्याकिङ सेट अप गर्नुहोस्। ट्र्याकरहरूमा लगइन छैनन्: छुटेको स्रोतहरू: - पाँचौं अन्तिम अध्याय + अन्तिम पढिएको अध्याय भन्दा ४ अध्याय अघि \"बहिष्कृत\" वर्गहरूमा इन्ट्री \"समावेश गरिएका\" वर्गहरूमा भए पनि डाउनलोड गरिने छैन। अध्याय %1$s र 1 थप अध्याय %1$s र %2$d थप ब्याकअप सिर्जना गर्नुहोस् - हालको पुस्तकालय पुनर्स्थापना गर्न प्रयोग गर्न सकिन्छ + हालको पुस्तकालय रिस्टोर गर्न प्रयोग गर्न सकिन्छ कुकीहरू खाली गरियो डाटा खाली गर्दा त्रुटि भयो @@ -417,7 +417,7 @@ एक्सटेन्शनहरूको सूची प्राप्त गर्न असफल भयो दायाँ ब्याकअप रिस्टोर गर्नुहोस् - ब्याकअप फाइलबाट पुस्तकालय पुनर्स्थापना गर्नुहोस् + ब्याकअप फाइलबाट पुस्तकालय रिस्टोर गर्नुहोस् स्वचालित ब्याकअपहरू ब्याकअपमा कुनै पनि पुस्तकालयका इन्ट्री समावेश छैन। ब्याकअप स्थान @@ -447,7 +447,7 @@ लोकल स्रोत अन्य ट्याबहरू - पछिल्लो + नवीनतम द्वारा अर्डर गर्नुहोस् मिति %1$s मा लग इन गर्नुहोस् @@ -485,14 +485,14 @@ लोकल स्रोत गाइड जारी छ अज्ञात स्थिति - इजाजतपत्र प्राप्त + लाइसेन्स प्राप्त पासवर्ड सफा गर्न केही छैन ट्र्याकिङ ताजा गर्नुहोस् संस्करण वेबसाइट अनुवाद गर्न मद्दत गर्नुहोस् - खुला स्रोत इजाजतपत्रहरू + खुला स्रोत लाइसेन्सहरू पुस्तकालयबाट हटाउनुहोस् प्रकाशन सकियो रद्द गरेको @@ -539,7 +539,7 @@ पूर्वनिर्धारित रूपमा सेट गर्नुहोस् यो छवि आवरण को रूपमा राख्न चाहनुहुन्छ\? नपढिएको - आवरण बचत भयो + आवरण सेभ भयो यो श्रृंखलाको लागि पृष्ठहरू लोड हुँदै… डाटा समावेश गर्न चुन्नुहोस् @@ -557,10 +557,10 @@ पढ्ने मोड सकिएको: पुस्तकालय अपडेट गर्दै - के तपाइँ निश्चित रूपमा यी सेटिङहरूलाई पूर्वनिर्धारित रूपमा बचत गर्न चाहनुहुन्छ\? + के तपाइँ निश्चित रूपमा यी सेटिङहरूलाई पूर्वनिर्धारित रूपमा सेभ गर्न चाहनुहुन्छ\? अध्यायहरू भेटिएन स्थिति - फोटो बचत गरियो + फोटो सेभ गरियो नपढिएको रोकिएको अर्को अध्याय छैन @@ -572,7 +572,7 @@ %d ट्र्याकरहरू फेरी पढ्दै - वर्तमान: + हालको: कुनै मेल फेला परेन कृपया MAL मा फेरि लगइन गर्नुहोस् स्रोत समर्थित छैन @@ -592,7 +592,7 @@ स्थानान्तरण बारम्बार सोधिएका प्रश्न उत्तर र गाइडहरू डाउनलोड - पहिलेको अध्याय छैन + अघिल्लो अध्याय छैन पुस्तकालय अपडेट गर्दै...(%1$d/%2$d) यो ट्रयाकर कोग्मामा कोस्रोत सँग मात्र चलाउन मिल्छ! ट्र्याकिङ @@ -628,7 +628,7 @@ जूम ल्यान्डस्केप छवि %1$d अपडेट(हरू) असफल भयो %1$d अपडेट(हरू) छोडियो - अक्षम + असक्षम पुस्तकालय अपडेट त्रुटिहरू कसरी समाधान गर्ने भन्ने बारे मद्दतको लागि, %1$s हेर्नुहोस् नपढिएको संख्या बन्द @@ -651,12 +651,12 @@ डुप्लिकेट अध्यायहरू छोड्नुहोस् जारी राख्नुहोस् बटन तथ्याङ्क - सुरु भएको + सुरु गरिएको लोकल - डाउनलोड गरेको + डाउनलोड गरिएको मापन नगरिएको नेटवर्कमा मात्र अगाडि डाउनलोड गर्नुहोस् - थीम, मिति र समय ढाँचा + थिम, मिति र समय ढाँचा केवल पुस्तकालयका इन्ट्रीहरूमा काम गर्दछ र यदि हालको अध्याय + अर्को पहिले नै डाउनलोड गरिएको छ समुन्द्री लहर संस्करण @@ -767,8 +767,8 @@ Debug जानकारी अध्याय स्वाइप - दायाँ कार्यमा स्वाइप गर्नुहोस् - बायाँ कार्यमा स्वाइप गर्नुहोस् + दायाँ स्वाइप + बायाँ स्वाइप जूम गर्न डबल ट्याप गर्नुहोस् %d प्रति पङ्क्ति \ No newline at end of file diff --git a/i18n/src/main/res/values-pl/strings.xml b/i18n/src/main/res/values-pl/strings.xml index 7284d7463..478d0ba90 100644 --- a/i18n/src/main/res/values-pl/strings.xml +++ b/i18n/src/main/res/values-pl/strings.xml @@ -58,7 +58,7 @@ Pobieranie Zaawansowane O aplikacji - Ilość okładek w rzędzie + Rozmiar siatki Usuń z biblioteki Rozdział %1$s Pobierz @@ -640,7 +640,7 @@ Brak przeczytanych rozdziałów 5% Przybliżaj poziome obrazy - Dotknij aby przesunąć + Przesuń szeroki obraz Siatka z samych okładek Pominięto - brak przeczytanych rozdziałów Pominięto ponieważ seria została ukończona @@ -745,4 +745,8 @@ Brakuje %1$s rozdziałów Brakuje %1$s rozdziałów + %d na rząd + Dotknij dwukrotnie, aby powiększyć + Przesuń palcem w prawo + Przesuń palcem w lewo \ No newline at end of file diff --git a/i18n/src/main/res/values-pt/strings.xml b/i18n/src/main/res/values-pt/strings.xml index e8c4af43a..d45921b13 100644 --- a/i18n/src/main/res/values-pt/strings.xml +++ b/i18n/src/main/res/values-pt/strings.xml @@ -183,7 +183,7 @@ Erro Não foi possível transferir o capítulo devido a um erro inesperado - Sem ligação de Wi-Fi disponível + A ligação Wi-Fi está indisponível Itens da biblioteca Monitorização Histórico @@ -291,8 +291,9 @@ Copiar Falha ao atualizar a capa Não tem nenhuma categoria. Toque no botão (+) para criar uma e organizar a sua biblioteca. - Descarregador - Conexão à rede indisponível + Gestor de transferências + A ligação à rede está indisponível + Transferências em pausa Comum Sobrepor Multiplicação @@ -514,7 +515,7 @@ Página seguinte Página anterior Guia de migração de fonte - Não foi encontrada app de selecção de ficheiros + Não foi encontrada nenhuma app de seleção de ficheiros Por favor inicie sessão no MAL novamente Mostrar na lista de fontes e extensões Zonas de toque @@ -775,7 +776,7 @@ Avaliação média Usados %ds - A verificar as descargas + A verificar as transferências Remover data\? Visão geral Itens completos diff --git a/i18n/src/main/res/values-sr/strings.xml b/i18n/src/main/res/values-sr/strings.xml index d28352c60..8f1785ecb 100644 --- a/i18n/src/main/res/values-sr/strings.xml +++ b/i18n/src/main/res/values-sr/strings.xml @@ -69,8 +69,8 @@ Праћење Напредно O апликацији - Број ставки по реду - Вертикално + Величина мреже + Усправно Хоризонтално Аутоматска ажурирања Искључено @@ -110,10 +110,10 @@ Бела Црна Подразумевани начин читања - Слева надесно - Здесна налево - Вертикално - Webtoon + Страница (слева надесно) + Страница (сдесна налево) + Страница (вертикално) + Дуги стрип Странично Тип скалирања Попуни екран @@ -234,7 +234,7 @@ Укључено По систему Управљај обавештењима - Безбедност + Безбедност и приватност Закључај приликом мировања Увек Никада @@ -351,7 +351,7 @@ Растојање од ивице Читање Увек прикажи транзицију поглавља - Континуирано вертикално + Дуги стрип са размацима Прескочи филтрирана поглавља Прикажи садржај у исечку Постави као омот @@ -440,9 +440,9 @@ Начин читања Instaler - Preskače se %d poglavlje,ili ne postoji u izvori ili su izdvojeni filterom - Preskače se %d poglavlje,ili ne postoji u izvori ili su izdvojeni filterom - Preskače se %d poglavlje,ili ne postoji u izvori ili su izdvojeni filterom + Прескаче се %d поглавље, или не постоји у извору или је филтером издвојено + Прескаче се %d поглавља, или не постоји у извору или је филтером издвојено + Прескаче се %d поглавља, или не постоји у извору или је филтером издвојено Аутоматско преузимање Прати @@ -487,7 +487,7 @@ \nМораћете да инсталирате све додатке које недостају и да се после тога пријавите на трекере да бисте их користили. Сервиси који пружају побољшане услуге за одређене изворе. Наслов се аутоматски прати када га додате у колекцију. Помозите у превођењу - Избаци извештаје о паду + Дели извештаје о паду Исписуј детаљне извештаје у системски дневник (смањује перформансе апликације) Није могуће отворити подешавања уређаја Освежи омоте у колекцији @@ -540,7 +540,7 @@ Поглавља %1$s и још %2$d Поглавља %1$s и још %2$d - Укључи само означене изворе + Претражи само означене изворе у глобалној претрази Овај пратилац је компатибилан само са извором Komga. Прикажи начин навигације Датум завршетка @@ -637,7 +637,7 @@ Прескочено јер ниједно поглавље није прочитано Прескочено Мрежа насловница - Померај широке слике додиром + Померај широке слике Зумирај пејзажну слику Питања и водичи Sačuvaj kao CBZ arhivu @@ -655,7 +655,7 @@ Батерија није празна Обриши податке WebView-a Подаци WebView-a су обрисани - Категорије, глобално ажурирање + Категорије, глобално ажурирање, листање поглавља Режим читања, дисплеј, навигација Аутоматско преузимање, преузимање унапред Једносмерна синхронизација напретка, побољшана синхронизација @@ -666,7 +666,7 @@ Сва подешавања читача су ресетована Присили апликацију да поново провери преузета поглавља Није инсталирано - %s је наишао на неочекивану грешку. Предлажемо да снимите ову поруку и евиденције о паду, а затим да их поделите на нашем каналу за подршку на Discord-у. + %s је наишао на неочекивану грешку. Предлажемо да поделите запис о прекиду програма на нашем каналу за подршку на Discord-у. Widget није доступан када је омогућено закључавање апликације Листа жеља Доступно, али извор није преузет: %s @@ -709,7 +709,7 @@ %d минута %d секунди Нема описа - Покажи дугме за наставак читања + Дугме за наставак читања InternalError: Провери записнике о прекиду програма за даље информације Прескочи дупликатска поглавља Више језика @@ -769,4 +769,27 @@ Подразумеван низ корисничког агента %1$s грешка: %2$s *неопходно + Ажурирај категорију + Сакри уносе који се већ налазе у колекцији + Прекривање + Растави високе слике + %d по реду + Превуци удесно + Превуци улево + Прелистај поглавље + Додирни двапут за зумирање + + Следеће поглавље + Следећа %d поглавља + Следећих %d поглавља + + Копирај + Окрени положај широких страница + Прилагоди широке странице ротирањем + Информације за отклањање грешака + + Недостаје %1$s поглавље + Недостају %1$s поглавља + Недостаје %1$s поглавља + \ No newline at end of file diff --git a/i18n/src/main/res/values-tr/strings.xml b/i18n/src/main/res/values-tr/strings.xml index 6f440b74e..51ef70dd3 100644 --- a/i18n/src/main/res/values-tr/strings.xml +++ b/i18n/src/main/res/values-tr/strings.xml @@ -70,7 +70,7 @@ İzleme Gelişmiş Hakkında - Satır başına öge + Izgara boyutu Dikey Yatay Otomatik güncellemeler @@ -621,7 +621,7 @@ Manga tamamlandığı için atlandı Okunmamış bölümler olduğu için atlandı Hiçbir bölüm okunmadığı için atlandı - Dokunulduğunda geniş görselleri kaydır + Geniş görüntüleri kaydır Yatay görseli yakınlaştır %1$d güncelleme başarısız oldu %1$d güncelleme atlandı @@ -744,4 +744,5 @@ Sağa kaydırma eylemi Sola kaydırma eylemi Yakınlaştırmak için iki kez dokun + Satır başına %d \ No newline at end of file diff --git a/i18n/src/main/res/values-zh-rTW/strings.xml b/i18n/src/main/res/values-zh-rTW/strings.xml index a81f9ffd9..32d42e019 100644 --- a/i18n/src/main/res/values-zh-rTW/strings.xml +++ b/i18n/src/main/res/values-zh-rTW/strings.xml @@ -149,15 +149,15 @@ 錯誤 沒有可用的 Wi-Fi 連線 尚未連接至網路 - 書櫃欄位數目 + 格線大小 翻頁轉場動畫 邊緣裁剪 濾鏡融合機制 覆蓋 色彩增值 濾色 - 減淡 / 變亮 - 加深 / 變暗 + 減淡/變亮 + 加深/變暗 導覽 音量按鈕 反轉音量按鈕 @@ -603,7 +603,7 @@ 常見問題與指南 5% 縮放橫向圖片 - 輕觸大圖時先平移後翻頁 + 導覽寬頁時先平移後翻頁 純封面格狀 已開始閱讀 無已讀的章節 @@ -728,4 +728,5 @@ 輕觸兩下以縮放 向右滑動 目錄滑動動作 + 每列 %d 欄 \ No newline at end of file