Compare commits

..
Author SHA1 Message Date
advplyr 752e918d26 iOS version bump 0.9.73 & update dependencies 2024-03-03 16:28:55 -06:00
advplyr ad08cc69f4 Version bump 0.9.73-beta 2024-03-03 14:15:32 -06:00
advplyr da3882fd5e Fix:Playlist tab not shown after adding first playlist #1092 2024-03-03 13:29:58 -06:00
advplyr c04c7a55d9 Fix:iOS progress bar overflowing edge of screen 2024-03-03 12:52:17 -06:00
advplyr 3318846b43 Add:Remove from playlist option in more menu for items on playlist page #987 2024-03-02 15:25:18 -06:00
advplyrandGitHub e0860feeb9 Merge pull request #1109 from megamegax/hu
feat(i18n): add Hungarian localization
2024-03-01 15:39:15 -06:00
Hunyady Mihály c0253a69b9 feat(i18n): replace NoItemsFound translation to a more general one 2024-03-01 22:09:33 +01:00
Hunyady Mihály 9242c7e6e0 feat(i18n): small grammar adjustments 2024-03-01 22:04:09 +01:00
Hunyady Mihály 0bfc579ae4 feat(i18n): adjust translation 2024-03-01 21:39:06 +01:00
megamegax 5fad06756b feat(i18n): add Hungarian localization 2024-03-01 20:03:21 +01:00
advplyrandGitHub 5be6afa6c1 Merge pull request #1106 from pmangro/0.9.72.a-PT-BR
[PT-BR] Translated LabelAllowSeekingOnMediaControls
2024-02-27 15:58:36 -06:00
pmangroandGitHub 5ba3b8be7a [PT-BR] Translated LabelAllowSeekingOnMediaControls 2024-02-27 14:39:21 -03:00
advplyr 0eb62f541d Fix:Local media item page long titles overflowing screen pushing play & more menu button offscreen #1103 2024-02-25 15:35:23 -06:00
advplyrandGitHub 6baff881c7 Merge pull request #1094 from fidoriel/disable-widget-ios-scrubing
Disable ios/android scrubbing in MPRemoteCommandCenter/MediaBrowserServiceCompat
2024-02-25 15:29:52 -06:00
fidoriel 8c23c1e795 german translation for LabelAllowSeekingOnMediaControls 2024-02-25 22:25:17 +01:00
advplyr 9706c66a27 iOS Update Realm schema version for new setting, update remote transport controls on device settings updated 2024-02-25 15:04:54 -06:00
advplyr f4f7252537 Update wording for enable seeking on media controls settings, remove restart required help text, map translations 2024-02-25 14:44:40 -06:00
advplyr 430d200151 Update android disable media control seek setting to update in realtime 2024-02-25 14:11:28 -06:00
advplyr 7be82d03f3 Merge branch 'master' into disable-widget-ios-scrubing 2024-02-25 12:51:58 -06:00
advplyr 15aaef742d Fix:Ignore swiping for audio player when modal is open #1099 2024-02-24 15:00:29 -06:00
advplyrandGitHub e443ba09da Merge pull request #1095 from pmangro/0.9.72.a-PT-BR
Added PT-BR Strings
2024-02-24 14:49:35 -06:00
luca 8235d1f1f7 reorder setting and add info label 2024-02-22 20:27:33 +01:00
pmangroandGitHub 9a39dcceee Update i18n.js to add pt-br 2024-02-21 08:55:45 -03:00
pmangroandGitHub a707b7fc86 Typos corrected 2024-02-21 08:53:34 -03:00
fidoriel b6fea85ef4 fix compile android 2024-02-21 10:16:47 +01:00
advplyr 7e3b3f55ae Fix:Android auto not loading server items #1081 2024-02-20 17:05:07 -06:00
fidoriel d2d3bbe8a1 fix default false 2024-02-20 22:08:47 +01:00
fidoriel 41a65c0f9d add setting for widget scrubbing 2024-02-20 21:58:31 +01:00
pmangroandGitHub 165ddd58a6 Update pt-br.json - initial file 2024-02-20 17:29:03 -03:00
pmangroandGitHub 09dc04c0de Created pt-br.json 2024-02-20 15:40:29 -03:00
advplyrandGitHub 57d5dbc0d0 Merge pull request #1082 from arcao/patch-1
Translate cs.json
2024-02-14 18:42:25 -06:00
Martin SloupandGitHub 11af75e127 Translate cs.json
Translate untranslated texts to Czech and fix already translated texts.
2024-02-14 02:10:33 +01:00
advplyr f8d82a3020 iOS version bump 0.9.72 2024-02-11 08:54:54 -06:00
advplyr 81d7b1cfd7 Version bump 0.9.72-beta 2024-02-10 16:35:01 -06:00
advplyr e15c1bcb32 Fix:Continue listening shelves show on initial failed connection #1038 2024-02-09 17:52:24 -06:00
advplyr 826d414d9f Update:iOS do not resume playback after app suspended. Attempted fix for #973 2024-02-07 18:02:25 -06:00
advplyr 0da6fca727 Fix:iOS 0 second listening sessions #970 and include device info with offline sessions 2024-02-05 19:04:11 -06:00
advplyr 2327bc1705 Update playMethod to fallback to 0 2024-02-04 18:14:24 -06:00
advplyr 3bb76cecac Fix:Android respect offline mode on app restart 2024-02-04 17:46:56 -06:00
advplyr e3f82bb237 Fix:Include device info with sync local-all request 2024-02-04 17:27:57 -06:00
advplyr fcd6270f2d Fix:Hide library list button from app bar when no network connection 2024-02-04 15:53:05 -06:00
advplyr d5411703ca Update:Add 10 second timeout when loading home page shelves 2024-02-04 15:48:37 -06:00
advplyr 8fc2058db8 Update:Handle navigating to library item pages when server connection goes down
- Added loading indicator to library item page on initial request to server
- Redirect to downloaded item page if server item request fails
2024-02-04 15:46:26 -06:00
advplyr d03949f5d1 Update:Audio player title scrolls when overflow #740
- increase width of the title on minimized player to scale with screen width
- mini player shows media title and chapter title
2024-02-03 17:31:53 -06:00
advplyr ff01786063 Remove unused fastSort.js 2024-02-03 13:28:41 -06:00
advplyr bb117ab4da Update:Authors page increase size to fill width with 2 per row #1026 2024-02-02 18:33:23 -06:00
advplyr f5ec247b47 Update:Minimized audio player allow swipe up to fullscreen #1046 2024-02-01 18:20:10 -06:00
advplyr 6e6dd00523 Update:Allow swiping down anywhere on fullscreen audio player to minimize #1046 2024-02-01 17:51:10 -06:00
advplyr c9fb98f033 Fix:Android crash on startup due to SimpleStorage #1040
- Update SimpleStorage to 1.5.5-SNAPSHOT
2024-01-29 16:46:39 -06:00
advplyr 75ecff5e6d Remove @nuxtjs/tailwindcss dependency and replace with standalone tailwindcss 2024-01-25 17:39:22 -06:00
advplyrandGitHub 91a9f918fb Merge pull request #1052 from bloodscript/issue-1051-german-localization-improvement
[issue-1051] German Localization
2024-01-24 14:18:17 -06:00
Steffen Meiselbach 03305f90ca corrected ereader based on current Duden entry 2024-01-23 12:38:31 +01:00
Steffen Meiselbach 9428bc07c5 reverted to uniformly uncapitalized pronouns 2024-01-23 12:37:03 +01:00
Steffen Meiselbach f38f9c3502 ebook written as used in Duden and uniformly capitalized version of Du 2024-01-23 12:33:01 +01:00
Steffen Meiselbach 64a796aece standardized addressing (du), missing translations and uniformly starting with capital character 2024-01-23 07:24:40 +01:00
advplyr 63039fe8c9 Fix pl.json formatting 2024-01-22 17:34:59 -06:00
Steffen Meiselbach 3f2b723d0f (sleep) timer is typically used in german parlance 2024-01-22 22:55:28 +01:00
advplyr ffd7fb1cf9 Update workflows to use node 20 2024-01-21 15:56:24 -06:00
advplyrandGitHub b049b206cf Merge pull request #1049 from Bogumio/patch-2
Update pl.json
2024-01-21 15:31:27 -06:00
advplyr 35f56dc8a9 Merge branch 'master' of https://github.com/advplyr/audiobookshelf-app 2024-01-21 15:32:13 -06:00
advplyr a71cd326cc Update readme node version to 20 2024-01-21 15:32:06 -06:00
BogumioandGitHub cc841d1c7c Update pl.json
The rest of the translations have been completed. Minor corrections and unifications.
2024-01-21 12:04:06 +01:00
advplyrandGitHub 16ecdcf96e Merge pull request #1042 from Bogumio/patch-1
Update pl.json
2024-01-14 11:15:48 -06:00
BogumioandGitHub 96ec56d1ad Update pl.json
Most of the missing phrases have been completed. I will try to translate the rest soon.
2024-01-14 18:07:55 +01:00
advplyr 9b15bafc9f Fix:Settings page button/toggle touch area #1021 2024-01-11 17:27:41 -06:00
advplyr aa02f2e465 Update readme for iOS beta full 2024-01-06 14:15:19 -06:00
advplyrandGitHub 15464617ef Merge pull request #1032 from burghy86/patch-3
Update it.json
2024-01-05 10:21:43 -06:00
burghy86andGitHub 60ecceb59d Update it.json
all string translate
2024-01-05 10:18:48 +01:00
advplyr 3fe943e989 Add:Player setting to scale elapsed time by playback speed #1028
- Moved player settings to new playerSettings key in storage preferences
2024-01-04 15:28:25 -06:00
61 changed files with 3970 additions and 18765 deletions
+2 -2
View File
@@ -16,10 +16,10 @@ jobs:
- name: checkout sources
uses: actions/checkout@v3
- name: use Node.js 16.x
- name: use Node.js 20.x
uses: actions/setup-node@v3
with:
node-version: 16
node-version: 20
- name: Set up Java
uses: actions/setup-java@v2
+2 -2
View File
@@ -15,10 +15,10 @@ jobs:
- name: checkout sources
uses: actions/checkout@v3
- name: use Node.js 16.x
- name: use Node.js 20.x
uses: actions/setup-node@v3
with:
node-version: 16
node-version: 20
- name: Set up Java
uses: actions/setup-java@v2
+5 -3
View File
@@ -33,8 +33,8 @@ android {
applicationId "com.audiobookshelf.app"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 102
versionName "0.9.71-beta"
versionCode 104
versionName "0.9.73-beta"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
manifestPlaceholders = [
"appAuthRedirectScheme": "com.audiobookshelf.app"
@@ -64,6 +64,8 @@ repositories {
dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs'
}
mavenCentral()
// TODO: Temporarily using SNAPSHOT version of Simple Storage that resolves https://github.com/anggrayudi/SimpleStorage/issues/133
maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
}
configurations.configureEach {
@@ -118,7 +120,7 @@ dependencies {
implementation 'io.github.pilgr:paperdb:2.7.2'
// Simple Storage
implementation "com.anggrayudi:storage:1.5.4"
implementation "com.anggrayudi:storage:1.5.5-SNAPSHOT"
// OK HTTP
implementation 'com.squareup.okhttp3:okhttp:4.9.2'
@@ -103,6 +103,9 @@ class MainActivity : BridgeActivity() {
}
}
fun isPlayerNotificationServiceInitialized():Boolean {
return ::foregroundService.isInitialized
}
fun stopMyService() {
if (mBounded) {
@@ -107,6 +107,7 @@ data class PlayItemRequestPayload(
data class DeviceSettings(
var disableAutoRewind:Boolean,
var enableAltView:Boolean,
var allowSeekingOnMediaControls:Boolean,
var jumpBackwardsTime:Int,
var jumpForwardTime:Int,
var enableMp3IndexSeeking:Boolean,
@@ -130,6 +131,7 @@ data class DeviceSettings(
return DeviceSettings(
disableAutoRewind = false,
enableAltView = true,
allowSeekingOnMediaControls = false,
jumpBackwardsTime = 10,
jumpForwardTime = 10,
enableMp3IndexSeeking = false,
@@ -247,14 +247,18 @@ class MediaManager(private var apiHandler: ApiHandler, var ctx: Context) {
}
private fun checkSetValidServerConnectionConfig(cb: (Boolean) -> Unit) = runBlocking {
Log.d(tag, "checkSetValidServerConnectionConfig | $serverConfigIdUsed")
Log.d(tag, "checkSetValidServerConnectionConfig | serverConfigIdUsed=$serverConfigIdUsed | lastServerConnectionConfigId=${DeviceManager.deviceData.lastServerConnectionConfigId}")
coroutineScope {
if (!DeviceManager.checkConnectivity(ctx)) {
serverUserMediaProgress = mutableListOf()
Log.d(tag, "checkSetValidServerConnectionConfig: No connectivity")
cb(false)
} else if (DeviceManager.deviceData.lastServerConnectionConfigId.isNullOrBlank()) { // If in offline mode last server connection config is unset
serverUserMediaProgress = mutableListOf()
Log.d(tag, "checkSetValidServerConnectionConfig: No last server connection config")
cb(false)
} else {
var hasValidConn = false
var lookupMediaProgress = true
@@ -332,6 +336,7 @@ class MediaManager(private var apiHandler: ApiHandler, var ctx: Context) {
checkSetValidServerConnectionConfig { isConnected ->
if (isConnected) {
serverConfigIdUsed = DeviceManager.serverConnectionConfigId
Log.d(tag, "loadAndroidAutoItems: Connected to server config id=$serverConfigIdUsed")
loadLibraries { libraries ->
if (libraries.isEmpty()) {
@@ -358,6 +363,7 @@ class MediaManager(private var apiHandler: ApiHandler, var ctx: Context) {
}
}
} else { // Not connected to server
Log.d(tag, "loadAndroidAutoItems: Not connected to server")
cb()
}
}
@@ -238,6 +238,8 @@ class MediaProgressSyncer(val playerNotificationService: PlayerNotificationServi
saveLocalProgress(it)
lastSyncTime = System.currentTimeMillis()
Log.d(tag, "Sync local device current serverConnectionConfigId=${DeviceManager.serverConnectionConfig?.id}")
// Local library item is linked to a server library item
// Send sync to server also if connected to this server and local item belongs to this server
if (hasNetworkConnection && shouldSyncServer && !it.libraryItemId.isNullOrEmpty() && it.serverConnectionConfigId != null && DeviceManager.serverConnectionConfig?.id == it.serverConnectionConfigId) {
@@ -329,15 +329,7 @@ class PlayerNotificationService : MediaBrowserServiceCompat() {
}
}
mediaSessionConnector.setEnabledPlaybackActions(
PlaybackStateCompat.ACTION_PLAY_PAUSE
or PlaybackStateCompat.ACTION_PLAY
or PlaybackStateCompat.ACTION_PAUSE
or PlaybackStateCompat.ACTION_SEEK_TO
or PlaybackStateCompat.ACTION_FAST_FORWARD
or PlaybackStateCompat.ACTION_REWIND
or PlaybackStateCompat.ACTION_STOP
)
setMediaSessionConnectorPlaybackActions()
mediaSessionConnector.setQueueNavigator(queueNavigator)
mediaSessionConnector.setPlaybackPreparer(MediaSessionPlaybackPreparer(this))
@@ -512,6 +504,20 @@ class PlayerNotificationService : MediaBrowserServiceCompat() {
mediaSessionConnector.setCustomActionProviders(*customActionProviders.toTypedArray())
}
fun setMediaSessionConnectorPlaybackActions() {
var playbackActions = PlaybackStateCompat.ACTION_PLAY_PAUSE or
PlaybackStateCompat.ACTION_PLAY or
PlaybackStateCompat.ACTION_PAUSE or
PlaybackStateCompat.ACTION_FAST_FORWARD or
PlaybackStateCompat.ACTION_REWIND or
PlaybackStateCompat.ACTION_STOP
if (deviceSettings.allowSeekingOnMediaControls) {
playbackActions = playbackActions or PlaybackStateCompat.ACTION_SEEK_TO
}
mediaSessionConnector.setEnabledPlaybackActions(playbackActions)
}
fun handlePlayerPlaybackError(errorMessage:String) {
// On error and was attempting to direct play - fallback to transcode
currentPlaybackSession?.let { playbackSession ->
@@ -1,5 +1,7 @@
package com.audiobookshelf.app.plugins
import android.os.Handler
import android.os.Looper
import android.util.Log
import com.audiobookshelf.app.MainActivity
import com.audiobookshelf.app.data.*
@@ -493,9 +495,16 @@ class AbsDatabase : Plugin() {
fun updateDeviceSettings(call:PluginCall) { // Returns device data
Log.d(tag, "updateDeviceSettings ${call.data}")
val newDeviceSettings = jacksonMapper.readValue<DeviceSettings>(call.data.toString())
GlobalScope.launch(Dispatchers.IO) {
Handler(Looper.getMainLooper()).post {
DeviceManager.deviceData.deviceSettings = newDeviceSettings
DeviceManager.dbManager.saveDeviceData(DeviceManager.deviceData)
// Updates playback actions for media notification (handles media control seek locking setting)
if (mainActivity.isPlayerNotificationServiceInitialized()) {
mainActivity.foregroundService.setMediaSessionConnectorPlaybackActions()
}
call.resolve(JSObject(jacksonMapper.writeValueAsString(DeviceManager.deviceData)))
}
}
@@ -1,6 +1,9 @@
package com.audiobookshelf.app.server
import android.annotation.SuppressLint
import android.content.Context
import android.os.Build
import android.provider.Settings
import android.util.Log
import com.audiobookshelf.app.data.*
import com.audiobookshelf.app.device.DeviceManager
@@ -31,7 +34,7 @@ class ApiHandler(var ctx:Context) {
private var pingClient = OkHttpClient.Builder().callTimeout(3, TimeUnit.SECONDS).build()
private var jacksonMapper = jacksonObjectMapper().enable(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS.mappedFeature())
data class LocalSessionsSyncRequestPayload(val sessions:List<PlaybackSession>)
data class LocalSessionsSyncRequestPayload(val sessions:List<PlaybackSession>, val deviceInfo:DeviceInfo)
@JsonIgnoreProperties(ignoreUnknown = true)
data class LocalSessionSyncResult(val id:String, val success:Boolean, val progressSynced:Boolean?, val error:String?)
data class LocalSessionsSyncResponsePayload(val results:List<LocalSessionSyncResult>)
@@ -322,7 +325,11 @@ class ApiHandler(var ctx:Context) {
}
fun sendSyncLocalSessions(playbackSessions:List<PlaybackSession>, cb: (Boolean, String?) -> Unit) {
val payload = JSObject(jacksonMapper.writeValueAsString(LocalSessionsSyncRequestPayload(playbackSessions)))
@SuppressLint("HardwareIds")
val deviceId = Settings.Secure.getString(ctx.contentResolver, Settings.Secure.ANDROID_ID)
val deviceInfo = DeviceInfo(deviceId, Build.MANUFACTURER, Build.MODEL, Build.VERSION.SDK_INT, Build.VERSION.RELEASE)
val payload = JSObject(jacksonMapper.writeValueAsString(LocalSessionsSyncRequestPayload(playbackSessions, deviceInfo)))
Log.d(tag, "Sending ${playbackSessions.size} saved local playback sessions to server")
postRequest("/api/session/local-all", payload, null) {
if (!it.getString("error").isNullOrEmpty()) {
+117
View File
@@ -0,0 +1,117 @@
class WrappingMarquee {
#scrollDelay = 2000
#scrollSpeed = 30
/**
* @param {HTMLElement} el
*/
constructor(el) {
this.el = el
/** @type {HTMLElement} */
this.pEl = el?.firstElementChild
this.innerText = ''
this.isScrolling = false
/** @type {NodeJS.Timeout} */
this.timer = null
/** @type {number} */
this.animationId = null
}
/**
* Transparent gradient mask shown when text is scrolling left and overflowing right
*
* @param {boolean} showLeft
*/
setMask(showLeft) {
if (!this.el) return
this.el.style.maskImage = showLeft ? 'linear-gradient(90deg, transparent 0%, #fff 10%, #000 90%, transparent)' : 'linear-gradient(90deg, #000 90%, transparent)'
}
startScroll() {
if (this.isScrolling) {
console.warn('Already scrolling')
return
}
this.isScrolling = true
this.setMask(true)
let textScrollAmount = this.el.scrollWidth
this.pEl.innerHTML = this.innerText + '&nbsp;'.repeat(15)
let totalScrollAmount = this.el.scrollWidth
let scrollDuration = totalScrollAmount * this.#scrollSpeed
this.pEl.innerHTML = this.pEl.innerHTML + this.innerText
let done = false
let start, previousTimeStamp
const step = (timeStamp) => {
if (start === undefined) {
start = timeStamp
}
const elapsed = timeStamp - start
if (this.isScrolling && previousTimeStamp !== timeStamp) {
const amountToMove = Math.min(elapsed / scrollDuration * totalScrollAmount, totalScrollAmount)
this.pEl.style.transform = `translateX(-${amountToMove}px)`
if (amountToMove === totalScrollAmount) done = true
if (amountToMove > textScrollAmount) this.setMask(false)
}
if (!this.isScrolling || done) { // canceled or done
this.isScrolling = false
this.pEl.style.transform = 'translateX(0px)'
this.pEl.innerText = this.innerText
this.setMask(false)
if (done) {
this.startTimer()
}
} else if (elapsed < scrollDuration) { // step
previousTimeStamp = timeStamp
this.animationId = window.requestAnimationFrame(step)
}
}
this.animationId = window.requestAnimationFrame(step)
}
startTimer() {
clearTimeout(this.timer)
this.timer = setTimeout(() => {
this.startScroll()
}, this.#scrollDelay)
}
reset() {
clearTimeout(this.timer)
this.timer = null
this.isScrolling = false
window.cancelAnimationFrame(this.animationId)
}
/**
* Initialize and start marquee if text overflows container
* resets the marquee if already active
*
* @param {string} innerText
*/
init(innerText) {
if (!this.el || !this.pEl) return
this.reset()
this.innerText = innerText
this.pEl.innerText = innerText
this.pEl.style.transform = 'translateX(0px)'
if (this.el.scrollWidth > this.el.clientWidth) {
this.setMask(false)
this.startTimer()
} else {
this.el.style.maskImage = ''
}
}
}
export default WrappingMarquee
-158
View File
@@ -1,158 +0,0 @@
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global['fast-sort'] = {}));
}(this, (function (exports) {
'use strict';
// >>> INTERFACES <<<
// >>> HELPERS <<<
var castComparer = function (comparer) { return function (a, b, order) { return comparer(a, b, order) * order; }; };
var throwInvalidConfigErrorIfTrue = function (condition, context) {
if (condition)
throw Error("Invalid sort config: " + context);
};
var unpackObjectSorter = function (sortByObj) {
var _a = sortByObj || {}, asc = _a.asc, desc = _a.desc;
var order = asc ? 1 : -1;
var sortBy = (asc || desc);
// Validate object config
throwInvalidConfigErrorIfTrue(!sortBy, 'Expected `asc` or `desc` property');
throwInvalidConfigErrorIfTrue(asc && desc, 'Ambiguous object with `asc` and `desc` config properties');
var comparer = sortByObj.comparer && castComparer(sortByObj.comparer);
return { order: order, sortBy: sortBy, comparer: comparer };
};
// >>> SORTERS <<<
var multiPropertySorterProvider = function (defaultComparer) {
return function multiPropertySorter(sortBy, sortByArr, depth, order, comparer, a, b) {
var valA;
var valB;
if (typeof sortBy === 'string') {
valA = a[sortBy];
valB = b[sortBy];
}
else if (typeof sortBy === 'function') {
valA = sortBy(a);
valB = sortBy(b);
}
else {
var objectSorterConfig = unpackObjectSorter(sortBy);
return multiPropertySorter(objectSorterConfig.sortBy, sortByArr, depth, objectSorterConfig.order, objectSorterConfig.comparer || defaultComparer, a, b);
}
var equality = comparer(valA, valB, order);
if ((equality === 0 || (valA == null && valB == null)) &&
sortByArr.length > depth) {
return multiPropertySorter(sortByArr[depth], sortByArr, depth + 1, order, comparer, a, b);
}
return equality;
};
};
function getSortStrategy(sortBy, comparer, order) {
// Flat array sorter
if (sortBy === undefined || sortBy === true) {
return function (a, b) { return comparer(a, b, order); };
}
// Sort list of objects by single object key
if (typeof sortBy === 'string') {
throwInvalidConfigErrorIfTrue(sortBy.includes('.'), 'String syntax not allowed for nested properties.');
return function (a, b) { return comparer(a[sortBy], b[sortBy], order); };
}
// Sort list of objects by single function sorter
if (typeof sortBy === 'function') {
return function (a, b) { return comparer(sortBy(a), sortBy(b), order); };
}
// Sort by multiple properties
if (Array.isArray(sortBy)) {
var multiPropSorter_1 = multiPropertySorterProvider(comparer);
return function (a, b) { return multiPropSorter_1(sortBy[0], sortBy, 1, order, comparer, a, b); };
}
// Unpack object config to get actual sorter strategy
var objectSorterConfig = unpackObjectSorter(sortBy);
return getSortStrategy(objectSorterConfig.sortBy, objectSorterConfig.comparer || comparer, objectSorterConfig.order);
}
var sortArray = function (order, ctx, sortBy, comparer) {
var _a;
if (!Array.isArray(ctx)) {
return ctx;
}
// Unwrap sortBy if array with only 1 value to get faster sort strategy
if (Array.isArray(sortBy) && sortBy.length < 2) {
_a = sortBy, sortBy = _a[0];
}
return ctx.sort(getSortStrategy(sortBy, comparer, order));
};
// >>> Public <<<
var createNewSortInstance = function (opts) {
var comparer = castComparer(opts.comparer);
return function (_ctx) {
var ctx = Array.isArray(_ctx) && !opts.inPlaceSorting
? _ctx.slice()
: _ctx;
return {
/**
* Sort array in ascending order.
* @example
* sort([3, 1, 4]).asc();
* sort(users).asc(u => u.firstName);
* sort(users).asc([
* U => u.firstName
* u => u.lastName,
* ]);
*/
asc: function (sortBy) {
return sortArray(1, ctx, sortBy, comparer);
},
/**
* Sort array in descending order.
* @example
* sort([3, 1, 4]).desc();
* sort(users).desc(u => u.firstName);
* sort(users).desc([
* U => u.firstName
* u => u.lastName,
* ]);
*/
desc: function (sortBy) {
return sortArray(-1, ctx, sortBy, comparer);
},
/**
* Sort array in ascending or descending order. It allows sorting on multiple props
* in different order for each of them.
* @example
* sort(users).by([
* { asc: u => u.score }
* { desc: u => u.age }
* ]);
*/
by: function (sortBy) {
return sortArray(1, ctx, sortBy, comparer);
},
};
};
};
var defaultComparer = function (a, b, order) {
if (a == null)
return order;
if (b == null)
return -order;
if (a < b)
return -1;
if (a === b)
return 0;
return 1;
};
var sort = createNewSortInstance({
comparer: defaultComparer,
});
var inPlaceSort = createNewSortInstance({
comparer: defaultComparer,
inPlaceSorting: true,
});
exports.createNewSortInstance = createNewSortInstance;
exports.inPlaceSort = inPlaceSort;
exports.sort = sort;
Object.defineProperty(exports, '__esModule', { value: true });
})));
+7 -4
View File
@@ -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-icons text-3xl text-fg">arrow_back</span>
</a>
<div v-if="user && currentLibrary">
<div v-if="user && currentLibrary && networkConnected">
<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>
@@ -54,14 +54,17 @@ export default {
this.$store.commit('setCastAvailable', val)
}
},
networkConnected() {
return this.$store.state.networkConnected
},
currentLibrary() {
return this.$store.getters['libraries/getCurrentLibrary']
},
currentLibraryName() {
return this.currentLibrary ? this.currentLibrary.name : ''
return this.currentLibrary?.name || ''
},
currentLibraryIcon() {
return this.currentLibrary ? this.currentLibrary.icon : 'database'
return this.currentLibrary?.icon || 'database'
},
showBack() {
if (!this.$route.name) return true
@@ -71,7 +74,7 @@ export default {
return this.$store.state.user.user
},
username() {
return this.user ? this.user.username : 'err'
return this.user?.username || 'err'
},
isCasting() {
return this.$store.state.isCasting
+172 -83
View File
@@ -15,7 +15,7 @@
<p class="top-4 absolute left-0 right-0 mx-auto text-center uppercase tracking-widest text-opacity-75" :class="{ 'text-black text-opacity-75': coverBgIsLight }" style="font-size: 10px">{{ isDirectPlayMethod ? $strings.LabelPlaybackDirect : isLocalPlayMethod ? $strings.LabelPlaybackLocal : $strings.LabelPlaybackTranscode }}</p>
</div>
<div v-if="useChapterTrack && useTotalTrack && showFullscreen" class="absolute total-track w-full z-30 px-6">
<div v-if="playerSettings.useChapterTrack && playerSettings.useTotalTrack && showFullscreen" class="absolute total-track w-full z-30 px-6">
<div class="flex">
<p class="font-mono text-fg" style="font-size: 0.8rem">{{ currentTimePretty }}</p>
<div class="flex-grow" />
@@ -41,7 +41,9 @@
</div>
<div class="title-author-texts absolute z-30 left-0 right-0 overflow-hidden" @click="clickTitleAndAuthor">
<p class="title-text truncate">{{ title }}</p>
<div ref="titlewrapper" class="overflow-hidden relative">
<p class="title-text whitespace-nowrap"></p>
</div>
<p class="author-text text-fg text-opacity-75 truncate">{{ authorName }}</p>
</div>
@@ -66,17 +68,17 @@
<div v-else class="w-full h-full absolute top-0 left-0 pointer-events-none" style="background: var(--gradient-minimized-audio-player)" />
<div id="playerControls" class="absolute right-0 bottom-0 mx-auto" style="max-width: 414px">
<div class="flex items-center max-w-full" :class="lockUi ? 'justify-center' : 'justify-between'">
<span v-show="showFullscreen && !lockUi" class="material-icons next-icon text-fg cursor-pointer" :class="isLoading ? 'text-opacity-10' : 'text-opacity-75'" @click.stop="jumpChapterStart">first_page</span>
<span v-show="!lockUi" class="material-icons jump-icon text-fg cursor-pointer" :class="isLoading ? 'text-opacity-10' : 'text-opacity-75'" @click.stop="jumpBackwards">{{ jumpBackwardsIcon }}</span>
<div class="flex items-center max-w-full" :class="playerSettings.lockUi ? 'justify-center' : 'justify-between'">
<span v-show="showFullscreen && !playerSettings.lockUi" class="material-icons next-icon text-fg cursor-pointer" :class="isLoading ? 'text-opacity-10' : 'text-opacity-75'" @click.stop="jumpChapterStart">first_page</span>
<span v-show="!playerSettings.lockUi" class="material-icons jump-icon text-fg cursor-pointer" :class="isLoading ? 'text-opacity-10' : 'text-opacity-75'" @click.stop="jumpBackwards">{{ jumpBackwardsIcon }}</span>
<div class="play-btn cursor-pointer shadow-sm flex items-center justify-center rounded-full text-primary mx-4 relative overflow-hidden" :style="{ backgroundColor: coverRgb }" :class="{ 'animate-spin': seekLoading }" @mousedown.prevent @mouseup.prevent @click.stop="playPauseClick">
<div v-if="!coverBgIsLight" class="absolute top-0 left-0 w-full h-full bg-white bg-opacity-20 pointer-events-none" />
<span v-if="!isLoading" class="material-icons" :class="{ 'text-white': coverRgb && !coverBgIsLight }">{{ seekLoading ? 'autorenew' : !isPlaying ? 'play_arrow' : 'pause' }}</span>
<widgets-spinner-icon v-else class="h-8 w-8" />
</div>
<span v-show="!lockUi" class="material-icons jump-icon text-fg cursor-pointer" :class="isLoading ? 'text-opacity-10' : 'text-opacity-75'" @click.stop="jumpForward">{{ jumpForwardIcon }}</span>
<span v-show="showFullscreen && !lockUi" class="material-icons next-icon text-fg cursor-pointer" :class="nextChapter && !isLoading ? 'text-opacity-75' : 'text-opacity-10'" @click.stop="jumpNextChapter">last_page</span>
<span v-show="!playerSettings.lockUi" class="material-icons jump-icon text-fg cursor-pointer" :class="isLoading ? 'text-opacity-10' : 'text-opacity-75'" @click.stop="jumpForward">{{ jumpForwardIcon }}</span>
<span v-show="showFullscreen && !playerSettings.lockUi" class="material-icons next-icon text-fg cursor-pointer" :class="nextChapter && !isLoading ? 'text-opacity-75' : 'text-opacity-10'" @click.stop="jumpNextChapter">last_page</span>
</div>
</div>
@@ -90,7 +92,7 @@
<div ref="readyTrack" class="h-full bg-track-buffered absolute top-0 left-0 rounded-full pointer-events-none" />
<div ref="bufferedTrack" class="h-full bg-track absolute top-0 left-0 rounded-full pointer-events-none" />
<div ref="playedTrack" class="h-full bg-track-cursor absolute top-0 left-0 rounded-full pointer-events-none" />
<div ref="trackCursor" class="h-7 w-7 rounded-full absolute pointer-events-auto flex items-center justify-center" :style="{ top: '-11px' }" :class="{ 'opacity-0': lockUi || !showFullscreen }" @touchstart="touchstartCursor">
<div ref="trackCursor" class="h-7 w-7 rounded-full absolute pointer-events-auto flex items-center justify-center" :style="{ top: '-11px' }" :class="{ 'opacity-0': playerSettings.lockUi || !showFullscreen }" @touchstart="touchstartCursor">
<div class="bg-track-cursor rounded-full w-3.5 h-3.5 pointer-events-none" />
</div>
</div>
@@ -98,7 +100,7 @@
</div>
<modals-chapters-modal v-model="showChapterModal" :current-chapter="currentChapter" :chapters="chapters" :playback-rate="currentPlaybackRate" @select="selectChapter" />
<modals-dialog v-model="showMoreMenuDialog" :items="menuItems" @action="clickMenuAction" />
<modals-dialog v-model="showMoreMenuDialog" :items="menuItems" width="80vw" @action="clickMenuAction" />
</div>
</template>
@@ -106,6 +108,7 @@
import { Capacitor } from '@capacitor/core'
import { AbsAudioPlayer } from '@/plugins/capacitor'
import { FastAverageColor } from 'fast-average-color'
import WrappingMarquee from '@/assets/WrappingMarquee.js'
export default {
props: {
@@ -145,10 +148,12 @@ export default {
onPlaybackSpeedChangedListener: null,
touchStartY: 0,
touchStartTime: 0,
touchEndY: 0,
useChapterTrack: false,
useTotalTrack: true,
lockUi: false,
playerSettings: {
useChapterTrack: false,
useTotalTrack: true,
scaleElapsedTimeBySpeed: true,
lockUi: false
},
isLoading: false,
isDraggingCursor: false,
draggingTouchStartX: 0,
@@ -157,17 +162,22 @@ export default {
syncStatus: 0,
showMoreMenuDialog: false,
coverRgb: 'rgb(55, 56, 56)',
coverBgIsLight: false
coverBgIsLight: false,
titleMarquee: null,
isRefreshingUI: false
}
},
watch: {
showFullscreen(val) {
this.updateScreenSize()
this.$store.commit('setPlayerFullscreen', !!val)
document.querySelector('body').style.backgroundColor = this.showFullscreen ? this.coverRgb : ""
document.querySelector('body').style.backgroundColor = this.showFullscreen ? this.coverRgb : ''
},
bookCoverAspectRatio() {
this.updateScreenSize()
},
title(val) {
if (this.titleMarquee) this.titleMarquee.init(val)
}
},
computed: {
@@ -187,17 +197,22 @@ export default {
{
text: this.$strings.LabelTotalTrack,
value: 'total_track',
icon: this.useTotalTrack ? 'check_box' : 'check_box_outline_blank'
icon: this.playerSettings.useTotalTrack ? 'check_box' : 'check_box_outline_blank'
},
{
text: this.$strings.LabelChapterTrack,
value: 'chapter_track',
icon: this.useChapterTrack ? 'check_box' : 'check_box_outline_blank'
icon: this.playerSettings.useChapterTrack ? 'check_box' : 'check_box_outline_blank'
},
{
text: this.lockUi ? this.$strings.LabelUnlockPlayer : this.$strings.LabelLockPlayer,
text: this.$strings.LabelScaleElapsedTimeBySpeed,
value: 'scale_elapsed_time',
icon: this.playerSettings.scaleElapsedTimeBySpeed ? 'check_box' : 'check_box_outline_blank'
},
{
text: this.playerSettings.lockUi ? this.$strings.LabelUnlockPlayer : this.$strings.LabelLockPlayer,
value: 'lock',
icon: this.lockUi ? 'lock' : 'lock_open'
icon: this.playerSettings.lockUi ? 'lock' : 'lock_open'
},
{
text: this.$strings.LabelClosePlayer,
@@ -257,22 +272,22 @@ export default {
return this.mediaPlayer === 'cast-player'
},
mediaPlayer() {
return this.playbackSession ? this.playbackSession.mediaPlayer : null
return this.playbackSession?.mediaPlayer || null
},
mediaType() {
return this.playbackSession ? this.playbackSession.mediaType : null
return this.playbackSession?.mediaType || null
},
isPodcast() {
return this.mediaType === 'podcast'
},
mediaMetadata() {
return this.playbackSession ? this.playbackSession.mediaMetadata : null
return this.playbackSession?.mediaMetadata || null
},
libraryItem() {
return this.playbackSession ? this.playbackSession.libraryItem || null : null
return this.playbackSession?.libraryItem || null
},
localLibraryItem() {
return this.playbackSession ? this.playbackSession.localLibraryItem || null : null
return this.playbackSession?.localLibraryItem || null
},
localLibraryItemCoverSrc() {
var localItemCover = this.localLibraryItem?.coverContentUrl || null
@@ -280,7 +295,7 @@ export default {
return null
},
playMethod() {
return this.playbackSession ? this.playbackSession.playMethod : null
return this.playbackSession?.playMethod || 0
},
isLocalPlayMethod() {
return this.playMethod == this.$constants.PlayMethod.LOCAL
@@ -289,19 +304,19 @@ export default {
return this.playMethod == this.$constants.PlayMethod.DIRECTPLAY
},
title() {
if (this.currentChapterTitle && this.showFullscreen) return this.currentChapterTitle
if (this.playbackSession) return this.playbackSession.displayTitle
return this.mediaMetadata ? this.mediaMetadata.title : 'Title'
const mediaItemTitle = this.playbackSession?.displayTitle || this.mediaMetadata?.title || 'Title'
if (this.currentChapterTitle) {
if (this.showFullscreen) return this.currentChapterTitle
return `${mediaItemTitle} | ${this.currentChapterTitle}`
}
return mediaItemTitle
},
authorName() {
if (this.playbackSession) return this.playbackSession.displayAuthor
return this.mediaMetadata ? this.mediaMetadata.authorName : 'Author'
return this.mediaMetadata?.authorName || 'Author'
},
chapters() {
if (this.playbackSession && this.playbackSession.chapters) {
return this.playbackSession.chapters
}
return []
return this.playbackSession?.chapters || []
},
currentChapter() {
if (!this.chapters.length) return null
@@ -312,7 +327,7 @@ export default {
return this.chapters.find((c) => Number(Number(c.start).toFixed(2)) > this.currentTime)
},
currentChapterTitle() {
return this.currentChapter ? this.currentChapter.title : ''
return this.currentChapter?.title || ''
},
currentChapterDuration() {
return this.currentChapter ? this.currentChapter.end - this.currentChapter.start : this.totalDuration
@@ -322,11 +337,14 @@ export default {
},
currentTimePretty() {
let currentTimeToUse = this.isDraggingCursor ? this.draggingCurrentTime : this.currentTime
return this.$secondsToTimestamp(currentTimeToUse / this.currentPlaybackRate)
if (this.playerSettings.scaleElapsedTimeBySpeed) {
currentTimeToUse = currentTimeToUse / this.currentPlaybackRate
}
return this.$secondsToTimestamp(currentTimeToUse)
},
timeRemaining() {
let currentTimeToUse = this.isDraggingCursor ? this.draggingCurrentTime : this.currentTime
if (this.useChapterTrack && this.currentChapter) {
if (this.playerSettings.useChapterTrack && this.currentChapter) {
var currChapTime = currentTimeToUse - this.currentChapter.start
return (this.currentChapterDuration - currChapTime) / this.currentPlaybackRate
}
@@ -412,7 +430,11 @@ export default {
AbsAudioPlayer.requestSession()
},
clickContainer() {
this.expandToFullscreen()
},
expandToFullscreen() {
this.showFullscreen = true
if (this.titleMarquee) this.titleMarquee.reset()
// Update track for total time bar if useChapterTrack is set
this.$nextTick(() => {
@@ -421,6 +443,8 @@ export default {
},
collapseFullscreen() {
this.showFullscreen = false
if (this.titleMarquee) this.titleMarquee.reset()
this.forceCloseDropdownMenu()
},
async jumpNextChapter() {
@@ -494,7 +518,7 @@ export default {
this.updateReadyTrack()
},
updateReadyTrack() {
if (this.useChapterTrack) {
if (this.playerSettings.useChapterTrack) {
if (this.$refs.totalReadyTrack) {
this.$refs.totalReadyTrack.style.width = this.readyTrackWidth + 'px'
}
@@ -511,11 +535,14 @@ export default {
}
let currentTime = this.isDraggingCursor ? this.draggingCurrentTime : this.currentTime
if (this.useChapterTrack && this.currentChapter) {
if (this.playerSettings.useChapterTrack && this.currentChapter) {
currentTime = Math.max(0, currentTime - this.currentChapter.start)
}
if (this.playerSettings.scaleElapsedTimeBySpeed) {
currentTime = currentTime / this.currentPlaybackRate
}
ts.innerText = this.$secondsToTimestamp(currentTime / this.currentPlaybackRate)
ts.innerText = this.$secondsToTimestamp(currentTime)
},
timeupdate() {
if (!this.$refs.playedTrack) {
@@ -543,7 +570,7 @@ export default {
let bufferedPercent = this.bufferedTime / this.totalDuration
const totalBufferedPercent = bufferedPercent
if (this.useChapterTrack && this.currentChapter) {
if (this.playerSettings.useChapterTrack && this.currentChapter) {
const currChapTime = currentTimeToUse - this.currentChapter.start
percentDone = currChapTime / this.currentChapterDuration
bufferedPercent = Math.max(0, Math.min(1, (this.bufferedTime - this.currentChapter.start) / this.currentChapterDuration))
@@ -557,7 +584,7 @@ export default {
this.$refs.trackCursor.style.left = ptWidth - 14 + 'px'
}
if (this.useChapterTrack) {
if (this.playerSettings.useChapterTrack) {
if (this.$refs.totalPlayedTrack) this.$refs.totalPlayedTrack.style.width = Math.round(totalPercentDone * this.trackWidth) + 'px'
if (this.$refs.totalBufferedTrack) this.$refs.totalBufferedTrack.style.width = Math.round(totalBufferedPercent * this.trackWidth) + 'px'
}
@@ -584,7 +611,7 @@ export default {
}
},
async touchstartCursor(e) {
if (!e || !e.touches || !this.$refs.track || !this.showFullscreen || this.lockUi) return
if (!e || !e.touches || !this.$refs.track || !this.showFullscreen || this.playerSettings.lockUi) return
await this.$hapticsImpact()
this.isDraggingCursor = true
@@ -625,42 +652,49 @@ export default {
resetStream(startTime) {
this.closePlayback()
},
handleGesture() {
var touchDistance = this.touchEndY - this.touchStartY
if (touchDistance > 100) {
this.collapseFullscreen()
}
},
touchstart(e) {
if (!this.showFullscreen || !e.changedTouches) return
if (e.pageX < 20) {
if (!e.changedTouches || this.$store.state.globals.isModalOpen) return
const touchPosY = e.changedTouches[0].pageY
// when minimized only listen to touchstart on the player
if (!this.showFullscreen && touchPosY < window.innerHeight - 120) return
// for ios
if (!this.showFullscreen && e.pageX < 20) {
e.preventDefault()
e.stopImmediatePropagation()
}
this.touchStartY = e.changedTouches[0].screenY
if (this.touchStartY > window.innerHeight / 3) {
// console.log('touch too low')
return
}
this.touchStartY = touchPosY
this.touchStartTime = Date.now()
},
touchend(e) {
if (!e.changedTouches) return
const touchDuration = Date.now() - this.touchStartTime
const touchEndY = e.changedTouches[0].pageY
const touchDistanceY = touchEndY - this.touchStartY
// reset touch start data
this.touchStartTime = 0
this.touchStartY = 0
if (this.isDraggingCursor) {
if (this.draggingCurrentTime !== this.currentTime) {
this.seek(this.draggingCurrentTime)
}
this.isDraggingCursor = false
} else if (this.showFullscreen) {
this.touchEndY = e.changedTouches[0].screenY
var touchDuration = Date.now() - this.touchStartTime
} else {
if (touchDuration > 1200) {
// console.log('touch too long', touchDuration)
return
}
this.handleGesture()
if (this.showFullscreen) {
// Touch start higher than touchend
if (touchDistanceY > 100) {
this.collapseFullscreen()
}
} else if (touchDistanceY < -100) {
this.expandToFullscreen()
}
}
},
touchmove(e) {
@@ -670,7 +704,7 @@ export default {
let duration = this.totalDuration
let minTime = 0
let maxTime = duration
if (this.useChapterTrack && this.currentChapter) {
if (this.playerSettings.useChapterTrack && this.currentChapter) {
duration = this.currentChapterDuration
minTime = this.currentChapter.start
maxTime = minTime + duration
@@ -690,37 +724,40 @@ export default {
if (action === 'history') {
this.$router.push(`/media/${this.mediaId}/history?title=${this.title}`)
this.showFullscreen = false
} else if (action === 'scale_elapsed_time') {
this.playerSettings.scaleElapsedTimeBySpeed = !this.playerSettings.scaleElapsedTimeBySpeed
this.updateTimestamp()
this.savePlayerSettings()
} else if (action === 'lock') {
this.lockUi = !this.lockUi
this.$localStore.setPlayerLock(this.lockUi)
this.playerSettings.lockUi = !this.playerSettings.lockUi
this.savePlayerSettings()
} else if (action === 'chapter_track') {
this.useChapterTrack = !this.useChapterTrack
this.useTotalTrack = !this.useChapterTrack || this.useTotalTrack
this.playerSettings.useChapterTrack = !this.playerSettings.useChapterTrack
this.playerSettings.useTotalTrack = !this.playerSettings.useChapterTrack || this.playerSettings.useTotalTrack
this.updateTimestamp()
this.updateTrack()
this.updateReadyTrack()
this.updateUseChapterTrack()
this.$localStore.setUseTotalTrack(this.useTotalTrack)
this.savePlayerSettings()
} else if (action === 'total_track') {
this.useTotalTrack = !this.useTotalTrack
this.useChapterTrack = !this.useTotalTrack || this.useChapterTrack
this.playerSettings.useTotalTrack = !this.playerSettings.useTotalTrack
this.playerSettings.useChapterTrack = !this.playerSettings.useTotalTrack || this.playerSettings.useChapterTrack
this.updateTimestamp()
this.updateTrack()
this.updateReadyTrack()
this.updateUseChapterTrack()
this.$localStore.setUseTotalTrack(this.useTotalTrack)
this.savePlayerSettings()
} else if (action === 'close') {
this.closePlayback()
}
})
},
updateUseChapterTrack() {
this.$localStore.setUseChapterTrack(this.useChapterTrack)
// Chapter track in NowPlaying only supported on iOS for now
if (this.$platform === 'ios') {
AbsAudioPlayer.setChapterTrack({ enabled: this.useChapterTrack })
AbsAudioPlayer.setChapterTrack({ enabled: this.playerSettings.useChapterTrack })
}
},
forceCloseDropdownMenu() {
@@ -739,6 +776,30 @@ export default {
this.isLoading = false
this.playbackSession = null
},
async loadPlayerSettings() {
const savedPlayerSettings = await this.$localStore.getPlayerSettings()
if (!savedPlayerSettings) {
// In 0.9.72-beta 'useChapterTrack', 'useTotalTrack' and 'playerLock' was replaced with 'playerSettings' JSON object
// Check if this old key was set and if so migrate them over to 'playerSettings'
const chapterTrackPref = await this.$localStore.getPreferenceByKey('useChapterTrack')
if (chapterTrackPref) {
this.playerSettings.useChapterTrack = chapterTrackPref === '1'
const totalTrackPref = await this.$localStore.getPreferenceByKey('useTotalTrack')
this.playerSettings.useTotalTrack = totalTrackPref === '1'
const playerLockPref = await this.$localStore.getPreferenceByKey('playerLock')
this.playerSettings.lockUi = playerLockPref === '1'
}
this.savePlayerSettings()
} else {
this.playerSettings.useChapterTrack = !!savedPlayerSettings.useChapterTrack
this.playerSettings.useTotalTrack = !!savedPlayerSettings.useTotalTrack
this.playerSettings.lockUi = !!savedPlayerSettings.lockUi
this.playerSettings.scaleElapsedTimeBySpeed = !!savedPlayerSettings.scaleElapsedTimeBySpeed
}
},
savePlayerSettings() {
return this.$localStore.setPlayerSettings({ ...this.playerSettings })
},
//
// Listeners from audio AbsAudioPlayer
//
@@ -783,6 +844,10 @@ export default {
// Set track width
this.$nextTick(() => {
if (this.titleMarquee) this.titleMarquee.reset()
this.titleMarquee = new WrappingMarquee(this.$refs.titlewrapper)
this.titleMarquee.init(this.title)
if (this.$refs.track) {
this.trackWidth = this.$refs.track.clientWidth
} else {
@@ -805,9 +870,7 @@ export default {
this.updateTimestamp()
},
async init() {
this.useChapterTrack = await this.$localStore.getUseChapterTrack()
this.useTotalTrack = await this.$localStore.getUseTotalTrack()
this.lockUi = await this.$localStore.getPlayerLock()
await this.loadPlayerSettings()
this.onPlaybackSessionListener = AbsAudioPlayer.addListener('onPlaybackSession', this.onPlaybackSession)
this.onPlaybackClosedListener = AbsAudioPlayer.addListener('onPlaybackClosed', this.onPlaybackClosed)
@@ -818,26 +881,51 @@ export default {
this.onProgressSyncSuccess = AbsAudioPlayer.addListener('onProgressSyncSuccess', this.showProgressSyncSuccess)
this.onPlaybackSpeedChangedListener = AbsAudioPlayer.addListener('onPlaybackSpeedChanged', this.onPlaybackSpeedChanged)
},
screenOrientationChange() {
setTimeout(() => {
this.updateScreenSize()
if (this.$refs.track) {
this.trackWidth = this.$refs.track.clientWidth
this.updateTrack()
this.updateReadyTrack()
async screenOrientationChange() {
if (this.isRefreshingUI) return
this.isRefreshingUI = true
const windowWidth = window.innerWidth
this.refreshUI()
// Window width does not always change right away. Wait up to 250ms for a change.
// iPhone 10 on iOS 16 took between 100 - 200ms to update when going from portrait to landscape
// but landscape to portrait was immediate
for (let i = 0; i < 5; i++) {
await new Promise((resolve) => setTimeout(resolve, 50))
if (window.innerWidth !== windowWidth) {
this.refreshUI()
break
}
}, 50)
}
this.isRefreshingUI = false
},
refreshUI() {
this.updateScreenSize()
if (this.$refs.track) {
this.trackWidth = this.$refs.track.clientWidth
this.updateTrack()
this.updateReadyTrack()
}
},
updateScreenSize() {
setTimeout(() => {
if (this.titleMarquee) this.titleMarquee.init(this.title)
}, 500)
this.windowHeight = window.innerHeight
this.windowWidth = window.innerWidth
const coverHeight = this.fullscreenBookCoverWidth * this.bookCoverAspectRatio
const coverImageWidthCollapsed = 46 / this.bookCoverAspectRatio
const titleAuthorLeftOffsetCollapsed = 30 + coverImageWidthCollapsed
const titleAuthorWidthCollapsed = this.windowWidth - 128 - titleAuthorLeftOffsetCollapsed - 10
document.documentElement.style.setProperty('--cover-image-width', this.fullscreenBookCoverWidth + 'px')
document.documentElement.style.setProperty('--cover-image-height', coverHeight + 'px')
document.documentElement.style.setProperty('--cover-image-width-collapsed', coverImageWidthCollapsed + 'px')
document.documentElement.style.setProperty('--cover-image-height-collapsed', 46 + 'px')
document.documentElement.style.setProperty('--title-author-left-offset-collapsed', 30 + coverImageWidthCollapsed + 'px')
document.documentElement.style.setProperty('--title-author-left-offset-collapsed', titleAuthorLeftOffsetCollapsed + 'px')
document.documentElement.style.setProperty('--title-author-width-collapsed', titleAuthorWidthCollapsed + 'px')
},
minimizePlayerEvt() {
this.collapseFullscreen()
@@ -905,6 +993,7 @@ export default {
--cover-image-width-collapsed: 46px;
--cover-image-height-collapsed: 46px;
--title-author-left-offset-collapsed: 80px;
--title-author-width-collapsed: 40%;
}
.playerContainer {
@@ -952,7 +1041,7 @@ export default {
transition-property: left, bottom, width, height;
transform-origin: left bottom;
width: 40%;
width: var(--title-author-width-collapsed);
bottom: 76px;
left: var(--title-author-left-offset-collapsed);
text-align: left;
+1 -1
View File
@@ -79,7 +79,7 @@ export default {
return this.page
},
hasFilter() {
if (this.page === 'series' || this.page === 'collections') return false
if (this.page === 'series' || this.page === 'collections' || this.page === 'playlists') return false
return this.filterBy !== 'all'
},
orderBy() {
+6 -1
View File
@@ -493,7 +493,12 @@ export default {
if (router) {
if (this.recentEpisode) router.push(`/item/${this.libraryItemId}/${this.recentEpisode.id}`)
else if (this.collapsedSeries) router.push(`/bookshelf/series/${this.collapsedSeries.id}`)
else router.push(`/item/${this.libraryItemId}`)
else if (this.localLibraryItem) {
// Pass local library item id to server page to allow falling back to offline page
router.push(`/item/${this.libraryItemId}?localLibraryItemId=${this.localLibraryItemId}`)
} else {
router.push(`/item/${this.libraryItemId}`)
}
}
}
},
+1 -1
View File
@@ -40,7 +40,7 @@ export default {
default: '16px'
},
width: {
type: Number,
type: [String, Number],
default: 300
}
},
+38
View File
@@ -26,6 +26,10 @@ export default {
type: Object,
default: () => null
},
playlist: {
type: Object,
default: () => null
},
hideRssFeedOption: Boolean
},
data() {
@@ -92,6 +96,15 @@ export default {
}
}
// If on playlist page show remove from playlist option
if (this.playlist) {
items.push({
text: this.$strings.LabelRemoveFromPlaylist,
value: 'removeFromPlaylist',
icon: 'playlist_remove'
})
}
if (this.showRSSFeedOption) {
items.push({
text: this.rssFeed ? this.$strings.HeaderRSSFeed : this.$strings.HeaderOpenRSSFeed,
@@ -255,6 +268,8 @@ export default {
} else if (action === 'playlist') {
this.$store.commit('globals/setSelectedPlaylistItems', [{ libraryItem: this.libraryItem, episode: this.episode }])
this.$store.commit('globals/setShowPlaylistsAddCreateModal', true)
} else if (action === 'removeFromPlaylist') {
this.removeFromPlaylistClick()
} else if (action === 'markFinished') {
if (this.episode) this.toggleEpisodeFinished()
else this.toggleFinished()
@@ -456,6 +471,29 @@ export default {
.finally(() => {
this.$emit('update:processing', false)
})
},
removeFromPlaylistClick() {
if (!this.playlist) {
this.$toast.error('Invalid: No Playlist')
return
}
this.$emit('update:processing', true)
let url = `/api/playlists/${this.playlist.id}/item/${this.serverLibraryItemId}`
if (this.serverEpisodeId) url += `/${this.serverEpisodeId}`
this.$axios
.$delete(url)
.then(() => {
this.$toast.success('Item removed from playlist')
})
.catch((error) => {
const errorMsg = error.response?.data || 'Unknown error'
console.error('Failed to remove item from playlist', error)
this.$toast.error('Failed to remove from playlist: ' + errorMsg)
})
.finally(() => {
this.$emit('update:processing', false)
})
}
},
mounted() {}
+4 -4
View File
@@ -728,12 +728,12 @@
ASSETCATALOG_COMPILER_APPICON_NAME = Icons;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 28;
CURRENT_PROJECT_VERSION = 30;
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.71;
MARKETING_VERSION = 0.9.73;
OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\"";
PRODUCT_BUNDLE_IDENTIFIER = com.audiobookshelf.app.dev;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -752,12 +752,12 @@
ASSETCATALOG_COMPILER_APPICON_NAME = Icons;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 28;
CURRENT_PROJECT_VERSION = 30;
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.71;
MARKETING_VERSION = 0.9.73;
PRODUCT_BUNDLE_IDENTIFIER = com.audiobookshelf.app;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "";
+1 -1
View File
@@ -14,7 +14,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
// Override point for customization after application launch.
let configuration = Realm.Configuration(
schemaVersion: 16,
schemaVersion: 17,
migrationBlock: { [weak self] migration, oldSchemaVersion in
if (oldSchemaVersion < 1) {
self?.logger.log("Realm schema version was \(oldSchemaVersion)")
+8 -3
View File
@@ -147,14 +147,15 @@ public class AbsDatabase: CAPPlugin {
}
@objc func syncLocalSessionsWithServer(_ call: CAPPluginCall) {
logger.log("syncLocalSessionsWithServer: Starting")
let isFirstSync = call.getBool("isFirstSync", false)
logger.log("syncLocalSessionsWithServer: Starting (First sync: \(isFirstSync))")
guard Store.serverConfig != nil else {
call.reject("syncLocalSessionsWithServer not connected to server")
return call.resolve()
}
Task {
await ApiClient.syncLocalSessionsWithServer()
await ApiClient.syncLocalSessionsWithServer(isFirstSync: isFirstSync)
call.resolve()
}
}
@@ -237,6 +238,7 @@ public class AbsDatabase: CAPPlugin {
@objc func updateDeviceSettings(_ call: CAPPluginCall) {
let disableAutoRewind = call.getBool("disableAutoRewind") ?? false
let enableAltView = call.getBool("enableAltView") ?? false
let allowSeekingOnMediaControls = call.getBool("allowSeekingOnMediaControls") ?? false
let jumpBackwardsTime = call.getInt("jumpBackwardsTime") ?? 10
let jumpForwardTime = call.getInt("jumpForwardTime") ?? 10
let lockOrientation = call.getString("lockOrientation") ?? "NONE"
@@ -245,6 +247,7 @@ public class AbsDatabase: CAPPlugin {
let settings = DeviceSettings()
settings.disableAutoRewind = disableAutoRewind
settings.enableAltView = enableAltView
settings.allowSeekingOnMediaControls = allowSeekingOnMediaControls
settings.jumpBackwardsTime = jumpBackwardsTime
settings.jumpForwardTime = jumpForwardTime
settings.lockOrientation = lockOrientation
@@ -253,7 +256,9 @@ public class AbsDatabase: CAPPlugin {
Database.shared.setDeviceSettings(deviceSettings: settings)
// call.resolve([ "value": [] ])
// Updates the media notification controls (for allowSeekingOnMediaControls setting)
PlayerHandler.updateRemoteTransportControls()
getDeviceData(call)
}
+9 -9
View File
@@ -1,5 +1,5 @@
PODS:
- Alamofire (5.6.4)
- Alamofire (5.8.1)
- ByteowlsCapacitorFilesharer (5.0.0):
- Capacitor
- Capacitor (5.4.0):
@@ -23,11 +23,11 @@ PODS:
- Capacitor
- CordovaPlugins (5.4.0):
- CapacitorCordova
- Realm (10.36.0):
- Realm/Headers (= 10.36.0)
- Realm/Headers (10.36.0)
- RealmSwift (10.36.0):
- Realm (= 10.36.0)
- Realm (10.47.0):
- Realm/Headers (= 10.47.0)
- Realm/Headers (10.47.0)
- RealmSwift (10.47.0):
- Realm (= 10.47.0)
DEPENDENCIES:
- Alamofire (~> 5.5)
@@ -78,7 +78,7 @@ EXTERNAL SOURCES:
:path: "../capacitor-cordova-ios-plugins"
SPEC CHECKSUMS:
Alamofire: 4e95d97098eacb88856099c4fc79b526a299e48c
Alamofire: 3ca42e259043ee0dc5c0cdd76c4bc568b8e42af7
ByteowlsCapacitorFilesharer: f6a773825632d65d5404a34764c4a3fd857bb176
Capacitor: a5cd803e02b471591c81165f400ace01f40b11d3
CapacitorApp: 024e1b1bea5f883d79f6330d309bc441c88ad04a
@@ -91,8 +91,8 @@ SPEC CHECKSUMS:
CapacitorPreferences: f03954bcb0ff09c792909e46bff88e3183c16b10
CapacitorStatusBar: 565c0a1ebd79bb40d797606a8992b4a105885309
CordovaPlugins: a5db67e5ac1061b9869a0efd754f2c2f776aeccc
Realm: 3fd136cb4c83a927482a7f1612496d37beed3cf5
RealmSwift: 513d4dcbf5bfc4d573454088b592685fc48dd716
Realm: e43fb540ae947497e3ea8a662443256920602060
RealmSwift: 8b06ed06b5d16749ae0c4d91c0cba414a9e28189
PODFILE CHECKSUM: 02e6ffe2f51a453ce222ee9af0e55e9448d8514c
@@ -11,6 +11,7 @@ import RealmSwift
class DeviceSettings: Object {
@Persisted var disableAutoRewind: Bool = false
@Persisted var enableAltView: Bool = true
@Persisted var allowSeekingOnMediaControls: Bool = false
@Persisted var jumpBackwardsTime: Int = 10
@Persisted var jumpForwardTime: Int = 10
@Persisted var lockOrientation: String = "NONE"
@@ -26,6 +27,7 @@ func deviceSettingsToJSON(settings: DeviceSettings) -> Dictionary<String, Any> {
return [
"disableAutoRewind": settings.disableAutoRewind,
"enableAltView": settings.enableAltView,
"allowSeekingOnMediaControls": settings.allowSeekingOnMediaControls,
"jumpBackwardsTime": settings.jumpBackwardsTime,
"jumpForwardTime": settings.jumpForwardTime,
"lockOrientation": settings.lockOrientation,
+19 -9
View File
@@ -534,14 +534,24 @@ class AudioPlayer: NSObject {
return
}
switch type {
case .ended:
guard let optionsValue = userInfo[AVAudioSessionInterruptionOptionKey] as? UInt else { return }
let options = AVAudioSession.InterruptionOptions(rawValue: optionsValue)
if options.contains(.shouldResume) {
self.play(allowSeekBack: true)
// When interruption is from the app suspending then don't resume playback
if #available(iOS 14.5, *) {
let reasonValue = userInfo[AVAudioSessionInterruptionReasonKey] as? UInt ?? 0
let reason = AVAudioSession.InterruptionReason(rawValue: reasonValue)
if (reason == .appWasSuspended) {
logger.log("AVAudioSession was suspended")
return
}
default: ()
}
switch type {
case .ended:
guard let optionsValue = userInfo[AVAudioSessionInterruptionOptionKey] as? UInt else { return }
let options = AVAudioSession.InterruptionOptions(rawValue: optionsValue)
if options.contains(.shouldResume) {
self.play(allowSeekBack: true)
}
default: ()
}
}
@@ -578,7 +588,7 @@ class AudioPlayer: NSObject {
}
// MARK: - Now playing
private func setupRemoteTransportControls() {
func setupRemoteTransportControls() {
DispatchQueue.runOnMainQueue {
UIApplication.shared.beginReceivingRemoteControlEvents()
}
@@ -662,7 +672,7 @@ class AudioPlayer: NSObject {
return .success
}
commandCenter.changePlaybackPositionCommand.isEnabled = true
commandCenter.changePlaybackPositionCommand.isEnabled = deviceSettings.allowSeekingOnMediaControls
commandCenter.changePlaybackPositionCommand.addTarget { [weak self] event in
guard let event = event as? MPChangePlaybackPositionCommandEvent else {
return .noSuchContent
@@ -135,6 +135,10 @@ class PlayerHandler {
)
}
public static func updateRemoteTransportControls() {
self.player?.setupRemoteTransportControls()
}
// MARK: - Helper logic
private static func cleanupOldSessions(currentSessionId: String?) {
+7 -4
View File
@@ -190,10 +190,10 @@ class ApiClient {
}
public static func reportAllLocalPlaybackSessions(_ sessions: [PlaybackSession]) async -> Bool {
return await postResource(endpoint: "api/session/local-all", parameters: LocalPlaybackSessionSyncAllPayload(sessions: sessions))
return await postResource(endpoint: "api/session/local-all", parameters: LocalPlaybackSessionSyncAllPayload(sessions: sessions, deviceInfo: sessions.first?.deviceInfo))
}
public static func syncLocalSessionsWithServer() async {
public static func syncLocalSessionsWithServer(isFirstSync: Bool) async {
do {
// Sync server progress with local media progress
let localMediaProgressList = Database.shared.getAllLocalMediaProgress().filter {
@@ -232,13 +232,15 @@ class ApiClient {
let playbackSessions = Database.shared.getAllPlaybackSessions().filter {
$0.serverConnectionConfigId == Store.serverConfig?.id
}.map { $0.freeze() }
logger.log("syncLocalSessionsWithServer: Found \(playbackSessions.count) playback sessions for server")
logger.log("syncLocalSessionsWithServer: Found \(playbackSessions.count) playback sessions for server (first sync: \(isFirstSync))")
if (!playbackSessions.isEmpty) {
let success = await ApiClient.reportAllLocalPlaybackSessions(playbackSessions)
if (success) {
// Remove sessions from db
try playbackSessions.forEach { session in
if (!session.isActiveSession) {
logger.log("syncLocalSessionsWithServer: Handling \(session.displayTitle ?? "") (\(session.id)) \(session.isActiveSession)")
// On first sync then remove all sessions
if (!session.isActiveSession || isFirstSync) {
if let session = session.thaw() {
try session.delete()
}
@@ -327,6 +329,7 @@ struct LocalMediaProgressSyncResultsPayload: Codable {
struct LocalPlaybackSessionSyncAllPayload: Codable {
var sessions: [PlaybackSession]
var deviceInfo: [String: String?]?
}
struct Connectivity {
+6 -9
View File
@@ -45,7 +45,7 @@ export default {
if (timeSinceDisconnect > 5000) {
console.log('Time since disconnect was', timeSinceDisconnect, 'sync with server')
setTimeout(() => {
this.syncLocalSessions()
this.syncLocalSessions(false)
}, 4000)
}
}
@@ -139,7 +139,7 @@ export default {
console.log(`[default] Got server config, attempt authorize ${serverConfig.address}`)
const authRes = await this.postRequest(`${serverConfig.address}/api/authorize`, null, { Authorization: `Bearer ${serverConfig.token}` }, 10000).catch((error) => {
const authRes = await this.postRequest(`${serverConfig.address}/api/authorize`, null, { Authorization: `Bearer ${serverConfig.token}` }, 6000).catch((error) => {
console.error('[default] Server auth failed', error)
return false
})
@@ -195,14 +195,14 @@ export default {
this.$eventBus.$emit('library-changed')
this.inittingLibraries = false
},
async syncLocalSessions() {
async syncLocalSessions(isFirstSync) {
if (!this.user) {
console.log('[default] No need to sync local sessions - not connected to server')
return
}
console.log('[default] Calling syncLocalSessions')
const response = await this.$db.syncLocalSessionsWithServer()
const response = await this.$db.syncLocalSessionsWithServer(isFirstSync)
if (response?.error) {
console.error('[default] Failed to sync local sessions', response.error)
} else {
@@ -212,8 +212,7 @@ export default {
}
},
userUpdated(user) {
// console.log('[default] userUpdated:', JSON.stringify(user))
if (this.user && this.user.id == user.id) {
if (this.user?.id == user.id) {
this.$store.commit('user/setUser', user)
}
},
@@ -326,8 +325,6 @@ export default {
await this.$store.dispatch('setupNetworkListener')
await this.$store.dispatch('globals/loadLocalMediaProgress')
if (this.$store.state.user.serverConnectionConfig) {
await this.initLibraries()
} else {
@@ -335,7 +332,7 @@ export default {
}
console.log(`[default] finished connection attempt or already connected ${!!this.user}`)
await this.syncLocalSessions()
await this.syncLocalSessions(true)
this.hasMounted = true
+8 -5
View File
@@ -3,7 +3,7 @@ const pkg = require('./package.json')
export default {
ssr: false,
target: 'static',
telemetry: false,
env: {
PROD: '1',
ANDROID_APP_URL: 'https://play.google.com/store/apps/details?id=com.audiobookshelf.app',
@@ -36,6 +36,7 @@ export default {
},
css: [
'@/assets/tailwind.css',
'@/assets/app.css'
],
@@ -56,10 +57,6 @@ export default {
components: true,
buildModules: [
'@nuxtjs/tailwindcss',
],
modules: [
'@nuxtjs/axios'
],
@@ -67,6 +64,12 @@ export default {
axios: {},
build: {
postcss: {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
},
babel: {
plugins: [['@babel/plugin-proposal-private-property-in-object', { loose: true }]],
},
+2202 -17839
View File
File diff suppressed because it is too large Load Diff
+4 -3
View File
@@ -1,6 +1,6 @@
{
"name": "audiobookshelf-app",
"version": "0.9.71-beta",
"version": "0.9.73-beta",
"author": "advplyr",
"scripts": {
"dev": "nuxt --hostname 0.0.0.0 --port 1337",
@@ -44,7 +44,8 @@
"@babel/core": "7.13.15",
"@babel/preset-env": "7.13.15",
"@capacitor/cli": "^5.0.0",
"@nuxtjs/tailwindcss": "^6.10.3",
"postcss": "^8.3.5"
"autoprefixer": "^10.4.17",
"postcss": "^8.4.33",
"tailwindcss": "^3.4.1"
}
}
+7 -2
View File
@@ -3,7 +3,7 @@
<div id="bookshelf" class="w-full h-full p-4 overflow-y-auto">
<div class="flex flex-wrap justify-center">
<template v-for="author in authors">
<cards-author-card :key="author.id" :author="author" :width="96" :height="120" class="p-2" />
<cards-author-card :key="author.id" :author="author" :width="cardWidth" :height="cardHeight" class="p-2" />
</template>
</div>
</div>
@@ -16,16 +16,21 @@ export default {
return {
loading: true,
authors: [],
loadedLibraryId: null
loadedLibraryId: null,
cardWidth: 200
}
},
computed: {
currentLibraryId() {
return this.$store.state.libraries.currentLibraryId
},
cardHeight() {
return this.cardWidth * 1.25
}
},
methods: {
async init() {
this.cardWidth = (window.innerWidth - 64) / 2
if (!this.currentLibraryId) {
return
}
+7 -2
View File
@@ -236,7 +236,7 @@ export default {
console.log('[categories] Local shelves set', this.shelves.length, this.lastLocalFetch)
if (isConnectedToServerWithInternet) {
const categories = await this.$nativeHttp.get(`/api/libraries/${this.currentLibraryId}/personalized?minified=1&include=rssfeed,numEpisodesIncomplete`).catch((error) => {
const categories = await this.$nativeHttp.get(`/api/libraries/${this.currentLibraryId}/personalized?minified=1&include=rssfeed,numEpisodesIncomplete`, { connectTimeout: 10000 }).catch((error) => {
console.error('[categories] Failed to fetch categories', error)
return []
})
@@ -327,8 +327,13 @@ export default {
this.$eventBus.$off('library-changed', this.libraryChanged)
}
},
mounted() {
async mounted() {
if (this.$route.query.error) {
this.$toast.error(this.$route.query.error)
}
this.initListeners()
await this.$store.dispatch('globals/loadLocalMediaProgress')
console.log(`[categories] mounted so fetching categories`)
this.fetchCategories()
},
+73 -48
View File
@@ -1,5 +1,8 @@
<template>
<div id="item-page" class="w-full h-full overflow-y-auto overflow-x-hidden relative bg-bg">
<div v-if="!libraryItem" class="w-full h-full relative flex items-center justify-center bg-bg">
<ui-loading-indicator />
</div>
<div v-else id="item-page" class="w-full h-full overflow-y-auto overflow-x-hidden relative bg-bg">
<!-- cover -->
<div class="w-full flex justify-center relative">
<div style="width: 0; transform: translateX(-50vw); overflow: visible">
@@ -167,43 +170,37 @@ import { AbsFileSystem, AbsDownloader } from '@/plugins/capacitor'
import { FastAverageColor } from 'fast-average-color'
export default {
async asyncData({ store, params, redirect, app }) {
async asyncData({ store, params, redirect, app, query }) {
const libraryItemId = params.id
let libraryItem = null
if (libraryItemId.startsWith('local')) {
libraryItem = await app.$db.getLocalLibraryItem(libraryItemId)
console.log('Got lli', libraryItemId)
if (!libraryItem) {
return redirect('/?error=Failed to get downloaded library item')
}
// If library item is linked to the currently connected server then redirect to the page using the server library item id
if (libraryItem?.libraryItemId?.startsWith('li_')) {
// Detect old library item id
console.error('Local library item has old server library item id', libraryItem.libraryItemId)
} else if (libraryItem?.libraryItemId && libraryItem?.serverAddress === store.getters['user/getServerAddress'] && store.state.networkConnected) {
let query = ''
if (libraryItem.mediaType === 'podcast') query = '?episodefilter=downloaded' // Filter by downloaded when redirecting from the local copy
return redirect(`/item/${libraryItem.libraryItemId}${query}`)
}
} else if (store.state.user.serverConnectionConfig) {
libraryItem = await app.$nativeHttp.get(`/api/items/${libraryItemId}?expanded=1&include=rssfeed`).catch((error) => {
console.error('Failed', error)
return false
})
if (libraryItem) {
const localLibraryItem = await app.$db.getLocalLibraryItemByLId(libraryItemId)
if (localLibraryItem) {
console.log('Library item has local library item also', localLibraryItem.id)
libraryItem.localLibraryItem = localLibraryItem
} else if (query.noredirect !== '1' && libraryItem?.libraryItemId && libraryItem?.serverAddress === store.getters['user/getServerAddress'] && store.state.networkConnected) {
const queryParams = new URLSearchParams()
queryParams.set('localLibraryItemId', libraryItemId)
if (libraryItem.mediaType === 'podcast') {
// Filter by downloaded when redirecting from the local copy
queryParams.set('episodefilter', 'downloaded')
}
return redirect(`/item/${libraryItem.libraryItemId}?${queryParams.toString()}`)
}
} else if (!store.state.user.serverConnectionConfig) {
// Not connected to server
return redirect('/?error=No server connection to get library item')
}
if (!libraryItem) {
console.error('No item...', params.id)
return redirect('/')
}
return {
libraryItem,
rssFeed: libraryItem.rssFeed || null
libraryItemId
}
},
data() {
@@ -296,8 +293,8 @@ export default {
bookCoverAspectRatio() {
return this.$store.getters['libraries/getBookCoverAspectRatio']
},
libraryItemId() {
return this.libraryItem.id
rssFeed() {
return this.libraryItem?.rssFeed
},
mediaType() {
return this.libraryItem.mediaType
@@ -722,31 +719,59 @@ export default {
if (!this.libraryItem.libraryId) return
await this.$store.dispatch('libraries/fetch', this.libraryItem.libraryId)
this.$localStore.setLastLibraryId(this.libraryItem.libraryId)
},
init() {
// If library of this item is different from current library then switch libraries
if (this.$store.state.libraries.currentLibraryId !== this.libraryItem.libraryId) {
this.setLibrary()
}
this.windowWidth = window.innerWidth
window.addEventListener('resize', this.windowResized)
this.$eventBus.$on('library-changed', this.libraryChanged)
this.$eventBus.$on('new-local-library-item', this.newLocalLibraryItem)
this.$socket.$on('item_updated', this.itemUpdated)
this.$socket.$on('rss_feed_open', this.rssFeedOpen)
this.$socket.$on('rss_feed_closed', this.rssFeedClosed)
this.checkDescriptionClamped()
// Set height of page below cover image
const itemPageBgGradientHeight = window.outerHeight - 64 - this.coverHeight
document.documentElement.style.setProperty('--item-page-bg-gradient-height', itemPageBgGradientHeight + 'px')
// Set last scroll position if was set for this item
if (this.$store.state.lastItemScrollData.id === this.libraryItemId && window['item-page']) {
window['item-page'].scrollTop = this.$store.state.lastItemScrollData.scrollTop || 0
}
},
async loadServerLibraryItem() {
console.log(`Fetching library item "${this.libraryItemId}" from server`)
const libraryItem = await this.$nativeHttp.get(`/api/items/${this.libraryItemId}?expanded=1&include=rssfeed`, { connectTimeout: 5000 }).catch((error) => {
console.error('Failed', error)
return null
})
if (libraryItem) {
const localLibraryItem = await this.$db.getLocalLibraryItemByLId(this.libraryItemId)
if (localLibraryItem) {
console.log('Library item has local library item also', localLibraryItem.id)
libraryItem.localLibraryItem = localLibraryItem
}
this.libraryItem = libraryItem
} else if (this.$route.query.localLibraryItemId) {
// Failed to get server library item but is local library item so redirect
return this.$router.replace(`/item/${this.$route.query.localLibraryItemId}?noredirect=1`)
} else {
this.$toast.error('Failed to get library item from server')
return this.$router.replace('/bookshelf')
}
}
},
mounted() {
// If library of this item is different from current library then switch libraries
if (this.$store.state.libraries.currentLibraryId !== this.libraryItem.libraryId) {
this.setLibrary()
}
this.windowWidth = window.innerWidth
window.addEventListener('resize', this.windowResized)
this.$eventBus.$on('library-changed', this.libraryChanged)
this.$eventBus.$on('new-local-library-item', this.newLocalLibraryItem)
this.$socket.$on('item_updated', this.itemUpdated)
this.$socket.$on('rss_feed_open', this.rssFeedOpen)
this.$socket.$on('rss_feed_closed', this.rssFeedClosed)
this.checkDescriptionClamped()
// Set height of page below cover image
const itemPageBgGradientHeight = window.outerHeight - 64 - this.coverHeight
document.documentElement.style.setProperty('--item-page-bg-gradient-height', itemPageBgGradientHeight + 'px')
// Set last scroll position if was set for this item
if (this.$store.state.lastItemScrollData.id === this.libraryItemId && window['item-page']) {
window['item-page'].scrollTop = this.$store.state.lastItemScrollData.scrollTop || 0
async mounted() {
if (!this.libraryItem) {
await this.loadServerLibraryItem()
}
this.init()
},
beforeDestroy() {
window.removeEventListener('resize', this.windowResized)
+1 -1
View File
@@ -2,7 +2,7 @@
<div class="w-full h-full py-6 px-2">
<div v-if="localLibraryItem" class="w-full h-full">
<div class="px-2 flex items-center mb-2">
<p class="text-base font-semibold">{{ mediaMetadata.title }}</p>
<p class="text-base font-semibold truncate">{{ mediaMetadata.title }}</p>
<div class="flex-grow" />
<button v-if="audioTracks.length && !isPodcast" class="shadow-sm text-success flex items-center justify-center rounded-full mx-2" @click.stop="play">
+18 -2
View File
@@ -24,7 +24,7 @@
</div>
</div>
<modals-item-more-menu-modal v-model="showMoreMenu" :library-item="selectedLibraryItem" :episode="selectedEpisode" hide-rss-feed-option :processing.sync="processing" />
<modals-item-more-menu-modal v-model="showMoreMenu" :library-item="selectedLibraryItem" :episode="selectedEpisode" :playlist="playlist" hide-rss-feed-option :processing.sync="processing" />
<div v-show="processing" class="fixed top-0 left-0 w-screen h-screen flex items-center justify-center bg-black/50 z-50">
<ui-loading-indicator />
</div>
@@ -140,8 +140,24 @@ export default {
this.$eventBus.$emit('play-item', { libraryItemId: nextItem.libraryItemId, episodeId: nextItem.episodeId })
}
}
},
playlistUpdated(playlist) {
if (this.playlist.id !== playlist.id) return
this.playlist = playlist
},
playlistRemoved(playlist) {
if (this.playlist.id === playlist.id) {
this.$router.replace('/bookshelf/playlists')
}
}
},
mounted() {}
mounted() {
this.$socket.$on('playlist_updated', this.playlistUpdated)
this.$socket.$on('playlist_removed', this.playlistRemoved)
},
beforeDestroy() {
this.$socket.$off('playlist_updated', this.playlistUpdated)
this.$socket.$off('playlist_removed', this.playlistRemoved)
}
}
</script>
+35 -23
View File
@@ -2,16 +2,16 @@
<div class="w-full h-full px-4 py-8 overflow-y-auto">
<!-- Display settings -->
<p class="uppercase text-xs font-semibold text-fg-muted mb-2">{{ $strings.HeaderUserInterfaceSettings }}</p>
<div class="flex items-center py-3" @click="toggleEnableAltView">
<div class="w-10 flex justify-center">
<div class="flex items-center py-3">
<div class="w-10 flex justify-center" @click="toggleEnableAltView">
<ui-toggle-switch v-model="enableBookshelfView" @input="saveSettings" />
</div>
<p class="pl-4">{{ $strings.LabelUseBookshelfView }}</p>
</div>
<!-- screen.orientation.lock not supported on iOS webview -->
<div v-if="!isiOS" class="flex items-center py-3" @click.stop="toggleLockOrientation">
<div class="w-10 flex justify-center pointer-events-none">
<ui-toggle-switch v-model="lockCurrentOrientation" />
<div v-if="!isiOS" class="flex items-center py-3">
<div class="w-10 flex justify-center" @click.stop="toggleLockOrientation">
<ui-toggle-switch v-model="lockCurrentOrientation" class="pointer-events-none" />
</div>
<p class="pl-4">{{ $strings.LabelLockOrientation }}</p>
</div>
@@ -36,37 +36,43 @@
<!-- Playback settings -->
<p class="uppercase text-xs font-semibold text-fg-muted mb-2 mt-10">{{ $strings.HeaderPlaybackSettings }}</p>
<div v-if="!isiOS" class="flex items-center py-3" @click="toggleDisableAutoRewind">
<div class="w-10 flex justify-center">
<div v-if="!isiOS" class="flex items-center py-3">
<div class="w-10 flex justify-center" @click="toggleDisableAutoRewind">
<ui-toggle-switch v-model="settings.disableAutoRewind" @input="saveSettings" />
</div>
<p class="pl-4">{{ $strings.LabelDisableAutoRewind }}</p>
</div>
<div class="flex items-center py-3" @click="toggleJumpBackwards">
<div class="w-10 flex justify-center">
<div class="flex items-center py-3">
<div class="w-10 flex justify-center" @click="toggleJumpBackwards">
<span class="material-icons text-4xl">{{ currentJumpBackwardsTimeIcon }}</span>
</div>
<p class="pl-4">{{ $strings.LabelJumpBackwardsTime }}</p>
</div>
<div class="flex items-center py-3" @click="toggleJumpForward">
<div class="w-10 flex justify-center">
<div class="flex items-center py-3">
<div class="w-10 flex justify-center" @click="toggleJumpForward">
<span class="material-icons text-4xl">{{ currentJumpForwardTimeIcon }}</span>
</div>
<p class="pl-4">{{ $strings.LabelJumpForwardsTime }}</p>
</div>
<div v-if="!isiOS" class="flex items-center py-3" @click="toggleEnableMp3IndexSeeking">
<div class="w-10 flex justify-center">
<div v-if="!isiOS" class="flex items-center py-3">
<div class="w-10 flex justify-center" @click="toggleEnableMp3IndexSeeking">
<ui-toggle-switch v-model="settings.enableMp3IndexSeeking" @input="saveSettings" />
</div>
<p class="pl-4">{{ $strings.LabelEnableMp3IndexSeeking }}</p>
<span class="material-icons-outlined ml-2" @click.stop="showConfirmMp3IndexSeeking">info</span>
</div>
<div class="flex items-center py-3">
<div class="w-10 flex justify-center" @click="toggleAllowSeekingOnMediaControls">
<ui-toggle-switch v-model="settings.allowSeekingOnMediaControls" @input="saveSettings" />
</div>
<p class="pl-4">{{ $strings.LabelAllowSeekingOnMediaControls }}</p>
</div>
<!-- Sleep timer settings -->
<template v-if="!isiOS">
<p class="uppercase text-xs font-semibold text-fg-muted mb-2 mt-10">{{ $strings.HeaderSleepTimerSettings }}</p>
<div class="flex items-center py-3" @click="toggleDisableShakeToResetSleepTimer">
<div class="w-10 flex justify-center">
<div class="flex items-center py-3">
<div class="w-10 flex justify-center" @click="toggleDisableShakeToResetSleepTimer">
<ui-toggle-switch v-model="settings.disableShakeToResetSleepTimer" @input="saveSettings" />
</div>
<p class="pl-4">{{ $strings.LabelDisableShakeToReset }}</p>
@@ -78,22 +84,22 @@
<ui-text-input :value="shakeSensitivityOption" readonly append-icon="expand_more" style="width: 145px; max-width: 145px" />
</div>
</div>
<div class="flex items-center py-3" @click="toggleDisableSleepTimerFadeOut">
<div class="w-10 flex justify-center">
<div class="flex items-center py-3">
<div class="w-10 flex justify-center" @click="toggleDisableSleepTimerFadeOut">
<ui-toggle-switch v-model="settings.disableSleepTimerFadeOut" @input="saveSettings" />
</div>
<p class="pl-4">{{ $strings.LabelDisableAudioFadeOut }}</p>
<span class="material-icons-outlined ml-2" @click.stop="showInfo('disableSleepTimerFadeOut')">info</span>
</div>
<div class="flex items-center py-3" @click="toggleDisableSleepTimerResetFeedback">
<div class="w-10 flex justify-center">
<div class="flex items-center py-3">
<div class="w-10 flex justify-center" @click="toggleDisableSleepTimerResetFeedback">
<ui-toggle-switch v-model="settings.disableSleepTimerResetFeedback" @input="saveSettings" />
</div>
<p class="pl-4">{{ $strings.LabelDisableVibrateOnReset }}</p>
<span class="material-icons-outlined ml-2" @click.stop="showInfo('disableSleepTimerResetFeedback')">info</span>
</div>
<div class="flex items-center py-3" @click="toggleAutoSleepTimer">
<div class="w-10 flex justify-center">
<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" />
</div>
<p class="pl-4">{{ $strings.LabelAutoSleepTimer }}</p>
@@ -115,8 +121,8 @@
<ui-text-input :value="sleepTimerLengthOption" readonly append-icon="expand_more" style="width: 145px; max-width: 145px" />
</div>
</div>
<div v-if="settings.autoSleepTimer" class="flex items-center py-3" @click="toggleAutoSleepTimerAutoRewind">
<div class="w-10 flex justify-center">
<div v-if="settings.autoSleepTimer" class="flex items-center py-3">
<div class="w-10 flex justify-center" @click="toggleAutoSleepTimerAutoRewind">
<ui-toggle-switch v-model="settings.autoSleepTimerAutoRewind" @input="saveSettings" />
</div>
<p class="pl-4">{{ $strings.LabelAutoSleepTimerAutoRewind }}</p>
@@ -154,6 +160,7 @@ export default {
settings: {
disableAutoRewind: false,
enableAltView: true,
allowSeekingOnMediaControls: false,
jumpForwardTime: 10,
jumpBackwardsTime: 10,
enableMp3IndexSeeking: false,
@@ -429,6 +436,10 @@ export default {
this.settings.enableAltView = !this.settings.enableAltView
this.saveSettings()
},
toggleAllowSeekingOnMediaControls() {
this.settings.allowSeekingOnMediaControls = !this.settings.allowSeekingOnMediaControls
this.saveSettings()
},
getCurrentOrientation() {
const orientation = window.screen?.orientation || {}
const type = orientation.type || ''
@@ -471,6 +482,7 @@ export default {
const deviceSettings = this.deviceData.deviceSettings || {}
this.settings.disableAutoRewind = !!deviceSettings.disableAutoRewind
this.settings.enableAltView = !!deviceSettings.enableAltView
this.settings.allowSeekingOnMediaControls = !!deviceSettings.allowSeekingOnMediaControls
this.settings.jumpForwardTime = deviceSettings.jumpForwardTime || 10
this.settings.jumpBackwardsTime = deviceSettings.jumpBackwardsTime || 10
this.settings.enableMp3IndexSeeking = !!deviceSettings.enableMp3IndexSeeking
+1 -1
View File
@@ -196,7 +196,7 @@ class AbsDatabaseWeb extends WebPlugin {
return null
}
async syncLocalSessionsWithServer() {
async syncLocalSessionsWithServer({ isFirstSync }) {
return null
}
+2 -2
View File
@@ -70,8 +70,8 @@ class DbService {
return AbsDatabase.removeLocalMediaProgress({ localMediaProgressId })
}
syncLocalSessionsWithServer() {
return AbsDatabase.syncLocalSessionsWithServer()
syncLocalSessionsWithServer(isFirstSync) {
return AbsDatabase.syncLocalSessionsWithServer({ isFirstSync })
}
syncServerMediaProgressWithLocalMediaProgress(payload) {
+3 -1
View File
@@ -14,9 +14,11 @@ const languageCodeMap = {
'hr': { label: 'Hrvatski', dateFnsLocale: 'hr' },
'it': { label: 'Italiano', dateFnsLocale: 'it' },
'lt': { label: 'Lietuvių', dateFnsLocale: 'lt' },
'hu': { label: 'Magyar', dateFnsLocale: 'hu' },
'nl': { label: 'Nederlands', dateFnsLocale: 'nl' },
'no': { label: 'Norsk', dateFnsLocale: 'no' },
'pl': { label: 'Polski', dateFnsLocale: 'pl' },
'pt-br': { label: 'Português (Brasil)', dateFnsLocale: 'ptBR' },
'ru': { label: 'Русский', dateFnsLocale: 'ru' },
'sv': { label: 'Svenska', dateFnsLocale: 'sv' },
'zh-cn': { label: '简体中文 (Simplified Chinese)', dateFnsLocale: 'zhCN' },
@@ -131,4 +133,4 @@ async function initialize() {
export default ({ app, store }, inject) => {
$localStore = app.$localStore
initialize()
}
}
+23 -43
View File
@@ -42,56 +42,20 @@ class LocalStorage {
}
}
async setUseChapterTrack(useChapterTrack) {
async setPlayerSettings(playerSettings) {
try {
await Preferences.set({ key: 'useChapterTrack', value: useChapterTrack ? '1' : '0' })
await Preferences.set({ key: 'playerSettings', value: JSON.stringify(playerSettings) })
} catch (error) {
console.error('[LocalStorage] Failed to set use chapter track', error)
console.error('[LocalStorage] Failed to set player settings', error)
}
}
async getUseChapterTrack() {
async getPlayerSettings() {
try {
var obj = await Preferences.get({ key: 'useChapterTrack' }) || {}
return obj.value === '1'
const playerSettingsObj = await Preferences.get({ key: 'playerSettings' }) || {}
return playerSettingsObj.value ? JSON.parse(playerSettingsObj.value) : null
} catch (error) {
console.error('[LocalStorage] Failed to get use chapter track', error)
return false
}
}
async setUseTotalTrack(useTotalTrack) {
try {
await Preferences.set({ key: 'useTotalTrack', value: useTotalTrack ? '1' : '0' })
} catch (error) {
console.error('[LocalStorage] Failed to set use total track', error)
}
}
async getUseTotalTrack() {
try {
var obj = await Preferences.get({ key: 'useTotalTrack' }) || {}
return obj.value === '1'
} catch (error) {
console.error('[LocalStorage] Failed to get use total track', error)
return false
}
}
async setPlayerLock(lock) {
try {
await Preferences.set({ key: 'playerLock', value: lock ? '1' : '0' })
} catch (error) {
console.error('[LocalStorage] Failed to set player lock', error)
}
}
async getPlayerLock() {
try {
var obj = await Preferences.get({ key: 'playerLock' }) || {}
return obj.value === '1'
} catch (error) {
console.error('[LocalStorage] Failed to get player lock', error)
console.error('[LocalStorage] Failed to get player settings', error)
return false
}
}
@@ -179,6 +143,22 @@ class LocalStorage {
return false
}
}
/**
* Get preference value by key
*
* @param {string} key
* @returns {Promise<string>}
*/
async getPreferenceByKey(key) {
try {
const obj = await Preferences.get({ key }) || {}
return obj.value || null
} catch (error) {
console.error(`[LocalStorage] Failed to get preference "${key}"`, error)
return null
}
}
}
+8 -5
View File
@@ -48,11 +48,7 @@ class ServerSocket extends EventEmitter {
this.socket.on('init', this.onInit.bind(this))
this.socket.on('user_updated', this.onUserUpdated.bind(this))
this.socket.on('user_item_progress_updated', this.onUserItemProgressUpdated.bind(this))
// Good for testing socket requests
// this.socket.onAny((evt, args) => {
// console.log(`[SOCKET] onAny: ${this.socket.id}: ${evt} ${JSON.stringify(args)}`)
// })
this.socket.on('playlist_added', this.onPlaylistAdded.bind(this))
}
removeListeners() {
@@ -93,6 +89,13 @@ class ServerSocket extends EventEmitter {
this.$store.commit('user/updateUserMediaProgress', payload.data)
this.emit('user_media_progress_updated', payload)
}
onPlaylistAdded() {
// Currently numUserPlaylists is only used for showing the playlist tab or not. Precise number is not necessary
if (!this.$store.state.libraries.numUserPlaylists) {
this.$store.commit('libraries/setNumUserPlaylists', 1)
}
}
}
export default ({ app, store }, inject) => {
+5 -6
View File
@@ -6,10 +6,9 @@ Audiobookshelf is a self-hosted audiobook and podcast server.
Get the Android app on the [Google Play Store](https://play.google.com/store/apps/details?id=com.audiobookshelf.app)
### iOS (early beta)
**Beta is currently full. Apple has a hard limit of 10k beta testers. Updates will be posted in Discord/Matrix.**
Available to beta testers through Test Flight
Join the beta testers and install the iOS app: https://testflight.apple.com/join/wiic7QIW
Using Test Flight: https://testflight.apple.com/join/wiic7QIW ***(beta is full)***
---
@@ -31,7 +30,7 @@ This application is built using [NuxtJS](https://nuxtjs.org/) and [Capacitor](ht
Required Software:
* [Git](https://git-scm.com/downloads)
* [Node.js](https://nodejs.org/en/)
* [Node.js](https://nodejs.org/en/) (version 20)
* Code editor of choice([VSCode](https://code.visualstudio.com/download), etc)
* [Android Studio](https://developer.android.com/studio)
* [Android SDK](https://developer.android.com/studio)
@@ -46,7 +45,7 @@ Note: This requires a PowerShell prompt with winget installed. You should be ab
winget install -e --id Git.Git; `
winget install -e --id Microsoft.VisualStudioCode; `
winget install -e --id Google.AndroidStudio; `
winget install -e --id OpenJS.NodeJS --version 16.12.0; #v17 has issues with openssl
winget install -e --id OpenJS.NodeJS --version 20.11.0;
```
![](/screenshots/dev_setup_windows_winget.png)
@@ -62,7 +61,7 @@ Your Windows environment should now be set up and ready to proceed!
Required Software:
* [Android Studio](https://developer.android.com/studio)
* [Node.js](https://nodejs.org/en/)
* [Node.js](https://nodejs.org/en/) (version 20)
* [Cocoapods](https://guides.cocoapods.org/using/getting-started.html#installation)
* [Android SDK](https://developer.android.com/studio)
+160 -157
View File
@@ -1,52 +1,52 @@
{
"ButtonAdd": "Přidat",
"ButtonAddNewServer": "Add New Server",
"ButtonAddNewServer": "Přidat nový server",
"ButtonAuthors": "Autoři",
"ButtonBack": "Back",
"ButtonBack": "Zpět",
"ButtonCancel": "Zrušit",
"ButtonCancelTimer": "Cancel Timer",
"ButtonCancelTimer": "Zrušit časovač",
"ButtonClearFilter": "Vymazat filtr",
"ButtonCloseFeed": "Zavřít kanál",
"ButtonCollections": "Kolekce",
"ButtonConnect": "Connect",
"ButtonConnectToServer": "Connect to Server",
"ButtonConnect": "Připojit",
"ButtonConnectToServer": "Připojit k serveru",
"ButtonCreate": "Vytvořit",
"ButtonCreateBookmark": "Create Bookmark",
"ButtonCreateNewPlaylist": "Create New Playlist",
"ButtonCreateBookmark": "Vytvořit záložku",
"ButtonCreateNewPlaylist": "Vytvořit nový seznam skladeb",
"ButtonDelete": "Smazat",
"ButtonDeleteLocalEpisode": "Delete local episode",
"ButtonDeleteLocalFile": "Delete local file",
"ButtonDeleteLocalItem": "Delete local item",
"ButtonDisableAutoTimer": "Disable Auto Timer",
"ButtonDisconnect": "Disconnect",
"ButtonHistory": "History",
"ButtonDeleteLocalEpisode": "Smazat místní epizodu",
"ButtonDeleteLocalFile": "Smazat místní soubor",
"ButtonDeleteLocalItem": "Smazat místní položku",
"ButtonDisableAutoTimer": "Zakázat automatický časovač",
"ButtonDisconnect": "Odpojit",
"ButtonHistory": "Historie",
"ButtonHome": "Domů",
"ButtonIssues": "Problémy",
"ButtonLatest": "Nejnovější",
"ButtonLibrary": "Knihovna",
"ButtonLocalMedia": "Local Media",
"ButtonManageLocalFiles": "Manage Local Files",
"ButtonNewFolder": "New Folder",
"ButtonNextEpisode": "Next Episode",
"ButtonLocalMedia": "Místní média",
"ButtonManageLocalFiles": "Spravovat místní soubory",
"ButtonNewFolder": "Nová složka",
"ButtonNextEpisode": "Další epizoda",
"ButtonOpenFeed": "Otevřít kanál",
"ButtonOverride": "Override",
"ButtonPause": "Pause",
"ButtonOverride": "Přepsat",
"ButtonPause": "Pozastavit",
"ButtonPlay": "Přehrát",
"ButtonPlaying": "Hraje",
"ButtonPlaying": "Přehrává se",
"ButtonPlaylists": "Seznamy skladeb",
"ButtonRead": "Číst",
"ButtonRemove": "Odstranit",
"ButtonRemoveFromServer": "Remove from Server",
"ButtonRemoveFromServer": "Odstranit ze serveru",
"ButtonSave": "Uložit",
"ButtonSaveOrder": "Save Order",
"ButtonSaveOrder": "Uložit pořadí",
"ButtonSearch": "Hledat",
"ButtonSendEbookToDevice": "Send Ebook to Device",
"ButtonSendEbookToDevice": "Odeslat e-knihu na zařízení",
"ButtonSeries": "Série",
"ButtonSetTimer": "Set Timer",
"ButtonStream": "Stream",
"ButtonSetTimer": "Nastavit časovač",
"ButtonStream": "Streamovat",
"ButtonSubmit": "Odeslat",
"ButtonSwitchServerUser": "Switch Server/User",
"ButtonUserStats": "User Stats",
"ButtonSwitchServerUser": "Přepnout server/uživatele",
"ButtonUserStats": "Statistiky uživatele",
"ButtonYes": "Ano",
"HeaderAccount": "Účet",
"HeaderAdvanced": "Pokročilé",
@@ -54,132 +54,133 @@
"HeaderChapters": "Kapitoly",
"HeaderCollection": "Kolekce",
"HeaderCollectionItems": "Položky kolekce",
"HeaderConnectionStatus": "Connection Status",
"HeaderConnectionStatus": "Stav připojení",
"HeaderDetails": "Podrobnosti",
"HeaderDownloads": "Downloads",
"HeaderEbookFiles": "Soubory elektronických knih",
"HeaderDownloads": "Stahování",
"HeaderEbookFiles": "Soubory e-knih",
"HeaderEpisodes": "Epizody",
"HeaderEreaderSettings": "Nastavení čtečky elektronických knih",
"HeaderLatestEpisodes": "Poslední epizody",
"HeaderEreaderSettings": "Nastavení čtečky e-knih",
"HeaderLatestEpisodes": "Nejnovější epizody",
"HeaderLibraries": "Knihovny",
"HeaderLocalFolders": "Local Folders",
"HeaderLocalLibraryItems": "Local Library Items",
"HeaderNewPlaylist": "New Playlist",
"HeaderLocalFolders": "Místní složky",
"HeaderLocalLibraryItems": "Místní položky knihovny",
"HeaderNewPlaylist": "Nový seznam skladeb",
"HeaderOpenRSSFeed": "Otevřít RSS kanál",
"HeaderPlaybackSettings": "Playback Settings",
"HeaderPlaybackSettings": "Nastavení přehrávání",
"HeaderPlaylist": "Seznam skladeb",
"HeaderPlaylistItems": "Položky seznamu přehrávání",
"HeaderRSSFeed": "RSS Feed",
"HeaderRSSFeedGeneral": "Podrobnosti o RSS",
"HeaderRSSFeedIsOpen": "Informační kanál RSS je otevřený",
"HeaderSelectDownloadLocation": "Select Download Location",
"HeaderRSSFeed": "RSS kanál",
"HeaderRSSFeedGeneral": "Detaily RSS",
"HeaderRSSFeedIsOpen": "Kanál RSS je otevřen",
"HeaderSelectDownloadLocation": "Vyberte umístění pro stažení",
"HeaderSettings": "Nastavení",
"HeaderSleepTimer": "Časovač vypnutí",
"HeaderSleepTimerSettings": "Sleep Timer Settings",
"HeaderStatsMinutesListeningChart": "Počet minut poslechu (posledních 7 dní)",
"HeaderStatsRecentSessions": "Poslední relace",
"HeaderSleepTimer": "Časovač spánku",
"HeaderSleepTimerSettings": "Nastavení časovače spánku",
"HeaderStatsMinutesListeningChart": "Minuty poslechu (posledních 7 dní)",
"HeaderStatsRecentSessions": "Poslední sezení",
"HeaderTableOfContents": "Obsah",
"HeaderUserInterfaceSettings": "User Interface Settings",
"HeaderUserInterfaceSettings": "Nastavení uživatelského rozhraní",
"HeaderYourStats": "Vaše statistiky",
"LabelAdded": "Přidáno",
"LabelAddedAt": "Přidáno v",
"LabelAddToPlaylist": "Přidat do seznamu přehrávání",
"LabelAddToPlaylist": "Přidat do seznamu skladeb",
"LabelAll": "Vše",
"LabelAllowSeekingOnMediaControls": "Allow position seeking on media notification controls",
"LabelAuthor": "Autor",
"LabelAuthorFirstLast": "Autor (jméno a příjmení)",
"LabelAuthorLastFirst": "Autor (příjmení a jméno)",
"LabelAuthors": "Autoři",
"LabelAutoDownloadEpisodes": "Automaticky stahovat epizody",
"LabelAutoRewindTime": "Auto rewind time",
"LabelAutoSleepTimer": "Auto sleep timer",
"LabelAutoSleepTimerAutoRewind": "Auto sleep timer auto rewind",
"LabelAutoSleepTimerAutoRewindHelp": "When the auto sleep timer finishes, playing the item again will automatically rewind your position.",
"LabelAutoSleepTimerHelp": "When playing media between the specified start and end times a sleep timer will automatically start.",
"LabelAutoRewindTime": "Přetočit zpět o",
"LabelAutoSleepTimer": "Automatický časovač spánku",
"LabelAutoSleepTimerAutoRewind": "Přetočit zpět po uspání",
"LabelAutoSleepTimerAutoRewindHelp": "Když dojde k uspání automatickým časovačem spánku, pozice přehrávání je posunuta zpět o vybraný čas.",
"LabelAutoSleepTimerHelp": "hem přehrávání média v časovém rozmezí \"Od\" a \"Do\" se automaticky spustí časovač spánku.",
"LabelBooks": "Knihy",
"LabelChapters": "Kapitoly",
"LabelChapterTrack": "Chapter Track",
"LabelChapterTrack": "Stopa kapitoly",
"LabelClosePlayer": "Zavřít přehrávač",
"LabelCollapseSeries": "Sbalit sérii",
"LabelComplete": "Dokončeno",
"LabelContinueBooks": "Continue Books",
"LabelContinueEpisodes": "Continue Episodes",
"LabelContinueListening": "Continue Listening",
"LabelContinueReading": "Continue Reading",
"LabelContinueSeries": "Continue Series",
"LabelCustomTime": "Custom time",
"LabelContinueBooks": "Pokračovat v knihách",
"LabelContinueEpisodes": "Pokračovat v epizodách",
"LabelContinueListening": "Pokračovat v poslechu",
"LabelContinueReading": "Pokračovat ve čtení",
"LabelContinueSeries": "Pokračovat v sériích",
"LabelCustomTime": "Vlastní čas",
"LabelDescription": "Popis",
"LabelDisableAudioFadeOut": "Disable audio fade out",
"LabelDisableAudioFadeOutHelp": "Audio volume will start decreasing when there is less than 1 minute remaining on the sleep timer. Enable this setting to not fade out.",
"LabelDisableAutoRewind": "Disable auto rewind",
"LabelDisableShakeToReset": "Disable shake to reset",
"LabelDisableShakeToResetHelp": "Shaking your device while the timer is running OR within 2 minutes of the timer expiring will reset the sleep timer. Enable this setting to disable shake to reset.",
"LabelDisableVibrateOnReset": "Disable vibrate on reset",
"LabelDisableVibrateOnResetHelp": "When the sleep timer gets reset your device will vibrate. Enable this setting to not vibrate when the sleep timer resets.",
"LabelDiscover": "Discover",
"LabelDisableAudioFadeOut": "Vypnout postupné snižování zvuku",
"LabelDisableAudioFadeOutHelp": "Hlasitost zvuku začne klesat, pokud zbývá méně než 1 minuta do vypršení časovače spánku. Tuto možnost povolte, pokud nechcete postupné snižování hlasitosti.",
"LabelDisableAutoRewind": "Zakázat automatické přetočení",
"LabelDisableShakeToReset": "Zakázat resetování otřesem",
"LabelDisableShakeToResetHelp": "Když je časovač spánku spuštěn nebo zbýva 2 minuty do jeho vypršení, zatřesení zařízením se resetuje časovač spánku. Povolte toto nastavení, pokud chcete resetování otřesem zakázat.",
"LabelDisableVibrateOnReset": "Zakázat vibraci při resetování",
"LabelDisableVibrateOnResetHelp": "Když je časovač spánku resetován, zařízení zavibruje. Tuto možnost povolte, pokud nechcete, aby zařízení vibrace provádělo při resetování časovače spánku.",
"LabelDiscover": "Objevit",
"LabelDownload": "Stáhnout",
"LabelDownloaded": "Downloaded",
"LabelDuration": "Doba trvání",
"LabelEbook": "Elektronická kniha",
"LabelEbooks": "Ebooks",
"LabelDownloaded": "Staženo",
"LabelDuration": "Trvání",
"LabelEbook": "E-kniha",
"LabelEbooks": "E-knihy",
"LabelEnable": "Povolit",
"LabelEnableMp3IndexSeeking": "Enable mp3 index seeking",
"LabelEnableMp3IndexSeekingHelp": "This setting should only be enabled if you have mp3 files that are not seeking correctly. Inaccurate seeking is most likely due to Variable birate (VBR) MP3 files. This setting will force index seeking, in which a time-to-byte mapping is built as the file is read. In some cases with large MP3 files there will be a delay when seeking towards the end of the file.",
"LabelEnableMp3IndexSeeking": "Povolit indexové vyhledávání mp3",
"LabelEnableMp3IndexSeekingHelp": "Toto nastavení by mělo být povoleno pouze v případě, že soubory MP3 nejsou správně vyhledávány. Nepřesné vyhledávání je s největší pravděpodobností způsobeno soubory MP3 s proměnlivým datovým tokem (VBR). Toto nastavení vynutí indexové vyhledávání, při kterém se při čtení souboru vytváří mapování času na bajty. V některých případech u velkých souborů MP3 dochází ke zpoždění při vyhledávání ke konci souboru.",
"LabelEnd": "Konec",
"LabelEndOfChapter": "End of Chapter",
"LabelEndTime": "End time",
"LabelEndOfChapter": "Konec kapitoly",
"LabelEndTime": "Do",
"LabelEpisode": "Epizoda",
"LabelFeedURL": "URL zdroje",
"LabelFeedURL": "URL kanálu",
"LabelFile": "Soubor",
"LabelFileBirthtime": "Čas vzniku souboru",
"LabelFileModified": "Soubor změněn",
"LabelFileBirthtime": "Čas vytvoření souboru",
"LabelFileModified": "Soubor upraven",
"LabelFilename": "Název souboru",
"LabelFinished": "Dokončeno",
"LabelFolder": "Složka",
"LabelFontScale": "Měřítko písma",
"LabelGenre": "Žánr",
"LabelGenres": "Žánry",
"LabelHapticFeedback": "Haptic feedback",
"LabelHasEbook": "Has ebook",
"LabelHasSupplementaryEbook": "Has supplementary ebook",
"LabelHeavy": "Heavy",
"LabelHigh": "High",
"LabelHapticFeedback": "Haptická odezva",
"LabelHasEbook": "Má e-knihu",
"LabelHasSupplementaryEbook": "Má doplňkovou e-knihu",
"LabelHeavy": "Těžké",
"LabelHigh": "Vysoké",
"LabelHost": "Hostitel",
"LabelIncomplete": "Neúplné",
"LabelInProgress": "Probíhá",
"LabelInternalAppStorage": "Internal App Storage",
"LabelJumpBackwardsTime": "Jump backwards time",
"LabelJumpForwardsTime": "Jump forwards time",
"LabelInternalAppStorage": "Interní úložiště aplikace",
"LabelJumpBackwardsTime": "Délka skoku zpět v čase",
"LabelJumpForwardsTime": "Délka skoku vpřed v čase",
"LabelLanguage": "Jazyk",
"LabelLayout": "Layout",
"LabelLayoutAuto": "Auto",
"LabelLayoutSinglePage": "Single page",
"LabelLight": "Light",
"LabelLayout": "Rozvržení",
"LabelLayoutAuto": "Automatické",
"LabelLayoutSinglePage": "Jedna stránka",
"LabelLight": "Světlé",
"LabelLineSpacing": "Řádkování",
"LabelListenAgain": "Listen Again",
"LabelLocalBooks": "Local Books",
"LabelLocalPodcasts": "Local Podcasts",
"LabelLockOrientation": "Lock orientation",
"LabelLockPlayer": "Lock Player",
"LabelLow": "Low",
"LabelListenAgain": "Poslechnout znovu",
"LabelLocalBooks": "Místní knihy",
"LabelLocalPodcasts": "Místní podcasty",
"LabelLockOrientation": "Zamknout orientaci",
"LabelLockPlayer": "Zamknout přehrávač",
"LabelLow": "Nízké",
"LabelMediaType": "Typ média",
"LabelMedium": "Medium",
"LabelMedium": "Střední",
"LabelMore": "Více",
"LabelMoreInfo": "Více informací",
"LabelName": "Jméno",
"LabelNarrator": "Interpret",
"LabelNarrators": "Interpreti",
"LabelNewestAuthors": "Newest Authors",
"LabelNewestEpisodes": "Newest Episodes",
"LabelNo": "No",
"LabelNarrator": "Vypravěč",
"LabelNarrators": "Vypravěči",
"LabelNewestAuthors": "Nejnovější autoři",
"LabelNewestEpisodes": "Nejnovější epizody",
"LabelNo": "Ne",
"LabelNotFinished": "Nedokončeno",
"LabelNotStarted": "Nezahájeno",
"LabelOff": "Off",
"LabelOff": "Vypnout",
"LabelPassword": "Heslo",
"LabelPath": "Cesta",
"LabelPlaybackDirect": "Direct",
"LabelPlaybackLocal": "Local",
"LabelPlaybackSpeed": "Playback Speed",
"LabelPlaybackTranscode": "Transcode",
"LabelPlaybackDirect": "Přímé",
"LabelPlaybackLocal": "Místní",
"LabelPlaybackSpeed": "Rychlost přehrávání",
"LabelPlaybackTranscode": "Překódovává se",
"LabelPodcast": "Podcast",
"LabelPodcasts": "Podcasty",
"LabelPreventIndexing": "Zabránit indexování vašeho kanálu v adresářích podcastů iTunes a Google",
@@ -187,95 +188,97 @@
"LabelPubDate": "Datum vydání",
"LabelPublishYear": "Rok vydání",
"LabelRead": "Číst",
"LabelReadAgain": "Read Again",
"LabelRecentlyAdded": "Recently Added",
"LabelRecentSeries": "Recent Series",
"LabelReadAgain": "Číst znovu",
"LabelRecentlyAdded": "Nedávno přidáno",
"LabelRecentSeries": "Nedávné série",
"LabelRemoveFromPlaylist": "Remove from Playlist",
"LabelRSSFeedCustomOwnerEmail": "Vlastní e-mail vlastníka",
"LabelRSSFeedCustomOwnerName": "Vlastní jméno vlastníka",
"LabelRSSFeedPreventIndexing": "Zabránit indexování",
"LabelRSSFeedSlug": "RSS kanál Slug",
"LabelRSSFeedSlug": "Klíčové slovo kanálu RSS",
"LabelScaleElapsedTimeBySpeed": "Škálovat uplynulý čas podle rychlosti",
"LabelSeason": "Sezóna",
"LabelSelectADevice": "Select a device",
"LabelSelectADevice": "Vyberte zařízení",
"LabelSeries": "Série",
"LabelServerAddress": "Server address",
"LabelServerAddress": "Adresa serveru",
"LabelSetEbookAsPrimary": "Nastavit jako primární",
"LabelSetEbookAsSupplementary": "Nastavit jako doplňkové",
"LabelShakeSensitivity": "Shake sensitivity",
"LabelSetEbookAsSupplementary": "Nastavit jako doplňkový",
"LabelShakeSensitivity": "Citlivost na otřes",
"LabelShowAll": "Zobrazit vše",
"LabelSize": "Velikost",
"LabelSleepTimer": "Časovač vypnutí",
"LabelStart": "Spustit",
"LabelStartTime": "Čas Spuštění",
"LabelSleepTimer": "Spánek po",
"LabelStart": "Začít",
"LabelStartTime": "Od",
"LabelStatsBestDay": "Nejlepší den",
"LabelStatsDailyAverage": "Denní průměr",
"LabelStatsDays": "Dny",
"LabelStatsDaysListened": "Dny poslechu",
"LabelStatsInARow": "v řadě",
"LabelStatsItemsFinished": "Dokončené Položky",
"LabelStatsItemsFinished": "Dokončené položky",
"LabelStatsMinutes": "minut",
"LabelStatsMinutesListening": "Minuty poslechu",
"LabelStatsWeekListening": "Týdenní poslech",
"LabelTag": "Značka",
"LabelTags": "Značky",
"LabelStatsWeekListening": "Za týden",
"LabelTag": "Štítek",
"LabelTags": "Štítky",
"LabelTheme": "Téma",
"LabelThemeDark": "Tmavé",
"LabelThemeLight": "Světlé",
"LabelTimeRemaining": "{0} zbývá",
"LabelTitle": "Název",
"LabelTotalTrack": "Total Track",
"LabelTotalTrack": "Celková stopa",
"LabelTracks": "Stopy",
"LabelType": "Typ",
"LabelUnlockPlayer": "Unlock Player",
"LabelUseBookshelfView": "Use bookshelf view",
"LabelUnlockPlayer": "Odemknout přehrávač",
"LabelUseBookshelfView": "Použít vzhled knihovny",
"LabelUser": "Uživatel",
"LabelUsername": "Uživatelské jméno",
"LabelVeryHigh": "Very High",
"LabelVeryLow": "Very Low",
"LabelVeryHigh": "Velmi vysoké",
"LabelVeryLow": "Velmi nízké",
"LabelYourBookmarks": "Vaše záložky",
"LabelYourProgress": "Váš pokrok",
"MessageAndroid10Downloads": "Android 10 and below will use internal app storage for downloads.",
"MessageAttemptingServerConnection": "Attempting server connection...",
"MessageAudiobookshelfServerNotConnected": "Audiobookshelf server not connected",
"MessageAudiobookshelfServerRequired": "<strong>Important!</strong> This app is designed to work with an Audiobookshelf server that you or someone you know is hosting. This app does not provide any content.",
"MessageBookshelfEmpty": "Bookshelf empty",
"MessageConfirmDeleteLocalEpisode": "Remove local episode \"{0}\" from your device? The file on the server will be unaffected.",
"MessageConfirmDeleteLocalFiles": "Remove local files of this item from your device? The files on the server and your progress will be unaffected.",
"MessageConfirmDiscardProgress": "Are you sure you want to reset your progress?",
"MessageConfirmMarkAsFinished": "Are you sure you want to mark this item as finished?",
"MessageConfirmRemoveBookmark": "Are you sure you want to remove bookmark?",
"MessageDiscardProgress": "Discard Progress",
"MessageDownloadCompleteProcessing": "Download complete. Processing...",
"MessageDownloading": "Downloading...",
"MessageAndroid10Downloads": "Android 10 a starší budou používat interní úložiště aplikace pro stahování.",
"MessageAttemptingServerConnection": "Pokouším se o připojit k serveru...",
"MessageAudiobookshelfServerNotConnected": "Server Audiobookshelf není připojen",
"MessageAudiobookshelfServerRequired": "<strong>Důležité!</strong> Tato aplikace je navržena, aby pracovala se serverem Audiobookshelf, který hostuje buď vy, nebo někdo, koho znáte. Tato aplikace neposkytuje žádný obsah.",
"MessageBookshelfEmpty": "Knihovna je prázdná",
"MessageConfirmDeleteLocalEpisode": "Odebrat místní epizodu „{0}“ ze zařízení? Soubor na serveru zůstane nezměněný.",
"MessageConfirmDeleteLocalFiles": "Odebrat místní soubory této položky ze zařízení? Soubory na serveru a váš pokrok nebudou ovlivněny.",
"MessageConfirmDiscardProgress": "Opravdu chcete zahodit svůj pokrok?",
"MessageConfirmMarkAsFinished": "Opravdu chcete tuto položku označit jako dokončenou?",
"MessageConfirmRemoveBookmark": "Opravdu chcete odebrat záložku?",
"MessageDiscardProgress": "Zahodit pokrok",
"MessageDownloadCompleteProcessing": "Stahování dokončeno. Zpracovává se...",
"MessageDownloading": "Stahuje se...",
"MessageDownloadingEpisode": "Stahuji epizodu",
"MessageEpisodesQueuedForDownload": "{0} epizody zařazené do fronty ke stažení",
"MessageEpisodesQueuedForDownload": "{0} epizod ve frontě ke stažení",
"MessageFeedURLWillBe": "URL zdroje bude {0}",
"MessageFetching": "Stahování...",
"MessageFollowTheProjectOnGithub": "Follow the project on Github",
"MessageItemDownloadCompleteFailedToCreate": "Item download complete but failed to create library item",
"MessageFetching": "Získává se...",
"MessageFollowTheProjectOnGithub": "Sledujte projekt na GitHubu",
"MessageItemDownloadCompleteFailedToCreate": "Stahování položky bylo dokončeno, ale nepodařilo se vytvořit položku v knihovně",
"MessageLoading": "Načítá se...",
"MessageLoadingServerData": "Loading server data...",
"MessageLoadingServerData": "Načítání dat ze serveru...",
"MessageMarkAsFinished": "Označit jako dokončené",
"MessageMediaLinkedToADifferentServer": "Media is linked to an Audiobookshelf server on a different address ({0}). Progress will be synced when connected to this server address.",
"MessageMediaLinkedToADifferentUser": "Media is linked to this server but was downloaded by a different user. Progress will only be synced to the user that downloaded it.",
"MessageMediaLinkedToServer": "Linked to server {0}",
"MessageMediaLinkedToThisServer": "Downloaded media is linked to this server",
"MessageMediaNotLinkedToServer": "Media is not linked to an Audiobookshelf server. No progress will be synced.",
"MessageMediaLinkedToADifferentServer": "Média jsou propojena se serverem Audiobookshelf na jiné adrese ({0}). Pokrok bude synchronizován, když budete připojeni k této adrese serveru.",
"MessageMediaLinkedToADifferentUser": "Média jsou propojena se serverem, ale byla stažena jiným uživatelem. Pokrok bude synchronizován pouze s uživatelem, který je stáhl.",
"MessageMediaLinkedToServer": "Propojeno se serverem {0}",
"MessageMediaLinkedToThisServer": "Stažená média jsou propojena s tímto serverem",
"MessageMediaNotLinkedToServer": "Média nejsou propojena se serverem Audiobookshelf. Pokrok nebude synchronizován.",
"MessageNoBookmarks": "Žádné záložky",
"MessageNoChapters": "Žádné kapitoly",
"MessageNoItems": "Žádné položky",
"MessageNoItemsFound": "Nebyly nalezeny žádné položky",
"MessageNoListeningSessions": "Žádné poslechové relace",
"MessageNoMediaFolders": "No Media Folders",
"MessageNoNetworkConnection": "No network connection",
"MessageNoMediaFolders": "Žádné složky médií",
"MessageNoNetworkConnection": "Žádné připojení k síti",
"MessageNoPodcastsFound": "Nebyly nalezeny žádné podcasty",
"MessageNoUpdatesWereNecessary": "Nebyly nutné žádné aktualizace",
"MessageNoUserPlaylists": "Nemáte žádné seznamy skladeb",
"MessageReportBugsAndContribute": "Hlásit chyby, žádat o funkce a přispívat",
"MessageSocketConnectedOverMeteredCellular": "Socket connected over metered cellular",
"MessageSocketConnectedOverMeteredWifi": "Socket connected over metered wifi",
"MessageSocketConnectedOverUnmeteredCellular": "Socket connected over unmetered cellular",
"MessageSocketConnectedOverUnmeteredWifi": "Socket connected over unmetered wifi",
"MessageSocketNotConnected": "Socket not connected",
"MessageReportBugsAndContribute": "Nahlašte chyby, vyžádejte si funkce a přispěte na",
"MessageSocketConnectedOverMeteredCellular": "Socket připojen přes měřenou mobilní síť",
"MessageSocketConnectedOverMeteredWifi": "Socket připojen přes měřenou wifi",
"MessageSocketConnectedOverUnmeteredCellular": "Socket připojen přes neměřenou mobilní síť",
"MessageSocketConnectedOverUnmeteredWifi": "Socket připojen přes neměřenou wifi",
"MessageSocketNotConnected": "Socket není připojen",
"NoteRSSFeedPodcastAppsHttps": "Upozornění: Většina aplikací pro podcasty bude vyžadovat, aby adresa URL kanálu RSS používala protokol HTTPS",
"NoteRSSFeedPodcastAppsPubDate": "Upozornění: 1 nebo více epizod nemá datum vydání. Některé podcastové aplikace to vyžadují.",
"ToastBookmarkCreateFailed": "Vytvoření záložky se nezdařilo",
+3
View File
@@ -85,6 +85,7 @@
"LabelAddedAt": "Tilføjet Kl.",
"LabelAddToPlaylist": "Tilføj til Afspilningsliste",
"LabelAll": "Alle",
"LabelAllowSeekingOnMediaControls": "Allow position seeking on media notification controls",
"LabelAuthor": "Forfatter",
"LabelAuthorFirstLast": "Forfatter (Fornavn Efternavn)",
"LabelAuthorLastFirst": "Forfatter (Efternavn, Fornavn)",
@@ -190,10 +191,12 @@
"LabelReadAgain": "Read Again",
"LabelRecentlyAdded": "Recently Added",
"LabelRecentSeries": "Recent Series",
"LabelRemoveFromPlaylist": "Remove from Playlist",
"LabelRSSFeedCustomOwnerEmail": "Brugerdefineret ejerens e-mail",
"LabelRSSFeedCustomOwnerName": "Brugerdefineret ejerens navn",
"LabelRSSFeedPreventIndexing": "Forhindrer indeksering",
"LabelRSSFeedSlug": "RSS-feed-slug",
"LabelScaleElapsedTimeBySpeed": "Scale Elapsed Time by Speed",
"LabelSeason": "Sæson",
"LabelSelectADevice": "Select a device",
"LabelSeries": "Serie",
+53 -50
View File
@@ -17,36 +17,36 @@
"ButtonDeleteLocalEpisode": "Lösche lokale Episode",
"ButtonDeleteLocalFile": "Lösche lokale Datei",
"ButtonDeleteLocalItem": "Lösche lokales Element",
"ButtonDisableAutoTimer": "Deaktiviere Automatischer-Timer",
"ButtonDisableAutoTimer": "Deaktiviere automatischen Timer",
"ButtonDisconnect": "Trennen",
"ButtonHistory": "Historie",
"ButtonHome": "Startseite",
"ButtonIssues": "Probleme",
"ButtonLatest": "Neuste",
"ButtonLatest": "Neueste",
"ButtonLibrary": "Bibliothek",
"ButtonLocalMedia": "Lokale Medien",
"ButtonManageLocalFiles": "Verwalte lokale Dateien",
"ButtonNewFolder": "Neuer Ordner",
"ButtonNextEpisode": "Nächste Episode",
"ButtonOpenFeed": "Feed öffnen",
"ButtonOverride": "Überschreieben",
"ButtonOverride": "Überschreiben",
"ButtonPause": "Pause",
"ButtonPlay": "Abspielen",
"ButtonPlaying": "Spielt",
"ButtonPlaylists": "Wiedergabelisten",
"ButtonRead": "Lese",
"ButtonRead": "Lesen",
"ButtonRemove": "Löschen",
"ButtonRemoveFromServer": "Vom Server entfernen",
"ButtonSave": "Speichern",
"ButtonSaveOrder": "Speicher Reihenfolge",
"ButtonSaveOrder": "Reihenfolge speichern",
"ButtonSearch": "Suchen",
"ButtonSendEbookToDevice": "Sende Ebook an Gerät",
"ButtonSendEbookToDevice": "Sende E-Book an Gerät",
"ButtonSeries": "Serien",
"ButtonSetTimer": "Setze Timer",
"ButtonStream": "Stream",
"ButtonSubmit": "Ok",
"ButtonSwitchServerUser": "Wechsle Server/Benutzer",
"ButtonUserStats": "Nutzer Statistiken",
"ButtonUserStats": "Nutzerstatistiken",
"ButtonYes": "Ja",
"HeaderAccount": "Konto",
"HeaderAdvanced": "Erweitert",
@@ -54,13 +54,13 @@
"HeaderChapters": "Kapitel",
"HeaderCollection": "Sammlungen",
"HeaderCollectionItems": "Sammlungseinträge",
"HeaderConnectionStatus": "Verbindungs Status",
"HeaderDetails": "Einzelheiten",
"HeaderConnectionStatus": "Verbindungsstatus",
"HeaderDetails": "Details",
"HeaderDownloads": "Downloads",
"HeaderEbookFiles": "E-Book Dateien",
"HeaderEpisodes": "Episoden",
"HeaderEreaderSettings": "Ereader Einstellungen",
"HeaderLatestEpisodes": "Letzte Episoden",
"HeaderEreaderSettings": "E-Reader Einstellungen",
"HeaderLatestEpisodes": "Neueste Episoden",
"HeaderLibraries": "Bibliotheken",
"HeaderLocalFolders": "Lokale Ordner",
"HeaderLocalLibraryItems": "Lokale Bibliothek Elemente",
@@ -74,8 +74,8 @@
"HeaderRSSFeedIsOpen": "RSS-Feed ist geöffnet",
"HeaderSelectDownloadLocation": "Wähle Download-Speicherort",
"HeaderSettings": "Einstellungen",
"HeaderSleepTimer": "Einschlaf-Timer",
"HeaderSleepTimerSettings": "Einschlaf-Timer Einstellungen",
"HeaderSleepTimer": "Sleep-Timer",
"HeaderSleepTimerSettings": "Sleep-Timer Einstellungen",
"HeaderStatsMinutesListeningChart": "Hörminuten (letzte 7 Tage)",
"HeaderStatsRecentSessions": "Neueste Ereignisse",
"HeaderTableOfContents": "Inhaltsverzeichnis",
@@ -85,16 +85,17 @@
"LabelAddedAt": "Hinzugefügt am",
"LabelAddToPlaylist": "Zur Wiedergabeliste hinzufügen",
"LabelAll": "Alle",
"LabelAllowSeekingOnMediaControls": "Erlaube Vor- und Zurückspulen auf dem Medienkontrollelement bei den Benachrichtigungen",
"LabelAuthor": "Autor",
"LabelAuthorFirstLast": "Autor (Vorname Nachname)",
"LabelAuthorLastFirst": "Autor (Nachname, Vorname)",
"LabelAuthors": "Autoren",
"LabelAutoDownloadEpisodes": "Episoden automatisch herunterladen",
"LabelAutoRewindTime": "Automatische Rückspulzeit",
"LabelAutoSleepTimer": "Automatischer Einschlaf-Timer",
"LabelAutoSleepTimerAutoRewind": "Automatischer Einschlaf-Timer automatische Rückspulzeit",
"LabelAutoSleepTimerAutoRewindHelp": "Wenn die Einschlaf-Timer abgelaufen ist, wird bei der erneuten Wiedergabe des Titels die Position automatisch zurückgespult.",
"LabelAutoSleepTimerHelp": "Bei der Wiedergabe von Medien zwischen der angegebenen Start- und Endzeit wird automatisch ein Einschlaf-Timer gestartet.",
"LabelAutoSleepTimer": "Automatischer Sleep-Timer",
"LabelAutoSleepTimerAutoRewind": "Automatischer Sleep-Timer automatische Rückspulzeit",
"LabelAutoSleepTimerAutoRewindHelp": "Wenn der Sleep-Timer abgelaufen ist, wird bei der erneuten Wiedergabe des Titels die Position automatisch zurückgespult.",
"LabelAutoSleepTimerHelp": "Bei der Wiedergabe von Medien zwischen der angegebenen Start- und Endzeit wird automatisch ein Sleep-Timer gestartet.",
"LabelBooks": "Bücher",
"LabelChapters": "Kapitel",
"LabelChapterTrack": "Kapitel Spur",
@@ -104,26 +105,26 @@
"LabelContinueBooks": "Bücher fortfahren",
"LabelContinueEpisodes": "Episoden fortfahren",
"LabelContinueListening": "Weiterhören",
"LabelContinueReading": "Continue Reading",
"LabelContinueReading": "Weiterlesen",
"LabelContinueSeries": "Serie fortsetzen",
"LabelCustomTime": "Benutzerdefinierte Zeit",
"LabelDescription": "Beschreibung",
"LabelDisableAudioFadeOut": "Deaktiviere Audio abklingen",
"LabelDisableAudioFadeOutHelp": "Die Audiolautstärke wird verringert, wenn weniger als 1 Minute für den Einschlaf-Timer verbleibt. Aktivieren Sie diese Einstellung, um nicht abzuklingen.",
"LabelDisableAutoRewind": "Deaktiviere automatisches Rückspulen",
"LabelDisableAudioFadeOutHelp": "Die Audiolautstärke wird verringert, wenn weniger als 1 Minute für den Sleep-Timer verbleibt. Aktiviere diese Einstellung, um nicht abzuklingen.",
"LabelDisableAutoRewind": "Deaktiviere automatisches Zurückspulen",
"LabelDisableShakeToReset": "Deaktiviere Schütteln zum Zurücksetzen",
"LabelDisableShakeToResetHelp": "Wenn Sie Ihr Gerät schütteln, während der Timer läuft ODER innerhalb von 2 Minuten nach Ablauf des Timers, wird der Sleep-Timer zurückgesetzt. Aktivieren Sie diese Einstellung, um das Schütteln zum Zurücksetzen zu deaktivieren.",
"LabelDisableShakeToResetHelp": "Wenn du dein Gerät schüttelst, während der Timer läuft ODER innerhalb von 2 Minuten nach Ablauf des Timers, wird der Sleep-Timer zurückgesetzt. Aktiviere diese Einstellung, um das Schütteln zum Zurücksetzen zu deaktivieren.",
"LabelDisableVibrateOnReset": "Deaktiviere Vibrieren beim Zurücksetzen",
"LabelDisableVibrateOnResetHelp": "Wenn der Einschlaf-Timer zurückgesetzt wird, vibriert Ihr Gerät. Aktivieren Sie diese Einstellung, um nicht zu vibrieren, wenn der Einschlaf-Timer zurückgesetzt wird.",
"LabelDisableVibrateOnResetHelp": "Wenn der Sleep-Timer zurückgesetzt wird, vibriert dein Gerät. Aktiviere diese Einstellung, um nicht zu vibrieren, wenn der Sleep-Timer zurückgesetzt wird.",
"LabelDiscover": "Entdecken",
"LabelDownload": "Herunterladen",
"LabelDownloaded": "Heruntergeladen",
"LabelDuration": "Laufzeit",
"LabelEbook": "E-Book",
"LabelEbooks": "Ebooks",
"LabelEbooks": "E-Books",
"LabelEnable": "Aktivieren",
"LabelEnableMp3IndexSeeking": "MP3-Indexsuche",
"LabelEnableMp3IndexSeekingHelp": "Diese Einstellung sollte nur aktiviert werden, wenn Sie MP3-Dateien haben, bei denen das Navigieren (Seeking) nicht korrekt funktioniert. Ungenaues Navigieren ist höchstwahrscheinlich auf MP3-Dateien mit variabler Bitrate (VBR) zurückzuführen. Diese Einstellung erzwingt das Index-Navigieren (Index Seeking), bei dem eine Zeit-zu-Byte-Zuordnung erstellt wird, während die Datei gelesen wird. In einigen Fällen kann es bei großen MP3-Dateien zu einer Verzögerung kommen, wenn gegen Ende der Datei navigiert wird.",
"LabelEnableMp3IndexSeekingHelp": "Diese Einstellung sollte nur aktiviert werden, wenn du MP3-Dateien hast, bei denen das Navigieren (Seeking) nicht korrekt funktioniert. Ungenaues Navigieren ist höchstwahrscheinlich auf MP3-Dateien mit variabler Bitrate (VBR) zurückzuführen. Diese Einstellung erzwingt das Index-Navigieren (Index Seeking), bei dem eine Zeit-zu-Byte-Zuordnung erstellt wird, während die Datei gelesen wird. In einigen Fällen kann es bei großen MP3-Dateien zu einer Verzögerung kommen, wenn gegen Ende der Datei navigiert wird.",
"LabelEnd": "Ende",
"LabelEndOfChapter": "Kapitelende",
"LabelEndTime": "Endzeit",
@@ -133,14 +134,14 @@
"LabelFileBirthtime": "Datei erstellt",
"LabelFileModified": "Datei geändert",
"LabelFilename": "Dateiname",
"LabelFinished": "beendet",
"LabelFinished": "Beendet",
"LabelFolder": "Ordner",
"LabelFontScale": "Schriftgröße",
"LabelGenre": "Kategorie",
"LabelGenres": "Kategorien",
"LabelHapticFeedback": "Haptische Rückmeldung",
"LabelHasEbook": "Hat Ebook",
"LabelHasSupplementaryEbook": "Hat zusätzliches Ebook",
"LabelHasEbook": "E-Book verfügbar",
"LabelHasSupplementaryEbook": "Ergänzendes E-Book verfügbar",
"LabelHeavy": "Stark",
"LabelHigh": "Hoch",
"LabelHost": "Host",
@@ -152,26 +153,26 @@
"LabelLanguage": "Sprache",
"LabelLayout": "Layout",
"LabelLayoutAuto": "Auto",
"LabelLayoutSinglePage": "Single page",
"LabelLayoutSinglePage": "Einzelne Seite",
"LabelLight": "Leicht",
"LabelLineSpacing": "Zeilenabstand",
"LabelListenAgain": "Erneut anhören",
"LabelLocalBooks": "Lokale Bücher",
"LabelLocalPodcasts": "Lokale Podcasts",
"LabelLockOrientation": "automatische Bildschirmausrichtung sperren",
"LabelLockOrientation": "Automatische Bildschirmausrichtung sperren",
"LabelLockPlayer": "Mediaplayer sperren",
"LabelLow": "Wenig",
"LabelMediaType": "Medientyp",
"LabelMedium": "Mittel",
"LabelMore": "Mehr",
"LabelMoreInfo": "Mehr Info",
"LabelMoreInfo": "Mehr Infos",
"LabelName": "Name",
"LabelNarrator": "Erzähler",
"LabelNarrators": "Erzähler",
"LabelNewestAuthors": "Neueste Autoren",
"LabelNewestEpisodes": "Newest Episodes",
"LabelNewestEpisodes": "Neueste Episoden",
"LabelNo": "Nein",
"LabelNotFinished": "nicht beendet",
"LabelNotFinished": "Nicht beendet",
"LabelNotStarted": "Nicht begonnen",
"LabelOff": "Aus",
"LabelPassword": "Passwort",
@@ -187,30 +188,32 @@
"LabelPubDate": "Veröffentlichungsdatum",
"LabelPublishYear": "Jahr",
"LabelRead": "Lesen",
"LabelReadAgain": "Read Again",
"LabelReadAgain": "Erneut lesen",
"LabelRecentlyAdded": "Kürzlich hinzugefügt",
"LabelRecentSeries": "Aktuelle Serien",
"LabelRemoveFromPlaylist": "Remove from Playlist",
"LabelRSSFeedCustomOwnerEmail": "Benutzerdefinierte Eigentümer-E-Mail",
"LabelRSSFeedCustomOwnerName": "Benutzerdefinierter Name des Eigentümers",
"LabelRSSFeedPreventIndexing": "Indizierung verhindern",
"LabelRSSFeedSlug": "RSS Feed Schlagwort",
"LabelScaleElapsedTimeBySpeed": "Vergangene Zeit anhand der Geschwindigkeit skalieren",
"LabelSeason": "Staffel",
"LabelSelectADevice": "Wähle ein Gerät",
"LabelSeries": "Serien",
"LabelServerAddress": "Server Adresse",
"LabelSetEbookAsPrimary": "Setzen als Hauptbuch",
"LabelSetEbookAsSupplementary": "Setzen als Ergänzung",
"LabelSetEbookAsPrimary": "Als Hauptbuch setzen",
"LabelSetEbookAsSupplementary": "Als Ergänzung setzen",
"LabelShakeSensitivity": "Schüttel-Empfindlichkeit",
"LabelShowAll": "Alles anzeigen",
"LabelSize": "Größe",
"LabelSleepTimer": "Einschlaf-Timer",
"LabelSleepTimer": "Sleep-Timer",
"LabelStart": "Start",
"LabelStartTime": "Startzeit",
"LabelStatsBestDay": "Bester Tag",
"LabelStatsDailyAverage": "Tagesdurchschnitt",
"LabelStatsDays": "Tage",
"LabelStatsDaysListened": "Gehörte Tage",
"LabelStatsInARow": "nacheinander",
"LabelStatsInARow": "Nacheinander",
"LabelStatsItemsFinished": "Gehörte Medien",
"LabelStatsMinutes": "Minuten",
"LabelStatsMinutesListening": "Gehörte Minuten",
@@ -219,11 +222,11 @@
"LabelTags": "Schlagwörter",
"LabelTheme": "Theme",
"LabelThemeDark": "Dunkel",
"LabelThemeLight": "Licht",
"LabelThemeLight": "Hell",
"LabelTimeRemaining": "{0} verbleibend",
"LabelTitle": "Titel",
"LabelTotalTrack": "Total Track",
"LabelTracks": "Dateien",
"LabelTotalTrack": "Gesamtanzahl Titel",
"LabelTracks": "Titel",
"LabelType": "Typ",
"LabelUnlockPlayer": "Mediaplayer entsperren",
"LabelUseBookshelfView": "Benutze Bücherregalansicht",
@@ -236,16 +239,16 @@
"MessageAndroid10Downloads": "Bei Android 10 und darunter wird der interne App-Speicher für Downloads verwendet.",
"MessageAttemptingServerConnection": "Versuch einer Serververbindung...",
"MessageAudiobookshelfServerNotConnected": "Audiobookshelf Server nicht verbunden",
"MessageAudiobookshelfServerRequired": "<strong>Wichtig!</strong> Diese App wurde entwickelt, um mit einem Audiobookshelf-Server zu arbeiten, den Sie oder jemand, den Sie kennen, hostet. Diese App stellt keine Inhalte zur Verfügung.",
"MessageAudiobookshelfServerRequired": "<strong>Wichtig!</strong> Diese App wurde entwickelt, um mit einem Audiobookshelf-Server zu arbeiten, den du oder jemand, den du kennst, hostet. Diese App stellt keine Inhalte zur Verfügung.",
"MessageBookshelfEmpty": "Bücherregal leer",
"MessageConfirmDeleteLocalEpisode": "Entferne lokale Episode \"{0}\" von Ihrem Gerät? Die Datei auf dem Server bleibt davon unberührt.",
"MessageConfirmDeleteLocalFiles": "Entfernen Sie lokale Dateien dieses Elements von Ihrem Gerät? Die Dateien auf dem Server und Ihr Fortschritt bleiben davon unberührt.",
"MessageConfirmDiscardProgress": "Sind Sie sicher, dass Sie Ihren Fortschritt zurücksetzen wollen?",
"MessageConfirmMarkAsFinished": "Sind Sie sicher, dass Sie diesen Artikel als beendet markieren wollen?",
"MessageConfirmRemoveBookmark": "Sind Sie sicher, dass Sie das Lesezeichen entfernen möchten?",
"MessageDiscardProgress": "Verwerfe Fortschritt",
"MessageConfirmDeleteLocalEpisode": "Soll die lokale Episode \"{0}\" von deinem Gerät entfernt werden? Die Datei auf dem Server bleibt davon unberührt.",
"MessageConfirmDeleteLocalFiles": "Sollen lokale Dateien dieses Elements von deinem Gerät entfernt werden? Die Dateien auf dem Server und Ihr Fortschritt bleiben davon unberührt.",
"MessageConfirmDiscardProgress": "Bist du sicher, dass du deinen Fortschritt zurücksetzen willst?",
"MessageConfirmMarkAsFinished": "Bist du sicher, dass du diesen Artikel als beendet markieren willst?",
"MessageConfirmRemoveBookmark": "Bist du sicher, dass du das Lesezeichen entfernen willst?",
"MessageDiscardProgress": "Fortschritt verwerfen",
"MessageDownloadCompleteProcessing": "Download abgeschlossen. Verarbeite...",
"MessageDownloading": "Downloaded...",
"MessageDownloading": "Herunterladen...",
"MessageDownloadingEpisode": "Episode herunterladen",
"MessageEpisodesQueuedForDownload": "{0} Episode(n) in der Warteschlange zum Herunterladen",
"MessageFeedURLWillBe": "Feed-URL wird {0} sein",
@@ -270,14 +273,14 @@
"MessageNoPodcastsFound": "Keine Podcasts gefunden",
"MessageNoUpdatesWereNecessary": "Keine Aktualisierungen waren notwendig",
"MessageNoUserPlaylists": "Keine Wiedergabelisten vorhanden",
"MessageReportBugsAndContribute": "Fehler melden, Funktionen anfordern und Beiträge leisten auf",
"MessageReportBugsAndContribute": "Fehler melden, Funktionen anfordern und mitwirken",
"MessageSocketConnectedOverMeteredCellular": "Socket verbunden über getaktetes Mobilfunknetz",
"MessageSocketConnectedOverMeteredWifi": "Socket verbunden über getaktetes WLAN",
"MessageSocketConnectedOverUnmeteredCellular": "Socket verbunden über ungetaktetes Mobilfunknetz",
"MessageSocketConnectedOverUnmeteredWifi": "Socket verbunden über ungetaktetes Mobilfunknetz",
"MessageSocketNotConnected": "Socket nicht verbunden",
"NoteRSSFeedPodcastAppsHttps": "Warnung: Die meisten Podcast-Apps verlangen, dass die URL des RSS-Feeds HTTPS verwendet.",
"NoteRSSFeedPodcastAppsPubDate": "Warnung: 1 oder mehrere Ihrer Episoden haben kein Veröffentlichungsdatum. Einige Podcast-Apps verlangen dies.",
"NoteRSSFeedPodcastAppsPubDate": "Warnung: 1 oder mehrere deiner Episoden haben kein Veröffentlichungsdatum. Einige Podcast-Apps verlangen dies.",
"ToastBookmarkCreateFailed": "Lesezeichen konnte nicht erstellt werden",
"ToastBookmarkRemoveFailed": "Lesezeichen konnte nicht gelöscht werden",
"ToastBookmarkUpdateFailed": "Lesezeichenaktualisierung fehlgeschlagen",
+3
View File
@@ -85,6 +85,7 @@
"LabelAddedAt": "Added At",
"LabelAddToPlaylist": "Add to Playlist",
"LabelAll": "All",
"LabelAllowSeekingOnMediaControls": "Allow position seeking on media notification controls",
"LabelAuthor": "Author",
"LabelAuthorFirstLast": "Author (First Last)",
"LabelAuthorLastFirst": "Author (Last, First)",
@@ -190,10 +191,12 @@
"LabelReadAgain": "Read Again",
"LabelRecentlyAdded": "Recently Added",
"LabelRecentSeries": "Recent Series",
"LabelRemoveFromPlaylist": "Remove from Playlist",
"LabelRSSFeedCustomOwnerEmail": "Custom owner Email",
"LabelRSSFeedCustomOwnerName": "Custom owner Name",
"LabelRSSFeedPreventIndexing": "Prevent Indexing",
"LabelRSSFeedSlug": "RSS Feed Slug",
"LabelScaleElapsedTimeBySpeed": "Scale Elapsed Time by Speed",
"LabelSeason": "Season",
"LabelSelectADevice": "Select a device",
"LabelSeries": "Series",
+3
View File
@@ -85,6 +85,7 @@
"LabelAddedAt": "Añadido",
"LabelAddToPlaylist": "Añadido a la Lista de Reproducción",
"LabelAll": "Todos",
"LabelAllowSeekingOnMediaControls": "Allow position seeking on media notification controls",
"LabelAuthor": "Autor",
"LabelAuthorFirstLast": "Autor (Nombre Apellido)",
"LabelAuthorLastFirst": "Autor (Apellido, Nombre)",
@@ -190,10 +191,12 @@
"LabelReadAgain": "Read Again",
"LabelRecentlyAdded": "Recently Added",
"LabelRecentSeries": "Recent Series",
"LabelRemoveFromPlaylist": "Remove from Playlist",
"LabelRSSFeedCustomOwnerEmail": "Email de dueño personalizado",
"LabelRSSFeedCustomOwnerName": "Nombre de dueño personalizado",
"LabelRSSFeedPreventIndexing": "Prevenir Indexado",
"LabelRSSFeedSlug": "Fuente RSS Slug",
"LabelScaleElapsedTimeBySpeed": "Scale Elapsed Time by Speed",
"LabelSeason": "Temporada",
"LabelSelectADevice": "Select a device",
"LabelSeries": "Series",
+3
View File
@@ -85,6 +85,7 @@
"LabelAddedAt": "Date dajout",
"LabelAddToPlaylist": "Ajouter à la liste de lecture",
"LabelAll": "Tout",
"LabelAllowSeekingOnMediaControls": "Allow position seeking on media notification controls",
"LabelAuthor": "Auteur",
"LabelAuthorFirstLast": "Auteur (Prénom Nom)",
"LabelAuthorLastFirst": "Auteur (Nom, Prénom)",
@@ -190,10 +191,12 @@
"LabelReadAgain": "Read Again",
"LabelRecentlyAdded": "Recently Added",
"LabelRecentSeries": "Recent Series",
"LabelRemoveFromPlaylist": "Remove from Playlist",
"LabelRSSFeedCustomOwnerEmail": "Courriel du propriétaire personnalisé",
"LabelRSSFeedCustomOwnerName": "Nom propriétaire personnalisé",
"LabelRSSFeedPreventIndexing": "Empêcher lindexation",
"LabelRSSFeedSlug": "Identificateur dadresse du Flux RSS ",
"LabelScaleElapsedTimeBySpeed": "Scale Elapsed Time by Speed",
"LabelSeason": "Saison",
"LabelSelectADevice": "Select a device",
"LabelSeries": "Séries",
+3
View File
@@ -85,6 +85,7 @@
"LabelAddedAt": "Added At",
"LabelAddToPlaylist": "Add to Playlist",
"LabelAll": "All",
"LabelAllowSeekingOnMediaControls": "Allow position seeking on media notification controls",
"LabelAuthor": "Author",
"LabelAuthorFirstLast": "Author (First Last)",
"LabelAuthorLastFirst": "Author (Last, First)",
@@ -190,10 +191,12 @@
"LabelReadAgain": "Read Again",
"LabelRecentlyAdded": "Recently Added",
"LabelRecentSeries": "Recent Series",
"LabelRemoveFromPlaylist": "Remove from Playlist",
"LabelRSSFeedCustomOwnerEmail": "Custom owner Email",
"LabelRSSFeedCustomOwnerName": "Custom owner Name",
"LabelRSSFeedPreventIndexing": "Prevent Indexing",
"LabelRSSFeedSlug": "RSS Feed Slug",
"LabelScaleElapsedTimeBySpeed": "Scale Elapsed Time by Speed",
"LabelSeason": "Season",
"LabelSelectADevice": "Select a device",
"LabelSeries": "Series",
+3
View File
@@ -85,6 +85,7 @@
"LabelAddedAt": "Added At",
"LabelAddToPlaylist": "Add to Playlist",
"LabelAll": "All",
"LabelAllowSeekingOnMediaControls": "Allow position seeking on media notification controls",
"LabelAuthor": "Author",
"LabelAuthorFirstLast": "Author (First Last)",
"LabelAuthorLastFirst": "Author (Last, First)",
@@ -190,10 +191,12 @@
"LabelReadAgain": "Read Again",
"LabelRecentlyAdded": "Recently Added",
"LabelRecentSeries": "Recent Series",
"LabelRemoveFromPlaylist": "Remove from Playlist",
"LabelRSSFeedCustomOwnerEmail": "Custom owner Email",
"LabelRSSFeedCustomOwnerName": "Custom owner Name",
"LabelRSSFeedPreventIndexing": "Prevent Indexing",
"LabelRSSFeedSlug": "RSS Feed Slug",
"LabelScaleElapsedTimeBySpeed": "Scale Elapsed Time by Speed",
"LabelSeason": "Season",
"LabelSelectADevice": "Select a device",
"LabelSeries": "Series",
+3
View File
@@ -85,6 +85,7 @@
"LabelAddedAt": "Added At",
"LabelAddToPlaylist": "Add to Playlist",
"LabelAll": "All",
"LabelAllowSeekingOnMediaControls": "Allow position seeking on media notification controls",
"LabelAuthor": "Autor",
"LabelAuthorFirstLast": "Author (First Last)",
"LabelAuthorLastFirst": "Author (Last, First)",
@@ -190,10 +191,12 @@
"LabelReadAgain": "Read Again",
"LabelRecentlyAdded": "Recently Added",
"LabelRecentSeries": "Recent Series",
"LabelRemoveFromPlaylist": "Remove from Playlist",
"LabelRSSFeedCustomOwnerEmail": "Custom owner Email",
"LabelRSSFeedCustomOwnerName": "Custom owner Name",
"LabelRSSFeedPreventIndexing": "Prevent Indexing",
"LabelRSSFeedSlug": "RSS Feed Slug",
"LabelScaleElapsedTimeBySpeed": "Scale Elapsed Time by Speed",
"LabelSeason": "Sezona",
"LabelSelectADevice": "Select a device",
"LabelSeries": "Serije",
+294
View File
@@ -0,0 +1,294 @@
{
"ButtonAdd": "Hozzáadás",
"ButtonAddNewServer": "Új szerver hozzáadása",
"ButtonAuthors": "Szerzők",
"ButtonBack": "Vissza",
"ButtonCancel": "Mégse",
"ButtonCancelTimer": "Időzítő megszakítása",
"ButtonClearFilter": "Szűrő törlése",
"ButtonCloseFeed": "Hírcsatorna bezárása",
"ButtonCollections": "Gyűjtemények",
"ButtonConnect": "Csatlakozás",
"ButtonConnectToServer": "Csatlakozás a szerverhez",
"ButtonCreate": "Létrehozás",
"ButtonCreateBookmark": "Könyvjelző létrehozása",
"ButtonCreateNewPlaylist": "Új lejátszási lista készítése",
"ButtonDelete": "Törlés",
"ButtonDeleteLocalEpisode": "Helyi epizód törlése",
"ButtonDeleteLocalFile": "Helyi fájl törlése",
"ButtonDeleteLocalItem": "Helyi elem törlése",
"ButtonDisableAutoTimer": "Automatikus időzítő letiltása",
"ButtonDisconnect": "Kapcsolat bontása",
"ButtonHistory": "Előzmények",
"ButtonHome": "Kezdőlap",
"ButtonIssues": "Problémák",
"ButtonLatest": "Legújabb",
"ButtonLibrary": "Könyvtár",
"ButtonLocalMedia": "Helyi média",
"ButtonManageLocalFiles": "Helyi fájlok kezelése",
"ButtonNewFolder": "Új mappa",
"ButtonNextEpisode": "Következő epizód",
"ButtonOpenFeed": "Hírcsatorna megnyitása",
"ButtonOverride": "Felülírás",
"ButtonPause": "Szünet",
"ButtonPlay": "Lejátszás",
"ButtonPlaying": "Lejátszás folyamatban",
"ButtonPlaylists": "Lejátszási listák",
"ButtonRead": "Olvasás",
"ButtonRemove": "Eltávolítás",
"ButtonRemoveFromServer": "Eltávolítás a szerverről",
"ButtonSave": "Mentés",
"ButtonSaveOrder": "Sorrend mentése",
"ButtonSearch": "Keresés",
"ButtonSendEbookToDevice": "E-könyv küldése eszközre",
"ButtonSeries": "Sorozatok",
"ButtonSetTimer": "Időzítő beállítása",
"ButtonStream": "Streamelés",
"ButtonSubmit": "Beküldés",
"ButtonSwitchServerUser": "Szerver/Felhasználó váltása",
"ButtonUserStats": "Felhasználói statisztikák",
"ButtonYes": "Igen",
"HeaderAccount": "Fiók",
"HeaderAdvanced": "Haladó",
"HeaderAudioTracks": "Audiósávok",
"HeaderChapters": "Fejezetek",
"HeaderCollection": "Gyűjtemény",
"HeaderCollectionItems": "Gyűjtemény elemek",
"HeaderConnectionStatus": "Kapcsolat állapota",
"HeaderDetails": "Részletek",
"HeaderDownloads": "Letöltések",
"HeaderEbookFiles": "E-könyv fájlok",
"HeaderEpisodes": "Epizódok",
"HeaderEreaderSettings": "E-olvasó beállításai",
"HeaderLatestEpisodes": "Legújabb epizódok",
"HeaderLibraries": "Könyvtárak",
"HeaderLocalFolders": "Helyi mappák",
"HeaderLocalLibraryItems": "Helyi könyvtári elemek",
"HeaderNewPlaylist": "Új lejátszási lista",
"HeaderOpenRSSFeed": "RSS hírcsatorna megnyitása",
"HeaderPlaybackSettings": "Lejátszási beállítások",
"HeaderPlaylist": "Lejátszási lista",
"HeaderPlaylistItems": "Lejátszási lista elemek",
"HeaderRSSFeed": "RSS Hírcsatorna",
"HeaderRSSFeedGeneral": "RSS részletek",
"HeaderRSSFeedIsOpen": "RSS hírcsatorna nyitva van",
"HeaderSelectDownloadLocation": "Letöltési hely kiválasztása",
"HeaderSettings": "Beállítások",
"HeaderSleepTimer": "Alvásidőzítő",
"HeaderSleepTimerSettings": "Alvásidőzítő beállításai",
"HeaderStatsMinutesListeningChart": "Hallgatási grafikon percekben (az elmúlt 7 napból)",
"HeaderStatsRecentSessions": "Legutóbbi munkamenetek",
"HeaderTableOfContents": "Tartalomjegyzék",
"HeaderUserInterfaceSettings": "Felhasználói felület beállításai",
"HeaderYourStats": "Saját statisztikák",
"LabelAdded": "Hozzáadva",
"LabelAddedAt": "Hozzáadva ekkor",
"LabelAddToPlaylist": "Hozzáadás a lejátszási listához",
"LabelAll": "Összes",
"LabelAllowSeekingOnMediaControls": "Pozíció keresés engedélyezése a média értesítési vezérlőkön",
"LabelAuthor": "Szerző",
"LabelAuthorFirstLast": "Szerző (Keresztnév Vezetéknév)",
"LabelAuthorLastFirst": "Szerző (Vezetéknév, Keresztnév)",
"LabelAuthors": "Szerző",
"LabelAutoDownloadEpisodes": "Epizódok automatikus letöltése",
"LabelAutoRewindTime": "Automatikus visszatekerési idő",
"LabelAutoSleepTimer": "Automatikus alvásidőzítő",
"LabelAutoSleepTimerAutoRewind": "Automatikus alvásidőzítő automatikus visszatekerése",
"LabelAutoSleepTimerAutoRewindHelp": "Amikor az automatikus alvásidőzítő befejeződik, az elem újrajátszásakor automatikusan visszatekeri a pozíciót.",
"LabelAutoSleepTimerHelp": "Amikor a megadott kezdési és befejezési idők között média lejátszása történik, egy alvásidőzítő automatikusan elindul.",
"LabelBooks": "Könyv",
"LabelChapters": "Fejezetek",
"LabelChapterTrack": "Fejezet sáv",
"LabelClosePlayer": "Lejátszó bezárása",
"LabelCollapseSeries": "Sorozatok összecsukása",
"LabelComplete": "Kész",
"LabelContinueBooks": "Könyvek folytatása",
"LabelContinueEpisodes": "Epizódok folytatása",
"LabelContinueListening": "Hallgatás folytatása",
"LabelContinueReading": "Olvasás folytatása",
"LabelContinueSeries": "Sorozat folytatása",
"LabelCustomTime": "Egyéni idő",
"LabelDescription": "Leírás",
"LabelDisableAudioFadeOut": "Hang fokozatos csendesítés letiltása",
"LabelDisableAudioFadeOutHelp": "Az audio hangerő csökkenése kezdődik, amikor kevesebb, mint 1 perc marad az alvásidőzítőből. Engedélyezze ezt a beállítást, hogy ne csendesedjen el fokozatosan a hang.",
"LabelDisableAutoRewind": "Automatikus visszatekerés letiltása",
"LabelDisableShakeToReset": "Rázás a visszaállításhoz letiltása",
"LabelDisableShakeToResetHelp": "Ha az időzítő futása alatt vagy az időzítő lejárta előtti 2 percben megrázza az eszközt, az alvásidőzítő visszaáll. Engedélyezze ezt a beállítást a rázásra történő visszaállítás letiltásához.",
"LabelDisableVibrateOnReset": "Rezgés kikapcsolása visszaállításkor",
"LabelDisableVibrateOnResetHelp": "Amikor az alvásidőzítő visszaállításra kerül, az eszköz rezegni fog. Engedélyezze ezt a beállítást, hogy ne rezegjen az alvásidőzítő visszaállításakor.",
"LabelDiscover": "Felfedezés",
"LabelDownload": "Letöltés",
"LabelDownloaded": "Letöltve",
"LabelDuration": "Időtartam",
"LabelEbook": "E-könyv",
"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.",
"LabelEnd": "Vége",
"LabelEndOfChapter": "Fejezet vége",
"LabelEndTime": "Befejezés ideje",
"LabelEpisode": "Epizód",
"LabelFeedURL": "Hírcsatorna URL",
"LabelFile": "Fájl",
"LabelFileBirthtime": "Fájl létrehozásának ideje",
"LabelFileModified": "Fájl módosítva",
"LabelFilename": "Fájlnév",
"LabelFinished": "Befejezve",
"LabelFolder": "Mappa",
"LabelFontScale": "Betűméret skála",
"LabelGenre": "Műfaj",
"LabelGenres": "Műfajok",
"LabelHapticFeedback": "Tapintás visszajelzés",
"LabelHasEbook": "Van e-könyv",
"LabelHasSupplementaryEbook": "Van kiegészítő e-könyv",
"LabelHeavy": "Nehéz",
"LabelHigh": "Magas",
"LabelHost": "Házigazda",
"LabelIncomplete": "Befejezetlen",
"LabelInProgress": "Folyamatban",
"LabelInternalAppStorage": "Belső alkalmazástároló",
"LabelJumpBackwardsTime": "Visszaugrás ideje",
"LabelJumpForwardsTime": "Előreugrás ideje",
"LabelLanguage": "Nyelv",
"LabelLayout": "Elrendezés",
"LabelLayoutAuto": "Automatikus",
"LabelLayoutSinglePage": "Egyoldalas",
"LabelLight": "Könnyű",
"LabelLineSpacing": "Sorköz",
"LabelListenAgain": "Újrahallgatás",
"LabelLocalBooks": "Helyi könyvek",
"LabelLocalPodcasts": "Helyi podcastok",
"LabelLockOrientation": "Tájolás zárolása",
"LabelLockPlayer": "Lejátszó zárolása",
"LabelLow": "Alacsony",
"LabelMediaType": "Média típus",
"LabelMedium": "Közepes",
"LabelMore": "Több",
"LabelMoreInfo": "Több információ",
"LabelName": "Név",
"LabelNarrator": "Előadó",
"LabelNarrators": "Előadók",
"LabelNewestAuthors": "Legújabb szerzők",
"LabelNewestEpisodes": "Legújabb epizódok",
"LabelNo": "Nem",
"LabelNotFinished": "Nem befejezett",
"LabelNotStarted": "Nem kezdődött el",
"LabelOff": "Ki",
"LabelPassword": "Jelszó",
"LabelPath": "Útvonal",
"LabelPlaybackDirect": "Közvetlen",
"LabelPlaybackLocal": "Helyi",
"LabelPlaybackSpeed": "Lejátszási sebesség",
"LabelPlaybackTranscode": "Átkódolás",
"LabelPodcast": "Podcast",
"LabelPodcasts": "Podcastok",
"LabelPreventIndexing": "Megakadályozza a hírcsatornájának indexelését az iTunes és a Google podcast könyvtárakban",
"LabelProgress": "Haladás",
"LabelPubDate": "Közzététel dátuma",
"LabelPublishYear": "Kiadás éve",
"LabelRead": "Olvasás",
"LabelReadAgain": "Újraolvasás",
"LabelRecentlyAdded": "Legutóbb hozzáadva",
"LabelRecentSeries": "Legutóbbi sorozatok",
"LabelRemoveFromPlaylist": "Remove from Playlist",
"LabelRSSFeedCustomOwnerEmail": "Egyéni tulajdonos e-mail",
"LabelRSSFeedCustomOwnerName": "Egyéni tulajdonos neve",
"LabelRSSFeedPreventIndexing": "Indexelés megakadályozása",
"LabelRSSFeedSlug": "RSS hírcsatorna rövid cím",
"LabelScaleElapsedTimeBySpeed": "Eltelt idő skálázása sebesség szerint",
"LabelSeason": "Évad",
"LabelSelectADevice": "Eszköz kiválasztása",
"LabelSeries": "Sorozat",
"LabelServerAddress": "Szerver címe",
"LabelSetEbookAsPrimary": "Beállítás elsődlegesként",
"LabelSetEbookAsSupplementary": "Beállítás kiegészítőként",
"LabelShakeSensitivity": "Rázás érzékenység",
"LabelShowAll": "Összes megjelenítése",
"LabelSize": "Méret",
"LabelSleepTimer": "Alvásidőzítő",
"LabelStart": "Kezdés",
"LabelStartTime": "Kezdési idő",
"LabelStatsBestDay": "Legjobb nap",
"LabelStatsDailyAverage": "Napi átlag",
"LabelStatsDays": "Napok",
"LabelStatsDaysListened": "Hallgatott napok",
"LabelStatsInARow": "egymás után",
"LabelStatsItemsFinished": "Befejezett elemek",
"LabelStatsMinutes": "perc",
"LabelStatsMinutesListening": "Hallgatás percekben",
"LabelStatsWeekListening": "Heti hallgatás",
"LabelTag": "Címke",
"LabelTags": "Címkék",
"LabelTheme": "Téma",
"LabelThemeDark": "Sötét",
"LabelThemeLight": "Világos",
"LabelTimeRemaining": "{0} maradt",
"LabelTitle": "Cím",
"LabelTotalTrack": "Összes szám",
"LabelTracks": "Számok",
"LabelType": "Típus",
"LabelUnlockPlayer": "Lejátszó feloldása",
"LabelUseBookshelfView": "Polcnézet használata",
"LabelUser": "Felhasználó",
"LabelUsername": "Felhasználónév",
"LabelVeryHigh": "Nagyon magas",
"LabelVeryLow": "Nagyon alacsony",
"LabelYourBookmarks": "Könyvjelzőid",
"LabelYourProgress": "Haladásod",
"MessageAndroid10Downloads": "Az Android 10 és az alatti verziók belső alkalmazástárolót használnak a letöltésekhez.",
"MessageAttemptingServerConnection": "Szerverkapcsolat kísérlete...",
"MessageAudiobookshelfServerNotConnected": "Az Audiobookshelf szerver nem csatlakozik",
"MessageAudiobookshelfServerRequired": "<strong>Fontos!</strong> Ez az alkalmazás egy Audiobookshelf szervert igényel, amit Ön vagy valaki, akit ismer, üzemeltet. Ez az alkalmazás nem biztosít tartalmat.",
"MessageBookshelfEmpty": "A könyvespolc üres",
"MessageConfirmDeleteLocalEpisode": "\"{0}\" helyi epizód eltávolítása az eszközről? A szerveren lévő fájl nem érintett.",
"MessageConfirmDeleteLocalFiles": "Ezen elem helyi fájljainak eltávolítása az eszközről? A szerveren lévő fájlok és a haladás nem érintettek.",
"MessageConfirmDiscardProgress": "Biztosan alaphelyzetbe akarja állítani a haladást?",
"MessageConfirmMarkAsFinished": "Biztosan befejezettnek jelöli ezt az elemet?",
"MessageConfirmRemoveBookmark": "Biztosan eltávolítja a könyvjelzőt?",
"MessageDiscardProgress": "Haladás elvetése",
"MessageDownloadCompleteProcessing": "Letöltés kész. Feldolgozás...",
"MessageDownloading": "Letöltés...",
"MessageDownloadingEpisode": "Epizód letöltése",
"MessageEpisodesQueuedForDownload": "{0} epizód letöltésre vár",
"MessageFeedURLWillBe": "A hírcsatorna URL-je lesz: {0}",
"MessageFetching": "Lekérdezés...",
"MessageFollowTheProjectOnGithub": "Kövesse a projektet a Githubon",
"MessageItemDownloadCompleteFailedToCreate": "A könyv letöltése befejeződött, de nem sikerült létrehozni a könyvtári elemet",
"MessageLoading": "Betöltés...",
"MessageLoadingServerData": "Szerveradatok betöltése...",
"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.",
"MessageMediaLinkedToServer": "Szerverhez kapcsolt {0}",
"MessageMediaLinkedToThisServer": "A letöltött média ehhez a szerverhez kapcsolódik",
"MessageMediaNotLinkedToServer": "A média nem kapcsolódik egy Audiobookshelf szerverhez. Nem lesz szinkronizálva a haladás.",
"MessageNoBookmarks": "Nincsenek könyvjelzők",
"MessageNoChapters": "Nincsenek fejezetek",
"MessageNoItems": "Nincsenek elemek",
"MessageNoItemsFound": "Nincs találat",
"MessageNoListeningSessions": "Nincsenek hallgatási munkamenetek",
"MessageNoMediaFolders": "Nincsenek médiamappák",
"MessageNoNetworkConnection": "Nincs hálózati kapcsolat",
"MessageNoPodcastsFound": "Nem találhatók podcastok",
"MessageNoUpdatesWereNecessary": "Nem volt szükséges frissítés",
"MessageNoUserPlaylists": "Nincsenek lejátszási listái",
"MessageReportBugsAndContribute": "Hibák jelentése, funkciók kérése és hozzájárulás a",
"MessageSocketConnectedOverMeteredCellular": "Csatlakoztatva mért mobilhálózaton keresztül",
"MessageSocketConnectedOverMeteredWifi": "Csatlakoztatva mért Wi-Fi hálózaton keresztül",
"MessageSocketConnectedOverUnmeteredCellular": "Csatlakoztatva korlátlan mobilhálózaton keresztül",
"MessageSocketConnectedOverUnmeteredWifi": "Csatlakoztatva korlátlan Wi-Fi hálózaton keresztül",
"MessageSocketNotConnected": "A socket nincs csatlakoztatva",
"NoteRSSFeedPodcastAppsHttps": "Figyelmeztetés: A legtöbb podcast alkalmazás megköveteli, hogy az RSS hírcsatorna URL-je HTTPS-t használjon",
"NoteRSSFeedPodcastAppsPubDate": "Figyelmeztetés: Egy vagy több epizódnak nincs közzétételi dátuma. Néhány podcast alkalmazás ezt megköveteli.",
"ToastBookmarkCreateFailed": "A könyvjelző létrehozása sikertelen",
"ToastBookmarkRemoveFailed": "A könyvjelző eltávolítása sikertelen",
"ToastBookmarkUpdateFailed": "A könyvjelző frissítése sikertelen",
"ToastItemMarkedAsFinishedFailed": "Az elem befejezettnek jelölése sikertelen",
"ToastItemMarkedAsNotFinishedFailed": "Az elem befejezetlennek jelölése sikertelen",
"ToastPlaylistCreateFailed": "A lejátszási lista létrehozása sikertelen",
"ToastPodcastCreateFailed": "A podcast létrehozása sikertelen",
"ToastPodcastCreateSuccess": "A podcast sikeresen létrehozva",
"ToastRSSFeedCloseFailed": "Az RSS hírcsatorna bezárása sikertelen",
"ToastRSSFeedCloseSuccess": "Az RSS hírcsatorna sikeresen bezárva"
}
+114 -111
View File
@@ -2,7 +2,7 @@
"ButtonAdd": "Aggiungi",
"ButtonAddNewServer": "Aggiungi Nuovo Server",
"ButtonAuthors": "Autori",
"ButtonBack": "Back",
"ButtonBack": "Indietro",
"ButtonCancel": "Cancella",
"ButtonCancelTimer": "Cancella Timer",
"ButtonClearFilter": "Elimina Filtri",
@@ -15,38 +15,38 @@
"ButtonCreateNewPlaylist": "Crea Nuova Playlist",
"ButtonDelete": "Elimina",
"ButtonDeleteLocalEpisode": "Cancella episodio locale",
"ButtonDeleteLocalFile": "Delete local file",
"ButtonDeleteLocalItem": "Delete local item",
"ButtonDisableAutoTimer": "Disable Auto Timer",
"ButtonDisconnect": "Disconnect",
"ButtonHistory": "History",
"ButtonDeleteLocalFile": "Elimina File locale",
"ButtonDeleteLocalItem": "Elimina oggetto locale",
"ButtonDisableAutoTimer": "Disattiva Auto Timer",
"ButtonDisconnect": "Disconnetti",
"ButtonHistory": "Cronologia",
"ButtonHome": "Home",
"ButtonIssues": "Errori",
"ButtonLatest": "Ultimi",
"ButtonLibrary": "Libreria",
"ButtonLocalMedia": "Local Media",
"ButtonManageLocalFiles": "Manage Local Files",
"ButtonNewFolder": "New Folder",
"ButtonNextEpisode": "Next Episode",
"ButtonLocalMedia": "Media Locali",
"ButtonManageLocalFiles": "Gestisci file Locali",
"ButtonNewFolder": "Nuova Cartella",
"ButtonNextEpisode": "Prossimo Episodio",
"ButtonOpenFeed": "Apri Feed",
"ButtonOverride": "Override",
"ButtonPause": "Pause",
"ButtonOverride": "Oltrepassa",
"ButtonPause": "Pausa",
"ButtonPlay": "Play",
"ButtonPlaying": "In Riproduzione",
"ButtonPlaylists": "Playlists",
"ButtonRead": "Leggi",
"ButtonRemove": "Rimuovi",
"ButtonRemoveFromServer": "Remove from Server",
"ButtonRemoveFromServer": "Rimuovi dal server",
"ButtonSave": "Salva",
"ButtonSaveOrder": "Save Order",
"ButtonSaveOrder": "Salva Ordine",
"ButtonSearch": "Cerca",
"ButtonSendEbookToDevice": "Send Ebook to Device",
"ButtonSendEbookToDevice": "Invia Ebook al Device",
"ButtonSeries": "Serie",
"ButtonSetTimer": "Set Timer",
"ButtonSetTimer": "Imposta Timer",
"ButtonStream": "Stream",
"ButtonSubmit": "Invia",
"ButtonSwitchServerUser": "Switch Server/User",
"ButtonUserStats": "User Stats",
"ButtonSwitchServerUser": "Cambia Server/Utente",
"ButtonUserStats": "Statistiche Utente",
"ButtonYes": "Si",
"HeaderAccount": "Account",
"HeaderAdvanced": "Avanzate",
@@ -54,7 +54,7 @@
"HeaderChapters": "Capitoli",
"HeaderCollection": "Raccolta",
"HeaderCollectionItems": "Elementi della Raccolta",
"HeaderConnectionStatus": "Connection Status",
"HeaderConnectionStatus": "Stato Connessione",
"HeaderDetails": "Dettagli",
"HeaderDownloads": "Downloads",
"HeaderEbookFiles": "Ebook File",
@@ -62,71 +62,72 @@
"HeaderEreaderSettings": "Impostazioni Ereader",
"HeaderLatestEpisodes": "Ultimi Episodi",
"HeaderLibraries": "Librerie",
"HeaderLocalFolders": "Local Folders",
"HeaderLocalLibraryItems": "Local Library Items",
"HeaderNewPlaylist": "New Playlist",
"HeaderLocalFolders": "Cartelle Locali",
"HeaderLocalLibraryItems": "Oggetti Libreria Locale",
"HeaderNewPlaylist": "Nuova Playlist",
"HeaderOpenRSSFeed": "Apri RSS Feed",
"HeaderPlaybackSettings": "Playback Settings",
"HeaderPlaybackSettings": "Impostazioni Playback",
"HeaderPlaylist": "Playlist",
"HeaderPlaylistItems": "Elementi della playlist",
"HeaderRSSFeed": "RSS Feed",
"HeaderRSSFeedGeneral": "RSS Details",
"HeaderRSSFeedGeneral": "RSS Dettagli",
"HeaderRSSFeedIsOpen": "RSS Feed è aperto",
"HeaderSelectDownloadLocation": "Select Download Location",
"HeaderSelectDownloadLocation": "Selezione Posizione Download",
"HeaderSettings": "Impostazioni",
"HeaderSleepTimer": "Sveglia",
"HeaderSleepTimerSettings": "Sleep Timer Settings",
"HeaderSleepTimerSettings": "Impostazione tempo Sleep",
"HeaderStatsMinutesListeningChart": "Minuti ascoltati (Ultimi 7 Giorni)",
"HeaderStatsRecentSessions": "Sessioni Recenti",
"HeaderTableOfContents": "Tabella dei Contenuti",
"HeaderUserInterfaceSettings": "User Interface Settings",
"HeaderUserInterfaceSettings": "Impostazioni Interfaccia Utente",
"HeaderYourStats": "Statistiche Personali",
"LabelAdded": "Aggiunto",
"LabelAddedAt": "Aggiunto il",
"LabelAddToPlaylist": "aggiungi alla Playlist",
"LabelAll": "Tutti",
"LabelAllowSeekingOnMediaControls": "Allow position seeking on media notification controls",
"LabelAuthor": "Autore",
"LabelAuthorFirstLast": "Autore (Per Nome)",
"LabelAuthorLastFirst": "Autori (Per Cognome)",
"LabelAuthors": "Autori",
"LabelAutoDownloadEpisodes": "Auto Download Episodi",
"LabelAutoRewindTime": "Auto rewind time",
"LabelAutoSleepTimer": "Auto sleep timer",
"LabelAutoSleepTimerAutoRewind": "Auto sleep timer auto rewind",
"LabelAutoSleepTimerAutoRewindHelp": "When the auto sleep timer finishes, playing the item again will automatically rewind your position.",
"LabelAutoSleepTimerHelp": "When playing media between the specified start and end times a sleep timer will automatically start.",
"LabelAutoRewindTime": "Auto Riavvolgimento",
"LabelAutoSleepTimer": "Auto Ibernazione",
"LabelAutoSleepTimerAutoRewind": "Auto Ibernazione e riavvolgimento",
"LabelAutoSleepTimerAutoRewindHelp": "Al termine del timer di spegnimento automatico, la riproduzione dell'elemento riavvolgerà automaticamente la tua posizione.",
"LabelAutoSleepTimerHelp": "Durante la riproduzione di contenuti multimediali tra l'ora di inizio e quella di fine specificate, verrà avviato automaticamente un timer di spegnimento.",
"LabelBooks": "Libri",
"LabelChapters": "Capitoli",
"LabelChapterTrack": "Chapter Track",
"LabelChapterTrack": "Traccia Capitolo",
"LabelClosePlayer": "Chiudi player",
"LabelCollapseSeries": "Comprimi Serie",
"LabelComplete": "Completo",
"LabelContinueBooks": "Continue Books",
"LabelContinueEpisodes": "Continue Episodes",
"LabelContinueListening": "Continue Listening",
"LabelContinueReading": "Continue Reading",
"LabelContinueSeries": "Continue Series",
"LabelCustomTime": "Custom time",
"LabelContinueBooks": "Continua Libri",
"LabelContinueEpisodes": "Continua Episodi",
"LabelContinueListening": "Continua Ascolto",
"LabelContinueReading": "Continua Lettura",
"LabelContinueSeries": "Continua Serie",
"LabelCustomTime": "Personalizza tempo",
"LabelDescription": "Descrizione",
"LabelDisableAudioFadeOut": "Disable audio fade out",
"LabelDisableAudioFadeOutHelp": "Audio volume will start decreasing when there is less than 1 minute remaining on the sleep timer. Enable this setting to not fade out.",
"LabelDisableAutoRewind": "Disable auto rewind",
"LabelDisableShakeToReset": "Disable shake to reset",
"LabelDisableShakeToResetHelp": "Shaking your device while the timer is running OR within 2 minutes of the timer expiring will reset the sleep timer. Enable this setting to disable shake to reset.",
"LabelDisableVibrateOnReset": "Disable vibrate on reset",
"LabelDisableVibrateOnResetHelp": "When the sleep timer gets reset your device will vibrate. Enable this setting to not vibrate when the sleep timer resets.",
"LabelDiscover": "Discover",
"LabelDisableAudioFadeOut": "Disabilita audio fade out",
"LabelDisableAudioFadeOutHelp": "Il volume dell'audio inizierà a diminuire quando rimane meno di 1 minuto sul timer di spegnimento. Abilita questa impostazione per non diminuirlo.",
"LabelDisableAutoRewind": "Disabilita auto riavvolgimento",
"LabelDisableShakeToReset": "Disabilita shake to reset",
"LabelDisableShakeToResetHelp": "Scuotendo il dispositivo mentre il timer è in esecuzione O entro 2 minuti dalla scadenza del timer si ripristinerà il timer di spegnimento. Abilita questa impostazione per disabilitare lo scuotimento per ripristinare.",
"LabelDisableVibrateOnReset": "Disabilita vibrazione reset",
"LabelDisableVibrateOnResetHelp": "Quando il timer di spegnimento viene reimpostato, il dispositivo vibrerà. Abilita questa impostazione per non vibrare quando il timer di spegnimento viene reimpostato.",
"LabelDiscover": "Scopri",
"LabelDownload": "Download",
"LabelDownloaded": "Downloaded",
"LabelDownloaded": "Scaricati",
"LabelDuration": "Durata",
"LabelEbook": "Ebook",
"LabelEbooks": "Ebooks",
"LabelEnable": "Abilita",
"LabelEnableMp3IndexSeeking": "Enable mp3 index seeking",
"LabelEnableMp3IndexSeekingHelp": "This setting should only be enabled if you have mp3 files that are not seeking correctly. Inaccurate seeking is most likely due to Variable birate (VBR) MP3 files. This setting will force index seeking, in which a time-to-byte mapping is built as the file is read. In some cases with large MP3 files there will be a delay when seeking towards the end of the file.",
"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.",
"LabelEnd": "Fine",
"LabelEndOfChapter": "End of Chapter",
"LabelEndTime": "End time",
"LabelEndOfChapter": "End del capitolo",
"LabelEndTime": "Tempo alla fine",
"LabelEpisode": "Episodio",
"LabelFeedURL": "Feed URL",
"LabelFile": "File",
@@ -138,48 +139,48 @@
"LabelFontScale": "Dimensione Font",
"LabelGenre": "Genere",
"LabelGenres": "Generi",
"LabelHapticFeedback": "Haptic feedback",
"LabelHasEbook": "Has ebook",
"LabelHasSupplementaryEbook": "Has supplementary ebook",
"LabelHapticFeedback": "Feedback tattile",
"LabelHasEbook": "Ha l'ebook",
"LabelHasSupplementaryEbook": "Ha un ebook supplementale",
"LabelHeavy": "Heavy",
"LabelHigh": "High",
"LabelHigh": "Alto",
"LabelHost": "Host",
"LabelIncomplete": "Incompleta",
"LabelInProgress": "In Corso",
"LabelInternalAppStorage": "Internal App Storage",
"LabelJumpBackwardsTime": "Jump backwards time",
"LabelJumpForwardsTime": "Jump forwards time",
"LabelInternalAppStorage": "Archiviazione interna delle app",
"LabelJumpBackwardsTime": "Vai indietro nel tempo",
"LabelJumpForwardsTime": "Vai avanti nel tempo",
"LabelLanguage": "Lingua",
"LabelLayout": "Layout",
"LabelLayoutAuto": "Auto",
"LabelLayoutSinglePage": "Single page",
"LabelLayoutSinglePage": "Pagina singola",
"LabelLight": "Light",
"LabelLineSpacing": "Interlinea",
"LabelListenAgain": "Listen Again",
"LabelLocalBooks": "Local Books",
"LabelLocalPodcasts": "Local Podcasts",
"LabelLockOrientation": "Lock orientation",
"LabelLockPlayer": "Lock Player",
"LabelLow": "Low",
"LabelListenAgain": "Ascolta ancora",
"LabelLocalBooks": "Libri Locali",
"LabelLocalPodcasts": "Podcasts Locali",
"LabelLockOrientation": "Blocca orientamento",
"LabelLockPlayer": "Blocca Player",
"LabelLow": "Basso",
"LabelMediaType": "Tipo Media",
"LabelMedium": "Medium",
"LabelMedium": "Medio",
"LabelMore": "Molto",
"LabelMoreInfo": "Più Info",
"LabelName": "Nome",
"LabelNarrator": "Narratore",
"LabelNarrators": "Narratori",
"LabelNewestAuthors": "Newest Authors",
"LabelNewestEpisodes": "Newest Episodes",
"LabelNewestAuthors": "Nuovi Autori",
"LabelNewestEpisodes": "Nuovi Episodi",
"LabelNo": "No",
"LabelNotFinished": "Da Completare",
"LabelNotStarted": "Non iniziato",
"LabelOff": "Off",
"LabelPassword": "Password",
"LabelPath": "Percorso",
"LabelPlaybackDirect": "Direct",
"LabelPlaybackDirect": "Diretto",
"LabelPlaybackLocal": "Local",
"LabelPlaybackSpeed": "Playback Speed",
"LabelPlaybackTranscode": "Transcode",
"LabelPlaybackSpeed": "Velocità Playback",
"LabelPlaybackTranscode": "Transcodifica",
"LabelPodcast": "Podcast",
"LabelPodcasts": "Podcasts",
"LabelPreventIndexing": "Impedisci che il tuo feed venga indicizzato da iTunes e dalle directory dei podcast di Google",
@@ -187,20 +188,22 @@
"LabelPubDate": "Data Pubblicazione",
"LabelPublishYear": "Anno Pubblicazione",
"LabelRead": "Leggi",
"LabelReadAgain": "Read Again",
"LabelRecentlyAdded": "Recently Added",
"LabelRecentSeries": "Recent Series",
"LabelReadAgain": "Leggi Ancora",
"LabelRecentlyAdded": "Aggiunti Recentemente",
"LabelRecentSeries": "Serie Recenti",
"LabelRemoveFromPlaylist": "Remove from Playlist",
"LabelRSSFeedCustomOwnerEmail": "Email del proprietario personalizzato",
"LabelRSSFeedCustomOwnerName": "Nome del proprietario personalizzato",
"LabelRSSFeedPreventIndexing": "Impedisci l'indicizzazione",
"LabelRSSFeedSlug": "RSS Feed Slug",
"LabelScaleElapsedTimeBySpeed": "Scala il tempo trascorso in base alla velocità",
"LabelSeason": "Stagione",
"LabelSelectADevice": "Select a device",
"LabelSelectADevice": "Seletiona dispositivo",
"LabelSeries": "Serie",
"LabelServerAddress": "Server address",
"LabelSetEbookAsPrimary": "Immposta come Primario",
"LabelServerAddress": "Indiritto Server",
"LabelSetEbookAsPrimary": "Imposta come Primario",
"LabelSetEbookAsSupplementary": "Imposta come Suplementare",
"LabelShakeSensitivity": "Shake sensitivity",
"LabelShakeSensitivity": "Sensibilita Shake",
"LabelShowAll": "Mostra Tutto",
"LabelSize": "Dimensione",
"LabelSleepTimer": "Sleep timer",
@@ -222,60 +225,60 @@
"LabelThemeLight": "Chiaro",
"LabelTimeRemaining": "{0} rimanente",
"LabelTitle": "Titolo",
"LabelTotalTrack": "Total Track",
"LabelTotalTrack": "Traccia Totale",
"LabelTracks": "Traccia",
"LabelType": "Tipo",
"LabelUnlockPlayer": "Unlock Player",
"LabelUseBookshelfView": "Use bookshelf view",
"LabelUnlockPlayer": "Sblocca Player",
"LabelUseBookshelfView": "Usa visualizzazione libreria",
"LabelUser": "Utente",
"LabelUsername": "Username",
"LabelVeryHigh": "Very High",
"LabelVeryLow": "Very Low",
"LabelVeryHigh": "Molto Alto",
"LabelVeryLow": "Molto Basso",
"LabelYourBookmarks": "I tuoi Preferiti",
"LabelYourProgress": "Completato al",
"MessageAndroid10Downloads": "Android 10 and below will use internal app storage for downloads.",
"MessageAttemptingServerConnection": "Attempting server connection...",
"MessageAudiobookshelfServerNotConnected": "Audiobookshelf server not connected",
"MessageAudiobookshelfServerRequired": "<strong>Important!</strong> This app is designed to work with an Audiobookshelf server that you or someone you know is hosting. This app does not provide any content.",
"MessageBookshelfEmpty": "Bookshelf empty",
"MessageConfirmDeleteLocalEpisode": "Remove local episode \"{0}\" from your device? The file on the server will be unaffected.",
"MessageConfirmDeleteLocalFiles": "Remove local files of this item from your device? The files on the server and your progress will be unaffected.",
"MessageConfirmDiscardProgress": "Are you sure you want to reset your progress?",
"MessageConfirmMarkAsFinished": "Are you sure you want to mark this item as finished?",
"MessageConfirmRemoveBookmark": "Are you sure you want to remove bookmark?",
"MessageDiscardProgress": "Discard Progress",
"MessageDownloadCompleteProcessing": "Download complete. Processing...",
"MessageAndroid10Downloads": "Android 10 e versioni precedenti utilizzeranno la memoria interna dell'app per i download.",
"MessageAttemptingServerConnection": "Tentativo di connessione al server...",
"MessageAudiobookshelfServerNotConnected": "Audiobookshelf server non connesso",
"MessageAudiobookshelfServerRequired": "<strong>Importante!</strong> Questa app è progettata per funzionare con un server Audiobookshelf ospitato da te o da qualcuno che conosci. Questa app non fornisce alcun contenuto.",
"MessageBookshelfEmpty": "Bookshelf vuoto",
"MessageConfirmDeleteLocalEpisode": "Rimuovi episodi locali \"{0}\" dal tuo dispositivo? i file sul server non verranno toccati.",
"MessageConfirmDeleteLocalFiles": "Remove i file locali dell'oggetto? i file sul server e i progressi non verranno toccati.",
"MessageConfirmDiscardProgress": "Sei sicuro di voler resettare i tuoi progressi?",
"MessageConfirmMarkAsFinished": "Sei sicuro di voler contrassegnare questo elemento come finito?",
"MessageConfirmRemoveBookmark": "Sei sicuro di voler rimuovere il segnalibro?",
"MessageDiscardProgress": "Elimina Progressi",
"MessageDownloadCompleteProcessing": "Download completato. Elaboratione...",
"MessageDownloading": "Downloading...",
"MessageDownloadingEpisode": "Download episodio in corso",
"MessageEpisodesQueuedForDownload": "{0} Episodio(i) in coda per il Download",
"MessageFeedURLWillBe": "Feed URL Saranno {0}",
"MessageFetching": "Recupero Info...",
"MessageFollowTheProjectOnGithub": "Follow the project on Github",
"MessageItemDownloadCompleteFailedToCreate": "Item download complete but failed to create library item",
"MessageFollowTheProjectOnGithub": "Segui il progetto su Github",
"MessageItemDownloadCompleteFailedToCreate": "Download dell'elemento completato ma impossibile creare l'elemento della libreria",
"MessageLoading": "Caricamento...",
"MessageLoadingServerData": "Loading server data...",
"MessageLoadingServerData": "Caricamento dati dal server...",
"MessageMarkAsFinished": "Segna come finito",
"MessageMediaLinkedToADifferentServer": "Media is linked to an Audiobookshelf server on a different address ({0}). Progress will be synced when connected to this server address.",
"MessageMediaLinkedToADifferentUser": "Media is linked to this server but was downloaded by a different user. Progress will only be synced to the user that downloaded it.",
"MessageMediaLinkedToServer": "Linked to server {0}",
"MessageMediaLinkedToThisServer": "Downloaded media is linked to this server",
"MessageMediaNotLinkedToServer": "Media is not linked to an Audiobookshelf server. No progress will be synced.",
"MessageMediaLinkedToADifferentServer": "Il supporto è collegato a un server Audiobookshelf su un indirizzo diverso ({0}). I progressi verranno sincronizzati quando ci si connette a questo indirizzo del server.",
"MessageMediaLinkedToADifferentUser": "Il contenuto multimediale è collegato a questo server ma è stato scaricato da un utente diverso. I progressi verranno sincronizzati solo con l'utente che lo ha scaricato.",
"MessageMediaLinkedToServer": "Collegato al server {0}",
"MessageMediaLinkedToThisServer": "Il supporto scaricato è collegato a questo server",
"MessageMediaNotLinkedToServer": "I contenuti multimediali non sono collegati a un server Audiobookshelf. Nessun progresso verrà sincronizzato.",
"MessageNoBookmarks": "Nessun Preferito",
"MessageNoChapters": "Nessun Capitolo",
"MessageNoItems": "Nessun Oggetto",
"MessageNoItemsFound": "Nessun Oggetto trovato",
"MessageNoListeningSessions": "Nessuna sessione di ascolto",
"MessageNoMediaFolders": "No Media Folders",
"MessageNoNetworkConnection": "No network connection",
"MessageNoMediaFolders": "Nessuna Cartella Media",
"MessageNoNetworkConnection": "Nessuna connessione di rete",
"MessageNoPodcastsFound": "Nessun podcasts trovato",
"MessageNoUpdatesWereNecessary": "Nessun aggiornamento necessario",
"MessageNoUserPlaylists": "non hai nessuna Playlist",
"MessageReportBugsAndContribute": "Segnala bug, richiedi funzionalità e contribuisci",
"MessageSocketConnectedOverMeteredCellular": "Socket connected over metered cellular",
"MessageSocketConnectedOverMeteredWifi": "Socket connected over metered wifi",
"MessageSocketConnectedOverUnmeteredCellular": "Socket connected over unmetered cellular",
"MessageSocketConnectedOverUnmeteredWifi": "Socket connected over unmetered wifi",
"MessageSocketNotConnected": "Socket not connected",
"MessageSocketConnectedOverMeteredCellular": "Collegato tramite Rete cellulare a consumo",
"MessageSocketConnectedOverMeteredWifi": "Collegato tramite rete wifi a consumo",
"MessageSocketConnectedOverUnmeteredCellular": "Collegato tramite Rete cellularer",
"MessageSocketConnectedOverUnmeteredWifi": "Collegato tramite rete wif",
"MessageSocketNotConnected": "Non connesso",
"NoteRSSFeedPodcastAppsHttps": "Avviso: la maggior parte delle app di podcast richiede che l'URL del feed RSS utilizzi HTTPS",
"NoteRSSFeedPodcastAppsPubDate": "Avviso: 1 o più delle tue puntate non hanno una data di pubblicazione. Alcune app di podcast lo richiedono.",
"ToastBookmarkCreateFailed": "Creazione segnalibro fallita",
+3
View File
@@ -85,6 +85,7 @@
"LabelAddedAt": "Pridėta {0}",
"LabelAddToPlaylist": "Pridėti į grojaraštį",
"LabelAll": "Visi",
"LabelAllowSeekingOnMediaControls": "Allow position seeking on media notification controls",
"LabelAuthor": "Autorius",
"LabelAuthorFirstLast": "Autorius (Vardas Pavardė)",
"LabelAuthorLastFirst": "Autorius (Pavardė, Vardas)",
@@ -190,10 +191,12 @@
"LabelReadAgain": "Read Again",
"LabelRecentlyAdded": "Recently Added",
"LabelRecentSeries": "Recent Series",
"LabelRemoveFromPlaylist": "Remove from Playlist",
"LabelRSSFeedCustomOwnerEmail": "Pasirinktinis savininko el. paštas",
"LabelRSSFeedCustomOwnerName": "Pasirinktinis savininko vardas",
"LabelRSSFeedPreventIndexing": "Neleisti indeksuoti",
"LabelRSSFeedSlug": "RSS srauto identifikatorius",
"LabelScaleElapsedTimeBySpeed": "Scale Elapsed Time by Speed",
"LabelSeason": "Sezonas",
"LabelSelectADevice": "Select a device",
"LabelSeries": "Serija",
+3
View File
@@ -85,6 +85,7 @@
"LabelAddedAt": "Toegevoegd op",
"LabelAddToPlaylist": "Toevoegen aan afspeellijst",
"LabelAll": "Alle",
"LabelAllowSeekingOnMediaControls": "Allow position seeking on media notification controls",
"LabelAuthor": "Auteur",
"LabelAuthorFirstLast": "Auteur (Voornaam Achternaam)",
"LabelAuthorLastFirst": "Auteur (Achternaam, Voornaam)",
@@ -190,10 +191,12 @@
"LabelReadAgain": "Read Again",
"LabelRecentlyAdded": "Recently Added",
"LabelRecentSeries": "Recent Series",
"LabelRemoveFromPlaylist": "Remove from Playlist",
"LabelRSSFeedCustomOwnerEmail": "Aangepast e-mailadres eigenaar",
"LabelRSSFeedCustomOwnerName": "Aangepaste naam eigenaar",
"LabelRSSFeedPreventIndexing": "Voorkom indexering",
"LabelRSSFeedSlug": "RSS-feed slug",
"LabelScaleElapsedTimeBySpeed": "Scale Elapsed Time by Speed",
"LabelSeason": "Seizoen",
"LabelSelectADevice": "Select a device",
"LabelSeries": "Serie",
+3
View File
@@ -85,6 +85,7 @@
"LabelAddedAt": "Dato lagt til ",
"LabelAddToPlaylist": "Legg til i spilleliste",
"LabelAll": "Alle",
"LabelAllowSeekingOnMediaControls": "Allow position seeking on media notification controls",
"LabelAuthor": "Forfatter",
"LabelAuthorFirstLast": "Forfatter (Fornavn Etternavn)",
"LabelAuthorLastFirst": "Forfatter (Etternavn Fornavn)",
@@ -190,10 +191,12 @@
"LabelReadAgain": "Read Again",
"LabelRecentlyAdded": "Recently Added",
"LabelRecentSeries": "Recent Series",
"LabelRemoveFromPlaylist": "Remove from Playlist",
"LabelRSSFeedCustomOwnerEmail": "Tilpasset eier Epost",
"LabelRSSFeedCustomOwnerName": "Tilpasset eier Navn",
"LabelRSSFeedPreventIndexing": "Forhindre indeksering",
"LabelRSSFeedSlug": "RSS Feed Slug",
"LabelScaleElapsedTimeBySpeed": "Scale Elapsed Time by Speed",
"LabelSeason": "Sesong",
"LabelSelectADevice": "Select a device",
"LabelSeries": "Serier",
+159 -156
View File
@@ -1,52 +1,52 @@
{
"ButtonAdd": "Dodaj",
"ButtonAddNewServer": "Add New Server",
"ButtonAddNewServer": "Dodaj nowy serwer",
"ButtonAuthors": "Autorzy",
"ButtonBack": "Back",
"ButtonBack": "Powrót",
"ButtonCancel": "Anuluj",
"ButtonCancelTimer": "Cancel Timer",
"ButtonCancelTimer": "Anuluj wyłącznik",
"ButtonClearFilter": "Wyczyść filtr",
"ButtonCloseFeed": "Zamknij kanał",
"ButtonCollections": "Kolekcje",
"ButtonConnect": "Connect",
"ButtonConnectToServer": "Connect to Server",
"ButtonConnect": "Połącz",
"ButtonConnectToServer": "Połącz z serwerem",
"ButtonCreate": "Utwórz",
"ButtonCreateBookmark": "Create Bookmark",
"ButtonCreateNewPlaylist": "Create New Playlist",
"ButtonCreateBookmark": "Utwórz zakładkę",
"ButtonCreateNewPlaylist": "Utwórz nową playlistę",
"ButtonDelete": "Usuń",
"ButtonDeleteLocalEpisode": "Delete local episode",
"ButtonDeleteLocalFile": "Delete local file",
"ButtonDeleteLocalItem": "Delete local item",
"ButtonDisableAutoTimer": "Disable Auto Timer",
"ButtonDisconnect": "Disconnect",
"ButtonHistory": "History",
"ButtonDeleteLocalEpisode": "Usuń lokalny odcinek",
"ButtonDeleteLocalFile": "Usuń lokalny plik",
"ButtonDeleteLocalItem": "Usuń lokalny element",
"ButtonDisableAutoTimer": "Wyłącz automatyczny wyłącznik",
"ButtonDisconnect": "Rozłącz",
"ButtonHistory": "Historia",
"ButtonHome": "Strona główna",
"ButtonIssues": "Błędy",
"ButtonLatest": "Aktualna wersja:",
"ButtonLibrary": "Biblioteka",
"ButtonLocalMedia": "Local Media",
"ButtonManageLocalFiles": "Manage Local Files",
"ButtonNewFolder": "New Folder",
"ButtonNextEpisode": "Next Episode",
"ButtonLocalMedia": "Media lokalne",
"ButtonManageLocalFiles": "Zarządzaj lokalnymi plikami",
"ButtonNewFolder": "Nowy folder",
"ButtonNextEpisode": "Następny odcinek",
"ButtonOpenFeed": "Otwórz feed",
"ButtonOverride": "Override",
"ButtonOverride": "Nadpisz",
"ButtonPause": "Pause",
"ButtonPlay": "Odtwarzaj",
"ButtonPlaying": "Odtwarzane",
"ButtonPlaylists": "Playlists",
"ButtonPlaylists": "Playlisty",
"ButtonRead": "Czytaj",
"ButtonRemove": "Usuń",
"ButtonRemoveFromServer": "Remove from Server",
"ButtonRemoveFromServer": "Usuń z serwera",
"ButtonSave": "Zapisz",
"ButtonSaveOrder": "Save Order",
"ButtonSaveOrder": "Zapisz kolejność",
"ButtonSearch": "Szukaj",
"ButtonSendEbookToDevice": "Send Ebook to Device",
"ButtonSendEbookToDevice": "Wyślij ebook do urządzenia",
"ButtonSeries": "Seria",
"ButtonSetTimer": "Set Timer",
"ButtonStream": "Stream",
"ButtonSetTimer": "Ustaw wyłącznik",
"ButtonStream": "Strumieniuj",
"ButtonSubmit": "Zaloguj",
"ButtonSwitchServerUser": "Switch Server/User",
"ButtonUserStats": "User Stats",
"ButtonSwitchServerUser": "Przełącz serwer/użytkownika",
"ButtonUserStats": "Statystyki użytkownika",
"ButtonYes": "Tak",
"HeaderAccount": "Konto",
"HeaderAdvanced": "Zaawansowane",
@@ -54,79 +54,80 @@
"HeaderChapters": "Rozdziały",
"HeaderCollection": "Kolekcja",
"HeaderCollectionItems": "Elementy kolekcji",
"HeaderConnectionStatus": "Connection Status",
"HeaderConnectionStatus": "Status połączenia",
"HeaderDetails": "Szczegóły",
"HeaderDownloads": "Downloads",
"HeaderEbookFiles": "Ebook Files",
"HeaderEpisodes": "Rozdziały",
"HeaderEreaderSettings": "Ereader Settings",
"HeaderDownloads": "Pobrane",
"HeaderEbookFiles": "Pliki ebook",
"HeaderEpisodes": "Odcinki",
"HeaderEreaderSettings": "Ustawienia Ereader",
"HeaderLatestEpisodes": "Najnowsze odcinki",
"HeaderLibraries": "Biblioteki",
"HeaderLocalFolders": "Local Folders",
"HeaderLocalLibraryItems": "Local Library Items",
"HeaderNewPlaylist": "New Playlist",
"HeaderLocalFolders": "Lokalne foldery",
"HeaderLocalLibraryItems": "Elementy biblioteki lokalnej",
"HeaderNewPlaylist": "Nowa playlista",
"HeaderOpenRSSFeed": "Utwórz kanał RSS",
"HeaderPlaybackSettings": "Playback Settings",
"HeaderPlaylist": "Playlist",
"HeaderPlaylistItems": "Playlist Items",
"HeaderRSSFeed": "RSS Feed",
"HeaderRSSFeedGeneral": "RSS Details",
"HeaderPlaybackSettings": "Ustawienia odtwarzania",
"HeaderPlaylist": "Playlista",
"HeaderPlaylistItems": "Elementy playlisty",
"HeaderRSSFeed": "Kanał RSS",
"HeaderRSSFeedGeneral": "Szczegóły RSS",
"HeaderRSSFeedIsOpen": "Kanał RSS jest otwarty",
"HeaderSelectDownloadLocation": "Select Download Location",
"HeaderSelectDownloadLocation": "Wybierz miejsce pobierania",
"HeaderSettings": "Ustawienia",
"HeaderSleepTimer": "Wyłącznik czasowy",
"HeaderSleepTimerSettings": "Sleep Timer Settings",
"HeaderSleepTimerSettings": "Ustawienia wyłącznika czasowego",
"HeaderStatsMinutesListeningChart": "Czas słuchania w minutach (ostatnie 7 dni)",
"HeaderStatsRecentSessions": "Ostatnie sesje",
"HeaderTableOfContents": "Table of Contents",
"HeaderUserInterfaceSettings": "User Interface Settings",
"HeaderTableOfContents": "Spis treści",
"HeaderUserInterfaceSettings": "Ustawienia inferfejsu użytkownika",
"HeaderYourStats": "Twoje statystyki",
"LabelAdded": "Added",
"LabelAddedAt": "Dodano",
"LabelAddToPlaylist": "Add to Playlist",
"LabelAll": "All",
"LabelAdded": "Dodano",
"LabelAddedAt": "Dodano w",
"LabelAddToPlaylist": "Dodaj do playlisty",
"LabelAll": "Wszystkie",
"LabelAllowSeekingOnMediaControls": "Allow position seeking on media notification controls",
"LabelAuthor": "Autor",
"LabelAuthorFirstLast": "Autor (Rosnąco)",
"LabelAuthorLastFirst": "Author (Malejąco)",
"LabelAuthors": "Autorzy",
"LabelAutoDownloadEpisodes": "Automatyczne pobieranie odcinków",
"LabelAutoRewindTime": "Auto rewind time",
"LabelAutoSleepTimer": "Auto sleep timer",
"LabelAutoSleepTimerAutoRewind": "Auto sleep timer auto rewind",
"LabelAutoSleepTimerAutoRewindHelp": "When the auto sleep timer finishes, playing the item again will automatically rewind your position.",
"LabelAutoSleepTimerHelp": "When playing media between the specified start and end times a sleep timer will automatically start.",
"LabelAutoRewindTime": "Automatyczne cofnięcie",
"LabelAutoSleepTimer": "Automatyczny wył. czasowy",
"LabelAutoSleepTimerAutoRewind": "Automatyczny wył.czasowy z cofnięciem",
"LabelAutoSleepTimerAutoRewindHelp": "Po zakończeniu automatycznego wyłącznika czasowego ponowne odtworzenie elementu spowoduje automatyczne przewinięcie pozycji do tyłu.",
"LabelAutoSleepTimerHelp": "Podczas odtwarzania multimediów między określonym czasem rozpoczęcia i zakończenia automatycznie uruchomi się wyłącznik czasowy.",
"LabelBooks": "Książki",
"LabelChapters": "Chapters",
"LabelChapterTrack": "Chapter Track",
"LabelChapters": "Rozdziały",
"LabelChapterTrack": "Postęp rozdziału",
"LabelClosePlayer": "Zamknij odtwarzacz",
"LabelCollapseSeries": "Podsumuj serię",
"LabelComplete": "Ukończone",
"LabelContinueBooks": "Continue Books",
"LabelContinueEpisodes": "Continue Episodes",
"LabelContinueListening": "Continue Listening",
"LabelContinueReading": "Continue Reading",
"LabelContinueSeries": "Continue Series",
"LabelCustomTime": "Custom time",
"LabelContinueBooks": "Kontynuuj książki",
"LabelContinueEpisodes": "Kontynuuj odcinki",
"LabelContinueListening": "Kontynuuj odtwarzanie",
"LabelContinueReading": "Kontynuuj czytanie",
"LabelContinueSeries": "Kontynuuj serię",
"LabelCustomTime": "Własny czas",
"LabelDescription": "Opis",
"LabelDisableAudioFadeOut": "Disable audio fade out",
"LabelDisableAudioFadeOutHelp": "Audio volume will start decreasing when there is less than 1 minute remaining on the sleep timer. Enable this setting to not fade out.",
"LabelDisableAutoRewind": "Disable auto rewind",
"LabelDisableShakeToReset": "Disable shake to reset",
"LabelDisableShakeToResetHelp": "Shaking your device while the timer is running OR within 2 minutes of the timer expiring will reset the sleep timer. Enable this setting to disable shake to reset.",
"LabelDisableVibrateOnReset": "Disable vibrate on reset",
"LabelDisableVibrateOnResetHelp": "When the sleep timer gets reset your device will vibrate. Enable this setting to not vibrate when the sleep timer resets.",
"LabelDiscover": "Discover",
"LabelDisableAudioFadeOut": "Wyłącz zanikanie dźwięku",
"LabelDisableAudioFadeOutHelp": "Głośność dźwięku zacznie się zmniejszać, gdy na wyłączniku czasowym pozostanie mniej niż 1 minuta. Włącz to ustawienie, jeśli nie chcesz korzystać z zanikania dźwięku.",
"LabelDisableAutoRewind": "Wyłącz automatyczne cofanie",
"LabelDisableShakeToReset": "Wyłącz potrząsanie, aby zresetować",
"LabelDisableShakeToResetHelp": "Potrząsanie urządzeniem podczas pracy minutnika LUB w ciągu 2 minut od jego wygaśnięcia spowoduje zresetowanie wyłącznika czasowego. Włącz to ustawienie, aby wyłączyć potrząsanie w celu zresetowania.",
"LabelDisableVibrateOnReset": "Wyłącz wibracje przy resetowaniu",
"LabelDisableVibrateOnResetHelp": "Gdy wyłącznik czasowy zostanie zresetowany, urządzenie zacznie wibrować. Włącz to ustawienie, aby nie wibrować po zresetowaniu wyłącznika czasowego.",
"LabelDiscover": "Odkrywaj",
"LabelDownload": "Pobierz",
"LabelDownloaded": "Downloaded",
"LabelDownloaded": "Pobrane",
"LabelDuration": "Czas trwania",
"LabelEbook": "Ebook",
"LabelEbooks": "Ebooks",
"LabelEbooks": "Ebooki",
"LabelEnable": "Włącz",
"LabelEnableMp3IndexSeeking": "Enable mp3 index seeking",
"LabelEnableMp3IndexSeekingHelp": "This setting should only be enabled if you have mp3 files that are not seeking correctly. Inaccurate seeking is most likely due to Variable birate (VBR) MP3 files. This setting will force index seeking, in which a time-to-byte mapping is built as the file is read. In some cases with large MP3 files there will be a delay when seeking towards the end of the file.",
"LabelEnableMp3IndexSeeking": "Włącz wyszukiwanie indeksu mp3",
"LabelEnableMp3IndexSeekingHelp": "To ustawienie powinno być włączone tylko wtedy, gdy masz pliki mp3, które nie są poprawnie wyszukiwane. Niedokładne wyszukiwanie jest najprawdopodobniej spowodowane plikami MP3 o zmiennym birate (VBR). To ustawienie wymusi wyszukiwanie indeksu, w którym mapowanie czasu do bajtu jest kompilowane podczas odczytywania pliku. W niektórych przypadkach w przypadku dużych plików MP3 wystąpi opóźnienie podczas wyszukiwania w kierunku końca pliku.",
"LabelEnd": "Zakończ",
"LabelEndOfChapter": "End of Chapter",
"LabelEndTime": "End time",
"LabelEndOfChapter": "Koniec rozdziału",
"LabelEndTime": "Koniec czasu",
"LabelEpisode": "Odcinek",
"LabelFeedURL": "URL kanału",
"LabelFile": "Plik",
@@ -135,72 +136,74 @@
"LabelFilename": "Nazwa pliku",
"LabelFinished": "Zakończone",
"LabelFolder": "Folder",
"LabelFontScale": "Font scale",
"LabelFontScale": "Rozmiar czcionki",
"LabelGenre": "Gatunek",
"LabelGenres": "Gatunki",
"LabelHapticFeedback": "Haptic feedback",
"LabelHasEbook": "Has ebook",
"LabelHasSupplementaryEbook": "Has supplementary ebook",
"LabelHeavy": "Heavy",
"LabelHigh": "High",
"LabelHost": "Host",
"LabelHapticFeedback": "Dotykowe sprzężenie zwrotne",
"LabelHasEbook": "Zawiera wersję ebook",
"LabelHasSupplementaryEbook": "Posiada dodatkowy ebook",
"LabelHeavy": "Ciężko",
"LabelHigh": "Wysoko",
"LabelHost": "Dostawca",
"LabelIncomplete": "Nieukończone",
"LabelInProgress": "W trakcie",
"LabelInternalAppStorage": "Internal App Storage",
"LabelJumpBackwardsTime": "Jump backwards time",
"LabelJumpForwardsTime": "Jump forwards time",
"LabelInProgress": "W toku",
"LabelInternalAppStorage": "Pamięć wewnętrzna aplikacji",
"LabelJumpBackwardsTime": "Przeskok wstecz",
"LabelJumpForwardsTime": "Przeskok w przód",
"LabelLanguage": "Język",
"LabelLayout": "Layout",
"LabelLayout": "Układ",
"LabelLayoutAuto": "Auto",
"LabelLayoutSinglePage": "Single page",
"LabelLight": "Light",
"LabelLineSpacing": "Line spacing",
"LabelListenAgain": "Listen Again",
"LabelLocalBooks": "Local Books",
"LabelLocalPodcasts": "Local Podcasts",
"LabelLockOrientation": "Lock orientation",
"LabelLockPlayer": "Lock Player",
"LabelLow": "Low",
"LabelLayoutSinglePage": "Pojedyncza strona",
"LabelLight": "Lekko",
"LabelLineSpacing": "Interlinia",
"LabelListenAgain": "Słuchaj ponownie",
"LabelLocalBooks": "Książki lokalne",
"LabelLocalPodcasts": "Podcasty lokalne",
"LabelLockOrientation": "Zablokuj orientację",
"LabelLockPlayer": "Zablokuj odtwarzacz",
"LabelLow": "Nisko",
"LabelMediaType": "Typ mediów",
"LabelMedium": "Medium",
"LabelMedium": "Średnio",
"LabelMore": "Więcej",
"LabelMoreInfo": "More Info",
"LabelMoreInfo": "Więcej informacji",
"LabelName": "Nazwa",
"LabelNarrator": "Narrator",
"LabelNarrators": "Lektorzy",
"LabelNewestAuthors": "Newest Authors",
"LabelNewestEpisodes": "Newest Episodes",
"LabelNewestAuthors": "Najnowsi autorzy",
"LabelNewestEpisodes": "Najnosze odcinki",
"LabelNo": "No",
"LabelNotFinished": "Nieukończone",
"LabelNotStarted": "Nie rozpoęczto",
"LabelOff": "Off",
"LabelNotStarted": "Nie rozpoczęto",
"LabelOff": "Wyłącz",
"LabelPassword": "Hasło",
"LabelPath": "Ścieżka",
"LabelPlaybackDirect": "Direct",
"LabelPlaybackLocal": "Local",
"LabelPlaybackSpeed": "Playback Speed",
"LabelPlaybackTranscode": "Transcode",
"LabelPlaybackDirect": "Bezpośrednio",
"LabelPlaybackLocal": "Lokalnie",
"LabelPlaybackSpeed": "Prędkość odtwarzania",
"LabelPlaybackTranscode": "Transkoduj",
"LabelPodcast": "Podcast",
"LabelPodcasts": "Podcasty",
"LabelPreventIndexing": "Prevent your feed from being indexed by iTunes and Google podcast directories",
"LabelPreventIndexing": "Zapobiegaj indeksowaniu kanału przez katalogi podcastów iTunes i Google",
"LabelProgress": "Postęp",
"LabelPubDate": "Data publikacji",
"LabelPublishYear": "Rok publikacji",
"LabelRead": "Read",
"LabelReadAgain": "Read Again",
"LabelRecentlyAdded": "Recently Added",
"LabelRecentSeries": "Recent Series",
"LabelRead": "Czytaj",
"LabelReadAgain": "Czytaj ponownie",
"LabelRecentlyAdded": "Ostatnio dodane",
"LabelRecentSeries": "Najnowsze serie",
"LabelRemoveFromPlaylist": "Remove from Playlist",
"LabelRSSFeedCustomOwnerEmail": "Custom owner Email",
"LabelRSSFeedCustomOwnerName": "Custom owner Name",
"LabelRSSFeedPreventIndexing": "Prevent Indexing",
"LabelRSSFeedPreventIndexing": "Zapobiegaj indeksowaniu",
"LabelRSSFeedSlug": "RSS Feed Slug",
"LabelScaleElapsedTimeBySpeed": "Skaluj czas, który upłynął według prędkości",
"LabelSeason": "Sezon",
"LabelSelectADevice": "Select a device",
"LabelSelectADevice": "Wybierz urządzenie",
"LabelSeries": "Serie",
"LabelServerAddress": "Server address",
"LabelSetEbookAsPrimary": "Set as primary",
"LabelSetEbookAsSupplementary": "Set as supplementary",
"LabelShakeSensitivity": "Shake sensitivity",
"LabelServerAddress": "Adres serwera",
"LabelSetEbookAsPrimary": "Ustaw jako podstawowy ebook",
"LabelSetEbookAsSupplementary": "Ustaw jako dodatkowy ebook",
"LabelShakeSensitivity": "Czułość potrząsania",
"LabelShowAll": "Pokaż wszystko",
"LabelSize": "Rozmiar",
"LabelSleepTimer": "Wyłącznik czasowy",
@@ -217,65 +220,65 @@
"LabelStatsWeekListening": "Tydzień odtwarzania",
"LabelTag": "Tag",
"LabelTags": "Tagi",
"LabelTheme": "Theme",
"LabelThemeDark": "Dark",
"LabelThemeLight": "Light",
"LabelTheme": "Motyw",
"LabelThemeDark": "Ciemny",
"LabelThemeLight": "Jasny",
"LabelTimeRemaining": "Pozostało {0}",
"LabelTitle": "Tytuł",
"LabelTotalTrack": "Total Track",
"LabelTracks": "Tracks",
"LabelTotalTrack": "Postęp całkowity",
"LabelTracks": "Postępy",
"LabelType": "Typ",
"LabelUnlockPlayer": "Unlock Player",
"LabelUseBookshelfView": "Use bookshelf view",
"LabelUnlockPlayer": "Odblokuj odtwarzacz",
"LabelUseBookshelfView": "Użyj widoku półki",
"LabelUser": "Użytkownik",
"LabelUsername": "Nazwa użytkownika",
"LabelVeryHigh": "Very High",
"LabelVeryLow": "Very Low",
"LabelVeryHigh": "Bardzo wysoko",
"LabelVeryLow": "Bardzo nisko",
"LabelYourBookmarks": "Twoje zakładki",
"LabelYourProgress": "Twój postęp",
"MessageAndroid10Downloads": "Android 10 and below will use internal app storage for downloads.",
"MessageAttemptingServerConnection": "Attempting server connection...",
"MessageAudiobookshelfServerNotConnected": "Audiobookshelf server not connected",
"MessageAudiobookshelfServerRequired": "<strong>Important!</strong> This app is designed to work with an Audiobookshelf server that you or someone you know is hosting. This app does not provide any content.",
"MessageBookshelfEmpty": "Bookshelf empty",
"MessageConfirmDeleteLocalEpisode": "Remove local episode \"{0}\" from your device? The file on the server will be unaffected.",
"MessageConfirmDeleteLocalFiles": "Remove local files of this item from your device? The files on the server and your progress will be unaffected.",
"MessageConfirmDiscardProgress": "Are you sure you want to reset your progress?",
"MessageConfirmMarkAsFinished": "Are you sure you want to mark this item as finished?",
"MessageConfirmRemoveBookmark": "Are you sure you want to remove bookmark?",
"MessageDiscardProgress": "Discard Progress",
"MessageDownloadCompleteProcessing": "Download complete. Processing...",
"MessageDownloading": "Downloading...",
"MessageAndroid10Downloads": "Android 10 i starsze będą używać wewnętrznej pamięci aplikacji do pobierania.",
"MessageAttemptingServerConnection": "Próba połączenia z serwerem...",
"MessageAudiobookshelfServerNotConnected": "Brak połączenia z serwerem Audiobookshelf",
"MessageAudiobookshelfServerRequired": "<strong>Important!</strong> Ta aplikacja jest przeznaczona do współpracy z serwerem Audiobookshelf, który dostarczasz Ty lub ktoś, kogo znasz. Ta aplikacja nie dostarcza żadnych treści..",
"MessageBookshelfEmpty": "Półka pusta",
"MessageConfirmDeleteLocalEpisode": "Usunąć lokalny odcinek \"{0}\" ze swojego urządzenia? Nie będzie to miało wpływu na plik na serwerze.",
"MessageConfirmDeleteLocalFiles": "Usunąć lokalne pliki tego elementu ze swojego urządzenia? Nie będzie to miało wpływu na pliki na serwerze i Twoje postępy.",
"MessageConfirmDiscardProgress": "Na pewno chcesz zresetować postęp?",
"MessageConfirmMarkAsFinished": "Na pewno chcesz oznaczyć ten element jako ukończony?",
"MessageConfirmRemoveBookmark": "Na pewno chcesz usunąć zakładkę?",
"MessageDiscardProgress": "Zresetuj postęp",
"MessageDownloadCompleteProcessing": "Pobieranie ukończone. Przetwarzanie...",
"MessageDownloading": "Pobieranie...",
"MessageDownloadingEpisode": "Pobieranie odcinka",
"MessageEpisodesQueuedForDownload": "{0} odcinki w kolejce do pobrania",
"MessageFeedURLWillBe": "URL kanału: {0}",
"MessageFetching": "Pobieranie...",
"MessageFollowTheProjectOnGithub": "Follow the project on Github",
"MessageItemDownloadCompleteFailedToCreate": "Item download complete but failed to create library item",
"MessageFollowTheProjectOnGithub": "Śledź projekt na Githubie",
"MessageItemDownloadCompleteFailedToCreate": "Pobieranie elementu zostało zakończone, ale nie udało się utworzyć elementu biblioteki",
"MessageLoading": "Ładowanie...",
"MessageLoadingServerData": "Loading server data...",
"MessageLoadingServerData": "Ładowanie danych serwera...",
"MessageMarkAsFinished": "Oznacz jako ukończone",
"MessageMediaLinkedToADifferentServer": "Media is linked to an Audiobookshelf server on a different address ({0}). Progress will be synced when connected to this server address.",
"MessageMediaLinkedToADifferentUser": "Media is linked to this server but was downloaded by a different user. Progress will only be synced to the user that downloaded it.",
"MessageMediaLinkedToServer": "Linked to server {0}",
"MessageMediaLinkedToThisServer": "Downloaded media is linked to this server",
"MessageMediaNotLinkedToServer": "Media is not linked to an Audiobookshelf server. No progress will be synced.",
"MessageMediaLinkedToADifferentServer": "Multimedia są połączone z serwerem Audiobookshelf pod innym adresem ({0}). Postęp zostanie zsynchronizowany po nawiązaniu połączenia z tym adresem serwera.",
"MessageMediaLinkedToADifferentUser": "Multimedia są połączone z tym serwerem, ale zostały pobrane przez innego użytkownika. Postęp zostanie zsynchronizowany tylko z użytkownikiem, który je pobrał.",
"MessageMediaLinkedToServer": "Połączone z serwerem {0}",
"MessageMediaLinkedToThisServer": "Pobrane multimedia są połączone z tym serwerem",
"MessageMediaNotLinkedToServer": "Multimedia nie są połączone z serwerem Audiobookshelf. Żaden postęp nie zostanie zsynchronizowany.",
"MessageNoBookmarks": "Brak zakładek",
"MessageNoChapters": "Brak rozdziałów",
"MessageNoItems": "Brak elementów",
"MessageNoItemsFound": "Nie znaleziono żadnych elemntów",
"MessageNoItemsFound": "Nie znaleziono żadnych elementów",
"MessageNoListeningSessions": "Brak sesji odtwarzania",
"MessageNoMediaFolders": "No Media Folders",
"MessageNoNetworkConnection": "No network connection",
"MessageNoMediaFolders": "Brak folderów z mediami",
"MessageNoNetworkConnection": "Brak połączenia sieciowego",
"MessageNoPodcastsFound": "Nie znaleziono podcastów",
"MessageNoUpdatesWereNecessary": "Brak aktualizacji",
"MessageNoUserPlaylists": "You have no playlists",
"MessageNoUserPlaylists": "Nie posiadasz playlist",
"MessageReportBugsAndContribute": "Zgłoś błędy, pomysły i pomóż rozwijać aplikację na",
"MessageSocketConnectedOverMeteredCellular": "Socket connected over metered cellular",
"MessageSocketConnectedOverMeteredWifi": "Socket connected over metered wifi",
"MessageSocketConnectedOverUnmeteredCellular": "Socket connected over unmetered cellular",
"MessageSocketConnectedOverUnmeteredWifi": "Socket connected over unmetered wifi",
"MessageSocketNotConnected": "Socket not connected",
"MessageSocketConnectedOverMeteredCellular": "Gniazdo podłączone przez sieć komórkową z limitem danych",
"MessageSocketConnectedOverMeteredWifi": "Gniazdo podłączone przez Wi-Fi z limitem danych",
"MessageSocketConnectedOverUnmeteredCellular": "Gniazdo podłączone przez sieć komórkową bez limitu danych",
"MessageSocketConnectedOverUnmeteredWifi": "Gniazdo podłączone przez Wi-Fi bez limitu danych",
"MessageSocketNotConnected": "Gniazdo nie jest podłączone",
"NoteRSSFeedPodcastAppsHttps": "Ostrzeżenie: Większość aplikacji do obsługi podcastów wymaga, aby adres URL kanału RSS korzystał z protokołu HTTPS.",
"NoteRSSFeedPodcastAppsPubDate": "Ostrzeżenie: 1 lub więcej odcinków nie ma daty publikacji. Niektóre aplikacje do słuchania podcastów tego wymagają.",
"ToastBookmarkCreateFailed": "Nie udało się utworzyć zakładki",
@@ -283,7 +286,7 @@
"ToastBookmarkUpdateFailed": "Nie udało się zaktualizować zakładki",
"ToastItemMarkedAsFinishedFailed": "Nie udało się oznaczyć jako zakończone",
"ToastItemMarkedAsNotFinishedFailed": "Oznaczenie pozycji jako ukończonej nie powiodło się",
"ToastPlaylistCreateFailed": "Failed to create playlist",
"ToastPlaylistCreateFailed": "Nie udało się utworzyć playlisty",
"ToastPodcastCreateFailed": "Nie udało się utworzyć podcastu",
"ToastPodcastCreateSuccess": "Podcast został pomyślnie utworzony",
"ToastRSSFeedCloseFailed": "Zamknięcie kanału RSS nie powiodło się",
+294
View File
@@ -0,0 +1,294 @@
{
"ButtonAdd": "Adicionar",
"ButtonAddNewServer": "Adicionar Novo Servidor",
"ButtonAuthors": "Autores",
"ButtonBack": "Voltar",
"ButtonCancel": "Cancelar",
"ButtonCancelTimer": "Cancelar Timer",
"ButtonClearFilter": "Limpar Filtro",
"ButtonCloseFeed": "Fechar Feed",
"ButtonCollections": "Coleções",
"ButtonConnect": "Conectar",
"ButtonConnectToServer": "Conectar ao Servidor",
"ButtonCreate": "Criar",
"ButtonCreateBookmark": "Criar Marcador",
"ButtonCreateNewPlaylist": "Criar Nova Lista de Reprodução",
"ButtonDelete": "Apagar",
"ButtonDeleteLocalEpisode": "Apagar episódio local",
"ButtonDeleteLocalFile": "Apagar arquivo local",
"ButtonDeleteLocalItem": "Apagar item local",
"ButtonDisableAutoTimer": "Desativar Timer Automático",
"ButtonDisconnect": "Desconectar",
"ButtonHistory": "Histórico",
"ButtonHome": "Principal",
"ButtonIssues": "Problemas",
"ButtonLatest": "Mais Recentes",
"ButtonLibrary": "Biblioteca",
"ButtonLocalMedia": "Mídia Local",
"ButtonManageLocalFiles": "Gerenciar Arquivos Locais",
"ButtonNewFolder": "Nova Pasta",
"ButtonNextEpisode": "Próximo Episódio",
"ButtonOpenFeed": "Abrir Feed",
"ButtonOverride": "Sobrepor",
"ButtonPause": "Pausar",
"ButtonPlay": "Reproduzir",
"ButtonPlaying": "Reproduzindo",
"ButtonPlaylists": "Lista de Reprodução",
"ButtonRead": "Ler",
"ButtonRemove": "Remover",
"ButtonRemoveFromServer": "Remover do Servidor",
"ButtonSave": "Salvar",
"ButtonSaveOrder": "Salvar Ordem",
"ButtonSearch": "Pesquisar",
"ButtonSendEbookToDevice": "Enviar Ebook para Dispositivo",
"ButtonSeries": "Série",
"ButtonSetTimer": "Definir Timer",
"ButtonStream": "Stream",
"ButtonSubmit": "Enviar",
"ButtonSwitchServerUser": "Trocar Servidor/Usuário",
"ButtonUserStats": "Estatísticas do Usuário",
"ButtonYes": "Sim",
"HeaderAccount": "Conta",
"HeaderAdvanced": "Avançado",
"HeaderAudioTracks": "Trilhas de áudio",
"HeaderChapters": "Capítulos",
"HeaderCollection": "Coleção",
"HeaderCollectionItems": "Itens da Coleção",
"HeaderConnectionStatus": "Status da Conexão",
"HeaderDetails": "Detalhes",
"HeaderDownloads": "Downloads",
"HeaderEbookFiles": "Arquivos Ebook",
"HeaderEpisodes": "Episódios",
"HeaderEreaderSettings": "Configurações Ereader",
"HeaderLatestEpisodes": "Últimos episódios",
"HeaderLibraries": "Bibliotecas",
"HeaderLocalFolders": "Pastas Locais",
"HeaderLocalLibraryItems": "Itens de Biblioteca Locais",
"HeaderNewPlaylist": "Nova Lista de Reprodução",
"HeaderOpenRSSFeed": "Abrir Feed RSS",
"HeaderPlaybackSettings": "Configurações de Reprodução",
"HeaderPlaylist": "Lista de Reprodução",
"HeaderPlaylistItems": "Itens da lista de reprodução",
"HeaderRSSFeed": "Feed RSS",
"HeaderRSSFeedGeneral": "Detalhes RSS",
"HeaderRSSFeedIsOpen": "Feed RSS está Aberto",
"HeaderSelectDownloadLocation": "Selecione Local para Download",
"HeaderSettings": "Configurações",
"HeaderSleepTimer": "Timer",
"HeaderSleepTimerSettings": "Configurações do Timer",
"HeaderStatsMinutesListeningChart": "Minutos Escutados (últimos 7 dias)",
"HeaderStatsRecentSessions": "Sessões Recentes",
"HeaderTableOfContents": "Sumário",
"HeaderUserInterfaceSettings": "Configurações da Interface do Usuário",
"HeaderYourStats": "Suas Estatísticas",
"LabelAdded": "Acrescentado",
"LabelAddedAt": "Acrescentado Em",
"LabelAddToPlaylist": "Adicionar à Lista de Reprodução",
"LabelAll": "Todos",
"LabelAllowSeekingOnMediaControls": "Permitir busca de posição nos controles de notificação de mídia",
"LabelAuthor": "Autor",
"LabelAuthorFirstLast": "Autor (Nome Sobrenome)",
"LabelAuthorLastFirst": "Autor (Sobrenome, Nome)",
"LabelAuthors": "Autores",
"LabelAutoDownloadEpisodes": "Download Automático de Episódios",
"LabelAutoRewindTime": "Tempo para retroceder automaticamente",
"LabelAutoSleepTimer": "Timer automático",
"LabelAutoSleepTimerAutoRewind": "Retrocesso automático do timer",
"LabelAutoSleepTimerAutoRewindHelp": "Após o timer terminar, da próxima vez que o item for reproduzido a sua posição será retrocedida automaticamente.",
"LabelAutoSleepTimerHelp": "Ao reproduzir uma mídia entre as horas especificadas como inicío e fim, um timer será iniciado automaticamente.",
"LabelBooks": "Livros",
"LabelChapters": "Capítulos",
"LabelChapterTrack": "Trilha do Capítulo",
"LabelClosePlayer": "Fechar Reprodutor",
"LabelCollapseSeries": "Fechar Série",
"LabelComplete": "Concluído",
"LabelContinueBooks": "Continuar Livros",
"LabelContinueEpisodes": "Continuar Episódios",
"LabelContinueListening": "Continuar Escutando",
"LabelContinueReading": "Continuar Lendo",
"LabelContinueSeries": "Continuar Série",
"LabelCustomTime": "Personalizar tempo",
"LabelDescription": "Descrição",
"LabelDisableAudioFadeOut": "Desativar fade out de áudio",
"LabelDisableAudioFadeOutHelp": "O volume do áudio diminuirá progressivamente quando houver menos que 1 minuto no seu timer. Ative essa configuração para não diminuir o volume.",
"LabelDisableAutoRewind": "Desativar retrocesso automático",
"LabelDisableShakeToReset": "Desativar sacudir para resetar",
"LabelDisableShakeToResetHelp": "Sacudir o seu dispositivo quando o timer estiver ativo OU em até 2 minutos após o seu fim resetará o seu timer. Ative essa configuração para desabilitar o sacudir para resetar.",
"LabelDisableVibrateOnReset": "Desativar vibração ao resetar",
"LabelDisableVibrateOnResetHelp": "Quando o timer for resetado o seu dispositivo vibrará. Ative essa configuração para não vibrar quando o timer for resetado.",
"LabelDiscover": "Descobrir",
"LabelDownload": "Download",
"LabelDownloaded": "Download realizado",
"LabelDuration": "Duração",
"LabelEbook": "Ebook",
"LabelEbooks": "Ebooks",
"LabelEnable": "Ativar",
"LabelEnableMp3IndexSeeking": "Ativar busca por índice mp3",
"LabelEnableMp3IndexSeekingHelp": "Esta configuração só deve ser ativada se a busca em arquivos mp3 não estiver funcionando corretamente. Buscas incorretas são normalmente causadas por arquivos MP3 com bitrate variável (VBR). Esta configuração forçará a busca por índice, que é uma consulta do tempo-para-byte, elaborado durante a leitura do arquivo. Em alguns casos, com arquivos MP3 maiores, haverá um atraso ao buscar perto do final do arquivo.",
"LabelEnd": "Fim",
"LabelEndOfChapter": "Fim do Chapítulo",
"LabelEndTime": "Tempo final",
"LabelEpisode": "Episódio",
"LabelFeedURL": "URL do Feed",
"LabelFile": "Arquivo",
"LabelFileBirthtime": "Criação do Arquivo",
"LabelFileModified": "Modificação do Arquivo",
"LabelFilename": "Nome do Arquivo",
"LabelFinished": "Concluído",
"LabelFolder": "Pasta",
"LabelFontScale": "Escala de fonte",
"LabelGenre": "Gênero",
"LabelGenres": "Gêneros",
"LabelHapticFeedback": "Feedback tátil",
"LabelHasEbook": "Tem ebook",
"LabelHasSupplementaryEbook": "Tem ebook complementar",
"LabelHeavy": "Pesado",
"LabelHigh": "Alta",
"LabelHost": "Host",
"LabelIncomplete": "Incompleto",
"LabelInProgress": "Em Andamento",
"LabelInternalAppStorage": "Armazenamento Interno do App",
"LabelJumpBackwardsTime": "Retroceder tempo",
"LabelJumpForwardsTime": "Adiantar tempo",
"LabelLanguage": "Idioma",
"LabelLayout": "Layout",
"LabelLayoutAuto": "Automático",
"LabelLayoutSinglePage": "Uma página",
"LabelLight": "Leve",
"LabelLineSpacing": "Espaçamento entre linhas",
"LabelListenAgain": "Escutar novamente",
"LabelLocalBooks": "Livros Locais",
"LabelLocalPodcasts": "Podcasts Locais",
"LabelLockOrientation": "Travar orientação",
"LabelLockPlayer": "Travar Reprodutor",
"LabelLow": "Baixa",
"LabelMediaType": "Tipo de Mídia",
"LabelMedium": "Média",
"LabelMore": "Mais",
"LabelMoreInfo": "Mais Informações",
"LabelName": "Nome",
"LabelNarrator": "Narrador",
"LabelNarrators": "Narradores",
"LabelNewestAuthors": "Novos Autores",
"LabelNewestEpisodes": "Episódios mais recentes",
"LabelNo": "Não",
"LabelNotFinished": "Não Concluído",
"LabelNotStarted": "Não Iniciado",
"LabelOff": "Desligado",
"LabelPassword": "Senha",
"LabelPath": "Caminho",
"LabelPlaybackDirect": "Direto",
"LabelPlaybackLocal": "Local",
"LabelPlaybackSpeed": "Velocidade de Reprodução",
"LabelPlaybackTranscode": "Transcodificar",
"LabelPodcast": "Podcast",
"LabelPodcasts": "Podcasts",
"LabelPreventIndexing": "Evitar que o seu feed seja indexado pelos diretórios de podcast do iTunes e Google",
"LabelProgress": "Progresso",
"LabelPubDate": "Data de Publicação",
"LabelPublishYear": "Ano de Publicação",
"LabelRead": "Lido",
"LabelReadAgain": "Ler Novamente",
"LabelRecentlyAdded": "Novidades",
"LabelRecentSeries": "Séries Recentes",
"LabelRemoveFromPlaylist": "Remove from Playlist",
"LabelRSSFeedCustomOwnerEmail": "Email do dono personalizado",
"LabelRSSFeedCustomOwnerName": "Nome do dono personalizado",
"LabelRSSFeedPreventIndexing": "Impedir Indexação",
"LabelRSSFeedSlug": "Slug do Feed RSS",
"LabelScaleElapsedTimeBySpeed": "Proporcionalizar Tempo Decorrido com a Velocidade",
"LabelSeason": "Temporada",
"LabelSelectADevice": "Selecione um dispositivo",
"LabelSeries": "Série",
"LabelServerAddress": "Endereço do servidor",
"LabelSetEbookAsPrimary": "Definir como principal",
"LabelSetEbookAsSupplementary": "Definir como complementar",
"LabelShakeSensitivity": "Sensitividade do sacudir",
"LabelShowAll": "Exibir Todos",
"LabelSize": "Tamanho",
"LabelSleepTimer": "Timer",
"LabelStart": "Iniciar",
"LabelStartTime": "Iniciado Em",
"LabelStatsBestDay": "Melhor Dia",
"LabelStatsDailyAverage": "Média Diária",
"LabelStatsDays": "Dias",
"LabelStatsDaysListened": "Dias Escutando",
"LabelStatsInARow": "seguidos",
"LabelStatsItemsFinished": "Itens Concluídos",
"LabelStatsMinutes": "minutos",
"LabelStatsMinutesListening": "Minutos Escutando",
"LabelStatsWeekListening": "Tempo escutando na semana",
"LabelTag": "Etiqueta",
"LabelTags": "Etiquetas",
"LabelTheme": "Tema",
"LabelThemeDark": "Escuro",
"LabelThemeLight": "Claro",
"LabelTimeRemaining": "{0} restantes",
"LabelTitle": "Título",
"LabelTotalTrack": "Total da Trilha",
"LabelTracks": "Trilhas",
"LabelType": "Tipo",
"LabelUnlockPlayer": "Destravar Reprodutor",
"LabelUseBookshelfView": "Usar visão estante",
"LabelUser": "Usuário",
"LabelUsername": "Nome do Usuário",
"LabelVeryHigh": "Muito Alta",
"LabelVeryLow": "Muito Baixa",
"LabelYourBookmarks": "Seus Marcadores",
"LabelYourProgress": "Seu Progresso",
"MessageAndroid10Downloads": "Android 10 e versões anteriores utilizarão o armazenamento interno para downloads.",
"MessageAttemptingServerConnection": "Tentando conexão ao ...",
"MessageAudiobookshelfServerNotConnected": "Servidor Audiobookshelf não conectado",
"MessageAudiobookshelfServerRequired": "<strong>Importante!</strong> Esse aplicativo foi desenvolvido para funcionar com um servidor Audiobookshelf que você ou algum conhecido seu está mantendo. Esse aplicativo não oferece qualquer conteúdo.",
"MessageBookshelfEmpty": "Estante vazia",
"MessageConfirmDeleteLocalEpisode": "Remover episódio local \"{0}\" do seu dispositivo? O arquivo no servidor não será afetado.",
"MessageConfirmDeleteLocalFiles": "Remover arquivos locais deste item do seu dispositivo? Os arquivos no servidor e o seu progresso não serão afetados.",
"MessageConfirmDiscardProgress": "Tem certeza de que deseja restar o seu progresso?",
"MessageConfirmMarkAsFinished": "Tem certeza de que deseja marcar esse item como concluído?",
"MessageConfirmRemoveBookmark": "Tem certeza de que deseja remover o marcador?",
"MessageDiscardProgress": "Descartar Progresso",
"MessageDownloadCompleteProcessing": "Download concluído. Processando...",
"MessageDownloading": "Realizando o download...",
"MessageDownloadingEpisode": "Realizando o downloading do episódio",
"MessageEpisodesQueuedForDownload": "{0} Episódio(s) na fila de download",
"MessageFeedURLWillBe": "URL do Feed será {0}",
"MessageFetching": "Buscando...",
"MessageFollowTheProjectOnGithub": "Siga este projeto no Github",
"MessageItemDownloadCompleteFailedToCreate": "Download concluído mas não foi possível criar item da biblioteca",
"MessageLoading": "Carregando...",
"MessageLoadingServerData": "Carregando dados do servidor...",
"MessageMarkAsFinished": "Marcar como Concluído",
"MessageMediaLinkedToADifferentServer": "Mídia está associada a um servidor Audiobookshelf em um endereço diferente ({0}). O progresso será sincronizado quando conectado a esse servidor.",
"MessageMediaLinkedToADifferentUser": "Mídia está associada a este servidor mas o download foi feito por outro usuário. O progresso só será sincronizado para o usuário que realizou o download.",
"MessageMediaLinkedToServer": "Associado ao servidor {0}",
"MessageMediaLinkedToThisServer": "Mídia baixada está associada a esse servidor",
"MessageMediaNotLinkedToServer": "Mídia não está associada a um servidor Audiobookshelf. Nenhum progresso será sincronizado.",
"MessageNoBookmarks": "Sem Marcadores",
"MessageNoChapters": "Sem Capítulos",
"MessageNoItems": "Sem Itens",
"MessageNoItemsFound": "Nenhum item encontrado",
"MessageNoListeningSessions": "Sem Sessões de Escuta",
"MessageNoMediaFolders": "Sem Pastas de Mídia",
"MessageNoNetworkConnection": "Nem conexão de rede",
"MessageNoPodcastsFound": "Nenhum podcast encontrado",
"MessageNoUpdatesWereNecessary": "Nenhuma atualização é necessária",
"MessageNoUserPlaylists": "Você não tem listas de reprodução",
"MessageReportBugsAndContribute": "Reporte bugs, peça funcionalidades e contribua em",
"MessageSocketConnectedOverMeteredCellular": "Socket conectado usando rede celular limitada",
"MessageSocketConnectedOverMeteredWifi": "Socket conectado usando wifi limitada",
"MessageSocketConnectedOverUnmeteredCellular": "Socket conectado usando rede celular ilimitada",
"MessageSocketConnectedOverUnmeteredWifi": "Socket conectado usando wifi ilimitada",
"MessageSocketNotConnected": "Socket não conectado",
"NoteRSSFeedPodcastAppsHttps": "Atenção: A maioria dos aplicativos de podcasts requer que a URL do feed RSS use HTTPS",
"NoteRSSFeedPodcastAppsPubDate": "Atenção: Um ou mais dos seus episódios não tem uma data de publicação. Alguns aplicativos de podcasts requerem isto.",
"ToastBookmarkCreateFailed": "Falha ao criar marcador",
"ToastBookmarkRemoveFailed": "Falha ao remover marcador",
"ToastBookmarkUpdateFailed": "Falha ao atualizar marcador",
"ToastItemMarkedAsFinishedFailed": "Falha ao marcar como Concluído",
"ToastItemMarkedAsNotFinishedFailed": "Falha ao marcar como Não Concluído",
"ToastPlaylistCreateFailed": "Falha ao criar lista de reprodução",
"ToastPodcastCreateFailed": "Falha ao criar podcast",
"ToastPodcastCreateSuccess": "Podcast criado",
"ToastRSSFeedCloseFailed": "Falha ao fechar feed RSS",
"ToastRSSFeedCloseSuccess": "Feed RSS fechado"
}
+3
View File
@@ -85,6 +85,7 @@
"LabelAddedAt": "Дата добавления",
"LabelAddToPlaylist": "Добавить в плейлист",
"LabelAll": "Все",
"LabelAllowSeekingOnMediaControls": "Allow position seeking on media notification controls",
"LabelAuthor": "Автор",
"LabelAuthorFirstLast": "Автор (Имя Фамилия)",
"LabelAuthorLastFirst": "Автор (Фамилия, Имя)",
@@ -190,10 +191,12 @@
"LabelReadAgain": "Read Again",
"LabelRecentlyAdded": "Недавно добавленные",
"LabelRecentSeries": "Недавние серии",
"LabelRemoveFromPlaylist": "Remove from Playlist",
"LabelRSSFeedCustomOwnerEmail": "Пользовательский Email владельца",
"LabelRSSFeedCustomOwnerName": "Пользовательское Имя владельца",
"LabelRSSFeedPreventIndexing": "Запретить индексирование",
"LabelRSSFeedSlug": "Встроить RSS-канал",
"LabelScaleElapsedTimeBySpeed": "Scale Elapsed Time by Speed",
"LabelSeason": "Сезон",
"LabelSelectADevice": "Выбор девайса",
"LabelSeries": "Серия",
+3
View File
@@ -85,6 +85,7 @@
"LabelAddedAt": "Tillagd vid",
"LabelAddToPlaylist": "Lägg till i Spellista",
"LabelAll": "Alla",
"LabelAllowSeekingOnMediaControls": "Allow position seeking on media notification controls",
"LabelAuthor": "Författare",
"LabelAuthorFirstLast": "Författare (Förnamn Efternamn)",
"LabelAuthorLastFirst": "Författare (Efternamn, Förnamn)",
@@ -190,10 +191,12 @@
"LabelReadAgain": "Read Again",
"LabelRecentlyAdded": "Recently Added",
"LabelRecentSeries": "Recent Series",
"LabelRemoveFromPlaylist": "Remove from Playlist",
"LabelRSSFeedCustomOwnerEmail": "Anpassad ägarens e-post",
"LabelRSSFeedCustomOwnerName": "Anpassat ägarnamn",
"LabelRSSFeedPreventIndexing": "Förhindra indexering",
"LabelRSSFeedSlug": "RSS-flödesslag",
"LabelScaleElapsedTimeBySpeed": "Scale Elapsed Time by Speed",
"LabelSeason": "Säsong",
"LabelSelectADevice": "Select a device",
"LabelSeries": "Serie",
+3
View File
@@ -85,6 +85,7 @@
"LabelAddedAt": "添加于",
"LabelAddToPlaylist": "添加到播放列表",
"LabelAll": "全部",
"LabelAllowSeekingOnMediaControls": "Allow position seeking on media notification controls",
"LabelAuthor": "作者",
"LabelAuthorFirstLast": "作者 (姓 名)",
"LabelAuthorLastFirst": "作者 (名, 姓)",
@@ -190,10 +191,12 @@
"LabelReadAgain": "再次阅读",
"LabelRecentlyAdded": "最近添加",
"LabelRecentSeries": "最近添加系列",
"LabelRemoveFromPlaylist": "Remove from Playlist",
"LabelRSSFeedCustomOwnerEmail": "自定义所有者电子邮件",
"LabelRSSFeedCustomOwnerName": "自定义所有者名称",
"LabelRSSFeedPreventIndexing": "防止索引",
"LabelRSSFeedSlug": "RSS 源段",
"LabelScaleElapsedTimeBySpeed": "Scale Elapsed Time by Speed",
"LabelSeason": "季",
"LabelSelectADevice": "选择设备",
"LabelSeries": "系列",