Browse Source

Merge remote-tracking branch 'upstream/master' into do-not-instantiate-services-at-startup

Mark Monteiro 5 years ago
parent
commit
5b1091db27
100 changed files with 434 additions and 291 deletions
  1. 1 1
      .ci/azure-pipelines-main.yml
  2. 1 1
      .ci/azure-pipelines-windows.yml
  3. 13 0
      .github/ISSUE_TEMPLATE/feature_request.md
  4. 1 2
      Dockerfile
  5. 1 2
      Dockerfile.arm
  6. 2 3
      Dockerfile.arm64
  7. 1 1
      DvdLib/Ifo/Dvd.cs
  8. 16 16
      Emby.Dlna/Didl/DidlBuilder.cs
  9. 0 1
      Emby.Dlna/Didl/Filter.cs
  10. 2 2
      Emby.Dlna/Main/DlnaEntryPoint.cs
  11. 1 1
      Emby.Naming/AudioBook/AudioBookFileInfo.cs
  12. 2 10
      Emby.Naming/AudioBook/AudioBookListResolver.cs
  13. 2 1
      Emby.Naming/Subtitles/SubtitleParser.cs
  14. 8 2
      Emby.Naming/TV/EpisodePathParser.cs
  15. 1 1
      Emby.Naming/TV/SeasonPathParserResult.cs
  16. 9 16
      Emby.Naming/Video/StackResolver.cs
  17. 3 1
      Emby.Naming/Video/VideoFileInfo.cs
  18. 7 17
      Emby.Naming/Video/VideoListResolver.cs
  19. 0 1
      Emby.Notifications/Api/NotificationsService.cs
  20. 0 1
      Emby.Notifications/CoreNotificationTypes.cs
  21. 0 1
      Emby.Notifications/NotificationConfigurationFactory.cs
  22. 0 1
      Emby.Server.Implementations/Activity/ActivityLogEntryPoint.cs
  23. 23 6
      Emby.Server.Implementations/ApplicationHost.cs
  24. 8 4
      Emby.Server.Implementations/Channels/RefreshChannelsScheduledTask.cs
  25. 1 1
      Emby.Server.Implementations/Configuration/ServerConfigurationManager.cs
  26. 40 35
      Emby.Server.Implementations/Data/SqliteItemRepository.cs
  27. 1 1
      Emby.Server.Implementations/Data/SqliteUserRepository.cs
  28. 3 3
      Emby.Server.Implementations/Emby.Server.Implementations.csproj
  29. 1 1
      Emby.Server.Implementations/HttpServer/FileWriter.cs
  30. 5 5
      Emby.Server.Implementations/IO/ManagedFileSystem.cs
  31. 0 1
      Emby.Server.Implementations/Library/Resolvers/TV/SeriesResolver.cs
  32. 9 9
      Emby.Server.Implementations/Library/UserManager.cs
  33. 0 1
      Emby.Server.Implementations/LiveTv/EmbyTV/DirectRecorder.cs
  34. 0 1
      Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs
  35. 0 1
      Emby.Server.Implementations/LiveTv/EmbyTV/EntryPoint.cs
  36. 0 1
      Emby.Server.Implementations/LiveTv/EmbyTV/IRecorder.cs
  37. 0 1
      Emby.Server.Implementations/LiveTv/EmbyTV/ItemDataProvider.cs
  38. 0 1
      Emby.Server.Implementations/LiveTv/EmbyTV/RecordingHelper.cs
  39. 0 1
      Emby.Server.Implementations/LiveTv/EmbyTV/SeriesTimerManager.cs
  40. 0 1
      Emby.Server.Implementations/LiveTv/EmbyTV/TimerManager.cs
  41. 0 1
      Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs
  42. 0 1
      Emby.Server.Implementations/LiveTv/Listings/XmlTvListingsProvider.cs
  43. 0 1
      Emby.Server.Implementations/LiveTv/LiveTvConfigurationFactory.cs
  44. 0 1
      Emby.Server.Implementations/LiveTv/LiveTvDtoService.cs
  45. 0 1
      Emby.Server.Implementations/LiveTv/LiveTvManager.cs
  46. 0 1
      Emby.Server.Implementations/LiveTv/LiveTvMediaSourceProvider.cs
  47. 0 1
      Emby.Server.Implementations/LiveTv/TunerHosts/BaseTunerHost.cs
  48. 0 1
      Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs
  49. 0 1
      Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunManager.cs
  50. 1 2
      Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunUdpStream.cs
  51. 1 2
      Emby.Server.Implementations/LiveTv/TunerHosts/LiveStream.cs
  52. 0 1
      Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs
  53. 0 1
      Emby.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs
  54. 0 1
      Emby.Server.Implementations/LiveTv/TunerHosts/SharedHttpStream.cs
  55. 0 1
      Emby.Server.Implementations/Localization/Core/af.json
  56. 5 6
      Emby.Server.Implementations/Localization/Core/ar.json
  57. 37 16
      Emby.Server.Implementations/Localization/Core/bg-BG.json
  58. 0 1
      Emby.Server.Implementations/Localization/Core/bn.json
  59. 0 1
      Emby.Server.Implementations/Localization/Core/ca.json
  60. 0 1
      Emby.Server.Implementations/Localization/Core/cs.json
  61. 0 1
      Emby.Server.Implementations/Localization/Core/da.json
  62. 26 5
      Emby.Server.Implementations/Localization/Core/de.json
  63. 0 1
      Emby.Server.Implementations/Localization/Core/el.json
  64. 0 1
      Emby.Server.Implementations/Localization/Core/en-GB.json
  65. 23 2
      Emby.Server.Implementations/Localization/Core/en-US.json
  66. 0 1
      Emby.Server.Implementations/Localization/Core/es-AR.json
  67. 0 1
      Emby.Server.Implementations/Localization/Core/es-MX.json
  68. 23 2
      Emby.Server.Implementations/Localization/Core/es.json
  69. 41 42
      Emby.Server.Implementations/Localization/Core/fa.json
  70. 0 1
      Emby.Server.Implementations/Localization/Core/fi.json
  71. 0 1
      Emby.Server.Implementations/Localization/Core/fil.json
  72. 0 1
      Emby.Server.Implementations/Localization/Core/fr-CA.json
  73. 23 2
      Emby.Server.Implementations/Localization/Core/fr.json
  74. 0 1
      Emby.Server.Implementations/Localization/Core/gsw.json
  75. 0 1
      Emby.Server.Implementations/Localization/Core/he.json
  76. 0 1
      Emby.Server.Implementations/Localization/Core/hr.json
  77. 0 1
      Emby.Server.Implementations/Localization/Core/hu.json
  78. 0 1
      Emby.Server.Implementations/Localization/Core/id.json
  79. 0 1
      Emby.Server.Implementations/Localization/Core/is.json
  80. 25 4
      Emby.Server.Implementations/Localization/Core/it.json
  81. 0 1
      Emby.Server.Implementations/Localization/Core/ja.json
  82. 0 1
      Emby.Server.Implementations/Localization/Core/kk.json
  83. 0 1
      Emby.Server.Implementations/Localization/Core/ko.json
  84. 0 1
      Emby.Server.Implementations/Localization/Core/lt-LT.json
  85. 0 1
      Emby.Server.Implementations/Localization/Core/lv.json
  86. 0 1
      Emby.Server.Implementations/Localization/Core/mk.json
  87. 0 1
      Emby.Server.Implementations/Localization/Core/ms.json
  88. 0 1
      Emby.Server.Implementations/Localization/Core/nb.json
  89. 0 1
      Emby.Server.Implementations/Localization/Core/nl.json
  90. 21 1
      Emby.Server.Implementations/Localization/Core/nn.json
  91. 0 1
      Emby.Server.Implementations/Localization/Core/pl.json
  92. 23 2
      Emby.Server.Implementations/Localization/Core/pt-BR.json
  93. 0 1
      Emby.Server.Implementations/Localization/Core/pt-PT.json
  94. 0 1
      Emby.Server.Implementations/Localization/Core/pt.json
  95. 0 1
      Emby.Server.Implementations/Localization/Core/ro.json
  96. 0 1
      Emby.Server.Implementations/Localization/Core/ru.json
  97. 23 2
      Emby.Server.Implementations/Localization/Core/sk.json
  98. 0 1
      Emby.Server.Implementations/Localization/Core/sl-SI.json
  99. 0 1
      Emby.Server.Implementations/Localization/Core/sr.json
  100. 0 1
      Emby.Server.Implementations/Localization/Core/sv.json

+ 1 - 1
.ci/azure-pipelines-main.yml

@@ -43,7 +43,7 @@ jobs:
         displayName: "Build Web Client"
         displayName: "Build Web Client"
         condition: and(succeeded(), or(contains(variables['System.PullRequest.TargetBranch'], 'release'), contains(variables['System.PullRequest.TargetBranch'], 'master'), contains(variables['Build.SourceBranch'], 'release'), contains(variables['Build.SourceBranch'], 'master')), eq(variables['BuildConfiguration'], 'Release'), in(variables['Build.Reason'], 'PullRequest', 'IndividualCI', 'BatchedCI', 'BuildCompletion'))
         condition: and(succeeded(), or(contains(variables['System.PullRequest.TargetBranch'], 'release'), contains(variables['System.PullRequest.TargetBranch'], 'master'), contains(variables['Build.SourceBranch'], 'release'), contains(variables['Build.SourceBranch'], 'master')), eq(variables['BuildConfiguration'], 'Release'), in(variables['Build.Reason'], 'PullRequest', 'IndividualCI', 'BatchedCI', 'BuildCompletion'))
         inputs:
         inputs:
-          script: yarn install && yarn build
+          script: yarn install
           workingDirectory: $(Agent.TempDirectory)/jellyfin-web
           workingDirectory: $(Agent.TempDirectory)/jellyfin-web
 
 
       - task: CopyFiles@2
       - task: CopyFiles@2

+ 1 - 1
.ci/azure-pipelines-windows.yml

@@ -36,7 +36,7 @@ jobs:
         displayName: "Build Web Client"
         displayName: "Build Web Client"
         condition: and(succeeded(), or(contains(variables['System.PullRequest.TargetBranch'], 'release'), contains(variables['System.PullRequest.TargetBranch'], 'master'), contains(variables['Build.SourceBranch'], 'release'), contains(variables['Build.SourceBranch'], 'master')), in(variables['Build.Reason'], 'PullRequest', 'IndividualCI', 'BatchedCI', 'BuildCompletion'))
         condition: and(succeeded(), or(contains(variables['System.PullRequest.TargetBranch'], 'release'), contains(variables['System.PullRequest.TargetBranch'], 'master'), contains(variables['Build.SourceBranch'], 'release'), contains(variables['Build.SourceBranch'], 'master')), in(variables['Build.Reason'], 'PullRequest', 'IndividualCI', 'BatchedCI', 'BuildCompletion'))
         inputs:
         inputs:
-          script: yarn install && yarn build
+          script: yarn install
           workingDirectory: $(Agent.TempDirectory)/jellyfin-web
           workingDirectory: $(Agent.TempDirectory)/jellyfin-web
 
 
       - task: CopyFiles@2
       - task: CopyFiles@2

+ 13 - 0
.github/ISSUE_TEMPLATE/feature_request.md

@@ -0,0 +1,13 @@
+---
+name: Feature Request
+about: Request a new feature
+title: ''
+labels: feature-request
+assignees: ''
+---
+
+**PLEASE DO NOT OPEN FEATURE REQUEST ISSUES ON GITHUB**
+
+**Feature requests should be opened on our dedicated [feature request](https://features.jellyfin.org/) hub so they can be appropriately discussed and prioritized.**
+
+However, if you are willing to contribute to the project by adding a new feature yourself, then please ensure that you first review our [documentation](https://docs.jellyfin.org/general/contributing/development.html) on contributing code. Once you have reviewed the documentation, feel free to come back here and open an issue here outlining your proposed approach so that it can be documented, tracked, and discussed by other team members.

+ 1 - 2
Dockerfile

@@ -3,11 +3,10 @@ ARG FFMPEG_VERSION=latest
 
 
 FROM node:alpine as web-builder
 FROM node:alpine as web-builder
 ARG JELLYFIN_WEB_VERSION=master
 ARG JELLYFIN_WEB_VERSION=master
-RUN apk add curl git \
+RUN apk add curl git zlib zlib-dev autoconf g++ make libpng-dev gifsicle alpine-sdk automake libtool make gcc musl-dev nasm \
  && curl -L https://github.com/jellyfin/jellyfin-web/archive/${JELLYFIN_WEB_VERSION}.tar.gz | tar zxf - \
  && curl -L https://github.com/jellyfin/jellyfin-web/archive/${JELLYFIN_WEB_VERSION}.tar.gz | tar zxf - \
  && cd jellyfin-web-* \
  && cd jellyfin-web-* \
  && yarn install \
  && yarn install \
- && yarn build \
  && mv dist /dist
  && mv dist /dist
 
 
 FROM mcr.microsoft.com/dotnet/core/sdk:${DOTNET_VERSION}-buster as builder
 FROM mcr.microsoft.com/dotnet/core/sdk:${DOTNET_VERSION}-buster as builder

+ 1 - 2
Dockerfile.arm

@@ -7,11 +7,10 @@ ARG DOTNET_VERSION=3.1
 
 
 FROM node:alpine as web-builder
 FROM node:alpine as web-builder
 ARG JELLYFIN_WEB_VERSION=master
 ARG JELLYFIN_WEB_VERSION=master
-RUN apk add curl git \
+RUN apk add curl git zlib zlib-dev autoconf g++ make libpng-dev gifsicle alpine-sdk automake libtool make gcc musl-dev nasm python \
  && curl -L https://github.com/jellyfin/jellyfin-web/archive/${JELLYFIN_WEB_VERSION}.tar.gz | tar zxf - \
  && curl -L https://github.com/jellyfin/jellyfin-web/archive/${JELLYFIN_WEB_VERSION}.tar.gz | tar zxf - \
  && cd jellyfin-web-* \
  && cd jellyfin-web-* \
  && yarn install \
  && yarn install \
- && yarn build \
  && mv dist /dist
  && mv dist /dist
 
 
 
 

+ 2 - 3
Dockerfile.arm64

@@ -7,11 +7,10 @@ ARG DOTNET_VERSION=3.1
 
 
 FROM node:alpine as web-builder
 FROM node:alpine as web-builder
 ARG JELLYFIN_WEB_VERSION=master
 ARG JELLYFIN_WEB_VERSION=master
-RUN apk add curl git \
+RUN apk add curl git zlib zlib-dev autoconf g++ make libpng-dev gifsicle alpine-sdk automake libtool make gcc musl-dev nasm python \
  && curl -L https://github.com/jellyfin/jellyfin-web/archive/${JELLYFIN_WEB_VERSION}.tar.gz | tar zxf - \
  && curl -L https://github.com/jellyfin/jellyfin-web/archive/${JELLYFIN_WEB_VERSION}.tar.gz | tar zxf - \
  && cd jellyfin-web-* \
  && cd jellyfin-web-* \
  && yarn install \
  && yarn install \
- && yarn build \
  && mv dist /dist
  && mv dist /dist
 
 
 
 
@@ -35,7 +34,7 @@ ARG APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=DontWarn
 ENV NVIDIA_DRIVER_CAPABILITIES="compute,video,utility"
 ENV NVIDIA_DRIVER_CAPABILITIES="compute,video,utility"
 
 
 COPY --from=qemu /usr/bin/qemu-aarch64-static /usr/bin
 COPY --from=qemu /usr/bin/qemu-aarch64-static /usr/bin
-RUN apt-get update && apt-get install --no-install-recommends --no-install-suggests -y \ 
+RUN apt-get update && apt-get install --no-install-recommends --no-install-suggests -y \
  ffmpeg \
  ffmpeg \
  libssl-dev \
  libssl-dev \
  ca-certificates \
  ca-certificates \

+ 1 - 1
DvdLib/Ifo/Dvd.cs

@@ -33,7 +33,7 @@ namespace DvdLib.Ifo
                         continue;
                         continue;
                     }
                     }
 
 
