Compare commits

...

35 Commits

Author SHA1 Message Date
len
0db4fcc27e Release 0.6.3 2017-09-10 12:29:17 +02:00
len
f3080b6277 Actually convert file uri to content uri 2017-09-10 12:29:04 +02:00
len
69cbbd5811 Disable file exposure detection to allow sharing from the local cache ¯\_(ツ)_/¯ 2017-09-10 12:03:44 +02:00
len
0b85760939 Fix #908 2017-09-10 10:51:21 +02:00
len
03f3a4805f Fix a crash when retrying a page 2017-09-10 10:14:40 +02:00
len
d95adf2631 Release 0.6.2 2017-09-09 14:00:21 +02:00
len
e971d40e06 Lock drawer with gravity parameter instead of a view 2017-09-08 18:18:27 +02:00
len
c65a01a5f0 Fix a crash when retrying pages 2017-09-08 17:59:43 +02:00
len
8586014e17 Exclude extensions dependencies from proguard. Enable new translations. 2017-09-08 17:43:46 +02:00
bdfae4ba04 Translations (#881)
* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (358 of 358 strings)

Translation: Tachiyomi/Main
Translate-URL: http://weblate.j2ghz.com/projects/tachiyomi/main/pt_BR/

* Add translation link

* Added translation using Weblate (Polish)

* Translated using Weblate (Polish)

Currently translated at 100.0% (358 of 358 strings)

Translation: Tachiyomi/Main
Translate-URL: http://weblate.j2ghz.com/projects/tachiyomi/main/pl/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (358 of 358 strings)

Translation: Tachiyomi/Main
Translate-URL: http://weblate.j2ghz.com/projects/tachiyomi/main/pt_BR/

* Translated using Weblate (Korean)

Currently translated at 25.1% (90 of 358 strings)

Translation: Tachiyomi/Main
Translate-URL: http://weblate.j2ghz.com/projects/tachiyomi/main/ko/

* Translated using Weblate (Russian)

Currently translated at 100.0% (358 of 358 strings)

Translation: Tachiyomi/Main
Translate-URL: http://weblate.j2ghz.com/projects/tachiyomi/main/ru/

* Added translation using Weblate (German)

* Translated using Weblate (German)

Currently translated at 100.0% (358 of 358 strings)

Translation: Tachiyomi/Main
Translate-URL: http://weblate.j2ghz.com/projects/tachiyomi/main/de/

* Translated using Weblate (German)

Currently translated at 100.0% (358 of 358 strings)

Translation: Tachiyomi/Main
Translate-URL: http://weblate.j2ghz.com/projects/tachiyomi/main/de/

* Translated using Weblate (Polish)

Currently translated at 100.0% (358 of 358 strings)

Translation: Tachiyomi/Main
Translate-URL: http://weblate.j2ghz.com/projects/tachiyomi/main/pl/
2017-09-08 17:25:44 +02:00
75cb94b51a Fix tint on AMOLED theme (#966)
Fix tint on AMOLED theme
2017-08-30 21:50:19 +02:00
2f6d163a7a Simplify presenter delegate 2017-08-29 10:39:22 +02:00
ecfe72bcad Let GC take care of the presenter. Also fix #947 2017-08-29 09:55:42 +02:00
e6ff9e18cc Fix #956 2017-08-28 10:13:27 +02:00
3c550c1781 Kotlin 1.1.4. Add discord link in about 2017-08-28 10:00:13 +02:00
537693f5cf README, CONTRIBUTING and ISSUE_TEMPLATE, Discord (#952)
* Include discord, change issue segment

* Update CONTRIBUTING.md

* Update ISSUE_TEMPLATE.md
2017-08-28 09:42:44 +02:00
5ae0589547 License manga update and Manga Fox Title Update (#937)
* update mangafox parsing to read chapter title also if it exists.

* updated chapterImpl to force update chapters if chapter name changes.  This allows for chapter name changes from the source to update in app

* switched from : to - since other sites that already have title use - so it provides consistency across sources.

* fixed spacing for -

* fixes license status for manga fox
if manga is licensed no chapters will be shown.

* 1. changed equality in chapterImp back to just the url (removed scanlator, and name comparison)
2. Removed extra line of code assigning mangaFox title twice
3. Modified ChapterSourceSync for scanlator/title/url comparison.

* cleaned spaces, added comment, incorporated toChange code from other pull request

* throw exception instead of returning empty list when licensed

* space fix
2017-08-28 09:10:19 +02:00
len
71fc6fc257 Revert chapter equals method 2017-08-26 12:50:52 +02:00
len
c0d7b16ee6 Allow to update chapter metadata 2017-08-26 12:46:35 +02:00
len
f3f7aa9e1d Also fix Batoto popular query 2017-08-25 23:30:18 +02:00
len
43355970db Batoto fix. #953 2017-08-25 23:10:31 +02:00
bfa386acba Add Filter by Completed for library (#941)
* issue 938

added filter by completed manga status

* changed to use existing string
fixed space issue in method in presenter
2017-08-19 20:34:43 +02:00
len
e8b432485d Minor changes 2017-08-15 15:06:21 +02:00
a12a34e3bb Add Batoto Scanlator to Chapter view (#789)
* Added scanlator for Batoto on chapter list

* adjusted item_chapter layout for scanlator
adjusted so db chapters get updated if scanlator does not match source scanlator

* adjusted item_chapter layout for scanlator
adjusted chapter holder to dynamically set title max lines depending on if scanlator exists

* fixed excess blank line

* changed scanlator to be instantiated instead lateint to prevent toast message erro when viewing chapters by catalog

* changed item_chapter.xml to constraint layout

* removed accidental changes to catalog

* cleaned up code.

* fixed issue where long title was running into 3 dot menu
fixed issue where no scanlator for manga was causing date to not be bottom lined
fixed general chapter layout to be more similar to existing

* allow scanlator to be null

* fixed merge issue

* fixed merge issue

* attempt to fix whitespace carriage return issue

* attempt to fix whitespace carriage return issue

* attempt to fix whitespace carriage return issue
2017-08-15 15:05:41 +02:00
b79855c01d Remove circle image view dependency 2017-08-09 12:38:54 +02:00
17fe501a6d Ask permissions once. Fixes #892 2017-08-07 11:04:27 +02:00
len
8201b367ec Fix most crashes with extensions and the release version. Crop borders support in android O 2017-08-06 16:19:25 +02:00
len
6c242084ca Fallback chapter cache to internal storage 2017-08-03 21:44:31 +02:00
aefe7b176a Fixes case where manga name ends with s. (#919) 2017-07-31 20:04:14 +02:00
6059b85e58 Fix library category not updatable when empty. Closes #907 2017-07-27 09:21:15 +02:00
len
aa46c52eee Crop borders for webtoons. Closes #904 2017-07-26 20:35:31 +02:00
d3cbfbdb59 Add workaround for disappearing menu items 2017-07-26 11:29:03 +02:00
cc9b77b876 Simultaneous download will now show on start. (#911) 2017-07-26 10:49:13 +02:00
len
1568ac9e8a Release 0.6.1 2017-07-08 19:01:49 +02:00
len
1129dacdfa Downgrade jsoup 2017-07-08 18:58:53 +02:00
57 changed files with 1263 additions and 216 deletions

View File

@ -1,6 +1,17 @@
1. **Before reporting a new issue, take a look at the [FAQ](https://github.com/inorichi/tachiyomi/wiki/FAQ), the [changelog](https://github.com/inorichi/tachiyomi/releases) and the already opened [issues](https://github.com/inorichi/tachiyomi/issues).**
2. If you are unsure, ask here: [![Discord](https://img.shields.io/discord/349436576037732353.svg)](https://discord.gg/WrBkRk4)
3. What is your type of issue?
* [Catalogue request](#catalogue-requests)
* [Bugs](#bugs)
* [Feature requests](#feature-requests)
* [Translations](https://github.com/inorichi/tachiyomi/wiki/Translation)
4. After following 1. and 3. you can [open your issue](https://github.com/inorichi/tachiyomi/issues/new)
***
# Catalogue requests
* Catalogue requests should be created at https://github.com/inorichi/tachiyomi-extensions/issues, not here
* Catalogue requests should be created at https://github.com/inorichi/tachiyomi-extensions#readme, not here
# Bugs
* Include version (Setting > About > Version)
@ -8,17 +19,9 @@
* Dev version is equal to the number of commits as seen in the main page
* Include steps to reproduce (if not obvious from description)
* Include screenshot (if needed)
* If it could be device-dependent, try reproducing on another device (if possible), include results and device names, OS, modifications (root, Xposed)
* **Before reporting a new issue, take a look at the [FAQ](https://github.com/inorichi/tachiyomi/wiki/FAQ), the [changelog](https://github.com/inorichi/tachiyomi/releases) and the already opened [issues](https://github.com/inorichi/tachiyomi/issues).**
* If it could be device-dependent, try reproducing on another device (if possible)
* For large logs use http://pastebin.com/ (or similar)
* For multipart issues **use list** like this:
* [x] Done
* [ ] Not done
```
* [x] Done
* [ ] Not done
```
* Don't put together too many unrelated requests into one issue
* Don't group unrelated requests into one issue
DO: https://github.com/inorichi/tachiyomi/issues/24 https://github.com/inorichi/tachiyomi/issues/71
@ -28,7 +31,3 @@ DON'T: https://github.com/inorichi/tachiyomi/issues/75
* Write a detailed issue, explaning what it should do or how. Avoid writing just "like X app does"
* Include screenshot (if needed)
# Translations
[Wiki](https://github.com/inorichi/tachiyomi/wiki/Translation)

View File

@ -1,7 +1 @@
**Please read https://github.com/inorichi/tachiyomi/blob/master/.github/CONTRIBUTING.md before posting**
Remove line above and describe your issue here. Fill out version below. Use Preview.
Version: r000 or v0.0.0
(other relevant info like OS)

View File

@ -1,10 +1,11 @@
| Build | Download | F-Droid |
|-------|----------|-------------|
| [![TeamCity (simple build status)](https://img.shields.io/teamcity/https/teamcity.kanade.eu/s/tachiyomi_Build.svg)](https://teamcity.kanade.eu/project.html?projectId=tachiyomi) [![Travis](https://img.shields.io/travis/inorichi/tachiyomi.svg)](https://travis-ci.org/inorichi/tachiyomi) | [![stable release](https://img.shields.io/github/release/inorichi/tachiyomi.svg?maxAge=3600&label=stable)](https://github.com/inorichi/tachiyomi/releases) [![latest dev build](https://img.shields.io/badge/dev-latest%20build-blue.svg)](http://tachiyomi.kanade.eu/latest/app-debug.apk) | [![fdroid release](https://img.shields.io/badge/stable-f--droid.org-blue.svg)](https://f-droid.org/repository/browse/?fdid=eu.kanade.tachiyomi) [![fdroid dev](https://img.shields.io/badge/dev-wiki-blue.svg)](//github.com/inorichi/tachiyomi/wiki/FDroid-for-dev-versions) |
| Build | Download | F-Droid | Contribute | Contact |
|-------|----------|---------|------------|---------|
| [![TeamCity (simple build status)](https://img.shields.io/teamcity/https/teamcity.kanade.eu/s/tachiyomi_Build.svg)](https://teamcity.kanade.eu/project.html?projectId=tachiyomi) [![Travis](https://img.shields.io/travis/inorichi/tachiyomi.svg)](https://travis-ci.org/inorichi/tachiyomi) | [![stable release](https://img.shields.io/github/release/inorichi/tachiyomi.svg?maxAge=3600&label=stable)](https://github.com/inorichi/tachiyomi/releases) [![latest dev build](https://img.shields.io/badge/dev-latest%20build-blue.svg)](http://tachiyomi.kanade.eu/latest/app-debug.apk) | [![fdroid release](https://img.shields.io/badge/stable-f--droid.org-blue.svg)](https://f-droid.org/repository/browse/?fdid=eu.kanade.tachiyomi) [![fdroid dev](https://img.shields.io/badge/dev-wiki-blue.svg)](//github.com/inorichi/tachiyomi/wiki/FDroid-for-dev-versions) | [![Translation status](http://weblate.j2ghz.com/widgets/tachiyomi/-/svg-badge.svg)](https://github.com/inorichi/tachiyomi/wiki/Translation) | [![Discord](https://img.shields.io/discord/349436576037732353.svg)](https://discord.gg/WrBkRk4) |
## [Report an issue](https://github.com/inorichi/tachiyomi/blob/master/.github/CONTRIBUTING.md)
### **Contact us on [Discord](https://discord.gg/WrBkRk4)**
If you want to open an issue, please read [contributing guidelines](https://github.com/inorichi/tachiyomi/blob/master/.github/CONTRIBUTING.md). Your issue may be closed otherwise.
**Before reporting a new issue, take a look at the [FAQ](https://github.com/inorichi/tachiyomi/wiki/FAQ), the [changelog](https://github.com/inorichi/tachiyomi/releases) and the already opened issues.**
***
Tachiyomi is a free and open source manga reader for Android.

View File

@ -38,8 +38,8 @@ android {
minSdkVersion 16
targetSdkVersion 25
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
versionCode 23
versionName "0.6.0"
versionCode 26
versionName "0.6.3"
buildConfigField "String", "COMMIT_COUNT", "\"${getCommitCount()}\""
buildConfigField "String", "COMMIT_SHA", "\"${getGitSha()}\""
@ -98,6 +98,7 @@ dependencies {
// Modified dependencies
compile 'com.github.inorichi:subsampling-scale-image-view:01e5385'
compile 'com.github.inorichi:tachimage:68cd311'
compile 'com.github.inorichi:junrar-android:634c1f5'
// Android support library
@ -146,7 +147,7 @@ dependencies {
compile 'com.github.seven332:unifile:1.0.0'
// HTML parser
compile 'org.jsoup:jsoup:1.10.3'
compile 'org.jsoup:jsoup:1.10.2'
// Job scheduling
compile 'com.evernote:android-job:1.1.11'
@ -189,7 +190,6 @@ dependencies {
compile 'com.github.amulyakhare:TextDrawable:558677e'
compile 'com.afollestad.material-dialogs:core:0.9.4.5'
compile 'me.zhanghai.android.systemuihelper:library:1.0.0'
compile 'de.hdodenhof:circleimageview:2.1.0'
compile 'com.nightlynexus.viewstatepageradapter:viewstatepageradapter:1.0.4'
// Conductor
@ -217,7 +217,7 @@ dependencies {
}
buildscript {
ext.kotlin_version = '1.1.3'
ext.kotlin_version = '1.1.4'
repositories {
mavenCentral()
}

View File

@ -7,6 +7,13 @@
-keep class com.hippo.image.** { *; }
-keep interface com.hippo.image.** { *; }
# Extensions may require methods unused in the core app
-keep class org.jsoup.** { *; }
-keep class kotlin.** { *; }
-keep class okhttp3.** { *; }
-keep class com.google.gson.** { *; }
-keep class com.github.salomonbrys.kotson.** { *; }
# OkHttp
-dontwarn okhttp3.**
-dontwarn okio.**

View File

@ -21,7 +21,7 @@
android:theme="@style/Theme.Tachiyomi">
<activity
android:name=".ui.main.MainActivity"
android:launchMode="singleTask">
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

View File

@ -45,6 +45,16 @@ object Migrations {
}
}
}
if (oldVersion < 26) {
// Delete external chapter cache dir.
val extCache = context.externalCacheDir
if (extCache != null) {
val chapterCache = File(extCache, "chapter_disk_cache")
if (chapterCache.exists()) {
chapterCache.deleteRecursively()
}
}
}
return true
}
return false

View File

@ -45,8 +45,7 @@ class ChapterCache(private val context: Context) {
private val gson: Gson by injectLazy()
/** Cache class used for cache management. */
private val diskCache = DiskLruCache.open(
File(context.externalCacheDir, PARAMETER_CACHE_DIRECTORY),
private val diskCache = DiskLruCache.open(File(context.cacheDir, PARAMETER_CACHE_DIRECTORY),
PARAMETER_APP_VERSION,
PARAMETER_VALUE_COUNT,
PARAMETER_CACHE_SIZE)
@ -82,10 +81,10 @@ class ChapterCache(private val context: Context) {
try {
// Remove the extension from the file to get the key of the cache
val key = file.substring(0, file.lastIndexOf("."))
val key = file.substringBeforeLast(".")
// Remove file from cache.
return diskCache.remove(key)
} catch (e: IOException) {
} catch (e: Exception) {
return false
}
}

View File

@ -17,7 +17,7 @@ class DbOpenHelper(context: Context)
/**
* Version of the database.
*/
const val DATABASE_VERSION = 4
const val DATABASE_VERSION = 5
}
override fun onCreate(db: SQLiteDatabase) = with(db) {
@ -51,6 +51,9 @@ class DbOpenHelper(context: Context)
if (oldVersion < 4) {
db.execSQL(ChapterTable.bookmarkUpdateQuery)
}
if (oldVersion < 5) {
db.execSQL(ChapterTable.addScanlator)
}
}
override fun onConfigure(db: SQLiteDatabase) {

View File

@ -20,6 +20,7 @@ import eu.kanade.tachiyomi.data.database.tables.ChapterTable.COL_LAST_PAGE_READ
import eu.kanade.tachiyomi.data.database.tables.ChapterTable.COL_MANGA_ID
import eu.kanade.tachiyomi.data.database.tables.ChapterTable.COL_NAME
import eu.kanade.tachiyomi.data.database.tables.ChapterTable.COL_READ
import eu.kanade.tachiyomi.data.database.tables.ChapterTable.COL_SCANLATOR
import eu.kanade.tachiyomi.data.database.tables.ChapterTable.COL_SOURCE_ORDER
import eu.kanade.tachiyomi.data.database.tables.ChapterTable.COL_URL
import eu.kanade.tachiyomi.data.database.tables.ChapterTable.TABLE
@ -48,6 +49,7 @@ class ChapterPutResolver : DefaultPutResolver<Chapter>() {
put(COL_URL, obj.url)
put(COL_NAME, obj.name)
put(COL_READ, obj.read)
put(COL_SCANLATOR, obj.scanlator)
put(COL_BOOKMARK, obj.bookmark)
put(COL_DATE_FETCH, obj.date_fetch)
put(COL_DATE_UPLOAD, obj.date_upload)
@ -64,6 +66,7 @@ class ChapterGetResolver : DefaultGetResolver<Chapter>() {
manga_id = cursor.getLong(cursor.getColumnIndex(COL_MANGA_ID))
url = cursor.getString(cursor.getColumnIndex(COL_URL))
name = cursor.getString(cursor.getColumnIndex(COL_NAME))
scanlator = cursor.getString(cursor.getColumnIndex(COL_SCANLATOR))
read = cursor.getInt(cursor.getColumnIndex(COL_READ)) == 1
bookmark = cursor.getInt(cursor.getColumnIndex(COL_BOOKMARK)) == 1
date_fetch = cursor.getLong(cursor.getColumnIndex(COL_DATE_FETCH))

View File

@ -10,6 +10,8 @@ class ChapterImpl : Chapter {
override lateinit var name: String
override var scanlator: String? = null
override var read: Boolean = false
override var bookmark: Boolean = false
@ -29,9 +31,7 @@ class ChapterImpl : Chapter {
if (other == null || javaClass != other.javaClass) return false
val chapter = other as Chapter
return url == chapter.url
}
override fun hashCode(): Int {

View File

@ -14,6 +14,8 @@ object ChapterTable {
const val COL_READ = "read"
const val COL_SCANLATOR = "scanlator"
const val COL_BOOKMARK = "bookmark"
const val COL_DATE_FETCH = "date_fetch"
@ -32,6 +34,7 @@ object ChapterTable {
$COL_MANGA_ID INTEGER NOT NULL,
$COL_URL TEXT NOT NULL,
$COL_NAME TEXT NOT NULL,
$COL_SCANLATOR TEXT,
$COL_READ BOOLEAN NOT NULL,
$COL_BOOKMARK BOOLEAN NOT NULL,
$COL_LAST_PAGE_READ INT NOT NULL,
@ -52,4 +55,7 @@ object ChapterTable {
val bookmarkUpdateQuery: String
get() = "ALTER TABLE $TABLE ADD COLUMN $COL_BOOKMARK BOOLEAN DEFAULT FALSE"
val addScanlator: String
get() = "ALTER TABLE $TABLE ADD COLUMN $COL_SCANLATOR TEXT DEFAULT NULL"
}

View File

@ -114,6 +114,9 @@ class Downloader(private val context: Context, private val provider: DownloadPro
val pending = queue.filter { it.status != Download.DOWNLOADED }
pending.forEach { if (it.status != Download.QUEUE) it.status = Download.QUEUE }
// Show download notification when simultaneous download > 1.
notifier.onProgressChange(queue)
downloadsRelay.call(pending)
return !pending.isEmpty()
}

View File

@ -87,6 +87,8 @@ object PreferenceKeys {
const val filterUnread = "pref_filter_unread_key"
const val filterCompleted = "pref_filter_completed_key"
const val librarySortingMode = "library_sorting_mode"
const val automaticUpdates = "automatic_updates"

View File

@ -145,6 +145,8 @@ class PreferencesHelper(val context: Context) {
fun filterUnread() = rxPrefs.getBoolean(Keys.filterUnread, false)
fun filterCompleted() = rxPrefs.getBoolean(Keys.filterCompleted, false)
fun librarySortingMode() = rxPrefs.getInteger(Keys.librarySortingMode, 0)
fun librarySortingAscending() = rxPrefs.getBoolean("library_sorting_ascending", true)

View File

@ -12,11 +12,14 @@ interface SChapter : Serializable {
var chapter_number: Float
var scanlator: String?
fun copyFrom(other: SChapter) {
name = other.name
url = other.url
date_upload = other.date_upload
chapter_number = other.chapter_number
scanlator = other.scanlator
}
companion object {

View File

@ -10,4 +10,6 @@ class SChapterImpl : SChapter {
override var chapter_number: Float = -1f
override var scanlator: String? = null
}

View File

@ -13,6 +13,7 @@ import okhttp3.Request
import okhttp3.Response
import rx.Observable
import uy.kohesive.injekt.injectLazy
import java.lang.Exception
import java.net.URI
import java.net.URISyntaxException
import java.security.MessageDigest
@ -51,7 +52,7 @@ abstract class HttpSource : CatalogueSource {
override val id by lazy {
val key = "${name.toLowerCase()}/$lang/$versionId"
val bytes = MessageDigest.getInstance("MD5").digest(key.toByteArray())
(0..7).map { bytes[it].toLong() and 0xff shl 8*(7-it) }.reduce(Long::or) and Long.MAX_VALUE
(0..7).map { bytes[it].toLong() and 0xff shl 8 * (7 - it) }.reduce(Long::or) and Long.MAX_VALUE
}
/**
@ -197,16 +198,20 @@ abstract class HttpSource : CatalogueSource {
/**
* Returns an observable with the updated chapter list for a manga. Normally it's not needed to
* override this method.
* override this method. If a manga is licensed an empty chapter list observable is returned
*
* @param manga the manga to look for chapters.
*/
override fun fetchChapterList(manga: SManga): Observable<List<SChapter>> {
return client.newCall(chapterListRequest(manga))
.asObservableSuccess()
.map { response ->
chapterListParse(response)
}
if (manga.status != SManga.LICENSED) {
return client.newCall(chapterListRequest(manga))
.asObservableSuccess()
.map { response ->
chapterListParse(response)
}
} else {
return Observable.error(Exception("Licensed - No chapters to show"))
}
}
/**

View File

@ -69,7 +69,7 @@ class Batoto : ParsedHttpSource(), LoginSource {
override fun popularMangaFromElement(element: Element): SManga {
val manga = SManga.create()
element.select("a[href^=$baseUrl]").first().let {
element.select("a[href*=bato.to]").first().let {
manga.setUrlWithoutDomain(it.attr("href"))
manga.title = it.text().trim()
}
@ -189,7 +189,7 @@ class Batoto : ParsedHttpSource(), LoginSource {
override fun chapterListSelector() = "tr.row.lang_English.chapter_row"
override fun chapterFromElement(element: Element): SChapter {
val urlElement = element.select("a[href^=$baseUrl/reader").first()
val urlElement = element.select("a[href*=bato.to/reader").first()
val chapter = SChapter.create()
chapter.setUrlWithoutDomain(urlElement.attr("href"))
@ -197,6 +197,7 @@ class Batoto : ParsedHttpSource(), LoginSource {
chapter.date_upload = element.select("td").getOrNull(4)?.let {
parseDateFromElement(it)
} ?: 0
chapter.scanlator = element.select("td").getOrNull(2)?.text()
return chapter
}

View File

@ -61,7 +61,7 @@ class Mangafox : ParsedHttpSource() {
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 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")
@ -113,7 +113,7 @@ class Mangafox : ParsedHttpSource() {
val chapter = SChapter.create()
chapter.setUrlWithoutDomain(urlElement.attr("href"))
chapter.name = urlElement.text()
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
}
@ -169,6 +169,7 @@ class Mangafox : ParsedHttpSource() {
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<Genre>) : Filter.Group<Genre>("Genres", genres)
override fun getFilterList() = FilterList(

View File

@ -1,8 +1,10 @@
package eu.kanade.tachiyomi.ui.base.controller
import android.os.Bundle
import android.support.v4.view.MenuItemCompat
import android.support.v7.app.AppCompatActivity
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import com.bluelinelabs.conductor.ControllerChangeHandler
@ -44,4 +46,23 @@ abstract class BaseController(bundle: Bundle? = null) : RestoreViewOnCreateContr
(activity as? AppCompatActivity)?.supportActionBar?.title = getTitle()
}
/**
* Workaround for disappearing menu items when collapsing an expandable item like a SearchView.
* This method should be removed when fixed upstream.
* Issue link: https://issuetracker.google.com/issues/37657375
*/
fun MenuItem.fixExpand() {
val expandListener = object : MenuItemCompat.OnActionExpandListener {
override fun onMenuItemActionExpand(item: MenuItem): Boolean {
return true
}
override fun onMenuItemActionCollapse(item: MenuItem): Boolean {
activity?.invalidateOptionsMenu()
return true
}
}
MenuItemCompat.setOnActionExpandListener(this, expandListener)
}
}

View File

@ -1,5 +1,9 @@
package eu.kanade.tachiyomi.ui.base.controller
import android.content.pm.PackageManager.PERMISSION_GRANTED
import android.os.Build
import android.support.v4.content.ContextCompat
import com.bluelinelabs.conductor.Controller
import com.bluelinelabs.conductor.Router
fun Router.popControllerWithTag(tag: String): Boolean {
@ -9,4 +13,15 @@ fun Router.popControllerWithTag(tag: String): Boolean {
return true
}
return false
}
fun Controller.requestPermissionsSafe(permissions: Array<String>, requestCode: Int) {
val activity = activity ?: return
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
permissions.forEach { permission ->
if (ContextCompat.checkSelfPermission(activity, permission) != PERMISSION_GRANTED) {
requestPermissions(arrayOf(permission), requestCode)
}
}
}
}

View File

@ -10,7 +10,6 @@ public class NucleusConductorDelegate<P extends Presenter> {
@Nullable private P presenter;
@Nullable private Bundle bundle;
private boolean presenterHasView = false;
private PresenterFactory<P> factory;
@ -22,8 +21,8 @@ public class NucleusConductorDelegate<P extends Presenter> {
if (presenter == null) {
presenter = factory.createPresenter();
presenter.create(bundle);
bundle = null;
}
bundle = null;
return presenter;
}
@ -37,31 +36,26 @@ public class NucleusConductorDelegate<P extends Presenter> {
}
void onRestoreInstanceState(Bundle presenterState) {
if (presenter != null)
throw new IllegalArgumentException("onRestoreInstanceState() should be called before onResume()");
bundle = presenterState;
}
void onTakeView(Object view) {
getPresenter();
if (presenter != null && !presenterHasView) {
if (presenter != null) {
//noinspection unchecked
presenter.takeView(view);
presenterHasView = true;
}
}
void onDropView() {
if (presenter != null && presenterHasView) {
if (presenter != null) {
presenter.dropView();
presenterHasView = false;
}
}
void onDestroy() {
if (presenter != null) {
presenter.destroy();
presenter = null;
}
}
}

View File

@ -187,10 +187,7 @@ open class CatalogueController(bundle: Bundle? = null) :
}
navView.setFilters(presenter.filterItems)
navView.post {
if (isAttached && !drawer.isDrawerOpen(navView))
drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, navView)
}
drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, Gravity.END)
navView.onSearchClicked = {
val allDefault = presenter.sourceFilters == presenter.source.getFilterList()
@ -228,6 +225,7 @@ open class CatalogueController(bundle: Bundle? = null) :
val recycler = if (presenter.isListMode) {
RecyclerView(view.context).apply {
id = R.id.recycler
layoutManager = LinearLayoutManager(context)
addItemDecoration(DividerItemDecoration(context, DividerItemDecoration.VERTICAL))
}
@ -333,6 +331,11 @@ open class CatalogueController(bundle: Bundle? = null) :
if (query == newQuery)
return
// FIXME dirty fix to restore the toolbar buttons after closing search mode.
if (newQuery == "") {
activity?.invalidateOptionsMenu()
}
showProgressBar()
adapter?.clear()

View File

@ -6,6 +6,7 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy
import eu.davidea.flexibleadapter.FlexibleAdapter
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.util.getResourceColor
import jp.wasabeef.glide.transformations.CropCircleTransformation
import kotlinx.android.synthetic.main.catalogue_list_item.view.*
/**
@ -42,6 +43,7 @@ class CatalogueListHolder(private val view: View, adapter: FlexibleAdapter<*>) :
.load(manga)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.centerCrop()
.bitmapTransform(CropCircleTransformation(view.context))
.dontAnimate()
.skipMemoryCache(true)
.placeholder(android.R.color.transparent)

View File

@ -83,7 +83,7 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att
// Disable swipe refresh when view is not at the top
val firstPos = (recycler.layoutManager as LinearLayoutManager)
.findFirstCompletelyVisibleItemPosition()
swipe_refresh.isEnabled = firstPos == 0
swipe_refresh.isEnabled = firstPos <= 0
}
})

View File

@ -36,8 +36,8 @@ import eu.kanade.tachiyomi.ui.manga.MangaController
import eu.kanade.tachiyomi.util.inflate
import eu.kanade.tachiyomi.util.toast
import eu.kanade.tachiyomi.widget.DrawerSwipeCloseListener
import kotlinx.android.synthetic.main.main_activity.*
import kotlinx.android.synthetic.main.library_controller.view.*
import kotlinx.android.synthetic.main.main_activity.*
import rx.Subscription
import timber.log.Timber
import uy.kohesive.injekt.Injekt
@ -189,11 +189,7 @@ class LibraryController(
drawer.addDrawerListener(it)
}
navView = view
navView?.post {
if (isAttached && drawer.isDrawerOpen(navView))
drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, navView)
}
drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, Gravity.END)
navView?.onGroupClicked = { group ->
when (group) {
@ -346,6 +342,8 @@ class LibraryController(
query = it.toString()
searchRelay.call(query)
}
searchItem.fixExpand()
}
override fun onPrepareOptionsMenu(menu: Menu) {

View File

@ -5,6 +5,7 @@ import com.bumptech.glide.Glide
import com.bumptech.glide.load.engine.DiskCacheStrategy
import eu.davidea.flexibleadapter.FlexibleAdapter
import eu.kanade.tachiyomi.data.database.models.Manga
import jp.wasabeef.glide.transformations.CropCircleTransformation
import kotlinx.android.synthetic.main.catalogue_list_item.view.*
/**
@ -50,6 +51,7 @@ class LibraryListHolder(
.load(manga)
.diskCacheStrategy(DiskCacheStrategy.RESULT)
.centerCrop()
.bitmapTransform(CropCircleTransformation(itemView.context))
.dontAnimate()
.into(itemView.thumbnail)
}

View File

@ -74,7 +74,9 @@ class LibraryNavigationView @JvmOverloads constructor(context: Context, attrs: A
private val unread = Item.CheckboxGroup(R.string.action_filter_unread, this)
override val items = listOf(downloaded, unread)
private val completed = Item.CheckboxGroup(R.string.completed, this)
override val items = listOf(downloaded, unread, completed)
override val header = Item.Header(R.string.action_filter)
@ -83,6 +85,7 @@ class LibraryNavigationView @JvmOverloads constructor(context: Context, attrs: A
override fun initModels() {
downloaded.checked = preferences.filterDownloaded().getOrDefault()
unread.checked = preferences.filterUnread().getOrDefault()
completed.checked = preferences.filterCompleted().getOrDefault()
}
override fun onItemClicked(item: Item) {
@ -91,6 +94,7 @@ class LibraryNavigationView @JvmOverloads constructor(context: Context, attrs: A
when (item) {
downloaded -> preferences.filterDownloaded().set(item.checked)
unread -> preferences.filterUnread().set(item.checked)
completed -> preferences.filterCompleted().set(item.checked)
}
adapter.notifyItemChanged(item)

View File

@ -14,6 +14,7 @@ import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.preference.getOrDefault
import eu.kanade.tachiyomi.source.LocalSource
import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.HttpSource
import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter
import eu.kanade.tachiyomi.util.combineLatest
@ -101,6 +102,8 @@ class LibraryPresenter(
val filterUnread = preferences.filterUnread().getOrDefault()
val filterCompleted = preferences.filterCompleted().getOrDefault()
val filterFn: (Manga) -> Boolean = f@ { manga ->
// Filter out manga without source.
val source = sourceManager.get(manga.source) ?: return@f false
@ -110,6 +113,10 @@ class LibraryPresenter(
return@f false
}
if (filterCompleted && manga.status != SManga.COMPLETED) {
return@f false
}
// Filter when the download directory doesn't exist or is null.
if (filterDownloaded) {
// Get the directories for the source of the manga.

View File

@ -26,6 +26,7 @@ import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.ui.base.controller.RouterPagerAdapter
import eu.kanade.tachiyomi.ui.base.controller.RxController
import eu.kanade.tachiyomi.ui.base.controller.TabbedController
import eu.kanade.tachiyomi.ui.base.controller.requestPermissionsSafe
import eu.kanade.tachiyomi.ui.manga.chapter.ChaptersController
import eu.kanade.tachiyomi.ui.manga.info.MangaInfoController
import eu.kanade.tachiyomi.ui.manga.track.TrackController
@ -85,9 +86,7 @@ class MangaController : RxController, TabbedController {
if (manga == null || source == null) return
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(arrayOf(WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE), 301)
}
requestPermissionsSafe(arrayOf(WRITE_EXTERNAL_STORAGE), 301)
with(view) {
adapter = MangaDetailAdapter()

View File

@ -6,6 +6,9 @@ import eu.davidea.viewholders.FlexibleViewHolder
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.download.model.Download
import eu.kanade.tachiyomi.util.getResourceColor
import eu.kanade.tachiyomi.util.gone
import eu.kanade.tachiyomi.util.setVectorCompat
import kotlinx.android.synthetic.main.chapters_item.view.*
import java.util.*
@ -32,6 +35,9 @@ class ChapterHolder(
else -> chapter.name
}
// Set the correct drawable for dropdown and update the tint to match theme.
view.chapter_menu.setVectorCompat(R.drawable.ic_more_horiz_black_24dp, view.context.getResourceColor(R.attr.icon_color))
// Set correct text color
chapter_title.setTextColor(if (chapter.read) adapter.readColor else adapter.unreadColor)
if (chapter.bookmark) chapter_title.setTextColor(adapter.bookmarkedColor)
@ -43,6 +49,16 @@ class ChapterHolder(
chapter_date.text = ""
}
//add scanlator if exists
chapter_scanlator.text = chapter.scanlator
//allow longer titles if there is no scanlator (most sources)
if (chapter_scanlator.text.isNullOrBlank()) {
chapter_title.setMaxLines(2)
chapter_scanlator.gone()
} else {
chapter_title.setMaxLines(1)
}
chapter_pages.text = if (!chapter.read && chapter.last_page_read > 0) {
context.getString(R.string.chapter_progress, chapter.last_page_read + 1)
} else {

View File

@ -27,10 +27,7 @@ import eu.kanade.tachiyomi.ui.reader.viewer.pager.horizontal.LeftToRightReader
import eu.kanade.tachiyomi.ui.reader.viewer.pager.horizontal.RightToLeftReader
import eu.kanade.tachiyomi.ui.reader.viewer.pager.vertical.VerticalReader
import eu.kanade.tachiyomi.ui.reader.viewer.webtoon.WebtoonReader
import eu.kanade.tachiyomi.util.GLUtil
import eu.kanade.tachiyomi.util.SharedData
import eu.kanade.tachiyomi.util.plusAssign
import eu.kanade.tachiyomi.util.toast
import eu.kanade.tachiyomi.util.*
import eu.kanade.tachiyomi.widget.SimpleAnimationListener
import eu.kanade.tachiyomi.widget.SimpleSeekBarListener
import kotlinx.android.synthetic.main.reader_activity.*
@ -42,6 +39,7 @@ import rx.android.schedulers.AndroidSchedulers
import rx.subscriptions.CompositeSubscription
import timber.log.Timber
import uy.kohesive.injekt.injectLazy
import java.io.File
import java.text.DecimalFormat
import java.util.concurrent.TimeUnit
@ -572,8 +570,12 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() {
if (page.status != Page.READY)
return
var uri = page.uri ?: return
if (uri.toString().startsWith("file://")) {
uri = File(uri.toString().substringAfter("file://")).getUriCompat(this)
}
val intent = Intent(Intent.ACTION_SEND).apply {
putExtra(Intent.EXTRA_STREAM, page.uri)
putExtra(Intent.EXTRA_STREAM, uri)
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_GRANT_READ_URI_PERMISSION
type = "image/*"
}

View File

@ -327,9 +327,10 @@ class ReaderPresenter(
fun retryPage(page: Page?) {
if (page != null && source is HttpSource) {
page.status = Page.QUEUE
val uri = page.uri
if (uri != null && !page.chapter.isDownloaded) {
chapterCache.removeFileFromCache(uri.encodedPath.substringAfterLast('/'))
val imageUrl = page.imageUrl
if (imageUrl != null && !page.chapter.isDownloaded) {
val key = DiskUtil.hashKeyForDisk(page.url)
chapterCache.removeFileFromCache(key)
}
loader.retryPage(page)
}

View File

@ -63,6 +63,7 @@ class WebtoonHolder(private val view: View, private val adapter: WebtoonAdapter)
setMinimumTileDpi(180)
setRegionDecoderClass(webtoonReader.regionDecoderClass)
setBitmapDecoderClass(webtoonReader.bitmapDecoderClass)
setCropBorders(webtoonReader.cropBorders)
setVerticalScrollingParent(true)
setOnTouchListener(adapter.touchListener)
setOnLongClickListener { webtoonReader.onLongClick(page) }

View File

@ -53,6 +53,12 @@ class WebtoonReader : BaseReader() {
lateinit var layoutManager: PreCachingLayoutManager
private set
/**
* Whether to crop image borders.
*/
var cropBorders: Boolean = false
private set
/**
* Gesture detector for image touch events.
*/
@ -109,16 +115,24 @@ class WebtoonReader : BaseReader() {
.doOnNext { setDecoderClass(it) }
.skip(1)
.distinctUntilChanged()
.subscribe {
val activePage = layoutManager.findFirstVisibleItemPosition()
recycler.adapter = adapter
setActivePage(activePage)
})
.subscribe { refreshAdapter() })
subscriptions.add(readerActivity.preferences.cropBorders()
.asObservable()
.doOnNext { cropBorders = it }
.skip(1)
.distinctUntilChanged()
.subscribe { refreshAdapter() })
setPagesOnAdapter()
return recycler
}
fun refreshAdapter() {
val activePage = layoutManager.findFirstVisibleItemPosition()
recycler.adapter = adapter
setActivePage(activePage)
}
/**
* Uses two ways to scroll to the last page read.

View File

@ -8,6 +8,7 @@ import eu.davidea.viewholders.FlexibleViewHolder
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.download.model.Download
import eu.kanade.tachiyomi.util.getResourceColor
import eu.kanade.tachiyomi.util.setVectorCompat
import jp.wasabeef.glide.transformations.CropCircleTransformation
import kotlinx.android.synthetic.main.recent_chapters_item.view.*
@ -63,6 +64,9 @@ class RecentChapterHolder(private val view: View, private val adapter: RecentCha
// Set manga title
view.manga_title.text = item.manga.title
// Set the correct drawable for dropdown and update the tint to match theme.
view.chapter_menu_icon.setVectorCompat(R.drawable.ic_more_horiz_black_24dp, view.context.getResourceColor(R.attr.icon_color))
// Set cover
Glide.clear(itemView.manga_cover)
if (!item.manga.thumbnail_url.isNullOrEmpty()) {

View File

@ -81,7 +81,7 @@ class RecentChaptersController : NucleusController<RecentChaptersPresenter>(),
recycler.scrollStateChanges().subscribeUntilDestroy {
// Disable swipe refresh when view is not at the top
val firstPos = layoutManager.findFirstCompletelyVisibleItemPosition()
swipe_refresh.isEnabled = firstPos == 0
swipe_refresh.isEnabled = firstPos <= 0
}
swipe_refresh.setDistanceToTriggerSync((2 * 64 * resources.displayMetrics.density).toInt())

View File

@ -22,6 +22,9 @@ import java.text.ParseException
import java.text.SimpleDateFormat
import java.util.*
import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys
import android.content.Intent
import android.net.Uri
class SettingsAboutController : SettingsController() {
@ -66,6 +69,15 @@ class SettingsAboutController : SettingsController() {
isVisible = false
}
}
preference {
title = "Discord"
val url = "https://discord.gg/WrBkRk4"
summary = url
onClick {
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
startActivity(intent)
}
}
preference {
titleRes = R.string.version
summary = if (BuildConfig.DEBUG)

View File

@ -26,6 +26,7 @@ import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.preference.getOrDefault
import eu.kanade.tachiyomi.ui.base.controller.DialogController
import eu.kanade.tachiyomi.ui.base.controller.popControllerWithTag
import eu.kanade.tachiyomi.ui.base.controller.requestPermissionsSafe
import eu.kanade.tachiyomi.util.getUriCompat
import eu.kanade.tachiyomi.util.registerLocalReceiver
import eu.kanade.tachiyomi.util.toast
@ -52,9 +53,7 @@ class SettingsBackupController : SettingsController() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(arrayOf(WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE), 500)
}
requestPermissionsSafe(arrayOf(WRITE_EXTERNAL_STORAGE), 500)
}
override fun onDestroy() {

View File

@ -29,8 +29,8 @@ class SettingsGeneralController : SettingsController() {
listPreference {
key = Keys.lang
titleRes = R.string.pref_language
entryValues = arrayOf("", "bg", "en", "es", "fr", "it", "lv", "nl", "pt", "pt-BR", "ru",
"vi")
entryValues = arrayOf("", "bg", "de", "en", "es", "fr", "it", "lv", "nl", "pl", "pt",
"pt-BR", "ru", "vi")
entries = entryValues.map { value ->
val locale = LocaleHelper.getLocaleFromString(value.toString())
locale?.getDisplayName(locale)?.capitalize() ?:

View File

@ -29,7 +29,7 @@ object ChapterRecognition {
* Regex used to remove unwanted tags
* Example Prison School 12 v.1 vol004 version1243 volume64 -R> Prison School 12
*/
private val unwanted = Regex("""(?:(v|ver|vol|version|volume|season|s).?[0-9]+)""")
private val unwanted = Regex("""(?<![a-z])(v|ver|vol|version|volume|season|s).?[0-9]+""")
/**
* Regex used to remove unwanted whitespace

View File

@ -20,7 +20,7 @@ import java.util.*
fun syncChaptersWithSource(db: DatabaseHelper,
rawSourceChapters: List<SChapter>,
manga: Manga,
source: Source) : Pair<List<Chapter>, List<Chapter>> {
source: Source): Pair<List<Chapter>, List<Chapter>> {
if (rawSourceChapters.isEmpty()) {
throw Exception("No chapters found")
@ -38,7 +38,26 @@ fun syncChaptersWithSource(db: DatabaseHelper,
}
// Chapters from the source not in db.
val toAdd = sourceChapters.filterNot { it in dbChapters }
val toAdd = mutableListOf<Chapter>()
// Chapters whose metadata have changed.
val toChange = mutableListOf<Chapter>()
for (sourceChapter in sourceChapters) {
val dbChapter = dbChapters.find { it.url == sourceChapter.url }
// Add the chapter if not in db already, or update if the metadata changed.
if (dbChapter == null) {
toAdd.add(sourceChapter)
} else if (dbChapter.scanlator != sourceChapter.scanlator ||
dbChapter.name != sourceChapter.name) {
dbChapter.scanlator = sourceChapter.scanlator
dbChapter.name = sourceChapter.name
toChange.add(dbChapter)
}
}
// Recognize number for new chapters.
toAdd.forEach {
@ -49,10 +68,14 @@ fun syncChaptersWithSource(db: DatabaseHelper,
}
// Chapters from the db not in the source.
val toDelete = dbChapters.filterNot { it in sourceChapters }
val toDelete = dbChapters.filterNot { dbChapter ->
sourceChapters.any { sourceChapter ->
dbChapter.url == sourceChapter.url
}
}
// Return if there's nothing to add or delete, avoiding unnecessary db transactions.
if (toAdd.isEmpty() && toDelete.isEmpty()) {
// Return if there's nothing to add, delete or change, avoiding unnecessary db transactions.
if (toAdd.isEmpty() && toDelete.isEmpty() && toChange.isEmpty()) {
return Pair(emptyList(), emptyList())
}
@ -90,8 +113,13 @@ fun syncChaptersWithSource(db: DatabaseHelper,
db.insertChapters(toAdd).executeAsBlocking()
}
if (!toChange.isEmpty()) {
db.insertChapters(toChange).executeAsBlocking()
}
// Fix order in source.
db.fixChaptersSourceOrder(sourceChapters).executeAsBlocking()
}
return Pair(toAdd.subtract(readded).toList(), toDelete.subtract(readded).toList())
}

View File

@ -6,7 +6,7 @@
android:layout_height="@dimen/material_component_lists_single_line_with_avatar_height"
android:background="?attr/selectable_list_drawable">
<de.hdodenhof.circleimageview.CircleImageView
<ImageView
android:id="@+id/thumbnail"
android:layout_width="@dimen/material_component_lists_single_line_with_avatar_height"
android:layout_height="@dimen/material_component_lists_single_line_with_avatar_height"

View File

@ -1,100 +1,85 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:background="?attr/selectable_list_drawable">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
android:paddingRight="?android:attr/listPreferredItemPaddingRight"
android:paddingStart="?android:attr/listPreferredItemPaddingStart">
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:background="?attr/selectable_list_drawable">
<RelativeLayout
android:id="@+id/relativeLayout"
android:layout_width="fill_parent"
android:layout_height="18dp"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true">
<TextView
android:id="@+id/chapter_title"
style="@style/TextAppearance.Regular.Body1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="1"
tools:text="Title"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintRight_toLeftOf="@+id/chapter_menu"
android:layout_marginTop="12dp"
android:layout_marginLeft="16dp"/>
<TextView
android:id="@+id/chapter_pages"
style="@style/TextAppearance.Regular.Caption.Hint"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:ellipsize="marquee"
android:singleLine="true"
tools:text="Pages: 45"/>
<TextView
android:id="@+id/chapter_scanlator"
style="@style/TextAppearance.Regular.Caption.Hint"
android:layout_width="0dp"
android:layout_height="wrap_content"
tools:text="Scanlator"
android:maxLines="1"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/chapter_title"
app:layout_constraintBottom_toTopOf="@+id/chapter_date"
app:layout_constraintRight_toLeftOf="@+id/chapter_menu"
android:layout_marginLeft="16dp"/>
<TextView
android:id="@+id/chapter_date"
style="@style/TextAppearance.Regular.Caption"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:ellipsize="marquee"
android:singleLine="true"
tools:text="22/02/2016"/>
<TextView
android:id="@+id/chapter_date"
style="@style/TextAppearance.Regular.Caption"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="22/02/2016"
android:ellipsize="marquee"
android:maxLines="1"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginLeft="16dp"/>
<TextView
android:id="@+id/download_text"
style="@style/TextAppearance.Regular.Caption.Hint"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:textAllCaps="true"/>
</RelativeLayout>
<TextView
android:id="@+id/chapter_pages"
style="@style/TextAppearance.Regular.Caption.Hint"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="Pages: 45"
android:ellipsize="marquee"
android:maxLines="1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintLeft_toLeftOf="parent"/>
<TextView
android:id="@+id/chapter_title"
style="@style/TextAppearance.Regular.Body1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/relativeLayout"
android:layout_alignParentEnd="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_alignWithParentIfMissing="true"
android:layout_marginRight="30dp"
android:ellipsize="middle"
android:gravity="center_vertical"
android:maxLines="2"
tools:text="Title"/>
</RelativeLayout>
<RelativeLayout
<ImageView
android:id="@+id/chapter_menu"
android:layout_width="50dp"
android:layout_height="fill_parent"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:gravity="center|end"
android:paddingBottom="18dp"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:paddingRight="?android:attr/listPreferredItemPaddingRight">
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_more_horiz_black_24dp"
app:layout_constraintRight_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:paddingStart="12dp"
android:paddingEnd="12dp"
android:paddingBottom="12dp"
android:paddingTop="12dp"
android:contentDescription="@string/description_cover"/>
<android.support.v7.widget.AppCompatImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_alignParentEnd="false"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:tint="?android:attr/textColorPrimary"
app:srcCompat="@drawable/ic_more_horiz_black_24dp"/>
<TextView
android:id="@+id/download_text"
style="@style/TextAppearance.Regular.Caption.Hint"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="DOWNLOADED"
android:textAllCaps="true"
app:layout_constraintRight_toLeftOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginRight="16dp"/>
</RelativeLayout>
</RelativeLayout>
</android.support.constraint.ConstraintLayout>

View File

@ -76,12 +76,12 @@
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/chapter_menu_icon"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center|end"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
app:srcCompat="@drawable/ic_more_horiz_black_24dp" />
android:layout_marginRight="16dp" />
</FrameLayout>

View File

@ -1,5 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<changelog bulletedList="true">
<changelogversion versionName="v0.6.3" changeDate="">
<changelogtext>Fixed a crash when retrying a page.</changelogtext>
<changelogtext>Fixed a crash when sharing an image.</changelogtext>
<changelogtext>Fixed disappearing toolbar buttons in the catalog after a search.</changelogtext>
</changelogversion>
<changelogversion versionName="v0.6.2" changeDate="">
<changelogtext>Added a new completed manga filter for the library.</changelogtext>
<changelogtext>Added scanlator to chapters (if supported by source).</changelogtext>
<changelogtext>Added Discord server link.</changelogtext>
<changelogtext>Added new translations.</changelogtext>
<changelogtext>Extensions shouldn't crash the app anymore.</changelogtext>
<changelogtext>Crop borders is supported in webtoon reader and fixed in Android O.</changelogtext>
<changelogtext>Fixed a bug where storage permissions were always requested.</changelogtext>
<changelogtext>Minor UI and crash fixes.</changelogtext>
</changelogversion>
<changelogversion versionName="v0.6.1" changeDate="">
<changelogtext>Bugfix release.</changelogtext>
</changelogversion>
<changelogversion versionName="v0.6.0" changeDate="">
<changelogtext>Added sorting by total chapters.</changelogtext>

View File

@ -0,0 +1,401 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources><string name="name">Name</string>
<string name="categories">Kategorien</string>
<string name="manga">Manga</string>
<string name="chapters">Kapitel</string>
<string name="history">Verlauf</string>
<string name="label_settings">Einstellungen</string>
<string name="label_download_queue">Download Warteschlange</string>
<string name="label_library">Meine Bibliothek</string>
<string name="label_recent_manga">Kürzlich gelesen</string>
<string name="label_catalogues">Alle Mangas</string>
<string name="label_latest_updates">neuste Updated</string>
<string name="label_categories">Kategorie</string>
<string name="label_selected">Ausgewählt: %1$d</string>
<string name="label_backup">Backup</string>
<string name="action_settings">Einstellungen</string>
<string name="action_filter">Filter</string>
<string name="action_filter_downloaded">Heruntergeladen</string>
<string name="action_filter_bookmarked">Lesezeichen</string>
<string name="action_filter_unread">ungelesen</string>
<string name="action_filter_read">gelesen</string>
<string name="action_filter_empty">lösche Filter</string>
<string name="action_sort_alpha">Alphabetisch</string>
<string name="action_sort_total">Kapitel Anzahl</string>
<string name="action_sort_last_read">zuletzt gelesen</string>
<string name="action_sort_last_updated">letzes Update</string>
<string name="action_search">Suche</string>
<string name="action_select_all">Alle auswählen</string>
<string name="action_mark_as_read">Als gelesen markieren</string>
<string name="action_mark_as_unread">Als ungelesen markieren</string>
<string name="action_mark_previous_as_read">voherige Kapitel als gelesen markieren</string>
<string name="action_download">Herunterladen</string>
<string name="action_bookmark">Lessezeichen hinzufügen</string>
<string name="action_remove_bookmark">Entferne Lesezeichen</string>
<string name="action_delete">Löschen</string>
<string name="action_update">Update</string>
<string name="action_update_library">Bibliothek updaten</string>
<string name="action_edit">Bearbeiten</string>
<string name="action_add">Hinzufügen</string>
<string name="action_add_category">Füge eine Kategorie hinzu</string>
<string name="action_edit_categories">Kategorien bearbeiten</string>
<string name="action_rename_category">Kategorie umbenennen</string>
<string name="action_move_category">zur Kategorie hinzufügen</string>
<string name="action_edit_cover">ändere Cover</string>
<string name="action_sort_up">aufsteigend Sortieren</string>
<string name="action_sort_down">absteigend Sortieren</string>
<string name="action_show_unread">Ungelesen</string>
<string name="action_show_downloaded">Heruntergeladen</string>
<string name="action_next_unread">nächstes ungelesenes</string>
<string name="action_start">Start</string>
<string name="action_stop">Stop</string>
<string name="action_pause">Pause</string>
<string name="action_clear">Löschen</string>
<string name="action_close">Schließen</string>
<string name="action_previous_chapter">vorheriges Kapitel</string>
<string name="action_next_chapter">nächstes Kapitel</string>
<string name="action_retry">erneut Versuchen</string>
<string name="action_remove">Entfernen</string>
<string name="action_resume">Fortfahren</string>
<string name="action_move">verschieben</string>
<string name="action_open_in_browser">Öffne im Browser</string>
<string name="action_add_to_home_screen">zum Startbildschrim hinzufügen</string>
<string name="action_display_mode">ändere Anzeigemodus</string>
<string name="action_display">Anzeige</string>
<string name="action_display_grid">Kacheln</string>
<string name="action_display_list">Liste</string>
<string name="action_set_filter">setze Filter</string>
<string name="action_cancel">Abbrechen</string>
<string name="action_sort">Sortierung</string>
<string name="action_install">Installiere</string>
<string name="action_share">Teilen</string>
<string name="action_save">Speichern</string>
<string name="action_reset">Zurücksetzen</string>
<string name="action_undo">Rückgängig</string>
<string name="action_export">Exportieren</string>
<string name="action_open_log">Öffne Log</string>
<string name="action_create">Erstellen</string>
<string name="action_restore">Wiederherstellen</string>
<string name="deleting">Löschen…</string>
<string name="loading">Laden…</string>
<string name="app_not_available">App nicht verfügbar</string>
<string name="short_recent_updates">Updates</string>
<string name="pref_category_general">Allgemein</string>
<string name="pref_category_reader">Leseeinstellungen</string>
<string name="pref_category_downloads">Herunterladen</string>
<string name="pref_category_sources">Quellen</string>
<string name="pref_category_tracking">Synchronisation</string>
<string name="pref_category_advanced">Erweitert</string>
<string name="pref_category_about">Über</string>
<string name="pref_library_columns">Mangas per Reihe in Bibliothek</string>
<string name="portrait">Hochformat</string>
<string name="landscape">Querformat</string>
<string name="default_columns">Standard</string>
<string name="pref_library_update_interval">Bibliothek Update häufigkeit</string>
<string name="update_never">Manuell</string>
<string name="update_1hour">stündlich</string>
<string name="update_2hour">aller 2 Stunden</string>
<string name="update_3hour">aller 3 Stunden</string>
<string name="update_6hour">aller 6 Stunden</string>
<string name="update_12hour">aller 12 Stunden</string>
<string name="update_24hour">täglich</string>
<string name="update_48hour">alle 2 Tage</string>
<string name="update_weekly">wöchentlich</string>
<string name="update_monthly">monatlich</string>
<string name="pref_library_update_categories">Kategorien fürs globale Update</string>
<string name="all">Alle</string>
<string name="pref_library_update_restriction">Bibliothek Updates einschränken</string>
<string name="pref_library_update_restriction_summary">Update nur wenn folgende Bedingungen eintreffen</string>
<string name="wifi">Wi-Fi</string>
<string name="charging">ist am aufladen</string>
<string name="pref_update_only_non_completed">nur laufende Mangas updaten</string>
<string name="pref_auto_update_manga_sync">Synchronisiere Kapitel nach dem Lesen</string>
<string name="pref_ask_update_manga_sync">Bestätigen vor Update</string>
<string name="pref_theme">App Design</string>
<string name="light_theme">Hauptdesign</string>
<string name="dark_theme">dunkles Design</string>
<string name="amoled_theme">AMOLED Design</string>
<string name="pref_start_screen">Startbildschirm</string>
<string name="pref_language">Sprache</string>
<string name="system_default">Systemstandard</string>
<string name="default_category">Standard Kategorie</string>
<string name="default_category_summary">immer Fragen</string>
<string name="pref_fullscreen">Vollbild</string>
<string name="pref_lock_orientation">Bildschirm nicht drehen</string>
<string name="pref_page_transitions">Seitenübergänge</string>
<string name="pref_show_page_number">zeige Seitennummer</string>
<string name="pref_crop_borders">Ränder abschneiden</string>
<string name="pref_custom_brightness">eigene Helligkeit festlegen</string>
<string name="pref_custom_color_filter">nutze eigenen Farbfilter</string>
<string name="pref_keep_screen_on">Bildschirm anlassen</string>
<string name="pref_reader_navigation">Navigation</string>
<string name="pref_read_with_volume_keys">Lautstärketasten</string>
<string name="pref_read_with_volume_keys_inverted">Lautstärketasten invertieren</string>
<string name="pref_read_with_tapping">Tippen</string>
<string name="pref_reader_theme">Hintergrundfarbe</string>
<string name="white_background">Weiß</string>
<string name="black_background">Schwarz</string>
<string name="pref_viewer_type">Standard Leserichtung</string>
<string name="default_viewer">Standard</string>
<string name="left_to_right_viewer">links nach rechts</string>
<string name="right_to_left_viewer">rechts nach links</string>
<string name="vertical_viewer">Vertikal</string>
<string name="webtoon_viewer">Webtoon</string>
<string name="pref_image_decoder">Bilddecoder</string>
<string name="pref_image_scale_type">Skalierung</string>
<string name="scale_type_fit_screen">Bild ausfüllen</string>
<string name="scale_type_stretch">Strecken</string>
<string name="scale_type_fit_width">Horizontal ausfüllen</string>
<string name="scale_type_fit_height">Vertical ausfüllen</string>
<string name="scale_type_original_size">Orginalgröße</string>
<string name="scale_type_smart_fit">Smartes ausfüllen</string>
<string name="pref_zoom_start">Zoom Anfangsposition</string>
<string name="zoom_start_automatic">Automatisch</string>
<string name="zoom_start_left">Links</string>
<string name="zoom_start_right">Rechts</string>
<string name="zoom_start_center">Mitte</string>
<string name="pref_rotation_type">Ausrichtung</string>
<string name="rotation_free">Frei</string>
<string name="rotation_lock">Gesperrt</string>
<string name="rotation_force_portrait">erzwinge Hochformat</string>
<string name="rotation_force_landscape">erzwinge Querformat</string>
<string name="color_filter_r_value">R</string>
<string name="color_filter_g_value">G</string>
<string name="color_filter_b_value">B</string>
<string name="color_filter_a_value">A</string>
<string name="pref_download_directory">Downloadordner</string>
<string name="pref_download_slots">gleichzeitige Downloads</string>
<string name="pref_download_only_over_wifi">Nur über Wi-Fi herunterladen</string>
<string name="pref_remove_after_marked_as_read">Löschen wenn als gelesen markiert</string>
<string name="pref_remove_after_read">nach Lesen löschen</string>
<string name="custom_dir">eigenes Verzeichnis</string>
<string name="disabled">Deaktiviert</string>
<string name="last_read_chapter">zuletzt gelesenes Kapitel</string>
<string name="second_to_last">vorletztes Kapitel</string>
<string name="third_to_last">vorvorletztes Kapitel</string>
<string name="fourth_to_last">die 4 letzten Kapitel</string>
<string name="fifth_to_last">die 5 letzten Kapitel</string>
<string name="pref_download_new">Lade neue Kapitel herunter</string>
<string name="pref_download_new_categories">Kategorien die Heruntergeladen werden sollen</string>
<string name="services">Anbieter</string>
<string name="backup">Backup</string>
<string name="pref_create_backup">erstelle Backup</string>
<string name="pref_create_backup_summ">erstellt ein Backup deiner aktuellen Bibliothek</string>
<string name="pref_restore_backup">Backup wiederherstellen</string>
<string name="pref_restore_backup_summ">Bibliothek mit Hilfe eines Backups wiederherstellen</string>
<string name="pref_backup_directory">Backupordner</string>
<string name="pref_backup_service_category">Service</string>
<string name="pref_backup_interval">Backuphäufigkeit</string>
<string name="pref_backup_slots">maximale Anzahl automatischer Backups</string>
<string name="dialog_restoring_backup">Backup wird wiederhergestellt
%1$s zur Bibliothek hinzugefügt</string>
<string name="source_not_found">Quelle nicht gefunden</string>
<string name="dialog_restoring_source_not_found">Backup wird wiederhergestellt
%1%s Quelle nicht gefunden</string>
<string name="backup_created">Backup erstellt</string>
<string name="restore_completed">Wiederherstellen erfolgreich</string>
<string name="error_opening_log">Log konnte nicht geöffnet werden</string>
<string name="restore_completed_content">Das Wiederherstellen hat %1$s gedauert.
%2$s Fehler gefunden.</string>
<string name="backup_restore_content">Beim wiederhestellen werden Daten von den Quellen abgerufen, möglicherweiße enstehen dadurch Mobilfunkkosten.
Vergewissere dich zudem das du alle benötigen Seitenlogin bereitgestellt hast bevor du mit dem Wiederherstellen beginnst.</string>
<string name="file_saved">Datei in %1$s gespeichert</string>
<string name="backup_choice">Was willst du sichern?</string>
<string name="restoring_backup">Backup wiederherstellen</string>
<string name="creating_backup">Backup erstellen</string>
<string name="pref_clear_chapter_cache">Kapitel Zwischenspeicher leeren</string>
<string name="used_cache">belegt: %1$s</string>
<string name="cache_deleted">Zwischenspeicher gelerrt. %1%d Datein wurden gelöscht</string>
<string name="cache_delete_error">Ein Fehler ist während dem Leeren des Zwischenspeicher aufgetretten</string>
<string name="pref_clear_cookies">Lösche Cookies</string>
<string name="cookies_cleared">Cookies gelöscht</string>
<string name="choices_reset">Standardantworten zurücksetzen</string>
<string name="pref_clear_database">Lösche Datenbank</string>
<string name="pref_clear_database_summary">Lösche alle nicht herundergeladenen Mangas und Kapitel</string>
<string name="clear_database_confirmation">Bist du sicher? Lesestatus aller nicht runtergeladenen Mangas wird gelöscht werden</string>
<string name="clear_database_completed">Einträge gelöscht</string>
<string name="pref_refresh_library_metadata">Erneure Bibliotheks Metadaten</string>
<string name="pref_refresh_library_metadata_summary">Läd neue Cover, Genres, Beschreibungen und andere Manga information herunter</string>
<string name="pref_refresh_library_tracking">Erneuere Synchronisation Metadaten</string>
<string name="pref_refresh_library_tracking_summary">Synchronisiert den Lesestatus, die Berwertung und das zuletz gelesen Kapitel mit dem angemeldeten Synchronisation Anbietern</string>
<string name="version">Version</string>
<string name="build_time">Erstellt am</string>
<string name="pref_enable_automatic_updates">nach Updates suchen</string>
<string name="pref_enable_automatic_updates_summary">Automatisch nach App Updates suchen</string>
<string name="pref_enable_acra">Sende Fehlerberichte</string>
<string name="pref_acra_summary">Hilft Fehler zu beheben. Keine sensiblen Daten werden gesendet</string>
<string name="login_title">Bei %1$s anmelden</string>
<string name="username">Nutzername</string>
<string name="password">Kennwort</string>
<string name="show_password">Zeige Kennwort</string>
<string name="login">Anmelden</string>
<string name="login_success">Anmelden erfolgreich</string>
<string name="invalid_login">Anmeldefehler</string>
<string name="unknown_error">unbekannter Fehler</string>
<string name="library_search_hint">Titel oder Author…</string>
<string name="updating_category">Kategorie Updaten</string>
<string name="confirm_delete_manga">Bist du sicher das du diesen Manga entfernen willst?</string>
<string name="also_delete_chapters">auch die heruntergeladenen Kapitel löschen</string>
<string name="source_requires_login">Bei dieser Quelle musst du dich Anmelden</string>
<string name="select_source">Wähle eine Quelle</string>
<string name="no_valid_sources">Bitte wähle zumindest eine gültige Quelle</string>
<string name="no_more_results">Keine weiteren Ergebnisse</string>
<string name="local_source">Lokale Mangas</string>
<string name="invalid_combination">Standard kann nicht zusammen mit anderen Kategorien gewählt werden</string>
<string name="added_to_library">Der Manga wurde zu deiner Bibliothek hinzugefügt</string>
<string name="manga_not_in_db">Dieser Manga wurde von der Datenbank entfernt!</string>
<string name="manga_detail_tab">Info</string>
<string name="description">Beschreibung</string>
<string name="ongoing">Fortlaufend</string>
<string name="unknown">Unbekannt</string>
<string name="licensed">Lizenziert</string>
<string name="add_to_library">zur Bibliothek hinzufügen</string>
<string name="remove_from_library">aus Bibliothek entfernen</string>
<string name="manga_info_author_label">Author</string>
<string name="manga_info_artist_label">Artist</string>
<string name="manga_info_chapters_label">Kapitel</string>
<string name="manga_info_last_chapter_label">Letztes Kapitel</string>
<string name="manga_info_status_label">Status</string>
<string name="manga_info_source_label">Quelle</string>
<string name="manga_info_genres_label">Genres</string>
<string name="share_text">Vielleicht gefällt dir auch %1$s! von %2$s</string>
<string name="circular_icon">rundes Symbol</string>
<string name="rounded_icon">abgerundetes Symbol</string>
<string name="square_icon">eckiges Symbol</string>
<string name="star_icon">sternförmiges Symbol</string>
<string name="shortcut_title">Shortcut Title</string>
<string name="icon_shape">Symbolform</string>
<string name="icon_creation_fail">konnte kein Shortcut erstellen!</string>
<string name="delete_downloads_for_manga">Lösche runtergeladene Kapitel?</string>
<string name="manga_chapters_tab">Kapitel</string>
<string name="manga_chapter_no_title">kein Titel</string>
<string name="display_mode_chapter">Kapitel %1$s</string>
<string name="chapter_downloaded">Heruntergeladen</string>
<string name="chapter_queued">in Warteschlange</string>
<string name="chapter_downloading">wird geladen</string>
<string name="chapter_downloading_progress">wird heruntergeladen (%1$d/%2$d)</string>
<string name="chapter_error">Fehler</string>
<string name="chapter_paused">Pausiert</string>
<string name="fetch_chapters_error">Fehler beim abrufen der Kapitel</string>
<string name="show_title">zeige Titel</string>
<string name="show_chapter_number">zeige Kaptielanzahl</string>
<string name="sorting_mode">Sortieren nach</string>
<string name="sort_by_source">Quelle</string>
<string name="sort_by_number">Kapitelanzahl</string>
<string name="manga_download">Herunterladen</string>
<string name="download_1">lade nächstes Kapitel runter</string>
<string name="download_5">lade die nächsten 5 Kapitel runter</string>
<string name="download_10">lade die nächsten 10 Kapitel runter</string>
<string name="download_all">Lade alle runter</string>
<string name="download_unread">lade ungelesene runter</string>
<string name="confirm_delete_chapters">Bist du sicher das du die ausgewählten Kapitel löschen willst?</string>
<string name="manga_tracking_tab">Synchronisation</string>
<string name="reading">am Lesen</string>
<string name="completed">Fertig</string>
<string name="dropped">abgebrochen</string>
<string name="on_hold">Pausiert</string>
<string name="plan_to_read">will ich lesen</string>
<string name="score">Bewertung</string>
<string name="title">Titel</string>
<string name="status">Status</string>
<string name="error_category_exists">eine Kategorie mit diesen Namen existiert bereits!</string>
<string name="snack_categories_deleted">Kategorie gelöscht</string>
<string name="dialog_with_checkbox_remove_description">Das Lesedatum dieses Kapitel wird gelöscht. Bist du sicher?</string>
<string name="dialog_with_checkbox_reset">Setze alle Kapitel dieses Mangas zurück</string>
<string name="snack_add_to_library">Manga zur Bibliothek hinzufügen?</string>
<string name="picture_saved">Bild gespeichert</string>
<string name="saving_picture">speichere Bild</string>
<string name="options">Einstellungen</string>
<string name="custom_filter">eigene Filter</string>
<string name="set_as_cover">als Cover setzen</string>
<string name="cover_updated">Cover geändert</string>
<string name="page_downloaded">Seiten zu %1$s kopiert</string>
<string name="downloading">wird heruntergeladen…</string>
<string name="download_progress">Heruntergeladen %1$d%%</string>
<string name="chapter_progress">Seite: %1$d</string>
<string name="chapter_subtitle">Kapitel %1$s</string>
<string name="no_next_chapter">nächstes Kapitel nicht gefunden</string>
<string name="no_previous_chapter">vorheriges Kapitel nicht gefunden</string>
<string name="decode_image_error">Bild konnte nicht geladen werden.
Versuche entweder den Bilddecoder zu ändern oder Probiere eine der Optionen weiter unten aus</string>
<string name="confirm_update_manga_sync">Sende das letzte gelesen Kapitel zu %1$d?</string>
<string name="confirm_set_image_as_cover">Willst du dieses Bild als Cover setzen?</string>
<string name="viewer_for_this_series">Leser dieser Serie</string>
<string name="recent_manga_source">%1$s - Kap.%2$s</string>
<string name="download_queue_error">Beim Kapitel runterladen trat ein Fehler auf. versuche es erneut</string>
<string name="notification_update_progress">Update fortschritt: %1$d/%2$d</string>
<string name="notification_new_chapters">neue Kapitel gefunden</string>
<string name="notification_new_chapters_text">Für %1$d Title</string>
<string name="notification_cover_update_failed">Konnte Cover nicht ändern</string>
<string name="notification_first_add_to_library">Bitte füge den Manga zu deiner Bibliothek hinzu bevor du das tust</string>
<string name="notification_not_connected_to_ac_title">Synchronisation abgebrochen</string>
<string name="notification_not_connected_to_ac_body">Nicht mit dem Stromnetz verbunden</string>
<string name="notification_no_connection_title">Synchronisation abgebrochen</string>
<string name="notification_no_connection_body">keine Verbindung möglich</string>
<string name="file_select_cover">wähle Coverbild</string>
<string name="file_select_backup">wähle Backupdatei</string>
<string name="file_select_icon">wähle Shortcutsymbol</string>
<string name="update_check_title">neues Update verfügbar!</string>
<string name="update_check_confirm">Herunterladen</string>
<string name="update_check_ignore">Ignorieren</string>
<string name="update_check_no_new_updates">kein neues Update verfügbar</string>
<string name="update_check_download_started">Runterladen gestartet</string>
<string name="update_check_look_for_updates">suche nach Updates</string>
<string name="update_check_notification_file_download">lade Update runter</string>
<string name="update_check_notification_download_in_progress">am Herunterladen</string>
<string name="update_check_notification_download_complete">Herunterladen erfolgreich</string>
<string name="update_check_notification_download_error">Fehler beim Herunterladen</string>
<string name="update_check_notification_update_available">Update verfügbar</string>
<string name="description_backdrop">Hintergrundbild vom Manga</string>
<string name="description_cover">Mangacover</string>
<string name="information_no_downloads">keine Downloads</string>
<string name="information_no_recent">keine neuen Kapitel</string>
<string name="information_no_recent_manga">keine kürzlich gelesene Manga</string>
<string name="information_empty_library">leere Bibliothek</string>
<string name="download_notifier_downloader_title">Downloader</string>
<string name="download_notifier_title_error">Fehler</string>
<string name="download_notifier_unkown_error">während dem Herunterladen ist ein unerwarteter Fehler aufgetretten</string>
<string name="download_notifier_page_error">im Ordner fehlt eine Seite</string>
<string name="download_notifier_page_ready_error">eine Seite ist nicht geladen</string>
<string name="download_notifier_text_only_wifi">keine Wifi verbindung verfügbar</string>
<string name="download_notifier_no_network">kein Netzwerk verfügbar</string>
<string name="download_notifier_download_paused">Runterladen pausiert</string>
<string name="track">Synchronisation</string>
<string name="label_recent_updates">Bibliothek Updates</string>
</resources>

View File

@ -51,4 +51,48 @@
<string name="action_install">설치</string>
<string name="label_settings">세팅</string>
<string name="action_display">디스플레이</string>
<string name="history">기록</string>
<string name="label_download_queue">다운로드 큐</string>
<string name="label_library">내 서재</string>
<string name="label_recent_manga">최근 읽음</string>
<string name="label_catalogues">카탈로그</string>
<string name="label_recent_updates">서재 업데이트</string>
<string name="action_sort_total">모든 챕터</string>
<string name="action_sort_up">위로 정렬</string>
<string name="action_sort_down">아래로 정렬</string>
<string name="action_next_unread">다음 안 읽은 챕터로</string>
<string name="action_start">읽기 시작</string>
<string name="action_clear">기록 지우기</string>
<string name="action_close">닫기</string>
<string name="action_previous_chapter">이전 챕터</string>
<string name="action_next_chapter">다음 챕터</string>
<string name="action_retry">재시도</string>
<string name="action_move">이동</string>
<string name="action_add_to_home_screen">홈스크린에 추가</string>
<string name="action_set_filter">필터 설정</string>
<string name="action_share">공유</string>
<string name="action_save">저장</string>
<string name="action_reset">리셋</string>
<string name="action_undo">되돌리기</string>
<string name="action_export">내보내기</string>
<string name="action_open_log">로그 열기</string>
<string name="action_create">만들기</string>
<string name="action_restore">복구하기</string>
<string name="deleting">삭제 중…</string>
<string name="loading">로딩 중.…</string>
<string name="app_not_available">어플리케이션 이용 불가</string>
<string name="short_recent_updates">업데이트</string>
<string name="pref_category_general">일반</string>
<string name="pref_category_reader">리더</string>
<string name="pref_category_downloads">다운로드</string>
<string name="pref_category_sources">소스</string>
<string name="pref_category_tracking">트래킹</string>
<string name="pref_category_advanced">고급 설정</string>
<string name="pref_category_about">정보</string>
<string name="pref_library_columns">가로로 서재 정렬</string>
</resources>

View File

@ -0,0 +1,401 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources><string name="categories">Kategorie</string>
<string name="chapters">Rozdziały</string>
<string name="name">Nazwa</string>
<string name="history">Historia</string>
<string name="label_settings">Ustawienia</string>
<string name="label_download_queue">Kolejka pobierania</string>
<string name="label_catalogues">Katalogi</string>
<string name="label_recent_manga">Ostatnio czytane</string>
<string name="action_settings">Ustawienia</string>
<string name="action_filter">Filtruj</string>
<string name="action_filter_downloaded">Pobrane</string>
<string name="action_filter_unread">Nieprzeczytane</string>
<string name="action_filter_read">Przeczytane</string>
<string name="action_search">Szukaj</string>
<string name="action_select_all">Zaznacz wszystko</string>
<string name="label_library">Moja biblioteka</string>
<string name="label_recent_updates">Aktualizacje biblioteki</string>
<string name="label_categories">Kategorie</string>
<string name="label_backup">Kopia zapasowa</string>
<string name="action_filter_bookmarked">Zakładki</string>
<string name="action_filter_empty">Usuń filtry</string>
<string name="action_sort_last_read">Ostatnio czytane</string>
<string name="action_sort_last_updated">Ostatnio zaktualizowane</string>
<string name="action_mark_as_read">Oznacz jako przeczytane</string>
<string name="action_mark_as_unread">Oznacz jako nieprzeczytane</string>
<string name="action_mark_previous_as_read">Oznacz poprzednie jako przeczytane</string>
<string name="action_download">Pobierz</string>
<string name="action_bookmark">Dodaj do zakładek</string>
<string name="action_remove_bookmark">Usuń z zakładek</string>
<string name="action_delete">Usuń</string>
<string name="action_update">Aktualizuj</string>
<string name="action_update_library">Aktualizuj bibliotekę</string>
<string name="action_edit">Edytuj</string>
<string name="action_add">Dodaj</string>
<string name="action_add_category">Dodaj kategorię</string>
<string name="action_edit_categories">Edytuj kategorie</string>
<string name="action_rename_category">Zmień nazwę kategorii</string>
<string name="action_move_category">Przenieś do kategorii</string>
<string name="action_edit_cover">Edytuj okładkę</string>
<string name="action_sort_total">Wszystkich rozdziałów</string>
<string name="action_sort_up">Sortuj rosnąco</string>
<string name="action_sort_down">Sortuj malejąco</string>
<string name="action_show_unread">Nieprzeczytane</string>
<string name="action_show_downloaded">Pobrane</string>
<string name="action_next_unread">Następne nieprzeczytane</string>
<string name="action_start">Start</string>
<string name="action_stop">Stop</string>
<string name="action_pause">Wstrzymaj</string>
<string name="action_clear">Wyczyść</string>
<string name="action_close">Zamknij</string>
<string name="action_previous_chapter">Poprzedni rozdział</string>
<string name="action_next_chapter">Następny rozdział</string>
<string name="action_retry">Spróbuj ponownie</string>
<string name="action_remove">Usuń</string>
<string name="action_resume">Wznów</string>
<string name="action_move">Przenieś</string>
<string name="action_open_in_browser">Otwórz w przeglądarce</string>
<string name="action_add_to_home_screen">Dodaj do ekranu głównego</string>
<string name="action_display_mode">Zmień tryb wyświetlania</string>
<string name="action_display">Widok</string>
<string name="action_display_grid">Siatka</string>
<string name="action_display_list">Lista</string>
<string name="action_set_filter">Ustaw filtry</string>
<string name="action_cancel">Anuluj</string>
<string name="action_sort">Sortuj</string>
<string name="action_install">Zainstaluj</string>
<string name="action_share">Udostępnij</string>
<string name="action_save">Zapisz</string>
<string name="action_undo">Cofnij</string>
<string name="action_export">Eksportuj</string>
<string name="action_create">Utwórz</string>
<string name="action_restore">Przywróć</string>
<string name="deleting">Usuwanie…</string>
<string name="loading">Ładowanie…</string>
<string name="app_not_available">Aplikacja niedostępna</string>
<string name="short_recent_updates">Aktualizacje</string>
<string name="pref_category_general">Ogólne</string>
<string name="pref_category_reader">Czytnik</string>
<string name="pref_category_downloads">Pobieranie</string>
<string name="pref_category_sources">Źródła</string>
<string name="pref_category_advanced">Zaawansowane</string>
<string name="pref_category_about">O aplikacji</string>
<string name="pref_library_columns">Mang na rząd biblioteki</string>
<string name="pref_refresh_library_metadata_summary">Aktualizuje okładki, gatunki, opisy i informacje o statusie mang</string>
<string name="add_to_library">Dodaj do biblioteki</string>
<string name="remove_from_library">Usuń z biblioteki</string>
<string name="manga_info_author_label">Autor</string>
<string name="manga_info_artist_label">Rysownik</string>
<string name="manga_info_source_label">Źródło</string>
<string name="manga_info_genres_label">Gatunki</string>
<string name="manga_chapter_no_title">Brak tytułu</string>
<string name="display_mode_chapter">Rozdział %1$s</string>
<string name="chapter_error">Błąd</string>
<string name="chapter_paused">Wstrzymano</string>
<string name="manga_download">Pobierz</string>
<string name="download_1">Pobierz kolejny rozdział</string>
<string name="download_5">Pobierz kolejne 5 rozdziałów</string>
<string name="download_10">Pobierz kolejne 10 rozdziałów</string>
<string name="download_all">Pobierz wszystko</string>
<string name="download_unread">Pobierz nieprzeczytane</string>
<string name="confirm_delete_chapters">Czy na pewno chcesz usunąć wybrane rozdziały?</string>
<string name="reading">Czytane</string>
<string name="completed">Ukończone</string>
<string name="dropped">Porzucone</string>
<string name="on_hold">Wstrzymane</string>
<string name="plan_to_read">Planowane</string>
<string name="score">Ocena</string>
<string name="title">Tytuł</string>
<string name="error_category_exists">Kategoria o takiej nazwie już istnieje!</string>
<string name="picture_saved">Obrazek zapisany</string>
<string name="saving_picture">Zapisywanie obrazka</string>
<string name="options">Opcje</string>
<string name="set_as_cover">Ustaw jako okładkę</string>
<string name="cover_updated">Okładka zaktualizowana</string>
<string name="downloading">Pobieranie…</string>
<string name="download_progress">Pobrano %1$d%%</string>
<string name="chapter_progress">Strona: %1$d</string>
<string name="chapter_subtitle">Rozdział %1$s</string>
<string name="no_next_chapter">Nie znaleziono następnego rozdziału</string>
<string name="no_previous_chapter">Nie znaleziono poprzedniego rozdziału</string>
<string name="recent_manga_source">%1$s - Rozdz. %2$s</string>
<string name="notification_new_chapters">Znaleziono nowe rozdziały</string>
<string name="notification_not_connected_to_ac_title">Synchronizacja anulowana</string>
<string name="notification_not_connected_to_ac_body">Nie podłączono ładowarki</string>
<string name="notification_no_connection_title">Synchronizacja anulowana</string>
<string name="notification_no_connection_body">Brak połączenia</string>
<string name="file_select_cover">Wybierz okładkę</string>
<string name="update_check_title">Dostępna nowa aktualizacja!</string>
<string name="update_check_confirm">Pobierz</string>
<string name="update_check_ignore">Ignoruj</string>
<string name="update_check_no_new_updates">Brak nowych aktualizacji</string>
<string name="update_check_download_started">Rozpoczęto pobieranie</string>
<string name="update_check_look_for_updates">Szukanie aktualizacji</string>
<string name="update_check_notification_file_download">Pobierz aktualizację</string>
<string name="update_check_notification_download_in_progress">Trwa pobieranie</string>
<string name="update_check_notification_download_complete">Pobieranie ukończone</string>
<string name="update_check_notification_download_error">Błąd pobierania</string>
<string name="update_check_notification_update_available">Dostępna aktualizacja</string>
<string name="information_empty_library">Biblioteka pusta</string>
<string name="download_notifier_title_error">Błąd</string>
<string name="download_notifier_unkown_error">Podczas pobierania rozdziału wystąpił nieoczekiwany błąd</string>
<string name="download_notifier_download_paused">Pobieranie wstrzymane</string>
<string name="label_latest_updates">Ostatnio aktualizowane</string>
<string name="label_selected">Zaznaczono: %1$d</string>
<string name="action_sort_alpha">Alfabetycznie</string>
<string name="track">Śledzenie</string>
<string name="action_reset">Reset</string>
<string name="services">Usługi</string>
<string name="version">Wersja</string>
<string name="pref_enable_automatic_updates">Sprawdź aktualizacje</string>
<string name="pref_enable_automatic_updates_summary">Automatycznie sprawdzaj aktualizacje aplikacji</string>
<string name="login_title">Logowanie do %1$s</string>
<string name="username">Nazwa użytkownika</string>
<string name="password">Hasło</string>
<string name="show_password">Pokaż hasło</string>
<string name="login">Zaloguj się</string>
<string name="invalid_login">Błąd logowania</string>
<string name="unknown_error">Nieznany błąd</string>
<string name="library_search_hint">Tytuł lub autor…</string>
<string name="source_requires_login">To źródło wymaga zalogowania</string>
<string name="select_source">Wybierz źródło</string>
<string name="confirm_delete_manga">Czy na pewno chcesz usunąć wybrane mangi?</string>
<string name="also_delete_chapters">Usuń też pobrane rozdziały</string>
<string name="updating_category">Aktualizowanie kategorii</string>
<string name="no_valid_sources">Włącz co najmniej jedno poprawne źródło</string>
<string name="invalid_combination">Domyślna kategoria nie może być wybrana razem z innymi</string>
<string name="manga_detail_tab">Informacje</string>
<string name="description">Opis</string>
<string name="manga_not_in_db">Ta manga została usunięta z bazy danych!</string>
<string name="no_more_results">Nie ma więcej wyników</string>
<string name="added_to_library">Manga została dodana do twojej biblioteki</string>
<string name="action_open_log">Otwórz log</string>
<string name="show_title">Pokaż tytuł</string>
<string name="show_chapter_number">Pokaż numer rozdziału</string>
<string name="portrait">Pionowo</string>
<string name="landscape">Poziomo</string>
<string name="default_columns">Domyślnie</string>
<string name="pref_library_update_interval">Częstotliwość aktualizacji biblioteki</string>
<string name="update_never">Ręcznie</string>
<string name="update_1hour">Co godzinę</string>
<string name="update_2hour">Co 2 godziny</string>
<string name="update_3hour">Co 3 godziny</string>
<string name="update_6hour">Co 6 godzin</string>
<string name="update_12hour">Co 12 godzin</string>
<string name="update_24hour">Co 1 dzień</string>
<string name="update_48hour">Co 2 dni</string>
<string name="update_weekly">Co tydzień</string>
<string name="update_monthly">Co miesiąc</string>
<string name="pref_library_update_categories">Kategorie do zawarcia w aktualizacji globalnej</string>
<string name="all">Wszystko</string>
<string name="pref_library_update_restriction">Warunki aktualizacji biblioteki</string>
<string name="pref_library_update_restriction_summary">Aktualizuje tylko, kiedy spełnione są te warunki</string>
<string name="wifi">Wi-Fi</string>
<string name="charging">Ładowanie</string>
<string name="pref_update_only_non_completed">Aktualizuj tylko wychodzące mangi</string>
<string name="pref_auto_update_manga_sync">Synchronizuj rozdziały po przeczytaniu</string>
<string name="pref_ask_update_manga_sync">Potwierdź przed aktualizacją</string>
<string name="pref_theme">Motyw aplikacji</string>
<string name="light_theme">Główny motyw</string>
<string name="dark_theme">Ciemny motyw</string>
<string name="amoled_theme">Motyw AMOLED</string>
<string name="pref_start_screen">Ekran startowy</string>
<string name="pref_language">Język</string>
<string name="system_default">Systemowy</string>
<string name="default_category">Domyślna kategoria</string>
<string name="default_category_summary">Zawsze pytaj</string>
<string name="pref_fullscreen">Pełny ekran</string>
<string name="pref_lock_orientation">Zablokuj orientację</string>
<string name="pref_page_transitions">Przejścia stron</string>
<string name="pref_show_page_number">Pokazuj numer strony</string>
<string name="pref_crop_borders">Przycinaj krawędzie</string>
<string name="pref_custom_brightness">Używaj własnej jasności</string>
<string name="pref_keep_screen_on">Nie wyłączaj ekranu</string>
<string name="pref_custom_color_filter">Używaj własnych filtrów kolorów</string>
<string name="pref_read_with_volume_keys">Przyciski głośności</string>
<string name="pref_read_with_volume_keys_inverted">Odwróć przyciski głośności</string>
<string name="pref_read_with_tapping">Stukanie</string>
<string name="pref_reader_theme">Kolor tła</string>
<string name="white_background">Biały</string>
<string name="black_background">Czarny</string>
<string name="default_viewer">Domyślnie</string>
<string name="left_to_right_viewer">Od lewej do prawej</string>
<string name="right_to_left_viewer">Od prawej do lewej</string>
<string name="vertical_viewer">Pionowo</string>
<string name="webtoon_viewer">Do webtoons</string>
<string name="pref_viewer_type">Domyślny styl czytania</string>
<string name="pref_image_decoder">Dekoder obrazków</string>
<string name="scale_type_fit_screen">Dopasuj do ekranu</string>
<string name="scale_type_stretch">Rozciągnij</string>
<string name="scale_type_fit_width">Dopasuj do szerokości</string>
<string name="scale_type_fit_height">Dopasuj do wysokości</string>
<string name="pref_image_scale_type">Rodzaj powiększenia</string>
<string name="scale_type_original_size">Oryginalny rozmiar</string>
<string name="scale_type_smart_fit">Inteligentnie</string>
<string name="pref_zoom_start">Początkowa pozycja przybliżenia</string>
<string name="zoom_start_automatic">Automatycznie</string>
<string name="zoom_start_left">Po lewej</string>
<string name="zoom_start_right">Po prawej</string>
<string name="zoom_start_center">Wyśrodkuj</string>
<string name="pref_rotation_type">Obrót ekranu</string>
<string name="rotation_free">Dowolnie</string>
<string name="rotation_lock">Zablokuj</string>
<string name="rotation_force_portrait">Wymuś pionowo</string>
<string name="rotation_force_landscape">Wymuś poziomo</string>
<string name="color_filter_r_value">R</string>
<string name="color_filter_g_value">G</string>
<string name="color_filter_b_value">B</string>
<string name="color_filter_a_value">A</string>
<string name="pref_download_directory">Katalog pobierania</string>
<string name="pref_download_slots">Jednoczesne pobieranie</string>
<string name="pref_download_only_over_wifi">Pobieraj tylko przez Wi-Fi</string>
<string name="pref_remove_after_marked_as_read">Usuwaj po oznaczeniu jako przeczytane</string>
<string name="pref_remove_after_read">Usuwaj rozdziały po przeczytaniu</string>
<string name="custom_dir">Własny katalog</string>
<string name="disabled">Wyłączone</string>
<string name="last_read_chapter">Ostatnio czytany rozdział</string>
<string name="second_to_last">Przedostatnio czytany rozdział</string>
<string name="third_to_last">3 rozdziały do tyłu</string>
<string name="fourth_to_last">4 rozdziały do tyłu</string>
<string name="fifth_to_last">5 rozdziałów do tyłu</string>
<string name="pref_download_new">Pobieraj nowe rozdziały</string>
<string name="backup">Kopia zapasowa</string>
<string name="manga">Mangi</string>
<string name="pref_category_tracking">Śledzenie</string>
<string name="pref_reader_navigation">Obsługa</string>
<string name="pref_download_new_categories">Kategorie do pobierania</string>
<string name="pref_create_backup">Utwórz kopię zapasową</string>
<string name="pref_create_backup_summ">Może być użyta do przywrócenia aktualnej biblioteki</string>
<string name="pref_restore_backup">Przywróć kopię zapasową</string>
<string name="pref_restore_backup_summ">Przywraca bibliotekę z pliku kopii zapasowej</string>
<string name="pref_backup_directory">Katalog kopii zapasowych</string>
<string name="pref_backup_interval">Częstotliwość tworzenia kopii</string>
<string name="pref_backup_slots">Maks. automatycznych kopii</string>
<string name="pref_backup_service_category">Serwisowe</string>
<string name="dialog_restoring_backup">Przywracanie kopii zapasowej
%1$s dodano do biblioteki</string>
<string name="source_not_found">Nie znaleziono źródła</string>
<string name="dialog_restoring_source_not_found">Przywracanie kopii zapasowej
Nie znaleziono źródła %1$s</string>
<string name="restore_completed_content">Przywracanie trwało %1$s.
Znalezionych błędów: %2$s.</string>
<string name="backup_choice">Czego kopię chcesz zrobić?</string>
<string name="restoring_backup">Przywracanie kopii zapasowej</string>
<string name="creating_backup">Tworzenie kopii zapasowej</string>
<string name="pref_clear_chapter_cache">Wyczyść cache rozdziałów</string>
<string name="used_cache">W użyciu: %1$s</string>
<string name="cache_deleted">Wyczyszczono cache. Usunięto plików: %1$d</string>
<string name="cache_delete_error">Podczas czyszczenie cache wystąpił błąd</string>
<string name="pref_clear_cookies">Usuń ciasteczka</string>
<string name="cookies_cleared">Ciasteczka usunięte</string>
<string name="pref_clear_database_summary">Usuń mangi i rozdziały, których nie ma w twojej bibliotece</string>
<string name="pref_clear_database">Wyczyść bazę danych</string>
<string name="pref_enable_acra">Wysyłaj raporty o awariach</string>
<string name="pref_acra_summary">Pomaga naprawiać błędy. Żadne wrażliwe dane nie będą wysyłane</string>
<string name="backup_created">Utworzono kopię zapasową</string>
<string name="restore_completed">Ukończono przywracanie</string>
<string name="error_opening_log">Nie udało się otworzyć logu</string>
<string name="backup_restore_content">Przywracanie używa źródeł do pobierania danych, operator może naliczać opłaty.
Przed przywróceniem upewnij się też, że jesteś poprawnie zalogowany do źródeł.</string>
<string name="file_saved">Plik zapisano do %1$s</string>
<string name="choices_reset">Resetuj wybory okien dialogowych</string>
<string name="clear_database_confirmation">Na pewno? Przeczytane rozdziały i postęp w mangach spoza biblioteki zostaną utracone</string>
<string name="clear_database_completed">Pozycje usunięte</string>
<string name="pref_refresh_library_metadata">Odśwież metadane biblioteki</string>
<string name="pref_refresh_library_tracking">Odśwież metadane śledzenia</string>
<string name="pref_refresh_library_tracking_summary">Aktualizuje status, ocenę i ostatnio czytany rozdział na podst. usług sychronizacji</string>
<string name="build_time">Build utworzony</string>
<string name="login_success">Logowanie udane</string>
<string name="local_source">Lokalne mangi</string>
<string name="ongoing">Wychodzące</string>
<string name="unknown">Nieznane</string>
<string name="licensed">Licencjonowane</string>
<string name="manga_info_chapters_label">Rozdziały</string>
<string name="manga_info_last_chapter_label">Ostatni rozdział</string>
<string name="manga_info_status_label">Status</string>
<string name="share_text">Zobacz %1$s! na %2$s</string>
<string name="circular_icon">Okrągła ikonka</string>
<string name="rounded_icon">Zaokrąglona ikonka</string>
<string name="square_icon">Kwadratowa ikonka</string>
<string name="star_icon">Ikonka-gwiazdka</string>
<string name="shortcut_title">Tytuł skrótu</string>
<string name="icon_shape">Kształt ikony</string>
<string name="icon_creation_fail">Nie udało się utworzyć skrótu!</string>
<string name="delete_downloads_for_manga">Usunąć pobrane rozdziały?</string>
<string name="manga_chapters_tab">Rozdziały</string>
<string name="chapter_downloaded">Pobrany</string>
<string name="chapter_queued">W kolejce</string>
<string name="chapter_downloading">Pobieranie</string>
<string name="chapter_downloading_progress">Pobieranie (%1$d/%2$d)</string>
<string name="fetch_chapters_error">Błąd przy pobieraniu listy rozdziałów</string>
<string name="sorting_mode">Tryb sortowania</string>
<string name="sort_by_source">Według źródła</string>
<string name="sort_by_number">Według numeru rozdziału</string>
<string name="manga_tracking_tab">Śledzenie</string>
<string name="status">Status</string>
<string name="snack_categories_deleted">Kategorie usunięte</string>
<string name="dialog_with_checkbox_remove_description">To usunie datę przeczytania tego rozdziały. Na pewno?</string>
<string name="dialog_with_checkbox_reset">Resetuj wszystkie rozdziały tej mangi</string>
<string name="snack_add_to_library">Dodać mangę do biblioteki?</string>
<string name="custom_filter">Własny filtr</string>
<string name="page_downloaded">Strona skopiowana do %1$s</string>
<string name="decode_image_error">Nie można załadować obrazka.
Spróbuj zmienić dekoder lub skorzystaj z jednej z opcji poniżej</string>
<string name="confirm_update_manga_sync">Zaktualizować ostatni przeczytany rozdział na %1$d we włączonych usługach?</string>
<string name="confirm_set_image_as_cover">Czy chcesz ustawić ten obrazek jako okładkę?</string>
<string name="viewer_for_this_series">Widok dla tej serii</string>
<string name="download_queue_error">Wystąpił błąd podczas pobierania rozdziałów. Możesz spróbować ponownie w sekcji pobierania</string>
<string name="notification_update_progress">Stan aktualizacji: %1$d/%2$d</string>
<string name="notification_new_chapters_text">Dla %1$d tytułów</string>
<string name="notification_cover_update_failed">Nie udało się zaktualizować okładki</string>
<string name="notification_first_add_to_library">Dodaj tę mangę do biblioteki, zanim to zrobisz</string>
<string name="file_select_backup">Wybierz plik kopii zapasowej</string>
<string name="file_select_icon">Wybierz ikonę skrótu</string>
<string name="description_backdrop">Obrazek tła mangi</string>
<string name="description_cover">Okładka mangi</string>
<string name="information_no_downloads">Brak pobieranych plików</string>
<string name="information_no_recent">Brak ostatnich rozdziałów</string>
<string name="information_no_recent_manga">Brak ostatnio czytanych mang</string>
<string name="download_notifier_downloader_title">Pobieranie</string>
<string name="download_notifier_page_error">Brakuje strony w katalogu</string>
<string name="download_notifier_page_ready_error">Strona nie jest załadowana</string>
<string name="download_notifier_text_only_wifi">Brak połączenia Wi-Fi</string>
<string name="download_notifier_no_network">Brak połączenia sieciowego</string>
</resources>

View File

@ -9,7 +9,7 @@
<string name="label_settings">Configurações</string>
<string name="label_download_queue">Fila de download</string>
<string name="label_library">Minha biblioteca</string>
<string name="label_recent_manga">Lido recentemente</string>
<string name="label_recent_manga">Lidos recentemente</string>
<string name="label_catalogues">Catálogos</string>
<string name="label_recent_updates">Atualizações da biblioteca</string>
<string name="label_latest_updates">Últimas atualizações</string>
@ -19,7 +19,7 @@
<string name="action_settings">Configurações</string>
<string name="action_filter">Filtrar</string>
<string name="action_filter_downloaded">Download concluído</string>
<string name="action_filter_downloaded">Disponível offline</string>
<string name="action_filter_bookmarked">Favoritos</string>
<string name="action_filter_unread">Não lidos</string>
<string name="action_filter_read">Lidos</string>
@ -49,7 +49,7 @@
<string name="action_sort_up">Ordem ascendente</string>
<string name="action_sort_down">Ordem decrescente</string>
<string name="action_show_unread">Não lido</string>
<string name="action_show_downloaded">Download concluído</string>
<string name="action_show_downloaded">Disponível offline</string>
<string name="action_next_unread">Próximo não lido</string>
<string name="action_start">Iniciar</string>
<string name="action_stop">Parar</string>
@ -149,7 +149,7 @@
<string name="left_to_right_viewer">Esquerda para direita</string>
<string name="right_to_left_viewer">Direita para esquerda</string>
<string name="vertical_viewer">Vertical</string>
<string name="webtoon_viewer">Vertical continuo</string>
<string name="webtoon_viewer">Vertical contínuo</string>
<string name="pref_image_decoder">Decodificador de imagem</string>
<string name="pref_image_scale_type">Tipo de escala</string>
<string name="scale_type_fit_screen">Ajustar à tela</string>
@ -210,10 +210,10 @@
<string name="error_opening_log">Não foi possível abrir o registro de eventos</string>
<string name="restore_completed_content">A restauração levou %1$s.
%2$s erros encontrados.</string>
<string name="backup_restore_content">A restauração usa as fontes para recuperar os dados, cobranças poderão ser feitas pela sua operadora.
Além disso, certifique-se de ter configurado as fontes que requerem uma conta antes de iniciar a restauração.</string>
<string name="backup_restore_content">A restauração usa as fontes para obter os dados, logo cobranças poderão ser efetuadas pela sua operadora devido ao uso de dados móveis.
Além disso, verifique se as fontes que requerem uma conta foram configuradas corretamente antes de iniciar a restauração.</string>
<string name="file_saved">Arquivo salvo em %1$s</string>
<string name="backup_choice">Do que você fazer backup?</string>
<string name="backup_choice">Do que você deseja fazer backup?</string>
<string name="restoring_backup">Restaurando backup</string>
<string name="creating_backup">Fazendo backup</string>
@ -229,9 +229,9 @@ Além disso, certifique-se de ter configurado as fontes que requerem uma conta a
<string name="clear_database_confirmation">Tem certeza? Os capítulos lidos e o progresso em mangás que não estão na sua biblioteca serão perdidos</string>
<string name="clear_database_completed">Entradas excluídas</string>
<string name="pref_refresh_library_metadata">Atualizar metadados da biblioteca</string>
<string name="pref_refresh_library_metadata_summary">Atualiza informações como as capas, gêneros, descrições e estado dos mangás</string>
<string name="pref_refresh_library_metadata_summary">Atualiza informações como as capas, gêneros, descrições e situação dos mangás</string>
<string name="pref_refresh_library_tracking">Atualizar metadados do monitoramento</string>
<string name="pref_refresh_library_tracking_summary">Atualiza informações como estado, avaliações e últimos capítulos lidos dos serviços de monitoramento</string>
<string name="pref_refresh_library_tracking_summary">Atualiza informações como situação, avaliações e últimos capítulos lidos dos serviços de monitoramento</string>
<string name="version">Versão</string>
<string name="build_time">Data de compilação</string>
@ -252,8 +252,8 @@ Além disso, certifique-se de ter configurado as fontes que requerem uma conta a
<string name="library_search_hint">Título ou autor…</string>
<string name="updating_category">Atualizando categoria</string>
<string name="confirm_delete_manga">Tem certeza de que deseja remover o mangá selecionado?</string>
<string name="also_delete_chapters">Também excluir os downloads</string>
<string name="confirm_delete_manga">Tem certeza de que deseja remover os mangás selecionados?</string>
<string name="also_delete_chapters">Também excluir os capítulos disponíveis offline</string>
<string name="source_requires_login">Esta fonte requer uma conta</string>
<string name="select_source">Selecione uma fonte</string>
@ -274,8 +274,8 @@ Além disso, certifique-se de ter configurado as fontes que requerem uma conta a
<string name="manga_info_author_label">Autor</string>
<string name="manga_info_artist_label">Artista</string>
<string name="manga_info_chapters_label">Capítulos</string>
<string name="manga_info_last_chapter_label">Último capítulo</string>
<string name="manga_info_status_label">Estado</string>
<string name="manga_info_last_chapter_label">Capítulo mais recente</string>
<string name="manga_info_status_label">Situação</string>
<string name="manga_info_source_label">Fonte</string>
<string name="manga_info_genres_label">Gêneros</string>
<string name="share_text">Confira %1$s! em %2$s</string>
@ -285,13 +285,13 @@ Além disso, certifique-se de ter configurado as fontes que requerem uma conta a
<string name="star_icon">Ícone de estrela</string>
<string name="shortcut_title">Título do atalho</string>
<string name="icon_shape">Formato do ícone</string>
<string name="icon_creation_fail">"Erro ao criar o atalho!"</string>
<string name="delete_downloads_for_manga">Excluir os downloads dos capítulos?</string>
<string name="icon_creation_fail">Erro ao criar o atalho!</string>
<string name="delete_downloads_for_manga">Excluir os capítulos disponíveis offline?</string>
<string name="manga_chapters_tab">Capítulos</string>
<string name="manga_chapter_no_title">Sem título</string>
<string name="display_mode_chapter">Capítulo %1$s</string>
<string name="chapter_downloaded">Download concluído</string>
<string name="chapter_downloaded">Disponível offline</string>
<string name="chapter_queued">Na fila</string>
<string name="chapter_downloading">Fazendo download</string>
<string name="chapter_downloading_progress">Fazendo download (%1$d/%2$d)</string>
@ -319,7 +319,7 @@ Além disso, certifique-se de ter configurado as fontes que requerem uma conta a
<string name="plan_to_read">Ler depois</string>
<string name="score">Avaliação</string>
<string name="title">Título</string>
<string name="status">Estado</string>
<string name="status">Situação</string>
<string name="error_category_exists">Já existe uma categoria com este nome!</string>
<string name="snack_categories_deleted">Categorias excluídas</string>

View File

@ -92,7 +92,7 @@
<string name="decode_image_error">Изображение не может быть загружено. Попробуйте изменить декодер опциями ниже</string>
<string name="default_columns">По умолчанию</string>
<string name="default_viewer">По умолчанию</string>
<string name="deleting">Удаление...</string>
<string name="deleting">Удаление</string>
<string name="description">Описание</string>
<string name="description_backdrop">Фоновое изображение манги</string>
<string name="description_cover">Обложка манги</string>
@ -114,7 +114,7 @@
<string name="download_progress">Загружено %1$d%%</string>
<string name="download_queue_error">Произошла ошибка при загрузке глав. Попробуйте еще раз в разделе загрузки</string>
<string name="download_unread">Загрузить непрочитанные</string>
<string name="downloading">Загрузка...</string>
<string name="downloading">Загрузка</string>
<string name="dropped">Брошенный</string>
<string name="error_category_exists">Категория с таким именем уже существует!</string>
<string name="fetch_chapters_error">Ошибка при извлечении глав</string>
@ -143,10 +143,10 @@
<string name="landscape">Горизонтальная</string>
<string name="last_read_chapter">Последняя прочитанная глава</string>
<string name="left_to_right_viewer">Слева направо</string>
<string name="library_search_hint">Название или автор...</string>
<string name="library_search_hint">Название или автор</string>
<string name="licensed">Лицензировано</string>
<string name="light_theme">Основная тема</string>
<string name="loading">Загрузка...</string>
<string name="loading">Загрузка</string>
<string name="login">Авторизация</string>
<string name="login_success">Успешная авторизация</string>
<string name="login_title">Авторизация для %1$s</string>
@ -168,7 +168,7 @@
<string name="no_valid_sources">Пожалуйста включите хотя бы один источник</string>
<string name="notification_cover_update_failed">Не удалось обновить обложку</string>
<string name="notification_first_add_to_library">Пожалуйста добавьте мангу в свою библиотеку, перед тем как делать это</string>
<string name="notification_new_chapters">Новые главы найдены для:</string>
<string name="notification_new_chapters">Новые главы найдены</string>
<string name="notification_no_connection_body">Соединение не доступно</string>
<string name="notification_no_connection_title">Синхронизация отменена</string>
<string name="notification_not_connected_to_ac_body">Не заряжается</string>
@ -296,7 +296,7 @@
<string name="version">Версия</string>
<string name="vertical_viewer">Вертикальный</string>
<string name="viewer_for_this_series">Отображение для этой серии</string>
<string name="webtoon_viewer">Webtoon</string>
<string name="webtoon_viewer">Комикс</string>
<string name="white_background">Белый</string>
<string name="wifi">Wi-Fi</string>
<string name="zoom_start_automatic">Автоматическая</string>
@ -355,4 +355,7 @@
<string name="update_monthly">Ежемесячно</string>
<string name="update_weekly">Еженедельно</string>
<string name="action_sort_total">По количеству глав</string>
<string name="action_open_log">Открыть лог</string>
<string name="app_not_available">Приложение не доступно</string>
<string name="pref_read_with_volume_keys_inverted">Инвертировать клавиши громкости</string>
</resources>

View File

@ -25,4 +25,5 @@
<attr name="selectable_library_drawable" format="reference|integer"/>
<attr name="text_color_primary" format="reference|integer"/>
<attr name="background_card" format="reference|integer"/>
<attr name="icon_color" format="reference|integer"/>
</resources>

View File

@ -20,6 +20,7 @@
<color name="dialogLight">@color/md_white_1000</color>
<color name="selectorColorLight">@color/md_blue_A400_38</color>
<color name="iconColorLight">@color/md_black_1000</color>
<!-- Dark Theme -->
<color name="colorAccentDark">#3399ff</color>
@ -35,6 +36,7 @@
<color name="dialogDark">@color/md_grey_800</color>
<color name="selectorColorDark">@color/md_blue_A200_50</color>
<color name="iconColorDark">@color/md_white_1000_54</color>
<!-- Reader Theme -->
<color name="pageNumberBackgroundLight">@color/md_grey_50_75</color>
@ -48,6 +50,7 @@
<color name="md_white_1000">#FFFFFFFF</color>
<color name="md_white_1000_70">#B3FFFFFF</color>
<color name="md_white_1000_54">#8AFFFFFF</color>
<color name="md_white_1000_50">#80FFFFFF</color>
<color name="md_white_1000_20">#33FFFFFF</color>
<color name="md_white_1000_12">#1FFFFFFF</color>

View File

@ -36,6 +36,7 @@
<item name="selectable_library_drawable">@drawable/library_item_selector_light</item>
<item name="text_color_primary">@color/textColorPrimaryLight</item>
<item name="background_card">@color/dialogLight</item>
<item name="icon_color">@color/iconColorLight</item>
</style>
<style name="Theme.Tachiyomi" parent="Theme.Base">
@ -74,6 +75,7 @@
<item name="selectable_library_drawable">@drawable/library_item_selector_dark</item>
<item name="text_color_primary">@color/textColorPrimaryDark</item>
<item name="background_card">@color/dialogDark</item>
<item name="icon_color">@color/iconColorDark</item>
</style>
<style name="Theme.Tachiyomi.Dark" parent="Theme.Base.Dark">

View File

@ -5,4 +5,8 @@ open class TestApp : App() {
override fun setupAcra() {
// Do nothing
}
override fun setupJobManager() {
// Do nothing
}
}

View File

@ -440,4 +440,15 @@ class ChapterRecognitionTest {
ChapterRecognition.parseChapterNumber(chapter, manga)
assertThat(chapter.chapter_number).isEqualTo(20f)
}
/**
* Test for chapters ending with s
*/
@Test fun chaptersEndingWithS() {
createManga("One Outs")
createChapter("One Outs 001")
ChapterRecognition.parseChapterNumber(chapter, manga)
assertThat(chapter.chapter_number).isEqualTo(1f)
}
}