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() {
 | 
			
		||||
      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.seriesName) return this.mediaMetadata.seriesName
 | 
			
		||||
      return ''
 | 
			
		||||
 | 
			
		||||
@ -33,18 +33,18 @@
 | 
			
		||||
            <span class="material-symbols text-lg ml-2">launch</span>
 | 
			
		||||
          </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>
 | 
			
		||||
 | 
			
		||||
      <!-- queued alert -->
 | 
			
		||||
      <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>
 | 
			
		||||
 | 
			
		||||
      <!-- processing alert -->
 | 
			
		||||
      <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>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
@ -113,7 +113,7 @@ export default {
 | 
			
		||||
  methods: {
 | 
			
		||||
    quickEmbed() {
 | 
			
		||||
      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) => {
 | 
			
		||||
          if (confirmed) {
 | 
			
		||||
            this.$axios
 | 
			
		||||
 | 
			
		||||
@ -77,7 +77,13 @@ export default {
 | 
			
		||||
      return this.notificationData.events || []
 | 
			
		||||
    },
 | 
			
		||||
    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() {
 | 
			
		||||
      return this.notificationEvents.find((e) => e.name === this.newNotification.eventName)
 | 
			
		||||
 | 
			
		||||
@ -63,11 +63,11 @@
 | 
			
		||||
    <div class="w-full max-w-4xl mx-auto">
 | 
			
		||||
      <!-- queued alert -->
 | 
			
		||||
      <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>
 | 
			
		||||
      <!-- metadata embed action buttons -->
 | 
			
		||||
      <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" />
 | 
			
		||||
 | 
			
		||||
@ -78,7 +78,7 @@
 | 
			
		||||
      <!-- m4b embed action buttons -->
 | 
			
		||||
      <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">
 | 
			
		||||
          <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>
 | 
			
		||||
 | 
			
		||||
        <div class="flex-grow" />
 | 
			
		||||
@ -94,11 +94,11 @@
 | 
			
		||||
        <transition name="slide">
 | 
			
		||||
          <div v-if="showEncodeOptions || usingCustomEncodeOptions" class="mb-4 pb-4 border-b border-white/10">
 | 
			
		||||
            <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="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="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="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="$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="$strings.LabelAudioCodec" class="m-2 max-w-40" @input="codecChanged" />
 | 
			
		||||
            </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>
 | 
			
		||||
        </transition>
 | 
			
		||||
      </div>
 | 
			
		||||
@ -106,36 +106,36 @@
 | 
			
		||||
      <div class="mb-4">
 | 
			
		||||
        <div v-if="isEmbedTool" class="flex items-start mb-2">
 | 
			
		||||
          <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 v-else class="flex items-start mb-2">
 | 
			
		||||
          <span class="material-symbols text-base text-warning pt-1">star</span>
 | 
			
		||||
          <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>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div v-if="shouldBackupAudioFiles || isM4BTool" class="flex items-start mb-2">
 | 
			
		||||
          <span class="material-symbols text-base text-warning pt-1">star</span>
 | 
			
		||||
          <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>
 | 
			
		||||
        </div>
 | 
			
		||||
        <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>
 | 
			
		||||
          <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 v-if="isM4BTool" class="flex items-start mb-2">
 | 
			
		||||
          <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 v-if="isM4BTool" class="flex items-start mb-2">
 | 
			
		||||
          <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 class="flex items-start mb-2">
 | 
			
		||||
          <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>
 | 
			
		||||
@ -269,11 +269,11 @@ export default {
 | 
			
		||||
    },
 | 
			
		||||
    availableTools() {
 | 
			
		||||
      if (this.isSingleM4b) {
 | 
			
		||||
        return [{ value: 'embed', text: 'Embed Metadata' }]
 | 
			
		||||
        return [{ value: 'embed', text: this.$strings.LabelToolsEmbedMetadata }]
 | 
			
		||||
      } else {
 | 
			
		||||
        return [
 | 
			
		||||
          { value: 'embed', text: 'Embed Metadata' },
 | 
			
		||||
          { value: 'm4b', text: 'M4B Encoder' }
 | 
			
		||||
          { value: 'embed', text: this.$strings.LabelToolsEmbedMetadata },
 | 
			
		||||
          { 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 class="w-full max-w-4xl mx-auto flex">
 | 
			
		||||
        <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="block md:hidden" small>{{ $strings.ButtonSubmit }}</ui-btn>
 | 
			
		||||
        </form>
 | 
			
		||||
@ -108,7 +108,7 @@ export default {
 | 
			
		||||
 | 
			
		||||
      if (!txt || !txt.includes('<opml') || !txt.includes('<outline ')) {
 | 
			
		||||
        // 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
 | 
			
		||||
        return
 | 
			
		||||
      }
 | 
			
		||||
@ -117,7 +117,7 @@ export default {
 | 
			
		||||
        .$post(`/api/podcasts/opml/parse`, { opmlText: txt })
 | 
			
		||||
        .then((data) => {
 | 
			
		||||
          if (!data.feeds?.length) {
 | 
			
		||||
            this.$toast.error('No feeds found in OPML file')
 | 
			
		||||
            this.$toast.error(this.$strings.MessageTaskOpmlParseNoneFound)
 | 
			
		||||
          } else {
 | 
			
		||||
            this.opmlFeeds = data.feeds || []
 | 
			
		||||
            this.showOPMLFeedsModal = true
 | 
			
		||||
@ -125,7 +125,7 @@ export default {
 | 
			
		||||
        })
 | 
			
		||||
        .catch((error) => {
 | 
			
		||||
          console.error('Failed', error)
 | 
			
		||||
          this.$toast.error('Failed to parse OPML file')
 | 
			
		||||
          this.$toast.error(this.$strings.MessageTaskOpmlParseFailed)
 | 
			
		||||
        })
 | 
			
		||||
        .finally(() => {
 | 
			
		||||
          this.processing = false
 | 
			
		||||
@ -191,7 +191,7 @@ export default {
 | 
			
		||||
        return
 | 
			
		||||
      }
 | 
			
		||||
      if (!podcast.feedUrl) {
 | 
			
		||||
        this.$toast.error('Invalid podcast - no feed')
 | 
			
		||||
        this.$toast.error(this.$strings.MessageNoPodcastFeed)
 | 
			
		||||
        return
 | 
			
		||||
      }
 | 
			
		||||
      this.processing = true
 | 
			
		||||
 | 
			
		||||
@ -66,6 +66,7 @@
 | 
			
		||||
  "ButtonPurgeItemsCache": "Purge Items Cache",
 | 
			
		||||
  "ButtonQueueAddItem": "Add to queue",
 | 
			
		||||
  "ButtonQueueRemoveItem": "Remove from queue",
 | 
			
		||||
  "ButtonQuickEmbed": "Quick Embed",
 | 
			
		||||
  "ButtonQuickEmbedMetadata": "Quick Embed Metadata",
 | 
			
		||||
  "ButtonQuickMatch": "Quick Match",
 | 
			
		||||
  "ButtonReScan": "Re-Scan",
 | 
			
		||||
@ -225,6 +226,9 @@
 | 
			
		||||
  "LabelAllUsersIncludingGuests": "All users including guests",
 | 
			
		||||
  "LabelAlreadyInYourLibrary": "Already in your library",
 | 
			
		||||
  "LabelAppend": "Append",
 | 
			
		||||
  "LabelAudioBitrate": "Audio Bitrate (e.g. 128k)",
 | 
			
		||||
  "LabelAudioChannels": "Audio Channels (1 or 2)",
 | 
			
		||||
  "LabelAudioCodec": "Audio Codec",
 | 
			
		||||
  "LabelAuthor": "Author",
 | 
			
		||||
  "LabelAuthorFirstLast": "Author (First Last)",
 | 
			
		||||
  "LabelAuthorLastFirst": "Author (Last, First)",
 | 
			
		||||
@ -237,6 +241,7 @@
 | 
			
		||||
  "LabelAutoRegister": "Auto Register",
 | 
			
		||||
  "LabelAutoRegisterDescription": "Automatically create new users after logging in",
 | 
			
		||||
  "LabelBackToUser": "Back to User",
 | 
			
		||||
  "LabelBackupAudioFiles": "Backup Audio Files",
 | 
			
		||||
  "LabelBackupLocation": "Backup Location",
 | 
			
		||||
  "LabelBackupsEnableAutomaticBackups": "Enable automatic backups",
 | 
			
		||||
  "LabelBackupsEnableAutomaticBackupsHelp": "Backups saved in /metadata/backups",
 | 
			
		||||
@ -303,6 +308,15 @@
 | 
			
		||||
  "LabelEmailSettingsTestAddress": "Test Address",
 | 
			
		||||
  "LabelEmbeddedCover": "Embedded Cover",
 | 
			
		||||
  "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",
 | 
			
		||||
  "LabelEndOfChapter": "End of Chapter",
 | 
			
		||||
  "LabelEpisode": "Episode",
 | 
			
		||||
@ -596,6 +610,7 @@
 | 
			
		||||
  "LabelTitle": "Title",
 | 
			
		||||
  "LabelToolsEmbedMetadata": "Embed Metadata",
 | 
			
		||||
  "LabelToolsEmbedMetadataDescription": "Embed metadata into audio files including cover image and chapters.",
 | 
			
		||||
  "LabelToolsM4bEncoder": "M4B Encoder",
 | 
			
		||||
  "LabelToolsMakeM4b": "Make M4B Audiobook File",
 | 
			
		||||
  "LabelToolsMakeM4bDescription": "Generate a .M4B audiobook file with embedded metadata, cover image, and chapters.",
 | 
			
		||||
  "LabelToolsSplitM4b": "Split M4B to MP3's",
 | 
			
		||||
@ -621,6 +636,7 @@
 | 
			
		||||
  "LabelUploaderDragAndDrop": "Drag & drop files or folders",
 | 
			
		||||
  "LabelUploaderDropFiles": "Drop files",
 | 
			
		||||
  "LabelUploaderItemFetchMetadataHelp": "Automatically fetch title, author, and series",
 | 
			
		||||
  "LabelUseAdvancedOptions": "Use Advanced Options",
 | 
			
		||||
  "LabelUseChapterTrack": "Use chapter track",
 | 
			
		||||
  "LabelUseFullTrack": "Use full track",
 | 
			
		||||
  "LabelUser": "User",
 | 
			
		||||
@ -702,6 +718,7 @@
 | 
			
		||||
  "MessageDragFilesIntoTrackOrder": "Drag files into correct track order",
 | 
			
		||||
  "MessageEmbedFailed": "Embed Failed!",
 | 
			
		||||
  "MessageEmbedFinished": "Embed Finished!",
 | 
			
		||||
  "MessageEmbedQueue": "Queued for metadata embed ({0} in queue)",
 | 
			
		||||
  "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.",
 | 
			
		||||
  "MessageFeedURLWillBe": "Feed URL will be {0}",
 | 
			
		||||
@ -746,6 +763,7 @@
 | 
			
		||||
  "MessageNoLogs": "No Logs",
 | 
			
		||||
  "MessageNoMediaProgress": "No Media Progress",
 | 
			
		||||
  "MessageNoNotifications": "No Notifications",
 | 
			
		||||
  "MessageNoPodcastFeed": "Invalid podcast: No Feed",
 | 
			
		||||
  "MessageNoPodcastsFound": "No podcasts found",
 | 
			
		||||
  "MessageNoResults": "No Results",
 | 
			
		||||
  "MessageNoSearchResultsFor": "No search results for \"{0}\"",
 | 
			
		||||
@ -762,6 +780,9 @@
 | 
			
		||||
  "MessagePlaylistCreateFromCollection": "Create playlist from collection",
 | 
			
		||||
  "MessagePleaseWait": "Please wait...",
 | 
			
		||||
  "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.",
 | 
			
		||||
  "MessageRemoveChapter": "Remove chapter",
 | 
			
		||||
  "MessageRemoveEpisodes": "Remove {0} episode(s)",
 | 
			
		||||
@ -804,6 +825,9 @@
 | 
			
		||||
  "MessageTaskOpmlImportFeedPodcastExists": "Podcast already exists at path",
 | 
			
		||||
  "MessageTaskOpmlImportFeedPodcastFailed": "Failed to create podcast",
 | 
			
		||||
  "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",
 | 
			
		||||
  "MessageTaskScanItemsMissing": "{0} missing",
 | 
			
		||||
  "MessageTaskScanItemsUpdated": "{0} updated",
 | 
			
		||||
@ -828,6 +852,10 @@
 | 
			
		||||
  "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.",
 | 
			
		||||
  "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",
 | 
			
		||||
  "PlaceholderNewFolderPath": "New folder path",
 | 
			
		||||
  "PlaceholderNewPlaylist": "New playlist name",
 | 
			
		||||
 | 
			
		||||
@ -7,6 +7,7 @@ module.exports.notificationData = {
 | 
			
		||||
      requiresLibrary: true,
 | 
			
		||||
      libraryMediaType: 'podcast',
 | 
			
		||||
      description: 'Triggered when a podcast episode is auto-downloaded',
 | 
			
		||||
      descriptionKey: 'NotificationOnEpisodeDownloadedDescription',
 | 
			
		||||
      variables: ['libraryItemId', 'libraryId', 'podcastTitle', 'podcastAuthor', 'podcastDescription', 'podcastGenres', 'episodeTitle', 'episodeSubtitle', 'episodeDescription', 'libraryName', 'episodeId', 'mediaTags'],
 | 
			
		||||
      defaults: {
 | 
			
		||||
        title: 'New {{podcastTitle}} Episode!',
 | 
			
		||||
@ -31,6 +32,7 @@ module.exports.notificationData = {
 | 
			
		||||
      name: 'onBackupCompleted',
 | 
			
		||||
      requiresLibrary: false,
 | 
			
		||||
      description: 'Triggered when a backup is completed',
 | 
			
		||||
      descriptionKey: 'NotificationOnBackupCompletedDescription',
 | 
			
		||||
      variables: ['completionTime', 'backupPath', 'backupSize', 'backupCount', 'removedOldest'],
 | 
			
		||||
      defaults: {
 | 
			
		||||
        title: 'Backup Completed',
 | 
			
		||||
@ -48,6 +50,7 @@ module.exports.notificationData = {
 | 
			
		||||
      name: 'onBackupFailed',
 | 
			
		||||
      requiresLibrary: false,
 | 
			
		||||
      description: 'Triggered when a backup fails',
 | 
			
		||||
      descriptionKey: 'NotificationOnBackupFailedDescription',
 | 
			
		||||
      variables: ['errorMsg'],
 | 
			
		||||
      defaults: {
 | 
			
		||||
        title: 'Backup Failed',
 | 
			
		||||
@ -61,6 +64,7 @@ module.exports.notificationData = {
 | 
			
		||||
      name: 'onTest',
 | 
			
		||||
      requiresLibrary: false,
 | 
			
		||||
      description: 'Event for testing the notification system',
 | 
			
		||||
      descriptionKey: 'NotificationOnTestDescription',
 | 
			
		||||
      variables: ['version'],
 | 
			
		||||
      defaults: {
 | 
			
		||||
        title: 'Test Notification on Abs {{version}}',
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user