-                    var nums = ifo.Name.Split(new [] { '_' }, StringSplitOptions.RemoveEmptyEntries);
+                    var nums = ifo.Name.Split(new[] { '_' }, StringSplitOptions.RemoveEmptyEntries);
                     if (nums.Length >= 2 && ushort.TryParse(nums[1], out var ifoNumber))
                     if (nums.Length >= 2 && ushort.TryParse(nums[1], out var ifoNumber))
                     {
                     {
                         ReadVTS(ifoNumber, ifo.FullName);
                         ReadVTS(ifoNumber, ifo.FullName);

+ 16 - 16
Emby.Dlna/Didl/DidlBuilder.cs

@@ -392,24 +392,24 @@ namespace Emby.Dlna.Didl
             {
             {
                 switch (itemStubType.Value)
                 switch (itemStubType.Value)
                 {
                 {
-                    case StubType.Latest:           return _localization.GetLocalizedString("Latest");
-                    case StubType.Playlists:        return _localization.GetLocalizedString("Playlists");
-                    case StubType.AlbumArtists:     return _localization.GetLocalizedString("HeaderAlbumArtists");
-                    case StubType.Albums:           return _localization.GetLocalizedString("Albums");
-                    case StubType.Artists:          return _localization.GetLocalizedString("Artists");
-                    case StubType.Songs:            return _localization.GetLocalizedString("Songs");
-                    case StubType.Genres:           return _localization.GetLocalizedString("Genres");
-                    case StubType.FavoriteAlbums:   return _localization.GetLocalizedString("HeaderFavoriteAlbums");
-                    case StubType.FavoriteArtists:  return _localization.GetLocalizedString("HeaderFavoriteArtists");
-                    case StubType.FavoriteSongs:    return _localization.GetLocalizedString("HeaderFavoriteSongs");
+                    case StubType.Latest: return _localization.GetLocalizedString("Latest");
+                    case StubType.Playlists: return _localization.GetLocalizedString("Playlists");
+                    case StubType.AlbumArtists: return _localization.GetLocalizedString("HeaderAlbumArtists");
+                    case StubType.Albums: return _localization.GetLocalizedString("Albums");
+                    case StubType.Artists: return _localization.GetLocalizedString("Artists");
+                    case StubType.Songs: return _localization.GetLocalizedString("Songs");
+                    case StubType.Genres: return _localization.GetLocalizedString("Genres");
+                    case StubType.FavoriteAlbums: return _localization.GetLocalizedString("HeaderFavoriteAlbums");
+                    case StubType.FavoriteArtists: return _localization.GetLocalizedString("HeaderFavoriteArtists");
+                    case StubType.FavoriteSongs: return _localization.GetLocalizedString("HeaderFavoriteSongs");
                     case StubType.ContinueWatching: return _localization.GetLocalizedString("HeaderContinueWatching");
                     case StubType.ContinueWatching: return _localization.GetLocalizedString("HeaderContinueWatching");
-                    case StubType.Movies:           return _localization.GetLocalizedString("Movies");
-                    case StubType.Collections:      return _localization.GetLocalizedString("Collections");
-                    case StubType.Favorites:        return _localization.GetLocalizedString("Favorites");
-                    case StubType.NextUp:           return _localization.GetLocalizedString("HeaderNextUp");
-                    case StubType.FavoriteSeries:   return _localization.GetLocalizedString("HeaderFavoriteShows");
+                    case StubType.Movies: return _localization.GetLocalizedString("Movies");
+                    case StubType.Collections: return _localization.GetLocalizedString("Collections");
+                    case StubType.Favorites: return _localization.GetLocalizedString("Favorites");
+                    case StubType.NextUp: return _localization.GetLocalizedString("HeaderNextUp");
+                    case StubType.FavoriteSeries: return _localization.GetLocalizedString("HeaderFavoriteShows");
                     case StubType.FavoriteEpisodes: return _localization.GetLocalizedString("HeaderFavoriteEpisodes");
                     case StubType.FavoriteEpisodes: return _localization.GetLocalizedString("HeaderFavoriteEpisodes");
-                    case StubType.Series:           return _localization.GetLocalizedString("Shows");
+                    case StubType.Series: return _localization.GetLocalizedString("Shows");
                     default: break;
                     default: break;
                 }
                 }
             }
             }

+ 0 - 1
Emby.Dlna/Didl/Filter.cs

@@ -1,7 +1,6 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
 
 
 using System;
 using System;
-using MediaBrowser.Model.Extensions;
 
 
 namespace Emby.Dlna.Didl
 namespace Emby.Dlna.Didl
 {
 {

+ 2 - 2
Emby.Dlna/Main/DlnaEntryPoint.cs

@@ -262,8 +262,8 @@ namespace Emby.Dlna.Main
             {
             {
                 if (address.AddressFamily == AddressFamily.InterNetworkV6)
                 if (address.AddressFamily == AddressFamily.InterNetworkV6)
                 {
                 {
-                   // Not support IPv6 right now
-                   continue;
+                    // Not supporting IPv6 right now
+                    continue;
                 }
                 }
 
 
                 var fullService = "urn:schemas-upnp-org:device:MediaServer:1";
                 var fullService = "urn:schemas-upnp-org:device:MediaServer:1";

+ 1 - 1
Emby.Naming/AudioBook/AudioBookFileInfo.cs

@@ -37,7 +37,7 @@ namespace Emby.Naming.AudioBook
         /// <value>The type.</value>
         /// <value>The type.</value>
         public bool IsDirectory { get; set; }
         public bool IsDirectory { get; set; }
 
 
-        /// <inheritdoc/>
+        /// <inheritdoc />
         public int CompareTo(AudioBookFileInfo other)
         public int CompareTo(AudioBookFileInfo other)
         {
         {
             if (ReferenceEquals(this, other))
             if (ReferenceEquals(this, other))

+ 2 - 10
Emby.Naming/AudioBook/AudioBookListResolver.cs

@@ -29,11 +29,7 @@ namespace Emby.Naming.AudioBook
             // Filter out all extras, otherwise they could cause stacks to not be resolved
             // Filter out all extras, otherwise they could cause stacks to not be resolved
             // See the unit test TestStackedWithTrailer
             // See the unit test TestStackedWithTrailer
             var metadata = audiobookFileInfos
             var metadata = audiobookFileInfos
-                .Select(i => new FileSystemMetadata
-                {
-                    FullName = i.Path,
-                    IsDirectory = i.IsDirectory
-                });
+                .Select(i => new FileSystemMetadata { FullName = i.Path, IsDirectory = i.IsDirectory });
 
 
             var stackResult = new StackResolver(_options)
             var stackResult = new StackResolver(_options)
                 .ResolveAudioBooks(metadata);
                 .ResolveAudioBooks(metadata);
@@ -42,11 +38,7 @@ namespace Emby.Naming.AudioBook
             {
             {
                 var stackFiles = stack.Files.Select(i => audioBookResolver.Resolve(i, stack.IsDirectoryStack)).ToList();
                 var stackFiles = stack.Files.Select(i => audioBookResolver.Resolve(i, stack.IsDirectoryStack)).ToList();
                 stackFiles.Sort();
                 stackFiles.Sort();
-                var info = new AudioBookInfo
-                {
-                    Files = stackFiles,
-                    Name = stack.Name
-                };
+                var info = new AudioBookInfo { Files = stackFiles, Name = stack.Name };
 
 
                 yield return info;
                 yield return info;
             }
             }

+ 2 - 1
Emby.Naming/Subtitles/SubtitleParser.cs

@@ -37,7 +37,8 @@ namespace Emby.Naming.Subtitles
                 IsForced = _options.SubtitleForcedFlags.Any(i => flags.Contains(i, StringComparer.OrdinalIgnoreCase))
                 IsForced = _options.SubtitleForcedFlags.Any(i => flags.Contains(i, StringComparer.OrdinalIgnoreCase))
             };
             };
 
 
-            var parts = flags.Where(i => !_options.SubtitleDefaultFlags.Contains(i, StringComparer.OrdinalIgnoreCase) && !_options.SubtitleForcedFlags.Contains(i, StringComparer.OrdinalIgnoreCase))
+            var parts = flags.Where(i => !_options.SubtitleDefaultFlags.Contains(i, StringComparer.OrdinalIgnoreCase)
+                && !_options.SubtitleForcedFlags.Contains(i, StringComparer.OrdinalIgnoreCase))
                 .ToList();
                 .ToList();
 
 
             // Should have a name, language and file extension
             // Should have a name, language and file extension

+ 8 - 2
Emby.Naming/TV/EpisodePathParser.cs

@@ -18,7 +18,13 @@ namespace Emby.Naming.TV
             _options = options;
             _options = options;
         }
         }
 
 
-        public EpisodePathParserResult Parse(string path, bool isDirectory, bool? isNamed = null, bool? isOptimistic = null, bool? supportsAbsoluteNumbers = null, bool fillExtendedInfo = true)
+        public EpisodePathParserResult Parse(
+            string path,
+            bool isDirectory,
+            bool? isNamed = null,
+            bool? isOptimistic = null,
+            bool? supportsAbsoluteNumbers = null,
+            bool fillExtendedInfo = true)
         {
         {
             // Added to be able to use regex patterns which require a file extension.
             // Added to be able to use regex patterns which require a file extension.
             // There were no failed tests without this block, but to be safe, we can keep it until
             // There were no failed tests without this block, but to be safe, we can keep it until
@@ -64,7 +70,7 @@ namespace Emby.Naming.TV
                 {
                 {
                     result.SeriesName = result.SeriesName
                     result.SeriesName = result.SeriesName
                         .Trim()
                         .Trim()
-                        .Trim(new[] { '_', '.', '-' })
+                        .Trim('_', '.', '-')
                         .Trim();
                         .Trim();
                 }
                 }
             }
             }

+ 1 - 1
Emby.Naming/TV/SeasonPathParserResult.cs

@@ -11,7 +11,7 @@ namespace Emby.Naming.TV
         public int? SeasonNumber { get; set; }
         public int? SeasonNumber { get; set; }
 
 
         /// <summary>
         /// <summary>
-        /// Gets or sets a value indicating whether this <see cref="SeasonPathParserResult"/> is success.
+        /// Gets or sets a value indicating whether this <see cref="SeasonPathParserResult" /> is success.
         /// </summary>
         /// </summary>
         /// <value><c>true</c> if success; otherwise, <c>false</c>.</value>
         /// <value><c>true</c> if success; otherwise, <c>false</c>.</value>
         public bool Success { get; set; }
         public bool Success { get; set; }

+ 9 - 16
Emby.Naming/Video/StackResolver.cs

@@ -21,31 +21,24 @@ namespace Emby.Naming.Video
 
 
         public IEnumerable<FileStack> ResolveDirectories(IEnumerable<string> files)
         public IEnumerable<FileStack> ResolveDirectories(IEnumerable<string> files)
         {
         {
-            return Resolve(files.Select(i => new FileSystemMetadata
-            {
-                FullName = i,
-                IsDirectory = true
-            }));
+            return Resolve(files.Select(i => new FileSystemMetadata { FullName = i, IsDirectory = true }));
         }
         }
 
 
         public IEnumerable<FileStack> ResolveFiles(IEnumerable<string> files)
         public IEnumerable<FileStack> ResolveFiles(IEnumerable<string> files)
         {
         {
-            return Resolve(files.Select(i => new FileSystemMetadata
-            {
-                FullName = i,
-                IsDirectory = false
-            }));
+            return Resolve(files.Select(i => new FileSystemMetadata { FullName = i, IsDirectory = false }));
         }
         }
 
 
         public IEnumerable<FileStack> ResolveAudioBooks(IEnumerable<FileSystemMetadata> files)
         public IEnumerable<FileStack> ResolveAudioBooks(IEnumerable<FileSystemMetadata> files)
         {
         {
-            foreach (var directory in files.GroupBy(file => file.IsDirectory ? file.FullName : Path.GetDirectoryName(file.FullName)))
+            var groupedDirectoryFiles = files.GroupBy(file =>
+                file.IsDirectory
+                    ? file.FullName
+                    : Path.GetDirectoryName(file.FullName));
+
+            foreach (var directory in groupedDirectoryFiles)
             {
             {
-                var stack = new FileStack()
-                {
-                    Name = Path.GetFileName(directory.Key),
-                    IsDirectoryStack = false
-                };
+                var stack = new FileStack { Name = Path.GetFileName(directory.Key), IsDirectoryStack = false };
                 foreach (var file in directory)
                 foreach (var file in directory)
                 {
                 {
                     if (file.IsDirectory)
                     if (file.IsDirectory)

+ 3 - 1
Emby.Naming/Video/VideoFileInfo.cs

@@ -77,7 +77,9 @@ namespace Emby.Naming.Video
         /// Gets the file name without extension.
         /// Gets the file name without extension.
         /// </summary>
         /// </summary>
         /// <value>The file name without extension.</value>
         /// <value>The file name without extension.</value>
-        public string FileNameWithoutExtension => !IsDirectory ? System.IO.Path.GetFileNameWithoutExtension(Path) : System.IO.Path.GetFileName(Path);
+        public string FileNameWithoutExtension => !IsDirectory
+            ? System.IO.Path.GetFileNameWithoutExtension(Path)
+            : System.IO.Path.GetFileName(Path);
 
 
         /// <inheritdoc />
         /// <inheritdoc />
         public override string ToString()
         public override string ToString()

+ 7 - 17
Emby.Naming/Video/VideoListResolver.cs

@@ -33,11 +33,7 @@ namespace Emby.Naming.Video
             // See the unit test TestStackedWithTrailer
             // See the unit test TestStackedWithTrailer
             var nonExtras = videoInfos
             var nonExtras = videoInfos
                 .Where(i => i.ExtraType == null)
                 .Where(i => i.ExtraType == null)
-                .Select(i => new FileSystemMetadata
-                {
-                    FullName = i.Path,
-                    IsDirectory = i.IsDirectory
-                });
+                .Select(i => new FileSystemMetadata { FullName = i.Path, IsDirectory = i.IsDirectory });
 
 
             var stackResult = new StackResolver(_options)
             var stackResult = new StackResolver(_options)
                 .Resolve(nonExtras).ToList();
                 .Resolve(nonExtras).ToList();
@@ -57,11 +53,7 @@ namespace Emby.Naming.Video
 
 
                 info.Year = info.Files[0].Year;
                 info.Year = info.Files[0].Year;
 
 
-                var extraBaseNames = new List<string>
-                {
-                    stack.Name,
-                    Path.GetFileNameWithoutExtension(stack.Files[0])
-                };
+                var extraBaseNames = new List<string> { stack.Name, Path.GetFileNameWithoutExtension(stack.Files[0]) };
 
 
                 var extras = GetExtras(remainingFiles, extraBaseNames);
                 var extras = GetExtras(remainingFiles, extraBaseNames);
 
 
@@ -83,10 +75,7 @@ namespace Emby.Naming.Video
 
 
             foreach (var media in standaloneMedia)
             foreach (var media in standaloneMedia)
             {
             {
-                var info = new VideoInfo(media.Name)
-                {
-                    Files = new List<VideoFileInfo> { media }
-                };
+                var info = new VideoInfo(media.Name) { Files = new List<VideoFileInfo> { media } };
 
 
                 info.Year = info.Files[0].Year;
                 info.Year = info.Files[0].Year;
 
 
@@ -222,8 +211,8 @@ namespace Emby.Naming.Video
             {
             {
                 testFilename = testFilename.Substring(folderName.Length).Trim();
                 testFilename = testFilename.Substring(folderName.Length).Trim();
                 return string.IsNullOrEmpty(testFilename)
                 return string.IsNullOrEmpty(testFilename)
-                    || testFilename[0] == '-'
-                    || string.IsNullOrWhiteSpace(Regex.Replace(testFilename, @"\[([^]]*)\]", string.Empty));
+                   || testFilename[0] == '-'
+                   || string.IsNullOrWhiteSpace(Regex.Replace(testFilename, @"\[([^]]*)\]", string.Empty));
             }
             }
 
 
             return false;
             return false;
@@ -239,7 +228,8 @@ namespace Emby.Naming.Video
 
 
             return remainingFiles
             return remainingFiles
                 .Where(i => i.ExtraType == null)
                 .Where(i => i.ExtraType == null)
-                .Where(i => baseNames.Any(b => i.FileNameWithoutExtension.StartsWith(b, StringComparison.OrdinalIgnoreCase)))
+                .Where(i => baseNames.Any(b =>
+                    i.FileNameWithoutExtension.StartsWith(b, StringComparison.OrdinalIgnoreCase)))
                 .ToList();
                 .ToList();
         }
         }
     }
     }

+ 0 - 1
Emby.Notifications/Api/NotificationsService.cs

@@ -1,6 +1,5 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
 #pragma warning disable SA1402
 #pragma warning disable SA1402
-#pragma warning disable SA1600
 #pragma warning disable SA1649
 #pragma warning disable SA1649
 
 
 using System;
 using System;

+ 0 - 1
Emby.Notifications/CoreNotificationTypes.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;

+ 0 - 1
Emby.Notifications/NotificationConfigurationFactory.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System.Collections.Generic;
 using System.Collections.Generic;
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.Configuration;

+ 0 - 1
Emby.Server.Implementations/Activity/ActivityLogEntryPoint.cs

@@ -8,7 +8,6 @@ using System.Text;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
 using MediaBrowser.Common.Plugins;
 using MediaBrowser.Common.Plugins;
 using MediaBrowser.Common.Updates;
 using MediaBrowser.Common.Updates;
-using MediaBrowser.Controller;
 using MediaBrowser.Controller.Authentication;
 using MediaBrowser.Controller.Authentication;
 using MediaBrowser.Controller.Devices;
 using MediaBrowser.Controller.Devices;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities;

+ 23 - 6
Emby.Server.Implementations/ApplicationHost.cs

@@ -100,8 +100,8 @@ using MediaBrowser.Model.Tasks;
 using MediaBrowser.Model.Updates;
 using MediaBrowser.Model.Updates;
 using MediaBrowser.Providers.Chapters;
 using MediaBrowser.Providers.Chapters;
 using MediaBrowser.Providers.Manager;
 using MediaBrowser.Providers.Manager;
+using MediaBrowser.Providers.Plugins.TheTvdb;
 using MediaBrowser.Providers.Subtitles;
 using MediaBrowser.Providers.Subtitles;
-using MediaBrowser.Providers.TV.TheTVDB;
 using MediaBrowser.WebDashboard.Api;
 using MediaBrowser.WebDashboard.Api;
 using MediaBrowser.XbmcMetadata.Providers;
 using MediaBrowser.XbmcMetadata.Providers;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Http;
@@ -656,7 +656,7 @@ namespace Emby.Server.Implementations
             serviceCollection.AddSingleton<ILogger>(Logger);
             serviceCollection.AddSingleton<ILogger>(Logger);
 
 
             serviceCollection.AddSingleton(FileSystemManager);
             serviceCollection.AddSingleton(FileSystemManager);
-            serviceCollection.AddSingleton<TvDbClientManager>();
+            serviceCollection.AddSingleton<TvdbClientManager>();
 
 
             HttpClient = new HttpClientManager.HttpClientManager(
             HttpClient = new HttpClientManager.HttpClientManager(
                 ApplicationPaths,
                 ApplicationPaths,
@@ -823,10 +823,15 @@ namespace Emby.Server.Implementations
 
 
             serviceCollection.AddSingleton<IDeviceDiscovery>(new DeviceDiscovery(ServerConfigurationManager));
             serviceCollection.AddSingleton<IDeviceDiscovery>(new DeviceDiscovery(ServerConfigurationManager));
 
 
-            ChapterManager = new ChapterManager(LibraryManager, LoggerFactory, ServerConfigurationManager, ItemRepository);
+            ChapterManager = new ChapterManager(ItemRepository);
             serviceCollection.AddSingleton(ChapterManager);
             serviceCollection.AddSingleton(ChapterManager);
 
 
-            EncodingManager = new MediaEncoder.EncodingManager(FileSystemManager, LoggerFactory, MediaEncoder, ChapterManager, LibraryManager);
+            EncodingManager = new MediaEncoder.EncodingManager(
+                LoggerFactory.CreateLogger<MediaEncoder.EncodingManager>(),
+                FileSystemManager,
+                MediaEncoder,
+                ChapterManager,
+                LibraryManager);
             serviceCollection.AddSingleton(EncodingManager);
             serviceCollection.AddSingleton(EncodingManager);
 
 
             var activityLogRepo = GetActivityLogRepository();
             var activityLogRepo = GetActivityLogRepository();
@@ -884,6 +889,18 @@ namespace Emby.Server.Implementations
                 .GetCommandLineArgs()
                 .GetCommandLineArgs()
                 .Distinct();
                 .Distinct();
 
 
+            // Get all 'JELLYFIN_' prefixed environment variables
+            var allEnvVars = Environment.GetEnvironmentVariables();
+            var jellyfinEnvVars = new Dictionary<object, object>();
+            foreach (var key in allEnvVars.Keys)
+            {
+                if (key.ToString().StartsWith("JELLYFIN_", StringComparison.OrdinalIgnoreCase))
+                {
+                    jellyfinEnvVars.Add(key, allEnvVars[key]);
+                }
+            }
+
+            logger.LogInformation("Environment Variables: {EnvVars}", jellyfinEnvVars);
             logger.LogInformation("Arguments: {Args}", commandLineArgs);
             logger.LogInformation("Arguments: {Args}", commandLineArgs);
             logger.LogInformation("Operating system: {OS}", OperatingSystem.Name);
             logger.LogInformation("Operating system: {OS}", OperatingSystem.Name);
             logger.LogInformation("Architecture: {Architecture}", RuntimeInformation.OSArchitecture);
             logger.LogInformation("Architecture: {Architecture}", RuntimeInformation.OSArchitecture);
@@ -1142,7 +1159,7 @@ namespace Emby.Server.Implementations
                 {
                 {
                     exportedTypes = ass.GetExportedTypes();
                     exportedTypes = ass.GetExportedTypes();
                 }
                 }
-                catch (TypeLoadException ex)
+                catch (FileNotFoundException ex)
                 {
                 {
                     Logger.LogError(ex, "Error getting exported types from {Assembly}", ass.FullName);
                     Logger.LogError(ex, "Error getting exported types from {Assembly}", ass.FullName);
                     continue;
                     continue;
@@ -1776,7 +1793,7 @@ namespace Emby.Server.Implementations
                 }
                 }
 
 
                 _userRepository?.Dispose();
                 _userRepository?.Dispose();
-                _displayPreferencesRepository.Dispose();
+                _displayPreferencesRepository?.Dispose();
             }
             }
 
 
             _userRepository = null;
             _userRepository = null;

+ 8 - 4
Emby.Server.Implementations/Channels/RefreshChannelsScheduledTask.cs

@@ -9,6 +9,7 @@ using MediaBrowser.Controller.Channels;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Model.Tasks;
 using MediaBrowser.Model.Tasks;
 using Microsoft.Extensions.Logging;
 using Microsoft.Extensions.Logging;
+using MediaBrowser.Model.Globalization;
 
 
 namespace Emby.Server.Implementations.Channels
 namespace Emby.Server.Implementations.Channels
 {
 {
@@ -18,27 +19,30 @@ namespace Emby.Server.Implementations.Channels
         private readonly IUserManager _userManager;
         private readonly IUserManager _userManager;
         private readonly ILogger _logger;
         private readonly ILogger _logger;
         private readonly ILibraryManager _libraryManager;
         private readonly ILibraryManager _libraryManager;
+        private readonly ILocalizationManager _localization;
 
 
         public RefreshChannelsScheduledTask(
         public RefreshChannelsScheduledTask(
             IChannelManager channelManager,
             IChannelManager channelManager,
             IUserManager userManager,
             IUserManager userManager,
             ILogger<RefreshChannelsScheduledTask> logger,
             ILogger<RefreshChannelsScheduledTask> logger,
-            ILibraryManager libraryManager)
+            ILibraryManager libraryManager,
+            ILocalizationManager localization)
         {
         {
             _channelManager = channelManager;
             _channelManager = channelManager;
             _userManager = userManager;
             _userManager = userManager;
             _logger = logger;
             _logger = logger;
             _libraryManager = libraryManager;
             _libraryManager = libraryManager;
+            _localization = localization;
         }
         }
 
 
         /// <inheritdoc />
         /// <inheritdoc />
-        public string Name => "Refresh Channels";
+        public string Name => _localization.GetLocalizedString("TasksRefreshChannels");
 
 
         /// <inheritdoc />
         /// <inheritdoc />
-        public string Description => "Refreshes internet channel information.";
+        public string Description => _localization.GetLocalizedString("TasksRefreshChannelsDescription");
 
 
         /// <inheritdoc />
         /// <inheritdoc />
-        public string Category => "Internet Channels";
+        public string Category => _localization.GetLocalizedString("TasksChannelsCategory");
 
 
         /// <inheritdoc />
         /// <inheritdoc />
         public bool IsHidden => ((ChannelManager)_channelManager).Channels.Length == 0;
         public bool IsHidden => ((ChannelManager)_channelManager).Channels.Length == 0;

+ 1 - 1
Emby.Server.Implementations/Configuration/ServerConfigurationManager.cs

@@ -132,7 +132,7 @@ namespace Emby.Server.Implementations.Configuration
             var newPath = newConfig.MetadataPath;
             var newPath = newConfig.MetadataPath;
 
 
             if (!string.IsNullOrWhiteSpace(newPath)
             if (!string.IsNullOrWhiteSpace(newPath)
-                && !string.Equals(Configuration.MetadataPath, newPath,  StringComparison.Ordinal))
+                && !string.Equals(Configuration.MetadataPath, newPath, StringComparison.Ordinal))
             {
             {
                 // Validate
                 // Validate
                 if (!Directory.Exists(newPath))
                 if (!Directory.Exists(newPath))

+ 40 - 35
Emby.Server.Implementations/Data/SqliteItemRepository.cs

@@ -454,7 +454,7 @@ namespace Emby.Server.Implementations.Data
 
 
         private static string GetSaveItemCommandText()
         private static string GetSaveItemCommandText()
         {
         {
-            var saveColumns = new []
+            var saveColumns = new[]
             {
             {
                 "guid",
                 "guid",
                 "type",
                 "type",
@@ -560,7 +560,7 @@ namespace Emby.Server.Implementations.Data
                 throw new ArgumentNullException(nameof(item));
                 throw new ArgumentNullException(nameof(item));
             }
             }
 
 
-            SaveItems(new [] { item }, cancellationToken);
+            SaveItems(new[] { item }, cancellationToken);
         }
         }
 
 
         public void SaveImages(BaseItem item)
         public void SaveImages(BaseItem item)
@@ -1622,7 +1622,7 @@ namespace Emby.Server.Implementations.Data
                 {
                 {
                     IEnumerable<MetadataFields> GetLockedFields(string s)
                     IEnumerable<MetadataFields> GetLockedFields(string s)
                     {
                     {
-                        foreach (var i in s.Split(new [] { '|' }, StringSplitOptions.RemoveEmptyEntries))
+                        foreach (var i in s.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries))
                         {
                         {
                             if (Enum.TryParse(i, true, out MetadataFields parsedValue))
                             if (Enum.TryParse(i, true, out MetadataFields parsedValue))
                             {
                             {
@@ -1818,7 +1818,7 @@ namespace Emby.Server.Implementations.Data
             {
             {
                 if (!reader.IsDBNull(index))
                 if (!reader.IsDBNull(index))
                 {
                 {
-                    item.ProductionLocations = reader.GetString(index).Split(new [] { '|' }, StringSplitOptions.RemoveEmptyEntries).ToArray();
+                    item.ProductionLocations = reader.GetString(index).Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries).ToArray();
                 }
                 }
                 index++;
                 index++;
             }
             }
@@ -2006,7 +2006,7 @@ namespace Emby.Server.Implementations.Data
         /// <summary>
         /// <summary>
         /// Saves the chapters.
         /// Saves the chapters.
         /// </summary>
         /// </summary>
-        public void SaveChapters(Guid id, List<ChapterInfo> chapters)
+        public void SaveChapters(Guid id, IReadOnlyList<ChapterInfo> chapters)
         {
         {
             CheckDisposed();
             CheckDisposed();
 
 
@@ -2035,22 +2035,24 @@ namespace Emby.Server.Implementations.Data
             }
             }
         }
         }
 
 
-        private void InsertChapters(byte[] idBlob, List<ChapterInfo> chapters, IDatabaseConnection db)
+        private void InsertChapters(byte[] idBlob, IReadOnlyList<ChapterInfo> chapters, IDatabaseConnection db)
         {
         {
             var startIndex = 0;
             var startIndex = 0;
             var limit = 100;
             var limit = 100;
             var chapterIndex = 0;
             var chapterIndex = 0;
 
 
+            const string StartInsertText = "insert into " + ChaptersTableName + " (ItemId, ChapterIndex, StartPositionTicks, Name, ImagePath, ImageDateModified) values ";
+            var insertText = new StringBuilder(StartInsertText, 256);
+
             while (startIndex < chapters.Count)
             while (startIndex < chapters.Count)
             {
             {
-                var insertText = new StringBuilder("insert into " + ChaptersTableName + " (ItemId, ChapterIndex, StartPositionTicks, Name, ImagePath, ImageDateModified) values ");
-
                 var endIndex = Math.Min(chapters.Count, startIndex + limit);
                 var endIndex = Math.Min(chapters.Count, startIndex + limit);
 
 
                 for (var i = startIndex; i < endIndex; i++)
                 for (var i = startIndex; i < endIndex; i++)
                 {
                 {
                     insertText.AppendFormat("(@ItemId, @ChapterIndex{0}, @StartPositionTicks{0}, @Name{0}, @ImagePath{0}, @ImageDateModified{0}),", i.ToString(CultureInfo.InvariantCulture));
                     insertText.AppendFormat("(@ItemId, @ChapterIndex{0}, @StartPositionTicks{0}, @Name{0}, @ImagePath{0}, @ImageDateModified{0}),", i.ToString(CultureInfo.InvariantCulture));
                 }
                 }
+
                 insertText.Length -= 1; // Remove last ,
                 insertText.Length -= 1; // Remove last ,
 
 
                 using (var statement = PrepareStatement(db, insertText.ToString()))
                 using (var statement = PrepareStatement(db, insertText.ToString()))
@@ -2077,6 +2079,7 @@ namespace Emby.Server.Implementations.Data
                 }
                 }
 
 
                 startIndex += limit;
                 startIndex += limit;
+                insertText.Length = StartInsertText.Length;
             }
             }
         }
         }
 
 
@@ -2897,8 +2900,8 @@ namespace Emby.Server.Implementations.Data
                             BindSimilarParams(query, statement);
                             BindSimilarParams(query, statement);
                             BindSearchParams(query, statement);
                             BindSearchParams(query, statement);
 
 
-                                // Running this again will bind the params
-                                GetWhereClauses(query, statement);
+                            // Running this again will bind the params
+                            GetWhereClauses(query, statement);
 
 
                             result.TotalRecordCount = statement.ExecuteQuery().SelectScalarInt().First();
                             result.TotalRecordCount = statement.ExecuteQuery().SelectScalarInt().First();
                         }
                         }
@@ -2914,29 +2917,30 @@ namespace Emby.Server.Implementations.Data
         private string GetOrderByText(InternalItemsQuery query)
         private string GetOrderByText(InternalItemsQuery query)
         {
         {
             var orderBy = query.OrderBy;
             var orderBy = query.OrderBy;
-            if (string.IsNullOrEmpty(query.SearchTerm))
+            bool hasSimilar = query.SimilarTo != null;
+            bool hasSearch = !string.IsNullOrEmpty(query.SearchTerm);
+
+            if (hasSimilar || hasSearch)
             {
             {
-                int oldLen = orderBy.Count;
-                if (oldLen == 0 && query.SimilarTo != null)
+                List<(string, SortOrder)> prepend = new List<(string, SortOrder)>(4);
+                if (hasSearch)
                 {
                 {
-                    var arr = new (string, SortOrder)[oldLen + 2];
-                    orderBy.CopyTo(arr, 0);
-                    arr[oldLen] = ("SimilarityScore", SortOrder.Descending);
-                    arr[oldLen + 1] = (ItemSortBy.Random, SortOrder.Ascending);
-                    query.OrderBy = arr;
+                    prepend.Add(("SearchScore", SortOrder.Descending));
+                    prepend.Add((ItemSortBy.SortName, SortOrder.Ascending));
                 }
                 }
-            }
-            else
-            {
-                query.OrderBy = new[]
-                {
-                    ("SearchScore", SortOrder.Descending),
-                    (ItemSortBy.SortName, SortOrder.Ascending)
-                };
-            }
 
 
+                if (hasSimilar)
+                {
+                    prepend.Add(("SimilarityScore", SortOrder.Descending));
+                    prepend.Add((ItemSortBy.Random, SortOrder.Ascending));
+                }
 
 
-            if (orderBy.Count == 0)
+                var arr = new (string, SortOrder)[prepend.Count + orderBy.Count];
+                prepend.CopyTo(arr, 0);
+                orderBy.CopyTo(arr, prepend.Count);
+                orderBy = query.OrderBy = arr;
+            }
+            else if (orderBy.Count == 0)
             {
             {
                 return string.Empty;
                 return string.Empty;
             }
             }
@@ -3265,8 +3269,8 @@ namespace Emby.Server.Implementations.Data
                             BindSimilarParams(query, statement);
                             BindSimilarParams(query, statement);
                             BindSearchParams(query, statement);
                             BindSearchParams(query, statement);
 
 
-                                // Running this again will bind the params
-                                GetWhereClauses(query, statement);
+                            // Running this again will bind the params
+                            GetWhereClauses(query, statement);
 
 
                             foreach (var row in statement.ExecuteQuery())
                             foreach (var row in statement.ExecuteQuery())
                             {
                             {
@@ -3287,8 +3291,8 @@ namespace Emby.Server.Implementations.Data
                             BindSimilarParams(query, statement);
                             BindSimilarParams(query, statement);
                             BindSearchParams(query, statement);
                             BindSearchParams(query, statement);
 
 
-                                // Running this again will bind the params
-                                GetWhereClauses(query, statement);
+                            // Running this again will bind the params
+                            GetWhereClauses(query, statement);
 
 
                             result.TotalRecordCount = statement.ExecuteQuery().SelectScalarInt().First();
                             result.TotalRecordCount = statement.ExecuteQuery().SelectScalarInt().First();
                         }
                         }
@@ -6158,7 +6162,8 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
                 item.ColorTransfer = reader[34].ToString();
                 item.ColorTransfer = reader[34].ToString();
             }
             }
 
 
-            if (item.Type == MediaStreamType.Subtitle){
+            if (item.Type == MediaStreamType.Subtitle)
+            {
                 item.localizedUndefined = _localization.GetLocalizedString("Undefined");
                 item.localizedUndefined = _localization.GetLocalizedString("Undefined");
                 item.localizedDefault = _localization.GetLocalizedString("Default");
                 item.localizedDefault = _localization.GetLocalizedString("Default");
                 item.localizedForced = _localization.GetLocalizedString("Forced");
                 item.localizedForced = _localization.GetLocalizedString("Forced");
@@ -6287,8 +6292,8 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
                         statement.TryBind("@Codec" + index, attachment.Codec);
                         statement.TryBind("@Codec" + index, attachment.Codec);
                         statement.TryBind("@CodecTag" + index, attachment.CodecTag);
                         statement.TryBind("@CodecTag" + index, attachment.CodecTag);
                         statement.TryBind("@Comment" + index, attachment.Comment);
                         statement.TryBind("@Comment" + index, attachment.Comment);
-                        statement.TryBind("@FileName" + index, attachment.FileName);
-                        statement.TryBind("@MimeType" + index, attachment.MimeType);
+                        statement.TryBind("@Filename" + index, attachment.FileName);
+                        statement.TryBind("@MIMEType" + index, attachment.MimeType);
                     }
                     }
 
 
                     statement.Reset();
                     statement.Reset();

+ 1 - 1
Emby.Server.Implementations/Data/SqliteUserRepository.cs

@@ -25,7 +25,7 @@ namespace Emby.Server.Implementations.Data
             IServerApplicationPaths appPaths)
             IServerApplicationPaths appPaths)
             : base(logger)
             : base(logger)
         {
         {
-            _jsonOptions = JsonDefaults.GetOptions();;
+            _jsonOptions = JsonDefaults.GetOptions();
 
 
             DbFilePath = Path.Combine(appPaths.DataPath, "users.db");
             DbFilePath = Path.Combine(appPaths.DataPath, "users.db");
         }
         }

+ 3 - 3
Emby.Server.Implementations/Emby.Server.Implementations.csproj

@@ -29,9 +29,9 @@
     <PackageReference Include="Microsoft.AspNetCore.ResponseCompression" Version="2.2.0" />
     <PackageReference Include="Microsoft.AspNetCore.ResponseCompression" Version="2.2.0" />
     <PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="2.2.0" />
     <PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="2.2.0" />
     <PackageReference Include="Microsoft.AspNetCore.WebSockets" Version="2.2.1" />
     <PackageReference Include="Microsoft.AspNetCore.WebSockets" Version="2.2.1" />
-    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.1" />
-    <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="3.1.1" />
-    <PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="3.1.1" />
+    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.3" />
+    <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="3.1.3" />
+    <PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="3.1.3" />
     <PackageReference Include="Mono.Nat" Version="2.0.0" />
     <PackageReference Include="Mono.Nat" Version="2.0.0" />
     <PackageReference Include="ServiceStack.Text.Core" Version="5.8.0" />
     <PackageReference Include="ServiceStack.Text.Core" Version="5.8.0" />
     <PackageReference Include="sharpcompress" Version="0.24.0" />
     <PackageReference Include="sharpcompress" Version="0.24.0" />

+ 1 - 1
Emby.Server.Implementations/HttpServer/FileWriter.cs

@@ -11,8 +11,8 @@ using System.Threading;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Model.Services;
 using MediaBrowser.Model.Services;
-using Microsoft.Extensions.Logging;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Http;
+using Microsoft.Extensions.Logging;
 using Microsoft.Net.Http.Headers;
 using Microsoft.Net.Http.Headers;
 
 
 namespace Emby.Server.Implementations.HttpServer
 namespace Emby.Server.Implementations.HttpServer

+ 5 - 5
Emby.Server.Implementations/IO/ManagedFileSystem.cs

@@ -587,11 +587,11 @@ namespace Emby.Server.Implementations.IO
             // some drives on linux have no actual size or are used for other purposes
             // some drives on linux have no actual size or are used for other purposes
             return DriveInfo.GetDrives().Where(d => d.IsReady && d.TotalSize != 0 && d.DriveType != DriveType.Ram)
             return DriveInfo.GetDrives().Where(d => d.IsReady && d.TotalSize != 0 && d.DriveType != DriveType.Ram)
                 .Select(d => new FileSystemMetadata
                 .Select(d => new FileSystemMetadata
-            {
-                Name = d.Name,
-                FullName = d.RootDirectory.FullName,
-                IsDirectory = true
-            }).ToList();
+                {
+                    Name = d.Name,
+                    FullName = d.RootDirectory.FullName,
+                    IsDirectory = true
+                }).ToList();
         }
         }
 
 
         public virtual IEnumerable<FileSystemMetadata> GetDirectories(string path, bool recursive = false)
         public virtual IEnumerable<FileSystemMetadata> GetDirectories(string path, bool recursive = false)

+ 0 - 1
Emby.Server.Implementations/Library/Resolvers/TV/SeriesResolver.cs

@@ -8,7 +8,6 @@ using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Controller.Resolvers;
 using MediaBrowser.Controller.Resolvers;
-using MediaBrowser.Model.Configuration;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Model.IO;
 using Microsoft.Extensions.Logging;
 using Microsoft.Extensions.Logging;

+ 9 - 9
Emby.Server.Implementations/Library/UserManager.cs

@@ -805,17 +805,17 @@ namespace Emby.Server.Implementations.Library
 
 
             // Delete user config dir
             // Delete user config dir
             lock (_configSyncLock)
             lock (_configSyncLock)
-            lock (_policySyncLock)
-            {
-                try
-                {
-                    Directory.Delete(user.ConfigurationDirectoryPath, true);
-                }
-                catch (IOException ex)
+                lock (_policySyncLock)
                 {
                 {
-                    _logger.LogError(ex, "Error deleting user config dir: {Path}", user.ConfigurationDirectoryPath);
+                    try
+                    {
+                        Directory.Delete(user.ConfigurationDirectoryPath, true);
+                    }
+                    catch (IOException ex)
+                    {
+                        _logger.LogError(ex, "Error deleting user config dir: {Path}", user.ConfigurationDirectoryPath);
+                    }
                 }
                 }
-            }
 
 
             _users.TryRemove(user.Id, out _);
             _users.TryRemove(user.Id, out _);
 
 

+ 0 - 1
Emby.Server.Implementations/LiveTv/EmbyTV/DirectRecorder.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.IO;
 using System.IO;

+ 0 - 1
Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;

+ 0 - 1
Emby.Server.Implementations/LiveTv/EmbyTV/EntryPoint.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System.Threading.Tasks;
 using System.Threading.Tasks;
 using MediaBrowser.Controller.Plugins;
 using MediaBrowser.Controller.Plugins;

+ 0 - 1
Emby.Server.Implementations/LiveTv/EmbyTV/IRecorder.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Threading;
 using System.Threading;

+ 0 - 1
Emby.Server.Implementations/LiveTv/EmbyTV/ItemDataProvider.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;

+ 0 - 1
Emby.Server.Implementations/LiveTv/EmbyTV/RecordingHelper.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Globalization;
 using System.Globalization;

+ 0 - 1
Emby.Server.Implementations/LiveTv/EmbyTV/SeriesTimerManager.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using MediaBrowser.Controller.LiveTv;
 using MediaBrowser.Controller.LiveTv;

+ 0 - 1
Emby.Server.Implementations/LiveTv/EmbyTV/TimerManager.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Collections.Concurrent;
 using System.Collections.Concurrent;

+ 0 - 1
Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Collections.Concurrent;
 using System.Collections.Concurrent;

+ 0 - 1
Emby.Server.Implementations/LiveTv/Listings/XmlTvListingsProvider.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;

+ 0 - 1
Emby.Server.Implementations/LiveTv/LiveTvConfigurationFactory.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System.Collections.Generic;
 using System.Collections.Generic;
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.Configuration;

+ 0 - 1
Emby.Server.Implementations/LiveTv/LiveTvDtoService.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Globalization;
 using System.Globalization;

+ 0 - 1
Emby.Server.Implementations/LiveTv/LiveTvManager.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;

+ 0 - 1
Emby.Server.Implementations/LiveTv/LiveTvMediaSourceProvider.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;

+ 0 - 1
Emby.Server.Implementations/LiveTv/TunerHosts/BaseTunerHost.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Collections.Concurrent;
 using System.Collections.Concurrent;

+ 0 - 1
Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;

+ 0 - 1
Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunManager.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Buffers;
 using System.Buffers;

+ 1 - 2
Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunUdpStream.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
@@ -8,8 +7,8 @@ using System.Net;
 using System.Net.Sockets;
 using System.Net.Sockets;
 using System.Threading;
 using System.Threading;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
-using MediaBrowser.Common.Net;
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Net;
 using MediaBrowser.Controller;
 using MediaBrowser.Controller;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Dto;

+ 1 - 2
Emby.Server.Implementations/LiveTv/TunerHosts/LiveStream.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
@@ -8,8 +7,8 @@ using System.IO;
 using System.Linq;
 using System.Linq;
 using System.Threading;
 using System.Threading;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
-using MediaBrowser.Controller.Library;
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.Configuration;
+using MediaBrowser.Controller.Library;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Model.LiveTv;
 using MediaBrowser.Model.LiveTv;

+ 0 - 1
Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;

+ 0 - 1
Emby.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;

+ 0 - 1
Emby.Server.Implementations/LiveTv/TunerHosts/SharedHttpStream.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;

+ 0 - 1
Emby.Server.Implementations/Localization/Core/af.json

@@ -41,7 +41,6 @@
     "User": "Gebruiker",
     "User": "Gebruiker",
     "TvShows": "TV Programme",
     "TvShows": "TV Programme",
     "System": "Stelsel",
     "System": "Stelsel",
-    "SubtitlesDownloadedForItem": "Ondertitels afgelaai vir {0}",
     "SubtitleDownloadFailureFromForItem": "Ondertitels het misluk om af te laai van {0} vir {1}",
     "SubtitleDownloadFailureFromForItem": "Ondertitels het misluk om af te laai van {0} vir {1}",
     "StartupEmbyServerIsLoading": "Jellyfin Bediener is besig om te laai. Probeer weer in 'n kort tyd.",
     "StartupEmbyServerIsLoading": "Jellyfin Bediener is besig om te laai. Probeer weer in 'n kort tyd.",
     "ServerNameNeedsToBeRestarted": "{0} moet herbegin word",
     "ServerNameNeedsToBeRestarted": "{0} moet herbegin word",

+ 5 - 6
Emby.Server.Implementations/Localization/Core/ar.json

@@ -1,13 +1,13 @@
 {
 {
     "Albums": "ألبومات",
     "Albums": "ألبومات",
     "AppDeviceValues": "تطبيق: {0}, جهاز: {1}",
     "AppDeviceValues": "تطبيق: {0}, جهاز: {1}",
-    "Application": "التطبيق",
+    "Application": "تطبيق",
     "Artists": "الفنانين",
     "Artists": "الفنانين",
     "AuthenticationSucceededWithUserName": "{0} سجل الدخول بنجاح",
     "AuthenticationSucceededWithUserName": "{0} سجل الدخول بنجاح",
-    "Books": "كتب",
+    "Books": "الكتب",
     "CameraImageUploadedFrom": "صورة كاميرا جديدة تم رفعها من {0}",
     "CameraImageUploadedFrom": "صورة كاميرا جديدة تم رفعها من {0}",
     "Channels": "القنوات",
     "Channels": "القنوات",
-    "ChapterNameValue": "فصل {0}",
+    "ChapterNameValue": "الفصل {0}",
     "Collections": "مجموعات",
     "Collections": "مجموعات",
     "DeviceOfflineWithName": "قُطِع الاتصال بـ{0}",
     "DeviceOfflineWithName": "قُطِع الاتصال بـ{0}",
     "DeviceOnlineWithName": "{0} متصل",
     "DeviceOnlineWithName": "{0} متصل",
@@ -51,8 +51,8 @@
     "NotificationOptionAudioPlaybackStopped": "تم إيقاف تشغيل المقطع الصوتي",
     "NotificationOptionAudioPlaybackStopped": "تم إيقاف تشغيل المقطع الصوتي",
     "NotificationOptionCameraImageUploaded": "تم رفع صورة الكاميرا",
     "NotificationOptionCameraImageUploaded": "تم رفع صورة الكاميرا",
     "NotificationOptionInstallationFailed": "فشل في التثبيت",
     "NotificationOptionInstallationFailed": "فشل في التثبيت",
-    "NotificationOptionNewLibraryContent": "أُضِيفَ محتوى جديد",
-    "NotificationOptionPluginError": "فشل في الـPlugin",
+    "NotificationOptionNewLibraryContent": "تم إضافة محتوى جديد",
+    "NotificationOptionPluginError": "فشل في البرنامج المضاف",
     "NotificationOptionPluginInstalled": "تم تثبيت الملحق",
     "NotificationOptionPluginInstalled": "تم تثبيت الملحق",
     "NotificationOptionPluginUninstalled": "تمت إزالة الملحق",
     "NotificationOptionPluginUninstalled": "تمت إزالة الملحق",
     "NotificationOptionPluginUpdateInstalled": "تم تثبيت تحديثات الملحق",
     "NotificationOptionPluginUpdateInstalled": "تم تثبيت تحديثات الملحق",
@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "سيرفر Jellyfin قيد التشغيل . الرجاء المحاولة بعد قليل.",
     "StartupEmbyServerIsLoading": "سيرفر Jellyfin قيد التشغيل . الرجاء المحاولة بعد قليل.",
     "SubtitleDownloadFailureForItem": "عملية إنزال الترجمة فشلت لـ{0}",
     "SubtitleDownloadFailureForItem": "عملية إنزال الترجمة فشلت لـ{0}",
     "SubtitleDownloadFailureFromForItem": "الترجمات فشلت في التحميل من {0} الى {1}",
     "SubtitleDownloadFailureFromForItem": "الترجمات فشلت في التحميل من {0} الى {1}",
-    "SubtitlesDownloadedForItem": "تم تحميل الترجمات الى {0}",
     "Sync": "مزامنة",
     "Sync": "مزامنة",
     "System": "النظام",
     "System": "النظام",
     "TvShows": "البرامج التلفزيونية",
     "TvShows": "البرامج التلفزيونية",

+ 37 - 16
Emby.Server.Implementations/Localization/Core/bg-BG.json

@@ -1,8 +1,8 @@
 {
 {
     "Albums": "Албуми",
     "Albums": "Албуми",
-    "AppDeviceValues": "Програма: {0}, устройство: {1}",
+    "AppDeviceValues": "Програма: {0}, Устройство: {1}",
     "Application": "Програма",
     "Application": "Програма",
-    "Artists": "Изпълнители",
+    "Artists": "Артисти",
     "AuthenticationSucceededWithUserName": "{0} се удостовери успешно",
     "AuthenticationSucceededWithUserName": "{0} се удостовери успешно",
     "Books": "Книги",
     "Books": "Книги",
     "CameraImageUploadedFrom": "Нова снимка от камера беше качена от {0}",
     "CameraImageUploadedFrom": "Нова снимка от камера беше качена от {0}",
@@ -31,20 +31,20 @@
     "ItemAddedWithName": "{0} е добавено към библиотеката",
     "ItemAddedWithName": "{0} е добавено към библиотеката",
     "ItemRemovedWithName": "{0} е премахнато от библиотеката",
     "ItemRemovedWithName": "{0} е премахнато от библиотеката",
     "LabelIpAddressValue": "ИП адрес: {0}",
     "LabelIpAddressValue": "ИП адрес: {0}",
-    "LabelRunningTimeValue": "",
+    "LabelRunningTimeValue": "Стартирано от: {0}",
     "Latest": "Последни",
     "Latest": "Последни",
     "MessageApplicationUpdated": "Сървърът е обновен",
     "MessageApplicationUpdated": "Сървърът е обновен",
     "MessageApplicationUpdatedTo": "Сървърът е обновен до {0}",
     "MessageApplicationUpdatedTo": "Сървърът е обновен до {0}",
-    "MessageNamedServerConfigurationUpdatedWithValue": "",
-    "MessageServerConfigurationUpdated": "",
+    "MessageNamedServerConfigurationUpdatedWithValue": "Секцията {0} от сървърната конфигурация се актуализира",
+    "MessageServerConfigurationUpdated": "Конфигурацията на сървъра се актуализира",
     "MixedContent": "Смесено съдържание",
     "MixedContent": "Смесено съдържание",
     "Movies": "Филми",
     "Movies": "Филми",
     "Music": "Музика",
     "Music": "Музика",
     "MusicVideos": "Музикални клипове",
     "MusicVideos": "Музикални клипове",
-    "NameInstallFailed": "",
+    "NameInstallFailed": "{0} не можа да се инсталира",
     "NameSeasonNumber": "Сезон {0}",
     "NameSeasonNumber": "Сезон {0}",
     "NameSeasonUnknown": "Неразпознат сезон",
     "NameSeasonUnknown": "Неразпознат сезон",
-    "NewVersionIsAvailable": "",
+    "NewVersionIsAvailable": "Нова версия на Jellyfin сървъра е достъпна за сваляне.",
     "NotificationOptionApplicationUpdateAvailable": "Налично е обновление на програмата",
     "NotificationOptionApplicationUpdateAvailable": "Налично е обновление на програмата",
     "NotificationOptionApplicationUpdateInstalled": "Обновлението на програмата е инсталирано",
     "NotificationOptionApplicationUpdateInstalled": "Обновлението на програмата е инсталирано",
     "NotificationOptionAudioPlayback": "Възпроизвеждането на звук започна",
     "NotificationOptionAudioPlayback": "Възпроизвеждането на звук започна",
@@ -58,7 +58,7 @@
     "NotificationOptionPluginUpdateInstalled": "Обновлението на приставката е инсталирано",
     "NotificationOptionPluginUpdateInstalled": "Обновлението на приставката е инсталирано",
     "NotificationOptionServerRestartRequired": "Нужно е повторно пускане на сървъра",
     "NotificationOptionServerRestartRequired": "Нужно е повторно пускане на сървъра",
     "NotificationOptionTaskFailed": "Грешка в планирана задача",
     "NotificationOptionTaskFailed": "Грешка в планирана задача",
-    "NotificationOptionUserLockedOut": "",
+    "NotificationOptionUserLockedOut": "Потребителя е заключен",
     "NotificationOptionVideoPlayback": "Възпроизвеждането на видео започна",
     "NotificationOptionVideoPlayback": "Възпроизвеждането на видео започна",
     "NotificationOptionVideoPlaybackStopped": "Възпроизвеждането на видео е спряно",
     "NotificationOptionVideoPlaybackStopped": "Възпроизвеждането на видео е спряно",
     "Photos": "Снимки",
     "Photos": "Снимки",
@@ -70,28 +70,49 @@
     "ProviderValue": "Доставчик: {0}",
     "ProviderValue": "Доставчик: {0}",
     "ScheduledTaskFailedWithName": "{0} се провали",
     "ScheduledTaskFailedWithName": "{0} се провали",
     "ScheduledTaskStartedWithName": "{0} започна",
     "ScheduledTaskStartedWithName": "{0} започна",
-    "ServerNameNeedsToBeRestarted": "",
+    "ServerNameNeedsToBeRestarted": "{0} е нужно да се рестартира",
     "Shows": "Сериали",
     "Shows": "Сериали",
     "Songs": "Песни",
     "Songs": "Песни",
     "StartupEmbyServerIsLoading": "Сървърът зарежда. Моля, опитайте отново след малко.",
     "StartupEmbyServerIsLoading": "Сървърът зарежда. Моля, опитайте отново след малко.",
     "SubtitleDownloadFailureForItem": "Неуспешно изтегляне на субтитри за {0}",
     "SubtitleDownloadFailureForItem": "Неуспешно изтегляне на субтитри за {0}",
-    "SubtitleDownloadFailureFromForItem": "",
-    "SubtitlesDownloadedForItem": "Изтеглени са субтитри за {0}",
+    "SubtitleDownloadFailureFromForItem": "Поднадписите за {1} от {0} не можаха да се изтеглят",
     "Sync": "Синхронизиране",
     "Sync": "Синхронизиране",
     "System": "Система",
     "System": "Система",
     "TvShows": "Телевизионни сериали",
     "TvShows": "Телевизионни сериали",
     "User": "Потребител",
     "User": "Потребител",
     "UserCreatedWithName": "Потребителят {0} е създаден",
     "UserCreatedWithName": "Потребителят {0} е създаден",
     "UserDeletedWithName": "Потребителят {0} е изтрит",
     "UserDeletedWithName": "Потребителят {0} е изтрит",
-    "UserDownloadingItemWithValues": "",
-    "UserLockedOutWithName": "",
+    "UserDownloadingItemWithValues": "{0} изтегля {1}",
+    "UserLockedOutWithName": "Потребител {0} се заключи",
     "UserOfflineFromDevice": "{0} се разкачи от {1}",
     "UserOfflineFromDevice": "{0} се разкачи от {1}",
     "UserOnlineFromDevice": "{0} е на линия от {1}",
     "UserOnlineFromDevice": "{0} е на линия от {1}",
     "UserPasswordChangedWithName": "Паролата на потребителя {0} е променена",
     "UserPasswordChangedWithName": "Паролата на потребителя {0} е променена",
-    "UserPolicyUpdatedWithName": "",
+    "UserPolicyUpdatedWithName": "Потребителската политика за {0} се актуализира",
     "UserStartedPlayingItemWithValues": "{0} пусна {1}",
     "UserStartedPlayingItemWithValues": "{0} пусна {1}",
     "UserStoppedPlayingItemWithValues": "{0} спря {1}",
     "UserStoppedPlayingItemWithValues": "{0} спря {1}",
-    "ValueHasBeenAddedToLibrary": "",
+    "ValueHasBeenAddedToLibrary": "{0} беше добавен във Вашата библиотека",
     "ValueSpecialEpisodeName": "Специални - {0}",
     "ValueSpecialEpisodeName": "Специални - {0}",
-    "VersionNumber": "Версия {0}"
+    "VersionNumber": "Версия {0}",
+    "TaskDownloadMissingSubtitlesDescription": "Търси Интернет за липсващи поднадписи, на база конфигурацията за мета-данни.",
+    "TaskDownloadMissingSubtitles": "Изтегляне на липсващи поднадписи",
+    "TaskRefreshChannelsDescription": "Обновява информацията за интернет канала.",
+    "TaskRefreshChannels": "Обновяване на Канали",
+    "TaskCleanTranscodeDescription": "Изтрива прекодирани файлове по-стари от един ден.",
+    "TaskCleanTranscode": "Изчиства директорията за прекодиране",
+    "TaskUpdatePluginsDescription": "Изтегля и инсталира актуализации за добавките, които са настроени за автоматична актуализация.",
+    "TaskUpdatePlugins": "Актуализира добавките",
+    "TaskRefreshPeopleDescription": "Актуализира мета-данните за артистите и режисьорите за Вашата медийна библиотека.",
+    "TaskRefreshPeople": "Обновяване на участниците",
+    "TaskCleanLogsDescription": "Изтрива лог файлове по-стари от {0} дни.",
+    "TaskCleanLogs": "Изчисти директорията с логове",
+    "TaskRefreshLibraryDescription": "Сканира Вашата библиотека с медия за нови файлове и обновява мета-данните.",
+    "TaskRefreshLibrary": "Сканиране на библиотеката с медия",
+    "TaskRefreshChapterImagesDescription": "Създава иконки за видеа, които имат епизоди.",
+    "TaskRefreshChapterImages": "Извличане на изображения за епизода",
+    "TaskCleanCacheDescription": "Изтриване на ненужните от системата файлове.",
+    "TaskCleanCache": "Изчистване на Кеш-директорията",
+    "TasksChannelsCategory": "Интернет Канали",
+    "TasksApplicationCategory": "Приложение",
+    "TasksLibraryCategory": "Библиотека",
+    "TasksMaintenanceCategory": "Поддръжка"
 }
 }

+ 0 - 1
Emby.Server.Implementations/Localization/Core/bn.json

@@ -38,7 +38,6 @@
     "TvShows": "টিভি শোগুলো",
     "TvShows": "টিভি শোগুলো",
     "System": "সিস্টেম",
     "System": "সিস্টেম",
     "Sync": "সিংক",
     "Sync": "সিংক",
-    "SubtitlesDownloadedForItem": "{0} এর জন্য সাবটাইটেল ডাউনলোড করা হয়েছে",
     "SubtitleDownloadFailureFromForItem": "{2} থেকে {1} এর জন্য সাবটাইটেল ডাউনলোড ব্যর্থ",
     "SubtitleDownloadFailureFromForItem": "{2} থেকে {1} এর জন্য সাবটাইটেল ডাউনলোড ব্যর্থ",
     "StartupEmbyServerIsLoading": "জেলিফিন সার্ভার লোড হচ্ছে। দয়া করে একটু পরে আবার চেষ্টা করুন।",
     "StartupEmbyServerIsLoading": "জেলিফিন সার্ভার লোড হচ্ছে। দয়া করে একটু পরে আবার চেষ্টা করুন।",
     "Songs": "গানগুলো",
     "Songs": "গানগুলো",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/ca.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "El Servidor d'Jellyfin est&agrave; carregant. Si et plau, prova de nou en breus.",
     "StartupEmbyServerIsLoading": "El Servidor d'Jellyfin est&agrave; carregant. Si et plau, prova de nou en breus.",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureFromForItem": "Els subtítols no s'han pogut baixar de {0} per {1}",
     "SubtitleDownloadFailureFromForItem": "Els subtítols no s'han pogut baixar de {0} per {1}",
-    "SubtitlesDownloadedForItem": "Subtítols descarregats per a {0}",
     "Sync": "Sincronitzar",
     "Sync": "Sincronitzar",
     "System": "System",
     "System": "System",
     "TvShows": "Espectacles de TV",
     "TvShows": "Espectacles de TV",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/cs.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin Server je spouštěn. Zkuste to prosím v brzké době znovu.",
     "StartupEmbyServerIsLoading": "Jellyfin Server je spouštěn. Zkuste to prosím v brzké době znovu.",
     "SubtitleDownloadFailureForItem": "Stahování titulků selhalo pro {0}",
     "SubtitleDownloadFailureForItem": "Stahování titulků selhalo pro {0}",
     "SubtitleDownloadFailureFromForItem": "Stažení titulků pro {1} z {0} selhalo",
     "SubtitleDownloadFailureFromForItem": "Stažení titulků pro {1} z {0} selhalo",
-    "SubtitlesDownloadedForItem": "Staženy titulky pro {0}",
     "Sync": "Synchronizace",
     "Sync": "Synchronizace",
     "System": "Systém",
     "System": "Systém",
     "TvShows": "TV seriály",
     "TvShows": "TV seriály",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/da.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin Server er i gang med at starte op. Prøv venligst igen om lidt.",
     "StartupEmbyServerIsLoading": "Jellyfin Server er i gang med at starte op. Prøv venligst igen om lidt.",
     "SubtitleDownloadFailureForItem": "Fejlet i download af undertekster for {0}",
     "SubtitleDownloadFailureForItem": "Fejlet i download af undertekster for {0}",
     "SubtitleDownloadFailureFromForItem": "Undertekster kunne ikke downloades fra {0} til {1}",
     "SubtitleDownloadFailureFromForItem": "Undertekster kunne ikke downloades fra {0} til {1}",
-    "SubtitlesDownloadedForItem": "Undertekster downloadet for {0}",
     "Sync": "Synk",
     "Sync": "Synk",
     "System": "System",
     "System": "System",
     "TvShows": "TV serier",
     "TvShows": "TV serier",

+ 26 - 5
Emby.Server.Implementations/Localization/Core/de.json

@@ -1,9 +1,9 @@
 {
 {
     "Albums": "Alben",
     "Albums": "Alben",
-    "AppDeviceValues": "Anw: {0}, Gerät: {1}",
+    "AppDeviceValues": "App: {0}, Gerät: {1}",
     "Application": "Anwendung",
     "Application": "Anwendung",
     "Artists": "Interpreten",
     "Artists": "Interpreten",
-    "AuthenticationSucceededWithUserName": "{0} hat sich erfolgreich angemeldet",
+    "AuthenticationSucceededWithUserName": "{0} hat sich erfolgreich authentifziert",
     "Books": "Bücher",
     "Books": "Bücher",
     "CameraImageUploadedFrom": "Ein neues Foto wurde von {0} hochgeladen",
     "CameraImageUploadedFrom": "Ein neues Foto wurde von {0} hochgeladen",
     "Channels": "Kanäle",
     "Channels": "Kanäle",
@@ -50,7 +50,7 @@
     "NotificationOptionAudioPlayback": "Audiowiedergabe gestartet",
     "NotificationOptionAudioPlayback": "Audiowiedergabe gestartet",
     "NotificationOptionAudioPlaybackStopped": "Audiowiedergabe gestoppt",
     "NotificationOptionAudioPlaybackStopped": "Audiowiedergabe gestoppt",
     "NotificationOptionCameraImageUploaded": "Foto hochgeladen",
     "NotificationOptionCameraImageUploaded": "Foto hochgeladen",
-    "NotificationOptionInstallationFailed": "Fehler bei der Installation",
+    "NotificationOptionInstallationFailed": "Installation fehlgeschlagen",
     "NotificationOptionNewLibraryContent": "Neuer Inhalt hinzugefügt",
     "NotificationOptionNewLibraryContent": "Neuer Inhalt hinzugefügt",
     "NotificationOptionPluginError": "Plugin-Fehler",
     "NotificationOptionPluginError": "Plugin-Fehler",
     "NotificationOptionPluginInstalled": "Plugin installiert",
     "NotificationOptionPluginInstalled": "Plugin installiert",
@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin-Server startet, bitte versuche es gleich noch einmal.",
     "StartupEmbyServerIsLoading": "Jellyfin-Server startet, bitte versuche es gleich noch einmal.",
     "SubtitleDownloadFailureForItem": "Download der Untertitel fehlgeschlagen für {0}",
     "SubtitleDownloadFailureForItem": "Download der Untertitel fehlgeschlagen für {0}",
     "SubtitleDownloadFailureFromForItem": "Untertitel von {0} für {1} konnten nicht heruntergeladen werden",
     "SubtitleDownloadFailureFromForItem": "Untertitel von {0} für {1} konnten nicht heruntergeladen werden",
-    "SubtitlesDownloadedForItem": "Untertitel heruntergeladen für {0}",
     "Sync": "Synchronisation",
     "Sync": "Synchronisation",
     "System": "System",
     "System": "System",
     "TvShows": "TV-Sendungen",
     "TvShows": "TV-Sendungen",
@@ -93,5 +92,27 @@
     "UserStoppedPlayingItemWithValues": "{0} hat die Wiedergabe von {1} auf {2} beendet",
     "UserStoppedPlayingItemWithValues": "{0} hat die Wiedergabe von {1} auf {2} beendet",
     "ValueHasBeenAddedToLibrary": "{0} wurde deiner Bibliothek hinzugefügt",
     "ValueHasBeenAddedToLibrary": "{0} wurde deiner Bibliothek hinzugefügt",
     "ValueSpecialEpisodeName": "Extra - {0}",
     "ValueSpecialEpisodeName": "Extra - {0}",
-    "VersionNumber": "Version {0}"
+    "VersionNumber": "Version {0}",
+    "TaskDownloadMissingSubtitlesDescription": "Durchsucht das Internet nach fehlenden Untertiteln, basierend auf den Meta Einstellungen.",
+    "TaskDownloadMissingSubtitles": "Lade fehlende Untertitel herunter",
+    "TaskRefreshChannelsDescription": "Erneuere Internet Kanal Informationen.",
+    "TaskRefreshChannels": "Erneuere Kanäle",
+    "TaskCleanTranscodeDescription": "Löscht Transkodierdateien welche älter als ein Tag sind.",
+    "TaskCleanTranscode": "Lösche Transkodier Pfad",
+    "TaskUpdatePluginsDescription": "Läd Updates für Plugins herunter, welche dazu eingestellt sind automatisch zu updaten und installiert sie.",
+    "TaskUpdatePlugins": "Update Plugins",
+    "TaskRefreshPeopleDescription": "Erneuert Metadaten für Schausteller und Regisseure in deinen Bibliotheken.",
+    "TaskRefreshPeople": "Erneuere Schausteller",
+    "TaskCleanLogsDescription": "Lösche Log Datein die älter als {0} Tage sind.",
+    "TaskCleanLogs": "Lösche Log Pfad",
+    "TaskRefreshLibraryDescription": "Scanne alle Bibliotheken für hinzugefügte Datein und erneuere Metadaten.",
+    "TaskRefreshLibrary": "Scanne alle Bibliotheken",
+    "TaskRefreshChapterImagesDescription": "Kreiert Vorschaubilder für Videos welche Kapitel haben.",
+    "TaskRefreshChapterImages": "Extrahiert Kapitel-Bilder",
+    "TaskCleanCacheDescription": "Löscht Zwischenspeicherdatein die nicht länger von System gebraucht werden.",
+    "TaskCleanCache": "Leere Cache Pfad",
+    "TasksChannelsCategory": "Internet Kanäle",
+    "TasksApplicationCategory": "Anwendung",
+    "TasksLibraryCategory": "Bibliothek",
+    "TasksMaintenanceCategory": "Wartung"
 }
 }

+ 0 - 1
Emby.Server.Implementations/Localization/Core/el.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Ο Jellyfin Server φορτώνει. Παρακαλώ δοκιμάστε σε λίγο.",
     "StartupEmbyServerIsLoading": "Ο Jellyfin Server φορτώνει. Παρακαλώ δοκιμάστε σε λίγο.",
     "SubtitleDownloadFailureForItem": "Οι υπότιτλοι απέτυχαν να κατέβουν για {0}",
     "SubtitleDownloadFailureForItem": "Οι υπότιτλοι απέτυχαν να κατέβουν για {0}",
     "SubtitleDownloadFailureFromForItem": "Αποτυχίες μεταφόρτωσης υποτίτλων από {0} για {1}",
     "SubtitleDownloadFailureFromForItem": "Αποτυχίες μεταφόρτωσης υποτίτλων από {0} για {1}",
-    "SubtitlesDownloadedForItem": "Οι υπότιτλοι κατέβηκαν για {0}",
     "Sync": "Συγχρονισμός",
     "Sync": "Συγχρονισμός",
     "System": "Σύστημα",
     "System": "Σύστημα",
     "TvShows": "Τηλεοπτικές Σειρές",
     "TvShows": "Τηλεοπτικές Σειρές",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/en-GB.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin Server is loading. Please try again shortly.",
     "StartupEmbyServerIsLoading": "Jellyfin Server is loading. Please try again shortly.",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureFromForItem": "Subtitles failed to download from {0} for {1}",
     "SubtitleDownloadFailureFromForItem": "Subtitles failed to download from {0} for {1}",
-    "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}",
     "Sync": "Sync",
     "Sync": "Sync",
     "System": "System",
     "System": "System",
     "TvShows": "TV Shows",
     "TvShows": "TV Shows",

+ 23 - 2
Emby.Server.Implementations/Localization/Core/en-US.json

@@ -75,7 +75,6 @@
     "Songs": "Songs",
     "Songs": "Songs",
     "StartupEmbyServerIsLoading": "Jellyfin Server is loading. Please try again shortly.",
     "StartupEmbyServerIsLoading": "Jellyfin Server is loading. Please try again shortly.",
     "SubtitleDownloadFailureFromForItem": "Subtitles failed to download from {0} for {1}",
     "SubtitleDownloadFailureFromForItem": "Subtitles failed to download from {0} for {1}",
-    "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}",
     "Sync": "Sync",
     "Sync": "Sync",
     "System": "System",
     "System": "System",
     "TvShows": "TV Shows",
     "TvShows": "TV Shows",
@@ -92,5 +91,27 @@
     "UserStoppedPlayingItemWithValues": "{0} has finished playing {1} on {2}",
     "UserStoppedPlayingItemWithValues": "{0} has finished playing {1} on {2}",
     "ValueHasBeenAddedToLibrary": "{0} has been added to your media library",
     "ValueHasBeenAddedToLibrary": "{0} has been added to your media library",
     "ValueSpecialEpisodeName": "Special - {0}",
     "ValueSpecialEpisodeName": "Special - {0}",
-    "VersionNumber": "Version {0}"
+    "VersionNumber": "Version {0}",
+    "TasksMaintenanceCategory": "Maintenance",
+    "TasksLibraryCategory": "Library",
+    "TasksApplicationCategory": "Application",
+    "TasksChannelsCategory": "Internet Channels",
+    "TaskCleanCache": "Clean Cache Directory",
+    "TaskCleanCacheDescription": "Deletes cache files no longer needed by the system.",
+    "TaskRefreshChapterImages": "Extract Chapter Images",
+    "TaskRefreshChapterImagesDescription": "Creates thumbnails for videos that have chapters.",
+    "TaskRefreshLibrary": "Scan Media Library",
+    "TaskRefreshLibraryDescription": "Scans your media library for new files and refreshes metadata.",
+    "TaskCleanLogs": "Clean Log Directory",
+    "TaskCleanLogsDescription": "Deletes log files that are more than {0} days old.",
+    "TaskRefreshPeople": "Refresh People",
+    "TaskRefreshPeopleDescription": "Updates metadata for actors and directors in your media library.",
+    "TaskUpdatePlugins": "Update Plugins",
+    "TaskUpdatePluginsDescription": "Downloads and installs updates for plugins that are configured to update automatically.",
+    "TaskCleanTranscode": "Clean Transcode Directory",
+    "TaskCleanTranscodeDescription": "Deletes transcode files more than one day old.",
+    "TaskRefreshChannels": "Refresh Channels",
+    "TaskRefreshChannelsDescription": "Refreshes internet channel information.",
+    "TaskDownloadMissingSubtitles": "Download missing subtitles",
+    "TaskDownloadMissingSubtitlesDescription": "Searches the internet for missing subtitles based on metadata configuration."
 }
 }

+ 0 - 1
Emby.Server.Implementations/Localization/Core/es-AR.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin Server se está cargando. Vuelve a intentarlo en breve.",
     "StartupEmbyServerIsLoading": "Jellyfin Server se está cargando. Vuelve a intentarlo en breve.",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureFromForItem": "Fallo de descarga de subtítulos desde {0} para {1}",
     "SubtitleDownloadFailureFromForItem": "Fallo de descarga de subtítulos desde {0} para {1}",
-    "SubtitlesDownloadedForItem": "Descargar subtítulos para {0}",
     "Sync": "Sincronizar",
     "Sync": "Sincronizar",
     "System": "Sistema",
     "System": "Sistema",
     "TvShows": "Series de TV",
     "TvShows": "Series de TV",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/es-MX.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "El servidor Jellyfin esta cargando. Por favor intente de nuevo dentro de poco.",
     "StartupEmbyServerIsLoading": "El servidor Jellyfin esta cargando. Por favor intente de nuevo dentro de poco.",
     "SubtitleDownloadFailureForItem": "Falló la descarga de subtítulos para {0}",
     "SubtitleDownloadFailureForItem": "Falló la descarga de subtítulos para {0}",
     "SubtitleDownloadFailureFromForItem": "Falló la descarga de subtitulos desde {0} para {1}",
     "SubtitleDownloadFailureFromForItem": "Falló la descarga de subtitulos desde {0} para {1}",
-    "SubtitlesDownloadedForItem": "Subtítulos descargados para {0}",
     "Sync": "Sincronizar",
     "Sync": "Sincronizar",
     "System": "Sistema",
     "System": "Sistema",
     "TvShows": "Programas de TV",
     "TvShows": "Programas de TV",

+ 23 - 2
Emby.Server.Implementations/Localization/Core/es.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin Server se está cargando. Vuelve a intentarlo en breve.",
     "StartupEmbyServerIsLoading": "Jellyfin Server se está cargando. Vuelve a intentarlo en breve.",
     "SubtitleDownloadFailureForItem": "Error al descargar subtítulos para {0}",
     "SubtitleDownloadFailureForItem": "Error al descargar subtítulos para {0}",
     "SubtitleDownloadFailureFromForItem": "Fallo de descarga de subtítulos desde {0} para {1}",
     "SubtitleDownloadFailureFromForItem": "Fallo de descarga de subtítulos desde {0} para {1}",
-    "SubtitlesDownloadedForItem": "Descargar subtítulos para {0}",
     "Sync": "Sincronizar",
     "Sync": "Sincronizar",
     "System": "Sistema",
     "System": "Sistema",
     "TvShows": "Programas de televisión",
     "TvShows": "Programas de televisión",
@@ -93,5 +92,27 @@
     "UserStoppedPlayingItemWithValues": "{0} ha terminado de reproducir {1} en {2}",
     "UserStoppedPlayingItemWithValues": "{0} ha terminado de reproducir {1} en {2}",
     "ValueHasBeenAddedToLibrary": "{0} ha sido añadido a tu biblioteca multimedia",
     "ValueHasBeenAddedToLibrary": "{0} ha sido añadido a tu biblioteca multimedia",
     "ValueSpecialEpisodeName": "Especial - {0}",
     "ValueSpecialEpisodeName": "Especial - {0}",
-    "VersionNumber": "Versión {0}"
+    "VersionNumber": "Versión {0}",
+    "TasksMaintenanceCategory": "Mantenimiento",
+    "TasksLibraryCategory": "Librería",
+    "TasksApplicationCategory": "Aplicación",
+    "TasksChannelsCategory": "Canales de internet",
+    "TaskCleanCache": "Eliminar archivos temporales",
+    "TaskCleanCacheDescription": "Elimina los archivos temporales que ya no son necesarios para el servidor.",
+    "TaskRefreshChapterImages": "Extraer imágenes de los capítulos",
+    "TaskRefreshChapterImagesDescription": "Crea las miniaturas de los vídeos que tengan capítulos.",
+    "TaskRefreshLibrary": "Escanear la biblioteca",
+    "TaskRefreshLibraryDescription": "Añade los archivos que se hayan añadido a la biblioteca y actualiza las etiquetas de los ya presentes.",
+    "TaskCleanLogs": "Limpiar registros",
+    "TaskCleanLogsDescription": "Elimina los archivos de registro que tengan más de {0} días.",
+    "TaskRefreshPeople": "Actualizar personas",
+    "TaskRefreshPeopleDescription": "Actualiza las etiquetas de los intérpretes y directores presentes en tus bibliotecas.",
+    "TaskUpdatePlugins": "Actualizar extensiones",
+    "TaskUpdatePluginsDescription": "Actualiza las extensiones que están configuradas para actualizarse automáticamente.",
+    "TaskCleanTranscode": "Limpiar las transcodificaciones",
+    "TaskCleanTranscodeDescription": "Elimina los archivos temporales de transcodificación anteriores a un día de antigüedad.",
+    "TaskRefreshChannels": "Actualizar canales",
+    "TaskRefreshChannelsDescription": "Actualiza la información de los canales de internet.",
+    "TaskDownloadMissingSubtitles": "Descargar los subtítulos que faltan",
+    "TaskDownloadMissingSubtitlesDescription": "Busca en internet los subtítulos que falten en el contenido de tus bibliotecas, basándose en la configuración de los metadatos."
 }
 }

+ 41 - 42
Emby.Server.Implementations/Localization/Core/fa.json

@@ -1,56 +1,56 @@
 {
 {
-    "Albums": "آلبوم ها",
+    "Albums": "آلبومها",
     "AppDeviceValues": "برنامه: {0} ، دستگاه: {1}",
     "AppDeviceValues": "برنامه: {0} ، دستگاه: {1}",
     "Application": "برنامه",
     "Application": "برنامه",
     "Artists": "هنرمندان",
     "Artists": "هنرمندان",
     "AuthenticationSucceededWithUserName": "{0} با موفقیت تایید اعتبار شد",
     "AuthenticationSucceededWithUserName": "{0} با موفقیت تایید اعتبار شد",
-    "Books": "کتاب ها",
-    "CameraImageUploadedFrom": "یک عکس جدید از دوربین ارسال شده {0}",
-    "Channels": "کانال ها",
-    "ChapterNameValue": "فصل {0}",
-    "Collections": "کلکسیون ها",
+    "Books": "کتابها",
+    "CameraImageUploadedFrom": "یک عکس جدید از دوربین ارسال شده است {0}",
+    "Channels": "کانالها",
+    "ChapterNameValue": "قسمت {0}",
+    "Collections": "مجموعه‌ها",
     "DeviceOfflineWithName": "ارتباط {0} قطع شد",
     "DeviceOfflineWithName": "ارتباط {0} قطع شد",
-    "DeviceOnlineWithName": "{0} متصل شده",
+    "DeviceOnlineWithName": "{0} متصل شد",
     "FailedLoginAttemptWithUserName": "تلاش برای ورود از {0} ناموفق بود",
     "FailedLoginAttemptWithUserName": "تلاش برای ورود از {0} ناموفق بود",
-    "Favorites": "مورد علاقه ها",
-    "Folders": "پوشه ها",
+    "Favorites": "مورد علاقهها",
+    "Folders": "پوشهها",
     "Genres": "ژانرها",
     "Genres": "ژانرها",
     "HeaderAlbumArtists": "هنرمندان آلبوم",
     "HeaderAlbumArtists": "هنرمندان آلبوم",
     "HeaderCameraUploads": "آپلودهای دوربین",
     "HeaderCameraUploads": "آپلودهای دوربین",
     "HeaderContinueWatching": "ادامه تماشا",
     "HeaderContinueWatching": "ادامه تماشا",
-    "HeaderFavoriteAlbums": "آلبوم های مورد علاقه",
+    "HeaderFavoriteAlbums": "آلبومهای مورد علاقه",
     "HeaderFavoriteArtists": "هنرمندان مورد علاقه",
     "HeaderFavoriteArtists": "هنرمندان مورد علاقه",
-    "HeaderFavoriteEpisodes": "قسمت های مورد علاقه",
-    "HeaderFavoriteShows": "سریال های مورد علاقه",
-    "HeaderFavoriteSongs": "آهنگ های مورد علاقه",
+    "HeaderFavoriteEpisodes": "قسمتهای مورد علاقه",
+    "HeaderFavoriteShows": "سریالهای مورد علاقه",
+    "HeaderFavoriteSongs": "آهنگهای مورد علاقه",
     "HeaderLiveTV": "پخش زنده تلویزیون",
     "HeaderLiveTV": "پخش زنده تلویزیون",
-    "HeaderNextUp": "بعدی چیه",
-    "HeaderRecordingGroups": "گروه های ضبط",
+    "HeaderNextUp": "قسمت بعدی",
+    "HeaderRecordingGroups": "گروههای ضبط",
     "HomeVideos": "ویدیوهای خانگی",
     "HomeVideos": "ویدیوهای خانگی",
     "Inherit": "به ارث برده",
     "Inherit": "به ارث برده",
     "ItemAddedWithName": "{0} به کتابخانه افزوده شد",
     "ItemAddedWithName": "{0} به کتابخانه افزوده شد",
     "ItemRemovedWithName": "{0} از کتابخانه حذف شد",
     "ItemRemovedWithName": "{0} از کتابخانه حذف شد",
     "LabelIpAddressValue": "آدرس آی پی: {0}",
     "LabelIpAddressValue": "آدرس آی پی: {0}",
     "LabelRunningTimeValue": "زمان اجرا: {0}",
     "LabelRunningTimeValue": "زمان اجرا: {0}",
-    "Latest": "آخرین",
+    "Latest": "جدیدترین‌ها",
     "MessageApplicationUpdated": "سرور Jellyfin بروزرسانی شد",
     "MessageApplicationUpdated": "سرور Jellyfin بروزرسانی شد",
-    "MessageApplicationUpdatedTo": "سرور جلیفین آپدیت شده به نسخه {0}",
+    "MessageApplicationUpdatedTo": "سرور Jellyfin به نسخه {0} بروزرسانی شد",
     "MessageNamedServerConfigurationUpdatedWithValue": "پکربندی بخش {0} سرور  بروزرسانی شد",
     "MessageNamedServerConfigurationUpdatedWithValue": "پکربندی بخش {0} سرور  بروزرسانی شد",
     "MessageServerConfigurationUpdated": "پیکربندی سرور بروزرسانی شد",
     "MessageServerConfigurationUpdated": "پیکربندی سرور بروزرسانی شد",
-    "MixedContent": "محتوای درهم",
-    "Movies": "فیلم های سینمایی",
+    "MixedContent": "محتوای مخلوط",
+    "Movies": "فیلم‌ها",
     "Music": "موسیقی",
     "Music": "موسیقی",
     "MusicVideos": "موزیک ویدیوها",
     "MusicVideos": "موزیک ویدیوها",
-    "NameInstallFailed": "{0} نصب با مشکل مواجه شده",
+    "NameInstallFailed": "{0} نصب با مشکل مواجه شد",
     "NameSeasonNumber": "فصل {0}",
     "NameSeasonNumber": "فصل {0}",
-    "NameSeasonUnknown": "فصل های ناشناخته",
-    "NewVersionIsAvailable": "یک نسخه جدید جلیفین برای بروزرسانی آماده میباشد.",
+    "NameSeasonUnknown": "فصل ناشناخته",
+    "NewVersionIsAvailable": "یک نسخه جدید Jellyfin برای بروزرسانی آماده می‌باشد.",
     "NotificationOptionApplicationUpdateAvailable": "بروزرسانی برنامه موجود است",
     "NotificationOptionApplicationUpdateAvailable": "بروزرسانی برنامه موجود است",
     "NotificationOptionApplicationUpdateInstalled": "بروزرسانی برنامه نصب شد",
     "NotificationOptionApplicationUpdateInstalled": "بروزرسانی برنامه نصب شد",
     "NotificationOptionAudioPlayback": "پخش صدا آغاز شد",
     "NotificationOptionAudioPlayback": "پخش صدا آغاز شد",
     "NotificationOptionAudioPlaybackStopped": "پخش صدا متوقف شد",
     "NotificationOptionAudioPlaybackStopped": "پخش صدا متوقف شد",
     "NotificationOptionCameraImageUploaded": "تصاویر دوربین آپلود شد",
     "NotificationOptionCameraImageUploaded": "تصاویر دوربین آپلود شد",
-    "NotificationOptionInstallationFailed": "شکست نصب",
+    "NotificationOptionInstallationFailed": "نصب شکست خورد",
     "NotificationOptionNewLibraryContent": "محتوای جدید افزوده شد",
     "NotificationOptionNewLibraryContent": "محتوای جدید افزوده شد",
     "NotificationOptionPluginError": "خرابی افزونه",
     "NotificationOptionPluginError": "خرابی افزونه",
     "NotificationOptionPluginInstalled": "افزونه نصب شد",
     "NotificationOptionPluginInstalled": "افزونه نصب شد",
@@ -58,40 +58,39 @@
     "NotificationOptionPluginUpdateInstalled": "بروزرسانی افزونه نصب شد",
     "NotificationOptionPluginUpdateInstalled": "بروزرسانی افزونه نصب شد",
     "NotificationOptionServerRestartRequired": "شروع مجدد سرور نیاز است",
     "NotificationOptionServerRestartRequired": "شروع مجدد سرور نیاز است",
     "NotificationOptionTaskFailed": "شکست وظیفه برنامه ریزی شده",
     "NotificationOptionTaskFailed": "شکست وظیفه برنامه ریزی شده",
-    "NotificationOptionUserLockedOut": "کاربر از سیستم خارج شد",
+    "NotificationOptionUserLockedOut": "کاربر قفل شد",
     "NotificationOptionVideoPlayback": "پخش ویدیو آغاز شد",
     "NotificationOptionVideoPlayback": "پخش ویدیو آغاز شد",
     "NotificationOptionVideoPlaybackStopped": "پخش ویدیو متوقف شد",
     "NotificationOptionVideoPlaybackStopped": "پخش ویدیو متوقف شد",
-    "Photos": "عکس ها",
-    "Playlists": "لیست های پخش",
+    "Photos": "عکسها",
+    "Playlists": "لیستهای پخش",
     "Plugin": "افزونه",
     "Plugin": "افزونه",
     "PluginInstalledWithName": "{0} نصب شد",
     "PluginInstalledWithName": "{0} نصب شد",
     "PluginUninstalledWithName": "{0} حذف شد",
     "PluginUninstalledWithName": "{0} حذف شد",
     "PluginUpdatedWithName": "{0} آپدیت شد",
     "PluginUpdatedWithName": "{0} آپدیت شد",
     "ProviderValue": "ارائه دهنده: {0}",
     "ProviderValue": "ارائه دهنده: {0}",
-    "ScheduledTaskFailedWithName": "{0} ناموفق بود",
+    "ScheduledTaskFailedWithName": "{0} شکست خورد",
     "ScheduledTaskStartedWithName": "{0} شروع شد",
     "ScheduledTaskStartedWithName": "{0} شروع شد",
-    "ServerNameNeedsToBeRestarted": "{0} احتیاج به راه اندازی مجدد",
-    "Shows": "سریال ها",
-    "Songs": "آهنگ ها",
+    "ServerNameNeedsToBeRestarted": "{0} نیاز به راه اندازی مجدد دارد",
+    "Shows": "سریالها",
+    "Songs": "موسیقی‌ها",
     "StartupEmbyServerIsLoading": "سرور Jellyfin در حال بارگیری است. لطفا کمی بعد دوباره تلاش کنید.",
     "StartupEmbyServerIsLoading": "سرور Jellyfin در حال بارگیری است. لطفا کمی بعد دوباره تلاش کنید.",
     "SubtitleDownloadFailureForItem": "دانلود زیرنویس برای {0} ناموفق بود",
     "SubtitleDownloadFailureForItem": "دانلود زیرنویس برای {0} ناموفق بود",
-    "SubtitleDownloadFailureFromForItem": "زیرنویس برای دانلود با مشکل مواجه شده از {0} برای {1}",
-    "SubtitlesDownloadedForItem": "زیرنویس {0} دانلود شد",
-    "Sync": "همگامسازی",
+    "SubtitleDownloadFailureFromForItem": "بارگیری زیرنویس برای {1} از {0} شکست خورد",
+    "Sync": "همگام‌سازی",
     "System": "سیستم",
     "System": "سیستم",
-    "TvShows": "سریال های تلویزیونی",
+    "TvShows": "سریالهای تلویزیونی",
     "User": "کاربر",
     "User": "کاربر",
     "UserCreatedWithName": "کاربر {0} ایجاد شد",
     "UserCreatedWithName": "کاربر {0} ایجاد شد",
     "UserDeletedWithName": "کاربر {0} حذف شد",
     "UserDeletedWithName": "کاربر {0} حذف شد",
-    "UserDownloadingItemWithValues": "{0} در حال دانلود است {1}",
-    "UserLockedOutWithName": "کاربر {0} از سیستم خارج شد",
+    "UserDownloadingItemWithValues": "{0} در حال بارگیری {1} می‌باشد",
+    "UserLockedOutWithName": "کاربر {0} قفل شده است",
     "UserOfflineFromDevice": "ارتباط {0} از {1} قطع شد",
     "UserOfflineFromDevice": "ارتباط {0} از {1} قطع شد",
-    "UserOnlineFromDevice": "{0}از {1} آنلاین میباشد",
-    "UserPasswordChangedWithName": "رمز برای کاربر {0} تغییر یافت",
+    "UserOnlineFromDevice": "{0} از {1} آنلاین میباشد",
+    "UserPasswordChangedWithName": "گذرواژه برای کاربر {0} تغییر کرد",
     "UserPolicyUpdatedWithName": "سیاست کاربری برای {0} بروزرسانی شد",
     "UserPolicyUpdatedWithName": "سیاست کاربری برای {0} بروزرسانی شد",
-    "UserStartedPlayingItemWithValues": "{0} شروع به پخش {1} کرد",
-    "UserStoppedPlayingItemWithValues": "{0} پخش {1} را متوقف کرد",
-    "ValueHasBeenAddedToLibrary": "{0} اضافه شده به کتابخانه رسانه شما",
-    "ValueSpecialEpisodeName": "ویژه- {0}",
+    "UserStartedPlayingItemWithValues": "{0} در حال پخش {1} بر روی {2} است",
+    "UserStoppedPlayingItemWithValues": "{0} پخش {1} را بر روی {2} به پایان رساند",
+    "ValueHasBeenAddedToLibrary": "{0} به کتابخانه‌ی رسانه‌ی شما افزوده شد",
+    "ValueSpecialEpisodeName": "ویژه - {0}",
     "VersionNumber": "نسخه {0}"
     "VersionNumber": "نسخه {0}"
 }
 }

+ 0 - 1
Emby.Server.Implementations/Localization/Core/fi.json

@@ -69,7 +69,6 @@
     "UserCreatedWithName": "Luotiin käyttäjä {0}",
     "UserCreatedWithName": "Luotiin käyttäjä {0}",
     "TvShows": "TV-Ohjelmat",
     "TvShows": "TV-Ohjelmat",
     "Sync": "Synkronoi",
     "Sync": "Synkronoi",
-    "SubtitlesDownloadedForItem": "Tekstitys ladattu {0}",
     "SubtitleDownloadFailureFromForItem": "Tekstityksen lataaminen epäonnistui {0} - {1}",
     "SubtitleDownloadFailureFromForItem": "Tekstityksen lataaminen epäonnistui {0} - {1}",
     "StartupEmbyServerIsLoading": "Jellyfin palvelin latautuu. Kokeile hetken kuluttua uudelleen.",
     "StartupEmbyServerIsLoading": "Jellyfin palvelin latautuu. Kokeile hetken kuluttua uudelleen.",
     "Songs": "Kappaleet",
     "Songs": "Kappaleet",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/fil.json

@@ -16,7 +16,6 @@
     "TvShows": "Pelikula",
     "TvShows": "Pelikula",
     "System": "Sistema",
     "System": "Sistema",
     "Sync": "Pag-sync",
     "Sync": "Pag-sync",
-    "SubtitlesDownloadedForItem": "Naidownload na ang subtitles {0}",
     "SubtitleDownloadFailureFromForItem": "Hindi naidownload ang subtitles {0} para sa {1}",
     "SubtitleDownloadFailureFromForItem": "Hindi naidownload ang subtitles {0} para sa {1}",
     "StartupEmbyServerIsLoading": "Nagloload ang Jellyfin Server. Sandaling maghintay.",
     "StartupEmbyServerIsLoading": "Nagloload ang Jellyfin Server. Sandaling maghintay.",
     "Songs": "Kanta",
     "Songs": "Kanta",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/fr-CA.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Le serveur Jellyfin est en cours de chargement. Veuillez réessayer dans quelques instants.",
     "StartupEmbyServerIsLoading": "Le serveur Jellyfin est en cours de chargement. Veuillez réessayer dans quelques instants.",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureFromForItem": "Échec du téléchargement des sous-titres depuis {0} pour {1}",
     "SubtitleDownloadFailureFromForItem": "Échec du téléchargement des sous-titres depuis {0} pour {1}",
-    "SubtitlesDownloadedForItem": "Les sous-titres de {0} ont été téléchargés",
     "Sync": "Synchroniser",
     "Sync": "Synchroniser",
     "System": "Système",
     "System": "Système",
     "TvShows": "Séries Télé",
     "TvShows": "Séries Télé",

+ 23 - 2
Emby.Server.Implementations/Localization/Core/fr.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Le serveur Jellyfin est en cours de chargement. Veuillez réessayer dans quelques instants.",
     "StartupEmbyServerIsLoading": "Le serveur Jellyfin est en cours de chargement. Veuillez réessayer dans quelques instants.",
     "SubtitleDownloadFailureForItem": "Le téléchargement des sous-titres pour {0} a échoué.",
     "SubtitleDownloadFailureForItem": "Le téléchargement des sous-titres pour {0} a échoué.",
     "SubtitleDownloadFailureFromForItem": "Échec du téléchargement des sous-titres depuis {0} pour {1}",
     "SubtitleDownloadFailureFromForItem": "Échec du téléchargement des sous-titres depuis {0} pour {1}",
-    "SubtitlesDownloadedForItem": "Les sous-titres de {0} ont été téléchargés",
     "Sync": "Synchroniser",
     "Sync": "Synchroniser",
     "System": "Système",
     "System": "Système",
     "TvShows": "Séries Télé",
     "TvShows": "Séries Télé",
@@ -93,5 +92,27 @@
     "UserStoppedPlayingItemWithValues": "{0} vient d'arrêter la lecture de {1} sur {2}",
     "UserStoppedPlayingItemWithValues": "{0} vient d'arrêter la lecture de {1} sur {2}",
     "ValueHasBeenAddedToLibrary": "{0} a été ajouté à votre médiathèque",
     "ValueHasBeenAddedToLibrary": "{0} a été ajouté à votre médiathèque",
     "ValueSpecialEpisodeName": "Spécial - {0}",
     "ValueSpecialEpisodeName": "Spécial - {0}",
-    "VersionNumber": "Version {0}"
+    "VersionNumber": "Version {0}",
+    "TasksChannelsCategory": "Chaines en ligne",
+    "TaskDownloadMissingSubtitlesDescription": "Cherche les sous-titres manquant sur internet en se basant sur la configuration des métadonnées.",
+    "TaskDownloadMissingSubtitles": "Télécharge les sous-titres manquant",
+    "TaskRefreshChannelsDescription": "Rafraîchit les informations des chaines en ligne.",
+    "TaskRefreshChannels": "Rafraîchit les chaines",
+    "TaskCleanTranscodeDescription": "Supprime les fichiers transcodés de plus d'un jour.",
+    "TaskCleanTranscode": "Nettoie les dossier des transcodages",
+    "TaskUpdatePluginsDescription": "Télécharge et installe les mises à jours des plugins configurés pour être mis à jour automatiquement.",
+    "TaskUpdatePlugins": "Mettre à jour les plugins",
+    "TaskRefreshPeopleDescription": "Met à jour les métadonnées pour les acteurs et directeurs dans votre bibliothèque.",
+    "TaskRefreshPeople": "Rafraîchit les acteurs",
+    "TaskCleanLogsDescription": "Supprime les journaux de plus de {0} jours.",
+    "TaskCleanLogs": "Nettoie le répertoire des journaux",
+    "TaskRefreshLibraryDescription": "Scanne toute les bibliothèques pour trouver les nouveaux fichiers et rafraîchit les métadonnées.",
+    "TaskRefreshLibrary": "Scanne toute les Bibliothèques",
+    "TaskRefreshChapterImagesDescription": "Crée des images de miniature pour les vidéos ayant des chapitres.",
+    "TaskRefreshChapterImages": "Extrait les images de chapitre",
+    "TaskCleanCacheDescription": "Supprime les fichiers de cache dont le système n'a plus besoin.",
+    "TaskCleanCache": "Vider le répertoire cache",
+    "TasksApplicationCategory": "Application",
+    "TasksLibraryCategory": "Bibliothèque",
+    "TasksMaintenanceCategory": "Maintenance"
 }
 }

+ 0 - 1
Emby.Server.Implementations/Localization/Core/gsw.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin Server ladt. Bitte grad noeinisch probiere.",
     "StartupEmbyServerIsLoading": "Jellyfin Server ladt. Bitte grad noeinisch probiere.",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureFromForItem": "Ondertetle vo {0} för {1} hend ned chönne abeglade wärde",
     "SubtitleDownloadFailureFromForItem": "Ondertetle vo {0} för {1} hend ned chönne abeglade wärde",
-    "SubtitlesDownloadedForItem": "Ondertetle abeglade för {0}",
     "Sync": "Synchronisation",
     "Sync": "Synchronisation",
     "System": "System",
     "System": "System",
     "TvShows": "Färnsehserie",
     "TvShows": "Färnsehserie",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/he.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "שרת Jellyfin בהליכי טעינה. אנא נסה שנית בעוד זמן קצר.",
     "StartupEmbyServerIsLoading": "שרת Jellyfin בהליכי טעינה. אנא נסה שנית בעוד זמן קצר.",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureFromForItem": "Subtitles failed to download from {0} for {1}",
     "SubtitleDownloadFailureFromForItem": "Subtitles failed to download from {0} for {1}",
-    "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}",
     "Sync": "סנכרן",
     "Sync": "סנכרן",
     "System": "System",
     "System": "System",
     "TvShows": "סדרות טלוויזיה",
     "TvShows": "סדרות טלוויזיה",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/hr.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin Server se učitava. Pokušajte ponovo kasnije.",
     "StartupEmbyServerIsLoading": "Jellyfin Server se učitava. Pokušajte ponovo kasnije.",
     "SubtitleDownloadFailureForItem": "Titlovi prijevoda nisu preuzeti za {0}",
     "SubtitleDownloadFailureForItem": "Titlovi prijevoda nisu preuzeti za {0}",
     "SubtitleDownloadFailureFromForItem": "Subtitles failed to download from {0} for {1}",
     "SubtitleDownloadFailureFromForItem": "Subtitles failed to download from {0} for {1}",
-    "SubtitlesDownloadedForItem": "Titlovi prijevoda preuzeti za {0}",
     "Sync": "Sink.",
     "Sync": "Sink.",
     "System": "Sistem",
     "System": "Sistem",
     "TvShows": "TV Shows",
     "TvShows": "TV Shows",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/hu.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "A Jellyfin Szerver betöltődik. Kérlek, próbáld újra hamarosan.",
     "StartupEmbyServerIsLoading": "A Jellyfin Szerver betöltődik. Kérlek, próbáld újra hamarosan.",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureFromForItem": "Nem sikerült a felirat letöltése innen:  {0} ehhez: {1}",
     "SubtitleDownloadFailureFromForItem": "Nem sikerült a felirat letöltése innen:  {0} ehhez: {1}",
-    "SubtitlesDownloadedForItem": "Letöltött feliratok a következőhöz: {0}",
     "Sync": "Szinkronizál",
     "Sync": "Szinkronizál",
     "System": "Rendszer",
     "System": "Rendszer",
     "TvShows": "TV műsorok",
     "TvShows": "TV műsorok",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/id.json

@@ -54,7 +54,6 @@
     "User": "Pengguna",
     "User": "Pengguna",
     "System": "Sistem",
     "System": "Sistem",
     "Sync": "Sinkron",
     "Sync": "Sinkron",
-    "SubtitlesDownloadedForItem": "Talop telah diunduh untuk {0}",
     "Shows": "Tayangan",
     "Shows": "Tayangan",
     "ServerNameNeedsToBeRestarted": "{0} perlu dimuat ulang",
     "ServerNameNeedsToBeRestarted": "{0} perlu dimuat ulang",
     "ScheduledTaskStartedWithName": "{0} dimulai",
     "ScheduledTaskStartedWithName": "{0} dimulai",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/is.json

@@ -86,7 +86,6 @@
     "UserOfflineFromDevice": "{0} hefur aftengst frá {1}",
     "UserOfflineFromDevice": "{0} hefur aftengst frá {1}",
     "UserLockedOutWithName": "Notanda {0} hefur verið hindraður aðgangur",
     "UserLockedOutWithName": "Notanda {0} hefur verið hindraður aðgangur",
     "UserDownloadingItemWithValues": "{0} Hleður niður {1}",
     "UserDownloadingItemWithValues": "{0} Hleður niður {1}",
-    "SubtitlesDownloadedForItem": "Skjátextum halað niður fyrir {0}",
     "SubtitleDownloadFailureFromForItem": "Tókst ekki að hala niður skjátextum frá {0} til {1}",
     "SubtitleDownloadFailureFromForItem": "Tókst ekki að hala niður skjátextum frá {0} til {1}",
     "ProviderValue": "Veitandi: {0}",
     "ProviderValue": "Veitandi: {0}",
     "MessageNamedServerConfigurationUpdatedWithValue": "Stilling {0} hefur verið uppfærð á netþjón",
     "MessageNamedServerConfigurationUpdatedWithValue": "Stilling {0} hefur verið uppfærð á netþjón",

+ 25 - 4
Emby.Server.Implementations/Localization/Core/it.json

@@ -5,7 +5,7 @@
     "Artists": "Artisti",
     "Artists": "Artisti",
     "AuthenticationSucceededWithUserName": "{0} autenticato con successo",
     "AuthenticationSucceededWithUserName": "{0} autenticato con successo",
     "Books": "Libri",
     "Books": "Libri",
-    "CameraImageUploadedFrom": "È stata caricata una nuova immagine della fotocamera da {0}",
+    "CameraImageUploadedFrom": "È stata caricata una nuova immagine della fotocamera dal device {0}",
     "Channels": "Canali",
     "Channels": "Canali",
     "ChapterNameValue": "Capitolo {0}",
     "ChapterNameValue": "Capitolo {0}",
     "Collections": "Collezioni",
     "Collections": "Collezioni",
@@ -15,7 +15,7 @@
     "Favorites": "Preferiti",
     "Favorites": "Preferiti",
     "Folders": "Cartelle",
     "Folders": "Cartelle",
     "Genres": "Generi",
     "Genres": "Generi",
-    "HeaderAlbumArtists": "Artisti dell' Album",
+    "HeaderAlbumArtists": "Artisti degli Album",
     "HeaderCameraUploads": "Caricamenti Fotocamera",
     "HeaderCameraUploads": "Caricamenti Fotocamera",
     "HeaderContinueWatching": "Continua a guardare",
     "HeaderContinueWatching": "Continua a guardare",
     "HeaderFavoriteAlbums": "Album Preferiti",
     "HeaderFavoriteAlbums": "Album Preferiti",
@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin server si sta avviando. Per favore riprova più tardi.",
     "StartupEmbyServerIsLoading": "Jellyfin server si sta avviando. Per favore riprova più tardi.",
     "SubtitleDownloadFailureForItem": "Impossibile scaricare i sottotitoli per {0}",
     "SubtitleDownloadFailureForItem": "Impossibile scaricare i sottotitoli per {0}",
     "SubtitleDownloadFailureFromForItem": "Impossibile scaricare i sottotitoli da {0} per {1}",
     "SubtitleDownloadFailureFromForItem": "Impossibile scaricare i sottotitoli da {0} per {1}",
-    "SubtitlesDownloadedForItem": "Sottotitoli scaricati per {0}",
     "Sync": "Sincronizza",
     "Sync": "Sincronizza",
     "System": "Sistema",
     "System": "Sistema",
     "TvShows": "Serie TV",
     "TvShows": "Serie TV",
@@ -93,5 +92,27 @@
     "UserStoppedPlayingItemWithValues": "{0} ha interrotto la riproduzione di {1} su {2}",
     "UserStoppedPlayingItemWithValues": "{0} ha interrotto la riproduzione di {1} su {2}",
     "ValueHasBeenAddedToLibrary": "{0} è stato aggiunto alla tua libreria multimediale",
     "ValueHasBeenAddedToLibrary": "{0} è stato aggiunto alla tua libreria multimediale",
     "ValueSpecialEpisodeName": "Speciale - {0}",
     "ValueSpecialEpisodeName": "Speciale - {0}",
-    "VersionNumber": "Versione {0}"
+    "VersionNumber": "Versione {0}",
+    "TaskRefreshChannelsDescription": "Aggiorna le informazioni dei canali Internet.",
+    "TaskDownloadMissingSubtitlesDescription": "Cerca su internet i sottotitoli mancanti basandosi sulle configurazioni dei metadati.",
+    "TaskDownloadMissingSubtitles": "Scarica i sottotitoli mancanti",
+    "TaskRefreshChannels": "Aggiorna i canali",
+    "TaskCleanTranscodeDescription": "Cancella i file di transcode più vecchi di un giorno.",
+    "TaskCleanTranscode": "Svuota la cartella del transcoding",
+    "TaskUpdatePluginsDescription": "Scarica e installa gli aggiornamenti per i plugin che sono stati configurati per essere aggiornati contemporaneamente.",
+    "TaskUpdatePlugins": "Aggiorna i Plugin",
+    "TaskRefreshPeopleDescription": "Aggiorna i metadati per gli attori e registi nella tua libreria multimediale.",
+    "TaskRefreshPeople": "Aggiorna persone",
+    "TaskCleanLogsDescription": "Rimuovi i file di log più vecchi di {0} giorni.",
+    "TaskCleanLogs": "Pulisci la cartella dei log",
+    "TaskRefreshLibraryDescription": "Analizza la tua libreria multimediale per nuovi file e rinnova i metadati.",
+    "TaskRefreshLibrary": "Analizza la libreria dei contenuti multimediali",
+    "TaskRefreshChapterImagesDescription": "Crea le thumbnail per i video che hanno capitoli.",
+    "TaskRefreshChapterImages": "Estrai immagini capitolo",
+    "TaskCleanCacheDescription": "Cancella i file di cache non più necessari al sistema.",
+    "TaskCleanCache": "Pulisci la directory della cache",
+    "TasksChannelsCategory": "Canali su Internet",
+    "TasksApplicationCategory": "Applicazione",
+    "TasksLibraryCategory": "Libreria",
+    "TasksMaintenanceCategory": "Manutenzione"
 }
 }

+ 0 - 1
Emby.Server.Implementations/Localization/Core/ja.json

@@ -75,7 +75,6 @@
     "Songs": "曲",
     "Songs": "曲",
     "StartupEmbyServerIsLoading": "Jellyfin Server は現在読み込み中です。しばらくしてからもう一度お試しください。",
     "StartupEmbyServerIsLoading": "Jellyfin Server は現在読み込み中です。しばらくしてからもう一度お試しください。",
     "SubtitleDownloadFailureFromForItem": "{0} から {1}の字幕のダウンロードに失敗しました",
     "SubtitleDownloadFailureFromForItem": "{0} から {1}の字幕のダウンロードに失敗しました",
-    "SubtitlesDownloadedForItem": "{0} の字幕がダウンロードされました",
     "Sync": "同期",
     "Sync": "同期",
     "System": "システム",
     "System": "システム",
     "TvShows": "テレビ番組",
     "TvShows": "テレビ番組",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/kk.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin Server júktelýde. Áreketti kóp uzamaı qaıtalańyz.",
     "StartupEmbyServerIsLoading": "Jellyfin Server júktelýde. Áreketti kóp uzamaı qaıtalańyz.",
     "SubtitleDownloadFailureForItem": "Субтитрлер {0} үшін жүктеліп алынуы сәтсіз",
     "SubtitleDownloadFailureForItem": "Субтитрлер {0} үшін жүктеліп алынуы сәтсіз",
     "SubtitleDownloadFailureFromForItem": "{1} úshin sýbtıtrlerdi {0} kózinen júktep alý sátsiz",
     "SubtitleDownloadFailureFromForItem": "{1} úshin sýbtıtrlerdi {0} kózinen júktep alý sátsiz",
-    "SubtitlesDownloadedForItem": "{0} úshin sýbtıtrler júktelip alyndy",
     "Sync": "Úndestirý",
     "Sync": "Úndestirý",
     "System": "Júıe",
     "System": "Júıe",
     "TvShows": "TD-kórsetimder",
     "TvShows": "TD-kórsetimder",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/ko.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin 서버를 불러오고 있습니다. 잠시 후에 다시 시도하십시오.",
     "StartupEmbyServerIsLoading": "Jellyfin 서버를 불러오고 있습니다. 잠시 후에 다시 시도하십시오.",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureFromForItem": "{0}에서 {1} 자막 다운로드에 실패했습니다",
     "SubtitleDownloadFailureFromForItem": "{0}에서 {1} 자막 다운로드에 실패했습니다",
-    "SubtitlesDownloadedForItem": "{0} 자막 다운로드 완료",
     "Sync": "동기화",
     "Sync": "동기화",
     "System": "시스템",
     "System": "시스템",
     "TvShows": "TV 쇼",
     "TvShows": "TV 쇼",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/lt-LT.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin Server kraunasi. Netrukus pabandykite dar kartą.",
     "StartupEmbyServerIsLoading": "Jellyfin Server kraunasi. Netrukus pabandykite dar kartą.",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureFromForItem": "{1} subtitrai buvo nesėkmingai parsiųsti iš {0}",
     "SubtitleDownloadFailureFromForItem": "{1} subtitrai buvo nesėkmingai parsiųsti iš {0}",
-    "SubtitlesDownloadedForItem": "{0} subtitrai parsiųsti",
     "Sync": "Sinchronizuoti",
     "Sync": "Sinchronizuoti",
     "System": "System",
     "System": "System",
     "TvShows": "TV Serialai",
     "TvShows": "TV Serialai",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/lv.json

@@ -31,7 +31,6 @@
     "TvShows": "TV Raidījumi",
     "TvShows": "TV Raidījumi",
     "Sync": "Sinhronizācija",
     "Sync": "Sinhronizācija",
     "System": "Sistēma",
     "System": "Sistēma",
-    "SubtitlesDownloadedForItem": "Subtitri lejupielādēti priekš {0}",
     "StartupEmbyServerIsLoading": "Jellyfin Serveris lādējas. Lūdzu mēģiniet vēlreiz pēc brīža.",
     "StartupEmbyServerIsLoading": "Jellyfin Serveris lādējas. Lūdzu mēģiniet vēlreiz pēc brīža.",
     "Songs": "Dziesmas",
     "Songs": "Dziesmas",
     "Shows": "Raidījumi",
     "Shows": "Raidījumi",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/mk.json

@@ -86,7 +86,6 @@
     "TvShows": "ТВ Серии",
     "TvShows": "ТВ Серии",
     "System": "Систем",
     "System": "Систем",
     "Sync": "Синхронизација",
     "Sync": "Синхронизација",
-    "SubtitlesDownloadedForItem": "Спуштање превод за {0}",
     "SubtitleDownloadFailureFromForItem": "Преводот неуспешно се спушти од {0} за {1}",
     "SubtitleDownloadFailureFromForItem": "Преводот неуспешно се спушти од {0} за {1}",
     "StartupEmbyServerIsLoading": "Jellyfin Server се пушта. Ве молиме причекајте.",
     "StartupEmbyServerIsLoading": "Jellyfin Server се пушта. Ве молиме причекајте.",
     "Songs": "Песни",
     "Songs": "Песни",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/ms.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin Server is loading. Please try again shortly.",
     "StartupEmbyServerIsLoading": "Jellyfin Server is loading. Please try again shortly.",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureFromForItem": "Subtitles failed to download from {0} for {1}",
     "SubtitleDownloadFailureFromForItem": "Subtitles failed to download from {0} for {1}",
-    "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}",
     "Sync": "Sync",
     "Sync": "Sync",
     "System": "Sistem",
     "System": "Sistem",
     "TvShows": "TV Shows",
     "TvShows": "TV Shows",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/nb.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin Server laster. Prøv igjen snart.",
     "StartupEmbyServerIsLoading": "Jellyfin Server laster. Prøv igjen snart.",
     "SubtitleDownloadFailureForItem": "En feil oppstå under nedlasting av undertekster for  {0}",
     "SubtitleDownloadFailureForItem": "En feil oppstå under nedlasting av undertekster for  {0}",
     "SubtitleDownloadFailureFromForItem": "Kunne ikke laste ned undertekster fra {0} for {1}",
     "SubtitleDownloadFailureFromForItem": "Kunne ikke laste ned undertekster fra {0} for {1}",
-    "SubtitlesDownloadedForItem": "Undertekster lastet ned for {0}",
     "Sync": "Synkroniser",
     "Sync": "Synkroniser",
     "System": "System",
     "System": "System",
     "TvShows": "TV-serier",
     "TvShows": "TV-serier",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/nl.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin Server is aan het laden, probeer het later opnieuw.",
     "StartupEmbyServerIsLoading": "Jellyfin Server is aan het laden, probeer het later opnieuw.",
     "SubtitleDownloadFailureForItem": "Downloaden van ondertiteling voor {0} is mislukt",
     "SubtitleDownloadFailureForItem": "Downloaden van ondertiteling voor {0} is mislukt",
     "SubtitleDownloadFailureFromForItem": "Ondertitels konden niet gedownload worden van {0} voor {1}",
     "SubtitleDownloadFailureFromForItem": "Ondertitels konden niet gedownload worden van {0} voor {1}",
-    "SubtitlesDownloadedForItem": "Ondertiteling voor {0} is gedownload",
     "Sync": "Synchronisatie",
     "Sync": "Synchronisatie",
     "System": "Systeem",
     "System": "Systeem",
     "TvShows": "TV-series",
     "TvShows": "TV-series",

+ 21 - 1
Emby.Server.Implementations/Localization/Core/nn.json

@@ -36,5 +36,25 @@
     "Artists": "Artistar",
     "Artists": "Artistar",
     "Application": "Program",
     "Application": "Program",
     "AppDeviceValues": "App: {0}, Einheit: {1}",
     "AppDeviceValues": "App: {0}, Einheit: {1}",
-    "Albums": "Album"
+    "Albums": "Album",
+    "NotificationOptionServerRestartRequired": "Tenaren krev omstart",
+    "NotificationOptionPluginUpdateInstalled": "Tilleggsprogram-oppdatering vart installert",
+    "NotificationOptionPluginUninstalled": "Tilleggsprogram avinstallert",
+    "NotificationOptionPluginInstalled": "Tilleggsprogram installert",
+    "NotificationOptionPluginError": "Tilleggsprogram feila",
+    "NotificationOptionNewLibraryContent": "Nytt innhald er lagt til",
+    "NotificationOptionInstallationFailed": "Installasjonen feila",
+    "NotificationOptionCameraImageUploaded": "Kamerabilde vart lasta opp",
+    "NotificationOptionAudioPlaybackStopped": "Lydavspilling stoppa",
+    "NotificationOptionAudioPlayback": "Lydavspilling påbyrja",
+    "NotificationOptionApplicationUpdateInstalled": "Applikasjonsoppdatering er installert",
+    "NotificationOptionApplicationUpdateAvailable": "Applikasjonsoppdatering er tilgjengeleg",
+    "NewVersionIsAvailable": "Ein ny versjon av Jellyfin serveren er tilgjengeleg for nedlasting.",
+    "NameSeasonUnknown": "Ukjend sesong",
+    "NameSeasonNumber": "Sesong {0}",
+    "NameInstallFailed": "{0} Installasjonen feila",
+    "MusicVideos": "Musikkvideoar",
+    "Music": "Musikk",
+    "Movies": "Filmar",
+    "MixedContent": "Blanda innhald"
 }
 }

