diff --git a/app/build.gradle b/app/build.gradle index d1d429973e..141e7ec695 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -38,8 +38,8 @@ android { minSdkVersion 16 targetSdkVersion 27 testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" - versionCode 40 - versionName "0.8.2" + versionCode 41 + versionName "0.8.4" buildConfigField "String", "COMMIT_COUNT", "\"${getCommitCount()}\"" buildConfigField "String", "COMMIT_SHA", "\"${getGitSha()}\"" @@ -48,6 +48,8 @@ android { vectorDrawables.useSupportLibrary = true + multiDexEnabled true + ndk { abiFilters "armeabi-v7a", "arm64-v8a", "x86" } @@ -57,13 +59,6 @@ android { debug { versionNameSuffix "-${getCommitCount()}" applicationIdSuffix ".debug" - multiDexEnabled true - } - release { - minifyEnabled true - shrinkResources true - multiDexEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3e5f35a9b1..feddf20960 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,7 +23,7 @@ android:theme="@style/Theme.Tachiyomi"> + android:launchMode="singleTask"> @@ -33,6 +33,10 @@ + + + + diff --git a/app/src/main/java/eu/kanade/tachiyomi/App.kt b/app/src/main/java/eu/kanade/tachiyomi/App.kt index 18e6dff247..ef4564f777 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/App.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/App.kt @@ -42,9 +42,7 @@ open class App : Application() { override fun attachBaseContext(base: Context) { super.attachBaseContext(base) - if (BuildConfig.DEBUG) { - MultiDex.install(this) - } + MultiDex.install(this) } override fun onConfigurationChanged(newConfig: Configuration) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/SourceManager.kt b/app/src/main/java/eu/kanade/tachiyomi/source/SourceManager.kt index 4c3596a0fd..a8d0fed162 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/source/SourceManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/source/SourceManager.kt @@ -6,11 +6,6 @@ import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.online.HttpSource -import eu.kanade.tachiyomi.source.online.english.* -import eu.kanade.tachiyomi.source.online.german.WieManga -import eu.kanade.tachiyomi.source.online.russian.Mangachan -import eu.kanade.tachiyomi.source.online.russian.Mintmanga -import eu.kanade.tachiyomi.source.online.russian.Readmanga import rx.Observable open class SourceManager(private val context: Context) { @@ -48,17 +43,7 @@ open class SourceManager(private val context: Context) { } private fun createInternalSources(): List = listOf( - LocalSource(context), - Batoto(), - Mangahere(), - Mangafox(), - Kissmanga(), - Readmanga(), - Mintmanga(), - Mangachan(), - Readmangatoday(), - Mangasee(), - WieManga() + LocalSource(context) ) private inner class StubSource(override val id: Long) : Source { diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/online/english/Batoto.kt b/app/src/main/java/eu/kanade/tachiyomi/source/online/english/Batoto.kt deleted file mode 100644 index bf1ef7a757..0000000000 --- a/app/src/main/java/eu/kanade/tachiyomi/source/online/english/Batoto.kt +++ /dev/null @@ -1,31 +0,0 @@ -package eu.kanade.tachiyomi.source.online.english - -import eu.kanade.tachiyomi.source.Source -import eu.kanade.tachiyomi.source.model.Page -import eu.kanade.tachiyomi.source.model.SChapter -import eu.kanade.tachiyomi.source.model.SManga -import rx.Observable - -class Batoto : Source { - - override val id: Long = 1 - - override val name = "Batoto" - - override fun fetchMangaDetails(manga: SManga): Observable { - return Observable.error(Exception("RIP Batoto")) - } - - override fun fetchChapterList(manga: SManga): Observable> { - return Observable.error(Exception("RIP Batoto")) - } - - override fun fetchPageList(chapter: SChapter): Observable> { - return Observable.error(Exception("RIP Batoto")) - } - - override fun toString(): String { - return "$name (EN)" - } - -} diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/online/english/Kissmanga.kt b/app/src/main/java/eu/kanade/tachiyomi/source/online/english/Kissmanga.kt deleted file mode 100644 index 0287c1fb56..0000000000 --- a/app/src/main/java/eu/kanade/tachiyomi/source/online/english/Kissmanga.kt +++ /dev/null @@ -1,253 +0,0 @@ -package eu.kanade.tachiyomi.source.online.english - -import com.squareup.duktape.Duktape -import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.network.POST -import eu.kanade.tachiyomi.source.model.* -import eu.kanade.tachiyomi.source.online.ParsedHttpSource -import okhttp3.FormBody -import okhttp3.Headers -import okhttp3.OkHttpClient -import okhttp3.Request -import okhttp3.Response -import org.jsoup.nodes.Document -import org.jsoup.nodes.Element -import timber.log.Timber -import java.text.SimpleDateFormat -import java.util.regex.Pattern - -class Kissmanga : ParsedHttpSource() { - - override val id: Long = 4 - - override val name = "Kissmanga" - - override val baseUrl = "http://kissmanga.com" - - override val lang = "en" - - override val supportsLatest = true - - override val client: OkHttpClient = network.cloudflareClient - - override fun headersBuilder(): Headers.Builder { - return Headers.Builder() - .add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) Gecko/20100101 Firefox/60") - } - - override fun popularMangaSelector() = "table.listing tr:gt(1)" - - override fun latestUpdatesSelector() = "table.listing tr:gt(1)" - - override fun popularMangaRequest(page: Int): Request { - return GET("$baseUrl/MangaList/MostPopular?page=$page", headers) - } - - override fun latestUpdatesRequest(page: Int): Request { - return GET("http://kissmanga.com/MangaList/LatestUpdate?page=$page", headers) - } - - override fun popularMangaFromElement(element: Element): SManga { - val manga = SManga.create() - element.select("td a:eq(0)").first().let { - manga.setUrlWithoutDomain(it.attr("href")) - val title = it.text() - //check if cloudfire email obfuscation is affecting title name - if (title.contains("[email protected]", true)) { - try { - var str: String = it.html() - //get the number - str = str.substringAfter("data-cfemail=\"") - str = str.substringBefore("\">[email") - val sb = StringBuilder() - //convert number to char - val r = Integer.valueOf(str.substring(0, 2), 16)!! - var i = 2 - while (i < str.length) { - val c = (Integer.valueOf(str.substring(i, i + 2), 16) xor r).toChar() - sb.append(c) - i += 2 - } - //replace the new word into the title - manga.title = title.replace("[email protected]", sb.toString(), true) - } catch (e: Exception) { - //on error just default to obfuscated title - Timber.e("error parsing [email protected]", e) - manga.title = title - } - } else { - manga.title = title - } - } - return manga - } - - override fun latestUpdatesFromElement(element: Element): SManga { - return popularMangaFromElement(element) - } - - override fun popularMangaNextPageSelector() = "li > a:contains(› Next)" - - override fun latestUpdatesNextPageSelector(): String = "ul.pager > li > a:contains(Next)" - - override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { - val form = FormBody.Builder().apply { - add("mangaName", query) - - for (filter in if (filters.isEmpty()) getFilterList() else filters) { - when (filter) { - is Author -> add("authorArtist", filter.state) - is Status -> add("status", arrayOf("", "Completed", "Ongoing")[filter.state]) - is GenreList -> filter.state.forEach { genre -> add("genres", genre.state.toString()) } - } - } - } - return POST("$baseUrl/AdvanceSearch", headers, form.build()) - } - - override fun searchMangaSelector() = popularMangaSelector() - - override fun searchMangaFromElement(element: Element): SManga { - return popularMangaFromElement(element) - } - - override fun searchMangaNextPageSelector() = null - - override fun mangaDetailsParse(document: Document): SManga { - val infoElement = document.select("div.barContent").first() - - val manga = SManga.create() - manga.author = infoElement.select("p:has(span:contains(Author:)) > a").first()?.text() - manga.genre = infoElement.select("p:has(span:contains(Genres:)) > *:gt(0)").text() - manga.description = infoElement.select("p:has(span:contains(Summary:)) ~ p").text() - manga.status = infoElement.select("p:has(span:contains(Status:))").first()?.text().orEmpty().let { parseStatus(it) } - manga.thumbnail_url = document.select(".rightBox:eq(0) img").first()?.attr("src") - return manga - } - - fun parseStatus(status: String) = when { - status.contains("Ongoing") -> SManga.ONGOING - status.contains("Completed") -> SManga.COMPLETED - else -> SManga.UNKNOWN - } - - override fun chapterListSelector() = "table.listing tr:gt(1)" - - override fun chapterFromElement(element: Element): SChapter { - val urlElement = element.select("a").first() - - val chapter = SChapter.create() - chapter.setUrlWithoutDomain(urlElement.attr("href")) - chapter.name = urlElement.text() - chapter.date_upload = element.select("td:eq(1)").first()?.text()?.let { - SimpleDateFormat("MM/dd/yyyy").parse(it).time - } ?: 0 - return chapter - } - - override fun pageListRequest(chapter: SChapter) = POST(baseUrl + chapter.url, headers) - - override fun pageListParse(response: Response): List { - val body = response.body()!!.string() - - val pages = mutableListOf() - - // Kissmanga now encrypts the urls, so we need to execute these two scripts in JS. - val ca = client.newCall(GET("$baseUrl/Scripts/ca.js", headers)).execute().body()!!.string() - val lo = client.newCall(GET("$baseUrl/Scripts/lo.js", headers)).execute().body()!!.string() - - Duktape.create().use { - it.evaluate(ca) - it.evaluate(lo) - - // There are two functions in an inline script needed to decrypt the urls. We find and - // execute them. - var p = Pattern.compile("(var.*CryptoJS.*)") - var m = p.matcher(body) - while (m.find()) { - it.evaluate(m.group(1)) - } - - // Finally find all the urls and decrypt them in JS. - p = Pattern.compile("""lstImages.push\((.*)\);""") - m = p.matcher(body) - - var i = 0 - while (m.find()) { - val url = it.evaluate(m.group(1)) as String - pages.add(Page(i++, "", url)) - } - } - - return pages - } - - override fun pageListParse(document: Document): List { - throw Exception("Not used") - } - - override fun imageUrlRequest(page: Page) = GET(page.url) - - override fun imageUrlParse(document: Document) = "" - - private class Status : Filter.TriState("Completed") - private class Author : Filter.Text("Author") - private class Genre(name: String) : Filter.TriState(name) - private class GenreList(genres: List) : Filter.Group("Genres", genres) - - override fun getFilterList() = FilterList( - Author(), - Status(), - GenreList(getGenreList()) - ) - - // $("select[name=\"genres\"]").map((i,el) => `Genre("${$(el).next().text().trim()}", ${i})`).get().join(',\n') - // on http://kissmanga.com/AdvanceSearch - private fun getGenreList() = listOf( - Genre("4-Koma"), - Genre("Action"), - Genre("Adult"), - Genre("Adventure"), - Genre("Comedy"), - Genre("Comic"), - Genre("Cooking"), - Genre("Doujinshi"), - Genre("Drama"), - Genre("Ecchi"), - Genre("Fantasy"), - Genre("Gender Bender"), - Genre("Harem"), - Genre("Historical"), - Genre("Horror"), - Genre("Josei"), - Genre("Lolicon"), - Genre("Manga"), - Genre("Manhua"), - Genre("Manhwa"), - Genre("Martial Arts"), - Genre("Mature"), - Genre("Mecha"), - Genre("Medical"), - Genre("Music"), - Genre("Mystery"), - Genre("One shot"), - Genre("Psychological"), - Genre("Romance"), - Genre("School Life"), - Genre("Sci-fi"), - Genre("Seinen"), - Genre("Shotacon"), - Genre("Shoujo"), - Genre("Shoujo Ai"), - Genre("Shounen"), - Genre("Shounen Ai"), - Genre("Slice of Life"), - Genre("Smut"), - Genre("Sports"), - Genre("Supernatural"), - Genre("Tragedy"), - Genre("Webtoon"), - Genre("Yaoi"), - Genre("Yuri") - ) -} diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/online/english/Mangafox.kt b/app/src/main/java/eu/kanade/tachiyomi/source/online/english/Mangafox.kt deleted file mode 100644 index e41a4775a3..0000000000 --- a/app/src/main/java/eu/kanade/tachiyomi/source/online/english/Mangafox.kt +++ /dev/null @@ -1,231 +0,0 @@ -package eu.kanade.tachiyomi.source.online.english - -import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.source.model.* -import eu.kanade.tachiyomi.source.online.ParsedHttpSource -import okhttp3.HttpUrl -import okhttp3.Request -import org.jsoup.nodes.Document -import org.jsoup.nodes.Element -import java.text.ParseException -import java.text.SimpleDateFormat -import java.util.* - -class Mangafox : ParsedHttpSource() { - - override val id: Long = 3 - - override val name = "Mangafox" - - override val baseUrl = "http://mangafox.la" - - override val lang = "en" - - override val supportsLatest = true - - override fun popularMangaSelector() = "div#mangalist > ul.list > li" - - override fun popularMangaRequest(page: Int): Request { - val pageStr = if (page != 1) "$page.htm" else "" - return GET("$baseUrl/directory/$pageStr", headers) - } - - override fun latestUpdatesSelector() = "div#mangalist > ul.list > li" - - override fun latestUpdatesRequest(page: Int): Request { - val pageStr = if (page != 1) "$page.htm" else "" - return GET("$baseUrl/directory/$pageStr?latest") - } - - override fun popularMangaFromElement(element: Element): SManga { - val manga = SManga.create() - element.select("a.title").first().let { - manga.setUrlWithoutDomain(it.attr("href")) - manga.title = it.text() - } - return manga - } - - override fun latestUpdatesFromElement(element: Element): SManga { - return popularMangaFromElement(element) - } - - override fun popularMangaNextPageSelector() = "a:has(span.next)" - - override fun latestUpdatesNextPageSelector() = "a:has(span.next)" - - override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { - val url = HttpUrl.parse("$baseUrl/search.php?name_method=cw&author_method=cw&artist_method=cw&advopts=1")!!.newBuilder().addQueryParameter("name", query) - (if (filters.isEmpty()) getFilterList() else filters).forEach { filter -> - when (filter) { - is Status -> url.addQueryParameter(filter.id, filter.state.toString()) - is GenreList -> filter.state.forEach { genre -> url.addQueryParameter(genre.id, genre.state.toString()) } - is TextField -> url.addQueryParameter(filter.key, filter.state) - is Type -> url.addQueryParameter("type", if (filter.state == 0) "" else filter.state.toString()) - is OrderBy -> { - url.addQueryParameter("sort", arrayOf("name", "rating", "views", "total_chapters", "last_chapter_time")[filter.state!!.index]) - url.addQueryParameter("order", if (filter.state?.ascending == true) "az" else "za") - } - } - } - url.addQueryParameter("page", page.toString()) - return GET(url.toString(), headers) - } - - override fun searchMangaSelector() = "div#mangalist > ul.list > li" - - override fun searchMangaFromElement(element: Element): SManga { - val manga = SManga.create() - element.select("a.title").first().let { - manga.setUrlWithoutDomain(it.attr("href")) - manga.title = it.text() - } - return manga - } - - override fun searchMangaNextPageSelector() = "a:has(span.next)" - - override fun mangaDetailsParse(document: Document): SManga { - val infoElement = document.select("div#title").first() - val rowElement = infoElement.select("table > tbody > tr:eq(1)").first() - val sideInfoElement = document.select("#series_info").first() - val licensedElement = document.select("div.warning").first() - - val manga = SManga.create() - manga.author = rowElement.select("td:eq(1)").first()?.text() - manga.artist = rowElement.select("td:eq(2)").first()?.text() - manga.genre = rowElement.select("td:eq(3)").first()?.text() - manga.description = infoElement.select("p.summary").first()?.text() - val isLicensed = licensedElement?.text()?.contains("licensed") - if (isLicensed == true) { - manga.status = SManga.LICENSED - } else { - manga.status = sideInfoElement.select(".data").first()?.text().orEmpty().let { parseStatus(it) } - } - - manga.thumbnail_url = sideInfoElement.select("div.cover > img").first()?.attr("src") - return manga - } - - private fun parseStatus(status: String) = when { - status.contains("Ongoing") -> SManga.ONGOING - status.contains("Completed") -> SManga.COMPLETED - else -> SManga.UNKNOWN - } - - override fun chapterListSelector() = "div#chapters li div" - - override fun chapterFromElement(element: Element): SChapter { - val urlElement = element.select("a.tips").first() - - val chapter = SChapter.create() - chapter.setUrlWithoutDomain(urlElement.attr("href")) - chapter.name = element.select("span.title.nowrap").first()?.text()?.let { urlElement.text() + " - " + it } ?: urlElement.text() - chapter.date_upload = element.select("span.date").first()?.text()?.let { parseChapterDate(it) } ?: 0 - return chapter - } - - private fun parseChapterDate(date: String): Long { - return if ("Today" in date || " ago" in date) { - Calendar.getInstance().apply { - set(Calendar.HOUR_OF_DAY, 0) - set(Calendar.MINUTE, 0) - set(Calendar.SECOND, 0) - set(Calendar.MILLISECOND, 0) - }.timeInMillis - } else if ("Yesterday" in date) { - Calendar.getInstance().apply { - add(Calendar.DATE, -1) - set(Calendar.HOUR_OF_DAY, 0) - set(Calendar.MINUTE, 0) - set(Calendar.SECOND, 0) - set(Calendar.MILLISECOND, 0) - }.timeInMillis - } else { - try { - SimpleDateFormat("MMM d, yyyy", Locale.ENGLISH).parse(date).time - } catch (e: ParseException) { - 0L - } - } - } - - override fun pageListParse(document: Document): List { - val url = document.baseUri().substringBeforeLast('/') - - val pages = mutableListOf() - document.select("select.m").first()?.select("option:not([value=0])")?.forEach { - pages.add(Page(pages.size, "$url/${it.attr("value")}.html")) - } - return pages - } - - override fun imageUrlParse(document: Document): String { - val url = document.getElementById("image").attr("src") - return if ("compressed?token=" !in url) { - url - } else { - "http://mangafox.me/media/logo.png" - } - } - - private class Status(val id: String = "is_completed") : Filter.TriState("Completed") - private class Genre(name: String, val id: String = "genres[$name]") : Filter.TriState(name) - private class TextField(name: String, val key: String) : Filter.Text(name) - private class Type : Filter.Select("Type", arrayOf("Any", "Japanese Manga", "Korean Manhwa", "Chinese Manhua")) - private class OrderBy : Filter.Sort("Order by", - arrayOf("Series name", "Rating", "Views", "Total chapters", "Last chapter"), - Filter.Sort.Selection(2, false)) - - private class GenreList(genres: List) : Filter.Group("Genres", genres) - - override fun getFilterList() = FilterList( - TextField("Author", "author"), - TextField("Artist", "artist"), - Type(), - Status(), - OrderBy(), - GenreList(getGenreList()) - ) - - // $('select.genres').map((i,el)=>`Genre("${$(el).next().text().trim()}", "${$(el).attr('name')}")`).get().join(',\n') - // on http://mangafox.me/search.php - private fun getGenreList() = listOf( - Genre("Action"), - Genre("Adult"), - Genre("Adventure"), - Genre("Comedy"), - Genre("Doujinshi"), - Genre("Drama"), - Genre("Ecchi"), - Genre("Fantasy"), - Genre("Gender Bender"), - Genre("Harem"), - Genre("Historical"), - Genre("Horror"), - Genre("Josei"), - Genre("Martial Arts"), - Genre("Mature"), - Genre("Mecha"), - Genre("Mystery"), - Genre("One Shot"), - Genre("Psychological"), - Genre("Romance"), - Genre("School Life"), - Genre("Sci-fi"), - Genre("Seinen"), - Genre("Shoujo"), - Genre("Shoujo Ai"), - Genre("Shounen"), - Genre("Shounen Ai"), - Genre("Slice of Life"), - Genre("Smut"), - Genre("Sports"), - Genre("Supernatural"), - Genre("Tragedy"), - Genre("Webtoons"), - Genre("Yaoi"), - Genre("Yuri") - ) - -} \ No newline at end of file diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/online/english/Mangahere.kt b/app/src/main/java/eu/kanade/tachiyomi/source/online/english/Mangahere.kt deleted file mode 100644 index a9ec1f083b..0000000000 --- a/app/src/main/java/eu/kanade/tachiyomi/source/online/english/Mangahere.kt +++ /dev/null @@ -1,259 +0,0 @@ -package eu.kanade.tachiyomi.source.online.english - -import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.source.model.* -import eu.kanade.tachiyomi.source.online.ParsedHttpSource -import okhttp3.HttpUrl -import okhttp3.Request -import org.jsoup.nodes.Document -import org.jsoup.nodes.Element -import java.security.SecureRandom -import java.security.cert.X509Certificate -import java.text.ParseException -import java.text.SimpleDateFormat -import java.util.* -import javax.net.ssl.SSLContext -import javax.net.ssl.X509TrustManager - -class Mangahere : ParsedHttpSource() { - - override val id: Long = 2 - - override val name = "Mangahere" - - override val baseUrl = "http://www.mangahere.cc" - - override val lang = "en" - - override val supportsLatest = true - - private val trustManager = object : X509TrustManager { - override fun getAcceptedIssuers(): Array { - return emptyArray() - } - - override fun checkClientTrusted(chain: Array, authType: String) { - } - - override fun checkServerTrusted(chain: Array, authType: String) { - } - } - - private val sslContext = SSLContext.getInstance("SSL").apply { - init(null, arrayOf(trustManager), SecureRandom()) - } - - override val client = super.client.newBuilder() - .sslSocketFactory(sslContext.socketFactory, trustManager) - .build() - - override fun popularMangaSelector() = "div.directory_list > ul > li" - - override fun latestUpdatesSelector() = "div.directory_list > ul > li" - - override fun popularMangaRequest(page: Int): Request { - return GET("$baseUrl/directory/$page.htm?views.za", headers) - } - - override fun latestUpdatesRequest(page: Int): Request { - return GET("$baseUrl/directory/$page.htm?last_chapter_time.za", headers) - } - - private fun mangaFromElement(query: String, element: Element): SManga { - val manga = SManga.create() - element.select(query).first().let { - manga.setUrlWithoutDomain(it.attr("href")) - manga.title = if (it.hasAttr("title")) it.attr("title") else if (it.hasAttr("rel")) it.attr("rel") else it.text() - } - return manga - } - - override fun popularMangaFromElement(element: Element): SManga { - return mangaFromElement("div.title > a", element) - } - - override fun latestUpdatesFromElement(element: Element): SManga { - return popularMangaFromElement(element) - } - - override fun popularMangaNextPageSelector() = "div.next-page > a.next" - - override fun latestUpdatesNextPageSelector() = "div.next-page > a.next" - - override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { - val url = HttpUrl.parse("$baseUrl/search.php?name_method=cw&author_method=cw&artist_method=cw&advopts=1")!!.newBuilder().addQueryParameter("name", query) - (if (filters.isEmpty()) getFilterList() else filters).forEach { filter -> - when (filter) { - is Status -> url.addQueryParameter("is_completed", arrayOf("", "1", "0")[filter.state]) - is GenreList -> filter.state.forEach { genre -> url.addQueryParameter(genre.id, genre.state.toString()) } - is TextField -> url.addQueryParameter(filter.key, filter.state) - is Type -> url.addQueryParameter("direction", arrayOf("", "rl", "lr")[filter.state]) - is OrderBy -> { - url.addQueryParameter("sort", arrayOf("name", "rating", "views", "total_chapters", "last_chapter_time")[filter.state!!.index]) - url.addQueryParameter("order", if (filter.state?.ascending == true) "az" else "za") - } - } - } - url.addQueryParameter("page", page.toString()) - return GET(url.toString(), headers) - } - - override fun searchMangaSelector() = "div.result_search > dl:has(dt)" - - override fun searchMangaFromElement(element: Element): SManga { - return mangaFromElement("a.manga_info", element) - } - - override fun searchMangaNextPageSelector() = "div.next-page > a.next" - - override fun mangaDetailsParse(document: Document): SManga { - val detailElement = document.select(".manga_detail_top").first() - val infoElement = detailElement.select(".detail_topText").first() - val licensedElement = document.select(".mt10.color_ff00.mb10").first() - - val manga = SManga.create() - manga.author = infoElement.select("a[href*=author/]").first()?.text() - manga.artist = infoElement.select("a[href*=artist/]").first()?.text() - manga.genre = infoElement.select("li:eq(3)").first()?.text()?.substringAfter("Genre(s):") - manga.description = infoElement.select("#show").first()?.text()?.substringBeforeLast("Show less") - manga.thumbnail_url = detailElement.select("img.img").first()?.attr("src") - - if (licensedElement?.text()?.contains("licensed") == true) { - manga.status = SManga.LICENSED - } else { - manga.status = infoElement.select("li:eq(6)").first()?.text().orEmpty().let { parseStatus(it) } - } - - return manga - } - - private fun parseStatus(status: String) = when { - status.contains("Ongoing") -> SManga.ONGOING - status.contains("Completed") -> SManga.COMPLETED - else -> SManga.UNKNOWN - } - - override fun chapterListSelector() = ".detail_list > ul:not([class]) > li" - - override fun chapterFromElement(element: Element): SChapter { - val parentEl = element.select("span.left").first() - - val urlElement = parentEl.select("a").first() - - var volume = parentEl.select("span.mr6")?.first()?.text()?.trim() ?: "" - if (volume.length > 0) { - volume = " - " + volume - } - - var title = parentEl?.textNodes()?.last()?.text()?.trim() ?: "" - if (title.length > 0) { - title = " - " + title - } - - val chapter = SChapter.create() - chapter.setUrlWithoutDomain(urlElement.attr("href")) - chapter.name = urlElement.text() + volume + title - chapter.date_upload = element.select("span.right").first()?.text()?.let { parseChapterDate(it) } ?: 0 - return chapter - } - - private fun parseChapterDate(date: String): Long { - return if ("Today" in date) { - Calendar.getInstance().apply { - set(Calendar.HOUR_OF_DAY, 0) - set(Calendar.MINUTE, 0) - set(Calendar.SECOND, 0) - set(Calendar.MILLISECOND, 0) - }.timeInMillis - } else if ("Yesterday" in date) { - Calendar.getInstance().apply { - add(Calendar.DATE, -1) - set(Calendar.HOUR_OF_DAY, 0) - set(Calendar.MINUTE, 0) - set(Calendar.SECOND, 0) - set(Calendar.MILLISECOND, 0) - }.timeInMillis - } else { - try { - SimpleDateFormat("MMM d, yyyy", Locale.ENGLISH).parse(date).time - } catch (e: ParseException) { - 0L - } - } - } - - override fun pageListParse(document: Document): List { - val licensedError = document.select(".mangaread_error > .mt10").first() - if (licensedError != null) { - throw Exception(licensedError.text()) - } - - val pages = mutableListOf() - document.select("select.wid60").first()?.getElementsByTag("option")?.forEach { - if (!it.attr("value").contains("featured.html")) { - pages.add(Page(pages.size, "http:" + it.attr("value"))) - } - } - pages.getOrNull(0)?.imageUrl = imageUrlParse(document) - return pages - } - - override fun imageUrlParse(document: Document) = document.getElementById("image").attr("src") - - private class Status : Filter.TriState("Completed") - private class Genre(name: String, val id: String = "genres[$name]") : Filter.TriState(name) - private class TextField(name: String, val key: String) : Filter.Text(name) - private class Type : Filter.Select("Type", arrayOf("Any", "Japanese Manga (read from right to left)", "Korean Manhwa (read from left to right)")) - private class OrderBy : Filter.Sort("Order by", - arrayOf("Series name", "Rating", "Views", "Total chapters", "Last chapter"), - Filter.Sort.Selection(2, false)) - - private class GenreList(genres: List) : Filter.Group("Genres", genres) - - override fun getFilterList() = FilterList( - TextField("Author", "author"), - TextField("Artist", "artist"), - Type(), - Status(), - OrderBy(), - GenreList(getGenreList()) - ) - - // [...document.querySelectorAll("select[id^='genres'")].map((el,i) => `Genre("${el.nextSibling.nextSibling.textContent.trim()}", "${el.getAttribute('name')}")`).join(',\n') - // http://www.mangahere.co/advsearch.htm - private fun getGenreList() = listOf( - Genre("Action"), - Genre("Adventure"), - Genre("Comedy"), - Genre("Doujinshi"), - Genre("Drama"), - Genre("Ecchi"), - Genre("Fantasy"), - Genre("Gender Bender"), - Genre("Harem"), - Genre("Historical"), - Genre("Horror"), - Genre("Josei"), - Genre("Martial Arts"), - Genre("Mature"), - Genre("Mecha"), - Genre("Mystery"), - Genre("One Shot"), - Genre("Psychological"), - Genre("Romance"), - Genre("School Life"), - Genre("Sci-fi"), - Genre("Seinen"), - Genre("Shoujo"), - Genre("Shoujo Ai"), - Genre("Shounen"), - Genre("Shounen Ai"), - Genre("Slice of Life"), - Genre("Sports"), - Genre("Supernatural"), - Genre("Tragedy"), - Genre("Yaoi"), - Genre("Yuri") - ) - -} \ No newline at end of file diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/online/english/Mangasee.kt b/app/src/main/java/eu/kanade/tachiyomi/source/online/english/Mangasee.kt deleted file mode 100644 index a79b356aca..0000000000 --- a/app/src/main/java/eu/kanade/tachiyomi/source/online/english/Mangasee.kt +++ /dev/null @@ -1,249 +0,0 @@ -package eu.kanade.tachiyomi.source.online.english - -import eu.kanade.tachiyomi.network.POST -import eu.kanade.tachiyomi.source.model.* -import eu.kanade.tachiyomi.source.online.ParsedHttpSource -import okhttp3.FormBody -import okhttp3.Headers -import okhttp3.HttpUrl -import okhttp3.Request -import org.jsoup.nodes.Document -import org.jsoup.nodes.Element -import java.text.SimpleDateFormat -import java.util.regex.Pattern - -class Mangasee : ParsedHttpSource() { - - override val id: Long = 9 - - override val name = "Mangasee" - - override val baseUrl = "http://mangaseeonline.us" - - override val lang = "en" - - override val supportsLatest = true - - private val recentUpdatesPattern = Pattern.compile("(.*?)\\s(\\d+\\.?\\d*)\\s?(Completed)?") - - private val indexPattern = Pattern.compile("-index-(.*?)-") - - private val catalogHeaders = Headers.Builder().apply { - add("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64)") - add("Host", "mangaseeonline.us") - }.build() - - override fun popularMangaSelector() = "div.requested > div.row" - - override fun popularMangaRequest(page: Int): Request { - val (body, requestUrl) = convertQueryToPost(page, "$baseUrl/search/request.php?sortBy=popularity&sortOrder=descending") - return POST(requestUrl, catalogHeaders, body.build()) - } - - override fun popularMangaFromElement(element: Element): SManga { - val manga = SManga.create() - element.select("a.resultLink").first().let { - manga.setUrlWithoutDomain(it.attr("href")) - manga.title = it.text() - } - return manga - } - - override fun popularMangaNextPageSelector() = "button.requestMore" - - override fun searchMangaSelector() = "div.requested > div.row" - - override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { - val url = HttpUrl.parse("$baseUrl/search/request.php")!!.newBuilder() - if (!query.isEmpty()) url.addQueryParameter("keyword", query) - val genres = mutableListOf() - val genresNo = mutableListOf() - for (filter in if (filters.isEmpty()) getFilterList() else filters) { - when (filter) { - is Sort -> { - if (filter.state?.index != 0) - url.addQueryParameter("sortBy", if (filter.state?.index == 1) "dateUpdated" else "popularity") - if (filter.state?.ascending != true) - url.addQueryParameter("sortOrder", "descending") - } - is SelectField -> if (filter.state != 0) url.addQueryParameter(filter.key, filter.values[filter.state]) - is TextField -> if (!filter.state.isEmpty()) url.addQueryParameter(filter.key, filter.state) - is GenreList -> filter.state.forEach { genre -> - when (genre.state) { - Filter.TriState.STATE_INCLUDE -> genres.add(genre.name) - Filter.TriState.STATE_EXCLUDE -> genresNo.add(genre.name) - } - } - } - } - if (genres.isNotEmpty()) url.addQueryParameter("genre", genres.joinToString(",")) - if (genresNo.isNotEmpty()) url.addQueryParameter("genreNo", genresNo.joinToString(",")) - - val (body, requestUrl) = convertQueryToPost(page, url.toString()) - return POST(requestUrl, catalogHeaders, body.build()) - } - - private fun convertQueryToPost(page: Int, url: String): Pair { - val url = HttpUrl.parse(url)!! - val body = FormBody.Builder().add("page", page.toString()) - for (i in 0..url.querySize() - 1) { - body.add(url.queryParameterName(i), url.queryParameterValue(i)) - } - val requestUrl = url.scheme() + "://" + url.host() + url.encodedPath() - return Pair(body, requestUrl) - } - - override fun searchMangaFromElement(element: Element): SManga { - val manga = SManga.create() - element.select("a.resultLink").first().let { - manga.setUrlWithoutDomain(it.attr("href")) - manga.title = it.text() - } - return manga - } - - override fun searchMangaNextPageSelector() = "button.requestMore" - - override fun mangaDetailsParse(document: Document): SManga { - val detailElement = document.select("div.well > div.row").first() - - val manga = SManga.create() - manga.author = detailElement.select("a[href^=/search/?author=]").first()?.text() - manga.genre = detailElement.select("span.details > div.row > div:has(b:contains(Genre(s))) > a").map { it.text() }.joinToString() - manga.description = detailElement.select("strong:contains(Description:) + div").first()?.text() - manga.status = detailElement.select("a[href^=/search/?status=]").first()?.text().orEmpty().let { parseStatus(it) } - manga.thumbnail_url = detailElement.select("div > img").first()?.absUrl("src") - return manga - } - - private fun parseStatus(status: String) = when { - status.contains("Ongoing (Scan)") -> SManga.ONGOING - status.contains("Complete (Scan)") -> SManga.COMPLETED - else -> SManga.UNKNOWN - } - - override fun chapterListSelector() = "div.chapter-list > a" - - override fun chapterFromElement(element: Element): SChapter { - val urlElement = element.select("a").first() - - val chapter = SChapter.create() - chapter.setUrlWithoutDomain(urlElement.attr("href")) - chapter.name = element.select("span.chapterLabel").first().text()?.let { it } ?: "" - chapter.date_upload = element.select("time").first()?.attr("datetime")?.let { parseChapterDate(it) } ?: 0 - return chapter - } - - private fun parseChapterDate(dateAsString: String): Long { - return SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").parse(dateAsString).time - } - - override fun pageListParse(document: Document): List { - val fullUrl = document.baseUri() - val url = fullUrl.substringBeforeLast('/') - - val pages = mutableListOf() - - val series = document.select("input.IndexName").first().attr("value") - val chapter = document.select("span.CurChapter").first().text() - var index = "" - - val m = indexPattern.matcher(fullUrl) - if (m.find()) { - val indexNumber = m.group(1) - index = "-index-$indexNumber" - } - - document.select("div.ContainerNav").first().select("select.PageSelect > option").forEach { - pages.add(Page(pages.size, "$url/$series-chapter-$chapter$index-page-${pages.size + 1}.html")) - } - pages.getOrNull(0)?.imageUrl = imageUrlParse(document) - return pages - } - - override fun imageUrlParse(document: Document): String = document.select("img.CurImage").attr("src") - - override fun latestUpdatesNextPageSelector() = "button.requestMore" - - override fun latestUpdatesSelector(): String = "a.latestSeries" - - override fun latestUpdatesRequest(page: Int): Request { - val url = "http://mangaseeonline.net/home/latest.request.php" - val (body, requestUrl) = convertQueryToPost(page, url) - return POST(requestUrl, catalogHeaders, body.build()) - } - - override fun latestUpdatesFromElement(element: Element): SManga { - val manga = SManga.create() - element.select("a.latestSeries").first().let { - val chapterUrl = it.attr("href") - val indexOfMangaUrl = chapterUrl.indexOf("-chapter-") - val indexOfLastPath = chapterUrl.lastIndexOf("/") - val mangaUrl = chapterUrl.substring(indexOfLastPath, indexOfMangaUrl) - val defaultText = it.select("p.clamp2").text() - val m = recentUpdatesPattern.matcher(defaultText) - val title = if (m.matches()) m.group(1) else defaultText - manga.setUrlWithoutDomain("/manga" + mangaUrl) - manga.title = title - } - return manga - } - - private class Sort : Filter.Sort("Sort", arrayOf("Alphabetically", "Date updated", "Popularity"), Filter.Sort.Selection(2, false)) - private class Genre(name: String) : Filter.TriState(name) - private class TextField(name: String, val key: String) : Filter.Text(name) - private class SelectField(name: String, val key: String, values: Array, state: Int = 0) : Filter.Select(name, values, state) - private class GenreList(genres: List) : Filter.Group("Genres", genres) - - override fun getFilterList() = FilterList( - TextField("Years", "year"), - TextField("Author", "author"), - SelectField("Scan Status", "status", arrayOf("Any", "Complete", "Discontinued", "Hiatus", "Incomplete", "Ongoing")), - SelectField("Publish Status", "pstatus", arrayOf("Any", "Cancelled", "Complete", "Discontinued", "Hiatus", "Incomplete", "Ongoing", "Unfinished")), - SelectField("Type", "type", arrayOf("Any", "Doujinshi", "Manga", "Manhua", "Manhwa", "OEL", "One-shot")), - Sort(), - GenreList(getGenreList()) - ) - - // [...document.querySelectorAll("label.triStateCheckBox input")].map(el => `Filter("${el.getAttribute('name')}", "${el.nextSibling.textContent.trim()}")`).join(',\n') - // http://mangasee.co/advanced-search/ - private fun getGenreList() = listOf( - Genre("Action"), - Genre("Adult"), - Genre("Adventure"), - Genre("Comedy"), - Genre("Doujinshi"), - Genre("Drama"), - Genre("Ecchi"), - Genre("Fantasy"), - Genre("Gender Bender"), - Genre("Harem"), - Genre("Hentai"), - Genre("Historical"), - Genre("Horror"), - Genre("Josei"), - Genre("Lolicon"), - Genre("Martial Arts"), - Genre("Mature"), - Genre("Mecha"), - Genre("Mystery"), - Genre("Psychological"), - Genre("Romance"), - Genre("School Life"), - Genre("Sci-fi"), - Genre("Seinen"), - Genre("Shotacon"), - Genre("Shoujo"), - Genre("Shoujo Ai"), - Genre("Shounen"), - Genre("Shounen Ai"), - Genre("Slice of Life"), - Genre("Smut"), - Genre("Sports"), - Genre("Supernatural"), - Genre("Tragedy"), - Genre("Yaoi"), - Genre("Yuri") - ) - -} diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/online/english/Readmangatoday.kt b/app/src/main/java/eu/kanade/tachiyomi/source/online/english/Readmangatoday.kt deleted file mode 100644 index 49c10456c1..0000000000 --- a/app/src/main/java/eu/kanade/tachiyomi/source/online/english/Readmangatoday.kt +++ /dev/null @@ -1,224 +0,0 @@ -package eu.kanade.tachiyomi.source.online.english - -import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.network.POST -import eu.kanade.tachiyomi.source.model.* -import eu.kanade.tachiyomi.source.online.ParsedHttpSource -import okhttp3.Headers -import okhttp3.OkHttpClient -import okhttp3.Request -import org.jsoup.nodes.Document -import org.jsoup.nodes.Element -import java.util.* - -class Readmangatoday : ParsedHttpSource() { - - override val id: Long = 8 - - override val name = "ReadMangaToday" - - override val baseUrl = "https://www.readmng.com" - - override val lang = "en" - - override val supportsLatest = true - - override val client: OkHttpClient get() = network.cloudflareClient - - /** - * Search only returns data with this set - */ - override fun headersBuilder() = Headers.Builder().apply { - add("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64)") - add("X-Requested-With", "XMLHttpRequest") - } - - override fun popularMangaRequest(page: Int): Request { - return GET("$baseUrl/hot-manga/$page", headers) - } - - override fun latestUpdatesRequest(page: Int): Request { - return GET("$baseUrl/latest-releases/$page", headers) - } - - override fun popularMangaSelector() = "div.hot-manga > div.style-list > div.box" - - override fun latestUpdatesSelector() = "div.hot-manga > div.style-grid > div.box" - - override fun popularMangaFromElement(element: Element): SManga { - val manga = SManga.create() - element.select("div.title > h2 > a").first().let { - manga.setUrlWithoutDomain(it.attr("href")) - manga.title = it.attr("title") - } - return manga - } - - override fun latestUpdatesFromElement(element: Element): SManga { - return popularMangaFromElement(element) - } - - override fun popularMangaNextPageSelector() = "div.hot-manga > ul.pagination > li > a:contains(»)" - - override fun latestUpdatesNextPageSelector() = "div.hot-manga > ul.pagination > li > a:contains(»)" - - override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { - val builder = okhttp3.FormBody.Builder() - builder.add("manga-name", query) - (if (filters.isEmpty()) getFilterList() else filters).forEach { filter -> - when (filter) { - is TextField -> builder.add(filter.key, filter.state) - is Type -> builder.add("type", arrayOf("all", "japanese", "korean", "chinese")[filter.state]) - is Status -> builder.add("status", arrayOf("both", "completed", "ongoing")[filter.state]) - is GenreList -> filter.state.forEach { genre -> - when (genre.state) { - Filter.TriState.STATE_INCLUDE -> builder.add("include[]", genre.id.toString()) - Filter.TriState.STATE_EXCLUDE -> builder.add("exclude[]", genre.id.toString()) - } - } - } - } - return POST("$baseUrl/service/advanced_search", headers, builder.build()) - } - - override fun searchMangaSelector() = "div.style-list > div.box" - - override fun searchMangaFromElement(element: Element): SManga { - val manga = SManga.create() - element.select("div.title > h2 > a").first().let { - manga.setUrlWithoutDomain(it.attr("href")) - manga.title = it.attr("title") - } - return manga - } - - override fun searchMangaNextPageSelector() = "div.next-page > a.next" - - override fun mangaDetailsParse(document: Document): SManga { - val detailElement = document.select("div.movie-meta").first() - val genreElement = detailElement.select("dl.dl-horizontal > dd:eq(5) a") - - val manga = SManga.create() - manga.author = document.select("ul.cast-list li.director > ul a").first()?.text() - manga.artist = document.select("ul.cast-list li:not(.director) > ul a").first()?.text() - manga.description = detailElement.select("li.movie-detail").first()?.text() - manga.status = detailElement.select("dl.dl-horizontal > dd:eq(3)").first()?.text().orEmpty().let { parseStatus(it) } - manga.thumbnail_url = detailElement.select("img.img-responsive").first()?.attr("src") - - var genres = mutableListOf() - genreElement?.forEach { genres.add(it.text()) } - manga.genre = genres.joinToString(", ") - - return manga - } - - private fun parseStatus(status: String) = when { - status.contains("Ongoing") -> SManga.ONGOING - status.contains("Completed") -> SManga.COMPLETED - else -> SManga.UNKNOWN - } - - override fun chapterListSelector() = "ul.chp_lst > li" - - override fun chapterFromElement(element: Element): SChapter { - val urlElement = element.select("a").first() - - val chapter = SChapter.create() - chapter.setUrlWithoutDomain(urlElement.attr("href")) - chapter.name = urlElement.select("span.val").text() - chapter.date_upload = element.select("span.dte").first()?.text()?.let { parseChapterDate(it) } ?: 0 - return chapter - } - - private fun parseChapterDate(date: String): Long { - val dateWords: List = date.split(" ") - - if (dateWords.size == 3) { - val timeAgo = Integer.parseInt(dateWords[0]) - val date: Calendar = Calendar.getInstance() - - if (dateWords[1].contains("Minute")) { - date.add(Calendar.MINUTE, -timeAgo) - } else if (dateWords[1].contains("Hour")) { - date.add(Calendar.HOUR_OF_DAY, -timeAgo) - } else if (dateWords[1].contains("Day")) { - date.add(Calendar.DAY_OF_YEAR, -timeAgo) - } else if (dateWords[1].contains("Week")) { - date.add(Calendar.WEEK_OF_YEAR, -timeAgo) - } else if (dateWords[1].contains("Month")) { - date.add(Calendar.MONTH, -timeAgo) - } else if (dateWords[1].contains("Year")) { - date.add(Calendar.YEAR, -timeAgo) - } - - return date.timeInMillis - } - - return 0L - } - - override fun pageListParse(document: Document): List { - val pages = mutableListOf() - document.select("ul.list-switcher-2 > li > select.jump-menu").first().getElementsByTag("option").forEach { - pages.add(Page(pages.size, it.attr("value"))) - } - pages.getOrNull(0)?.imageUrl = imageUrlParse(document) - return pages - } - - override fun imageUrlParse(document: Document) = document.select("#chapter_img").first().attr("src") - - private class Status : Filter.TriState("Completed") - private class Genre(name: String, val id: Int) : Filter.TriState(name) - private class TextField(name: String, val key: String) : Filter.Text(name) - private class Type : Filter.Select("Type", arrayOf("All", "Japanese Manga", "Korean Manhwa", "Chinese Manhua")) - private class GenreList(genres: List) : Filter.Group("Genres", genres) - - override fun getFilterList() = FilterList( - TextField("Author", "author-name"), - TextField("Artist", "artist-name"), - Type(), - Status(), - GenreList(getGenreList()) - ) - - // [...document.querySelectorAll("ul.manga-cat span")].map(el => `Genre("${el.nextSibling.textContent.trim()}", ${el.getAttribute('data-id')})`).join(',\n') - // http://www.readmanga.today/advanced-search - private fun getGenreList() = listOf( - Genre("Action", 2), - Genre("Adventure", 4), - Genre("Comedy", 5), - Genre("Doujinshi", 6), - Genre("Drama", 7), - Genre("Ecchi", 8), - Genre("Fantasy", 9), - Genre("Gender Bender", 10), - Genre("Harem", 11), - Genre("Historical", 12), - Genre("Horror", 13), - Genre("Josei", 14), - Genre("Lolicon", 15), - Genre("Martial Arts", 16), - Genre("Mature", 17), - Genre("Mecha", 18), - Genre("Mystery", 19), - Genre("One shot", 20), - Genre("Psychological", 21), - Genre("Romance", 22), - Genre("School Life", 23), - Genre("Sci-fi", 24), - Genre("Seinen", 25), - Genre("Shotacon", 26), - Genre("Shoujo", 27), - Genre("Shoujo Ai", 28), - Genre("Shounen", 29), - Genre("Shounen Ai", 30), - Genre("Slice of Life", 31), - Genre("Smut", 32), - Genre("Sports", 33), - Genre("Supernatural", 34), - Genre("Tragedy", 35), - Genre("Yaoi", 36), - Genre("Yuri", 37) - ) -} \ No newline at end of file diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/online/german/WieManga.kt b/app/src/main/java/eu/kanade/tachiyomi/source/online/german/WieManga.kt deleted file mode 100644 index b680ae9056..0000000000 --- a/app/src/main/java/eu/kanade/tachiyomi/source/online/german/WieManga.kt +++ /dev/null @@ -1,122 +0,0 @@ -package eu.kanade.tachiyomi.source.online.german - -import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.source.model.FilterList -import eu.kanade.tachiyomi.source.model.Page -import eu.kanade.tachiyomi.source.model.SChapter -import eu.kanade.tachiyomi.source.model.SManga -import eu.kanade.tachiyomi.source.online.ParsedHttpSource -import okhttp3.Request -import org.jsoup.nodes.Document -import org.jsoup.nodes.Element -import java.text.SimpleDateFormat - -class WieManga : ParsedHttpSource() { - - override val id: Long = 10 - - override val name = "Wie Manga!" - - override val baseUrl = "http://www.wiemanga.com" - - override val lang = "de" - - override val supportsLatest = true - - override fun popularMangaSelector() = ".booklist td > div" - - override fun latestUpdatesSelector() = ".booklist td > div" - - override fun popularMangaRequest(page: Int): Request { - return GET("$baseUrl/list/Hot-Book/", headers) - } - - override fun latestUpdatesRequest(page: Int): Request { - return GET("$baseUrl/list/New-Update/", headers) - } - - override fun popularMangaFromElement(element: Element): SManga { - val image = element.select("dt img") - val title = element.select("dd a:first-child") - - val manga = SManga.create() - manga.setUrlWithoutDomain(title.attr("href")) - manga.title = title.text() - manga.thumbnail_url = image.attr("src") - return manga - } - - override fun latestUpdatesFromElement(element: Element): SManga { - return popularMangaFromElement(element) - } - - override fun popularMangaNextPageSelector() = null - - override fun latestUpdatesNextPageSelector() = null - - override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { - return GET("$baseUrl/search/?wd=$query", headers) - } - - override fun searchMangaSelector() = ".searchresult td > div" - - override fun searchMangaFromElement(element: Element): SManga { - val image = element.select(".resultimg img") - val title = element.select(".resultbookname") - - val manga = SManga.create() - manga.setUrlWithoutDomain(title.attr("href")) - manga.title = title.text() - manga.thumbnail_url = image.attr("src") - return manga - } - - override fun searchMangaNextPageSelector() = ".pagetor a.l" - - override fun mangaDetailsParse(document: Document): SManga { - val imageElement = document.select(".bookmessgae tr > td:nth-child(1)").first() - val infoElement = document.select(".bookmessgae tr > td:nth-child(2)").first() - - val manga = SManga.create() - manga.author = infoElement.select("dd:nth-of-type(2) a").first()?.text() - manga.artist = infoElement.select("dd:nth-of-type(3) a").first()?.text() - manga.description = infoElement.select("dl > dt:last-child").first()?.text()?.replaceFirst("Beschreibung", "") - manga.thumbnail_url = imageElement.select("img").first()?.attr("src") - - if (manga.author == "RSS") - manga.author = null - - if (manga.artist == "RSS") - manga.artist = null - return manga - } - - override fun chapterListSelector() = ".chapterlist tr:not(:first-child)" - - override fun chapterFromElement(element: Element): SChapter { - val urlElement = element.select(".col1 a").first() - val dateElement = element.select(".col3 a").first() - - val chapter = SChapter.create() - chapter.setUrlWithoutDomain(urlElement.attr("href")) - chapter.name = urlElement.text() - chapter.date_upload = dateElement?.text()?.let { parseChapterDate(it) } ?: 0 - return chapter - } - - private fun parseChapterDate(date: String): Long { - return SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse(date).time - } - - override fun pageListParse(document: Document): List { - val pages = mutableListOf() - - document.select("select#page").first().select("option").forEach { - pages.add(Page(pages.size, it.attr("value"))) - } - return pages - } - - override fun imageUrlParse(document: Document) = document.select("img#comicpic").first().attr("src") - -} \ No newline at end of file diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/online/russian/Mangachan.kt b/app/src/main/java/eu/kanade/tachiyomi/source/online/russian/Mangachan.kt deleted file mode 100644 index 5f7f057f0a..0000000000 --- a/app/src/main/java/eu/kanade/tachiyomi/source/online/russian/Mangachan.kt +++ /dev/null @@ -1,290 +0,0 @@ -package eu.kanade.tachiyomi.source.online.russian - -import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.source.model.* -import eu.kanade.tachiyomi.source.online.ParsedHttpSource -import eu.kanade.tachiyomi.util.asJsoup -import okhttp3.Request -import okhttp3.Response -import org.jsoup.nodes.Document -import org.jsoup.nodes.Element -import java.text.SimpleDateFormat -import java.util.* - -class Mangachan : ParsedHttpSource() { - - override val id: Long = 7 - - override val name = "Mangachan" - - override val baseUrl = "http://mangachan.me" - - override val lang = "ru" - - override val supportsLatest = true - - override fun popularMangaRequest(page: Int): Request = - GET("$baseUrl/mostfavorites?offset=${20 * (page - 1)}", headers) - - override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { - var pageNum = 1 - when { - page < 1 -> pageNum = 1 - page >= 1 -> pageNum = page - } - val url = if (query.isNotEmpty()) { - "$baseUrl/?do=search&subaction=search&story=$query&search_start=$pageNum" - } else { - - var genres = "" - var order = "" - var statusParam = true - var status = "" - for (filter in if (filters.isEmpty()) getFilterList() else filters) { - when (filter) { - is GenreList -> { - filter.state.forEach { f -> - if (!f.isIgnored()) { - genres += (if (f.isExcluded()) "-" else "") + f.id + '+' - } - } - } - is OrderBy -> { - if (filter.state!!.ascending && filter.state!!.index == 0) { - statusParam = false - } - } - is Status -> status = arrayOf("", "all_done", "end", "ongoing", "new_ch")[filter.state] - } - } - - if (genres.isNotEmpty()) { - for (filter in filters) { - when (filter) { - is OrderBy -> { - order = if (filter.state!!.ascending) { - arrayOf("", "&n=favasc", "&n=abcdesc", "&n=chasc")[filter.state!!.index] - } else { - arrayOf("&n=dateasc", "&n=favdesc", "&n=abcasc", "&n=chdesc")[filter.state!!.index] - } - } - } - } - if (statusParam) { - "$baseUrl/tags/${genres.dropLast(1)}$order?offset=${20 * (pageNum - 1)}&status=$status" - } else { - "$baseUrl/tags/$status/${genres.dropLast(1)}/$order?offset=${20 * (pageNum - 1)}" - } - } else { - for (filter in filters) { - when (filter) { - is OrderBy -> { - order = if (filter.state!!.ascending) { - arrayOf("manga/new", "manga/new&n=favasc", "manga/new&n=abcdesc", "manga/new&n=chasc")[filter.state!!.index] - } else { - arrayOf("manga/new&n=dateasc", "mostfavorites", "catalog", "sortch")[filter.state!!.index] - } - } - } - } - if (statusParam) { - "$baseUrl/$order?offset=${20 * (pageNum - 1)}&status=$status" - } else { - "$baseUrl/$order/$status?offset=${20 * (pageNum - 1)}" - } - } - } - return GET(url, headers) - } - - override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/newestch?page=$page") - - override fun popularMangaSelector() = "div.content_row" - - override fun latestUpdatesSelector() = "ul.area_rightNews li" - - override fun searchMangaSelector() = popularMangaSelector() - - override fun popularMangaFromElement(element: Element): SManga { - val manga = SManga.create() - manga.thumbnail_url = element.select("div.manga_images img").first().attr("src") - element.select("h2 > a").first().let { - manga.setUrlWithoutDomain(it.attr("href")) - manga.title = it.text() - } - return manga - } - - override fun latestUpdatesFromElement(element: Element): SManga { - val manga = SManga.create() - element.select("a:nth-child(1)").first().let { - manga.setUrlWithoutDomain(it.attr("href")) - manga.title = it.text() - } - return manga - } - - override fun searchMangaFromElement(element: Element): SManga = popularMangaFromElement(element) - - override fun popularMangaNextPageSelector() = "a:contains(Вперед)" - - override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector() - - override fun searchMangaNextPageSelector() = "a:contains(Далее)" - - private fun searchGenresNextPageSelector() = popularMangaNextPageSelector() - - override fun searchMangaParse(response: Response): MangasPage { - val document = response.asJsoup() - var hasNextPage = false - - val mangas = document.select(searchMangaSelector()).map { element -> - searchMangaFromElement(element) - } - - val nextSearchPage = document.select(searchMangaNextPageSelector()) - if (nextSearchPage.isNotEmpty()) { - val query = document.select("input#searchinput").first().attr("value") - val pageNum = nextSearchPage.let { selector -> - val onClick = selector.attr("onclick") - onClick?.split("""\\d+""") - } - nextSearchPage.attr("href", "$baseUrl/?do=search&subaction=search&story=$query&search_start=$pageNum") - hasNextPage = true - } - - val nextGenresPage = document.select(searchGenresNextPageSelector()) - if (nextGenresPage.isNotEmpty()) { - hasNextPage = true - } - - return MangasPage(mangas, hasNextPage) - } - - override fun mangaDetailsParse(document: Document): SManga { - val infoElement = document.select("table.mangatitle").first() - val descElement = document.select("div#description").first() - val imgElement = document.select("img#cover").first() - - val manga = SManga.create() - manga.author = infoElement.select("tr:eq(2) > td:eq(1)").text() - manga.genre = infoElement.select("tr:eq(5) > td:eq(1)").text() - manga.status = parseStatus(infoElement.select("tr:eq(4) > td:eq(1)").text()) - manga.description = descElement.textNodes().first().text() - manga.thumbnail_url = imgElement.attr("src") - return manga - } - - private fun parseStatus(element: String): Int = when { - element.contains("перевод завершен") -> SManga.COMPLETED - element.contains("перевод продолжается") -> SManga.ONGOING - else -> SManga.UNKNOWN - } - - override fun chapterListSelector() = "table.table_cha tr:gt(1)" - - override fun chapterFromElement(element: Element): SChapter { - val urlElement = element.select("a").first() - - val chapter = SChapter.create() - chapter.setUrlWithoutDomain(urlElement.attr("href")) - chapter.name = urlElement.text() - chapter.date_upload = element.select("div.date").first()?.text()?.let { - SimpleDateFormat("yyyy-MM-dd", Locale.US).parse(it).time - } ?: 0 - return chapter - } - - override fun pageListParse(response: Response): List { - val html = response.body()!!.string() - val beginIndex = html.indexOf("fullimg\":[") + 10 - val endIndex = html.indexOf(",]", beginIndex) - val trimmedHtml = html.substring(beginIndex, endIndex).replace("\"", "") - val pageUrls = trimmedHtml.split(',') - - return pageUrls.mapIndexed { i, url -> Page(i, "", url) } - } - - override fun pageListParse(document: Document): List { - throw Exception("Not used") - } - - override fun imageUrlParse(document: Document) = "" - - private class GenreList(genres: List) : Filter.Group("Тэги", genres) - private class Genre(name: String, val id: String = name.replace(' ', '_')) : Filter.TriState(name) - private class Status : Filter.Select("Статус", arrayOf("Все", "Перевод завершен", "Выпуск завершен", "Онгоинг", "Новые главы")) - private class OrderBy : Filter.Sort("Сортировка", - arrayOf("Дата", "Популярность", "Имя", "Главы"), - Filter.Sort.Selection(1, false)) - - - override fun getFilterList() = FilterList( - Status(), - OrderBy(), - GenreList(getGenreList()) - ) - - - /* [...document.querySelectorAll("li.sidetag > a:nth-child(1)")] - * .map(el => `Genre("${el.getAttribute('href').substr(6)}")`).join(',\n') - * on http://mangachan.me/ - */ - private fun getGenreList() = listOf( - Genre("18_плюс"), - Genre("bdsm"), - Genre("арт"), - Genre("боевик"), - Genre("боевые_искусства"), - Genre("вампиры"), - Genre("веб"), - Genre("гарем"), - Genre("гендерная_интрига"), - Genre("героическое_фэнтези"), - Genre("детектив"), - Genre("дзёсэй"), - Genre("додзинси"), - Genre("драма"), - Genre("игра"), - Genre("инцест"), - Genre("искусство"), - Genre("история"), - Genre("киберпанк"), - Genre("кодомо"), - Genre("комедия"), - Genre("литРПГ"), - Genre("махо-сёдзё"), - Genre("меха"), - Genre("мистика"), - Genre("музыка"), - Genre("научная_фантастика"), - Genre("повседневность"), - Genre("постапокалиптика"), - Genre("приключения"), - Genre("психология"), - Genre("романтика"), - Genre("самурайский_боевик"), - Genre("сборник"), - Genre("сверхъестественное"), - Genre("сказка"), - Genre("спорт"), - Genre("супергерои"), - Genre("сэйнэн"), - Genre("сёдзё"), - Genre("сёдзё-ай"), - Genre("сёнэн"), - Genre("сёнэн-ай"), - Genre("тентакли"), - Genre("трагедия"), - Genre("триллер"), - Genre("ужасы"), - Genre("фантастика"), - Genre("фурри"), - Genre("фэнтези"), - Genre("школа"), - Genre("эротика"), - Genre("юри"), - Genre("яой"), - Genre("ёнкома") - ) -} diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/online/russian/Mintmanga.kt b/app/src/main/java/eu/kanade/tachiyomi/source/online/russian/Mintmanga.kt deleted file mode 100644 index 6a1b68e359..0000000000 --- a/app/src/main/java/eu/kanade/tachiyomi/source/online/russian/Mintmanga.kt +++ /dev/null @@ -1,251 +0,0 @@ -package eu.kanade.tachiyomi.source.online.russian - -import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.source.model.* -import eu.kanade.tachiyomi.source.online.ParsedHttpSource -import okhttp3.Headers -import okhttp3.HttpUrl -import okhttp3.Request -import okhttp3.Response -import org.jsoup.nodes.Document -import org.jsoup.nodes.Element -import java.text.SimpleDateFormat -import java.util.* -import java.util.regex.Pattern - -class Mintmanga : ParsedHttpSource() { - - override val id: Long = 6 - - override val name = "Mintmanga" - - override val baseUrl = "http://mintmanga.com" - - override val lang = "ru" - - override val supportsLatest = true - - override fun popularMangaRequest(page: Int): Request = - GET("$baseUrl/list?sortType=rate&offset=${70 * (page - 1)}&max=70", headers) - - override fun latestUpdatesRequest(page: Int): Request = - GET("$baseUrl/list?sortType=updated&offset=${70 * (page - 1)}&max=70", headers) - - override fun popularMangaSelector() = "div.tile" - - override fun latestUpdatesSelector() = "div.tile" - - override fun popularMangaFromElement(element: Element): SManga { - val manga = SManga.create() - manga.thumbnail_url = element.select("img.lazy").first()?.attr("data-original") - element.select("h3 > a").first().let { - manga.setUrlWithoutDomain(it.attr("href")) - manga.title = it.attr("title") - } - return manga - } - - override fun latestUpdatesFromElement(element: Element): SManga = - popularMangaFromElement(element) - - override fun popularMangaNextPageSelector() = "a.nextLink" - - override fun latestUpdatesNextPageSelector() = "a.nextLink" - - override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { - val url = HttpUrl.parse("$baseUrl/search/advanced")!!.newBuilder() - (if (filters.isEmpty()) getFilterList() else filters).forEach { filter -> - when (filter) { - is GenreList -> filter.state.forEach { genre -> - if (genre.state != Filter.TriState.STATE_IGNORE) { - url.addQueryParameter(genre.id, arrayOf("=", "=in", "=ex")[genre.state]) - } - } - is Category -> filter.state.forEach { category -> - if (category.state != Filter.TriState.STATE_IGNORE) { - url.addQueryParameter(category.id, arrayOf("=", "=in", "=ex")[category.state]) - } - } - } - } - if (!query.isEmpty()) { - url.addQueryParameter("q", query) - } - return GET(url.toString().replace("=%3D", "="), headers) - } - - override fun searchMangaSelector() = popularMangaSelector() - - override fun searchMangaFromElement(element: Element): SManga = popularMangaFromElement(element) - - // max 200 results - override fun searchMangaNextPageSelector(): Nothing? = null - - override fun mangaDetailsParse(document: Document): SManga { - val infoElement = document.select("div.leftContent").first() - - val manga = SManga.create() - manga.author = infoElement.select("span.elem_author").first()?.text() - manga.genre = infoElement.select("span.elem_genre").text().replace(" ,", ",") - manga.description = infoElement.select("div.manga-description").text() - manga.status = parseStatus(infoElement.html()) - manga.thumbnail_url = infoElement.select("img").attr("data-full") - return manga - } - - private fun parseStatus(element: String): Int = when { - element.contains("

Запрещена публикация произведения по копирайту

") -> SManga.LICENSED - element.contains("

Сингл") || element.contains("Перевод: завершен") -> SManga.COMPLETED - element.contains("Перевод: продолжается") -> SManga.ONGOING - else -> SManga.UNKNOWN - } - - override fun chapterListSelector() = "div.chapters-link tbody tr" - - override fun chapterFromElement(element: Element): SChapter { - val urlElement = element.select("a").first() - val urlText = urlElement.text() - - val chapter = SChapter.create() - chapter.setUrlWithoutDomain(urlElement.attr("href") + "?mtr=1") - if (urlText.endsWith(" новое")) { - chapter.name = urlText.dropLast(6) - } else { - chapter.name = urlText - } - chapter.date_upload = element.select("td.hidden-xxs").last()?.text()?.let { - SimpleDateFormat("dd/MM/yy", Locale.US).parse(it).time - } ?: 0 - return chapter - } - - override fun prepareNewChapter(chapter: SChapter, manga: SManga) { - val basic = Regex("""\s*([0-9]+)(\s-\s)([0-9]+)\s*""") - val extra = Regex("""\s*([0-9]+\sЭкстра)\s*""") - val single = Regex("""\s*Сингл\s*""") - when { - basic.containsMatchIn(chapter.name) -> { - basic.find(chapter.name)?.let { - val number = it.groups[3]?.value!! - chapter.chapter_number = number.toFloat() - } - } - extra.containsMatchIn(chapter.name) -> // Extra chapters doesn't contain chapter number - chapter.chapter_number = -2f - single.containsMatchIn(chapter.name) -> // Oneshoots, doujinshi and other mangas with one chapter - chapter.chapter_number = 1f - } - } - - override fun pageListParse(response: Response): List { - val html = response.body()!!.string() - val beginIndex = html.indexOf("rm_h.init( [") - val endIndex = html.indexOf("], 0, false);", beginIndex) - val trimmedHtml = html.substring(beginIndex, endIndex) - - val p = Pattern.compile("'.*?','.*?',\".*?\"") - val m = p.matcher(trimmedHtml) - - val pages = mutableListOf() - - var i = 0 - while (m.find()) { - val urlParts = m.group().replace("[\"\']+".toRegex(), "").split(',') - val url = if (urlParts[1].isEmpty() && urlParts[2].startsWith("/static/")) { - baseUrl + urlParts[2] - } else { - urlParts[1] + urlParts[0] + urlParts[2] - } - pages.add(Page(i++, "", url)) - } - return pages - } - - override fun pageListParse(document: Document): List { - throw Exception("Not used") - } - - override fun imageUrlParse(document: Document) = "" - - override fun imageRequest(page: Page): Request { - val imgHeader = Headers.Builder().apply { - add("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64)") - add("Referer", baseUrl) - }.build() - return GET(page.imageUrl!!, imgHeader) - } - - private class Genre(name: String, val id: String) : Filter.TriState(name) - private class GenreList(genres: List) : Filter.Group("Genres", genres) - private class Category(categories: List) : Filter.Group("Category", categories) - - /* [...document.querySelectorAll("tr.advanced_option:nth-child(1) > td:nth-child(3) span.js-link")] - * .map(el => `Genre("${el.textContent.trim()}", "${el.getAttribute('onclick') - * .substr(31,el.getAttribute('onclick').length-33)"})`).join(',\n') - * on http://mintmanga.com/search/advanced - */ - override fun getFilterList() = FilterList( - Category(getCategoryList()), - GenreList(getGenreList()) - ) - - private fun getCategoryList() = listOf( - Genre("В цвете", "el_4614"), - Genre("Веб", "el_1355"), - Genre("Выпуск приостановлен", "el_5232"), - Genre("Ёнкома", "el_2741"), - Genre("Комикс западный", "el_1903"), - Genre("Комикс русский", "el_2173"), - Genre("Манхва", "el_1873"), - Genre("Маньхуа", "el_1875"), - Genre("Не Яой", "el_1874"), - Genre("Ранобэ", "el_5688"), - Genre("Сборник", "el_1348") - ) - - private fun getGenreList() = listOf( - Genre("арт", "el_2220"), - Genre("бара", "el_1353"), - Genre("боевик", "el_1346"), - Genre("боевые искусства", "el_1334"), - Genre("вампиры", "el_1339"), - Genre("гарем", "el_1333"), - Genre("гендерная интрига", "el_1347"), - Genre("героическое фэнтези", "el_1337"), - Genre("детектив", "el_1343"), - Genre("дзёсэй", "el_1349"), - Genre("додзинси", "el_1332"), - Genre("драма", "el_1310"), - Genre("игра", "el_5229"), - Genre("история", "el_1311"), - Genre("киберпанк", "el_1351"), - Genre("комедия", "el_1328"), - Genre("меха", "el_1318"), - Genre("мистика", "el_1324"), - Genre("научная фантастика", "el_1325"), - Genre("омегаверс", "el_5676"), - Genre("повседневность", "el_1327"), - Genre("постапокалиптика", "el_1342"), - Genre("приключения", "el_1322"), - Genre("психология", "el_1335"), - Genre("романтика", "el_1313"), - Genre("самурайский боевик", "el_1316"), - Genre("сверхъестественное", "el_1350"), - Genre("сёдзё", "el_1314"), - Genre("сёдзё-ай", "el_1320"), - Genre("сёнэн", "el_1326"), - Genre("сёнэн-ай", "el_1330"), - Genre("спорт", "el_1321"), - Genre("сэйнэн", "el_1329"), - Genre("трагедия", "el_1344"), - Genre("триллер", "el_1341"), - Genre("ужасы", "el_1317"), - Genre("фантастика", "el_1331"), - Genre("фэнтези", "el_1323"), - Genre("школа", "el_1319"), - Genre("эротика", "el_1340"), - Genre("этти", "el_1354"), - Genre("юри", "el_1315"), - Genre("яой", "el_1336") - ) -} \ No newline at end of file diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/online/russian/Readmanga.kt b/app/src/main/java/eu/kanade/tachiyomi/source/online/russian/Readmanga.kt deleted file mode 100644 index 3929c543f4..0000000000 --- a/app/src/main/java/eu/kanade/tachiyomi/source/online/russian/Readmanga.kt +++ /dev/null @@ -1,247 +0,0 @@ -package eu.kanade.tachiyomi.source.online.russian - -import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.source.model.* -import eu.kanade.tachiyomi.source.online.ParsedHttpSource -import okhttp3.Headers -import okhttp3.HttpUrl -import okhttp3.Request -import okhttp3.Response -import org.jsoup.nodes.Document -import org.jsoup.nodes.Element -import java.text.SimpleDateFormat -import java.util.* -import java.util.regex.Pattern - -class Readmanga : ParsedHttpSource() { - - override val id: Long = 5 - - override val name = "Readmanga" - - override val baseUrl = "http://readmanga.me" - - override val lang = "ru" - - override val supportsLatest = true - - override fun popularMangaSelector() = "div.tile" - - override fun latestUpdatesSelector() = "div.tile" - - override fun popularMangaRequest(page: Int): Request = - GET("$baseUrl/list?sortType=rate&offset=${70 * (page - 1)}&max=70", headers) - - override fun latestUpdatesRequest(page: Int): Request = - GET("$baseUrl/list?sortType=updated&offset=${70 * (page - 1)}&max=70", headers) - - override fun popularMangaFromElement(element: Element): SManga { - val manga = SManga.create() - manga.thumbnail_url = element.select("img.lazy").first()?.attr("data-original") - element.select("h3 > a").first().let { - manga.setUrlWithoutDomain(it.attr("href")) - manga.title = it.attr("title") - } - return manga - } - - override fun latestUpdatesFromElement(element: Element): SManga = - popularMangaFromElement(element) - - override fun popularMangaNextPageSelector() = "a.nextLink" - - override fun latestUpdatesNextPageSelector() = "a.nextLink" - - override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { - val url = HttpUrl.parse("$baseUrl/search/advanced")!!.newBuilder() - (if (filters.isEmpty()) getFilterList() else filters).forEach { filter -> - when (filter) { - is GenreList -> filter.state.forEach { genre -> - if (genre.state != Filter.TriState.STATE_IGNORE) { - url.addQueryParameter(genre.id, arrayOf("=", "=in", "=ex")[genre.state]) - } - } - is Category -> filter.state.forEach { category -> - if (category.state != Filter.TriState.STATE_IGNORE) { - url.addQueryParameter(category.id, arrayOf("=", "=in", "=ex")[category.state]) - } - } - } - } - if (!query.isEmpty()) { - url.addQueryParameter("q", query) - } - return GET(url.toString().replace("=%3D", "="), headers) - } - - override fun searchMangaSelector() = popularMangaSelector() - - override fun searchMangaFromElement(element: Element): SManga = popularMangaFromElement(element) - - // max 200 results - override fun searchMangaNextPageSelector(): Nothing? = null - - override fun mangaDetailsParse(document: Document): SManga { - val infoElement = document.select("div.leftContent").first() - - val manga = SManga.create() - manga.author = infoElement.select("span.elem_author").first()?.text() - manga.genre = infoElement.select("span.elem_genre").text().replace(" ,", ",") - manga.description = infoElement.select("div.manga-description").text() - manga.status = parseStatus(infoElement.html()) - manga.thumbnail_url = infoElement.select("img").attr("data-full") - return manga - } - - private fun parseStatus(element: String): Int = when { - element.contains("

Запрещена публикация произведения по копирайту

") -> SManga.LICENSED - element.contains("

Сингл") || element.contains("Перевод: завершен") -> SManga.COMPLETED - element.contains("Перевод: продолжается") -> SManga.ONGOING - else -> SManga.UNKNOWN - } - - override fun chapterListSelector() = "div.chapters-link tbody tr" - - override fun chapterFromElement(element: Element): SChapter { - val urlElement = element.select("a").first() - val urlText = urlElement.text() - - val chapter = SChapter.create() - chapter.setUrlWithoutDomain(urlElement.attr("href") + "?mtr=1") - if (urlText.endsWith(" новое")) { - chapter.name = urlText.dropLast(6) - } else { - chapter.name = urlText - } - chapter.date_upload = element.select("td.hidden-xxs").last()?.text()?.let { - SimpleDateFormat("dd/MM/yy", Locale.US).parse(it).time - } ?: 0 - return chapter - } - - override fun prepareNewChapter(chapter: SChapter, manga: SManga) { - val basic = Regex("""\s*([0-9]+)(\s-\s)([0-9]+)\s*""") - val extra = Regex("""\s*([0-9]+\sЭкстра)\s*""") - val single = Regex("""\s*Сингл\s*""") - when { - basic.containsMatchIn(chapter.name) -> { - basic.find(chapter.name)?.let { - val number = it.groups[3]?.value!! - chapter.chapter_number = number.toFloat() - } - } - extra.containsMatchIn(chapter.name) -> // Extra chapters doesn't contain chapter number - chapter.chapter_number = -2f - single.containsMatchIn(chapter.name) -> // Oneshoots, doujinshi and other mangas with one chapter - chapter.chapter_number = 1f - } - } - - override fun pageListParse(response: Response): List { - val html = response.body()!!.string() - val beginIndex = html.indexOf("rm_h.init( [") - val endIndex = html.indexOf("], 0, false);", beginIndex) - val trimmedHtml = html.substring(beginIndex, endIndex) - - val p = Pattern.compile("'.*?','.*?',\".*?\"") - val m = p.matcher(trimmedHtml) - - val pages = mutableListOf() - - var i = 0 - while (m.find()) { - val urlParts = m.group().replace("[\"\']+".toRegex(), "").split(',') - val url = if (urlParts[1].isEmpty() && urlParts[2].startsWith("/static/")) { - baseUrl + urlParts[2] - } else { - urlParts[1] + urlParts[0] + urlParts[2] - } - pages.add(Page(i++, "", url)) - } - return pages - } - - override fun pageListParse(document: Document): List { - throw Exception("Not used") - } - - override fun imageUrlParse(document: Document) = "" - - override fun imageRequest(page: Page): Request { - val imgHeader = Headers.Builder().apply { - add("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64)") - add("Referer", baseUrl) - }.build() - return GET(page.imageUrl!!, imgHeader) - } - - private class Genre(name: String, val id: String) : Filter.TriState(name) - private class GenreList(genres: List) : Filter.Group("Genres", genres) - private class Category(categories: List) : Filter.Group("Category", categories) - - /* [...document.querySelectorAll("tr.advanced_option:nth-child(1) > td:nth-child(3) span.js-link")] - * .map(el => `Genre("${el.textContent.trim()}", $"{el.getAttribute('onclick') - * .substr(31,el.getAttribute('onclick').length-33)"})`).join(',\n') - * on http://readmanga.me/search/advanced - */ - override fun getFilterList() = FilterList( - Category(getCategoryList()), - GenreList(getGenreList()) - ) - - private fun getCategoryList() = listOf( - Genre("В цвете", "el_7290"), - Genre("Веб", "el_2160"), - Genre("Выпуск приостановлен", "el_8033"), - Genre("Ёнкома", "el_2161"), - Genre("Комикс западный", "el_3515"), - Genre("Манхва", "el_3001"), - Genre("Маньхуа", "el_3002"), - Genre("Ранобэ", "el_8575"), - Genre("Сборник", "el_2157") - ) - - private fun getGenreList() = listOf( - Genre("арт", "el_5685"), - Genre("боевик", "el_2155"), - Genre("боевые искусства", "el_2143"), - Genre("вампиры", "el_2148"), - Genre("гарем", "el_2142"), - Genre("гендерная интрига", "el_2156"), - Genre("героическое фэнтези", "el_2146"), - Genre("детектив", "el_2152"), - Genre("дзёсэй", "el_2158"), - Genre("додзинси", "el_2141"), - Genre("драма", "el_2118"), - Genre("игра", "el_2154"), - Genre("история", "el_2119"), - Genre("киберпанк", "el_8032"), - Genre("кодомо", "el_2137"), - Genre("комедия", "el_2136"), - Genre("махо-сёдзё", "el_2147"), - Genre("меха", "el_2126"), - Genre("мистика", "el_2132"), - Genre("научная фантастика", "el_2133"), - Genre("повседневность", "el_2135"), - Genre("постапокалиптика", "el_2151"), - Genre("приключения", "el_2130"), - Genre("психология", "el_2144"), - Genre("романтика", "el_2121"), - Genre("самурайский боевик", "el_2124"), - Genre("сверхъестественное", "el_2159"), - Genre("сёдзё", "el_2122"), - Genre("сёдзё-ай", "el_2128"), - Genre("сёнэн", "el_2134"), - Genre("сёнэн-ай", "el_2139"), - Genre("спорт", "el_2129"), - Genre("сэйнэн", "el_2138"), - Genre("трагедия", "el_2153"), - Genre("триллер", "el_2150"), - Genre("ужасы", "el_2125"), - Genre("фантастика", "el_2140"), - Genre("фэнтези", "el_2131"), - Genre("школа", "el_2127"), - Genre("этти", "el_2149"), - Genre("юри", "el_2123") - ) -} \ No newline at end of file diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchController.kt index 77e23a6ba3..a3f7f4ca28 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchController.kt @@ -18,8 +18,10 @@ import kotlinx.android.synthetic.main.catalogue_global_search_controller.* * This controller should only handle UI actions, IO actions should be done by [CatalogueSearchPresenter] * [CatalogueSearchCardAdapter.OnMangaClickListener] called when manga is clicked in global search */ -open class CatalogueSearchController(protected val initialQuery: String? = null) : - NucleusController(), +open class CatalogueSearchController( + protected val initialQuery: String? = null, + protected val extensionFilter: String? = null +) : NucleusController(), CatalogueSearchCardAdapter.OnMangaClickListener { /** @@ -60,7 +62,7 @@ open class CatalogueSearchController(protected val initialQuery: String? = null) * @return instance of [CatalogueSearchPresenter] */ override fun createPresenter(): CatalogueSearchPresenter { - return CatalogueSearchPresenter(initialQuery) + return CatalogueSearchPresenter(initialQuery, extensionFilter) } /** @@ -185,4 +187,4 @@ open class CatalogueSearchController(protected val initialQuery: String? = null) getHolder(source)?.setImage(manga) } -} \ No newline at end of file +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchPresenter.kt index cba9dc3b20..b0cc97a62a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchPresenter.kt @@ -5,6 +5,7 @@ import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.getOrDefault +import eu.kanade.tachiyomi.extension.ExtensionManager import eu.kanade.tachiyomi.source.CatalogueSource import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.SourceManager @@ -21,6 +22,7 @@ import rx.subjects.PublishSubject import timber.log.Timber import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import uy.kohesive.injekt.injectLazy /** * Presenter of [CatalogueSearchController] @@ -32,6 +34,7 @@ import uy.kohesive.injekt.api.get */ open class CatalogueSearchPresenter( val initialQuery: String? = "", + val initialExtensionFilter: String? = null, val sourceManager: SourceManager = Injekt.get(), val db: DatabaseHelper = Injekt.get(), val preferencesHelper: PreferencesHelper = Injekt.get() @@ -40,7 +43,7 @@ open class CatalogueSearchPresenter( /** * Enabled sources. */ - val sources by lazy { getEnabledSources() } + val sources by lazy { getSourcesToQuery() } /** * Query from the view. @@ -63,9 +66,16 @@ open class CatalogueSearchPresenter( */ private var fetchImageSubscription: Subscription? = null + private val extensionManager by injectLazy() + + private var extensionFilter: String? = null + override fun onCreate(savedState: Bundle?) { super.onCreate(savedState) + extensionFilter = savedState?.getString(CatalogueSearchPresenter::extensionFilter.name) ?: + initialExtensionFilter + // Perform a search with previous or initial state search(savedState?.getString(BrowseCataloguePresenter::query.name) ?: initialQuery.orEmpty()) } @@ -78,6 +88,7 @@ open class CatalogueSearchPresenter( override fun onSave(state: Bundle) { state.putString(BrowseCataloguePresenter::query.name, query) + state.putString(CatalogueSearchPresenter::extensionFilter.name, extensionFilter) super.onSave(state) } @@ -97,6 +108,26 @@ open class CatalogueSearchPresenter( .sortedBy { "(${it.lang}) ${it.name}" } } + private fun getSourcesToQuery(): List { + val filter = extensionFilter + val enabledSources = getEnabledSources() + if (filter.isNullOrEmpty()) { + return enabledSources + } + + val filterSources = extensionManager.installedExtensions + .filter { it.pkgName == filter } + .flatMap { it.sources } + .filter { it in enabledSources } + .filterIsInstance() + + if (filterSources.isEmpty()) { + return enabledSources + } + + return filterSources + } + /** * Creates a catalogue search item */ 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 63d07429b0..00acfa494a 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 @@ -164,12 +164,25 @@ class MainActivity : BaseActivity() { //If the intent match the "standard" Android search intent // or the Google-specific search intent (triggered by saying or typing "search *query* on *Tachiyomi*" in Google Search/Google Assistant) - setSelectedDrawerItem(R.id.nav_drawer_catalogues) //Get the search query provided in extras, and if not null, perform a global search with it. - intent.getStringExtra(SearchManager.QUERY)?.also { query -> + val query = intent.getStringExtra(SearchManager.QUERY) + if (query != null && !query.isEmpty()) { + if (router.backstackSize > 1) { + router.popToRoot() + } router.pushController(CatalogueSearchController(query).withFadeTransaction()) } } + INTENT_SEARCH -> { + val query = intent.getStringExtra(INTENT_SEARCH_QUERY) + val filter = intent.getStringExtra(INTENT_SEARCH_FILTER) + if (query != null && !query.isEmpty()) { + if (router.backstackSize > 1) { + router.popToRoot() + } + router.pushController(CatalogueSearchController(query, filter).withFadeTransaction()) + } + } else -> return false } return true @@ -254,6 +267,10 @@ class MainActivity : BaseActivity() { const val SHORTCUT_CATALOGUES = "eu.kanade.tachiyomi.SHOW_CATALOGUES" const val SHORTCUT_DOWNLOADS = "eu.kanade.tachiyomi.SHOW_DOWNLOADS" const val SHORTCUT_MANGA = "eu.kanade.tachiyomi.SHOW_MANGA" + + const val INTENT_SEARCH = "eu.kanade.tachiyomi.SEARCH" + const val INTENT_SEARCH_QUERY = "query" + const val INTENT_SEARCH_FILTER = "filter" } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaWebViewController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaWebViewController.kt index 15a85a1080..8d7d9687a0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaWebViewController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaWebViewController.kt @@ -9,6 +9,7 @@ import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.ui.base.controller.BaseController +import eu.kanade.tachiyomi.util.WebViewClientCompat import uy.kohesive.injekt.injectLazy class MangaWebViewController(bundle: Bundle? = null) : BaseController(bundle) { @@ -31,6 +32,12 @@ class MangaWebViewController(bundle: Bundle? = null) : BaseController(bundle) { val headers = source.headers.toMultimap().mapValues { it.value.getOrNull(0) ?: "" } val web = view as WebView + web.webViewClient = object : WebViewClientCompat() { + override fun shouldOverrideUrlCompat(view: WebView, url: String): Boolean { + view.loadUrl(url) + return true + } + } web.settings.javaScriptEnabled = true web.settings.userAgentString = source.headers["User-Agent"] web.loadUrl(url, headers) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsGeneralController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsGeneralController.kt index 8dfcc47489..bc1eb64683 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsGeneralController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsGeneralController.kt @@ -31,7 +31,7 @@ class SettingsGeneralController : SettingsController() { titleRes = R.string.pref_language entryValues = arrayOf("", "ar", "bg", "bn", "ca", "cs", "de", "el", "en-US", "en-GB", "es", "fr", "hi", "hu", "in", "it", "ja", "ko", "lv", "ms", "nb-rNO", "nl", "pl", "pt", - "pt-BR", "ro", "ru", "sr", "sv", "th", "tr", "uk", "vi", "zh-rCN") + "pt-BR", "ro", "ru", "sc", "sr", "sv", "th", "tl", "tr", "uk", "vi", "zh-rCN") entries = entryValues.map { value -> val locale = LocaleHelper.getLocaleFromString(value.toString()) locale?.getDisplayName(locale)?.capitalize() ?: diff --git a/app/src/main/res/raw/changelog_release.xml b/app/src/main/res/raw/changelog_release.xml index fc3ed7f3ab..e88828ae30 100644 --- a/app/src/main/res/raw/changelog_release.xml +++ b/app/src/main/res/raw/changelog_release.xml @@ -1,5 +1,21 @@ + + All the internal sources have been removed. They now need to be + installed as an extension. + Cloudflare is now resolved with a WebView in background which should put + an end to the recent updates to adapt to their changes. + Added an option to open manga details in a WebView. This + should also help when receiving a captcha confirmation page (usually 403 errors). + It can also be used to login with the website, as the app now shares cookies. + Added a deep link handler that extensions can use to perform + a search within the app. + Added an option to decode images in ARGB8888 format for + devices running Oreo or later. + Added Shikimori tracker. + Updated translations. + + Updated Cloudflare. Fixed crashes with some translations. @@ -68,106 +84,4 @@ Bugfixes and minor UI/UX improvements. - - Added a new feature to help migrating manga from sources. You can find it in the library's toolbar. - In the search results, a tap will prompt to replace (or copy) the selected manga, while a long tap will let you - browse the manga before doing the migration. - - - - - - [b]Notice to Batoto users.[/b] As you may already know, Batoto will cease to work in a few days. - We're working on a feature to help migrating the library to other sources and should be available shortly. - Please be patient. - Fixed http 503 errors due to Cloudflare changes. - Minor UI improvements. - - - - - Backups now properly restore tracking information. - Fixed library view and its overflow menu visible in other screens. - Fixed updater's notification in Android O. - Fixed a crash when rotating the screen in the chapters view. - Improved peformance of the app when using a custom downloads directory. - - - - Added a download cache for faster navigation. - Enabled Cloudflare for Batoto. - Fixed some issues with automatic backups. - Fixed a bootloop issue with devices running Cyanogenmod 12 or 13. - - - - Added a global search feature with a new catalogue screen. - Added an option to show downloaded chapters badges in the library. - Added an scrollbar in the chapter list. - Fixed some issues with bundled catalogues. - Changed the page indicator in the reader to support devices with rounded corners. - Crash fixes. - - - - Fixed a crash when retrying a page. - Fixed a crash when sharing an image. - Fixed disappearing toolbar buttons in the catalog after a search. - - - - Added a new completed manga filter for the library. - Added scanlator to chapters (if supported by source). - Added Discord server link. - Added new translations. - Extensions shouldn't crash the app anymore. - Crop borders is supported in webtoon reader and fixed in Android O. - Fixed a bug where storage permissions were always requested. - Minor UI and crash fixes. - - - - Bugfix release. - - - - Added sorting by total chapters. - Added an option to reverse volume keys navigation. - Added AMOLED theme. - Improved recent chapters view. - Improved UI with a single activity approach. - Fixed backup restore issues. - Fixed Kitsu http 400 errors. - Fixed Batoto catalogue. - - - - New backup system. Smaller file size but requires a network connection to restore. - Fixed descriptions showing a single line. - Added Nougat shortcuts and round icon. - Added an option to add a manga to a specific category. - Improved new chapters notification. - Support Kitsu new rating system. - Last read page is now retained in webtoon reader. - - - - - Added an option to auto download from selected categories. - Handle a few more directories for local manga. - Update Kissmanga parser. - Fixed downloader errors with some manga titles. - Fixed gallery not showing saved images. - - - - Support for local manga. Head to the [a href="https://github.com/inorichi/tachiyomi/wiki/Local-manga"]wiki page[/a] for instructions. - Added an option to detect and remove the white borders of the images. - Added advanced search for catalogues. - Russian, french, bulgarian and vietnamese translations. - Fixed a bug when changing chapters inside the reader with the buttons. - Fixed certain downloaded chapters not working with any decoder. - Fixed lost covers on some devices. - - diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index c42127a444..17c2980572 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -1,7 +1,6 @@ Име - Настройки Изтегляния @@ -13,7 +12,6 @@ Категории Избрани: %1$d Резервно копие - Настройки Филтрирай @@ -70,13 +68,11 @@ Запази Изчисти Върни - - Изтрива се … - Зареждане … - + Изтриване … + Зареждане… - + Основни настройки Четец Изтегляния @@ -84,8 +80,7 @@ Следене Разширени настройки За приложението - - + Манга на ред Портретно Пейзажно @@ -114,8 +109,7 @@ Начален екран Език По подразбиране - - + Цял екран Заключи ориентацията Преходи @@ -157,9 +151,7 @@ G B A - - - + Директория на изтеглянията Тегли само с Wi-Fi Изтрий, щом маркирам като прочетено @@ -172,11 +164,9 @@ Четвърта последно прочетена глава Пета последно прочетена глава Изтегляй нови глави - - + Услуги - - + Изчисти кеша на главите Използвани: %1$s Кеш изчистен. %1$d файла бяха изчистени @@ -190,8 +180,7 @@ Базата данни изчистена Обнови метаданните на библиотеката Обновява кориците, жанровете, описанието и статуса на мангите - - + Версия Време на създаване Провери за актуализации @@ -199,8 +188,6 @@ Изпращай данни за грешки Помага за оправянето на бъгове. Няма да се изпращат лични данни - - Влизане в %1$s Потребителско име @@ -210,21 +197,17 @@ Влизане успешно Получи се грешка при влизане Неизвестна грешка - Заглавие или автор… Обновяване на категорията Сигурни ли сте, че желаете да премахнете избраната манга? - Източникът изисква от вас да въведете име и парола Изберете източник Моля, изберете поне един валиден източник Няма повече резултати - Тази манга беше премахната от базата данни! - Инфо Описание @@ -245,7 +228,6 @@ Име на пряк път Форма на икона Пряк път не можа да бъде създаден! - Глави Неозаглавена @@ -268,7 +250,6 @@ Изтегли всички глави Изтегли непрочетени глави Сигурни ли сте, че искате да изтриете избраните глави? - Следене В прочит @@ -280,23 +261,18 @@ Заглавие Статус Глави - Категория със същото име вече съществува! Категориите бяха изтрити - Това ще премахне датата на прочитане на главата. Сигурни ли сте? Рестартирай всички глави за тази манга - Добавяне на мангата към библиотеката\? - Изображението запазено Запазване на изображението Опции - Персонализиран филтър Постави за корица @@ -312,16 +288,12 @@ Обнови последната прочетена глава в %1$d? Желаете ли да използвате това изображение за корица? зрител за тази серия - Резервно копие - %1$s - Глава %2$s - Получи се грешка при изтеглянето на главите. Може да опитате пак в секцията на изтеглянията - Напредък на обновяването: %1$d/%2$d Нови глави са намерени @@ -331,12 +303,10 @@ Няма връзка към зарядно устройство Синхронизиране отменено Няма налична връзка - Изберете корица Изберете резервно копие Изберете икона за пряк път - Достъпна е нова актуализация! Изтегли @@ -344,24 +314,20 @@ Няма налични актуализации Изтеглянето започна Търсене на актуализации - Изтегли актуализацията Изтегля се Изтегляне завършено Грешка при изтегляне Налична актуализация - Фон на мангата Корица - Нямате изтегляния Нямате скорошни глави Няматe наскоро прочетена манга Библиотеката Ви е празна, можете да я напълните от менюто Каталози. - Изтегли Грешка @@ -370,34 +336,28 @@ Страницата не е заредена Няма налична Wi-Fi връзка Няма налична интернет връзка - -Категории + Категории Манга Следене История - Общ брой глави Затвори Премести Експортирай - отворен дънер + Отвори лога Създай Възстанови - Приложението не е достъпно Обновления - Ежеседмично Ежемесечно AMOLED тема Категория по подразбиране Питай всеки път - - Изрязвай границите + Изрязвай границите Обърнати бутони за звука Категории за включване при теглене - - Създай резервно копие + Създай резервно копие Може да се използва за възстановяване на текущата библиотека Възстанови резервно копие Възстанови библиотеката от резервно копие @@ -419,48 +379,37 @@ Какво искате да запазите? Възстановяване на копие Създаване на резервно копие - - Обнови метаданните на проследяването + Обнови метаданните на проследяването Обновява статус, оценка и последно прочетена глава от услугите за проследяване - - Също изтрий изтеглените глави - + Също изтрий изтеглените глави Локална манга \"По подразбиране\" не може да се избира с други категории Мангата беше добавена към библиотеката Ви - Последна глава Да се изтрият ли изтеглените глави? - На пауза За %1$d заглавия Изтеглянето спряно - -За възстановяването се изтеглят данни от източника, за които може да бъде отчетен разход на данни. + За възстановяването се изтеглят данни от източника, за които може да бъде отчетен разход на данни. \nСъщо проверете дали сте влезли коректно в източниците, които го изискват, преди възстановяването. Глобално търсене Отвори Вход - Други Глобално търсене… Не бяха открити резултати! Последни Търсене - Прекият път беше добавен към началния екран. Общи Библиотека Изтегляния -Изтегляне на значки + Изтегляне на значки Локална Нямате категории. Натиснете плюса, за да създадете такава и да организирате библиотеката си. - Смяна на източник Добавки Информация - - Всички Подробности Обнови @@ -483,8 +432,7 @@ Версия: %1$s Език: %1$s Няма предпочитания за това разширение - - Скорост на анимацията + Скорост на анимацията Без анимация Нормална Бързо @@ -494,7 +442,6 @@ Премахната от библиотеката Обновена %1$s копирано към клипборда - Изтегли определен брой брой Изтегли определен брой @@ -504,17 +451,14 @@ Мигрирай Копирай Мигриране… - пейджър Източникът не е инсталиран: %1$s - Препрочитане Статус Започната на Тип Автор Мангата няма връзка с акаунта, молим отново да натиснете заглавието и да изберете мангата - Завършени: Текущи: Следва: @@ -523,6 +467,7 @@ Няма предишна глава Зареждане на страниците… "Неуспешно зареждане на страници: %1$s " - Тъмно син - \ No newline at end of file + Показване на прозорец след натискане + Издърпайте за допълнително опции + \ No newline at end of file diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 70545bc028..ae39ddeed0 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -1,9 +1,9 @@ -Kategorie + + Kategorie Manga Kapitoly Historie - Nastavení Moje knihovna Nedávno čteno @@ -14,8 +14,6 @@ Zdroj migrace Rozšíření Informace o rozšíření - - Nastavení Filtr Staženo @@ -56,9 +54,7 @@ Obnovit Otevřít Přihlásit se - Načítání… - Aplikace není k dispozici Stahování Každou hodinu @@ -102,8 +98,7 @@ Verze: %1$s Jazyk: %1$s Neexistují žádné předvolby k úpravám pro toto rozšíření - - Celá obrazovka + Celá obrazovka Přechody stránek Zobrazit číslo stránky Tlačítka hlasitosti @@ -122,9 +117,7 @@ G B A - - - Složka pro stahování + Složka pro stahování Stahovat pouze na Wi-Fi Odstranit po označení jako přečtené Odstranit po čtení @@ -137,14 +130,12 @@ Přihlášení úspěšné Chyba při přihlašování Neznámá chyba - Opravdu chcete odstranit vybrané mangy\? Žádné další výsledky Manga byla přidána do vaší knihovny Globální vyhledávání… Žádné výsledky! Manga byla odstraněna z databáze! - Info Popis Vycházející @@ -161,7 +152,6 @@ Nepodařilo se vytvořit zástupce! Smazat stažené kapitoly\? Zdroj není nainstalována: %1$s - Kapitoly Bez názvu Kapitola %1$s @@ -179,7 +169,6 @@ Stáhnout vše Stáhnout nepřečtené Opravdu chcete smazat vybrané kapitoly\? - Čtení Kompletní Plánováno číst @@ -189,13 +178,10 @@ Typ Autor Restartovat všechny kapitoly mangy - Přidat mangu do knihovny\? - Obrázek uložen Ukládání obrázku Možnosti - Vlastní filtr Stránka zkopírována do %1$s Stahování… @@ -216,30 +202,24 @@ Migrovat Kopírovat Migrovaní… - Došlo k chybě při stahování kapitol. Zkuste to znovu v sekci stahování - Postup aktualizace: %1$d/%2$d Nalezeny nové kapitoly Synchronizace zrušena Bez připojení k AC zdroji Synchronizace zrušena Připojení není k dispozici - Vybrat záložní soubor Vybrat ikonu zástupce - Dostupná nová aktualizace! Stáhnout Ignorovat Žádné nové aktualizace Hledání aktualizací - Stáhnout aktualizaci Stahování dokončeno Chyba při stahování Dostupná aktualizace - Žádné nedávné kapitoly Žádné nedávno čtené mangy Chyba @@ -249,7 +229,6 @@ WiFi připojení není dostupné Síťové připojení není dostupné Stahování pozastaveno - Knihovna Stahovací fronta Název @@ -454,4 +433,5 @@ Stahovač Běžný Stahovač + Vytáhnout pro více možností \ 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 bd4d71247b..6ef35a667d 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -348,7 +348,7 @@ Restaurar utiliza la fuente para obtener datos, es posible que se apliquen los costos de la operadora. También asegúrese de haber iniciado sesión en las fuentes que lo requieren antes de la restauración. Archivo guardado en %1$s - Qué deseas respaldar? + ¿Qué deseas respaldar\? Restaurando copia de seguridad Creando copia de seguridad Reiniciar opciones de diálogo @@ -462,4 +462,6 @@ También asegúrese de haber iniciado sesión en las fuentes que lo requieren an Velocidad de animación de doble toque Paginado Azul oscuro + Diálogo de toque largo + Tire hacia arriba para más opciones \ 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 4db5f7f2c7..4ef1f1c34e 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -1,7 +1,6 @@ Nom - Paramètres File de téléchargement @@ -13,7 +12,6 @@ Catégories Sélectionné : %1$d Sauvegarde - Paramètres Filtre @@ -69,13 +67,11 @@ Partager Sauvegarder Réinitialiser - Suppression… Chargement… - - + Général Lecteur Téléchargements @@ -83,8 +79,7 @@ Suivi Avancé À propos - - + Manga dans la bibliothèque par colonne Portrait Paysage @@ -110,7 +105,6 @@ Thème principal Thème sombre Page d\'accueil - Plein écran Verrouiller l\'orientation @@ -153,9 +147,7 @@ V B O - - - + Répertoire de téléchargements Télécharger uniquement via Wi-Fi Supprimer après avoir lu @@ -165,11 +157,9 @@ Du troisième au dernier chapitre Du quatrième au dernier chapitre Télécharger les nouveaux chapitres - - + Services - - + Utilisé : %1$s Cache effacé. %1$d fichiers ont été supprimés Une erreur est survenue lors de l\'effacement du cache @@ -181,8 +171,7 @@ Entrées supprimées Actualiser les méta-données de la bibliothèque Mettre à jour les couvertures, genres, description et statut des mangas - - + Version Date de compilation Vérifier les mises à jour @@ -190,8 +179,6 @@ Envoyer des rapports de crash Cela aide à corriger les bugs. Aucune donnée sensible ne sera envoyée - - Connexion vers %1$s Nom d\'utilisateur @@ -200,19 +187,15 @@ Connexion Erreur de connexion Erreur inconnue - Titre ou auteur… Êtes-vous sûr de vouloir supprimer les mangas sélectionnés ? - Cette source demande de vous identifier Sélectionner une source Veuillez au moins activer une source valide - Ce manga a été supprimé de la base de données ! - Info Description @@ -232,7 +215,6 @@ Titre de raccourci Forme de l\'icône Échec de la création du raccourci ! - Chapitres Chapitre %1$s @@ -251,7 +233,6 @@ Télécharger les 5 prochains chapitres Tout télécharger Télécharger non-lu - Suivi En cours @@ -263,22 +244,17 @@ Titre Statut Chapitres - Une catégorie avec ce nom existe déjà ! - Cela enlèvera la date de lecture de ce chapitre. Êtes-vous sûr ? Réinitialiser tous les chapitres de ce manga - Ajouter ce manga à la bibliothèque ? - Image sauvegardée Sauvegarde de l\'image Options - Filtre personnalisé Ajouter comme couverture @@ -294,16 +270,12 @@ Mettre à jour le dernier chapitre lu dans les services activés à %1$d ? Voulez-vous mettre cette image comme couverture ? Lecteur pour cette série - Sauvegarder - %1$s - Ch.%2$s - Une erreur est survenue lors du téléchargement des chapitres. Vous pouvez recommencer à nouveau dans la section téléchargements - Progression mise à jour: %1$d/%2$d Des nouveaux chapitres ont été trouvés @@ -312,12 +284,10 @@ Non branché Synchronisation annulée Connexion non disponible - Sélectionner l\'image de couverture Sélectionner fichier de sauvegarde Sélectionner une icône de raccourci - Nouvelle mise à jour disponible ! Télécharger @@ -325,24 +295,20 @@ Aucune mise à jour disponible Téléchargement commencé Vérification des mises à jour - Télécharger la mise à jour Téléchargement en cours Téléchargement terminé Erreur lors du téléchargement Mise à jour disponible - Image de fond du manga Couverture du manga - Aucun téléchargement Aucun chapitre récent Aucun manga lu récemment Votre bibliothèque est vide, vous pouvez ajouter des séries à votre bibliothèque depuis le Catalogue. - Téléchargement Erreur @@ -369,10 +335,9 @@ Pas d\'autres résultats Catégories supprimées Annuler -Catégories + Catégories Manga Historique - Fermer Déplacer Exporter @@ -383,15 +348,12 @@ Thème AMOLED Catégorie par défaut Téléchargement en pause - -Manga locaux + Manga locaux Ce manga a été ajouté à votre bibliothèque - Dernier chapitre En pause Ouvre le fichier journal Restaurer - Dossier de sauvegarde Service Source introuvable @@ -401,15 +363,12 @@ Que voulez-vous sauvegarder ? Le défaut ne peut pas être selectionné avec des autres catégories Supprimer les chapitres téléchargés ? - - Pour %1$d chapitres + Pour %1$s chapitres Suivi Nombre de chapitres Actualisations - Catégories à inclure dans le téléchargement - - Créer une sauvegarde + Créer une sauvegarde Peut être utilisé pour restaurer la bibliothèque actuelle Restaurer une sauvegarde Restaurer la bibliothèque à partir d\'un fichier de sauvegarde @@ -424,36 +383,29 @@ %2$s erreurs trouvées. Restauration de sauvegarde en cours Création de sauvegarde en cours - - Actualiser les métadonnées de suivi + Actualiser les métadonnées de suivi Actualise le statut, appréciation et dernier chapitre lu des services de suivi - - Efface aussi les chapitres téléchargés - + Efface aussi les chapitres téléchargés Toujours demander - - Inverse les boutons de volume + Inverser les boutons de volume Rogner les bordures La restauration utilise la source pour obtenir des données, des frais de l\'opérateur peuvent s\'appliquer. Assurez-vous que vous êtes connecté à des sources qui le demande avant de commencer la restauration. Recherche globale Ouvrir Connexion - Autre Recherche globale… Aucun résultat ! Récents Explorer - Un raccourci a été ajouté à la page d\'accueil. Bibliothèque Badges des téléchargements Local Général Téléchargeur -Vous n\'avez aucune catégorie. Appuyez sur le bouton plus pour en créeer un pour organiser votre bibliothèque. - + Vous n\'avez aucune catégorie. Appuyez sur le bouton plus pour en créeer un pour organiser votre bibliothèque. Extensions Détails Mettre à jour @@ -471,11 +423,10 @@ Assurez-vous que vous êtes connecté à des sources qui le demande avant de com \nUne extension malveillante peut lire les certificats de connections sauvegardés sur Tachiyomi ou exécuter du code arbitraire. \n \nEn faisant confiance à ce certificat vous acceptez ces risques. - Version: %1$s - Langue: %1$s + Version : %1$s + Langue : %1$s Aucune préférence n\'est disponible pour cette extension - - Vitesse d\'animation du double-clic + Vitesse d\'animation du double-clic Sans animation Normale Rapide @@ -486,7 +437,6 @@ Assurez-vous que vous êtes connecté à des sources qui le demande avant de com Mis à jour %1$s a été copié dans le presse papier Sources non installées: %1$s - Télécharger une quantité personnalisée Quantité Téléchargement personalisé @@ -495,31 +445,29 @@ Assurez-vous que vous êtes connecté à des sources qui le demande avant de com Type Auteur L\'url du manga n\'a pas été entrée, veuillez cliquer sur le titre et selectionner le manga - Sélectionner les données à inclure Sélectionner Migration de source Information complémentaire - - - Tous + Toutes Fiable Non fiable Pager Relecture - A jour: - En cours: - Suivant: - Précédent: - Chapitre suivant introuvable - Chapitre précédent introuvable + A jour : + En cours : + Suivant : + Précédent : + C\'était le dernier chapitre + Il n\'y a pas de chapitre précédent Chargement des pages… - Échec du chargement des pages: %1$s - + Échec du chargement des pages : %1$s Appuyer pour sélectionner la source à déplacer Déplacement Copier En cours de déplacement… - Bleu foncé - + Menu contextuel (appui prolongé) + Plus d\'options en défilant + + diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 583b2c3aba..34da05d9e3 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -1,11 +1,11 @@ -नाम + + नाम श्रेणियाँ मांगा अध्याय पदचिह्न इतिहास - सेटिंग्स डाउनलोड कतार मेरा पुस्तकालय @@ -16,8 +16,6 @@ श्रेणियाँ श्रेणियाँ %1$d बैकअप - - सेटिंग फिल्टर डाउनलोड किया हुआ @@ -84,13 +82,10 @@ पुनःस्थापन करे खुला हुआ लोगिन - हटाया जा रहा है… लोड हो रहा है… - एप्पलीकेशन उपलब्ध नहीं है अद्यतन - सामान्य पाठमाला डाउनलोड @@ -98,8 +93,7 @@ पदचिह्न विकसित संबंध में - - मंगा पुस्तक संग्रह पंक्ति के हिसाब से + मंगा पुस्तक संग्रह पंक्ति के हिसाब से चित्र लैंडस्केप डिफ़ॉल्ट @@ -131,8 +125,7 @@ डिफ़ॉल्ट प्रणाली डिफ़ॉल्ट श्रेणी हमेशा पूछे - - पूर्ण स्क्रीन + पूर्ण स्क्रीन उन्मुखीकरण बंद करे पृष्ठ संक्रमण पृष्ठ संख्या दिखाएं @@ -175,9 +168,7 @@ G B A - - - डाउनलोड निर्देशिका + डाउनलोड निर्देशिका वाई - फाई पर ही डाउनलोड करे पढ़ा जाने चिह्नित होने पर हटाएं पढ़ने के बाद हटा दें @@ -190,9 +181,7 @@ अंतिम अध्याय के लिए पांचवां नए अध्याय डाउनलोड करें श्रेणियाँ डाउनलोड में शामिल करने के लिए - - सेवाएं - + सेवाएं बैकअप बैकअप बनाये वर्तमान पुस्तकालय को पुनर्स्थापित करने के लिए उपयोग किया जा सकता है @@ -218,8 +207,7 @@ आप बैकअप के लिए क्या चाहते हैं? बैकअप को पुनर्स्थापित करना बैकअप बनाना - - अध्याय कैश साफ़ करें + अध्याय कैश साफ़ करें उपयोग किया गया: %1$s "कैश साफ़ किया गया %1$d फ़ाइलों को हटा दिया गया है" कैश साफ़ करने के दौरान एक त्रुटि हुई @@ -234,15 +222,12 @@ अपडेट कवर, शैलियों, विवरण और मंगा स्थिति की जानकारी ट्रैकिंग मेटाडेटा रीफ़्रेश करें अपडेट की स्थिति, स्कोर और अंतिम अध्याय ट्रैकिंग सेवाओं से पढ़ें - - संस्करण + संस्करण निर्माण समय अद्यतन के लिए जाँच स्वचालित रूप से एप्लिकेशन अपडेट की जांच करें क्रैश रिपोर्ट भेजें किसी भी बग को ठीक करने में मदद करता है कोई संवेदनशील डेटा नहीं भेजा जाएगा - - %1$s के लिए लॉगिन उपयोगकर्ता नाम पासवर्ड @@ -251,13 +236,11 @@ सफलतापूर्ण लॉग इन लॉग इन त्रुटि अज्ञात त्रुटि - शीर्षक या लेखक … श्रेणी अपडेट कर रहा है लोकल क्या आप वाकई चयनित मंगा को हटाना चाहते हैं? डाउनलोड किए गए अध्याय भी हटाएं - इस स्रोत के लिए आपको प्रवेश करना होगा किसी स्रोत का चयन करें कृपया कम से कम एक वैध स्रोत सक्षम करें @@ -270,9 +253,7 @@ कोई परिणाम नहीं मिला! नवीनतम ब्राउज - यह मंगा डेटाबेस से हटा दिया गया था! - जानकारी विवरण चल रही है @@ -295,7 +276,6 @@ चिह्न आकार शॉर्टकट बनाने में विफल! डाउनलोड किए गए अध्याय हटाएं? - अध्याय कोई शीर्षक नहीं अध्याय %1$s @@ -318,7 +298,6 @@ सभी डाउनलोड करे अपठित डाउनलोड करें क्या आप वाकई चयनित अध्यायों को हटाना चाहते हैं? - पदचिह्न पठन समाप्त @@ -328,19 +307,14 @@ स्कोर शीर्षक स्थिति - इस नाम के साथ एक श्रेणी पहले से मौजूद है! श्रेणियाँ हटाई गयी - यह इस अध्याय की पठन तिथि को निकाल देगा क्या आप निश्चित है? इस मंगा के लिए सभी अध्यायों को रीसेट करें - लाइब्रेरी में मंगा जोड़ें? - चित्र सहेजा गया चित्र सहेजा जा रहा है विकल्प - इच्छा अनुसार फिल्टर कवर के रूप में सेट करें कवर अपडेट किया गया @@ -355,11 +329,8 @@ पिछले अध्याय को सक्षम सेवाओं में %1$d तक पढ़ा है? क्या आप इस छवि को कवर के रूप में सेट करना चाहते हैं? इस श्रृंखला के लिए दर्शक - %1$s - Ch.%2$s - अध्याय डाउनलोड करते समय एक त्रुटि हुई आप डाउनलोड अनुभाग में पुनः प्रयास कर सकते हैं - अपडेट प्रगति: %1$d/%2$d नए अध्याय पाए गए %1$d शीर्षक के लिए @@ -369,33 +340,27 @@ एसी बिजली से जुड़ा नहीं है समन्वयन रद्द कनेक्शन उपलब्ध नहीं है - कवर छवि का चयन करें बैकअप फ़ाइल का चयन करें शॉर्टकट आइकन चुनें - नया अद्यतन उपलब्ध है! डाउनलोड नज़रअंदाज़ करे कोई नया अद्यतन उपलब्ध नहीं है डाउनलोड शुरू अद्यतन ढूंढ रहे हैं - अद्यतन डाउनलोड करे डाउनलोड जारी है डाउनलोड सम्पन्न हुआ डाउनलोड त्रुटि अद्यतन उपलब्ध है - मैंगा की पृष्ठभूमि छवि मंगा का आवरण - कोई डाउनलोड नहीं है हाल के कोई अध्याय नहीं है हाल ही में मंगा पढ़ा नहीं है आपकी लाइब्रेरी खाली है, आप कैटलॉग से अपनी लाइब्रेरी में श्रृंखला जोड़ सकते हैं। आपके पास कोई श्रेणियां नहीं हैं अपने पुस्तकालय के आयोजन के लिए एक बनाने के लिए प्लस बटन को दबाएं। - डाउनलोडर त्रुटि अध्याय डाउनलोड करते समय एक अनपेक्षित त्रुटि हुई @@ -404,15 +369,12 @@ कोई वाई-फ़ाई कनेक्शन उपलब्ध नहीं है कोई नेटवर्क कनेक्शन उपलब्ध नहीं है डाउनलोड रोक दिया गया - सामान्य पुस्तकालय डाउनलोडर -स्रोत प्रवास + स्रोत प्रवास विस्तार विस्तार की जानकारी - - सभी विवरण अद्यतन @@ -433,8 +395,7 @@ संस्करण: %1$s भाषा: %1$s इस एक्सटेंशन के लिए कोई प्राथमिकताएं संपादित नहीं हैं - - डबल टैप एनीमेशन गति + डबल टैप एनीमेशन गति कोई एनीमेशन नहीं साधारण उपवास @@ -444,7 +405,6 @@ लाइब्रेरी से निकाला गया अपडेट किया गया %1$s क्लिपबोर्ड पर नकल - कस्टम राशि डाउनलोड करें रकम कस्टम डाउनलोड करें @@ -454,17 +414,14 @@ प्रवास नकल प्रवास हो रहा है… - पृष्ठक स्रोत स्थापित नहीं है : %1$s - फिर से पढाना स्थिति शुरू कर दिया है प्रकार लेखक मंगा यूआरएल सेट नहीं है कृपया शीर्षक पर क्लिक करें और फिर मंगा का चयन करें - समाप्त: प्रचलित: अगला: @@ -473,6 +430,7 @@ कोई पिछला अध्याय नहीं है पेज लोड हो रहे है … पृष्ठों को लोड करने में विफल है: %1$s - गहरा नीला - + अधिक विकल्पों के लिए खींचो + संवाद के लिए लंबी प्रेस + diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index d1961d3377..e59864f8fb 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -1,5 +1,6 @@ - -이름 + + + 이름 카테고리 만화 챕터 @@ -8,8 +9,7 @@ 카테고리 %1$d 선택됨 백업 - - 세팅 + 설정 필터 다운로드됨 북마크됨 @@ -22,14 +22,14 @@ 검색 전체 선택 읽음으로 표시 - 아직 안 읽음으로 표시 + 읽지 않음으로 표시 항목 바로 전까지 읽음으로 표시 다운로드 북마크 북마크 제거 삭제 업데이트 - 라이브러리 업데이트 + 서재 업데이트 편집 추가 카테고리 추가 @@ -51,8 +51,7 @@ 세팅 디스플레이 기록 - - 다운로드 큐 + 다운로드 대기열 내 서재 최근 읽음 카탈로그 @@ -68,7 +67,7 @@ 다음 챕터 재시도 이동 - 홈스크린에 추가 + 홈 화면에 추가 필터 설정 공유 저장 @@ -78,20 +77,362 @@ 로그 열기 만들기 복구하기 - 삭제 중… 로딩 중.… - 어플리케이션 이용 불가 업데이트 - 일반 리더 다운로드 소스 - 트래킹 + 동기화 고급 설정 정보 - - 가로로 서재 정렬 - + 가로로 서재 정렬 + 소스 이동 + 확장기능 + 확장기능 정보 + 전역 검색 + 일시중지 + 세로 + 가로 + 기본값 + 서재 업데이트 주기 + 수동 + 1시간 + 2시간 + 3시간 + 6시간 + 12시간 + 1일 + 2일 + 1주 + 1달 + 전역 업데이트에 포함할 카테고리 + 전부 + 서재 업데이트 제한 + 조건들이 충족 될 때에만 업데이트 + 충전중 + 어플리케이션 테마 + 메인 테마 + 어두운 테마 + AMOLED 테마 + 다크 블루 + 시작 화면 + 언어 + 시스템 기본값 + 기본 카테고리 + 전부 + 업데이트 + 설치 + 대기 중 + 다운로드 중 + 설치 중 + 설치됨 + 신뢰 + 신뢰되지않음 + 삭제 + 설정 + 이용 가능 + 신뢰할 수 없는 확장기능 + 이 확장기능은 신뢰할 수 없는 인증서로 서명되있으며 활성화 되지 않았습니다. +\n +\n악의적인 확장기능은 Tachiyomi 내부에 저장된 로그인 정보들을 읽거나 임의를 코드를 실행할 수 있습니다. +\n +\n이 인증서를 신뢰함으로써 이런 위험들을 감수합니다. + 버전: %1$s + 언어: %1$s + 이 확장기능에 대한 설정이 없습니다 + 전체화면 + 회전 잠금 + 더블 탭 애니메이션 속도 + 페이지 번호 표시 + 모서리 자르기 + 사용자 정의 밝기 사용 + 사용자 정의 컬러 필터 사용 + 화면 켜짐 유지 + 볼륨 키 + 볼륨 키 뒤바꾸기 + 기본 뷰어 + 기본값 + 왼쪽에서 오른쪽으로 + 오른쪽에서 왼쪽으로 + 수직으로 + 웹툰 + 이미지 디코더 + 늘리기 + 가로 맞추기 + 세로 맞추기 + 원본 크기 + 줌 시작 위치 + 자동 + 왼쪽t + 오른쪽 + 중앙 + 애니메이션 없음 + 보통 + 빠름 + 회전 + 자유 + 잠금 + 세로로 고정 + 가로로 고정 + Wi-Fi만 사용해서 다운로드 + 읽음 표시 후에 자동으로 삭제 + 읽은 후에 자동으로 삭제 + 비활성화 됨 + 마지막으로 읽은 챕터 + 새로운 챕터 다운로드 + 서비스 + 백업 + 백업 생성 + 백업 복원 + 백업 파일에서 서재 복원 + 백업 폴더 + 서비스 + 백업 주기 + 최대 자동 백업 + 백업 복원중... +\n %1$s 서재에 추가됨 + 소스를 찾을 수 없음 + 백업 복원중 +\n%1$s 소스를 찾을 수 없음 + 백업 생성됨 + 복원 완료 + 백업 복원중 + 백업 생성중 + 챕터 캐시 삭제 + %1$s 사용중 + 캐시 삭제됨. %1$d개의 파일이 삭제됨 + 캐시 삭제중 오류가 발생하였습니다 + 쿠키 삭제 + 쿠키 삭제됨 + 데이터베이스 삭제 + 서재에 추가되지 않은 만화와 챕터들을 삭제합니다 + 확실합니까\? 서재에 없는 만화의 읽은 챕터와 진행사항이 삭제됩니다 + 서재 메타데이터 갱신 + 표지와 장르, 설명, 만화 상태 정보들을 업데이트합니다 + 동기화 메타데이터 갱신 + 상태 및 평점, 마지막으로 읽은 챕터를 동기화 서비스에서 업데이트합니다 + 버전 + 빌드 시간 + 업데이트 확인 + 어플리케이션 업데이트를 자동으로 확인 + 충돌 보고서 전송 + 버그들을 수정하는데 도움이 됩니다. 민감한 정보는 전송되지 않습니다 + %1$s 으로 로그인 + 유저네임 + 비밀번호 + 비밀번호 표시 + 로그인 + 로그인 성공 + 로그인 오류 + 알 수 없는 오류 + 카테고리 업데이트중 + 선택된 만화들을 정말로 제거하시겠습니까\? + 다운로드된 챕터들도 지우기 + 검색 필터 + 이 소스는 로그인을 필요로 합니다 + 소스 선택 + 최소한 1개의 유효한 소스를 선택해주세요 + 더이상 결과 없음 + 전역 검색… + 결과가 없습니다! + 최신 + 정보 + 설명 + 연재중 + 알 수 없음 + 서재에서 제거 + 제목 + 서제에 추가됨 + 서재에서 제거됨 + 저자 + 그림 + 챕터 + 마지막 챕터 + 업데이트 + 상태 + 장르 + 바로가지 제목 + 바로가기가 홈 화면에 추가되었습니다. + 바로가기 생성 실패! + 다운로드된 챕터를 삭제합니까\? + 소스 미설치: %1$s + 챕터 + 챕터 %1$s + 다운로드됨 + 다운로드 중 + 다운로드중 (%1$d/%2$d) + 오류 + 일시중지됨 + 챕터 번호 표시 + 정렬 모드 + 소스 기준 + 챕터 번호 기준 + 다운로드 + 다음 챕터 다운로드 + 다음 5 챕터 다운로드 + 다음 10 챕터 다운로드 + 전부 다운로드 + 읽지 않은 챕터 다운로드 + 선택된 챕터를 정말로 삭제하겠습니까\? + 동기화 + 평점 + 제목 + 상태 + 상태 + 저자 + 카테고리 삭제됨 + 이 챕터의 읽은 날짜를 삭제합니다. 확실합니까\? + 이 만화의 챕터들을 전부 리셋 + 서재에 만화를 추가합니까\? + 사진 저장됨 + 사진 저장중 + 설정 + 사용자 정의 필터 + 표지로 설정 + 표지 업데이트됨 + 다운로드 중… + %1$d%% 다운로드됨 + 페이지: %1$d + 챕터 %1$s + 다음 챕터가 없습니다 + 이전 챕터가 없습니다 + 이미지를 디코드 할 수 없습니다 + 이 이미지를 표지로 설정하시겠습니까\? + 이 시리즈에 대한 뷰어 + 완료: + 현재: + 다음: + 이전: + 다움 챕터가 없습니다 + 이전 챕터가 없습니다 + 페이지 로딩중… + 페이지 로딩 실패: %1$s + %1$s - %2$s화 + 선택 + 업데이트 진행중: %1$d/%2$d + 새로운 챕터 발견 + %1$d개의 타이틀 + 표지 업데이트 실패 + 동기화 취소됨 + 외부 전원에 연결되지 않음 + 동기화 취소됨 + 연결되지 않음 + 표지 이미지 선택 + 백업 파일 선택 + 바로가기 아이콘 선택 + 새로운 업데이트 이용가능! + 다운로드 + 무시 + 새로운 업데이트 없음 + 다운로드 시작됨 + "업데이트를 찾는중 " + 업데이트 다운로드 + 다운로드 진행중 + 다운로드 완료됨 + 다운로드 오류 + 업데이트 이용 가능 + 만화 표지 + 다운로드 없음 + 최신 챕터 없음 + 최근 읽은 만화 없음 + 다운로더 + 오류 + 챕터 다운로드중에 예기치 않은 오류가 발생하였습니다 + 다운로드 일시중지됨 + 서재 + 다운로더 + 다운로드 배지 + 열기 + 로그인 + Wi-Fi + 연재 중인 만화만 업데이트 + 읽은 뒤 챕터 동기화 + 항상 물어보기 + 세부정보 + 현재 서재를 나중에 복구하는 데 사용 가능 + 네비게이션 + 페이지 전환 + 탭핑 + 배경 색상 + 흰색 + 검은색 + 페이저 + 스케일 종류 + 화면 맞춤 + 자동 맞춤 + R + G + B + A + 다운로드 폴더 + 사용자 정의 폴더 + 두번째 챕터에서 끝까지 + 세번째 챕터에서 끝까지 + 네번째 챕터에서 끝까지 + 다섯번째 챕터에서 끝까지 + 다운로드에 포함할 카테고리 + 로그를 열 수 없습니다 + 복원에 %1$s 소요됨. +\n%2$s 오류 발견됨. + 복원시 소스에서 데이터를 가져오며, 통신 비용이 청구 될 수 있습니다. +\n또한 복원 전에 필요한 소스에 제대로 로그인이 되어있는지 확인하십시오. + %1$s에 파일 저장됨 + 어떤 항목들을 백업하겠습니까\? + 대화상자 선택 초기화 + 항목 삭제됨 + 제목 혹은 작가… + 로컬 + 로컬 만화 + 기타 + 기본 카테고리는 다른 카테고리와 함께 선택될 수 없습니다 + 만화가 서재에 추가되었습니다 + 찾아보기 + 이 만화는 데이터베이스에서 제거되었습니다! + 판권작 + 소스 + 원형 아이콘 + 둥근 아이콘 + 사각형 아이콘 + 별 아이콘 + 아이콘 모양 + 클립보드에 %1$s 복사됨 + 제목 없음 + 대기중 + 챕터를 가져오는 중에 오류 발생 + 제목 표시 + 사용자 정의 지정 다운로드 + 사용자 정의 다운로드 + 읽는중 + 완료함 + 포기함 + 일시중지중 + 계획중 + 다시 읽는 중 + 시작 일자 + 종류 + 만화 URL이 설정 되지 않았습니다. 제목을 클릭하고 만화를 다시 선택해주세요 + 같은 이름을 가진 카테고리가 이미 존재합니다! + 페이지가 %1$s로 복사됨 + 활성화 된 서비스에 있는 마지막으로 읽은 챕터를 %1$d에 업데이트합니까\? + 끌어 올려 더 많은 설정 표시 + 탭하여 이동할 소스 선택 + 선택하여 데이터 포함 + 이동 + 복사 + 이동중… + 챕터 다운로드 도중 오류가 발생했습니다. 다운로드 섹션에서 다시시도 할 수 있습니다 + 이 행동을 하기 전 서재에 만화를 추가해주세요 + 만화의 배경 이미지 + 서재가 비어있습니다. 카탈로그에서 만화 시리즈를 서재에 추가 할 수 있습니다. + 카탈로그가 없습니다. 서재 구성을 위해 + 버튼을 눌러 생성하세요. + 페이지가 폴더에서 누락됨 + 페이지가 로드되지 않았습니다 + Wifi 연결 사용 불가능 + 네트워크 연결 사용 불가능 + 일반 + 길게 눌러 대화상자 표시 + 갯수 + diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 4f8692b356..7515ee495d 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -238,8 +238,8 @@ %1$d%% gedownload Pagina: %1$d Hoofdstuk %1$s - Volgende hoofdstuk niet gevonden - Vorige hoofdstuk niet gevonden + Volgend hoofdstuk niet gevonden + Vorig hoofdstuk niet gevonden Wil je deze afbeelding als omslagfoto gebruiken? Lezer voor deze serie %1$s - Hfdst.%2$s @@ -335,8 +335,7 @@ Laten vallen In de wacht Dit verwijdert de datum waarop het hoofdstuk is gelezen. Ben je zeker? - Afbeelding kon niet worden geladen. -Probeer de afbeeldingdecoder te veranderen met een van de onderstaande opties + Afbeelding kon niet worden gedecodeerd. Er is een fout opgetreden bij het downloaden van hoofdstukken. Je kan het opnieuw proberen in de downloadwachtrij Updaten van omslag mislukt Synchronisatie geannuleerd @@ -375,7 +374,65 @@ Zorg ook dat je ingelogd bent voor bronnen die dit vereisen alvorens je het teru Algemeen Bronmigratie Extensies - Informatie extensie + Informatie over extensie hoeveelheid Donkerblauw + Alles + Details + Bijwerken + Installeer + Aan het afwachten + Aan het downloaden + Aan het installeren + Geïnstalleerd + Vertouw + Niet vertrouwd + Verwijderen + Voorkeuren + Beschikbaar + Niet vertrouwde extensie + Deze extensie is door een niet vertrouwde certificaat ondertekend en is niet geactiveerd. +\n +\nEen kwaadaardige extensie zou alle login gegevens kunnen uitlezen in Tachiyomi of arbitraire code uitvoeren. +\n +\nBij het vertrouwen van dit certificaat accepteer je deze risico\'s + Versie: %1$s + Taal: %1$s + Er zijn geen aan te passen voorkeuren voor deze extensie + Dubbel tik animatiesnelheid + Lange tik dialoog + Paginas + Geen animatie + Normaal + Snel + Zoek filters + Titel + Toegevoegd aan bibliotheek + Verwijderd uit bibliotheek + Bijgewerkt + %1$s gekopieerd naar het klembord + Bron niet geïnstalleerd: %1$s + Download aangepaste hoeveelheid + Download aangepaste hoeveelheid + Herlezen + Status + Gestart + Soort + Auteur + Manga url is niet ingesteld, klik alstublieft op de titel en selecteer de manga opnieuw + Afgerond: + Huidige: + Volgende: + Vorige: + Er is geen volgend hoofdstuk + Er is geen vorig hoofdstuk + Pagina\'s aan het laden… + Fout bij het laden van pagina\'s : %1$s + Trek omhoog voor meer opties + Tik om een bron te selecteren om naar toe te migreren + Selecteer data om mee te tellen + Selecteer + Migreer + Kopiëren + Aan het migreren… \ No newline at end of file diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 66f5a6c45c..d58e375558 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -1,11 +1,11 @@ - -Nome + + + Nome Categorias Mangá Capítulos Monitoramento Histórico - Configurações Fila de download Minha biblioteca @@ -16,7 +16,6 @@ Categorias Selecionado: %1$d Backup - Configurações Filtrar Disponível offline @@ -79,13 +78,10 @@ Abrir registro de eventos Criar Restaurar - Excluindo… Carregando… - Aplicativo indisponível Atualizações - Geral Leitor Downloads @@ -93,8 +89,7 @@ Monitoramento Avançado Sobre - - Mangás por linha na biblioteca + Mangás por linha na biblioteca Retrato Paisagem Padrão @@ -126,8 +121,7 @@ Padrão do sistema Categoria padrão Sempre perguntar - - Tela cheia + Tela cheia Bloquear orientação Transição de página Mostrar número da página @@ -170,9 +164,7 @@ G B A - - - Pasta de downloads + Pasta de downloads Fazer download apenas via Wi-Fi Excluir ao marcar como lido Excluir depois de ler @@ -185,9 +177,7 @@ Quinto capítulo antes do último Fazer download de novos capítulos Categorias para fazer download - - Serviços - + Serviços Backup Fazer backup Pode ser usado para restaurar a biblioteca atual @@ -213,8 +203,7 @@ Além disso, verifique se as fontes que requerem uma conta foram configuradas co Do que você deseja fazer backup? Restaurando backup Fazendo backup - - Limpar o cache de capítulos + Limpar o cache de capítulos Total usado: %1$s Cache limpo. %1$d arquivos foram excluídos Ocorreu um erro ao limpar o cache @@ -229,15 +218,12 @@ Além disso, verifique se as fontes que requerem uma conta foram configuradas co Atualiza informações como as capas, gêneros, descrições e situação dos mangás Atualizar metadados do monitoramento Atualiza informações como situação, avaliações e últimos capítulos lidos dos serviços de monitoramento - - Versão + Versão Data de compilação Procurar por atualizações Procurar por atualizações automaticamente Enviar relatórios de erro Ajuda a corrigir eventuais erros. Não serão enviados dados sensíveis - - Fazer login em %1$s Nome de usuário Senha @@ -246,21 +232,17 @@ Além disso, verifique se as fontes que requerem uma conta foram configuradas co Login bem sucedido Erro ao fazer login Erro desconhecido - Título ou autor… Atualizando categoria Tem certeza de que deseja remover os mangás selecionados? Também excluir os capítulos disponíveis offline - Esta fonte requer uma conta Selecione uma fonte Por favor, ative pelo menos uma fonte válida Não há mais resultados Mangá local O mangá foi adicionado à sua biblioteca - Este mangá foi excluído do seu banco de dados! - Informações Descrição Em andamento @@ -282,7 +264,6 @@ Além disso, verifique se as fontes que requerem uma conta foram configuradas co Formato do ícone Erro ao criar o atalho! Excluir os capítulos disponíveis offline? - Capítulos Sem título Capítulo %1$s @@ -305,7 +286,6 @@ Além disso, verifique se as fontes que requerem uma conta foram configuradas co Fazer download de tudo Fazer download dos não lidos Tem certeza de que deseja excluir os capítulos selecionados? - Monitoramento Lendo Concluído @@ -315,19 +295,14 @@ Além disso, verifique se as fontes que requerem uma conta foram configuradas co Avaliação Título Situação - Já existe uma categoria com este nome! Categorias excluídas - Esta ação removerá a data de leitura deste capítulo. Tem certeza? Restaurar todos os capítulos deste mangá - Adicionar mangá a biblioteca? - Imagem salva Salvando imagem Opções - Filtro personalizado Usar como capa Capa atualizada @@ -342,11 +317,8 @@ Além disso, verifique se as fontes que requerem uma conta foram configuradas co Atualizar o último capítulo lido para %1$d nos serviços ativos? Deseja usar esta imagem como capa? Leitura para esta série - %1$s - Cap.%2$s - Ocorreu um erro ao fazer download dos capítulos. Você pode tentar novamente na seção de downloads - Progresso da atualização: %1$d/%2$d Novos capítulos encontrados Para %1$d títulos @@ -356,32 +328,26 @@ Além disso, verifique se as fontes que requerem uma conta foram configuradas co O dispositivo não está sendo carregado Sincronização cancelada Conexão indisponível - Selecionar imagem de capa Selecionar arquivo de backup Selecionar ícone do atalho - Nova atualização disponível! Fazer download Ignorar Sem atualizações disponíveis Download iniciado Procurando por atualizações - Fazer download da atualização Download em progresso Download concluído Erro ao fazer download Atualização disponível - Imagem de fundo do mangá Capa do mangá - Nenhum download Sem capítulos recentes Sem mangás lidos recentemente A sua biblioteca está vazia. Você pode adicionar séries à biblioteca pelo menu Catálogos. - Gerenciador de downloads Erro Ocorreu um erro inesperado ao fazer download do capítulo @@ -390,31 +356,25 @@ Além disso, verifique se as fontes que requerem uma conta foram configuradas co Nenhuma conexão Wi-Fi disponível Conexão à rede indisponível Download pausado - -O padrão não pode ser selecionado com outras categorias + O padrão não pode ser selecionado com outras categorias Pesquisa global Abrir Entrar - Outras Pesquisa global… Nenhum resultado encontrado! Mais recente Navegar - O atalho foi adicionado à sua tela inicial. Comum Biblioteca Fila de download -Ícones de download + Ícones de download Local Você ainda não tem nenhuma categoria. Pressione o botão (+) para criar uma e organizar a sua biblioteca. - Migrar fonte Extensões Informações da extensão - - Todas Detalhes Atualizar @@ -437,8 +397,7 @@ Além disso, verifique se as fontes que requerem uma conta foram configuradas co Versão: %1$s Idioma: %1$s Não há preferências a serem editadas para esta extensão - - Velocidade da animação de toque duplo + Velocidade da animação de toque duplo Sem animação Normal Rápida @@ -448,7 +407,6 @@ Além disso, verifique se as fontes que requerem uma conta foram configuradas co Removido da biblioteca Última atualização %1$s copiado para área de transferência - Fazer download de uma quantidade personalizada quantidade Fazer download personalizado @@ -458,9 +416,7 @@ Além disso, verifique se as fontes que requerem uma conta foram configuradas co Migrar Copiar Migrando… - Fonte não instalada: %1$s - Relendo Leitor Situação @@ -468,7 +424,6 @@ Além disso, verifique se as fontes que requerem uma conta foram configuradas co Tipo Autor URL do mangá não definida, por favor clique no título e selecione novamente - Concluído: Atual: Próximo: @@ -477,6 +432,7 @@ Além disso, verifique se as fontes que requerem uma conta foram configuradas co Não há capítulo anterior Carregando páginas… Falha ao carregar páginas: %1$s - Azul escuro - + Deslize para cima para mais opções + Diálogo de toque longo + \ 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 ca40ef2d10..59e8fe626a 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -381,4 +381,6 @@ Confiar Não confiar Transferir personalizado - + Diálogo de toque longo + Atualizar capas, géneros, descrição e informação sobre o estado de lançamento do mangá + \ 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 6caedb69e1..74a381fcef 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -349,7 +349,7 @@ Отслеживание Ежемесячно Еженедельно -По количеству глав + По количеству глав Открыть лог Приложение не отвечает Инвертировать клавиши громкости @@ -357,19 +357,17 @@ Значок загруженных Открыть Логин - Локальная Другие Глобальный поиск… Результат не найден! Последняя Смотреть - Ярлык был добавлен на главный экран. Обычный Библиотека Загрузчик -У вас нет категорий. Нажмите кнопку + для начала организации вашей библиотеки. + У вас нет категорий. Нажмите кнопку + для начала организации вашей библиотеки. Перемещение источника Дополнения Информация о дополнении @@ -408,19 +406,16 @@ Мигрировать Копировать Мигрирую… - Поисковые фильтры Достоверный Страница Источник не установлен: %1$s - Перечитываю Статус Начато Тип Автор "Ссылка манги не установлена, пожалуйста нажмите на заголовок и выберите мангу снова " - Закончено: Текущий: Следующий: @@ -429,6 +424,7 @@ Предыдущей части нет Идёт загрузка страниц… Не удалось загрузить страницы: %1$s - Темно-синяя тема - \ No newline at end of file + Диалог при долгом нажатии + Потяните вверх для раскрытия меню + \ No newline at end of file diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml new file mode 100644 index 0000000000..7b04850ec1 --- /dev/null +++ b/app/src/main/res/values-sc/strings.xml @@ -0,0 +1,438 @@ + + + Nùmene + Categorias + Manga + Capìtulos + Arrastamentu + Cronologia + Impostatziones + Fila de sos iscarrigamentos + Sa biblioteca mea + Lèghidos dae pagu + Catàlogos + Agiornamentos de sa biblioteca + Ùrtimos agiornamentos + Categorias + Ischertados: %1$d + Còpia de seguresa + Tramudòngiu de sas mitzas + Estensiones + Informatziones de s\'estensione + Impostatziones + Filtru + Iscarrigados + Sinnados + Non lèghidos + Lèghidos + Boga su filtru + Alfabeticamente + Capìtulos totales + Ùrtimos lèghidos + Ùrtimos agiornados + Chirca + Chirca globale + Ischerta totu + Sinna comente lèghidu + Sinna comente non lèghidu + Sinna sos imbenientes comente lèghidos + Iscàrriga + Annanghe unu sinnalibru + Boga su sinnalibru + Iscantzella + Agiorna + Agiorna sa biblioteca + Modìfica + Annanghe + Annanghe una categoria + Modìfica sas categorias + Cambia su nùmene de sa categoria + Pone in sas categorias + Muda s\'immàgine de cobertedda + Òrdina in manera chi artziet + Òrdina in manera chi achirret + Iscarrigados + Non lèghidu imbeniente + Incumintza + Firma + Pone in pàusa + Isbòida + Serra + Capìtulu antepostu + Capìtulu imbeniente + Torra a proare + Boga + Sighi + Tràmuda + Aberi in s\'esploradore (browser) + Annanghe a s\'ischermada printzipale + Muda sa modalidade de visualizatzione + Visualizatzione + Grìllia + Lista + Iconas de sos iscarrigamentos + Imposta unu filtru + Annulla + Òrdina + Installa + Cumpartzi + Sarva + Torra a impostare + Iscontza + Esporta + Aberi su registru + Crea + Riprìstina + Aberi + Intra + Iscantzellende… + Carrighende… + Aplicatzione non disponìbile + Agiornamentos + Generales + Leghidore + Iscarrigamentos + Mitzas + Arrastamentu + Avantzadas + Informatziones + Manga de sa libreria pro riga + Orientamentu verticale + Orientamentu orizontale + Predefinidu + Frecuèntzia de agiornamentu de sa biblioteca + Manuale + Cada ora + Cada 2 oras + Cada 3 oras + Cada 6 oras + Cada 12 oras + Cada die + Cada 2 dies + Cada chida + Cada mese + Categorias de incluire in s\'agiornamentu globale + Totus + Restritziones a s\'agiornamentu de sa biblioteca + Agiorna petzi cando sas cunditziones benint rispetadas + Wi-Fi + Carrighende + Agiorna sos manga in cursu ebbia + Sincroniza sos capìtulos a pustis de sa leghidura + Tema de s\'aplicatzione + Tema printzipale + Tema iscuru + Tema AMOLED + Biaitu iscuru + Ischermada de incumintzu + Limba + Predefinida de su sistema + Categoria predefinida + Pedi semper + Totus + Detàllios + Agiorna + Installa + Isetende + Iscarrighende + Installende + Installada + Mi fido + Nun mi fido + Disinstalla + Preferèntzias + Disponìbile + Estensione non afidàbile + Custa estensione est istada firmada cun unu tzertificadu chi no est afidàbile e no est istada ativada. +\n +\nUn\'estensione mala diat pòdere lèghere totu sas informatziones de atzessu sarvadas in Tachiyomi o fàghere eseguire còdighe arbitràriu. +\n +\nPonende fidùtzia in custu tzertificadu atzetas custos arriscos. + Versione: %1$s + Limba: %1$s + Non bi sunt preferèntzias de modificare pro custa estensione + Ischermu intreu + Bloca s\'orientamentu + Transitziones de sas pàginas + Lestresa de s\'animatzione de su tocu dòpiu + Ammustra su nùmeru de sa pàgina + Sega sos oros + Imprea una luminosidade personalizada + Imprea unu filtru de colore personalizadu + Mantene s\'ischermu allutu + Navigatzione + Teclas de su volume + Fùrria sas teclas de su volume + Tocu sìngulu + Ventana cun su tocu longu + Colore de isfundu + Arbu/biancu + Nieddu + Òrdine de leghidura + Predefinidu + Dae manca a destra + Dae destra a manca + Verticale + Webtoon + Impaginadore + Decodificadore de immàgines + Casta de iscala + Adata a s\'ischermu + Prena s\'ischermu + Adata a sa largària + Adata a s\'artària + Mannària originale + Adatamentu intelligente + Positzione de incumintzu de s\'ismanniamentu + Automàtica + A manca + A destra + In su tzentru + Peruna animatzione + Normale + Lestra + Rotatzione + Lìbera + Blocada + Bloca in verticale + Bloca in orizontale + R + G + B + A + Cartella de sos iscarrigamentos + Iscàrriga petzi impreende su WiFi + Iscantzella cando est marcadu comente non lèghidu + Iscantzella a pustis de sa leghidura + Cartella personalizada + Disabilitadu + Leghe s\'ùrtimu capìtulu + Penùrtimu capìtulu + Tertzùrtimu capìtulu + Cuartùrtimu capìtulu + Cuintùrtimu capìtulu + Iscàrriga sos capìtulos noos + Categorias de incluire in s\'iscarrigamentu + Servìtzios + Còpia de seguresa + Crea una còpia de seguresa + Podet èssere impreada pro ripristinare sa libreria atuale + Riprìstina una còpia de seguresa + Riprìstina sa biblioteca dae una còpia de seguresa + Cartella de sa còpia de seguresa + Servìtziu + Frecuèntzia de sarvatàgiu de sas còpias de seguresa + Nùmeru màssimu de còpias automàticas + Ripristinende sa còpia de seguresa +\n%1$s annantu a sa biblioteca + Mitza no agatada + Ripristinende sa còpia de seguresa +\n%1$s mitza no agatada + Còpia de seguresa creada + Riprìstinu acabadu + Impossìbile abèrrere su registru + Su riprìstinu est duradu %1$s. +\n%2$s errores agatados. + Su riprìstinu impreat sa mitza pro otènnere sos datos, bi diant pòdere èssere costos de s\'operadore. +\nAssegura·ti fintzas de àere fatu s\'atzessu pro sas mitzas chi lu pedint in antis de ripristinare. + Documentu sarvadu in %1$s + De ite cheres fàghere una còpia de seguresa\? + Ripristinende sa còpia de seguresa + Creende sa còpia de seguresa + Isbòida sa memòria temporànea de sos capìtulos + Impreados: %1$s + Memòria temporànea isbodiada. %1$d documentos sunt istados iscantzellados + B\'at àpidu un\'errore durante s\'isbodiamentu de sa memòria temporànea + Iscantzella sos cookies + Cookies iscantzellados + Reseta sos issèberos de diàlogu + Isbòida sa base de datos + Iscantzella sos manga e sos capìtulos chi non sunt in sa biblioteca tua + Seguru ses\? Sos capìtulos lèghidos e su progressu de sos mangas chi non sunt in sa biblioteca s\'ant a pèrdere + Boghes iscantzelladas + Agiorna sos metadatos de sa biblioteca + Agiornat sas coberteddas, sos gèneres, sa descritzione e sas informatziones de istadu de sos manga + Agiorna sos metadatos de arrastamentu + Agiornat s\'istadu, su votu e s\'ùrtimu capìtulu lèghidu dae sos servìtzios de arrastamentu + Versione + Data de compilatzione + Chirca agiornamentos + Chirca automaticamente agiornamentos de s\'aplicatzione + Imbia raportos a pitzu de sos arrestos anòmalos + Agiudat a acontzare cale si siat faddina. Perunu datu sensìbile at a èssere imbiadu + Intrada pro %1$s + Nùmene impreadore + Crae de intrada + Ammustra sa crae + Intra + S\'intrada at tentu sutzessu + Errore de atzessu + Errore disconnotu + Tìtulu o autore… + Agiornende sa categoria + Locale + Ses seguru de chèrrere bogare sos manga ischertados\? + Iscantzella fintzas sos capìtulos iscarrigados + Filtros de chirca + Custa mitza ti pedit de fàghere s\'atzessu + Ischerta una mitza + Pro praghere abìlita a su mancu una mitza vàlida + Non bi sunt àteros risultados + Manga locale + Àteru + Predefinidu non podet èssere ischertadu cun àteras categorias + Su manga est istadu annantu a sa biblioteca tua + Chirca globale… + Perunu risultadu agatadu! + Ùrtimos + Esplora + Custu manga est istadu bogadu dae sa base de datos! + Informatziones + Descritzione + In cursu + Disconnotu + Cuntzessu in litzèntzia + Boga dae sa biblioteca + Tìtulu + Annantu a sa biblioteca + Bogadu dae sa biblioteca + Autore + Artista + Capìtulos + Ùrtimu capìtulu + Agiornadu + Istadu + Mitza + Gèneres + Icona tzirculare + Icona atundada + Icona cuadrada + Icona a isteddu + Tìtulu de s\'incurtzadura + S\'incurtzadura est istada annanta a s\'ischermada printzipale tua. + Forma de s\'icona + Creatzione de s\'incurtzadura fallida! + Iscantzellare sos capìtulos iscarrigados\? + %1$s copiadu in punta de billete + Mitza no installada: %1$s + Capìtulos + Chene tìtulu + Capìtulu %1$s + Iscarrigadu + In isetu + Iscarrighende + Iscarrighende (%1$d/%2$d) + Errore + In pàusa + Errore durante su recùperu de sos capìtulos + Ammustra su tìtulu + Ammustra su nùmeru de su capìtulu + Modalidade de ordinamentu + Pro mitza + Pro nùmeru de capìtulu + Iscàrriga + Iscàrriga una cantidade personalizada + cantidade + Iscàrriga su capìtulu imbeniente + Iscàrriga sos 5 capìtulos imbenientes + Iscàrriga sos 10 capìtulos imbenientes + Iscarrigamentu personalizadu + Iscàrriga totu + Iscàrriga sos non lèghidos + Ses seguru de chèrrere iscantzellare sos capìtulos ischertados\? + Arrastamentu + Leghende + Acabadu + Abbandonadu + In pàusa + De lèghere + Torrende a lèghere + Votu + Tìtulu + Istadu + Istadu + Incumintzadu + Casta + Autore + S\'url de su manga no est impostadu, pro praghere incarca in su tìtulu e ischerta torra su manga + Esistit giai una categoria cun custu nùmene! + Categorias iscantzelladas + Custu at a bogare sa data de leghidura de custu capìtulu. Seguru ses\? + Reseta totu sos capìtulos pro custu manga + Annànghere custu manga a sa biblioteca\? + Immàgine sarvada + Sarvende s\'immàgine + Optziones + Filtru personalizadu + Imposta comente cobertedda + Cobertedda agiornada + Pàgina copiada in %1$s + Iscarrighende… + Iscarrigadu %1$d%% + Pàgina: %1$d + Capìtulu %1$s + Capìtulu imbeniente no agatadu + Capìtulu antepostu no agatadu + No est istadu possìbile decodificare s\'immàgine + Agiornare a %1$d s\'ùrtimu capìtulu lèghidu in sos servìtzios abilitados\? + Cheres impostare custa immàgine comente cobertedda\? + Visualizadore pro custa sèrie + Acabadu: + Atuale: + Imbeniente: + Antepostu: + Non b\'at unu capìtulu imbeniente + Non b\'at unu capìtulu antepostu + Carrighende pàginas… + Carrigamentu de pàginas fallidu: %1$s + Tira a susu pro àteras optziones + %1$s - Cap.%2$s + Toca pro ischertare sa mitza dae sa cale migrare + Ischerta sos datos de incluire + Ischerta + Mìgra + Còpia + Migrende… + B’at àpidu un\'errore in s’iscarrigamentu de sos capìtulos. Podes torrare a proare in sa setzione de sos iscarrigamentos + Progressu de s\'agiornamentu: %1$d/%2$d + Capìtulos noos agatados + Pro %1$d tìtulos + Agiornamentu de sa cobertedda fallidu + Pro praghere annanghe su manga a sa libreria tua in antis de fàghere custu + Sincronizatzione annullada + Non connessu a s\'alimentatzione + Sincronizatzione annullada + Connessione non disponìbile + Ischerta s\'immàgine de cobertedda + Ischerta sa còpia de seguresa + Ischerta s\'icona de s\'incurtzadura + Est disponìbile un\'agiornamentu nou! + Iscàrriga + Ignora + Non bi sunt agiornamentos disponìbiles noos + Iscarrigamentu incumintzadu + Chirchende agiornamentos + Iscàrriga s\'agiornamentu + Iscarrigamentu in cursu + Iscarrigamentu acabadu + Errore de iscarrigamentu + Agiornamentu disponìbile + Immàgine de isfundu de su manga + Cobertedda de su manga + Perunu iscarrigamentu + Perunu capìtulu reghente + Perunu manga lèghidu dae pagu + Sa biblioteca tua est bòida, podes annànghere sèries a sa biblioteca tua dae sos Catàlogos. + Non tenes categorias. Incarca su butone de su \"prus\" pro nde creare una pro organizare sa biblioteca tua. + Iscarrigadore + Errore + B\'at àpidu un\'errore imprevistu durante s\'iscarrigamentu de su capìtulu + Una pàgina mancat in sa cartella + Una pàgina no est istada carrigada + Peruna connessione wifi disponìbile + Peruna connessione de retza disponìbile + Iscarrigamentu in pàusa + Comunu + Biblioteca + Iscarrigadore + \ No newline at end of file diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 3ee0f669d1..f6e79afd81 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -328,4 +328,16 @@ Prikaži naslov Prikaži broj poglavlja Model sortiranja + Dialog kod dugog pritiska + Prema izvoru + Prema broju poglavlja + Preuzmi + Preuzmi određen broj + količina + Preuzmi sledeće poglavlje + Preuzmi 5 narednih poglavlja + Preuzmi 10 narednih poglavlja + Preuzmi određeno + Preuzmi sve + Preuzmi nepročitano \ No newline at end of file diff --git a/app/src/main/res/values-tl/strings.xml b/app/src/main/res/values-tl/strings.xml new file mode 100644 index 0000000000..15b4e03e22 --- /dev/null +++ b/app/src/main/res/values-tl/strings.xml @@ -0,0 +1,59 @@ + + + Mga Kategorya + Mga Manga + Mga Kabanata + Sinusubaybayan + Kasaysayan + Mga Setting + Queue sa Pag-download + Aking Aklatan + Kakabasa Lang + Mga Katalogo + Mga Update sa Aklatan + Mga Kakalabas lang na Update + Mga Kategorya + Napili: %1$d + Backup + Pag-migrate ng Source + Mga Extension + Tungkol sa Extension + Mga Setting + Ibukod + Na-download + Na-bookmark + Hindi pa Nababasa + Nabasa + Tanggalin ang Pagbukod + Paalpabetiko + Kabuuang Bilang ng mga Kabanata + Huling nabasa + Huling na-update + Hanapin + Global na paghahanap + Piliin lahat + Pangalan + Markahang Nabasa + Markahang Hindi pa Nababasa + Markahang Nabasa ang Nauna + I-download + I-bookmark + Tanggalin ang bookmark + I-delete + I-update + I-update ang Aklatan + I-edit + Idagdag + Magdagdag ng Kategorya + I-edit ang mga kategorya + I-rename ang kategorya + Ilipat sa mga kategorya + I-edit ang cover picture + I-sort pataas + I-sort pababa + Mga Na-download + Susunod na Hindi pa Nababasa + Simula + Itigil + Ihinto + \ 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 238c04147a..cd808c059a 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -1,11 +1,11 @@ - -Ad + + + Ad Kategoriler Manga Bölümler İzleme Geçmiş - Ayarlar İndirme kuyruğu Kitaplığım @@ -19,8 +19,6 @@ Kaynak taşıma Eklentiler Eklenti bilgisi - - Ayarlar Süz İndirilen @@ -87,13 +85,10 @@ Geri yükle Giriş - Siliniyor… Yükleniyor… - Uygulama yok Güncellemeler - Genel Okuyucu İndirmeler @@ -101,8 +96,7 @@ İzleme Gelişmiş Hakkında - - Kitaplık satır başına manga + Kitaplık satır başına manga Dikey Yatay Öntanımlı @@ -134,7 +128,6 @@ Sistem öntanımlı Öntanımlı kategori Her zaman sor - Tümü Ayrıntılar Güncelle @@ -157,8 +150,7 @@ Sürüm: %1$s Dil: %1$s Bu uzantı için düzenlenebilecek tercih yok - - Tam Ekran + Tam Ekran Yönlendirmeyi sabitle Sayfa geçişleri Çift dokunma animasyon hızı @@ -206,9 +198,7 @@ Y M A - - - İndirme dizini + İndirme dizini Yalnızca Wi-Fi ile indir Okunmuş olarak işaretlendiğinde kaldır Okunduktan sonra kaldır @@ -221,9 +211,7 @@ Sondan beşinci bölüm Yeni bölümleri indir İndirmeye eklenecek kategoriler - - Hizmetler - + Hizmetler Yedekleme Yedek oluştur Şu anki kitaplığı geri yüklemek için kullanılabilir @@ -249,8 +237,7 @@ Neyi yedeklemek istiyorsunuz? Yedek geri yükleniyor Yedek oluşturuluyor - - Bölüm önbelleğini temizle + Bölüm önbelleğini temizle Kullanılan: %1$s Önbellek temizlendi. %1$d dosya silindi Önbellek temizlenirken bir hata oluştu @@ -265,15 +252,12 @@ Kapakları, türleri, açıklamayı ve manga durum bilgisini günceller İzleme üst verisini yenile İzleme servisinden durumu, puanı ve son okunan bölümü günceller - - Sürüm + Sürüm İnşa tarihi Güncellemeleri denetle Uygulama güncellemelerini kendiliğinden denetle Çökme bildirimi gönder Hataların düzeltilmesine yardımcı olur. Hiçbir hassas veri gönderilmez - - %1$s için giriş Kullanıcı adı Parola @@ -282,13 +266,11 @@ Giriş başarılı Giriş hatası Bilinmeyen hata - Başlık veya yazar… Kategori güncelleniyor Yerel Seçilen mangayı kaldırmak istediğinizden emin misiniz? İndirilen bölümleri de sil - Arama süzgeçleri Bu kaynak giriş yapmanızı gerektirir Bir kaynak seç @@ -302,9 +284,7 @@ Sonuç bulunmadı! En son Göz at - Bu manga veritabanından kaldırıldı! - Bilgi Açıklama Devam ediyor @@ -333,7 +313,6 @@ İndirilen bölümler silinsin mi? "%1$s panoya kopyalandı " Kaynak kurulmadı: %1$s - Bölümler Başlıksız Bölüm %1$s @@ -359,7 +338,6 @@ Tümünü indir Okunmamışı indir Seçilen bölümleri silmek istediğinize emin misiniz? - İzleme Okunuyor Tamamlandı @@ -375,19 +353,14 @@ Tür Yazar Manga url\'si ayarlı değil, lütfen başlığa dokunun ve mangayı yeniden seçin - Bu adla bir kategori zaten var! Kategoriler silindi - Bu, bu bölümün okunma tarihini kaldıracak. Emin misiniz? Bu manga için tüm bölümleri sıfırla - Manga kitaplığa eklensin mi? - Resim kaydedildi Resim kaydediliyor Seçenekler - Özel süzgeç Kapak olarak ayarla Kapak güncellendi @@ -402,18 +375,14 @@ Etkin hizmetlerde okunan son bölüm %1$d ile güncellensin mi? Bu görseli kapak olarak ayarlamak istiyor musunuz? Bu dizi için görüntüleyici - %1$s - Böl.%2$s - Taşınılacak kaynağı seçmek için dokunun Eklenecek veriyi seç Seç Taşın Kopyala Taşınılıyor… - Bölümler indirilirken bir hata oluştu. İndirmeler bölümünden yeniden deneyebilirsiniz - Güncelleme ilerlemesi: %1$d/%2$d Yeni bölümler bulundu %1$d başlık için @@ -423,33 +392,27 @@ AC güç kaynağına bağlı değil Eşitleme iptal edildi Bağlantı yok - Kapak görselini seç Yedek dosyasını seç Kısayol simgesi seç - Yeni güncelleme var! İndir Yok say Yeni güncelleme yok İndirme başladı Güncellemeler aranıyor - Güncellemeyi indir İndirme sürüyor İndirme tamamlandı İndirme hatası Güncelleme var - Manganın art alan görseli Manganın kapağı - İndirme yok Yeni bölüm yok Yakında okunan manga yok Kitaplığınız boş, Kataloglardan kitaplığınıza serileri ekleyebilirsiniz. Kategoriniz yok. Kitaplığınızı düzenlemek için bir tane oluşturmak için artı düğmesine basın. - İndirici Hata Bölüm indirilirken beklenmeyen bir hata oluştu @@ -458,12 +421,10 @@ Wi-Fi bağlantısı yok Ağ bağlantısı yok İndirme duraklatıldı - Genel Kitaplık İndirici - -Biten: + Biten: Şu anki: Sonraki: Önceki: @@ -471,6 +432,7 @@ Önceki bölüm yok Sayfalar yükleniyor… Sayfalar yüklenemedi: %1$s - Koyu mavi - + Uzun dokunma iletişim kutusu + Daha çok seçenek için yukarı çekin + \ No newline at end of file diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 883ac68a9c..2ac2d5fd94 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -1,11 +1,11 @@ - -Назва + + + Назва Категорії Манга Глави Відстеження Історія - Налаштування Черга завантаження Бібліотека @@ -19,8 +19,6 @@ Міграція джерела Розширення Інформація про розширення - - Налаштування Фільтр Завантажені @@ -87,13 +85,10 @@ Відновити Відкрити Логін - Видалення… Завантаження… - Програма не відповідає Оновлення - Головні Читалка Завантаження @@ -101,8 +96,7 @@ Відстеження Додатково Інформація - - Кількість колонок в бібліотеці + Кількість колонок в бібліотеці Вертикальна Горизонтальна За замовчанням @@ -135,7 +129,6 @@ Системний Категорія за замовчуванням Завжди запитувати - Всі Деталі Оновлення @@ -158,8 +151,7 @@ Версія:%1$s Мова: %1$s У цього розширення немає налаштувань для редагування - - Повноекранний режим + Повноекранний режим Блокувати орієнтацію Переходи сторінки Швидкість анімації при подвійному натиснені @@ -207,9 +199,7 @@ G B A - - - Директорія завантаження + Директорія завантаження Завантажувати лише через Wi-Fi Видалити коли відмічено як прочитано Видаляти після прочитання @@ -222,9 +212,7 @@ П\'ята від прочитаної глави Завантажувати нові глави Категорії для включення до завантажень - - Сервіси - + Сервіси Резервна копія Створити резервну копію Можна використовувати для відновлення поточної бібліотеки @@ -250,8 +238,7 @@ Що ви хочете зберегти до резервної копії\? Відновлення резервної копії Створення резервної копії - - Очистити кеш глав + Очистити кеш глав Використано: %1$s Кеш очищено %1$d файлів було видалено Виникла помилка при видаленні кешу @@ -266,15 +253,12 @@ Оновити обкладинки, жанри, описи та інформацію про манги Оновити метадату що відстежується Оновити стан, рахунок і останню главу з каталогів що відстежуються - - Версія + Версія Дата збирання Перевіряти оновлення Автоматично перевіряти нові версії Надсилати звіти про падіння Допомагає виправляти будь-які баги. Особисті дані не передаються - - Авторизація для %1$s Ім`я користувача Пароль @@ -283,13 +267,11 @@ Вхід успішний Помилка авторизації Невідома помилка - Назва чи автор… Оновлення категорії Локальна Ви впевнені, що бажаєте видалити вибрані манги\? Також видалити завантажені глави - Пошукові фільтри Цей каталог потребує авторизації Оберіть каталог @@ -303,9 +285,7 @@ Результатів не знайдено! Остання Переглянути - Ця манга було видалена з бази даних! - Інформація Опис Випускається @@ -334,7 +314,6 @@ Видаляти завантажені глави\? %1$s скопійовано до буфера Джерело не встановлено: %1$s - Глави Немає назви Глава %1$s @@ -360,7 +339,6 @@ Завантажити все Завантажити непрочитані Ви впевнені, що бажаєте видалити вибрані глави\? - Відслідковувати В процесі читання Завершено @@ -376,19 +354,14 @@ Тип Автор Посилання манги не встановлено, будь ласка натисніть на заголовок та виберіть мангу знову - Категорія з таким іменем вже існує! Категорію видалено - Ця дія видалить дату прочитання глави. Ви впевнені\? Скинути усі глави для цієї манги - Додати мангу до бібліотеки\? - Картинку збережено Зберегти картинку Опції - Користувацький фільтр Встановити як обкладинку Обкладинку оновлено @@ -411,18 +384,14 @@ Попередньої частини немає Завантаження сторінок… Не вдалось завантажити сторінки %1$s - %1$s - Гл.%2$s - Натисни аби вибрати джерело для міграції Виберіть включені дані Вибрати Мігрувати Копіювати Мігрую… - Сталась помилка при завантаженні глав. Спробуйте ще раз у розділі завантаження - Стан оновлення: %1$d/%2$d Знайдено нові глави Для %1$d тайтлів @@ -432,33 +401,27 @@ Не заряджається Синхронізацію скасовано З`єднання не доступне - Вибрати обкладинку Виберіть файл резервної копії Вибрати ярлик - Доступні нові оновлення! Завантажити Ігнорувати Оновлень не виявлено Завантаження розпочалось Шукаю оновлення - Оновлення завантаження Завантаження в процесі Завантаження завершено Помилка завантаження Доступно оновлення - Фонове зображення манги Обкладинка манги - Немає завантажень Немає нових глав Немає нещодавно прочитаних глав Ваша бібліотека порожня, ви можете додати з каталогу. У вас немає категорій. Натисніть кнопку + для початку облаштування вашої бібліотеки. - Завантажувач Помилка Невідома помилка при завантаженні глави @@ -467,9 +430,9 @@ Немає Wi-Fi підключення "Немає мережевого з`єднання " Завантаження призупинено - Звичайний Бібліотека Завантажувач - - + Діалог тривалого тицяння + Потягніть задля додаткових опцій + \ No newline at end of file diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 60bb736c2d..3b23b8cd11 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -1,10 +1,10 @@ - -名字 + + + 名字 标签 漫画 章节 历史 - 设置 下载队列 我的书架 @@ -17,8 +17,6 @@ 备份 扩展 扩展信息 - - 设置 筛选 已下载 @@ -85,15 +83,12 @@ 恢复 打开 登录 - 删除中… 加载中… - 倒序 显示已下载数量 应用程序不可用 更新 - 通用 阅读 下载 @@ -101,8 +96,7 @@ 同步 高级 关于 - - 书架页面网格 + 书架页面网格 纵向 横向 预设 @@ -134,7 +128,6 @@ 系统默认 默认标签 每次询问 - All 详细 更新 @@ -157,8 +150,7 @@ 版本: %1$s 语言: %1$s 此插件没有可用的偏好设置 - - 全屏 + 全屏 锁定方向 页面过渡动画 双击动画速度 @@ -206,9 +198,7 @@ G B A - - - 下载目录 + 下载目录 仅在连接Wi-Fi时下载 自动删除标记已读的章节 阅后即删 @@ -221,9 +211,7 @@ 至倒数第五章 自动下载新章节 自动下载标签 - - 服务 - + 服务 备份 创建备份 可用于恢复当前数据 @@ -249,8 +237,7 @@ 需要备份什么? 正在恢复备份 正在创建备份 - - 清除缓存数据 + 清除缓存数据 已使用空间:%1$s 清理完成。已删除%1$d个文件 清除时出现错误 @@ -265,15 +252,12 @@ 更新封面,类型,描述与漫画状态信息 刷新同步数据 更新同步服务的状态,评分以及已读章节 - - 版本 + 版本 构建时间 检查更新 自动检查软件新版本 发送错误数据 帮助我们修复bug。不会发送个人信息 - - 登录到%1$s 用户名 密码 @@ -282,13 +266,11 @@ 登录成功 登录失败 未知错误 - 标题或作者… 升级标签中 本地 确定要删除选中的漫画吗? 同时删除已下载章节 - 按分类搜索 这个图源需要登录 选择图源 @@ -302,9 +284,7 @@ 找不到! 最近更新 浏览 - 漫画已被移出数据库! - 详情 描述 连载中 @@ -333,7 +313,6 @@ 删除已下载的章节? 已复制%1$s到剪贴板 未安装图源:%1$s - 章节 无标题 第%1$s章 @@ -359,7 +338,6 @@ 下载全部 下载未读 确定删除所选章节吗? - 同步 阅读中 已完结 @@ -375,19 +353,14 @@ 类型 作者 漫画链接未设置,请点击标题再选择一次漫画 - 已存在相同标签! 标签已删除 - 将清除此章节的阅读日期,确定吗? 重置此漫画所有章节 - 要将这本漫画添加至书架吗? - 图片已保存 保存图片中 选项 - 自定义筛选 设置为封面 已设置封面 @@ -411,18 +384,14 @@ 前面没有啦 页面加载中… 加载页面: %1$s失败 - %1$s - 第%2$s章 - 选择需要迁移的来源 选择需要迁移的数据 选择 迁移 共存 迁移中… - 下载时发生错误。请再试一次 - 更新中:%1$d/%2$d 发现新章节 %1$d @@ -432,33 +401,27 @@ 未连接至电源 同步取消 连接不可用 - 选择封面图片 选择备份文件 选择快捷方式图标 - 有新版本哦! 下载 忽略 没有发现新版本 下载开始 检查更新 - 下载更新 下载中 下载完成 下载时发生错误 可更新 - 漫画背景 漫画封面 - 没有下载中的任务 无最近章节 无最近阅读 你的书架是空的哦,请去发现栏寻找漫画进行收藏吧 你还没有标签。你可以点击加号按钮创建一个标签以管理书架 - 下载 错误 下载时发生不可预期的错误 @@ -467,10 +430,10 @@ 无可用Wi-Fi 无网络连接 下载暂停 - 普通 书架 下载 - -暗蓝色主题 - + 暗蓝色主题 + 长按菜单 + 上拉显示更多选项 + \ No newline at end of file