Compare commits

...

15 Commits
v3.1 ... v3.1.1

Author SHA1 Message Date
Sergio Varela
6b99e360e0 Added translation using Weblate (Basque)
Added translation using Weblate (Basque)

Co-authored-by: Sergio Varela <sergitroll9@gmail.com>
2022-04-16 09:46:16 +03:00
lowak
1c73d54a94 Translated using Weblate (Swedish)
Currently translated at 100.0% (274 of 274 strings)

Translated using Weblate (Swedish)

Currently translated at 41.6% (114 of 274 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (8 of 8 strings)

Added translation using Weblate (Swedish)

Added translation using Weblate (Swedish)

Co-authored-by: lowak <lowak@pm.me>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/plurals/sv/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/sv/
Translation: Kotatsu/Strings
Translation: Kotatsu/plurals
2022-04-16 09:46:16 +03:00
Luiz-bro
36e21caf96 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (8 of 8 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (274 of 274 strings)

Co-authored-by: Luiz-bro <luiznneto1@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/plurals/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/pt_BR/
Translation: Kotatsu/Strings
Translation: Kotatsu/plurals
2022-04-16 09:46:16 +03:00
Santiago José Gutiérrez Llanos
f7f9c53466 Translated using Weblate (Spanish)
Currently translated at 100.0% (8 of 8 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (274 of 274 strings)

Co-authored-by: Santiago José Gutiérrez Llanos <gutierrezapata17@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/plurals/es/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/es/
Translation: Kotatsu/Strings
Translation: Kotatsu/plurals
2022-04-16 09:46:16 +03:00
Allan Nordhøy
3f2ee2a925 Translated using Weblate (Norwegian Bokmål)
Currently translated at 100.0% (8 of 8 strings)

Added translation using Weblate (Norwegian Bokmål)

Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/plurals/nb_NO/
Translation: Kotatsu/plurals
2022-04-16 09:46:16 +03:00
J. Lavoie
b1c069f62f Translated using Weblate (Italian)
Currently translated at 100.0% (8 of 8 strings)

Translated using Weblate (German)

Currently translated at 100.0% (8 of 8 strings)

Translated using Weblate (French)

Currently translated at 100.0% (8 of 8 strings)

Translated using Weblate (Finnish)

Currently translated at 99.2% (272 of 274 strings)

Translated using Weblate (French)

Currently translated at 100.0% (274 of 274 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (274 of 274 strings)

Translated using Weblate (German)

Currently translated at 100.0% (274 of 274 strings)

Added translation using Weblate (Italian)

Added translation using Weblate (German)

Added translation using Weblate (French)

Translated using Weblate (Finnish)

Currently translated at 99.6% (270 of 271 strings)

Translated using Weblate (French)

Currently translated at 100.0% (271 of 271 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (271 of 271 strings)

Translated using Weblate (German)

Currently translated at 100.0% (271 of 271 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (271 of 271 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (269 of 269 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (269 of 269 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (269 of 269 strings)

Translated using Weblate (Finnish)

Currently translated at 100.0% (269 of 269 strings)

Translated using Weblate (French)

Currently translated at 100.0% (269 of 269 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (269 of 269 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (269 of 269 strings)

Translated using Weblate (German)

Currently translated at 100.0% (269 of 269 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (269 of 269 strings)

Translated using Weblate (Belarusian)

Currently translated at 98.8% (266 of 269 strings)

Co-authored-by: J. Lavoie <j.lavoie@net-c.ca>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/plurals/de/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/plurals/fr/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/plurals/it/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/be/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/de/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/es/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fi/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fr/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/it/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/ja/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/pt/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/tr/
Translation: Kotatsu/Strings
Translation: Kotatsu/plurals
2022-04-16 09:46:16 +03:00
Luiz-bro
22d48fce8f Added translation using Weblate (Portuguese (Brazil))
Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.6% (268 of 269 strings)

Co-authored-by: Luiz-bro <luiznneto1@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/pt_BR/
Translation: Kotatsu/Strings
2022-04-16 09:46:16 +03:00
kuragehime
6b2666c701 Translated using Weblate (Japanese)
Currently translated at 100.0% (8 of 8 strings)

Added translation using Weblate (Japanese)

Translated using Weblate (Japanese)

Currently translated at 100.0% (274 of 274 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (271 of 271 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (269 of 269 strings)

Co-authored-by: kuragehime <kuragehime641@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/plurals/ja/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/ja/
Translation: Kotatsu/Strings
Translation: Kotatsu/plurals
2022-04-16 09:46:16 +03:00
Oğuz Ersen
414f438762 Translated using Weblate (Turkish)
Currently translated at 100.0% (8 of 8 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (274 of 274 strings)

Added translation using Weblate (Turkish)

Translated using Weblate (Turkish)

Currently translated at 100.0% (271 of 271 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (269 of 269 strings)

Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/plurals/tr/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/tr/
Translation: Kotatsu/Strings
Translation: Kotatsu/plurals
2022-04-16 09:46:16 +03:00
Aliaksiej Razumaŭ
54f60040b5 Translated using Weblate (Belarusian)
Currently translated at 100.0% (270 of 270 strings)

Co-authored-by: Aliaksiej Razumaŭ <belarusaed@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/be/
Translation: Kotatsu/Strings
2022-04-16 09:46:16 +03:00
Koitharu
b0515033da Increase version 2022-04-16 09:40:50 +03:00
Koitharu
d37eb07301 Fix startForeground for DownloadService 2022-04-16 09:19:10 +03:00
Koitharu
5e82c75893 Cleanup extensions 2022-04-15 09:09:40 +03:00
Koitharu
9c9a389aa5 Rethrow CancellationException 2022-04-14 08:07:57 +03:00
Koitharu
1b3af70690 Add WindowInsetHolder view 2022-04-14 08:06:16 +03:00
59 changed files with 892 additions and 236 deletions

2
.idea/gradle.xml generated
View File

@@ -7,7 +7,7 @@
<option name="testRunner" value="GRADLE" />
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="Embedded JDK" />
<option name="gradleJvm" value="Android Studio default JDK" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />

View File

@@ -14,8 +14,8 @@ android {
applicationId 'org.koitharu.kotatsu'
minSdkVersion 21
targetSdkVersion 32
versionCode 401
versionName '3.1'
versionCode 402
versionName '3.1.1'
generatedDensities = []
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

View File

@@ -26,7 +26,8 @@ import org.koitharu.kotatsu.base.ui.util.WindowInsetsDelegate
import org.koitharu.kotatsu.core.exceptions.resolve.ExceptionResolver
import org.koitharu.kotatsu.core.prefs.AppSettings
abstract class BaseActivity<B : ViewBinding> : AppCompatActivity(),
abstract class BaseActivity<B : ViewBinding> :
AppCompatActivity(),
WindowInsetsDelegate.WindowInsetsListener {
protected lateinit var binding: B
@@ -123,4 +124,4 @@ abstract class BaseActivity<B : ViewBinding> : AppCompatActivity(),
super.onBackPressed()
}
}
}
}

View File

@@ -2,6 +2,7 @@ package org.koitharu.kotatsu.base.ui.dialog
import android.content.Context
import android.content.DialogInterface
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
@@ -12,7 +13,6 @@ import kotlinx.coroutines.runBlocking
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.databinding.ItemStorageBinding
import org.koitharu.kotatsu.local.data.LocalStorageManager
import org.koitharu.kotatsu.utils.ext.inflate
import java.io.File
class StorageSelectDialog private constructor(private val delegate: AlertDialog) :
@@ -66,7 +66,7 @@ class StorageSelectDialog private constructor(private val delegate: AlertDialog)
val volumes = getAvailableVolumes(storageManager)
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val view = convertView ?: parent.inflate(R.layout.item_storage)
val view = convertView ?: LayoutInflater.from(parent.context).inflate(R.layout.item_storage, parent, false)
val binding = (view.tag as? ItemStorageBinding) ?: ItemStorageBinding.bind(view).also {
view.tag = it
}

View File

@@ -13,12 +13,12 @@ import android.graphics.drawable.shapes.RectShape
import android.util.AttributeSet
import androidx.annotation.AttrRes
import androidx.appcompat.widget.AppCompatCheckedTextView
import androidx.core.content.res.use
import androidx.core.content.withStyledAttributes
import com.google.android.material.ripple.RippleUtils
import com.google.android.material.shape.MaterialShapeDrawable
import com.google.android.material.shape.ShapeAppearanceModel
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.utils.ext.getThemeColorStateList
@SuppressLint("RestrictedApi")
class ListItemTextView @JvmOverloads constructor(
@@ -119,8 +119,7 @@ class ListItemTextView @JvmOverloads constructor(
}
private fun getRippleColorFallback(context: Context): ColorStateList {
return context.obtainStyledAttributes(intArrayOf(android.R.attr.colorControlHighlight)).use {
it.getColorStateList(0)
} ?: ColorStateList.valueOf(Color.TRANSPARENT)
return context.getThemeColorStateList(android.R.attr.colorControlHighlight)
?: ColorStateList.valueOf(Color.TRANSPARENT)
}
}

View File

@@ -0,0 +1,72 @@
package org.koitharu.kotatsu.base.ui.widgets
import android.annotation.SuppressLint
import android.content.Context
import android.util.AttributeSet
import android.view.Gravity
import android.view.View
import android.view.WindowInsets
import android.widget.FrameLayout
import android.widget.LinearLayout
import androidx.annotation.AttrRes
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.view.WindowInsetsCompat
class WindowInsetHolder @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
@AttrRes defStyleAttr: Int = 0,
) : View(context, attrs, defStyleAttr) {
private var desiredHeight = 0
private var desiredWidth = 0
@SuppressLint("RtlHardcoded")
override fun dispatchApplyWindowInsets(insets: WindowInsets): WindowInsets {
val barsInsets = WindowInsetsCompat.toWindowInsetsCompat(insets, this)
.getInsets(WindowInsetsCompat.Type.systemBars())
val gravity = getLayoutGravity()
val newWidth = when (gravity and Gravity.HORIZONTAL_GRAVITY_MASK) {
Gravity.LEFT -> barsInsets.left
Gravity.RIGHT -> barsInsets.right
else -> 0
}
val newHeight = when (gravity and Gravity.VERTICAL_GRAVITY_MASK) {
Gravity.TOP -> barsInsets.top
Gravity.BOTTOM -> barsInsets.bottom
else -> 0
}
if (newWidth != desiredWidth || newHeight != desiredHeight) {
desiredWidth = newWidth
desiredHeight = newHeight
requestLayout()
}
return super.dispatchApplyWindowInsets(insets)
}
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
val widthMode = MeasureSpec.getMode(widthMeasureSpec)
val heightMode = MeasureSpec.getMode(heightMeasureSpec)
super.onMeasure(
if (desiredWidth == 0 || widthMode == MeasureSpec.EXACTLY) {
widthMeasureSpec
} else {
MeasureSpec.makeMeasureSpec(desiredWidth, widthMode)
},
if (desiredHeight == 0 || heightMode == MeasureSpec.EXACTLY) {
heightMeasureSpec
} else {
MeasureSpec.makeMeasureSpec(desiredHeight, heightMode)
},
)
}
private fun getLayoutGravity(): Int {
return when (val lp = layoutParams) {
is FrameLayout.LayoutParams -> lp.gravity
is LinearLayout.LayoutParams -> lp.gravity
is CoordinatorLayout.LayoutParams -> lp.gravity
else -> Gravity.NO_GRAVITY
}
}
}

View File

@@ -11,6 +11,10 @@ import androidx.collection.arraySetOf
import androidx.core.content.edit
import androidx.preference.PreferenceManager
import com.google.android.material.color.DynamicColors
import java.io.File
import java.text.DateFormat
import java.text.SimpleDateFormat
import java.util.*
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.channels.trySendBlocking
import kotlinx.coroutines.flow.callbackFlow
@@ -19,10 +23,6 @@ import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.utils.ext.getEnumValue
import org.koitharu.kotatsu.utils.ext.putEnumValue
import org.koitharu.kotatsu.utils.ext.toUriOrNull
import java.io.File
import java.text.DateFormat
import java.text.SimpleDateFormat
import java.util.*
class AppSettings(context: Context) {
@@ -281,4 +281,4 @@ class AppSettings(context: Context) {
private val isSamsung
get() = Build.MANUFACTURER.equals("samsung", ignoreCase = true)
}
}
}

View File

@@ -5,6 +5,7 @@ import android.os.Bundle
import android.text.Spanned
import android.text.method.LinkMovementMethod
import android.view.*
import androidx.appcompat.widget.PopupMenu
import androidx.core.content.ContextCompat
import androidx.core.graphics.Insets
import androidx.core.net.toUri
@@ -224,14 +225,16 @@ class DetailsFragment :
if (viewModel.readingHistory.value == null) {
return false
}
v.showPopupMenu(R.menu.popup_read) {
when (it.itemId) {
val menu = PopupMenu(v.context, v)
menu.inflate(R.menu.popup_read)
menu.setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) {
R.id.action_read -> {
val branch = viewModel.selectedBranchValue
startActivity(
ReaderActivity.newIntent(
context = context ?: return@showPopupMenu false,
manga = viewModel.manga.value ?: return@showPopupMenu false,
context = context ?: return@setOnMenuItemClickListener false,
manga = viewModel.manga.value ?: return@setOnMenuItemClickListener false,
state = viewModel.chapters.value?.firstOrNull { c ->
c.chapter.branch == branch
}?.let { c ->
@@ -244,6 +247,7 @@ class DetailsFragment :
else -> false
}
}
menu.show()
return true
}
else -> return false

View File

@@ -141,8 +141,9 @@ class DownloadManager(
}
val localManga = localMangaRepository.getFromFile(output.file)
outState.value = DownloadState.Done(startId, data, cover, localManga)
} catch (_: CancellationException) {
} catch (e: CancellationException) {
outState.value = DownloadState.Cancelled(startId, manga, cover)
throw e
} catch (e: Throwable) {
if (BuildConfig.DEBUG) {
e.printStackTrace()

View File

@@ -24,7 +24,7 @@ class ForegroundNotificationSwitcher(
@Synchronized
fun notify(startId: Int, notification: Notification) {
if (notifications.isEmpty()) {
StartForegroundRunnable(startId, notification)
service.startForeground(startId, notification)
} else {
notificationManager.notify(startId, notification)
}
@@ -46,16 +46,6 @@ class ForegroundNotificationSwitcher(
handler.postDelayed(NotifyRunnable(startId, notification), DEFAULT_DELAY)
}
private inner class StartForegroundRunnable(
private val startId: Int,
private val notification: Notification,
) : Runnable {
override fun run() {
service.startForeground(startId, notification)
}
}
private inner class NotifyRunnable(
private val startId: Int,
private val notification: Notification?,

View File

@@ -3,6 +3,7 @@ package org.koitharu.kotatsu.favourites.ui
import android.os.Bundle
import android.view.*
import androidx.appcompat.view.ActionMode
import androidx.appcompat.widget.PopupMenu
import androidx.core.graphics.Insets
import androidx.core.view.children
import androidx.core.view.updateLayoutParams
@@ -10,7 +11,6 @@ import androidx.core.view.updatePadding
import com.google.android.material.snackbar.Snackbar
import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayoutMediator
import java.util.*
import org.koin.androidx.viewmodel.ext.android.viewModel
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.base.ui.BaseFragment
@@ -25,7 +25,7 @@ import org.koitharu.kotatsu.main.ui.AppBarOwner
import org.koitharu.kotatsu.parsers.model.SortOrder
import org.koitharu.kotatsu.utils.ext.getDisplayMessage
import org.koitharu.kotatsu.utils.ext.measureHeight
import org.koitharu.kotatsu.utils.ext.showPopupMenu
import java.util.*
class FavouritesContainerFragment :
BaseFragment<FragmentFavouritesBinding>(),
@@ -123,22 +123,24 @@ class FavouritesContainerFragment :
override fun onTabLongClick(tabView: View, category: FavouriteCategory): Boolean {
val menuRes = if (category.id == 0L) R.menu.popup_category_empty else R.menu.popup_category
tabView.showPopupMenu(menuRes, { menu ->
createOrderSubmenu(menu, category)
}) {
val menu = PopupMenu(tabView.context, tabView)
menu.inflate(menuRes)
createOrderSubmenu(menu.menu, category)
menu.setOnMenuItemClickListener {
when (it.itemId) {
R.id.action_remove -> editDelegate.deleteCategory(category)
R.id.action_rename -> editDelegate.renameCategory(category)
R.id.action_create -> editDelegate.createCategory()
R.id.action_order -> return@showPopupMenu false
R.id.action_order -> return@setOnMenuItemClickListener false
else -> {
val order = CategoriesActivity.SORT_ORDERS.getOrNull(it.order)
?: return@showPopupMenu false
?: return@setOnMenuItemClickListener false
viewModel.setCategoryOrder(category.id, order)
}
}
true
}
menu.show()
return true
}

View File

@@ -6,6 +6,7 @@ import android.os.Bundle
import android.view.Menu
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.widget.PopupMenu
import androidx.core.graphics.Insets
import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams
@@ -23,11 +24,12 @@ import org.koitharu.kotatsu.databinding.ActivityCategoriesBinding
import org.koitharu.kotatsu.parsers.model.SortOrder
import org.koitharu.kotatsu.utils.ext.getDisplayMessage
import org.koitharu.kotatsu.utils.ext.measureHeight
import org.koitharu.kotatsu.utils.ext.showPopupMenu
class CategoriesActivity : BaseActivity<ActivityCategoriesBinding>(),
class CategoriesActivity :
BaseActivity<ActivityCategoriesBinding>(),
OnListItemClickListener<FavouriteCategory>,
View.OnClickListener, CategoriesEditDelegate.CategoriesEditCallback {
View.OnClickListener,
CategoriesEditDelegate.CategoriesEditCallback {
private val viewModel by viewModel<FavouritesCategoriesViewModel>()
@@ -58,26 +60,27 @@ class CategoriesActivity : BaseActivity<ActivityCategoriesBinding>(),
}
override fun onItemClick(item: FavouriteCategory, view: View) {
view.showPopupMenu(R.menu.popup_category, { menu ->
createOrderSubmenu(menu, item)
}) {
when (it.itemId) {
val menu = PopupMenu(view.context, view)
menu.inflate(R.menu.popup_category)
createOrderSubmenu(menu.menu, item)
menu.setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) {
R.id.action_remove -> editDelegate.deleteCategory(item)
R.id.action_rename -> editDelegate.renameCategory(item)
R.id.action_order -> return@showPopupMenu false
R.id.action_order -> return@setOnMenuItemClickListener false
else -> {
val order = SORT_ORDERS.getOrNull(it.order) ?: return@showPopupMenu false
val order = SORT_ORDERS.getOrNull(menuItem.order) ?: return@setOnMenuItemClickListener false
viewModel.setCategoryOrder(item.id, order)
}
}
true
}
menu.show()
}
override fun onItemLongClick(item: FavouriteCategory, view: View): Boolean {
reorderHelper.startDrag(
binding.recyclerView.findContainingViewHolder(view) ?: return false
)
val viewHolder = binding.recyclerView.findContainingViewHolder(view) ?: return false
reorderHelper.startDrag(viewHolder)
return true
}
@@ -90,7 +93,7 @@ class CategoriesActivity : BaseActivity<ActivityCategoriesBinding>(),
binding.recyclerView.updatePadding(
left = insets.left,
right = insets.right,
bottom = 2 * insets.bottom + binding.fabAdd.measureHeight()
bottom = 2 * insets.bottom + binding.fabAdd.measureHeight(),
)
}

View File

@@ -43,7 +43,7 @@ class ListModeSelectDialog : AlertDialogFragment<DialogListModeBinding>(),
binding.textViewGridTitle.isVisible = mode == ListMode.GRID
binding.sliderGrid.isVisible = mode == ListMode.GRID
binding.sliderGrid.setLabelFormatter(IntPercentLabelFormatter())
binding.sliderGrid.setLabelFormatter(IntPercentLabelFormatter(view.context))
binding.sliderGrid.setValueRounded(settings.gridSize.toFloat())
binding.sliderGrid.addOnSliderTouchListener(this)

View File

@@ -40,7 +40,7 @@ class MangaSelectionDecoration(context: Context) : AbstractSelectionItemDecorati
override fun getItemId(parent: RecyclerView, child: View): Long {
val holder = parent.getChildViewHolder(child) ?: return NO_ID
val item = holder.getItem<MangaItemModel>() ?: return NO_ID
val item = holder.getItem(MangaItemModel::class.java) ?: return NO_ID
return item.id
}

View File

@@ -143,7 +143,8 @@ class ReaderViewModel(
val page = getCurrentPage() ?: error("Page not found")
externalStorageHelper.savePage(page, destination)
onPageSaved.postCall(destination)
} catch (_: CancellationException) {
} catch (e: CancellationException) {
throw e
} catch (e: Exception) {
if (BuildConfig.DEBUG) {
e.printStackTrace()

View File

@@ -109,7 +109,7 @@ class PageHolderDelegate(
state = State.LOADED
callback.onImageReady(file.toUri())
} catch (e: CancellationException) {
// do nothing
throw e
} catch (e: Exception) {
state = State.ERROR
error = e

View File

@@ -14,7 +14,7 @@ import org.koitharu.kotatsu.reader.ui.pager.BaseReaderAdapter
import org.koitharu.kotatsu.reader.ui.pager.ReaderPage
import org.koitharu.kotatsu.utils.ext.doOnCurrentItemChanged
import org.koitharu.kotatsu.utils.ext.findCenterViewPosition
import org.koitharu.kotatsu.utils.ext.firstItem
import org.koitharu.kotatsu.utils.ext.firstVisibleItemPosition
import org.koitharu.kotatsu.utils.ext.viewLifecycleScope
class WebtoonReaderFragment : BaseReader<FragmentReaderWebtoonBinding>() {
@@ -52,7 +52,7 @@ class WebtoonReaderFragment : BaseReader<FragmentReaderWebtoonBinding>() {
setItems.await() ?: return@launchWhenCreated
if (position != -1) {
with(binding.recyclerView) {
firstItem = position
firstVisibleItemPosition = position
post {
(findViewHolderForAdapterPosition(position) as? WebtoonHolder)
?.restoreScroll(pendingState.scroll)
@@ -91,6 +91,6 @@ class WebtoonReaderFragment : BaseReader<FragmentReaderWebtoonBinding>() {
}
override fun switchPageTo(position: Int, smooth: Boolean) {
binding.recyclerView.firstItem = position
binding.recyclerView.firstVisibleItemPosition = position
}
}

View File

@@ -31,7 +31,7 @@ class SearchSuggestionItemCallback(
): Boolean = false
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
val item = viewHolder.getItem<SearchSuggestionItem.RecentQuery>() ?: return
val item = viewHolder.getItem(SearchSuggestionItem.RecentQuery::class.java) ?: return
listener.onRemoveQuery(item.query)
}

View File

@@ -25,9 +25,10 @@ class AppearanceSettingsFragment :
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
addPreferencesFromResource(R.xml.pref_appearance)
findPreference<SliderPreference>(AppSettings.KEY_GRID_SIZE)?.run {
summary = "%d%%".format(value)
val pattern = context.getString(R.string.percent_string_pattern)
summary = pattern.format(value.toString())
setOnPreferenceChangeListener { preference, newValue ->
preference.summary = "%d%%".format(newValue)
preference.summary = pattern.format(newValue.toString())
true
}
}

View File

@@ -18,7 +18,7 @@ val settingsModule
single { BackupRepository(get()) }
single { RestoreRepository(get()) }
single { AppSettings(androidContext()) }
single(createdAtStart = true) { AppSettings(androidContext()) }
viewModel { BackupViewModel(get(), androidContext()) }
viewModel { params ->

View File

@@ -2,8 +2,8 @@ package org.koitharu.kotatsu.utils
import android.view.View
import androidx.appcompat.widget.Toolbar
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.R as materialR
import com.google.android.material.bottomsheet.BottomSheetBehavior
open class BottomSheetToolbarController(
protected val toolbar: Toolbar,
@@ -17,7 +17,5 @@ open class BottomSheetToolbarController(
}
}
override fun onSlide(bottomSheet: View, slideOffset: Float) {
}
override fun onSlide(bottomSheet: View, slideOffset: Float) = Unit
}

View File

@@ -32,4 +32,4 @@ enum class FileSize(private val multiplier: Int) {
}
}
}
}
}

View File

@@ -5,8 +5,10 @@ import android.view.GestureDetector
import android.view.MotionEvent
import kotlin.math.roundToInt
class GridTouchHelper(context: Context, private val listener: OnGridTouchListener) :
GestureDetector.SimpleOnGestureListener() {
class GridTouchHelper(
context: Context,
private val listener: OnGridTouchListener
) : GestureDetector.SimpleOnGestureListener() {
private val detector = GestureDetector(context, this)
private val width = context.resources.displayMetrics.widthPixels

View File

@@ -1,10 +0,0 @@
package org.koitharu.kotatsu.utils
import kotlinx.coroutines.flow.MutableStateFlow
class SelectionController {
private val state = MutableStateFlow(emptySet<Int>())
}

View File

@@ -1,9 +0,0 @@
package org.koitharu.kotatsu.utils
class WordSet(private vararg val words: String) {
fun anyWordIn(dateString: String): Boolean = words.any {
dateString.contains(it, ignoreCase = true)
}
}

View File

@@ -1,16 +1,14 @@
package org.koitharu.kotatsu.utils.ext
import android.content.res.Resources
import android.util.Log
import java.io.FileNotFoundException
import java.net.SocketTimeoutException
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.exceptions.CloudFlareProtectedException
import org.koitharu.kotatsu.core.exceptions.EmptyHistoryException
import org.koitharu.kotatsu.core.exceptions.UnsupportedFileException
import org.koitharu.kotatsu.core.exceptions.WrongPasswordException
import org.koitharu.kotatsu.parsers.exception.AuthRequiredException
import org.koitharu.kotatsu.parsers.util.format
import java.io.FileNotFoundException
import java.net.SocketTimeoutException
fun Throwable.getDisplayMessage(resources: Resources) = when (this) {
is AuthRequiredException -> resources.getString(R.string.auth_required)
@@ -22,12 +20,4 @@ fun Throwable.getDisplayMessage(resources: Resources) = when (this) {
is SocketTimeoutException -> resources.getString(R.string.network_error)
is WrongPasswordException -> resources.getString(R.string.wrong_password)
else -> localizedMessage ?: resources.getString(R.string.error_occurred)
}
inline fun <T> measured(tag: String, block: () -> T): T {
val time = System.currentTimeMillis()
val res = block()
val spent = System.currentTimeMillis() - time
Log.d("measured", "$tag ${spent.format(1)} ms")
return res
}

View File

@@ -3,10 +3,8 @@ package org.koitharu.kotatsu.utils.ext
import androidx.lifecycle.LifecycleCoroutineScope
import androidx.lifecycle.ProcessLifecycleOwner
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.*
import kotlinx.coroutines.CoroutineExceptionHandler
import org.koitharu.kotatsu.BuildConfig
import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.EmptyCoroutineContext
val IgnoreErrors
get() = CoroutineExceptionHandler { _, e ->

View File

@@ -15,6 +15,6 @@ fun Date.formatRelative(minResolution: Long): CharSequence = DateUtils.getRelati
fun Date.daysDiff(other: Long): Int {
val thisDay = time / TimeUnit.DAYS.toMillis(1L)
val otherDay = other/ TimeUnit.DAYS.toMillis(1L)
val otherDay = other / TimeUnit.DAYS.toMillis(1L)
return (thisDay - otherDay).toInt()
}

View File

@@ -26,11 +26,12 @@ fun <T : Parcelable> Fragment.parcelableArgument(name: String): Lazy<T> {
}
}
inline fun <reified T : Serializable> Fragment.serializableArgument(name: String): Lazy<T> {
fun <T : Serializable> Fragment.serializableArgument(name: String): Lazy<T> {
return lazy(LazyThreadSafetyMode.NONE) {
requireNotNull(arguments?.getSerializable(name) as? T) {
@Suppress("UNCHECKED_CAST")
requireNotNull(arguments?.getSerializable(name)) {
"No argument $name passed into ${javaClass.simpleName}"
}
} as T
}
}

View File

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

View File

@@ -9,17 +9,17 @@ fun ListPreference.setDefaultValueCompat(defaultValue: String) {
}
}
fun <E: Enum<E>> SharedPreferences.getEnumValue(key: String, enumClass: Class<E>): E? {
fun <E : Enum<E>> SharedPreferences.getEnumValue(key: String, enumClass: Class<E>): E? {
val stringValue = getString(key, null) ?: return null
return enumClass.enumConstants?.find {
it.name == stringValue
}
}
fun <E: Enum<E>> SharedPreferences.getEnumValue(key: String, defaultValue: E): E {
fun <E : Enum<E>> SharedPreferences.getEnumValue(key: String, defaultValue: E): E {
return getEnumValue(key, defaultValue.javaClass) ?: defaultValue
}
fun <E: Enum<E>> SharedPreferences.Editor.putEnumValue(key: String, value: E?) {
fun <E : Enum<E>> SharedPreferences.Editor.putEnumValue(key: String, value: E?) {
putString(key, value?.name)
}

View File

@@ -5,12 +5,11 @@ import android.view.View
import android.widget.TextView
import androidx.annotation.AttrRes
import androidx.annotation.StringRes
import androidx.core.content.res.use
import androidx.core.view.isGone
var TextView.textAndVisible: CharSequence?
inline get() = text?.takeIf { visibility == View.VISIBLE }
inline set(value) {
get() = text?.takeIf { visibility == View.VISIBLE }
set(value) {
text = value
isGone = value.isNullOrEmpty()
}
@@ -40,8 +39,5 @@ fun TextView.setTextAndVisible(@StringRes textResId: Int) {
}
fun TextView.setTextColorAttr(@AttrRes attrResId: Int) {
val colors = context.obtainStyledAttributes(intArrayOf(attrResId)).use {
it.getColorStateList(0)
}
setTextColor(colors)
setTextColor(context.getThemeColorStateList(attrResId))
}

View File

@@ -4,20 +4,24 @@ import android.content.Context
import android.graphics.Color
import androidx.annotation.AttrRes
import androidx.annotation.ColorInt
import androidx.annotation.Px
import androidx.core.content.res.use
@Px
fun Context.getThemeDimen(@AttrRes resId: Int) = obtainStyledAttributes(intArrayOf(resId)).use {
it.getDimension(0, 0f)
}
fun Context.getThemeDrawable(@AttrRes resId: Int) = obtainStyledAttributes(intArrayOf(resId)).use {
fun Context.getThemeDrawable(
@AttrRes resId: Int,
) = obtainStyledAttributes(intArrayOf(resId)).use {
it.getDrawable(0)
}
@ColorInt
fun Context.getThemeColor(@AttrRes resId: Int, @ColorInt default: Int = Color.TRANSPARENT) =
obtainStyledAttributes(intArrayOf(resId)).use {
it.getColor(0, default)
}
fun Context.getThemeColor(
@AttrRes resId: Int,
@ColorInt default: Int = Color.TRANSPARENT
) = obtainStyledAttributes(intArrayOf(resId)).use {
it.getColor(0, default)
}
fun Context.getThemeColorStateList(
@AttrRes resId: Int,
) = obtainStyledAttributes(intArrayOf(resId)).use {
it.getColorStateList(0)
}

View File

@@ -2,20 +2,15 @@ package org.koitharu.kotatsu.utils.ext
import android.app.Activity
import android.graphics.Rect
import android.view.LayoutInflater
import android.view.Menu
import android.view.View
import android.view.ViewGroup
import android.view.inputmethod.InputMethodManager
import androidx.annotation.LayoutRes
import androidx.annotation.MenuRes
import androidx.appcompat.widget.PopupMenu
import androidx.core.view.children
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager2.widget.ViewPager2
import com.google.android.material.slider.Slider
import com.hannesdorfmann.adapterdelegates4.dsl.AdapterDelegateViewBindingViewHolder
import com.hannesdorfmann.adapterdelegates4.dsl.AdapterDelegateViewHolder
import kotlin.math.roundToInt
fun View.hideKeyboard() {
@@ -28,19 +23,15 @@ fun View.showKeyboard() {
imm.showSoftInput(this, 0)
}
inline fun <reified T : View> ViewGroup.inflate(@LayoutRes resId: Int) =
LayoutInflater.from(context).inflate(resId, this, false) as T
val RecyclerView.hasItems: Boolean
get() = (adapter?.itemCount ?: 0) > 0
fun RecyclerView.clearItemDecorations() {
suppressLayout(true)
while (itemDecorationCount > 0) {
removeItemDecorationAt(0)
}
suppressLayout(false)
}
var RecyclerView.firstItem: Int
var RecyclerView.firstVisibleItemPosition: Int
get() = (layoutManager as? LinearLayoutManager)?.findFirstVisibleItemPosition()
?: RecyclerView.NO_POSITION
set(value) {
@@ -49,18 +40,6 @@ var RecyclerView.firstItem: Int
}
}
inline fun View.showPopupMenu(
@MenuRes menuRes: Int,
onPrepare: (Menu) -> Unit = {},
onItemClick: PopupMenu.OnMenuItemClickListener,
) {
val menu = PopupMenu(context, this)
menu.inflate(menuRes)
menu.setOnMenuItemClickListener(onItemClick)
onPrepare(menu.menu)
menu.show()
}
fun View.hasGlobalPoint(x: Int, y: Int): Boolean {
if (visibility != View.VISIBLE) {
return false
@@ -97,7 +76,7 @@ inline fun ViewPager2.doOnPageChanged(crossinline callback: (Int) -> Unit) {
}
val ViewPager2.recyclerView: RecyclerView?
inline get() = children.find { it is RecyclerView } as? RecyclerView
get() = children.firstNotNullOfOrNull { it as? RecyclerView }
fun View.resetTransformations() {
alpha = 1f
@@ -106,6 +85,7 @@ fun View.resetTransformations() {
translationZ = 0f
scaleX = 1f
scaleY = 1f
rotation = 0f
rotationX = 0f
rotationY = 0f
}
@@ -133,8 +113,17 @@ fun RecyclerView.findCenterViewPosition(): Int {
return getChildAdapterPosition(view)
}
inline fun <reified T> RecyclerView.ViewHolder.getItem(): T? {
return ((this as? AdapterDelegateViewBindingViewHolder<*, *>)?.item as? T)
fun <T> RecyclerView.ViewHolder.getItem(clazz: Class<T>): T? {
val rawItem = when (this) {
is AdapterDelegateViewBindingViewHolder<*, *> -> item
is AdapterDelegateViewHolder<*> -> item
else -> null
} ?: return null
return if (clazz.isAssignableFrom(rawItem.javaClass)) {
clazz.cast(rawItem)
} else {
null
}
}
fun Slider.setValueRounded(newValue: Float) {

View File

@@ -1,7 +1,12 @@
package org.koitharu.kotatsu.utils.progress
import android.content.Context
import com.google.android.material.slider.LabelFormatter
import org.koitharu.kotatsu.R
class IntPercentLabelFormatter : LabelFormatter {
override fun getFormattedValue(value: Float) = "%d%%".format(value.toInt())
class IntPercentLabelFormatter(context: Context) : LabelFormatter {
private val pattern = context.getString(R.string.percent_string_pattern)
override fun getFormattedValue(value: Float) = pattern.format(value.toInt().toString())
}

View File

@@ -32,6 +32,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="16dp"
android:background="@null"
android:paddingRight="16dp"
app:elevation="0dp"
app:liftOnScroll="false">
@@ -81,8 +82,6 @@
android:text="@string/_continue"
android:visibility="gone"
app:backgroundTint="?attr/colorContainer"
app:behavior_autoHide="true"
app:behavior_autoShrink="true"
app:icon="@drawable/ic_read"
app:layout_anchor="@id/container"
app:layout_anchorGravity="bottom|end"

View File

@@ -75,8 +75,6 @@
android:text="@string/_continue"
android:visibility="gone"
app:backgroundTint="?attr/colorContainer"
app:behavior_autoHide="true"
app:behavior_autoShrink="true"
app:icon="@drawable/ic_read"
app:layout_anchor="@id/container"
app:layout_anchorGravity="bottom|end"

View File

@@ -53,8 +53,8 @@
<string name="clear">Ачысціць</string>
<string name="text_clear_history_prompt">Вы ўпэўненыя, што жадаеце ачысціць гісторыю\?</string>
<string name="remove">Выдаліць</string>
<string name="_s_removed_from_history">\"%s\" выдалена з гiсторыi</string>
<string name="_s_deleted_from_local_storage">\"%s\" выдалена з прылады</string>
<string name="_s_removed_from_history">«%s» выдалена з гiсторыi</string>
<string name="_s_deleted_from_local_storage">«%s» выдалена з прылады</string>
<string name="wait_for_loading_finish">Дачакайцеся заканчэння загрузкі…</string>
<string name="save_page">Захаваць старонку</string>
<string name="page_saved">Старонка захавана</string>
@@ -76,7 +76,7 @@
<string name="delete_manga">Выдаліць мангу</string>
<string name="reader_settings">Налады чытання</string>
<string name="switch_pages">Гартанне старонак</string>
<string name="text_delete_local_manga">Вы ўпэўненыя, што жадаеце выдаліць \"%s\" з прылады\?</string>
<string name="text_delete_local_manga">Вы ўпэўненыя, што жадаеце выдаліць «%s» з прылады\?</string>
<string name="taps_on_edges">Націск па краях</string>
<string name="volume_buttons">Кнопкі гучнасці</string>
<string name="_continue">Працягнцуць</string>
@@ -112,7 +112,7 @@
<string name="favourites_categories">Катэгорыі абранага</string>
<string name="categories_">Катэгорыi…</string>
<string name="rename">Перайменаваць</string>
<string name="category_delete_confirm">Вы ўпэўнены, што хочаце выдаліць катэгорыю \"%s\"\?
<string name="category_delete_confirm">Вы ўпэўнены, што хочаце выдаліць катэгорыю «%s»\?
\nУся манга з дадзенай катэгорыі будзе страчана.</string>
<string name="remove_category">Выдаліць катэгорыю</string>
<string name="text_categories_holder">Катэгорыі дапамагаюць упарадкоўваць абраную мангу. Націсніце «+», каб стварыць катэгорыю</string>
@@ -217,7 +217,7 @@
<string name="chapter_is_missing_text">Гэтая глава адсутнічае на вашай прыладзе. Спампуйце ціпрачытайце яе онлайн.</string>
<string name="text_downloads_holder">На дадзены момант няма актыўных спамповак</string>
<string name="queued">У чарзе</string>
<string name="about_feedback_4pda">Тэма на 4PDA</string>
<string name="about_feedback_4pda">Тэма на 4PDA</string>
<string name="about_feedback">Зваротная сувязь</string>
<string name="about_app_translation_summary">Дапамагчы з перакладам праграмы</string>
<string name="about_app_translation">Пераклад</string>
@@ -263,4 +263,5 @@
<string name="various_languages">Розныя мовы</string>
<string name="search_chapters">Знайсці главу</string>
<string name="percent_string_pattern">%1$s%%</string>
<string name="chapters_empty">У гэтай манзе няма глаў</string>
</resources>

View File

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="pages">
<item quantity="one">Insgesamt %1$d Seite</item>
<item quantity="other">Insgesamt %1$d Seiten</item>
</plurals>
<plurals name="items">
<item quantity="one">%1$d Element</item>
<item quantity="other">%1$d Elemente</item>
</plurals>
<plurals name="new_chapters">
<item quantity="one">%1$d neues Kapitel</item>
<item quantity="other">%1$d neue Kapitel</item>
</plurals>
<plurals name="chapters">
<item quantity="one">%1$d Kapitel</item>
<item quantity="other">%1$d Kapitel</item>
</plurals>
<plurals name="chapters_from_x">
<item quantity="one">%1$d Kapitel aus %2$d</item>
<item quantity="other">%1$d Kapitel aus %2$d</item>
</plurals>
<plurals name="minutes_ago">
<item quantity="one">Vor %1$d Minute</item>
<item quantity="other">Vor %1$d Minuten</item>
</plurals>
<plurals name="hours_ago">
<item quantity="one">Vor %1$d Stunde</item>
<item quantity="other">Vor %1$d Stunden</item>
</plurals>
<plurals name="days_ago">
<item quantity="one">Vor %1$d Tag</item>
<item quantity="other">Vor %1$d Tage</item>
</plurals>
</resources>

View File

@@ -217,7 +217,7 @@
<string name="chapter_is_missing_text">Dieses Kapitel fehlt auf deinem Gerät. Lade ihn herunter oder lese ihn online.</string>
<string name="text_downloads_holder">Zurzeit sind keine aktiven Datenübertragungen vorhanden</string>
<string name="queued">In Warteschlange</string>
<string name="about_feedback_4pda">Thema auf 4PDA</string>
<string name="about_feedback_4pda">Thema auf 4PDA</string>
<string name="about_feedback">Rückmeldung</string>
<string name="about_app_translation">Übersetzung</string>
<string name="about_app_translation_summary">Diese Anwendung übersetzen</string>
@@ -264,4 +264,12 @@
<string name="search_chapters">Kapitel suchen</string>
<string name="chapters_empty">Keine Kapitel in diesem Manga</string>
<string name="percent_string_pattern">%1$s%%</string>
<string name="appearance">Aussehen</string>
<string name="content">Inhalt</string>
<string name="suggestions_updating">Vorschläge werden aktualisiert</string>
<string name="suggestions_excluded_genres">Genres ausschließen</string>
<string name="suggestions_excluded_genres_summary">Geben Sie Genres an, die Sie nicht in den Vorschlägen sehen möchten</string>
<string name="text_delete_local_manga_batch">Ausgewählte Elemente dauerhaft vom Gerät löschen\?</string>
<string name="batch_manga_save_confirm">Sind Sie sicher, dass Sie alle ausgewählten Mangas mit allen Kapiteln herunterladen möchten\? Diese Aktion kann eine Menge Datenverkehr und Speicherplatz verbrauchen</string>
<string name="removal_completed">Entfernung abgeschlossen</string>
</resources>

View File

@@ -1,35 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="pages">
<item quantity="one">Total %1$d página</item>
<item quantity="other">Total %1$d páginas</item>
</plurals>
<plurals name="items">
<item quantity="one">%1$d elemento</item>
<item quantity="other">%1$d elementos</item>
</plurals>
<plurals name="new_chapters">
<item quantity="one">%1$d nuevo capítulo</item>
<item quantity="other">%1$d nuevos capítulos</item>
</plurals>
<plurals name="chapters">
<item quantity="one">%1$d capítulo</item>
<item quantity="other">%1$d capítulos</item>
</plurals>
<plurals name="chapters_from_x">
<item quantity="one">%1$d capítulo desde %2$d</item>
<item quantity="other">%1$d capítulos desde %2$d</item>
</plurals>
<plurals name="minutes_ago">
<item quantity="one">%hace 1$d minuto</item>
<item quantity="other">hace %1$d minutos</item>
</plurals>
<plurals name="hours_ago">
<item quantity="one">hace %1$d hora</item>
<item quantity="other">hace %1$d horas</item>
</plurals>
<plurals name="days_ago">
<item quantity="one">hace %1$d día</item>
<item quantity="other">hace %1$d días</item>
</plurals>
</resources>
<plurals name="pages">
<item quantity="one">Total %1$d página</item>
<item quantity="other">Total %1$d páginas</item>
</plurals>
<plurals name="items">
<item quantity="one">%1$d elemento</item>
<item quantity="other">%1$d elementos</item>
</plurals>
<plurals name="new_chapters">
<item quantity="one">%1$d nuevo capítulo</item>
<item quantity="other">%1$d nuevos capítulos</item>
</plurals>
<plurals name="chapters">
<item quantity="one">%1$d capítulo</item>
<item quantity="other">%1$d capítulos</item>
</plurals>
<plurals name="chapters_from_x">
<item quantity="one">%1$d capítulo desde %2$d</item>
<item quantity="other">%1$d capítulos desde %2$d</item>
</plurals>
<plurals name="minutes_ago">
<item quantity="one">hace %1$d minuto</item>
<item quantity="other">hace %1$d minutos</item>
</plurals>
<plurals name="hours_ago">
<item quantity="one">hace %1$d hora</item>
<item quantity="other">hace %1$d horas</item>
</plurals>
<plurals name="days_ago">
<item quantity="one">hace %1$d día</item>
<item quantity="other">hace %1$d días</item>
</plurals>
</resources>

View File

@@ -205,8 +205,8 @@
<string name="text_history_holder_secondary">Encuentra qué leer en el menú lateral.</string>
<string name="text_history_holder_primary">Lo que leas se mostrará aquí</string>
<string name="text_empty_holder_primary">Está un poco vacío aquí…</string>
<string name="search_only_on_s">Buscar sólo en %s</string>
<string name="chapter_is_missing">Falta un capítulo</string>
<string name="search_only_on_s">Buscar sólo en %s</string>
<string name="chapter_is_missing">Falta un capítulo</string>
<string name="about_app_translation_summary">Traducir esta aplicación</string>
<string name="about_feedback">Comentarios</string>
<string name="about_app_translation">Traducción</string>
@@ -253,7 +253,7 @@
<string name="screenshots_block_nsfw">Bloqueo en NSFW</string>
<string name="logged_in_as">Conectado como %s</string>
<string name="find_genre">Encontrar el género</string>
<string name="onboard_text">Selecciona los idiomas en los que quieres leer el manga. Puedes cambiarlo más tarde en los ajustes.</string>
<string name="onboard_text">Selecciona los idiomas en los que quieres leer mangas. Puedes cambiarlo más tarde en los ajustes.</string>
<string name="reset_filter">Reiniciar el filtro</string>
<string name="never">Nunca</string>
<string name="nsfw">18+</string>
@@ -264,4 +264,12 @@
<string name="search_chapters">Buscar capítulo</string>
<string name="chapters_empty">No hay capítulos en este manga</string>
<string name="percent_string_pattern">%1$s%%</string>
<string name="appearance">Aspecto</string>
<string name="content">Contenido</string>
<string name="suggestions_updating">Actualización de las sugerencias</string>
<string name="suggestions_excluded_genres">Excluir géneros</string>
<string name="suggestions_excluded_genres_summary">Especifica los géneros que no quieres ver en las sugerencias</string>
<string name="removal_completed">Remoción completada</string>
<string name="batch_manga_save_confirm">¿Estás seguro de que quieres descargar todos los manga seleccionados con todos sus capítulos\? Esta acción puede consumir mucho tráfico y almacenamiento</string>
<string name="text_delete_local_manga_batch">¿Eliminar elementos seleccionados del dispositivo de forma permanente\?</string>
</resources>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View File

@@ -4,7 +4,7 @@
<string name="genres">Tyylilajit</string>
<string name="auth_not_supported_by">%s -valtuutusta ei tueta</string>
<string name="auth_complete">Valtuutus valmis</string>
<string name="about_feedback_4pda">Aihe 4PDA: ssa</string>
<string name="about_feedback_4pda">Aihe 4PDA: ssa</string>
<string name="about_feedback">Palaute</string>
<string name="about_app_translation">Käännös</string>
<string name="about_app_translation_summary">Käännä tämä sovellus</string>
@@ -264,4 +264,11 @@
<string name="percent_string_pattern">%1$s%%</string>
<string name="various_languages">Eri kieliä</string>
<string name="chapters_empty">Ei lukuja tässä mangassa</string>
<string name="appearance">Ulkonäkö</string>
<string name="content">Sisältö</string>
<string name="suggestions_updating">Ehdotukset päivitetään</string>
<string name="suggestions_excluded_genres_summary">Määritä genret, joita et halua nähdä ehdotuksissa</string>
<string name="suggestions_excluded_genres">Sulje pois genrejä</string>
<string name="text_delete_local_manga_batch">Poista valitut kohteet laitteesta pysyvästi\?</string>
<string name="removal_completed">Poisto valmis</string>
</resources>

View File

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="minutes_ago">
<item quantity="one">Il y a %1$d minute</item>
<item quantity="other">Il y a %1$d minutes</item>
</plurals>
<plurals name="pages">
<item quantity="one">%1$d page au total</item>
<item quantity="other">%1$d pages au total</item>
</plurals>
<plurals name="items">
<item quantity="one">%1$d élément</item>
<item quantity="other">%1$d éléments</item>
</plurals>
<plurals name="new_chapters">
<item quantity="one">%1$d nouveau chapitre</item>
<item quantity="other">%1$d nouveaux chapitres</item>
</plurals>
<plurals name="chapters">
<item quantity="one">%1$d chapitre</item>
<item quantity="other">%1$d chapitres</item>
</plurals>
<plurals name="chapters_from_x">
<item quantity="one">%1$d chapitre de %2$d</item>
<item quantity="other">%1$d chapitres de %2$d</item>
</plurals>
<plurals name="hours_ago">
<item quantity="one">Il y a %1$d heure</item>
<item quantity="other">Il y a %1$d heures</item>
</plurals>
<plurals name="days_ago">
<item quantity="one">Il y a %1$d jour</item>
<item quantity="other">Il y a %1$d jours</item>
</plurals>
</resources>

View File

@@ -217,7 +217,7 @@
<string name="chapter_is_missing_text">Téléchargez ou lisez ce chapitre manquant en ligne.</string>
<string name="text_downloads_holder">Aucun téléchargement actif</string>
<string name="queued">En file d\'attente</string>
<string name="about_feedback_4pda">Sujet sur 4PDA</string>
<string name="about_feedback_4pda">Sujet sur 4PDA</string>
<string name="about_feedback">Remarques</string>
<string name="about_app_translation">Traduction</string>
<string name="about_app_translation_summary">Traduire cette application</string>
@@ -264,4 +264,12 @@
<string name="search_chapters">Trouver un chapitre</string>
<string name="chapters_empty">Pas de chapitres dans ce manga</string>
<string name="percent_string_pattern">%1$s%%</string>
<string name="appearance">Apparence</string>
<string name="content">Contenu</string>
<string name="suggestions_updating">Mise à jour des suggestions</string>
<string name="suggestions_excluded_genres">Exclure des genres</string>
<string name="suggestions_excluded_genres_summary">Spécifiez les genres que vous ne voulez pas voir apparaître dans les suggestions</string>
<string name="text_delete_local_manga_batch">Supprimer définitivement les éléments sélectionnés de l\'appareil \?</string>
<string name="removal_completed">Suppression terminée</string>
<string name="batch_manga_save_confirm">Voulez-vous vraiment télécharger tous les mangas sélectionnés avec tous leurs chapitres \? Cette action peut consommer beaucoup de trafic et de stockage</string>
</resources>

View File

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="chapters_from_x">
<item quantity="one">%1$d capitolo da %2$d</item>
<item quantity="other">%1$d capitoli da %2$d</item>
</plurals>
<plurals name="pages">
<item quantity="one">%1$d pagina in totale</item>
<item quantity="other">%1$d pagine in totale</item>
</plurals>
<plurals name="new_chapters">
<item quantity="one">%1$d nuovo capitolo</item>
<item quantity="other">%1$d nuovi capitoli</item>
</plurals>
<plurals name="items">
<item quantity="one">%1$d élément</item>
<item quantity="other">%1$d éléments</item>
</plurals>
<plurals name="chapters">
<item quantity="one">%1$d capitolo</item>
<item quantity="other">%1$d capitoli</item>
</plurals>
<plurals name="minutes_ago">
<item quantity="one">%1$d minuto fa</item>
<item quantity="other">%1$d minuti fa</item>
</plurals>
<plurals name="hours_ago">
<item quantity="one">%1$d ora fa</item>
<item quantity="other">%1$d ore fa</item>
</plurals>
<plurals name="days_ago">
<item quantity="one">%1$d giorno fa</item>
<item quantity="other">%1$d giorni fa</item>
</plurals>
</resources>

View File

@@ -217,7 +217,7 @@
<string name="chapter_is_missing_text">Questo capitolo manca sul tuo dispositivo. Scaricalo o leggilo in linea.</string>
<string name="text_downloads_holder">Attualmente non ci sono scaricamenti attivi</string>
<string name="queued">In coda</string>
<string name="about_feedback_4pda">Argomento su 4PDA</string>
<string name="about_feedback_4pda">Argomento su 4PDA</string>
<string name="about_feedback">Commenti</string>
<string name="about_app_translation">Traduzione</string>
<string name="about_app_translation_summary">Traduci questa applicazione</string>
@@ -264,4 +264,12 @@
<string name="search_chapters">Trova un capitolo</string>
<string name="chapters_empty">Nessun capitolo in questo manga</string>
<string name="percent_string_pattern">%1$s%%</string>
<string name="appearance">Aspetto</string>
<string name="content">Contenuto</string>
<string name="suggestions_updating">Aggiornamento dei suggerimenti</string>
<string name="suggestions_excluded_genres_summary">Specifica i generi che non vuoi vedere nei suggerimenti</string>
<string name="suggestions_excluded_genres">Escludi generi</string>
<string name="removal_completed">Rimozione completata</string>
<string name="text_delete_local_manga_batch">Eliminare gli elementi selezionati dal dispositivo in modo permanente\?</string>
<string name="batch_manga_save_confirm">Vuoi davvero scaricare tutti i manga selezionati con tutti i loro capitoli\? Questa azione può consumare molto traffico e memoria</string>
</resources>

View File

@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="chapters_from_x">
<item quantity="other">%1$dから%2$dの章</item>
</plurals>
<plurals name="minutes_ago">
<item quantity="other">%1$d 1分前</item>
</plurals>
<plurals name="items">
<item quantity="other">%1$d 項目</item>
</plurals>
<plurals name="hours_ago">
<item quantity="other">%1$d 1時間前</item>
</plurals>
<plurals name="days_ago">
<item quantity="other">%1$d 1日前</item>
</plurals>
<plurals name="chapters">
<item quantity="other">%1$dチャプター</item>
</plurals>
<plurals name="pages">
<item quantity="other">合計%1$dページ</item>
</plurals>
<plurals name="new_chapters">
<item quantity="other">%1$d新しい章</item>
</plurals>
</resources>

View File

@@ -42,8 +42,8 @@
<string name="clear">クリア</string>
<string name="text_clear_history_prompt">すべての履歴を永久にクリアしますか?</string>
<string name="remove">削除</string>
<string name="_s_removed_from_history">\"%s\"が履歴から削除されました</string>
<string name="_s_deleted_from_local_storage">\"%s \"がローカルストレージから削除されました</string>
<string name="_s_removed_from_history">「%s」が履歴から削除されました</string>
<string name="_s_deleted_from_local_storage">%s がローカルストレージから削除されました</string>
<string name="wait_for_loading_finish">読み込みが完了するまでお待ちください…</string>
<string name="save_page">ページを保存</string>
<string name="page_saved">保存しました</string>
@@ -163,7 +163,7 @@
<string name="prefer_rtl_reader">右から左(←)の読書を好む</string>
<string name="about_feedback">フィードバック</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="state_finished">完成</string>
<string name="state_ongoing">進行中</string>
@@ -209,10 +209,10 @@
<string name="about_app_translation">このアプリを翻訳</string>
<string name="data_restored_success">全てのデータが復元されました</string>
<string name="data_restored">復元</string>
<string name="preparing_">準備中…</string>
<string name="preparing_">準備中…</string>
<string name="zoom_mode_keep_start">開始時に維持</string>
<string name="backup_restore">バックアップと復元</string>
<string name="reverse">リバース</string>
<string name="reverse">リバース</string>
<string name="reader_mode_hint">選択した構成はこの漫画のために記憶されます</string>
<string name="clear_cookies">クッキーを削除</string>
<string name="report_github">GitHubでissueを作成する(GitHubのアカウントが必要です)</string>
@@ -230,7 +230,7 @@
<string name="scale_mode">スケールモード</string>
<string name="error_empty_name">名前を入力する必要があります</string>
<string name="today">今日</string>
<string name="about_app_translation_summary">Kotatsuを翻訳する(Weblateのサイトに移動します)</string>
<string name="about_app_translation_summary">Kotatsuを翻訳する(Weblateのサイトに移動します)</string>
<string name="next">次のページ</string>
<string name="silent">サイレント</string>
<string name="sign_in">サインイン</string>
@@ -264,4 +264,12 @@
<string name="search_chapters">チャプターを検索</string>
<string name="chapters_empty">この漫画の章はありません</string>
<string name="percent_string_pattern">%1$s%%</string>
<string name="content">コンテンツ</string>
<string name="suggestions_updating">更新のご提案</string>
<string name="appearance">外観</string>
<string name="suggestions_excluded_genres">ジャンルを除く</string>
<string name="suggestions_excluded_genres_summary">サジェストで表示したくないジャンルを指定</string>
<string name="text_delete_local_manga_batch">選択した項目をデバイスから完全に削除しますか?</string>
<string name="removal_completed">削除が完了しました</string>
<string name="batch_manga_save_confirm">本当に選択したマンガを全編ダウンロードしますか?この動作は多くのトラフィックとストレージを消費する可能性があります</string>
</resources>

View File

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="pages">
<item quantity="one">Totalt %1$d side</item>
<item quantity="other">Totalt %1$d sider</item>
</plurals>
<plurals name="new_chapters">
<item quantity="one">%1$d nytt kapittel</item>
<item quantity="other">%1$d nye kapitler</item>
</plurals>
<plurals name="chapters">
<item quantity="one">%1$d kapittel</item>
<item quantity="other">%1$d kapitler</item>
</plurals>
<plurals name="chapters_from_x">
<item quantity="one">%1$d kapitler fra %2$d</item>
<item quantity="other">%1$d kapitler fra %2$d</item>
</plurals>
<plurals name="hours_ago">
<item quantity="one">%1$d time siden</item>
<item quantity="other">%1$d timer siden</item>
</plurals>
<plurals name="days_ago">
<item quantity="one">%1$d dag siden</item>
<item quantity="other">%1$d dager siden</item>
</plurals>
<plurals name="items">
<item quantity="one">%1$d element</item>
<item quantity="other">%1$d elementer</item>
</plurals>
<plurals name="minutes_ago">
<item quantity="one">%1$d minutt siden</item>
<item quantity="other">%1$d minutter siden</item>
</plurals>
</resources>

View File

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="items">
<item quantity="one">%1$d item</item>
<item quantity="other">%1$d itens</item>
</plurals>
<plurals name="chapters">
<item quantity="one">%1$d capítulo</item>
<item quantity="other">%1$d capítulos</item>
</plurals>
<plurals name="chapters_from_x">
<item quantity="one">%1$d capítulo de %2$d</item>
<item quantity="other">%1$d capítulos de %2$d</item>
</plurals>
<plurals name="pages">
<item quantity="one">Total de %1$d página</item>
<item quantity="other">Total de %1$d páginas</item>
</plurals>
<plurals name="new_chapters">
<item quantity="one">%1$d novo capítulo</item>
<item quantity="other">%1$d novos capítulos</item>
</plurals>
<plurals name="minutes_ago">
<item quantity="one">%1$d minuto atrás</item>
<item quantity="other">%1$d minutos atrás</item>
</plurals>
<plurals name="hours_ago">
<item quantity="one">%1$d hora atrás</item>
<item quantity="other">%1$d horas atrás</item>
</plurals>
<plurals name="days_ago">
<item quantity="one">%1$d dia atrás</item>
<item quantity="other">%1$d dias atrás</item>
</plurals>
</resources>

View File

@@ -51,8 +51,8 @@
<string name="pages">Páginas</string>
<string name="clear">Limpar</string>
<string name="remove">Remover</string>
<string name="_s_removed_from_history">\"%s\" removido do histórico</string>
<string name="_s_deleted_from_local_storage">\"%s\" excluído do armazenamento local</string>
<string name="_s_removed_from_history">“%s” removido do histórico</string>
<string name="_s_deleted_from_local_storage">“%s” excluído do armazenamento local</string>
<string name="wait_for_loading_finish">Aguarde o carregamento terminar…</string>
<string name="save_page">Salvar página</string>
<string name="page_saved">Salvou</string>
@@ -70,7 +70,7 @@
<string name="grid_size">Tamanho da grade</string>
<string name="search_on_s">Pesquisar em %s</string>
<string name="delete_manga">Excluir mangá</string>
<string name="text_delete_local_manga">Excluir \"%s\" do dispositivo permanentemente\?</string>
<string name="text_delete_local_manga">Excluir “%s” do dispositivo permanentemente\?</string>
<string name="reader_settings">Configurações do leitor</string>
<string name="taps_on_edges">Toques de borda</string>
<string name="volume_buttons">Botões de volume</string>
@@ -183,7 +183,7 @@
<string name="about_app_translation">Tradução</string>
<string name="about_feedback">Comentar</string>
<string name="about_feedback_4pda">Tópico no 4PDA</string>
<string name="auth_complete">Autorizado</string>
<string name="auth_complete">Autorizado</string>
<string name="auth_not_supported_by">O login em %s não é suportado</string>
<string name="text_clear_cookies_prompt">Você será desconectado de todas as fontes</string>
<string name="genres">Gêneros</string>
@@ -233,7 +233,7 @@
<string name="application_update">Verifique se há novas versões do aplicativo</string>
<string name="favourites_categories">Categorias favoritas</string>
<string name="show_notification_new_chapters">Notificar sobre atualizações de mangá que você está lendo</string>
<string name="category_delete_confirm">Remover a categoria \"%s\" dos seus favoritos\?
<string name="category_delete_confirm">Remover a categoria “%s” dos seus favoritos\?
\nTodos os mangás nela serão perdidos.</string>
<string name="no_update_available">Nenhuma atualização disponível</string>
<string name="create_category">Nova categoria</string>
@@ -261,7 +261,15 @@
<string name="data_restored_with_errors">Os dados foram restaurados, mas há erros</string>
<string name="report_github">Criar problema no GitHub</string>
<string name="file_not_found">Arquivo não encontrado</string>
<string name="search_chapters">Localizar capítulo</string>
<string name="search_chapters">Localizar capítulo</string>
<string name="chapters_empty">Não há capítulos neste mangá</string>
<string name="percent_string_pattern">%1$s%%</string>
<string name="suggestions_updating">Atualização de sugestões</string>
<string name="appearance">Aparência</string>
<string name="content">Conteúdo</string>
<string name="suggestions_excluded_genres">Excluir gêneros</string>
<string name="suggestions_excluded_genres_summary">Especifique os gêneros que você não deseja ver nas sugestões</string>
<string name="removal_completed">Remoção concluída</string>
<string name="text_delete_local_manga_batch">Excluir itens selecionados do dispositivo permanentemente\?</string>
<string name="batch_manga_save_confirm">Tem certeza de que deseja baixar todos os mangás selecionados com todos os seus capítulos\? Essa ação pode consumir muito tráfego e armazenamento</string>
</resources>

View File

@@ -41,8 +41,8 @@
<string name="clear">Limpar</string>
<string name="text_clear_history_prompt">Limpar todo o histórico de leitura permanentemente\?</string>
<string name="remove">Remover</string>
<string name="_s_removed_from_history">\"%s\" removido do histórico</string>
<string name="_s_deleted_from_local_storage">\"%s\" deletado do armazenamento local</string>
<string name="_s_removed_from_history">«%s» removido do histórico</string>
<string name="_s_deleted_from_local_storage">«%s» deletado do armazenamento local</string>
<string name="wait_for_loading_finish">Aguarde o carregamento terminar…</string>
<string name="save_page">Salvar página</string>
<string name="page_saved">Salvou</string>
@@ -103,7 +103,7 @@
<string name="chapters">Capítulos</string>
<string name="add_new_category">Nova categoria</string>
<string name="warning">Aviso</string>
<string name="text_delete_local_manga">Excluir \"%s\" do dispositivo permanentemente\?</string>
<string name="text_delete_local_manga">Excluir «%s» do dispositivo permanentemente\?</string>
<string name="text_file_not_supported">Escolha um arquivo ZIP ou CBZ.</string>
<string name="clear_search_history">Limpar histórico de pesquisa</string>
<string name="enabled_d_of_d" tools:ignore="PluralsCandidate">Ativado %1$d de %2$d</string>
@@ -185,7 +185,7 @@
<string name="about_app_translation_summary">Traduzir esta aplicação</string>
<string name="about_feedback">Comentar</string>
<string name="about_feedback_4pda">Tópico no 4PDA</string>
<string name="chapter_is_missing_text">Baixe ou leia este capítulo perdido online.</string>
<string name="chapter_is_missing_text">Baixe ou leia este capítulo perdido online.</string>
<string name="chapter_is_missing">O capítulo está em falta</string>
<string name="auth_complete">Autorizado</string>
<string name="auth_not_supported_by">O login em %s não é suportado</string>
@@ -195,8 +195,8 @@
<string name="vibration">Vibração</string>
<string name="cannot_find_available_storage">Sem armazenamento disponível</string>
<string name="favourites_categories">Categorias favoritas</string>
<string name="category_delete_confirm">Remover a categoria \"%s\" dos seus favoritos\?
\nTodos os mangás nela serão perdidos..</string>
<string name="category_delete_confirm">Remover a categoria «%s» dos seus favoritos\?
\nTodos os mangás nela serão perdidos.</string>
<string name="text_history_holder_secondary">Encontre o que ler no menu lateral.</string>
<string name="text_local_holder_secondary">Salve-o de fontes online ou importe arquivos.</string>
<string name="recent_manga">Recente</string>
@@ -261,4 +261,10 @@
<string name="logged_in_as">Conectado como %s</string>
<string name="nsfw">18+</string>
<string name="various_languages">Vários idiomas</string>
<string name="suggestions_updating">Atualização das sugestões</string>
<string name="appearance">Aparência</string>
<string name="search_chapters">Encontrar capítulo</string>
<string name="content">Conteúdo</string>
<string name="chapters_empty">Não há capítulos nesta manga</string>
<string name="percent_string_pattern">%1$s%%</string>
</resources>

View File

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="pages">
<item quantity="one">Totalt %1$d sida</item>
<item quantity="other">Totalt %1$d sidor</item>
</plurals>
<plurals name="items">
<item quantity="one">%1$d artikel</item>
<item quantity="other">%1$d artiklar</item>
</plurals>
<plurals name="new_chapters">
<item quantity="one">%1$d nytt kapitel</item>
<item quantity="other">%1$d nya kapitel</item>
</plurals>
<plurals name="chapters">
<item quantity="one">%1$d kapitel</item>
<item quantity="other">%1$d kapitel</item>
</plurals>
<plurals name="chapters_from_x">
<item quantity="one">%1$d kapitel från %2$d</item>
<item quantity="other">%1$d kapitel från %2$d</item>
</plurals>
<plurals name="minutes_ago">
<item quantity="one">%1$d minut sedan</item>
<item quantity="other">%1$d minuter sedan</item>
</plurals>
<plurals name="hours_ago">
<item quantity="one">%1$d timme sedan</item>
<item quantity="other">%1$d timmar sedan</item>
</plurals>
<plurals name="days_ago">
<item quantity="one">%1$d dag sedan</item>
<item quantity="other">%1$d dagar sedan</item>
</plurals>
</resources>

View File

@@ -0,0 +1,275 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<string name="light">Ljust</string>
<string name="pages">Sidor</string>
<string name="text_file_not_supported">Välj en ZIP- eller CBZ-fil.</string>
<string name="close_menu">Stäng meny</string>
<string name="open_menu">Öppna meny</string>
<string name="local_storage">Lokal lagring</string>
<string name="favourites">Favoriter</string>
<string name="history">Historik</string>
<string name="error_occurred">Ett fel har inträffat</string>
<string name="network_error">Lyckades inte ansluta till internet</string>
<string name="details">Detaljer</string>
<string name="chapters">Kapitel</string>
<string name="list">Lista</string>
<string name="detailed_list">Detaljerad lista</string>
<string name="grid">Rutnät</string>
<string name="list_mode">Listläge</string>
<string name="settings">Inställningar</string>
<string name="remote_sources">Källor</string>
<string name="loading_">Laddar…</string>
<string name="computing_">Beräknar…</string>
<string name="chapter_d_of_d">Kapitel %1$d av %2$d</string>
<string name="close">Stäng</string>
<string name="try_again">Försök igen</string>
<string name="clear_history">Rensa historik</string>
<string name="nothing_found">Ingenting hittades</string>
<string name="history_is_empty">Ingen historik än</string>
<string name="download_complete">Nedladdat</string>
<string name="downloads">Nedladdningar</string>
<string name="by_name">Namn</string>
<string name="popular">Populärt</string>
<string name="updated">Uppdaterat</string>
<string name="add_to_favourites">Lägg till som favorit</string>
<string name="filter">Filter</string>
<string name="standard">Standard</string>
<string name="read">Läs</string>
<string name="enter_category_name">Ange kategorins namn</string>
<string name="you_have_not_favourites_yet">Inga favoriter än</string>
<string name="save">Spara</string>
<string name="create_shortcut">Skapa genväg…</string>
<string name="manga_downloading_">Laddar ned…</string>
<string name="processing_">Behandlar…</string>
<string name="theme">Tema</string>
<string name="automatic">Systemtema</string>
<string name="remove">Ta bort</string>
<string name="text_file_sizes">B|kB|MB|GB|TB</string>
<string name="add_new_category">Ny kategori</string>
<string name="search">Sök</string>
<string name="by_rating">Betyg</string>
<string name="add">Lägg till</string>
<string name="share">Dela</string>
<string name="share_s">Dela %s</string>
<string name="search_manga">Sök manga</string>
<string name="cache">Cache</string>
<string name="show_notification_app_update">Visa en notifikation om en nyare version av äpplen finns tillgänglig</string>
<string name="newest">Nyaste</string>
<string name="sort_order">Sorteringsordning</string>
<string name="dark">Mörkt</string>
<string name="operation_not_supported">Denna åtgärden stöds inte</string>
<string name="no_description">Ingen beskrivning</string>
<string name="history_and_cache">Historik och cache</string>
<string name="clear">Rensa</string>
<string name="text_clear_history_prompt">Rensa all läshistorik permanent\?</string>
<string name="_s_removed_from_history">\"%s\" borttagen från historik</string>
<string name="_s_deleted_from_local_storage">\"%s\" borttaget från lokal lagring</string>
<string name="wait_for_loading_finish">Vänta tills laddningen är klar…</string>
<string name="save_page">Spara sida</string>
<string name="page_saved">Sparad</string>
<string name="share_image">Dela bild</string>
<string name="_import">Importera</string>
<string name="delete">Ta bort</string>
<string name="clear_pages_cache">Rensa sidcache</string>
<string name="text_delete_local_manga">Ta permanent bort \"%s\" från den här enheten\?</string>
<string name="volume_buttons">Volymknappar</string>
<string name="cancelling_">Avbryter…</string>
<string name="error">Error</string>
<string name="webtoon">Webtoon</string>
<string name="read_mode">Läsläge</string>
<string name="grid_size">Rutnätsstorlek</string>
<string name="search_on_s">Sök på %s</string>
<string name="delete_manga">Ta bort manga</string>
<string name="reader_settings">Läsarinställningar</string>
<string name="switch_pages">Byt sida</string>
<string name="taps_on_edges">Kanttryck</string>
<string name="_continue">Fortsätt</string>
<string name="warning">Varning</string>
<string name="network_consumption_warning">Detta kan kräva mycket dataöverföring</string>
<string name="dont_ask_again">Fråga inte igen</string>
<string name="search_history_cleared">Rensat</string>
<string name="clear_thumbs_cache">Rensa cache för miniatyrer</string>
<string name="open_in_browser">Öppna i webbläsare</string>
<string name="notifications">Notifikationer</string>
<string name="clear_search_history">Rensa sökhistorik</string>
<string name="domain">Domän</string>
<string name="gestures_only">Endast gester</string>
<string name="internal_storage">Internlagring</string>
<string name="external_storage">Externlagring</string>
<string name="application_update">Kolla om det finns en nyare version av appen</string>
<string name="app_update_available">En ny version av appen finns tillgänglig</string>
<string name="enabled_d_of_d" tools:ignore="PluralsCandidate">%1$d av %2$d aktiva</string>
<string name="new_chapters">Nya kapitel</string>
<string name="large_manga_save_confirm">Den här mangan har %s. Spara hela\?</string>
<string name="save_manga">Spara</string>
<string name="download">Ladda ned</string>
<string name="notifications_settings">Notifikationsinställningar</string>
<string name="light_indicator">LED-indikator</string>
<string name="show_notification_new_chapters">Notifiera om uppdateringar på manga du läser</string>
<string name="read_from_start">Läs från början</string>
<string name="restart">Starta om</string>
<string name="notification_sound">Notifikationsljud</string>
<string name="vibration">Vibration</string>
<string name="favourites_categories">Favoritkategorier</string>
<string name="no_update_available">Inga tillgängliga uppdateringar</string>
<string name="backup_information">Du kan säkerhetskopiera din historik och dina favoriter och återställa senare</string>
<string name="just_now">Just nu</string>
<string name="yesterday">Igår</string>
<string name="long_ago">Länge sedan</string>
<string name="group">Grupp</string>
<string name="today">Idag</string>
<string name="tap_to_try_again">Tryck för att försöka igen</string>
<string name="reader_mode_hint">Den valda konfigurationen kommer att bli ihågkommen för denna manga</string>
<string name="silent">Tyst</string>
<string name="cookies_cleared">Alla kakor rensades</string>
<string name="chapters_checking_progress">Letar efter nya kapitel: %1$d av %2$d</string>
<string name="clear_feed">Rensa flöde</string>
<string name="text_clear_updates_feed_prompt">Permanent rensa all uppdateringshistorik\?</string>
<string name="check_for_new_chapters">Leta efter nya kapitel</string>
<string name="reverse">Omvänt</string>
<string name="sign_in">Logga in</string>
<string name="auth_required">Logga in för att visa innehåll</string>
<string name="default_s">Standard: %s</string>
<string name="_and_x_more">...och %1$d till</string>
<string name="next">Nästa</string>
<string name="password_length_hint">Lösenordet måste vara minst 4 tecken</string>
<string name="search_only_on_s">Sök endast på %s</string>
<string name="text_clear_search_history_prompt">Permanent rensa alla senaste sökfrågor\?</string>
<string name="other">Annat</string>
<string name="welcome">Välkommen</string>
<string name="tracker_warning">Vissa enheter har olika systembeteende vilket kan ha sönder bakgrundsjobb.</string>
<string name="read_more">Läs mer</string>
<string name="queued">Köad</string>
<string name="text_downloads_holder">Inga aktiva nedladdningar</string>
<string name="chapter_is_missing_text">Ladda ned eller läs det saknade kapitlet online.</string>
<string name="chapter_is_missing">Kapitlet saknas</string>
<string name="about_app_translation_summary">Översätt denna app</string>
<string name="about_app_translation">Översättning</string>
<string name="about_feedback">Feedback</string>
<string name="about_feedback_4pda">Ämne på 4PDA</string>
<string name="auth_complete">Auktoriserad</string>
<string name="auth_not_supported_by">Inloggning på %s stöds inte</string>
<string name="state_finished">Färdig</string>
<string name="exclude_nsfw_from_history">Exkludera vuxeninnehåll från historiken</string>
<string name="error_empty_name">Du måste ange ett namn</string>
<string name="show_pages_numbers">Numrerade sidor</string>
<string name="enabled_sources">Aktiva källor</string>
<string name="available_sources">Tillgängliga källor</string>
<string name="dynamic_theme">Dynamiskt tema</string>
<string name="dynamic_theme_summary">Tillämpar ett tema skapat utifrån din bakgrundsbild</string>
<string name="importing_progress">Importerar manga: %1$d av %2$d</string>
<string name="screenshots_policy">Policy för skärmdumpar</string>
<string name="screenshots_allow">Tillåt</string>
<string name="screenshots_block_nsfw">Blockera på vuxeninnehåll</string>
<string name="screenshots_block_all">Blockera alltid</string>
<string name="suggestions">Förslag</string>
<string name="suggestions_enable">Aktivera förslag</string>
<string name="suggestions_summary">Föreslå manga baserat på dina preferenser</string>
<string name="suggestions_info">Alla data analyseras lokalt på denna enhet. Dina personuppgifter kommer inte överföras till någon tjänst</string>
<string name="text_suggestion_holder">Börja läsa manga för att få personliga förslag</string>
<string name="exclude_nsfw_from_suggestions">Föreslå inte manga med vuxeninnehåll</string>
<string name="enabled">Aktiverad</string>
<string name="disabled">Inaktiverad</string>
<string name="filter_load_error">Kunde inte ladda genrelistan</string>
<string name="reset_filter">Återställ filter</string>
<string name="find_genre">Hitta genre</string>
<string name="onboard_text">Välj det språk som du vill läsa manga på. Du kan ändra detta i inställningarna senare.</string>
<string name="never">Aldrig</string>
<string name="only_using_wifi">Endast på Wi-Fi</string>
<string name="always">Alltid</string>
<string name="preload_pages">Förladdning av sidor</string>
<string name="logged_in_as">Inloggad som %s</string>
<string name="nsfw">18+</string>
<string name="various_languages">Olika språk</string>
<string name="search_chapters">Hitta kapitel</string>
<string name="chapters_empty">Inga kapitel i denna manga</string>
<string name="appearance">Utseende</string>
<string name="content">Innehåll</string>
<string name="suggestions_updating">Uppdaterar förslag</string>
<string name="suggestions_excluded_genres">Uteslut genrer</string>
<string name="suggestions_excluded_genres_summary">Ange genrer som du inte vill få förslag på</string>
<string name="removal_completed">Borttagningen slutförd</string>
<string name="text_empty_holder_primary">Här var det tomt…</string>
<string name="rename">Byt namn</string>
<string name="category_delete_confirm">Ta bort kategorin \"%s\" från dina favoriter\?
\nAllt innehåll kommer förloras.</string>
<string name="text_categories_holder">Du kan använda kategorier för att organisera din a favoriter. Tryck på «+» för att skapa en ny kategori</string>
<string name="categories_">Kategorier…</string>
<string name="feed_will_update_soon">Flödesuppdatering påbörjas snart</string>
<string name="restore_backup">Återställ från säkerhetskopia</string>
<string name="text_search_holder_secondary">Försök att omformulera frågan.</string>
<string name="text_history_holder_primary">Det du läser kommer att visas här</string>
<string name="text_local_holder_primary">Spara något först</string>
<string name="manga_shelf">Hylla</string>
<string name="remove_category">Ta bort</string>
<string name="create_category">Ny kategori</string>
<string name="text_history_holder_secondary">Hitta ny läsning i sidomenyn.</string>
<string name="pages_animation">Sidanimation</string>
<string name="favourites_category_empty">Tom kategori</string>
<string name="read_later">Läs senare</string>
<string name="updates">Uppdateringar</string>
<string name="new_version_s">Ny version: %s</string>
<string name="text_local_holder_secondary">Hämta från onlinekällor eller importera filer.</string>
<string name="recent_manga">Nytt</string>
<string name="manga_save_location">Mapp för nedladdningar</string>
<string name="not_available">Ej tillgänglig</string>
<string name="other_storage">Annan lagring</string>
<string name="text_feed_holder">Nya kapitel av det du läser visas här</string>
<string name="rotate_screen">Rotera skärm</string>
<string name="cannot_find_available_storage">Inget tillgängligt lagringsutrymme</string>
<string name="done">Färdig</string>
<string name="related">Relaterat</string>
<string name="size_s">Storlek: %s</string>
<string name="waiting_for_network">Väntar på nätverk…</string>
<string name="update">Uppdatera</string>
<string name="enter_password">Ange lösenord</string>
<string name="checking_for_updates">Letar efter uppdateringar…</string>
<string name="all_favourites">Alla favoriter</string>
<string name="protect_application_summary">Fråga efter lösenord när appen startas</string>
<string name="search_results">Sökresultat</string>
<string name="clear_updates_feed">Rensa uppdateringsflödet</string>
<string name="track_sources">Leta efter uppdateringar</string>
<string name="updates_feed_cleared">Rensat</string>
<string name="dont_check">Kontrollera inte</string>
<string name="protect_application">Skydda appen</string>
<string name="wrong_password">Fel lösenord</string>
<string name="repeat_password">Repetera lösenord</string>
<string name="passwords_mismatch">Lösenord stämmer inte överens</string>
<string name="about">Om</string>
<string name="app_version">Version %s</string>
<string name="check_for_updates">Leta efter uppdateringar</string>
<string name="right_to_left">Höger-till-vänster (←)</string>
<string name="update_check_failed">Kunde inte leta efter uppdateringar</string>
<string name="scale_mode">Skalningsläge</string>
<string name="zoom_mode_fit_center">Centrera</string>
<string name="zoom_mode_fit_height">Anpassa mot höjd</string>
<string name="zoom_mode_keep_start">Anpassa till start</string>
<string name="prefer_rtl_reader">Föredra höger-till-vänster (←) läsare</string>
<string name="preparing_">Förbereder…</string>
<string name="prefer_rtl_reader_summary">Läsläge kan sättas up separat för varje serie</string>
<string name="zoom_mode_fit_width">Anpassa mot bredd</string>
<string name="black_dark_theme">Svart</string>
<string name="black_dark_theme_summary">Använder mindre ström på AMOLED-skärmar</string>
<string name="restart_required">Omstart krävs</string>
<string name="backup_restore">Säkerhetskopiering och återställning</string>
<string name="create_backup">Skapa säkerhetskopia</string>
<string name="data_restored">Återställd</string>
<string name="report_github">Skapa en felrapport på GitHub</string>
<string name="data_restored_with_errors">Datan återställdes men det förekommer fel</string>
<string name="data_restored_success">All data återställdes</string>
<string name="file_not_found">Filen hittades inte</string>
<string name="captcha_required">CAPTCHA krävs</string>
<string name="captcha_solve">Lös</string>
<string name="clear_cookies">Rensa kakor</string>
<string name="confirm">Bekräfta</string>
<string name="protect_application_subtitle">Ange ett lösenord för att starta appen med</string>
<string name="backup_saved">Säkerhetskopia sparad</string>
<string name="genres">Genrer</string>
<string name="state_ongoing">Pågående</string>
<string name="date_format">Datumformat</string>
<string name="system_default">Standard</string>
<string name="text_clear_cookies_prompt">Du kommer loggas ut från alla källor</string>
<string name="text_delete_local_manga_batch">Vill du ta bort markerade objekt från enheten permanent\?</string>
<string name="percent_string_pattern">%1$s%%</string>
<string name="batch_manga_save_confirm">Är du säker på att du vill ladda ner alla utvalda manga med alla kapitel\? Den här åtgärden kan kräva mycket nätverkstrafik och lagringsutrymme</string>
</resources>

View File

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="pages">
<item quantity="one">Toplam %1$d sayfa</item>
<item quantity="other">Toplam %1$d sayfa</item>
</plurals>
<plurals name="items">
<item quantity="one">%1$d öge</item>
<item quantity="other">%1$d öge</item>
</plurals>
<plurals name="chapters">
<item quantity="one">%1$d bölüm</item>
<item quantity="other">%1$d bölüm</item>
</plurals>
<plurals name="hours_ago">
<item quantity="one">%1$d saat önce</item>
<item quantity="other">%1$d saat önce</item>
</plurals>
<plurals name="new_chapters">
<item quantity="one">%1$d yeni bölüm</item>
<item quantity="other">%1$d yeni bölüm</item>
</plurals>
<plurals name="days_ago">
<item quantity="one">%1$d gün önce</item>
<item quantity="other">%1$d gün önce</item>
</plurals>
<plurals name="chapters_from_x">
<item quantity="one">%2$d\'den %1$d bölüm</item>
<item quantity="other">%2$d\'den %1$d bölüm</item>
</plurals>
<plurals name="minutes_ago">
<item quantity="one">%1$d dakika önce</item>
<item quantity="other">%1$d dakika önce</item>
</plurals>
</resources>

View File

@@ -45,8 +45,8 @@
<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="remove">Kaldır</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_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="wait_for_loading_finish">Lütfen bitmesini bekleyin…</string>
<string name="save_page">Sayfayı kaydet</string>
<string name="share_image">Resmi paylaş</string>
@@ -117,7 +117,7 @@
<string name="pages_animation">Sayfa animasyonu</string>
<string name="cannot_find_available_storage">Kullanılabilir depolama alanı yok</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="text_empty_holder_primary">Burası biraz boş…</string>
<string name="rotate_screen">Ekranı döndür</string>
@@ -131,7 +131,7 @@
<string name="restore_backup">Yedekten geri yükle</string>
<string name="update">Güncelle</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="auth_required">Bu içeriği görüntülemek için oturum açın</string>
<string name="confirm">Onayla</string>
@@ -140,7 +140,7 @@
<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="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>
<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>
@@ -184,7 +184,7 @@
<string name="about_app_translation">Çeviri</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="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="enabled_sources">Kullanılan kaynaklar</string>
<string name="available_sources">Kullanılabilir kaynaklar</string>
@@ -223,13 +223,13 @@
<string name="captcha_required">CAPTCHA gerekli</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="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="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="about_feedback">Geri bildirim</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="system_default">Öntanımlı</string>
<string name="error_empty_name">Bir ad girmelisiniz</string>
@@ -264,4 +264,12 @@
<string name="search_chapters">Bölüm bul</string>
<string name="chapters_empty">Bu mangada bölüm yok</string>
<string name="percent_string_pattern">%%%1$s</string>
<string name="content">İçerik</string>
<string name="suggestions_updating">Öneriler güncelleniyor</string>
<string name="appearance">Görünüm</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="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="removal_completed">Kaldırma tamamlandı</string>
</resources>