+ 0 - 1
Emby.Server.Implementations/Localization/Core/pl.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Trwa wczytywanie serwera Jellyfin. Spróbuj ponownie za chwilę.",
     "StartupEmbyServerIsLoading": "Trwa wczytywanie serwera Jellyfin. Spróbuj ponownie za chwilę.",
     "SubtitleDownloadFailureForItem": "Pobieranie napisów dla {0} zakończone niepowodzeniem",
     "SubtitleDownloadFailureForItem": "Pobieranie napisów dla {0} zakończone niepowodzeniem",
     "SubtitleDownloadFailureFromForItem": "Nieudane pobieranie napisów z {0} dla {1}",
     "SubtitleDownloadFailureFromForItem": "Nieudane pobieranie napisów z {0} dla {1}",
-    "SubtitlesDownloadedForItem": "Pobrano napisy dla {0}",
     "Sync": "Synchronizacja",
     "Sync": "Synchronizacja",
     "System": "System",
     "System": "System",
     "TvShows": "Seriale",
     "TvShows": "Seriale",

+ 23 - 2
Emby.Server.Implementations/Localization/Core/pt-BR.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "O Servidor Jellyfin está carregando. Por favor, tente novamente mais tarde.",
     "StartupEmbyServerIsLoading": "O Servidor Jellyfin está carregando. Por favor, tente novamente mais tarde.",
     "SubtitleDownloadFailureForItem": "Download de legendas falhou para {0}",
     "SubtitleDownloadFailureForItem": "Download de legendas falhou para {0}",
     "SubtitleDownloadFailureFromForItem": "Houve um problema ao baixar as legendas de {0} para {1}",
     "SubtitleDownloadFailureFromForItem": "Houve um problema ao baixar as legendas de {0} para {1}",
