mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	Merge pull request #3500 from nichwall/2_14_0_strings
2.14.0 string localization
This commit is contained in:
		
						commit
						f94449a659
					
				| @ -325,7 +325,7 @@ export default { | |||||||
|     }, |     }, | ||||||
|     displaySubtitle() { |     displaySubtitle() { | ||||||
|       if (!this.libraryItem) return '\u00A0' |       if (!this.libraryItem) return '\u00A0' | ||||||
|       if (this.collapsedSeries) return this.collapsedSeries.numBooks === 1 ? '1 book' : `${this.collapsedSeries.numBooks} books` |       if (this.collapsedSeries) return `${this.collapsedSeries.numBooks} ${this.$strings.LabelBooks}` | ||||||
|       if (this.mediaMetadata.subtitle) return this.mediaMetadata.subtitle |       if (this.mediaMetadata.subtitle) return this.mediaMetadata.subtitle | ||||||
|       if (this.mediaMetadata.seriesName) return this.mediaMetadata.seriesName |       if (this.mediaMetadata.seriesName) return this.mediaMetadata.seriesName | ||||||
|       return '' |       return '' | ||||||
|  | |||||||
| @ -33,18 +33,18 @@ | |||||||
|             <span class="material-symbols text-lg ml-2">launch</span> |             <span class="material-symbols text-lg ml-2">launch</span> | ||||||
|           </ui-btn> |           </ui-btn> | ||||||
| 
 | 
 | ||||||
|           <ui-btn v-if="!isMetadataEmbedQueued && !isEmbedTaskRunning" class="w-full mt-4" small @click.stop="quickEmbed">Quick Embed</ui-btn> |           <ui-btn v-if="!isMetadataEmbedQueued && !isEmbedTaskRunning" class="w-full mt-4" small @click.stop="quickEmbed">{{ $strings.ButtonQuickEmbed }}</ui-btn> | ||||||
|         </div> |         </div> | ||||||
|       </div> |       </div> | ||||||
| 
 | 
 | ||||||
|       <!-- queued alert --> |       <!-- queued alert --> | ||||||
|       <widgets-alert v-if="isMetadataEmbedQueued" type="warning" class="mt-4"> |       <widgets-alert v-if="isMetadataEmbedQueued" type="warning" class="mt-4"> | ||||||
|         <p class="text-lg">Queued for metadata embed ({{ queuedEmbedLIds.length }} in queue)</p> |         <p class="text-lg">{{ $getString('MessageQuickEmbedQueue', [queuedEmbedLIds.length]) }}</p> | ||||||
|       </widgets-alert> |       </widgets-alert> | ||||||
| 
 | 
 | ||||||
|       <!-- processing alert --> |       <!-- processing alert --> | ||||||
|       <widgets-alert v-if="isEmbedTaskRunning" type="warning" class="mt-4"> |       <widgets-alert v-if="isEmbedTaskRunning" type="warning" class="mt-4"> | ||||||
|         <p class="text-lg">Currently embedding metadata</p> |         <p class="text-lg">{{ $strings.MessageQuickEmbedInProgress }}</p> | ||||||
|       </widgets-alert> |       </widgets-alert> | ||||||
|     </div> |     </div> | ||||||
| 
 | 
 | ||||||
| @ -113,7 +113,7 @@ export default { | |||||||
|   methods: { |   methods: { | ||||||
|     quickEmbed() { |     quickEmbed() { | ||||||
|       const payload = { |       const payload = { | ||||||
|         message: 'Warning! Quick embed will not backup your audio files. Make sure that you have a backup of your audio files. <br><br>Would you like to continue?', |         message: this.$strings.MessageConfirmQuickEmbed, | ||||||
|         callback: (confirmed) => { |         callback: (confirmed) => { | ||||||
|           if (confirmed) { |           if (confirmed) { | ||||||
|             this.$axios |             this.$axios | ||||||
|  | |||||||
| @ -77,7 +77,13 @@ export default { | |||||||
|       return this.notificationData.events || [] |       return this.notificationData.events || [] | ||||||
|     }, |     }, | ||||||
|     eventOptions() { |     eventOptions() { | ||||||
|       return this.notificationEvents.map((e) => ({ value: e.name, text: e.name, subtext: e.description })) |       return this.notificationEvents.map((e) => { | ||||||
|  |         return { | ||||||
|  |           value: e.name, | ||||||
|  |           text: e.name, | ||||||
|  |           subtext: this.$strings[e.descriptionKey] || e.description | ||||||
|  |         } | ||||||
|  |       }) | ||||||
|     }, |     }, | ||||||
|     selectedEventData() { |     selectedEventData() { | ||||||
|       return this.notificationEvents.find((e) => e.name === this.newNotification.eventName) |       return this.notificationEvents.find((e) => e.name === this.newNotification.eventName) | ||||||
|  | |||||||
| @ -63,11 +63,11 @@ | |||||||
|     <div class="w-full max-w-4xl mx-auto"> |     <div class="w-full max-w-4xl mx-auto"> | ||||||
|       <!-- queued alert --> |       <!-- queued alert --> | ||||||
|       <widgets-alert v-if="isMetadataEmbedQueued" type="warning" class="mb-4"> |       <widgets-alert v-if="isMetadataEmbedQueued" type="warning" class="mb-4"> | ||||||
|         <p class="text-lg">Audiobook is queued for metadata embed ({{ queuedEmbedLIds.length }} in queue)</p> |         <p class="text-lg">{{ $getString('MessageEmbedQueue', [queuedEmbedLIds.length]) }}</p> | ||||||
|       </widgets-alert> |       </widgets-alert> | ||||||
|       <!-- metadata embed action buttons --> |       <!-- metadata embed action buttons --> | ||||||
|       <div v-else-if="isEmbedTool" class="w-full flex justify-end items-center mb-4"> |       <div v-else-if="isEmbedTool" class="w-full flex justify-end items-center mb-4"> | ||||||
|         <ui-checkbox v-if="!isTaskFinished" v-model="shouldBackupAudioFiles" :disabled="processing" label="Backup audio files" medium checkbox-bg="bg" label-class="pl-2 text-base md:text-lg" @input="toggleBackupAudioFiles" /> |         <ui-checkbox v-if="!isTaskFinished" v-model="shouldBackupAudioFiles" :disabled="processing" :label="$strings.LabelBackupAudioFiles" medium checkbox-bg="bg" label-class="pl-2 text-base md:text-lg" @input="toggleBackupAudioFiles" /> | ||||||
| 
 | 
 | ||||||
|         <div class="flex-grow" /> |         <div class="flex-grow" /> | ||||||
| 
 | 
 | ||||||
| @ -78,7 +78,7 @@ | |||||||
|       <!-- m4b embed action buttons --> |       <!-- m4b embed action buttons --> | ||||||
|       <div v-else class="w-full flex items-center mb-4"> |       <div v-else class="w-full flex items-center mb-4"> | ||||||
|         <button :disabled="processing" class="text-sm uppercase text-gray-200 flex items-center pt-px pl-1 pr-2 hover:bg-white/5 rounded-md" @click="showEncodeOptions = !showEncodeOptions"> |         <button :disabled="processing" class="text-sm uppercase text-gray-200 flex items-center pt-px pl-1 pr-2 hover:bg-white/5 rounded-md" @click="showEncodeOptions = !showEncodeOptions"> | ||||||
|           <span class="material-symbols text-xl">{{ showEncodeOptions || usingCustomEncodeOptions ? 'check_box' : 'check_box_outline_blank' }}</span> <span class="pl-1">Use Advanced Options</span> |           <span class="material-symbols text-xl">{{ showEncodeOptions || usingCustomEncodeOptions ? 'check_box' : 'check_box_outline_blank' }}</span> <span class="pl-1">{{ $strings.LabelUseAdvancedOptions }}</span> | ||||||
|         </button> |         </button> | ||||||
| 
 | 
 | ||||||
|         <div class="flex-grow" /> |         <div class="flex-grow" /> | ||||||
| @ -94,11 +94,11 @@ | |||||||
|         <transition name="slide"> |         <transition name="slide"> | ||||||
|           <div v-if="showEncodeOptions || usingCustomEncodeOptions" class="mb-4 pb-4 border-b border-white/10"> |           <div v-if="showEncodeOptions || usingCustomEncodeOptions" class="mb-4 pb-4 border-b border-white/10"> | ||||||
|             <div class="flex flex-wrap -mx-2"> |             <div class="flex flex-wrap -mx-2"> | ||||||
|               <ui-text-input-with-label ref="bitrateInput" v-model="encodingOptions.bitrate" :disabled="processing || isTaskFinished" :label="'Audio Bitrate (e.g. 128k)'" class="m-2 max-w-40" @input="bitrateChanged" /> |               <ui-text-input-with-label ref="bitrateInput" v-model="encodingOptions.bitrate" :disabled="processing || isTaskFinished" :label="$strings.LabelAudioBitrate" class="m-2 max-w-40" @input="bitrateChanged" /> | ||||||
|               <ui-text-input-with-label ref="channelsInput" v-model="encodingOptions.channels" :disabled="processing || isTaskFinished" :label="'Audio Channels (1 or 2)'" class="m-2 max-w-40" @input="channelsChanged" /> |               <ui-text-input-with-label ref="channelsInput" v-model="encodingOptions.channels" :disabled="processing || isTaskFinished" :label="$strings.LabelAudioChannels" class="m-2 max-w-40" @input="channelsChanged" /> | ||||||
|               <ui-text-input-with-label ref="codecInput" v-model="encodingOptions.codec" :disabled="processing || isTaskFinished" :label="'Audio Codec'" class="m-2 max-w-40" @input="codecChanged" /> |               <ui-text-input-with-label ref="codecInput" v-model="encodingOptions.codec" :disabled="processing || isTaskFinished" :label="$strings.LabelAudioCodec" class="m-2 max-w-40" @input="codecChanged" /> | ||||||
|             </div> |             </div> | ||||||
|             <p class="text-sm text-warning">Warning: Do not update these settings unless you are familiar with ffmpeg encoding options.</p> |             <p class="text-sm text-warning">{{ $strings.LabelEncodingWarningAdvancedSettings }}</p> | ||||||
|           </div> |           </div> | ||||||
|         </transition> |         </transition> | ||||||
|       </div> |       </div> | ||||||
| @ -106,36 +106,36 @@ | |||||||
|       <div class="mb-4"> |       <div class="mb-4"> | ||||||
|         <div v-if="isEmbedTool" class="flex items-start mb-2"> |         <div v-if="isEmbedTool" class="flex items-start mb-2"> | ||||||
|           <span class="material-symbols text-base text-warning pt-1">star</span> |           <span class="material-symbols text-base text-warning pt-1">star</span> | ||||||
|           <p class="text-gray-200 ml-2">Metadata will be embedded in the audio tracks inside your audiobook folder.</p> |           <p class="text-gray-200 ml-2">{{ $strings.LabelEncodingInfoEmbedded }}</p> | ||||||
|         </div> |         </div> | ||||||
|         <div v-else class="flex items-start mb-2"> |         <div v-else class="flex items-start mb-2"> | ||||||
|           <span class="material-symbols text-base text-warning pt-1">star</span> |           <span class="material-symbols text-base text-warning pt-1">star</span> | ||||||
|           <p class="text-gray-200 ml-2"> |           <p class="text-gray-200 ml-2"> | ||||||
|             Finished M4B will be put into your audiobook folder at <span class="rounded-md bg-neutral-600 text-sm text-white py-0.5 px-1 font-mono">.../{{ libraryItemRelPath }}/</span>. |             {{ $strings.LabelEncodingFinishedM4B }} <span class="rounded-md bg-neutral-600 text-sm text-white py-0.5 px-1 font-mono">.../{{ libraryItemRelPath }}/</span>. | ||||||
|           </p> |           </p> | ||||||
|         </div> |         </div> | ||||||
| 
 | 
 | ||||||
|         <div v-if="shouldBackupAudioFiles || isM4BTool" class="flex items-start mb-2"> |         <div v-if="shouldBackupAudioFiles || isM4BTool" class="flex items-start mb-2"> | ||||||
|           <span class="material-symbols text-base text-warning pt-1">star</span> |           <span class="material-symbols text-base text-warning pt-1">star</span> | ||||||
|           <p class="text-gray-200 ml-2"> |           <p class="text-gray-200 ml-2"> | ||||||
|             A backup of your original audio files will be stored in <span class="rounded-md bg-neutral-600 text-sm text-white py-0.5 px-1 font-mono">/metadata/cache/items/{{ libraryItemId }}/</span>. Make sure to periodically purge items cache. |             {{ $strings.LabelEncodingBackupLocation }} <span class="rounded-md bg-neutral-600 text-sm text-white py-0.5 px-1 font-mono">/metadata/cache/items/{{ libraryItemId }}/</span>. {{ $strings.LabelEncodingClearItemCache }} | ||||||
|           </p> |           </p> | ||||||
|         </div> |         </div> | ||||||
|         <div v-if="isEmbedTool && audioFiles.length > 1" class="flex items-start mb-2"> |         <div v-if="isEmbedTool && audioFiles.length > 1" class="flex items-start mb-2"> | ||||||
|           <span class="material-symbols text-base text-warning pt-1">star</span> |           <span class="material-symbols text-base text-warning pt-1">star</span> | ||||||
|           <p class="text-gray-200 ml-2">Chapters are not embedded in multi-track audiobooks.</p> |           <p class="text-gray-200 ml-2">{{ $strings.LabelEncodingChaptersNotEmbedded }}</p> | ||||||
|         </div> |         </div> | ||||||
|         <div v-if="isM4BTool" class="flex items-start mb-2"> |         <div v-if="isM4BTool" class="flex items-start mb-2"> | ||||||
|           <span class="material-symbols text-base text-warning pt-1">star</span> |           <span class="material-symbols text-base text-warning pt-1">star</span> | ||||||
|           <p class="text-gray-200 ml-2">Encoding can take up to 30 minutes.</p> |           <p class="text-gray-200 ml-2">{{ $strings.LabelEncodingTimeWarning }}</p> | ||||||
|         </div> |         </div> | ||||||
|         <div v-if="isM4BTool" class="flex items-start mb-2"> |         <div v-if="isM4BTool" class="flex items-start mb-2"> | ||||||
|           <span class="material-symbols text-base text-warning pt-1">star</span> |           <span class="material-symbols text-base text-warning pt-1">star</span> | ||||||
|           <p class="text-gray-200 ml-2">If you have the watcher disabled you will need to re-scan this audiobook afterwards.</p> |           <p class="text-gray-200 ml-2">{{ $strings.LabelEncodingWatcherDisabled }}</p> | ||||||
|         </div> |         </div> | ||||||
|         <div class="flex items-start mb-2"> |         <div class="flex items-start mb-2"> | ||||||
|           <span class="material-symbols text-base text-warning pt-1">star</span> |           <span class="material-symbols text-base text-warning pt-1">star</span> | ||||||
|           <p class="text-gray-200 ml-2">Once the task is started you can navigate away from this page.</p> |           <p class="text-gray-200 ml-2">{{ $strings.LabelEncodingStartedNavigation }}</p> | ||||||
|         </div> |         </div> | ||||||
|       </div> |       </div> | ||||||
|     </div> |     </div> | ||||||
| @ -269,11 +269,11 @@ export default { | |||||||
|     }, |     }, | ||||||
|     availableTools() { |     availableTools() { | ||||||
|       if (this.isSingleM4b) { |       if (this.isSingleM4b) { | ||||||
|         return [{ value: 'embed', text: 'Embed Metadata' }] |         return [{ value: 'embed', text: this.$strings.LabelToolsEmbedMetadata }] | ||||||
|       } else { |       } else { | ||||||
|         return [ |         return [ | ||||||
|           { value: 'embed', text: 'Embed Metadata' }, |           { value: 'embed', text: this.$strings.LabelToolsEmbedMetadata }, | ||||||
|           { value: 'm4b', text: 'M4B Encoder' } |           { value: 'm4b', text: this.$strings.LabelToolsM4bEncoder } | ||||||
|         ] |         ] | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  | |||||||
| @ -5,7 +5,7 @@ | |||||||
|     <div id="bookshelf" class="w-full overflow-y-auto px-2 py-6 sm:px-4 md:p-12 relative"> |     <div id="bookshelf" class="w-full overflow-y-auto px-2 py-6 sm:px-4 md:p-12 relative"> | ||||||
|       <div class="w-full max-w-4xl mx-auto flex"> |       <div class="w-full max-w-4xl mx-auto flex"> | ||||||
|         <form @submit.prevent="submit" class="flex flex-grow"> |         <form @submit.prevent="submit" class="flex flex-grow"> | ||||||
|           <ui-text-input v-model="searchInput" type="search" :disabled="processing" placeholder="Enter search term or RSS feed URL" class="flex-grow mr-2 text-sm md:text-base" /> |           <ui-text-input v-model="searchInput" type="search" :disabled="processing" :placeholder="$strings.MessagePodcastSearchField" class="flex-grow mr-2 text-sm md:text-base" /> | ||||||
|           <ui-btn type="submit" :disabled="processing" class="hidden md:block">{{ $strings.ButtonSubmit }}</ui-btn> |           <ui-btn type="submit" :disabled="processing" class="hidden md:block">{{ $strings.ButtonSubmit }}</ui-btn> | ||||||
|           <ui-btn type="submit" :disabled="processing" class="block md:hidden" small>{{ $strings.ButtonSubmit }}</ui-btn> |           <ui-btn type="submit" :disabled="processing" class="block md:hidden" small>{{ $strings.ButtonSubmit }}</ui-btn> | ||||||
|         </form> |         </form> | ||||||
| @ -108,7 +108,7 @@ export default { | |||||||
| 
 | 
 | ||||||
|       if (!txt || !txt.includes('<opml') || !txt.includes('<outline ')) { |       if (!txt || !txt.includes('<opml') || !txt.includes('<outline ')) { | ||||||
|         // Quick lazy check for valid OPML |         // Quick lazy check for valid OPML | ||||||
|         this.$toast.error('Invalid OPML file <opml> tag not found OR an <outline> tag was not found') |         this.$toast.error(this.$strings.MessageTaskOpmlParseFastFail) | ||||||
|         this.processing = false |         this.processing = false | ||||||
|         return |         return | ||||||
|       } |       } | ||||||
| @ -117,7 +117,7 @@ export default { | |||||||
|         .$post(`/api/podcasts/opml/parse`, { opmlText: txt }) |         .$post(`/api/podcasts/opml/parse`, { opmlText: txt }) | ||||||
|         .then((data) => { |         .then((data) => { | ||||||
|           if (!data.feeds?.length) { |           if (!data.feeds?.length) { | ||||||
|             this.$toast.error('No feeds found in OPML file') |             this.$toast.error(this.$strings.MessageTaskOpmlParseNoneFound) | ||||||
|           } else { |           } else { | ||||||
|             this.opmlFeeds = data.feeds || [] |             this.opmlFeeds = data.feeds || [] | ||||||
|             this.showOPMLFeedsModal = true |             this.showOPMLFeedsModal = true | ||||||
| @ -125,7 +125,7 @@ export default { | |||||||
|         }) |         }) | ||||||
|         .catch((error) => { |         .catch((error) => { | ||||||
|           console.error('Failed', error) |           console.error('Failed', error) | ||||||
|           this.$toast.error('Failed to parse OPML file') |           this.$toast.error(this.$strings.MessageTaskOpmlParseFailed) | ||||||
|         }) |         }) | ||||||
|         .finally(() => { |         .finally(() => { | ||||||
|           this.processing = false |           this.processing = false | ||||||
| @ -191,7 +191,7 @@ export default { | |||||||
|         return |         return | ||||||
|       } |       } | ||||||
|       if (!podcast.feedUrl) { |       if (!podcast.feedUrl) { | ||||||
|         this.$toast.error('Invalid podcast - no feed') |         this.$toast.error(this.$strings.MessageNoPodcastFeed) | ||||||
|         return |         return | ||||||
|       } |       } | ||||||
|       this.processing = true |       this.processing = true | ||||||
|  | |||||||
| @ -66,6 +66,7 @@ | |||||||
|   "ButtonPurgeItemsCache": "Purge Items Cache", |   "ButtonPurgeItemsCache": "Purge Items Cache", | ||||||
|   "ButtonQueueAddItem": "Add to queue", |   "ButtonQueueAddItem": "Add to queue", | ||||||
|   "ButtonQueueRemoveItem": "Remove from queue", |   "ButtonQueueRemoveItem": "Remove from queue", | ||||||
|  |   "ButtonQuickEmbed": "Quick Embed", | ||||||
|   "ButtonQuickEmbedMetadata": "Quick Embed Metadata", |   "ButtonQuickEmbedMetadata": "Quick Embed Metadata", | ||||||
|   "ButtonQuickMatch": "Quick Match", |   "ButtonQuickMatch": "Quick Match", | ||||||
|   "ButtonReScan": "Re-Scan", |   "ButtonReScan": "Re-Scan", | ||||||
| @ -225,6 +226,9 @@ | |||||||
|   "LabelAllUsersIncludingGuests": "All users including guests", |   "LabelAllUsersIncludingGuests": "All users including guests", | ||||||
|   "LabelAlreadyInYourLibrary": "Already in your library", |   "LabelAlreadyInYourLibrary": "Already in your library", | ||||||
|   "LabelAppend": "Append", |   "LabelAppend": "Append", | ||||||
|  |   "LabelAudioBitrate": "Audio Bitrate (e.g. 128k)", | ||||||
|  |   "LabelAudioChannels": "Audio Channels (1 or 2)", | ||||||
|  |   "LabelAudioCodec": "Audio Codec", | ||||||
|   "LabelAuthor": "Author", |   "LabelAuthor": "Author", | ||||||
|   "LabelAuthorFirstLast": "Author (First Last)", |   "LabelAuthorFirstLast": "Author (First Last)", | ||||||
|   "LabelAuthorLastFirst": "Author (Last, First)", |   "LabelAuthorLastFirst": "Author (Last, First)", | ||||||
| @ -237,6 +241,7 @@ | |||||||
|   "LabelAutoRegister": "Auto Register", |   "LabelAutoRegister": "Auto Register", | ||||||
|   "LabelAutoRegisterDescription": "Automatically create new users after logging in", |   "LabelAutoRegisterDescription": "Automatically create new users after logging in", | ||||||
|   "LabelBackToUser": "Back to User", |   "LabelBackToUser": "Back to User", | ||||||
|  |   "LabelBackupAudioFiles": "Backup Audio Files", | ||||||
|   "LabelBackupLocation": "Backup Location", |   "LabelBackupLocation": "Backup Location", | ||||||
|   "LabelBackupsEnableAutomaticBackups": "Enable automatic backups", |   "LabelBackupsEnableAutomaticBackups": "Enable automatic backups", | ||||||
|   "LabelBackupsEnableAutomaticBackupsHelp": "Backups saved in /metadata/backups", |   "LabelBackupsEnableAutomaticBackupsHelp": "Backups saved in /metadata/backups", | ||||||
| @ -303,6 +308,15 @@ | |||||||
|   "LabelEmailSettingsTestAddress": "Test Address", |   "LabelEmailSettingsTestAddress": "Test Address", | ||||||
|   "LabelEmbeddedCover": "Embedded Cover", |   "LabelEmbeddedCover": "Embedded Cover", | ||||||
|   "LabelEnable": "Enable", |   "LabelEnable": "Enable", | ||||||
|  |   "LabelEncodingBackupLocation": "A backup of your original audio files will be stored in:", | ||||||
|  |   "LabelEncodingChaptersNotEmbedded": "Chapters are not embedded in multi-track audiobooks.", | ||||||
|  |   "LabelEncodingClearItemCache": "Make sure to periodically purge items cache.", | ||||||
|  |   "LabelEncodingFinishedM4B": "Finished M4B will be put into your audiobook folder at:", | ||||||
|  |   "LabelEncodingInfoEmbedded": "Metadata will be embedded in the audio tracks inside your audiobook folder.", | ||||||
|  |   "LabelEncodingStartedNavigation": "Once the task is started you can navigate away from this page.", | ||||||
|  |   "LabelEncodingTimeWarning": "Encoding can take up to 30 minutes.", | ||||||
|  |   "LabelEncodingWarningAdvancedSettings": "Warning: Do not update these settings unless you are familiar with ffmpeg encoding options.", | ||||||
|  |   "LabelEncodingWatcherDisabled": "If you have the watcher disabled you will need to re-scan this audiobook afterwards.", | ||||||
|   "LabelEnd": "End", |   "LabelEnd": "End", | ||||||
|   "LabelEndOfChapter": "End of Chapter", |   "LabelEndOfChapter": "End of Chapter", | ||||||
|   "LabelEpisode": "Episode", |   "LabelEpisode": "Episode", | ||||||
| @ -596,6 +610,7 @@ | |||||||
|   "LabelTitle": "Title", |   "LabelTitle": "Title", | ||||||
|   "LabelToolsEmbedMetadata": "Embed Metadata", |   "LabelToolsEmbedMetadata": "Embed Metadata", | ||||||
|   "LabelToolsEmbedMetadataDescription": "Embed metadata into audio files including cover image and chapters.", |   "LabelToolsEmbedMetadataDescription": "Embed metadata into audio files including cover image and chapters.", | ||||||
|  |   "LabelToolsM4bEncoder": "M4B Encoder", | ||||||
|   "LabelToolsMakeM4b": "Make M4B Audiobook File", |   "LabelToolsMakeM4b": "Make M4B Audiobook File", | ||||||
|   "LabelToolsMakeM4bDescription": "Generate a .M4B audiobook file with embedded metadata, cover image, and chapters.", |   "LabelToolsMakeM4bDescription": "Generate a .M4B audiobook file with embedded metadata, cover image, and chapters.", | ||||||
|   "LabelToolsSplitM4b": "Split M4B to MP3's", |   "LabelToolsSplitM4b": "Split M4B to MP3's", | ||||||
| @ -621,6 +636,7 @@ | |||||||
|   "LabelUploaderDragAndDrop": "Drag & drop files or folders", |   "LabelUploaderDragAndDrop": "Drag & drop files or folders", | ||||||
|   "LabelUploaderDropFiles": "Drop files", |   "LabelUploaderDropFiles": "Drop files", | ||||||
|   "LabelUploaderItemFetchMetadataHelp": "Automatically fetch title, author, and series", |   "LabelUploaderItemFetchMetadataHelp": "Automatically fetch title, author, and series", | ||||||
|  |   "LabelUseAdvancedOptions": "Use Advanced Options", | ||||||
|   "LabelUseChapterTrack": "Use chapter track", |   "LabelUseChapterTrack": "Use chapter track", | ||||||
|   "LabelUseFullTrack": "Use full track", |   "LabelUseFullTrack": "Use full track", | ||||||
|   "LabelUser": "User", |   "LabelUser": "User", | ||||||
| @ -702,6 +718,7 @@ | |||||||
|   "MessageDragFilesIntoTrackOrder": "Drag files into correct track order", |   "MessageDragFilesIntoTrackOrder": "Drag files into correct track order", | ||||||
|   "MessageEmbedFailed": "Embed Failed!", |   "MessageEmbedFailed": "Embed Failed!", | ||||||
|   "MessageEmbedFinished": "Embed Finished!", |   "MessageEmbedFinished": "Embed Finished!", | ||||||
|  |   "MessageEmbedQueue": "Queued for metadata embed ({0} in queue)", | ||||||
|   "MessageEpisodesQueuedForDownload": "{0} Episode(s) queued for download", |   "MessageEpisodesQueuedForDownload": "{0} Episode(s) queued for download", | ||||||
|   "MessageEreaderDevices": "To ensure delivery of ebooks, you may need to add the above email address as a valid sender for each device listed below.", |   "MessageEreaderDevices": "To ensure delivery of ebooks, you may need to add the above email address as a valid sender for each device listed below.", | ||||||
|   "MessageFeedURLWillBe": "Feed URL will be {0}", |   "MessageFeedURLWillBe": "Feed URL will be {0}", | ||||||
| @ -746,6 +763,7 @@ | |||||||
|   "MessageNoLogs": "No Logs", |   "MessageNoLogs": "No Logs", | ||||||
|   "MessageNoMediaProgress": "No Media Progress", |   "MessageNoMediaProgress": "No Media Progress", | ||||||
|   "MessageNoNotifications": "No Notifications", |   "MessageNoNotifications": "No Notifications", | ||||||
|  |   "MessageNoPodcastFeed": "Invalid podcast: No Feed", | ||||||
|   "MessageNoPodcastsFound": "No podcasts found", |   "MessageNoPodcastsFound": "No podcasts found", | ||||||
|   "MessageNoResults": "No Results", |   "MessageNoResults": "No Results", | ||||||
|   "MessageNoSearchResultsFor": "No search results for \"{0}\"", |   "MessageNoSearchResultsFor": "No search results for \"{0}\"", | ||||||
| @ -762,6 +780,9 @@ | |||||||
|   "MessagePlaylistCreateFromCollection": "Create playlist from collection", |   "MessagePlaylistCreateFromCollection": "Create playlist from collection", | ||||||
|   "MessagePleaseWait": "Please wait...", |   "MessagePleaseWait": "Please wait...", | ||||||
|   "MessagePodcastHasNoRSSFeedForMatching": "Podcast has no RSS feed url to use for matching", |   "MessagePodcastHasNoRSSFeedForMatching": "Podcast has no RSS feed url to use for matching", | ||||||
|  |   "MessagePodcastSearchField": "Enter search term or RSS feed URL", | ||||||
|  |   "MessageQuickEmbedInProgress": "Quick embed in progress", | ||||||
|  |   "MessageQuickEmbedQueue": "Queued for quick embed ({0} in queue)", | ||||||
|   "MessageQuickMatchDescription": "Populate empty item details & cover with first match result from '{0}'. Does not overwrite details unless 'Prefer matched metadata' server setting is enabled.", |   "MessageQuickMatchDescription": "Populate empty item details & cover with first match result from '{0}'. Does not overwrite details unless 'Prefer matched metadata' server setting is enabled.", | ||||||
|   "MessageRemoveChapter": "Remove chapter", |   "MessageRemoveChapter": "Remove chapter", | ||||||
|   "MessageRemoveEpisodes": "Remove {0} episode(s)", |   "MessageRemoveEpisodes": "Remove {0} episode(s)", | ||||||
| @ -804,6 +825,9 @@ | |||||||
|   "MessageTaskOpmlImportFeedPodcastExists": "Podcast already exists at path", |   "MessageTaskOpmlImportFeedPodcastExists": "Podcast already exists at path", | ||||||
|   "MessageTaskOpmlImportFeedPodcastFailed": "Failed to create podcast", |   "MessageTaskOpmlImportFeedPodcastFailed": "Failed to create podcast", | ||||||
|   "MessageTaskOpmlImportFinished": "Added {0} podcasts", |   "MessageTaskOpmlImportFinished": "Added {0} podcasts", | ||||||
|  |   "MessageTaskOpmlParseFailed": "Failed to parse OPML file", | ||||||
|  |   "MessageTaskOpmlParseFastFail": "Invalid OPML file <opml> tag not found OR an <outline> tag was not found", | ||||||
|  |   "MessageTaskOpmlParseNoneFound": "No feeds found in OPML file", | ||||||
|   "MessageTaskScanItemsAdded": "{0} added", |   "MessageTaskScanItemsAdded": "{0} added", | ||||||
|   "MessageTaskScanItemsMissing": "{0} missing", |   "MessageTaskScanItemsMissing": "{0} missing", | ||||||
|   "MessageTaskScanItemsUpdated": "{0} updated", |   "MessageTaskScanItemsUpdated": "{0} updated", | ||||||
| @ -828,6 +852,10 @@ | |||||||
|   "NoteUploaderFoldersWithMediaFiles": "Folders with media files will be handled as separate library items.", |   "NoteUploaderFoldersWithMediaFiles": "Folders with media files will be handled as separate library items.", | ||||||
|   "NoteUploaderOnlyAudioFiles": "If uploading only audio files then each audio file will be handled as a separate audiobook.", |   "NoteUploaderOnlyAudioFiles": "If uploading only audio files then each audio file will be handled as a separate audiobook.", | ||||||
|   "NoteUploaderUnsupportedFiles": "Unsupported files are ignored. When choosing or dropping a folder, other files that are not in an item folder are ignored.", |   "NoteUploaderUnsupportedFiles": "Unsupported files are ignored. When choosing or dropping a folder, other files that are not in an item folder are ignored.", | ||||||
|  |   "NotificationOnBackupCompletedDescription": "Triggered when a backup is completed", | ||||||
|  |   "NotificationOnBackupFailedDescription": "Triggered when a backup fails", | ||||||
|  |   "NotificationOnEpisodeDownloadedDescription": "Triggered when a podcast episode is auto-downloaded", | ||||||
|  |   "NotificationOnTestDescription": "Event for testing the notification system", | ||||||
|   "PlaceholderNewCollection": "New collection name", |   "PlaceholderNewCollection": "New collection name", | ||||||
|   "PlaceholderNewFolderPath": "New folder path", |   "PlaceholderNewFolderPath": "New folder path", | ||||||
|   "PlaceholderNewPlaylist": "New playlist name", |   "PlaceholderNewPlaylist": "New playlist name", | ||||||
|  | |||||||
| @ -7,6 +7,7 @@ module.exports.notificationData = { | |||||||
|       requiresLibrary: true, |       requiresLibrary: true, | ||||||
|       libraryMediaType: 'podcast', |       libraryMediaType: 'podcast', | ||||||
|       description: 'Triggered when a podcast episode is auto-downloaded', |       description: 'Triggered when a podcast episode is auto-downloaded', | ||||||
|  |       descriptionKey: 'NotificationOnEpisodeDownloadedDescription', | ||||||
|       variables: ['libraryItemId', 'libraryId', 'podcastTitle', 'podcastAuthor', 'podcastDescription', 'podcastGenres', 'episodeTitle', 'episodeSubtitle', 'episodeDescription', 'libraryName', 'episodeId', 'mediaTags'], |       variables: ['libraryItemId', 'libraryId', 'podcastTitle', 'podcastAuthor', 'podcastDescription', 'podcastGenres', 'episodeTitle', 'episodeSubtitle', 'episodeDescription', 'libraryName', 'episodeId', 'mediaTags'], | ||||||
|       defaults: { |       defaults: { | ||||||
|         title: 'New {{podcastTitle}} Episode!', |         title: 'New {{podcastTitle}} Episode!', | ||||||
| @ -31,6 +32,7 @@ module.exports.notificationData = { | |||||||
|       name: 'onBackupCompleted', |       name: 'onBackupCompleted', | ||||||
|       requiresLibrary: false, |       requiresLibrary: false, | ||||||
|       description: 'Triggered when a backup is completed', |       description: 'Triggered when a backup is completed', | ||||||
|  |       descriptionKey: 'NotificationOnBackupCompletedDescription', | ||||||
|       variables: ['completionTime', 'backupPath', 'backupSize', 'backupCount', 'removedOldest'], |       variables: ['completionTime', 'backupPath', 'backupSize', 'backupCount', 'removedOldest'], | ||||||
|       defaults: { |       defaults: { | ||||||
|         title: 'Backup Completed', |         title: 'Backup Completed', | ||||||
| @ -48,6 +50,7 @@ module.exports.notificationData = { | |||||||
|       name: 'onBackupFailed', |       name: 'onBackupFailed', | ||||||
|       requiresLibrary: false, |       requiresLibrary: false, | ||||||
|       description: 'Triggered when a backup fails', |       description: 'Triggered when a backup fails', | ||||||
|  |       descriptionKey: 'NotificationOnBackupFailedDescription', | ||||||
|       variables: ['errorMsg'], |       variables: ['errorMsg'], | ||||||
|       defaults: { |       defaults: { | ||||||
|         title: 'Backup Failed', |         title: 'Backup Failed', | ||||||
| @ -61,6 +64,7 @@ module.exports.notificationData = { | |||||||
|       name: 'onTest', |       name: 'onTest', | ||||||
|       requiresLibrary: false, |       requiresLibrary: false, | ||||||
|       description: 'Event for testing the notification system', |       description: 'Event for testing the notification system', | ||||||
|  |       descriptionKey: 'NotificationOnTestDescription', | ||||||
|       variables: ['version'], |       variables: ['version'], | ||||||
|       defaults: { |       defaults: { | ||||||
|         title: 'Test Notification on Abs {{version}}', |         title: 'Test Notification on Abs {{version}}', | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user