Merge branch 'devel' into feature/shikimori

This commit is contained in:
Koitharu
2022-07-02 14:36:00 +03:00
97 changed files with 1358 additions and 1336 deletions

29
.github/ISSUE_TEMPLATE.md vendored Normal file
View File

@@ -0,0 +1,29 @@
**PLEASE READ THIS**
I acknowledge that:
- I have updated to the latest version of the app (https://github.com/KotatsuApp/Kotatsu/releases/latest)
- If this is an issue with a parser, that I should be opening an issue in https://github.com/KotatsuApp/kotatsu-parsers
- I have searched the existing issues and this is new ticket **NOT** a duplicate or related to another open or closed issue
- I will fill out the title and the information in this template
Note that the issue will be automatically closed if you do not fill out the title or requested information.
**DELETE THIS SECTION IF YOU HAVE READ AND ACKNOWLEDGED IT**
---
## Device information
* Kotatsu version: ?
* Android version: ?
* Device: ?
## Steps to reproduce
1. First step
2. Second step
## Issue/Request
?
## Other details
Additional details and attachments.

View File

@@ -1,5 +1,5 @@
blank_issues_enabled: false blank_issues_enabled: false
contact_links: contact_links:
- name: ⚠️ Source issue - name: ⚠️ Source issue
url: https://github.com/nv95/kotatsu-parsers/issues/new url: https://github.com/KotatsuApp/kotatsu-parsers/issues/new
about: Issues and requests for sources should be opened in the kotatsu-parsers repository instead about: Issues and requests for sources should be opened in the kotatsu-parsers repository instead

View File

@@ -44,7 +44,7 @@ body:
label: Kotatsu version label: Kotatsu version
description: You can find your Kotatsu version in **Settings → About**. description: You can find your Kotatsu version in **Settings → About**.
placeholder: | placeholder: |
Example: "3.3.1" Example: "3.3"
validations: validations:
required: true required: true
@@ -87,7 +87,5 @@ body:
required: true required: true
- label: If this is an issue with a source, I should be opening an issue in the [parsers repository](https://github.com/KotatsuApp/kotatsu-parsers/issues/new). - label: If this is an issue with a source, I should be opening an issue in the [parsers repository](https://github.com/KotatsuApp/kotatsu-parsers/issues/new).
required: true required: true
- label: I have updated the app to version **[3.3.1](https://github.com/KotatsuApp/Kotatsu/releases/latest)**.
required: true
- label: I will fill out all of the requested information in this form. - label: I will fill out all of the requested information in this form.
required: true required: true

View File

@@ -21,6 +21,16 @@ body:
placeholder: | placeholder: |
Additional details and attachments. Additional details and attachments.
- type: input
id: kotatsu-version
attributes:
label: Kotatsu version
description: You can find your Kotatsu version in **Settings → About**.
placeholder: |
Example: "3.3"
validations:
required: true
- type: checkboxes - type: checkboxes
id: acknowledgements id: acknowledgements
attributes: attributes:
@@ -33,7 +43,5 @@ body:
required: true required: true
- label: If this is an issue with a source, I should be opening an issue in the [parsers repository](https://github.com/KotatsuApp/kotatsu-parsers/issues/new). - label: If this is an issue with a source, I should be opening an issue in the [parsers repository](https://github.com/KotatsuApp/kotatsu-parsers/issues/new).
required: true required: true
- label: I have updated the app to version **[3.3.1](https://github.com/KotatsuApp/Kotatsu/releases/latest)**.
required: true
- label: I will fill out all of the requested information in this form. - label: I will fill out all of the requested information in this form.
required: true required: true

29
.github/workflows/issue_moderator.yml vendored Normal file
View File

@@ -0,0 +1,29 @@
name: Issue moderator
on:
issues:
types: [opened, edited, reopened]
issue_comment:
types: [created]
jobs:
moderate:
runs-on: ubuntu-latest
steps:
- name: Moderate issues
uses: tachiyomiorg/issue-moderator-action@v1
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
auto-close-rules: |
[
{
"type": "body",
"regex": ".*DELETE THIS SECTION IF YOU HAVE READ AND ACKNOWLEDGED IT.*",
"message": "The acknowledgment section was not removed."
},
{
"type": "body",
"regex": ".*\\* (Kotatsu version|Android version|Device): \\?.*",
"message": "Requested information in the template was not filled out."
}
]

1
.gitignore vendored
View File

@@ -13,6 +13,7 @@
/.idea/kotlinScripting.xml /.idea/kotlinScripting.xml
/.idea/deploymentTargetDropDown.xml /.idea/deploymentTargetDropDown.xml
/.idea/androidTestResultsUserPreferences.xml /.idea/androidTestResultsUserPreferences.xml
/.idea/render.experimental.xml
.DS_Store .DS_Store
/build /build
/captures /captures

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RenderSettings">
<option name="quality" value="0.25" />
</component>
</project>

View File

@@ -10,7 +10,7 @@ Kotatsu is a free and open source manga reader for Android.
alt="Get it on F-Droid" alt="Get it on F-Droid"
height="80">](https://f-droid.org/packages/org.koitharu.kotatsu) height="80">](https://f-droid.org/packages/org.koitharu.kotatsu)
Download APK from Github Releases: Download APK from GitHub Releases:
- [Latest release](https://github.com/KotatsuApp/Kotatsu/releases/latest) - [Latest release](https://github.com/KotatsuApp/Kotatsu/releases/latest)

View File

@@ -14,8 +14,8 @@ android {
applicationId 'org.koitharu.kotatsu' applicationId 'org.koitharu.kotatsu'
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 32 targetSdkVersion 32
versionCode 410 versionCode 411
versionName '3.3.1' versionName '3.3.2'
generatedDensities = [] generatedDensities = []
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

View File

@@ -94,6 +94,7 @@ class KotatsuApp : Application() {
ReportField.PHONE_MODEL, ReportField.PHONE_MODEL,
ReportField.CRASH_CONFIGURATION, ReportField.CRASH_CONFIGURATION,
ReportField.STACK_TRACE, ReportField.STACK_TRACE,
ReportField.CUSTOM_DATA,
ReportField.SHARED_PREFERENCES, ReportField.SHARED_PREFERENCES,
) )
dialog { dialog {

View File

@@ -6,14 +6,12 @@ import androidx.annotation.CallSuper
import androidx.annotation.StringRes import androidx.annotation.StringRes
import androidx.core.graphics.Insets import androidx.core.graphics.Insets
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.fragment.app.Fragment
import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import org.koin.android.ext.android.inject import org.koin.android.ext.android.inject
import org.koitharu.kotatsu.base.ui.util.RecyclerViewOwner import org.koitharu.kotatsu.base.ui.util.RecyclerViewOwner
import org.koitharu.kotatsu.base.ui.util.WindowInsetsDelegate import org.koitharu.kotatsu.base.ui.util.WindowInsetsDelegate
import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.AppSettings
import org.koitharu.kotatsu.settings.SettingsActivity
import org.koitharu.kotatsu.settings.SettingsHeadersFragment import org.koitharu.kotatsu.settings.SettingsHeadersFragment
abstract class BasePreferenceFragment(@StringRes private val titleId: Int) : abstract class BasePreferenceFragment(@StringRes private val titleId: Int) :

View File

@@ -1,89 +0,0 @@
package org.koitharu.kotatsu.base.ui.dialog
import android.content.Context
import android.content.DialogInterface
import android.text.InputFilter
import android.view.LayoutInflater
import androidx.annotation.StringRes
import androidx.appcompat.app.AlertDialog
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import org.koitharu.kotatsu.databinding.DialogInputBinding
class TextInputDialog private constructor(
private val delegate: AlertDialog,
) : DialogInterface by delegate {
fun show() = delegate.show()
class Builder(context: Context) {
private val binding = DialogInputBinding.inflate(LayoutInflater.from(context))
private val delegate = MaterialAlertDialogBuilder(context)
.setView(binding.root)
fun setTitle(@StringRes titleResId: Int): Builder {
delegate.setTitle(titleResId)
return this
}
fun setTitle(title: CharSequence): Builder {
delegate.setTitle(title)
return this
}
fun setHint(@StringRes hintResId: Int): Builder {
binding.inputEdit.hint = binding.root.context.getString(hintResId)
return this
}
fun setMaxLength(maxLength: Int, strict: Boolean): Builder {
with(binding.inputLayout) {
counterMaxLength = maxLength
isCounterEnabled = maxLength > 0
}
if (strict && maxLength > 0) {
binding.inputEdit.filters += InputFilter.LengthFilter(maxLength)
}
return this
}
fun setInputType(inputType: Int): Builder {
binding.inputEdit.inputType = inputType
return this
}
fun setText(text: String): Builder {
binding.inputEdit.setText(text)
binding.inputEdit.setSelection(text.length)
return this
}
fun setPositiveButton(
@StringRes textId: Int,
listener: (DialogInterface, String) -> Unit
): Builder {
delegate.setPositiveButton(textId) { dialog, _ ->
listener(dialog, binding.inputEdit.text?.toString().orEmpty())
}
return this
}
fun setNegativeButton(
@StringRes textId: Int,
listener: DialogInterface.OnClickListener? = null
): Builder {
delegate.setNegativeButton(textId, listener)
return this
}
fun setOnCancelListener(listener: DialogInterface.OnCancelListener): Builder {
delegate.setOnCancelListener(listener)
return this
}
fun create() =
TextInputDialog(delegate.create())
}
}

View File

@@ -17,19 +17,28 @@
package org.koitharu.kotatsu.base.ui.widgets package org.koitharu.kotatsu.base.ui.widgets
import android.content.Context import android.content.Context
import android.content.res.ColorStateList
import android.graphics.drawable.Drawable
import android.util.AttributeSet import android.util.AttributeSet
import android.view.LayoutInflater import android.view.LayoutInflater
import android.widget.Button
import android.widget.FrameLayout import android.widget.FrameLayout
import android.widget.TextView import androidx.annotation.ColorInt
import androidx.annotation.StringRes import androidx.annotation.StringRes
import androidx.core.graphics.drawable.DrawableCompat
import androidx.core.view.postDelayed import androidx.core.view.postDelayed
import org.koitharu.kotatsu.R import com.google.android.material.color.MaterialColors
import com.google.android.material.shape.MaterialShapeDrawable
import com.google.android.material.shape.ShapeAppearanceModel
import com.google.android.material.snackbar.Snackbar
import org.koitharu.kotatsu.databinding.FadingSnackbarLayoutBinding
import org.koitharu.kotatsu.utils.ext.getThemeColorStateList
import com.google.android.material.R as materialR
private const val ENTER_DURATION = 300L private const val ENTER_DURATION = 300L
private const val EXIT_DURATION = 200L private const val EXIT_DURATION = 200L
private const val SHORT_DURATION = 1_500L private const val SHORT_DURATION_MS = 1_500L
private const val LONG_DURATION = 2_750L private const val LONG_DURATION_MS = 2_750L
/** /**
* A custom snackbar implementation allowing more control over placement and entry/exit animations. * A custom snackbar implementation allowing more control over placement and entry/exit animations.
* *
@@ -40,16 +49,13 @@ private const val LONG_DURATION = 2_750L
class FadingSnackbar @JvmOverloads constructor( class FadingSnackbar @JvmOverloads constructor(
context: Context, context: Context,
attrs: AttributeSet? = null, attrs: AttributeSet? = null,
defStyleAttr: Int = 0 defStyleAttr: Int = 0,
) : FrameLayout(context, attrs, defStyleAttr) { ) : FrameLayout(context, attrs, defStyleAttr) {
private val message: TextView private val binding = FadingSnackbarLayoutBinding.inflate(LayoutInflater.from(context), this)
private val action: Button
init { init {
val view = LayoutInflater.from(context).inflate(R.layout.fading_snackbar_layout, this, true) binding.snackbarLayout.background = createThemedBackground()
message = view.findViewById(R.id.snackbar_text)
action = view.findViewById(R.id.snackbar_action)
} }
fun dismiss() { fun dismiss() {
@@ -62,33 +68,66 @@ class FadingSnackbar @JvmOverloads constructor(
} }
fun show( fun show(
messageText: CharSequence? = null, messageText: CharSequence?,
@StringRes actionId: Int? = null, @StringRes actionId: Int = 0,
longDuration: Boolean = true, duration: Int = Snackbar.LENGTH_SHORT,
actionClick: () -> Unit = { dismiss() }, onActionClick: (FadingSnackbar.() -> Unit)? = null,
dismissListener: () -> Unit = { } onDismiss: (() -> Unit)? = null,
) { ) {
message.text = messageText binding.snackbarText.text = messageText
if (actionId != null) { if (actionId != 0) {
action.run { with(binding.snackbarAction) {
visibility = VISIBLE visibility = VISIBLE
text = context.getString(actionId) text = context.getString(actionId)
setOnClickListener { setOnClickListener {
actionClick() onActionClick?.invoke(this@FadingSnackbar) ?: dismiss()
} }
} }
} else { } else {
action.visibility = GONE binding.snackbarAction.visibility = GONE
} }
alpha = 0f alpha = 0f
visibility = VISIBLE visibility = VISIBLE
animate() animate()
.alpha(1f) .alpha(1f)
.duration = ENTER_DURATION .duration = ENTER_DURATION
val showDuration = ENTER_DURATION + if (longDuration) LONG_DURATION else SHORT_DURATION if (duration == Snackbar.LENGTH_INDEFINITE) {
postDelayed(showDuration) { return
}
val durationMs = ENTER_DURATION + if (duration == Snackbar.LENGTH_LONG) LONG_DURATION_MS else SHORT_DURATION_MS
postDelayed(durationMs) {
dismiss() dismiss()
dismissListener() onDismiss?.invoke()
} }
} }
private fun createThemedBackground(): Drawable {
val backgroundColor = MaterialColors.layer(this, materialR.attr.colorSurface, materialR.attr.colorOnSurface, 1f)
val shapeAppearanceModel = ShapeAppearanceModel.builder(
context,
materialR.style.ShapeAppearance_Material3_Corner_ExtraSmall,
0
).build()
val background = createMaterialShapeDrawableBackground(
backgroundColor,
shapeAppearanceModel,
)
val backgroundTint = context.getThemeColorStateList(materialR.attr.colorSurfaceInverse)
return if (backgroundTint != null) {
val wrappedDrawable = DrawableCompat.wrap(background)
DrawableCompat.setTintList(wrappedDrawable, backgroundTint)
wrappedDrawable
} else {
DrawableCompat.wrap(background)
}
}
private fun createMaterialShapeDrawableBackground(
@ColorInt backgroundColor: Int,
shapeAppearanceModel: ShapeAppearanceModel,
): MaterialShapeDrawable {
val background = MaterialShapeDrawable(shapeAppearanceModel)
background.fillColor = ColorStateList.valueOf(backgroundColor)
return background
}
} }

View File

@@ -15,11 +15,11 @@ class BackupZipOutput(val file: File) : Closeable {
private val output = ZipOutput(file, Deflater.BEST_COMPRESSION) private val output = ZipOutput(file, Deflater.BEST_COMPRESSION)
suspend fun put(entry: BackupEntry) { suspend fun put(entry: BackupEntry) = runInterruptible(Dispatchers.IO) {
output.put(entry.name, entry.data.toString(2)) output.put(entry.name, entry.data.toString(2))
} }
suspend fun finish() { suspend fun finish() = runInterruptible(Dispatchers.IO) {
output.finish() output.finish()
} }

View File

@@ -1,8 +1,6 @@
package org.koitharu.kotatsu.core.exceptions package org.koitharu.kotatsu.core.exceptions
import androidx.annotation.StringRes
import okio.IOException import okio.IOException
import org.koitharu.kotatsu.R
class CloudFlareProtectedException( class CloudFlareProtectedException(
val url: String val url: String

View File

@@ -126,6 +126,10 @@ class AppSettings(context: Context) {
get() = prefs.getString(KEY_APP_PASSWORD, null) get() = prefs.getString(KEY_APP_PASSWORD, null)
set(value) = prefs.edit { if (value != null) putString(KEY_APP_PASSWORD, value) else remove(KEY_APP_PASSWORD) } set(value) = prefs.edit { if (value != null) putString(KEY_APP_PASSWORD, value) else remove(KEY_APP_PASSWORD) }
var isBiometricProtectionEnabled: Boolean
get() = prefs.getBoolean(KEY_PROTECT_APP_BIOMETRIC, true)
set(value) = prefs.edit { putBoolean(KEY_PROTECT_APP_BIOMETRIC, value) }
var sourcesOrder: List<String> var sourcesOrder: List<String>
get() = prefs.getString(KEY_SOURCES_ORDER, null) get() = prefs.getString(KEY_SOURCES_ORDER, null)
?.split('|') ?.split('|')
@@ -286,6 +290,7 @@ class AppSettings(context: Context) {
const val KEY_READER_MODE_DETECT = "reader_mode_detect" const val KEY_READER_MODE_DETECT = "reader_mode_detect"
const val KEY_APP_PASSWORD = "app_password" const val KEY_APP_PASSWORD = "app_password"
const val KEY_PROTECT_APP = "protect_app" const val KEY_PROTECT_APP = "protect_app"
const val KEY_PROTECT_APP_BIOMETRIC = "protect_app_bio"
const val KEY_APP_VERSION = "app_version" const val KEY_APP_VERSION = "app_version"
const val KEY_ZOOM_MODE = "zoom_mode" const val KEY_ZOOM_MODE = "zoom_mode"
const val KEY_BACKUP = "backup" const val KEY_BACKUP = "backup"
@@ -310,9 +315,6 @@ class AppSettings(context: Context) {
const val KEY_APP_UPDATE = "app_update" const val KEY_APP_UPDATE = "app_update"
const val KEY_APP_UPDATE_AUTO = "app_update_auto" const val KEY_APP_UPDATE_AUTO = "app_update_auto"
const val KEY_APP_TRANSLATION = "about_app_translation" const val KEY_APP_TRANSLATION = "about_app_translation"
const val KEY_FEEDBACK_4PDA = "about_feedback_4pda"
const val KEY_FEEDBACK_DISCORD = "about_feedback_discord"
const val KEY_FEEDBACK_GITHUB = "about_feedback_github"
private const val NETWORK_NEVER = 0 private const val NETWORK_NEVER = 0
private const val NETWORK_ALWAYS = 1 private const val NETWORK_ALWAYS = 1

View File

@@ -21,9 +21,11 @@ import androidx.core.view.updatePadding
import androidx.fragment.app.commit import androidx.fragment.app.commit
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.Snackbar
import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayoutMediator import com.google.android.material.tabs.TabLayoutMediator
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.acra.ktx.sendWithAcra
import org.koin.android.ext.android.get import org.koin.android.ext.android.get
import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.androidx.viewmodel.ext.android.viewModel
import org.koin.core.parameter.parametersOf import org.koin.core.parameter.parametersOf
@@ -37,6 +39,7 @@ import org.koitharu.kotatsu.core.os.ShortcutsRepository
import org.koitharu.kotatsu.databinding.ActivityDetailsBinding import org.koitharu.kotatsu.databinding.ActivityDetailsBinding
import org.koitharu.kotatsu.details.ui.adapter.BranchesAdapter import org.koitharu.kotatsu.details.ui.adapter.BranchesAdapter
import org.koitharu.kotatsu.download.ui.service.DownloadService import org.koitharu.kotatsu.download.ui.service.DownloadService
import org.koitharu.kotatsu.parsers.exception.ParseException
import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.Manga
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.util.mapNotNullToSet import org.koitharu.kotatsu.parsers.util.mapNotNullToSet
@@ -82,7 +85,7 @@ class DetailsActivity :
viewModel.onMangaRemoved.observe(this, ::onMangaRemoved) viewModel.onMangaRemoved.observe(this, ::onMangaRemoved)
viewModel.onError.observe(this, ::onError) viewModel.onError.observe(this, ::onError)
viewModel.onShowToast.observe(this) { viewModel.onShowToast.observe(this) {
binding.snackbar.show(messageText = getString(it), longDuration = false) binding.snackbar.show(messageText = getString(it))
} }
registerReceiver(downloadReceiver, IntentFilter(DownloadService.ACTION_DOWNLOAD_COMPLETE)) registerReceiver(downloadReceiver, IntentFilter(DownloadService.ACTION_DOWNLOAD_COMPLETE))
@@ -115,6 +118,21 @@ class DetailsActivity :
Toast.makeText(this, e.getDisplayMessage(resources), Toast.LENGTH_LONG).show() Toast.makeText(this, e.getDisplayMessage(resources), Toast.LENGTH_LONG).show()
finishAfterTransition() finishAfterTransition()
} }
e is ParseException || e is IllegalArgumentException || e is IllegalStateException -> {
binding.snackbar.show(
messageText = e.getDisplayMessage(resources),
actionId = R.string.report,
duration = if (viewModel.manga.value?.chapters == null) {
Snackbar.LENGTH_INDEFINITE
} else {
Snackbar.LENGTH_LONG
},
onActionClick = {
e.sendWithAcra()
dismiss()
}
)
}
else -> { else -> {
binding.snackbar.show(e.getDisplayMessage(resources)) binding.snackbar.show(e.getDisplayMessage(resources))
} }

View File

@@ -4,7 +4,6 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.asFlow import androidx.lifecycle.asFlow
import androidx.lifecycle.asLiveData import androidx.lifecycle.asLiveData
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import java.io.IOException
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.* import kotlinx.coroutines.flow.*
@@ -32,6 +31,7 @@ import org.koitharu.kotatsu.tracker.domain.TrackingRepository
import org.koitharu.kotatsu.utils.SingleLiveEvent import org.koitharu.kotatsu.utils.SingleLiveEvent
import org.koitharu.kotatsu.utils.ext.asLiveDataDistinct import org.koitharu.kotatsu.utils.ext.asLiveDataDistinct
import org.koitharu.kotatsu.utils.ext.printStackTraceDebug import org.koitharu.kotatsu.utils.ext.printStackTraceDebug
import java.io.IOException
class DetailsViewModel( class DetailsViewModel(
intent: MangaIntent, intent: MangaIntent,

View File

@@ -3,6 +3,7 @@ package org.koitharu.kotatsu.details.ui
import androidx.core.os.LocaleListCompat import androidx.core.os.LocaleListCompat
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import org.acra.ACRA
import org.koitharu.kotatsu.base.domain.MangaDataRepository import org.koitharu.kotatsu.base.domain.MangaDataRepository
import org.koitharu.kotatsu.base.domain.MangaIntent import org.koitharu.kotatsu.base.domain.MangaIntent
import org.koitharu.kotatsu.core.exceptions.MangaNotFoundException import org.koitharu.kotatsu.core.exceptions.MangaNotFoundException
@@ -13,6 +14,7 @@ import org.koitharu.kotatsu.details.ui.model.ChapterListItem
import org.koitharu.kotatsu.details.ui.model.toListItem import org.koitharu.kotatsu.details.ui.model.toListItem
import org.koitharu.kotatsu.history.domain.HistoryRepository import org.koitharu.kotatsu.history.domain.HistoryRepository
import org.koitharu.kotatsu.local.domain.LocalMangaRepository import org.koitharu.kotatsu.local.domain.LocalMangaRepository
import org.koitharu.kotatsu.parsers.exception.ParseException
import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.Manga
import org.koitharu.kotatsu.parsers.model.MangaChapter import org.koitharu.kotatsu.parsers.model.MangaChapter
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
@@ -20,6 +22,7 @@ import org.koitharu.kotatsu.parsers.util.mapToSet
import org.koitharu.kotatsu.parsers.util.toTitleCase import org.koitharu.kotatsu.parsers.util.toTitleCase
import org.koitharu.kotatsu.utils.ext.iterator import org.koitharu.kotatsu.utils.ext.iterator
import org.koitharu.kotatsu.utils.ext.printStackTraceDebug import org.koitharu.kotatsu.utils.ext.printStackTraceDebug
import org.koitharu.kotatsu.utils.ext.setCurrentManga
class MangaDetailsDelegate( class MangaDetailsDelegate(
private val intent: MangaIntent, private val intent: MangaIntent,
@@ -32,6 +35,7 @@ class MangaDetailsDelegate(
private val mangaData = MutableStateFlow(intent.manga) private val mangaData = MutableStateFlow(intent.manga)
val selectedBranch = MutableStateFlow<String?>(null) val selectedBranch = MutableStateFlow<String?>(null)
// Remote manga for saved and saved for remote // Remote manga for saved and saved for remote
val relatedManga = MutableStateFlow<Manga?>(null) val relatedManga = MutableStateFlow<Manga?>(null)
val manga: StateFlow<Manga?> val manga: StateFlow<Manga?>
@@ -41,6 +45,7 @@ class MangaDetailsDelegate(
suspend fun doLoad() { suspend fun doLoad() {
var manga = mangaDataRepository.resolveIntent(intent) var manga = mangaDataRepository.resolveIntent(intent)
?: throw MangaNotFoundException("Cannot find manga") ?: throw MangaNotFoundException("Cannot find manga")
ACRA.setCurrentManga(manga)
mangaData.value = manga mangaData.value = manga
manga = MangaRepository(manga.source).getDetails(manga) manga = MangaRepository(manga.source).getDetails(manga)
// find default branch // find default branch

View File

@@ -29,7 +29,6 @@ import org.koitharu.kotatsu.scrobbling.domain.model.ScrobblingStatus
import org.koitharu.kotatsu.scrobbling.ui.selector.ScrobblingSelectorBottomSheet import org.koitharu.kotatsu.scrobbling.ui.selector.ScrobblingSelectorBottomSheet
import org.koitharu.kotatsu.utils.ext.enqueueWith import org.koitharu.kotatsu.utils.ext.enqueueWith
import org.koitharu.kotatsu.utils.ext.getDisplayMessage import org.koitharu.kotatsu.utils.ext.getDisplayMessage
import org.koitharu.kotatsu.utils.ext.requireValue
class ScrobblingInfoBottomSheet : class ScrobblingInfoBottomSheet :
BaseBottomSheet<SheetScrobblingBinding>(), BaseBottomSheet<SheetScrobblingBinding>(),

View File

@@ -4,6 +4,7 @@ import android.content.Context
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import org.koitharu.kotatsu.R import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.model.FavouriteCategory import org.koitharu.kotatsu.core.model.FavouriteCategory
import com.google.android.material.R as materialR
class CategoriesEditDelegate( class CategoriesEditDelegate(
private val context: Context, private val context: Context,
@@ -11,9 +12,10 @@ class CategoriesEditDelegate(
) { ) {
fun deleteCategory(category: FavouriteCategory) { fun deleteCategory(category: FavouriteCategory) {
MaterialAlertDialogBuilder(context) MaterialAlertDialogBuilder(context, materialR.style.ThemeOverlay_Material3_MaterialAlertDialog_Centered)
.setMessage(context.getString(R.string.category_delete_confirm, category.title)) .setMessage(context.getString(R.string.category_delete_confirm, category.title))
.setTitle(R.string.remove_category) .setTitle(R.string.remove_category)
.setIcon(R.drawable.ic_delete)
.setNegativeButton(android.R.string.cancel, null) .setNegativeButton(android.R.string.cancel, null)
.setPositiveButton(R.string.remove) { _, _ -> .setPositiveButton(R.string.remove) { _, _ ->
callback.onDeleteCategory(category) callback.onDeleteCategory(category)

View File

@@ -7,6 +7,7 @@ import android.view.MenuItem
import androidx.core.view.MenuProvider import androidx.core.view.MenuProvider
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import org.koitharu.kotatsu.R import org.koitharu.kotatsu.R
import com.google.android.material.R as materialR
class HistoryListMenuProvider( class HistoryListMenuProvider(
private val context: Context, private val context: Context,
@@ -19,9 +20,10 @@ class HistoryListMenuProvider(
override fun onMenuItemSelected(menuItem: MenuItem): Boolean = when (menuItem.itemId) { override fun onMenuItemSelected(menuItem: MenuItem): Boolean = when (menuItem.itemId) {
R.id.action_clear_history -> { R.id.action_clear_history -> {
MaterialAlertDialogBuilder(context) MaterialAlertDialogBuilder(context, materialR.style.ThemeOverlay_Material3_MaterialAlertDialog_Centered)
.setTitle(R.string.clear_history) .setTitle(R.string.clear_history)
.setMessage(R.string.text_clear_history_prompt) .setMessage(R.string.text_clear_history_prompt)
.setIcon(R.drawable.ic_delete)
.setNegativeButton(android.R.string.cancel, null) .setNegativeButton(android.R.string.cancel, null)
.setPositiveButton(R.string.clear) { _, _ -> .setPositiveButton(R.string.clear) { _, _ ->
viewModel.clearHistory() viewModel.clearHistory()

View File

@@ -9,7 +9,6 @@ import androidx.collection.ArraySet
import androidx.core.graphics.Insets import androidx.core.graphics.Insets
import androidx.core.view.isNotEmpty import androidx.core.view.isNotEmpty
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.lifecycle.Lifecycle
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar

View File

@@ -299,8 +299,9 @@ class MainActivity :
} }
override fun onClearSearchHistory() { override fun onClearSearchHistory() {
MaterialAlertDialogBuilder(this) MaterialAlertDialogBuilder(this, materialR.style.ThemeOverlay_Material3_MaterialAlertDialog_Centered)
.setTitle(R.string.clear_search_history) .setTitle(R.string.clear_search_history)
.setIcon(R.drawable.ic_clear_all)
.setMessage(R.string.text_clear_search_history_prompt) .setMessage(R.string.text_clear_search_history_prompt)
.setNegativeButton(android.R.string.cancel, null) .setNegativeButton(android.R.string.cancel, null)
.setPositiveButton(R.string.clear) { _, _ -> .setPositiveButton(R.string.clear) { _, _ ->

View File

@@ -96,6 +96,9 @@ class ProtectActivity :
} }
private fun useFingerprint(): Boolean { private fun useFingerprint(): Boolean {
if (!viewModel.isBiometricEnabled) {
return false
}
if (BiometricManager.from(this).canAuthenticate(BIOMETRIC_WEAK) != BIOMETRIC_SUCCESS) { if (BiometricManager.from(this).canAuthenticate(BIOMETRIC_WEAK) != BIOMETRIC_SUCCESS) {
return false return false
} }

View File

@@ -19,6 +19,9 @@ class ProtectViewModel(
val onUnlockSuccess = SingleLiveEvent<Unit>() val onUnlockSuccess = SingleLiveEvent<Unit>()
val isBiometricEnabled
get() = settings.isBiometricProtectionEnabled
fun tryUnlock(password: String) { fun tryUnlock(password: String) {
if (job?.isActive == true) { if (job?.isActive == true) {
return return

View File

@@ -24,6 +24,7 @@ import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.acra.ktx.sendWithAcra
import org.koin.android.ext.android.get import org.koin.android.ext.android.get
import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.androidx.viewmodel.ext.android.viewModel
import org.koin.core.parameter.parametersOf import org.koin.core.parameter.parametersOf
@@ -214,6 +215,8 @@ class ReaderActivity :
val resolveTextId = ExceptionResolver.getResolveStringId(e) val resolveTextId = ExceptionResolver.getResolveStringId(e)
if (resolveTextId != 0) { if (resolveTextId != 0) {
dialog.setPositiveButton(resolveTextId, listener) dialog.setPositiveButton(resolveTextId, listener)
} else {
dialog.setPositiveButton(R.string.report, listener)
} }
dialog.show() dialog.show()
} }
@@ -368,7 +371,11 @@ class ReaderActivity :
override fun onClick(dialog: DialogInterface?, which: Int) { override fun onClick(dialog: DialogInterface?, which: Int) {
if (which == DialogInterface.BUTTON_POSITIVE) { if (which == DialogInterface.BUTTON_POSITIVE) {
dialog?.dismiss() dialog?.dismiss()
tryResolve(exception) if (ExceptionResolver.canResolve(exception)) {
tryResolve(exception)
} else {
exception.sendWithAcra()
}
} else { } else {
onCancel(dialog) onCancel(dialog)
} }

View File

@@ -6,9 +6,9 @@ import androidx.activity.result.ActivityResultLauncher
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import java.util.*
import kotlinx.coroutines.* import kotlinx.coroutines.*
import kotlinx.coroutines.flow.* import kotlinx.coroutines.flow.*
import org.acra.ACRA
import org.koitharu.kotatsu.R import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.base.domain.MangaDataRepository import org.koitharu.kotatsu.base.domain.MangaDataRepository
import org.koitharu.kotatsu.base.domain.MangaIntent import org.koitharu.kotatsu.base.domain.MangaIntent
@@ -32,6 +32,8 @@ import org.koitharu.kotatsu.utils.SingleLiveEvent
import org.koitharu.kotatsu.utils.ext.asLiveDataDistinct import org.koitharu.kotatsu.utils.ext.asLiveDataDistinct
import org.koitharu.kotatsu.utils.ext.printStackTraceDebug import org.koitharu.kotatsu.utils.ext.printStackTraceDebug
import org.koitharu.kotatsu.utils.ext.processLifecycleScope import org.koitharu.kotatsu.utils.ext.processLifecycleScope
import org.koitharu.kotatsu.utils.ext.setCurrentManga
import java.util.*
private const val BOUNDS_PAGE_OFFSET = 2 private const val BOUNDS_PAGE_OFFSET = 2
private const val PAGES_TRIM_THRESHOLD = 120 private const val PAGES_TRIM_THRESHOLD = 120
@@ -257,6 +259,7 @@ class ReaderViewModel(
private fun loadImpl() { private fun loadImpl() {
loadingJob = launchLoadingJob(Dispatchers.Default) { loadingJob = launchLoadingJob(Dispatchers.Default) {
var manga = dataRepository.resolveIntent(intent) ?: throw MangaNotFoundException("Cannot find manga") var manga = dataRepository.resolveIntent(intent) ?: throw MangaNotFoundException("Cannot find manga")
ACRA.setCurrentManga(manga)
mangaData.value = manga mangaData.value = manga
val repo = MangaRepository(manga.source) val repo = MangaRepository(manga.source)
manga = repo.getDetails(manga) manga = repo.getDetails(manga)

View File

@@ -16,6 +16,7 @@ abstract class BasePageHolder<B : ViewBinding>(
exceptionResolver: ExceptionResolver exceptionResolver: ExceptionResolver
) : RecyclerView.ViewHolder(binding.root), PageHolderDelegate.Callback { ) : RecyclerView.ViewHolder(binding.root), PageHolderDelegate.Callback {
@Suppress("LeakingThis")
protected val delegate = PageHolderDelegate(loader, settings, this, exceptionResolver) protected val delegate = PageHolderDelegate(loader, settings, this, exceptionResolver)
protected val bindingInfo = LayoutPageInfoBinding.bind(binding.root) protected val bindingInfo = LayoutPageInfoBinding.bind(binding.root)

View File

@@ -11,10 +11,11 @@ import org.koitharu.kotatsu.utils.ext.resetTransformations
import kotlin.coroutines.resume import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine import kotlin.coroutines.suspendCoroutine
@Suppress("LeakingThis")
abstract class BaseReaderAdapter<H : BasePageHolder<*>>( abstract class BaseReaderAdapter<H : BasePageHolder<*>>(
private val loader: PageLoader, private val loader: PageLoader,
private val settings: AppSettings, private val settings: AppSettings,
private val exceptionResolver: ExceptionResolver private val exceptionResolver: ExceptionResolver,
) : RecyclerView.Adapter<H>() { ) : RecyclerView.Adapter<H>() {
private val differ = AsyncListDiffer(this, DiffCallback()) private val differ = AsyncListDiffer(this, DiffCallback())

View File

@@ -3,7 +3,6 @@ package org.koitharu.kotatsu.search.ui
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.os.Parcelable
import android.view.ViewGroup import android.view.ViewGroup
import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.SearchView
import androidx.core.graphics.Insets import androidx.core.graphics.Insets

View File

@@ -91,7 +91,7 @@ class SettingsActivity :
val fm = supportFragmentManager val fm = supportFragmentManager
val fragment = fm.fragmentFactory.instantiate(classLoader, pref.fragment ?: return false) val fragment = fm.fragmentFactory.instantiate(classLoader, pref.fragment ?: return false)
fragment.arguments = pref.extras fragment.arguments = pref.extras
// fragment.setTargetFragment(caller, 0) fragment.setTargetFragment(caller, 0)
openFragment(fragment) openFragment(fragment)
return true return true
} }
@@ -122,6 +122,7 @@ class SettingsActivity :
ACTION_READER -> ReaderSettingsFragment() ACTION_READER -> ReaderSettingsFragment()
ACTION_SUGGESTIONS -> SuggestionsSettingsFragment() ACTION_SUGGESTIONS -> SuggestionsSettingsFragment()
ACTION_SHIKIMORI -> ShikimoriSettingsFragment() ACTION_SHIKIMORI -> ShikimoriSettingsFragment()
ACTION_TRACKER -> TrackerSettingsFragment()
ACTION_SOURCE -> SourceSettingsFragment.newInstance( ACTION_SOURCE -> SourceSettingsFragment.newInstance(
intent.getSerializableExtra(EXTRA_SOURCE) as? MangaSource ?: MangaSource.LOCAL intent.getSerializableExtra(EXTRA_SOURCE) as? MangaSource ?: MangaSource.LOCAL
) )
@@ -146,6 +147,7 @@ class SettingsActivity :
private const val ACTION_READER = "${BuildConfig.APPLICATION_ID}.action.MANAGE_READER_SETTINGS" private const val ACTION_READER = "${BuildConfig.APPLICATION_ID}.action.MANAGE_READER_SETTINGS"
private const val ACTION_SUGGESTIONS = "${BuildConfig.APPLICATION_ID}.action.MANAGE_SUGGESTIONS" private const val ACTION_SUGGESTIONS = "${BuildConfig.APPLICATION_ID}.action.MANAGE_SUGGESTIONS"
private const val ACTION_TRACKER = "${BuildConfig.APPLICATION_ID}.action.MANAGE_TRACKER"
private const val ACTION_SOURCE = "${BuildConfig.APPLICATION_ID}.action.MANAGE_SOURCE_SETTINGS" private const val ACTION_SOURCE = "${BuildConfig.APPLICATION_ID}.action.MANAGE_SOURCE_SETTINGS"
private const val ACTION_SHIKIMORI = "${BuildConfig.APPLICATION_ID}.action.MANAGE_SHIKIMORI_SETTINGS" private const val ACTION_SHIKIMORI = "${BuildConfig.APPLICATION_ID}.action.MANAGE_SHIKIMORI_SETTINGS"
private const val EXTRA_SOURCE = "source" private const val EXTRA_SOURCE = "source"
@@ -166,6 +168,10 @@ class SettingsActivity :
Intent(context, SettingsActivity::class.java) Intent(context, SettingsActivity::class.java)
.setAction(ACTION_SUGGESTIONS) .setAction(ACTION_SUGGESTIONS)
fun newTrackerSettingsIntent(context: Context) =
Intent(context, SettingsActivity::class.java)
.setAction(ACTION_TRACKER)
fun newSourceSettingsIntent(context: Context, source: MangaSource) = fun newSourceSettingsIntent(context: Context, source: MangaSource) =
Intent(context, SettingsActivity::class.java) Intent(context, SettingsActivity::class.java)
.setAction(ACTION_SOURCE) .setAction(ACTION_SOURCE)

View File

@@ -1,5 +1,7 @@
package org.koitharu.kotatsu.settings.protect package org.koitharu.kotatsu.settings.protect
import android.content.pm.PackageManager
import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.text.Editable import android.text.Editable
import android.text.TextWatcher import android.text.TextWatcher
@@ -7,9 +9,11 @@ import android.view.KeyEvent
import android.view.View import android.view.View
import android.view.WindowManager import android.view.WindowManager
import android.view.inputmethod.EditorInfo import android.view.inputmethod.EditorInfo
import android.widget.CompoundButton
import android.widget.TextView import android.widget.TextView
import androidx.core.graphics.Insets import androidx.core.graphics.Insets
import androidx.core.view.isGone import androidx.core.view.isGone
import androidx.core.view.isVisible
import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.androidx.viewmodel.ext.android.viewModel
import org.koitharu.kotatsu.R import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.base.ui.BaseActivity import org.koitharu.kotatsu.base.ui.BaseActivity
@@ -18,7 +22,7 @@ import org.koitharu.kotatsu.databinding.ActivitySetupProtectBinding
private const val MIN_PASSWORD_LENGTH = 4 private const val MIN_PASSWORD_LENGTH = 4
class ProtectSetupActivity : BaseActivity<ActivitySetupProtectBinding>(), TextWatcher, class ProtectSetupActivity : BaseActivity<ActivitySetupProtectBinding>(), TextWatcher,
View.OnClickListener, TextView.OnEditorActionListener { View.OnClickListener, TextView.OnEditorActionListener, CompoundButton.OnCheckedChangeListener {
private val viewModel by viewModel<ProtectSetupViewModel>() private val viewModel by viewModel<ProtectSetupViewModel>()
@@ -31,6 +35,9 @@ class ProtectSetupActivity : BaseActivity<ActivitySetupProtectBinding>(), TextWa
binding.buttonNext.setOnClickListener(this) binding.buttonNext.setOnClickListener(this)
binding.buttonCancel.setOnClickListener(this) binding.buttonCancel.setOnClickListener(this)
binding.switchBiometric.isChecked = viewModel.isBiometricEnabled
binding.switchBiometric.setOnCheckedChangeListener(this)
viewModel.isSecondStep.observe(this, this::onStepChanged) viewModel.isSecondStep.observe(this, this::onStepChanged)
viewModel.onPasswordSet.observe(this) { viewModel.onPasswordSet.observe(this) {
finishAfterTransition() finishAfterTransition()
@@ -62,6 +69,10 @@ class ProtectSetupActivity : BaseActivity<ActivitySetupProtectBinding>(), TextWa
} }
} }
override fun onCheckedChanged(buttonView: CompoundButton?, isChecked: Boolean) {
viewModel.setBiometricEnabled(isChecked)
}
override fun onEditorAction(v: TextView?, actionId: Int, event: KeyEvent?): Boolean { override fun onEditorAction(v: TextView?, actionId: Int, event: KeyEvent?): Boolean {
return if (actionId == EditorInfo.IME_ACTION_DONE && binding.buttonNext.isEnabled) { return if (actionId == EditorInfo.IME_ACTION_DONE && binding.buttonNext.isEnabled) {
binding.buttonNext.performClick() binding.buttonNext.performClick()
@@ -85,6 +96,7 @@ class ProtectSetupActivity : BaseActivity<ActivitySetupProtectBinding>(), TextWa
private fun onStepChanged(isSecondStep: Boolean) { private fun onStepChanged(isSecondStep: Boolean) {
binding.buttonCancel.isGone = isSecondStep binding.buttonCancel.isGone = isSecondStep
binding.switchBiometric.isVisible = isSecondStep && isBiometricAvailable()
if (isSecondStep) { if (isSecondStep) {
binding.layoutPassword.helperText = getString(R.string.repeat_password) binding.layoutPassword.helperText = getString(R.string.repeat_password)
binding.buttonNext.setText(R.string.confirm) binding.buttonNext.setText(R.string.confirm)
@@ -93,4 +105,9 @@ class ProtectSetupActivity : BaseActivity<ActivitySetupProtectBinding>(), TextWa
binding.buttonNext.setText(R.string.next) binding.buttonNext.setText(R.string.next)
} }
} }
private fun isBiometricAvailable(): Boolean {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
packageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)
}
} }

View File

@@ -22,6 +22,9 @@ class ProtectSetupViewModel(
val onPasswordMismatch = SingleLiveEvent<Unit>() val onPasswordMismatch = SingleLiveEvent<Unit>()
val onClearText = SingleLiveEvent<Unit>() val onClearText = SingleLiveEvent<Unit>()
val isBiometricEnabled
get() = settings.isBiometricProtectionEnabled
fun onNextClick(password: String) { fun onNextClick(password: String) {
if (firstPassword.value == null) { if (firstPassword.value == null) {
firstPassword.value = password firstPassword.value = password
@@ -35,4 +38,8 @@ class ProtectSetupViewModel(
} }
} }
} }
fun setBiometricEnabled(isEnabled: Boolean) {
settings.isBiometricProtectionEnabled = isEnabled
}
} }

View File

@@ -29,6 +29,6 @@ class RingtonePickContract(private val title: String?) : ActivityResultContract<
} }
override fun parseResult(resultCode: Int, intent: Intent?): Uri? { override fun parseResult(resultCode: Int, intent: Intent?): Uri? {
return intent?.getParcelableExtra<Uri>(RingtoneManager.EXTRA_RINGTONE_PICKED_URI) return intent?.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI)
} }
} }

View File

@@ -32,14 +32,14 @@ class SuggestionRepository(
suspend fun replace(suggestions: Iterable<MangaSuggestion>) { suspend fun replace(suggestions: Iterable<MangaSuggestion>) {
db.withTransaction { db.withTransaction {
db.suggestionDao.deleteAll() db.suggestionDao.deleteAll()
suggestions.forEach { x -> suggestions.forEach { (manga, relevance) ->
val tags = x.manga.tags.toEntities() val tags = manga.tags.toEntities()
db.tagsDao.upsert(tags) db.tagsDao.upsert(tags)
db.mangaDao.upsert(x.manga.toEntity(), tags) db.mangaDao.upsert(manga.toEntity(), tags)
db.suggestionDao.upsert( db.suggestionDao.upsert(
SuggestionEntity( SuggestionEntity(
mangaId = x.manga.id, mangaId = manga.id,
relevance = x.relevance, relevance = relevance,
createdAt = System.currentTimeMillis(), createdAt = System.currentTimeMillis(),
) )
) )

View File

@@ -9,6 +9,7 @@ import androidx.core.view.MenuProvider
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import org.koitharu.kotatsu.R import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.settings.SettingsActivity
import org.koitharu.kotatsu.tracker.work.TrackWorker import org.koitharu.kotatsu.tracker.work.TrackWorker
class FeedMenuProvider( class FeedMenuProvider(
@@ -43,6 +44,11 @@ class FeedMenuProvider(
}.show() }.show()
true true
} }
R.id.action_settings -> {
val intent = SettingsActivity.newTrackerSettingsIntent(context)
context.startActivity(intent)
true
}
else -> false else -> false
} }
} }

View File

@@ -35,7 +35,7 @@ class ScreenOrientationHelper(private val activity: Activity) {
isLandscape = !isLandscape isLandscape = !isLandscape
} }
fun observeAutoOrientation() = callbackFlow<Boolean> { fun observeAutoOrientation() = callbackFlow {
val observer = object : ContentObserver(Handler(activity.mainLooper)) { val observer = object : ContentObserver(Handler(activity.mainLooper)) {
override fun onChange(selfChange: Boolean) { override fun onChange(selfChange: Boolean) {
trySendBlocking(isAutoRotationEnabled) trySendBlocking(isAutoRotationEnabled)

View File

@@ -1,20 +0,0 @@
package org.koitharu.kotatsu.utils.ext
import android.view.View
import androidx.core.graphics.Insets
fun Insets.getStart(view: View): Int {
return if (view.layoutDirection == View.LAYOUT_DIRECTION_RTL) {
right
} else {
left
}
}
fun Insets.getEnd(view: View): Int {
return if (view.layoutDirection == View.LAYOUT_DIRECTION_RTL) {
left
} else {
right
}
}

View File

@@ -4,11 +4,11 @@ import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.lifecycle.liveData import androidx.lifecycle.liveData
import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.EmptyCoroutineContext
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import org.koitharu.kotatsu.utils.BufferedObserver import org.koitharu.kotatsu.utils.BufferedObserver
import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.EmptyCoroutineContext
fun <T> LiveData<T?>.observeNotNull(owner: LifecycleOwner, observer: Observer<T>) { fun <T> LiveData<T?>.observeNotNull(owner: LifecycleOwner, observer: Observer<T>) {
this.observe(owner) { this.observe(owner) {

View File

@@ -2,14 +2,16 @@ package org.koitharu.kotatsu.utils.ext
import android.content.ActivityNotFoundException import android.content.ActivityNotFoundException
import android.content.res.Resources import android.content.res.Resources
import java.io.FileNotFoundException import okio.FileNotFoundException
import java.net.SocketTimeoutException import org.acra.ACRA
import org.koitharu.kotatsu.R import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.exceptions.CloudFlareProtectedException import org.koitharu.kotatsu.core.exceptions.CloudFlareProtectedException
import org.koitharu.kotatsu.core.exceptions.EmptyHistoryException import org.koitharu.kotatsu.core.exceptions.EmptyHistoryException
import org.koitharu.kotatsu.core.exceptions.UnsupportedFileException import org.koitharu.kotatsu.core.exceptions.UnsupportedFileException
import org.koitharu.kotatsu.core.exceptions.WrongPasswordException import org.koitharu.kotatsu.core.exceptions.WrongPasswordException
import org.koitharu.kotatsu.parsers.exception.AuthRequiredException import org.koitharu.kotatsu.parsers.exception.AuthRequiredException
import org.koitharu.kotatsu.parsers.model.Manga
import java.net.SocketTimeoutException
fun Throwable.getDisplayMessage(resources: Resources) = when (this) { fun Throwable.getDisplayMessage(resources: Resources) = when (this) {
is AuthRequiredException -> resources.getString(R.string.auth_required) is AuthRequiredException -> resources.getString(R.string.auth_required)
@@ -22,4 +24,6 @@ fun Throwable.getDisplayMessage(resources: Resources) = when (this) {
is SocketTimeoutException -> resources.getString(R.string.network_error) is SocketTimeoutException -> resources.getString(R.string.network_error)
is WrongPasswordException -> resources.getString(R.string.wrong_password) is WrongPasswordException -> resources.getString(R.string.wrong_password)
else -> localizedMessage ?: resources.getString(R.string.error_occurred) else -> localizedMessage ?: resources.getString(R.string.error_occurred)
} }
fun ACRA.setCurrentManga(manga: Manga?) = errorReporter.putCustomData("manga", manga?.publicUrl.toString())

View File

@@ -5,8 +5,6 @@ import android.graphics.Rect
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.inputmethod.InputMethodManager import android.view.inputmethod.InputMethodManager
import androidx.annotation.StringRes
import androidx.appcompat.widget.TooltipCompat
import androidx.core.view.children import androidx.core.view.children
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView

View File

@@ -7,13 +7,15 @@ import android.widget.RemoteViewsService
import coil.ImageLoader import coil.ImageLoader
import coil.executeBlocking import coil.executeBlocking
import coil.request.ImageRequest import coil.request.ImageRequest
import coil.size.Scale
import coil.size.Size
import coil.transform.RoundedCornersTransformation
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import org.koitharu.kotatsu.R import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.base.domain.MangaIntent import org.koitharu.kotatsu.base.domain.MangaIntent
import org.koitharu.kotatsu.history.domain.HistoryRepository import org.koitharu.kotatsu.history.domain.HistoryRepository
import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.Manga
import org.koitharu.kotatsu.utils.ext.requireBitmap import org.koitharu.kotatsu.utils.ext.requireBitmap
import java.io.IOException
class RecentListFactory( class RecentListFactory(
private val context: Context, private val context: Context,
@@ -22,9 +24,15 @@ class RecentListFactory(
) : RemoteViewsService.RemoteViewsFactory { ) : RemoteViewsService.RemoteViewsFactory {
private val dataSet = ArrayList<Manga>() private val dataSet = ArrayList<Manga>()
private val transformation = RoundedCornersTransformation(
context.resources.getDimension(R.dimen.appwidget_corner_radius_inner)
)
private val coverSize = Size(
context.resources.getDimensionPixelSize(R.dimen.widget_cover_width),
context.resources.getDimensionPixelSize(R.dimen.widget_cover_height),
)
override fun onCreate() { override fun onCreate() = Unit
}
override fun getLoadingView() = null override fun getLoadingView() = null
@@ -41,14 +49,18 @@ class RecentListFactory(
override fun getViewAt(position: Int): RemoteViews { override fun getViewAt(position: Int): RemoteViews {
val views = RemoteViews(context.packageName, R.layout.item_recent) val views = RemoteViews(context.packageName, R.layout.item_recent)
val item = dataSet[position] val item = dataSet[position]
try { runCatching {
val cover = coil.executeBlocking( coil.executeBlocking(
ImageRequest.Builder(context) ImageRequest.Builder(context)
.data(item.coverUrl) .data(item.coverUrl)
.size(coverSize)
.scale(Scale.FILL)
.transformations(transformation)
.build() .build()
).requireBitmap() ).requireBitmap()
}.onSuccess { cover ->
views.setImageViewBitmap(R.id.imageView_cover, cover) views.setImageViewBitmap(R.id.imageView_cover, cover)
} catch (e: IOException) { }.onFailure {
views.setImageViewResource(R.id.imageView_cover, R.drawable.ic_placeholder) views.setImageViewResource(R.id.imageView_cover, R.drawable.ic_placeholder)
} }
val intent = Intent() val intent = Intent()
@@ -61,6 +73,5 @@ class RecentListFactory(
override fun getViewTypeCount() = 1 override fun getViewTypeCount() = 1
override fun onDestroy() { override fun onDestroy() = Unit
}
} }

View File

@@ -10,8 +10,6 @@ import androidx.core.graphics.Insets
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams import androidx.core.view.updateLayoutParams
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.divider.MaterialDividerItemDecoration
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.androidx.viewmodel.ext.android.viewModel
import org.koitharu.kotatsu.R import org.koitharu.kotatsu.R
@@ -40,9 +38,6 @@ class ShelfConfigActivity : BaseActivity<ActivityCategoriesBinding>(),
setHomeAsUpIndicator(materialR.drawable.abc_ic_clear_material) setHomeAsUpIndicator(materialR.drawable.abc_ic_clear_material)
} }
adapter = CategorySelectAdapter(this) adapter = CategorySelectAdapter(this)
binding.recyclerView.addItemDecoration(
MaterialDividerItemDecoration(this, RecyclerView.VERTICAL)
)
binding.recyclerView.adapter = adapter binding.recyclerView.adapter = adapter
binding.buttonDone.isVisible = true binding.buttonDone.isVisible = true
binding.buttonDone.setOnClickListener(this) binding.buttonDone.setOnClickListener(this)

View File

@@ -7,6 +7,9 @@ import android.widget.RemoteViewsService
import coil.ImageLoader import coil.ImageLoader
import coil.executeBlocking import coil.executeBlocking
import coil.request.ImageRequest import coil.request.ImageRequest
import coil.size.Scale
import coil.size.Size
import coil.transform.RoundedCornersTransformation
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import org.koitharu.kotatsu.R import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.base.domain.MangaIntent import org.koitharu.kotatsu.base.domain.MangaIntent
@@ -14,20 +17,25 @@ import org.koitharu.kotatsu.core.prefs.AppWidgetConfig
import org.koitharu.kotatsu.favourites.domain.FavouritesRepository import org.koitharu.kotatsu.favourites.domain.FavouritesRepository
import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.Manga
import org.koitharu.kotatsu.utils.ext.requireBitmap import org.koitharu.kotatsu.utils.ext.requireBitmap
import java.io.IOException
class ShelfListFactory( class ShelfListFactory(
private val context: Context, private val context: Context,
private val favouritesRepository: FavouritesRepository, private val favouritesRepository: FavouritesRepository,
private val coil: ImageLoader, private val coil: ImageLoader,
widgetId: Int widgetId: Int,
) : RemoteViewsService.RemoteViewsFactory { ) : RemoteViewsService.RemoteViewsFactory {
private val dataSet = ArrayList<Manga>() private val dataSet = ArrayList<Manga>()
private val config = AppWidgetConfig(context, widgetId) private val config = AppWidgetConfig(context, widgetId)
private val transformation = RoundedCornersTransformation(
context.resources.getDimension(R.dimen.appwidget_corner_radius_inner)
)
private val coverSize = Size(
context.resources.getDimensionPixelSize(R.dimen.widget_cover_width),
context.resources.getDimensionPixelSize(R.dimen.widget_cover_height),
)
override fun onCreate() { override fun onCreate() = Unit
}
override fun getLoadingView() = null override fun getLoadingView() = null
@@ -52,14 +60,18 @@ class ShelfListFactory(
val views = RemoteViews(context.packageName, R.layout.item_shelf) val views = RemoteViews(context.packageName, R.layout.item_shelf)
val item = dataSet[position] val item = dataSet[position]
views.setTextViewText(R.id.textView_title, item.title) views.setTextViewText(R.id.textView_title, item.title)
try { runCatching {
val cover = coil.executeBlocking( coil.executeBlocking(
ImageRequest.Builder(context) ImageRequest.Builder(context)
.data(item.coverUrl) .data(item.coverUrl)
.size(coverSize)
.scale(Scale.FILL)
.transformations(transformation)
.build() .build()
).requireBitmap() ).requireBitmap()
}.onSuccess { cover ->
views.setImageViewBitmap(R.id.imageView_cover, cover) views.setImageViewBitmap(R.id.imageView_cover, cover)
} catch (e: IOException) { }.onFailure {
views.setImageViewResource(R.id.imageView_cover, R.drawable.ic_placeholder) views.setImageViewResource(R.id.imageView_cover, R.drawable.ic_placeholder)
} }
val intent = Intent() val intent = Intent()

View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="?colorPrimaryContainer" android:state_checked="true" android:state_enabled="true" />
<item android:alpha="@dimen/material_emphasis_disabled" android:color="?colorPrimaryContainer" android:state_checked="true" android:state_enabled="false" />
<item android:color="?colorSurfaceVariant" android:state_checked="false" android:state_enabled="true" />
<item android:alpha="@dimen/material_emphasis_disabled" android:color="?colorSurfaceVariant" android:state_checked="false" android:state_enabled="false" />
</selector>

View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="?colorPrimary" android:state_checked="true" android:state_enabled="true" />
<item android:alpha="@dimen/material_emphasis_disabled" android:color="?colorPrimary" android:state_checked="true" android:state_enabled="false" />
<item android:color="?colorOnSurfaceVariant" android:state_checked="false" android:state_enabled="true" />
<item android:alpha="@dimen/material_emphasis_disabled" android:color="?colorOnSurfaceVariant" android:state_checked="false" android:state_enabled="false" />
</selector>

View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/kotatsu_primaryContainer" android:state_checked="true" android:state_enabled="true" />
<item android:alpha="@dimen/material_emphasis_disabled" android:color="@color/kotatsu_primaryContainer" android:state_checked="true" android:state_enabled="false" />
<item android:color="@color/kotatsu_surfaceVariant" android:state_checked="false" android:state_enabled="true" />
<item android:alpha="@dimen/material_emphasis_disabled" android:color="@color/kotatsu_surfaceVariant" android:state_checked="false" android:state_enabled="false" />
</selector>

View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/blue_primary" android:state_checked="true" android:state_enabled="true" />
<item android:alpha="@dimen/material_emphasis_disabled" android:color="@color/blue_primary" android:state_checked="true" android:state_enabled="false" />
<item android:color="@color/kotatsu_onSurfaceVariant" android:state_checked="false" android:state_enabled="true" />
<item android:alpha="@dimen/material_emphasis_disabled" android:color="@color/kotatsu_onSurfaceVariant" android:state_checked="false" android:state_enabled="false" />
</selector>

View File

@@ -2,6 +2,6 @@
<shape <shape
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"> android:shape="rectangle">
<corners android:radius="32dp" /> <corners android:radius="@dimen/appwidget_corner_radius_inner" />
<solid android:color="?attr/colorTertiary" /> <solid android:color="?android:panelColorBackground" />
</shape> </shape>

View File

@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#000"
android:pathData="M2 16h8v-2H2m16 0v-4h-2v4h-4v2h4v4h2v-4h4v-2m-8-8H2v2h12m0 2H2v2h12v-2z" />
</vector>

View File

@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#000"
android:pathData="M14,19H18V5H14M6,19H10V5H6V19Z" />
</vector>

View File

@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#000"
android:pathData="M8,5.14V19.14L19,12.14L8,5.14Z" />
</vector>

View File

@@ -1,16 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:bottom="4dp"
android:left="4dp"
android:right="4dp"
android:top="4dp">
<shape android:shape="oval">
<solid android:color="@color/selector_switch_thumb" />
<size
android:width="20dp"
android:height="20dp" />
</shape>
</item>
</layer-list>

View File

@@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list
xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="@color/selector_switch_track" />
<corners android:radius="56dp" />
<size
android:width="64dp"
android:height="28dp" />
</shape>
</item>
</layer-list>

View File

@@ -68,7 +68,7 @@
</com.google.android.material.textfield.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.switchmaterial.SwitchMaterial <com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/switch_tracker" android:id="@+id/switch_tracker"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"

View File

@@ -62,6 +62,19 @@
</com.google.android.material.textfield.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/switch_biometric"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:checked="true"
android:text="@string/use_fingerprint"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/layout_password"
tools:visibility="visible" />
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:id="@+id/button_cancel" android:id="@+id/button_cancel"
style="@style/Widget.Material3.Button.OutlinedButton" style="@style/Widget.Material3.Button.OutlinedButton"

View File

@@ -1,31 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
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="match_parent"
android:layout_height="wrap_content"
android:paddingStart="14dp"
android:paddingTop="8dp"
android:paddingEnd="14dp">
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/inputLayout"
app:boxBackgroundMode="filled"
app:boxBackgroundColor="@android:color/transparent"
app:hintEnabled="false"
app:expandedHintEnabled="true"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/inputEdit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:imeOptions="actionDone"
android:singleLine="true"
tools:hint="@tools:sample/lorem[2]" />
</com.google.android.material.textfield.TextInputLayout>
</FrameLayout>

View File

@@ -1,70 +1,75 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout <ScrollView
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content">
android:animateLayoutChanges="true"
android:orientation="vertical">
<org.koitharu.kotatsu.base.ui.widgets.CheckableButtonGroup <LinearLayout
android:id="@+id/checkableGroup"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="16dp" android:animateLayoutChanges="true"
android:orientation="vertical"> android:orientation="vertical">
<com.google.android.material.button.MaterialButton <org.koitharu.kotatsu.base.ui.widgets.CheckableButtonGroup
android:id="@+id/button_list" android:id="@+id/checkableGroup"
style="@style/Widget.Kotatsu.ToggleButton"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/list" android:layout_margin="16dp"
app:icon="@drawable/ic_list" /> android:orientation="vertical">
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:id="@+id/button_list_detailed" android:id="@+id/button_list"
style="@style/Widget.Kotatsu.ToggleButton" style="@style/Widget.Kotatsu.ToggleButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/list"
app:icon="@drawable/ic_list" />
<com.google.android.material.button.MaterialButton
android:id="@+id/button_list_detailed"
style="@style/Widget.Kotatsu.ToggleButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/detailed_list"
app:icon="@drawable/ic_list_detailed" />
<com.google.android.material.button.MaterialButton
android:id="@+id/button_grid"
style="@style/Widget.Kotatsu.ToggleButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/grid"
app:icon="@drawable/ic_grid" />
</org.koitharu.kotatsu.base.ui.widgets.CheckableButtonGroup>
<TextView
android:id="@+id/textView_grid_title"
style="?materialAlertDialogTitleTextStyle"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/detailed_list" android:paddingLeft="?attr/dialogPreferredPadding"
app:icon="@drawable/ic_list_detailed" /> android:paddingRight="?attr/dialogPreferredPadding"
android:singleLine="true"
android:text="@string/grid_size"
android:visibility="gone"
tools:visibility="visible" />
<com.google.android.material.button.MaterialButton <com.google.android.material.slider.Slider
android:id="@+id/button_grid" android:id="@+id/slider_grid"
style="@style/Widget.Kotatsu.ToggleButton"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/grid" android:layout_marginHorizontal="16dp"
app:icon="@drawable/ic_grid" /> android:stepSize="5"
android:valueFrom="50"
android:valueTo="150"
android:visibility="gone"
app:labelBehavior="floating"
app:tickVisible="false"
tools:value="100"
tools:visibility="visible" />
</org.koitharu.kotatsu.base.ui.widgets.CheckableButtonGroup> </LinearLayout>
</ScrollView>
<TextView
android:id="@+id/textView_grid_title"
style="?materialAlertDialogTitleTextStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="?attr/dialogPreferredPadding"
android:paddingRight="?attr/dialogPreferredPadding"
android:singleLine="true"
android:text="@string/grid_size"
android:visibility="gone"
tools:visibility="visible" />
<com.google.android.material.slider.Slider
android:id="@+id/slider_grid"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:stepSize="5"
android:valueFrom="50"
android:valueTo="150"
android:visibility="gone"
app:labelBehavior="floating"
app:tickVisible="false"
tools:value="100"
tools:visibility="visible" />
</LinearLayout>

View File

@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?><!--
<!--
~ Copyright 2018 Google LLC ~ Copyright 2018 Google LLC
~ ~
~ Licensed under the Apache License, Version 2.0 (the "License"); ~ Licensed under the Apache License, Version 2.0 (the "License");
@@ -22,15 +21,17 @@
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<LinearLayout <LinearLayout
android:id="@+id/snackbar_layout"
style="?attr/snackbarStyle"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="@dimen/margin_small" android:layout_margin="@dimen/margin_small"
android:background="@drawable/fading_snackbar_background" android:background="@drawable/design_snackbar_background"
android:theme="@style/ThemeOverlay.Kotatsu"
android:elevation="8dp"> android:elevation="8dp">
<TextView <TextView
android:id="@+id/snackbar_text" android:id="@+id/snackbar_text"
style="?attr/snackbarTextViewStyle"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical|start" android:layout_gravity="center_vertical|start"
@@ -39,22 +40,22 @@
android:maxLines="4" android:maxLines="4"
android:padding="@dimen/margin_normal" android:padding="@dimen/margin_normal"
android:textAlignment="viewStart" android:textAlignment="viewStart"
android:textColor="@android:color/white"
android:textAppearance="@style/TextAppearance.Design.Snackbar.Message" android:textAppearance="@style/TextAppearance.Design.Snackbar.Message"
android:textColor="@android:color/white"
tools:text="Look at all the wonderful snack bar text..." /> tools:text="Look at all the wonderful snack bar text..." />
<Button <Button
android:id="@+id/snackbar_action" android:id="@+id/snackbar_action"
style="?borderlessButtonStyle" style="?attr/snackbarButtonStyle"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_gravity="center_vertical|end" android:layout_gravity="center_vertical|end"
android:paddingEnd="@dimen/margin_normal"
android:paddingStart="@dimen/margin_normal" android:paddingStart="@dimen/margin_normal"
android:paddingEnd="@dimen/margin_normal"
android:visibility="gone" android:visibility="gone"
tools:targetApi="o"
tools:text="Action" tools:text="Action"
tools:visibility="visible" tools:visibility="visible" />
tools:targetApi="o" />
</LinearLayout> </LinearLayout>

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/checkedTextView"
android:layout_width="match_parent"
android:layout_height="?android:listPreferredItemHeightSmall"
android:background="?android:selectableItemBackground"
android:checkMark="?android:attr/listChoiceIndicatorMultiple"
android:gravity="start|center_vertical"
android:paddingStart="?android:listPreferredItemPaddingStart"
android:paddingEnd="?android:listPreferredItemPaddingEnd"
android:textAppearance="?attr/textAppearanceBodyLarge"
tools:checked="true"
tools:text="@tools:sample/lorem[4]" />

View File

@@ -4,10 +4,11 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="@dimen/chapter_list_item_height" android:layout_height="wrap_content"
android:background="?selectableItemBackground" android:background="?selectableItemBackground"
android:baselineAligned="false" android:baselineAligned="false"
android:gravity="center_vertical" android:gravity="center_vertical"
android:minHeight="@dimen/chapter_list_item_height"
android:orientation="horizontal"> android:orientation="horizontal">
<TextView <TextView
@@ -44,9 +45,9 @@
android:id="@+id/textView_description" android:id="@+id/textView_description"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:ellipsize="end" android:ellipsize="end"
android:singleLine="true" android:singleLine="true"
android:layout_marginTop="2dp"
android:textAppearance="?attr/textAppearanceBodySmall" android:textAppearance="?attr/textAppearanceBodySmall"
tools:text="05.10.2021 • Scanlator" /> tools:text="05.10.2021 • Scanlator" />
</LinearLayout> </LinearLayout>

View File

@@ -18,8 +18,8 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical" android:orientation="vertical"
android:scaleType="centerCrop" android:scaleType="centerCrop"
tools:src="@tools:sample/backgrounds/scenic" app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.Kotatsu.Cover"
app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.Kotatsu.Cover"/> tools:src="@tools:sample/backgrounds/scenic" />
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
@@ -53,8 +53,9 @@
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal" android:baselineAligned="false"
android:gravity="center"> android:clipChildren="false"
android:orientation="horizontal">
<TextView <TextView
android:id="@+id/textView_tags" android:id="@+id/textView_tags"
@@ -72,9 +73,12 @@
android:id="@+id/textView_rating" android:id="@+id/textView_rating"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:drawablePadding="4dp" android:drawablePadding="4dp"
android:elegantTextHeight="false"
android:gravity="center_vertical"
android:paddingStart="6dp" android:paddingStart="6dp"
android:singleLine="true"
android:textAppearance="?attr/textAppearanceBodySmall"
app:drawableEndCompat="@drawable/ic_star" app:drawableEndCompat="@drawable/ic_star"
tools:ignore="RtlSymmetry" tools:ignore="RtlSymmetry"
tools:text="9.6" /> tools:text="9.6" />

View File

@@ -3,7 +3,7 @@
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/imageView_cover" android:id="@+id/imageView_cover"
android:layout_width="92dp" android:layout_width="@dimen/widget_cover_width"
android:layout_height="128dp" android:layout_height="@dimen/widget_cover_height"
android:scaleType="centerCrop" android:scaleType="centerCrop"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />

View File

@@ -9,7 +9,7 @@
android:paddingStart="?listPreferredItemPaddingStart" android:paddingStart="?listPreferredItemPaddingStart"
android:paddingEnd="?listPreferredItemPaddingEnd"> android:paddingEnd="?listPreferredItemPaddingEnd">
<com.google.android.material.switchmaterial.SwitchMaterial <com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/switch_local" android:id="@+id/switch_local"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"

View File

@@ -3,21 +3,24 @@
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content"
android:padding="4dp"
android:theme="@style/Theme.Kotatsu.AppWidgetContainer">
<LinearLayout <LinearLayout
android:id="@+id/rootLayout" android:id="@+id/rootLayout"
android:layout_width="92dp" android:layout_width="@dimen/widget_cover_width"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:background="@drawable/bg_appwidget_card"
android:foreground="?android:selectableItemBackground"
android:orientation="vertical" android:orientation="vertical"
android:paddingBottom="4dp" tools:ignore="UnusedAttribute,UselessParent">
tools:ignore="UselessParent">
<ImageView <ImageView
android:id="@+id/imageView_cover" android:id="@+id/imageView_cover"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="128dp" android:layout_height="@dimen/widget_cover_height"
android:scaleType="centerCrop" android:scaleType="centerCrop"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
@@ -25,12 +28,12 @@
android:id="@+id/textView_title" android:id="@+id/textView_title"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:elegantTextHeight="false"
android:ellipsize="end" android:ellipsize="end"
android:gravity="center"
android:lines="2" android:lines="2"
android:shadowColor="@android:color/black" android:paddingHorizontal="4dp"
android:shadowRadius="1" android:paddingBottom="4dp"
android:textColor="@android:color/white" /> android:textColor="?android:attr/textColorPrimary" />
</LinearLayout> </LinearLayout>

View File

@@ -48,7 +48,7 @@
</LinearLayout> </LinearLayout>
<com.google.android.material.switchmaterial.SwitchMaterial <com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/switch_toggle" android:id="@+id/switch_toggle"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"

View File

@@ -47,7 +47,7 @@
</LinearLayout> </LinearLayout>
<com.google.android.material.switchmaterial.SwitchMaterial <com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/switch_toggle" android:id="@+id/switch_toggle"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" /> android:layout_height="wrap_content" />

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.materialswitch.MaterialSwitch
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/switchWidget"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:focusable="false" />

View File

@@ -38,7 +38,7 @@
android:ellipsize="end" android:ellipsize="end"
android:maxLines="2" android:maxLines="2"
android:textAppearance="?attr/textAppearanceHeadlineSmall" android:textAppearance="?attr/textAppearanceHeadlineSmall"
app:layout_constraintEnd_toStartOf="@id/button_open" app:layout_constraintEnd_toStartOf="@id/button_menu"
app:layout_constraintStart_toEndOf="@id/imageView_cover" app:layout_constraintStart_toEndOf="@id/imageView_cover"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
tools:text="@tools:sample/lorem[15]" /> tools:text="@tools:sample/lorem[15]" />

View File

@@ -2,14 +2,17 @@
<FrameLayout <FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
android:background="?android:attr/colorBackground"
android:padding="4dp"
android:theme="@style/Theme.Kotatsu.AppWidgetContainer">
<StackView <StackView
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/stackView" android:id="@+id/stackView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:listitem="@layout/item_shelf" /> tools:listitem="@layout/item_recent" />
<TextView <TextView
android:id="@+id/textView_holder" android:id="@+id/textView_holder"

View File

@@ -2,7 +2,10 @@
<FrameLayout <FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
android:background="?android:attr/colorBackground"
android:padding="4dp"
android:theme="@style/Theme.Kotatsu.AppWidgetContainer">
<GridView <GridView
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
@@ -21,9 +24,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:gravity="center" android:gravity="center"
android:shadowColor="@android:color/black"
android:shadowRadius="1"
android:text="@string/you_have_not_favourites_yet" android:text="@string/you_have_not_favourites_yet"
android:textColor="@android:color/white" /> android:textColor="?android:attr/textColorPrimary" />
</FrameLayout> </FrameLayout>

View File

@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<item
android:id="@+id/action_share"
android:icon="@android:drawable/ic_menu_share"
android:showAsAction="ifRoom"
android:title="@string/share"
tools:ignore="AppCompatResource" />
</menu>

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:icon="@drawable/ic_pause"
android:id="@+id/action_pause"
android:title="Pause"
app:showAsAction="ifRoom|withText" />
<item
android:icon="@drawable/ic_resume"
android:id="@+id/action_resume"
android:title="Resume"
app:showAsAction="ifRoom|withText" />
</menu>

View File

@@ -15,4 +15,10 @@
android:title="@string/clear_feed" android:title="@string/clear_feed"
app:showAsAction="never" /> app:showAsAction="never" />
<item
android:id="@+id/action_settings"
android:orderInCategory="50"
android:title="@string/settings"
app:showAsAction="never" />
</menu> </menu>

View File

@@ -299,4 +299,7 @@
<string name="send">Senden</string> <string name="send">Senden</string>
<string name="crash_text">Etwas ist schief gelaufen. Bitte senden Sie einen Fehlerbericht an die Entwickler, damit wir das Problem beheben können.</string> <string name="crash_text">Etwas ist schief gelaufen. Bitte senden Sie einen Fehlerbericht an die Entwickler, damit wir das Problem beheben können.</string>
<string name="disable_all">Alle deaktivieren</string> <string name="disable_all">Alle deaktivieren</string>
<string name="use_fingerprint">Fingerabdruck verwenden, falls vorhanden</string>
<string name="appwidget_shelf_description">Manga aus Ihren Favoriten</string>
<string name="appwidget_recent_description">Ihr kürzlich gelesener Manga</string>
</resources> </resources>

View File

@@ -298,4 +298,7 @@
<string name="disable_battery_optimization">Desactivar la optimización de la batería</string> <string name="disable_battery_optimization">Desactivar la optimización de la batería</string>
<string name="send">Enviar</string> <string name="send">Enviar</string>
<string name="crash_text">Algo ha ido mal. Por favor, envía un informe de errores a los desarrolladores para ayudarnos a solucionarlo.</string> <string name="crash_text">Algo ha ido mal. Por favor, envía un informe de errores a los desarrolladores para ayudarnos a solucionarlo.</string>
<string name="use_fingerprint">Utilizar la huella dactilar si está disponible</string>
<string name="appwidget_shelf_description">Mangas de tus favoritos</string>
<string name="appwidget_recent_description">Sus mangas recientemente leídos</string>
</resources> </resources>

View File

@@ -299,4 +299,7 @@
<string name="crash_text">Jokin meni pieleen. Lähetä vikailmoitus kehittäjille, jotta voimme korjata sen.</string> <string name="crash_text">Jokin meni pieleen. Lähetä vikailmoitus kehittäjille, jotta voimme korjata sen.</string>
<string name="disable_all">Poista kaikki käytöstä</string> <string name="disable_all">Poista kaikki käytöstä</string>
<string name="send">Lähetä</string> <string name="send">Lähetä</string>
<string name="use_fingerprint">Käytä sormenjälkeä, jos käytettävissä</string>
<string name="appwidget_shelf_description">Manga suosikeistasi</string>
<string name="appwidget_recent_description">Äskettäin lukemasi manga</string>
</resources> </resources>

View File

@@ -299,4 +299,7 @@
<string name="crash_text">Un problème est survenu. Veuillez soumettre un rapport de bogue aux développeurs pour nous aider à le corriger.</string> <string name="crash_text">Un problème est survenu. Veuillez soumettre un rapport de bogue aux développeurs pour nous aider à le corriger.</string>
<string name="send">Envoyer</string> <string name="send">Envoyer</string>
<string name="disable_all">Tout désactiver</string> <string name="disable_all">Tout désactiver</string>
<string name="use_fingerprint">Utiliser l\'empreinte digitale si elle est disponible</string>
<string name="appwidget_recent_description">Vos mangas récemment lus</string>
<string name="appwidget_shelf_description">Les mangas de vos favoris</string>
</resources> </resources>

View File

@@ -299,4 +299,7 @@
<string name="crash_text">Qualcosa è andato storto. Si prega di inviare una segnalazione di bug agli sviluppatori per aiutarci a risolvere il problema.</string> <string name="crash_text">Qualcosa è andato storto. Si prega di inviare una segnalazione di bug agli sviluppatori per aiutarci a risolvere il problema.</string>
<string name="send">Invia</string> <string name="send">Invia</string>
<string name="disable_all">Disabilita tutto</string> <string name="disable_all">Disabilita tutto</string>
<string name="use_fingerprint">Usa le impronte digitali se disponibili</string>
<string name="appwidget_shelf_description">Manga dai preferiti</string>
<string name="appwidget_recent_description">I manga letti di recente</string>
</resources> </resources>

View File

@@ -299,4 +299,7 @@
<string name="crash_text">何か問題が発生しました。開発者にバグレポートを提出し、解決にご協力ください。</string> <string name="crash_text">何か問題が発生しました。開発者にバグレポートを提出し、解決にご協力ください。</string>
<string name="send">送信</string> <string name="send">送信</string>
<string name="disable_all">すべて無効にする</string> <string name="disable_all">すべて無効にする</string>
<string name="appwidget_recent_description">最近読んだ漫画</string>
<string name="use_fingerprint">指紋がある場合は、指紋を使用する</string>
<string name="appwidget_shelf_description">お気に入りの漫画</string>
</resources> </resources>

View File

@@ -2,5 +2,4 @@
<resources> <resources>
<bool name="light_status_bar">false</bool> <bool name="light_status_bar">false</bool>
<bool name="light_navigation_bar">false</bool> <bool name="light_navigation_bar">false</bool>
<bool name="elevation_overlay_enabled">true</bool>
</resources> </resources>

View File

@@ -1,252 +1,252 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="close_menu">Закрыть меню</string> <string name="close_menu">Закрыть меню</string>
<string name="open_menu">Открыть меню</string> <string name="open_menu">Открыть меню</string>
<string name="local_storage">На устройстве</string> <string name="local_storage">На устройстве</string>
<string name="favourites">Избранное</string> <string name="favourites">Избранное</string>
<string name="history">История</string> <string name="history">История</string>
<string name="error_occurred">Произошла ошибка</string> <string name="error_occurred">Произошла ошибка</string>
<string name="network_error">Не удалось подключиться к интернету</string> <string name="network_error">Не удалось подключиться к интернету</string>
<string name="details">Подробности</string> <string name="details">Подробности</string>
<string name="chapters">Главы</string> <string name="chapters">Главы</string>
<string name="list">Список</string> <string name="list">Список</string>
<string name="detailed_list">Подробный список</string> <string name="detailed_list">Подробный список</string>
<string name="grid">Таблица</string> <string name="grid">Таблица</string>
<string name="list_mode">Вид списка</string> <string name="list_mode">Вид списка</string>
<string name="settings">Настройки</string> <string name="settings">Настройки</string>
<string name="remote_sources">Онлайн каталоги</string> <string name="remote_sources">Онлайн каталоги</string>
<string name="loading_">Загрузка…</string> <string name="loading_">Загрузка…</string>
<string name="chapter_d_of_d">Глава %1$d из %2$d</string> <string name="chapter_d_of_d">Глава %1$d из %2$d</string>
<string name="close">Закрыть</string> <string name="close">Закрыть</string>
<string name="try_again">Повторить</string> <string name="try_again">Повторить</string>
<string name="clear_history">Очистить историю</string> <string name="clear_history">Очистить историю</string>
<string name="nothing_found">Ничего не найдено</string> <string name="nothing_found">Ничего не найдено</string>
<string name="history_is_empty">Истории пока нет</string> <string name="history_is_empty">Истории пока нет</string>
<string name="read">Читать</string> <string name="read">Читать</string>
<string name="you_have_not_favourites_yet">Избранного пока нет</string> <string name="you_have_not_favourites_yet">Избранного пока нет</string>
<string name="add_to_favourites">В избранное</string> <string name="add_to_favourites">В избранное</string>
<string name="add_new_category">Новая категория</string> <string name="add_new_category">Новая категория</string>
<string name="add">Добавить</string> <string name="add">Добавить</string>
<string name="enter_category_name">Введите название</string> <string name="enter_category_name">Введите название</string>
<string name="save">Сохранить</string> <string name="save">Сохранить</string>
<string name="share">Поделиться</string> <string name="share">Поделиться</string>
<string name="create_shortcut">Создать ярлык…</string> <string name="create_shortcut">Создать ярлык…</string>
<string name="share_s">Поделиться %s</string> <string name="share_s">Поделиться %s</string>
<string name="search">Поиск</string> <string name="search">Поиск</string>
<string name="search_manga">Поиск манги</string> <string name="search_manga">Поиск манги</string>
<string name="manga_downloading_">Загрузка…</string> <string name="manga_downloading_">Загрузка…</string>
<string name="processing_">Обработка…</string> <string name="processing_">Обработка…</string>
<string name="download_complete">Загружено</string> <string name="download_complete">Загружено</string>
<string name="downloads">Загрузки</string> <string name="downloads">Загрузки</string>
<string name="by_name">Имя</string> <string name="by_name">Имя</string>
<string name="popular">Популярная</string> <string name="popular">Популярная</string>
<string name="updated">Обновлённая</string> <string name="updated">Обновлённая</string>
<string name="newest">Новая</string> <string name="newest">Новая</string>
<string name="by_rating">Рейтинг</string> <string name="by_rating">Рейтинг</string>
<string name="sort_order">Порядок сортировки</string> <string name="sort_order">Порядок сортировки</string>
<string name="filter">Фильтр</string> <string name="filter">Фильтр</string>
<string name="theme">Тема</string> <string name="theme">Тема</string>
<string name="light">Светлая</string> <string name="light">Светлая</string>
<string name="dark">Тёмная</string> <string name="dark">Тёмная</string>
<string name="automatic">Как в системе</string> <string name="automatic">Как в системе</string>
<string name="pages">Страницы</string> <string name="pages">Страницы</string>
<string name="clear">Очистить</string> <string name="clear">Очистить</string>
<string name="text_clear_history_prompt">Очистить всю историю чтения полностью\?</string> <string name="text_clear_history_prompt">Очистить всю историю чтения полностью\?</string>
<string name="remove">Удалить</string> <string name="remove">Удалить</string>
<string name="_s_removed_from_history">«%s» удалено из истории</string> <string name="_s_removed_from_history">«%s» удалено из истории</string>
<string name="_s_deleted_from_local_storage">«%s» удалено с устройства</string> <string name="_s_deleted_from_local_storage">«%s» удалено с устройства</string>
<string name="wait_for_loading_finish">Дождитесь завершения загрузки…</string> <string name="wait_for_loading_finish">Дождитесь завершения загрузки…</string>
<string name="save_page">Сохранить страницу</string> <string name="save_page">Сохранить страницу</string>
<string name="page_saved">Сохранено</string> <string name="page_saved">Сохранено</string>
<string name="share_image">Поделиться изображением</string> <string name="share_image">Поделиться изображением</string>
<string name="_import">Импорт</string> <string name="_import">Импорт</string>
<string name="delete">Удалить</string> <string name="delete">Удалить</string>
<string name="operation_not_supported">Операция не поддерживается</string> <string name="operation_not_supported">Операция не поддерживается</string>
<string name="text_file_not_supported">Выберите CBZ-файл или ZIP</string> <string name="text_file_not_supported">Выберите CBZ-файл или ZIP</string>
<string name="no_description">Нет описания</string> <string name="no_description">Нет описания</string>
<string name="history_and_cache">История и кэш</string> <string name="history_and_cache">История и кэш</string>
<string name="clear_pages_cache">Очистить кэш страниц</string> <string name="clear_pages_cache">Очистить кэш страниц</string>
<string name="cache">Кэш</string> <string name="cache">Кэш</string>
<string name="text_file_sizes">Б|кБ|МБ|ГБ|ТБ</string> <string name="text_file_sizes">Б|кБ|МБ|ГБ|ТБ</string>
<string name="standard">Стандартный</string> <string name="standard">Стандартный</string>
<string name="webtoon">Манхва</string> <string name="webtoon">Манхва</string>
<string name="read_mode">Режим чтения</string> <string name="read_mode">Режим чтения</string>
<string name="grid_size">Размер таблицы</string> <string name="grid_size">Размер таблицы</string>
<string name="search_on_s">Поиск по %s</string> <string name="search_on_s">Поиск по %s</string>
<string name="delete_manga">Удалить мангу</string> <string name="delete_manga">Удалить мангу</string>
<string name="text_delete_local_manga">Удалить \"%s\" с устройства навсегда\?</string> <string name="text_delete_local_manga">Удалить \"%s\" с устройства навсегда\?</string>
<string name="reader_settings">Настройки чтения</string> <string name="reader_settings">Настройки чтения</string>
<string name="switch_pages">Листание страниц</string> <string name="switch_pages">Листание страниц</string>
<string name="taps_on_edges">Нажатия по краям</string> <string name="taps_on_edges">Нажатия по краям</string>
<string name="volume_buttons">Кнопки громкости</string> <string name="volume_buttons">Кнопки громкости</string>
<string name="_continue">Продолжить</string> <string name="_continue">Продолжить</string>
<string name="warning">Предупреждение</string> <string name="warning">Предупреждение</string>
<string name="network_consumption_warning">Это может привести к расходу большого количества трафика</string> <string name="network_consumption_warning">Это может привести к расходу большого количества трафика</string>
<string name="dont_ask_again">Больше не спрашивать</string> <string name="dont_ask_again">Больше не спрашивать</string>
<string name="cancelling_">Отмена…</string> <string name="cancelling_">Отмена…</string>
<string name="error">Ошибка</string> <string name="error">Ошибка</string>
<string name="clear_thumbs_cache">Очистить кэш миниатюр</string> <string name="clear_thumbs_cache">Очистить кэш миниатюр</string>
<string name="clear_search_history">Очистить историю поиска</string> <string name="clear_search_history">Очистить историю поиска</string>
<string name="search_history_cleared">Очищено</string> <string name="search_history_cleared">Очищено</string>
<string name="gestures_only">Только жесты</string> <string name="gestures_only">Только жесты</string>
<string name="internal_storage">Внутренний накопитель</string> <string name="internal_storage">Внутренний накопитель</string>
<string name="external_storage">Внешнее хранилище</string> <string name="external_storage">Внешнее хранилище</string>
<string name="domain">Домен</string> <string name="domain">Домен</string>
<string name="application_update">Проверять наличие новых версий приложения</string> <string name="application_update">Проверять наличие новых версий приложения</string>
<string name="app_update_available">Доступна новая версия приложения</string> <string name="app_update_available">Доступна новая версия приложения</string>
<string name="show_notification_app_update">Показывать уведомление, если доступна новая версия</string> <string name="show_notification_app_update">Показывать уведомление, если доступна новая версия</string>
<string name="open_in_browser">Открыть в веб-браузере</string> <string name="open_in_browser">Открыть в веб-браузере</string>
<string name="large_manga_save_confirm">В этой манге %s. Сохранить их все\?</string> <string name="large_manga_save_confirm">В этой манге %s. Сохранить их все\?</string>
<string name="save_manga">Сохранить</string> <string name="save_manga">Сохранить</string>
<string name="notifications">Уведомления</string> <string name="notifications">Уведомления</string>
<string name="enabled_d_of_d">Включено %1$d из %2$d</string> <string name="enabled_d_of_d">Включено %1$d из %2$d</string>
<string name="new_chapters">Новые главы</string> <string name="new_chapters">Новые главы</string>
<string name="download">Загрузить</string> <string name="download">Загрузить</string>
<string name="read_from_start">Читать с начала</string> <string name="read_from_start">Читать с начала</string>
<string name="restart">Перезапустить</string> <string name="restart">Перезапустить</string>
<string name="notifications_settings">Настройки уведомлений</string> <string name="notifications_settings">Настройки уведомлений</string>
<string name="notification_sound">Звук уведомления</string> <string name="notification_sound">Звук уведомления</string>
<string name="light_indicator">Светодиодная индикация</string> <string name="light_indicator">Светодиодная индикация</string>
<string name="vibration">Вибросигнал</string> <string name="vibration">Вибросигнал</string>
<string name="favourites_categories">Категории избранного</string> <string name="favourites_categories">Категории избранного</string>
<string name="categories_">Категории…</string> <string name="categories_">Категории…</string>
<string name="rename">Переименовать</string> <string name="rename">Переименовать</string>
<string name="category_delete_confirm">Удалить категорию \"%s\" из избранного\? <string name="category_delete_confirm">Удалить категорию \"%s\" из избранного\?
\nВся манга в ней будет потеряна.</string> \nВся манга в ней будет потеряна.</string>
<string name="remove_category">Удалить</string> <string name="remove_category">Удалить</string>
<string name="text_empty_holder_primary">Как-то здесь пусто…</string> <string name="text_empty_holder_primary">Как-то здесь пусто…</string>
<string name="text_search_holder_secondary">Попробуйте переформулировать запрос.</string> <string name="text_search_holder_secondary">Попробуйте переформулировать запрос.</string>
<string name="text_categories_holder">Вы можете использовать категории для организации своих избранных. Нажмите «+», чтобы создать категорию</string> <string name="text_categories_holder">Вы можете использовать категории для организации своих избранных. Нажмите «+», чтобы создать категорию</string>
<string name="text_history_holder_primary">То, что вы прочитаете, будет отображено здесь</string> <string name="text_history_holder_primary">То, что вы прочитаете, будет отображено здесь</string>
<string name="text_history_holder_secondary">Найдите, что почитать, в боковом меню.</string> <string name="text_history_holder_secondary">Найдите, что почитать, в боковом меню.</string>
<string name="text_local_holder_primary">Сохраните что-нибудь</string> <string name="text_local_holder_primary">Сохраните что-нибудь</string>
<string name="text_local_holder_secondary">Сохраните что-нибудь из онлайн-каталога или импортируйте из файла.</string> <string name="text_local_holder_secondary">Сохраните что-нибудь из онлайн-каталога или импортируйте из файла.</string>
<string name="manga_shelf">Полка</string> <string name="manga_shelf">Полка</string>
<string name="recent_manga">Недавнее</string> <string name="recent_manga">Недавнее</string>
<string name="pages_animation">Анимация листания</string> <string name="pages_animation">Анимация листания</string>
<string name="manga_save_location">Папка для загрузок</string> <string name="manga_save_location">Папка для загрузок</string>
<string name="not_available">Недоступно</string> <string name="not_available">Недоступно</string>
<string name="cannot_find_available_storage">Нет доступного хранилища</string> <string name="cannot_find_available_storage">Нет доступного хранилища</string>
<string name="other_storage">Другое хранилище</string> <string name="other_storage">Другое хранилище</string>
<string name="done">Готово</string> <string name="done">Готово</string>
<string name="all_favourites">Всё избранное</string> <string name="all_favourites">Всё избранное</string>
<string name="favourites_category_empty">Категория пуста</string> <string name="favourites_category_empty">Категория пуста</string>
<string name="read_later">Прочитать позже</string> <string name="read_later">Прочитать позже</string>
<string name="updates">Обновления</string> <string name="updates">Обновления</string>
<string name="text_feed_holder">Новые главы из того, что вы читаете, будут показаны здесь</string> <string name="text_feed_holder">Новые главы из того, что вы читаете, будут показаны здесь</string>
<string name="search_results">Результаты поиска</string> <string name="search_results">Результаты поиска</string>
<string name="related">Похожие</string> <string name="related">Похожие</string>
<string name="new_version_s">Новая версия: %s</string> <string name="new_version_s">Новая версия: %s</string>
<string name="size_s">Размер: %s</string> <string name="size_s">Размер: %s</string>
<string name="waiting_for_network">Ожидание подключения…</string> <string name="waiting_for_network">Ожидание подключения…</string>
<string name="clear_updates_feed">Очистить ленту обновлений</string> <string name="clear_updates_feed">Очистить ленту обновлений</string>
<string name="updates_feed_cleared">Очищено</string> <string name="updates_feed_cleared">Очищено</string>
<string name="rotate_screen">Повернуть экран</string> <string name="rotate_screen">Повернуть экран</string>
<string name="update">Обновить</string> <string name="update">Обновить</string>
<string name="feed_will_update_soon">Обновление скоро начнётся</string> <string name="feed_will_update_soon">Обновление скоро начнётся</string>
<string name="track_sources">Следить за обновлениями</string> <string name="track_sources">Следить за обновлениями</string>
<string name="dont_check">Не проверять</string> <string name="dont_check">Не проверять</string>
<string name="enter_password">Введите пароль</string> <string name="enter_password">Введите пароль</string>
<string name="wrong_password">Неверный пароль</string> <string name="wrong_password">Неверный пароль</string>
<string name="protect_application">Защитить приложение</string> <string name="protect_application">Защитить приложение</string>
<string name="protect_application_summary">Запрашивать пароль при запуске Kotatsu</string> <string name="protect_application_summary">Запрашивать пароль при запуске Kotatsu</string>
<string name="repeat_password">Повторите пароль</string> <string name="repeat_password">Повторите пароль</string>
<string name="passwords_mismatch">Пароли не совпадают</string> <string name="passwords_mismatch">Пароли не совпадают</string>
<string name="about">О программе</string> <string name="about">О программе</string>
<string name="app_version">Версия %s</string> <string name="app_version">Версия %s</string>
<string name="check_for_updates">Проверить обновления</string> <string name="check_for_updates">Проверить обновления</string>
<string name="checking_for_updates">Проверка обновления…</string> <string name="checking_for_updates">Проверка обновления…</string>
<string name="update_check_failed">Не удалось проверить обновления</string> <string name="update_check_failed">Не удалось проверить обновления</string>
<string name="no_update_available">Нет доступных обновлений</string> <string name="no_update_available">Нет доступных обновлений</string>
<string name="right_to_left">Справа налево (←)</string> <string name="right_to_left">Справа налево (←)</string>
<string name="create_category">Создать категорию</string> <string name="create_category">Создать категорию</string>
<string name="scale_mode">Масштабирование</string> <string name="scale_mode">Масштабирование</string>
<string name="zoom_mode_fit_center">Вписать в экран</string> <string name="zoom_mode_fit_center">Вписать в экран</string>
<string name="zoom_mode_fit_height">Подогнать по высоте</string> <string name="zoom_mode_fit_height">Подогнать по высоте</string>
<string name="zoom_mode_fit_width">Подогнать по ширине</string> <string name="zoom_mode_fit_width">Подогнать по ширине</string>
<string name="zoom_mode_keep_start">Исходный размер</string> <string name="zoom_mode_keep_start">Исходный размер</string>
<string name="black_dark_theme">Чёрная</string> <string name="black_dark_theme">Чёрная</string>
<string name="black_dark_theme_summary">Потребляет меньше энергии на экранах AMOLED</string> <string name="black_dark_theme_summary">Потребляет меньше энергии на экранах AMOLED</string>
<string name="backup_restore">Резервное копирование и восстановление</string> <string name="backup_restore">Резервное копирование и восстановление</string>
<string name="create_backup">Создать резервную копию</string> <string name="create_backup">Создать резервную копию</string>
<string name="restore_backup">Восстановить данные</string> <string name="restore_backup">Восстановить данные</string>
<string name="data_restored">Восстановлено</string> <string name="data_restored">Восстановлено</string>
<string name="preparing_">Подготовка…</string> <string name="preparing_">Подготовка…</string>
<string name="file_not_found">Файл не найден</string> <string name="file_not_found">Файл не найден</string>
<string name="data_restored_success">Все данные были восстановлены</string> <string name="data_restored_success">Все данные были восстановлены</string>
<string name="data_restored_with_errors">Данные были восстановлены, но возникли некоторые ошибки</string> <string name="data_restored_with_errors">Данные были восстановлены, но возникли некоторые ошибки</string>
<string name="backup_information">Вы можете создать резервную копию избранного и истории и потом восстановить их</string> <string name="backup_information">Вы можете создать резервную копию избранного и истории и потом восстановить их</string>
<string name="just_now">Только что</string> <string name="just_now">Только что</string>
<string name="yesterday">Вчера</string> <string name="yesterday">Вчера</string>
<string name="long_ago">Давно</string> <string name="long_ago">Давно</string>
<string name="group">Группировать</string> <string name="group">Группировать</string>
<string name="today">Сегодня</string> <string name="today">Сегодня</string>
<string name="tap_to_try_again">Попробовать ещё раз</string> <string name="tap_to_try_again">Попробовать ещё раз</string>
<string name="reader_mode_hint">Выбранный режим будет сохранён для текущей манги</string> <string name="reader_mode_hint">Выбранный режим будет сохранён для текущей манги</string>
<string name="silent">Без звука</string> <string name="silent">Без звука</string>
<string name="captcha_required">Необходимо пройти CAPTCHA</string> <string name="captcha_required">Необходимо пройти CAPTCHA</string>
<string name="captcha_solve">Пройти</string> <string name="captcha_solve">Пройти</string>
<string name="clear_cookies">Очистить куки</string> <string name="clear_cookies">Очистить куки</string>
<string name="cookies_cleared">Все файлы cookie были удалены</string> <string name="cookies_cleared">Все файлы cookie были удалены</string>
<string name="chapters_checking_progress">Проверка новых глав: %1$d из %2$d</string> <string name="chapters_checking_progress">Проверка новых глав: %1$d из %2$d</string>
<string name="clear_feed">Очистить ленту</string> <string name="clear_feed">Очистить ленту</string>
<string name="text_clear_updates_feed_prompt">Удалить всю историю обновлений навсегда\?</string> <string name="text_clear_updates_feed_prompt">Удалить всю историю обновлений навсегда\?</string>
<string name="check_for_new_chapters">Проверка новых глав</string> <string name="check_for_new_chapters">Проверка новых глав</string>
<string name="reverse">В обратном порядке</string> <string name="reverse">В обратном порядке</string>
<string name="sign_in">Войти</string> <string name="sign_in">Войти</string>
<string name="auth_required">Авторизуйтесь, чтобы просмотреть этот контент</string> <string name="auth_required">Авторизуйтесь, чтобы просмотреть этот контент</string>
<string name="default_s">По умолчанию: %s</string> <string name="default_s">По умолчанию: %s</string>
<string name="_and_x_more">…и ещё %1$d</string> <string name="_and_x_more">…и ещё %1$d</string>
<string name="next">Далее</string> <string name="next">Далее</string>
<string name="protect_application_subtitle">Введите пароль для запуска приложения</string> <string name="protect_application_subtitle">Введите пароль для запуска приложения</string>
<string name="confirm">Подтвердить</string> <string name="confirm">Подтвердить</string>
<string name="password_length_hint">Пароль должен состоять из 4 символов или более</string> <string name="password_length_hint">Пароль должен состоять из 4 символов или более</string>
<string name="search_only_on_s">Поиск только по %s</string> <string name="search_only_on_s">Поиск только по %s</string>
<string name="other">Другие</string> <string name="other">Другие</string>
<string name="welcome">Добро пожаловать</string> <string name="welcome">Добро пожаловать</string>
<string name="text_clear_search_history_prompt">Удалить все последние поисковые запросы навсегда\?</string> <string name="text_clear_search_history_prompt">Удалить все последние поисковые запросы навсегда\?</string>
<string name="backup_saved">Резервная копия сохранена</string> <string name="backup_saved">Резервная копия сохранена</string>
<string name="tracker_warning">Некоторые устройства имеют различное поведение системы, что может привести к нарушению фоновых задач.</string> <string name="tracker_warning">Некоторые устройства имеют различное поведение системы, что может привести к нарушению фоновых задач.</string>
<string name="read_more">Подробнее</string> <string name="read_more">Подробнее</string>
<string name="queued">В очереди</string> <string name="queued">В очереди</string>
<string name="text_downloads_holder">Нет активных загрузок</string> <string name="text_downloads_holder">Нет активных загрузок</string>
<string name="chapter_is_missing">Глава отсутствует</string> <string name="chapter_is_missing">Глава отсутствует</string>
<string name="chapter_is_missing_text">Скачайте или прочитайте эту недостающую главу онлайн.</string> <string name="chapter_is_missing_text">Скачайте или прочитайте эту недостающую главу онлайн.</string>
<string name="about_app_translation_summary">Помочь с переводом приложения</string> <string name="about_app_translation_summary">Помочь с переводом приложения</string>
<string name="about_app_translation">Перевод</string> <string name="about_app_translation">Перевод</string>
<string name="about_feedback_4pda">Тема на 4PDA</string> <string name="about_feedback_4pda">Тема на 4PDA</string>
<string name="about_feedback">Обратная связь</string> <string name="about_feedback">Обратная связь</string>
<string name="auth_complete">Авторизация выполнена</string> <string name="auth_complete">Авторизация выполнена</string>
<string name="auth_not_supported_by">Вход в %s не поддерживается</string> <string name="auth_not_supported_by">Вход в %s не поддерживается</string>
<string name="text_clear_cookies_prompt">Вы выйдете из всех источников</string> <string name="text_clear_cookies_prompt">Вы выйдете из всех источников</string>
<string name="genres">Жанры</string> <string name="genres">Жанры</string>
<string name="state_finished">Завершено</string> <string name="state_finished">Завершено</string>
<string name="state_ongoing">Онгоинг</string> <string name="state_ongoing">Онгоинг</string>
<string name="date_format">Формат даты</string> <string name="date_format">Формат даты</string>
<string name="system_default">По умолчанию</string> <string name="system_default">По умолчанию</string>
<string name="exclude_nsfw_from_history">Исключить NSFW мангу из истории</string> <string name="exclude_nsfw_from_history">Исключить NSFW мангу из истории</string>
<string name="error_empty_name">Вы должны ввести имя</string> <string name="error_empty_name">Вы должны ввести имя</string>
<string name="show_pages_numbers">Показывать номера страницы</string> <string name="show_pages_numbers">Показывать номера страницы</string>
<string name="enabled_sources">Включенные источники</string> <string name="enabled_sources">Включенные источники</string>
<string name="available_sources">Доступные источники</string> <string name="available_sources">Доступные источники</string>
<string name="dynamic_theme">Динамическая тема</string> <string name="dynamic_theme">Динамическая тема</string>
<string name="dynamic_theme_summary">Применяет тему приложения, основанную на цветовой палитре обоев на устройстве</string> <string name="dynamic_theme_summary">Применяет тему приложения, основанную на цветовой палитре обоев на устройстве</string>
<string name="screenshots_policy">Политика скриншотов</string> <string name="screenshots_policy">Политика скриншотов</string>
<string name="screenshots_allow">Разрешить</string> <string name="screenshots_allow">Разрешить</string>
<string name="screenshots_block_nsfw">Запретить для NSFW</string> <string name="screenshots_block_nsfw">Запретить для NSFW</string>
<string name="screenshots_block_all">Всегда блокировать</string> <string name="screenshots_block_all">Всегда блокировать</string>
<string name="suggestions">Рекомендации</string> <string name="suggestions">Рекомендации</string>
<string name="suggestions_enable">Включить рекомендации</string> <string name="suggestions_enable">Включить рекомендации</string>
<string name="suggestions_summary">Предлагать мангу на основе Ваших предпочтений</string> <string name="suggestions_summary">Предлагать мангу на основе Ваших предпочтений</string>
<string name="suggestions_info">Все данные анализируются локально на устройстве. Ваши персональные данные не передаются в какие-либо сервисы</string> <string name="suggestions_info">Все данные анализируются локально на устройстве. Ваши персональные данные не передаются в какие-либо сервисы</string>
<string name="text_suggestion_holder">Начните читать мангу, чтобы получать персональные предложения</string> <string name="text_suggestion_holder">Начните читать мангу, чтобы получать персональные предложения</string>
<string name="exclude_nsfw_from_suggestions">Не предлагать NSFW мангу</string> <string name="exclude_nsfw_from_suggestions">Не предлагать NSFW мангу</string>
<string name="enabled">Включено</string> <string name="enabled">Включено</string>
<string name="disabled">Выключено</string> <string name="disabled">Выключено</string>
<string name="filter_load_error">Не удалось загрузить список жанров</string> <string name="filter_load_error">Не удалось загрузить список жанров</string>
<string name="computing_">Вычисление…</string> <string name="computing_">Вычисление…</string>
<string name="report_github">Создать проблему на GitHub</string> <string name="report_github">Создать проблему на GitHub</string>
<string name="importing_progress">Импорт манги: %1$d из %2$d</string> <string name="importing_progress">Импорт манги: %1$d из %2$d</string>
<string name="reset_filter">Сбросить фильтр</string> <string name="reset_filter">Сбросить фильтр</string>
<string name="find_genre">Поиск по жанрам</string> <string name="find_genre">Поиск по жанрам</string>
<string name="onboard_text">Выберите языки, на которых Вы хоите читать мангу. Это можно будет изменить позже в настройках.</string> <string name="onboard_text">Выберите языки, на которых Вы хоите читать мангу. Это можно будет изменить позже в настройках.</string>
@@ -283,4 +283,23 @@
<string name="edit_category">Изменить категорию</string> <string name="edit_category">Изменить категорию</string>
<string name="tracking">Отслеживание</string> <string name="tracking">Отслеживание</string>
<string name="empty_favourite_categories">Нет категорий избранного</string> <string name="empty_favourite_categories">Нет категорий избранного</string>
<string name="bookmark_add">Добавить закладку</string>
<string name="bookmark_remove">Удалить закладку</string>
<string name="bookmarks">Закладки</string>
<string name="bookmark_removed">Закладка удалена</string>
<string name="bookmark_added">Закладка добавлена</string>
<string name="undo">Отменить</string>
<string name="removed_from_history">Удалено из истории</string>
<string name="dns_over_https">DNS через HTTPS</string>
<string name="default_mode">Режим по умолчанию</string>
<string name="detect_reader_mode">Автоопределение режима чтения</string>
<string name="detect_reader_mode_summary">Автоматически определяет, является ли манга веб-комиксом</string>
<string name="disable_battery_optimization">Отключить оптимизацию батареи</string>
<string name="disable_battery_optimization_summary">Помогает с фоновой проверкой обновлений</string>
<string name="crash_text">Что-то пошло не так. Пожалуйста, отправьте отчёт разработчикам, чтобы помочь всё исправить</string>
<string name="send">Отправить</string>
<string name="disable_all">Отключить все</string>
<string name="use_fingerprint">Использовать отпечаток пальца, если доступно</string>
<string name="appwidget_shelf_description">Манга из Вашего избранного</string>
<string name="appwidget_recent_description">Манга, которую Вы недавно читали</string>
</resources> </resources>

View File

@@ -1,303 +1,305 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"> <resources xmlns:tools="http://schemas.android.com/tools">
<string name="network_error">İnternete bağlı olduğunuzdan emin olunuz</string> <string name="network_error">İnternete bağlı olduğunuzdan emin olunuz</string>
<string name="close_menu">Menüyü kapat</string> <string name="close_menu">Menüyü kapat</string>
<string name="open_menu">Menüyü aç</string> <string name="open_menu">Menüyü aç</string>
<string name="local_storage">Dahili Depolama</string> <string name="local_storage">Dahili Depolama</string>
<string name="favourites">Favoriler</string> <string name="favourites">Favoriler</string>
<string name="history">Geçmiş</string> <string name="history">Geçmiş</string>
<string name="chapters">Bölümler</string> <string name="chapters">Bölümler</string>
<string name="list">Liste</string> <string name="list">Liste</string>
<string name="detailed_list">Detaylı liste</string> <string name="detailed_list">Detaylı liste</string>
<string name="grid">Izgara</string> <string name="grid">Izgara</string>
<string name="list_mode">Liste modu</string> <string name="list_mode">Liste modu</string>
<string name="loading_">Yükleniyor…</string> <string name="loading_">Yükleniyor…</string>
<string name="close">Kapat</string> <string name="close">Kapat</string>
<string name="try_again">Tekrar dene</string> <string name="try_again">Tekrar dene</string>
<string name="clear_history">Geçmişi temizle</string> <string name="clear_history">Geçmişi temizle</string>
<string name="nothing_found">Hiçbir şey bulunamadı</string> <string name="nothing_found">Hiçbir şey bulunamadı</string>
<string name="history_is_empty">Sen geçmişiniz yok</string> <string name="history_is_empty">Sen geçmişiniz yok</string>
<string name="read">Oku</string> <string name="read">Oku</string>
<string name="you_have_not_favourites_yet">Henüz favorileriniz yok</string> <string name="you_have_not_favourites_yet">Henüz favorileriniz yok</string>
<string name="add_to_favourites">Favoriniz</string> <string name="add_to_favourites">Favoriniz</string>
<string name="add_new_category">Yeni kategori</string> <string name="add_new_category">Yeni kategori</string>
<string name="add">Ekle</string> <string name="add">Ekle</string>
<string name="enter_category_name">Kategori ismi girin</string> <string name="enter_category_name">Kategori ismi girin</string>
<string name="save">Kaydet</string> <string name="save">Kaydet</string>
<string name="share">Paylaş</string> <string name="share">Paylaş</string>
<string name="share_s">%s Paylaş</string> <string name="share_s">%s Paylaş</string>
<string name="search">Ara</string> <string name="search">Ara</string>
<string name="search_manga">Manga ara</string> <string name="search_manga">Manga ara</string>
<string name="manga_downloading_">İndiriliyor…</string> <string name="manga_downloading_">İndiriliyor…</string>
<string name="processing_">İşleniyor…</string> <string name="processing_">İşleniyor…</string>
<string name="download_complete">İndirildi</string> <string name="download_complete">İndirildi</string>
<string name="downloads">İndirilenler</string> <string name="downloads">İndirilenler</string>
<string name="by_name">Ad</string> <string name="by_name">Ad</string>
<string name="updated">Güncellenme</string> <string name="updated">Güncellenme</string>
<string name="newest">Yeniler</string> <string name="newest">Yeniler</string>
<string name="by_rating">Puanlama</string> <string name="by_rating">Puanlama</string>
<string name="filter">Litre</string> <string name="filter">Litre</string>
<string name="theme">Tema</string> <string name="theme">Tema</string>
<string name="light">ık</string> <string name="light">ık</string>
<string name="dark">Koyu</string> <string name="dark">Koyu</string>
<string name="automatic">Takip sistemi</string> <string name="automatic">Takip sistemi</string>
<string name="pages">Sayfalar</string> <string name="pages">Sayfalar</string>
<string name="clear">Temizle</string> <string name="clear">Temizle</string>
<string name="text_clear_history_prompt">Tüm okuma geçmişi kalıcı olarak silinsin mi\?</string> <string name="text_clear_history_prompt">Tüm okuma geçmişi kalıcı olarak silinsin mi\?</string>
<string name="remove">Kaldır</string> <string name="remove">Kaldır</string>
<string name="_s_removed_from_history">“%s” geçmişinden kaldırıldı</string> <string name="_s_removed_from_history">“%s” geçmişinden kaldırıldı</string>
<string name="_s_deleted_from_local_storage">“%s” yerel depolama alanından sil</string> <string name="_s_deleted_from_local_storage">“%s” yerel depolama alanından sil</string>
<string name="wait_for_loading_finish">Lütfen bitmesini bekleyin…</string> <string name="wait_for_loading_finish">Lütfen bitmesini bekleyin…</string>
<string name="save_page">Sayfayı kaydet</string> <string name="save_page">Sayfayı kaydet</string>
<string name="share_image">Resmi paylaş</string> <string name="share_image">Resmi paylaş</string>
<string name="popular">Popüler</string> <string name="popular">Popüler</string>
<string name="details">Detaylar</string> <string name="details">Detaylar</string>
<string name="settings">Ayarlar</string> <string name="settings">Ayarlar</string>
<string name="page_saved">Kaydet</string> <string name="page_saved">Kaydet</string>
<string name="restart">Tekrar başlat</string> <string name="restart">Tekrar başlat</string>
<string name="error_occurred">Bir hata oluştu</string> <string name="error_occurred">Bir hata oluştu</string>
<string name="remote_sources">Uzak kaynaklar</string> <string name="remote_sources">Uzak kaynaklar</string>
<string name="warning">Uyarı</string> <string name="warning">Uyarı</string>
<string name="history_and_cache">Geçmiş ve önbellek</string> <string name="history_and_cache">Geçmiş ve önbellek</string>
<string name="search_history_cleared">Temizlendi</string> <string name="search_history_cleared">Temizlendi</string>
<string name="_continue">Devam</string> <string name="_continue">Devam</string>
<string name="not_available">Müsait değil</string> <string name="not_available">Müsait değil</string>
<string name="favourites_category_empty">Boş kategori</string> <string name="favourites_category_empty">Boş kategori</string>
<string name="cache">Önbellek</string> <string name="cache">Önbellek</string>
<string name="application_update">Uygulamanın yeni sürümlerini kontrol edin</string> <string name="application_update">Uygulamanın yeni sürümlerini kontrol edin</string>
<string name="remove_category">Kaldır</string> <string name="remove_category">Kaldır</string>
<string name="delete">Sil</string> <string name="delete">Sil</string>
<string name="chapter_d_of_d">Bölüm %1$d / %2$d</string> <string name="chapter_d_of_d">Bölüm %1$d / %2$d</string>
<string name="text_file_not_supported">Bir ZIP veya CBZ dosyası seçin.</string> <string name="text_file_not_supported">Bir ZIP veya CBZ dosyası seçin.</string>
<string name="read_mode">Okuma modu</string> <string name="read_mode">Okuma modu</string>
<string name="grid_size">Izgara boyutu</string> <string name="grid_size">Izgara boyutu</string>
<string name="webtoon">Webtoon</string> <string name="webtoon">Webtoon</string>
<string name="text_file_sizes">B|kB|MB|GB|TB</string> <string name="text_file_sizes">B|kB|MB|GB|TB</string>
<string name="reader_settings">Okuyucu ayarları</string> <string name="reader_settings">Okuyucu ayarları</string>
<string name="volume_buttons">Ses butonları</string> <string name="volume_buttons">Ses butonları</string>
<string name="dont_ask_again">Bir daha sorma</string> <string name="dont_ask_again">Bir daha sorma</string>
<string name="cancelling_">İptal ediliyor…</string> <string name="cancelling_">İptal ediliyor…</string>
<string name="error">Hata</string> <string name="error">Hata</string>
<string name="clear_thumbs_cache">Küçük resim önbelleğini temizle</string> <string name="clear_thumbs_cache">Küçük resim önbelleğini temizle</string>
<string name="gestures_only">Yalnızca hareketler</string> <string name="gestures_only">Yalnızca hareketler</string>
<string name="domain">Alan adi</string> <string name="domain">Alan adi</string>
<string name="open_in_browser">Web tarayıcısında aç</string> <string name="open_in_browser">Web tarayıcısında aç</string>
<string name="new_chapters">Yeni bölümler</string> <string name="new_chapters">Yeni bölümler</string>
<string name="notifications_settings">Bildirim ayarları</string> <string name="notifications_settings">Bildirim ayarları</string>
<string name="notification_sound">Bildirim sesi</string> <string name="notification_sound">Bildirim sesi</string>
<string name="light_indicator">LED göstergesi</string> <string name="light_indicator">LED göstergesi</string>
<string name="vibration">Titreşim</string> <string name="vibration">Titreşim</string>
<string name="other_storage">Diğer depolama</string> <string name="other_storage">Diğer depolama</string>
<string name="updates">Güncellemeler</string> <string name="updates">Güncellemeler</string>
<string name="create_shortcut">Kısayol oluştur…</string> <string name="create_shortcut">Kısayol oluştur…</string>
<string name="_import">İçe aktar</string> <string name="_import">İçe aktar</string>
<string name="delete_manga">Mangayı sil</string> <string name="delete_manga">Mangayı sil</string>
<string name="computing_">Bilgi işleniyor…</string> <string name="computing_">Bilgi işleniyor…</string>
<string name="sort_order">Sıralama düzeni</string> <string name="sort_order">Sıralama düzeni</string>
<string name="no_description">ıklama yok</string> <string name="no_description">ıklama yok</string>
<string name="operation_not_supported">Bu işlem desteklenmiyor</string> <string name="operation_not_supported">Bu işlem desteklenmiyor</string>
<string name="standard">Standart</string> <string name="standard">Standart</string>
<string name="clear_pages_cache">Sayfa önbelleğini temizle</string> <string name="clear_pages_cache">Sayfa önbelleğini temizle</string>
<string name="search_on_s">%s üzerinde ara</string> <string name="search_on_s">%s üzerinde ara</string>
<string name="internal_storage">Dahili depolama</string> <string name="internal_storage">Dahili depolama</string>
<string name="notifications">Bildirimler</string> <string name="notifications">Bildirimler</string>
<string name="switch_pages">Sayfaları değiştir</string> <string name="switch_pages">Sayfaları değiştir</string>
<string name="network_consumption_warning">Bu çok fazla veri aktarabilir</string> <string name="network_consumption_warning">Bu çok fazla veri aktarabilir</string>
<string name="save_manga">Kaydet</string> <string name="save_manga">Kaydet</string>
<string name="download">İndir</string> <string name="download">İndir</string>
<string name="manga_save_location">İndirilenler klasörü</string> <string name="manga_save_location">İndirilenler klasörü</string>
<string name="external_storage">Harici depolama</string> <string name="external_storage">Harici depolama</string>
<string name="read_from_start">Baştan oku</string> <string name="read_from_start">Baştan oku</string>
<string name="categories_">Kategoriler…</string> <string name="categories_">Kategoriler…</string>
<string name="app_update_available">Uygulamanın yeni bir sürümü mevcut</string> <string name="app_update_available">Uygulamanın yeni bir sürümü mevcut</string>
<string name="show_notification_app_update">Yeni bir sürüm mevcutsa bildirimini göster</string> <string name="show_notification_app_update">Yeni bir sürüm mevcutsa bildirimini göster</string>
<string name="favourites_categories">Favori kategoriler</string> <string name="favourites_categories">Favori kategoriler</string>
<string name="done">Bitti</string> <string name="done">Bitti</string>
<string name="read_later">Sonra oku</string> <string name="read_later">Sonra oku</string>
<string name="pages_animation">Sayfa animasyonu</string> <string name="pages_animation">Sayfa animasyonu</string>
<string name="cannot_find_available_storage">Kullanılabilir depolama alanı yok</string> <string name="cannot_find_available_storage">Kullanılabilir depolama alanı yok</string>
<string name="rename">Yeniden adlandır</string> <string name="rename">Yeniden adlandır</string>
<string name="text_delete_local_manga">“%s” cihazdan kalıcı olarak silinsin mi\?</string> <string name="text_delete_local_manga">“%s” cihazdan kalıcı olarak silinsin mi\?</string>
<string name="clear_search_history">Arama geçmişini temizle</string> <string name="clear_search_history">Arama geçmişini temizle</string>
<string name="text_empty_holder_primary">Burası biraz boş…</string> <string name="text_empty_holder_primary">Burası biraz boş…</string>
<string name="rotate_screen">Ekranı döndür</string> <string name="rotate_screen">Ekranı döndür</string>
<string name="scale_mode">Ölçek modu</string> <string name="scale_mode">Ölçek modu</string>
<string name="zoom_mode_fit_height">Yüksekliğe sığdır</string> <string name="zoom_mode_fit_height">Yüksekliğe sığdır</string>
<string name="black_dark_theme">Siyah</string> <string name="black_dark_theme">Siyah</string>
<string name="zoom_mode_keep_start">Başlangıçta tut</string> <string name="zoom_mode_keep_start">Başlangıçta tut</string>
<string name="clear_feed">Akışı temizle</string> <string name="clear_feed">Akışı temizle</string>
<string name="chapter_is_missing_text">Bu eksik bölümü çevrim içi olarak indirin veya okuyun.</string> <string name="chapter_is_missing_text">Bu eksik bölümü çevrim içi olarak indirin veya okuyun.</string>
<string name="restore_backup">Yedekten geri yükle</string> <string name="restore_backup">Yedekten geri yükle</string>
<string name="update">Güncelle</string> <string name="update">Güncelle</string>
<string name="sign_in">Oturum aç</string> <string name="sign_in">Oturum aç</string>
<string name="state_finished">Bitti</string> <string name="state_finished">Bitti</string>
<string name="about">Hakkında</string> <string name="about">Hakkında</string>
<string name="auth_required">Bu içeriği görüntülemek için oturum açın</string> <string name="auth_required">Bu içeriği görüntülemek için oturum açın</string>
<string name="confirm">Onayla</string> <string name="confirm">Onayla</string>
<string name="auth_complete">Yetkilendirildi</string> <string name="auth_complete">Yetkilendirildi</string>
<string name="just_now">Az önce</string> <string name="just_now">Az önce</string>
<string name="taps_on_edges">Kenar dokunuşları</string> <string name="taps_on_edges">Kenar dokunuşları</string>
<string name="large_manga_save_confirm">Bu mangada %s var. Hepsi kaydedilsin mi\?</string> <string name="large_manga_save_confirm">Bu mangada %s var. Hepsi kaydedilsin mi\?</string>
<string name="enabled_d_of_d" tools:ignore="PluralsCandidate">%1$d / %2$d açık</string> <string name="enabled_d_of_d" tools:ignore="PluralsCandidate">%1$d / %2$d açık</string>
<string name="category_delete_confirm">“%s” kategorisi favorilerinizden kaldırılsın mı\? <string name="category_delete_confirm">“%s” kategorisi favorilerinizden kaldırılsın mı\?
\nİçindeki tüm mangalar kaybolacak.</string> \nİçindeki tüm mangalar kaybolacak.</string>
<string name="text_search_holder_secondary">Sorguyu yeniden biçimlendirmeyi deneyin.</string> <string name="text_search_holder_secondary">Sorguyu yeniden biçimlendirmeyi deneyin.</string>
<string name="text_history_holder_primary">Okuduklarınız burada görüntülenecek</string> <string name="text_history_holder_primary">Okuduklarınız burada görüntülenecek</string>
<string name="text_history_holder_secondary">Yan menüde ne okuyacağınızı bulun.</string> <string name="text_history_holder_secondary">Yan menüde ne okuyacağınızı bulun.</string>
<string name="text_local_holder_primary">Önce bir şey kaydedin</string> <string name="text_local_holder_primary">Önce bir şey kaydedin</string>
<string name="text_local_holder_secondary">Çevrim içi kaynaklardan kaydedin veya dosyaları içe aktarın.</string> <string name="text_local_holder_secondary">Çevrim içi kaynaklardan kaydedin veya dosyaları içe aktarın.</string>
<string name="manga_shelf">Raf</string> <string name="manga_shelf">Raf</string>
<string name="recent_manga">Son</string> <string name="recent_manga">Son</string>
<string name="size_s">Boyut: %s</string> <string name="size_s">Boyut: %s</string>
<string name="related">İlgili</string> <string name="related">İlgili</string>
<string name="updates_feed_cleared">Temizlendi</string> <string name="updates_feed_cleared">Temizlendi</string>
<string name="enter_password">Parola gir</string> <string name="enter_password">Parola gir</string>
<string name="protect_application_summary">Kotatsu başlatılırken parola sor</string> <string name="protect_application_summary">Kotatsu başlatılırken parola sor</string>
<string name="track_sources">Güncellemeleri ara</string> <string name="track_sources">Güncellemeleri ara</string>
<string name="clear_updates_feed">Güncelleme akışını temizle</string> <string name="clear_updates_feed">Güncelleme akışını temizle</string>
<string name="feed_will_update_soon">Akış güncellemesi yakında başlayacak</string> <string name="feed_will_update_soon">Akış güncellemesi yakında başlayacak</string>
<string name="app_version">Sürüm %s</string> <string name="app_version">Sürüm %s</string>
<string name="check_for_updates">Güncellemeleri denetle</string> <string name="check_for_updates">Güncellemeleri denetle</string>
<string name="checking_for_updates">Güncellemeler denetleniyor…</string> <string name="checking_for_updates">Güncellemeler denetleniyor…</string>
<string name="update_check_failed">Güncellemeler aranamadı</string> <string name="update_check_failed">Güncellemeler aranamadı</string>
<string name="zoom_mode_fit_center">Merkeze sığdır</string> <string name="zoom_mode_fit_center">Merkeze sığdır</string>
<string name="zoom_mode_fit_width">Genişliğe sığdır</string> <string name="zoom_mode_fit_width">Genişliğe sığdır</string>
<string name="black_dark_theme_summary">AMOLED ekranlarda daha az güç kullanır</string> <string name="black_dark_theme_summary">AMOLED ekranlarda daha az güç kullanır</string>
<string name="backup_restore">Yedekle ve geri yükle</string> <string name="backup_restore">Yedekle ve geri yükle</string>
<string name="create_backup">Veri yedeği oluştur</string> <string name="create_backup">Veri yedeği oluştur</string>
<string name="data_restored">Geri yüklendi</string> <string name="data_restored">Geri yüklendi</string>
<string name="preparing_">Hazırlanıyor…</string> <string name="preparing_">Hazırlanıyor…</string>
<string name="yesterday">Dün</string> <string name="yesterday">Dün</string>
<string name="group">Grup</string> <string name="group">Grup</string>
<string name="silent">Sessiz</string> <string name="silent">Sessiz</string>
<string name="captcha_solve">Çöz</string> <string name="captcha_solve">Çöz</string>
<string name="clear_cookies">Çerezleri temizle</string> <string name="clear_cookies">Çerezleri temizle</string>
<string name="default_s">Öntanımlı: %s</string> <string name="default_s">Öntanımlı: %s</string>
<string name="reverse">Ters</string> <string name="reverse">Ters</string>
<string name="password_length_hint">Parola 4 veya daha fazla karakterden oluşmalıdır</string> <string name="password_length_hint">Parola 4 veya daha fazla karakterden oluşmalıdır</string>
<string name="welcome">Hoş geldiniz</string> <string name="welcome">Hoş geldiniz</string>
<string name="queued">Sıraya alındı</string> <string name="queued">Sıraya alındı</string>
<string name="text_downloads_holder">Etkin indirme yok</string> <string name="text_downloads_holder">Etkin indirme yok</string>
<string name="chapter_is_missing">Bölüm eksik</string> <string name="chapter_is_missing">Bölüm eksik</string>
<string name="about_app_translation_summary">Bu uygulamayı çevirin</string> <string name="about_app_translation_summary">Bu uygulamayı çevirin</string>
<string name="about_app_translation">Çeviri</string> <string name="about_app_translation">Çeviri</string>
<string name="search_only_on_s">Yalnızca %s içinde ara</string> <string name="search_only_on_s">Yalnızca %s içinde ara</string>
<string name="about_feedback_4pda">4PDA\'daki konu</string> <string name="about_feedback_4pda">4PDA\'daki konu</string>
<string name="state_ongoing">Devam ediyor</string> <string name="state_ongoing">Devam ediyor</string>
<string name="text_clear_cookies_prompt">Tüm kaynaklardaki oturumunuz kapatılacak</string> <string name="text_clear_cookies_prompt">Tüm kaynaklardaki oturumunuz kapatılacak</string>
<string name="enabled_sources">Kullanılan kaynaklar</string> <string name="enabled_sources">Kullanılan kaynaklar</string>
<string name="available_sources">Kullanılabilir kaynaklar</string> <string name="available_sources">Kullanılabilir kaynaklar</string>
<string name="exclude_nsfw_from_history">Uygunsuz mangayı geçmişten hariç tut</string> <string name="exclude_nsfw_from_history">Uygunsuz mangayı geçmişten hariç tut</string>
<string name="show_pages_numbers">Numaralı sayfalar</string> <string name="show_pages_numbers">Numaralı sayfalar</string>
<string name="dynamic_theme_summary">Duvar kağıdınızın renk düzeninden oluşturulan bir temayı uygular</string> <string name="dynamic_theme_summary">Duvar kağıdınızın renk düzeninden oluşturulan bir temayı uygular</string>
<string name="importing_progress">Manga içe aktarılıyor: %1$d / %2$d</string> <string name="importing_progress">Manga içe aktarılıyor: %1$d / %2$d</string>
<string name="search_results">Arama sonuçları</string> <string name="search_results">Arama sonuçları</string>
<string name="waiting_for_network">Ağ bekleniyor…</string> <string name="waiting_for_network">Ağ bekleniyor…</string>
<string name="repeat_password">Parolayı tekrarla</string> <string name="repeat_password">Parolayı tekrarla</string>
<string name="prefer_rtl_reader">Sağdan sola (←) okuyucuyu tercih et</string> <string name="dont_check">Denetleme</string>
<string name="dont_check">Denetleme</string> <string name="wrong_password">Yanlış parola</string>
<string name="wrong_password">Yanlış parola</string> <string name="report_github">GitHub\'da sorun oluştur</string>
<string name="report_github">GitHub\'da sorun oluştur</string> <string name="backup_information">Geçmişinizin ve favorilerinizin yedeğini oluşturabilir ve bunları geri yükleyebilirsiniz</string>
<string name="backup_information">Geçmişinizin ve favorilerinizin yedeğini oluşturabilir ve bunları geri yükleyebilirsiniz</string> <string name="long_ago">Uzun zaman önce</string>
<string name="long_ago">Uzun zaman önce</string> <string name="today">Bugün</string>
<string name="today">Bugün</string> <string name="no_update_available">Güncelleme yok</string>
<string name="no_update_available">Güncelleme yok</string> <string name="chapters_checking_progress">Yeni bölümler denetleniyor: %1$d / %2$d</string>
<string name="chapters_checking_progress">Yeni bölümler denetleniyor: %1$d / %2$d</string> <string name="dynamic_theme">Dinamik tema</string>
<string name="dynamic_theme">Dinamik tema</string> <string name="text_categories_holder">Favorilerinizi düzenlemek için kategorileri kullanabilirsiniz. Kategori oluşturmak için «+» düğmesine basın</string>
<string name="text_categories_holder">Favorilerinizi düzenlemek için kategorileri kullanabilirsiniz. Kategori oluşturmak için «+» düğmesine basın</string> <string name="all_favourites">Tüm favoriler</string>
<string name="all_favourites">Tüm favoriler</string> <string name="text_feed_holder">Okuduklarınızın yeni bölümleri burada gösterilir</string>
<string name="text_feed_holder">Okuduklarınızın yeni bölümleri burada gösterilir</string> <string name="new_version_s">Yeni sürüm: %s</string>
<string name="new_version_s">Yeni sürüm: %s</string> <string name="protect_application">Uygulamayı koru</string>
<string name="protect_application">Uygulamayı koru</string> <string name="passwords_mismatch">Parolalar eşleşmiyor</string>
<string name="passwords_mismatch">Parolalar eşleşmiyor</string> <string name="right_to_left">Sağdan sola (←)</string>
<string name="right_to_left">Sağdan sola (←)</string> <string name="create_category">Yeni kategori</string>
<string name="create_category">Yeni kategori</string> <string name="file_not_found">Dosya bulunamadı</string>
<string name="file_not_found">Dosya bulunamadı</string> <string name="data_restored_success">Tüm veriler geri yüklendi</string>
<string name="data_restored_success">Tüm veriler geri yüklendi</string> <string name="data_restored_with_errors">Veriler geri yüklendi, ancak hatalar var</string>
<string name="data_restored_with_errors">Veriler geri yüklendi, ancak hatalar var</string> <string name="tap_to_try_again">Tekrar denemek için dokunun</string>
<string name="tap_to_try_again">Tekrar denemek için dokunun</string> <string name="next">İleri</string>
<string name="next">İleri</string> <string name="other">Diğer</string>
<string name="other">Diğer</string> <string name="captcha_required">CAPTCHA gerekli</string>
<string name="captcha_required">CAPTCHA gerekli</string> <string name="cookies_cleared">Tüm çerezler kaldırıldı</string>
<string name="cookies_cleared">Tüm çerezler kaldırıldı</string> <string name="reader_mode_hint">Seçilen yapılandırma bu manga için hatırlanacak</string>
<string name="reader_mode_hint">Seçilen yapılandırma bu manga için hatırlanacak</string> <string name="text_clear_updates_feed_prompt">Tüm güncelleme geçmişi kalıcı olarak silinsin mi\?</string>
<string name="text_clear_updates_feed_prompt">Tüm güncelleme geçmişi kalıcı olarak silinsin mi\?</string> <string name="_and_x_more">…ve %1$d daha fazlası</string>
<string name="_and_x_more">…ve %1$d daha fazlası</string> <string name="protect_application_subtitle">Uygulamayı başlatmak için bir parola girin</string>
<string name="protect_application_subtitle">Uygulamayı başlatmak için bir parola girin</string> <string name="text_clear_search_history_prompt">Tüm son arama sorguları kalıcı olarak kaldırılsın mı\?</string>
<string name="text_clear_search_history_prompt">Tüm son arama sorguları kalıcı olarak kaldırılsın mı\?</string> <string name="about_feedback">Geri bildirim</string>
<string name="about_feedback">Geri bildirim</string> <string name="backup_saved">Yedek kaydedildi</string>
<string name="backup_saved">Yedek kaydedildi</string> <string name="genres">Türler</string>
<string name="genres">Türler</string> <string name="date_format">Tarih biçimi</string>
<string name="date_format">Tarih biçimi</string> <string name="system_default">Öntanımlı</string>
<string name="system_default">Öntanımlı</string> <string name="error_empty_name">Bir ad girmelisiniz</string>
<string name="error_empty_name">Bir ad girmelisiniz</string> <string name="auth_not_supported_by">%s üzerinde oturum açma desteklenmiyor</string>
<string name="auth_not_supported_by">%s üzerinde oturum açma desteklenmiyor</string> <string name="read_more">Daha fazla oku</string>
<string name="read_more">Daha fazla oku</string> <string name="tracker_warning">Bazı aygıtların arka plan görevlerini bozabilecek farklı sistem davranışları vardır.</string>
<string name="tracker_warning">Bazı aygıtların arka plan görevlerini bozabilecek farklı sistem davranışları vardır.</string> <string name="screenshots_policy">Ekran görüntüsü politikası</string>
<string name="screenshots_policy">Ekran görüntüsü politikası</string> <string name="screenshots_block_nsfw">Uygunsuzlarda engelle</string>
<string name="screenshots_block_nsfw">Uygunsuzlarda engelle</string> <string name="screenshots_block_all">Her zaman engelle</string>
<string name="screenshots_block_all">Her zaman engelle</string> <string name="screenshots_allow">İzin ver</string>
<string name="screenshots_allow">İzin ver</string> <string name="check_for_new_chapters">Yeni bölümleri denetle</string>
<string name="check_for_new_chapters">Yeni bölümleri denetle</string> <string name="suggestions">Öneriler</string>
<string name="suggestions">Öneriler</string> <string name="suggestions_enable">Önerileri etkinleştir</string>
<string name="suggestions_enable">Önerileri etkinleştir</string> <string name="suggestions_summary">Tercihlerinize göre manga önerileri alın</string>
<string name="suggestions_summary">Tercihlerinize göre manga önerileri alın</string> <string name="suggestions_info">Tüm veriler aygıt üzerinde yerel olarak işlenir. Kişisel verilerinizin herhangi bir hizmete aktarılması söz konusu değildir</string>
<string name="suggestions_info">Tüm veriler aygıt üzerinde yerel olarak işlenir. Kişisel verilerinizin herhangi bir hizmete aktarılması söz konusu değildir</string> <string name="text_suggestion_holder">Manga okumaya başladıktan sonra kişiselleştirilmiş öneriler alacaksınız</string>
<string name="text_suggestion_holder">Manga okumaya başladıktan sonra kişiselleştirilmiş öneriler alacaksınız</string> <string name="exclude_nsfw_from_suggestions">Uygunsuz manga önerme</string>
<string name="exclude_nsfw_from_suggestions">Uygunsuz manga önerme</string> <string name="enabled">Etkin</string>
<string name="enabled">Etkin</string> <string name="disabled">Devre dışı</string>
<string name="disabled">Devre dışı</string> <string name="filter_load_error">Türler listesi yüklenemiyor</string>
<string name="filter_load_error">Türler listesi yüklenemiyor</string> <string name="reset_filter">Filtreyi sıfırla</string>
<string name="reset_filter">Filtreyi sıfırla</string> <string name="find_genre">Tür bul</string>
<string name="find_genre">Tür bul</string> <string name="onboard_text">Manga okumak istediğiniz dilleri seçin. Daha sonra ayarlardan değiştirebilirsiniz.</string>
<string name="onboard_text">Manga okumak istediğiniz dilleri seçin. Daha sonra ayarlardan değiştirebilirsiniz.</string> <string name="always">Her zaman</string>
<string name="always">Her zaman</string> <string name="never">Hiçbir zaman</string>
<string name="never">Hiçbir zaman</string> <string name="only_using_wifi">Yalnızca Wi-Fi\'de</string>
<string name="only_using_wifi">Yalnızca Wi-Fi\'de</string> <string name="preload_pages">Sayfaları önceden yükle</string>
<string name="preload_pages">Sayfaları önceden yükle</string> <string name="logged_in_as">%s olarak oturum açıldı</string>
<string name="logged_in_as">%s olarak oturum açıldı</string> <string name="nsfw">18+</string>
<string name="nsfw">18+</string> <string name="various_languages">Çeşitli diller</string>
<string name="various_languages">Çeşitli diller</string> <string name="search_chapters">Bölüm bul</string>
<string name="search_chapters">Bölüm bul</string> <string name="chapters_empty">Bu mangada bölüm yok</string>
<string name="chapters_empty">Bu mangada bölüm yok</string> <string name="percent_string_pattern">%%%1$s</string>
<string name="percent_string_pattern">%%%1$s</string> <string name="content">İçerik</string>
<string name="content">İçerik</string> <string name="suggestions_updating">Öneriler güncelleniyor</string>
<string name="suggestions_updating">Öneriler güncelleniyor</string> <string name="appearance">Görünüm</string>
<string name="appearance">Görünüm</string> <string name="suggestions_excluded_genres">Türleri hariç tut</string>
<string name="suggestions_excluded_genres">Türleri hariç tut</string> <string name="suggestions_excluded_genres_summary">Önerilerde görmek istemediğiniz türleri belirtin</string>
<string name="suggestions_excluded_genres_summary">Önerilerde görmek istemediğiniz türleri belirtin</string> <string name="text_delete_local_manga_batch">Seçilen ögeler aygıttan kalıcı olarak silinsin mi\?</string>
<string name="text_delete_local_manga_batch">Seçilen ögeler aygıttan kalıcı olarak silinsin mi\?</string> <string name="batch_manga_save_confirm">Seçilen tüm mangaları tüm bölümleriyle birlikte indirmek istediğinizden emin misiniz\? Bu işlem çok fazla trafik ve depolama alanı tüketebilir</string>
<string name="batch_manga_save_confirm">Seçilen tüm mangaları tüm bölümleriyle birlikte indirmek istediğinizden emin misiniz\? Bu işlem çok fazla trafik ve depolama alanı tüketebilir</string> <string name="removal_completed">Kaldırma tamamlandı</string>
<string name="removal_completed">Kaldırma tamamlandı</string> <string name="chapters_will_removed_background">Bölümler arka planda kaldırılacaktır. Bu biraz zaman alabilir</string>
<string name="chapters_will_removed_background">Bölümler arka planda kaldırılacaktır. Bu biraz zaman alabilir</string> <string name="parallel_downloads">Paralel indirmeler</string>
<string name="parallel_downloads">Paralel indirmeler</string> <string name="download_slowdown">İndirmeyi yavaşlat</string>
<string name="download_slowdown">İndirmeyi yavaşlat</string> <string name="download_slowdown_summary">IP adresinizin engellenmesinden kaçınmanıza yardımcı olur</string>
<string name="download_slowdown_summary">IP adresinizin engellenmesinden kaçınmanıza yardımcı olur</string> <string name="local_manga_processing">Kaydedilen manga işleme</string>
<string name="local_manga_processing">Kaydedilen manga işleme</string> <string name="hide">Gizle</string>
<string name="hide">Gizle</string> <string name="new_sources_text">Yeni manga kaynakları var</string>
<string name="new_sources_text">Yeni manga kaynakları var</string> <string name="show_notification_new_chapters_off">Bildirim almayacaksınız ancak yeni bölümler listelerde vurgulanacak</string>
<string name="show_notification_new_chapters_off">Bildirim almayacaksınız ancak yeni bölümler listelerde vurgulanacak</string> <string name="notifications_enable">Bildirimleri etkinleştir</string>
<string name="notifications_enable">Bildirimleri etkinleştir</string> <string name="check_new_chapters_title">Yeni bölümleri denetle ve bildirim gönder</string>
<string name="check_new_chapters_title">Yeni bölümleri denetle ve bildirim gönder</string> <string name="show_notification_new_chapters_on">Okuduğunuz manga güncellemeleri hakkında bildirim alacaksınız</string>
<string name="show_notification_new_chapters_on">Okuduğunuz manga güncellemeleri hakkında bildirim alacaksınız</string> <string name="empty_favourite_categories">Favori kategori yok</string>
<string name="empty_favourite_categories">Favori kategori yok</string> <string name="name">Ad</string>
<string name="name">Ad</string> <string name="edit">Düzenle</string>
<string name="edit">Düzenle</string> <string name="edit_category">Kategoriyi düzenle</string>
<string name="edit_category">Kategoriyi düzenle</string> <string name="bookmark_add">Yer imi ekle</string>
<string name="bookmark_add">Yer imi ekle</string> <string name="bookmark_remove">Yer imini kaldır</string>
<string name="bookmark_remove">Yer imini kaldır</string> <string name="bookmarks">Yer imleri</string>
<string name="bookmarks">Yer imleri</string> <string name="bookmark_removed">Yer imi kaldırıldı</string>
<string name="bookmark_removed">Yer imi kaldırıldı</string> <string name="bookmark_added">Yer imi eklendi</string>
<string name="bookmark_added">Yer imi eklendi</string> <string name="undo">Geri al</string>
<string name="undo">Geri al</string> <string name="removed_from_history">Geçmişten kaldırıldı</string>
<string name="removed_from_history">Geçmişten kaldırıldı</string> <string name="dns_over_https">HTTPS üzerinden DNS</string>
<string name="dns_over_https">HTTPS üzerinden DNS</string> <string name="detect_reader_mode">Okuyucu modunu otomatik algıla</string>
<string name="detect_reader_mode">Okuyucu modunu otomatik algıla</string> <string name="detect_reader_mode_summary">Manganın webtoon olup olmadığını otomatik olarak algıla</string>
<string name="detect_reader_mode_summary">Manganın webtoon olup olmadığını otomatik olarak algıla</string> <string name="default_mode">Öntanımlı mod</string>
<string name="default_mode">Öntanımlı mod</string> <string name="disable_battery_optimization">Pil iyileştirmesini devre dışı bırak</string>
<string name="disable_battery_optimization">Pil iyileştirmesini devre dışı bırak</string> <string name="disable_battery_optimization_summary">Arka planda güncelleme denetimlerine yardımcı olur</string>
<string name="disable_battery_optimization_summary">Arka planda güncelleme denetimlerine yardımcı olur</string> <string name="crash_text">Bir şeyler yanlış gitti. Düzeltmemize yardımcı olması için lütfen geliştiricilere bir hata bildirimi gönderin.</string>
<string name="crash_text">Bir şeyler yanlış gitti. Düzeltmemize yardımcı olması için lütfen geliştiricilere bir hata bildirimi gönderin.</string> <string name="send">Gönder</string>
<string name="send">Gönder</string> <string name="disable_all">Tümünü devre dışı bırak</string>
<string name="disable_all">Tümünü devre dışı bırak</string> <string name="use_fingerprint">Varsa parmak izi kullan</string>
<string name="appwidget_shelf_description">Favorilerinizden mangalar</string>
<string name="appwidget_recent_description">Son okuduğunuz mangalar</string>
</resources> </resources>

View File

@@ -1,301 +1,305 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"> <resources xmlns:tools="http://schemas.android.com/tools">
<string name="wait_for_loading_finish">Дочекайтеся завершення завантаження…</string> <string name="wait_for_loading_finish">Дочекайтеся завершення завантаження…</string>
<string name="delete">Видалити</string> <string name="delete">Видалити</string>
<string name="nothing_found">Нічого не знайдено</string> <string name="nothing_found">Нічого не знайдено</string>
<string name="add_to_favourites">Додати до улюблених</string> <string name="add_to_favourites">Додати до улюблених</string>
<string name="clear_history">Очистити історію</string> <string name="clear_history">Очистити історію</string>
<string name="history_is_empty">Історії ще немає</string> <string name="history_is_empty">Історії ще немає</string>
<string name="add">Додати</string> <string name="add">Додати</string>
<string name="save">Зберегти</string> <string name="save">Зберегти</string>
<string name="local_storage">Локальне сховище</string> <string name="local_storage">Локальне сховище</string>
<string name="network_error">Не вдалося підключитися до Інтернету</string> <string name="network_error">Не вдалося підключитися до Інтернету</string>
<string name="details">Деталі</string> <string name="details">Деталі</string>
<string name="try_again">Спробуйте ще раз</string> <string name="try_again">Спробуйте ще раз</string>
<string name="open_menu">Відкрити меню</string> <string name="open_menu">Відкрити меню</string>
<string name="you_have_not_favourites_yet">Улюблених ще немає</string> <string name="you_have_not_favourites_yet">Улюблених ще немає</string>
<string name="add_new_category">Нова категорія</string> <string name="add_new_category">Нова категорія</string>
<string name="enter_category_name">Введіть назву категорії</string> <string name="enter_category_name">Введіть назву категорії</string>
<string name="download_complete">Завантажено</string> <string name="download_complete">Завантажено</string>
<string name="favourites">Уподобання</string> <string name="favourites">Уподобання</string>
<string name="history">Історія</string> <string name="history">Історія</string>
<string name="error_occurred">Сталася помилка</string> <string name="error_occurred">Сталася помилка</string>
<string name="chapters">Розділи</string> <string name="chapters">Розділи</string>
<string name="list">Список</string> <string name="list">Список</string>
<string name="detailed_list">Детальний список</string> <string name="detailed_list">Детальний список</string>
<string name="list_mode">Режим списку</string> <string name="list_mode">Режим списку</string>
<string name="settings">Налаштування</string> <string name="settings">Налаштування</string>
<string name="remote_sources">Віддалені джерела</string> <string name="remote_sources">Віддалені джерела</string>
<string name="loading_">Завантаження…</string> <string name="loading_">Завантаження…</string>
<string name="computing_">Обчислення…</string> <string name="computing_">Обчислення…</string>
<string name="chapter_d_of_d">Розділ %1$d із %2$d</string> <string name="chapter_d_of_d">Розділ %1$d із %2$d</string>
<string name="close">Закрити</string> <string name="close">Закрити</string>
<string name="read">Читати</string> <string name="read">Читати</string>
<string name="grid">Таблиця</string> <string name="grid">Таблиця</string>
<string name="share">Поділитися</string> <string name="share">Поділитися</string>
<string name="create_shortcut">Створити ярлик…</string> <string name="create_shortcut">Створити ярлик…</string>
<string name="share_s">Поділитися %s</string> <string name="share_s">Поділитися %s</string>
<string name="search">Пошук</string> <string name="search">Пошук</string>
<string name="search_manga">Пошук манґи</string> <string name="search_manga">Пошук манґи</string>
<string name="processing_">Обробка…</string> <string name="processing_">Обробка…</string>
<string name="by_name">Ім\'я</string> <string name="by_name">Ім\'я</string>
<string name="popular">Популярна</string> <string name="popular">Популярна</string>
<string name="updated">Оновлена</string> <string name="updated">Оновлена</string>
<string name="newest">Нова</string> <string name="newest">Нова</string>
<string name="by_rating">Рейтинг</string> <string name="by_rating">Рейтинг</string>
<string name="sort_order">Порядок сортування</string> <string name="sort_order">Порядок сортування</string>
<string name="filter">Фільтр</string> <string name="filter">Фільтр</string>
<string name="theme">Тема</string> <string name="theme">Тема</string>
<string name="light">Світла</string> <string name="light">Світла</string>
<string name="dark">Темна</string> <string name="dark">Темна</string>
<string name="pages">Сторінки</string> <string name="pages">Сторінки</string>
<string name="text_clear_history_prompt">Очистити всю історію читання перманентно\?</string> <string name="text_clear_history_prompt">Очистити всю історію читання перманентно\?</string>
<string name="remove">Видалити</string> <string name="remove">Видалити</string>
<string name="_s_removed_from_history">\"%s\" видалено з історії</string> <string name="_s_removed_from_history">\"%s\" видалено з історії</string>
<string name="_s_deleted_from_local_storage">\"%s\" видалено з локального сховища</string> <string name="_s_deleted_from_local_storage">\"%s\" видалено з локального сховища</string>
<string name="save_page">Зберегти сторінку</string> <string name="save_page">Зберегти сторінку</string>
<string name="page_saved">Збережено</string> <string name="page_saved">Збережено</string>
<string name="share_image">Поділитись зображенням</string> <string name="share_image">Поділитись зображенням</string>
<string name="operation_not_supported">Ця операція не підтримується</string> <string name="operation_not_supported">Ця операція не підтримується</string>
<string name="text_file_not_supported">Виберіть файл ZIP або CBZ.</string> <string name="text_file_not_supported">Виберіть файл ZIP або CBZ.</string>
<string name="no_description">Немає опису</string> <string name="no_description">Немає опису</string>
<string name="history_and_cache">Історія та кеш</string> <string name="history_and_cache">Історія та кеш</string>
<string name="clear_pages_cache">Очистити кеш сторінок</string> <string name="clear_pages_cache">Очистити кеш сторінок</string>
<string name="cache">Кеш</string> <string name="cache">Кеш</string>
<string name="text_file_sizes">Б|кБ|МБ|ГБ|ТБ</string> <string name="text_file_sizes">Б|кБ|МБ|ГБ|ТБ</string>
<string name="standard">Стандартний</string> <string name="standard">Стандартний</string>
<string name="webtoon">Вебтун</string> <string name="webtoon">Вебтун</string>
<string name="read_mode">Режим читання</string> <string name="read_mode">Режим читання</string>
<string name="grid_size">Розмір сітки</string> <string name="grid_size">Розмір сітки</string>
<string name="search_on_s">Пошук по %s</string> <string name="search_on_s">Пошук по %s</string>
<string name="delete_manga">Видалити манґу</string> <string name="delete_manga">Видалити манґу</string>
<string name="text_delete_local_manga">Видалити \"%s\" з пристрою перманентно\?</string> <string name="text_delete_local_manga">Видалити \"%s\" з пристрою перманентно\?</string>
<string name="reader_settings">Налаштування читача</string> <string name="reader_settings">Налаштування читача</string>
<string name="switch_pages">Перегортання сторінок</string> <string name="switch_pages">Перегортання сторінок</string>
<string name="volume_buttons">Кнопки гучності</string> <string name="volume_buttons">Кнопки гучності</string>
<string name="cancelling_">Скасування…</string> <string name="cancelling_">Скасування…</string>
<string name="error">Помилка</string> <string name="error">Помилка</string>
<string name="clear_thumbs_cache">Очистити кеш мініатюр</string> <string name="clear_thumbs_cache">Очистити кеш мініатюр</string>
<string name="clear_search_history">Очистити історію пошуку</string> <string name="clear_search_history">Очистити історію пошуку</string>
<string name="search_history_cleared">Очищено</string> <string name="search_history_cleared">Очищено</string>
<string name="gestures_only">Тільки жести</string> <string name="gestures_only">Тільки жести</string>
<string name="internal_storage">Внутрішнє сховище</string> <string name="internal_storage">Внутрішнє сховище</string>
<string name="external_storage">Зовнішнє сховище</string> <string name="external_storage">Зовнішнє сховище</string>
<string name="domain">Домен</string> <string name="domain">Домен</string>
<string name="application_update">Перевірити наявність нових версій додатка</string> <string name="application_update">Перевірити наявність нових версій додатка</string>
<string name="app_update_available">Доступна нова версія додатка</string> <string name="app_update_available">Доступна нова версія додатка</string>
<string name="large_manga_save_confirm">Ця манґа має %s. Зберегти все це\?</string> <string name="large_manga_save_confirm">Ця манґа має %s. Зберегти все це\?</string>
<string name="save_manga">Зберегти</string> <string name="save_manga">Зберегти</string>
<string name="notifications">Сповіщення</string> <string name="notifications">Сповіщення</string>
<string name="enabled_d_of_d" tools:ignore="PluralsCandidate">Увімкнено %1$d з %2$d</string> <string name="enabled_d_of_d" tools:ignore="PluralsCandidate">Увімкнено %1$d з %2$d</string>
<string name="new_chapters">Нові розділи</string> <string name="new_chapters">Нові розділи</string>
<string name="download">Завантажити</string> <string name="download">Завантажити</string>
<string name="read_from_start">Читати з початку</string> <string name="read_from_start">Читати з початку</string>
<string name="restart">Перезавантажити</string> <string name="restart">Перезавантажити</string>
<string name="vibration">Вібрація</string> <string name="vibration">Вібрація</string>
<string name="favourites_categories">Улюблені категорії</string> <string name="favourites_categories">Улюблені категорії</string>
<string name="category_delete_confirm">Вилучити категорію \"%s\" зі своїх уподобань\? <string name="category_delete_confirm">Вилучити категорію \"%s\" зі своїх уподобань\?
\nВся манґа в ній буде втрачена.</string> \nВся манґа в ній буде втрачена.</string>
<string name="remove_category">Видалити</string> <string name="remove_category">Видалити</string>
<string name="text_empty_holder_primary">Тут якось пусто…</string> <string name="text_empty_holder_primary">Тут якось пусто…</string>
<string name="text_search_holder_secondary">Спробуйте переформулювати запит.</string> <string name="text_search_holder_secondary">Спробуйте переформулювати запит.</string>
<string name="text_history_holder_primary">Те, що ви читаєте, буде показано тут</string> <string name="text_history_holder_primary">Те, що ви читаєте, буде показано тут</string>
<string name="text_history_holder_secondary">Знайдіть, що читати, у бічному меню.</string> <string name="text_history_holder_secondary">Знайдіть, що читати, у бічному меню.</string>
<string name="text_local_holder_primary">Спочатку збережіть щось</string> <string name="text_local_holder_primary">Спочатку збережіть щось</string>
<string name="text_local_holder_secondary">Збережіть його з онлайн-джерела або імпортуйте файли.</string> <string name="text_local_holder_secondary">Збережіть його з онлайн-джерела або імпортуйте файли.</string>
<string name="manga_shelf">Полиця</string> <string name="manga_shelf">Полиця</string>
<string name="recent_manga">Недавні</string> <string name="recent_manga">Недавні</string>
<string name="pages_animation">Анімація перегортання</string> <string name="pages_animation">Анімація перегортання</string>
<string name="manga_save_location">Тека для завантажень</string> <string name="manga_save_location">Тека для завантажень</string>
<string name="other_storage">Інше сховище</string> <string name="other_storage">Інше сховище</string>
<string name="done">Готово</string> <string name="done">Готово</string>
<string name="all_favourites">Усі улюблені</string> <string name="all_favourites">Усі улюблені</string>
<string name="favourites_category_empty">Порожня категорія</string> <string name="favourites_category_empty">Порожня категорія</string>
<string name="read_later">Прочитати пізніше</string> <string name="read_later">Прочитати пізніше</string>
<string name="updates">Оновлення</string> <string name="updates">Оновлення</string>
<string name="related">Схожі</string> <string name="related">Схожі</string>
<string name="new_version_s">Нова версія: %s</string> <string name="new_version_s">Нова версія: %s</string>
<string name="size_s">Розмір: %s</string> <string name="size_s">Розмір: %s</string>
<string name="waiting_for_network">Очікування мережі…</string> <string name="waiting_for_network">Очікування мережі…</string>
<string name="clear_updates_feed">Очистити стрічку оновлень</string> <string name="clear_updates_feed">Очистити стрічку оновлень</string>
<string name="updates_feed_cleared">Очищено</string> <string name="updates_feed_cleared">Очищено</string>
<string name="rotate_screen">Повернути екран</string> <string name="rotate_screen">Повернути екран</string>
<string name="update">Оновити</string> <string name="update">Оновити</string>
<string name="feed_will_update_soon">Оновлення скоро почнеться</string> <string name="feed_will_update_soon">Оновлення скоро почнеться</string>
<string name="track_sources">Стежити за оновленнями</string> <string name="track_sources">Стежити за оновленнями</string>
<string name="dont_check">Не перевіряти</string> <string name="dont_check">Не перевіряти</string>
<string name="wrong_password">Неправильний пароль</string> <string name="wrong_password">Неправильний пароль</string>
<string name="protect_application">Захистити додаток</string> <string name="protect_application">Захистити додаток</string>
<string name="protect_application_summary">Запитувати пароль під час запуску Kotatsu</string> <string name="protect_application_summary">Запитувати пароль під час запуску Kotatsu</string>
<string name="repeat_password">Повторіть пароль</string> <string name="repeat_password">Повторіть пароль</string>
<string name="passwords_mismatch">Паролі не співпадають</string> <string name="passwords_mismatch">Паролі не співпадають</string>
<string name="about">Про програму</string> <string name="about">Про програму</string>
<string name="app_version">Версія %s</string> <string name="app_version">Версія %s</string>
<string name="check_for_updates">Перевірити наявність оновлень</string> <string name="check_for_updates">Перевірити наявність оновлень</string>
<string name="checking_for_updates">Перевірка наявності оновлень…</string> <string name="checking_for_updates">Перевірка наявності оновлень…</string>
<string name="update_check_failed">Не вдалося перевірити оновлення</string> <string name="update_check_failed">Не вдалося перевірити оновлення</string>
<string name="no_update_available">Немає доступних оновлень</string> <string name="no_update_available">Немає доступних оновлень</string>
<string name="create_category">Нова категорія</string> <string name="create_category">Нова категорія</string>
<string name="scale_mode">Режим масштабування</string> <string name="scale_mode">Режим масштабування</string>
<string name="zoom_mode_fit_center">Вмістити в екран</string> <string name="zoom_mode_fit_center">Вмістити в екран</string>
<string name="zoom_mode_fit_height">Підігнати по висоті</string> <string name="zoom_mode_fit_height">Підігнати по висоті</string>
<string name="zoom_mode_fit_width">Підігнати по ширині</string> <string name="zoom_mode_fit_width">Підігнати по ширині</string>
<string name="zoom_mode_keep_start">Вихідний розмір</string> <string name="zoom_mode_keep_start">Вихідний розмір</string>
<string name="black_dark_theme">Чорна</string> <string name="black_dark_theme">Чорна</string>
<string name="black_dark_theme_summary">Споживає менше енергії на екранах AMOLED</string> <string name="black_dark_theme_summary">Споживає менше енергії на екранах AMOLED</string>
<string name="backup_restore">Резервне копіювання та відновлення</string> <string name="backup_restore">Резервне копіювання та відновлення</string>
<string name="data_restored">Відновлено</string> <string name="data_restored">Відновлено</string>
<string name="preparing_">Підготовка…</string> <string name="preparing_">Підготовка…</string>
<string name="report_github">Створити проблему на GitHub</string> <string name="report_github">Створити проблему на GitHub</string>
<string name="file_not_found">Файл не знайдено</string> <string name="file_not_found">Файл не знайдено</string>
<string name="data_restored_with_errors">Дані відновлено, але є деякі помилки</string> <string name="data_restored_with_errors">Дані відновлено, але є деякі помилки</string>
<string name="backup_information">Ви можете створити резервну копію своєї історії та уподобань і відновити їх</string> <string name="backup_information">Ви можете створити резервну копію своєї історії та уподобань і відновити їх</string>
<string name="just_now">Тільки що</string> <string name="just_now">Тільки що</string>
<string name="tap_to_try_again">Торкніться, щоб спробувати ще раз</string> <string name="tap_to_try_again">Торкніться, щоб спробувати ще раз</string>
<string name="reader_mode_hint">Обраний режим буде запам\'ятован для цієї манги</string> <string name="reader_mode_hint">Обраний режим буде запам\'ятован для цієї манги</string>
<string name="captcha_required">Потрібна CAPTCHA</string> <string name="captcha_required">Потрібна CAPTCHA</string>
<string name="captcha_solve">Пройти</string> <string name="captcha_solve">Пройти</string>
<string name="clear_cookies">Очистити кукі</string> <string name="clear_cookies">Очистити кукі</string>
<string name="cookies_cleared">Всі кукі були видалені</string> <string name="cookies_cleared">Всі кукі були видалені</string>
<string name="clear_feed">Очистити стрічку</string> <string name="clear_feed">Очистити стрічку</string>
<string name="check_for_new_chapters">Перевірити нові розділи</string> <string name="check_for_new_chapters">Перевірити нові розділи</string>
<string name="reverse">В зворотньому порядку</string> <string name="reverse">В зворотньому порядку</string>
<string name="sign_in">Увійти</string> <string name="sign_in">Увійти</string>
<string name="auth_required">Увійдіть, щоб переглянути цей вміст</string> <string name="auth_required">Увійдіть, щоб переглянути цей вміст</string>
<string name="default_s">За замовчуванням: %s</string> <string name="default_s">За замовчуванням: %s</string>
<string name="_and_x_more">…і ще %1$d</string> <string name="_and_x_more">…і ще %1$d</string>
<string name="next">Далі</string> <string name="next">Далі</string>
<string name="protect_application_subtitle">Введіть пароль для запуску програми</string> <string name="protect_application_subtitle">Введіть пароль для запуску програми</string>
<string name="confirm">Підтвердити</string> <string name="confirm">Підтвердити</string>
<string name="password_length_hint">Пароль має містити 4 символи або більше</string> <string name="password_length_hint">Пароль має містити 4 символи або більше</string>
<string name="search_only_on_s">Пошук лише на %s</string> <string name="search_only_on_s">Пошук лише на %s</string>
<string name="welcome">Ласкаво просимо</string> <string name="welcome">Ласкаво просимо</string>
<string name="backup_saved">Резервна копія збережена</string> <string name="backup_saved">Резервна копія збережена</string>
<string name="read_more">Докладніше</string> <string name="read_more">Докладніше</string>
<string name="queued">У черзі</string> <string name="queued">У черзі</string>
<string name="text_downloads_holder">Немає активних завантажень</string> <string name="text_downloads_holder">Немає активних завантажень</string>
<string name="about_app_translation_summary">Допомогти з перекладом програми</string> <string name="about_app_translation_summary">Допомогти з перекладом програми</string>
<string name="about_app_translation">Переклад</string> <string name="about_app_translation">Переклад</string>
<string name="about_feedback_4pda">Тема на 4PDA</string> <string name="about_feedback_4pda">Тема на 4PDA</string>
<string name="auth_complete">Авторизація виконана</string> <string name="auth_complete">Авторизація виконана</string>
<string name="auth_not_supported_by">Вхід на %s не підтримується</string> <string name="auth_not_supported_by">Вхід на %s не підтримується</string>
<string name="text_clear_cookies_prompt">Ви вийдете з усіх джерел</string> <string name="text_clear_cookies_prompt">Ви вийдете з усіх джерел</string>
<string name="state_finished">Завершена</string> <string name="state_finished">Завершена</string>
<string name="state_ongoing">Триває</string> <string name="state_ongoing">Триває</string>
<string name="date_format">Формат дати</string> <string name="date_format">Формат дати</string>
<string name="exclude_nsfw_from_history">Виключити NSFW манґу з історії</string> <string name="exclude_nsfw_from_history">Виключити NSFW манґу з історії</string>
<string name="error_empty_name">Ви повинні ввести ім’я</string> <string name="error_empty_name">Ви повинні ввести ім’я</string>
<string name="show_pages_numbers">Показувати номери сторінок</string> <string name="show_pages_numbers">Показувати номери сторінок</string>
<string name="enabled_sources">Включені джерела</string> <string name="enabled_sources">Включені джерела</string>
<string name="dynamic_theme_summary">Застосовує тему програми, засновану на палітрі кольорів шпалер на пристрої</string> <string name="dynamic_theme_summary">Застосовує тему програми, засновану на палітрі кольорів шпалер на пристрої</string>
<string name="importing_progress">Імпорт манґи: %1$d з %2$d</string> <string name="importing_progress">Імпорт манґи: %1$d з %2$d</string>
<string name="screenshots_policy">Політика щодо знімків екрана</string> <string name="screenshots_policy">Політика щодо знімків екрана</string>
<string name="screenshots_allow">Дозволити</string> <string name="screenshots_allow">Дозволити</string>
<string name="suggestions_summary">Пропонувати манґу на основі ваших уподобань</string> <string name="suggestions_summary">Пропонувати манґу на основі ваших уподобань</string>
<string name="suggestions_info">Усі дані аналізуються локально на цьому пристрої. Передача ваших персональних даних у будь-які сервіси не здійснюється</string> <string name="suggestions_info">Усі дані аналізуються локально на цьому пристрої. Передача ваших персональних даних у будь-які сервіси не здійснюється</string>
<string name="text_suggestion_holder">Почніть читати манґу, і ви отримаєте персоналізовані пропозиції</string> <string name="text_suggestion_holder">Почніть читати манґу, і ви отримаєте персоналізовані пропозиції</string>
<string name="enabled">Увімкнено</string> <string name="enabled">Увімкнено</string>
<string name="disabled">Вимкнено</string> <string name="disabled">Вимкнено</string>
<string name="reset_filter">Скинути фільтр</string> <string name="reset_filter">Скинути фільтр</string>
<string name="find_genre">Знайти жанр</string> <string name="find_genre">Знайти жанр</string>
<string name="onboard_text">Виберіть мови, якими ви хочете читати манґу. Це можливо змінити пізніше в налаштуваннях.</string> <string name="onboard_text">Виберіть мови, якими ви хочете читати манґу. Це можливо змінити пізніше в налаштуваннях.</string>
<string name="only_using_wifi">Тільки по Wi-Fi</string> <string name="only_using_wifi">Тільки по Wi-Fi</string>
<string name="preload_pages">Попереднє завантаження сторінок</string> <string name="preload_pages">Попереднє завантаження сторінок</string>
<string name="logged_in_as">Ви увійшли як %s</string> <string name="logged_in_as">Ви увійшли як %s</string>
<string name="nsfw">18+</string> <string name="nsfw">18+</string>
<string name="various_languages">Різні мови</string> <string name="various_languages">Різні мови</string>
<string name="search_chapters">Знайти розділ</string> <string name="search_chapters">Знайти розділ</string>
<string name="chapters_empty">Немає розділів у цій манзі</string> <string name="chapters_empty">Немає розділів у цій манзі</string>
<string name="percent_string_pattern">%1$s%%</string> <string name="percent_string_pattern">%1$s%%</string>
<string name="content">Зміст</string> <string name="content">Зміст</string>
<string name="suggestions_updating">Оновлення пропозицій</string> <string name="suggestions_updating">Оновлення пропозицій</string>
<string name="text_delete_local_manga_batch">Видалити вибрані елементи з пристрою назавжди\?</string> <string name="text_delete_local_manga_batch">Видалити вибрані елементи з пристрою назавжди\?</string>
<string name="removal_completed">Видалення завершено</string> <string name="removal_completed">Видалення завершено</string>
<string name="batch_manga_save_confirm">Ви впевнені, що хочете завантажити всю вибрану манґу з усіма її розділами\? Це може споживати багато трафіку та пам’яті</string> <string name="batch_manga_save_confirm">Ви впевнені, що хочете завантажити всю вибрану манґу з усіма її розділами\? Це може споживати багато трафіку та пам’яті</string>
<string name="parallel_downloads">Завантажувати паралельно</string> <string name="parallel_downloads">Завантажувати паралельно</string>
<string name="download_slowdown">Сповільнення завантаження</string> <string name="download_slowdown">Сповільнення завантаження</string>
<string name="local_manga_processing">Обробка збереженої манґи</string> <string name="local_manga_processing">Обробка збереженої манґи</string>
<string name="hide">Приховати</string> <string name="hide">Приховати</string>
<string name="new_sources_text">Доступні нові джерела манґи</string> <string name="new_sources_text">Доступні нові джерела манґи</string>
<string name="close_menu">Закрити меню</string> <string name="close_menu">Закрити меню</string>
<string name="manga_downloading_">Завантаження…</string> <string name="manga_downloading_">Завантаження…</string>
<string name="clear">Очистити</string> <string name="clear">Очистити</string>
<string name="downloads">Завантаження</string> <string name="downloads">Завантаження</string>
<string name="automatic">Як в системі</string> <string name="automatic">Як в системі</string>
<string name="chapter_is_missing_text">Завантажте або прочитайте цей відсутній розділ онлайн.</string> <string name="chapter_is_missing_text">Завантажте або прочитайте цей відсутній розділ онлайн.</string>
<string name="chapter_is_missing">Розділ відсутній</string> <string name="chapter_is_missing">Розділ відсутній</string>
<string name="about_feedback">Зворотній зв\'язок</string> <string name="about_feedback">Зворотній зв\'язок</string>
<string name="genres">Жанри</string> <string name="genres">Жанри</string>
<string name="system_default">За замовчуванням</string> <string name="system_default">За замовчуванням</string>
<string name="always">Завжди</string> <string name="always">Завжди</string>
<string name="_continue">Продовжити</string> <string name="_continue">Продовжити</string>
<string name="_import">Імпорт</string> <string name="_import">Імпорт</string>
<string name="taps_on_edges">Натискання по краях</string> <string name="taps_on_edges">Натискання по краях</string>
<string name="warning">Попередження</string> <string name="warning">Попередження</string>
<string name="network_consumption_warning">Це може призвести до витрати великої кількості трафіку</string> <string name="network_consumption_warning">Це може призвести до витрати великої кількості трафіку</string>
<string name="dont_ask_again">Більше не питати</string> <string name="dont_ask_again">Більше не питати</string>
<string name="notifications_settings">Налаштування сповіщень</string> <string name="notifications_settings">Налаштування сповіщень</string>
<string name="rename">Перейменувати</string> <string name="rename">Перейменувати</string>
<string name="show_notification_app_update">Показувати сповіщення, якщо доступна нова версія</string> <string name="show_notification_app_update">Показувати сповіщення, якщо доступна нова версія</string>
<string name="open_in_browser">Відкрити у веб-браузері</string> <string name="open_in_browser">Відкрити у веб-браузері</string>
<string name="not_available">Недоступно</string> <string name="not_available">Недоступно</string>
<string name="cannot_find_available_storage">Немає доступного сховища</string> <string name="cannot_find_available_storage">Немає доступного сховища</string>
<string name="text_feed_holder">Нові розділи того, що ви читаєте, показано тут</string> <string name="text_feed_holder">Нові розділи того, що ви читаєте, показано тут</string>
<string name="search_results">Результати пошуку</string> <string name="search_results">Результати пошуку</string>
<string name="enter_password">Введіть пароль</string> <string name="enter_password">Введіть пароль</string>
<string name="notification_sound">Звук сповіщень</string> <string name="notification_sound">Звук сповіщень</string>
<string name="light_indicator">Світлодіодний індикатор</string> <string name="light_indicator">Світлодіодний індикатор</string>
<string name="categories_">Категорії…</string> <string name="categories_">Категорії…</string>
<string name="text_categories_holder">Ви можете використовувати категорії для впорядкування своїх уподобань. Натисніть «+», щоб створити категорію</string> <string name="text_categories_holder">Ви можете використовувати категорії для впорядкування своїх уподобань. Натисніть «+», щоб створити категорію</string>
<string name="yesterday">Учора</string> <string name="yesterday">Учора</string>
<string name="right_to_left">Справа наліво (←)</string> <string name="right_to_left">Справа наліво (←)</string>
<string name="create_backup">Створити резервну копію</string> <string name="create_backup">Створити резервну копію</string>
<string name="restore_backup">Відновити з резервної копії</string> <string name="restore_backup">Відновити з резервної копії</string>
<string name="data_restored_success">Всі дані були відновлені</string> <string name="data_restored_success">Всі дані були відновлені</string>
<string name="group">Групувати</string> <string name="group">Групувати</string>
<string name="today">Сьогодні</string> <string name="today">Сьогодні</string>
<string name="silent">Без звуку</string> <string name="silent">Без звуку</string>
<string name="long_ago">Давно</string> <string name="long_ago">Давно</string>
<string name="chapters_checking_progress">Перевірка наявності нових розділів: %1$d з %2$d</string> <string name="chapters_checking_progress">Перевірка наявності нових розділів: %1$d з %2$d</string>
<string name="text_clear_updates_feed_prompt">Очистити всю історію оновлень назавжди\?</string> <string name="text_clear_updates_feed_prompt">Очистити всю історію оновлень назавжди\?</string>
<string name="tracker_warning">Деякі пристрої мають різну поведінку системи, що може порушити фонові завдання.</string> <string name="tracker_warning">Деякі пристрої мають різну поведінку системи, що може порушити фонові завдання.</string>
<string name="text_clear_search_history_prompt">Видалити всі останні пошукові запити назавжди\?</string> <string name="text_clear_search_history_prompt">Видалити всі останні пошукові запити назавжди\?</string>
<string name="other">Інше</string> <string name="other">Інше</string>
<string name="available_sources">Доступні джерела</string> <string name="available_sources">Доступні джерела</string>
<string name="dynamic_theme">Динамічна тема</string> <string name="dynamic_theme">Динамічна тема</string>
<string name="screenshots_block_nsfw">Блок на NSFW</string> <string name="screenshots_block_nsfw">Блок на NSFW</string>
<string name="screenshots_block_all">Завжди блокувати</string> <string name="screenshots_block_all">Завжди блокувати</string>
<string name="suggestions">Пропозиції</string> <string name="suggestions">Пропозиції</string>
<string name="suggestions_enable">Увімкнути пропозиції</string> <string name="suggestions_enable">Увімкнути пропозиції</string>
<string name="exclude_nsfw_from_suggestions">Не пропонувати NSFW манґу</string> <string name="exclude_nsfw_from_suggestions">Не пропонувати NSFW манґу</string>
<string name="filter_load_error">Не вдалося завантажити список жанрів</string> <string name="filter_load_error">Не вдалося завантажити список жанрів</string>
<string name="never">Ніколи</string> <string name="never">Ніколи</string>
<string name="appearance">Зовнішній вигляд</string> <string name="appearance">Зовнішній вигляд</string>
<string name="suggestions_excluded_genres">Виключити жанри</string> <string name="suggestions_excluded_genres">Виключити жанри</string>
<string name="suggestions_excluded_genres_summary">Укажіть жанри, які ви не хочете бачити в пропозиціях</string> <string name="suggestions_excluded_genres_summary">Укажіть жанри, які ви не хочете бачити в пропозиціях</string>
<string name="download_slowdown_summary">Допомагає уникнути блокування вашої IP-адреси</string> <string name="download_slowdown_summary">Допомагає уникнути блокування вашої IP-адреси</string>
<string name="chapters_will_removed_background">Розділи будуть видалені у фоновому режимі. Це може зайняти деякий час</string> <string name="chapters_will_removed_background">Розділи будуть видалені у фоновому режимі. Це може зайняти деякий час</string>
<string name="check_new_chapters_title">Перевіряти наявність нових розділів і повідомляти про них</string> <string name="check_new_chapters_title">Перевіряти наявність нових розділів і повідомляти про них</string>
<string name="show_notification_new_chapters_on">Ви будете отримувати повідомлення про оновлення манґи, яку ви читаєте</string> <string name="show_notification_new_chapters_on">Ви будете отримувати повідомлення про оновлення манґи, яку ви читаєте</string>
<string name="notifications_enable">Увімкнути сповіщення</string> <string name="notifications_enable">Увімкнути сповіщення</string>
<string name="show_notification_new_chapters_off">Ви не будете отримувати повідомлення, але нові розділи будуть відображатися у списку</string> <string name="show_notification_new_chapters_off">Ви не будете отримувати повідомлення, але нові розділи будуть відображатися у списку</string>
<string name="empty_favourite_categories">Немає улюблених категорій</string> <string name="empty_favourite_categories">Немає улюблених категорій</string>
<string name="name">Назва</string> <string name="name">Назва</string>
<string name="edit">Змінити</string> <string name="edit">Змінити</string>
<string name="edit_category">Змінити категорію</string> <string name="edit_category">Змінити категорію</string>
<string name="bookmark_add">Додати закладку</string> <string name="bookmark_add">Додати закладку</string>
<string name="bookmark_remove">Видалити закладку</string> <string name="bookmark_remove">Видалити закладку</string>
<string name="bookmarks">Закладки</string> <string name="bookmarks">Закладки</string>
<string name="bookmark_removed">Закладка видалена</string> <string name="bookmark_removed">Закладка видалена</string>
<string name="bookmark_added">Додано закладку</string> <string name="bookmark_added">Додано закладку</string>
<string name="undo">Скасувати</string> <string name="undo">Відмінити</string>
<string name="removed_from_history">Видалено з історії</string> <string name="removed_from_history">Видалено з історії</string>
<string name="dns_over_https">DNS через HTTPS</string> <string name="dns_over_https">DNS через HTTPS</string>
<string name="default_mode">Типовий режим</string> <string name="default_mode">Режим за замовчуванням</string>
<string name="detect_reader_mode_summary">Автоматично визначати, чи є манга вебтуном</string> <string name="detect_reader_mode_summary">Автоматично визначати, чи є манга вебтуном</string>
<string name="detect_reader_mode">Автовизначення режиму читання</string> <string name="detect_reader_mode">Автовизначення режиму читання</string>
<string name="disable_battery_optimization">Вимкнути оптимізацію акумулятора</string> <string name="disable_battery_optimization">Вимкнути оптимізацію акумулятора</string>
<string name="disable_battery_optimization_summary">Допомагає з перевірками фонових оновлень</string> <string name="disable_battery_optimization_summary">Допомагає з перевірками фонових оновлень</string>
<string name="crash_text">Щось пішло не так. Будь ласка, надішліть звіт про помилку розробникам, щоб допомогти нам її виправити.</string> <string name="crash_text">Щось пішло не так. Будь ласка, надішліть звіт про помилку розробникам, щоб допомогти нам її виправити.</string>
<string name="send">Надіслати</string> <string name="send">Надіслати</string>
<string name="disable_all">Вимкнути все</string>
<string name="use_fingerprint">Використовувати відбиток пальця, якщо доступно</string>
<string name="appwidget_shelf_description">Манга з Вашого улюбленого</string>
<string name="appwidget_recent_description">Манга, яку Ви нещодавно читали</string>
</resources> </resources>

View File

@@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Widget.Kotatsu.Switch" parent="Widget.Material3.CompoundButton.Switch">
<item name="android:thumb">@drawable/switch_thumb</item>
<item name="thumbTint">@color/selector_switch_thumb</item>
<item name="track">@drawable/switch_track</item>
<item name="trackTint">@color/selector_switch_track</item>
<item name="materialThemeOverlay">@style/ThemeOverlay.Kotatsu.Switch</item>
</style>
</resources>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="appwidget_corner_radius_inner">@android:dimen/system_app_widget_inner_radius</dimen>
</resources>

View File

@@ -41,4 +41,10 @@
<item name="android:textColorHighlightInverse">@color/m3_dynamic_dark_highlighted_text</item> <item name="android:textColorHighlightInverse">@color/m3_dynamic_dark_highlighted_text</item>
<item name="android:textColorAlertDialogListItem">@color/m3_dynamic_default_color_primary_text</item> <item name="android:textColorAlertDialogListItem">@color/m3_dynamic_default_color_primary_text</item>
</style> </style>
<style name="Theme.Kotatsu.AppWidgetContainer" parent="@android:style/Theme.DeviceDefault.DayNight">
<item name="android:colorBackground">@android:color/system_accent1_50</item>
<item name="android:panelColorBackground">@android:color/system_accent1_100</item>
</style>
</resources> </resources>

View File

@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"> <resources>
<bool name="is_tablet">false</bool> <bool name="is_tablet">false</bool>
<bool name="light_status_bar">true</bool> <bool name="light_status_bar">true</bool>
<bool name="light_navigation_bar">false</bool> <bool name="light_navigation_bar">false</bool>
<bool name="elevation_overlay_enabled">false</bool>
</resources> </resources>

View File

@@ -15,7 +15,7 @@
<dimen name="manga_list_details_item_height">120dp</dimen> <dimen name="manga_list_details_item_height">120dp</dimen>
<dimen name="bookmark_item_height">120dp</dimen> <dimen name="bookmark_item_height">120dp</dimen>
<dimen name="bookmark_list_spacing">4dp</dimen> <dimen name="bookmark_list_spacing">4dp</dimen>
<dimen name="chapter_list_item_height">62dp</dimen> <dimen name="chapter_list_item_height">48dp</dimen>
<dimen name="preferred_grid_width">120dp</dimen> <dimen name="preferred_grid_width">120dp</dimen>
<dimen name="header_height">48dp</dimen> <dimen name="header_height">48dp</dimen>
<dimen name="list_footer_height_inner">36dp</dimen> <dimen name="list_footer_height_inner">36dp</dimen>
@@ -24,10 +24,14 @@
<dimen name="selection_stroke_width">2dp</dimen> <dimen name="selection_stroke_width">2dp</dimen>
<dimen name="list_selector_corner">12dp</dimen> <dimen name="list_selector_corner">12dp</dimen>
<dimen name="toolbar_button_margin">10dp</dimen> <dimen name="toolbar_button_margin">10dp</dimen>
<dimen name="widget_cover_height">116dp</dimen>
<dimen name="widget_cover_width">84dp</dimen>
<dimen name="search_suggestions_manga_height">124dp</dimen> <dimen name="search_suggestions_manga_height">124dp</dimen>
<dimen name="search_suggestions_manga_spacing">4dp</dimen> <dimen name="search_suggestions_manga_spacing">4dp</dimen>
<dimen name="bottom_sheet_width">0dp</dimen> <dimen name="bottom_sheet_width">0dp</dimen>
<dimen name="dialog_radius">8dp</dimen> <dimen name="dialog_radius">8dp</dimen>
<dimen name="appwidget_corner_radius_inner">8dp</dimen>
</resources> </resources>

View File

@@ -310,4 +310,8 @@
<string name="status_on_hold">On hold</string> <string name="status_on_hold">On hold</string>
<string name="status_dropped">Dropped</string> <string name="status_dropped">Dropped</string>
<string name="disable_all">Disable all</string> <string name="disable_all">Disable all</string>
<string name="use_fingerprint">Use fingerprint if available</string>
<string name="appwidget_shelf_description">Manga from your favourites</string>
<string name="appwidget_recent_description">Your recently read manga</string>
<string name="report">Report</string>
</resources> </resources>

View File

@@ -86,13 +86,6 @@
<item name="iconPadding">16dp</item> <item name="iconPadding">16dp</item>
</style> </style>
<style name="Widget.Kotatsu.Switch" parent="Widget.Material3.CompoundButton.Switch">
<item name="android:thumb">@drawable/switch_thumb</item>
<item name="track">@drawable/switch_track</item>
<item name="useMaterialThemeColors">false</item>
<item name="materialThemeOverlay">@style/ThemeOverlay.Kotatsu.Switch</item>
</style>
<style name="Widget.Kotatsu.RecyclerView" parent=""> <style name="Widget.Kotatsu.RecyclerView" parent="">
<item name="fastScrollHorizontalThumbDrawable">@drawable/list_thumb</item> <item name="fastScrollHorizontalThumbDrawable">@drawable/list_thumb</item>
<item name="fastScrollVerticalThumbDrawable">@drawable/list_thumb</item> <item name="fastScrollVerticalThumbDrawable">@drawable/list_thumb</item>
@@ -113,10 +106,6 @@
<item name="android:insetBottom">2dp</item> <item name="android:insetBottom">2dp</item>
</style> </style>
<style name="ThemeOverlay.Kotatsu.Switch" parent="">
<item name="elevationOverlayEnabled">@bool/elevation_overlay_enabled</item>
</style>
<style name="ThemeOverlay.Kotatsu.MainToolbar" parent=""> <style name="ThemeOverlay.Kotatsu.MainToolbar" parent="">
<item name="colorControlHighlight">@color/selector_overlay</item> <item name="colorControlHighlight">@color/selector_overlay</item>
</style> </style>
@@ -180,4 +169,8 @@
<item name="android:dialogLayout">@layout/preference_dialog_autocompletetextview</item> <item name="android:dialogLayout">@layout/preference_dialog_autocompletetextview</item>
</style> </style>
<style name="Preference.SwitchPreferenceCompat.M3" parent="Preference.SwitchPreferenceCompat.Material">
<item name="android:widgetLayout">@layout/preference_widget_material_switch</item>
</style>
</resources> </resources>

View File

@@ -68,10 +68,11 @@
<item name="toolbarStyle">@style/Widget.Material3.Toolbar</item> <item name="toolbarStyle">@style/Widget.Material3.Toolbar</item>
<item name="appBarLayoutStyle">@style/Widget.Material3.AppBarLayout</item> <item name="appBarLayoutStyle">@style/Widget.Material3.AppBarLayout</item>
<item name="tabStyle">@style/Widget.Kotatsu.Tabs</item> <item name="tabStyle">@style/Widget.Kotatsu.Tabs</item>
<item name="switchStyle">@style/Widget.Kotatsu.Switch</item>
<item name="materialCardViewStyle">@style/Widget.Material3.CardView.Filled</item> <item name="materialCardViewStyle">@style/Widget.Material3.CardView.Filled</item>
<item name="recyclerViewStyle">@style/Widget.Kotatsu.RecyclerView</item> <item name="recyclerViewStyle">@style/Widget.Kotatsu.RecyclerView</item>
<item name="listItemTextViewStyle">@style/Widget.Kotatsu.ListItemTextView</item> <item name="listItemTextViewStyle">@style/Widget.Kotatsu.ListItemTextView</item>
<item name="materialSwitchStyle">@style/Widget.Material3.CompoundButton.MaterialSwitch</item>
<item name="switchPreferenceCompatStyle">@style/Preference.SwitchPreferenceCompat.M3</item>
<!-- Text appearance --> <!-- Text appearance -->
<item name="actionMenuTextAppearance">@style/TextAppearance.Kotatsu.Menu</item> <item name="actionMenuTextAppearance">@style/TextAppearance.Kotatsu.Menu</item>
@@ -102,4 +103,8 @@
<item name="toolbarNavigationButtonStyle">@style/Theme.Kotatsu.ActionMode.CloseButton</item> <item name="toolbarNavigationButtonStyle">@style/Theme.Kotatsu.ActionMode.CloseButton</item>
</style> </style>
<style name="Theme.Kotatsu.AppWidgetContainer" parent="@style/Theme.MaterialComponents.Light">
<item name="android:colorBackground">@android:color/transparent</item>
<item name="android:panelColorBackground">@color/kotatsu_primaryContainer</item>
</style>
</resources> </resources>

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<network-security-config xmlns:tools="http://schemas.android.com/tools"> <network-security-config
xmlns:tools="http://schemas.android.com/tools">
<!-- Need to allow cleartext traffic for some sources --> <!-- Need to allow cleartext traffic for some sources -->
<base-config <base-config
cleartextTrafficPermitted="true" cleartextTrafficPermitted="true"
@@ -8,7 +9,7 @@
<!-- Trust preinstalled CAs --> <!-- Trust preinstalled CAs -->
<certificates src="system" /> <certificates src="system" />
<!-- Additionally trust user added CAs --> <!-- Additionally, trust user added CAs -->
<certificates <certificates
src="user" src="user"
tools:ignore="AcceptsUserCertificates" /> tools:ignore="AcceptsUserCertificates" />

View File

@@ -1,12 +1,17 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<appwidget-provider <appwidget-provider
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:description="@string/appwidget_recent_description"
android:initialLayout="@layout/widget_recent" android:initialLayout="@layout/widget_recent"
android:minWidth="110dp" android:minWidth="120dp"
android:minHeight="110dp" android:minHeight="40dp"
android:minResizeWidth="40dp" android:minResizeWidth="120dp"
android:minResizeHeight="40dp" android:minResizeHeight="40dp"
android:previewImage="@drawable/ic_appwidget_recent" android:previewImage="@drawable/ic_appwidget_recent"
android:resizeMode="horizontal|vertical" android:resizeMode="horizontal|vertical"
android:targetCellWidth="2"
android:targetCellHeight="2"
android:updatePeriodMillis="0" android:updatePeriodMillis="0"
android:widgetCategory="home_screen" /> android:widgetCategory="home_screen"
tools:ignore="UnusedAttribute" />

View File

@@ -1,13 +1,19 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<appwidget-provider <appwidget-provider
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:configure="org.koitharu.kotatsu.widget.shelf.ShelfConfigActivity" android:configure="org.koitharu.kotatsu.widget.shelf.ShelfConfigActivity"
android:description="@string/appwidget_shelf_description"
android:initialLayout="@layout/widget_shelf" android:initialLayout="@layout/widget_shelf"
android:minWidth="110dp" android:minWidth="160dp"
android:minHeight="110dp" android:minHeight="120dp"
android:minResizeWidth="40dp" android:minResizeWidth="120dp"
android:minResizeHeight="40dp" android:minResizeHeight="40dp"
android:previewImage="@drawable/ic_appwidget_shelf" android:previewImage="@drawable/ic_appwidget_shelf"
android:resizeMode="horizontal|vertical" android:resizeMode="horizontal|vertical"
android:targetCellWidth="3"
android:targetCellHeight="2"
android:updatePeriodMillis="0" android:updatePeriodMillis="0"
android:widgetCategory="home_screen" /> android:widgetCategory="home_screen"
android:widgetFeatures="reconfigurable"
tools:ignore="UnusedAttribute" />

View File

@@ -5,7 +5,7 @@ Kotatsu - приложения для чтения манги с открыты
- Поиск манги по имени и жанрам - Поиск манги по имени и жанрам
- История чтения - История чтения
- Избранное с пользовательскими категориями - Избранное с пользовательскими категориями
- Возможность сохранять мангу и читать её оффлайн. Поддержка сторонних комиксов в формате CBZ - Возможность сохранять мангу и читать её офлайн. Поддержка сторонних комиксов в формате CBZ
- Интерфейс также оптимизирован для планшетов - Интерфейс также оптимизирован для планшетов
- Поддержка манхвы (Webtoon) - Поддержка манхвы (Webtoon)
- Уведомления о новых главах и лента обновлений - Уведомления о новых главах и лента обновлений