-    "SubtitlesDownloadedForItem": "Legendas baixadas para {0}",
     "Sync": "Sincronizar",
     "Sync": "Sincronizar",
     "System": "Sistema",
     "System": "Sistema",
     "TvShows": "Séries",
     "TvShows": "Séries",
@@ -93,5 +92,27 @@
     "UserStoppedPlayingItemWithValues": "{0} parou de reproduzir {1} em {2}",
     "UserStoppedPlayingItemWithValues": "{0} parou de reproduzir {1} em {2}",
     "ValueHasBeenAddedToLibrary": "{0} foi adicionado à sua biblioteca de mídia",
     "ValueHasBeenAddedToLibrary": "{0} foi adicionado à sua biblioteca de mídia",
     "ValueSpecialEpisodeName": "Especial - {0}",
     "ValueSpecialEpisodeName": "Especial - {0}",
-    "VersionNumber": "Versão {0}"
+    "VersionNumber": "Versão {0}",
+    "TaskDownloadMissingSubtitlesDescription": "Procurar na internet por legendas faltando baseado na configuração de metadados.",
+    "TaskDownloadMissingSubtitles": "Baixar legendas que estão faltando",
+    "TaskRefreshChannelsDescription": "Atualizar informação de canais da internet .",
+    "TaskRefreshChannels": "Atualizar Canais",
+    "TaskCleanTranscodeDescription": "Deletar arquivos de transcodificação com mais de um dia de criação.",
+    "TaskCleanTranscode": "Limpar pasta de transcodificação",
+    "TaskUpdatePluginsDescription": "Baixa e instala atualizações para plugins que estão configurados para atualizar automaticamente.",
+    "TaskUpdatePlugins": "Atualizar Plugins",
+    "TaskRefreshPeopleDescription": "Atualiza metadados para atores e diretores na sua biblioteca de mídia.",
+    "TaskRefreshPeople": "Atualizar pessoas",
+    "TaskCleanLogsDescription": "Deletar arquivos temporários com mais de {0} dias.",
+    "TaskCleanLogs": "Limpar pasta de logs",
+    "TaskRefreshLibraryDescription": "Escaneie a sua biblioteca de mídia para arquivos novos e atualize os metadados.",
+    "TaskRefreshLibrary": "Escanear a Biblioteca de Mídia",
+    "TaskRefreshChapterImagesDescription": "Criar miniaturas para vídeos que tem capítulos.",
+    "TaskRefreshChapterImages": "Extrair imagens dos capítulos",
+    "TaskCleanCacheDescription": "Deletar arquivos temporários que não são mais necessários para o sistema.",
+    "TaskCleanCache": "Limpar Arquivos Temporários",
+    "TasksChannelsCategory": "Canais da Internet",
+    "TasksApplicationCategory": "Aplicativo",
+    "TasksLibraryCategory": "Biblioteca",
+    "TasksMaintenanceCategory": "Manutenção"
 }
 }

