From 8027c4a06f01f3a13d43cf041af012a4f64d62f5 Mon Sep 17 00:00:00 2001 From: Barnabas Ratki Date: Wed, 3 Jan 2024 01:36:56 +0100 Subject: [PATCH 01/81] Added support for custom metadata providers WiP but already open to feedback --- client/components/app/ConfigSideNav.vue | 5 + .../modals/AddCustomMetadataProviderModal.vue | 104 ++++++++++++ .../tables/CustomMetadataProviderTable.vue | 150 ++++++++++++++++++ client/layouts/default.vue | 8 + .../config/custom-metadata-providers.vue | 45 ++++++ client/store/scanners.js | 31 +++- client/strings/en-us.json | 3 + server/Database.js | 45 ++++++ server/controllers/LibraryController.js | 10 ++ server/controllers/MiscController.js | 90 +++++++++++ server/finders/BookFinder.js | 17 +- server/models/CustomMetadataProvider.js | 58 +++++++ server/providers/CustomProviderAdapter.js | 76 +++++++++ server/routers/ApiRouter.js | 4 + 14 files changed, 642 insertions(+), 4 deletions(-) create mode 100644 client/components/modals/AddCustomMetadataProviderModal.vue create mode 100644 client/components/tables/CustomMetadataProviderTable.vue create mode 100644 client/pages/config/custom-metadata-providers.vue create mode 100644 server/models/CustomMetadataProvider.js create mode 100644 server/providers/CustomProviderAdapter.js diff --git a/client/components/app/ConfigSideNav.vue b/client/components/app/ConfigSideNav.vue index c2db0725..e253d1ae 100644 --- a/client/components/app/ConfigSideNav.vue +++ b/client/components/app/ConfigSideNav.vue @@ -109,6 +109,11 @@ export default { id: 'config-authentication', title: this.$strings.HeaderAuthentication, path: '/config/authentication' + }, + { + id: 'config-custom-metadata-providers', + title: this.$strings.HeaderCustomMetadataProviders, + path: '/config/custom-metadata-providers' } ] diff --git a/client/components/modals/AddCustomMetadataProviderModal.vue b/client/components/modals/AddCustomMetadataProviderModal.vue new file mode 100644 index 00000000..1b9f930c --- /dev/null +++ b/client/components/modals/AddCustomMetadataProviderModal.vue @@ -0,0 +1,104 @@ + + + diff --git a/client/components/tables/CustomMetadataProviderTable.vue b/client/components/tables/CustomMetadataProviderTable.vue new file mode 100644 index 00000000..8104cede --- /dev/null +++ b/client/components/tables/CustomMetadataProviderTable.vue @@ -0,0 +1,150 @@ + + + + + diff --git a/client/layouts/default.vue b/client/layouts/default.vue index c3cc3484..1d33c44c 100644 --- a/client/layouts/default.vue +++ b/client/layouts/default.vue @@ -328,6 +328,9 @@ export default { this.$store.commit('libraries/setEReaderDevices', data.ereaderDevices) }, + customMetadataProvidersChanged() { + this.$store.dispatch('scanners/reFetchCustom') + }, initializeSocket() { this.socket = this.$nuxtSocket({ name: process.env.NODE_ENV === 'development' ? 'dev' : 'prod', @@ -406,6 +409,10 @@ export default { this.socket.on('batch_quickmatch_complete', this.batchQuickMatchComplete) this.socket.on('admin_message', this.adminMessageEvt) + + // Custom metadata provider Listeners + this.socket.on('custom_metadata_provider_added', this.customMetadataProvidersChanged) + this.socket.on('custom_metadata_provider_removed', this.customMetadataProvidersChanged) }, showUpdateToast(versionData) { var ignoreVersion = localStorage.getItem('ignoreVersion') @@ -541,6 +548,7 @@ export default { window.addEventListener('keydown', this.keyDown) this.$store.dispatch('libraries/load') + this.$store.dispatch('scanners/reFetchCustom') this.initLocalStorage() diff --git a/client/pages/config/custom-metadata-providers.vue b/client/pages/config/custom-metadata-providers.vue new file mode 100644 index 00000000..10fdb21b --- /dev/null +++ b/client/pages/config/custom-metadata-providers.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/client/store/scanners.js b/client/store/scanners.js index ccdc1791..32878a6a 100644 --- a/client/store/scanners.js +++ b/client/store/scanners.js @@ -73,6 +73,33 @@ export const state = () => ({ export const getters = {} -export const actions = {} +export const actions = { + reFetchCustom({ dispatch, commit }) { + return this.$axios + .$get(`/api/custom-metadata-providers`) + .then((data) => { + const providers = data.providers -export const mutations = {} \ No newline at end of file + commit('setCustomProviders', providers) + return data + }) + .catch((error) => { + console.error('Failed', error) + return false + }) + }, +} + +export const mutations = { + setCustomProviders(state, providers) { + // clear previous values, and add new values to the end + state.providers = state.providers.filter((p) => !p.value.startsWith("custom-")); + state.providers = [ + ...state.providers, + ...providers.map((p) => {return { + text: p.name, + value: p.slug, + }}) + ] + }, +} \ No newline at end of file diff --git a/client/strings/en-us.json b/client/strings/en-us.json index f69175fd..9dfde095 100644 --- a/client/strings/en-us.json +++ b/client/strings/en-us.json @@ -96,6 +96,7 @@ "HeaderAudiobookTools": "Audiobook File Management Tools", "HeaderAudioTracks": "Audio Tracks", "HeaderAuthentication": "Authentication", + "HeaderCustomMetadataProviders": "Custom metadata providers", "HeaderBackups": "Backups", "HeaderChangePassword": "Change Password", "HeaderChapters": "Chapters", @@ -540,6 +541,8 @@ "LabelYourBookmarks": "Your Bookmarks", "LabelYourPlaylists": "Your Playlists", "LabelYourProgress": "Your Progress", + "LabelUrl": "URL", + "LabelApiKey": "API Key", "MessageAddToPlayerQueue": "Add to player queue", "MessageAppriseDescription": "To use this feature you will need to have an instance of Apprise API running or an api that will handle those same requests.
The Apprise API Url should be the full URL path to send the notification, e.g., if your API instance is served at http://192.168.1.1:8337 then you would put http://192.168.1.1:8337/notify.", "MessageBackupsDescription": "Backups include users, user progress, library item details, server settings, and images stored in /metadata/items & /metadata/authors. Backups do not include any files stored in your library folders.", diff --git a/server/Database.js b/server/Database.js index fd606bac..bbea7352 100644 --- a/server/Database.js +++ b/server/Database.js @@ -132,6 +132,11 @@ class Database { return this.models.playbackSession } + /** @type {typeof import('./models/CustomMetadataProvider')} */ + get customMetadataProviderModel() { + return this.models.customMetadataProvider + } + /** * Check if db file exists * @returns {boolean} @@ -245,6 +250,7 @@ class Database { require('./models/Feed').init(this.sequelize) require('./models/FeedEpisode').init(this.sequelize) require('./models/Setting').init(this.sequelize) + require('./models/CustomMetadataProvider').init(this.sequelize) return this.sequelize.sync({ force, alter: false }) } @@ -694,6 +700,45 @@ class Database { }) } + /** + * Returns true if a custom provider with the given slug exists + * @param {string} providerSlug + * @return {boolean} + */ + async doesCustomProviderExistBySlug(providerSlug) { + const id = providerSlug.split("custom-")[1] + + if (!id) { + return false + } + + return !!await this.customMetadataProviderModel.findByPk(id) + } + + /** + * Removes a custom metadata provider + * @param {string} id + */ + async removeCustomMetadataProviderById(id) { + // destroy metadta provider + await this.customMetadataProviderModel.destroy({ + where: { + id, + } + }) + + const slug = `custom-${id}`; + + // fallback libraries using it to google + await this.libraryModel.update({ + provider: "google", + }, { + where: { + provider: slug, + } + }); + } + /** * Clean invalid records in database * Series should have atleast one Book diff --git a/server/controllers/LibraryController.js b/server/controllers/LibraryController.js index 70baff85..304ca4f0 100644 --- a/server/controllers/LibraryController.js +++ b/server/controllers/LibraryController.js @@ -51,6 +51,11 @@ class LibraryController { } } + // Validate that the custom provider exists if given any + if (newLibraryPayload.provider && newLibraryPayload.provider.startsWith("custom-")) { + await Database.doesCustomProviderExistBySlug(newLibraryPayload.provider) + } + const library = new Library() let currentLargestDisplayOrder = await Database.libraryModel.getMaxDisplayOrder() @@ -175,6 +180,11 @@ class LibraryController { } } + // Validate that the custom provider exists if given any + if (req.body.provider && req.body.provider.startsWith("custom-")) { + await Database.doesCustomProviderExistBySlug(req.body.provider) + } + const hasUpdates = library.update(req.body) // TODO: Should check if this is an update to folder paths or name only if (hasUpdates) { diff --git a/server/controllers/MiscController.js b/server/controllers/MiscController.js index c2272ee6..31f4587b 100644 --- a/server/controllers/MiscController.js +++ b/server/controllers/MiscController.js @@ -717,5 +717,95 @@ class MiscController { const stats = await adminStats.getStatsForYear(year) res.json(stats) } + + /** + * GET: /api/custom-metadata-providers + * + * @param {import('express').Request} req + * @param {import('express').Response} res + */ + async getCustomMetadataProviders(req, res) { + const providers = await Database.customMetadataProviderModel.findAll() + + res.json({ + providers: providers.map((p) => p.toUserJson()), + }) + } + + /** + * GET: /api/custom-metadata-providers/admin + * + * @param {import('express').Request} req + * @param {import('express').Response} res + */ + async getAdminCustomMetadataProviders(req, res) { + if (!req.user.isAdminOrUp) { + Logger.error(`[MiscController] Non-admin user "${req.user.username}" attempted to get admin custom metadata providers`) + return res.sendStatus(403) + } + + const providers = await Database.customMetadataProviderModel.findAll() + + res.json({ + providers, + }) + } + + /** + * PATCH: /api/custom-metadata-providers/admin + * + * @param {import('express').Request} req + * @param {import('express').Response} res + */ + async addCustomMetadataProviders(req, res) { + if (!req.user.isAdminOrUp) { + Logger.error(`[MiscController] Non-admin user "${req.user.username}" attempted to get admin custom metadata providers`) + return res.sendStatus(403) + } + + const { name, url, apiKey } = req.body; + + if (!name || !url || !apiKey) { + return res.status(500).send(`Invalid patch data`) + } + + const provider = await Database.customMetadataProviderModel.create({ + name, + url, + apiKey, + }) + + SocketAuthority.adminEmitter('custom_metadata_provider_added', provider) + + res.json({ + provider, + }) + } + + /** + * DELETE: /api/custom-metadata-providers/admin/:id + * + * @param {import('express').Request} req + * @param {import('express').Response} res + */ + async deleteCustomMetadataProviders(req, res) { + if (!req.user.isAdminOrUp) { + Logger.error(`[MiscController] Non-admin user "${req.user.username}" attempted to get admin custom metadata providers`) + return res.sendStatus(403) + } + + const { id } = req.params; + + if (!id) { + return res.status(500).send(`Invalid delete data`) + } + + const provider = await Database.customMetadataProviderModel.findByPk(id); + await Database.removeCustomMetadataProviderById(id); + + SocketAuthority.adminEmitter('custom_metadata_provider_removed', provider) + + res.json({}) + } } module.exports = new MiscController() diff --git a/server/finders/BookFinder.js b/server/finders/BookFinder.js index 466c8701..6c35a5fb 100644 --- a/server/finders/BookFinder.js +++ b/server/finders/BookFinder.js @@ -5,6 +5,7 @@ const iTunes = require('../providers/iTunes') const Audnexus = require('../providers/Audnexus') const FantLab = require('../providers/FantLab') const AudiobookCovers = require('../providers/AudiobookCovers') +const CustomProviderAdapter = require('../providers/CustomProviderAdapter') const Logger = require('../Logger') const { levenshteinDistance, escapeRegExp } = require('../utils/index') @@ -17,6 +18,7 @@ class BookFinder { this.audnexus = new Audnexus() this.fantLab = new FantLab() this.audiobookCovers = new AudiobookCovers() + this.customProviderAdapter = new CustomProviderAdapter() this.providers = ['google', 'itunes', 'openlibrary', 'fantlab', 'audiobookcovers', 'audible', 'audible.ca', 'audible.uk', 'audible.au', 'audible.fr', 'audible.de', 'audible.jp', 'audible.it', 'audible.in', 'audible.es'] @@ -147,6 +149,13 @@ class BookFinder { return books } + async getCustomProviderResults(title, author, providerSlug) { + const books = await this.customProviderAdapter.search(title, author, providerSlug) + if (this.verbose) Logger.debug(`Custom provider '${providerSlug}' Search Results: ${books.length || 0}`) + + return books + } + static TitleCandidates = class { constructor(cleanAuthor) { @@ -315,6 +324,11 @@ class BookFinder { const maxFuzzySearches = !isNaN(options.maxFuzzySearches) ? Number(options.maxFuzzySearches) : 5 let numFuzzySearches = 0 + // Custom providers are assumed to be correct + if (provider.startsWith("custom-")) { + return await this.getCustomProviderResults(title, author, provider) + } + if (!title) return books @@ -397,8 +411,7 @@ class BookFinder { books = await this.getFantLabResults(title, author) } else if (provider === 'audiobookcovers') { books = await this.getAudiobookCoversResults(title) - } - else { + } else { books = await this.getGoogleBooksResults(title, author) } return books diff --git a/server/models/CustomMetadataProvider.js b/server/models/CustomMetadataProvider.js new file mode 100644 index 00000000..4f2488d2 --- /dev/null +++ b/server/models/CustomMetadataProvider.js @@ -0,0 +1,58 @@ +const { DataTypes, Model, Sequelize } = require('sequelize') + +class CustomMetadataProvider extends Model { + constructor(values, options) { + super(values, options) + + /** @type {UUIDV4} */ + this.id + /** @type {string} */ + this.name + /** @type {string} */ + this.url + /** @type {string} */ + this.apiKey + } + + getSlug() { + return `custom-${this.id}` + } + + toUserJson() { + return { + name: this.name, + id: this.id, + slug: this.getSlug() + } + } + + static findByPk(id) { + this.findOne({ + where: { + id, + } + }) + } + + /** + * Initialize model + * @param {import('../Database').sequelize} sequelize + */ + static init(sequelize) { + super.init({ + id: { + type: DataTypes.UUID, + defaultValue: DataTypes.UUIDV4, + primaryKey: true + }, + name: DataTypes.STRING, + url: DataTypes.STRING, + apiKey: DataTypes.STRING + }, { + sequelize, + modelName: 'customMetadataProvider' + }) + } +} + +module.exports = CustomMetadataProvider \ No newline at end of file diff --git a/server/providers/CustomProviderAdapter.js b/server/providers/CustomProviderAdapter.js new file mode 100644 index 00000000..1bf5a5ee --- /dev/null +++ b/server/providers/CustomProviderAdapter.js @@ -0,0 +1,76 @@ +const Database = require('../Database') +const axios = require("axios"); +const Logger = require("../Logger"); + +class CustomProviderAdapter { + constructor() { + } + + async search(title, author, providerSlug) { + const providerId = providerSlug.split("custom-")[1] + + console.log(providerId) + const provider = await Database.customMetadataProviderModel.findOne({ + where: { + id: providerId, + } + }); + + if (!provider) { + throw new Error("Custom provider not found for the given id"); + } + + const matches = await axios.get(`${provider.url}/search?query=${encodeURIComponent(title)}${!!author ? `&author=${encodeURIComponent(author)}` : ""}`, { + headers: { + "Authorization": provider.apiKey, + }, + }).then((res) => { + if (!res || !res.data || !Array.isArray(res.data.matches)) return null + return res.data.matches + }).catch(error => { + Logger.error('[CustomMetadataProvider] Search error', error) + return [] + }) + + if (matches === null) { + throw new Error("Custom provider returned malformed response"); + } + + // re-map keys to throw out + return matches.map(({ + title, + subtitle, + author, + narrator, + publisher, + published_year, + description, + cover, + isbn, + asin, + genres, + tags, + language, + duration, + }) => { + return { + title, + subtitle, + author, + narrator, + publisher, + publishedYear: published_year, + description, + cover, + isbn, + asin, + genres, + tags: tags.join(","), + language, + duration, + } + }) + } +} + +module.exports = CustomProviderAdapter \ No newline at end of file diff --git a/server/routers/ApiRouter.js b/server/routers/ApiRouter.js index 3edce256..f78d4539 100644 --- a/server/routers/ApiRouter.js +++ b/server/routers/ApiRouter.js @@ -318,6 +318,10 @@ class ApiRouter { this.router.patch('/auth-settings', MiscController.updateAuthSettings.bind(this)) this.router.post('/watcher/update', MiscController.updateWatchedPath.bind(this)) this.router.get('/stats/year/:year', MiscController.getAdminStatsForYear.bind(this)) + this.router.get('/custom-metadata-providers', MiscController.getCustomMetadataProviders.bind(this)) + this.router.get('/custom-metadata-providers/admin', MiscController.getAdminCustomMetadataProviders.bind(this)) + this.router.patch('/custom-metadata-providers/admin', MiscController.addCustomMetadataProviders.bind(this)) + this.router.delete('/custom-metadata-providers/admin/:id', MiscController.deleteCustomMetadataProviders.bind(this)) } async getDirectories(dir, relpath, excludedDirs, level = 0) { From 08a41e37b4d412ef04cb45e839acda07b1e77cd9 Mon Sep 17 00:00:00 2001 From: Barnabas Ratki Date: Wed, 3 Jan 2024 20:27:42 +0100 Subject: [PATCH 02/81] Add specification --- custom-metadata-provider-specification.yaml | 124 ++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 custom-metadata-provider-specification.yaml diff --git a/custom-metadata-provider-specification.yaml b/custom-metadata-provider-specification.yaml new file mode 100644 index 00000000..3201fbb8 --- /dev/null +++ b/custom-metadata-provider-specification.yaml @@ -0,0 +1,124 @@ +openapi: 3.0.0 +servers: + - url: https://example.com + description: Local server +info: + license: + name: MIT + url: https://opensource.org/licenses/MIT + + + title: Custom Metadata Provider + version: 0.1.0 +security: + - api_key: [] + +paths: + /search: + get: + description: Search for books + operationId: search + summary: Search for books + security: + - api_key: [] + parameters: + - name: query + in: query + required: true + schema: + type: string + - name: author + in: query + required: false + schema: + type: string + responses: + "200": + description: OK + content: + application/json: + schema: + type: object + properties: + matches: + type: array + items: + $ref: "#/components/schemas/BookMetadata" + "400": + description: Bad Request + content: + application/json: + schema: + type: object + properties: + error: + type: string + "401": + description: Unauthorized + content: + application/json: + schema: + type: object + properties: + error: + type: string + "500": + description: Internal Server Error + content: + application/json: + schema: + type: object + properties: + error: + type: string +components: + schemas: + BookMetadata: + type: object + properties: + title: + type: string + subtitle: + type: string + author: + type: string + narrator: + type: string + publisher: + type: string + published_year: + type: string + description: + type: string + cover: + type: string + description: URL to the cover image + isbn: + type: string + format: isbn + asin: + type: string + format: asin + genres: + type: array + items: + type: string + tags: + type: array + items: + type: string + language: + type: string + duration: + type: number + format: int64 + description: Duration in seconds + required: + - title + securitySchemes: + api_key: + type: apiKey + name: AUTHORIZATION + in: header + + From 5ea423072be02beb9489e62c51d8aeb023acbeb1 Mon Sep 17 00:00:00 2001 From: Barnabas Ratki Date: Wed, 3 Jan 2024 20:40:36 +0100 Subject: [PATCH 03/81] Small fixes --- server/Database.js | 2 +- server/controllers/LibraryController.js | 4 ++-- server/models/CustomMetadataProvider.js | 2 +- server/providers/CustomProviderAdapter.js | 8 +------- 4 files changed, 5 insertions(+), 11 deletions(-) diff --git a/server/Database.js b/server/Database.js index bbea7352..302170ac 100644 --- a/server/Database.js +++ b/server/Database.js @@ -705,7 +705,7 @@ class Database { * @param {string} providerSlug * @return {boolean} */ - async doesCustomProviderExistBySlug(providerSlug) { + async doesCustomProviderExistWithSlug(providerSlug) { const id = providerSlug.split("custom-")[1] if (!id) { diff --git a/server/controllers/LibraryController.js b/server/controllers/LibraryController.js index 304ca4f0..b1ab572f 100644 --- a/server/controllers/LibraryController.js +++ b/server/controllers/LibraryController.js @@ -53,7 +53,7 @@ class LibraryController { // Validate that the custom provider exists if given any if (newLibraryPayload.provider && newLibraryPayload.provider.startsWith("custom-")) { - await Database.doesCustomProviderExistBySlug(newLibraryPayload.provider) + await Database.doesCustomProviderExistWithSlug(newLibraryPayload.provider) } const library = new Library() @@ -182,7 +182,7 @@ class LibraryController { // Validate that the custom provider exists if given any if (req.body.provider && req.body.provider.startsWith("custom-")) { - await Database.doesCustomProviderExistBySlug(req.body.provider) + await Database.doesCustomProviderExistWithSlug(req.body.provider) } const hasUpdates = library.update(req.body) diff --git a/server/models/CustomMetadataProvider.js b/server/models/CustomMetadataProvider.js index 4f2488d2..9bc175c4 100644 --- a/server/models/CustomMetadataProvider.js +++ b/server/models/CustomMetadataProvider.js @@ -27,7 +27,7 @@ class CustomMetadataProvider extends Model { } static findByPk(id) { - this.findOne({ + return this.findOne({ where: { id, } diff --git a/server/providers/CustomProviderAdapter.js b/server/providers/CustomProviderAdapter.js index 1bf5a5ee..d5f64291 100644 --- a/server/providers/CustomProviderAdapter.js +++ b/server/providers/CustomProviderAdapter.js @@ -8,13 +8,7 @@ class CustomProviderAdapter { async search(title, author, providerSlug) { const providerId = providerSlug.split("custom-")[1] - - console.log(providerId) - const provider = await Database.customMetadataProviderModel.findOne({ - where: { - id: providerId, - } - }); + const provider = await Database.customMetadataProviderModel.findByPk(providerId); if (!provider) { throw new Error("Custom provider not found for the given id"); From 12c6a1baa02b2514b48565a4e030281856b2906d Mon Sep 17 00:00:00 2001 From: Barnabas Ratki Date: Wed, 3 Jan 2024 20:42:35 +0100 Subject: [PATCH 04/81] Fix log messages --- server/controllers/MiscController.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/controllers/MiscController.js b/server/controllers/MiscController.js index 31f4587b..76140dcc 100644 --- a/server/controllers/MiscController.js +++ b/server/controllers/MiscController.js @@ -759,7 +759,7 @@ class MiscController { */ async addCustomMetadataProviders(req, res) { if (!req.user.isAdminOrUp) { - Logger.error(`[MiscController] Non-admin user "${req.user.username}" attempted to get admin custom metadata providers`) + Logger.error(`[MiscController] Non-admin user "${req.user.username}" attempted to add admin custom metadata providers`) return res.sendStatus(403) } @@ -790,7 +790,7 @@ class MiscController { */ async deleteCustomMetadataProviders(req, res) { if (!req.user.isAdminOrUp) { - Logger.error(`[MiscController] Non-admin user "${req.user.username}" attempted to get admin custom metadata providers`) + Logger.error(`[MiscController] Non-admin user "${req.user.username}" attempted to delete admin custom metadata providers`) return res.sendStatus(403) } From 56eff7a236b0d763024930d7eac39f30355d7a5a Mon Sep 17 00:00:00 2001 From: mozhu Date: Thu, 4 Jan 2024 11:52:45 +0800 Subject: [PATCH 05/81] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=92=AD=E5=AE=A2?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E5=9C=B0=E5=8C=BA=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/pages/config/index.vue | 4 ++++ client/plugins/i18n.js | 10 ++++++++++ client/strings/cs.json | 1 + client/strings/da.json | 1 + client/strings/de.json | 1 + client/strings/en-us.json | 1 + client/strings/es.json | 1 + client/strings/fr.json | 1 + client/strings/gu.json | 1 + client/strings/hi.json | 1 + client/strings/hr.json | 1 + client/strings/it.json | 1 + client/strings/lt.json | 1 + client/strings/nl.json | 1 + client/strings/no.json | 1 + client/strings/pl.json | 1 + client/strings/ru.json | 1 + client/strings/sv.json | 1 + client/strings/zh-cn.json | 1 + server/objects/settings/ServerSettings.js | 3 +++ server/providers/iTunes.js | 3 ++- 21 files changed, 36 insertions(+), 1 deletion(-) diff --git a/client/pages/config/index.vue b/client/pages/config/index.vue index 12ce7b1e..8cd33b0e 100644 --- a/client/pages/config/index.vue +++ b/client/pages/config/index.vue @@ -135,6 +135,10 @@ +
+ +
+ From fea78898a5de723b1790b5f640f8202dc74dc3b4 Mon Sep 17 00:00:00 2001 From: mozhu Date: Fri, 5 Jan 2024 14:45:35 +0800 Subject: [PATCH 07/81] =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E6=92=AD=E5=AE=A2?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E5=9C=B0=E5=8C=BA=E9=85=8D=E7=BD=AE=E5=88=B0?= =?UTF-8?q?=E5=AA=92=E4=BD=93=E5=BA=93=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modals/libraries/LibrarySettings.vue | 15 ++++++++++++--- client/pages/config/index.vue | 4 ---- client/pages/library/_library/podcast/search.vue | 5 ++++- server/controllers/SearchController.js | 5 ++++- server/objects/settings/LibrarySettings.js | 5 ++++- server/objects/settings/ServerSettings.js | 3 --- server/providers/iTunes.js | 3 +-- 7 files changed, 25 insertions(+), 15 deletions(-) diff --git a/client/components/modals/libraries/LibrarySettings.vue b/client/components/modals/libraries/LibrarySettings.vue index 53eb2650..c62f769b 100644 --- a/client/components/modals/libraries/LibrarySettings.vue +++ b/client/components/modals/libraries/LibrarySettings.vue @@ -49,6 +49,9 @@ +
+ +
@@ -69,7 +72,8 @@ export default { skipMatchingMediaWithAsin: false, skipMatchingMediaWithIsbn: false, audiobooksOnly: false, - hideSingleBookSeries: false + hideSingleBookSeries: false, + podcastSearchRegion: 'us' } }, computed: { @@ -85,6 +89,9 @@ export default { isBookLibrary() { return this.mediaType === 'book' }, + isPodcastLibrary() { + return this.mediaType === 'podcast' + }, providers() { if (this.mediaType === 'podcast') return this.$store.state.scanners.podcastProviders return this.$store.state.scanners.providers @@ -99,7 +106,8 @@ export default { skipMatchingMediaWithAsin: !!this.skipMatchingMediaWithAsin, skipMatchingMediaWithIsbn: !!this.skipMatchingMediaWithIsbn, audiobooksOnly: !!this.audiobooksOnly, - hideSingleBookSeries: !!this.hideSingleBookSeries + hideSingleBookSeries: !!this.hideSingleBookSeries, + podcastSearchRegion: this.podcastSearchRegion } } }, @@ -112,7 +120,8 @@ export default { this.skipMatchingMediaWithAsin = !!this.librarySettings.skipMatchingMediaWithAsin this.skipMatchingMediaWithIsbn = !!this.librarySettings.skipMatchingMediaWithIsbn this.audiobooksOnly = !!this.librarySettings.audiobooksOnly - this.hideSingleBookSeries = !!this.librarySettings.hideSingleBookSeries + this.hideSingleBookSeries = !!this.librarySettings.hideSingleBookSeries, + this.podcastSearchRegion = this.librarySettings.podcastSearchRegion } }, mounted() { diff --git a/client/pages/config/index.vue b/client/pages/config/index.vue index ccdbe2e4..12ce7b1e 100644 --- a/client/pages/config/index.vue +++ b/client/pages/config/index.vue @@ -135,10 +135,6 @@ -
- -
- @@ -20,24 +21,27 @@ chevron_left - + - Share + {{ + $strings.ButtonShare }} +
- +

{{ yearInReviewVariant + 1 }}

- + refresh - + chevron_right
@@ -46,7 +50,7 @@
- Share + {{ $strings.ButtonShare }}
@@ -56,24 +60,25 @@ chevron_left - + - Share + {{ $strings.ButtonShare }} +
- +

{{ yearInReviewServerVariant + 1 }}

- + refresh - + chevron_right
diff --git a/client/strings/de.json b/client/strings/de.json index 49037f4b..3bfb9189 100644 --- a/client/strings/de.json +++ b/client/strings/de.json @@ -41,12 +41,14 @@ "ButtonMatchAllAuthors": "Online Metadaten-Abgleich (alle Autoren)", "ButtonMatchBooks": "Online Metadaten-Abgleich (alle Medien)", "ButtonNevermind": "Abbrechen", + "ButtonNext": "Nächste", "ButtonOk": "Ok", "ButtonOpenFeed": "Feed öffnen", "ButtonOpenManager": "Manager öffnen", "ButtonPlay": "Abspielen", "ButtonPlaying": "Spielt", "ButtonPlaylists": "Wiedergabelisten", + "ButtonPrevious": "Vorherige", "ButtonPurgeAllCache": "Cache leeren", "ButtonPurgeItemsCache": "Lösche Medien-Cache", "ButtonPurgeMediaProgress": "Lösche Hörfortschritte", @@ -54,6 +56,7 @@ "ButtonQueueRemoveItem": "Aus der Warteschlange entfernen", "ButtonQuickMatch": "Schnellabgleich", "ButtonRead": "Lesen", + "ButtonRefresh": "Neu Laden", "ButtonRemove": "Löschen", "ButtonRemoveAll": "Alles löschen", "ButtonRemoveAllLibraryItems": "Lösche alle Bibliothekseinträge", @@ -73,6 +76,7 @@ "ButtonSelectFolderPath": "Auswahl Ordnerpfad", "ButtonSeries": "Serien", "ButtonSetChaptersFromTracks": "Kapitelerstellung aus Audiodateien", + "ButtonShare": "Teilen", "ButtonShiftTimes": "Zeitverschiebung", "ButtonShow": "Anzeigen", "ButtonStartM4BEncode": "M4B-Kodierung starten", @@ -174,6 +178,7 @@ "HeaderUpdateDetails": "Details aktualisieren", "HeaderUpdateLibrary": "Bibliothek aktualisieren", "HeaderUsers": "Benutzer", + "HeaderYearReview": "Jahr {0} in Übersicht", "HeaderYourStats": "Eigene Statistiken", "LabelAbridged": "Gekürzt", "LabelAccountType": "Kontoart", @@ -385,6 +390,7 @@ "LabelPermissionsDownload": "Herunterladen", "LabelPermissionsUpdate": "Aktualisieren", "LabelPermissionsUpload": "Hochladen", + "LabelPersonalYearReview": "Dein Jahr in Übersicht ({0})", "LabelPhotoPathURL": "Foto Pfad/URL", "LabelPlaylists": "Wiedergabelisten", "LabelPlayMethod": "Abspielmethode", @@ -429,6 +435,7 @@ "LabelSeries": "Serien", "LabelSeriesName": "Serienname", "LabelSeriesProgress": "Serienfortschritt", + "LabelServerYearReview": "Server Jahr in Übersicht ({0})", "LabelSetEbookAsPrimary": "Als Hauptbuch setzen", "LabelSetEbookAsSupplementary": "Als Ergänzung setzen", "LabelSettingsAudiobooksOnly": "Nur Hörbücher", @@ -545,6 +552,8 @@ "LabelViewQueue": "Player-Warteschlange anzeigen", "LabelVolume": "Lautstärke", "LabelWeekdaysToRun": "Wochentage für die Ausführung", + "LabelYearReviewHide": "Verstecke Jahr in Übersicht", + "LabelYearReviewShow": "Zeige Jahr in Übersicht", "LabelYourAudiobookDuration": "Laufzeit deines Mediums", "LabelYourBookmarks": "Lesezeichen", "LabelYourPlaylists": "Eigene Wiedergabelisten", diff --git a/client/strings/en-us.json b/client/strings/en-us.json index e3349d1f..4b2d6e4e 100644 --- a/client/strings/en-us.json +++ b/client/strings/en-us.json @@ -41,12 +41,14 @@ "ButtonMatchAllAuthors": "Match All Authors", "ButtonMatchBooks": "Match Books", "ButtonNevermind": "Nevermind", + "ButtonNext": "Next", "ButtonOk": "Ok", "ButtonOpenFeed": "Open Feed", "ButtonOpenManager": "Open Manager", "ButtonPlay": "Play", "ButtonPlaying": "Playing", "ButtonPlaylists": "Playlists", + "ButtonPrevious": "Previous", "ButtonPurgeAllCache": "Purge All Cache", "ButtonPurgeItemsCache": "Purge Items Cache", "ButtonPurgeMediaProgress": "Purge Media Progress", @@ -54,6 +56,7 @@ "ButtonQueueRemoveItem": "Remove from queue", "ButtonQuickMatch": "Quick Match", "ButtonRead": "Read", + "ButtonRefresh": "Refresh", "ButtonRemove": "Remove", "ButtonRemoveAll": "Remove All", "ButtonRemoveAllLibraryItems": "Remove All Library Items", @@ -73,6 +76,7 @@ "ButtonSelectFolderPath": "Select Folder Path", "ButtonSeries": "Series", "ButtonSetChaptersFromTracks": "Set chapters from tracks", + "ButtonShare": "Share", "ButtonShiftTimes": "Shift Times", "ButtonShow": "Show", "ButtonStartM4BEncode": "Start M4B Encode", @@ -174,6 +178,7 @@ "HeaderUpdateDetails": "Update Details", "HeaderUpdateLibrary": "Update Library", "HeaderUsers": "Users", + "HeaderYearReview": "Year {0} in Review", "HeaderYourStats": "Your Stats", "LabelAbridged": "Abridged", "LabelAccountType": "Account Type", @@ -385,6 +390,7 @@ "LabelPermissionsDownload": "Can Download", "LabelPermissionsUpdate": "Can Update", "LabelPermissionsUpload": "Can Upload", + "LabelPersonalYearReview": "Your Year in Review ({0})", "LabelPhotoPathURL": "Photo Path/URL", "LabelPlaylists": "Playlists", "LabelPlayMethod": "Play Method", @@ -429,6 +435,7 @@ "LabelSeries": "Series", "LabelSeriesName": "Series Name", "LabelSeriesProgress": "Series Progress", + "LabelServerYearReview": "Server Year in Review ({0})", "LabelSetEbookAsPrimary": "Set as primary", "LabelSetEbookAsSupplementary": "Set as supplementary", "LabelSettingsAudiobooksOnly": "Audiobooks only", @@ -545,6 +552,8 @@ "LabelViewQueue": "View player queue", "LabelVolume": "Volume", "LabelWeekdaysToRun": "Weekdays to run", + "LabelYearReviewHide": "Hide Year in Review", + "LabelYearReviewShow": "See Year in Review", "LabelYourAudiobookDuration": "Your audiobook duration", "LabelYourBookmarks": "Your Bookmarks", "LabelYourPlaylists": "Your Playlists", From 46448ce1e931e0edf79b422be2bf79e5d3a422ac Mon Sep 17 00:00:00 2001 From: rasmuskoit Date: Thu, 22 Feb 2024 09:46:09 +0200 Subject: [PATCH 62/81] Adds estonian translation --- client/plugins/i18n.js | 1 + client/strings/et.json | 768 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 769 insertions(+) create mode 100644 client/strings/et.json diff --git a/client/plugins/i18n.js b/client/plugins/i18n.js index a4a328c7..021682cf 100644 --- a/client/plugins/i18n.js +++ b/client/plugins/i18n.js @@ -10,6 +10,7 @@ const languageCodeMap = { 'de': { label: 'Deutsch', dateFnsLocale: 'de' }, 'en-us': { label: 'English', dateFnsLocale: 'enUS' }, 'es': { label: 'Español', dateFnsLocale: 'es' }, + 'et': { label: 'Eesti', dateFnsLocale: 'et' }, 'fr': { label: 'Français', dateFnsLocale: 'fr' }, 'hr': { label: 'Hrvatski', dateFnsLocale: 'hr' }, 'it': { label: 'Italiano', dateFnsLocale: 'it' }, diff --git a/client/strings/et.json b/client/strings/et.json new file mode 100644 index 00000000..f0641705 --- /dev/null +++ b/client/strings/et.json @@ -0,0 +1,768 @@ +{ + "ButtonAdd": "Lisa", + "ButtonAddChapters": "Lisa peatükid", + "ButtonAddDevice": "Lisa seade", + "ButtonAddLibrary": "Lisa raamatukogu", + "ButtonAddPodcasts": "Lisa podcastid", + "ButtonAddUser": "Lisa kasutaja", + "ButtonAddYourFirstLibrary": "Lisa oma esimene raamatukogu", + "ButtonApply": "Rakenda", + "ButtonApplyChapters": "Rakenda peatükid", + "ButtonAuthors": "Autorid", + "ButtonBrowseForFolder": "Sirvi kausta", + "ButtonCancel": "Tühista", + "ButtonCancelEncode": "Tühista kodeerimine", + "ButtonChangeRootPassword": "Muuda põhiparooli", + "ButtonCheckAndDownloadNewEpisodes": "Kontrolli ja laadi alla uued episoodid", + "ButtonChooseAFolder": "Vali kaust", + "ButtonChooseFiles": "Vali failid", + "ButtonClearFilter": "Tühista filter", + "ButtonCloseFeed": "Sulge voog", + "ButtonCollections": "Kogud", + "ButtonConfigureScanner": "Konfigureeri skanner", + "ButtonCreate": "Loo", + "ButtonCreateBackup": "Loo varundus", + "ButtonDelete": "Kustuta", + "ButtonDownloadQueue": "Järjekord", + "ButtonEdit": "Muuda", + "ButtonEditChapters": "Muuda peatükke", + "ButtonEditPodcast": "Muuda podcasti", + "ButtonForceReScan": "Sunnitud uuestiskaneerimine", + "ButtonFullPath": "Täielik asukoht", + "ButtonHide": "Peida", + "ButtonHome": "Avaleht", + "ButtonIssues": "Probleemid", + "ButtonJumpBackward": "Hüppa tagasi", + "ButtonJumpForward": "Hüppa edasi", + "ButtonLatest": "Uusim", + "ButtonLibrary": "Raamatukogu", + "ButtonLogout": "Logi välja", + "ButtonLookup": "Otsi", + "ButtonManageTracks": "Halda lugusid", + "ButtonMapChapterTitles": "Kaardista peatükkide pealkirjad", + "ButtonMatchAllAuthors": "Sobita kõik autorid", + "ButtonMatchBooks": "Sobita raamatud", + "ButtonNevermind": "Pole tähtis", + "ButtonNextChapter": "Järgmine peatükk", + "ButtonOk": "Ok", + "ButtonOpenFeed": "Ava voog", + "ButtonOpenManager": "Ava haldur", + "ButtonPause": "Peata", + "ButtonPlay": "Mängi", + "ButtonPlaying": "Mängib", + "ButtonPlaylists": "Esitusloendid", + "ButtonPreviousChapter": "Eelmine peatükk", + "ButtonPurgeAllCache": "Tühjenda kogu vahemälu", + "ButtonPurgeItemsCache": "Tühjenda esemete vahemälu", + "ButtonPurgeMediaProgress": "Tühjenda meedia edenemine", + "ButtonQueueAddItem": "Lisa järjekorda", + "ButtonQueueRemoveItem": "Eemalda järjekorrast", + "ButtonQuickMatch": "Kiire sobitamine", + "ButtonRead": "Loe", + "ButtonRemove": "Eemalda", + "ButtonRemoveAll": "Eemalda kõik", + "ButtonRemoveAllLibraryItems": "Eemalda kõik raamatukogu esemed", + "ButtonRemoveFromContinueListening": "Eemalda jätkake kuulamisest", + "ButtonRemoveFromContinueReading": "Eemalda jätkake lugemisest", + "ButtonRemoveSeriesFromContinueSeries": "Eemalda seeria jätkamisest", + "ButtonReScan": "Uuestiskaneeri", + "ButtonReset": "Lähtesta", + "ButtonResetToDefault": "Lähtesta vaikeseade", + "ButtonRestore": "Taasta", + "ButtonSave": "Salvesta", + "ButtonSaveAndClose": "Salvesta ja sulge", + "ButtonSaveTracklist": "Salvesta lugude loend", + "ButtonScan": "Skanneeri", + "ButtonScanLibrary": "Skanneeri raamatukogu", + "ButtonSearch": "Otsi", + "ButtonSelectFolderPath": "Vali kaustatee", + "ButtonSeries": "Sarjad", + "ButtonSetChaptersFromTracks": "Määra peatükid lugudest", + "ButtonShiftTimes": "Nihke ajad", + "ButtonShow": "Näita", + "ButtonStartM4BEncode": "Alusta M4B kodeerimist", + "ButtonStartMetadataEmbed": "Alusta metaandmete lisamist", + "ButtonSubmit": "Esita", + "ButtonTest": "Test", + "ButtonUpload": "Lae üles", + "ButtonUploadBackup": "Lae üles varundus", + "ButtonUploadCover": "Lae üles ümbris", + "ButtonUploadOPMLFile": "Lae üles OPML-fail", + "ButtonUserDelete": "Kustuta kasutaja {0}", + "ButtonUserEdit": "Muuda kasutajat {0}", + "ButtonViewAll": "Vaata kõiki", + "ButtonYes": "Jah", + "ErrorUploadFetchMetadataAPI": "Viga metaandmete hankimisel", + "ErrorUploadFetchMetadataNoResults": "Ei saanud metaandmeid hankida - proovi tiitlit ja/või autorit uuendada", + "ErrorUploadLacksTitle": "Peab olema pealkiri", + "HeaderAccount": "Konto", + "HeaderAdvanced": "Täpsem", + "HeaderAppriseNotificationSettings": "Apprise teavitamise seaded", + "HeaderAudiobookTools": "Heliraamatu failihaldustööriistad", + "HeaderAudioTracks": "Helirajad", + "HeaderAuthentication": "Autentimine", + "HeaderBackups": "Varukoopiad", + "HeaderChangePassword": "Muuda parooli", + "HeaderChapters": "Peatükid", + "HeaderChooseAFolder": "Vali kaust", + "HeaderCollection": "Kogu", + "HeaderCollectionItems": "Kogu esemed", + "HeaderCover": "Ümbris", + "HeaderCurrentDownloads": "Praegused allalaadimised", + "HeaderCustomMetadataProviders": "Kohandatud metaandmete pakkujad", + "HeaderDetails": "Detailid", + "HeaderDownloadQueue": "Allalaadimise järjekord", + "HeaderEbookFiles": "E-raamatute failid", + "HeaderEmail": "E-post", + "HeaderEmailSettings": "E-posti seaded", + "HeaderEpisodes": "Episoodid", + "HeaderEreaderDevices": "E-lugerite seadmed", + "HeaderEreaderSettings": "E-lugerite seadistused", + "HeaderFiles": "Failid", + "HeaderFindChapters": "Leia peatükid", + "HeaderIgnoredFiles": "Ignoreeritud failid", + "HeaderItemFiles": "Esemete failid", + "HeaderItemMetadataUtils": "Eseme metaandmete tööriistad", + "HeaderLastListeningSession": "Viimane kuulamissessioon", + "HeaderLatestEpisodes": "Viimased episoodid", + "HeaderLibraries": "Raamatukogud", + "HeaderLibraryFiles": "Raamatukogu failid", + "HeaderLibraryStats": "Raamatukogu statistika", + "HeaderListeningSessions": "Kuulamissessioonid", + "HeaderListeningStats": "Kuulamise statistika", + "HeaderLogin": "Logi sisse", + "HeaderLogs": "Logid", + "HeaderManageGenres": "Halda žanre", + "HeaderManageTags": "Halda silte", + "HeaderMapDetails": "Kaardi detailid", + "HeaderMatch": "Sobita", + "HeaderMetadataOrderOfPrecedence": "Metaandmete eelnevusjärjestus", + "HeaderMetadataToEmbed": "Manusta metaandmed", + "HeaderNewAccount": "Uus konto", + "HeaderNewLibrary": "Uus raamatukogu", + "HeaderNotifications": "Teatised", + "HeaderOpenIDConnectAuthentication": "OpenID Connect autentimine", + "HeaderOpenRSSFeed": "Ava RSS-voog", + "HeaderOtherFiles": "Muud failid", + "HeaderPasswordAuthentication": "Parooli autentimine", + "HeaderPermissions": "Õigused", + "HeaderPlayerQueue": "Mängija järjekord", + "HeaderPlaylist": "Mänguloend", + "HeaderPlaylistItems": "Mänguloendi esemed", + "HeaderPodcastsToAdd": "Lisatavad podcastid", + "HeaderPreviewCover": "Eelvaate kaas", + "HeaderRemoveEpisode": "Eemalda episood", + "HeaderRemoveEpisodes": "Eemalda {0} episoodi", + "HeaderRSSFeedGeneral": "RSS-i üksikasjad", + "HeaderRSSFeedIsOpen": "RSS-voog on avatud", + "HeaderRSSFeeds": "RSS-vooged", + "HeaderSavedMediaProgress": "Salvestatud meedia edenemine", + "HeaderSchedule": "Ajakava", + "HeaderScheduleLibraryScans": "Ajasta automaatsed raamatukogu skaneerimised", + "HeaderSession": "Sessioon", + "HeaderSetBackupSchedule": "Määra varunduse ajakava", + "HeaderSettings": "Seaded", + "HeaderSettingsDisplay": "Kuva", + "HeaderSettingsExperimental": "Katsetusfunktsioonid", + "HeaderSettingsGeneral": "Üldised", + "HeaderSettingsScanner": "Skanner", + "HeaderSleepTimer": "Uinaku taimer", + "HeaderStatsLargestItems": "Suurimad esemed", + "HeaderStatsLongestItems": "Kõige pikemad esemed (tunnid)", + "HeaderStatsMinutesListeningChart": "Kuulamise minutid (viimased 7 päeva)", + "HeaderStatsRecentSessions": "Hiljutised sessioonid", + "HeaderStatsTop10Authors": "Top 10 autorit", + "HeaderStatsTop5Genres": "Top 5 žanrit", + "HeaderTableOfContents": "Sisukord", + "HeaderTools": "Tööriistad", + "HeaderUpdateAccount": "Uuenda kontot", + "HeaderUpdateAuthor": "Uuenda autorit", + "HeaderUpdateDetails": "Uuenda detaile", + "HeaderUpdateLibrary": "Uuenda raamatukogu", + "HeaderUsers": "Kasutajad", + "HeaderYourStats": "Sinu statistika", + "LabelAbridged": "Kärbitud", + "LabelAccountType": "Konto tüüp", + "LabelAccountTypeAdmin": "Administraator", + "LabelAccountTypeGuest": "Külaline", + "LabelAccountTypeUser": "Kasutaja", + "LabelActivity": "Tegevus", + "LabelAdded": "Lisatud", + "LabelAddedAt": "Lisatud", + "LabelAddToCollection": "Lisa kogusse", + "LabelAddToCollectionBatch": "Lisa {0} raamatut kogusse", + "LabelAddToPlaylist": "Lisa mänguloendisse", + "LabelAddToPlaylistBatch": "Lisa {0} eset mänguloendisse", + "LabelAdminUsersOnly": "Ainult administraatorid", + "LabelAll": "Kõik", + "LabelAllUsers": "Kõik kasutajad", + "LabelAllUsersExcludingGuests": "Kõik kasutajad, välja arvatud külalised", + "LabelAllUsersIncludingGuests": "Kõik kasutajad, kaasa arvatud külalised", + "LabelAlreadyInYourLibrary": "Juba teie raamatukogus", + "LabelAppend": "Lisa", + "LabelAuthor": "Autor", + "LabelAuthorFirstLast": "Autor (Eesnimi Perekonnanimi)", + "LabelAuthorLastFirst": "Autor (Perekonnanimi, Eesnimi)", + "LabelAuthors": "Autorid", + "LabelAutoDownloadEpisodes": "Automaatne episoodide allalaadimine", + "LabelAutoFetchMetadata": "Automaatne metaandmete hankimine", + "LabelAutoFetchMetadataHelp": "Toob tiitli, autori ja seeria metaandmed üleslaadimise hõlbustamiseks. Lisametaandmed võivad pärast üleslaadimist vajada vastavust.", + "LabelAutoLaunch": "Automaatne käivitamine", + "LabelAutoLaunchDescription": "Suunab automaatselt autentimist pakkuvale teenusele, kui navigeeritakse sisselogimislehele (käsitsi ülekirjutuse tee /login?autoLaunch=0)", + "LabelAutoRegister": "Automaatne registreerimine", + "LabelAutoRegisterDescription": "Loo uued kasutajad automaatselt sisselogimisel", + "LabelBackToUser": "Tagasi kasutajale", + "LabelBackupLocation": "Varukoopia asukoht", + "LabelBackupsEnableAutomaticBackups": "Luba automaatsed varukoopiad", + "LabelBackupsEnableAutomaticBackupsHelp": "Varukoopiad salvestatakse /metadata/backups kausta", + "LabelBackupsMaxBackupSize": "Maksimaalne varukoopia suurus (GB-des)", + "LabelBackupsMaxBackupSizeHelp": "Kaitsena valesti seadistamise vastu ebaõnnestuvad varukoopiad, kui need ületavad seadistatud suuruse.", + "LabelBackupsNumberToKeep": "Varukoopiate arv, mida hoida", + "LabelBackupsNumberToKeepHelp": "Ühel ajal eemaldatakse ainult 1 varukoopia, seega kui teil on juba rohkem varukoopiaid kui siin määratud, peaksite need käsitsi eemaldama.", + "LabelBitrate": "Bittkiirus", + "LabelBooks": "Raamatud", + "LabelButtonText": "Nupu tekst", + "LabelChangePassword": "Muuda parooli", + "LabelChannels": "Kanalid", + "LabelChapters": "Peatükid", + "LabelChaptersFound": "peatükid leitud", + "LabelChapterTitle": "Peatüki pealkiri", + "LabelClickForMoreInfo": "Klõpsa lisateabe saamiseks", + "LabelClosePlayer": "Sulge mängija", + "LabelCodec": "Kodek", + "LabelCollapseSeries": "Ahenda seeria", + "LabelCollection": "Kogu", + "LabelCollections": "Kogud", + "LabelComplete": "Valmis", + "LabelConfirmPassword": "Kinnita parool", + "LabelContinueListening": "Jätka kuulamist", + "LabelContinueReading": "Jätka lugemist", + "LabelContinueSeries": "Jätka seeriat", + "LabelCover": "Ümbris", + "LabelCoverImageURL": "Ümbrise pildi URL", + "LabelCreatedAt": "Loodud", + "LabelCronExpression": "Croni valem", + "LabelCurrent": "Praegune", + "LabelCurrently": "Praegu:", + "LabelCustomCronExpression": "Kohandatud Croni valem:", + "LabelDatetime": "Kuupäev ja kellaaeg", + "LabelDeleteFromFileSystemCheckbox": "Kustuta failisüsteemist (ärge märkige seda ära, et eemaldada ainult andmebaasist)", + "LabelDescription": "Kirjeldus", + "LabelDeselectAll": "Tühista kõigi valimine", + "LabelDevice": "Seade", + "LabelDeviceInfo": "Seadme info", + "LabelDeviceIsAvailableTo": "Seade on saadaval kasutajale...", + "LabelDirectory": "Kataloog", + "LabelDiscFromFilename": "Ketas failinimest", + "LabelDiscFromMetadata": "Ketas metaandmetest", + "LabelDiscover": "Avasta", + "LabelDownload": "Lae alla", + "LabelDownloadNEpisodes": "Lae alla {0} episoodi", + "LabelDuration": "Kestus", + "LabelDurationFound": "Leitud kestus:", + "LabelEbook": "E-raamat", + "LabelEbooks": "E-raamatud", + "LabelEdit": "Muuda", + "LabelEmail": "E-post", + "LabelEmailSettingsFromAddress": "Saatja aadress", + "LabelEmailSettingsSecure": "Turvaline", + "LabelEmailSettingsSecureHelp": "Kui see on tõene, kasutab ühendus serveriga ühenduse loomisel TLS-i. Kui see on väär, kasutatakse TLS-i, kui server toetab STARTTLS-i laiendust. Enamikul juhtudest seadke see väärtus tõeks, kui ühendate pordile 465. Pordi 587 või 25 korral hoidke seda väär. (nodemailer.com/smtp/#authentication)", + "LabelEmailSettingsTestAddress": "Testi aadress", + "LabelEmbeddedCover": "Manustatud kaas", + "LabelEnable": "Luba", + "LabelEnd": "Lõpp", + "LabelEpisode": "Episood", + "LabelEpisodeTitle": "Episoodi pealkiri", + "LabelEpisodeType": "Episoodi tüüp", + "LabelExample": "Näide", + "LabelExplicit": "Vulgaarne", + "LabelFeedURL": "Voogu URL", + "LabelFetchingMetadata": "Metaandmete hankimine", + "LabelFile": "Fail", + "LabelFileBirthtime": "Faili sünniaeg", + "LabelFileModified": "Faili muudetud", + "LabelFilename": "Failinimi", + "LabelFilterByUser": "Filtri alusel kasutaja järgi", + "LabelFindEpisodes": "Otsi episoodid", + "LabelFinished": "Lõpetatud", + "LabelFolder": "Kaust", + "LabelFolders": "Kataloogid", + "LabelFontBold": "Paks", + "LabelFontFamily": "Fondi pere", + "LabelFontItalic": "Kaldkiri", + "LabelFontScale": "Fondi suurus", + "LabelFontStrikethrough": "Üle joonitud", + "LabelFormat": "Vorming", + "LabelGenre": "Žanr", + "LabelGenres": "Žanrid", + "LabelHardDeleteFile": "Faili lõplik kustutamine", + "LabelHasEbook": "On e-raamat", + "LabelHasSupplementaryEbook": "On täiendav e-raamat", + "LabelHighestPriority": "Kõrgeim prioriteet", + "LabelHost": "Host", + "LabelHour": "Tund", + "LabelIcon": "Ikoon", + "LabelImageURLFromTheWeb": "Pildi URL veebist", + "LabelIncludeInTracklist": "Kaasa jälgimisloendis", + "LabelIncomplete": "Puudulik", + "LabelInProgress": "Pooleli", + "LabelInterval": "Intervall", + "LabelIntervalCustomDailyWeekly": "Kohandatud päevane/nädalane", + "LabelIntervalEvery12Hours": "Iga 12 tunni tagant", + "LabelIntervalEvery15Minutes": "Iga 15 minuti tagant", + "LabelIntervalEvery2Hours": "Iga 2 tunni tagant", + "LabelIntervalEvery30Minutes": "Iga 30 minuti tagant", + "LabelIntervalEvery6Hours": "Iga 6 tunni tagant", + "LabelIntervalEveryDay": "Iga päev", + "LabelIntervalEveryHour": "Iga tunni tagant", + "LabelInvalidParts": "Vigased osad", + "LabelInvert": "Pööra ümber", + "LabelItem": "Kirje", + "LabelLanguage": "Keel", + "LabelLanguageDefaultServer": "Vaikeserveri keel", + "LabelLastBookAdded": "Viimati lisatud raamat", + "LabelLastBookUpdated": "Viimati uuendatud raamat", + "LabelLastSeen": "Viimati nähtud", + "LabelLastTime": "Viimati aeg", + "LabelLastUpdate": "Viimane uuendus", + "LabelLayout": "Paigutus", + "LabelLayoutSinglePage": "Üks lehekülg", + "LabelLayoutSplitPage": "Jagatud lehekülg", + "LabelLess": "Vähem", + "LabelLibrariesAccessibleToUser": "Kasutajale ligipääsetavad raamatukogud", + "LabelLibrary": "Raamatukogu", + "LabelLibraryItem": "Raamatukogu kirje", + "LabelLibraryName": "Raamatukogu nimi", + "LabelLimit": "Piirang", + "LabelLineSpacing": "Joonevahe", + "LabelListenAgain": "Kuula uuesti", + "LabelLogLevelDebug": "Silumine", + "LabelLogLevelInfo": "Teave", + "LabelLogLevelWarn": "Hoiatus", + "LabelLookForNewEpisodesAfterDate": "Otsi uusi episoodid pärast seda kuupäeva", + "LabelLowestPriority": "Madalaim prioriteet", + "LabelMatchExistingUsersBy": "Sobita olemasolevad kasutajad", + "LabelMatchExistingUsersByDescription": "Kasutatakse olemasolevate kasutajate ühendamiseks. Ühendatud kasutajaid sobitatakse teie SSO pakkuja unikaalse ID järgi.", + "LabelMediaPlayer": "Meediapleier", + "LabelMediaType": "Meedia tüüp", + "LabelMetadataOrderOfPrecedenceDescription": "Kõrgema prioriteediga metaandmete allikad võtavad üle madalama prioriteediga metaandmete allikad", + "LabelMetadataProvider": "Metaandmete pakkuja", + "LabelMetaTag": "Meta märge", + "LabelMetaTags": "Meta märgendid", + "LabelMinute": "Minut", + "LabelMissing": "Puudub", + "LabelMissingParts": "Puuduvad osad", + "LabelMobileRedirectURIs": "Lubatud mobiilile suunamise URI-d", + "LabelMobileRedirectURIsDescription": "See on mobiilirakenduste jaoks kehtivate suunamise URI-de lubatud nimekiri. Vaikimisi on selleks audiobookshelf://oauth, mida saate eemaldada või täiendada täiendavate URI-dega kolmanda osapoole rakenduste integreerimiseks. Tärni (*) ainukese kirjena kasutamine võimaldab mis tahes URI-d.", + "LabelMore": "Rohkem", + "LabelMoreInfo": "Rohkem infot", + "LabelName": "Nimi", + "LabelNarrator": "Jutustaja", + "LabelNarrators": "Jutustajad", + "LabelNew": "Uus", + "LabelNewestAuthors": "Uusimad autorid", + "LabelNewestEpisodes": "Uusimad episoodid", + "LabelNewPassword": "Uus parool", + "LabelNextBackupDate": "Järgmine varukoopia kuupäev", + "LabelNextScheduledRun": "Järgmine ajakava järgmine", + "LabelNoEpisodesSelected": "Episoodid pole valitud", + "LabelNotes": "Märkused", + "LabelNotFinished": "Ei ole lõpetatud", + "LabelNotificationAppriseURL": "Apprise URL-id", + "LabelNotificationAvailableVariables": "Saadaolevad muutujad", + "LabelNotificationBodyTemplate": "Keha mall", + "LabelNotificationEvent": "Teavituse sündmus", + "LabelNotificationsMaxFailedAttempts": "Maksimaalsed ebaõnnestunud katsed", + "LabelNotificationsMaxFailedAttemptsHelp": "Teatised keelatakse, kui need ebaõnnestuvad nii palju kordi", + "LabelNotificationsMaxQueueSize": "Teavituste sündmuste maksimaalne järjekorra suurus", + "LabelNotificationsMaxQueueSizeHelp": "Sündmused on piiratud 1 sekundiga. Sündmusi ignoreeritakse, kui järjekord on maksimumsuuruses. See takistab teavituste rämpsposti.", + "LabelNotificationTitleTemplate": "Pealkirja mall", + "LabelNotStarted": "Pole alustatud", + "LabelNumberOfBooks": "Raamatute arv", + "LabelNumberOfEpisodes": "Episoodide arv", + "LabelOpenRSSFeed": "Ava RSS voog", + "LabelOverwrite": "Kirjuta üle", + "LabelPassword": "Parool", + "LabelPath": "Asukoht", + "LabelPermissionsAccessAllLibraries": "Saab ligi kõikidele raamatukogudele", + "LabelPermissionsAccessAllTags": "Saab ligi kõikidele siltidele", + "LabelPermissionsAccessExplicitContent": "Saab ligi vulgaarsele sisule", + "LabelPermissionsDelete": "Saab kustutada", + "LabelPermissionsDownload": "Saab alla laadida", + "LabelPermissionsUpdate": "Saab uuendada", + "LabelPermissionsUpload": "Saab üles laadida", + "LabelPhotoPathURL": "Foto tee/URL", + "LabelPlaylists": "Mänguloendid", + "LabelPlayMethod": "Esitusmeetod", + "LabelPodcast": "Podcast", + "LabelPodcasts": "Podcastid", + "LabelPodcastSearchRegion": "Podcasti otsingu piirkond", + "LabelPodcastType": "Podcasti tüüp", + "LabelPort": "Port", + "LabelPrefixesToIgnore": "Eiramiseks eesliited (tõstutundetu)", + "LabelPreventIndexing": "Vältige oma voogu indekseerimist iTunes'i ja Google podcasti kataloogides", + "LabelPrimaryEbook": "Esmane e-raamat", + "LabelProgress": "Edenemine", + "LabelProvider": "Pakkuja", + "LabelPubDate": "Avaldamise kuupäev", + "LabelPublisher": "Kirjastaja", + "LabelPublishYear": "Aasta avaldamine", + "LabelRead": "Lugenud", + "LabelReadAgain": "Loe uuesti", + "LabelReadEbookWithoutProgress": "Lugege e-raamatut ilma edenemist säilitamata", + "LabelRecentlyAdded": "Hiljuti lisatud", + "LabelRecentSeries": "Hiljutised seeriad", + "LabelRecommended": "Soovitatud", + "LabelRedo": "Tee uuesti", + "LabelRegion": "Piirkond", + "LabelReleaseDate": "Väljalaske kuupäev", + "LabelRemoveCover": "Eemalda ümbris", + "LabelRowsPerPage": "Rida lehe kohta", + "LabelRSSFeedCustomOwnerEmail": "Kohandatud omaniku e-post", + "LabelRSSFeedCustomOwnerName": "Kohandatud omaniku nimi", + "LabelRSSFeedOpen": "Ava RSS voog", + "LabelRSSFeedPreventIndexing": "Vältige indekseerimist", + "LabelRSSFeedSlug": "RSS voog Slug", + "LabelRSSFeedURL": "RSS voog URL", + "LabelSearchTerm": "Otsingutermin", + "LabelSearchTitle": "Otsi pealkirja", + "LabelSearchTitleOrASIN": "Otsi pealkirja või ASIN-i", + "LabelSeason": "Hooaeg", + "LabelSelectAllEpisodes": "Vali kõik episoodid", + "LabelSelectEpisodesShowing": "Valige {0} näidatavat episoodi", + "LabelSelectUsers": "Valige kasutajad", + "LabelSendEbookToDevice": "Saada e-raamat seadmele...", + "LabelSequence": "Järjestus", + "LabelSeries": "Seeria", + "LabelSeriesName": "Seeria nimi", + "LabelSeriesProgress": "Seeria edenemine", + "LabelSetEbookAsPrimary": "Määra peamiseks", + "LabelSetEbookAsSupplementary": "Määra täiendavaks", + "LabelSettingsAudiobooksOnly": "Ainult heliraamatud", + "LabelSettingsAudiobooksOnlyHelp": "Selle seadistuse lubamine eirab e-raamatute faile, välja arvatud juhul, kui need on heliraamatu kaustas, kus need seatakse täiendavate e-raamatutena", + "LabelSettingsBookshelfViewHelp": "Skeumorfne kujundus puidust riiulitega", + "LabelSettingsChromecastSupport": "Chromecasti tugi", + "LabelSettingsDateFormat": "Kuupäeva vorming", + "LabelSettingsDisableWatcher": "Keela vaatamine", + "LabelSettingsDisableWatcherForLibrary": "Keela kaustavaatamine raamatukogu jaoks", + "LabelSettingsDisableWatcherHelp": "Keelab automaatse lisamise/uuendamise, kui failimuudatusi tuvastatakse. *Nõuab serveri taaskäivitamist", + "LabelSettingsEnableWatcher": "Luba vaatamine", + "LabelSettingsEnableWatcherForLibrary": "Luba kaustavaatamine raamatukogu jaoks", + "LabelSettingsEnableWatcherHelp": "Lubab automaatset lisamist/uuendamist, kui tuvastatakse failimuudatused. *Nõuab serveri taaskäivitamist", + "LabelSettingsExperimentalFeatures": "Eksperimentaalsed funktsioonid", + "LabelSettingsExperimentalFeaturesHelp": "Arengus olevad funktsioonid, mis vajavad teie tagasisidet ja abi testimisel. Klõpsake GitHubi arutelu avamiseks.", + "LabelSettingsFindCovers": "Leia ümbrised", + "LabelSettingsFindCoversHelp": "Kui teie heliraamatul pole sisseehitatud ümbrist ega ümbrise pilti kaustas, proovib skanner leida ümbrist.
Märkus: see pikendab skaneerimisaega", + "LabelSettingsHideSingleBookSeries": "Peida üksikute raamatute seeriad", + "LabelSettingsHideSingleBookSeriesHelp": "Ühe raamatuga seeriaid peidetakse seeria lehelt ja avalehe riiulitelt.", + "LabelSettingsHomePageBookshelfView": "Avaleht kasutage raamatukoguvaadet", + "LabelSettingsLibraryBookshelfView": "Raamatukogu kasutamiseks kasutage raamatukoguvaadet", + "LabelSettingsParseSubtitles": "Lugege subtiitreid", + "LabelSettingsParseSubtitlesHelp": "Eraldage subtiitrid heliraamatu kaustade nimedest.
Subtiitrid peavad olema eraldatud \" - \".
Näiteks: \"Raamatu pealkiri - Siin on alapealkiri\" alapealkiri on \"Siin on alapealkiri\"", + "LabelSettingsPreferMatchedMetadata": "Eelista sobitatud metaandmeid", + "LabelSettingsPreferMatchedMetadataHelp": "Sobitatud andmed kirjutavad Kiir Sobitamise kasutamisel üle üksikasjad.", + "LabelSettingsSkipMatchingBooksWithASIN": "Jätke ASIN-iga sobituvad raamatud vahele", + "LabelSettingsSkipMatchingBooksWithISBN": "Jätke ISBN-iga sobituvad raamatud vahele", + "LabelSettingsSortingIgnorePrefixes": "Ignoreeri eesliiteid sortimisel", + "LabelSettingsSortingIgnorePrefixesHelp": "nt. eesliidet \"the\" kasutades raamatu pealkiri \"The Book Title\" sorteeritakse \"Book Title, The\"", + "LabelSettingsSquareBookCovers": "Kasutage ruudukujulisi raamatu kaasi", + "LabelSettingsSquareBookCoversHelp": "Eelistage ruudukujulisi kaasi tavaliste 1.6:1 raamatu ümbrise asemel", + "LabelSettingsStoreCoversWithItem": "Salvesta kaaned üksusega", + "LabelSettingsStoreCoversWithItemHelp": "Vaikimisi salvestatakse kaaned /metadata/items kausta. Selle seadistuse lubamine salvestab kaaned teie raamatukogu üksuse kausta. Hoitakse ainult ühte faili nimega \"kaas\"", + "LabelSettingsStoreMetadataWithItem": "Salvesta metaandmed üksusega", + "LabelSettingsStoreMetadataWithItemHelp": "Vaikimisi salvestatakse metaandmed /metadata/items kausta. Selle seadistuse lubamine salvestab metaandmed teie raamatukogu üksuse kaustadesse", + "LabelSettingsTimeFormat": "Kellaaja vorming", + "LabelShowAll": "Näita kõiki", + "LabelSize": "Suurus", + "LabelSleepTimer": "Uinaku taimer", + "LabelSlug": "Slug", + "LabelStart": "Alusta", + "LabelStarted": "Alustatud", + "LabelStartedAt": "Alustatud", + "LabelStartTime": "Alustamise aeg", + "LabelStatsAudioTracks": "Audiojäljed", + "LabelStatsAuthors": "Autorid", + "LabelStatsBestDay": "Parim päev", + "LabelStatsDailyAverage": "Päevane keskmine", + "LabelStatsDays": "Päevad", + "LabelStatsDaysListened": "Kuulatud päevad", + "LabelStatsHours": "Tunnid", + "LabelStatsInARow": "järjest", + "LabelStatsItemsFinished": "Lõpetatud üksused", + "LabelStatsItemsInLibrary": "Üksused raamatukogus", + "LabelStatsMinutes": "minutit", + "LabelStatsMinutesListening": "Kuulamise minutid", + "LabelStatsOverallDays": "Kokku päevad", + "LabelStatsOverallHours": "Kokku tunnid", + "LabelStatsWeekListening": "Nädala kuulamine", + "LabelSubtitle": "Alapealkiri", + "LabelSupportedFileTypes": "Toetatud failitüübid", + "LabelTag": "Silt", + "LabelTags": "Sildid", + "LabelTagsAccessibleToUser": "Kasutajale kättesaadavad sildid", + "LabelTagsNotAccessibleToUser": "Kasutajale mittekättesaadavad sildid", + "LabelTasks": "Käimasolevad ülesanded", + "LabelTextEditorBulletedList": "Punktloend", + "LabelTextEditorLink": "Link", + "LabelTextEditorNumberedList": "Numberloend", + "LabelTextEditorUnlink": "Eemalda link", + "LabelTheme": "Teema", + "LabelThemeDark": "Tume", + "LabelThemeLight": "Hele", + "LabelTimeBase": "Aja alus", + "LabelTimeListened": "Kuulatud aeg", + "LabelTimeListenedToday": "Täna kuulatud aeg", + "LabelTimeRemaining": "{0} jäänud", + "LabelTimeToShift": "Nihutamiseks sekundites kuluv aeg", + "LabelTitle": "Pealkiri", + "LabelToolsEmbedMetadata": "Manusta metaandmed", + "LabelToolsEmbedMetadataDescription": "Manusta metaandmed helifailidesse, sealhulgas kaanepilt ja peatükid.", + "LabelToolsMakeM4b": "Loo M4B heliraamatu fail", + "LabelToolsMakeM4bDescription": "Loo .M4B heliraamatu fail, kuhu on manustatud metaandmed, kaanepilt ja peatükid.", + "LabelToolsSplitM4b": "Jaga M4B MP3-deks", + "LabelToolsSplitM4bDescription": "Loo MP3-d M4B-st peatükkide kaupa, kus on manustatud metaandmed, kaanepilt ja peatükid.", + "LabelTotalDuration": "Kogukestus", + "LabelTotalTimeListened": "Kogu kuulatud aeg", + "LabelTrackFromFilename": "Jälg nimest", + "LabelTrackFromMetadata": "Jälg metaandmetest", + "LabelTracks": "Jäljed", + "LabelTracksMultiTrack": "Mitmejälg", + "LabelTracksNone": "Ühtegi jälgimist", + "LabelTracksSingleTrack": "Üksikjälg", + "LabelType": "Tüüp", + "LabelUnabridged": "Täismahus", + "LabelUndo": "Võta tagasi", + "LabelUnknown": "Tundmatu", + "LabelUpdateCover": "Uuenda kaant", + "LabelUpdateCoverHelp": "Luba üle kirjutamine olemasolevate kaante jaoks valitud raamatutele, kui leitakse sobivus", + "LabelUpdatedAt": "Uuendatud", + "LabelUpdateDetails": "Uuenda üksikasju", + "LabelUpdateDetailsHelp": "Luba üle kirjutamine olemasolevate üksikasjade jaoks valitud raamatutele, kui leitakse sobivus", + "LabelUploaderDragAndDrop": "Lohista ja aseta faile või kaustu", + "LabelUploaderDropFiles": "Aseta failid", + "LabelUploaderItemFetchMetadataHelp": "Hangi automaatselt pealkiri, autor ja seeria", + "LabelUseChapterTrack": "Kasuta peatüki jälge", + "LabelUseFullTrack": "Kasuta täielikku jälge", + "LabelUser": "Kasutaja", + "LabelUsername": "Kasutajanimi", + "LabelValue": "Väärtus", + "LabelVersion": "Versioon", + "LabelViewBookmarks": "Vaata järjehoidjaid", + "LabelViewChapters": "Vaata peatükke", + "LabelViewQueue": "Vaata esitusjärjekorda", + "LabelVolume": "Heli tugevus", + "LabelWeekdaysToRun": "Päevad nädalas käivitamiseks", + "LabelYourAudiobookDuration": "Teie heliraamatu kestus", + "LabelYourBookmarks": "Teie järjehoidjad", + "LabelYourPlaylists": "Teie esitusloendid", + "LabelYourProgress": "Teie edenemine", + "MessageAddToPlayerQueue": "Lisa esitusjärjekorda", + "MessageAppriseDescription": "Selle funktsiooni kasutamiseks peate käivitama Apprise API eksemplari või API, mis töötleb samu päringuid.
Apprise API URL peaks olema täielik URL-rada teatise saatmiseks, näiteks kui teie API eksemplar töötab aadressil http://192.168.1.1:8337, siis peaksite sisestama http://192.168.1.1:8337/notify.", + "MessageBackupsDescription": "Varukoopiad hõlmavad kasutajaid, kasutajate edenemist, raamatukogu üksikasju, serveri seadeid ja kaustades /metadata/items ja /metadata/authors salvestatud pilte. Varukoopiad ei hõlma ühtegi teie raamatukogu kaustades olevat faili.", + "MessageBatchQuickMatchDescription": "Kiire sobitamine üritab lisada valitud üksustele puuduvad kaaned ja metaandmed. Luba allpool olevad valikud, et lubada Kiire sobitamine'il üle kirjutada olemasolevaid kaasi ja/või metaandmeid.", + "MessageBookshelfNoCollections": "Te pole veel ühtegi kogumit teinud", + "MessageBookshelfNoResultsForFilter": "Filtrile \"{0}: {1}\" pole tulemusi", + "MessageBookshelfNoRSSFeeds": "Ühtegi RSS-i voogu pole avatud", + "MessageBookshelfNoSeries": "Teil pole ühtegi seeriat", + "MessageChapterEndIsAfter": "Peatüki lõpp on pärast teie heliraamatu lõppu", + "MessageChapterErrorFirstNotZero": "Esimene peatükk peab algama 0-st", + "MessageChapterErrorStartGteDuration": "Vigane algusaeg peab olema väiksem kui heliraamatu kestus", + "MessageChapterErrorStartLtPrev": "Vigane algusaeg peab olema suurem või võrdne eelneva peatüki algusajaga", + "MessageChapterStartIsAfter": "Peatüki algus on pärast teie heliraamatu lõppu", + "MessageCheckingCron": "Croni kontrollimine...", + "MessageConfirmCloseFeed": "Olete kindel, et soovite selle voo sulgeda?", + "MessageConfirmDeleteBackup": "Olete kindel, et soovite varukoopia kustutada {0} kohta?", + "MessageConfirmDeleteFile": "See kustutab faili teie failisüsteemist. Olete kindel?", + "MessageConfirmDeleteLibrary": "Olete kindel, et soovite raamatukogu \"{0}\" lõplikult kustutada?", + "MessageConfirmDeleteLibraryItem": "See kustutab raamatukogu üksuse andmebaasist ja failisüsteemist. Olete kindel?", + "MessageConfirmDeleteLibraryItems": "See kustutab {0} raamatukogu üksust andmebaasist ja failisüsteemist. Olete kindel?", + "MessageConfirmDeleteSession": "Olete kindel, et soovite selle seansi kustutada?", + "MessageConfirmForceReScan": "Olete kindel, et soovite jõuga uuesti skannida?", + "MessageConfirmMarkAllEpisodesFinished": "Olete kindel, et soovite kõik episoodid lõpetatuks märkida?", + "MessageConfirmMarkAllEpisodesNotFinished": "Olete kindel, et soovite kõik episoodid mitte lõpetatuks märkida?", + "MessageConfirmMarkSeriesFinished": "Olete kindel, et soovite selle seeria kõik raamatud lõpetatuks märkida?", + "MessageConfirmMarkSeriesNotFinished": "Olete kindel, et soovite selle seeria kõik raamatud mitte lõpetatuks märkida?", + "MessageConfirmQuickEmbed": "Hoiatus! Quick Embed ei tee varukoopiaid teie helifailidest. Veenduge, et teil oleks varukoopia oma helifailidest.

Kas soovite jätkata?", + "MessageConfirmRemoveAllChapters": "Olete kindel, et soovite eemaldada kõik peatükid?", + "MessageConfirmRemoveAuthor": "Olete kindel, et soovite autori \"{0}\" eemaldada?", + "MessageConfirmRemoveCollection": "Olete kindel, et soovite kogumi \"{0}\" eemaldada?", + "MessageConfirmRemoveEpisode": "Olete kindel, et soovite episoodi \"{0}\" eemaldada?", + "MessageConfirmRemoveEpisodes": "Olete kindel, et soovite eemaldada {0} episoodi?", + "MessageConfirmRemoveListeningSessions": "Olete kindel, et soovite eemaldada {0} kuulamise sessiooni?", + "MessageConfirmRemoveNarrator": "Olete kindel, et soovite jutustaja \"{0}\" eemaldada?", + "MessageConfirmRemovePlaylist": "Olete kindel, et soovite eemaldada oma esitusloendi \"{0}\"?", + "MessageConfirmRenameGenre": "Olete kindel, et soovite žanri \"{0}\" ümber nimetada kujule \"{1}\" kõikidele üksustele?", + "MessageConfirmRenameGenreMergeNote": "Märkus: See žanr on juba olemas, nii et need ühendatakse.", + "MessageConfirmRenameGenreWarning": "Hoiatus! Sarnane žanr erineva puhvriga on juba olemas \"{0}\".", + "MessageConfirmRenameTag": "Olete kindel, et soovite silti \"{0}\" ümber nimetada kujule \"{1}\" kõikidele üksustele?", + "MessageConfirmRenameTagMergeNote": "Märkus: See silt on juba olemas, nii et need ühendatakse.", + "MessageConfirmRenameTagWarning": "Hoiatus! Sarnane silt erineva puhvriga on juba olemas \"{0}\".", + "MessageConfirmReScanLibraryItems": "Olete kindel, et soovite uuesti skannida {0} üksust?", + "MessageConfirmSendEbookToDevice": "Olete kindel, et soovite saata {0} e-raamatu \"{1}\" seadmesse \"{2}\"?", + "MessageDownloadingEpisode": "Episoodi allalaadimine", + "MessageDragFilesIntoTrackOrder": "Lohistage failid õigesse järjekorda", + "MessageEmbedFinished": "Manustamine lõpetatud!", + "MessageEpisodesQueuedForDownload": "{0} Episood(i) on allalaadimiseks järjekorras", + "MessageFeedURLWillBe": "Toite URL saab olema {0}", + "MessageFetching": "Hangitakse...", + "MessageForceReScanDescription": "skaneerib kõik failid uuesti nagu värsket skannimist. Heli faili ID3 silte, OPF faile ja tekstifaile skaneeritakse uuesti.", + "MessageImportantNotice": "Oluline märkus!", + "MessageInsertChapterBelow": "Sisesta peatükk allapoole", + "MessageItemsSelected": "{0} Valitud üksust", + "MessageItemsUpdated": "{0} Üksust on uuendatud", + "MessageJoinUsOn": "Liitu meiega", + "MessageListeningSessionsInTheLastYear": "Kuulamissessioone viimase aasta jooksul: {0}", + "MessageLoading": "Laadimine...", + "MessageLoadingFolders": "Kaustade laadimine...", + "MessageM4BFailed": "M4B ebaõnnestus!", + "MessageM4BFinished": "M4B lõpetatud!", + "MessageMapChapterTitles": "Kaarda peatükkide pealkirjad olemasolevatele heliraamatu peatükkidele, ajatempe ei muudeta", + "MessageMarkAllEpisodesFinished": "Märgi kõik episoodid lõpetatuks", + "MessageMarkAllEpisodesNotFinished": "Märgi kõik episoodid mitte lõpetatuks", + "MessageMarkAsFinished": "Märgi lõpetatuks", + "MessageMarkAsNotFinished": "Märgi mitte lõpetatuks", + "MessageMatchBooksDescription": "üritab raamatuid raamatukogus sobitada otsingupakkujast leitud raamatuga ning täita tühjad üksikasjad ja kaas. Ei üle kirjuta üksikasju.", + "MessageNoAudioTracks": "Ühtegi helijälge pole", + "MessageNoAuthors": "Ühtegi autori pole", + "MessageNoBackups": "Ühtegi varukoopia pole", + "MessageNoBookmarks": "Ühtegi järjehoidjat pole", + "MessageNoChapters": "Ühtegi peatükki pole", + "MessageNoCollections": "Ühtegi kogumit pole", + "MessageNoCoversFound": "Ühtegi kaant pole leitud", + "MessageNoDescription": "Kirjeldust pole", + "MessageNoDownloadsInProgress": "Praegu allalaadimisi pole", + "MessageNoDownloadsQueued": "Pole järjekorras allalaadimisi", + "MessageNoEpisodeMatchesFound": "Ühtegi episoodi vastet pole leitud", + "MessageNoEpisodes": "Ühtegi episoodi pole", + "MessageNoFoldersAvailable": "Ühtegi kausta pole saadaval", + "MessageNoGenres": "Ühtegi žanrit pole", + "MessageNoIssues": "Ühtegi probleemi pole", + "MessageNoItems": "Ühtegi üksust pole", + "MessageNoItemsFound": "Ühtegi üksust pole leitud", + "MessageNoListeningSessions": "Ühtegi kuulamissessiooni pole", + "MessageNoLogs": "Ühtegi logi pole", + "MessageNoMediaProgress": "Ühtegi meediaprogressi pole", + "MessageNoNotifications": "Ühtegi teavitust pole", + "MessageNoPodcastsFound": "Ühtegi podcasti pole leitud", + "MessageNoResults": "Ühtegi tulemust pole", + "MessageNoSearchResultsFor": "Otsingutulemusi pole märksõna kohta: \"{0}\"", + "MessageNoSeries": "Ühtegi seeriat pole", + "MessageNoTags": "Ühtegi silti pole", + "MessageNoTasksRunning": "Ühtegi käimasolevat ülesannet pole", + "MessageNotYetImplemented": "Pole veel ellu viidud", + "MessageNoUpdateNecessary": "Ühtegi värskendust pole vaja", + "MessageNoUpdatesWereNecessary": "Ühtegi värskendust polnud vaja", + "MessageNoUserPlaylists": "Teil pole ühtegi esitusloendit", + "MessageOr": "või", + "MessagePauseChapter": "Peata peatüki esitamine", + "MessagePlayChapter": "Kuula peatüki algust", + "MessagePlaylistCreateFromCollection": "Loo esitusloend kogumist", + "MessagePodcastHasNoRSSFeedForMatching": "Podcastil pole sobitamiseks RSS-voogu", + "MessageQuickMatchDescription": "täidab tühjad üksikasjad ja kaaned raamatukogus esimese otsingutulemusega rakendusest '{0}'. Ei üle kirjuta üksikasju, välja arvatud juhul, kui serveri sätetes on lubatud 'Eelista sobitatud metaandmeid'.", + "MessageRemoveChapter": "Eemalda peatükk", + "MessageRemoveEpisodes": "Eemalda {0} episood(i)", + "MessageRemoveFromPlayerQueue": "Eemalda esitusjärjekorrast", + "MessageRemoveUserWarning": "Olete kindel, et soovite kasutaja \"{0}\" lõplikult kustutada?", + "MessageReportBugsAndContribute": "Raporteeri vigu, palu funktsioone ja aita kaasa", + "MessageResetChaptersConfirm": "Olete kindel, et soovite peatükkide lähtestada ja tehtud muudatused tagasi võtta?", + "MessageRestoreBackupConfirm": "Olete kindel, et soovite taastada varukoopia, mis loodi", + "MessageRestoreBackupWarning": "Varukoopia taastamine kirjutab üle kogu /config ja /metadata/items & /metadata/authors kaustas oleva andmebaasi.

Varukoopiad ei muuda teie raamatukogukaustades olevaid faile. Kui olete lubanud serveri sätetel salvestada kaane kunsti ja metaandmed teie raamatukogu kaustadesse, siis neid ei varundata ega kirjutata üle.

Kõik teie serveri kasutavad kliendid värskendatakse automaatselt.", + "MessageSearchResultsFor": "Otsingutulemused märksõnale", + "MessageSelected": "{0} valitud", + "MessageServerCouldNotBeReached": "Serveriga ei saanud ühendust luua", + "MessageSetChaptersFromTracksDescription": "Määrake peatükid, kasutades iga helifaili peatükina ja peatüki pealkirjana helifaili nime", + "MessageStartPlaybackAtTime": "Alustage \"{0}\" esitamist kell {1}?", + "MessageThinking": "Mõtlen...", + "MessageUploaderItemFailed": "Üleslaadimine ebaõnnestus", + "MessageUploaderItemSuccess": "Edukalt üles laaditud!", + "MessageUploading": "Üles laadimine...", + "MessageValidCronExpression": "Kehtiv cron-väljend", + "MessageWatcherIsDisabledGlobally": "Vaatleja on ülemaailmselt keelatud serveri sätetes", + "MessageXLibraryIsEmpty": "{0} raamatukogu on tühi!", + "MessageYourAudiobookDurationIsLonger": "Teie heliraamatu kestus on pikem kui leitud kestus", + "MessageYourAudiobookDurationIsShorter": "Teie heliraamatu kestus on lühem kui leitud kestus", + "NoteChangeRootPassword": "Root kasutajal võib olla ainus kasutaja, kellel võib olla tühi parool", + "NoteChapterEditorTimes": "Märkus: Esimese peatüki algusaeg peab jääma 0:00 ja viimase peatüki algusaeg ei tohi ületada selle heliraamatu kestust.", + "NoteFolderPicker": "Märkus: juba kaardistatud kaustu ei kuvata", + "NoteRSSFeedPodcastAppsHttps": "Hoiatus: Enamik podcasti rakendusi nõuab, et RSS-voogu URL kasutaks HTTPS-i", + "NoteRSSFeedPodcastAppsPubDate": "Hoiatus: Üks või mitu teie episoodi ei sisalda publikatsioonikuupäeva. Mõned podcasti rakendused nõuavad seda.", + "NoteUploaderFoldersWithMediaFiles": "Kaustu, kus on meediat, käsitletakse eraldi raamatukogu üksustena.", + "NoteUploaderOnlyAudioFiles": "Kui laadite üles ainult helifaile, käsitletakse iga helifaili eraldi heliraamatuna.", + "NoteUploaderUnsupportedFiles": "Toetamata failid jäetakse tähelepanuta. Kausta valimisel või lohistamisel jäetakse tähelepanuta muud failid, mis pole üksuse kaustas.", + "PlaceholderNewCollection": "Uue kogumi nimi", + "PlaceholderNewFolderPath": "Uus kausta tee", + "PlaceholderNewPlaylist": "Uue esitusloendi nimi", + "PlaceholderSearch": "Otsi...", + "PlaceholderSearchEpisode": "Otsi episoodi...", + "ToastAccountUpdateFailed": "Konto värskendamine ebaõnnestus", + "ToastAccountUpdateSuccess": "Konto on värskendatud", + "ToastAuthorImageRemoveFailed": "Pildi eemaldamine ebaõnnestus", + "ToastAuthorImageRemoveSuccess": "Autori pilt on eemaldatud", + "ToastAuthorUpdateFailed": "Autori värskendamine ebaõnnestus", + "ToastAuthorUpdateMerged": "Autor liidetud", + "ToastAuthorUpdateSuccess": "Autor värskendatud", + "ToastAuthorUpdateSuccessNoImageFound": "Autor värskendatud (pilti ei leitud)", + "ToastBackupCreateFailed": "Varukoopia loomine ebaõnnestus", + "ToastBackupCreateSuccess": "Varukoopia loodud", + "ToastBackupDeleteFailed": "Varukoopia kustutamine ebaõnnestus", + "ToastBackupDeleteSuccess": "Varukoopia kustutatud", + "ToastBackupRestoreFailed": "Varukoopia taastamine ebaõnnestus", + "ToastBackupUploadFailed": "Varukoopia üles laadimine ebaõnnestus", + "ToastBackupUploadSuccess": "Varukoopia üles laaditud", + "ToastBatchUpdateFailed": "Partii värskendamine ebaõnnestus", + "ToastBatchUpdateSuccess": "Partii värskendamine õnnestus", + "ToastBookmarkCreateFailed": "Järjehoidja loomine ebaõnnestus", + "ToastBookmarkCreateSuccess": "Järjehoidja lisatud", + "ToastBookmarkRemoveFailed": "Järjehoidja eemaldamine ebaõnnestus", + "ToastBookmarkRemoveSuccess": "Järjehoidja eemaldatud", + "ToastBookmarkUpdateFailed": "Järjehoidja värskendamine ebaõnnestus", + "ToastBookmarkUpdateSuccess": "Järjehoidja värskendatud", + "ToastChaptersHaveErrors": "Peatükkidel on vigu", + "ToastChaptersMustHaveTitles": "Peatükkidel peab olema pealkiri", + "ToastCollectionItemsRemoveFailed": "Üksuse(te) eemaldamine kogumist ebaõnnestus", + "ToastCollectionItemsRemoveSuccess": "Üksus(ed) eemaldatud kogumist", + "ToastCollectionRemoveFailed": "Kogumi eemaldamine ebaõnnestus", + "ToastCollectionRemoveSuccess": "Kogum eemaldatud", + "ToastCollectionUpdateFailed": "Kogumi värskendamine ebaõnnestus", + "ToastCollectionUpdateSuccess": "Kogum värskendatud", + "ToastItemCoverUpdateFailed": "Üksuse kaane värskendamine ebaõnnestus", + "ToastItemCoverUpdateSuccess": "Üksuse kaas värskendatud", + "ToastItemDetailsUpdateFailed": "Üksuse üksikasjade värskendamine ebaõnnestus", + "ToastItemDetailsUpdateSuccess": "Üksuse üksikasjad värskendatud", + "ToastItemDetailsUpdateUnneeded": "Üksuse üksikasjade värskendamine pole vajalik", + "ToastItemMarkedAsFinishedFailed": "Märgistamine kui lõpetatud ebaõnnestus", + "ToastItemMarkedAsFinishedSuccess": "Üksus märgitud kui lõpetatud", + "ToastItemMarkedAsNotFinishedFailed": "Märgistamine kui mitte lõpetatud ebaõnnestus", + "ToastItemMarkedAsNotFinishedSuccess": "Üksus märgitud kui mitte lõpetatud", + "ToastLibraryCreateFailed": "Raamatukogu loomine ebaõnnestus", + "ToastLibraryCreateSuccess": "Raamatukogu \"{0}\" loodud", + "ToastLibraryDeleteFailed": "Raamatukogu kustutamine ebaõnnestus", + "ToastLibraryDeleteSuccess": "Raamatukogu kustutatud", + "ToastLibraryScanFailedToStart": "Skanneerimine ei käivitunud", + "ToastLibraryScanStarted": "Raamatukogu skaneerimine alustatud", + "ToastLibraryUpdateFailed": "Raamatukogu värskendamine ebaõnnestus", + "ToastLibraryUpdateSuccess": "Raamatukogu \"{0}\" värskendatud", + "ToastPlaylistCreateFailed": "Esitusloendi loomine ebaõnnestus", + "ToastPlaylistCreateSuccess": "Esitusloend loodud", + "ToastPlaylistRemoveFailed": "Esitusloendi eemaldamine ebaõnnestus", + "ToastPlaylistRemoveSuccess": "Esitusloend eemaldatud", + "ToastPlaylistUpdateFailed": "Esitusloendi värskendamine ebaõnnestus", + "ToastPlaylistUpdateSuccess": "Esitusloend värskendatud", + "ToastPodcastCreateFailed": "Podcasti loomine ebaõnnestus", + "ToastPodcastCreateSuccess": "Podcast loodud edukalt", + "ToastRemoveItemFromCollectionFailed": "Üksuse eemaldamine kogumist ebaõnnestus", + "ToastRemoveItemFromCollectionSuccess": "Üksus eemaldatud kogumist", + "ToastRSSFeedCloseFailed": "RSS-voogu sulgemine ebaõnnestus", + "ToastRSSFeedCloseSuccess": "RSS-voog suletud", + "ToastSendEbookToDeviceFailed": "E-raamatu saatmine seadmesse ebaõnnestus", + "ToastSendEbookToDeviceSuccess": "E-raamat saadetud seadmesse \"{0}\"", + "ToastSeriesUpdateFailed": "Sarja värskendamine ebaõnnestus", + "ToastSeriesUpdateSuccess": "Sarja värskendamine õnnestus", + "ToastSessionDeleteFailed": "Seansi kustutamine ebaõnnestus", + "ToastSessionDeleteSuccess": "Sessioon kustutatud", + "ToastSocketConnected": "Pesa ühendatud", + "ToastSocketDisconnected": "Pesa ühendus katkenud", + "ToastSocketFailedToConnect": "Pesa ühendamine ebaõnnestus", + "ToastUserDeleteFailed": "Kasutaja kustutamine ebaõnnestus", + "ToastUserDeleteSuccess": "Kasutaja kustutatud" +} \ No newline at end of file From def2b6425ba82a7dd50613431fdaa14e7555130e Mon Sep 17 00:00:00 2001 From: advplyr Date: Thu, 22 Feb 2024 16:30:41 -0600 Subject: [PATCH 63/81] Update:Username and password inputs on login page trim whitespace #2628 --- client/pages/login.vue | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/client/pages/login.vue b/client/pages/login.vue index c7efa0d0..9b7758d8 100644 --- a/client/pages/login.vue +++ b/client/pages/login.vue @@ -10,9 +10,9 @@

Create Root User

- - - + + +

Directory Paths

@@ -34,10 +34,10 @@ - + - +
{{ processing ? 'Checking...' : $strings.ButtonSubmit }}
From 608b25de45e9a02836326686aa85b4fea08228b6 Mon Sep 17 00:00:00 2001 From: advplyr Date: Fri, 23 Feb 2024 16:59:46 -0600 Subject: [PATCH 64/81] Map en-us translations --- client/strings/cs.json | 9 +++++++++ client/strings/da.json | 9 +++++++++ client/strings/de.json | 4 +++- client/strings/en-us.json | 2 ++ client/strings/es.json | 9 +++++++++ client/strings/et.json | 9 +++++++++ client/strings/fr.json | 9 +++++++++ client/strings/gu.json | 9 +++++++++ client/strings/hi.json | 9 +++++++++ client/strings/hr.json | 9 +++++++++ client/strings/hu.json | 9 +++++++++ client/strings/it.json | 11 ++++++++++- client/strings/lt.json | 9 +++++++++ client/strings/nl.json | 9 +++++++++ client/strings/no.json | 9 +++++++++ client/strings/pl.json | 9 +++++++++ client/strings/pt-br.json | 11 ++++++++++- client/strings/ru.json | 9 +++++++++ client/strings/sv.json | 9 +++++++++ client/strings/zh-cn.json | 9 +++++++++ 20 files changed, 169 insertions(+), 3 deletions(-) diff --git a/client/strings/cs.json b/client/strings/cs.json index 3ab713ef..3134d60d 100644 --- a/client/strings/cs.json +++ b/client/strings/cs.json @@ -43,6 +43,7 @@ "ButtonMatchAllAuthors": "Spárovat všechny autory", "ButtonMatchBooks": "Spárovat Knihy", "ButtonNevermind": "Nevadí", + "ButtonNext": "Next", "ButtonNextChapter": "Next Chapter", "ButtonOk": "Ok", "ButtonOpenFeed": "Otevřít kanál", @@ -51,6 +52,7 @@ "ButtonPlay": "Přehrát", "ButtonPlaying": "Hraje", "ButtonPlaylists": "Seznamy skladeb", + "ButtonPrevious": "Previous", "ButtonPreviousChapter": "Previous Chapter", "ButtonPurgeAllCache": "Vyčistit veškerou mezipaměť", "ButtonPurgeItemsCache": "Vyčistit mezipaměť položek", @@ -59,6 +61,7 @@ "ButtonQueueRemoveItem": "Odstranit z fronty", "ButtonQuickMatch": "Rychlé přiřazení", "ButtonRead": "Číst", + "ButtonRefresh": "Refresh", "ButtonRemove": "Odstranit", "ButtonRemoveAll": "Odstranit vše", "ButtonRemoveAllLibraryItems": "Odstranit všechny položky knihovny", @@ -78,6 +81,7 @@ "ButtonSelectFolderPath": "Vybrat cestu ke složce", "ButtonSeries": "Série", "ButtonSetChaptersFromTracks": "Nastavit kapitoly ze stop", + "ButtonShare": "Share", "ButtonShiftTimes": "Časy posunu", "ButtonShow": "Zobrazit", "ButtonStartM4BEncode": "Spustit kódování M4B", @@ -180,6 +184,7 @@ "HeaderUpdateDetails": "Aktualizovat podrobnosti", "HeaderUpdateLibrary": "Aktualizovat knihovnu", "HeaderUsers": "Uživatelé", + "HeaderYearReview": "Year {0} in Review", "HeaderYourStats": "Vaše statistiky", "LabelAbridged": "Zkráceno", "LabelAccountType": "Typ účtu", @@ -391,6 +396,7 @@ "LabelPermissionsDownload": "Může stahovat", "LabelPermissionsUpdate": "Může aktualizovat", "LabelPermissionsUpload": "Může nahrávat", + "LabelPersonalYearReview": "Your Year in Review ({0})", "LabelPhotoPathURL": "Cesta k fotografii/URL", "LabelPlaylists": "Seznamy skladeb", "LabelPlayMethod": "Metoda přehrávání", @@ -436,6 +442,7 @@ "LabelSeries": "Série", "LabelSeriesName": "Název série", "LabelSeriesProgress": "Průběh série", + "LabelServerYearReview": "Server Year in Review ({0})", "LabelSetEbookAsPrimary": "Nastavit jako primární", "LabelSetEbookAsSupplementary": "Nastavit jako doplňkové", "LabelSettingsAudiobooksOnly": "Pouze audioknihy", @@ -552,6 +559,8 @@ "LabelViewQueue": "Zobrazit frontu přehrávače", "LabelVolume": "Hlasitost", "LabelWeekdaysToRun": "Dny v týdnu ke spuštění", + "LabelYearReviewHide": "Hide Year in Review", + "LabelYearReviewShow": "See Year in Review", "LabelYourAudiobookDuration": "Doba trvání vaší audioknihy", "LabelYourBookmarks": "Vaše záložky", "LabelYourPlaylists": "Vaše seznamy přehrávání", diff --git a/client/strings/da.json b/client/strings/da.json index d456cd51..f79f19b1 100644 --- a/client/strings/da.json +++ b/client/strings/da.json @@ -43,6 +43,7 @@ "ButtonMatchAllAuthors": "Match alle forfattere", "ButtonMatchBooks": "Match bøger", "ButtonNevermind": "Glem det", + "ButtonNext": "Next", "ButtonNextChapter": "Next Chapter", "ButtonOk": "OK", "ButtonOpenFeed": "Åbn feed", @@ -51,6 +52,7 @@ "ButtonPlay": "Afspil", "ButtonPlaying": "Afspiller", "ButtonPlaylists": "Afspilningslister", + "ButtonPrevious": "Previous", "ButtonPreviousChapter": "Previous Chapter", "ButtonPurgeAllCache": "Ryd al cache", "ButtonPurgeItemsCache": "Ryd elementcache", @@ -59,6 +61,7 @@ "ButtonQueueRemoveItem": "Fjern fra kø", "ButtonQuickMatch": "Hurtig Match", "ButtonRead": "Læs", + "ButtonRefresh": "Refresh", "ButtonRemove": "Fjern", "ButtonRemoveAll": "Fjern Alle", "ButtonRemoveAllLibraryItems": "Fjern Alle Bibliotekselementer", @@ -78,6 +81,7 @@ "ButtonSelectFolderPath": "Vælg Mappen Sti", "ButtonSeries": "Serie", "ButtonSetChaptersFromTracks": "Sæt kapitler fra spor", + "ButtonShare": "Share", "ButtonShiftTimes": "Skift Tider", "ButtonShow": "Vis", "ButtonStartM4BEncode": "Start M4B Kode", @@ -180,6 +184,7 @@ "HeaderUpdateDetails": "Opdater Detaljer", "HeaderUpdateLibrary": "Opdater Bibliotek", "HeaderUsers": "Brugere", + "HeaderYearReview": "Year {0} in Review", "HeaderYourStats": "Dine Statistikker", "LabelAbridged": "Abridged", "LabelAccountType": "Kontotype", @@ -391,6 +396,7 @@ "LabelPermissionsDownload": "Kan downloade", "LabelPermissionsUpdate": "Kan opdatere", "LabelPermissionsUpload": "Kan uploade", + "LabelPersonalYearReview": "Your Year in Review ({0})", "LabelPhotoPathURL": "Foto sti/URL", "LabelPlaylists": "Afspilningslister", "LabelPlayMethod": "Afspilningsmetode", @@ -436,6 +442,7 @@ "LabelSeries": "Serie", "LabelSeriesName": "Serienavn", "LabelSeriesProgress": "Seriefremskridt", + "LabelServerYearReview": "Server Year in Review ({0})", "LabelSetEbookAsPrimary": "Indstil som primær", "LabelSetEbookAsSupplementary": "Indstil som supplerende", "LabelSettingsAudiobooksOnly": "Kun lydbøger", @@ -552,6 +559,8 @@ "LabelViewQueue": "Se afspilningskø", "LabelVolume": "Volumen", "LabelWeekdaysToRun": "Ugedage til kørsel", + "LabelYearReviewHide": "Hide Year in Review", + "LabelYearReviewShow": "See Year in Review", "LabelYourAudiobookDuration": "Din lydbogsvarighed", "LabelYourBookmarks": "Dine bogmærker", "LabelYourPlaylists": "Dine spillelister", diff --git a/client/strings/de.json b/client/strings/de.json index 546631f3..46467734 100644 --- a/client/strings/de.json +++ b/client/strings/de.json @@ -43,6 +43,7 @@ "ButtonMatchAllAuthors": "Online Metadaten-Abgleich (alle Autoren)", "ButtonMatchBooks": "Online Metadaten-Abgleich (alle Medien)", "ButtonNevermind": "Abbrechen", + "ButtonNext": "Next", "ButtonNextChapter": "Nächstes Kapitel", "ButtonOk": "Ok", "ButtonOpenFeed": "Feed öffnen", @@ -51,6 +52,7 @@ "ButtonPlay": "Abspielen", "ButtonPlaying": "Spielt", "ButtonPlaylists": "Wiedergabelisten", + "ButtonPrevious": "Previous", "ButtonPreviousChapter": "Vorheriges Kapitel", "ButtonPurgeAllCache": "Cache leeren", "ButtonPurgeItemsCache": "Lösche Medien-Cache", @@ -772,4 +774,4 @@ "ToastSocketFailedToConnect": "Verbindung zum WebSocket fehlgeschlagen", "ToastUserDeleteFailed": "Benutzer konnte nicht gelöscht werden", "ToastUserDeleteSuccess": "Benutzer gelöscht" -} +} \ No newline at end of file diff --git a/client/strings/en-us.json b/client/strings/en-us.json index faa8cdcc..b8860ffa 100644 --- a/client/strings/en-us.json +++ b/client/strings/en-us.json @@ -43,6 +43,7 @@ "ButtonMatchAllAuthors": "Match All Authors", "ButtonMatchBooks": "Match Books", "ButtonNevermind": "Nevermind", + "ButtonNext": "Next", "ButtonNextChapter": "Next Chapter", "ButtonOk": "Ok", "ButtonOpenFeed": "Open Feed", @@ -51,6 +52,7 @@ "ButtonPlay": "Play", "ButtonPlaying": "Playing", "ButtonPlaylists": "Playlists", + "ButtonPrevious": "Previous", "ButtonPreviousChapter": "Previous Chapter", "ButtonPurgeAllCache": "Purge All Cache", "ButtonPurgeItemsCache": "Purge Items Cache", diff --git a/client/strings/es.json b/client/strings/es.json index 4b85106c..75052413 100644 --- a/client/strings/es.json +++ b/client/strings/es.json @@ -43,6 +43,7 @@ "ButtonMatchAllAuthors": "Encontrar Todos los Autores", "ButtonMatchBooks": "Encontrar Libros", "ButtonNevermind": "Olvidar", + "ButtonNext": "Next", "ButtonNextChapter": "Siguiente Capítulo", "ButtonOk": "Ok", "ButtonOpenFeed": "Abrir Fuente", @@ -51,6 +52,7 @@ "ButtonPlay": "Reproducir", "ButtonPlaying": "Reproduciendo", "ButtonPlaylists": "Listas de Reproducción", + "ButtonPrevious": "Previous", "ButtonPreviousChapter": "Capítulo Anterior", "ButtonPurgeAllCache": "Purgar Todo el Cache", "ButtonPurgeItemsCache": "Purgar Elementos de Cache", @@ -59,6 +61,7 @@ "ButtonQueueRemoveItem": "Remover de la Fila", "ButtonQuickMatch": "Encontrar Rápido", "ButtonRead": "Leer", + "ButtonRefresh": "Refresh", "ButtonRemove": "Remover", "ButtonRemoveAll": "Remover Todos", "ButtonRemoveAllLibraryItems": "Remover Todos los Elementos de la Biblioteca", @@ -78,6 +81,7 @@ "ButtonSelectFolderPath": "Seleccionar Ruta de Carpeta", "ButtonSeries": "Series", "ButtonSetChaptersFromTracks": "Seleccionar Capítulos Según las Pistas", + "ButtonShare": "Share", "ButtonShiftTimes": "Desplazar Tiempos", "ButtonShow": "Mostrar", "ButtonStartM4BEncode": "Iniciar Codificación M4B", @@ -180,6 +184,7 @@ "HeaderUpdateDetails": "Actualizar Detalles", "HeaderUpdateLibrary": "Actualizar Biblioteca", "HeaderUsers": "Usuarios", + "HeaderYearReview": "Year {0} in Review", "HeaderYourStats": "Tus Estadísticas", "LabelAbridged": "Abreviado", "LabelAccountType": "Tipo de Cuenta", @@ -391,6 +396,7 @@ "LabelPermissionsDownload": "Puede Descargar", "LabelPermissionsUpdate": "Puede Actualizar", "LabelPermissionsUpload": "Puede Subir", + "LabelPersonalYearReview": "Your Year in Review ({0})", "LabelPhotoPathURL": "Ruta de Acceso/URL de Foto", "LabelPlaylists": "Lista de Reproducción", "LabelPlayMethod": "Método de Reproducción", @@ -436,6 +442,7 @@ "LabelSeries": "Series", "LabelSeriesName": "Nombre de la Serie", "LabelSeriesProgress": "Progreso de la Serie", + "LabelServerYearReview": "Server Year in Review ({0})", "LabelSetEbookAsPrimary": "Establecer como primario", "LabelSetEbookAsSupplementary": "Establecer como suplementario", "LabelSettingsAudiobooksOnly": "Sólo Audiolibros", @@ -552,6 +559,8 @@ "LabelViewQueue": "Ver Fila del Reproductor", "LabelVolume": "Volumen", "LabelWeekdaysToRun": "Correr en Días de la Semana", + "LabelYearReviewHide": "Hide Year in Review", + "LabelYearReviewShow": "See Year in Review", "LabelYourAudiobookDuration": "Duración de tu Audiolibro", "LabelYourBookmarks": "Tus Marcadores", "LabelYourPlaylists": "Tus Listas", diff --git a/client/strings/et.json b/client/strings/et.json index f0641705..07f9eef0 100644 --- a/client/strings/et.json +++ b/client/strings/et.json @@ -43,6 +43,7 @@ "ButtonMatchAllAuthors": "Sobita kõik autorid", "ButtonMatchBooks": "Sobita raamatud", "ButtonNevermind": "Pole tähtis", + "ButtonNext": "Next", "ButtonNextChapter": "Järgmine peatükk", "ButtonOk": "Ok", "ButtonOpenFeed": "Ava voog", @@ -51,6 +52,7 @@ "ButtonPlay": "Mängi", "ButtonPlaying": "Mängib", "ButtonPlaylists": "Esitusloendid", + "ButtonPrevious": "Previous", "ButtonPreviousChapter": "Eelmine peatükk", "ButtonPurgeAllCache": "Tühjenda kogu vahemälu", "ButtonPurgeItemsCache": "Tühjenda esemete vahemälu", @@ -59,6 +61,7 @@ "ButtonQueueRemoveItem": "Eemalda järjekorrast", "ButtonQuickMatch": "Kiire sobitamine", "ButtonRead": "Loe", + "ButtonRefresh": "Refresh", "ButtonRemove": "Eemalda", "ButtonRemoveAll": "Eemalda kõik", "ButtonRemoveAllLibraryItems": "Eemalda kõik raamatukogu esemed", @@ -78,6 +81,7 @@ "ButtonSelectFolderPath": "Vali kaustatee", "ButtonSeries": "Sarjad", "ButtonSetChaptersFromTracks": "Määra peatükid lugudest", + "ButtonShare": "Share", "ButtonShiftTimes": "Nihke ajad", "ButtonShow": "Näita", "ButtonStartM4BEncode": "Alusta M4B kodeerimist", @@ -180,6 +184,7 @@ "HeaderUpdateDetails": "Uuenda detaile", "HeaderUpdateLibrary": "Uuenda raamatukogu", "HeaderUsers": "Kasutajad", + "HeaderYearReview": "Year {0} in Review", "HeaderYourStats": "Sinu statistika", "LabelAbridged": "Kärbitud", "LabelAccountType": "Konto tüüp", @@ -391,6 +396,7 @@ "LabelPermissionsDownload": "Saab alla laadida", "LabelPermissionsUpdate": "Saab uuendada", "LabelPermissionsUpload": "Saab üles laadida", + "LabelPersonalYearReview": "Your Year in Review ({0})", "LabelPhotoPathURL": "Foto tee/URL", "LabelPlaylists": "Mänguloendid", "LabelPlayMethod": "Esitusmeetod", @@ -436,6 +442,7 @@ "LabelSeries": "Seeria", "LabelSeriesName": "Seeria nimi", "LabelSeriesProgress": "Seeria edenemine", + "LabelServerYearReview": "Server Year in Review ({0})", "LabelSetEbookAsPrimary": "Määra peamiseks", "LabelSetEbookAsSupplementary": "Määra täiendavaks", "LabelSettingsAudiobooksOnly": "Ainult heliraamatud", @@ -552,6 +559,8 @@ "LabelViewQueue": "Vaata esitusjärjekorda", "LabelVolume": "Heli tugevus", "LabelWeekdaysToRun": "Päevad nädalas käivitamiseks", + "LabelYearReviewHide": "Hide Year in Review", + "LabelYearReviewShow": "See Year in Review", "LabelYourAudiobookDuration": "Teie heliraamatu kestus", "LabelYourBookmarks": "Teie järjehoidjad", "LabelYourPlaylists": "Teie esitusloendid", diff --git a/client/strings/fr.json b/client/strings/fr.json index 3f04fab8..bbf38e18 100644 --- a/client/strings/fr.json +++ b/client/strings/fr.json @@ -43,6 +43,7 @@ "ButtonMatchAllAuthors": "Chercher tous les auteurs", "ButtonMatchBooks": "Chercher les livres", "ButtonNevermind": "Non merci", + "ButtonNext": "Next", "ButtonNextChapter": "Next Chapter", "ButtonOk": "Ok", "ButtonOpenFeed": "Ouvrir le flux", @@ -51,6 +52,7 @@ "ButtonPlay": "Écouter", "ButtonPlaying": "En lecture", "ButtonPlaylists": "Listes de lecture", + "ButtonPrevious": "Previous", "ButtonPreviousChapter": "Previous Chapter", "ButtonPurgeAllCache": "Purger le cache", "ButtonPurgeItemsCache": "Purger le cache des articles", @@ -59,6 +61,7 @@ "ButtonQueueRemoveItem": "Supprimer de la liste de lecture", "ButtonQuickMatch": "Recherche rapide", "ButtonRead": "Lire", + "ButtonRefresh": "Refresh", "ButtonRemove": "Supprimer", "ButtonRemoveAll": "Supprimer tout", "ButtonRemoveAllLibraryItems": "Supprimer tous les articles de la bibliothèque", @@ -78,6 +81,7 @@ "ButtonSelectFolderPath": "Sélectionner le chemin du dossier", "ButtonSeries": "Séries", "ButtonSetChaptersFromTracks": "Positionner les chapitres par rapports aux pistes", + "ButtonShare": "Share", "ButtonShiftTimes": "Décaler l’horodatage du livre", "ButtonShow": "Afficher", "ButtonStartM4BEncode": "Démarrer l’encodage M4B", @@ -180,6 +184,7 @@ "HeaderUpdateDetails": "Mettre à jour les détails", "HeaderUpdateLibrary": "Mettre à jour la bibliothèque", "HeaderUsers": "Utilisateurs", + "HeaderYearReview": "Year {0} in Review", "HeaderYourStats": "Vos statistiques", "LabelAbridged": "Version courte", "LabelAccountType": "Type de compte", @@ -391,6 +396,7 @@ "LabelPermissionsDownload": "Peut télécharger", "LabelPermissionsUpdate": "Peut mettre à jour", "LabelPermissionsUpload": "Peut téléverser", + "LabelPersonalYearReview": "Your Year in Review ({0})", "LabelPhotoPathURL": "Chemin / URL des photos", "LabelPlaylists": "Listes de lecture", "LabelPlayMethod": "Méthode d’écoute", @@ -436,6 +442,7 @@ "LabelSeries": "Séries", "LabelSeriesName": "Nom de la série", "LabelSeriesProgress": "Progression de séries", + "LabelServerYearReview": "Server Year in Review ({0})", "LabelSetEbookAsPrimary": "Définir comme principale", "LabelSetEbookAsSupplementary": "Définir comme supplémentaire", "LabelSettingsAudiobooksOnly": "Livres audios seulement", @@ -552,6 +559,8 @@ "LabelViewQueue": "Afficher la liste de lecture", "LabelVolume": "Volume", "LabelWeekdaysToRun": "Jours de la semaine à exécuter", + "LabelYearReviewHide": "Hide Year in Review", + "LabelYearReviewShow": "See Year in Review", "LabelYourAudiobookDuration": "Durée de vos livres audios", "LabelYourBookmarks": "Vos signets", "LabelYourPlaylists": "Vos listes de lecture", diff --git a/client/strings/gu.json b/client/strings/gu.json index daa923db..2f3d9cd8 100644 --- a/client/strings/gu.json +++ b/client/strings/gu.json @@ -43,6 +43,7 @@ "ButtonMatchAllAuthors": "બધા મેળ ખાતા લેખકો શોધો", "ButtonMatchBooks": "મેળ ખાતી પુસ્તકો શોધો", "ButtonNevermind": "કંઈ વાંધો નહીં", + "ButtonNext": "Next", "ButtonNextChapter": "Next Chapter", "ButtonOk": "ઓકે", "ButtonOpenFeed": "ફીડ ખોલો", @@ -51,6 +52,7 @@ "ButtonPlay": "ચલાવો", "ButtonPlaying": "ચલાવી રહ્યું છે", "ButtonPlaylists": "પ્લેલિસ્ટ", + "ButtonPrevious": "Previous", "ButtonPreviousChapter": "Previous Chapter", "ButtonPurgeAllCache": "બધો Cache કાઢી નાખો", "ButtonPurgeItemsCache": "વસ્તુઓનો Cache કાઢી નાખો", @@ -59,6 +61,7 @@ "ButtonQueueRemoveItem": "કતારથી કાઢી નાખો", "ButtonQuickMatch": "ઝડપી મેળ ખવડાવો", "ButtonRead": "વાંચો", + "ButtonRefresh": "Refresh", "ButtonRemove": "કાઢી નાખો", "ButtonRemoveAll": "બધું કાઢી નાખો", "ButtonRemoveAllLibraryItems": "બધું પુસ્તકાલય વસ્તુઓ કાઢી નાખો", @@ -78,6 +81,7 @@ "ButtonSelectFolderPath": "ફોલ્ડર પથ પસંદ કરો", "ButtonSeries": "સિરીઝ", "ButtonSetChaptersFromTracks": "ટ્રેક્સથી પ્રકરણો સેટ કરો", + "ButtonShare": "Share", "ButtonShiftTimes": "સમય શિફ્ટ કરો", "ButtonShow": "બતાવો", "ButtonStartM4BEncode": "M4B એન્કોડ શરૂ કરો", @@ -180,6 +184,7 @@ "HeaderUpdateDetails": "Update Details", "HeaderUpdateLibrary": "Update Library", "HeaderUsers": "Users", + "HeaderYearReview": "Year {0} in Review", "HeaderYourStats": "Your Stats", "LabelAbridged": "Abridged", "LabelAccountType": "Account Type", @@ -391,6 +396,7 @@ "LabelPermissionsDownload": "Can Download", "LabelPermissionsUpdate": "Can Update", "LabelPermissionsUpload": "Can Upload", + "LabelPersonalYearReview": "Your Year in Review ({0})", "LabelPhotoPathURL": "Photo Path/URL", "LabelPlaylists": "Playlists", "LabelPlayMethod": "Play Method", @@ -436,6 +442,7 @@ "LabelSeries": "Series", "LabelSeriesName": "Series Name", "LabelSeriesProgress": "Series Progress", + "LabelServerYearReview": "Server Year in Review ({0})", "LabelSetEbookAsPrimary": "Set as primary", "LabelSetEbookAsSupplementary": "Set as supplementary", "LabelSettingsAudiobooksOnly": "Audiobooks only", @@ -552,6 +559,8 @@ "LabelViewQueue": "View player queue", "LabelVolume": "Volume", "LabelWeekdaysToRun": "Weekdays to run", + "LabelYearReviewHide": "Hide Year in Review", + "LabelYearReviewShow": "See Year in Review", "LabelYourAudiobookDuration": "Your audiobook duration", "LabelYourBookmarks": "Your Bookmarks", "LabelYourPlaylists": "Your Playlists", diff --git a/client/strings/hi.json b/client/strings/hi.json index a59b43ec..01667b59 100644 --- a/client/strings/hi.json +++ b/client/strings/hi.json @@ -43,6 +43,7 @@ "ButtonMatchAllAuthors": "सभी लेखकों को तलाश करें", "ButtonMatchBooks": "संबंधित पुस्तकों का मिलान करें", "ButtonNevermind": "कोई बात नहीं", + "ButtonNext": "Next", "ButtonNextChapter": "Next Chapter", "ButtonOk": "ठीक है", "ButtonOpenFeed": "फ़ीड खोलें", @@ -51,6 +52,7 @@ "ButtonPlay": "चलाएँ", "ButtonPlaying": "चल रही है", "ButtonPlaylists": "प्लेलिस्ट्स", + "ButtonPrevious": "Previous", "ButtonPreviousChapter": "Previous Chapter", "ButtonPurgeAllCache": "सभी Cache मिटाएं", "ButtonPurgeItemsCache": "आइटम Cache मिटाएं", @@ -59,6 +61,7 @@ "ButtonQueueRemoveItem": "कतार से हटाएं", "ButtonQuickMatch": "जल्दी से समानता की तलाश करें", "ButtonRead": "पढ़ लिया", + "ButtonRefresh": "Refresh", "ButtonRemove": "हटाएं", "ButtonRemoveAll": "सभी हटाएं", "ButtonRemoveAllLibraryItems": "पुस्तकालय की सभी आइटम हटाएं", @@ -78,6 +81,7 @@ "ButtonSelectFolderPath": "फ़ोल्डर का पथ चुनें", "ButtonSeries": "सीरीज", "ButtonSetChaptersFromTracks": "ट्रैक्स से अध्याय बनाएं", + "ButtonShare": "Share", "ButtonShiftTimes": "समय खिसकाए", "ButtonShow": "दिखाएं", "ButtonStartM4BEncode": "M4B एन्कोडिंग शुरू करें", @@ -180,6 +184,7 @@ "HeaderUpdateDetails": "Update Details", "HeaderUpdateLibrary": "Update Library", "HeaderUsers": "Users", + "HeaderYearReview": "Year {0} in Review", "HeaderYourStats": "Your Stats", "LabelAbridged": "Abridged", "LabelAccountType": "Account Type", @@ -391,6 +396,7 @@ "LabelPermissionsDownload": "Can Download", "LabelPermissionsUpdate": "Can Update", "LabelPermissionsUpload": "Can Upload", + "LabelPersonalYearReview": "Your Year in Review ({0})", "LabelPhotoPathURL": "Photo Path/URL", "LabelPlaylists": "Playlists", "LabelPlayMethod": "Play Method", @@ -436,6 +442,7 @@ "LabelSeries": "Series", "LabelSeriesName": "Series Name", "LabelSeriesProgress": "Series Progress", + "LabelServerYearReview": "Server Year in Review ({0})", "LabelSetEbookAsPrimary": "Set as primary", "LabelSetEbookAsSupplementary": "Set as supplementary", "LabelSettingsAudiobooksOnly": "Audiobooks only", @@ -552,6 +559,8 @@ "LabelViewQueue": "View player queue", "LabelVolume": "Volume", "LabelWeekdaysToRun": "Weekdays to run", + "LabelYearReviewHide": "Hide Year in Review", + "LabelYearReviewShow": "See Year in Review", "LabelYourAudiobookDuration": "Your audiobook duration", "LabelYourBookmarks": "Your Bookmarks", "LabelYourPlaylists": "Your Playlists", diff --git a/client/strings/hr.json b/client/strings/hr.json index 6e105ca2..8aa933c7 100644 --- a/client/strings/hr.json +++ b/client/strings/hr.json @@ -43,6 +43,7 @@ "ButtonMatchAllAuthors": "Matchaj sve autore", "ButtonMatchBooks": "Matchaj knjige", "ButtonNevermind": "Nije bitno", + "ButtonNext": "Next", "ButtonNextChapter": "Next Chapter", "ButtonOk": "Ok", "ButtonOpenFeed": "Otvori feed", @@ -51,6 +52,7 @@ "ButtonPlay": "Pokreni", "ButtonPlaying": "Playing", "ButtonPlaylists": "Playlists", + "ButtonPrevious": "Previous", "ButtonPreviousChapter": "Previous Chapter", "ButtonPurgeAllCache": "Isprazni sav cache", "ButtonPurgeItemsCache": "Isprazni Items Cache", @@ -59,6 +61,7 @@ "ButtonQueueRemoveItem": "Remove from queue", "ButtonQuickMatch": "Brzi match", "ButtonRead": "Pročitaj", + "ButtonRefresh": "Refresh", "ButtonRemove": "Ukloni", "ButtonRemoveAll": "Ukloni sve", "ButtonRemoveAllLibraryItems": "Ukloni sve stvari iz biblioteke", @@ -78,6 +81,7 @@ "ButtonSelectFolderPath": "Odaberi putanju do folder", "ButtonSeries": "Serije", "ButtonSetChaptersFromTracks": "Set chapters from tracks", + "ButtonShare": "Share", "ButtonShiftTimes": "Pomakni vremena", "ButtonShow": "Prikaži", "ButtonStartM4BEncode": "Pokreni M4B kodiranje", @@ -180,6 +184,7 @@ "HeaderUpdateDetails": "Aktualiziraj detalje", "HeaderUpdateLibrary": "Aktualiziraj biblioteku", "HeaderUsers": "Korinici", + "HeaderYearReview": "Year {0} in Review", "HeaderYourStats": "Tvoja statistika", "LabelAbridged": "Abridged", "LabelAccountType": "Vrsta korisničkog računa", @@ -391,6 +396,7 @@ "LabelPermissionsDownload": "Smije preuzimati", "LabelPermissionsUpdate": "Smije aktualizirati", "LabelPermissionsUpload": "Smije uploadati", + "LabelPersonalYearReview": "Your Year in Review ({0})", "LabelPhotoPathURL": "Slika putanja/URL", "LabelPlaylists": "Playlists", "LabelPlayMethod": "Vrsta reprodukcije", @@ -436,6 +442,7 @@ "LabelSeries": "Serije", "LabelSeriesName": "Ime serije", "LabelSeriesProgress": "Series Progress", + "LabelServerYearReview": "Server Year in Review ({0})", "LabelSetEbookAsPrimary": "Set as primary", "LabelSetEbookAsSupplementary": "Set as supplementary", "LabelSettingsAudiobooksOnly": "Audiobooks only", @@ -552,6 +559,8 @@ "LabelViewQueue": "View player queue", "LabelVolume": "Volume", "LabelWeekdaysToRun": "Radnih dana da radi", + "LabelYearReviewHide": "Hide Year in Review", + "LabelYearReviewShow": "See Year in Review", "LabelYourAudiobookDuration": "Tvoje trajanje audiobooka", "LabelYourBookmarks": "Tvoje knjižne oznake", "LabelYourPlaylists": "Your Playlists", diff --git a/client/strings/hu.json b/client/strings/hu.json index 9d79f28e..d52957e1 100644 --- a/client/strings/hu.json +++ b/client/strings/hu.json @@ -43,6 +43,7 @@ "ButtonMatchAllAuthors": "Minden szerző egyeztetése", "ButtonMatchBooks": "Könyvek egyeztetése", "ButtonNevermind": "Mindegy", + "ButtonNext": "Next", "ButtonNextChapter": "Következő fejezet", "ButtonOk": "Oké", "ButtonOpenFeed": "Hírcsatorna megnyitása", @@ -51,6 +52,7 @@ "ButtonPlay": "Lejátszás", "ButtonPlaying": "Lejátszás folyamatban", "ButtonPlaylists": "Lejátszási listák", + "ButtonPrevious": "Previous", "ButtonPreviousChapter": "Előző fejezet", "ButtonPurgeAllCache": "Összes gyorsítótár törlése", "ButtonPurgeItemsCache": "Elemek gyorsítótárának törlése", @@ -59,6 +61,7 @@ "ButtonQueueRemoveItem": "Eltávolítás a sorból", "ButtonQuickMatch": "Gyors egyeztetés", "ButtonRead": "Olvasás", + "ButtonRefresh": "Refresh", "ButtonRemove": "Eltávolítás", "ButtonRemoveAll": "Összes eltávolítása", "ButtonRemoveAllLibraryItems": "Összes könyvtárelem eltávolítása", @@ -78,6 +81,7 @@ "ButtonSelectFolderPath": "Mappa útvonalának kiválasztása", "ButtonSeries": "Sorozatok", "ButtonSetChaptersFromTracks": "Fejezetek beállítása sávokból", + "ButtonShare": "Share", "ButtonShiftTimes": "Idők eltolása", "ButtonShow": "Megjelenítés", "ButtonStartM4BEncode": "M4B kódolás indítása", @@ -180,6 +184,7 @@ "HeaderUpdateDetails": "Részletek frissítése", "HeaderUpdateLibrary": "Könyvtár frissítése", "HeaderUsers": "Felhasználók", + "HeaderYearReview": "Year {0} in Review", "HeaderYourStats": "Saját statisztikák", "LabelAbridged": "Tömörített", "LabelAccountType": "Fióktípus", @@ -391,6 +396,7 @@ "LabelPermissionsDownload": "Letölthet", "LabelPermissionsUpdate": "Frissíthet", "LabelPermissionsUpload": "Feltölthet", + "LabelPersonalYearReview": "Your Year in Review ({0})", "LabelPhotoPathURL": "Fénykép útvonal/URL", "LabelPlaylists": "Lejátszási listák", "LabelPlayMethod": "Lejátszási módszer", @@ -436,6 +442,7 @@ "LabelSeries": "Sorozat", "LabelSeriesName": "Sorozat neve", "LabelSeriesProgress": "Sorozat haladása", + "LabelServerYearReview": "Server Year in Review ({0})", "LabelSetEbookAsPrimary": "Beállítás elsődlegesként", "LabelSetEbookAsSupplementary": "Beállítás kiegészítőként", "LabelSettingsAudiobooksOnly": "Csak hangoskönyvek", @@ -552,6 +559,8 @@ "LabelViewQueue": "Lejátszó sor megtekintése", "LabelVolume": "Hangerő", "LabelWeekdaysToRun": "Futás napjai", + "LabelYearReviewHide": "Hide Year in Review", + "LabelYearReviewShow": "See Year in Review", "LabelYourAudiobookDuration": "Hangoskönyv időtartama", "LabelYourBookmarks": "Könyvjelzőid", "LabelYourPlaylists": "Lejátszási listáid", diff --git a/client/strings/it.json b/client/strings/it.json index 11865aad..26a61fda 100644 --- a/client/strings/it.json +++ b/client/strings/it.json @@ -43,6 +43,7 @@ "ButtonMatchAllAuthors": "Aggiungi metadata agli Autori", "ButtonMatchBooks": "Aggiungi metadata della Libreria", "ButtonNevermind": "Nevermind", + "ButtonNext": "Next", "ButtonNextChapter": "Prossimo Capitolo", "ButtonOk": "Ok", "ButtonOpenFeed": "Apri Feed", @@ -51,6 +52,7 @@ "ButtonPlay": "Play", "ButtonPlaying": "In Riproduzione", "ButtonPlaylists": "Playlists", + "ButtonPrevious": "Previous", "ButtonPreviousChapter": "Capitolo Precendente", "ButtonPurgeAllCache": "Elimina tutta la Cache", "ButtonPurgeItemsCache": "Elimina la Cache selezionata", @@ -59,6 +61,7 @@ "ButtonQueueRemoveItem": "Rimuovi dalla Coda", "ButtonQuickMatch": "Controlla Metadata Auto", "ButtonRead": "Leggi", + "ButtonRefresh": "Refresh", "ButtonRemove": "Rimuovi", "ButtonRemoveAll": "Rimuovi Tutto", "ButtonRemoveAllLibraryItems": "Rimuovi tutto il contenuto della libreria", @@ -78,6 +81,7 @@ "ButtonSelectFolderPath": "Seleziona percorso cartella", "ButtonSeries": "Serie", "ButtonSetChaptersFromTracks": "Impostare i capitoli dalle tracce", + "ButtonShare": "Share", "ButtonShiftTimes": "Ricerca veloce", "ButtonShow": "Mostra", "ButtonStartM4BEncode": "Inizia L'Encode del M4B", @@ -180,6 +184,7 @@ "HeaderUpdateDetails": "Aggiorna Dettagli", "HeaderUpdateLibrary": "Aggiorna Libreria", "HeaderUsers": "Utenti", + "HeaderYearReview": "Year {0} in Review", "HeaderYourStats": "Statistiche Personali", "LabelAbridged": "Abbreviato", "LabelAccountType": "Tipo di Account", @@ -391,6 +396,7 @@ "LabelPermissionsDownload": "Può Scaricare", "LabelPermissionsUpdate": "Può Aggiornare", "LabelPermissionsUpload": "Può caricare", + "LabelPersonalYearReview": "Your Year in Review ({0})", "LabelPhotoPathURL": "foto Path/URL", "LabelPlaylists": "Playlists", "LabelPlayMethod": "Metodo di riproduzione", @@ -436,6 +442,7 @@ "LabelSeries": "Serie", "LabelSeriesName": "Nome Serie", "LabelSeriesProgress": "Cominciato", + "LabelServerYearReview": "Server Year in Review ({0})", "LabelSetEbookAsPrimary": "Immposta come Primario", "LabelSetEbookAsSupplementary": "Imposta come Suplementare", "LabelSettingsAudiobooksOnly": "Solo Audiolibri", @@ -552,6 +559,8 @@ "LabelViewQueue": "Visualizza coda", "LabelVolume": "Volume", "LabelWeekdaysToRun": "Giorni feriali da eseguire", + "LabelYearReviewHide": "Hide Year in Review", + "LabelYearReviewShow": "See Year in Review", "LabelYourAudiobookDuration": "La durata dell'audiolibro", "LabelYourBookmarks": "I tuoi Preferiti", "LabelYourPlaylists": "le tue Playlist", @@ -765,4 +774,4 @@ "ToastSocketFailedToConnect": "Socket non riesce a connettersi", "ToastUserDeleteFailed": "Errore eliminazione utente", "ToastUserDeleteSuccess": "Utente eliminato" -} +} \ No newline at end of file diff --git a/client/strings/lt.json b/client/strings/lt.json index f98d5aee..1c2558c9 100644 --- a/client/strings/lt.json +++ b/client/strings/lt.json @@ -43,6 +43,7 @@ "ButtonMatchAllAuthors": "Pritaikyti visus autorius", "ButtonMatchBooks": "Pritaikyti knygas", "ButtonNevermind": "Nesvarbu", + "ButtonNext": "Next", "ButtonNextChapter": "Next Chapter", "ButtonOk": "Ok", "ButtonOpenFeed": "Atidaryti srautą", @@ -51,6 +52,7 @@ "ButtonPlay": "Groti", "ButtonPlaying": "Grojama", "ButtonPlaylists": "Grojaraščiai", + "ButtonPrevious": "Previous", "ButtonPreviousChapter": "Previous Chapter", "ButtonPurgeAllCache": "Valyti visą saugyklą", "ButtonPurgeItemsCache": "Valyti elementų saugyklą", @@ -59,6 +61,7 @@ "ButtonQueueRemoveItem": "Pašalinti iš eilės", "ButtonQuickMatch": "Greitas pritaikymas", "ButtonRead": "Skaityti", + "ButtonRefresh": "Refresh", "ButtonRemove": "Pašalinti", "ButtonRemoveAll": "Pašalinti viską", "ButtonRemoveAllLibraryItems": "Pašalinti visus bibliotekos elementus", @@ -78,6 +81,7 @@ "ButtonSelectFolderPath": "Pasirinkti aplanko kelią", "ButtonSeries": "Serijos", "ButtonSetChaptersFromTracks": "Nustatyti skyrius iš takelių", + "ButtonShare": "Share", "ButtonShiftTimes": "Perstumti laikus", "ButtonShow": "Rodyti", "ButtonStartM4BEncode": "Pradėti M4B kodavimą", @@ -180,6 +184,7 @@ "HeaderUpdateDetails": "Atnaujinti informaciją", "HeaderUpdateLibrary": "Atnaujinti biblioteką", "HeaderUsers": "Naudotojai", + "HeaderYearReview": "Year {0} in Review", "HeaderYourStats": "Jūsų statistika", "LabelAbridged": "Santrauka", "LabelAccountType": "Paskyros tipas", @@ -391,6 +396,7 @@ "LabelPermissionsDownload": "Gali atsisiųsti", "LabelPermissionsUpdate": "Gali atnaujinti", "LabelPermissionsUpload": "Gali įkelti", + "LabelPersonalYearReview": "Your Year in Review ({0})", "LabelPhotoPathURL": "Nuotraukos kelias/URL", "LabelPlaylists": "Grojaraščiai", "LabelPlayMethod": "Grojimo metodas", @@ -436,6 +442,7 @@ "LabelSeries": "Serija", "LabelSeriesName": "Serijos pavadinimas", "LabelSeriesProgress": "Serijos progresas", + "LabelServerYearReview": "Server Year in Review ({0})", "LabelSetEbookAsPrimary": "Nustatyti kaip pagrindinę", "LabelSetEbookAsSupplementary": "Nustatyti kaip papildomą", "LabelSettingsAudiobooksOnly": "Tik garso knygos", @@ -552,6 +559,8 @@ "LabelViewQueue": "Peržiūrėti grotuvo eilę", "LabelVolume": "Garsumas", "LabelWeekdaysToRun": "Dienos, kuriomis vykdyti", + "LabelYearReviewHide": "Hide Year in Review", + "LabelYearReviewShow": "See Year in Review", "LabelYourAudiobookDuration": "Jūsų garso knygos trukmė", "LabelYourBookmarks": "Jūsų skirtukai", "LabelYourPlaylists": "Jūsų grojaraščiai", diff --git a/client/strings/nl.json b/client/strings/nl.json index 1c1ffa1b..dd06146d 100644 --- a/client/strings/nl.json +++ b/client/strings/nl.json @@ -43,6 +43,7 @@ "ButtonMatchAllAuthors": "Alle auteurs matchen", "ButtonMatchBooks": "Alle boeken matchen", "ButtonNevermind": "Laat maar", + "ButtonNext": "Next", "ButtonNextChapter": "Next Chapter", "ButtonOk": "Ok", "ButtonOpenFeed": "Feed openen", @@ -51,6 +52,7 @@ "ButtonPlay": "Afspelen", "ButtonPlaying": "Speelt", "ButtonPlaylists": "Afspeellijsten", + "ButtonPrevious": "Previous", "ButtonPreviousChapter": "Previous Chapter", "ButtonPurgeAllCache": "Volledige cache legen", "ButtonPurgeItemsCache": "Onderdelen-cache legen", @@ -59,6 +61,7 @@ "ButtonQueueRemoveItem": "Uit wachtrij verwijderen", "ButtonQuickMatch": "Snelle match", "ButtonRead": "Lees", + "ButtonRefresh": "Refresh", "ButtonRemove": "Verwijder", "ButtonRemoveAll": "Alles verwijderen", "ButtonRemoveAllLibraryItems": "Verwijder volledige bibliotheekinhoud", @@ -78,6 +81,7 @@ "ButtonSelectFolderPath": "Maplocatie selecteren", "ButtonSeries": "Series", "ButtonSetChaptersFromTracks": "Maak hoofdstukken op basis van tracks", + "ButtonShare": "Share", "ButtonShiftTimes": "Tijden verschuiven", "ButtonShow": "Toon", "ButtonStartM4BEncode": "Start M4B-encoding", @@ -180,6 +184,7 @@ "HeaderUpdateDetails": "Details bijwerken", "HeaderUpdateLibrary": "Bibliotheek bijwerken", "HeaderUsers": "Gebruikers", + "HeaderYearReview": "Year {0} in Review", "HeaderYourStats": "Je statistieken", "LabelAbridged": "Verkort", "LabelAccountType": "Accounttype", @@ -391,6 +396,7 @@ "LabelPermissionsDownload": "Kan downloaden", "LabelPermissionsUpdate": "Kan bijwerken", "LabelPermissionsUpload": "Kan uploaden", + "LabelPersonalYearReview": "Your Year in Review ({0})", "LabelPhotoPathURL": "Foto pad/URL", "LabelPlaylists": "Afspeellijsten", "LabelPlayMethod": "Afspeelwijze", @@ -436,6 +442,7 @@ "LabelSeries": "Serie", "LabelSeriesName": "Naam serie", "LabelSeriesProgress": "Voortgang serie", + "LabelServerYearReview": "Server Year in Review ({0})", "LabelSetEbookAsPrimary": "Stel in als primair", "LabelSetEbookAsSupplementary": "Stel in als supplementair", "LabelSettingsAudiobooksOnly": "Alleen audiobooks", @@ -552,6 +559,8 @@ "LabelViewQueue": "Bekijk afspeelwachtrij", "LabelVolume": "Volume", "LabelWeekdaysToRun": "Weekdagen om te draaien", + "LabelYearReviewHide": "Hide Year in Review", + "LabelYearReviewShow": "See Year in Review", "LabelYourAudiobookDuration": "Je audioboekduur", "LabelYourBookmarks": "Je boekwijzers", "LabelYourPlaylists": "Je afspeellijsten", diff --git a/client/strings/no.json b/client/strings/no.json index 432115df..a29a7ef2 100644 --- a/client/strings/no.json +++ b/client/strings/no.json @@ -43,6 +43,7 @@ "ButtonMatchAllAuthors": "Søk opp alle forfattere", "ButtonMatchBooks": "Søk opp bøker", "ButtonNevermind": "Avbryt", + "ButtonNext": "Next", "ButtonNextChapter": "Next Chapter", "ButtonOk": "Ok", "ButtonOpenFeed": "Åpne Feed", @@ -51,6 +52,7 @@ "ButtonPlay": "Spill av", "ButtonPlaying": "Spiller av", "ButtonPlaylists": "Spilleliste", + "ButtonPrevious": "Previous", "ButtonPreviousChapter": "Previous Chapter", "ButtonPurgeAllCache": "Tøm alle mellomlager", "ButtonPurgeItemsCache": "Tøm mellomlager", @@ -59,6 +61,7 @@ "ButtonQueueRemoveItem": "Fjern fra kø", "ButtonQuickMatch": "Kjapt søk", "ButtonRead": "Les", + "ButtonRefresh": "Refresh", "ButtonRemove": "Fjern", "ButtonRemoveAll": "Fjern alle", "ButtonRemoveAllLibraryItems": "Fjern alle bibliotekobjekter", @@ -78,6 +81,7 @@ "ButtonSelectFolderPath": "Velg mappe", "ButtonSeries": "Serier", "ButtonSetChaptersFromTracks": "Sett kapittel fra spor", + "ButtonShare": "Share", "ButtonShiftTimes": "Forskyv tider", "ButtonShow": "Vis", "ButtonStartM4BEncode": "Start M4B Koding", @@ -180,6 +184,7 @@ "HeaderUpdateDetails": "Oppdater detaljer", "HeaderUpdateLibrary": "Oppdater bibliotek", "HeaderUsers": "Brukere", + "HeaderYearReview": "Year {0} in Review", "HeaderYourStats": "Din statistikk", "LabelAbridged": "Forkortet", "LabelAccountType": "Kontotype", @@ -391,6 +396,7 @@ "LabelPermissionsDownload": "Kan laste ned", "LabelPermissionsUpdate": "Kan oppdatere", "LabelPermissionsUpload": "Kan laste opp", + "LabelPersonalYearReview": "Your Year in Review ({0})", "LabelPhotoPathURL": "Bilde sti/URL", "LabelPlaylists": "Spilleliste", "LabelPlayMethod": "Avspillingsmetode", @@ -436,6 +442,7 @@ "LabelSeries": "Serier", "LabelSeriesName": "Serier Navn", "LabelSeriesProgress": "Serier fremgang", + "LabelServerYearReview": "Server Year in Review ({0})", "LabelSetEbookAsPrimary": "Sett som primær", "LabelSetEbookAsSupplementary": "Sett som supplerende", "LabelSettingsAudiobooksOnly": "Kun lydbøker", @@ -552,6 +559,8 @@ "LabelViewQueue": "Vis spillerkø", "LabelVolume": "Volum", "LabelWeekdaysToRun": "Ukedager å kjøre", + "LabelYearReviewHide": "Hide Year in Review", + "LabelYearReviewShow": "See Year in Review", "LabelYourAudiobookDuration": "Din lydbok lengde", "LabelYourBookmarks": "Dine bokmerker", "LabelYourPlaylists": "Dine spillelister", diff --git a/client/strings/pl.json b/client/strings/pl.json index 7f0e4497..3189ccb7 100644 --- a/client/strings/pl.json +++ b/client/strings/pl.json @@ -43,6 +43,7 @@ "ButtonMatchAllAuthors": "Dopasuj wszystkich autorów", "ButtonMatchBooks": "Dopasuj książki", "ButtonNevermind": "Anuluj", + "ButtonNext": "Next", "ButtonNextChapter": "Next Chapter", "ButtonOk": "Ok", "ButtonOpenFeed": "Otwórz feed", @@ -51,6 +52,7 @@ "ButtonPlay": "Odtwarzaj", "ButtonPlaying": "Odtwarzane", "ButtonPlaylists": "Playlists", + "ButtonPrevious": "Previous", "ButtonPreviousChapter": "Previous Chapter", "ButtonPurgeAllCache": "Wyczyść dane tymczasowe", "ButtonPurgeItemsCache": "Wyczyść dane tymczasowe pozycji", @@ -59,6 +61,7 @@ "ButtonQueueRemoveItem": "Usuń z kolejki", "ButtonQuickMatch": "Szybkie dopasowanie", "ButtonRead": "Czytaj", + "ButtonRefresh": "Refresh", "ButtonRemove": "Usuń", "ButtonRemoveAll": "Usuń wszystko", "ButtonRemoveAllLibraryItems": "Usuń wszystkie elementy z biblioteki", @@ -78,6 +81,7 @@ "ButtonSelectFolderPath": "Wybierz ścieżkę folderu", "ButtonSeries": "Seria", "ButtonSetChaptersFromTracks": "Set chapters from tracks", + "ButtonShare": "Share", "ButtonShiftTimes": "Przesunięcie czasowe", "ButtonShow": "Pokaż", "ButtonStartM4BEncode": "Eksportuj jako plik M4B", @@ -180,6 +184,7 @@ "HeaderUpdateDetails": "Zaktualizuj szczegóły", "HeaderUpdateLibrary": "Zaktualizuj bibliotekę", "HeaderUsers": "Użytkownicy", + "HeaderYearReview": "Year {0} in Review", "HeaderYourStats": "Twoje statystyki", "LabelAbridged": "Abridged", "LabelAccountType": "Typ konta", @@ -391,6 +396,7 @@ "LabelPermissionsDownload": "Ma możliwość pobierania", "LabelPermissionsUpdate": "Ma możliwość aktualizowania", "LabelPermissionsUpload": "Ma możliwość dodawania", + "LabelPersonalYearReview": "Your Year in Review ({0})", "LabelPhotoPathURL": "Scieżka/URL do zdjęcia", "LabelPlaylists": "Playlists", "LabelPlayMethod": "Metoda odtwarzania", @@ -436,6 +442,7 @@ "LabelSeries": "Serie", "LabelSeriesName": "Nazwy serii", "LabelSeriesProgress": "Postęp w serii", + "LabelServerYearReview": "Server Year in Review ({0})", "LabelSetEbookAsPrimary": "Set as primary", "LabelSetEbookAsSupplementary": "Set as supplementary", "LabelSettingsAudiobooksOnly": "Audiobooks only", @@ -552,6 +559,8 @@ "LabelViewQueue": "Wyświetlaj kolejkę odtwarzania", "LabelVolume": "Głośność", "LabelWeekdaysToRun": "Dni tygodnia", + "LabelYearReviewHide": "Hide Year in Review", + "LabelYearReviewShow": "See Year in Review", "LabelYourAudiobookDuration": "Czas trwania audiobooka", "LabelYourBookmarks": "Twoje zakładki", "LabelYourPlaylists": "Your Playlists", diff --git a/client/strings/pt-br.json b/client/strings/pt-br.json index fc626aff..14e7f52a 100644 --- a/client/strings/pt-br.json +++ b/client/strings/pt-br.json @@ -43,6 +43,7 @@ "ButtonMatchAllAuthors": "Consultar Todos os Autores", "ButtonMatchBooks": "Consultar Livros", "ButtonNevermind": "Cancelar", + "ButtonNext": "Next", "ButtonNextChapter": "Próximo Capítulo", "ButtonOk": "Ok", "ButtonOpenFeed": "Abrir Feed", @@ -51,6 +52,7 @@ "ButtonPlay": "Reproduzir", "ButtonPlaying": "Reproduzindo", "ButtonPlaylists": "Lista de Reprodução", + "ButtonPrevious": "Previous", "ButtonPreviousChapter": "Capítulo Anterior", "ButtonPurgeAllCache": "Apagar Todo o Cache", "ButtonPurgeItemsCache": "Apagar o Cache de Itens", @@ -59,6 +61,7 @@ "ButtonQueueRemoveItem": "Remover da Lista", "ButtonQuickMatch": "Consulta rápida", "ButtonRead": "Ler", + "ButtonRefresh": "Refresh", "ButtonRemove": "Remover", "ButtonRemoveAll": "Remover Todos", "ButtonRemoveAllLibraryItems": "Remover Todos os Itens da Biblioteca", @@ -78,6 +81,7 @@ "ButtonSelectFolderPath": "Selecionar Caminho da Pasta", "ButtonSeries": "Séries", "ButtonSetChaptersFromTracks": "Definir Capítulos Segundo Faixas", + "ButtonShare": "Share", "ButtonShiftTimes": "Deslocar tempos", "ButtonShow": "Exibir", "ButtonStartM4BEncode": "Iniciar Codificação M4B", @@ -180,6 +184,7 @@ "HeaderUpdateDetails": "Atualizar Detalhes", "HeaderUpdateLibrary": "Atualizar Biblioteca", "HeaderUsers": "Usuários", + "HeaderYearReview": "Year {0} in Review", "HeaderYourStats": "Suas Estatísticas", "LabelAbridged": "Versão Abreviada", "LabelAccountType": "Tipo de Conta", @@ -391,6 +396,7 @@ "LabelPermissionsDownload": "Pode Fazer Download", "LabelPermissionsUpdate": "Pode Atualizar", "LabelPermissionsUpload": "Pode Fazer Upload", + "LabelPersonalYearReview": "Your Year in Review ({0})", "LabelPhotoPathURL": "Caminho/URL para Foto", "LabelPlaylists": "Listas de Reprodução", "LabelPlayMethod": "Método de Reprodução", @@ -436,6 +442,7 @@ "LabelSeries": "Série", "LabelSeriesName": "Nome da Série", "LabelSeriesProgress": "Progresso da Série", + "LabelServerYearReview": "Server Year in Review ({0})", "LabelSetEbookAsPrimary": "Definir como principal", "LabelSetEbookAsSupplementary": "Definir como complementar", "LabelSettingsAudiobooksOnly": "Apenas Audiobooks", @@ -552,6 +559,8 @@ "LabelViewQueue": "Ver fila do reprodutor", "LabelVolume": "Volume", "LabelWeekdaysToRun": "Dias da semana para executar", + "LabelYearReviewHide": "Hide Year in Review", + "LabelYearReviewShow": "See Year in Review", "LabelYourAudiobookDuration": "Duração do seu audiobook", "LabelYourBookmarks": "Seus Marcadores", "LabelYourPlaylists": "Suas Listas de Reprodução", @@ -765,4 +774,4 @@ "ToastSocketFailedToConnect": "Falha na conexão do socket", "ToastUserDeleteFailed": "Falha ao apagar usuário", "ToastUserDeleteSuccess": "Usuário apagado" -} +} \ No newline at end of file diff --git a/client/strings/ru.json b/client/strings/ru.json index 3657b596..adc3b48b 100644 --- a/client/strings/ru.json +++ b/client/strings/ru.json @@ -43,6 +43,7 @@ "ButtonMatchAllAuthors": "Найти всех авторов", "ButtonMatchBooks": "Найти книги", "ButtonNevermind": "Не важно", + "ButtonNext": "Next", "ButtonNextChapter": "Next Chapter", "ButtonOk": "Ok", "ButtonOpenFeed": "Открыть канал", @@ -51,6 +52,7 @@ "ButtonPlay": "Слушать", "ButtonPlaying": "Проигрывается", "ButtonPlaylists": "Плейлисты", + "ButtonPrevious": "Previous", "ButtonPreviousChapter": "Previous Chapter", "ButtonPurgeAllCache": "Очистить весь кэш", "ButtonPurgeItemsCache": "Очистить кэш элементов", @@ -59,6 +61,7 @@ "ButtonQueueRemoveItem": "Удалить из очереди", "ButtonQuickMatch": "Быстрый поиск", "ButtonRead": "Читать", + "ButtonRefresh": "Refresh", "ButtonRemove": "Удалить", "ButtonRemoveAll": "Удалить всё", "ButtonRemoveAllLibraryItems": "Удалить все элементы библиотеки", @@ -78,6 +81,7 @@ "ButtonSelectFolderPath": "Выберите путь папки", "ButtonSeries": "Серии", "ButtonSetChaptersFromTracks": "Установить главы из треков", + "ButtonShare": "Share", "ButtonShiftTimes": "Смещение", "ButtonShow": "Показать", "ButtonStartM4BEncode": "Начать кодирование M4B", @@ -180,6 +184,7 @@ "HeaderUpdateDetails": "Обновить детали", "HeaderUpdateLibrary": "Обновить библиотеку", "HeaderUsers": "Пользователи", + "HeaderYearReview": "Year {0} in Review", "HeaderYourStats": "Ваша статистика", "LabelAbridged": "Сокращенное издание", "LabelAccountType": "Тип учетной записи", @@ -391,6 +396,7 @@ "LabelPermissionsDownload": "Может скачивать", "LabelPermissionsUpdate": "Может обновлять", "LabelPermissionsUpload": "Может закачивать", + "LabelPersonalYearReview": "Your Year in Review ({0})", "LabelPhotoPathURL": "Путь к фото/URL", "LabelPlaylists": "Плейлисты", "LabelPlayMethod": "Метод воспроизведения", @@ -436,6 +442,7 @@ "LabelSeries": "Серия", "LabelSeriesName": "Имя серии", "LabelSeriesProgress": "Прогресс серии", + "LabelServerYearReview": "Server Year in Review ({0})", "LabelSetEbookAsPrimary": "Установить как основную", "LabelSetEbookAsSupplementary": "Установить как дополнительную", "LabelSettingsAudiobooksOnly": "Только аудиокниги", @@ -552,6 +559,8 @@ "LabelViewQueue": "Очередь воспроизведения", "LabelVolume": "Громкость", "LabelWeekdaysToRun": "Дни недели для запуска", + "LabelYearReviewHide": "Hide Year in Review", + "LabelYearReviewShow": "See Year in Review", "LabelYourAudiobookDuration": "Продолжительность Вашей книги", "LabelYourBookmarks": "Ваши закладки", "LabelYourPlaylists": "Ваши плейлисты", diff --git a/client/strings/sv.json b/client/strings/sv.json index 986f2c4b..9560e765 100644 --- a/client/strings/sv.json +++ b/client/strings/sv.json @@ -43,6 +43,7 @@ "ButtonMatchAllAuthors": "Matcha alla författare", "ButtonMatchBooks": "Matcha böcker", "ButtonNevermind": "Glöm det", + "ButtonNext": "Next", "ButtonNextChapter": "Next Chapter", "ButtonOk": "Okej", "ButtonOpenFeed": "Öppna flöde", @@ -51,6 +52,7 @@ "ButtonPlay": "Spela", "ButtonPlaying": "Spelar", "ButtonPlaylists": "Spellistor", + "ButtonPrevious": "Previous", "ButtonPreviousChapter": "Previous Chapter", "ButtonPurgeAllCache": "Rensa all cache", "ButtonPurgeItemsCache": "Rensa föremåls-cache", @@ -59,6 +61,7 @@ "ButtonQueueRemoveItem": "Ta bort från kön", "ButtonQuickMatch": "Snabb matchning", "ButtonRead": "Läs", + "ButtonRefresh": "Refresh", "ButtonRemove": "Ta bort", "ButtonRemoveAll": "Ta bort alla", "ButtonRemoveAllLibraryItems": "Ta bort alla biblioteksobjekt", @@ -78,6 +81,7 @@ "ButtonSelectFolderPath": "Välj mappens sökväg", "ButtonSeries": "Serie", "ButtonSetChaptersFromTracks": "Ställ in kapitel från spår", + "ButtonShare": "Share", "ButtonShiftTimes": "Förskjut tider", "ButtonShow": "Visa", "ButtonStartM4BEncode": "Starta M4B-kodning", @@ -180,6 +184,7 @@ "HeaderUpdateDetails": "Uppdatera detaljer", "HeaderUpdateLibrary": "Uppdatera bibliotek", "HeaderUsers": "Användare", + "HeaderYearReview": "Year {0} in Review", "HeaderYourStats": "Dina statistik", "LabelAbridged": "Förkortad", "LabelAccountType": "Kontotyp", @@ -391,6 +396,7 @@ "LabelPermissionsDownload": "Kan ladda ner", "LabelPermissionsUpdate": "Kan uppdatera", "LabelPermissionsUpload": "Kan ladda upp", + "LabelPersonalYearReview": "Your Year in Review ({0})", "LabelPhotoPathURL": "Bildsökväg/URL", "LabelPlaylists": "Spellistor", "LabelPlayMethod": "Spelläge", @@ -436,6 +442,7 @@ "LabelSeries": "Serie", "LabelSeriesName": "Serienamn", "LabelSeriesProgress": "Serieframsteg", + "LabelServerYearReview": "Server Year in Review ({0})", "LabelSetEbookAsPrimary": "Ange som primär", "LabelSetEbookAsSupplementary": "Ange som kompletterande", "LabelSettingsAudiobooksOnly": "Endast ljudböcker", @@ -552,6 +559,8 @@ "LabelViewQueue": "Visa spellista", "LabelVolume": "Volym", "LabelWeekdaysToRun": "Vardagar att köra", + "LabelYearReviewHide": "Hide Year in Review", + "LabelYearReviewShow": "See Year in Review", "LabelYourAudiobookDuration": "Din ljudboks varaktighet", "LabelYourBookmarks": "Dina bokmärken", "LabelYourPlaylists": "Dina spellistor", diff --git a/client/strings/zh-cn.json b/client/strings/zh-cn.json index fd7fe290..c1d9345f 100644 --- a/client/strings/zh-cn.json +++ b/client/strings/zh-cn.json @@ -43,6 +43,7 @@ "ButtonMatchAllAuthors": "匹配所有作者", "ButtonMatchBooks": "匹配图书", "ButtonNevermind": "没有关系", + "ButtonNext": "Next", "ButtonNextChapter": "Next Chapter", "ButtonOk": "确定", "ButtonOpenFeed": "打开源", @@ -51,6 +52,7 @@ "ButtonPlay": "播放", "ButtonPlaying": "正在播放", "ButtonPlaylists": "播放列表", + "ButtonPrevious": "Previous", "ButtonPreviousChapter": "Previous Chapter", "ButtonPurgeAllCache": "清理所有缓存", "ButtonPurgeItemsCache": "清理项目缓存", @@ -59,6 +61,7 @@ "ButtonQueueRemoveItem": "从队列中移除", "ButtonQuickMatch": "快速匹配", "ButtonRead": "读取", + "ButtonRefresh": "Refresh", "ButtonRemove": "移除", "ButtonRemoveAll": "移除所有", "ButtonRemoveAllLibraryItems": "移除所有媒体库项目", @@ -78,6 +81,7 @@ "ButtonSelectFolderPath": "选择文件夹路径", "ButtonSeries": "系列", "ButtonSetChaptersFromTracks": "将音轨设置为章节", + "ButtonShare": "Share", "ButtonShiftTimes": "快速调整时间", "ButtonShow": "显示", "ButtonStartM4BEncode": "开始 M4B 编码", @@ -180,6 +184,7 @@ "HeaderUpdateDetails": "更新详情", "HeaderUpdateLibrary": "更新媒体库", "HeaderUsers": "用户", + "HeaderYearReview": "Year {0} in Review", "HeaderYourStats": "你的统计数据", "LabelAbridged": "概要", "LabelAccountType": "帐户类型", @@ -391,6 +396,7 @@ "LabelPermissionsDownload": "可以下载", "LabelPermissionsUpdate": "可以更新", "LabelPermissionsUpload": "可以上传", + "LabelPersonalYearReview": "Your Year in Review ({0})", "LabelPhotoPathURL": "图片路径或 URL", "LabelPlaylists": "播放列表", "LabelPlayMethod": "播放方法", @@ -436,6 +442,7 @@ "LabelSeries": "系列", "LabelSeriesName": "系列名称", "LabelSeriesProgress": "系列进度", + "LabelServerYearReview": "Server Year in Review ({0})", "LabelSetEbookAsPrimary": "设置为主", "LabelSetEbookAsSupplementary": "设置为补充", "LabelSettingsAudiobooksOnly": "只有有声读物", @@ -552,6 +559,8 @@ "LabelViewQueue": "查看播放列表", "LabelVolume": "音量", "LabelWeekdaysToRun": "工作日运行", + "LabelYearReviewHide": "Hide Year in Review", + "LabelYearReviewShow": "See Year in Review", "LabelYourAudiobookDuration": "你的有声读物持续时间", "LabelYourBookmarks": "你的书签", "LabelYourPlaylists": "你的播放列表", From c799379a5486e2999fb95b5a0c16fea877d91272 Mon Sep 17 00:00:00 2001 From: JBlond Date: Sat, 24 Feb 2024 20:23:51 +0100 Subject: [PATCH 65/81] Update de strings --- client/strings/de.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/client/strings/de.json b/client/strings/de.json index 46467734..5b2711c1 100644 --- a/client/strings/de.json +++ b/client/strings/de.json @@ -43,7 +43,7 @@ "ButtonMatchAllAuthors": "Online Metadaten-Abgleich (alle Autoren)", "ButtonMatchBooks": "Online Metadaten-Abgleich (alle Medien)", "ButtonNevermind": "Abbrechen", - "ButtonNext": "Next", + "ButtonNext": "Vor", "ButtonNextChapter": "Nächstes Kapitel", "ButtonOk": "Ok", "ButtonOpenFeed": "Feed öffnen", @@ -52,7 +52,7 @@ "ButtonPlay": "Abspielen", "ButtonPlaying": "Spielt", "ButtonPlaylists": "Wiedergabelisten", - "ButtonPrevious": "Previous", + "ButtonPrevious": "Zurück", "ButtonPreviousChapter": "Vorheriges Kapitel", "ButtonPurgeAllCache": "Cache leeren", "ButtonPurgeItemsCache": "Lösche Medien-Cache", @@ -292,11 +292,11 @@ "LabelFinished": "Beendet", "LabelFolder": "Ordner", "LabelFolders": "Verzeichnisse", - "LabelFontBold": "Bold", + "LabelFontBold": "Fett", "LabelFontFamily": "Schriftfamilie", - "LabelFontItalic": "Italic", + "LabelFontItalic": "Kursiv", "LabelFontScale": "Schriftgröße", - "LabelFontStrikethrough": "Strikethrough", + "LabelFontStrikethrough": "Durchgestrichen", "LabelFormat": "Format", "LabelGenre": "Kategorie", "LabelGenres": "Kategorien", @@ -419,7 +419,7 @@ "LabelRecentlyAdded": "Kürzlich hinzugefügt", "LabelRecentSeries": "Aktuelle Serien", "LabelRecommended": "Empfohlen", - "LabelRedo": "Redo", + "LabelRedo": "Wiederholen", "LabelRegion": "Region", "LabelReleaseDate": "Veröffentlichungsdatum", "LabelRemoveCover": "Lösche Titelbild", From e6735e042e8f61559cf35992d50cecbee7b30aee Mon Sep 17 00:00:00 2001 From: mikiher Date: Sun, 25 Feb 2024 09:01:26 +0200 Subject: [PATCH 66/81] Fix dup author addition logic --- server/models/LibraryItem.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/server/models/LibraryItem.js b/server/models/LibraryItem.js index c7da31f6..49b44f9a 100644 --- a/server/models/LibraryItem.js +++ b/server/models/LibraryItem.js @@ -312,17 +312,18 @@ class LibraryItem extends Model { const existingAuthors = libraryItemExpanded.media.authors || [] const existingSeriesAll = libraryItemExpanded.media.series || [] const updatedAuthors = oldLibraryItem.media.metadata.authors || [] + const uniqueUpdatedAuthors = updatedAuthors.filter((au, idx) => updatedAuthors.findIndex(a => a.id === au.id) === idx) const updatedSeriesAll = oldLibraryItem.media.metadata.series || [] for (const existingAuthor of existingAuthors) { // Author was removed from Book - if (!updatedAuthors.some(au => au.id === existingAuthor.id)) { + if (!uniqueUpdatedAuthors.some(au => au.id === existingAuthor.id)) { Logger.debug(`[LibraryItem] "${libraryItemExpanded.media.title}" author "${existingAuthor.name}" was removed`) await this.sequelize.models.bookAuthor.removeByIds(existingAuthor.id, libraryItemExpanded.media.id) hasUpdates = true } } - for (const updatedAuthor of updatedAuthors) { + for (const updatedAuthor of uniqueUpdatedAuthors) { // Author was added if (!existingAuthors.some(au => au.id === updatedAuthor.id)) { Logger.debug(`[LibraryItem] "${libraryItemExpanded.media.title}" author "${updatedAuthor.name}" was added`) From 3a99cc56b7a992793dd61ffb31e5a75ef575abcb Mon Sep 17 00:00:00 2001 From: advplyr Date: Sun, 25 Feb 2024 12:56:04 -0600 Subject: [PATCH 67/81] Update:Debian packager script to use xz compression instead of zstd --- build/linuxpackager | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/build/linuxpackager b/build/linuxpackager index a43d4ed1..5f03a2e8 100755 --- a/build/linuxpackager +++ b/build/linuxpackager @@ -50,9 +50,8 @@ echo "$controlfile" > dist/debian/DEBIAN/control; # Package debian pkg -t node18-linux-x64 -o dist/debian/usr/share/audiobookshelf/audiobookshelf . -fakeroot dpkg-deb --build dist/debian +fakeroot dpkg-deb -Zxz --build dist/debian mv dist/debian.deb "dist/$OUTPUT_FILE" -chmod +x "dist/$OUTPUT_FILE" echo "Finished! Filename: $OUTPUT_FILE" From b47793c365aaafee08db3cb4fe0b5a070029fb4f Mon Sep 17 00:00:00 2001 From: mikiher Date: Mon, 26 Feb 2024 14:00:25 +0200 Subject: [PATCH 68/81] Add cache control header for timestamped cover image requests --- server/controllers/LibraryItemController.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/server/controllers/LibraryItemController.js b/server/controllers/LibraryItemController.js index dfa1daea..3fa7743a 100644 --- a/server/controllers/LibraryItemController.js +++ b/server/controllers/LibraryItemController.js @@ -283,6 +283,9 @@ class LibraryItemController { return res.sendStatus(404) } + if (req.query.ts) + res.set('Cache-Control', 'private, max-age=86400') + if (raw) { // any value if (global.XAccel) { const encodedURI = encodeUriPath(global.XAccel + libraryItem.media.coverPath) From def2988e120b162da1f3e9df586813bccf156f63 Mon Sep 17 00:00:00 2001 From: advplyr Date: Mon, 26 Feb 2024 17:20:11 -0600 Subject: [PATCH 69/81] Update:Passport openid-client request timeout set to 10s (default was 3.5s) #2669 --- server/Auth.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/server/Auth.js b/server/Auth.js index cec3bc33..ad219dc2 100644 --- a/server/Auth.js +++ b/server/Auth.js @@ -76,6 +76,9 @@ class Auth { return } + // Custom req timeout see: https://github.com/panva/node-openid-client/blob/main/docs/README.md#customizing + OpenIDClient.custom.setHttpOptionsDefaults({ timeout: 10000 }) + const openIdIssuerClient = new OpenIDClient.Issuer({ issuer: global.ServerSettings.authOpenIDIssuerURL, authorization_endpoint: global.ServerSettings.authOpenIDAuthorizationURL, From 72172dcb331f73864abccee1b6aed44416fd207e Mon Sep 17 00:00:00 2001 From: Machou Date: Tue, 27 Feb 2024 08:56:31 +0100 Subject: [PATCH 70/81] Update fr.json --- client/strings/fr.json | 52 +++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/client/strings/fr.json b/client/strings/fr.json index bbf38e18..81b6fa1b 100644 --- a/client/strings/fr.json +++ b/client/strings/fr.json @@ -7,7 +7,7 @@ "ButtonAddUser": "Ajouter un utilisateur", "ButtonAddYourFirstLibrary": "Ajouter votre première bibliothèque", "ButtonApply": "Appliquer", - "ButtonApplyChapters": "Appliquer les chapitres", + "ButtonApplyChapters": "Appliquer aux chapitres", "ButtonAuthors": "Auteurs", "ButtonBrowseForFolder": "Naviguer vers le répertoire", "ButtonCancel": "Annuler", @@ -32,8 +32,8 @@ "ButtonHide": "Cacher", "ButtonHome": "Accueil", "ButtonIssues": "Parutions", - "ButtonJumpBackward": "Jump Backward", - "ButtonJumpForward": "Jump Forward", + "ButtonJumpBackward": "Retour", + "ButtonJumpForward": "Avancer", "ButtonLatest": "Dernière version", "ButtonLibrary": "Bibliothèque", "ButtonLogout": "Me déconnecter", @@ -43,8 +43,8 @@ "ButtonMatchAllAuthors": "Chercher tous les auteurs", "ButtonMatchBooks": "Chercher les livres", "ButtonNevermind": "Non merci", - "ButtonNext": "Next", - "ButtonNextChapter": "Next Chapter", + "ButtonNext": "Suivant", + "ButtonNextChapter": "Chapitre suivant", "ButtonOk": "Ok", "ButtonOpenFeed": "Ouvrir le flux", "ButtonOpenManager": "Ouvrir le gestionnaire", @@ -52,8 +52,8 @@ "ButtonPlay": "Écouter", "ButtonPlaying": "En lecture", "ButtonPlaylists": "Listes de lecture", - "ButtonPrevious": "Previous", - "ButtonPreviousChapter": "Previous Chapter", + "ButtonPrevious": "Précédent", + "ButtonPreviousChapter": "Chapitre précédent", "ButtonPurgeAllCache": "Purger le cache", "ButtonPurgeItemsCache": "Purger le cache des articles", "ButtonPurgeMediaProgress": "Purger la progression des médias", @@ -61,7 +61,7 @@ "ButtonQueueRemoveItem": "Supprimer de la liste de lecture", "ButtonQuickMatch": "Recherche rapide", "ButtonRead": "Lire", - "ButtonRefresh": "Refresh", + "ButtonRefresh": "Rafraîchir", "ButtonRemove": "Supprimer", "ButtonRemoveAll": "Supprimer tout", "ButtonRemoveAllLibraryItems": "Supprimer tous les articles de la bibliothèque", @@ -81,7 +81,7 @@ "ButtonSelectFolderPath": "Sélectionner le chemin du dossier", "ButtonSeries": "Séries", "ButtonSetChaptersFromTracks": "Positionner les chapitres par rapports aux pistes", - "ButtonShare": "Share", + "ButtonShare": "Partager", "ButtonShiftTimes": "Décaler l’horodatage du livre", "ButtonShow": "Afficher", "ButtonStartM4BEncode": "Démarrer l’encodage M4B", @@ -92,7 +92,7 @@ "ButtonUploadBackup": "Téléverser une sauvegarde", "ButtonUploadCover": "Téléverser une couverture", "ButtonUploadOPMLFile": "Téléverser un fichier OPML", - "ButtonUserDelete": "Effacer l’utilisateur {0}", + "ButtonUserDelete": "Supprimer l’utilisateur {0}", "ButtonUserEdit": "Modifier l’utilisateur {0}", "ButtonViewAll": "Afficher tout", "ButtonYes": "Oui", @@ -101,8 +101,8 @@ "ErrorUploadLacksTitle": "Doit avoir un titre", "HeaderAccount": "Compte", "HeaderAdvanced": "Avancé", - "HeaderAppriseNotificationSettings": "Configuration des Notifications Apprise", - "HeaderAudiobookTools": "Outils de Gestion de Fichier Audiobook", + "HeaderAppriseNotificationSettings": "Configuration des notifications Apprise", + "HeaderAudiobookTools": "Outils de gestion de fichiers de livres audio", "HeaderAudioTracks": "Pistes audio", "HeaderAuthentication": "Authentication", "HeaderBackups": "Sauvegardes", @@ -113,7 +113,7 @@ "HeaderCollectionItems": "Entrées de la collection", "HeaderCover": "Couverture", "HeaderCurrentDownloads": "Téléchargements en cours", - "HeaderCustomMetadataProviders": "Custom Metadata Providers", + "HeaderCustomMetadataProviders": "Fournisseurs de métadonnées personnalisés", "HeaderDetails": "Détails", "HeaderDownloadQueue": "File d’attente de téléchargements", "HeaderEbookFiles": "Fichier des livres numériques", @@ -292,11 +292,11 @@ "LabelFinished": "Terminé le", "LabelFolder": "Dossier", "LabelFolders": "Dossiers", - "LabelFontBold": "Bold", + "LabelFontBold": "Gras", "LabelFontFamily": "Polices de caractères", - "LabelFontItalic": "Italic", + "LabelFontItalic": "Italique", "LabelFontScale": "Taille de la police de caractère", - "LabelFontStrikethrough": "Strikethrough", + "LabelFontStrikethrough": "Barrer", "LabelFormat": "Format", "LabelGenre": "Genre", "LabelGenres": "Genres", @@ -419,7 +419,7 @@ "LabelRecentlyAdded": "Derniers ajouts", "LabelRecentSeries": "Séries récentes", "LabelRecommended": "Recommandé", - "LabelRedo": "Redo", + "LabelRedo": "Refaire", "LabelRegion": "Région", "LabelReleaseDate": "Date de parution", "LabelRemoveCover": "Supprimer la couverture", @@ -509,10 +509,10 @@ "LabelTagsAccessibleToUser": "Étiquettes accessibles à l’utilisateur", "LabelTagsNotAccessibleToUser": "Étiquettes non accessibles à l’utilisateur", "LabelTasks": "Tâches en cours", - "LabelTextEditorBulletedList": "Bulleted list", - "LabelTextEditorLink": "Link", - "LabelTextEditorNumberedList": "Numbered list", - "LabelTextEditorUnlink": "Unlink", + "LabelTextEditorBulletedList": "Liste à puces", + "LabelTextEditorLink": "Lien", + "LabelTextEditorNumberedList": "Liste numérotée", + "LabelTextEditorUnlink": "Dissocier", "LabelTheme": "Thème", "LabelThemeDark": "Sombre", "LabelThemeLight": "Clair", @@ -538,7 +538,7 @@ "LabelTracksSingleTrack": "Piste simple", "LabelType": "Type", "LabelUnabridged": "Version intégrale", - "LabelUndo": "Undo", + "LabelUndo": "Annuler", "LabelUnknown": "Inconnu", "LabelUpdateCover": "Mettre à jour la couverture", "LabelUpdateCoverHelp": "Autoriser la mise à jour de la couverture existante lorsqu’une correspondance est trouvée", @@ -559,8 +559,8 @@ "LabelViewQueue": "Afficher la liste de lecture", "LabelVolume": "Volume", "LabelWeekdaysToRun": "Jours de la semaine à exécuter", - "LabelYearReviewHide": "Hide Year in Review", - "LabelYearReviewShow": "See Year in Review", + "LabelYearReviewHide": "Masquer le bilan de l’année", + "LabelYearReviewShow": "Afficher le bilan de l’année", "LabelYourAudiobookDuration": "Durée de vos livres audios", "LabelYourBookmarks": "Vos signets", "LabelYourPlaylists": "Vos listes de lecture", @@ -692,7 +692,7 @@ "MessageYourAudiobookDurationIsShorter": "La durée de votre livre audio est plus courte que la durée trouvée", "NoteChangeRootPassword": "seul l’utilisateur « root » peut utiliser un mot de passe vide", "NoteChapterEditorTimes": "Information : l’horodatage du premier chapitre doit être à 0:00 et celui du dernier chapitre ne peut se situer au-delà de la durée du livre audio.", - "NoteFolderPicker": "Information : Les dossiers déjà surveillés ne sont pas affichés", + "NoteFolderPicker": "Information : les dossiers déjà surveillés ne sont pas affichés", "NoteRSSFeedPodcastAppsHttps": "Attention : la majorité des application de podcast nécessite une adresse de flux en HTTPS.", "NoteRSSFeedPodcastAppsPubDate": "Attention : un ou plusieurs de vos épisodes ne possèdent pas de date de publication. Certaines applications de podcast le requièrent.", "NoteUploaderFoldersWithMediaFiles": "Les dossiers contenant des fichiers multimédias seront traités comme des éléments distincts de la bibliothèque.", @@ -774,4 +774,4 @@ "ToastSocketFailedToConnect": "Échec de la connexion WebSocket", "ToastUserDeleteFailed": "Échec de la suppression de l’utilisateur", "ToastUserDeleteSuccess": "Utilisateur supprimé" -} \ No newline at end of file +} From 655bebfec4c6ba71751a7aa4a0f3e7af7f5e4789 Mon Sep 17 00:00:00 2001 From: Teekeks Date: Tue, 27 Feb 2024 18:30:05 +0100 Subject: [PATCH 71/81] feat: Expanded filter to include "has no ebook" and "has no supplementary ebooks" options --- client/components/controls/LibraryFilterSelect.vue | 8 ++++++++ client/strings/de.json | 2 ++ client/strings/en-us.json | 2 ++ server/utils/queries/libraryItemsBookFilters.js | 8 ++++++++ 4 files changed, 20 insertions(+) diff --git a/client/components/controls/LibraryFilterSelect.vue b/client/components/controls/LibraryFilterSelect.vue index 5ed4400b..04dd11af 100644 --- a/client/components/controls/LibraryFilterSelect.vue +++ b/client/components/controls/LibraryFilterSelect.vue @@ -368,9 +368,17 @@ export default { id: 'ebook', name: this.$strings.LabelHasEbook }, + { + id: 'no-ebook', + name: this.$strings.LabelMissingEbook + }, { id: 'supplementary', name: this.$strings.LabelHasSupplementaryEbook + }, + { + id: 'no-supplementary', + name: this.$strings.LabelMissingSupplementaryEbook } ] }, diff --git a/client/strings/de.json b/client/strings/de.json index 5b2711c1..33b0fb1b 100644 --- a/client/strings/de.json +++ b/client/strings/de.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Meta Tags", "LabelMinute": "Minute", "LabelMissing": "Fehlend", + "LabelMissingEbook": "E-Book fehlt", "LabelMissingParts": "Fehlende Teile", + "LabelMissingSupplementaryEbook": "Ergänzendes E-Book fehlt", "LabelMobileRedirectURIs": "Erlaubte Weiterleitungs-URIs für die mobile App", "LabelMobileRedirectURIsDescription": "Dies ist eine Whitelist gültiger Umleitungs-URIs für mobile Apps. Der Standardwert ist audiobookshelf://oauth, den du entfernen oder durch zusätzliche URIs für die Integration von Drittanbieter-Apps ergänzen kannst. Die Verwendung eines Sternchens (*) als alleiniger Eintrag erlaubt jede URI.", "LabelMore": "Mehr", diff --git a/client/strings/en-us.json b/client/strings/en-us.json index b8860ffa..2465f873 100644 --- a/client/strings/en-us.json +++ b/client/strings/en-us.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Meta Tags", "LabelMinute": "Minute", "LabelMissing": "Missing", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Missing Parts", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs", "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is audiobookshelf://oauth, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (*) as the sole entry permits any URI.", "LabelMore": "More", diff --git a/server/utils/queries/libraryItemsBookFilters.js b/server/utils/queries/libraryItemsBookFilters.js index d23459b4..16a25847 100644 --- a/server/utils/queries/libraryItemsBookFilters.js +++ b/server/utils/queries/libraryItemsBookFilters.js @@ -204,6 +204,10 @@ module.exports = { mediaWhere['ebookFile'] = { [Sequelize.Op.not]: null } + } else if (value == 'no-ebook') { + mediaWhere['ebookFile'] = { + [Sequelize.Op.eq]: null + } } } else if (group === 'missing') { if (['asin', 'isbn', 'subtitle', 'publishedYear', 'description', 'publisher', 'language', 'cover'].includes(value)) { @@ -421,6 +425,10 @@ module.exports = { libraryItemWhere['libraryFiles'] = { [Sequelize.Op.substring]: `"isSupplementary":true` } + } else if (filterGroup === 'ebooks' && filterValue === 'no-supplementary') { + libraryItemWhere['libraryFiles'] = { + [Sequelize.Op.notLike]: Sequelize.literal(`\'%"isSupplementary":true%\'`), + } } else if (filterGroup === 'missing' && filterValue === 'authors') { authorInclude = { model: Database.authorModel, From 20ec54e085ef0d7491ddfe0b40bbcc50a2ba4852 Mon Sep 17 00:00:00 2001 From: pmangro <160148596+pmangro@users.noreply.github.com> Date: Tue, 27 Feb 2024 14:31:21 -0300 Subject: [PATCH 72/81] [PT-BR] Updated strings --- client/strings/pt-br.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/client/strings/pt-br.json b/client/strings/pt-br.json index 14e7f52a..1d88c209 100644 --- a/client/strings/pt-br.json +++ b/client/strings/pt-br.json @@ -43,7 +43,7 @@ "ButtonMatchAllAuthors": "Consultar Todos os Autores", "ButtonMatchBooks": "Consultar Livros", "ButtonNevermind": "Cancelar", - "ButtonNext": "Next", + "ButtonNext": "Próximo", "ButtonNextChapter": "Próximo Capítulo", "ButtonOk": "Ok", "ButtonOpenFeed": "Abrir Feed", @@ -52,7 +52,7 @@ "ButtonPlay": "Reproduzir", "ButtonPlaying": "Reproduzindo", "ButtonPlaylists": "Lista de Reprodução", - "ButtonPrevious": "Previous", + "ButtonPrevious": "Anterior", "ButtonPreviousChapter": "Capítulo Anterior", "ButtonPurgeAllCache": "Apagar Todo o Cache", "ButtonPurgeItemsCache": "Apagar o Cache de Itens", @@ -61,7 +61,7 @@ "ButtonQueueRemoveItem": "Remover da Lista", "ButtonQuickMatch": "Consulta rápida", "ButtonRead": "Ler", - "ButtonRefresh": "Refresh", + "ButtonRefresh": "Atualizar", "ButtonRemove": "Remover", "ButtonRemoveAll": "Remover Todos", "ButtonRemoveAllLibraryItems": "Remover Todos os Itens da Biblioteca", @@ -81,7 +81,7 @@ "ButtonSelectFolderPath": "Selecionar Caminho da Pasta", "ButtonSeries": "Séries", "ButtonSetChaptersFromTracks": "Definir Capítulos Segundo Faixas", - "ButtonShare": "Share", + "ButtonShare": "Compartilhar", "ButtonShiftTimes": "Deslocar tempos", "ButtonShow": "Exibir", "ButtonStartM4BEncode": "Iniciar Codificação M4B", @@ -184,7 +184,7 @@ "HeaderUpdateDetails": "Atualizar Detalhes", "HeaderUpdateLibrary": "Atualizar Biblioteca", "HeaderUsers": "Usuários", - "HeaderYearReview": "Year {0} in Review", + "HeaderYearReview": "Retrospectiva de {0} ", "HeaderYourStats": "Suas Estatísticas", "LabelAbridged": "Versão Abreviada", "LabelAccountType": "Tipo de Conta", @@ -396,13 +396,13 @@ "LabelPermissionsDownload": "Pode Fazer Download", "LabelPermissionsUpdate": "Pode Atualizar", "LabelPermissionsUpload": "Pode Fazer Upload", - "LabelPersonalYearReview": "Your Year in Review ({0})", + "LabelPersonalYearReview": "Sua Retrospectiva Anual ({0})", "LabelPhotoPathURL": "Caminho/URL para Foto", "LabelPlaylists": "Listas de Reprodução", "LabelPlayMethod": "Método de Reprodução", "LabelPodcast": "Podcast", "LabelPodcasts": "Podcasts", - "LabelPodcastSearchRegion": "Podcast search region", + "LabelPodcastSearchRegion": "Região de busca do podcast", "LabelPodcastType": "Tipo de Podcast", "LabelPort": "Porta", "LabelPrefixesToIgnore": "Prefixos para Ignorar (sem distinção entre maiúsculas e minúsculas)", @@ -442,7 +442,7 @@ "LabelSeries": "Série", "LabelSeriesName": "Nome da Série", "LabelSeriesProgress": "Progresso da Série", - "LabelServerYearReview": "Server Year in Review ({0})", + "LabelServerYearReview": "Retrospectiva Anual do Servidor ({0})", "LabelSetEbookAsPrimary": "Definir como principal", "LabelSetEbookAsSupplementary": "Definir como complementar", "LabelSettingsAudiobooksOnly": "Apenas Audiobooks", @@ -559,8 +559,8 @@ "LabelViewQueue": "Ver fila do reprodutor", "LabelVolume": "Volume", "LabelWeekdaysToRun": "Dias da semana para executar", - "LabelYearReviewHide": "Hide Year in Review", - "LabelYearReviewShow": "See Year in Review", + "LabelYearReviewHide": "Ocultar Retrospectiva Anual", + "LabelYearReviewShow": "Exibir Retrospectiva Anual", "LabelYourAudiobookDuration": "Duração do seu audiobook", "LabelYourBookmarks": "Seus Marcadores", "LabelYourPlaylists": "Suas Listas de Reprodução", @@ -774,4 +774,4 @@ "ToastSocketFailedToConnect": "Falha na conexão do socket", "ToastUserDeleteFailed": "Falha ao apagar usuário", "ToastUserDeleteSuccess": "Usuário apagado" -} \ No newline at end of file +} From 38f12f47950713557a92def0f6871fef2482c7cc Mon Sep 17 00:00:00 2001 From: advplyr Date: Tue, 27 Feb 2024 17:17:33 -0600 Subject: [PATCH 73/81] Fix:Podcast schedule max new episodes to download setting to 0 and fix input blurs #2680 --- client/components/modals/item/tabs/Schedule.vue | 11 ++++++++--- server/objects/mediaTypes/Podcast.js | 8 +++++++- server/utils/index.js | 4 +++- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/client/components/modals/item/tabs/Schedule.vue b/client/components/modals/item/tabs/Schedule.vue index 032936d1..819ede19 100644 --- a/client/components/modals/item/tabs/Schedule.vue +++ b/client/components/modals/item/tabs/Schedule.vue @@ -20,7 +20,7 @@
- +

Max new episodes to download per check @@ -129,9 +129,12 @@ export default { return } } - if (this.$refs.maxEpisodesInput && this.$refs.maxEpisodesInput.isFocused) { + + if (this.$refs.maxEpisodesInput?.isFocused) { this.$refs.maxEpisodesInput.blur() - return + } + if (this.$refs.maxEpisodesToDownloadInput?.isFocused) { + this.$refs.maxEpisodesToDownloadInput.blur() } const updatePayload = { @@ -140,9 +143,11 @@ export default { if (this.enableAutoDownloadEpisodes) { updatePayload.autoDownloadSchedule = this.cronExpression } + this.newMaxEpisodesToKeep = Number(this.newMaxEpisodesToKeep) if (this.newMaxEpisodesToKeep !== this.maxEpisodesToKeep) { updatePayload.maxEpisodesToKeep = this.newMaxEpisodesToKeep } + this.newMaxNewEpisodesToDownload = Number(this.newMaxNewEpisodesToDownload) if (this.newMaxNewEpisodesToDownload !== this.maxNewEpisodesToDownload) { updatePayload.maxNewEpisodesToDownload = this.newMaxNewEpisodesToDownload } diff --git a/server/objects/mediaTypes/Podcast.js b/server/objects/mediaTypes/Podcast.js index a0e5de04..6f7ca337 100644 --- a/server/objects/mediaTypes/Podcast.js +++ b/server/objects/mediaTypes/Podcast.js @@ -42,7 +42,13 @@ class Podcast { this.autoDownloadSchedule = podcast.autoDownloadSchedule || '0 * * * *' // Added in 2.1.3 so default to hourly this.lastEpisodeCheck = podcast.lastEpisodeCheck || 0 this.maxEpisodesToKeep = podcast.maxEpisodesToKeep || 0 - this.maxNewEpisodesToDownload = podcast.maxNewEpisodesToDownload || 3 + + // Default is 3 but 0 is allowed + if (typeof podcast.maxNewEpisodesToDownload !== 'number') { + this.maxNewEpisodesToDownload = 3 + } else { + this.maxNewEpisodesToDownload = podcast.maxNewEpisodesToDownload + } } toJSON() { diff --git a/server/utils/index.js b/server/utils/index.js index f75572ba..6a89621b 100644 --- a/server/utils/index.js +++ b/server/utils/index.js @@ -114,7 +114,9 @@ module.exports.reqSupportsWebp = (req) => { module.exports.areEquivalent = areEquivalent module.exports.copyValue = (val) => { - if (!val) return val === false ? false : null + if (val === undefined || val === '') return null + else if (!val) return val + if (!this.isObject(val)) return val if (Array.isArray(val)) { From d2b006b909f2b3ab2569e3929f8018aeb342fe75 Mon Sep 17 00:00:00 2001 From: advplyr Date: Wed, 28 Feb 2024 16:16:26 -0600 Subject: [PATCH 74/81] Update:Windows binary manager to install ffmpeg/ffprobe 5.1 #1098 --- server/managers/BinaryManager.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/managers/BinaryManager.js b/server/managers/BinaryManager.js index ec4ed3b6..b4121ab8 100644 --- a/server/managers/BinaryManager.js +++ b/server/managers/BinaryManager.js @@ -11,8 +11,8 @@ const fileUtils = require('../utils/fileUtils') class BinaryManager { defaultRequiredBinaries = [ - { name: 'ffmpeg', envVariable: 'FFMPEG_PATH', validVersions: ['5.1', '6'] }, - { name: 'ffprobe', envVariable: 'FFPROBE_PATH', validVersions: ['5.1', '6'] } + { name: 'ffmpeg', envVariable: 'FFMPEG_PATH', validVersions: ['5.1'] }, + { name: 'ffprobe', envVariable: 'FFPROBE_PATH', validVersions: ['5.1'] } ] constructor(requiredBinaries = this.defaultRequiredBinaries) { @@ -135,7 +135,7 @@ class BinaryManager { if (!binaries.length) return Logger.info(`[BinaryManager] Installing binaries: ${binaries.join(', ')}`) let destination = await fileUtils.isWritable(this.mainInstallPath) ? this.mainInstallPath : this.altInstallPath - await ffbinaries.downloadBinaries(binaries, { destination, version: '6.1', force: true }) + await ffbinaries.downloadBinaries(binaries, { destination, version: '5.1', force: true }) Logger.info(`[BinaryManager] Binaries installed to ${destination}`) } From 79d32274aa5c5a5cc02975e3dbc3b36fdebdb3e6 Mon Sep 17 00:00:00 2001 From: Lars Kiesow Date: Thu, 29 Feb 2024 18:16:29 +0100 Subject: [PATCH 75/81] Fix log source in log file The logger should include a source containing the location where the logger was called. This works well for logging to `stdout`. Unfortunately, the file logs contain the locations where the file logging is called inside of the logger. This is not helpful: ``` {"timestamp":"2023-11-19 16:35:43","source":"Logger.js:114","message":"[oldDbFiles] Processed db data file with 1 entities","levelName":"INFO","level":2} {"timestamp":"2023-11-19 16:35:43","source":"Logger.js:114","message":"[oldDbFiles] Finished loading db data with 2 entities","levelName":"INFO","level":2} {"timestamp":"2023-11-19 16:35:43","source":"Logger.js:114","message":"[oldDbFiles] 2 settings loaded","levelName":"INFO","level":2} ``` This patch fixes the issue, ensureing that the actual source location will be logged: ``` {"timestamp":"2024-02-29 18:12:59.832","source":"DailyLog.js:132","message":"[DailyLog] 2024-02-29: Loaded 20 Logs","levelName":"DEBUG","level":1} {"timestamp":"2024-02-29 18:12:59.638","source":"Server.js:172","message":"=== Starting Server ===","levelName":"INFO","level":2} {"timestamp":"2024-02-29 18:12:59.638","source":"Server.js:103","message":"[Server] Init v2.8.0","levelName":"INFO","level":2} ``` --- server/Logger.js | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/server/Logger.js b/server/Logger.js index ba20801f..7cc7aa4c 100644 --- a/server/Logger.js +++ b/server/Logger.js @@ -70,14 +70,15 @@ class Logger { } /** - * - * @param {number} level - * @param {string[]} args + * + * @param {number} level + * @param {string[]} args + * @param {string} src */ - async handleLog(level, args) { + async handleLog(level, args, src) { const logObj = { timestamp: this.timestamp, - source: this.source, + source: src, message: args.join(' '), levelName: this.getLogLevelString(level), level @@ -104,31 +105,31 @@ class Logger { trace(...args) { if (this.logLevel > LogLevel.TRACE) return console.trace(`[${this.timestamp}] TRACE:`, ...args) - this.handleLog(LogLevel.TRACE, args) + this.handleLog(LogLevel.TRACE, args, this.source) } debug(...args) { if (this.logLevel > LogLevel.DEBUG) return console.debug(`[${this.timestamp}] DEBUG:`, ...args, `(${this.source})`) - this.handleLog(LogLevel.DEBUG, args) + this.handleLog(LogLevel.DEBUG, args, this.source) } info(...args) { if (this.logLevel > LogLevel.INFO) return console.info(`[${this.timestamp}] INFO:`, ...args) - this.handleLog(LogLevel.INFO, args) + this.handleLog(LogLevel.INFO, args, this.source) } warn(...args) { if (this.logLevel > LogLevel.WARN) return console.warn(`[${this.timestamp}] WARN:`, ...args, `(${this.source})`) - this.handleLog(LogLevel.WARN, args) + this.handleLog(LogLevel.WARN, args, this.source) } error(...args) { if (this.logLevel > LogLevel.ERROR) return console.error(`[${this.timestamp}] ERROR:`, ...args, `(${this.source})`) - this.handleLog(LogLevel.ERROR, args) + this.handleLog(LogLevel.ERROR, args, this.source) } /** @@ -139,12 +140,12 @@ class Logger { */ fatal(...args) { console.error(`[${this.timestamp}] FATAL:`, ...args, `(${this.source})`) - return this.handleLog(LogLevel.FATAL, args) + return this.handleLog(LogLevel.FATAL, args, this.source) } note(...args) { console.log(`[${this.timestamp}] NOTE:`, ...args) - this.handleLog(LogLevel.NOTE, args) + this.handleLog(LogLevel.NOTE, args, this.source) } } module.exports = new Logger() \ No newline at end of file From 763bb1b8293fe1ca1e17336f4cdb5c5d506d4483 Mon Sep 17 00:00:00 2001 From: advplyr Date: Thu, 29 Feb 2024 13:59:00 -0600 Subject: [PATCH 76/81] Map ebook filter translations --- client/strings/cs.json | 2 ++ client/strings/da.json | 2 ++ client/strings/es.json | 2 ++ client/strings/et.json | 2 ++ client/strings/fr.json | 2 ++ client/strings/gu.json | 2 ++ client/strings/hi.json | 2 ++ client/strings/hr.json | 2 ++ client/strings/hu.json | 2 ++ client/strings/it.json | 2 ++ client/strings/lt.json | 2 ++ client/strings/nl.json | 2 ++ client/strings/no.json | 2 ++ client/strings/pl.json | 2 ++ client/strings/pt-br.json | 2 ++ client/strings/ru.json | 2 ++ client/strings/sv.json | 2 ++ client/strings/zh-cn.json | 2 ++ 18 files changed, 36 insertions(+) diff --git a/client/strings/cs.json b/client/strings/cs.json index 3134d60d..7dc18aa6 100644 --- a/client/strings/cs.json +++ b/client/strings/cs.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Metaznačky", "LabelMinute": "Minuta", "LabelMissing": "Chybějící", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Chybějící díly", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs", "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is audiobookshelf://oauth, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (*) as the sole entry permits any URI.", "LabelMore": "Více", diff --git a/client/strings/da.json b/client/strings/da.json index f79f19b1..8c305ca2 100644 --- a/client/strings/da.json +++ b/client/strings/da.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Meta-tags", "LabelMinute": "Minut", "LabelMissing": "Mangler", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Manglende dele", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs", "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is audiobookshelf://oauth, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (*) as the sole entry permits any URI.", "LabelMore": "Mere", diff --git a/client/strings/es.json b/client/strings/es.json index 75052413..452b625d 100644 --- a/client/strings/es.json +++ b/client/strings/es.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Metaetiquetas", "LabelMinute": "Minuto", "LabelMissing": "Ausente", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Partes Ausentes", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "URIs de redirección a móviles permitidos", "LabelMobileRedirectURIsDescription": "Esta es una lista de URIs válidos para redireccionamiento de apps móviles. La URI por defecto es audiobookshelf://oauth, la cual puedes remover or corroborar con URIs adicionales para la integración con apps de terceros. Utilizando un asterisco (*) como el único punto de entrada permite cualquier URI.", "LabelMore": "Más", diff --git a/client/strings/et.json b/client/strings/et.json index 07f9eef0..8c13c435 100644 --- a/client/strings/et.json +++ b/client/strings/et.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Meta märgendid", "LabelMinute": "Minut", "LabelMissing": "Puudub", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Puuduvad osad", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "Lubatud mobiilile suunamise URI-d", "LabelMobileRedirectURIsDescription": "See on mobiilirakenduste jaoks kehtivate suunamise URI-de lubatud nimekiri. Vaikimisi on selleks audiobookshelf://oauth, mida saate eemaldada või täiendada täiendavate URI-dega kolmanda osapoole rakenduste integreerimiseks. Tärni (*) ainukese kirjena kasutamine võimaldab mis tahes URI-d.", "LabelMore": "Rohkem", diff --git a/client/strings/fr.json b/client/strings/fr.json index bbf38e18..d855c366 100644 --- a/client/strings/fr.json +++ b/client/strings/fr.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Balises de métadonnée", "LabelMinute": "Minute", "LabelMissing": "Manquant", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Parties manquantes", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "URI de redirection mobile autorisés", "LabelMobileRedirectURIsDescription": "Il s'agit d'une liste blanche d’URI de redirection valides pour les applications mobiles. Celui par défaut est audiobookshelf://oauth, que vous pouvez supprimer ou compléter avec des URIs supplémentaires pour l'intégration d'applications tierces. L’utilisation d’un astérisque (*) comme seule entrée autorise n’importe quel URI.", "LabelMore": "Plus", diff --git a/client/strings/gu.json b/client/strings/gu.json index 2f3d9cd8..eff18343 100644 --- a/client/strings/gu.json +++ b/client/strings/gu.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Meta Tags", "LabelMinute": "Minute", "LabelMissing": "Missing", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Missing Parts", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs", "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is audiobookshelf://oauth, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (*) as the sole entry permits any URI.", "LabelMore": "More", diff --git a/client/strings/hi.json b/client/strings/hi.json index 01667b59..d126e9f5 100644 --- a/client/strings/hi.json +++ b/client/strings/hi.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Meta Tags", "LabelMinute": "Minute", "LabelMissing": "Missing", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Missing Parts", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs", "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is audiobookshelf://oauth, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (*) as the sole entry permits any URI.", "LabelMore": "More", diff --git a/client/strings/hr.json b/client/strings/hr.json index 8aa933c7..313505ac 100644 --- a/client/strings/hr.json +++ b/client/strings/hr.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Meta Tags", "LabelMinute": "Minuta", "LabelMissing": "Nedostaje", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Nedostajali dijelovi", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs", "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is audiobookshelf://oauth, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (*) as the sole entry permits any URI.", "LabelMore": "Više", diff --git a/client/strings/hu.json b/client/strings/hu.json index d52957e1..1829916a 100644 --- a/client/strings/hu.json +++ b/client/strings/hu.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Meta címkék", "LabelMinute": "Perc", "LabelMissing": "Hiányzó", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Hiányzó részek", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "Engedélyezett mobil átirányítási URI-k", "LabelMobileRedirectURIsDescription": "Ez egy fehérlista az érvényes mobilalkalmazás-átirányítási URI-k számára. Az alapértelmezett audiobookshelf://oauth, amely eltávolítható vagy kiegészíthető további URI-kkal harmadik féltől származó alkalmazásintegráció érdekében. Ha az egyetlen bejegyzés egy csillag (*), akkor bármely URI engedélyezett.", "LabelMore": "Több", diff --git a/client/strings/it.json b/client/strings/it.json index 26a61fda..f4e97048 100644 --- a/client/strings/it.json +++ b/client/strings/it.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Meta Tags", "LabelMinute": "Minuto", "LabelMissing": "Altro", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Parti rimanenti", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "URI di reindirizzamento mobile consentiti", "LabelMobileRedirectURIsDescription": "Questa è una lista bianca di URI di reindirizzamento validi per le app mobili. Quello predefinito è audiobookshelf://oauth, che puoi rimuovere o integrare con URI aggiuntivi per l'integrazione di app di terze parti. Utilizzando un asterisco (*) poiché l'unica voce consente qualsiasi URI.", "LabelMore": "Molto", diff --git a/client/strings/lt.json b/client/strings/lt.json index 1c2558c9..4d97ab47 100644 --- a/client/strings/lt.json +++ b/client/strings/lt.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Meta žymos", "LabelMinute": "Minutė", "LabelMissing": "Trūksta", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Trūkstamos dalys", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs", "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is audiobookshelf://oauth, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (*) as the sole entry permits any URI.", "LabelMore": "Daugiau", diff --git a/client/strings/nl.json b/client/strings/nl.json index dd06146d..858b3de6 100644 --- a/client/strings/nl.json +++ b/client/strings/nl.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Meta-tags", "LabelMinute": "Minuut", "LabelMissing": "Ontbrekend", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Ontbrekende delen", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs", "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is audiobookshelf://oauth, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (*) as the sole entry permits any URI.", "LabelMore": "Meer", diff --git a/client/strings/no.json b/client/strings/no.json index a29a7ef2..065d28df 100644 --- a/client/strings/no.json +++ b/client/strings/no.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Meta Tags", "LabelMinute": "Minutt", "LabelMissing": "Mangler", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Manglende deler", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs", "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is audiobookshelf://oauth, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (*) as the sole entry permits any URI.", "LabelMore": "Mer", diff --git a/client/strings/pl.json b/client/strings/pl.json index 3189ccb7..2d4141ba 100644 --- a/client/strings/pl.json +++ b/client/strings/pl.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Meta Tags", "LabelMinute": "Minuta", "LabelMissing": "Brakujący", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Brakujące cześci", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs", "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is audiobookshelf://oauth, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (*) as the sole entry permits any URI.", "LabelMore": "Więcej", diff --git a/client/strings/pt-br.json b/client/strings/pt-br.json index 14e7f52a..887b05b9 100644 --- a/client/strings/pt-br.json +++ b/client/strings/pt-br.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Etiquetas Meta", "LabelMinute": "Minuto", "LabelMissing": "Ausente", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Partes Ausentes", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "URIs de redirecionamento móveis permitidas", "LabelMobileRedirectURIsDescription": "Essa é uma lista de permissionamento para URIs válidas para o redirecionamento de aplicativos móveis. A padrão é audiobookshelf://oauth, que pode ser removida ou acrescentada com novas URIs para integração com apps de terceiros. Usando um asterisco (*) como um item único dará permissão para qualquer URI.", "LabelMore": "Mais", diff --git a/client/strings/ru.json b/client/strings/ru.json index adc3b48b..6d690ee6 100644 --- a/client/strings/ru.json +++ b/client/strings/ru.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Мета теги", "LabelMinute": "Минуты", "LabelMissing": "Потеряно", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Потерянные части", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "Разрешенные URI перенаправления с мобильных устройств", "LabelMobileRedirectURIsDescription": "Это белый список допустимых URI перенаправления для мобильных приложений. По умолчанию используется audiobookshelf://oauth, который можно удалить или дополнить дополнительными URI для интеграции со сторонними приложениями. Использование звездочки (*) в качестве единственной записи разрешает любой URI.", "LabelMore": "Еще", diff --git a/client/strings/sv.json b/client/strings/sv.json index 9560e765..55e92be4 100644 --- a/client/strings/sv.json +++ b/client/strings/sv.json @@ -356,7 +356,9 @@ "LabelMetaTags": "Metamärken", "LabelMinute": "Minut", "LabelMissing": "Saknad", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "Saknade delar", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs", "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is audiobookshelf://oauth, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (*) as the sole entry permits any URI.", "LabelMore": "Mer", diff --git a/client/strings/zh-cn.json b/client/strings/zh-cn.json index c1d9345f..0634c74f 100644 --- a/client/strings/zh-cn.json +++ b/client/strings/zh-cn.json @@ -356,7 +356,9 @@ "LabelMetaTags": "元标签", "LabelMinute": "分钟", "LabelMissing": "丢失", + "LabelMissingEbook": "Has no ebook", "LabelMissingParts": "丢失的部分", + "LabelMissingSupplementaryEbook": "Has no supplementary ebook", "LabelMobileRedirectURIs": "允许移动应用重定向 URI", "LabelMobileRedirectURIsDescription": "这是移动应用程序的有效重定向 URI 白名单. 默认值为 audiobookshelf://oauth,您可以删除它或添加其他 URI 以进行第三方应用集成. 使用星号 (*) 作为唯一条目允许任何 URI.", "LabelMore": "更多", From 4fe672f09d794c05d31a9375b2a686ed1c0dfe10 Mon Sep 17 00:00:00 2001 From: mikiher Date: Fri, 1 Mar 2024 11:55:53 +0200 Subject: [PATCH 77/81] Update cover image URLs with timestamp where available --- client/components/modals/item/tabs/Match.vue | 4 ++-- client/pages/library/_library/podcast/latest.vue | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/client/components/modals/item/tabs/Match.vue b/client/components/modals/item/tabs/Match.vue index 7051a444..72aa7116 100644 --- a/client/components/modals/item/tabs/Match.vue +++ b/client/components/modals/item/tabs/Match.vue @@ -49,8 +49,8 @@

Current

- - + +
diff --git a/client/pages/library/_library/podcast/latest.vue b/client/pages/library/_library/podcast/latest.vue index 42f107c8..3fc47dfd 100644 --- a/client/pages/library/_library/podcast/latest.vue +++ b/client/pages/library/_library/podcast/latest.vue @@ -8,11 +8,11 @@

{{ $strings.MessageNoEpisodes }}