mirror of
https://github.com/advplyr/audiobookshelf-app.git
synced 2026-07-25 05:58:34 +02:00
Compare commits
56
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8d563dcfed | ||
|
|
1cf36e5549 | ||
|
|
1357a0628f | ||
|
|
c4fe0680f3 | ||
|
|
16694aa932 | ||
|
|
ea59ad2953 | ||
|
|
cf2f684e80 | ||
|
|
01522eda43 | ||
|
|
a200ee1310 | ||
|
|
579a07baa2 | ||
|
|
a82dd88b1f | ||
|
|
36ba98920a | ||
|
|
47cc0c34eb | ||
|
|
53eaca8724 | ||
|
|
8a2814b391 | ||
|
|
345c8ab217 | ||
|
|
7c010895e0 | ||
|
|
e716cfd19b | ||
|
|
461a6c8be5 | ||
|
|
3360f1a3f6 | ||
|
|
8b939e8a02 | ||
|
|
3a8998081c | ||
|
|
9b986a7b15 | ||
|
|
69ab395798 | ||
|
|
7aa3c33348 | ||
|
|
734328dd1f | ||
|
|
7d6c30e733 | ||
|
|
3e682dfe50 | ||
|
|
50efda3858 | ||
|
|
ca1b9e2bdb | ||
|
|
aa3a91b9d9 | ||
|
|
7117608445 | ||
|
|
6de640f53f | ||
|
|
75627ea40f | ||
|
|
0fa04d7d9a | ||
|
|
1e76ebe075 | ||
|
|
965da2fee3 | ||
|
|
b03f59ace3 | ||
|
|
79c7244b24 | ||
|
|
0843be3f4e | ||
|
|
6911f368e5 | ||
|
|
42167ea738 | ||
|
|
1c57d3506a | ||
|
|
8adc6fae4c | ||
|
|
e9746577ba | ||
|
|
9f68730622 | ||
|
|
f019b67b0c | ||
|
|
0f650c0572 | ||
|
|
dfc77ea0d0 | ||
|
|
67f514524f | ||
|
|
d97c6a0872 | ||
|
|
e7ad62760f | ||
|
|
fd34ea8124 | ||
|
|
5db94bf5b8 | ||
|
|
796d6d79d4 | ||
|
|
03aafafe1c |
@@ -72,10 +72,12 @@ body:
|
||||
description: Please ensure your app is up to date. *If you are using a 3rd-party app, please reach out to them directly.*
|
||||
multiple: true
|
||||
options:
|
||||
- 'Android App - 0.9.81'
|
||||
- 'iOS App - 0.9.81'
|
||||
- 'Android App - 0.9.80'
|
||||
- 'iOS App - 0.9.80'
|
||||
- 'Android App - 0.9.79'
|
||||
- 'iOS App - 0.9.79'
|
||||
- 'Android App - 0.9.78'
|
||||
- 'iOS App - 0.9.78'
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
|
||||
@@ -43,10 +43,12 @@ body:
|
||||
description: Please ensure your app is up to date. *If you are using a 3rd-party app, please reach out to them directly.*
|
||||
multiple: true
|
||||
options:
|
||||
- Android App - 0.9.79
|
||||
- iOS App - 0.9.79
|
||||
- Android App - 0.9.78
|
||||
- iOS App - 0.9.78
|
||||
- 'Android App - 0.9.81'
|
||||
- 'iOS App - 0.9.81'
|
||||
- 'Android App - 0.9.80'
|
||||
- 'iOS App - 0.9.80'
|
||||
- 'Android App - 0.9.79'
|
||||
- 'iOS App - 0.9.79'
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
<!--
|
||||
For Work In Progress Pull Requests, please use the Draft PR feature,
|
||||
see https://github.blog/2019-02-14-introducing-draft-pull-requests/ for further details.
|
||||
|
||||
If you do not follow this template, the PR may be closed without review.
|
||||
|
||||
Please ensure all checks pass.
|
||||
If you are a new contributor, the workflows will need to be manually approved before they run.
|
||||
-->
|
||||
|
||||
## Brief summary
|
||||
|
||||
<!-- Please provide a brief summary of what your PR attempts to achieve. -->
|
||||
|
||||
## Which issue is fixed?
|
||||
|
||||
<!-- Which issue number does this PR fix? Ex: "Fixes #1234" -->
|
||||
|
||||
## Pull Request Type
|
||||
|
||||
<!--
|
||||
Does this affect only Android, only iOS, or both?
|
||||
Does this change the frontend or the backend of the apps?
|
||||
-->
|
||||
|
||||
## In-depth Description
|
||||
|
||||
<!--
|
||||
Describe your solution in more depth.
|
||||
How does it work? Why is this the best solution?
|
||||
Does it solve a problem that affects multiple users or is this an edge case for your setup?
|
||||
-->
|
||||
|
||||
## How have you tested this?
|
||||
|
||||
<!-- Please describe in detail with reproducible steps how you tested your changes. -->
|
||||
|
||||
## Screenshots
|
||||
|
||||
<!-- If your PR includes any changes to the front-end, please include screenshots or a
|
||||
short video from before and after your changes. -->
|
||||
Vendored
+6
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"java.project.root": "android",
|
||||
"java.import.gradle.enabled": true,
|
||||
"java.import.gradle.wrapper.enabled": true,
|
||||
"java.import.gradle.user.home": "${workspaceFolder}/.gradle"
|
||||
}
|
||||
@@ -36,8 +36,8 @@ android {
|
||||
applicationId "com.audiobookshelf.app"
|
||||
minSdkVersion rootProject.ext.minSdkVersion
|
||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||
versionCode 111
|
||||
versionName "0.9.80-beta"
|
||||
versionCode 112
|
||||
versionName "0.9.81-beta"
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
manifestPlaceholders = [
|
||||
"appAuthRedirectScheme": "com.audiobookshelf.app"
|
||||
|
||||
@@ -5,6 +5,10 @@
|
||||
"plugins": {
|
||||
"CapacitorHttp": {
|
||||
"enabled": false
|
||||
},
|
||||
"StatusBar": {
|
||||
"backgroundColor": "#232323",
|
||||
"style": "DARK"
|
||||
}
|
||||
},
|
||||
"server": {
|
||||
|
||||
@@ -6,10 +6,15 @@ import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.ServiceConnection
|
||||
import android.content.pm.PackageManager
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.os.IBinder
|
||||
import android.util.Log
|
||||
import android.view.ViewGroup
|
||||
import android.view.WindowInsets
|
||||
import android.webkit.WebView
|
||||
import androidx.core.app.ActivityCompat
|
||||
import androidx.core.view.updateLayoutParams
|
||||
import com.anggrayudi.storage.SimpleStorage
|
||||
import com.anggrayudi.storage.SimpleStorageHelper
|
||||
import com.audiobookshelf.app.managers.DbManager
|
||||
@@ -40,18 +45,6 @@ class MainActivity : BridgeActivity() {
|
||||
)
|
||||
|
||||
public override fun onCreate(savedInstanceState: Bundle?) {
|
||||
// TODO: Optimize using strict mode logs
|
||||
// StrictMode.setThreadPolicy(StrictMode.ThreadPolicy.Builder()
|
||||
// .detectDiskReads()
|
||||
// .detectDiskWrites().detectAll()
|
||||
// .detectNetwork() // or .detectAll() for all detectable problems
|
||||
// .penaltyLog()
|
||||
// .build())
|
||||
// StrictMode.setVmPolicy(VmPolicy.Builder()
|
||||
// .detectLeakedSqlLiteObjects()
|
||||
// .detectLeakedClosableObjects()
|
||||
// .penaltyLog()
|
||||
// .build())
|
||||
DbManager.initialize(applicationContext)
|
||||
|
||||
registerPlugin(AbsAudioPlayer::class.java)
|
||||
@@ -63,7 +56,47 @@ class MainActivity : BridgeActivity() {
|
||||
super.onCreate(savedInstanceState)
|
||||
Log.d(tag, "onCreate")
|
||||
|
||||
// Update the margins to handle edge-to-edge enforced in SDK 35
|
||||
// See: https://developer.android.com/develop/ui/views/layout/edge-to-edge
|
||||
val webView: WebView = findViewById(R.id.webview)
|
||||
webView.setOnApplyWindowInsetsListener { v, insets ->
|
||||
val (left, top, right, bottom) = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
||||
val sysInsets = insets.getInsets(WindowInsets.Type.systemBars())
|
||||
Log.d(tag, "safe sysInsets: $sysInsets")
|
||||
arrayOf(sysInsets.left, sysInsets.top, sysInsets.right, sysInsets.bottom)
|
||||
} else {
|
||||
arrayOf(
|
||||
insets.systemWindowInsetLeft,
|
||||
insets.systemWindowInsetTop,
|
||||
insets.systemWindowInsetRight,
|
||||
insets.systemWindowInsetBottom
|
||||
)
|
||||
}
|
||||
|
||||
// Inject as CSS variables
|
||||
// NOTE: Possibly able to use in the future to support edge-to-edge better.
|
||||
val js = """
|
||||
document.documentElement.style.setProperty('--safe-area-inset-top', '${top}px');
|
||||
document.documentElement.style.setProperty('--safe-area-inset-bottom', '${bottom}px');
|
||||
document.documentElement.style.setProperty('--safe-area-inset-left', '${left}px');
|
||||
document.documentElement.style.setProperty('--safe-area-inset-right', '${right}px');
|
||||
""".trimIndent()
|
||||
webView.evaluateJavascript(js, null)
|
||||
|
||||
// Set margins
|
||||
v.updateLayoutParams<ViewGroup.MarginLayoutParams> {
|
||||
leftMargin = left
|
||||
bottomMargin = bottom
|
||||
rightMargin = right
|
||||
topMargin = top
|
||||
}
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
||||
WindowInsets.CONSUMED
|
||||
} else {
|
||||
insets
|
||||
}
|
||||
}
|
||||
|
||||
val permission = ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
|
||||
if (permission != PackageManager.PERMISSION_GRANTED) {
|
||||
|
||||
@@ -135,6 +135,7 @@ data class DeviceSettings(
|
||||
var sleepTimerLength: Long, // Time in milliseconds
|
||||
var disableSleepTimerFadeOut: Boolean,
|
||||
var disableSleepTimerResetFeedback: Boolean,
|
||||
var enableSleepTimerAlmostDoneChime: Boolean,
|
||||
var languageCode: String,
|
||||
var downloadUsingCellular: DownloadUsingCellularSetting,
|
||||
var streamingUsingCellular: StreamingUsingCellularSetting,
|
||||
@@ -163,6 +164,7 @@ data class DeviceSettings(
|
||||
autoSleepTimerAutoRewindTime = 300000L, // 5 minutes
|
||||
disableSleepTimerFadeOut = false,
|
||||
disableSleepTimerResetFeedback = false,
|
||||
enableSleepTimerAlmostDoneChime = false,
|
||||
languageCode = "en-us",
|
||||
downloadUsingCellular = DownloadUsingCellularSetting.ALWAYS,
|
||||
streamingUsingCellular = StreamingUsingCellularSetting.ALWAYS,
|
||||
@@ -188,9 +190,9 @@ data class DeviceSettings(
|
||||
|
||||
@JsonIgnore
|
||||
fun getShakeThresholdGravity() : Float { // Used in ShakeDetector
|
||||
return if (shakeSensitivity == ShakeSensitivitySetting.VERY_HIGH) 1.2f
|
||||
else if (shakeSensitivity == ShakeSensitivitySetting.HIGH) 1.4f
|
||||
else if (shakeSensitivity == ShakeSensitivitySetting.MEDIUM) 1.6f
|
||||
return if (shakeSensitivity == ShakeSensitivitySetting.VERY_HIGH) 1.1f
|
||||
else if (shakeSensitivity == ShakeSensitivitySetting.HIGH) 1.3f
|
||||
else if (shakeSensitivity == ShakeSensitivitySetting.MEDIUM) 1.5f
|
||||
else if (shakeSensitivity == ShakeSensitivitySetting.LOW) 2f
|
||||
else if (shakeSensitivity == ShakeSensitivitySetting.VERY_LOW) 2.7f
|
||||
else {
|
||||
|
||||
@@ -5,8 +5,7 @@
|
||||
package com.audiobookshelf.app.data
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties
|
||||
import com.fasterxml.jackson.core.json.JsonReadFeature
|
||||
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
|
||||
import com.fasterxml.jackson.databind.ObjectMapper
|
||||
import com.fasterxml.jackson.module.kotlin.readValue
|
||||
import org.json.JSONObject
|
||||
|
||||
@@ -18,8 +17,7 @@ data class ItemInProgress(
|
||||
val isLocal: Boolean
|
||||
) {
|
||||
companion object {
|
||||
fun makeFromServerObject(serverItem: JSONObject):ItemInProgress {
|
||||
val jacksonMapper = jacksonObjectMapper().enable(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS.mappedFeature())
|
||||
fun makeFromServerObject(serverItem: JSONObject, jacksonMapper: ObjectMapper):ItemInProgress {
|
||||
val libraryItem = jacksonMapper.readValue<LibraryItem>(serverItem.toString())
|
||||
|
||||
var episode:PodcastEpisode? = null
|
||||
|
||||
@@ -34,6 +34,7 @@ object DeviceManager {
|
||||
|
||||
val serverConnectionConfigId get() = serverConnectionConfig?.id ?: ""
|
||||
val serverConnectionConfigName get() = serverConnectionConfig?.name ?: ""
|
||||
val serverConnectionConfigString get() = serverConnectionConfig?.name ?: "No server connection"
|
||||
val serverAddress
|
||||
get() = serverConnectionConfig?.address ?: ""
|
||||
val serverUserId
|
||||
@@ -63,6 +64,10 @@ object DeviceManager {
|
||||
if (deviceData.deviceSettings?.autoSleepTimerAutoRewindTime == null) {
|
||||
deviceData.deviceSettings?.autoSleepTimerAutoRewindTime = 300000L // 5 minutes
|
||||
}
|
||||
// Initialize sleep timer almost done chime added in v0.9.81
|
||||
if (deviceData.deviceSettings?.enableSleepTimerAlmostDoneChime == null) {
|
||||
deviceData.deviceSettings?.enableSleepTimerAlmostDoneChime = false
|
||||
}
|
||||
|
||||
// Language added in v0.9.69
|
||||
if (deviceData.deviceSettings?.languageCode == null) {
|
||||
|
||||
+1
-1
@@ -29,7 +29,7 @@ class InternalDownloadManager(
|
||||
*/
|
||||
@Throws(IOException::class)
|
||||
fun download(url: String) {
|
||||
val request: Request = Request.Builder().url(url).build()
|
||||
val request: Request = Request.Builder().url(url).addHeader("Accept-Encoding", "identity").build()
|
||||
client.newCall(request)
|
||||
.enqueue(
|
||||
object : Callback {
|
||||
|
||||
@@ -1,15 +1,20 @@
|
||||
package com.audiobookshelf.app.managers
|
||||
|
||||
import android.content.Context
|
||||
import android.media.MediaPlayer
|
||||
import android.os.*
|
||||
import android.util.Log
|
||||
import com.audiobookshelf.app.R
|
||||
import com.audiobookshelf.app.device.DeviceManager
|
||||
import com.audiobookshelf.app.player.PlayerNotificationService
|
||||
import com.audiobookshelf.app.player.SLEEP_TIMER_WAKE_UP_EXPIRATION
|
||||
import com.audiobookshelf.app.plugins.AbsLogger
|
||||
import java.util.*
|
||||
import kotlin.concurrent.schedule
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
const val SLEEP_TIMER_CHIME_SOUND_VOLUME = 0.7f
|
||||
|
||||
class SleepTimerManager
|
||||
constructor(private val playerNotificationService: PlayerNotificationService) {
|
||||
private val tag = "SleepTimerManager"
|
||||
@@ -156,6 +161,10 @@ constructor(private val playerNotificationService: PlayerNotificationService) {
|
||||
)
|
||||
}
|
||||
|
||||
if (sleepTimeSecondsRemaining == 30 && sleepTimerElapsed > 1 && DeviceManager.deviceData.deviceSettings?.enableSleepTimerAlmostDoneChime == true) {
|
||||
playChimeSound()
|
||||
}
|
||||
|
||||
if (sleepTimeSecondsRemaining <= 0) {
|
||||
Log.d(tag, "Sleep Timer Pausing Player on Chapter")
|
||||
pause()
|
||||
@@ -263,6 +272,18 @@ constructor(private val playerNotificationService: PlayerNotificationService) {
|
||||
}
|
||||
}
|
||||
|
||||
/** Plays chime sound */
|
||||
private fun playChimeSound() {
|
||||
AbsLogger.info(tag, "playChimeSound: Playing sleep timer chime sound")
|
||||
val ctx = playerNotificationService.getContext()
|
||||
val mediaPlayer = MediaPlayer.create(ctx, R.raw.bell)
|
||||
mediaPlayer.setVolume(SLEEP_TIMER_CHIME_SOUND_VOLUME, SLEEP_TIMER_CHIME_SOUND_VOLUME)
|
||||
mediaPlayer.start()
|
||||
mediaPlayer.setOnCompletionListener {
|
||||
mediaPlayer.release()
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the chapter end time for use in End of Chapter timers. If less than 10 seconds remain in
|
||||
* the chapter, then use the next chapter.
|
||||
|
||||
@@ -136,7 +136,6 @@ class MediaManager(private var apiHandler: ApiHandler, var ctx: Context) {
|
||||
val serverConnConfig = if (DeviceManager.isConnectedToServer) DeviceManager.serverConnectionConfig else DeviceManager.deviceData.getLastServerConnectionConfig()
|
||||
|
||||
if (!DeviceManager.isConnectedToServer || !DeviceManager.checkConnectivity(ctx) || serverConnConfig == null || serverConnConfig.id !== serverConfigIdUsed) {
|
||||
Log.d(tag, "Reset caches")
|
||||
podcastEpisodeLibraryItemMap = mutableMapOf()
|
||||
serverLibraries = listOf()
|
||||
serverLibraryItems = mutableListOf()
|
||||
|
||||
+7
-4
@@ -7,7 +7,6 @@ import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.provider.MediaStore
|
||||
import android.support.v4.media.session.MediaControllerCompat
|
||||
import android.util.Log
|
||||
import com.audiobookshelf.app.BuildConfig
|
||||
import com.audiobookshelf.app.R
|
||||
import com.bumptech.glide.Glide
|
||||
@@ -15,7 +14,7 @@ import com.google.android.exoplayer2.Player
|
||||
import com.google.android.exoplayer2.ui.PlayerNotificationManager
|
||||
import kotlinx.coroutines.*
|
||||
|
||||
class AbMediaDescriptionAdapter constructor(private val controller: MediaControllerCompat, private val playerNotificationService: PlayerNotificationService) : PlayerNotificationManager.MediaDescriptionAdapter {
|
||||
class AbMediaDescriptionAdapter (private val controller: MediaControllerCompat, private val playerNotificationService: PlayerNotificationService) : PlayerNotificationManager.MediaDescriptionAdapter {
|
||||
private val tag = "MediaDescriptionAdapter"
|
||||
|
||||
private var currentIconUri: Uri? = null
|
||||
@@ -36,12 +35,17 @@ class AbMediaDescriptionAdapter constructor(private val controller: MediaControl
|
||||
callback: PlayerNotificationManager.BitmapCallback
|
||||
): Bitmap? {
|
||||
val albumArtUri = controller.metadata.description.iconUri
|
||||
val albumBitmap = controller.metadata.description.iconBitmap
|
||||
|
||||
// For local cover images, bitmap is set in PlayerNotificationService TimelineQueueNavigator.getMediaDescription
|
||||
if (albumBitmap != null) {
|
||||
return albumBitmap
|
||||
}
|
||||
|
||||
return if (currentIconUri != albumArtUri || currentBitmap == null) {
|
||||
// Cache the bitmap for the current audiobook so that successive calls to
|
||||
// `getCurrentLargeIcon` don't cause the bitmap to be recreated.
|
||||
currentIconUri = albumArtUri
|
||||
Log.d(tag, "ART $currentIconUri")
|
||||
|
||||
if (currentIconUri.toString().startsWith("content://")) {
|
||||
currentBitmap = if (Build.VERSION.SDK_INT < 28) {
|
||||
@@ -61,7 +65,6 @@ class AbMediaDescriptionAdapter constructor(private val controller: MediaControl
|
||||
}
|
||||
null
|
||||
}
|
||||
|
||||
} else {
|
||||
currentBitmap
|
||||
}
|
||||
|
||||
@@ -8,7 +8,6 @@ import android.util.Log
|
||||
import android.view.KeyEvent
|
||||
import com.audiobookshelf.app.data.LibraryItemWrapper
|
||||
import com.audiobookshelf.app.data.PodcastEpisode
|
||||
import com.audiobookshelf.app.device.DeviceManager
|
||||
import java.util.*
|
||||
import kotlin.concurrent.schedule
|
||||
|
||||
|
||||
+31
-19
@@ -311,17 +311,20 @@ class PlayerNotificationService : MediaBrowserServiceCompat() {
|
||||
|
||||
val coverUri = currentPlaybackSession!!.getCoverUri(ctx)
|
||||
|
||||
|
||||
var bitmap: Bitmap? = null
|
||||
// Local covers get bitmap
|
||||
// Local covers get bitmap
|
||||
// Note: In Android Auto for local cover images, setting the icon uri to a local path does not work (cover is blank)
|
||||
// so we create and set the bitmap here instead of AbMediaDescriptionAdapter
|
||||
if (currentPlaybackSession!!.localLibraryItem?.coverContentUrl != null) {
|
||||
bitmap =
|
||||
if (Build.VERSION.SDK_INT < 28) {
|
||||
MediaStore.Images.Media.getBitmap(ctx.contentResolver, coverUri)
|
||||
} else {
|
||||
val source: ImageDecoder.Source =
|
||||
ImageDecoder.createSource(ctx.contentResolver, coverUri)
|
||||
ImageDecoder.decodeBitmap(source)
|
||||
}
|
||||
if (Build.VERSION.SDK_INT < 28) {
|
||||
MediaStore.Images.Media.getBitmap(ctx.contentResolver, coverUri)
|
||||
} else {
|
||||
val source: ImageDecoder.Source =
|
||||
ImageDecoder.createSource(ctx.contentResolver, coverUri)
|
||||
ImageDecoder.decodeBitmap(source)
|
||||
}
|
||||
}
|
||||
|
||||
// Fix for local images crashing on Android 11 for specific devices
|
||||
@@ -348,7 +351,7 @@ class PlayerNotificationService : MediaBrowserServiceCompat() {
|
||||
.setTitle(currentPlaybackSession!!.displayTitle)
|
||||
|
||||
bitmap?.let { mediaDescriptionBuilder.setIconBitmap(it) }
|
||||
?: mediaDescriptionBuilder.setIconUri(coverUri)
|
||||
?: mediaDescriptionBuilder.setIconUri(coverUri)
|
||||
|
||||
return mediaDescriptionBuilder.build()
|
||||
}
|
||||
@@ -1106,11 +1109,12 @@ class PlayerNotificationService : MediaBrowserServiceCompat() {
|
||||
// No further calls will be made to other media browsing methods.
|
||||
null
|
||||
} else {
|
||||
Log.d(tag, "Android Auto starting $clientPackageName $clientUid")
|
||||
AbsLogger.info(tag, "onGetRoot: clientPackageName: $clientPackageName, clientUid: $clientUid")
|
||||
isStarted = true
|
||||
|
||||
// Reset cache if no longer connected to server or server changed
|
||||
if (mediaManager.checkResetServerItems()) {
|
||||
AbsLogger.info(tag, "onGetRoot: Reset Android Auto server items cache (${DeviceManager.serverConnectionConfigString})")
|
||||
forceReloadingAndroidAuto = true
|
||||
}
|
||||
|
||||
@@ -1135,7 +1139,7 @@ class PlayerNotificationService : MediaBrowserServiceCompat() {
|
||||
parentMediaId: String,
|
||||
result: Result<MutableList<MediaBrowserCompat.MediaItem>>
|
||||
) {
|
||||
Log.d(tag, "ON LOAD CHILDREN $parentMediaId")
|
||||
AbsLogger.info(tag, "onLoadChildren: parentMediaId: $parentMediaId (${DeviceManager.serverConnectionConfigString})")
|
||||
|
||||
result.detach()
|
||||
|
||||
@@ -1146,7 +1150,6 @@ class PlayerNotificationService : MediaBrowserServiceCompat() {
|
||||
}
|
||||
|
||||
if (parentMediaId == DOWNLOADS_ROOT) { // Load downloads
|
||||
|
||||
val localBooks = DeviceManager.dbManager.getLocalLibraryItems("book")
|
||||
val localPodcasts = DeviceManager.dbManager.getLocalLibraryItems("podcast")
|
||||
val localBrowseItems: MutableList<MediaBrowserCompat.MediaItem> = mutableListOf()
|
||||
@@ -1243,8 +1246,10 @@ class PlayerNotificationService : MediaBrowserServiceCompat() {
|
||||
Log.d(tag, "Trying to initialize browseTree.")
|
||||
if (!this::browseTree.isInitialized || forceReloadingAndroidAuto) {
|
||||
forceReloadingAndroidAuto = false
|
||||
AbsLogger.info(tag, "onLoadChildren: Loading Android Auto items")
|
||||
mediaManager.loadAndroidAutoItems {
|
||||
Log.d(tag, "android auto loaded. Starting browseTree initialize")
|
||||
AbsLogger.info(tag, "onLoadChildren: Loaded Android Auto data, initializing browseTree")
|
||||
|
||||
browseTree =
|
||||
BrowseTree(
|
||||
this,
|
||||
@@ -1260,15 +1265,21 @@ class PlayerNotificationService : MediaBrowserServiceCompat() {
|
||||
MediaBrowserCompat.MediaItem.FLAG_BROWSABLE
|
||||
)
|
||||
}
|
||||
Log.d(tag, "browseTree initialize and android auto loaded")
|
||||
|
||||
result.sendResult(children as MutableList<MediaBrowserCompat.MediaItem>?)
|
||||
firstLoadDone = true
|
||||
if (mediaManager.serverLibraries.isNotEmpty()) {
|
||||
Log.d(tag, "Starting personalization fetch")
|
||||
mediaManager.populatePersonalizedDataForAllLibraries { notifyChildrenChanged("/") }
|
||||
AbsLogger.info(tag, "onLoadChildren: Android Auto fetching personalized data for all libraries")
|
||||
mediaManager.populatePersonalizedDataForAllLibraries {
|
||||
AbsLogger.info(tag, "onLoadChildren: Android Auto loaded personalized data for all libraries")
|
||||
notifyChildrenChanged("/")
|
||||
}
|
||||
|
||||
Log.d(tag, "Initialize inprogress items")
|
||||
mediaManager.initializeInProgressItems { notifyChildrenChanged("/") }
|
||||
AbsLogger.info(tag, "onLoadChildren: Android Auto fetching in progress items")
|
||||
mediaManager.initializeInProgressItems {
|
||||
AbsLogger.info(tag, "onLoadChildren: Android Auto loaded in progress items")
|
||||
notifyChildrenChanged("/")
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -1288,7 +1299,8 @@ class PlayerNotificationService : MediaBrowserServiceCompat() {
|
||||
MediaBrowserCompat.MediaItem.FLAG_BROWSABLE
|
||||
)
|
||||
}
|
||||
Log.d(tag, "browseTree initialize and android auto loaded")
|
||||
|
||||
AbsLogger.info(tag, "onLoadChildren: Android auto data loaded")
|
||||
result.sendResult(children as MutableList<MediaBrowserCompat.MediaItem>?)
|
||||
}
|
||||
} else if (parentMediaId == LIBRARIES_ROOT || parentMediaId == RECENTLY_ROOT) {
|
||||
|
||||
@@ -5,6 +5,7 @@ import android.hardware.SensorEvent
|
||||
import android.hardware.SensorEventListener
|
||||
import android.hardware.SensorManager
|
||||
import com.audiobookshelf.app.device.DeviceManager
|
||||
import com.audiobookshelf.app.plugins.AbsLogger
|
||||
import kotlin.math.sqrt
|
||||
|
||||
class ShakeDetector : SensorEventListener {
|
||||
@@ -46,6 +47,7 @@ class ShakeDetector : SensorEventListener {
|
||||
if (mShakeTimestamp + SHAKE_COUNT_RESET_TIME_MS < now) {
|
||||
mShakeCount = 0
|
||||
}
|
||||
AbsLogger.info("ShakeDetector", "Device shake above threshold ($gForce > $shakeThreshold)")
|
||||
mShakeTimestamp = now
|
||||
mShakeCount++
|
||||
mListener!!.onShake(mShakeCount)
|
||||
|
||||
@@ -29,16 +29,16 @@ class AbsLogger : Plugin() {
|
||||
onLogEmitter = { log:AbsLog ->
|
||||
notifyListeners("onLog", JSObject(jacksonMapper.writeValueAsString(log)))
|
||||
}
|
||||
Log.i("AbsLogger", "Initialize AbsLogger plugin")
|
||||
info("AbsLogger", "load: AbsLogger plugin initialized")
|
||||
}
|
||||
|
||||
companion object {
|
||||
lateinit var onLogEmitter:(log:AbsLog) -> Unit
|
||||
var onLogEmitter:((log:AbsLog) -> Unit)? = null
|
||||
|
||||
fun log(level:String, tag:String, message:String) {
|
||||
val absLog = AbsLog(id = UUID.randomUUID().toString(), tag, level, message, timestamp = System.currentTimeMillis())
|
||||
DeviceManager.dbManager.saveLog(absLog)
|
||||
onLogEmitter(absLog)
|
||||
onLogEmitter?.let { it(absLog) }
|
||||
}
|
||||
fun info(tag:String, message:String) {
|
||||
Log.i("AbsLogger", message)
|
||||
|
||||
@@ -334,8 +334,7 @@ class ApiHandler(var ctx:Context) {
|
||||
val array = it.getJSONArray("libraryItems")
|
||||
for (i in 0 until array.length()) {
|
||||
val jsobj = array.get(i) as JSONObject
|
||||
|
||||
val itemInProgress = ItemInProgress.makeFromServerObject(jsobj)
|
||||
val itemInProgress = ItemInProgress.makeFromServerObject(jsobj, jacksonMapper)
|
||||
items.add(itemInProgress)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
tools:context=".MainActivity">
|
||||
|
||||
<WebView
|
||||
android:id="@+id/webview"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
|
||||
Binary file not shown.
@@ -10,7 +10,7 @@
|
||||
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.NoActionBar">
|
||||
<item name="windowActionBar">false</item>
|
||||
<item name="windowNoTitle">true</item>
|
||||
<item name="android:background">@null</item>
|
||||
<item name="android:background">@color/background_dark</item>
|
||||
<item name="android:statusBarColor">@color/background_dark</item>
|
||||
<item name="android:navigationBarColor">@color/background_dark</item>
|
||||
</style>
|
||||
|
||||
@@ -3,5 +3,5 @@
|
||||
<color name="light_blue_200">#FF81D4FA</color>
|
||||
<color name="light_blue_600">#FF039BE5</color>
|
||||
<color name="light_blue_900">#FF01579B</color>
|
||||
<color name="background_dark">#262626</color>
|
||||
</resources>
|
||||
<color name="background_dark">#232323</color>
|
||||
</resources>
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.DayNight.NoActionBar">
|
||||
<item name="windowActionBar">false</item>
|
||||
<item name="windowNoTitle">true</item>
|
||||
<item name="android:background">@null</item>
|
||||
<item name="android:background">@color/background_dark</item>
|
||||
<item name="android:statusBarColor">@color/background_dark</item>
|
||||
<item name="android:navigationBarColor">@color/background_dark</item>
|
||||
</style>
|
||||
|
||||
@@ -14,7 +14,7 @@ ext {
|
||||
androidx_core_ktx_version = '1.16.0'
|
||||
androidx_media_version = '1.7.0'
|
||||
exoplayer_version = '2.18.7'
|
||||
glide_version = '4.11.0'
|
||||
glide_version = '4.16.0'
|
||||
junit_version = '4.13.2'
|
||||
kotlin_version = '2.1.0'
|
||||
kotlin_coroutines_version = '1.10.1'
|
||||
|
||||
+7
-3
@@ -1,5 +1,5 @@
|
||||
@import "./tailwind.css";
|
||||
@import "./fonts.css";
|
||||
@import './tailwind.css';
|
||||
@import './fonts.css';
|
||||
@import './defaultStyles.css';
|
||||
@import './absicons.css';
|
||||
@import './transitions.css';
|
||||
@@ -61,6 +61,10 @@ textarea {
|
||||
box-shadow: 4px 1px 8px #11111166, -4px 1px 8px #11111166, 1px -4px 8px #11111166;
|
||||
}
|
||||
|
||||
.box-shadow-progressbar {
|
||||
box-shadow: 0px -1px 4px rgb(62, 50, 2, 0.5);
|
||||
}
|
||||
|
||||
.shadow-height {
|
||||
height: calc(100% - 4px);
|
||||
}
|
||||
@@ -164,4 +168,4 @@ Bookshelf Label
|
||||
.tracksTable th {
|
||||
padding: 4px 8px;
|
||||
font-size: 0.75rem;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,10 @@
|
||||
"plugins": {
|
||||
"CapacitorHttp": {
|
||||
"enabled": false
|
||||
},
|
||||
"StatusBar": {
|
||||
"backgroundColor": "#232323",
|
||||
"style": "DARK"
|
||||
}
|
||||
},
|
||||
"server": {
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<a v-if="showBack" @click="back" class="rounded-full h-10 w-10 flex items-center justify-center mr-2 cursor-pointer">
|
||||
<span class="material-symbols text-3xl text-fg">arrow_back</span>
|
||||
</a>
|
||||
<div v-if="user && currentLibrary && socketConnected">
|
||||
<div v-if="user && currentLibrary">
|
||||
<div class="pl-1.5 pr-2.5 py-2 bg-bg bg-opacity-30 rounded-md flex items-center" @click="clickShowLibraryModal">
|
||||
<ui-library-icon :icon="currentLibraryIcon" :size="4" font-size="base" />
|
||||
<p class="text-sm leading-4 ml-2 mt-0.5 max-w-24 truncate">{{ currentLibraryName }}</p>
|
||||
@@ -56,9 +56,6 @@ export default {
|
||||
this.$store.commit('setCastAvailable', val)
|
||||
}
|
||||
},
|
||||
socketConnected() {
|
||||
return this.$store.state.socketConnected
|
||||
},
|
||||
currentLibrary() {
|
||||
return this.$store.getters['libraries/getCurrentLibrary']
|
||||
},
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
</div>
|
||||
|
||||
<!-- No progress shown for collapsed series in library -->
|
||||
<div v-if="!collapsedSeries && (!isPodcast || recentEpisode)" class="absolute bottom-0 left-0 h-1 shadow-sm max-w-full z-10 rounded-b" :class="itemIsFinished ? 'bg-success' : 'bg-yellow-400'" :style="{ width: width * userProgressPercent + 'px' }"></div>
|
||||
<div v-if="!collapsedSeries && (!isPodcast || recentEpisode)" class="absolute bottom-0 left-0 h-1 max-w-full z-10 rounded-b box-shadow-progressbar" :class="itemIsFinished ? 'bg-success' : 'bg-yellow-400'" :style="{ width: width * userProgressPercent + 'px' }"></div>
|
||||
|
||||
<!-- Downloaded icon -->
|
||||
<div v-if="showHasLocalDownload" class="absolute right-0 top-0 z-20" :style="{ top: (isPodcast || (seriesSequence && showSequence) ? 1.75 : 0.375) * sizeMultiplier + 'rem', right: 0.375 * sizeMultiplier + 'rem', padding: `${0.1 * sizeMultiplier}rem ${0.25 * sizeMultiplier}rem` }">
|
||||
@@ -77,12 +77,12 @@
|
||||
</div>
|
||||
|
||||
<!-- Series sequence -->
|
||||
<div v-if="seriesSequence && showSequence && !isSelectionMode" class="absolute rounded-lg bg-black bg-opacity-90 box-shadow-md z-10" :style="{ top: 0.375 * sizeMultiplier + 'rem', right: 0.375 * sizeMultiplier + 'rem', padding: `${0.1 * sizeMultiplier}rem ${0.25 * sizeMultiplier}rem` }">
|
||||
<div v-if="seriesSequence && showSequence && !isSelectionMode" class="absolute rounded-lg bg-black/90 text-white box-shadow-md z-10" :style="{ top: 0.375 * sizeMultiplier + 'rem', right: 0.375 * sizeMultiplier + 'rem', padding: `${0.1 * sizeMultiplier}rem ${0.25 * sizeMultiplier}rem` }">
|
||||
<p :style="{ fontSize: sizeMultiplier * 0.8 + 'rem' }">#{{ seriesSequence }}</p>
|
||||
</div>
|
||||
|
||||
<!-- Podcast Episode # -->
|
||||
<div v-if="recentEpisodeNumber !== null && !isSelectionMode" class="absolute rounded-lg bg-black bg-opacity-90 box-shadow-md z-10" :style="{ top: 0.375 * sizeMultiplier + 'rem', right: 0.375 * sizeMultiplier + 'rem', padding: `${0.1 * sizeMultiplier}rem ${0.25 * sizeMultiplier}rem` }">
|
||||
<div v-if="recentEpisodeNumber !== null && !isSelectionMode" class="absolute rounded-lg bg-black/90 box-shadow-md z-10" :style="{ top: 0.375 * sizeMultiplier + 'rem', right: 0.375 * sizeMultiplier + 'rem', padding: `${0.1 * sizeMultiplier}rem ${0.25 * sizeMultiplier}rem` }">
|
||||
<p class="text-white" :style="{ fontSize: sizeMultiplier * 0.8 + 'rem' }">
|
||||
Episode<span v-if="recentEpisodeNumber"> #{{ recentEpisodeNumber }}</span>
|
||||
</p>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<covers-group-cover v-if="series" ref="cover" :id="seriesId" :name="title" :book-items="books" :width="width" :height="height" :book-cover-aspect-ratio="bookCoverAspectRatio" />
|
||||
</div>
|
||||
|
||||
<div v-if="seriesPercentInProgress > 0" class="absolute bottom-0 left-0 h-1 shadow-sm max-w-full z-10 rounded-b w-full" :class="isSeriesFinished ? 'bg-success' : 'bg-yellow-400'" :style="{ width: seriesPercentInProgress * 100 + '%' }" />
|
||||
<div v-if="seriesPercentInProgress > 0" class="absolute bottom-0 left-0 h-1 max-w-full z-10 rounded-b w-full box-shadow-progressbar" :class="isSeriesFinished ? 'bg-success' : 'bg-yellow-400'" :style="{ width: seriesPercentInProgress * 100 + '%' }" />
|
||||
|
||||
<div v-if="isAltViewEnabled && isCategorized" class="absolute z-30 left-0 right-0 mx-auto -bottom-8 h-8 py-1 rounded-md text-center">
|
||||
<p class="truncate" :style="{ fontSize: labelFontSize + 'rem' }">{{ title }}</p>
|
||||
|
||||
@@ -732,12 +732,12 @@
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = Icons;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 37;
|
||||
CURRENT_PROJECT_VERSION = 38;
|
||||
DEVELOPMENT_TEAM = 7UFJ7D8V6A;
|
||||
INFOPLIST_FILE = App/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
MARKETING_VERSION = 0.9.80;
|
||||
MARKETING_VERSION = 0.9.81;
|
||||
OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\"";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.audiobookshelf.app.dev;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
@@ -756,12 +756,12 @@
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = Icons;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 37;
|
||||
CURRENT_PROJECT_VERSION = 38;
|
||||
DEVELOPMENT_TEAM = 7UFJ7D8V6A;
|
||||
INFOPLIST_FILE = App/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
MARKETING_VERSION = 0.9.80;
|
||||
MARKETING_VERSION = 0.9.81;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.audiobookshelf.app;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "";
|
||||
|
||||
@@ -5,6 +5,10 @@
|
||||
"plugins": {
|
||||
"CapacitorHttp": {
|
||||
"enabled": false
|
||||
},
|
||||
"StatusBar": {
|
||||
"backgroundColor": "#232323",
|
||||
"style": "DARK"
|
||||
}
|
||||
},
|
||||
"server": {
|
||||
|
||||
+10
-10
@@ -1,5 +1,5 @@
|
||||
PODS:
|
||||
- Alamofire (5.8.1)
|
||||
- Alamofire (5.10.2)
|
||||
- Capacitor (7.2.0):
|
||||
- CapacitorCordova
|
||||
- CapacitorApp (7.0.1):
|
||||
@@ -25,11 +25,11 @@ PODS:
|
||||
- Capacitor
|
||||
- CordovaPlugins (6.2.1):
|
||||
- CapacitorCordova
|
||||
- Realm (10.47.0):
|
||||
- Realm/Headers (= 10.47.0)
|
||||
- Realm/Headers (10.47.0)
|
||||
- RealmSwift (10.47.0):
|
||||
- Realm (= 10.47.0)
|
||||
- Realm (10.54.4):
|
||||
- Realm/Headers (= 10.54.4)
|
||||
- Realm/Headers (10.54.4)
|
||||
- RealmSwift (10.54.4):
|
||||
- Realm (= 10.54.4)
|
||||
- WebnativellcCapacitorFilesharer (7.0.4):
|
||||
- Capacitor
|
||||
|
||||
@@ -88,7 +88,7 @@ EXTERNAL SOURCES:
|
||||
:path: "../../node_modules/@webnativellc/capacitor-filesharer"
|
||||
|
||||
SPEC CHECKSUMS:
|
||||
Alamofire: 3ca42e259043ee0dc5c0cdd76c4bc568b8e42af7
|
||||
Alamofire: 7193b3b92c74a07f85569e1a6c4f4237291e7496
|
||||
Capacitor: 106e7a4205f4618d582b886a975657c61179138d
|
||||
CapacitorApp: d63334c052278caf5d81585d80b21905c6f93f39
|
||||
CapacitorBrowser: 081852cf532acf77b9d2953f3a88fe5b9711fb06
|
||||
@@ -102,10 +102,10 @@ SPEC CHECKSUMS:
|
||||
CapacitorPreferences: cbf154e5e5519b7f5ab33817a334dda1e98387f9
|
||||
CapacitorStatusBar: 275cbf2f4dfc00388f519ef80c7ec22edda342c9
|
||||
CordovaPlugins: 5a72a85b45469e68556bb172409f1b6d57b27236
|
||||
Realm: e43fb540ae947497e3ea8a662443256920602060
|
||||
RealmSwift: 8b06ed06b5d16749ae0c4d91c0cba414a9e28189
|
||||
Realm: 8b5cda39a41f17a1734da2f39c6004eb8745587a
|
||||
RealmSwift: 0b4f808fed6898f1f6c26f501f740efd80dff0b4
|
||||
WebnativellcCapacitorFilesharer: 10b111373d4dc49608935600dcbcc14605258c73
|
||||
|
||||
PODFILE CHECKSUM: 498821c0cfa2508609567fa95d7244c01cbef538
|
||||
|
||||
COCOAPODS: 1.12.1
|
||||
COCOAPODS: 1.16.2
|
||||
|
||||
Generated
+2
-2
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "audiobookshelf-app",
|
||||
"version": "0.9.80-beta",
|
||||
"version": "0.9.81-beta",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "audiobookshelf-app",
|
||||
"version": "0.9.80-beta",
|
||||
"version": "0.9.81-beta",
|
||||
"dependencies": {
|
||||
"@capacitor-community/keep-awake": "^7.0.0",
|
||||
"@capacitor-community/volume-buttons": "^7.0.0",
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "audiobookshelf-app",
|
||||
"version": "0.9.80-beta",
|
||||
"version": "0.9.81-beta",
|
||||
"author": "advplyr",
|
||||
"scripts": {
|
||||
"dev": "nuxt --hostname 0.0.0.0 --port 1337",
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
</div>
|
||||
<div class="relative" @click="showFullscreenCover = true">
|
||||
<covers-book-cover :library-item="libraryItem" :width="coverWidth" :book-cover-aspect-ratio="bookCoverAspectRatio" no-bg raw @imageLoaded="coverImageLoaded" />
|
||||
<div v-if="!isPodcast" class="absolute bottom-0 left-0 h-1 shadow-sm z-10" :class="userIsFinished ? 'bg-success' : 'bg-yellow-400'" :style="{ width: coverWidth * progressPercent + 'px' }"></div>
|
||||
<div v-if="!isPodcast" class="absolute bottom-0 left-0 h-1 z-10 box-shadow-progressbar" :class="userIsFinished ? 'bg-success' : 'bg-yellow-400'" :style="{ width: coverWidth * progressPercent + 'px' }"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -100,6 +100,13 @@
|
||||
<p class="pl-4">{{ $strings.LabelDisableVibrateOnReset }}</p>
|
||||
<span class="material-symbols text-xl ml-2" @click.stop="showInfo('disableSleepTimerResetFeedback')">info</span>
|
||||
</div>
|
||||
<div class="flex items-center py-3">
|
||||
<div class="w-10 flex justify-center" @click="toggleSleepTimerAlmostDoneChime">
|
||||
<ui-toggle-switch v-model="settings.enableSleepTimerAlmostDoneChime" @input="saveSettings" />
|
||||
</div>
|
||||
<p class="pl-4">{{ $strings.LabelSleepTimerAlmostDoneChime }}</p>
|
||||
<span class="material-symbols text-xl ml-2" @click.stop="showInfo('enableSleepTimerAlmostDoneChime')">info</span>
|
||||
</div>
|
||||
<div class="flex items-center py-3">
|
||||
<div class="w-10 flex justify-center" @click="toggleAutoSleepTimer">
|
||||
<ui-toggle-switch v-model="settings.autoSleepTimer" @input="saveSettings" />
|
||||
@@ -207,6 +214,7 @@ export default {
|
||||
sleepTimerLength: 900000, // 15 minutes
|
||||
disableSleepTimerFadeOut: false,
|
||||
disableSleepTimerResetFeedback: false,
|
||||
enableSleepTimerAlmostDoneChime: false,
|
||||
autoSleepTimerAutoRewind: false,
|
||||
autoSleepTimerAutoRewindTime: 300000, // 5 minutes
|
||||
languageCode: 'en-us',
|
||||
@@ -234,6 +242,10 @@ export default {
|
||||
name: this.$strings.LabelDisableVibrateOnReset,
|
||||
message: this.$strings.LabelDisableVibrateOnResetHelp
|
||||
},
|
||||
enableSleepTimerAlmostDoneChime: {
|
||||
name: this.$strings.LabelSleepTimerAlmostDoneChime,
|
||||
message: this.$strings.LabelSleepTimerAlmostDoneChimeHelp
|
||||
},
|
||||
autoSleepTimerAutoRewind: {
|
||||
name: this.$strings.LabelAutoSleepTimerAutoRewind,
|
||||
message: this.$strings.LabelAutoSleepTimerAutoRewindHelp
|
||||
@@ -549,6 +561,10 @@ export default {
|
||||
this.settings.disableSleepTimerResetFeedback = !this.settings.disableSleepTimerResetFeedback
|
||||
this.saveSettings()
|
||||
},
|
||||
toggleSleepTimerAlmostDoneChime() {
|
||||
this.settings.enableSleepTimerAlmostDoneChime = !this.settings.enableSleepTimerAlmostDoneChime
|
||||
this.saveSettings()
|
||||
},
|
||||
toggleDisableAutoRewind() {
|
||||
this.settings.disableAutoRewind = !this.settings.disableAutoRewind
|
||||
this.saveSettings()
|
||||
@@ -620,6 +636,7 @@ export default {
|
||||
this.settings.sleepTimerLength = !isNaN(deviceSettings.sleepTimerLength) ? deviceSettings.sleepTimerLength : 900000 // 15 minutes
|
||||
this.settings.disableSleepTimerFadeOut = !!deviceSettings.disableSleepTimerFadeOut
|
||||
this.settings.disableSleepTimerResetFeedback = !!deviceSettings.disableSleepTimerResetFeedback
|
||||
this.settings.enableSleepTimerAlmostDoneChime = !!deviceSettings.enableSleepTimerAlmostDoneChime
|
||||
|
||||
this.settings.autoSleepTimerAutoRewind = !!deviceSettings.autoSleepTimerAutoRewind
|
||||
this.settings.autoSleepTimerAutoRewindTime = !isNaN(deviceSettings.autoSleepTimerAutoRewindTime) ? deviceSettings.autoSleepTimerAutoRewindTime : 300000 // 5 minutes
|
||||
|
||||
@@ -16,12 +16,6 @@ if (Capacitor.getPlatform() != 'web') {
|
||||
await StatusBar.setStyle({ style: Style.Dark })
|
||||
}
|
||||
setStatusBarStyleDark()
|
||||
|
||||
const setStatusBarOverlays = async () => {
|
||||
// Defaults to true in capacitor v7
|
||||
await StatusBar.setOverlaysWebView({ overlay: false })
|
||||
}
|
||||
setStatusBarOverlays()
|
||||
}
|
||||
|
||||
Vue.prototype.$showHideStatusBar = async (show) => {
|
||||
|
||||
+66
-1
@@ -179,5 +179,70 @@
|
||||
"LabelLockPlayer": "قفل المشغل",
|
||||
"LabelLow": "منخفض",
|
||||
"LabelMediaType": "نوع الوسائط",
|
||||
"LabelMedium": "متوسط"
|
||||
"LabelMedium": "متوسط",
|
||||
"LabelMissing": "مفقود",
|
||||
"LabelMore": "أكثر",
|
||||
"LabelMoreInfo": "معلومات أكثر",
|
||||
"LabelName": "الاسم",
|
||||
"LabelNarrator": "الراوي",
|
||||
"LabelNarrators": "الرواة",
|
||||
"LabelNavigateWithVolume": "التنقل بمفاتيح التحكم بالصوت",
|
||||
"LabelNavigateWithVolumeMirrored": "معكوس",
|
||||
"LabelNavigateWithVolumeWhilePlaying": "السماح لمفاتيح التحكم بالصوت بالتنقل أثناء التشغيل",
|
||||
"LabelNavigateWithVolumeWhilePlayingDisabled": "إيقاف",
|
||||
"LabelNavigateWithVolumeWhilePlayingEnabled": "تشغيل",
|
||||
"LabelNever": "أبداً",
|
||||
"LabelNewestAuthors": "أجدد المؤلفين",
|
||||
"LabelNewestEpisodes": "أجدد الحلقات",
|
||||
"LabelNo": "لا",
|
||||
"LabelNotFinished": "لم يتم الانتهاء",
|
||||
"LabelNotStarted": "لم يتم البدء",
|
||||
"LabelNumEpisodes": "{0} حلقات",
|
||||
"LabelNumEpisodesIncomplete": "{0} حلقات، {1} غير مكتمل",
|
||||
"LabelNumberOfEpisodes": "# من الحلقات",
|
||||
"LabelOff": "ايقاف",
|
||||
"LabelOn": "تشغيل",
|
||||
"LabelPassword": "كلمة المرور",
|
||||
"LabelPath": "مسار",
|
||||
"LabelPlaybackDirect": "مباشر",
|
||||
"LabelPlaybackLocal": "محلي",
|
||||
"LabelPlaybackSpeed": "سرعة التشغيل",
|
||||
"LabelPlaybackTranscode": "تحويل الترميز",
|
||||
"LabelPodcast": "مدونة صوتية",
|
||||
"LabelPodcasts": "مدونات صوتية",
|
||||
"LabelPreventIndexing": "منع فهرسة تغذيتك بواسطة دليل آيتونز وقوقل بودكاست",
|
||||
"LabelProgress": "تقدم",
|
||||
"LabelPubDate": "تاريخ النشر",
|
||||
"LabelPublishYear": "سنة النشر",
|
||||
"LabelPublishedDate": "منشور {0}",
|
||||
"LabelRSSFeedCustomOwnerEmail": "البريد الالكتروني المخصص للمالك",
|
||||
"LabelRSSFeedCustomOwnerName": "الاسم المخصص للمالك",
|
||||
"LabelRSSFeedPreventIndexing": "منع الفهرسة",
|
||||
"LabelRSSFeedSlug": "رابط تغذية RSS",
|
||||
"LabelRandomly": "عشوائياً",
|
||||
"LabelRead": "اقرأ",
|
||||
"LabelReadAgain": "اقرأ مرة أخرى",
|
||||
"LabelRecentSeries": "المسلسلات الحديثة",
|
||||
"LabelRecentlyAdded": "المضافة حديثاً",
|
||||
"LabelRemoveFromPlaylist": "إزالة من قائمة التشغيل",
|
||||
"LabelScaleElapsedTimeBySpeed": "تعديل الوقت المنصرم حسب السرعة",
|
||||
"LabelSeason": "الموسم",
|
||||
"LabelSelectADevice": "اختيار جهاز",
|
||||
"LabelSequenceAscending": "تسلسل تصاعدي",
|
||||
"LabelSequenceDescending": "تسلسل تنازلي",
|
||||
"LabelSeries": "المسلسلات",
|
||||
"LabelServerAddress": "عنوان الخادم",
|
||||
"LabelSetEbookAsPrimary": "تعيين كرئيسي",
|
||||
"LabelSetEbookAsSupplementary": "تعيين كتكميلي",
|
||||
"LabelShakeSensitivity": "حساسية الرج",
|
||||
"LabelShowAll": "اظهار الكل",
|
||||
"LabelSize": "الحجم",
|
||||
"LabelSleepTimer": "مؤقت النوم",
|
||||
"LabelSleepTimerAlmostDoneChime": "تشغيل نغمة عند اقتراب النهاية",
|
||||
"LabelSleepTimerAlmostDoneChimeHelp": "تشغيل نغمة عندما يتبقى 30 ثانية على مؤقت النوم",
|
||||
"LabelStart": "ابدأ",
|
||||
"LabelStartTime": "وقت البدء",
|
||||
"LabelStatsBestDay": "أفضل يوم",
|
||||
"LabelStatsDailyAverage": "المتوسط اليومي",
|
||||
"LabelStatsDays": "أيام"
|
||||
}
|
||||
|
||||
+23
-12
@@ -1,19 +1,20 @@
|
||||
{
|
||||
"ButtonAdd": "Afegir",
|
||||
"ButtonAddNewServer": "Afegir un nou servidor",
|
||||
"ButtonAdd": "Afegeix",
|
||||
"ButtonAddNewServer": "Afegeix un servidor nou",
|
||||
"ButtonAuthors": "Autors",
|
||||
"ButtonBack": "Enrere",
|
||||
"ButtonCancel": "Cancel·lar",
|
||||
"ButtonCancelTimer": "Cancel·lar el temporitzador",
|
||||
"ButtonClearFilter": "Eliminar filtres",
|
||||
"ButtonCloseFeed": "Tancar font",
|
||||
"ButtonCancel": "Cancel·la",
|
||||
"ButtonCancelTimer": "Cancel·la el temporitzador",
|
||||
"ButtonClearFilter": "Neteja el filtre",
|
||||
"ButtonClearLogs": "Neteja els registres",
|
||||
"ButtonCloseFeed": "Tanca el canal",
|
||||
"ButtonCollections": "Col·leccions",
|
||||
"ButtonConnect": "Connectar",
|
||||
"ButtonConnectToServer": "Connectar al servidor",
|
||||
"ButtonCreate": "Crear",
|
||||
"ButtonConnect": "Connecta",
|
||||
"ButtonConnectToServer": "Connecta al servidor",
|
||||
"ButtonCreate": "Crea",
|
||||
"ButtonCreateBookmark": "Crear marcador",
|
||||
"ButtonCreateNewPlaylist": "Crear una nova llista de reproducció",
|
||||
"ButtonDelete": "Eliminar",
|
||||
"ButtonDelete": "Suprimeix",
|
||||
"ButtonDeleteLocalEpisode": "Esborrar episodi local",
|
||||
"ButtonDeleteLocalFile": "Esborrar fitxer local",
|
||||
"ButtonDeleteLocalItem": "Esborrar element local",
|
||||
@@ -26,7 +27,9 @@
|
||||
"ButtonLatest": "Últims",
|
||||
"ButtonLibrary": "Biblioteca",
|
||||
"ButtonLocalMedia": "Mitjans locals",
|
||||
"ButtonLogs": "Registres",
|
||||
"ButtonManageLocalFiles": "Gestionar fitxers locals",
|
||||
"ButtonMaskServerAddress": "Emmascara l'adreça del servidor",
|
||||
"ButtonNewFolder": "Nova carpeta",
|
||||
"ButtonNextEpisode": "Pròxim episodi",
|
||||
"ButtonOk": "D’acord",
|
||||
@@ -50,6 +53,7 @@
|
||||
"ButtonStream": "En directe",
|
||||
"ButtonSubmit": "Enviar",
|
||||
"ButtonSwitchServerUser": "Canviar servidor/usuari",
|
||||
"ButtonUnmaskServerAddress": "Desemmascara l'adreça del servidor",
|
||||
"ButtonUserStats": "Estadístiques de l'usuari",
|
||||
"ButtonYes": "Sí",
|
||||
"HeaderAccount": "Compte",
|
||||
@@ -88,7 +92,7 @@
|
||||
"HeaderTableOfContents": "Sumari",
|
||||
"HeaderUserInterfaceSettings": "Paràmetres de la interfície d'usuari",
|
||||
"HeaderYourStats": "Les vostres estadístiques",
|
||||
"LabelAddToPlaylist": "Afegit a la llista de reproducció",
|
||||
"LabelAddToPlaylist": "Afegeix a la llista de reproducció",
|
||||
"LabelAddedAt": "Afegit a",
|
||||
"LabelAddedDate": "Afegits {0}",
|
||||
"LabelAll": "Tots",
|
||||
@@ -142,6 +146,7 @@
|
||||
"LabelEpisode": "Episodi",
|
||||
"LabelFeedURL": "Font URL",
|
||||
"LabelFile": "Fitxer",
|
||||
"LabelFileBirthtime": "Fitxer creat a",
|
||||
"LabelFileModified": "Fitxer modificat",
|
||||
"LabelFilename": "Nom del fitxer",
|
||||
"LabelFinished": "Acabat",
|
||||
@@ -194,6 +199,7 @@
|
||||
"LabelPlaybackSpeed": "Velocitat de reproducció",
|
||||
"LabelPodcast": "Pòdcast",
|
||||
"LabelPodcasts": "Pòdcasts",
|
||||
"LabelPreventIndexing": "Evita que el vostre canal l'indexin els directoris de pòdcasts de l'iTunes i Google",
|
||||
"LabelProgress": "Progrés",
|
||||
"LabelPubDate": "Data de publicació",
|
||||
"LabelPublishYear": "Any de publicació",
|
||||
@@ -242,6 +248,7 @@
|
||||
"MessageDownloadCompleteProcessing": "S'ha completat la baixada. S'està processant...",
|
||||
"MessageDownloading": "S'està baixant...",
|
||||
"MessageDownloadingEpisode": "S'està baixant l'episodi",
|
||||
"MessageFeedURLWillBe": "L'URL del canal serà {0}",
|
||||
"MessageFetching": "S'està recuperant...",
|
||||
"MessageFollowTheProjectOnGithub": "Seguiu el projecte al GitHub",
|
||||
"MessageLoading": "S'està carregant...",
|
||||
@@ -254,15 +261,19 @@
|
||||
"MessageNoItems": "Cap element",
|
||||
"MessageNoItemsFound": "Cap element trobat",
|
||||
"MessageNoListeningSessions": "Cap sessió d'escolta",
|
||||
"MessageNoLogs": "Cap registre",
|
||||
"MessageNoMediaFolders": "Cap carpeta multimèdia",
|
||||
"MessageNoNetworkConnection": "Cap connexió de xarxa",
|
||||
"MessageNoPodcastsFound": "No s'ha trobat cap pòdcast",
|
||||
"MessageNoSeries": "Cap sèrie",
|
||||
"MessageNoUpdatesWereNecessary": "No calia cap actualització",
|
||||
"MessageNoUserPlaylists": "No teniu cap llista de reproducció",
|
||||
"MessagePodcastSearchField": "Introduïu el terme de cerca o l'URL del canal RSS",
|
||||
"ToastItemMarkedAsFinishedFailed": "No s'ha pogut marcar com a finalitzat",
|
||||
"ToastItemMarkedAsNotFinishedFailed": "No s'ha pogut marcar com a no finalitzat",
|
||||
"ToastPlaylistCreateFailed": "No s'ha pogut crear la llista de reproducció",
|
||||
"ToastPodcastCreateFailed": "No s'ha pogut crear el pòdcast",
|
||||
"ToastPodcastCreateSuccess": "S'ha creat el pòdcast correctament"
|
||||
"ToastPodcastCreateSuccess": "S'ha creat el pòdcast correctament",
|
||||
"ToastRSSFeedCloseFailed": "No s'ha pogut tancar el canal RSS",
|
||||
"ToastRSSFeedCloseSuccess": "Canal RSS tancat"
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
"ButtonCancel": "Zrušit",
|
||||
"ButtonCancelTimer": "Zrušit časovač",
|
||||
"ButtonClearFilter": "Vymazat filtr",
|
||||
"ButtonClearLogs": "Vyčistit logy",
|
||||
"ButtonCloseFeed": "Zavřít kanál",
|
||||
"ButtonCollections": "Kolekce",
|
||||
"ButtonConnect": "Připojit",
|
||||
@@ -28,6 +29,7 @@
|
||||
"ButtonLocalMedia": "Místní média",
|
||||
"ButtonLogs": "Záznamy",
|
||||
"ButtonManageLocalFiles": "Spravovat místní soubory",
|
||||
"ButtonMaskServerAddress": "Skrýt adresu serveru",
|
||||
"ButtonNewFolder": "Nová složka",
|
||||
"ButtonNextEpisode": "Další epizoda",
|
||||
"ButtonOk": "Ok",
|
||||
@@ -51,6 +53,7 @@
|
||||
"ButtonStream": "Streamovat",
|
||||
"ButtonSubmit": "Odeslat",
|
||||
"ButtonSwitchServerUser": "Přepnout server/uživatele",
|
||||
"ButtonUnmaskServerAddress": "Odkrýt adresu serveru",
|
||||
"ButtonUserStats": "Statistiky uživatele",
|
||||
"ButtonYes": "Ano",
|
||||
"HeaderAccount": "Účet",
|
||||
@@ -238,6 +241,8 @@
|
||||
"LabelShowAll": "Zobrazit vše",
|
||||
"LabelSize": "Velikost",
|
||||
"LabelSleepTimer": "Spánek po",
|
||||
"LabelSleepTimerAlmostDoneChime": "Přehrát zvukové upozornění téměř před dokončením",
|
||||
"LabelSleepTimerAlmostDoneChimeHelp": "Přehrát zvukové upozornění 30 sekund před uplynutím časovače spánku",
|
||||
"LabelStart": "Spustit",
|
||||
"LabelStartTime": "Od",
|
||||
"LabelStatsBestDay": "Nejlepší den",
|
||||
@@ -311,6 +316,7 @@
|
||||
"MessageNoItems": "Žádné položky",
|
||||
"MessageNoItemsFound": "Nebyly nalezeny žádné položky",
|
||||
"MessageNoListeningSessions": "Žádné poslechové relace",
|
||||
"MessageNoLogs": "Žádné logy",
|
||||
"MessageNoMediaFolders": "Žádné složky médií",
|
||||
"MessageNoNetworkConnection": "Žádné připojení k síti",
|
||||
"MessageNoPodcastsFound": "Nebyly nalezeny žádné podcasty",
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
"ButtonCancel": "Abbrechen",
|
||||
"ButtonCancelTimer": "Timer abbrechen",
|
||||
"ButtonClearFilter": "Filter löschen",
|
||||
"ButtonClearLogs": "Protokolle löschen",
|
||||
"ButtonCloseFeed": "Feed schließen",
|
||||
"ButtonCollections": "Sammlungen",
|
||||
"ButtonConnect": "Verbinden",
|
||||
@@ -28,6 +29,7 @@
|
||||
"ButtonLocalMedia": "Lokale Medien",
|
||||
"ButtonLogs": "Protokolle",
|
||||
"ButtonManageLocalFiles": "Verwalte lokale Dateien",
|
||||
"ButtonMaskServerAddress": "Server Adresse verstecken",
|
||||
"ButtonNewFolder": "Neuer Ordner",
|
||||
"ButtonNextEpisode": "Nächste Episode",
|
||||
"ButtonOk": "Einverstanden",
|
||||
@@ -51,6 +53,7 @@
|
||||
"ButtonStream": "Streamen",
|
||||
"ButtonSubmit": "Ok",
|
||||
"ButtonSwitchServerUser": "Wechsle Server/Benutzer",
|
||||
"ButtonUnmaskServerAddress": "Server Adresse anzeigen",
|
||||
"ButtonUserStats": "Nutzerstatistiken",
|
||||
"ButtonYes": "Ja",
|
||||
"HeaderAccount": "Konto",
|
||||
@@ -238,6 +241,8 @@
|
||||
"LabelShowAll": "Alles anzeigen",
|
||||
"LabelSize": "Größe",
|
||||
"LabelSleepTimer": "Schlummerfunktion",
|
||||
"LabelSleepTimerAlmostDoneChime": "Spiel ein Ton kurz vor dem Ende",
|
||||
"LabelSleepTimerAlmostDoneChimeHelp": "Spiel ein Ton wenn 30 Sekunden auf dem Timer verbleiben",
|
||||
"LabelStart": "Start",
|
||||
"LabelStartTime": "Startzeit",
|
||||
"LabelStatsBestDay": "Bester Tag",
|
||||
@@ -311,6 +316,7 @@
|
||||
"MessageNoItems": "Keine Medien",
|
||||
"MessageNoItemsFound": "Keine Medien gefunden",
|
||||
"MessageNoListeningSessions": "Keine Hörsitzungen",
|
||||
"MessageNoLogs": "Keine Protokolle vorhanden",
|
||||
"MessageNoMediaFolders": "Keine Medien Ordner",
|
||||
"MessageNoNetworkConnection": "Keine Netzwerkverbindung",
|
||||
"MessageNoPodcastsFound": "Keine Podcasts gefunden",
|
||||
|
||||
@@ -241,6 +241,8 @@
|
||||
"LabelShowAll": "Show All",
|
||||
"LabelSize": "Size",
|
||||
"LabelSleepTimer": "Sleep timer",
|
||||
"LabelSleepTimerAlmostDoneChime": "Play a chime when almost finished",
|
||||
"LabelSleepTimerAlmostDoneChimeHelp": "Play a chime when the sleep timer has 30 seconds remaining",
|
||||
"LabelStart": "Start",
|
||||
"LabelStartTime": "Start time",
|
||||
"LabelStatsBestDay": "Best Day",
|
||||
|
||||
+42
-32
@@ -6,6 +6,7 @@
|
||||
"ButtonCancel": "Cancelar",
|
||||
"ButtonCancelTimer": "Cancelar temporizador",
|
||||
"ButtonClearFilter": "Quitar filtros",
|
||||
"ButtonClearLogs": "Vaciar registros",
|
||||
"ButtonCloseFeed": "Cerrar suministro",
|
||||
"ButtonCollections": "Colecciones",
|
||||
"ButtonConnect": "Conectar",
|
||||
@@ -26,7 +27,9 @@
|
||||
"ButtonLatest": "Más recientes",
|
||||
"ButtonLibrary": "Biblioteca",
|
||||
"ButtonLocalMedia": "Medios locales",
|
||||
"ButtonLogs": "Registros",
|
||||
"ButtonManageLocalFiles": "Gestionar archivos locales",
|
||||
"ButtonMaskServerAddress": "Enmascarar dirección de servidor",
|
||||
"ButtonNewFolder": "Carpeta nueva",
|
||||
"ButtonNextEpisode": "Próximo episodio",
|
||||
"ButtonOk": "Aceptar",
|
||||
@@ -50,6 +53,7 @@
|
||||
"ButtonStream": "En directo",
|
||||
"ButtonSubmit": "Enviar",
|
||||
"ButtonSwitchServerUser": "Cambiar servidor/usuario",
|
||||
"ButtonUnmaskServerAddress": "Desenmascarar dirección de servidor",
|
||||
"ButtonUserStats": "Estadísticas de usuario",
|
||||
"ButtonYes": "Sí",
|
||||
"HeaderAccount": "Cuenta",
|
||||
@@ -137,7 +141,7 @@
|
||||
"LabelEbooks": "Libros electrónicos",
|
||||
"LabelEnable": "Activar",
|
||||
"LabelEnableMp3IndexSeeking": "Activar la búsqueda de índices mp3",
|
||||
"LabelEnableMp3IndexSeekingHelp": "Esta configuración solo debe habilitarse si tienes archivos mp3 que no se están buscando correctamente. La búsqueda inexacta probablemente se deba a archivos MP3 de tasa de bits variable (VBR). Esta configuración forzará la búsqueda de índice, en la que se construye un mapeo de tiempo a bytes mientras se lee el archivo. En algunos casos, con archivos MP3 grandes, puede haber un retraso al buscar hacia el final del archivo.",
|
||||
"LabelEnableMp3IndexSeekingHelp": "Esta configuración solo debe activarse si tiene archivos MP3 en los que no se puede buscar correctamente. La búsqueda inexacta probablemente se deba a archivos MP3 con tasas de bits variables (VBR). Esta configuración forzará la búsqueda de índice, en la que se construye una asignación de tiempo a bytes mientras se lee el archivo. En algunos casos, con archivos MP3 grandes, puede haber un retraso al buscar hacia el final del archivo.",
|
||||
"LabelEnd": "Fin",
|
||||
"LabelEndOfChapter": "Fin del capítulo",
|
||||
"LabelEndTime": "Hora de finalización",
|
||||
@@ -223,31 +227,33 @@
|
||||
"LabelReadAgain": "Volver a leer",
|
||||
"LabelRecentSeries": "Series recientes",
|
||||
"LabelRecentlyAdded": "Añadidos recientemente",
|
||||
"LabelRemoveFromPlaylist": "Eliminar de la Lista de Reproducción",
|
||||
"LabelRemoveFromPlaylist": "Quitar de la lista de reproducción",
|
||||
"LabelScaleElapsedTimeBySpeed": "Escala el tiempo transcurrido según la velocidad",
|
||||
"LabelSeason": "Temporada",
|
||||
"LabelSelectADevice": "Selecciona un dispositivo",
|
||||
"LabelSequenceAscending": "Secuencia Ascendente",
|
||||
"LabelSequenceDescending": "Secuencia Descendente",
|
||||
"LabelSelectADevice": "Seleccione un dispositivo",
|
||||
"LabelSequenceAscending": "Secuencia ascendente",
|
||||
"LabelSequenceDescending": "Secuencia descendente",
|
||||
"LabelSeries": "Serie",
|
||||
"LabelServerAddress": "Dirección del servidor",
|
||||
"LabelSetEbookAsPrimary": "Establecer como primario",
|
||||
"LabelSetEbookAsSupplementary": "Establecer como suplementario",
|
||||
"LabelShakeSensitivity": "Sensibilidad a la sacudida",
|
||||
"LabelShowAll": "Mostrar Todos",
|
||||
"LabelShowAll": "Mostrar todo",
|
||||
"LabelSize": "Tamaño",
|
||||
"LabelSleepTimer": "Temporizador de apagado",
|
||||
"LabelSleepTimerAlmostDoneChime": "Timbrar casi al terminar",
|
||||
"LabelSleepTimerAlmostDoneChimeHelp": "Reproducir una señal acústica cuando queden 30 segundos en el temporizador",
|
||||
"LabelStart": "Iniciar",
|
||||
"LabelStartTime": "Tiempo de Inicio",
|
||||
"LabelStatsBestDay": "Mejor Día",
|
||||
"LabelStatsDailyAverage": "Promedio Diario",
|
||||
"LabelStartTime": "Tiempo de inicio",
|
||||
"LabelStatsBestDay": "Mejor día",
|
||||
"LabelStatsDailyAverage": "Promedio diario",
|
||||
"LabelStatsDays": "Días",
|
||||
"LabelStatsDaysListened": "Días Escuchando",
|
||||
"LabelStatsDaysListened": "Días escuchando",
|
||||
"LabelStatsInARow": "seguidos",
|
||||
"LabelStatsItemsFinished": "Elementos Terminados",
|
||||
"LabelStatsItemsFinished": "Elementos terminados",
|
||||
"LabelStatsMinutes": "minutos",
|
||||
"LabelStatsMinutesListening": "Minutos Escuchando",
|
||||
"LabelStatsWeekListening": "Tiempo escuchando en la Semana",
|
||||
"LabelStatsMinutesListening": "Minutos escuchando",
|
||||
"LabelStatsWeekListening": "Tiempo escuchando en la semana",
|
||||
"LabelStreamingUsingCellular": "Streaming por móvil",
|
||||
"LabelTag": "Etiqueta",
|
||||
"LabelTags": "Etiquetas",
|
||||
@@ -263,14 +269,14 @@
|
||||
"LabelType": "Tipo",
|
||||
"LabelUnknown": "Desconocido",
|
||||
"LabelUnlockPlayer": "Desbloquear reproductor",
|
||||
"LabelUseBookshelfView": "Usar la Vista de Estantería",
|
||||
"LabelUseBookshelfView": "Usar vista de estantería",
|
||||
"LabelUser": "Usuario",
|
||||
"LabelUsername": "Nombre de Usuario",
|
||||
"LabelVeryHigh": "Muy Alto",
|
||||
"LabelVeryLow": "Muy Bajo",
|
||||
"LabelYearReviewHide": "Ocultar Resumen del año",
|
||||
"LabelYearReviewShow": "Resumen del año",
|
||||
"LabelYourBookmarks": "Tus Marcadores",
|
||||
"LabelUsername": "Nombre de usuario",
|
||||
"LabelVeryHigh": "Muy alto",
|
||||
"LabelVeryLow": "Muy bajo",
|
||||
"LabelYearReviewHide": "Ocultar resumen del año",
|
||||
"LabelYearReviewShow": "Ver resumen del año",
|
||||
"LabelYourBookmarks": "Sus marcadores",
|
||||
"LabelYourProgress": "Su progreso",
|
||||
"MessageAndroid10Downloads": "Android 10 e inferiores utilizarán el almacenamiento interno de aplicaciones para las descargas.",
|
||||
"MessageAttemptingServerConnection": "Intentando conectar con el servidor...",
|
||||
@@ -279,46 +285,50 @@
|
||||
"MessageBookshelfEmpty": "Estantería vacía",
|
||||
"MessageConfirmDeleteLocalEpisode": "¿Quiere eliminar el episodio local «{0}» del dispositivo? El archivo en el servidor no se verá afectado.",
|
||||
"MessageConfirmDeleteLocalFiles": "¿Quiere quitar los archivos locales de este elemento del dispositivo? Los archivos del servidor y su progreso no se verán afectados.",
|
||||
"MessageConfirmDisableAutoTimer": "¿Confirma que quiere desactivar el temporizador automático por el resto del día? El temporizador volverá a activarse al final de este periodo de temporizador de apagado automático, o si reinicia la aplicación.",
|
||||
"MessageConfirmDiscardProgress": "¿Confirma que quiere restablecer su progreso?",
|
||||
"MessageConfirmDownloadUsingCellular": "Estas a punto de realizar una descarga utilizando datos móviles. Esto puede incluir cargos de datos del operador. ¿Deseas continuar?",
|
||||
"MessageConfirmDownloadUsingCellular": "Está a punto de efectuar una descarga con datos móviles. Esto puede conllevar tarifas de datos de la operadora. ¿Quiere continuar?",
|
||||
"MessageConfirmMarkAsFinished": "¿Confirma que quiere marcar este elemento como terminado?",
|
||||
"MessageConfirmRemoveBookmark": "¿Confirma que quiere quitar el marcador?",
|
||||
"MessageConfirmStreamingUsingCellular": "Estás a punto de hacer streaming utilizando datos móviles. Esto puede incluir cargos de datos del operador. ¿Deseas continuar?",
|
||||
"MessageConfirmStreamingUsingCellular": "Está a punto de hacer una transmisión con datos móviles. Esto puede conllevar tarifas de datos de la operadora. ¿Quiere continuar?",
|
||||
"MessageDiscardProgress": "Descartar progreso",
|
||||
"MessageDownloadCompleteProcessing": "Descarga Completada. Procesando...",
|
||||
"MessageDownloadCompleteProcessing": "Descarga completada. Procesando...",
|
||||
"MessageDownloading": "Descargando...",
|
||||
"MessageDownloadingEpisode": "Descargando episodio",
|
||||
"MessageEpisodesQueuedForDownload": "{0} Episodio(s) en cola para descargar",
|
||||
"MessageEpisodesQueuedForDownload": "{0} episodio(s) en cola para descargar",
|
||||
"MessageFeedURLWillBe": "El URL del suministro será {0}",
|
||||
"MessageFetching": "Buscando...",
|
||||
"MessageFollowTheProjectOnGithub": "Sigue el proyecto en GitHub",
|
||||
"MessageFetching": "Recuperando...",
|
||||
"MessageFollowTheProjectOnGithub": "Siga el proyecto en GitHub",
|
||||
"MessageItemDownloadCompleteFailedToCreate": "Se ha completado la descarga del elemento, pero no se ha podido crear el elemento de la biblioteca",
|
||||
"MessageItemMissing": "Falta un elemento y debe corregirse en el servidor. Normalmente, un elemento se marca como faltante porque no se puede acceder a las rutas de los archivos.",
|
||||
"MessageLoading": "Cargando...",
|
||||
"MessageLoadingServerData": "Cargando datos del servidor...",
|
||||
"MessageLocalFolderDescription": "Solo se puede acceder al «Almacenamiento interno de la aplicación» a través de esta aplicación. Esta aplicación solo admite multimedia descargada directamente a través de ella. Las carpetas de almacenamiento compartido se pueden utilizar para permitir que otras aplicaciones accedan a los archivos descargados por esta aplicación.",
|
||||
"MessageMarkAsFinished": "Marcar como terminado",
|
||||
"MessageMediaLinkedToADifferentServer": "El contenido está vinculado a un servidor de Audiobookshelf en una dirección diferente ({0}). El progreso se sincronizará cuando se conecte a esta dirección de servidor.",
|
||||
"MessageMediaLinkedToADifferentUser": "El contenido está vinculado a este servidor pero fue descargado por otro usuario. El progreso solo se sincronizará con el usuario que lo descargó.",
|
||||
"MessageMediaLinkedToServer": "Vinculado al servidor {0}",
|
||||
"MessageMediaLinkedToServer": "Enlazado al servidor {0}",
|
||||
"MessageMediaLinkedToThisServer": "El contenido descargado está vinculado a este servidor",
|
||||
"MessageMediaNotLinkedToServer": "El contenido multimedia no está vinculado a un servidor de Audiobookshelf. No se sincronizará ningún progreso.",
|
||||
"MessageNoBookmarks": "Sin marcadores",
|
||||
"MessageNoChapters": "Sin capítulos",
|
||||
"MessageNoCollections": "Sin colecciones",
|
||||
"MessageNoItems": "Sin elementos",
|
||||
"MessageNoItems": "Ningún elemento",
|
||||
"MessageNoItemsFound": "Ningún elemento encontrado",
|
||||
"MessageNoListeningSessions": "Ninguna sesión escuchada",
|
||||
"MessageNoListeningSessions": "Ninguna sesión de escucha",
|
||||
"MessageNoLogs": "Ningún registro",
|
||||
"MessageNoMediaFolders": "Sin carpetas multimedia",
|
||||
"MessageNoNetworkConnection": "Sin conexión de red",
|
||||
"MessageNoPodcastsFound": "No se encontró ningún pódcast",
|
||||
"MessageNoSeries": "Ninguna serie",
|
||||
"MessageNoUpdatesWereNecessary": "No fue necesario actualizar",
|
||||
"MessageNoUserPlaylists": "No tiene ninguna lista de reproducción",
|
||||
"MessageOldServerConnectionWarning": "La configuración de la conexión al servidor está utilizando un ID de usuario antiguo. Por favor, elimine y vuelva a añadir esta conexión al servidor.",
|
||||
"MessageOldServerConnectionWarning": "La configuración de la conexión al servidor utiliza un identificador de usuario antiguo. Elimine y vuelva a añadir esta conexión al servidor.",
|
||||
"MessageOldServerConnectionWarningHelp": "Usted configuró originalmente la conexión a este servidor antes de la migración de la base de datos en la versión 2.3.0, publicada en junio de 2023. Una futura actualización del servidor eliminará la posibilidad de iniciar sesión con esta conexión antigua. Por favor, elimine la conexión existente al servidor y conéctese de nuevo (utilizando la misma dirección del servidor y las mismas credenciales). Si tiene algún medio descargado en este dispositivo, será necesario descargarlo de nuevo para sincronizarlo con el servidor.",
|
||||
"MessagePodcastSearchField": "Introduzca el término de búsqueda o el URL del suministro RSS",
|
||||
"MessageProgressSyncFailed": "El último intento de informar al servidor sobre el progreso de la escucha ha fallado. Las solicitudes de sincronización de progreso seguirán intentándose cada 15 segundos a 1 minuto mientras se reproduce el contenido multimedia.",
|
||||
"MessageReportBugsAndContribute": "Reporte erres, solicite funciones y contribuya en",
|
||||
"MessageSeriesAlreadyDownloaded": "Ya has descargado todos los libros de esta serie.",
|
||||
"MessageReportBugsAndContribute": "Informe de defectos, solicite funciones y contribuya en",
|
||||
"MessageSeriesAlreadyDownloaded": "Ya ha descargado todos los libros de esta serie.",
|
||||
"MessageSeriesDownloadConfirm": "¿Descargar {0} libro(s) faltante(s) con {1} archivo(s), totalizando {2} a la carpeta {3}?",
|
||||
"MessageSeriesDownloadConfirmIos": "¿Descargar {0} libro(s) faltantes con {1} archivo(s), con un total de {2}?",
|
||||
"MessageSocketConnectedOverMeteredCellular": "Conexión de socket a través de red celular de tarifa por consumo",
|
||||
|
||||
@@ -26,7 +26,9 @@
|
||||
"ButtonLatest": "Najnovije",
|
||||
"ButtonLibrary": "Knjižnica",
|
||||
"ButtonLocalMedia": "Preuzeti medijski zapisi",
|
||||
"ButtonLogs": "Zapisnici",
|
||||
"ButtonManageLocalFiles": "Upravljanje preuzetim datotekama",
|
||||
"ButtonMaskServerAddress": "Maskiraj adresu poslužitelja",
|
||||
"ButtonNewFolder": "Nova mapa",
|
||||
"ButtonNextEpisode": "Sljedeći nastavak",
|
||||
"ButtonOk": "U redu",
|
||||
@@ -50,6 +52,7 @@
|
||||
"ButtonStream": "Reproduciraj strujanjem",
|
||||
"ButtonSubmit": "Pošalji",
|
||||
"ButtonSwitchServerUser": "Promijeni poslužitelj/korisnika",
|
||||
"ButtonUnmaskServerAddress": "Prikaži adresu poslužitelja",
|
||||
"ButtonUserStats": "Statistika korisnika",
|
||||
"ButtonYes": "Da",
|
||||
"HeaderAccount": "Korisnički račun",
|
||||
@@ -237,6 +240,8 @@
|
||||
"LabelShowAll": "Prikaži sve",
|
||||
"LabelSize": "Veličina",
|
||||
"LabelSleepTimer": "Timer za spavanje",
|
||||
"LabelSleepTimerAlmostDoneChime": "Zvučno upozorenje prije isteka",
|
||||
"LabelSleepTimerAlmostDoneChimeHelp": "Reproduciraj zvučno upozorenje 30 sekundi prije isteka timera za spavanje",
|
||||
"LabelStart": "Početak",
|
||||
"LabelStartTime": "Vrijeme pokretanja",
|
||||
"LabelStatsBestDay": "Najbolji dan",
|
||||
@@ -310,6 +315,7 @@
|
||||
"MessageNoItems": "Nema stavki",
|
||||
"MessageNoItemsFound": "Nema pronađenih stavki",
|
||||
"MessageNoListeningSessions": "Nema sesija slušanja",
|
||||
"MessageNoLogs": "Nema zapisnika",
|
||||
"MessageNoMediaFolders": "Nema medijskih mapa",
|
||||
"MessageNoNetworkConnection": "Nema mrežne veze",
|
||||
"MessageNoPodcastsFound": "Nije pronađen niti jedan podcast",
|
||||
|
||||
+13
-2
@@ -6,6 +6,7 @@
|
||||
"ButtonCancel": "Mégsem",
|
||||
"ButtonCancelTimer": "Időzítő megszakítása",
|
||||
"ButtonClearFilter": "Szűrő törlése",
|
||||
"ButtonClearLogs": "Naplók tisztítása",
|
||||
"ButtonCloseFeed": "Hírcsatorna bezárása",
|
||||
"ButtonCollections": "Gyűjtemények",
|
||||
"ButtonConnect": "Csatlakozás",
|
||||
@@ -26,7 +27,9 @@
|
||||
"ButtonLatest": "Legújabb",
|
||||
"ButtonLibrary": "Könyvtár",
|
||||
"ButtonLocalMedia": "Helyi média",
|
||||
"ButtonLogs": "Naplók",
|
||||
"ButtonManageLocalFiles": "Helyi fájlok kezelése",
|
||||
"ButtonMaskServerAddress": "Kiszolgáló címének maszkolása",
|
||||
"ButtonNewFolder": "Új mappa",
|
||||
"ButtonNextEpisode": "Következő epizód",
|
||||
"ButtonOk": "Ok",
|
||||
@@ -50,6 +53,7 @@
|
||||
"ButtonStream": "Streamelés",
|
||||
"ButtonSubmit": "Küldés",
|
||||
"ButtonSwitchServerUser": "Szerver/Felhasználó váltása",
|
||||
"ButtonUnmaskServerAddress": "Kiszolgáló címének maszkolásának törlése",
|
||||
"ButtonUserStats": "Felhasználói statisztikák",
|
||||
"ButtonYes": "Igen",
|
||||
"HeaderAccount": "Fiók",
|
||||
@@ -95,6 +99,7 @@
|
||||
"LabelAllowSeekingOnMediaControls": "Pozíció keresés engedélyezése a média értesítési vezérlőkön",
|
||||
"LabelAlways": "Mindig",
|
||||
"LabelAndroidAutoBrowseLimitForGrouping": "Ábécé szerinti lehívási korlát",
|
||||
"LabelAndroidAutoBrowseLimitForGroupingHelp": "Ne használja az ábécé szerinti lehívási korlátot, ha ennél kevesebb elemet kell megjeleníteni",
|
||||
"LabelAndroidAutoBrowseSeriesSequenceOrder": "A sorozat könyveinek sorrendje",
|
||||
"LabelAskConfirmation": "Kérjen megerősítést",
|
||||
"LabelAuthor": "Szerző",
|
||||
@@ -136,7 +141,7 @@
|
||||
"LabelEbooks": "E-könyvek",
|
||||
"LabelEnable": "Engedélyezés",
|
||||
"LabelEnableMp3IndexSeeking": "Mp3 indexkeresés engedélyezése",
|
||||
"LabelEnableMp3IndexSeekingHelp": "Ezt a beállítást csak akkor kell engedélyezni, ha vannak mp3 fájljai, amelyek nem megfelelően keresnek. A pontatlan keresés leginkább a változó bitráta (VBR) mp3 fájlok miatt lehetséges. Ez a beállítás indexkeresést fog kényszeríteni, amely során egy idő-bájt leképezés jön létre, ahogy a fájlt olvassák. Nagy mp3 fájlok esetén előfordulhat késedelem a fájl végéhez való kereséskor.",
|
||||
"LabelEnableMp3IndexSeekingHelp": "Ezt a beállítást csak akkor kell engedélyezni, ha vannak mp3 fájljai, amelyek nem megfelelően keresnek. A pontatlan keresés leginkább a változó bitráta (VBR) mp3 fájlok miatt lehetséges. Ez a beállítás indexkeresést fog kényszeríteni, amely során egy idő-bájt leképezés jön létre, ahogy a fájlt olvassák. Nagy mp3 fájlok esetén előfordulhat késedelem a fájl végénél történő kereséskor.",
|
||||
"LabelEnd": "Vége",
|
||||
"LabelEndOfChapter": "Fejezet vége",
|
||||
"LabelEndTime": "Befejezés ideje",
|
||||
@@ -178,6 +183,7 @@
|
||||
"LabelLow": "Alacsony",
|
||||
"LabelMediaType": "Média típus",
|
||||
"LabelMedium": "Közepes",
|
||||
"LabelMissing": "Hiányzik",
|
||||
"LabelMore": "Több",
|
||||
"LabelMoreInfo": "Több információ",
|
||||
"LabelName": "Név",
|
||||
@@ -235,12 +241,14 @@
|
||||
"LabelShowAll": "Összes megjelenítése",
|
||||
"LabelSize": "Méret",
|
||||
"LabelSleepTimer": "Alvásidőzítő",
|
||||
"LabelSleepTimerAlmostDoneChime": "Jelezze hanggal, ha majdnem lejárt",
|
||||
"LabelSleepTimerAlmostDoneChimeHelp": "Jelezze hanggal, ha az elalvásidőzítőből 30 másodperc maradt",
|
||||
"LabelStart": "Kezdés",
|
||||
"LabelStartTime": "Kezdési idő",
|
||||
"LabelStatsBestDay": "Legjobb nap",
|
||||
"LabelStatsDailyAverage": "Napi átlag",
|
||||
"LabelStatsDays": "Napok",
|
||||
"LabelStatsDaysListened": "Hallgatott napok",
|
||||
"LabelStatsDaysListened": "Hallgatással töltött napok",
|
||||
"LabelStatsInARow": "egymás után",
|
||||
"LabelStatsItemsFinished": "Befejezett elemek",
|
||||
"LabelStatsMinutes": "perc",
|
||||
@@ -250,6 +258,7 @@
|
||||
"LabelTag": "Címke",
|
||||
"LabelTags": "Címkék",
|
||||
"LabelTheme": "Téma",
|
||||
"LabelThemeBlack": "Fekete",
|
||||
"LabelThemeDark": "Sötét",
|
||||
"LabelThemeLight": "Világos",
|
||||
"LabelTimeRemaining": "{0} maradt",
|
||||
@@ -294,6 +303,7 @@
|
||||
"MessageItemMissing": "Az elem hiányzik, és a szerveren kell javítani. Egy elemet általában azért jelölnek hiányzónak, mert a fájl elérési útvonalai nem elérhetőek.",
|
||||
"MessageLoading": "Betöltés...",
|
||||
"MessageLoadingServerData": "Szerveradatok betöltése...",
|
||||
"MessageLocalFolderDescription": "A „Belső alkalmazás-tároló” csak ezzel az alkalmazással érhető el. Ez az alkalmazás csak a közvetlenül az alkalmazáson keresztül letöltött médiát támogatja. A megosztott tároló mappák segítségével más alkalmazások is hozzáférhetnek az alkalmazás által letöltött médiához.",
|
||||
"MessageMarkAsFinished": "Befejezettnek jelölés",
|
||||
"MessageMediaLinkedToADifferentServer": "A média egy másik címen található Audiobookshelf szerverhez kapcsolódik ({0}). A haladás szinkronizálva lesz, amikor csatlakozik ehhez a szervercímhez.",
|
||||
"MessageMediaLinkedToADifferentUser": "A média ehhez a szerverhez kapcsolódik, de egy másik felhasználó töltötte le. A haladás csak a letöltést végrehajtó felhasználóhoz lesz szinkronizálva.",
|
||||
@@ -306,6 +316,7 @@
|
||||
"MessageNoItems": "Nincsenek elemek",
|
||||
"MessageNoItemsFound": "Nincs találat",
|
||||
"MessageNoListeningSessions": "Nincsenek hallgatási munkamenetek",
|
||||
"MessageNoLogs": "Nincsenek naplók",
|
||||
"MessageNoMediaFolders": "Nincsenek médiamappák",
|
||||
"MessageNoNetworkConnection": "Nincs hálózati kapcsolat",
|
||||
"MessageNoPodcastsFound": "Nem találhatók podcastok",
|
||||
|
||||
+8
-1
@@ -6,6 +6,7 @@
|
||||
"ButtonCancel": "Cancella",
|
||||
"ButtonCancelTimer": "Annulla il timer",
|
||||
"ButtonClearFilter": "Elimina filtri",
|
||||
"ButtonClearLogs": "Pulisci i Log",
|
||||
"ButtonCloseFeed": "Chiudi flusso",
|
||||
"ButtonCollections": "Raccolte",
|
||||
"ButtonConnect": "Connetti",
|
||||
@@ -26,7 +27,9 @@
|
||||
"ButtonLatest": "Ultimi",
|
||||
"ButtonLibrary": "Biblioteca",
|
||||
"ButtonLocalMedia": "Media locali",
|
||||
"ButtonLogs": "Log",
|
||||
"ButtonManageLocalFiles": "Gestisci file locali",
|
||||
"ButtonMaskServerAddress": "Nascondi Indirizzo Server",
|
||||
"ButtonNewFolder": "Nuova cartella",
|
||||
"ButtonNextEpisode": "Prossimo episodio",
|
||||
"ButtonOk": "D'accordo",
|
||||
@@ -50,6 +53,7 @@
|
||||
"ButtonStream": "Stream",
|
||||
"ButtonSubmit": "Invia",
|
||||
"ButtonSwitchServerUser": "Cambia Server/Utente",
|
||||
"ButtonUnmaskServerAddress": "Mostra Indirizzo Server",
|
||||
"ButtonUserStats": "Statistiche utente",
|
||||
"ButtonYes": "Sì",
|
||||
"HeaderAccount": "Account",
|
||||
@@ -137,7 +141,7 @@
|
||||
"LabelEbooks": "Libri digitali",
|
||||
"LabelEnable": "Abilita",
|
||||
"LabelEnableMp3IndexSeeking": "Abilita la ricerca dell'indice mp3",
|
||||
"LabelEnableMp3IndexSeekingHelp": "Questa impostazione dovrebbe essere abilitata solo se hai file mp3 che non vengono ricercati correttamente. La ricerca imprecisa è molto probabilmente dovuta ai file MP3 a birate variabile (VBR). Questa impostazione imporrà la ricerca dell'indice, in cui viene creata una mappatura tempo-byte durante la lettura del file. In alcuni casi, con file MP3 di grandi dimensioni, si verificherà un ritardo durante la ricerca verso la fine del file.",
|
||||
"LabelEnableMp3IndexSeekingHelp": "Questa impostazione dovrebbe essere abilitata solo se si dispone di file mp3 la cui ricerca non viene eseguita correttamente. Una ricerca imprecisa è molto probabilmente dovuta a file MP3 con bitrate variabile (VBR). Questa impostazione forza la ricerca dell'indice, in cui viene creata una mappatura tempo-byte durante la lettura del file. In alcuni casi, con file MP3 di grandi dimensioni, si verificherà un ritardo nella ricerca verso la fine del file.",
|
||||
"LabelEnd": "Fine",
|
||||
"LabelEndOfChapter": "Fine Capitolo",
|
||||
"LabelEndTime": "Tempo alla fine",
|
||||
@@ -237,6 +241,8 @@
|
||||
"LabelShowAll": "Mostra tutto",
|
||||
"LabelSize": "Dimensione",
|
||||
"LabelSleepTimer": "Temporizzatore",
|
||||
"LabelSleepTimerAlmostDoneChime": "Riproduci un suono quando è quasi finito",
|
||||
"LabelSleepTimerAlmostDoneChimeHelp": "Riproduci un suono quando mancano 30 secondi al timer di spegnimento",
|
||||
"LabelStart": "Inizo",
|
||||
"LabelStartTime": "Tempo di inizio",
|
||||
"LabelStatsBestDay": "Giorno migliore",
|
||||
@@ -310,6 +316,7 @@
|
||||
"MessageNoItems": "Nessun oggetto",
|
||||
"MessageNoItemsFound": "Nessun oggetto trovato",
|
||||
"MessageNoListeningSessions": "Nessuna sessione di ascolto",
|
||||
"MessageNoLogs": "Nessun Log",
|
||||
"MessageNoMediaFolders": "Nessuna cartella media",
|
||||
"MessageNoNetworkConnection": "Nessuna connessione di rete",
|
||||
"MessageNoPodcastsFound": "Nessun podcast trovato",
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
"ButtonCancel": "Annuleren",
|
||||
"ButtonCancelTimer": "Timer annuleren",
|
||||
"ButtonClearFilter": "Filter verwijderen",
|
||||
"ButtonClearLogs": "Log bestanden verwijderen",
|
||||
"ButtonCloseFeed": "Feed sluiten",
|
||||
"ButtonCollections": "Collecties",
|
||||
"ButtonConnect": "Verbinden",
|
||||
@@ -26,9 +27,11 @@
|
||||
"ButtonLatest": "Meest recent",
|
||||
"ButtonLibrary": "Bibliotheek",
|
||||
"ButtonLocalMedia": "Lokale Media",
|
||||
"ButtonLogs": "Log bestanden",
|
||||
"ButtonManageLocalFiles": "Beheer Lokale Bestanden",
|
||||
"ButtonNewFolder": "Nieuwe map",
|
||||
"ButtonNextEpisode": "Volgende aflevering",
|
||||
"ButtonOk": "Akkoord",
|
||||
"ButtonOpenFeed": "Feed openen",
|
||||
"ButtonOverride": "Overschrijven",
|
||||
"ButtonPause": "Pauze",
|
||||
@@ -74,6 +77,7 @@
|
||||
"HeaderPlaybackSettings": "Afspeel instellingen",
|
||||
"HeaderPlaylist": "Afspeellijst",
|
||||
"HeaderPlaylistItems": "Onderdelen in afspeellijst",
|
||||
"HeaderProgressSyncFailed": "Voortgang synchronisatie mislukt",
|
||||
"HeaderRSSFeed": "RSS Feed",
|
||||
"HeaderRSSFeedGeneral": "RSS-details",
|
||||
"HeaderRSSFeedIsOpen": "RSS-feed is open",
|
||||
@@ -162,6 +166,7 @@
|
||||
"LabelInternalAppStorage": "Interne App Opslag",
|
||||
"LabelJumpBackwardsTime": "Terug in tijd springen",
|
||||
"LabelJumpForwardsTime": "Verder in tijd springen",
|
||||
"LabelKeepScreenAwake": "Scherm actief houden",
|
||||
"LabelLanguage": "Taal",
|
||||
"LabelLayout": "Layout",
|
||||
"LabelLayoutAuto": "Automatisch",
|
||||
@@ -176,6 +181,7 @@
|
||||
"LabelLow": "Laag",
|
||||
"LabelMediaType": "Mediatype",
|
||||
"LabelMedium": "Medium",
|
||||
"LabelMissing": "Missende",
|
||||
"LabelMore": "Meer",
|
||||
"LabelMoreInfo": "Meer info",
|
||||
"LabelName": "Naam",
|
||||
@@ -193,6 +199,8 @@
|
||||
"LabelNotFinished": "Niet Voltooid",
|
||||
"LabelNotStarted": "Niet Gestart",
|
||||
"LabelNumEpisodes": "{0} afleveringen",
|
||||
"LabelNumEpisodesIncomplete": "{0} afleveringen, {1} incompleet",
|
||||
"LabelNumberOfEpisodes": "# Afleveringen",
|
||||
"LabelOff": "Uit",
|
||||
"LabelOn": "Aan",
|
||||
"LabelPassword": "Wachtwoord",
|
||||
@@ -246,6 +254,7 @@
|
||||
"LabelTag": "Tag",
|
||||
"LabelTags": "Tags",
|
||||
"LabelTheme": "Thema",
|
||||
"LabelThemeBlack": "Zwart",
|
||||
"LabelThemeDark": "Donker",
|
||||
"LabelThemeLight": "Licht",
|
||||
"LabelTimeRemaining": "{0} te gaan",
|
||||
@@ -272,6 +281,7 @@
|
||||
"MessageBookshelfEmpty": "Boekenplank leeg",
|
||||
"MessageConfirmDeleteLocalEpisode": "Lokale aflevering \"{0}\" van uw apparaat verwijderen? Het bestand op de server blijft onaangetast.",
|
||||
"MessageConfirmDeleteLocalFiles": "Lokale bestanden van dit item van uw apparaat verwijderen? De bestanden op de server en uw voortgang worden niet beïnvloed.",
|
||||
"MessageConfirmDisableAutoTimer": "Weet u zeker dat je de automatische timer voor de rest van vandaag wilt uitschakelen? De timer wordt automatisch weer ingeschakeld aan het einde van deze sluimerperiode of als u de app opnieuw start.",
|
||||
"MessageConfirmDiscardProgress": "Weet u zeker dat u uw voortgang wilt resetten?",
|
||||
"MessageConfirmDownloadUsingCellular": "U staat op het punt om te downloaden met behulp van mobiele data. Dit kan kosten voor data van de provider met zich meebrengen. Wilt u doorgaan?",
|
||||
"MessageConfirmMarkAsFinished": "Weet u zeker dat u dit item als voltooid wilt markeren?",
|
||||
@@ -300,12 +310,14 @@
|
||||
"MessageNoItems": "Geen onderdelen",
|
||||
"MessageNoItemsFound": "Geen onderdelen gevonden",
|
||||
"MessageNoListeningSessions": "Geen luistersessies",
|
||||
"MessageNoLogs": "Geen log bestanden",
|
||||
"MessageNoMediaFolders": "Geen Media Folders",
|
||||
"MessageNoNetworkConnection": "Geen netwerk connectie",
|
||||
"MessageNoPodcastsFound": "Geen podcasts gevonden",
|
||||
"MessageNoSeries": "Geen series",
|
||||
"MessageNoUpdatesWereNecessary": "Geen bijwerkingen waren noodzakelijk",
|
||||
"MessageNoUserPlaylists": "Je hebt geen afspeellijsten",
|
||||
"MessageOldServerConnectionWarning": "Server connectie configuratie gebruikt een oud user ID. Gelieve deze server connectie te verwijderen en opnieuw toe te voegen.",
|
||||
"MessagePodcastSearchField": "Zoekterm of RSS feed URL invullen",
|
||||
"MessageReportBugsAndContribute": "Rapporteer bugs, vraag functionaliteiten aan en draag bij op",
|
||||
"MessageSeriesAlreadyDownloaded": "Je hebt alle boeken in deze serie al gedownload.",
|
||||
|
||||
+15
-1
@@ -5,7 +5,8 @@
|
||||
"ButtonBack": "Tilbake",
|
||||
"ButtonCancel": "Avbryt",
|
||||
"ButtonCancelTimer": "Avbryt tidsur",
|
||||
"ButtonClearFilter": "Bytt filter",
|
||||
"ButtonClearFilter": "Fjern filter",
|
||||
"ButtonClearLogs": "Tøm logger",
|
||||
"ButtonCloseFeed": "Lukk Feed",
|
||||
"ButtonCollections": "Samlinger",
|
||||
"ButtonConnect": "Koble til",
|
||||
@@ -15,14 +16,20 @@
|
||||
"ButtonCreateNewPlaylist": "Opprett ny spilleliste",
|
||||
"ButtonDelete": "Slett",
|
||||
"ButtonDeleteLocalEpisode": "Slett episode på enheten",
|
||||
"ButtonDeleteLocalFile": "Slett fil på enheten",
|
||||
"ButtonDeleteLocalItem": "Slett element på enheten",
|
||||
"ButtonDisableAutoTimer": "Skru av automatisk tidsur",
|
||||
"ButtonDisconnect": "Koble fra",
|
||||
"ButtonGoToWebClient": "Gå til webklient",
|
||||
"ButtonHistory": "Historikk",
|
||||
"ButtonHome": "Hjem",
|
||||
"ButtonIssues": "Problemer",
|
||||
"ButtonLatest": "Siste",
|
||||
"ButtonLibrary": "Bibliotek",
|
||||
"ButtonLocalMedia": "Lokal media",
|
||||
"ButtonLogs": "Logger",
|
||||
"ButtonManageLocalFiles": "Administrer Lokale Filer",
|
||||
"ButtonMaskServerAddress": "Skjul serveradresse",
|
||||
"ButtonNewFolder": "Ny mappe",
|
||||
"ButtonNextEpisode": "Neste episode",
|
||||
"ButtonOk": "Ok",
|
||||
@@ -33,6 +40,8 @@
|
||||
"ButtonPlayEpisode": "Spill episode",
|
||||
"ButtonPlaylists": "Spillelister",
|
||||
"ButtonRead": "Les",
|
||||
"ButtonReadLess": "Vis mindre",
|
||||
"ButtonReadMore": "Vis mer",
|
||||
"ButtonRemove": "Fjern",
|
||||
"ButtonRemoveFromServer": "Fjern fra tjeneren",
|
||||
"ButtonSave": "Lagre",
|
||||
@@ -40,12 +49,16 @@
|
||||
"ButtonSearch": "Søk",
|
||||
"ButtonSendEbookToDevice": "Send e-bok til enhet",
|
||||
"ButtonSeries": "Serier",
|
||||
"ButtonSetTimer": "Sett tidsur",
|
||||
"ButtonStream": "Strøm",
|
||||
"ButtonSubmit": "Send inn",
|
||||
"ButtonSwitchServerUser": "Bytt tjener/bruker",
|
||||
"ButtonUnmaskServerAddress": "Vis serveradresse",
|
||||
"ButtonUserStats": "Brukerstatistikk",
|
||||
"ButtonYes": "Ja",
|
||||
"HeaderAccount": "Konto",
|
||||
"HeaderAdvanced": "Avansert",
|
||||
"HeaderAndroidAutoSettings": "Android Auto-innstillinger",
|
||||
"HeaderAudioTracks": "Lydspor",
|
||||
"HeaderChapters": "Kapittel",
|
||||
"HeaderCollection": "Samlinger",
|
||||
@@ -53,6 +66,7 @@
|
||||
"HeaderConnectionStatus": "Tilkoblingsstatus",
|
||||
"HeaderDataSettings": "Datainnstillinger",
|
||||
"HeaderDetails": "Detaljer",
|
||||
"HeaderDownloads": "Nedlastinger",
|
||||
"HeaderEbookFiles": "Ebook filer",
|
||||
"HeaderEpisodes": "Episoder",
|
||||
"HeaderEreaderSettings": "Ereader innstillinger",
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
"ButtonCancel": "Отмена",
|
||||
"ButtonCancelTimer": "Отмена таймера",
|
||||
"ButtonClearFilter": "Очистить фильтр",
|
||||
"ButtonClearLogs": "Очистить журнал",
|
||||
"ButtonCloseFeed": "Закрыть канал",
|
||||
"ButtonCollections": "Коллекции",
|
||||
"ButtonConnect": "Подключение",
|
||||
@@ -26,7 +27,9 @@
|
||||
"ButtonLatest": "Последнее",
|
||||
"ButtonLibrary": "Библиотека",
|
||||
"ButtonLocalMedia": "Локальные медиа",
|
||||
"ButtonLogs": "Журнал",
|
||||
"ButtonManageLocalFiles": "Управление локальными файлами",
|
||||
"ButtonMaskServerAddress": "Скрывать адрес сервера",
|
||||
"ButtonNewFolder": "Новая папка",
|
||||
"ButtonNextEpisode": "Следующий эпизод",
|
||||
"ButtonOk": "Ок",
|
||||
@@ -50,6 +53,7 @@
|
||||
"ButtonStream": "Стрим",
|
||||
"ButtonSubmit": "Применить",
|
||||
"ButtonSwitchServerUser": "Изменить Сервер/Пользователя",
|
||||
"ButtonUnmaskServerAddress": "Не скрывать адрес сервера",
|
||||
"ButtonUserStats": "Статистика пользователя",
|
||||
"ButtonYes": "Да",
|
||||
"HeaderAccount": "Учетная запись",
|
||||
@@ -237,6 +241,8 @@
|
||||
"LabelShowAll": "Показать все",
|
||||
"LabelSize": "Размер",
|
||||
"LabelSleepTimer": "Таймер сна",
|
||||
"LabelSleepTimerAlmostDoneChime": "Звуковое предупреждение перед истечением срока",
|
||||
"LabelSleepTimerAlmostDoneChimeHelp": "Воспроизвести звуковой сигнал за 30 секунд до истечения таймера сна",
|
||||
"LabelStart": "Начало",
|
||||
"LabelStartTime": "Время начала",
|
||||
"LabelStatsBestDay": "Лучший День",
|
||||
@@ -310,6 +316,7 @@
|
||||
"MessageNoItems": "Нет элементов",
|
||||
"MessageNoItemsFound": "Элементы не найдены",
|
||||
"MessageNoListeningSessions": "Нет сеансов прослушивания",
|
||||
"MessageNoLogs": "Нет записей",
|
||||
"MessageNoMediaFolders": "Нет папок мультимедиа",
|
||||
"MessageNoNetworkConnection": "Нет подключения к сети",
|
||||
"MessageNoPodcastsFound": "Подкасты не найдены",
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -6,6 +6,7 @@
|
||||
"ButtonCancel": "Prekliči",
|
||||
"ButtonCancelTimer": "Prekliči časovnik",
|
||||
"ButtonClearFilter": "Počisti filter",
|
||||
"ButtonClearLogs": "Počisti dnevnike",
|
||||
"ButtonCloseFeed": "Zapri vir",
|
||||
"ButtonCollections": "Zbirke",
|
||||
"ButtonConnect": "Poveži",
|
||||
@@ -26,7 +27,9 @@
|
||||
"ButtonLatest": "Najnovejše",
|
||||
"ButtonLibrary": "Knjižnica",
|
||||
"ButtonLocalMedia": "Lokalni mediji",
|
||||
"ButtonLogs": "Dnevniki",
|
||||
"ButtonManageLocalFiles": "Upravljanje lokalnih datotek",
|
||||
"ButtonMaskServerAddress": "Zakrij naslov strežnika",
|
||||
"ButtonNewFolder": "Nova mapa",
|
||||
"ButtonNextEpisode": "Naslednja epizoda",
|
||||
"ButtonOk": "V redu",
|
||||
@@ -50,6 +53,7 @@
|
||||
"ButtonStream": "Pretakaj",
|
||||
"ButtonSubmit": "Potrdi",
|
||||
"ButtonSwitchServerUser": "Preklopi strežnik/uporabnik",
|
||||
"ButtonUnmaskServerAddress": "Odkrij naslov strežnika",
|
||||
"ButtonUserStats": "Uporabniška statistika",
|
||||
"ButtonYes": "Da",
|
||||
"HeaderAccount": "Račun",
|
||||
@@ -237,6 +241,8 @@
|
||||
"LabelShowAll": "Prikaži vse",
|
||||
"LabelSize": "Velikost",
|
||||
"LabelSleepTimer": "Časovnik za spanje",
|
||||
"LabelSleepTimerAlmostDoneChime": "Predvajaj zvonec tik pred koncem",
|
||||
"LabelSleepTimerAlmostDoneChimeHelp": "Predvajaj zvonec, ko časovnik za spanje preostane še 30 sekund",
|
||||
"LabelStart": "Začetek",
|
||||
"LabelStartTime": "Začetni čas",
|
||||
"LabelStatsBestDay": "Najboljši dan",
|
||||
@@ -310,6 +316,7 @@
|
||||
"MessageNoItems": "Ni elementov",
|
||||
"MessageNoItemsFound": "Ni najdenih elementov",
|
||||
"MessageNoListeningSessions": "Ni sej poslušanja",
|
||||
"MessageNoLogs": "Ni dnevnikov",
|
||||
"MessageNoMediaFolders": "Brez medijskih map",
|
||||
"MessageNoNetworkConnection": "Ni omrežne povezave",
|
||||
"MessageNoPodcastsFound": "Ni podcastov",
|
||||
|
||||
+23
-2
@@ -6,6 +6,7 @@
|
||||
"ButtonCancel": "Avbryt",
|
||||
"ButtonCancelTimer": "Inaktivera Timer",
|
||||
"ButtonClearFilter": "Rensa filter",
|
||||
"ButtonClearLogs": "Rensa Loggar",
|
||||
"ButtonCloseFeed": "Stäng flöde",
|
||||
"ButtonCollections": "Samlingar",
|
||||
"ButtonConnect": "Anslut",
|
||||
@@ -20,13 +21,15 @@
|
||||
"ButtonDisableAutoTimer": "Inaktivera Automatisk Timer",
|
||||
"ButtonDisconnect": "Koppla ur",
|
||||
"ButtonGoToWebClient": "Öppna i webbläsare",
|
||||
"ButtonHistory": "Histora",
|
||||
"ButtonHistory": "Historik",
|
||||
"ButtonHome": "Hem",
|
||||
"ButtonIssues": "Objekt med problem",
|
||||
"ButtonLatest": "Senaste",
|
||||
"ButtonLibrary": "Bibliotek",
|
||||
"ButtonLocalMedia": "Lokal media",
|
||||
"ButtonLogs": "Loggar",
|
||||
"ButtonManageLocalFiles": "Hantera Lokal Filer",
|
||||
"ButtonMaskServerAddress": "Dölj server adress",
|
||||
"ButtonNewFolder": "Ny Katalog",
|
||||
"ButtonNextEpisode": "Ny Episod",
|
||||
"ButtonOk": "OK",
|
||||
@@ -50,6 +53,7 @@
|
||||
"ButtonStream": "Ström",
|
||||
"ButtonSubmit": "Skicka",
|
||||
"ButtonSwitchServerUser": "Byt Server/Användare",
|
||||
"ButtonUnmaskServerAddress": "Visa server adress",
|
||||
"ButtonUserStats": "Användarstatistik",
|
||||
"ButtonYes": "Ja",
|
||||
"HeaderAccount": "Konto",
|
||||
@@ -94,7 +98,9 @@
|
||||
"LabelAll": "Alla",
|
||||
"LabelAllowSeekingOnMediaControls": "Tillåt positionssökning på medieaviseringskontroller",
|
||||
"LabelAlways": "Alltid",
|
||||
"LabelAndroidAutoBrowseLimitForGrouping": "Alfabetisk neddragningsgräns",
|
||||
"LabelAndroidAutoBrowseLimitForGroupingHelp": "Använd inte alfabetisk neddragning när det finns mindre än denna mängd objekt att visa",
|
||||
"LabelAndroidAutoBrowseSeriesSequenceOrder": "Serier bokföljd",
|
||||
"LabelAskConfirmation": "Fråga efter bekräftelse",
|
||||
"LabelAuthor": "Författare",
|
||||
"LabelAuthorFirstLast": "Författare (Förnamn Efternamn)",
|
||||
@@ -226,6 +232,7 @@
|
||||
"LabelSeason": "Säsong",
|
||||
"LabelSelectADevice": "Välj en enhet",
|
||||
"LabelSequenceAscending": "Stigande",
|
||||
"LabelSequenceDescending": "Sekvens Fallande",
|
||||
"LabelSeries": "Serie",
|
||||
"LabelServerAddress": "Server-adress",
|
||||
"LabelSetEbookAsPrimary": "Ange som primär",
|
||||
@@ -234,6 +241,8 @@
|
||||
"LabelShowAll": "Visa alla",
|
||||
"LabelSize": "Storlek",
|
||||
"LabelSleepTimer": "Sovtimer",
|
||||
"LabelSleepTimerAlmostDoneChime": "Spela ett ljud när det är nästan klart",
|
||||
"LabelSleepTimerAlmostDoneChimeHelp": "Spela ett ljud när sovtimern har 30 sekunder kvar",
|
||||
"LabelStart": "Start",
|
||||
"LabelStartTime": "Starttid",
|
||||
"LabelStatsBestDay": "Bästa dag",
|
||||
@@ -249,6 +258,7 @@
|
||||
"LabelTag": "Tagg",
|
||||
"LabelTags": "Taggar",
|
||||
"LabelTheme": "Tema",
|
||||
"LabelThemeBlack": "Svart",
|
||||
"LabelThemeDark": "Mörkt",
|
||||
"LabelThemeLight": "Ljust",
|
||||
"LabelTimeRemaining": "{0} kvar",
|
||||
@@ -290,8 +300,10 @@
|
||||
"MessageFetching": "Hämtar...",
|
||||
"MessageFollowTheProjectOnGithub": "Följ projektet på Github",
|
||||
"MessageItemDownloadCompleteFailedToCreate": "Objektet laddades ned men det gick inte att skapa ett biblioteksobjekt",
|
||||
"MessageItemMissing": "Objekt saknas och måste fixas på servern. Vanligast när ett objekt är makerad som saknad beror det på att sökvägen inte är nåbar.",
|
||||
"MessageLoading": "Laddar...",
|
||||
"MessageLoadingServerData": "Läser in serverdata...",
|
||||
"MessageLocalFolderDescription": "'Intern lagring för appen' är endast tillgänglig för denna app. Denna app stöder endast media som har laddats ner direkt via appen. Delade lagringsmappar kan användas för att tillåta andra appar att få åtkomst till media som laddats ner av denna app.",
|
||||
"MessageMarkAsFinished": "Markera som avslutad",
|
||||
"MessageMediaLinkedToADifferentServer": "Detta media är länkat till en Audiobookshelf-server på annan adress ({0}). Uppspelningspositioner kommer synkas nästa gång appen kan ansluta till servern.",
|
||||
"MessageMediaLinkedToADifferentUser": "Detta media är länkat till den här servern men laddades ned av en annan användare. Uppspelningspositioner kommer endast synkas för den användaren som laddade ned objektet.",
|
||||
@@ -304,17 +316,26 @@
|
||||
"MessageNoItems": "Inga objekt",
|
||||
"MessageNoItemsFound": "Inga objekt hittades",
|
||||
"MessageNoListeningSessions": "Inga lyssningstillfällen",
|
||||
"MessageNoLogs": "Inga loggar",
|
||||
"MessageNoMediaFolders": "Inga Mediamappar",
|
||||
"MessageNoNetworkConnection": "Ingen nätverksanslutning",
|
||||
"MessageNoPodcastsFound": "Inga podcasts hittade",
|
||||
"MessageNoSeries": "Inga serier",
|
||||
"MessageNoUpdatesWereNecessary": "Inga uppdateringar var nödvändiga",
|
||||
"MessageNoUserPlaylists": "Du har inga spellistor",
|
||||
"MessageOldServerConnectionWarning": "Serveranslutningskonfigurationen använder ett gammalt användar-ID. Vänligen ta bort och lägg till denna serveranslutning igen.",
|
||||
"MessageOldServerConnectionWarningHelp": "Du ställde ursprungligen in anslutningen till denna server före databasflytten i version 2.3.0, som släpptes i juni 2023. En framtida serveruppdatering kommer att ta bort möjligheten att logga in med denna gamla anslutning. Vänligen ta bort den befintliga serveranslutningen och anslut igen (med samma serveradress och inloggningsuppgifter). Om du har nedladdad media på den här enheten måste den laddas ner igen för att synkroniseras med servern.",
|
||||
"MessagePodcastSearchField": "Skriv sökfrågan eller URL-adressen för RSS-flödet",
|
||||
"MessageProgressSyncFailed": "Det senaste försöket att rapportera din lyssningsprogress till servern misslyckades. Försök att synkronisera progressen kommer att fortsätta göras var 15:e sekund till 1 minut medan media spelas.",
|
||||
"MessageReportBugsAndContribute": "Rapportera buggar, begär funktioner och bidra på",
|
||||
"MessageSeriesAlreadyDownloaded": "Du har redan laddat ner alla böcker i den här serien.",
|
||||
"MessageSeriesDownloadConfirm": "Vill du ladda ner de saknade {0} boken/böckerna med {1} fil(er), totalt {2}, till mappen {3}?",
|
||||
"MessageSeriesDownloadConfirmIos": "Vill du ladda ner de saknade {0} boken/böckerna med {1} fil(er), totalt {2}?",
|
||||
"MessageSocketConnectedOverMeteredCellular": "Socket ansluten via mätad mobilanslutning",
|
||||
"MessageSocketConnectedOverMeteredWifi": "Socket connected over metered Wi-Fi",
|
||||
"MessageSocketConnectedOverUnmeteredWifi": "Socket connected over unmetered Wi-Fi",
|
||||
"MessageSocketConnectedOverUnmeteredCellular": "Socket ansluten via omättad mobilanslutning",
|
||||
"MessageSocketConnectedOverUnmeteredWifi": "Socket ansluten via omättat Wi-Fi",
|
||||
"MessageSocketNotConnected": "Socket inte ansluten",
|
||||
"NoteRSSFeedPodcastAppsHttps": "VARNING: De flesta applikationer för podcasts kräver att URL:en för RSS-flödet använder HTTPS",
|
||||
"NoteRSSFeedPodcastAppsPubDate": "VARNING: Ett eller flera av dina avsnitt saknar publiceringsdatum. Vissa applikationer för podcasts kräver detta.",
|
||||
"ToastBookmarkCreateFailed": "Det gick inte att skapa bokmärket",
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
"ButtonCancel": "Скасувати",
|
||||
"ButtonCancelTimer": "Скасувати таймер",
|
||||
"ButtonClearFilter": "Скинути фільтри",
|
||||
"ButtonClearLogs": "Очистити журнали",
|
||||
"ButtonCloseFeed": "Закрити стрічку",
|
||||
"ButtonCollections": "Добірки",
|
||||
"ButtonConnect": "Підключитися",
|
||||
@@ -28,6 +29,7 @@
|
||||
"ButtonLocalMedia": "Локальні файли",
|
||||
"ButtonLogs": "Журнали",
|
||||
"ButtonManageLocalFiles": "Керування локальними файлами",
|
||||
"ButtonMaskServerAddress": "Маска адреси сервера",
|
||||
"ButtonNewFolder": "Нова тека",
|
||||
"ButtonNextEpisode": "Наступний епізод",
|
||||
"ButtonOk": "Добре",
|
||||
@@ -51,6 +53,7 @@
|
||||
"ButtonStream": "Транслювати",
|
||||
"ButtonSubmit": "Ввести",
|
||||
"ButtonSwitchServerUser": "Змінити сервер/користувача",
|
||||
"ButtonUnmaskServerAddress": "Розкрити адресу сервера",
|
||||
"ButtonUserStats": "Статистика",
|
||||
"ButtonYes": "Так",
|
||||
"HeaderAccount": "Профіль",
|
||||
@@ -238,6 +241,8 @@
|
||||
"LabelShowAll": "Показати все",
|
||||
"LabelSize": "Розмір",
|
||||
"LabelSleepTimer": "Таймер вимкнення",
|
||||
"LabelSleepTimerAlmostDoneChime": "Увімкніть дзвінок, коли майже закінчите",
|
||||
"LabelSleepTimerAlmostDoneChimeHelp": "Увімкніть дзвінок, коли на таймері вимкнення залишиться 30 секунд",
|
||||
"LabelStart": "Початок",
|
||||
"LabelStartTime": "Час Початку",
|
||||
"LabelStatsBestDay": "Найкращий день",
|
||||
@@ -311,6 +316,7 @@
|
||||
"MessageNoItems": "Елементи відсутні",
|
||||
"MessageNoItemsFound": "Елементів не знайдено",
|
||||
"MessageNoListeningSessions": "Сеанси прослуховування відсутні",
|
||||
"MessageNoLogs": "Без журналів",
|
||||
"MessageNoMediaFolders": "Теки медіа відсутні",
|
||||
"MessageNoNetworkConnection": "Немає підключення до мережі",
|
||||
"MessageNoPodcastsFound": "Подкастів не знайдено",
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
"ButtonCancel": "取消",
|
||||
"ButtonCancelTimer": "取消计时器",
|
||||
"ButtonClearFilter": "清除过滤器",
|
||||
"ButtonClearLogs": "清除日志",
|
||||
"ButtonCloseFeed": "关闭源",
|
||||
"ButtonCollections": "收藏",
|
||||
"ButtonConnect": "连接",
|
||||
@@ -26,7 +27,9 @@
|
||||
"ButtonLatest": "最新",
|
||||
"ButtonLibrary": "媒体库",
|
||||
"ButtonLocalMedia": "本地媒体",
|
||||
"ButtonLogs": "日志",
|
||||
"ButtonManageLocalFiles": "管理本地文件",
|
||||
"ButtonMaskServerAddress": "屏蔽服务器地址",
|
||||
"ButtonNewFolder": "新建文件夹",
|
||||
"ButtonNextEpisode": "下一集",
|
||||
"ButtonOk": "确定",
|
||||
@@ -50,6 +53,7 @@
|
||||
"ButtonStream": "串流播放",
|
||||
"ButtonSubmit": "提交",
|
||||
"ButtonSwitchServerUser": "切换服务器/用户",
|
||||
"ButtonUnmaskServerAddress": "取消屏蔽服务器地址",
|
||||
"ButtonUserStats": "用户统计信息",
|
||||
"ButtonYes": "确定",
|
||||
"HeaderAccount": "帐户",
|
||||
@@ -237,6 +241,8 @@
|
||||
"LabelShowAll": "全部显示",
|
||||
"LabelSize": "文件大小",
|
||||
"LabelSleepTimer": "睡眠定时",
|
||||
"LabelSleepTimerAlmostDoneChime": "快结束时播放铃声",
|
||||
"LabelSleepTimerAlmostDoneChimeHelp": "当睡眠定时器还剩30秒时播放铃声",
|
||||
"LabelStart": "开始",
|
||||
"LabelStartTime": "开始时间",
|
||||
"LabelStatsBestDay": "最好的一天",
|
||||
@@ -310,6 +316,7 @@
|
||||
"MessageNoItems": "无项目",
|
||||
"MessageNoItemsFound": "未找到任何项目",
|
||||
"MessageNoListeningSessions": "无收听会话",
|
||||
"MessageNoLogs": "无日志",
|
||||
"MessageNoMediaFolders": "没有媒体文件夹",
|
||||
"MessageNoNetworkConnection": "无网络连接",
|
||||
"MessageNoPodcastsFound": "未找到播客",
|
||||
|
||||
Reference in New Issue
Block a user