+ 0 - 1
Emby.Server.Implementations/Localization/Core/pt-PT.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "O servidor Jellyfin está a iniciar. Tente novamente mais tarde.",
     "StartupEmbyServerIsLoading": "O servidor Jellyfin está a iniciar. Tente novamente mais tarde.",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureFromForItem": "Falha na transferência de legendas a partir de {0} para {1}",
     "SubtitleDownloadFailureFromForItem": "Falha na transferência de legendas a partir de {0} para {1}",
-    "SubtitlesDownloadedForItem": "Transferidas legendas para {0}",
     "Sync": "Sincronização",
     "Sync": "Sincronização",
     "System": "Sistema",
     "System": "Sistema",
     "TvShows": "Programas TV",
     "TvShows": "Programas TV",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/pt.json

@@ -31,7 +31,6 @@
     "User": "Utilizador",
     "User": "Utilizador",
     "TvShows": "Séries",
     "TvShows": "Séries",
     "System": "Sistema",
     "System": "Sistema",
-    "SubtitlesDownloadedForItem": "Legendas transferidas para {0}",
     "SubtitleDownloadFailureFromForItem": "Falha na transferência de legendas de {0} para {1}",
     "SubtitleDownloadFailureFromForItem": "Falha na transferência de legendas de {0} para {1}",
     "StartupEmbyServerIsLoading": "O servidor Jellyfin está a iniciar. Tente novamente dentro de momentos.",
     "StartupEmbyServerIsLoading": "O servidor Jellyfin está a iniciar. Tente novamente dentro de momentos.",
     "ServerNameNeedsToBeRestarted": "{0} necessita ser reiniciado",
     "ServerNameNeedsToBeRestarted": "{0} necessita ser reiniciado",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/ro.json

@@ -17,7 +17,6 @@
     "TvShows": "Spectacole TV",
     "TvShows": "Spectacole TV",
     "System": "Sistem",
     "System": "Sistem",
     "Sync": "Sincronizare",
     "Sync": "Sincronizare",
-    "SubtitlesDownloadedForItem": "Subtitrari descarcate pentru {0}",
     "SubtitleDownloadFailureFromForItem": "Subtitrările nu au putut fi descărcate de la {0} pentru {1}",
     "SubtitleDownloadFailureFromForItem": "Subtitrările nu au putut fi descărcate de la {0} pentru {1}",
     "StartupEmbyServerIsLoading": "Se încarcă serverul Jellyfin. Încercați din nou în scurt timp.",
     "StartupEmbyServerIsLoading": "Se încarcă serverul Jellyfin. Încercați din nou în scurt timp.",
     "Songs": "Melodii",
     "Songs": "Melodii",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/ru.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin Server загружается. Повторите попытку в ближайшее время.",
     "StartupEmbyServerIsLoading": "Jellyfin Server загружается. Повторите попытку в ближайшее время.",
     "SubtitleDownloadFailureForItem": "Субтитры к {0} не удалось загрузить",
     "SubtitleDownloadFailureForItem": "Субтитры к {0} не удалось загрузить",
     "SubtitleDownloadFailureFromForItem": "Субтитры к {1} не удалось загрузить с {0}",
     "SubtitleDownloadFailureFromForItem": "Субтитры к {1} не удалось загрузить с {0}",
-    "SubtitlesDownloadedForItem": "Субтитры к {0} загружены",
     "Sync": "Синхро",
     "Sync": "Синхро",
     "System": "Система",
     "System": "Система",
     "TvShows": "ТВ",
     "TvShows": "ТВ",

+ 23 - 2
Emby.Server.Implementations/Localization/Core/sk.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin Server sa spúšťa. Prosím, skúste to o chvíľu znova.",
     "StartupEmbyServerIsLoading": "Jellyfin Server sa spúšťa. Prosím, skúste to o chvíľu znova.",
     "SubtitleDownloadFailureForItem": "Sťahovanie titulkov pre {0} zlyhalo",
     "SubtitleDownloadFailureForItem": "Sťahovanie titulkov pre {0} zlyhalo",
     "SubtitleDownloadFailureFromForItem": "Sťahovanie titulkov z {0} pre {1} zlyhalo",
     "SubtitleDownloadFailureFromForItem": "Sťahovanie titulkov z {0} pre {1} zlyhalo",
-    "SubtitlesDownloadedForItem": "Titulky pre {0} stiahnuté",
     "Sync": "Synchronizácia",
     "Sync": "Synchronizácia",
     "System": "Systém",
     "System": "Systém",
     "TvShows": "TV seriály",
     "TvShows": "TV seriály",
@@ -93,5 +92,27 @@
     "UserStoppedPlayingItemWithValues": "{0} ukončil prehrávanie {1} na {2}",
     "UserStoppedPlayingItemWithValues": "{0} ukončil prehrávanie {1} na {2}",
     "ValueHasBeenAddedToLibrary": "{0} bol pridané do vašej knižnice médií",
     "ValueHasBeenAddedToLibrary": "{0} bol pridané do vašej knižnice médií",
     "ValueSpecialEpisodeName": "Špeciál - {0}",
     "ValueSpecialEpisodeName": "Špeciál - {0}",
-    "VersionNumber": "Verzia {0}"
+    "VersionNumber": "Verzia {0}",
+    "TaskDownloadMissingSubtitlesDescription": "Vyhľadá na internete chýbajúce titulky podľa toho, ako sú nakonfigurované metadáta.",
+    "TaskDownloadMissingSubtitles": "Stiahnuť chýbajúce titulky",
+    "TaskRefreshChannelsDescription": "Obnoví informácie o internetových kanáloch.",
+    "TaskRefreshChannels": "Obnoviť kanály",
+    "TaskCleanTranscodeDescription": "Vymaže súbory transkódovania, ktoré sú staršie ako jeden deň.",
+    "TaskCleanTranscode": "Vyčistiť priečinok pre transkódovanie",
+    "TaskUpdatePluginsDescription": "Stiahne a nainštaluje aktualizácie pre zásuvné moduly, ktoré sú nastavené tak, aby sa aktualizovali automaticky.",
+    "TaskUpdatePlugins": "Aktualizovať zásuvné moduly",
+    "TaskRefreshPeopleDescription": "Aktualizuje metadáta pre hercov a režisérov vo vašej mediálnej knižnici.",
+    "TaskRefreshPeople": "Obnoviť osoby",
+    "TaskCleanLogsDescription": "Vymaže log súbory, ktoré su staršie ako {0} deň/dni/dní.",
+    "TaskCleanLogs": "Vyčistiť priečinok s logmi",
+    "TaskRefreshLibraryDescription": "Hľadá vo vašej mediálnej knižnici nové súbory a obnovuje metadáta.",
+    "TaskRefreshLibrary": "Prehľadávať knižnicu medií",
+    "TaskRefreshChapterImagesDescription": "Vytvorí náhľady pre videá, ktoré majú kapitoly.",
+    "TaskRefreshChapterImages": "Extrahovať obrázky kapitol",
+    "TaskCleanCacheDescription": "Vymaže cache súbory, ktoré nie sú už potrebné pre systém.",
+    "TaskCleanCache": "Vyčistiť Cache priečinok",
+    "TasksChannelsCategory": "Internetové kanály",
+    "TasksApplicationCategory": "Aplikácia",
+    "TasksLibraryCategory": "Knižnica",
+    "TasksMaintenanceCategory": "Údržba"
 }
 }

+ 0 - 1
Emby.Server.Implementations/Localization/Core/sl-SI.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin Server se nalaga. Poskusi ponovno kasneje.",
     "StartupEmbyServerIsLoading": "Jellyfin Server se nalaga. Poskusi ponovno kasneje.",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureFromForItem": "Neuspešen prenos podnapisov iz {0} za {1}",
     "SubtitleDownloadFailureFromForItem": "Neuspešen prenos podnapisov iz {0} za {1}",
-    "SubtitlesDownloadedForItem": "Podnapisi preneseni za {0}",
     "Sync": "Sinhroniziraj",
     "Sync": "Sinhroniziraj",
     "System": "System",
     "System": "System",
     "TvShows": "TV serije",
     "TvShows": "TV serije",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/sr.json

@@ -17,7 +17,6 @@
     "TvShows": "ТВ серије",
     "TvShows": "ТВ серије",
     "System": "Систем",
     "System": "Систем",
     "Sync": "Усклади",
     "Sync": "Усклади",
-    "SubtitlesDownloadedForItem": "Титлови преузети за {0}",
     "SubtitleDownloadFailureFromForItem": "Неуспело преузимање титлова за {1} са {0}",
     "SubtitleDownloadFailureFromForItem": "Неуспело преузимање титлова за {1} са {0}",
     "StartupEmbyServerIsLoading": "Џелифин сервер се подиже. Покушајте поново убрзо.",
     "StartupEmbyServerIsLoading": "Џелифин сервер се подиже. Покушајте поново убрзо.",
     "Songs": "Песме",
     "Songs": "Песме",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/sv.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin Server arbetar. Pröva igen snart.",
     "StartupEmbyServerIsLoading": "Jellyfin Server arbetar. Pröva igen snart.",
     "SubtitleDownloadFailureForItem": "Nerladdning av undertexter för {0} misslyckades",
     "SubtitleDownloadFailureForItem": "Nerladdning av undertexter för {0} misslyckades",
     "SubtitleDownloadFailureFromForItem": "Undertexter kunde inte laddas ner från {0} för {1}",
     "SubtitleDownloadFailureFromForItem": "Undertexter kunde inte laddas ner från {0} för {1}",
-    "SubtitlesDownloadedForItem": "Undertexter har laddats ner till {0}",
     "Sync": "Synk",
     "Sync": "Synk",
     "System": "System",
     "System": "System",
     "TvShows": "TV-serier",
     "TvShows": "TV-serier",

Some files were not shown because too many files changed in this diff