Browse Source

Merge branch 'dev' of https://github.com/MediaBrowser/MediaBrowser into dev

Tavares André 10 năm trước cách đây
mục cha
commit
fb59781548
100 tập tin đã thay đổi với 1158 bổ sung1135 xóa
  1. 12 6
      MediaBrowser.Api/ApiEntryPoint.cs
  2. 2 0
      MediaBrowser.Api/Images/ImageService.cs
  3. 1 1
      MediaBrowser.Api/Music/InstantMixService.cs
  4. 5 34
      MediaBrowser.Api/Playback/BaseStreamingService.cs
  5. 4 3
      MediaBrowser.Api/Playback/Hls/BaseHlsService.cs
  6. 229 120
      MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs
  7. 29 6
      MediaBrowser.Api/Playback/Hls/HlsSegmentService.cs
  8. 1 20
      MediaBrowser.Api/Playback/Hls/VideoHlsService.cs
  9. 1 1
      MediaBrowser.Api/Playback/Progressive/VideoService.cs
  10. 5 2
      MediaBrowser.Api/Playback/StreamState.cs
  11. 11 3
      MediaBrowser.Api/PluginService.cs
  12. 14 4
      MediaBrowser.Dlna/PlayTo/Device.cs
  13. 2 2
      MediaBrowser.Dlna/Profiles/DefaultProfile.cs
  14. 1 1
      MediaBrowser.Dlna/Profiles/WdtvLiveProfile.cs
  15. 2 3
      MediaBrowser.Dlna/Profiles/Xml/BubbleUPnp.xml
  16. 2 3
      MediaBrowser.Dlna/Profiles/Xml/Default.xml
  17. 2 3
      MediaBrowser.Dlna/Profiles/Xml/Denon AVR.xml
  18. 2 3
      MediaBrowser.Dlna/Profiles/Xml/DirecTV HD-DVR.xml
  19. 2 3
      MediaBrowser.Dlna/Profiles/Xml/Dish Hopper-Joey.xml
  20. 0 23
      MediaBrowser.Dlna/Profiles/Xml/Generic Device.xml
  21. 2 3
      MediaBrowser.Dlna/Profiles/Xml/LG Smart TV.xml
  22. 2 3
      MediaBrowser.Dlna/Profiles/Xml/Linksys DMA2100.xml
  23. 2 3
      MediaBrowser.Dlna/Profiles/Xml/MediaMonkey.xml
  24. 2 3
      MediaBrowser.Dlna/Profiles/Xml/Panasonic Viera.xml
  25. 2 3
      MediaBrowser.Dlna/Profiles/Xml/Popcorn Hour.xml
  26. 2 3
      MediaBrowser.Dlna/Profiles/Xml/Samsung Smart TV.xml
  27. 2 3
      MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player 2013.xml
  28. 2 3
      MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player.xml
  29. 2 3
      MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2010).xml
  30. 2 3
      MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2011).xml
  31. 2 3
      MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2012).xml
  32. 2 3
      MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2013).xml
  33. 2 3
      MediaBrowser.Dlna/Profiles/Xml/Sony PlayStation 3.xml
  34. 2 3
      MediaBrowser.Dlna/Profiles/Xml/Vlc.xml
  35. 3 4
      MediaBrowser.Dlna/Profiles/Xml/WDTV Live.xml
  36. 2 3
      MediaBrowser.Dlna/Profiles/Xml/Xbox 360.xml
  37. 2 3
      MediaBrowser.Dlna/Profiles/Xml/Xbox One.xml
  38. 2 3
      MediaBrowser.Dlna/Profiles/Xml/foobar2000.xml
  39. 1 0
      MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs
  40. 11 3
      MediaBrowser.Model/Configuration/ServerConfiguration.cs
  41. 5 0
      MediaBrowser.Model/Dlna/StreamInfo.cs
  42. 1 1
      MediaBrowser.Providers/Music/FanArtAlbumProvider.cs
  43. 4 1
      MediaBrowser.Server.Implementations/Devices/DeviceManager.cs
  44. 20 9
      MediaBrowser.Server.Implementations/HttpServer/ResponseFilter.cs
  45. 2 2
      MediaBrowser.Server.Implementations/HttpServer/Security/SessionContext.cs
  46. 3 3
      MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs
  47. 1 0
      MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs
  48. 1 0
      MediaBrowser.Server.Implementations/Localization/JavaScript/ar.json
  49. 1 0
      MediaBrowser.Server.Implementations/Localization/JavaScript/be-BY.json
  50. 1 0
      MediaBrowser.Server.Implementations/Localization/JavaScript/bg-BG.json
  51. 1 0
      MediaBrowser.Server.Implementations/Localization/JavaScript/ca.json
  52. 1 0
      MediaBrowser.Server.Implementations/Localization/JavaScript/cs.json
  53. 521 520
      MediaBrowser.Server.Implementations/Localization/JavaScript/da.json
  54. 7 6
      MediaBrowser.Server.Implementations/Localization/JavaScript/de.json
  55. 1 0
      MediaBrowser.Server.Implementations/Localization/JavaScript/el.json
  56. 1 0
      MediaBrowser.Server.Implementations/Localization/JavaScript/en-GB.json
  57. 1 0
      MediaBrowser.Server.Implementations/Localization/JavaScript/en-US.json
  58. 5 4
      MediaBrowser.Server.Implementations/Localization/JavaScript/es-MX.json
  59. 1 0
      MediaBrowser.Server.Implementations/Localization/JavaScript/es-VE.json
  60. 1 0
      MediaBrowser.Server.Implementations/Localization/JavaScript/es.json
  61. 1 0
      MediaBrowser.Server.Implementations/Localization/JavaScript/fi.json
  62. 1 0
      MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json
  63. 1 0
      MediaBrowser.Server.Implementations/Localization/JavaScript/he.json
  64. 1 0
      MediaBrowser.Server.Implementations/Localization/JavaScript/hr.json
  65. 1 0
      MediaBrowser.Server.Implementations/Localization/JavaScript/hu.json
  66. 1 0
      MediaBrowser.Server.Implementations/Localization/JavaScript/it.json
  67. 1 0
      MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json
  68. 1 0
      MediaBrowser.Server.Implementations/Localization/JavaScript/ms.json
  69. 28 27
      MediaBrowser.Server.Implementations/Localization/JavaScript/nb.json
  70. 8 7
      MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json
  71. 1 0
      MediaBrowser.Server.Implementations/Localization/JavaScript/pl.json
  72. 1 0
      MediaBrowser.Server.Implementations/Localization/JavaScript/pt-BR.json
  73. 1 0
      MediaBrowser.Server.Implementations/Localization/JavaScript/pt-PT.json
  74. 11 10
      MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json
  75. 1 0
      MediaBrowser.Server.Implementations/Localization/JavaScript/sl-SI.json
  76. 1 0
      MediaBrowser.Server.Implementations/Localization/JavaScript/sv.json
  77. 1 0
      MediaBrowser.Server.Implementations/Localization/JavaScript/tr.json
  78. 1 0
      MediaBrowser.Server.Implementations/Localization/JavaScript/uk.json
  79. 1 0
      MediaBrowser.Server.Implementations/Localization/JavaScript/vi.json
  80. 1 0
      MediaBrowser.Server.Implementations/Localization/JavaScript/zh-CN.json
  81. 1 0
      MediaBrowser.Server.Implementations/Localization/JavaScript/zh-TW.json
  82. 1 1
      MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs
  83. 3 9
      MediaBrowser.Server.Implementations/Localization/Server/ar.json
  84. 3 9
      MediaBrowser.Server.Implementations/Localization/Server/bg-BG.json
  85. 3 9
      MediaBrowser.Server.Implementations/Localization/Server/ca.json
  86. 3 9
      MediaBrowser.Server.Implementations/Localization/Server/cs.json
  87. 59 65
      MediaBrowser.Server.Implementations/Localization/Server/da.json
  88. 8 14
      MediaBrowser.Server.Implementations/Localization/Server/de.json
  89. 3 9
      MediaBrowser.Server.Implementations/Localization/Server/el.json
  90. 3 9
      MediaBrowser.Server.Implementations/Localization/Server/en-GB.json
  91. 3 9
      MediaBrowser.Server.Implementations/Localization/Server/en-US.json
  92. 4 10
      MediaBrowser.Server.Implementations/Localization/Server/es-MX.json
  93. 24 30
      MediaBrowser.Server.Implementations/Localization/Server/es.json
  94. 3 9
      MediaBrowser.Server.Implementations/Localization/Server/fi.json
  95. 3 9
      MediaBrowser.Server.Implementations/Localization/Server/fr.json
  96. 3 9
      MediaBrowser.Server.Implementations/Localization/Server/he.json
  97. 3 9
      MediaBrowser.Server.Implementations/Localization/Server/hr.json
  98. 3 9
      MediaBrowser.Server.Implementations/Localization/Server/it.json
  99. 3 9
      MediaBrowser.Server.Implementations/Localization/Server/kk.json
  100. 3 9
      MediaBrowser.Server.Implementations/Localization/Server/ko.json

+ 12 - 6
MediaBrowser.Api/ApiEntryPoint.cs

@@ -339,14 +339,17 @@ namespace MediaBrowser.Api
                 return;
             }
 
-            var timerDuration = job.Type == TranscodingJobType.Progressive ?
-                1000 :
-                1800000;
+            var timerDuration = 1000;
 
-            // We can really reduce the timeout for apps that are using the newer api
-            if (!string.IsNullOrWhiteSpace(job.PlaySessionId) && job.Type != TranscodingJobType.Progressive)
+            if (job.Type != TranscodingJobType.Progressive)
             {
-                timerDuration = 50000;
+                timerDuration = 1800000;
+                
+                // We can really reduce the timeout for apps that are using the newer api
+                if (!string.IsNullOrWhiteSpace(job.PlaySessionId))
+                {
+                    timerDuration = 60000;
+                }
             }
 
             job.PingTimeout = timerDuration;
@@ -628,6 +631,9 @@ namespace MediaBrowser.Api
         /// </summary>
         /// <value>The live stream identifier.</value>
         public string LiveStreamId { get; set; }
+
+        public bool IsLiveOutput { get; set; }
+
         /// <summary>
         /// Gets or sets the path.
         /// </summary>

+ 2 - 0
MediaBrowser.Api/Images/ImageService.cs

@@ -625,6 +625,8 @@ namespace MediaBrowser.Api.Images
 
             var file = await _imageProcessor.ProcessImage(options).ConfigureAwait(false);
 
+            headers["Vary"] = "Accept";
+
             return ResultFactory.GetStaticFileResult(Request, new StaticFileResultOptions
             {
                 CacheDuration = cacheDuration,

+ 1 - 1
MediaBrowser.Api/Music/InstantMixService.cs

@@ -50,7 +50,7 @@ namespace MediaBrowser.Api.Music
     [Route("/MusicGenres/InstantMix", "GET", Summary = "Creates an instant playlist based on a music genre")]
     public class GetInstantMixFromMusicGenreId : BaseGetSimilarItems
     {
-        [ApiMember(Name = "Id", Description = "The genre Id", IsRequired = true, DataType = "string", ParameterType = "querypath", Verb = "GET")]
+        [ApiMember(Name = "Id", Description = "The genre Id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")]
         public string Id { get; set; }
     }
 

+ 5 - 34
MediaBrowser.Api/Playback/BaseStreamingService.cs

@@ -148,7 +148,6 @@ namespace MediaBrowser.Api.Playback
         }
 
         protected readonly CultureInfo UsCulture = new CultureInfo("en-US");
-        private readonly long _slowSeekTicks = TimeSpan.FromSeconds(0).Ticks;
 
         /// <summary>
         /// Gets the fast seek command line parameter.
@@ -162,37 +161,12 @@ namespace MediaBrowser.Api.Playback
 
             if (time > 0)
             {
-                if (time > _slowSeekTicks && EnableSlowSeek)
-                {
-                    time -= _slowSeekTicks;
-                }
-
                 return string.Format("-ss {0}", MediaEncoder.GetTimeParameter(time));
             }
 
             return string.Empty;
         }
 
-        protected string GetSlowSeekCommandLineParameter(StreamRequest request)
-        {
-            var time = request.StartTimeTicks ?? 0;
-
-            if (time > _slowSeekTicks && _slowSeekTicks > 0)
-            {
-                return string.Format("-ss {0}", MediaEncoder.GetTimeParameter(_slowSeekTicks));
-            }
-
-            return string.Empty;
-        }
-
-        protected virtual bool EnableSlowSeek
-        {
-            get
-            {
-                return false;
-            }
-        }
-
         /// <summary>
         /// Gets the map args.
         /// </summary>
@@ -716,7 +690,7 @@ namespace MediaBrowser.Api.Playback
 
                 // TODO: Perhaps also use original_size=1920x800 ??
                 return string.Format("subtitles=filename='{0}'{1},setpts=PTS -{2}/TB",
-                    subtitlePath.Replace('\\', '/').Replace(":/", "\\:/"),
+                    subtitlePath.Replace("'", "\\'").Replace('\\', '/').Replace(":/", "\\:/"),
                     charsetParam,
                     seconds.ToString(UsCulture));
             }
@@ -724,7 +698,7 @@ namespace MediaBrowser.Api.Playback
             var mediaPath = state.MediaPath ?? string.Empty;
 
             return string.Format("subtitles='{0}:si={1}',setpts=PTS -{2}/TB",
-                mediaPath.Replace('\\', '/').Replace(":/", "\\:/"),
+                mediaPath.Replace("'", "\\'").Replace('\\', '/').Replace(":/", "\\:/"),
                 state.InternalSubtitleStreamOffset.ToString(UsCulture),
                 seconds.ToString(UsCulture));
         }
@@ -1086,7 +1060,7 @@ namespace MediaBrowser.Api.Playback
 
         private void StartThrottler(StreamState state, TranscodingJob transcodingJob)
         {
-            if (EnableThrottling && state.InputProtocol == MediaProtocol.File &&
+            if (EnableThrottling(state) && state.InputProtocol == MediaProtocol.File &&
                            state.RunTimeTicks.HasValue &&
                            state.VideoType == VideoType.VideoFile &&
                            !string.Equals(state.OutputVideoCodec, "copy", StringComparison.OrdinalIgnoreCase))
@@ -1099,12 +1073,9 @@ namespace MediaBrowser.Api.Playback
             }
         }
 
-        protected virtual bool EnableThrottling
+        protected virtual bool EnableThrottling(StreamState state)
         {
-            get
-            {
-                return true;
-            }
+            return true;
         }
 
         private async void StartStreamingLog(TranscodingJob transcodingJob, StreamState state, Stream source, Stream target)

+ 4 - 3
MediaBrowser.Api/Playback/Hls/BaseHlsService.cs

@@ -7,13 +7,13 @@ using MediaBrowser.Controller.MediaEncoding;
 using MediaBrowser.Model.Extensions;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Model.Net;
+using MediaBrowser.Model.Serialization;
 using System;
 using System.Collections.Generic;
 using System.IO;
 using System.Text;
 using System.Threading;
 using System.Threading.Tasks;
-using MediaBrowser.Model.Serialization;
 
 namespace MediaBrowser.Api.Playback.Hls
 {
@@ -100,6 +100,7 @@ namespace MediaBrowser.Api.Playback.Hls
                         try
                         {
                             job = await StartFfMpeg(state, playlist, cancellationTokenSource).ConfigureAwait(false);
+                            job.IsLiveOutput = isLive;
                         }
                         catch
                         {
@@ -133,7 +134,7 @@ namespace MediaBrowser.Api.Playback.Hls
             var appendBaselineStream = false;
             var baselineStreamBitrate = 64000;
 
-            var hlsVideoRequest = state.VideoRequest as GetHlsVideoStream;
+            var hlsVideoRequest = state.VideoRequest as GetHlsVideoStreamLegacy;
             if (hlsVideoRequest != null)
             {
                 appendBaselineStream = hlsVideoRequest.AppendBaselineStream;
@@ -244,7 +245,7 @@ namespace MediaBrowser.Api.Playback.Hls
 
         protected override string GetCommandLineArguments(string outputPath, StreamState state, bool isEncoding)
         {
-            var hlsVideoRequest = state.VideoRequest as GetHlsVideoStream;
+            var hlsVideoRequest = state.VideoRequest as GetHlsVideoStreamLegacy;
 
             var itsOffsetMs = hlsVideoRequest == null
                                        ? 0

+ 229 - 120
MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs

@@ -30,27 +30,60 @@ namespace MediaBrowser.Api.Playback.Hls
     /// </summary>
     [Route("/Videos/{Id}/master.m3u8", "GET", Summary = "Gets a video stream using HTTP live streaming.")]
     [Route("/Videos/{Id}/master.m3u8", "HEAD", Summary = "Gets a video stream using HTTP live streaming.")]
-    public class GetMasterHlsVideoStream : VideoStreamRequest
+    public class GetMasterHlsVideoPlaylist : VideoStreamRequest, IMasterHlsRequest
     {
         public bool EnableAdaptiveBitrateStreaming { get; set; }
 
-        public GetMasterHlsVideoStream()
+        public GetMasterHlsVideoPlaylist()
         {
             EnableAdaptiveBitrateStreaming = true;
         }
     }
 
+    [Route("/Audio/{Id}/master.m3u8", "GET", Summary = "Gets an audio stream using HTTP live streaming.")]
+    [Route("/Audio/{Id}/master.m3u8", "HEAD", Summary = "Gets an audio stream using HTTP live streaming.")]
+    public class GetMasterHlsAudioPlaylist : StreamRequest, IMasterHlsRequest
+    {
+        public bool EnableAdaptiveBitrateStreaming { get; set; }
+
+        public GetMasterHlsAudioPlaylist()
+        {
+            EnableAdaptiveBitrateStreaming = true;
+        }
+    }
+
+    public interface IMasterHlsRequest
+    {
+        bool EnableAdaptiveBitrateStreaming { get; set; }
+    }
+
     [Route("/Videos/{Id}/main.m3u8", "GET", Summary = "Gets a video stream using HTTP live streaming.")]
-    public class GetMainHlsVideoStream : VideoStreamRequest
+    public class GetVariantHlsVideoPlaylist : VideoStreamRequest
+    {
+    }
+
+    [Route("/Audio/{Id}/main.m3u8", "GET", Summary = "Gets an audio stream using HTTP live streaming.")]
+    public class GetVariantHlsAudioPlaylist : StreamRequest
     {
     }
 
-    /// <summary>
-    /// Class GetHlsVideoSegment
-    /// </summary>
     [Route("/Videos/{Id}/hlsdynamic/{PlaylistId}/{SegmentId}.ts", "GET")]
     [Api(Description = "Gets an Http live streaming segment file. Internal use only.")]
-    public class GetDynamicHlsVideoSegment : VideoStreamRequest
+    public class GetHlsVideoSegment : VideoStreamRequest
+    {
+        public string PlaylistId { get; set; }
+
+        /// <summary>
+        /// Gets or sets the segment id.
+        /// </summary>
+        /// <value>The segment id.</value>
+        public string SegmentId { get; set; }
+    }
+
+    [Route("/Audio/{Id}/hlsdynamic/{PlaylistId}/{SegmentId}.aac", "GET")]
+    [Route("/Audio/{Id}/hlsdynamic/{PlaylistId}/{SegmentId}.ts", "GET")]
+    [Api(Description = "Gets an Http live streaming segment file. Internal use only.")]
+    public class GetHlsAudioSegment : StreamRequest
     {
         public string PlaylistId { get; set; }
 
@@ -71,27 +104,47 @@ namespace MediaBrowser.Api.Playback.Hls
 
         protected INetworkManager NetworkManager { get; private set; }
 
-        public Task<object> Get(GetMasterHlsVideoStream request)
+        public Task<object> Get(GetMasterHlsVideoPlaylist request)
+        {
+            return GetMasterPlaylistInternal(request, "GET");
+        }
+
+        public Task<object> Head(GetMasterHlsVideoPlaylist request)
+        {
+            return GetMasterPlaylistInternal(request, "HEAD");
+        }
+
+        public Task<object> Get(GetMasterHlsAudioPlaylist request)
         {
-            return GetAsync(request, "GET");
+            return GetMasterPlaylistInternal(request, "GET");
         }
 
-        public Task<object> Head(GetMasterHlsVideoStream request)
+        public Task<object> Head(GetMasterHlsAudioPlaylist request)
         {
-            return GetAsync(request, "HEAD");
+            return GetMasterPlaylistInternal(request, "HEAD");
         }
 
-        public Task<object> Get(GetMainHlsVideoStream request)
+        public Task<object> Get(GetVariantHlsVideoPlaylist request)
         {
-            return GetPlaylistAsync(request, "main");
+            return GetVariantPlaylistInternal(request, true, "main");
         }
 
-        public Task<object> Get(GetDynamicHlsVideoSegment request)
+        public Task<object> Get(GetVariantHlsAudioPlaylist request)
+        {
+            return GetVariantPlaylistInternal(request, false, "main");
+        }
+
+        public Task<object> Get(GetHlsVideoSegment request)
         {
             return GetDynamicSegment(request, request.SegmentId);
         }
 
-        private async Task<object> GetDynamicSegment(VideoStreamRequest request, string segmentId)
+        public Task<object> Get(GetHlsAudioSegment request)
+        {
+            return GetDynamicSegment(request, request.SegmentId);
+        }
+
+        private async Task<object> GetDynamicSegment(StreamRequest request, string segmentId)
         {
             if ((request.StartTimeTicks ?? 0) > 0)
             {
@@ -107,7 +160,7 @@ namespace MediaBrowser.Api.Playback.Hls
 
             var playlistPath = Path.ChangeExtension(state.OutputFilePath, ".m3u8");
 
-            var segmentPath = GetSegmentPath(playlistPath, requestedIndex);
+            var segmentPath = GetSegmentPath(state, playlistPath, requestedIndex);
             var segmentLength = state.SegmentLength;
 
             var segmentExtension = GetSegmentFileExtension(state);
@@ -191,11 +244,11 @@ namespace MediaBrowser.Api.Playback.Hls
                 ApiEntryPoint.Instance.TranscodingStartLock.Release();
             }
 
-            Logger.Info("waiting for {0}", segmentPath);
-            while (!File.Exists(segmentPath))
-            {
-                await Task.Delay(50, cancellationToken).ConfigureAwait(false);
-            }
+            //Logger.Info("waiting for {0}", segmentPath);
+            //while (!File.Exists(segmentPath))
+            //{
+            //    await Task.Delay(50, cancellationToken).ConfigureAwait(false);
+            //}
 
             Logger.Info("returning {0}", segmentPath);
             job = job ?? ApiEntryPoint.Instance.OnTranscodeBeginRequest(playlistPath, TranscodingJobType);
@@ -244,7 +297,7 @@ namespace MediaBrowser.Api.Playback.Hls
             }
             catch (FileNotFoundException)
             {
-                
+
             }
         }
 
@@ -254,7 +307,7 @@ namespace MediaBrowser.Api.Playback.Hls
 
             for (var i = 0; i < requestedIndex; i++)
             {
-                var segmentPath = GetSegmentPath(playlist, i);
+                var segmentPath = GetSegmentPath(state, playlist, i);
 
                 double length;
                 if (SegmentLengths.TryGetValue(Path.GetFileName(segmentPath), out length))
@@ -360,7 +413,7 @@ namespace MediaBrowser.Api.Playback.Hls
         {
             var segmentId = "0";
 
-            var segmentRequest = request as GetDynamicHlsVideoSegment;
+            var segmentRequest = request as GetHlsVideoSegment;
             if (segmentRequest != null)
             {
                 segmentId = segmentRequest.SegmentId;
@@ -369,13 +422,13 @@ namespace MediaBrowser.Api.Playback.Hls
             return int.Parse(segmentId, NumberStyles.Integer, UsCulture);
         }
 
-        private string GetSegmentPath(string playlist, int index)
+        private string GetSegmentPath(StreamState state, string playlist, int index)
         {
             var folder = Path.GetDirectoryName(playlist);
 
             var filename = Path.GetFileNameWithoutExtension(playlist);
 
-            return Path.Combine(folder, filename + index.ToString(UsCulture) + ".ts");
+            return Path.Combine(folder, filename + index.ToString(UsCulture) + GetSegmentFileExtension(state));
         }
 
         private async Task<object> GetSegmentResult(string playlistPath,
@@ -393,21 +446,26 @@ namespace MediaBrowser.Api.Playback.Hls
 
             var segmentFilename = Path.GetFileName(segmentPath);
 
-            using (var fileStream = GetPlaylistFileStream(playlistPath))
+            while (!cancellationToken.IsCancellationRequested)
             {
-                using (var reader = new StreamReader(fileStream))
+                using (var fileStream = GetPlaylistFileStream(playlistPath))
                 {
-                    while (!reader.EndOfStream)
+                    using (var reader = new StreamReader(fileStream))
                     {
-                        var text = await reader.ReadLineAsync().ConfigureAwait(false);
-
-                        // If it appears in the playlist, it's done
-                        if (text.IndexOf(segmentFilename, StringComparison.OrdinalIgnoreCase) != -1)
+                        while (!reader.EndOfStream)
                         {
-                            return GetSegmentResult(segmentPath, segmentIndex, segmentLength, transcodingJob);
+                            var text = await reader.ReadLineAsync().ConfigureAwait(false);
+
+                            // If it appears in the playlist, it's done
+                            if (text.IndexOf(segmentFilename, StringComparison.OrdinalIgnoreCase) != -1)
+                            {
+                                return GetSegmentResult(segmentPath, segmentIndex, segmentLength, transcodingJob);
+                            }
                         }
                     }
                 }
+
+                await Task.Delay(100, cancellationToken).ConfigureAwait(false);
             }
 
             // if a different file is encoding, it's done
@@ -417,34 +475,35 @@ namespace MediaBrowser.Api.Playback.Hls
             //return GetSegmentResult(segmentPath, segmentIndex);
             //}
 
-            // Wait for the file to stop being written to, then stream it
-            var length = new FileInfo(segmentPath).Length;
-            var eofCount = 0;
-
-            while (eofCount < 10)
-            {
-                var info = new FileInfo(segmentPath);
-
-                if (!info.Exists)
-                {
-                    break;
-                }
-
-                var newLength = info.Length;
-
-                if (newLength == length)
-                {
-                    eofCount++;
-                }
-                else
-                {
-                    eofCount = 0;
-                }
+            //// Wait for the file to stop being written to, then stream it
+            //var length = new FileInfo(segmentPath).Length;
+            //var eofCount = 0;
 
-                length = newLength;
-                await Task.Delay(100, cancellationToken).ConfigureAwait(false);
-            }
+            //while (eofCount < 10)
+            //{
+            //    var info = new FileInfo(segmentPath);
+
+            //    if (!info.Exists)
+            //    {
+            //        break;
+            //    }
+
+            //    var newLength = info.Length;
+
+            //    if (newLength == length)
+            //    {
+            //        eofCount++;
+            //    }
+            //    else
+            //    {
+            //        eofCount = 0;
+            //    }
+
+            //    length = newLength;
+            //    await Task.Delay(100, cancellationToken).ConfigureAwait(false);
+            //}
 
+            cancellationToken.ThrowIfCancellationRequested();
             return GetSegmentResult(segmentPath, segmentIndex, segmentLength, transcodingJob);
         }
 
@@ -468,7 +527,7 @@ namespace MediaBrowser.Api.Playback.Hls
             });
         }
 
-        private async Task<object> GetAsync(GetMasterHlsVideoStream request, string method)
+        private async Task<object> GetMasterPlaylistInternal(StreamRequest request, string method)
         {
             var state = await GetState(request, CancellationToken.None).ConfigureAwait(false);
 
@@ -505,14 +564,16 @@ namespace MediaBrowser.Api.Playback.Hls
             var playlistUrl = isLiveStream ? "live.m3u8" : "main.m3u8";
             playlistUrl += queryString;
 
-            var request = (GetMasterHlsVideoStream)state.Request;
+            var request = state.Request;
 
             var subtitleStreams = state.MediaSource
                 .MediaStreams
                 .Where(i => i.IsTextSubtitleStream)
                 .ToList();
 
-            var subtitleGroup = subtitleStreams.Count > 0 && request.SubtitleMethod == SubtitleDeliveryMethod.Hls ?
+            var subtitleGroup = subtitleStreams.Count > 0 &&
+                (request is GetMasterHlsVideoPlaylist) &&
+                ((GetMasterHlsVideoPlaylist)request).SubtitleMethod == SubtitleDeliveryMethod.Hls ?
                 "subs" :
                 null;
 
@@ -520,7 +581,7 @@ namespace MediaBrowser.Api.Playback.Hls
 
             if (EnableAdaptiveBitrateStreaming(state, isLiveStream))
             {
-                var requestedVideoBitrate = state.VideoRequest.VideoBitRate.Value;
+                var requestedVideoBitrate = state.VideoRequest == null ? 0 : state.VideoRequest.VideoBitRate ?? 0;
 
                 // By default, vary by just 200k
                 var variation = GetBitrateVariation(totalBitrate);
@@ -590,7 +651,7 @@ namespace MediaBrowser.Api.Playback.Hls
                 return false;
             }
 
-            var request = state.Request as GetMasterHlsVideoStream;
+            var request = state.Request as IMasterHlsRequest;
             if (request != null && !request.EnableAdaptiveBitrateStreaming)
             {
                 return false;
@@ -612,6 +673,11 @@ namespace MediaBrowser.Api.Playback.Hls
                 return false;
             }
 
+            if (!state.IsOutputVideo)
+            {
+                return false;
+            }
+
             // Having problems in android
             return false;
             //return state.VideoRequest.VideoBitRate.HasValue;
@@ -667,7 +733,7 @@ namespace MediaBrowser.Api.Playback.Hls
             return variation;
         }
 
-        private async Task<object> GetPlaylistAsync(VideoStreamRequest request, string name)
+        private async Task<object> GetVariantPlaylistInternal(StreamRequest request, bool isOutputVideo, string name)
         {
             var state = await GetState(request, CancellationToken.None).ConfigureAwait(false);
 
@@ -675,7 +741,7 @@ namespace MediaBrowser.Api.Playback.Hls
 
             builder.AppendLine("#EXTM3U");
             builder.AppendLine("#EXT-X-VERSION:3");
-            builder.AppendLine("#EXT-X-TARGETDURATION:" + state.SegmentLength.ToString(UsCulture));
+            builder.AppendLine("#EXT-X-TARGETDURATION:" + (state.SegmentLength).ToString(UsCulture));
             builder.AppendLine("#EXT-X-MEDIA-SEQUENCE:0");
 
             var queryStringIndex = Request.RawUrl.IndexOf('?');
@@ -691,10 +757,11 @@ namespace MediaBrowser.Api.Playback.Hls
 
                 builder.AppendLine("#EXTINF:" + length.ToString(UsCulture) + ",");
 
-                builder.AppendLine(string.Format("hlsdynamic/{0}/{1}.ts{2}",
+                builder.AppendLine(string.Format("hlsdynamic/{0}/{1}{2}{3}",
 
                     name,
                     index.ToString(UsCulture),
+                    GetSegmentFileExtension(isOutputVideo),
                     queryString));
 
                 seconds -= state.SegmentLength;
@@ -710,6 +777,28 @@ namespace MediaBrowser.Api.Playback.Hls
 
         protected override string GetAudioArguments(StreamState state)
         {
+            if (!state.IsOutputVideo)
+            {
+                var audioTranscodeParams = new List<string>();
+                if (state.OutputAudioBitrate.HasValue)
+                {
+                    audioTranscodeParams.Add("-ab " + state.OutputAudioBitrate.Value.ToString(UsCulture));
+                }
+
+                if (state.OutputAudioChannels.HasValue)
+                {
+                    audioTranscodeParams.Add("-ac " + state.OutputAudioChannels.Value.ToString(UsCulture));
+                }
+
+                if (state.OutputAudioSampleRate.HasValue)
+                {
+                    audioTranscodeParams.Add("-ar " + state.OutputAudioSampleRate.Value.ToString(UsCulture));
+                }
+
+                audioTranscodeParams.Add("-vn");
+                return string.Join(" ", audioTranscodeParams.ToArray());
+            }
+
             var codec = state.OutputAudioCodec;
 
             if (string.Equals(codec, "copy", StringComparison.OrdinalIgnoreCase))
@@ -740,6 +829,11 @@ namespace MediaBrowser.Api.Playback.Hls
 
         protected override string GetVideoArguments(StreamState state)
         {
+            if (!state.IsOutputVideo)
+            {
+                return string.Empty;
+            }
+
             var codec = state.OutputVideoCodec;
 
             var args = "-codec:v:0 " + codec;
@@ -752,30 +846,36 @@ namespace MediaBrowser.Api.Playback.Hls
             // See if we can save come cpu cycles by avoiding encoding
             if (codec.Equals("copy", StringComparison.OrdinalIgnoreCase))
             {
-                return state.VideoStream != null && IsH264(state.VideoStream) ?
-                    args + " -bsf:v h264_mp4toannexb" :
-                    args;
+                args += state.VideoStream != null && IsH264(state.VideoStream)
+                    ? args + " -bsf:v h264_mp4toannexb"
+                    : args;
             }
+            else
+            {
+                var keyFrameArg = string.Format(" -force_key_frames expr:gte(t,n_forced*{0})",
+                    state.SegmentLength.ToString(UsCulture));
 
-            var keyFrameArg = string.Format(" -force_key_frames expr:gte(t,n_forced*{0})",
-                1.ToString(UsCulture));
+                var hasGraphicalSubs = state.SubtitleStream != null && !state.SubtitleStream.IsTextSubtitleStream;
 
-            var hasGraphicalSubs = state.SubtitleStream != null && !state.SubtitleStream.IsTextSubtitleStream;
+                args += " " + GetVideoQualityParam(state, H264Encoder, true) + keyFrameArg;
 
-            args += " " + GetVideoQualityParam(state, H264Encoder, true) + keyFrameArg;
+                //args += " -mixed-refs 0 -refs 3 -x264opts b_pyramid=0:weightb=0:weightp=0";
 
-            // Add resolution params, if specified
-            if (!hasGraphicalSubs)
-            {
-                args += GetOutputSizeParam(state, codec, false);
-            }
+                // Add resolution params, if specified
+                if (!hasGraphicalSubs)
+                {
+                    args += GetOutputSizeParam(state, codec, false);
+                }
 
-            // This is for internal graphical subs
-            if (hasGraphicalSubs)
-            {
-                args += GetGraphicalSubtitleParam(state, codec);
+                // This is for internal graphical subs
+                if (hasGraphicalSubs)
+                {
+                    args += GetGraphicalSubtitleParam(state, codec);
+                }
             }
 
+            args += " -flags +loop-global_header -sc_threshold 0";
+
             return args;
         }
 
@@ -783,13 +883,13 @@ namespace MediaBrowser.Api.Playback.Hls
         {
             var threads = GetNumberOfThreads(state, false);
 
-            var inputModifier = GetInputModifier(state);
+            var inputModifier = GetInputModifier(state, false);
 
             // If isEncoding is true we're actually starting ffmpeg
             var startNumberParam = isEncoding ? GetStartNumber(state).ToString(UsCulture) : "0";
 
             var toTimeParam = string.Empty;
-            if (state.RunTimeTicks.HasValue)
+            if (EnableSplitTranscoding(state))
             {
                 var startTime = state.Request.StartTimeTicks ?? 0;
                 var durationSeconds = ApiEntryPoint.Instance.GetEncodingOptions().ThrottleThresholdInSeconds;
@@ -799,73 +899,77 @@ namespace MediaBrowser.Api.Playback.Hls
 
                 if (endTime < state.RunTimeTicks.Value)
                 {
-                    toTimeParam = " -to " + MediaEncoder.GetTimeParameter(endTime);
+                    //toTimeParam = " -to " + MediaEncoder.GetTimeParameter(endTime);
+                    toTimeParam = " -t " + MediaEncoder.GetTimeParameter(TimeSpan.FromSeconds(durationSeconds).Ticks);
                 }
             }
 
-            var slowSeekParam = GetSlowSeekCommandLineParameter(state.Request);
-            if (!string.IsNullOrWhiteSpace(slowSeekParam))
+            var timestampOffsetParam = string.Empty;
+            if (state.IsOutputVideo)
             {
-                slowSeekParam = " " + slowSeekParam;
+                timestampOffsetParam = " -output_ts_offset " + MediaEncoder.GetTimeParameter(state.Request.StartTimeTicks ?? 0).ToString(CultureInfo.InvariantCulture);
             }
+            
+            var mapArgs = state.IsOutputVideo ? GetMapArgs(state) : string.Empty;
 
-            if (state.EnableGenericHlsSegmenter)
-            {
-                var outputTsArg = Path.Combine(Path.GetDirectoryName(outputPath), Path.GetFileNameWithoutExtension(outputPath)) + "%d.ts";
+            //var outputTsArg = Path.Combine(Path.GetDirectoryName(outputPath), Path.GetFileNameWithoutExtension(outputPath)) + "%d" + GetSegmentFileExtension(state);
 
-                return string.Format("{0} {1}{10}{11} -map_metadata -1 -threads {2} {3} {4} -flags -global_header -sc_threshold 0 {5} -f segment -segment_time {6} -segment_start_number {7} -segment_list \"{8}\" -y \"{9}\"",
-                    inputModifier,
-                    GetInputArgument(state),
-                    threads,
-                    GetMapArgs(state),
-                    GetVideoArguments(state),
-                    GetAudioArguments(state),
-                    state.SegmentLength.ToString(UsCulture),
-                    startNumberParam,
-                    outputPath,
-                    outputTsArg,
-                            slowSeekParam,
-                            toTimeParam
-                    ).Trim();
-            }
+            //return string.Format("{0} {11} {1}{10} -map_metadata -1 -threads {2} {3} {4} {5} -f segment -segment_time {6} -segment_format mpegts -segment_list_type m3u8 -segment_start_number {7} -segment_list \"{8}\" -y \"{9}\"",
+            //    inputModifier,
+            //    GetInputArgument(state),
+            //    threads,
+            //    mapArgs,
+            //    GetVideoArguments(state),
+            //    GetAudioArguments(state),
+            //    state.SegmentLength.ToString(UsCulture),
+            //    startNumberParam,
+            //    outputPath,
+            //    outputTsArg,
+            //            slowSeekParam,
+            //            toTimeParam
+            //    ).Trim();
 
-            return string.Format("{0} {1}{10}{11} -map_metadata -1 -threads {2} {3} {4} -flags -global_header -copyts -sc_threshold 0 {5} -hls_time {6} -start_number {7} -hls_list_size {8} -y \"{9}\"",
+            return string.Format("{0}{11} {1} -map_metadata -1 -threads {2} {3} {4}{5} {6} -hls_time {7} -start_number {8} -hls_list_size {9} -y \"{10}\"",
                             inputModifier,
                             GetInputArgument(state),
                             threads,
-                            GetMapArgs(state),
+                            mapArgs,
                             GetVideoArguments(state),
+                            timestampOffsetParam,
                             GetAudioArguments(state),
                             state.SegmentLength.ToString(UsCulture),
                             startNumberParam,
                             state.HlsListSize.ToString(UsCulture),
                             outputPath,
-                            slowSeekParam,
                             toTimeParam
                             ).Trim();
         }
 
-        protected override bool EnableThrottling
+        protected override bool EnableThrottling(StreamState state)
         {
-            get
+            return !EnableSplitTranscoding(state);
+        }
+
+        private bool EnableSplitTranscoding(StreamState state)
+        {
+            if (string.Equals(Request.QueryString["EnableSplitTranscoding"], "false", StringComparison.OrdinalIgnoreCase))
             {
                 return false;
             }
-        }
 
-        protected override bool EnableStreamCopy
-        {
-            get
+            if (string.Equals(state.OutputVideoCodec, "copy", StringComparison.OrdinalIgnoreCase))
             {
                 return false;
             }
+
+            return state.RunTimeTicks.HasValue && state.IsOutputVideo;
         }
 
-        protected override bool EnableSlowSeek
+        protected override bool EnableStreamCopy
         {
             get
             {
-                return true;
+                return false;
             }
         }
 
@@ -876,7 +980,12 @@ namespace MediaBrowser.Api.Playback.Hls
         /// <returns>System.String.</returns>
         protected override string GetSegmentFileExtension(StreamState state)
         {
-            return ".ts";
+            return GetSegmentFileExtension(state.IsOutputVideo);
+        }
+
+        protected string GetSegmentFileExtension(bool isOutputVideo)
+        {
+            return isOutputVideo ? ".ts" : ".ts";
         }
     }
 }

+ 29 - 6
MediaBrowser.Api/Playback/Hls/HlsSegmentService.cs

@@ -14,8 +14,10 @@ namespace MediaBrowser.Api.Playback.Hls
     [Route("/Audio/{Id}/hls/{SegmentId}/stream.mp3", "GET")]
     [Route("/Audio/{Id}/hls/{SegmentId}/stream.aac", "GET")]
     [Api(Description = "Gets an Http live streaming segment file. Internal use only.")]
-    public class GetHlsAudioSegment
+    public class GetHlsAudioSegmentLegacy
     {
+        // TODO: Deprecate with new iOS app
+
         /// <summary>
         /// Gets or sets the id.
         /// </summary>
@@ -29,12 +31,31 @@ namespace MediaBrowser.Api.Playback.Hls
         public string SegmentId { get; set; }
     }
 
+    /// <summary>
+    /// Class GetHlsVideoStream
+    /// </summary>
+    [Route("/Videos/{Id}/stream.m3u8", "GET")]
+    [Api(Description = "Gets a video stream using HTTP live streaming.")]
+    public class GetHlsVideoStreamLegacy : VideoStreamRequest
+    {
+        // TODO: Deprecate with new iOS app
+
+        [ApiMember(Name = "BaselineStreamAudioBitRate", Description = "Optional. Specify the audio bitrate for the baseline stream.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
+        public int? BaselineStreamAudioBitRate { get; set; }
+
+        [ApiMember(Name = "AppendBaselineStream", Description = "Optional. Whether or not to include a baseline audio-only stream in the master playlist.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
+        public bool AppendBaselineStream { get; set; }
+
+        [ApiMember(Name = "TimeStampOffsetMs", Description = "Optional. Alter the timestamps in the playlist by a given amount, in ms. Default is 1000.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
+        public int TimeStampOffsetMs { get; set; }
+    }
+
     /// <summary>
     /// Class GetHlsVideoSegment
     /// </summary>
     [Route("/Videos/{Id}/hls/{PlaylistId}/stream.m3u8", "GET")]
     [Api(Description = "Gets an Http live streaming segment file. Internal use only.")]
-    public class GetHlsPlaylist
+    public class GetHlsPlaylistLegacy
     {
         // TODO: Deprecate with new iOS app
 
@@ -63,8 +84,10 @@ namespace MediaBrowser.Api.Playback.Hls
     /// </summary>
     [Route("/Videos/{Id}/hls/{PlaylistId}/{SegmentId}.ts", "GET")]
     [Api(Description = "Gets an Http live streaming segment file. Internal use only.")]
-    public class GetHlsVideoSegment : VideoStreamRequest
+    public class GetHlsVideoSegmentLegacy : VideoStreamRequest
     {
+        // TODO: Deprecate with new iOS app
+
         public string PlaylistId { get; set; }
 
         /// <summary>
@@ -85,7 +108,7 @@ namespace MediaBrowser.Api.Playback.Hls
             _config = config;
         }
 
-        public object Get(GetHlsPlaylist request)
+        public object Get(GetHlsPlaylistLegacy request)
         {
             var file = request.PlaylistId + Path.GetExtension(Request.PathInfo);
             file = Path.Combine(_appPaths.TranscodingTempPath, file);
@@ -103,7 +126,7 @@ namespace MediaBrowser.Api.Playback.Hls
         /// </summary>
         /// <param name="request">The request.</param>
         /// <returns>System.Object.</returns>
-        public object Get(GetHlsVideoSegment request)
+        public object Get(GetHlsVideoSegmentLegacy request)
         {
             var file = request.SegmentId + Path.GetExtension(Request.PathInfo);
             file = Path.Combine(_config.ApplicationPaths.TranscodingTempPath, file);
@@ -121,7 +144,7 @@ namespace MediaBrowser.Api.Playback.Hls
         /// </summary>
         /// <param name="request">The request.</param>
         /// <returns>System.Object.</returns>
-        public object Get(GetHlsAudioSegment request)
+        public object Get(GetHlsAudioSegmentLegacy request)
         {
             // TODO: Deprecate with new iOS app
             var file = request.SegmentId + Path.GetExtension(Request.PathInfo);

+ 1 - 20
MediaBrowser.Api/Playback/Hls/VideoHlsService.cs

@@ -11,25 +11,6 @@ using System;
 
 namespace MediaBrowser.Api.Playback.Hls
 {
-    /// <summary>
-    /// Class GetHlsVideoStream
-    /// </summary>
-    [Route("/Videos/{Id}/stream.m3u8", "GET")]
-    [Api(Description = "Gets a video stream using HTTP live streaming.")]
-    public class GetHlsVideoStream : VideoStreamRequest
-    {
-        // TODO: Deprecate with new iOS app
-        
-        [ApiMember(Name = "BaselineStreamAudioBitRate", Description = "Optional. Specify the audio bitrate for the baseline stream.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
-        public int? BaselineStreamAudioBitRate { get; set; }
-
-        [ApiMember(Name = "AppendBaselineStream", Description = "Optional. Whether or not to include a baseline audio-only stream in the master playlist.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
-        public bool AppendBaselineStream { get; set; }
-
-        [ApiMember(Name = "TimeStampOffsetMs", Description = "Optional. Alter the timestamps in the playlist by a given amount, in ms. Default is 1000.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
-        public int TimeStampOffsetMs { get; set; }
-    }
-
     [Route("/Videos/{Id}/live.m3u8", "GET")]
     [Api(Description = "Gets a video stream using HTTP live streaming.")]
     public class GetLiveHlsStream : VideoStreamRequest
@@ -50,7 +31,7 @@ namespace MediaBrowser.Api.Playback.Hls
         /// </summary>
         /// <param name="request">The request.</param>
         /// <returns>System.Object.</returns>
-        public object Get(GetHlsVideoStream request)
+        public object Get(GetHlsVideoStreamLegacy request)
         {
             return ProcessRequest(request, false);
         }

+ 1 - 1
MediaBrowser.Api/Playback/Progressive/VideoService.cs

@@ -15,7 +15,7 @@ using System.IO;
 namespace MediaBrowser.Api.Playback.Progressive
 {
     /// <summary>
-    /// Class GetAudioStream
+    /// Class GetVideoStream
     /// </summary>
     [Route("/Videos/{Id}/stream.ts", "GET")]
     [Route("/Videos/{Id}/stream.webm", "GET")]

+ 5 - 2
MediaBrowser.Api/Playback/StreamState.cs

@@ -41,7 +41,7 @@ namespace MediaBrowser.Api.Playback
         public string InputContainer { get; set; }
 
         public MediaSourceInfo MediaSource { get; set; }
-        
+
         public MediaStream AudioStream { get; set; }
         public MediaStream VideoStream { get; set; }
         public MediaStream SubtitleStream { get; set; }
@@ -57,6 +57,10 @@ namespace MediaBrowser.Api.Playback
 
         public MediaProtocol InputProtocol { get; set; }
 
+        public bool IsOutputVideo
+        {
+            get { return Request is VideoStreamRequest; }
+        }
         public bool IsInputVideo { get; set; }
         public bool IsInputArchive { get; set; }
 
@@ -66,7 +70,6 @@ namespace MediaBrowser.Api.Playback
         public List<string> PlayableStreamFileNames { get; set; }
 
         public int SegmentLength = 3;
-        public bool EnableGenericHlsSegmenter = false;
         public int HlsListSize
         {
             get

+ 11 - 3
MediaBrowser.Api/PluginService.cs

@@ -1,7 +1,9 @@
 using MediaBrowser.Common;
 using MediaBrowser.Common.Extensions;
+using MediaBrowser.Common.Net;
 using MediaBrowser.Common.Security;
 using MediaBrowser.Common.Updates;
+using MediaBrowser.Controller.Devices;
 using MediaBrowser.Controller.Net;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Plugins;
@@ -134,8 +136,10 @@ namespace MediaBrowser.Api
         private readonly ISecurityManager _securityManager;
 
         private readonly IInstallationManager _installationManager;
+        private readonly INetworkManager _network;
+        private readonly IDeviceManager _deviceManager;
 
-        public PluginService(IJsonSerializer jsonSerializer, IApplicationHost appHost, ISecurityManager securityManager, IInstallationManager installationManager)
+        public PluginService(IJsonSerializer jsonSerializer, IApplicationHost appHost, ISecurityManager securityManager, IInstallationManager installationManager, INetworkManager network, IDeviceManager deviceManager)
             : base()
         {
             if (jsonSerializer == null)
@@ -146,6 +150,8 @@ namespace MediaBrowser.Api
             _appHost = appHost;
             _securityManager = securityManager;
             _installationManager = installationManager;
+            _network = network;
+            _deviceManager = deviceManager;
             _jsonSerializer = jsonSerializer;
         }
 
@@ -165,13 +171,15 @@ namespace MediaBrowser.Api
         {
             var result = await _securityManager.GetRegistrationStatus(request.Name).ConfigureAwait(false);
 
-            return ToOptimizedResult(new RegistrationInfo
+            var info = new RegistrationInfo
             {
                 ExpirationDate = result.ExpirationDate,
                 IsRegistered = result.IsRegistered,
                 IsTrial = result.TrialVersion,
                 Name = request.Name
-            });
+            };
+
+            return ToOptimizedResult(info);
         }
 
         /// <summary>

+ 14 - 4
MediaBrowser.Dlna/PlayTo/Device.cs

@@ -635,15 +635,25 @@ namespace MediaBrowser.Dlna.PlayTo
             }
 
             XElement uPnpResponse;
-
+            
+            // Handle different variations sent back by devices
             try
             {
                 uPnpResponse = XElement.Parse(trackString);
             }
-            catch (Exception ex)
+            catch (Exception)
             {
-                _logger.ErrorException("Unable to parse xml {0}", ex, trackString);
-                return new Tuple<bool, uBaseObject>(true, null);
+                // first try to add a root node with a dlna namesapce
+                try
+                {
+                    uPnpResponse = XElement.Parse("<data xmlns:dlna=\"urn:schemas-dlna-org:device-1-0\">" + trackString + "</data>");
+                    uPnpResponse = uPnpResponse.Descendants().First();
+                }
+                catch (Exception ex)
+                {
+                    _logger.ErrorException("Unable to parse xml {0}", ex, trackString);
+                    return new Tuple<bool, uBaseObject>(true, null);
+                }
             }
 
             var e = uPnpResponse.Element(uPnpNamespaces.items);

+ 2 - 2
MediaBrowser.Dlna/Profiles/DefaultProfile.cs

@@ -31,8 +31,8 @@ namespace MediaBrowser.Dlna.Profiles
             MaxIconWidth = 48;
             MaxIconHeight = 48;
 
-            MaxStreamingBitrate = 8000000;
-            MaxStaticBitrate = 8000000;
+            MaxStreamingBitrate = 10000000;
+            MaxStaticBitrate = 10000000;
             MusicStreamingTranscodingBitrate = 128000;
             MusicSyncBitrate = 128000;
 

+ 1 - 1
MediaBrowser.Dlna/Profiles/WdtvLiveProfile.cs

@@ -15,7 +15,7 @@ namespace MediaBrowser.Dlna.Profiles
 
             Identification = new DeviceIdentification
             {
-                ModelName = "WD TV HD Live",
+                ModelName = "WD TV",
 
                 Headers = new []
                 {

+ 2 - 3
MediaBrowser.Dlna/Profiles/Xml/BubbleUPnp.xml

@@ -22,8 +22,8 @@
   <MaxAlbumArtHeight>480</MaxAlbumArtHeight>
   <MaxIconWidth>48</MaxIconWidth>
   <MaxIconHeight>48</MaxIconHeight>
-  <MaxStreamingBitrate>8000000</MaxStreamingBitrate>
-  <MaxStaticBitrate>8000000</MaxStaticBitrate>
+  <MaxStreamingBitrate>10000000</MaxStreamingBitrate>
+  <MaxStaticBitrate>10000000</MaxStaticBitrate>
   <MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
   <MusicSyncBitrate>128000</MusicSyncBitrate>
   <XDlnaDoc>DMS-1.50</XDlnaDoc>
@@ -34,7 +34,6 @@
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
   <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
   <EnableDlnaProtocol>true</EnableDlnaProtocol>
-  <EnableUrlBase>false</EnableUrlBase>
   <XmlRootAttributes />
   <DirectPlayProfiles>
     <DirectPlayProfile container="avi,mpeg,mkv,ts,mp4,mov,m4v,asf,webm,ogg,ogv,iso" type="Video" />

+ 2 - 3
MediaBrowser.Dlna/Profiles/Xml/Default.xml

@@ -16,8 +16,8 @@
   <MaxAlbumArtHeight>480</MaxAlbumArtHeight>
   <MaxIconWidth>48</MaxIconWidth>
   <MaxIconHeight>48</MaxIconHeight>
-  <MaxStreamingBitrate>8000000</MaxStreamingBitrate>
-  <MaxStaticBitrate>8000000</MaxStaticBitrate>
+  <MaxStreamingBitrate>10000000</MaxStreamingBitrate>
+  <MaxStaticBitrate>10000000</MaxStaticBitrate>
   <MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
   <MusicSyncBitrate>128000</MusicSyncBitrate>
   <XDlnaDoc>DMS-1.50</XDlnaDoc>
@@ -28,7 +28,6 @@
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
   <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
   <EnableDlnaProtocol>true</EnableDlnaProtocol>
-  <EnableUrlBase>false</EnableUrlBase>
   <XmlRootAttributes />
   <DirectPlayProfiles>
     <DirectPlayProfile container="mp3,wma" type="Audio" />

+ 2 - 3
MediaBrowser.Dlna/Profiles/Xml/Denon AVR.xml

@@ -21,8 +21,8 @@
   <MaxAlbumArtHeight>480</MaxAlbumArtHeight>
   <MaxIconWidth>48</MaxIconWidth>
   <MaxIconHeight>48</MaxIconHeight>
-  <MaxStreamingBitrate>8000000</MaxStreamingBitrate>
-  <MaxStaticBitrate>8000000</MaxStaticBitrate>
+  <MaxStreamingBitrate>10000000</MaxStreamingBitrate>
+  <MaxStaticBitrate>10000000</MaxStaticBitrate>
   <MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
   <MusicSyncBitrate>128000</MusicSyncBitrate>
   <XDlnaDoc>DMS-1.50</XDlnaDoc>
@@ -33,7 +33,6 @@
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
   <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
   <EnableDlnaProtocol>true</EnableDlnaProtocol>
-  <EnableUrlBase>false</EnableUrlBase>
   <XmlRootAttributes />
   <DirectPlayProfiles>
     <DirectPlayProfile container="mp3,flac,m4a,wma" type="Audio" />

+ 2 - 3
MediaBrowser.Dlna/Profiles/Xml/DirecTV HD-DVR.xml

@@ -22,8 +22,8 @@
   <MaxAlbumArtHeight>480</MaxAlbumArtHeight>
   <MaxIconWidth>48</MaxIconWidth>
   <MaxIconHeight>48</MaxIconHeight>
-  <MaxStreamingBitrate>8000000</MaxStreamingBitrate>
-  <MaxStaticBitrate>8000000</MaxStaticBitrate>
+  <MaxStreamingBitrate>10000000</MaxStreamingBitrate>
+  <MaxStaticBitrate>10000000</MaxStaticBitrate>
   <MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
   <MusicSyncBitrate>128000</MusicSyncBitrate>
   <XDlnaDoc>DMS-1.50</XDlnaDoc>
@@ -34,7 +34,6 @@
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
   <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
   <EnableDlnaProtocol>true</EnableDlnaProtocol>
-  <EnableUrlBase>false</EnableUrlBase>
   <XmlRootAttributes />
   <DirectPlayProfiles>
     <DirectPlayProfile container="mpeg" audioCodec="mp2" videoCodec="mpeg2video" type="Video" />

+ 2 - 3
MediaBrowser.Dlna/Profiles/Xml/Dish Hopper-Joey.xml

@@ -23,8 +23,8 @@
   <MaxAlbumArtHeight>480</MaxAlbumArtHeight>
   <MaxIconWidth>48</MaxIconWidth>
   <MaxIconHeight>48</MaxIconHeight>
-  <MaxStreamingBitrate>8000000</MaxStreamingBitrate>
-  <MaxStaticBitrate>8000000</MaxStaticBitrate>
+  <MaxStreamingBitrate>10000000</MaxStreamingBitrate>
+  <MaxStaticBitrate>10000000</MaxStaticBitrate>
   <MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
   <MusicSyncBitrate>128000</MusicSyncBitrate>
   <XDlnaDoc>DMS-1.50</XDlnaDoc>
@@ -35,7 +35,6 @@
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
   <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
   <EnableDlnaProtocol>true</EnableDlnaProtocol>
-  <EnableUrlBase>false</EnableUrlBase>
   <XmlRootAttributes />
   <DirectPlayProfiles>
     <DirectPlayProfile container="mp4,mkv,mpeg,ts" audioCodec="mp3,ac3,aac,he-aac,pcm" videoCodec="h264,mpeg2video" type="Video" />

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 23
MediaBrowser.Dlna/Profiles/Xml/Generic Device.xml


+ 2 - 3
MediaBrowser.Dlna/Profiles/Xml/LG Smart TV.xml

@@ -22,8 +22,8 @@
   <MaxAlbumArtHeight>480</MaxAlbumArtHeight>
   <MaxIconWidth>48</MaxIconWidth>
   <MaxIconHeight>48</MaxIconHeight>
-  <MaxStreamingBitrate>8000000</MaxStreamingBitrate>
-  <MaxStaticBitrate>8000000</MaxStaticBitrate>
+  <MaxStreamingBitrate>10000000</MaxStreamingBitrate>
+  <MaxStaticBitrate>10000000</MaxStaticBitrate>
   <MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
   <MusicSyncBitrate>128000</MusicSyncBitrate>
   <XDlnaDoc>DMS-1.50</XDlnaDoc>
@@ -34,7 +34,6 @@
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
   <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
   <EnableDlnaProtocol>true</EnableDlnaProtocol>
-  <EnableUrlBase>false</EnableUrlBase>
   <XmlRootAttributes />
   <DirectPlayProfiles>
     <DirectPlayProfile container="ts" audioCodec="aac,ac3,mp3" videoCodec="h264" type="Video" />

+ 2 - 3
MediaBrowser.Dlna/Profiles/Xml/Linksys DMA2100.xml

@@ -20,8 +20,8 @@
   <MaxAlbumArtHeight>480</MaxAlbumArtHeight>
   <MaxIconWidth>48</MaxIconWidth>
   <MaxIconHeight>48</MaxIconHeight>
-  <MaxStreamingBitrate>8000000</MaxStreamingBitrate>
-  <MaxStaticBitrate>8000000</MaxStaticBitrate>
+  <MaxStreamingBitrate>10000000</MaxStreamingBitrate>
+  <MaxStaticBitrate>10000000</MaxStaticBitrate>
   <MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
   <MusicSyncBitrate>128000</MusicSyncBitrate>
   <XDlnaDoc>DMS-1.50</XDlnaDoc>
@@ -32,7 +32,6 @@
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
   <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
   <EnableDlnaProtocol>true</EnableDlnaProtocol>
-  <EnableUrlBase>false</EnableUrlBase>
   <XmlRootAttributes />
   <DirectPlayProfiles>
     <DirectPlayProfile container="mp3,flac,m4a,wma" type="Audio" />

+ 2 - 3
MediaBrowser.Dlna/Profiles/Xml/MediaMonkey.xml

@@ -22,8 +22,8 @@
   <MaxAlbumArtHeight>480</MaxAlbumArtHeight>
   <MaxIconWidth>48</MaxIconWidth>
   <MaxIconHeight>48</MaxIconHeight>
-  <MaxStreamingBitrate>8000000</MaxStreamingBitrate>
-  <MaxStaticBitrate>8000000</MaxStaticBitrate>
+  <MaxStreamingBitrate>10000000</MaxStreamingBitrate>
+  <MaxStaticBitrate>10000000</MaxStaticBitrate>
   <MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
   <MusicSyncBitrate>128000</MusicSyncBitrate>
   <XDlnaDoc>DMS-1.50</XDlnaDoc>
@@ -34,7 +34,6 @@
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
   <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
   <EnableDlnaProtocol>true</EnableDlnaProtocol>
-  <EnableUrlBase>false</EnableUrlBase>
   <XmlRootAttributes />
   <DirectPlayProfiles>
     <DirectPlayProfile container="mp3" audioCodec="mp2,mp3" type="Audio" />

+ 2 - 3
MediaBrowser.Dlna/Profiles/Xml/Panasonic Viera.xml

@@ -23,8 +23,8 @@
   <MaxAlbumArtHeight>480</MaxAlbumArtHeight>
   <MaxIconWidth>48</MaxIconWidth>
   <MaxIconHeight>48</MaxIconHeight>
-  <MaxStreamingBitrate>8000000</MaxStreamingBitrate>
-  <MaxStaticBitrate>8000000</MaxStaticBitrate>
+  <MaxStreamingBitrate>10000000</MaxStreamingBitrate>
+  <MaxStaticBitrate>10000000</MaxStaticBitrate>
   <MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
   <MusicSyncBitrate>128000</MusicSyncBitrate>
   <XDlnaDoc>DMS-1.50</XDlnaDoc>
@@ -35,7 +35,6 @@
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
   <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
   <EnableDlnaProtocol>true</EnableDlnaProtocol>
-  <EnableUrlBase>false</EnableUrlBase>
   <XmlRootAttributes>
     <XmlAttribute name="xmlns:pv" value="http://www.pv.com/pvns/" />
   </XmlRootAttributes>

+ 2 - 3
MediaBrowser.Dlna/Profiles/Xml/Popcorn Hour.xml

@@ -16,8 +16,8 @@
   <MaxAlbumArtHeight>480</MaxAlbumArtHeight>
   <MaxIconWidth>48</MaxIconWidth>
   <MaxIconHeight>48</MaxIconHeight>
-  <MaxStreamingBitrate>8000000</MaxStreamingBitrate>
-  <MaxStaticBitrate>8000000</MaxStaticBitrate>
+  <MaxStreamingBitrate>10000000</MaxStreamingBitrate>
+  <MaxStaticBitrate>10000000</MaxStaticBitrate>
   <MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
   <MusicSyncBitrate>128000</MusicSyncBitrate>
   <XDlnaDoc>DMS-1.50</XDlnaDoc>
@@ -28,7 +28,6 @@
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
   <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
   <EnableDlnaProtocol>true</EnableDlnaProtocol>
-  <EnableUrlBase>false</EnableUrlBase>
   <XmlRootAttributes />
   <DirectPlayProfiles>
     <DirectPlayProfile container="mp4,mov" audioCodec="aac" videoCodec="h264,mpeg4" type="Video" />

+ 2 - 3
MediaBrowser.Dlna/Profiles/Xml/Samsung Smart TV.xml

@@ -22,8 +22,8 @@
   <MaxAlbumArtHeight>480</MaxAlbumArtHeight>
   <MaxIconWidth>48</MaxIconWidth>
   <MaxIconHeight>48</MaxIconHeight>
-  <MaxStreamingBitrate>8000000</MaxStreamingBitrate>
-  <MaxStaticBitrate>8000000</MaxStaticBitrate>
+  <MaxStreamingBitrate>10000000</MaxStreamingBitrate>
+  <MaxStaticBitrate>10000000</MaxStaticBitrate>
   <MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
   <MusicSyncBitrate>128000</MusicSyncBitrate>
   <XDlnaDoc>DMS-1.50</XDlnaDoc>
@@ -34,7 +34,6 @@
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
   <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
   <EnableDlnaProtocol>true</EnableDlnaProtocol>
-  <EnableUrlBase>false</EnableUrlBase>
   <XmlRootAttributes>
     <XmlAttribute name="xmlns:sec" value="http://www.sec.co.kr/" />
   </XmlRootAttributes>

+ 2 - 3
MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player 2013.xml

@@ -22,8 +22,8 @@
   <MaxAlbumArtHeight>480</MaxAlbumArtHeight>
   <MaxIconWidth>48</MaxIconWidth>
   <MaxIconHeight>48</MaxIconHeight>
-  <MaxStreamingBitrate>8000000</MaxStreamingBitrate>
-  <MaxStaticBitrate>8000000</MaxStaticBitrate>
+  <MaxStreamingBitrate>10000000</MaxStreamingBitrate>
+  <MaxStaticBitrate>10000000</MaxStaticBitrate>
   <MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
   <MusicSyncBitrate>128000</MusicSyncBitrate>
   <XDlnaDoc>DMS-1.50</XDlnaDoc>
@@ -34,7 +34,6 @@
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
   <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
   <EnableDlnaProtocol>true</EnableDlnaProtocol>
-  <EnableUrlBase>false</EnableUrlBase>
   <XmlRootAttributes>
     <XmlAttribute name="xmlns:av" value="urn:schemas-sony-com:av" />
   </XmlRootAttributes>

+ 2 - 3
MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player.xml

@@ -24,8 +24,8 @@
   <MaxAlbumArtHeight>480</MaxAlbumArtHeight>
   <MaxIconWidth>48</MaxIconWidth>
   <MaxIconHeight>48</MaxIconHeight>
-  <MaxStreamingBitrate>8000000</MaxStreamingBitrate>
-  <MaxStaticBitrate>8000000</MaxStaticBitrate>
+  <MaxStreamingBitrate>10000000</MaxStreamingBitrate>
+  <MaxStaticBitrate>10000000</MaxStaticBitrate>
   <MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
   <MusicSyncBitrate>128000</MusicSyncBitrate>
   <XDlnaDoc>DMS-1.50</XDlnaDoc>
@@ -36,7 +36,6 @@
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
   <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
   <EnableDlnaProtocol>true</EnableDlnaProtocol>
-  <EnableUrlBase>false</EnableUrlBase>
   <XmlRootAttributes>
     <XmlAttribute name="xmlns:av" value="urn:schemas-sony-com:av" />
   </XmlRootAttributes>

+ 2 - 3
MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2010).xml

@@ -23,8 +23,8 @@
   <MaxAlbumArtHeight>480</MaxAlbumArtHeight>
   <MaxIconWidth>48</MaxIconWidth>
   <MaxIconHeight>48</MaxIconHeight>
-  <MaxStreamingBitrate>8000000</MaxStreamingBitrate>
-  <MaxStaticBitrate>8000000</MaxStaticBitrate>
+  <MaxStreamingBitrate>10000000</MaxStreamingBitrate>
+  <MaxStaticBitrate>10000000</MaxStaticBitrate>
   <MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
   <MusicSyncBitrate>128000</MusicSyncBitrate>
   <XDlnaDoc>DMS-1.50</XDlnaDoc>
@@ -36,7 +36,6 @@
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
   <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
   <EnableDlnaProtocol>true</EnableDlnaProtocol>
-  <EnableUrlBase>false</EnableUrlBase>
   <XmlRootAttributes>
     <XmlAttribute name="xmlns:av" value="urn:schemas-sony-com:av" />
   </XmlRootAttributes>

+ 2 - 3
MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2011).xml

@@ -23,8 +23,8 @@
   <MaxAlbumArtHeight>480</MaxAlbumArtHeight>
   <MaxIconWidth>48</MaxIconWidth>
   <MaxIconHeight>48</MaxIconHeight>
-  <MaxStreamingBitrate>8000000</MaxStreamingBitrate>
-  <MaxStaticBitrate>8000000</MaxStaticBitrate>
+  <MaxStreamingBitrate>10000000</MaxStreamingBitrate>
+  <MaxStaticBitrate>10000000</MaxStaticBitrate>
   <MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
   <MusicSyncBitrate>128000</MusicSyncBitrate>
   <XDlnaDoc>DMS-1.50</XDlnaDoc>
@@ -36,7 +36,6 @@
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
   <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
   <EnableDlnaProtocol>true</EnableDlnaProtocol>
-  <EnableUrlBase>false</EnableUrlBase>
   <XmlRootAttributes>
     <XmlAttribute name="xmlns:av" value="urn:schemas-sony-com:av" />
   </XmlRootAttributes>

+ 2 - 3
MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2012).xml

@@ -23,8 +23,8 @@
   <MaxAlbumArtHeight>480</MaxAlbumArtHeight>
   <MaxIconWidth>48</MaxIconWidth>
   <MaxIconHeight>48</MaxIconHeight>
-  <MaxStreamingBitrate>8000000</MaxStreamingBitrate>
-  <MaxStaticBitrate>8000000</MaxStaticBitrate>
+  <MaxStreamingBitrate>10000000</MaxStreamingBitrate>
+  <MaxStaticBitrate>10000000</MaxStaticBitrate>
   <MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
   <MusicSyncBitrate>128000</MusicSyncBitrate>
   <XDlnaDoc>DMS-1.50</XDlnaDoc>
@@ -36,7 +36,6 @@
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
   <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
   <EnableDlnaProtocol>true</EnableDlnaProtocol>
-  <EnableUrlBase>false</EnableUrlBase>
   <XmlRootAttributes>
     <XmlAttribute name="xmlns:av" value="urn:schemas-sony-com:av" />
   </XmlRootAttributes>

+ 2 - 3
MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2013).xml

@@ -23,8 +23,8 @@
   <MaxAlbumArtHeight>480</MaxAlbumArtHeight>
   <MaxIconWidth>48</MaxIconWidth>
   <MaxIconHeight>48</MaxIconHeight>
-  <MaxStreamingBitrate>8000000</MaxStreamingBitrate>
-  <MaxStaticBitrate>8000000</MaxStaticBitrate>
+  <MaxStreamingBitrate>10000000</MaxStreamingBitrate>
+  <MaxStaticBitrate>10000000</MaxStaticBitrate>
   <MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
   <MusicSyncBitrate>128000</MusicSyncBitrate>
   <XDlnaDoc>DMS-1.50</XDlnaDoc>
@@ -36,7 +36,6 @@
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
   <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
   <EnableDlnaProtocol>true</EnableDlnaProtocol>
-  <EnableUrlBase>false</EnableUrlBase>
   <XmlRootAttributes>
     <XmlAttribute name="xmlns:av" value="urn:schemas-sony-com:av" />
   </XmlRootAttributes>

+ 2 - 3
MediaBrowser.Dlna/Profiles/Xml/Sony PlayStation 3.xml

@@ -23,8 +23,8 @@
   <MaxAlbumArtHeight>480</MaxAlbumArtHeight>
   <MaxIconWidth>48</MaxIconWidth>
   <MaxIconHeight>48</MaxIconHeight>
-  <MaxStreamingBitrate>8000000</MaxStreamingBitrate>
-  <MaxStaticBitrate>8000000</MaxStaticBitrate>
+  <MaxStreamingBitrate>10000000</MaxStreamingBitrate>
+  <MaxStaticBitrate>10000000</MaxStaticBitrate>
   <MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
   <MusicSyncBitrate>128000</MusicSyncBitrate>
   <XDlnaDoc>DMS-1.50</XDlnaDoc>
@@ -36,7 +36,6 @@
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
   <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
   <EnableDlnaProtocol>true</EnableDlnaProtocol>
-  <EnableUrlBase>false</EnableUrlBase>
   <XmlRootAttributes />
   <DirectPlayProfiles>
     <DirectPlayProfile container="avi" audioCodec="mp2,mp3" videoCodec="mpeg4" type="Video" />

+ 2 - 3
MediaBrowser.Dlna/Profiles/Xml/Vlc.xml

@@ -22,8 +22,8 @@
   <MaxAlbumArtHeight>480</MaxAlbumArtHeight>
   <MaxIconWidth>48</MaxIconWidth>
   <MaxIconHeight>48</MaxIconHeight>
-  <MaxStreamingBitrate>8000000</MaxStreamingBitrate>
-  <MaxStaticBitrate>8000000</MaxStaticBitrate>
+  <MaxStreamingBitrate>10000000</MaxStreamingBitrate>
+  <MaxStaticBitrate>10000000</MaxStaticBitrate>
   <MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
   <MusicSyncBitrate>128000</MusicSyncBitrate>
   <XDlnaDoc>DMS-1.50</XDlnaDoc>
@@ -34,7 +34,6 @@
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
   <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
   <EnableDlnaProtocol>true</EnableDlnaProtocol>
-  <EnableUrlBase>false</EnableUrlBase>
   <XmlRootAttributes />
   <DirectPlayProfiles>
     <DirectPlayProfile container="avi,mpeg,mkv,ts,mp4,mov,m4v,asf,webm,ogg,ogv,iso" type="Video" />

+ 3 - 4
MediaBrowser.Dlna/Profiles/Xml/WDTV Live.xml

@@ -2,7 +2,7 @@
 <Profile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <Name>WDTV Live</Name>
   <Identification>
-    <ModelName>WD TV HD Live</ModelName>
+    <ModelName>WD TV</ModelName>
     <Headers>
       <HttpHeaderInfo name="User-Agent" value="alphanetworks" match="Substring" />
       <HttpHeaderInfo name="User-Agent" value="ALPHA Networks" match="Substring" />
@@ -23,8 +23,8 @@
   <MaxAlbumArtHeight>480</MaxAlbumArtHeight>
   <MaxIconWidth>48</MaxIconWidth>
   <MaxIconHeight>48</MaxIconHeight>
-  <MaxStreamingBitrate>8000000</MaxStreamingBitrate>
-  <MaxStaticBitrate>8000000</MaxStaticBitrate>
+  <MaxStreamingBitrate>10000000</MaxStreamingBitrate>
+  <MaxStaticBitrate>10000000</MaxStaticBitrate>
   <MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
   <MusicSyncBitrate>128000</MusicSyncBitrate>
   <XDlnaDoc>DMS-1.50</XDlnaDoc>
@@ -35,7 +35,6 @@
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
   <IgnoreTranscodeByteRangeRequests>true</IgnoreTranscodeByteRangeRequests>
   <EnableDlnaProtocol>true</EnableDlnaProtocol>
-  <EnableUrlBase>false</EnableUrlBase>
   <XmlRootAttributes />
   <DirectPlayProfiles>
     <DirectPlayProfile container="avi" audioCodec="ac3,dca,mp2,mp3,pcm" videoCodec="mpeg1video,mpeg2video,mpeg4,h264,vc1" type="Video" />

+ 2 - 3
MediaBrowser.Dlna/Profiles/Xml/Xbox 360.xml

@@ -23,8 +23,8 @@
   <MaxAlbumArtHeight>480</MaxAlbumArtHeight>
   <MaxIconWidth>48</MaxIconWidth>
   <MaxIconHeight>48</MaxIconHeight>
-  <MaxStreamingBitrate>8000000</MaxStreamingBitrate>
-  <MaxStaticBitrate>8000000</MaxStaticBitrate>
+  <MaxStreamingBitrate>10000000</MaxStreamingBitrate>
+  <MaxStaticBitrate>10000000</MaxStaticBitrate>
   <MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
   <MusicSyncBitrate>128000</MusicSyncBitrate>
   <XDlnaDoc>DMS-1.50</XDlnaDoc>
@@ -35,7 +35,6 @@
   <EnableMSMediaReceiverRegistrar>true</EnableMSMediaReceiverRegistrar>
   <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
   <EnableDlnaProtocol>false</EnableDlnaProtocol>
-  <EnableUrlBase>true</EnableUrlBase>
   <XmlRootAttributes />
   <DirectPlayProfiles>
     <DirectPlayProfile container="avi" audioCodec="ac3,mp3" videoCodec="mpeg4" type="Video" />

+ 2 - 3
MediaBrowser.Dlna/Profiles/Xml/Xbox One.xml

@@ -23,8 +23,8 @@
   <MaxAlbumArtHeight>480</MaxAlbumArtHeight>
   <MaxIconWidth>48</MaxIconWidth>
   <MaxIconHeight>48</MaxIconHeight>
-  <MaxStreamingBitrate>8000000</MaxStreamingBitrate>
-  <MaxStaticBitrate>8000000</MaxStaticBitrate>
+  <MaxStreamingBitrate>10000000</MaxStreamingBitrate>
+  <MaxStaticBitrate>10000000</MaxStaticBitrate>
   <MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
   <MusicSyncBitrate>128000</MusicSyncBitrate>
   <XDlnaDoc>DMS-1.50</XDlnaDoc>
@@ -35,7 +35,6 @@
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
   <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
   <EnableDlnaProtocol>true</EnableDlnaProtocol>
-  <EnableUrlBase>false</EnableUrlBase>
   <XmlRootAttributes />
   <DirectPlayProfiles>
     <DirectPlayProfile container="ts" audioCodec="ac3" videoCodec="h264" type="Video" />

+ 2 - 3
MediaBrowser.Dlna/Profiles/Xml/foobar2000.xml

@@ -22,8 +22,8 @@
   <MaxAlbumArtHeight>480</MaxAlbumArtHeight>
   <MaxIconWidth>48</MaxIconWidth>
   <MaxIconHeight>48</MaxIconHeight>
-  <MaxStreamingBitrate>8000000</MaxStreamingBitrate>
-  <MaxStaticBitrate>8000000</MaxStaticBitrate>
+  <MaxStreamingBitrate>10000000</MaxStreamingBitrate>
+  <MaxStaticBitrate>10000000</MaxStaticBitrate>
   <MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
   <MusicSyncBitrate>128000</MusicSyncBitrate>
   <XDlnaDoc>DMS-1.50</XDlnaDoc>
@@ -34,7 +34,6 @@
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
   <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
   <EnableDlnaProtocol>true</EnableDlnaProtocol>
-  <EnableUrlBase>false</EnableUrlBase>
   <XmlRootAttributes />
   <DirectPlayProfiles>
     <DirectPlayProfile container="mp3" audioCodec="mp2,mp3" type="Audio" />

+ 1 - 0
MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs

@@ -483,6 +483,7 @@ namespace MediaBrowser.MediaEncoding.Probing
             FetchStudios(audio, tags, "organization");
             FetchStudios(audio, tags, "ensemble");
             FetchStudios(audio, tags, "publisher");
+            FetchStudios(audio, tags, "label");
 
             // These support mulitple values, but for now we only store the first.
             audio.SetProviderId(MetadataProviders.MusicBrainzAlbumArtist, GetMultipleMusicBrainzId(FFProbeHelpers.GetDictionaryValue(tags, "MusicBrainz Album Artist Id")));

+ 11 - 3
MediaBrowser.Model/Configuration/ServerConfiguration.cs

@@ -277,7 +277,7 @@ namespace MediaBrowser.Model.Configuration
                     {
                         new ImageOption
                         {
-                            Limit = 3,
+                            Limit = 2,
                             MinWidth = 1280,
                             Type = ImageType.Backdrop
                         },
@@ -304,7 +304,7 @@ namespace MediaBrowser.Model.Configuration
 
                         new ImageOption
                         {
-                            Limit = 1,
+                            Limit = 0,
                             Type = ImageType.Banner
                         },
 
@@ -374,7 +374,7 @@ namespace MediaBrowser.Model.Configuration
                     {
                         new ImageOption
                         {
-                            Limit = 1,
+                            Limit = 0,
                             MinWidth = 1280,
                             Type = ImageType.Backdrop
                         },
@@ -414,6 +414,14 @@ namespace MediaBrowser.Model.Configuration
                         {
                             Limit = 0,
                             Type = ImageType.Art
+                        },
+
+                        // Don't download this by default
+                        // Generally not used
+                        new ImageOption
+                        {
+                            Limit = 0,
+                            Type = ImageType.Logo
                         }
                     }
                 },

+ 5 - 0
MediaBrowser.Model/Dlna/StreamInfo.cs

@@ -158,6 +158,11 @@ namespace MediaBrowser.Model.Dlna
 
             if (MediaType == DlnaProfileType.Audio)
             {
+                if (StringHelper.EqualsIgnoreCase(SubProtocol, "hls"))
+                {
+                    return string.Format("{0}/audio/{1}/master.m3u8?{2}", baseUrl, ItemId, queryString);
+                }
+
                 return string.Format("{0}/audio/{1}/stream{2}?{3}", baseUrl, ItemId, extension, queryString);
             }
 

+ 1 - 1
MediaBrowser.Providers/Music/FanArtAlbumProvider.cs

@@ -7,6 +7,7 @@ using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Providers;
+using MediaBrowser.Providers.TV;
 using System;
 using System.Collections.Generic;
 using System.Globalization;
@@ -16,7 +17,6 @@ using System.Text;
 using System.Threading;
 using System.Threading.Tasks;
 using System.Xml;
-using MediaBrowser.Providers.TV;
 
 namespace MediaBrowser.Providers.Music
 {

+ 4 - 1
MediaBrowser.Server.Implementations/Devices/DeviceManager.cs

@@ -1,6 +1,7 @@
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.Events;
 using MediaBrowser.Common.IO;
+using MediaBrowser.Common.Net;
 using MediaBrowser.Controller.Devices;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Model.Devices;
@@ -26,6 +27,7 @@ namespace MediaBrowser.Server.Implementations.Devices
         private readonly ILibraryMonitor _libraryMonitor;
         private readonly IConfigurationManager _config;
         private readonly ILogger _logger;
+        private readonly INetworkManager _network;
 
         public event EventHandler<GenericEventArgs<CameraImageUploadInfo>> CameraImageUploaded;
 
@@ -34,7 +36,7 @@ namespace MediaBrowser.Server.Implementations.Devices
         /// </summary>
         public event EventHandler<GenericEventArgs<DeviceInfo>> DeviceOptionsUpdated;
 
-        public DeviceManager(IDeviceRepository repo, IUserManager userManager, IFileSystem fileSystem, ILibraryMonitor libraryMonitor, IConfigurationManager config, ILogger logger)
+        public DeviceManager(IDeviceRepository repo, IUserManager userManager, IFileSystem fileSystem, ILibraryMonitor libraryMonitor, IConfigurationManager config, ILogger logger, INetworkManager network)
         {
             _repo = repo;
             _userManager = userManager;
@@ -42,6 +44,7 @@ namespace MediaBrowser.Server.Implementations.Devices
             _libraryMonitor = libraryMonitor;
             _config = config;
             _logger = logger;
+            _network = network;
         }
 
         public async Task<DeviceInfo> RegisterDevice(string reportedId, string name, string appName, string appVersion, string usedByUserId)

+ 20 - 9
MediaBrowser.Server.Implementations/HttpServer/ResponseFilter.cs

@@ -45,19 +45,15 @@ namespace MediaBrowser.Server.Implementations.HttpServer
                 }
             }
 
-            if (dto is CompressedResult)
-            {
-                // Per Google PageSpeed
-                // This instructs the proxies to cache two versions of the resource: one compressed, and one uncompressed. 
-                // The correct version of the resource is delivered based on the client request header. 
-                // This is a good choice for applications that are singly homed and depend on public proxies for user locality.                        
-                res.AddHeader("Vary", "Accept-Encoding");
-            }
+            var vary = "Accept-Encoding";
 
             var hasOptions = dto as IHasOptions;
+            var sharpResponse = res as WebSocketSharpResponse;
 
             if (hasOptions != null)
             {
+                //hasOptions.Options["Server"] = "Mono-HTTPAPI/1.1";
+
                 // Content length has to be explicitly set on on HttpListenerResponse or it won't be happy
                 string contentLength;
 
@@ -79,14 +75,29 @@ namespace MediaBrowser.Server.Implementations.HttpServer
                             return;
                         }
 
-                        var sharpResponse = res as WebSocketSharpResponse;
                         if (sharpResponse != null)
                         {
                             sharpResponse.SendChunked = false;
                         }
                     }
                 }
+
+                string hasOptionsVary;
+                if (hasOptions.Options.TryGetValue("Vary", out hasOptionsVary))
+                {
+                    vary = hasOptionsVary;
+                }
+
+                hasOptions.Options["Vary"] = vary;
             }
+
+            //res.KeepAlive = false;
+
+            // Per Google PageSpeed
+            // This instructs the proxies to cache two versions of the resource: one compressed, and one uncompressed. 
+            // The correct version of the resource is delivered based on the client request header. 
+            // This is a good choice for applications that are singly homed and depend on public proxies for user locality.                        
+            res.AddHeader("Vary", vary);
         }
 
         /// <summary>

+ 2 - 2
MediaBrowser.Server.Implementations/HttpServer/Security/SessionContext.cs

@@ -34,8 +34,8 @@ namespace MediaBrowser.Server.Implementations.HttpServer.Security
             //    }
             //}
 
-            var session = _sessionManager.GetSession(authorization.DeviceId, authorization.Client, authorization.Version);
-            return Task.FromResult(session);
+            var user = string.IsNullOrWhiteSpace(authorization.UserId) ? null : _userManager.GetUserById(authorization.UserId);
+            return _sessionManager.LogSessionActivity(authorization.Client, authorization.Version, authorization.DeviceId, authorization.Device, requestContext.RemoteIp, user);
         }
 
         private AuthenticationInfo GetTokenInfo(IServiceRequest request)

+ 3 - 3
MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs

@@ -82,9 +82,9 @@ namespace MediaBrowser.Server.Implementations.IO
             }
 
             // This is an arbitraty amount of time, but delay it because file system writes often trigger events after RemoveTempIgnore has been called. 
-            // Seeing long delays in some situations, especially over the network.
-            // Seeing delays up to 40 seconds, but not going to ignore changes for that long.
-            await Task.Delay(5000).ConfigureAwait(false);
+            // Seeing long delays in some situations, especially over the network, sometimes up to 45 seconds
+            // But if we make this delay too high, we risk missing legitimate changes
+            await Task.Delay(10000).ConfigureAwait(false);
 
             string val;
             _tempIgnoredPaths.TryRemove(path, out val);

+ 1 - 0
MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs

@@ -32,6 +32,7 @@ namespace MediaBrowser.Server.Implementations.Library
                 ".wd_tv",
 
                 // Synology
+                "@eaDir",
                 "eaDir"
 
         };

+ 1 - 0
MediaBrowser.Server.Implementations/Localization/JavaScript/ar.json

@@ -40,6 +40,7 @@
     "TitleLiveTV": "Live TV",
     "TitleSync": "Sync",
     "ButtonDonate": "Donate",
+    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
     "HeaderMyMedia": "My Media",
     "TitleNotifications": "Notifications",
     "ErrorLaunchingChromecast": "There was an error launching chromecast. Please ensure your device is connected to your wireless network.",

+ 1 - 0
MediaBrowser.Server.Implementations/Localization/JavaScript/be_BY.json → MediaBrowser.Server.Implementations/Localization/JavaScript/be-BY.json

@@ -40,6 +40,7 @@
     "TitleLiveTV": "Live TV",
     "TitleSync": "Sync",
     "ButtonDonate": "Donate",
+    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
     "HeaderMyMedia": "My Media",
     "TitleNotifications": "Notifications",
     "ErrorLaunchingChromecast": "There was an error launching chromecast. Please ensure your device is connected to your wireless network.",

+ 1 - 0
MediaBrowser.Server.Implementations/Localization/JavaScript/bg_BG.json → MediaBrowser.Server.Implementations/Localization/JavaScript/bg-BG.json

@@ -40,6 +40,7 @@
     "TitleLiveTV": "\u0422V \u043d\u0430 \u0436\u0438\u0432\u043e",
     "TitleSync": "Sync",
     "ButtonDonate": "Donate",
+    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
     "HeaderMyMedia": "My Media",
     "TitleNotifications": "\u0418\u0437\u0432\u0435\u0441\u0442\u0438\u044f",
     "ErrorLaunchingChromecast": "There was an error launching chromecast. Please ensure your device is connected to your wireless network.",

+ 1 - 0
MediaBrowser.Server.Implementations/Localization/JavaScript/ca.json

@@ -40,6 +40,7 @@
     "TitleLiveTV": "Live TV",
     "TitleSync": "Sync",
     "ButtonDonate": "Donate",
+    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
     "HeaderMyMedia": "My Media",
     "TitleNotifications": "Notifications",
     "ErrorLaunchingChromecast": "There was an error launching chromecast. Please ensure your device is connected to your wireless network.",

+ 1 - 0
MediaBrowser.Server.Implementations/Localization/JavaScript/cs.json

@@ -40,6 +40,7 @@
     "TitleLiveTV": "\u017div\u00e1 TV",
     "TitleSync": "Sync",
     "ButtonDonate": "Donate",
+    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
     "HeaderMyMedia": "My Media",
     "TitleNotifications": "Notifications",
     "ErrorLaunchingChromecast": "There was an error launching chromecast. Please ensure your device is connected to your wireless network.",

+ 521 - 520
MediaBrowser.Server.Implementations/Localization/JavaScript/da.json

@@ -36,10 +36,11 @@
     "MessageKeyUpdated": "Tak. Din supporter n\u00f8gle er nu opdateret.",
     "MessageKeyRemoved": "Tak. Din supporter n\u00f8gle er fjernet.",
     "HeaderSupportTheTeam": "St\u00f8t Emby-holdet",
-    "TextEnjoyBonusFeatures": "Enjoy Bonus Features",
+    "TextEnjoyBonusFeatures": "F\u00e5 bonus funktioner",
     "TitleLiveTV": "Live TV",
     "TitleSync": "Sync",
     "ButtonDonate": "Don\u00e9r",
+    "LabelRecurringDonationCanBeCancelledHelp": "Tilbagevendende donationer kan afmeldes n\u00e5r som helst fra din PayPal konto.",
     "HeaderMyMedia": "Mine medier",
     "TitleNotifications": "Underretninger",
     "ErrorLaunchingChromecast": "Der opstod en fejl ved start af cromecast. Tjek venligst at din enhed er forbundet til det tr\u00e5dl\u00f8se netv\u00e6rk.",
@@ -94,84 +95,84 @@
     "ButtonAddToCollection": "Tilf\u00f8j til samling",
     "HeaderSelectCertificatePath": "V\u00e6lg certifikatsti",
     "ConfirmMessageScheduledTaskButton": "Denne operation k\u00f8rer normalt som en planlagt opgave. Den kan ogs\u00e5 k\u00f8res manuelt her. For at konfigurere den planlage opgave, se:",
-    "HeaderSupporterBenefit": "A supporter membership provides additional benefits such as access to sync, premium plugins, internet channel content, and more. {0}Learn more{1}.",
+    "HeaderSupporterBenefit": "Med et supporter medlemskab opn\u00e5r du ekstra fordele s\u00e5 som adgang til sync, premium plugins, internet kanaler samt meget mere. {0}L\u00e6r mere{1}.",
     "LabelSyncNoTargetsHelp": "Det ser ud til at du for \u00f8jeblikket ikke har nogle enheder ser underst\u00f8tter sync.",
     "HeaderWelcomeToProjectServerDashboard": "Velkommen til Emby betjeningspanel",
     "HeaderWelcomeToProjectWebClient": "Velkommen til Emby",
     "ButtonTakeTheTour": "Vis introduktion",
     "HeaderWelcomeBack": "Velkommen tilbage!",
     "TitlePlugins": "Tilf\u00f8jelser",
-    "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new",
-    "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.",
+    "ButtonTakeTheTourToSeeWhatsNew": "Tag en rundvisning for at se hvad der er nyt",
+    "MessageNoSyncJobsFound": "Intet sync job blev fundet. Opret sync jobs ved at benytte Sync knapper som findes gennem web-interfacet.",
     "HeaderLibraryAccess": "Adgang til biblioteker",
     "HeaderChannelAccess": "Adgang til kanaler",
     "HeaderDeviceAccess": "Enhedsadgang",
-    "HeaderSelectDevices": "Select Devices",
-    "ButtonCancelItem": "Cancel item",
-    "ButtonQueueForRetry": "Queue for retry",
-    "ButtonReenable": "Re-enable",
+    "HeaderSelectDevices": "V\u00e6lg enheder",
+    "ButtonCancelItem": "Annuller genstand",
+    "ButtonQueueForRetry": "S\u00e6t et nyt fors\u00f8g i k\u00f8",
+    "ButtonReenable": "Genaktiver",
     "ButtonLearnMore": "L\u00e6r mere",
-    "SyncJobItemStatusSyncedMarkForRemoval": "Marked for removal",
-    "LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
-    "LabelScheduledTaskLastRan": "Last ran {0}, taking {1}.",
-    "HeaderDeleteTaskTrigger": "Delete Task Trigger",
+    "SyncJobItemStatusSyncedMarkForRemoval": "Markeret til sletning",
+    "LabelAbortedByServerShutdown": "(Annulleret grundet server nedlukning)",
+    "LabelScheduledTaskLastRan": "Sidst k\u00f8rt {0}, og tog {1}.",
+    "HeaderDeleteTaskTrigger": "Slet Task Trigger",
     "HeaderTaskTriggers": "Task Triggers",
-    "MessageDeleteTaskTrigger": "Are you sure you wish to delete this task trigger?",
-    "MessageNoPluginsInstalled": "You have no plugins installed.",
-    "LabelVersionInstalled": "{0} installed",
-    "LabelNumberReviews": "{0} Reviews",
-    "LabelFree": "Free",
-    "HeaderPlaybackError": "Playback Error",
-    "MessagePlaybackErrorNotAllowed": "You're currently not authorized to play this content. Please contact your system administrator for details.",
-    "MessagePlaybackErrorNoCompatibleStream": "No compatible streams are currently available. Please try again later or contact your system administrator for details.",
-    "MessagePlaybackErrorRateLimitExceeded": "Your playback rate limit has been exceeded. Please contact your system administrator for details.",
-    "MessagePlaybackErrorPlaceHolder": "The content chosen is not playable from this device.",
-    "HeaderSelectAudio": "Select Audio",
-    "HeaderSelectSubtitles": "Select Subtitles",
-    "ButtonMarkForRemoval": "Remove from device",
-    "ButtonUnmarkForRemoval": "Cancel removal from device",
-    "LabelDefaultStream": "(Default)",
-    "LabelForcedStream": "(Forced)",
-    "LabelDefaultForcedStream": "(Default\/Forced)",
-    "LabelUnknownLanguage": "Unknown language",
-    "MessageConfirmSyncJobItemCancellation": "Are you sure you wish to cancel this item?",
+    "MessageDeleteTaskTrigger": "Er du sikker p\u00e5 du \u00f8nsker at slette denne task trigger?",
+    "MessageNoPluginsInstalled": "Du har ingen plugins installeret.",
+    "LabelVersionInstalled": "{0} installeret",
+    "LabelNumberReviews": "{0} Anmeldelser",
+    "LabelFree": "Gratis",
+    "HeaderPlaybackError": "Fejl i afspilning",
+    "MessagePlaybackErrorNotAllowed": "Du er p\u00e5 nuv\u00e6rende tidspunkt ikke autoriseret til at afspille dette indhold. Kontakt venligst din systemadministrator for flere detaljer.",
+    "MessagePlaybackErrorNoCompatibleStream": "Ingen kompatible streams er tilg\u00e6ngelige p\u00e5 nuv\u00e6rende tidspunkt. Pr\u00f8v igen senere eller kontakt din systemadministrator for flere detaljer.",
+    "MessagePlaybackErrorRateLimitExceeded": "Din afspilningskvote er blevet overskredet. Kontakt venligst din systemadministrator for flere detaljer.",
+    "MessagePlaybackErrorPlaceHolder": "Det valgte indhold kan ikke afspilles fra denne enhed.",
+    "HeaderSelectAudio": "V\u00e6lg lydspor",
+    "HeaderSelectSubtitles": "V\u00e6lg undertekster",
+    "ButtonMarkForRemoval": "Fjern fra enhed",
+    "ButtonUnmarkForRemoval": "Annuller fjernelse fra enhed",
+    "LabelDefaultStream": "(Standard)",
+    "LabelForcedStream": "(Tvungen)",
+    "LabelDefaultForcedStream": "(Standard\/Tvungen)",
+    "LabelUnknownLanguage": "Ukendt sprog",
+    "MessageConfirmSyncJobItemCancellation": "Er du sikker p\u00e5 du \u00f8nsker at annullere denne genstand?",
     "ButtonMute": "Lyd fra",
-    "ButtonUnmute": "Unmute",
+    "ButtonUnmute": "Sl\u00e5 lyd til",
     "ButtonStop": "Stop",
     "ButtonNextTrack": "N\u00e6ste spor",
     "ButtonPause": "Pause",
     "ButtonPlay": "Afspil",
     "ButtonEdit": "Rediger",
-    "ButtonQueue": "Queue",
+    "ButtonQueue": "K\u00f8",
     "ButtonPlayTrailer": "Afspil trailer",
-    "ButtonPlaylist": "Playlist",
+    "ButtonPlaylist": "Afspilningsliste",
     "ButtonPreviousTrack": "Forrige spor",
-    "LabelEnabled": "Enabled",
-    "LabelDisabled": "Disabled",
-    "ButtonMoreInformation": "More Information",
-    "LabelNoUnreadNotifications": "No unread notifications.",
-    "ButtonViewNotifications": "View notifications",
-    "ButtonMarkTheseRead": "Mark these read",
+    "LabelEnabled": "Sl\u00e5et til",
+    "LabelDisabled": "Sl\u00e5et fra",
+    "ButtonMoreInformation": "Mere information",
+    "LabelNoUnreadNotifications": "Ingen ul\u00e6ste notifikationer",
+    "ButtonViewNotifications": "Se notifikationer",
+    "ButtonMarkTheseRead": "Marker disse som l\u00e6st",
     "ButtonClose": "Luk",
-    "LabelAllPlaysSentToPlayer": "All plays will be sent to the selected player.",
-    "MessageInvalidUser": "Invalid username or password. Please try again.",
-    "HeaderLoginFailure": "Login Failure",
+    "LabelAllPlaysSentToPlayer": "Alle afspilninger vil blive sendt til den valgte afspiller.",
+    "MessageInvalidUser": "Ukendt brugernavn eller adgangskode. Pr\u00f8v igen.",
+    "HeaderLoginFailure": "Login fejl",
     "HeaderAllRecordings": "Alle optagelser",
-    "RecommendationBecauseYouLike": "Because you like {0}",
-    "RecommendationBecauseYouWatched": "Because you watched {0}",
-    "RecommendationDirectedBy": "Directed by {0}",
-    "RecommendationStarring": "Starring {0}",
-    "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation",
-    "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?",
-    "MessageRecordingCancelled": "Recording cancelled.",
-    "HeaderConfirmSeriesCancellation": "Confirm Series Cancellation",
-    "MessageConfirmSeriesCancellation": "Are you sure you wish to cancel this series?",
-    "MessageSeriesCancelled": "Series cancelled.",
-    "HeaderConfirmRecordingDeletion": "Confirm Recording Deletion",
-    "MessageConfirmRecordingDeletion": "Are you sure you wish to delete this recording?",
-    "MessageRecordingDeleted": "Recording deleted.",
-    "ButonCancelRecording": "Cancel Recording",
-    "MessageRecordingSaved": "Recording saved.",
+    "RecommendationBecauseYouLike": "Fordi du kan lide {0}",
+    "RecommendationBecauseYouWatched": "Fordi du har set {0}",
+    "RecommendationDirectedBy": "Instrueret af {0}",
+    "RecommendationStarring": "Hovedrolleindehavere {0}",
+    "HeaderConfirmRecordingCancellation": "Bekr\u00e6ft annullering af optagelse",
+    "MessageConfirmRecordingCancellation": "Er du sikker p\u00e5 du \u00f8nsker at annullere denne optagelse?",
+    "MessageRecordingCancelled": "Optagelse annulleret.",
+    "HeaderConfirmSeriesCancellation": "Bekr\u00e6ft annullering af serie",
+    "MessageConfirmSeriesCancellation": "Er du sikker p\u00e5 du \u00f8nsker at annullere denne serie?",
+    "MessageSeriesCancelled": "Serie annulleret.",
+    "HeaderConfirmRecordingDeletion": "Bekr\u00e6ft sletning af optagelse",
+    "MessageConfirmRecordingDeletion": "Er du sikker p\u00e5 du \u00f8nsker at slette denne optagelse?",
+    "MessageRecordingDeleted": "Optagelse slettet.",
+    "ButonCancelRecording": "Annuller optagelse",
+    "MessageRecordingSaved": "Optagelse gemt.",
     "OptionSunday": "S\u00f8ndag",
     "OptionMonday": "Mandag",
     "OptionTuesday": "Tirsdag",
@@ -180,332 +181,332 @@
     "OptionFriday": "Fredag",
     "OptionSaturday": "L\u00f8rdag",
     "OptionEveryday": "Hver dag",
-    "OptionWeekend": "Weekends",
-    "OptionWeekday": "Weekdays",
+    "OptionWeekend": "Weekender",
+    "OptionWeekday": "Hverdage",
     "HeaderConfirmDeletion": "Bekr\u00e6ft sletning",
-    "MessageConfirmPathSubstitutionDeletion": "Are you sure you wish to delete this path substitution?",
-    "LiveTvUpdateAvailable": "(Update available)",
-    "LabelVersionUpToDate": "Up to date!",
+    "MessageConfirmPathSubstitutionDeletion": "Er du sikker p\u00e5 du \u00f8nsker at slette denne stisubstitution?",
+    "LiveTvUpdateAvailable": "(Opdatering tilg\u00e6ngelig)",
+    "LabelVersionUpToDate": "Opdateret!",
     "ButtonResetTuner": "Reset tuner",
-    "HeaderResetTuner": "Reset Tuner",
-    "MessageConfirmResetTuner": "Are you sure you wish to reset this tuner? Any active players or recordings will be abruptly stopped.",
-    "ButtonCancelSeries": "Cancel Series",
-    "HeaderSeriesRecordings": "Series Recordings",
-    "LabelAnytime": "Any time",
-    "StatusRecording": "Recording",
-    "StatusWatching": "Watching",
-    "StatusRecordingProgram": "Recording {0}",
-    "StatusWatchingProgram": "Watching {0}",
-    "HeaderSplitMedia": "Split Media Apart",
-    "MessageConfirmSplitMedia": "Are you sure you wish to split the media sources into separate items?",
-    "HeaderError": "Error",
-    "MessageChromecastConnectionError": "Your Chromecast receiver is unable to connect to your Emby Server. Please check their connections and try again.",
-    "MessagePleaseSelectOneItem": "Please select at least one item.",
-    "MessagePleaseSelectTwoItems": "Please select at least two items.",
-    "MessageTheFollowingItemsWillBeGrouped": "The following titles will be grouped into one item:",
-    "MessageConfirmItemGrouping": "Emby apps will automatically choose the optimal version to play based on device and network performance. Are you sure you wish to continue?",
+    "HeaderResetTuner": "Reset tuner",
+    "MessageConfirmResetTuner": "Er du sikker p\u00e5 du \u00f8nsker at resette denne tuner? Alle aktive afspilninger eller optagelser vil stoppe pludseligt.",
+    "ButtonCancelSeries": "Annuller serie",
+    "HeaderSeriesRecordings": "Serieoptagelser",
+    "LabelAnytime": "Alle tidspunkter",
+    "StatusRecording": "Optagelse",
+    "StatusWatching": "Ser",
+    "StatusRecordingProgram": "Optager {0}",
+    "StatusWatchingProgram": "Ser {0}",
+    "HeaderSplitMedia": "Opsplit medie",
+    "MessageConfirmSplitMedia": "Er du sikker p\u00e5 du \u00f8nsker at opsplitte mediekilderne til separate klilder?",
+    "HeaderError": "Fejl",
+    "MessageChromecastConnectionError": "Din Chromecast modtager kan ikke forbinde til din Emby Server. Tjek venligst deres forbindelse og pr\u00f8v igen.",
+    "MessagePleaseSelectOneItem": "V\u00e6lg venligst mindst \u00e9t element.",
+    "MessagePleaseSelectTwoItems": "V\u00e6lg venligst mindst to elementer.",
+    "MessageTheFollowingItemsWillBeGrouped": "F\u00f8lgende elementer vil blive grupperet til et element:",
+    "MessageConfirmItemGrouping": "Emby apps vil automatisk fors\u00f8ge at afspille den optimale version baseret p\u00e5 enheden og netv\u00e6rksydelse. Er du sikker p\u00e5 du \u00f8nsker at forts\u00e6tte?",
     "HeaderResume": "Fors\u00e6t",
     "HeaderMyViews": "Mine visninger",
-    "HeaderLibraryFolders": "Media Folders",
+    "HeaderLibraryFolders": "Mediemapper",
     "HeaderLatestMedia": "Seneste medier",
     "ButtonMoreItems": "Mere...",
     "ButtonMore": "Mere",
-    "HeaderFavoriteMovies": "Favorite Movies",
-    "HeaderFavoriteShows": "Favorite Shows",
-    "HeaderFavoriteEpisodes": "Favorite Episodes",
-    "HeaderFavoriteGames": "Favorite Games",
-    "HeaderRatingsDownloads": "Rating \/ Downloads",
-    "HeaderConfirmProfileDeletion": "Confirm Profile Deletion",
-    "MessageConfirmProfileDeletion": "Are you sure you wish to delete this profile?",
-    "HeaderSelectServerCachePath": "Select Server Cache Path",
-    "HeaderSelectTranscodingPath": "Select Transcoding Temporary Path",
-    "HeaderSelectImagesByNamePath": "Select Images By Name Path",
-    "HeaderSelectMetadataPath": "Select Metadata Path",
-    "HeaderSelectServerCachePathHelp": "Browse or enter the path to use for server cache files. The folder must be writeable.",
-    "HeaderSelectTranscodingPathHelp": "Browse or enter the path to use for transcoding temporary files. The folder must be writeable.",
-    "HeaderSelectImagesByNamePathHelp": "Browse or enter the path to your items by name folder. The folder must be writeable.",
-    "HeaderSelectMetadataPathHelp": "Browse or enter the path you'd like to store metadata within. The folder must be writeable.",
-    "HeaderSelectChannelDownloadPath": "Select Channel Download Path",
-    "HeaderSelectChannelDownloadPathHelp": "Browse or enter the path to use for storing channel cache files. The folder must be writeable.",
-    "OptionNewCollection": "New...",
+    "HeaderFavoriteMovies": "Favorit film",
+    "HeaderFavoriteShows": "Favorit serier",
+    "HeaderFavoriteEpisodes": "Favorit episoder",
+    "HeaderFavoriteGames": "Favorit spil",
+    "HeaderRatingsDownloads": "Bed\u00f8mmelser \/ Downloads",
+    "HeaderConfirmProfileDeletion": "Bekr\u00e6ft sletning af profil",
+    "MessageConfirmProfileDeletion": "Er du sikker p\u00e5 du \u00f8nsker at slette denne profil?",
+    "HeaderSelectServerCachePath": "V\u00e6lg \"Server Cache Path\"",
+    "HeaderSelectTranscodingPath": "V\u00e6lg \"Transcoding Temporary Path\"",
+    "HeaderSelectImagesByNamePath": "V\u00e6lg billeder efter navn-sti:",
+    "HeaderSelectMetadataPath": "V\u00e6lg Metadata Path",
+    "HeaderSelectServerCachePathHelp": "V\u00e6lg eller indtast stien som skal benyttes til serverens cache filer. Mappen m\u00e5 ikke v\u00e6re skrivebeskyttet.",
+    "HeaderSelectTranscodingPathHelp": "V\u00e6lg eller indtast stien som skal benyttes til midlertidige transkodningsfiler. Mappen m\u00e5 ikke v\u00e6re skrivebeskyttet.",
+    "HeaderSelectImagesByNamePathHelp": "V\u00e6lg eller indtast stien som f\u00f8rer til mappen med dine elmenter per navn. Mappen m\u00e5 ikke v\u00e6re skrivebeskyttet.",
+    "HeaderSelectMetadataPathHelp": "V\u00e6lg eller indtast stien for hvor du \u00f8nsker at gemme din metadata. Mappen m\u00e5 ikke v\u00e6re skrivebeskyttet.",
+    "HeaderSelectChannelDownloadPath": "V\u00e6lg sti for hentning af kanalindhold",
+    "HeaderSelectChannelDownloadPathHelp": "V\u00e6lg eller indtast stien for hvor du \u00f8nsker at gemme kanalindholds cache filer. Mappen m\u00e5 ikke v\u00e6re skrivebeskyttet.",
+    "OptionNewCollection": "Ny...",
     "ButtonAdd": "Tilf\u00f8j",
     "ButtonRemove": "Fjern",
-    "LabelChapterDownloaders": "Chapter downloaders:",
-    "LabelChapterDownloadersHelp": "Enable and rank your preferred chapter downloaders in order of priority. Lower priority downloaders will only be used to fill in missing information.",
-    "HeaderFavoriteAlbums": "Favorite Albums",
-    "HeaderLatestChannelMedia": "Latest Channel Items",
-    "ButtonOrganizeFile": "Organize File",
-    "ButtonDeleteFile": "Delete File",
-    "HeaderOrganizeFile": "Organize File",
-    "HeaderDeleteFile": "Delete File",
-    "StatusSkipped": "Skipped",
-    "StatusFailed": "Failed",
-    "StatusSuccess": "Success",
-    "MessageFileWillBeDeleted": "The following file will be deleted:",
-    "MessageSureYouWishToProceed": "Are you sure you wish to proceed?",
-    "MessageDuplicatesWillBeDeleted": "In addition the following dupliates will be deleted:",
-    "MessageFollowingFileWillBeMovedFrom": "The following file will be moved from:",
-    "MessageDestinationTo": "to:",
-    "HeaderSelectWatchFolder": "Select Watch Folder",
-    "HeaderSelectWatchFolderHelp": "Browse or enter the path to your watch folder. The folder must be writeable.",
-    "OrganizePatternResult": "Result: {0}",
-    "HeaderRestart": "Restart",
-    "HeaderShutdown": "Shutdown",
-    "MessageConfirmRestart": "Are you sure you wish to restart Emby Server?",
-    "MessageConfirmShutdown": "Are you sure you wish to shutdown Emby Server?",
+    "LabelChapterDownloaders": "Kapitel downloadere:",
+    "LabelChapterDownloadersHelp": "Aktiver og ranger dine fortrukne kapitel downloadere i en prioriteret r\u00e6kkef\u00f8lge. Lavt rangerende downloadere bliver kun benyttet til at udfylde manglende information.",
+    "HeaderFavoriteAlbums": "Favoritalbums",
+    "HeaderLatestChannelMedia": "Seneste kanalenheder",
+    "ButtonOrganizeFile": "Organiser fil",
+    "ButtonDeleteFile": "Slet fil",
+    "HeaderOrganizeFile": "Organiser fil",
+    "HeaderDeleteFile": "Slet fil",
+    "StatusSkipped": "Oversprunget",
+    "StatusFailed": "Fejlet",
+    "StatusSuccess": "Succes",
+    "MessageFileWillBeDeleted": "Den f\u00f8lgende fil vil blive slettet:",
+    "MessageSureYouWishToProceed": "\u00d8nsker du at forts\u00e6tte?",
+    "MessageDuplicatesWillBeDeleted": "Derudover vil f\u00f8lgende duplikater blive slettet:",
+    "MessageFollowingFileWillBeMovedFrom": "Den f\u00f8lgende fil vil blive flyttet fra:",
+    "MessageDestinationTo": "til:",
+    "HeaderSelectWatchFolder": "V\u00e6lg en Watch Folder",
+    "HeaderSelectWatchFolderHelp": "V\u00e6lg eller indtast stien til din \"watch folder\". Mappen m\u00e5 ikke v\u00e6re skrivebeskyttet.",
+    "OrganizePatternResult": "Resultat: {0}",
+    "HeaderRestart": "Genstart",
+    "HeaderShutdown": "Luk",
+    "MessageConfirmRestart": "Er du sikker p\u00e5 du \u00f8nsker at genstarte Emby?",
+    "MessageConfirmShutdown": "Er du sikker p\u00e5 du \u00f8nsker at lukke Emby?",
     "ButtonUpdateNow": "Opdater nu",
-    "ValueItemCount": "{0} item",
-    "ValueItemCountPlural": "{0} items",
-    "NewVersionOfSomethingAvailable": "A new version of {0} is available!",
-    "VersionXIsAvailableForDownload": "Version {0} is now available for download.",
+    "ValueItemCount": "{0} elment",
+    "ValueItemCountPlural": "{0} elementer",
+    "NewVersionOfSomethingAvailable": "En ny version af {0} er tilg\u00e6ngelig!",
+    "VersionXIsAvailableForDownload": "Version {0} kan nu downloades.",
     "LabelVersionNumber": "Version {0}",
-    "LabelPlayMethodTranscoding": "Transcoding",
-    "LabelPlayMethodDirectStream": "Direct Streaming",
-    "LabelPlayMethodDirectPlay": "Direct Playing",
-    "LabelAudioCodec": "Audio: {0}",
+    "LabelPlayMethodTranscoding": "Transkoding",
+    "LabelPlayMethodDirectStream": "Direkte streaming",
+    "LabelPlayMethodDirectPlay": "Direkte afspilning",
+    "LabelAudioCodec": "Lyd: {0}",
     "LabelVideoCodec": "Video: {0}",
-    "LabelLocalAccessUrl": "Local access: {0}",
-    "LabelRemoteAccessUrl": "Remote access: {0}",
-    "LabelRunningOnPort": "Running on http port {0}.",
-    "LabelRunningOnPorts": "Running on http port {0}, and https port {1}.",
-    "HeaderLatestFromChannel": "Latest from {0}",
-    "LabelUnknownLanaguage": "Unknown language",
-    "HeaderCurrentSubtitles": "Current Subtitles",
-    "MessageDownloadQueued": "The download has been queued.",
-    "MessageAreYouSureDeleteSubtitles": "Are you sure you wish to delete this subtitle file?",
-    "ButtonRemoteControl": "Remote Control",
-    "HeaderLatestTvRecordings": "Latest Recordings",
+    "LabelLocalAccessUrl": "Lokal adgang: {0}",
+    "LabelRemoteAccessUrl": "Fjernadgang: {0}",
+    "LabelRunningOnPort": "K\u00f8rer p\u00e5 http port {0}.",
+    "LabelRunningOnPorts": "K\u00f8rer p\u00e5 http port {0}, og https port {1}.",
+    "HeaderLatestFromChannel": "Seneste fra {0}",
+    "LabelUnknownLanaguage": "Ukendt sprog",
+    "HeaderCurrentSubtitles": "Nuv\u00e6rende undertekster",
+    "MessageDownloadQueued": "Downloadet er sat i k\u00f8.",
+    "MessageAreYouSureDeleteSubtitles": "Er du sikker p\u00e5 du \u00f8nsker at slette denne undertekstfil?",
+    "ButtonRemoteControl": "Fjernstyring",
+    "HeaderLatestTvRecordings": "Seneste optagelser",
     "ButtonOk": "Ok",
     "ButtonCancel": "Annuller",
     "ButtonRefresh": "Opdater",
-    "LabelCurrentPath": "Current path:",
-    "HeaderSelectMediaPath": "Select Media Path",
-    "HeaderSelectPath": "Select Path",
-    "ButtonNetwork": "Network",
-    "MessageDirectoryPickerInstruction": "Network paths can be entered manually in the event the Network button fails to locate your devices. For example, {0} or {1}.",
+    "LabelCurrentPath": "Nuv\u00e6rende sti:",
+    "HeaderSelectMediaPath": "V\u00e6lg mediesti",
+    "HeaderSelectPath": "V\u00e6lg sti",
+    "ButtonNetwork": "Netv\u00e6rk",
+    "MessageDirectoryPickerInstruction": "Netv\u00e6rksstier kan indtastes manuelt i tilf\u00e6lde af at netv\u00e6rksknappen ikke kan lokalisere dine enheder. Foreksempel, {0} eller {1}.",
     "HeaderMenu": "Menu",
-    "ButtonOpen": "Open",
-    "ButtonOpenInNewTab": "Open in new tab",
-    "ButtonShuffle": "Shuffle",
-    "ButtonInstantMix": "Instant mix",
-    "ButtonResume": "Resume",
+    "ButtonOpen": "\u00c5ben",
+    "ButtonOpenInNewTab": "\u00c5ben i ny fane",
+    "ButtonShuffle": "Bland",
+    "ButtonInstantMix": "Instant Mix",
+    "ButtonResume": "Genoptag",
     "HeaderScenes": "Scener",
-    "HeaderAudioTracks": "Audio Tracks",
-    "HeaderLibraries": "Libraries",
-    "HeaderSubtitles": "Subtitles",
-    "HeaderVideoQuality": "Video Quality",
-    "MessageErrorPlayingVideo": "There was an error playing the video.",
-    "MessageEnsureOpenTuner": "Please ensure there is an open tuner availalble.",
+    "HeaderAudioTracks": "Lydspor",
+    "HeaderLibraries": "Bibliotekter",
+    "HeaderSubtitles": "Undertekster",
+    "HeaderVideoQuality": "Videokvalitet",
+    "MessageErrorPlayingVideo": "Der opstod en fejl under afspilning af videoen.",
+    "MessageEnsureOpenTuner": "Sikre dig at en \u00e5ben tuner er tilg\u00e6ngelig.",
     "ButtonHome": "Hjem",
-    "ButtonDashboard": "Dashboard",
-    "ButtonReports": "Reports",
+    "ButtonDashboard": "Betjeningspanel",
+    "ButtonReports": "Rapporter",
     "ButtonMetadataManager": "Metadata Manager",
-    "HeaderTime": "Time",
+    "HeaderTime": "Tid",
     "HeaderName": "Navn",
     "HeaderAlbum": "Album",
-    "HeaderAlbumArtist": "Album Artist",
+    "HeaderAlbumArtist": "Album kunstner",
     "HeaderArtist": "Artist",
-    "LabelAddedOnDate": "Added {0}",
+    "LabelAddedOnDate": "Tilf\u00f8jet {0}",
     "ButtonStart": "Start",
     "HeaderChannels": "Kanaler",
     "HeaderMediaFolders": "Mediemapper",
-    "HeaderBlockItemsWithNoRating": "Block content with no rating information:",
-    "OptionBlockOthers": "Others",
-    "OptionBlockTvShows": "TV Shows",
-    "OptionBlockTrailers": "Trailers",
-    "OptionBlockMusic": "Music",
-    "OptionBlockMovies": "Movies",
-    "OptionBlockBooks": "Books",
-    "OptionBlockGames": "Games",
-    "OptionBlockLiveTvPrograms": "Live TV Programs",
-    "OptionBlockLiveTvChannels": "Live TV Channels",
-    "OptionBlockChannelContent": "Internet Channel Content",
-    "ButtonRevoke": "Revoke",
-    "MessageConfirmRevokeApiKey": "Are you sure you wish to revoke this api key? The application's connection to Emby Server will be abruptly terminated.",
-    "HeaderConfirmRevokeApiKey": "Revoke Api Key",
-    "ValueContainer": "Container: {0}",
-    "ValueAudioCodec": "Audio Codec: {0}",
+    "HeaderBlockItemsWithNoRating": "Bloker indhold uden bed\u00f8mmelser:",
+    "OptionBlockOthers": "Andre",
+    "OptionBlockTvShows": "TV serier",
+    "OptionBlockTrailers": "Trailere",
+    "OptionBlockMusic": "Musik",
+    "OptionBlockMovies": "Film",
+    "OptionBlockBooks": "B\u00f8ger",
+    "OptionBlockGames": "Spil",
+    "OptionBlockLiveTvPrograms": "Live TV-programmer",
+    "OptionBlockLiveTvChannels": "Live TV-kanaler",
+    "OptionBlockChannelContent": "Internet kanalindhold",
+    "ButtonRevoke": "Invalider",
+    "MessageConfirmRevokeApiKey": "Er du sikker p\u00e5 du \u00f8nsker at invalidere denne api n\u00f8gle? Applikationens forbindelse til Emby vil blive afbrudt \u00f8jeblikkeligt.",
+    "HeaderConfirmRevokeApiKey": "Invalider Api n\u00f8gle",
+    "ValueContainer": "Beholder: {0}",
+    "ValueAudioCodec": "Audio codec: {0}",
     "ValueVideoCodec": "Video Codec: {0}",
     "ValueCodec": "Codec: {0}",
-    "ValueConditions": "Conditions: {0}",
-    "LabelAll": "All",
-    "HeaderDeleteImage": "Delete Image",
-    "MessageFileNotFound": "File not found.",
-    "MessageFileReadError": "An error occurred reading this file.",
-    "ButtonNextPage": "Next Page",
-    "ButtonPreviousPage": "Previous Page",
-    "ButtonMoveLeft": "Move left",
-    "ButtonMoveRight": "Move right",
-    "ButtonBrowseOnlineImages": "Browse online images",
-    "HeaderDeleteItem": "Delete Item",
-    "ConfirmDeleteItem": "Deleting this item will delete it from both the file system and your media library. Are you sure you wish to continue?",
-    "MessagePleaseEnterNameOrId": "Please enter a name or an external Id.",
-    "MessageValueNotCorrect": "The value entered is not correct. Please try again.",
-    "MessageItemSaved": "Item saved.",
-    "MessagePleaseAcceptTermsOfServiceBeforeContinuing": "Please accept the terms of service before continuing.",
+    "ValueConditions": "Forhold: {0}",
+    "LabelAll": "Alle",
+    "HeaderDeleteImage": "Slet billede",
+    "MessageFileNotFound": "Fil blev ikke fundet.",
+    "MessageFileReadError": "Der opstod en fejl i fors\u00f8get p\u00e5 at l\u00e6se filen.",
+    "ButtonNextPage": "N\u00e6ste side",
+    "ButtonPreviousPage": "Forrige side",
+    "ButtonMoveLeft": "Flyt til venstre",
+    "ButtonMoveRight": "Flyt til h\u00f8jre",
+    "ButtonBrowseOnlineImages": "Gennemse online billeder",
+    "HeaderDeleteItem": "Slet element",
+    "ConfirmDeleteItem": "Hvis dette element slettes, fjernes det b\u00e5de fra dit filsystem samt din mediebibliotek. Er du sikker p\u00e5 du \u00f8nsker at forts\u00e6tte?",
+    "MessagePleaseEnterNameOrId": "Indtast venligst et navn eller eksternt Id.",
+    "MessageValueNotCorrect": "Det indtastede v\u00e6rdi er ikke korrekt. Pr\u00f8v igen.",
+    "MessageItemSaved": "Element gemt.",
+    "MessagePleaseAcceptTermsOfServiceBeforeContinuing": "Accepter venligst tjenestevilk\u00e5rene f\u00f8r du forts\u00e6tter.",
     "OptionEnded": "F\u00e6rdig",
     "OptionContinuing": "Fors\u00e6ttes",
     "OptionOff": "Off",
     "OptionOn": "On",
     "ButtonSettings": "Indstillinger",
-    "ButtonUninstall": "Uninstall",
-    "HeaderFields": "Fields",
-    "HeaderFieldsHelp": "Slide a field to 'off' to lock it and prevent it's data from being changed.",
+    "ButtonUninstall": "Afinstaller",
+    "HeaderFields": "Felter",
+    "HeaderFieldsHelp": "\u00c6ndre et felt til \"afbrudt\" for at l\u00e5se det og forhindre dets data i at blive \u00e6ndret.",
     "HeaderLiveTV": "Live TV",
-    "MissingLocalTrailer": "Missing local trailer.",
-    "MissingPrimaryImage": "Missing primary image.",
-    "MissingBackdropImage": "Missing backdrop image.",
-    "MissingLogoImage": "Missing logo image.",
-    "MissingEpisode": "Missing episode.",
-    "OptionScreenshots": "Screenshots",
-    "OptionBackdrops": "Backdrops",
-    "OptionImages": "Images",
-    "OptionKeywords": "Keywords",
+    "MissingLocalTrailer": "Mangler lokal trailer.",
+    "MissingPrimaryImage": "Mangler prim\u00e6rt billede",
+    "MissingBackdropImage": "Mangler baggrundsbillede.",
+    "MissingLogoImage": "Mangler logo.",
+    "MissingEpisode": "Mangler episode.",
+    "OptionScreenshots": "Sk\u00e6rmbilleder",
+    "OptionBackdrops": "Baggrunde",
+    "OptionImages": "Billeder",
+    "OptionKeywords": "N\u00f8gleord",
     "OptionTags": "Tags",
-    "OptionStudios": "Studios",
-    "OptionName": "Name",
-    "OptionOverview": "Overview",
-    "OptionGenres": "Genres",
+    "OptionStudios": "Studier",
+    "OptionName": "Navn",
+    "OptionOverview": "Oversigt",
+    "OptionGenres": "Genrer",
     "OptionParentalRating": "Aldersgr\u00e6nse",
-    "OptionPeople": "People",
+    "OptionPeople": "Personer",
     "OptionRuntime": "Varighed",
-    "OptionProductionLocations": "Production Locations",
-    "OptionBirthLocation": "Birth Location",
-    "LabelAllChannels": "All channels",
-    "LabelLiveProgram": "LIVE",
-    "LabelNewProgram": "NEW",
-    "LabelPremiereProgram": "PREMIERE",
+    "OptionProductionLocations": "Produktionslokationer",
+    "OptionBirthLocation": "F\u00f8dselssted",
+    "LabelAllChannels": "Alle kanaler",
+    "LabelLiveProgram": "DIREKTE",
+    "LabelNewProgram": "NY",
+    "LabelPremiereProgram": "PR\u00c6MIERE",
     "LabelHDProgram": "HD",
-    "HeaderChangeFolderType": "Change Content Type",
-    "HeaderChangeFolderTypeHelp": "To change the type, please remove and rebuild the folder with the new type.",
-    "HeaderAlert": "Alert",
-    "MessagePleaseRestart": "Please restart to finish updating.",
+    "HeaderChangeFolderType": "\u00c6ndre indholdstype",
+    "HeaderChangeFolderTypeHelp": "For at \u00e6ndre typen bedes du fjerne og gendanne mappen med den nye type.",
+    "HeaderAlert": "Advarsel",
+    "MessagePleaseRestart": "Genstart venligst for at afslutte opdateringen.",
     "ButtonRestart": "Genstart",
-    "MessagePleaseRefreshPage": "Please refresh this page to receive new updates from the server.",
-    "ButtonHide": "Hide",
-    "MessageSettingsSaved": "Settings saved.",
-    "ButtonSignOut": "Sign Out",
-    "ButtonMyProfile": "My Profile",
-    "ButtonMyPreferences": "My Preferences",
-    "MessageBrowserDoesNotSupportWebSockets": "This browser does not support web sockets. For a better experience, try a newer browser such as Chrome, Firefox, IE10+, Safari (iOS) or Opera.",
-    "LabelInstallingPackage": "Installing {0}",
-    "LabelPackageInstallCompleted": "{0} installation completed.",
-    "LabelPackageInstallFailed": "{0} installation failed.",
-    "LabelPackageInstallCancelled": "{0} installation cancelled.",
+    "MessagePleaseRefreshPage": "Genindl\u00e6s venligst denne side for at modtage nye opdateringer fra serveren.",
+    "ButtonHide": "Gem",
+    "MessageSettingsSaved": "Indstillinger er gemt.",
+    "ButtonSignOut": "Log af",
+    "ButtonMyProfile": "Min profil",
+    "ButtonMyPreferences": "Mine indstillinger",
+    "MessageBrowserDoesNotSupportWebSockets": "Denne browser underst\u00f8tter ikke \"web sockets\". For en bedre oplevelse benyt da en nyere browser s\u00e5 som Chrome, Firefox, IE10+, Safari (iOS) eller Opera.",
+    "LabelInstallingPackage": "Installerer {0}",
+    "LabelPackageInstallCompleted": "{0} installation udf\u00f8rt.",
+    "LabelPackageInstallFailed": "{0} installationen mislykkedes.",
+    "LabelPackageInstallCancelled": "{0} installation afbrudt.",
     "TabServer": "Server",
     "TabUsers": "Brugere",
-    "TabLibrary": "Library",
+    "TabLibrary": "Bibliotek",
     "TabMetadata": "Metadata",
     "TabDLNA": "DLNA",
     "TabLiveTV": "Live TV",
-    "TabAutoOrganize": "Auto-Organize",
-    "TabPlugins": "Plugins",
+    "TabAutoOrganize": "Organiser automatisk",
+    "TabPlugins": "Tilf\u00f8jelser",
     "TabAdvanced": "Avanceret",
-    "TabHelp": "Help",
+    "TabHelp": "Hj\u00e6lp",
     "TabScheduledTasks": "Planlagte opgaver",
     "ButtonFullscreen": "Fuldsk\u00e6rm",
     "ButtonAudioTracks": "Lydpor",
     "ButtonSubtitles": "Undertekster",
     "ButtonScenes": "Scener",
-    "ButtonQuality": "Quality",
-    "HeaderNotifications": "Notifications",
-    "HeaderSelectPlayer": "Select Player:",
+    "ButtonQuality": "Kvalitet",
+    "HeaderNotifications": "Notifikationer",
+    "HeaderSelectPlayer": "V\u00e6lg afspiller:",
     "ButtonSelect": "V\u00e6lg",
     "ButtonNew": "Ny",
-    "MessageInternetExplorerWebm": "For best results with Internet Explorer please install the WebM playback plugin.",
-    "HeaderVideoError": "Video Error",
+    "MessageInternetExplorerWebm": "For at opn\u00e5 de bedste resultater med Internet Explorer bedes du installere WebM afspilningstilf\u00f8jelsen.",
+    "HeaderVideoError": "Video fejl",
     "ButtonAddToPlaylist": "Tilf\u00f8j til afspilningsliste",
-    "HeaderAddToPlaylist": "Add to Playlist",
+    "HeaderAddToPlaylist": "Tilf\u00f8j til afspilningsliste",
     "LabelName": "Navn:",
     "ButtonSubmit": "Indsend",
-    "LabelSelectPlaylist": "Playlist:",
-    "OptionNewPlaylist": "New playlist...",
+    "LabelSelectPlaylist": "Afspilningsliste:",
+    "OptionNewPlaylist": "Ny afspilningsliste...",
     "MessageAddedToPlaylistSuccess": "Ok",
     "ButtonView": "Visning",
-    "ButtonViewSeriesRecording": "View series recording",
-    "ValueOriginalAirDate": "Original air date: {0}",
-    "ButtonRemoveFromPlaylist": "Remove from playlist",
-    "HeaderSpecials": "Specials",
-    "HeaderTrailers": "Trailers",
-    "HeaderAudio": "Audio",
-    "HeaderResolution": "Resolution",
+    "ButtonViewSeriesRecording": "Vis serieoptagelse",
+    "ValueOriginalAirDate": "Blev sendt f\u00f8rste gang: {0}",
+    "ButtonRemoveFromPlaylist": "Fjer fra afspilningsliste",
+    "HeaderSpecials": "S\u00e6rudsendelser",
+    "HeaderTrailers": "Trailere",
+    "HeaderAudio": "Lyd",
+    "HeaderResolution": "Opl\u00f8sning",
     "HeaderVideo": "Video",
-    "HeaderRuntime": "Runtime",
-    "HeaderCommunityRating": "Community rating",
+    "HeaderRuntime": "Varighed",
+    "HeaderCommunityRating": "F\u00e6llesskabsvurdering",
     "HeaderPasswordReset": "Nulstil adgangskode",
-    "HeaderParentalRating": "Parental rating",
-    "HeaderReleaseDate": "Release date",
-    "HeaderDateAdded": "Date added",
-    "HeaderSeries": "Series",
-    "HeaderSeason": "Season",
-    "HeaderSeasonNumber": "Season number",
-    "HeaderNetwork": "Network",
-    "HeaderYear": "Year",
-    "HeaderGameSystem": "Game system",
-    "HeaderPlayers": "Players",
-    "HeaderEmbeddedImage": "Embedded image",
-    "HeaderTrack": "Track",
-    "HeaderDisc": "Disc",
+    "HeaderParentalRating": "Aldersgr\u00e6nse",
+    "HeaderReleaseDate": "Udgivelsesdato",
+    "HeaderDateAdded": "Dato for tilf\u00f8jelse",
+    "HeaderSeries": "Serier",
+    "HeaderSeason": "S\u00e6son",
+    "HeaderSeasonNumber": "S\u00e6sonnummer",
+    "HeaderNetwork": "Netv\u00e6rk",
+    "HeaderYear": "\u00c5r",
+    "HeaderGameSystem": "Spilsystem",
+    "HeaderPlayers": "Afspillere",
+    "HeaderEmbeddedImage": "Indlejret billede",
+    "HeaderTrack": "Spor",
+    "HeaderDisc": "Disk",
     "OptionMovies": "Film",
-    "OptionCollections": "Collections",
-    "OptionSeries": "Series",
-    "OptionSeasons": "Seasons",
+    "OptionCollections": "Samlinger",
+    "OptionSeries": "Serier",
+    "OptionSeasons": "S\u00e6soner",
     "OptionEpisodes": "Episoder",
-    "OptionGames": "Games",
-    "OptionGameSystems": "Game systems",
-    "OptionMusicArtists": "Music artists",
-    "OptionMusicAlbums": "Music albums",
-    "OptionMusicVideos": "Music videos",
-    "OptionSongs": "Songs",
-    "OptionHomeVideos": "Home videos",
-    "OptionBooks": "Books",
-    "OptionAdultVideos": "Adult videos",
-    "ButtonUp": "Up",
-    "ButtonDown": "Down",
-    "LabelMetadataReaders": "Metadata readers:",
-    "LabelMetadataReadersHelp": "Rank your preferred local metadata sources in order of priority. The first file found will be read.",
-    "LabelMetadataDownloaders": "Metadata downloaders:",
-    "LabelMetadataDownloadersHelp": "Enable and rank your preferred metadata downloaders in order of priority. Lower priority downloaders will only be used to fill in missing information.",
-    "LabelMetadataSavers": "Metadata savers:",
-    "LabelMetadataSaversHelp": "Choose the file formats to save your metadata to.",
-    "LabelImageFetchers": "Image fetchers:",
-    "LabelImageFetchersHelp": "Enable and rank your preferred image fetchers in order of priority.",
-    "ButtonQueueAllFromHere": "Queue all from here",
-    "ButtonPlayAllFromHere": "Play all from here",
+    "OptionGames": "Spil",
+    "OptionGameSystems": "Spilsystemer",
+    "OptionMusicArtists": "Musikartister",
+    "OptionMusicAlbums": "Musikalbummer",
+    "OptionMusicVideos": "Musikvideoer",
+    "OptionSongs": "Sange",
+    "OptionHomeVideos": "Hjemmevideoer",
+    "OptionBooks": "B\u00f8ger",
+    "OptionAdultVideos": "Voksenfilm",
+    "ButtonUp": "Op",
+    "ButtonDown": "Ned",
+    "LabelMetadataReaders": "Metadata afl\u00e6sere:",
+    "LabelMetadataReadersHelp": "Ranger dine fortrukne lokale metadatakilder i prioriteret r\u00e6kkef\u00f8lge. Den f\u00f8rst fundne fil vil blive afl\u00e6st.",
+    "LabelMetadataDownloaders": "Metadata downloadere:",
+    "LabelMetadataDownloadersHelp": "Aktiver og ranger dine fortrukne metadata downloadere i en prioriteret r\u00e6kkef\u00f8lge. Lavt rangerende downloadere bliver kun benyttet til at udfylde manglende information.",
+    "LabelMetadataSavers": "Metadata-gemmer:",
+    "LabelMetadataSaversHelp": "V\u00e6lg de filformater du \u00f8nsker din metadata gemmes som.",
+    "LabelImageFetchers": "Billede-henter:",
+    "LabelImageFetchersHelp": "Aktiver og ranger dine fortrukne billede-hentere i en prioriteret r\u00e6kkef\u00f8lge.",
+    "ButtonQueueAllFromHere": "Set alt her i k\u00f8",
+    "ButtonPlayAllFromHere": "Afspil alt fra her",
     "LabelDynamicExternalId": "{0} Id:",
-    "HeaderIdentify": "Identify Item",
+    "HeaderIdentify": "Identificer genstand",
     "PersonTypePerson": "Person",
-    "LabelTitleDisplayOrder": "Title display order:",
-    "OptionSortName": "Sort name",
+    "LabelTitleDisplayOrder": "Titelvisningsorden:",
+    "OptionSortName": "Sorteringsnavn",
     "OptionReleaseDate": "Udgivelsesdato",
     "LabelSeasonNumber": "S\u00e6sonnummer",
-    "LabelDiscNumber": "Disc number",
-    "LabelParentNumber": "Parent number",
+    "LabelDiscNumber": "Disk nummer",
+    "LabelParentNumber": "Parent nummer",
     "LabelEpisodeNumber": "Episodenummer",
-    "LabelTrackNumber": "Track number:",
-    "LabelNumber": "Number:",
+    "LabelTrackNumber": "Spor nummer:",
+    "LabelNumber": "Nummer:",
     "LabelReleaseDate": "Udgivelsesdato:",
     "LabelEndDate": "Slutdato:",
     "LabelYear": "\u00c5r:",
-    "LabelDateOfBirth": "Date of birth:",
-    "LabelBirthYear": "Birth year:",
-    "LabelBirthDate": "Birth date:",
-    "LabelDeathDate": "Death date:",
-    "HeaderRemoveMediaLocation": "Remove Media Location",
-    "MessageConfirmRemoveMediaLocation": "Are you sure you wish to remove this location?",
-    "HeaderRenameMediaFolder": "Rename Media Folder",
-    "LabelNewName": "New name:",
-    "HeaderAddMediaFolder": "Add Media Folder",
-    "HeaderAddMediaFolderHelp": "Name (Movies, Music, TV, etc):",
-    "HeaderRemoveMediaFolder": "Remove Media Folder",
-    "MessageTheFollowingLocationWillBeRemovedFromLibrary": "The following media locations will be removed from your library:",
-    "MessageAreYouSureYouWishToRemoveMediaFolder": "Are you sure you wish to remove this media folder?",
-    "ButtonRename": "Rename",
-    "ButtonChangeType": "Change type",
-    "HeaderMediaLocations": "Media Locations",
-    "LabelContentTypeValue": "Content type: {0}",
-    "LabelPathSubstitutionHelp": "Optional: Path substitution can map server paths to network shares that clients can access for direct playback.",
-    "FolderTypeUnset": "Unset (mixed content)",
+    "LabelDateOfBirth": "F\u00f8dselsdato:",
+    "LabelBirthYear": "F\u00f8dsels\u00e5r:",
+    "LabelBirthDate": "F\u00f8dselsdato:",
+    "LabelDeathDate": "D\u00f8dsdato:",
+    "HeaderRemoveMediaLocation": "Fjern medielokalisation",
+    "MessageConfirmRemoveMediaLocation": "Er du sikker p\u00e5 du \u00f8nsker at fjerne denne lokalisation?",
+    "HeaderRenameMediaFolder": "Omd\u00f8b mediemappe",
+    "LabelNewName": "Nyt navn:",
+    "HeaderAddMediaFolder": "Tilf\u00f8j mediemappe",
+    "HeaderAddMediaFolderHelp": "Navn (Film, Musik, TV, osv.):",
+    "HeaderRemoveMediaFolder": "Fjern mediemappe",
+    "MessageTheFollowingLocationWillBeRemovedFromLibrary": "F\u00f8lgende medielokationer vil blive fjerne fra dit bibliotek:",
+    "MessageAreYouSureYouWishToRemoveMediaFolder": "Er du sikker p\u00e5 du \u00f8nsker at fjerne denne mediemappe?",
+    "ButtonRename": "Omd\u00f8b",
+    "ButtonChangeType": "\u00c6ndre type",
+    "HeaderMediaLocations": "Medielokationer",
+    "LabelContentTypeValue": "Indholdstype: {0}",
+    "LabelPathSubstitutionHelp": "Valgfri: Stisubstitution kan sammenk\u00e6de serverstier til netv\u00e6rksstier som klienter derved kan tilg\u00e5 for direkte afspilning.",
+    "FolderTypeUnset": "Ikke valgt (blandet indhold)",
     "FolderTypeMovies": "FIlm",
     "FolderTypeMusic": "Musik",
     "FolderTypeAdultVideos": "Voksenfilm",
@@ -523,247 +524,247 @@
     "TabAlbums": "Albums",
     "TabSongs": "Sange",
     "TabMusicVideos": "Musikvideoer",
-    "BirthPlaceValue": "Birth place: {0}",
-    "DeathDateValue": "Died: {0}",
-    "BirthDateValue": "Born: {0}",
-    "HeaderLatestReviews": "Latest Reviews",
-    "HeaderPluginInstallation": "Plugin Installation",
-    "MessageAlreadyInstalled": "This version is already installed.",
-    "ValueReviewCount": "{0} Reviews",
-    "MessageYouHaveVersionInstalled": "You currently have version {0} installed.",
-    "MessageTrialExpired": "The trial period for this feature has expired",
-    "MessageTrialWillExpireIn": "The trial period for this feature will expire in {0} day(s)",
-    "MessageInstallPluginFromApp": "This plugin must be installed from with in the app you intend to use it in.",
-    "ValuePriceUSD": "Price: {0} (USD)",
-    "MessageFeatureIncludedWithSupporter": "You are registered for this feature, and will be able to continue using it with an active supporter membership.",
-    "MessageChangeRecurringPlanConfirm": "After completing this transaction you will need to cancel your previous recurring donation from within your PayPal account. Thank you for supporting Emby.",
-    "MessageSupporterMembershipExpiredOn": "Your supporter membership expired on {0}.",
-    "MessageYouHaveALifetimeMembership": "You have a lifetime supporter membership. You can provide additional donations on a one-time or recurring basis using the options below. Thank you for supporting Emby.",
-    "MessageYouHaveAnActiveRecurringMembership": "You have an active {0} membership. You can upgrade your plan using the options below.",
+    "BirthPlaceValue": "F\u00f8dselssted: {0}",
+    "DeathDateValue": "D\u00f8dsdato: {0}",
+    "BirthDateValue": "F\u00f8dt: {0}",
+    "HeaderLatestReviews": "Seneste anmeldeser",
+    "HeaderPluginInstallation": "Plugin installation",
+    "MessageAlreadyInstalled": "Denne version er allerede installeret.",
+    "ValueReviewCount": "{0} Anmeldelser",
+    "MessageYouHaveVersionInstalled": "Du har version {0} installeret.",
+    "MessageTrialExpired": "Pr\u00f8veperioden for denne funktion er udl\u00f8bet",
+    "MessageTrialWillExpireIn": "Pr\u00f8veperioden for denne funktion udl\u00f8ber om {0} dag(e)",
+    "MessageInstallPluginFromApp": "Dette plugin skal v\u00e6re installeret inde i den app du \u00f8nsker at benytte det fra.",
+    "ValuePriceUSD": "Pris: {0} (USD)",
+    "MessageFeatureIncludedWithSupporter": "Du er registreret til at benytte denne funktion, og kan blive ved med at benytte den under foruds\u00e6tning af et aktivt supporter medlemsskab.",
+    "MessageChangeRecurringPlanConfirm": "Efter denne transaktion er udf\u00f8rt skal du afmelde din tidligere l\u00f8bende donation inde fra din PayPal konto. Tak fordi du st\u00f8tter Emby.",
+    "MessageSupporterMembershipExpiredOn": "Dit supporter medlemskab udl\u00f8b den {0}.",
+    "MessageYouHaveALifetimeMembership": "Du har et livstidsmedlemskab. Du kan give yderligere donationer via en engangsydelse eller p\u00e5 l\u00f8bende basis ved at benytte mulighederne nedenfor. Tak fordi du st\u00f8tter Emby.",
+    "MessageYouHaveAnActiveRecurringMembership": "Du har et aktivt {0} medlemsskab. Du kan opgradere dette via mulighederne nedenfor.",
     "ButtonDelete": "Slet",
-    "HeaderEmbyAccountAdded": "Emby Account Added",
-    "MessageEmbyAccountAdded": "The Emby account has been added to this user.",
-    "MessagePendingEmbyAccountAdded": "The Emby account has been added to this user. An email will be sent to the owner of the account. The invitation will need to be confirmed by clicking a link within the email.",
-    "HeaderEmbyAccountRemoved": "Emby Account Removed",
-    "MessageEmbyAccontRemoved": "The Emby account has been removed from this user.",
-    "TooltipLinkedToEmbyConnect": "Linked to Emby Connect",
-    "HeaderUnrated": "Unrated",
-    "ValueDiscNumber": "Disc {0}",
-    "HeaderUnknownDate": "Unknown Date",
-    "HeaderUnknownYear": "Unknown Year",
+    "HeaderEmbyAccountAdded": "Emby konto tilf\u00f8jet",
+    "MessageEmbyAccountAdded": "Emby kontoen er blevet tilf\u00f8jet til denne bruger.",
+    "MessagePendingEmbyAccountAdded": "Emby kontoen er blevet tilf\u00f8jet denne bruger. En email sendes til ejeren af kontoen. Invitationen skal bekr\u00e6ftes ved at klikke p\u00e5 linket i emailen.",
+    "HeaderEmbyAccountRemoved": "Emby konto fjernet",
+    "MessageEmbyAccontRemoved": "Emby kontoen er blevet fjernet fra denne bruger.",
+    "TooltipLinkedToEmbyConnect": "Koblet til Emby Connect",
+    "HeaderUnrated": "Ingen bed\u00f8mmelse",
+    "ValueDiscNumber": "Disk {0}",
+    "HeaderUnknownDate": "Ukendt dato",
+    "HeaderUnknownYear": "Ukendt \u00e5r",
     "ValueMinutes": "{0} min",
-    "ButtonPlayExternalPlayer": "Play with external player",
-    "HeaderSelectExternalPlayer": "Select External Player",
-    "HeaderExternalPlayerPlayback": "External Player Playback",
-    "ButtonImDone": "I'm Done",
-    "OptionWatched": "Watched",
-    "OptionUnwatched": "Unwatched",
-    "ExternalPlayerPlaystateOptionsHelp": "Specify how you would like to resume playing this video next time.",
-    "LabelMarkAs": "Mark as:",
-    "OptionInProgress": "In-Progress",
-    "LabelResumePoint": "Resume point:",
-    "ValueOneMovie": "1 movie",
-    "ValueMovieCount": "{0} movies",
+    "ButtonPlayExternalPlayer": "Afspil med ekstern afspiller",
+    "HeaderSelectExternalPlayer": "V\u00e6lg ekstern afspiller",
+    "HeaderExternalPlayerPlayback": "Ekstern afspiller afspilning",
+    "ButtonImDone": "Jeg er f\u00e6rdig",
+    "OptionWatched": "Set",
+    "OptionUnwatched": "Ikke set",
+    "ExternalPlayerPlaystateOptionsHelp": "Specificer hvordan du gerne vil genoptage afspilningen af denne video n\u00e6ste gang.",
+    "LabelMarkAs": "Marker som:",
+    "OptionInProgress": "I gang",
+    "LabelResumePoint": "Genoptagelsespunkt:",
+    "ValueOneMovie": "1 film",
+    "ValueMovieCount": "{0} film",
     "ValueOneTrailer": "1 trailer",
-    "ValueTrailerCount": "{0} trailers",
-    "ValueOneSeries": "1 series",
-    "ValueSeriesCount": "{0} series",
+    "ValueTrailerCount": "{0} trailere",
+    "ValueOneSeries": "1 serie",
+    "ValueSeriesCount": "{0} serier",
     "ValueOneEpisode": "1 episode",
-    "ValueEpisodeCount": "{0} episodes",
-    "ValueOneGame": "1 game",
-    "ValueGameCount": "{0} games",
+    "ValueEpisodeCount": "{0} episoder",
+    "ValueOneGame": "1 spil",
+    "ValueGameCount": "{0} spil",
     "ValueOneAlbum": "1 album",
-    "ValueAlbumCount": "{0} albums",
-    "ValueOneSong": "1 song",
-    "ValueSongCount": "{0} songs",
-    "ValueOneMusicVideo": "1 music video",
-    "ValueMusicVideoCount": "{0} music videos",
+    "ValueAlbumCount": "{0} album",
+    "ValueOneSong": "1 sang",
+    "ValueSongCount": "{0} sange",
+    "ValueOneMusicVideo": "1 musikvideo",
+    "ValueMusicVideoCount": "{0} musikvideoer",
     "HeaderOffline": "Offline",
-    "HeaderUnaired": "Unaired",
-    "HeaderMissing": "Missing",
-    "ButtonWebsite": "Website",
-    "TooltipFavorite": "Favorite",
+    "HeaderUnaired": "Ikke sendt",
+    "HeaderMissing": "Mangler",
+    "ButtonWebsite": "Hjemmeside",
+    "TooltipFavorite": "Favorit",
     "TooltipLike": "Like",
     "TooltipDislike": "Dislike",
-    "TooltipPlayed": "Played",
-    "ValueSeriesYearToPresent": "{0}-Present",
-    "ValueAwards": "Awards: {0}",
+    "TooltipPlayed": "Afspillet",
+    "ValueSeriesYearToPresent": "{0}-Nu",
+    "ValueAwards": "Priser: {0}",
     "ValueBudget": "Budget: {0}",
-    "ValueRevenue": "Revenue: {0}",
-    "ValuePremiered": "Premiered {0}",
-    "ValuePremieres": "Premieres {0}",
-    "ValueStudio": "Studio: {0}",
-    "ValueStudios": "Studios: {0}",
+    "ValueRevenue": "Indtjening: {0}",
+    "ValuePremiered": "Pr\u00e6miere {0}",
+    "ValuePremieres": "Pr\u00e6miere {0}",
+    "ValueStudio": "Studie: {0}",
+    "ValueStudios": "Studier: {0}",
     "ValueStatus": "Status: {0}",
     "ValueSpecialEpisodeName": "Special - {0}",
-    "LabelLimit": "Limit:",
+    "LabelLimit": "Gr\u00e6nse:",
     "ValueLinks": "Links: {0}",
     "HeaderPeople": "Mennesker",
-    "HeaderCastAndCrew": "Cast & Crew",
-    "ValueArtist": "Artist: {0}",
-    "ValueArtists": "Artists: {0}",
+    "HeaderCastAndCrew": "Medvirkende",
+    "ValueArtist": "Kunstner: {0}",
+    "ValueArtists": "Kunstnere: {0}",
     "HeaderTags": "Tags",
-    "MediaInfoCameraMake": "Camera make",
-    "MediaInfoCameraModel": "Camera model",
-    "MediaInfoAltitude": "Altitude",
-    "MediaInfoAperture": "Aperture",
-    "MediaInfoExposureTime": "Exposure time",
-    "MediaInfoFocalLength": "Focal length",
-    "MediaInfoOrientation": "Orientation",
-    "MediaInfoIsoSpeedRating": "Iso speed rating",
-    "MediaInfoLatitude": "Latitude",
-    "MediaInfoLongitude": "Longitude",
-    "MediaInfoShutterSpeed": "Shutter speed",
+    "MediaInfoCameraMake": "Kameram\u00e6rke",
+    "MediaInfoCameraModel": "Kameramodel",
+    "MediaInfoAltitude": "H\u00f8jde",
+    "MediaInfoAperture": "Bl\u00e6nde",
+    "MediaInfoExposureTime": "Eksponering",
+    "MediaInfoFocalLength": "Br\u00e6ndvidde",
+    "MediaInfoOrientation": "Orientering",
+    "MediaInfoIsoSpeedRating": "Iso hastigheds rating",
+    "MediaInfoLatitude": "Breddegrad",
+    "MediaInfoLongitude": "H\u00f8jdegrad",
+    "MediaInfoShutterSpeed": "Lukkehastighed",
     "MediaInfoSoftware": "Software",
-    "HeaderIfYouLikeCheckTheseOut": "If you like {0}, check these out...",
+    "HeaderIfYouLikeCheckTheseOut": "Hvis du kan lide {0}, s\u00e5 tjek disse...",
     "HeaderPlotKeywords": "Plot n\u00f8gleord",
-    "HeaderMovies": "Movies",
+    "HeaderMovies": "Film",
     "HeaderAlbums": "Albums",
-    "HeaderGames": "Games",
-    "HeaderBooks": "Books",
+    "HeaderGames": "Spil",
+    "HeaderBooks": "B\u00f8ger",
     "HeaderEpisodes": "Afsnit",
-    "HeaderSeasons": "Seasons",
-    "HeaderTracks": "Tracks",
-    "HeaderItems": "Items",
-    "HeaderOtherItems": "Other Items",
-    "ButtonFullReview": "Full review",
-    "ValueAsRole": "as {0}",
-    "ValueGuestStar": "Guest star",
-    "MediaInfoSize": "Size",
-    "MediaInfoPath": "Path",
+    "HeaderSeasons": "S\u00e6soner",
+    "HeaderTracks": "Spor",
+    "HeaderItems": "Element",
+    "HeaderOtherItems": "Andre elementer",
+    "ButtonFullReview": "Fuld anmeldelse",
+    "ValueAsRole": "som {0}",
+    "ValueGuestStar": "G\u00e6stestjerne",
+    "MediaInfoSize": "St\u00f8rrelse",
+    "MediaInfoPath": "Sti",
     "MediaInfoFormat": "Format",
-    "MediaInfoContainer": "Container",
-    "MediaInfoDefault": "Default",
-    "MediaInfoForced": "Forced",
-    "MediaInfoExternal": "External",
-    "MediaInfoTimestamp": "Timestamp",
-    "MediaInfoPixelFormat": "Pixel format",
-    "MediaInfoBitDepth": "Bit depth",
+    "MediaInfoContainer": "Beholder",
+    "MediaInfoDefault": "Standard",
+    "MediaInfoForced": "Tvungen",
+    "MediaInfoExternal": "Ekstern",
+    "MediaInfoTimestamp": "Tidsstempel",
+    "MediaInfoPixelFormat": "Pixelformat",
+    "MediaInfoBitDepth": "Bit dybde",
     "MediaInfoSampleRate": "Sample rate",
     "MediaInfoBitrate": "Bitrate",
-    "MediaInfoChannels": "Channels",
+    "MediaInfoChannels": "Kanaler",
     "MediaInfoLayout": "Layout",
-    "MediaInfoLanguage": "Language",
+    "MediaInfoLanguage": "Sprog",
     "MediaInfoCodec": "Codec",
-    "MediaInfoProfile": "Profile",
-    "MediaInfoLevel": "Level",
-    "MediaInfoAspectRatio": "Aspect ratio",
-    "MediaInfoResolution": "Resolution",
-    "MediaInfoAnamorphic": "Anamorphic",
+    "MediaInfoProfile": "Profil",
+    "MediaInfoLevel": "Niveau",
+    "MediaInfoAspectRatio": "Formatforhold",
+    "MediaInfoResolution": "Opl\u00f8sning",
+    "MediaInfoAnamorphic": "Anamorfisk",
     "MediaInfoInterlaced": "Interlaced",
     "MediaInfoFramerate": "Framerate",
-    "MediaInfoStreamTypeAudio": "Audio",
+    "MediaInfoStreamTypeAudio": "Lyd",
     "MediaInfoStreamTypeData": "Data",
     "MediaInfoStreamTypeVideo": "Video",
-    "MediaInfoStreamTypeSubtitle": "Subtitle",
-    "MediaInfoStreamTypeEmbeddedImage": "Embedded Image",
+    "MediaInfoStreamTypeSubtitle": "Undertekster",
+    "MediaInfoStreamTypeEmbeddedImage": "Indlejret billede",
     "MediaInfoRefFrames": "Ref frames",
     "TabPlayback": "Afspilning",
     "TabNotifications": "Underretninger",
-    "TabExpert": "Expert",
-    "HeaderSelectCustomIntrosPath": "Select Custom Intros Path",
-    "HeaderRateAndReview": "Rate and Review",
-    "HeaderThankYou": "Thank You",
-    "MessageThankYouForYourReview": "Thank you for your review.",
-    "LabelYourRating": "Your rating:",
-    "LabelFullReview": "Full review:",
-    "LabelShortRatingDescription": "Short rating summary:",
-    "OptionIRecommendThisItem": "I recommend this item",
-    "WebClientTourContent": "View your recently added media, next episodes, and more. The green circles indicate how many unplayed items you have.",
-    "WebClientTourMovies": "Play movies, trailers and more from any device with a web browser",
-    "WebClientTourMouseOver": "Hold the mouse over any poster for quick access to important information",
-    "WebClientTourTapHold": "Tap and hold or right click any poster for a context menu",
-    "WebClientTourMetadataManager": "Click edit to open the metadata manager",
-    "WebClientTourPlaylists": "Easily create playlists and instant mixes, and play them on any device",
-    "WebClientTourCollections": "Create movie collections to group box sets together",
-    "WebClientTourUserPreferences1": "User preferences allow you to customize the way your library is presented in all of your Emby apps",
-    "WebClientTourUserPreferences2": "Configure your audio and subtitle language settings once, for every Emby app",
-    "WebClientTourUserPreferences3": "Design the web client home page to your liking",
-    "WebClientTourUserPreferences4": "Configure backdrops, theme songs and external players",
-    "WebClientTourMobile1": "The web client works great on smartphones and tablets...",
-    "WebClientTourMobile2": "and easily controls other devices and Emby apps",
-    "WebClientTourMySync": "Sync your personal media to your devices for offline viewing.",
-    "MessageEnjoyYourStay": "Enjoy your stay",
-    "DashboardTourDashboard": "The server dashboard allows you to monitor your server and your users. You'll always know who is doing what and where they are.",
-    "DashboardTourHelp": "In-app help provides easy buttons to open wiki pages relating to the on-screen content.",
-    "DashboardTourUsers": "Easily create user accounts for your friends and family, each with their own permissions, library access, parental controls and more.",
-    "DashboardTourCinemaMode": "Cinema mode brings the theater experience straight to your living room with the ability to play trailers and custom intros before the main feature.",
-    "DashboardTourChapters": "Enable chapter image generation for your videos for a more pleasing presentation while viewing.",
-    "DashboardTourSubtitles": "Automatically download subtitles for your videos in any language.",
-    "DashboardTourPlugins": "Install plugins such as internet video channels, live tv, metadata scanners, and more.",
-    "DashboardTourNotifications": "Automatically send notifications of server events to your mobile device, email and more.",
-    "DashboardTourScheduledTasks": "Easily manage long running operations with scheduled tasks. Decide when they run, and how often.",
-    "DashboardTourMobile": "The Emby Server dashboard works great on smartphones and tablets. Manage your server from the palm of your hand anytime, anywhere.",
-    "DashboardTourSync": "Sync your personal media to your devices for offline viewing.",
-    "MessageRefreshQueued": "Refresh queued",
+    "TabExpert": "Ekspert",
+    "HeaderSelectCustomIntrosPath": "V\u00e6lg sti til brugerdefinerede introduktioner",
+    "HeaderRateAndReview": "Bed\u00f8m og anmeld",
+    "HeaderThankYou": "Tak",
+    "MessageThankYouForYourReview": "Tak for din anmeldelse",
+    "LabelYourRating": "Din bed\u00f8mmelse:",
+    "LabelFullReview": "Fuld anmeldelse:",
+    "LabelShortRatingDescription": "Kort bed\u00f8mmelsesresum\u00e9:",
+    "OptionIRecommendThisItem": "Jeg anbefaler dette",
+    "WebClientTourContent": "Se dit seneste tilf\u00f8jet media, kommende episoder samt mere. Den gr\u00f8nne cirkel indikerer hvor mange uafspillet elementer du har.",
+    "WebClientTourMovies": "Afspil film, trailere samt andet fra hvilken som helst enhed med en browser",
+    "WebClientTourMouseOver": "Hold musen over enhver plakat for hurtig adgang til vigtig information",
+    "WebClientTourTapHold": "Tryk og hold eller h\u00f8jreklik p\u00e5 enhver plakat for at \u00e5bne en menu for det valgte element",
+    "WebClientTourMetadataManager": "Klik p\u00e5 rediger for at \u00e5bne metadata manageren",
+    "WebClientTourPlaylists": "Opret afspilningslister og instant mixes, og afspil dem p\u00e5 enhver enhed",
+    "WebClientTourCollections": "Opret filmsamlinger s\u00e5 film kan grupperes sammen",
+    "WebClientTourUserPreferences1": "Brugerindstillinger g\u00f8r det muligt for dig at skr\u00e6ddersy m\u00e5den dit bibliotek pr\u00e6senteres i alle dine Emby apps",
+    "WebClientTourUserPreferences2": "Konfigurer sproget p\u00e5 dine lyd og undertekstindstillinger \u00e9n gang for alle Emby apps",
+    "WebClientTourUserPreferences3": "Design webklient hjemmesiden til din egen smag",
+    "WebClientTourUserPreferences4": "V\u00e6lg baggrunde, temasange og eksterne afspillere",
+    "WebClientTourMobile1": "Webklienten virker perfekt p\u00e5 smartphones og tablets...",
+    "WebClientTourMobile2": "og styr let andre enheder og Emby apps",
+    "WebClientTourMySync": "Synkroniser dine personlige mediefiler til dine enheder s\u00e5 det kan ses offline.",
+    "MessageEnjoyYourStay": "Nyd dit bes\u00f8g",
+    "DashboardTourDashboard": "Betjeningspanelet g\u00f8r det muligt at monitorere din server og dine brugere. Du vil altid v\u00e6re i stand til at vide hvem der g\u00f8r hvad samt hvor de er.",
+    "DashboardTourHelp": "Hj\u00e6lp inde i app'en s\u00f8rger for knapper der let \u00e5bner de wiki-sider der er relateret til hvad der er p\u00e5 din sk\u00e6rm i det \u00f8jeblik.",
+    "DashboardTourUsers": "Opret let brugerkonti til dine venner og familie, hver med deres egne rettigheder, adgang til biblioteket, for\u00e6ldre-indstillinger samt meget mere.",
+    "DashboardTourCinemaMode": "Biograftilstand giver dig biografoplevelsen direkte ind i din stue, med muligheden for at vise trailere og brugerdefinerede introduktioner f\u00f8r hovedfilmen.",
+    "DashboardTourChapters": "Aktiver kapitelbillede-oprettelse for dine videoer for en mere behagelig pr\u00e6sentation mens du afspiller.",
+    "DashboardTourSubtitles": "Download automatisk undertekster til dine videoer in ethvert sprog.",
+    "DashboardTourPlugins": "Installer tilf\u00f8jelser s\u00e5 som internet videokanaler, live tv, metadata skannere samt meget mere.",
+    "DashboardTourNotifications": "Send automatisk notifikationer vedr\u00f8rende serverbegivenheder til dine mobile enheder, din email samt andre tjenester.",
+    "DashboardTourScheduledTasks": "Administrer let processer der l\u00f8ber over l\u00e6ngere tid via planlagte opgaver. Bestem hvorn\u00e5r de udf\u00f8res samt hvor ofte.",
+    "DashboardTourMobile": "Emby betjeningspanelet virker uden problemer p\u00e5 b\u00e5de smartphones og tablets. Kontrol over din server er altid ved dine fingrespidser hvor som helst, n\u00e5r som helst.",
+    "DashboardTourSync": "Synkroniser dine personlige mediefiler til dine enheder s\u00e5 det kan ses offline.",
+    "MessageRefreshQueued": "Opdatering sat i k\u00f8",
     "TabDevices": "Enheder",
-    "TabExtras": "Extras",
-    "DeviceLastUsedByUserName": "Last used by {0}",
-    "HeaderDeleteDevice": "Delete Device",
-    "DeleteDeviceConfirmation": "Are you sure you wish to delete this device? It will reappear the next time a user signs in with it.",
-    "LabelEnableCameraUploadFor": "Enable camera upload for:",
-    "HeaderSelectUploadPath": "Select Upload Path",
-    "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Emby.",
-    "ErrorMessageStartHourGreaterThanEnd": "End time must be greater than the start time.",
-    "ButtonLibraryAccess": "Library access",
-    "ButtonParentalControl": "Parental control",
-    "HeaderInvitationSent": "Invitation Sent",
-    "MessageInvitationSentToUser": "An email has been sent to {0}, inviting them to accept your sharing invitation.",
-    "MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Emby.",
-    "HeaderConnectionFailure": "Connection Failure",
-    "MessageUnableToConnectToServer": "We're unable to connect to the selected server right now. Please ensure it is running and try again.",
-    "ButtonSelectServer": "Select server",
-    "MessagePluginConfigurationRequiresLocalAccess": "To configure this plugin please sign in to your local server directly.",
-    "MessageLoggedOutParentalControl": "Access is currently restricted. Please try again later.",
-    "DefaultErrorMessage": "There was an error processing the request. Please try again later.",
-    "ButtonAccept": "Accept",
-    "ButtonReject": "Reject",
+    "TabExtras": "Ekstra",
+    "DeviceLastUsedByUserName": "Sidst brugt af {0}",
+    "HeaderDeleteDevice": "Slet enhed",
+    "DeleteDeviceConfirmation": "Er du sikker p\u00e5 du \u00f8nsker at slette denne enhed? Den vil dukke op igen n\u00e6ste gang en bruger logger ind med den.",
+    "LabelEnableCameraUploadFor": "Aktiver kamera upload for:",
+    "HeaderSelectUploadPath": "V\u00e6lg upload sti",
+    "LabelEnableCameraUploadForHelp": "Uploads sker automatisk i baggrunden n\u00e5r du er logget p\u00e5 Emby",
+    "ErrorMessageStartHourGreaterThanEnd": "Slut tid skal v\u00e6re st\u00f8rre end start tid.",
+    "ButtonLibraryAccess": "Biblioteksadgang",
+    "ButtonParentalControl": "For\u00e6ldrekontrol",
+    "HeaderInvitationSent": "Invitation sendt",
+    "MessageInvitationSentToUser": "En email er blevet sendt til {0}, hvori de er blevet anmodet om at acceptere din invitation.",
+    "MessageInvitationSentToNewUser": "En email er blevet sendt til {0} med en invitation til at oprette sig hos Emby.",
+    "HeaderConnectionFailure": "Forbindelsesfejl",
+    "MessageUnableToConnectToServer": "Vi kan ikke forbinde til den valgte server p\u00e5 nuv\u00e6rende tidspunkt. Sikrer dig venligst at serveren k\u00f8rer og pr\u00f8v igen.",
+    "ButtonSelectServer": "V\u00e6lg server",
+    "MessagePluginConfigurationRequiresLocalAccess": "For at konfigurerer dette plugin log da venligst direkte ind p\u00e5 din lokale server.",
+    "MessageLoggedOutParentalControl": "Adgang er begr\u00e6nset p\u00e5 nuv\u00e6rende tidspunkt. Pr\u00f8v igen senere.",
+    "DefaultErrorMessage": "Det opstod en fejl ved behandlingen af foresp\u00f8rgslen. Pr\u00f8v igen senere.",
+    "ButtonAccept": "Accepter",
+    "ButtonReject": "Afvis",
     "HeaderForgotPassword": "Glemt adgangskode",
-    "MessageContactAdminToResetPassword": "Please contact your system administrator to reset your password.",
-    "MessageForgotPasswordInNetworkRequired": "Please try again within your home network to initiate the password reset process.",
-    "MessageForgotPasswordFileCreated": "The following file has been created on your server and contains instructions on how to proceed:",
-    "MessageForgotPasswordFileExpiration": "The reset pin will expire at {0}.",
-    "MessageInvalidForgotPasswordPin": "An invalid or expired pin was entered. Please try again.",
-    "MessagePasswordResetForUsers": "Passwords have been removed for the following users:",
-    "HeaderInviteGuest": "Invite Guest",
-    "ButtonLinkMyEmbyAccount": "Link my account now",
-    "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Emby account to this server.",
+    "MessageContactAdminToResetPassword": "Kontakt venligst din systemadministrator for at nulstille din adgangskode.",
+    "MessageForgotPasswordInNetworkRequired": "Pr\u00f8v igen inde i dit hjemmenetv\u00e6rk for at igangs\u00e6tte nulstilling af din adgangskode.",
+    "MessageForgotPasswordFileCreated": "Den f\u00f8lgende fil er blevet oprettet p\u00e5 din server og indeholder instruktioner vedr\u00f8rende hvordan du skal forts\u00e6tte:",
+    "MessageForgotPasswordFileExpiration": "Nulstillings pinkoden udl\u00f8ber {0}.",
+    "MessageInvalidForgotPasswordPin": "En ugyldig eller udl\u00f8bet pinkode blev indtastet. Pr\u00f8v igen.",
+    "MessagePasswordResetForUsers": "Adgangskoder er blevet fjernet fra f\u00f8lgende brugere:",
+    "HeaderInviteGuest": "Inviter g\u00e6st",
+    "ButtonLinkMyEmbyAccount": "Link min konto nu",
+    "MessageConnectAccountRequiredToInviteGuest": "For at invitere g\u00e6ster skal du f\u00f8rst k\u00e6de din Emby konto til denne server.",
     "ButtonSync": "Sync",
-    "SyncMedia": "Sync Media",
-    "HeaderCancelSyncJob": "Cancel Sync",
-    "CancelSyncJobConfirmation": "Cancelling the sync job will remove synced media from the device during the next sync process. Are you sure you wish to proceed?",
+    "SyncMedia": "Synkroniser medier",
+    "HeaderCancelSyncJob": "Afbryd synkronisering",
+    "CancelSyncJobConfirmation": "Afbrydelse af synkroniseringen vil fjerne medier fra enheden under n\u00e6ste synkroniseringsproces. Er du sikker p\u00e5 du \u00f8nsker at forts\u00e6tte?",
     "TabSync": "Sync",
-    "MessagePleaseSelectDeviceToSyncTo": "Please select a device to sync to.",
-    "MessageSyncJobCreated": "Sync job created.",
-    "LabelSyncTo": "Sync to:",
-    "LabelSyncJobName": "Sync job name:",
-    "LabelQuality": "Quality:",
-    "HeaderSettings": "Settings",
-    "OptionAutomaticallySyncNewContent": "Automatically sync new content",
-    "OptionAutomaticallySyncNewContentHelp": "New content added to this category will be automatically synced to the device.",
-    "OptionSyncUnwatchedVideosOnly": "Sync unwatched videos only",
-    "OptionSyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched.",
-    "LabelItemLimit": "Item limit:",
-    "LabelItemLimitHelp": "Optional. Set a limit to the number of items that will be synced.",
-    "MessageBookPluginRequired": "Requires installation of the Bookshelf plugin",
-    "MessageGamePluginRequired": "Requires installation of the GameBrowser plugin",
-    "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.",
-    "SyncJobItemStatusQueued": "Queued",
-    "SyncJobItemStatusConverting": "Converting",
-    "SyncJobItemStatusTransferring": "Transferring",
-    "SyncJobItemStatusSynced": "Synced",
-    "SyncJobItemStatusFailed": "Failed",
-    "SyncJobItemStatusRemovedFromDevice": "Removed from device",
-    "SyncJobItemStatusCancelled": "Cancelled",
-    "LabelProfile": "Profile:",
+    "MessagePleaseSelectDeviceToSyncTo": "V\u00e6lg en enhed at synkroniserer til.",
+    "MessageSyncJobCreated": "Synkroniserings job oprettet",
+    "LabelSyncTo": "Synkroniser til:",
+    "LabelSyncJobName": "Navn til synkroniserings job:",
+    "LabelQuality": "Kvalitet:",
+    "HeaderSettings": "Indstillinger",
+    "OptionAutomaticallySyncNewContent": "Synkroniser automatisk nyt indhold",
+    "OptionAutomaticallySyncNewContentHelp": "Nyt indhold i denne kategori vil automatisk blive synkroniseret til enheden.",
+    "OptionSyncUnwatchedVideosOnly": "Synkroniser kun usete videoer",
+    "OptionSyncUnwatchedVideosOnlyHelp": "Kun usete videoer vil blive synkroniseret, og videoer vil blive fjernet fra enheden n\u00e5r de er blevet set.",
+    "LabelItemLimit": "Maks. filer:",
+    "LabelItemLimitHelp": "Valgfri. S\u00e6t en gr\u00e6nse for antallet af filer der synkroniseres.",
+    "MessageBookPluginRequired": "Kr\u00e6ver installation af Bookshelf tilf\u00f8jelsen",
+    "MessageGamePluginRequired": "Kr\u00e6ver installation af GameBrowser tilf\u00f8jelsen",
+    "MessageUnsetContentHelp": "Indhold vil blive vist som almindelige mapper. For det bedste resultat benyt metadata manageren til at v\u00e6lge indholdstypen i undermapper.",
+    "SyncJobItemStatusQueued": "Sat i k\u00f8",
+    "SyncJobItemStatusConverting": "Konverterer",
+    "SyncJobItemStatusTransferring": "Overf\u00f8rer",
+    "SyncJobItemStatusSynced": "Synkroniseret",
+    "SyncJobItemStatusFailed": "Fejlet",
+    "SyncJobItemStatusRemovedFromDevice": "Fjernet fra enhed",
+    "SyncJobItemStatusCancelled": "Annulleret",
+    "LabelProfile": "Profil:",
     "LabelBitrateMbps": "Bitrate (Mbps):",
-    "EmbyIntroDownloadMessage": "To download and install Emby Server visit {0}.",
-    "ButtonNewServer": "New Server",
+    "EmbyIntroDownloadMessage": "For at downloade og installere Emby bes\u00f8g {0}.",
+    "ButtonNewServer": "Ny server",
     "ButtonSignInWithConnect": "Log ind med Emby Connect",
     "HeaderNewServer": "Ny server",
-    "MyDevice": "My Device",
-    "ButtonRemote": "Remote",
+    "MyDevice": "Min enhed",
+    "ButtonRemote": "Fjernbetjening",
     "TabInfo": "Info",
     "TabCast": "Cast",
-    "TabScenes": "Scenes"
+    "TabScenes": "Scener"
 }

+ 7 - 6
MediaBrowser.Server.Implementations/Localization/JavaScript/de.json

@@ -40,6 +40,7 @@
     "TitleLiveTV": "Live-TV",
     "TitleSync": "Synchronisation",
     "ButtonDonate": "Spenden",
+    "LabelRecurringDonationCanBeCancelledHelp": "Fortlaufende Spenden k\u00f6nnen jederzeit \u00fcber deinen PayPal Account gek\u00fcndigt werden.",
     "HeaderMyMedia": "Meine Medien",
     "TitleNotifications": "Benachrichtigungen",
     "ErrorLaunchingChromecast": "W\u00e4hrend des startens von Chromecast ist ein Fehler aufgetreten. Bitte stelle sicher, dass dein Ger\u00e4te mit dem WLAN verbunden ist.",
@@ -97,7 +98,7 @@
     "HeaderSupporterBenefit": "Eine Unterst\u00fctzer-Mitgliedschaft bietet weitere Funktionen wie z.B. Zugriff auf die Synchronisation, Premium-Plugins, Internet Kan\u00e4le und mehr. {0}Erfahren Sie mehr{1}.",
     "LabelSyncNoTargetsHelp": "Es sieht so aus als w\u00fcrden Sie aktuell keine Apps verwenden, die Synchronisation unterst\u00fctzen.",
     "HeaderWelcomeToProjectServerDashboard": "Willkommen zur Emby Server \u00dcbersicht",
-    "HeaderWelcomeToProjectWebClient": "Welcome to Emby",
+    "HeaderWelcomeToProjectWebClient": "Willkommen zu Emby",
     "ButtonTakeTheTour": "Mache die Tour",
     "HeaderWelcomeBack": "Willkommen zur\u00fcck!",
     "TitlePlugins": "Plugins",
@@ -398,7 +399,7 @@
     "TabMetadata": "Metadata",
     "TabDLNA": "DLNA",
     "TabLiveTV": "Live-TV",
-    "TabAutoOrganize": "Automatische Organisation",
+    "TabAutoOrganize": "Autom.Organisation",
     "TabPlugins": "Plugins",
     "TabAdvanced": "Erweitert",
     "TabHelp": "Hilfe",
@@ -586,7 +587,7 @@
     "TooltipLike": "Like",
     "TooltipDislike": "Dislike",
     "TooltipPlayed": "Gespielt",
-    "ValueSeriesYearToPresent": "{0}-vorhanden",
+    "ValueSeriesYearToPresent": "{0}-heute",
     "ValueAwards": "Auszeichnungen: {0}",
     "ValueBudget": "Budget: {0}",
     "ValueRevenue": "Einnahmen: {0}",
@@ -688,7 +689,7 @@
     "DashboardTourHelp": "Die In-App-Hilfe Schaltfl\u00e4che bietet eine schnelle M\u00f6glichkeit um eine Wiki-Seite zum aktuellen Inhalt zu \u00f6ffnen.",
     "DashboardTourUsers": "Erstelle einfach Benutzeraccounts f\u00fcr Freunde und Familie. Jeder mit seinen individuellen Einstellungen bei Berechtigungen, Blibliothekenzugriff, Kindersicherung und mehr.",
     "DashboardTourCinemaMode": "Der Kino-Modus bringt das Kinoerlebnis direkt in dein Wohnzimmer, mit der F\u00e4higkeit Trailer und benutzerdefinierte Intros vor dem Hauptfilm zu spielen.",
-    "DashboardTourChapters": "Aktiviere die Bildgenerierung f\u00fcr die Kapitel deiner Videos f\u00fcr eine bessere Darstellung w\u00e4hrend des Ansehens.",
+    "DashboardTourChapters": "Aktiviere Kapitel-Bilder Generierung f\u00fcr Videos f\u00fcr eine bessere Darstellung.",
     "DashboardTourSubtitles": "Lade automatisch Untertitel f\u00fcr jede Sprache f\u00fcr deine Videos herunter.",
     "DashboardTourPlugins": "Installiere Plugins wie Internet Videoportale, Live-TV, Metadatenscanner und mehr.",
     "DashboardTourNotifications": "Sende automatisch Benachrichtigungen von Serverereignissen auf dein mobiles Endger\u00e4t, per E-Mail und mehr.",
@@ -764,6 +765,6 @@
     "MyDevice": "Mein Ger\u00e4t",
     "ButtonRemote": "Fernbedienung",
     "TabInfo": "Info",
-    "TabCast": "Cast",
-    "TabScenes": "Scenes"
+    "TabCast": "Darsteller",
+    "TabScenes": "Szenen"
 }

+ 1 - 0
MediaBrowser.Server.Implementations/Localization/JavaScript/el.json

@@ -40,6 +40,7 @@
     "TitleLiveTV": "Live TV",
     "TitleSync": "Sync",
     "ButtonDonate": "Donate",
+    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
     "HeaderMyMedia": "My Media",
     "TitleNotifications": "\u0395\u03b9\u03b4\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03b5\u03b9\u03c2",
     "ErrorLaunchingChromecast": "There was an error launching chromecast. Please ensure your device is connected to your wireless network.",

+ 1 - 0
MediaBrowser.Server.Implementations/Localization/JavaScript/en_GB.json → MediaBrowser.Server.Implementations/Localization/JavaScript/en-GB.json

@@ -40,6 +40,7 @@
     "TitleLiveTV": "Live TV",
     "TitleSync": "Sync",
     "ButtonDonate": "Donate",
+    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
     "HeaderMyMedia": "My Media",
     "TitleNotifications": "Notifications",
     "ErrorLaunchingChromecast": "There was an error launching chromecast. Please ensure your device is connected to your wireless network.",

+ 1 - 0
MediaBrowser.Server.Implementations/Localization/JavaScript/en_US.json → MediaBrowser.Server.Implementations/Localization/JavaScript/en-US.json

@@ -40,6 +40,7 @@
     "TitleLiveTV": "Live TV",
     "TitleSync": "Sync",
     "ButtonDonate": "Donate",
+    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
     "HeaderMyMedia": "My Media",
     "TitleNotifications": "Notifications",
     "ErrorLaunchingChromecast": "There was an error launching chromecast. Please ensure your device is connected to your wireless network.",

+ 5 - 4
MediaBrowser.Server.Implementations/Localization/JavaScript/es_MX.json → MediaBrowser.Server.Implementations/Localization/JavaScript/es-MX.json

@@ -40,6 +40,7 @@
     "TitleLiveTV": "TV en Vivo",
     "TitleSync": "Sinc",
     "ButtonDonate": "Donar",
+    "LabelRecurringDonationCanBeCancelledHelp": "Las donaciones recurrentes pueden ser canceladas en cualquier momento desde su cuenta PayPal.",
     "HeaderMyMedia": "Mis Medios",
     "TitleNotifications": "Notificaciones",
     "ErrorLaunchingChromecast": "Hubo un error iniciando chromecast. Por favor aseg\u00farate de que tu dispositivo este conectado a tu red inalambrica",
@@ -728,13 +729,13 @@
     "HeaderInviteGuest": "Agregar un Invitado",
     "ButtonLinkMyEmbyAccount": "Enlazar mi cuenta ahora",
     "MessageConnectAccountRequiredToInviteGuest": "Para poder enviar invitaciones necesita primero enlazar su cuenta Emby con este servidor.",
-    "ButtonSync": "SInc",
+    "ButtonSync": "Sinc",
     "SyncMedia": "Sincronizar Medios",
     "HeaderCancelSyncJob": "Cancelar Sinc.",
     "CancelSyncJobConfirmation": "Cancelando el trabajo de sincronizaci\u00f3n eliminara los medios sincronizados del dispositivo durante el pr\u00f3ximo proceso de sincronizaci\u00f3n. \u00bfEsta seguro de que desea continuar?",
     "TabSync": "Sinc",
     "MessagePleaseSelectDeviceToSyncTo": "Por favor seleccione un dispositivo con el que desea sincronizar.",
-    "MessageSyncJobCreated": "Trabajo de sinc. creado.",
+    "MessageSyncJobCreated": "Trabajo de sincronizaci\u00f3n creado.",
     "LabelSyncTo": "Sincronizar con:",
     "LabelSyncJobName": "Nombre del trabajo de sinc:",
     "LabelQuality": "Calidad:",
@@ -757,11 +758,11 @@
     "SyncJobItemStatusCancelled": "Cancelado",
     "LabelProfile": "Perf\u00edl:",
     "LabelBitrateMbps": "Tasa de bits (Mbps):",
-    "EmbyIntroDownloadMessage": "Para bajar e instalar el Servidor Emby visite {0}.",
+    "EmbyIntroDownloadMessage": "Para descargar e instalar el Servidor Emby visite {0}.",
     "ButtonNewServer": "Nuevo Servidor",
     "ButtonSignInWithConnect": "Inicie con su cuenta de Emby Connect",
     "HeaderNewServer": "Nuevo Servidor",
-    "MyDevice": "Mi Equipo",
+    "MyDevice": "Mi Dispositivo",
     "ButtonRemote": "Remoto",
     "TabInfo": "Info",
     "TabCast": "Reparto",

+ 1 - 0
MediaBrowser.Server.Implementations/Localization/JavaScript/es_VE.json → MediaBrowser.Server.Implementations/Localization/JavaScript/es-VE.json

@@ -40,6 +40,7 @@
     "TitleLiveTV": "Live TV",
     "TitleSync": "Sync",
     "ButtonDonate": "Donate",
+    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
     "HeaderMyMedia": "My Media",
     "TitleNotifications": "Notifications",
     "ErrorLaunchingChromecast": "There was an error launching chromecast. Please ensure your device is connected to your wireless network.",

+ 1 - 0
MediaBrowser.Server.Implementations/Localization/JavaScript/es.json

@@ -40,6 +40,7 @@
     "TitleLiveTV": "Tv en vivo",
     "TitleSync": "Sync",
     "ButtonDonate": "Donate",
+    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
     "HeaderMyMedia": "My Media",
     "TitleNotifications": "Notificaciones",
     "ErrorLaunchingChromecast": "Ha habido un error al lanzar chromecast. Asegurese que su dispositivo est\u00e1 conectado a su red inal\u00e1mbrica.",

+ 1 - 0
MediaBrowser.Server.Implementations/Localization/JavaScript/fi.json

@@ -40,6 +40,7 @@
     "TitleLiveTV": "Live TV",
     "TitleSync": "Sync",
     "ButtonDonate": "Donate",
+    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
     "HeaderMyMedia": "My Media",
     "TitleNotifications": "Notifications",
     "ErrorLaunchingChromecast": "There was an error launching chromecast. Please ensure your device is connected to your wireless network.",

+ 1 - 0
MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json

@@ -40,6 +40,7 @@
     "TitleLiveTV": "TV en direct",
     "TitleSync": "Sync.",
     "ButtonDonate": "Faire un don",
+    "LabelRecurringDonationCanBeCancelledHelp": "Des donations r\u00e9currentes peuvent \u00eatre annul\u00e9es \u00e0 tout moment depuis votre compte PayPal.",
     "HeaderMyMedia": "Mes medias",
     "TitleNotifications": "Notifications",
     "ErrorLaunchingChromecast": "Une erreur a \u00e9t\u00e9 rencontr\u00e9e lors du lancement de Chromecast. Veuillez vous assurer que votre appareil est bien connect\u00e9 \u00e0 votre r\u00e9seau sans-fil.",

+ 1 - 0
MediaBrowser.Server.Implementations/Localization/JavaScript/he.json

@@ -40,6 +40,7 @@
     "TitleLiveTV": "\u05d8\u05dc\u05d5\u05d5\u05d9\u05d6\u05d9\u05d4 \u05d7\u05d9\u05d9\u05d4",
     "TitleSync": "Sync",
     "ButtonDonate": "Donate",
+    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
     "HeaderMyMedia": "My Media",
     "TitleNotifications": "Notifications",
     "ErrorLaunchingChromecast": "There was an error launching chromecast. Please ensure your device is connected to your wireless network.",

+ 1 - 0
MediaBrowser.Server.Implementations/Localization/JavaScript/hr.json

@@ -40,6 +40,7 @@
     "TitleLiveTV": "TV",
     "TitleSync": "Sync",
     "ButtonDonate": "Donate",
+    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
     "HeaderMyMedia": "My Media",
     "TitleNotifications": "Notifications",
     "ErrorLaunchingChromecast": "There was an error launching chromecast. Please ensure your device is connected to your wireless network.",

+ 1 - 0
MediaBrowser.Server.Implementations/Localization/JavaScript/hu.json

@@ -40,6 +40,7 @@
     "TitleLiveTV": "Live TV",
     "TitleSync": "Sync",
     "ButtonDonate": "Donate",
+    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
     "HeaderMyMedia": "My Media",
     "TitleNotifications": "Notifications",
     "ErrorLaunchingChromecast": "There was an error launching chromecast. Please ensure your device is connected to your wireless network.",

+ 1 - 0
MediaBrowser.Server.Implementations/Localization/JavaScript/it.json

@@ -40,6 +40,7 @@
     "TitleLiveTV": "Tv in diretta",
     "TitleSync": "Sincronizza",
     "ButtonDonate": "Donazione",
+    "LabelRecurringDonationCanBeCancelledHelp": "Donazioni ricorrenti possono essere cancellati in qualsiasi momento dal tuo conto PayPal.",
     "HeaderMyMedia": "I mei media",
     "TitleNotifications": "Notifiche",
     "ErrorLaunchingChromecast": "Si \u00e8 verificato un errore all'avvio di chromecast. Assicurati che il tuo dispositivo sia connesso alla rete wireless.",

+ 1 - 0
MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json

@@ -40,6 +40,7 @@
     "TitleLiveTV": "\u042d\u0444\u0438\u0440\u043b\u0456\u043a \u0422\u0414",
     "TitleSync": "\u04ae\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443",
     "ButtonDonate": "\u049a\u0430\u0439\u044b\u0440\u043c\u0430\u043b\u0430\u0443",
+    "LabelRecurringDonationCanBeCancelledHelp": "\u049a\u0430\u0439\u0442\u0430\u043b\u0430\u043c\u0430 \u049b\u0430\u0439\u044b\u0440\u043c\u0430\u043b\u0434\u044b\u049b\u0442\u0430\u0440 PayPal \u0435\u0441\u0435\u043f \u0448\u043e\u0442\u044b \u0430\u0440\u049b\u044b\u043b\u044b \u04d9\u0440 \u0443\u0430\u049b\u044b\u0442\u0442\u0430 \u0434\u0430 \u0431\u043e\u043b\u0434\u044b\u0440\u044b\u043b\u043c\u0430\u0443\u044b \u043c\u04af\u043c\u043a\u0456\u043d.",
     "HeaderMyMedia": "\u041c\u0435\u043d\u0456\u04a3 \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0456\u043c",
     "TitleNotifications": "\u0425\u0430\u0431\u0430\u0440\u043b\u0430\u043d\u0434\u044b\u0440\u0443\u043b\u0430\u0440",
     "ErrorLaunchingChromecast": "Chromecast \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u044b\u043b\u0443 \u043a\u0435\u0437\u0456\u043d\u0434\u0435 \u049b\u0430\u0442\u0435 \u043e\u0440\u044b\u043d \u0430\u043b\u0434\u044b. \u049a\u04b1\u0440\u044b\u043b\u0493\u044b\u04a3\u044b\u0437 \u0441\u044b\u043c\u0441\u044b\u0437 \u0436\u0435\u043b\u0456\u0433\u0435 \u049b\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u044b\u043d\u0430 \u043a\u04e9\u0437 \u0436\u0435\u0442\u043a\u0456\u0437\u0456\u04a3\u0456\u0437.",

+ 1 - 0
MediaBrowser.Server.Implementations/Localization/JavaScript/ms.json

@@ -40,6 +40,7 @@
     "TitleLiveTV": "Live TV",
     "TitleSync": "Sync",
     "ButtonDonate": "Donate",
+    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
     "HeaderMyMedia": "My Media",
     "TitleNotifications": "Notifications",
     "ErrorLaunchingChromecast": "There was an error launching chromecast. Please ensure your device is connected to your wireless network.",

+ 28 - 27
MediaBrowser.Server.Implementations/Localization/JavaScript/nb.json

@@ -6,8 +6,8 @@
     "Administrator": "Administrator",
     "Password": "Passord",
     "DeleteImage": "Slett bilde",
-    "MessageThankYouForSupporting": "Thank you for supporting Emby.",
-    "MessagePleaseSupportProject": "Please support Emby.",
+    "MessageThankYouForSupporting": "Takk for at du st\u00f8tter Emby.",
+    "MessagePleaseSupportProject": "Vennligst st\u00f8tt Emby.",
     "DeleteImageConfirmation": "Er du sikker p\u00e5 at du vil slette bildet?",
     "FileReadCancelled": "Lesing av filen kansellert.",
     "FileNotFound": "Fil ikke funnet",
@@ -40,24 +40,25 @@
     "TitleLiveTV": "Live TV",
     "TitleSync": "Synk",
     "ButtonDonate": "Don\u00e9r",
-    "HeaderMyMedia": "My Media",
+    "LabelRecurringDonationCanBeCancelledHelp": "Gjentakende donasjoner kan avbrytes n\u00e5r som helst fra din PayPal-konto.",
+    "HeaderMyMedia": "Mine media",
     "TitleNotifications": "Beskjeder",
     "ErrorLaunchingChromecast": "Det var en feil ved start av Chromecast. Vennligst forsikre deg om at enheten har korrekt forbindelse til ditt tr\u00e5dl\u00f8se nettverk.",
     "MessageErrorLoadingSupporterInfo": "There was an error loading supporter information. Please try again later.",
     "MessageLinkYourSupporterKey": "Link your supporter key with up to {0} Emby Connect members to enjoy free access to the following apps:",
-    "HeaderConfirmRemoveUser": "Remove User",
+    "HeaderConfirmRemoveUser": "Fjern bruker",
     "MessageSwipeDownOnRemoteControl": "Welcome to remote control. Select the device to control by clicking the cast icon in the upper right corner. Swipe down anywhere on this screen to go back to where you came from.",
     "MessageConfirmRemoveConnectSupporter": "Are you sure you wish to remove additional supporter benefits from this user?",
     "ValueTimeLimitSingleHour": "Time limit: 1 hour",
     "ValueTimeLimitMultiHour": "Time limit: {0} hours",
     "HeaderUsers": "Brukere",
-    "PluginCategoryGeneral": "General",
-    "PluginCategoryContentProvider": "Content Providers",
-    "PluginCategoryScreenSaver": "Screen Savers",
-    "PluginCategoryTheme": "Themes",
-    "PluginCategorySync": "Sync",
-    "PluginCategorySocialIntegration": "Social Networks",
-    "PluginCategoryNotifications": "Notifications",
+    "PluginCategoryGeneral": "Generelt",
+    "PluginCategoryContentProvider": "Innholdstilbydere",
+    "PluginCategoryScreenSaver": "Skjermspar",
+    "PluginCategoryTheme": "Temaer",
+    "PluginCategorySync": "Synk",
+    "PluginCategorySocialIntegration": "Sosiale nettverk",
+    "PluginCategoryNotifications": "Varslinger",
     "PluginCategoryMetadata": "Metadata",
     "PluginCategoryLiveTV": "Live TV",
     "PluginCategoryChannel": "Channels",
@@ -97,10 +98,10 @@
     "HeaderSupporterBenefit": "St\u00f8ttemedlemskap gir ytterligere fordeler som for eksempel tilgang til synkronisering, premium plugins, internett-kanaler og mer. {0}L\u00e6r mer{1}.",
     "LabelSyncNoTargetsHelp": "Det ser ikke ut til at du har noen applikasjoner som st\u00f8tter synkronisering.",
     "HeaderWelcomeToProjectServerDashboard": "Welcome to the Emby Server Dashboard",
-    "HeaderWelcomeToProjectWebClient": "Welcome to Emby",
+    "HeaderWelcomeToProjectWebClient": "Velkommen til Emby",
     "ButtonTakeTheTour": "Bli med p\u00e5 omvisning",
     "HeaderWelcomeBack": "Velkommen tilbake!",
-    "TitlePlugins": "Plugins",
+    "TitlePlugins": "Programtillegg",
     "ButtonTakeTheTourToSeeWhatsNew": "Ta en titt p\u00e5 hva som er nytt",
     "MessageNoSyncJobsFound": "Ingen synkroniseringsjobber funnet. Opprett en synkroniseringsjobb ved hjelp av Synkroniseringsknappene i biblioteket",
     "HeaderLibraryAccess": "Bibliotek tilgang",
@@ -180,8 +181,8 @@
     "OptionFriday": "Fredag",
     "OptionSaturday": "L\u00f8rdag",
     "OptionEveryday": "Hver dag",
-    "OptionWeekend": "Weekends",
-    "OptionWeekday": "Weekdays",
+    "OptionWeekend": "Helger",
+    "OptionWeekday": "Ukedager",
     "HeaderConfirmDeletion": "Bekreft Kansellering",
     "MessageConfirmPathSubstitutionDeletion": "Er du sikker p\u00e5 at du vil slette sti erstatter?",
     "LiveTvUpdateAvailable": "(Oppdatering tilgjengelig)",
@@ -251,8 +252,8 @@
     "OrganizePatternResult": "Resultat: {0}",
     "HeaderRestart": "Omstart",
     "HeaderShutdown": "Sl\u00e5 Av",
-    "MessageConfirmRestart": "Are you sure you wish to restart Emby Server?",
-    "MessageConfirmShutdown": "Are you sure you wish to shutdown Emby Server?",
+    "MessageConfirmRestart": "Er du sikker p\u00e5 at du vil starte Emby Server p\u00e5 ny?",
+    "MessageConfirmShutdown": "Er du sikker p\u00e5 at du vil avslutte Emby Server",
     "ButtonUpdateNow": "Oppdater N\u00e5",
     "ValueItemCount": "{0} element",
     "ValueItemCountPlural": "{0} elementer",
@@ -541,7 +542,7 @@
     "MessageYouHaveALifetimeMembership": "You have a lifetime supporter membership. You can provide additional donations on a one-time or recurring basis using the options below. Thank you for supporting Emby.",
     "MessageYouHaveAnActiveRecurringMembership": "Du har et aktivt {0} medlemskap. Du kan oppgradere din plan ved hjelp av alternativene nedenfor.",
     "ButtonDelete": "Slett",
-    "HeaderEmbyAccountAdded": "Emby Account Added",
+    "HeaderEmbyAccountAdded": "Emby konto lagt til",
     "MessageEmbyAccountAdded": "The Emby account has been added to this user.",
     "MessagePendingEmbyAccountAdded": "The Emby account has been added to this user. An email will be sent to the owner of the account. The invitation will need to be confirmed by clicking a link within the email.",
     "HeaderEmbyAccountRemoved": "Emby Account Removed",
@@ -726,7 +727,7 @@
     "MessageInvalidForgotPasswordPin": "Ugyldig eller utg\u00e5tt PIN kode angitt. Vennligst pr\u00f8v igjen.",
     "MessagePasswordResetForUsers": "Passordet er fjernet for f\u00f8lgende brukere:",
     "HeaderInviteGuest": "Inviter gjest",
-    "ButtonLinkMyEmbyAccount": "Link my account now",
+    "ButtonLinkMyEmbyAccount": "Link kontoen min n\u00e5",
     "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Emby account to this server.",
     "ButtonSync": "Synk",
     "SyncMedia": "Synkroniser media",
@@ -755,15 +756,15 @@
     "SyncJobItemStatusFailed": "Feilet",
     "SyncJobItemStatusRemovedFromDevice": "Fjernet fra enheten",
     "SyncJobItemStatusCancelled": "Kansellert",
-    "LabelProfile": "Profile:",
+    "LabelProfile": "Profil:",
     "LabelBitrateMbps": "Bitrate (Mbps):",
-    "EmbyIntroDownloadMessage": "To download and install Emby Server visit {0}.",
-    "ButtonNewServer": "New Server",
-    "ButtonSignInWithConnect": "Sign in with Emby Connect",
-    "HeaderNewServer": "New Server",
-    "MyDevice": "My Device",
-    "ButtonRemote": "Remote",
+    "EmbyIntroDownloadMessage": "For \u00e5 laste ned og installere Emby Server bes\u00f8k {0}.",
+    "ButtonNewServer": "Ny server",
+    "ButtonSignInWithConnect": "Logg inn med Emby Connect",
+    "HeaderNewServer": "Ny server",
+    "MyDevice": "Min(e) enhet(er)",
+    "ButtonRemote": "Fjernkont.",
     "TabInfo": "Info",
     "TabCast": "Cast",
-    "TabScenes": "Scenes"
+    "TabScenes": "Scener"
 }

+ 8 - 7
MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json

@@ -40,13 +40,14 @@
     "TitleLiveTV": "Live TV",
     "TitleSync": "Synchroniseer",
     "ButtonDonate": "Doneren",
+    "LabelRecurringDonationCanBeCancelledHelp": "Terugkerende donaties kunnen op elk moment stop gezet worden in uw PayPal account.",
     "HeaderMyMedia": "Mijn media",
     "TitleNotifications": "Meldingen",
     "ErrorLaunchingChromecast": "Er is een fout opgetreden bij het starten van chromecast. Zorg ervoor dat uw apparaat is aangesloten op uw draadloze netwerk.",
     "MessageErrorLoadingSupporterInfo": "Er is een fout opgetreden bij het laden van uw supporter informatie. Probeer het later opnieuw.",
     "MessageLinkYourSupporterKey": "Koppel uw supporters sleutel met maximaal {0} Emby Connect leden om te genieten van gratis toegang tot de volgende apps:",
     "HeaderConfirmRemoveUser": "Gebruiker verwijderen",
-    "MessageSwipeDownOnRemoteControl": "Welcome to remote control. Select the device to control by clicking the cast icon in the upper right corner. Swipe down anywhere on this screen to go back to where you came from.",
+    "MessageSwipeDownOnRemoteControl": "Welkom bij afstandbediening. Selecteer het apparat wat je wilt bedienen door op het icoon rechtsboven te klikken. Swipe ergens op dit scherm naar beneden om terug te gaan.",
     "MessageConfirmRemoveConnectSupporter": "Bent u zeker dat u de extra supporter voordelen van deze gebruiker wilt verwijderen?",
     "ValueTimeLimitSingleHour": "Tijdslimiet: 1 uur",
     "ValueTimeLimitMultiHour": "Tijdslimiet: {0} uren",
@@ -97,7 +98,7 @@
     "HeaderSupporterBenefit": "Een supporter lidmaatschap biedt voordelen zoals toegang tot synchronisatie, premium plug-ins, internet kanalen en meer. {0}Meer weten{1}.",
     "LabelSyncNoTargetsHelp": "Het lijkt erop dat je momenteel geen apps hebt die synchroniseren ondersteunen.",
     "HeaderWelcomeToProjectServerDashboard": "Welkom bij het Emby Server Dashboard",
-    "HeaderWelcomeToProjectWebClient": "Welcome to Emby",
+    "HeaderWelcomeToProjectWebClient": "Welkom bij Emby",
     "ButtonTakeTheTour": "Volg de tour",
     "HeaderWelcomeBack": "Welkom terug!",
     "TitlePlugins": "Plugins",
@@ -757,12 +758,12 @@
     "SyncJobItemStatusCancelled": "Geannuleerd",
     "LabelProfile": "profiel:",
     "LabelBitrateMbps": "Bitrate (Mbps):",
-    "EmbyIntroDownloadMessage": "To download and install Emby Server visit {0}.",
-    "ButtonNewServer": "New Server",
-    "ButtonSignInWithConnect": "Sign in with Emby Connect",
+    "EmbyIntroDownloadMessage": "Ga naar {0} om Emby Server te downloaden en te installeren.",
+    "ButtonNewServer": "Nieuwe server",
+    "ButtonSignInWithConnect": "Aanmelden met Emby Connect",
     "HeaderNewServer": "Nieuwe Server",
-    "MyDevice": "My Device",
-    "ButtonRemote": "Remote",
+    "MyDevice": "Mijn apparaat",
+    "ButtonRemote": "Afstandsbediening",
     "TabInfo": "Info",
     "TabCast": "Cast",
     "TabScenes": "Scenes"

+ 1 - 0
MediaBrowser.Server.Implementations/Localization/JavaScript/pl.json

@@ -40,6 +40,7 @@
     "TitleLiveTV": "Live TV",
     "TitleSync": "Sync",
     "ButtonDonate": "Donate",
+    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
     "HeaderMyMedia": "My Media",
     "TitleNotifications": "Notifications",
     "ErrorLaunchingChromecast": "There was an error launching chromecast. Please ensure your device is connected to your wireless network.",

+ 1 - 0
MediaBrowser.Server.Implementations/Localization/JavaScript/pt_BR.json → MediaBrowser.Server.Implementations/Localization/JavaScript/pt-BR.json

@@ -40,6 +40,7 @@
     "TitleLiveTV": "TV ao Vivo",
     "TitleSync": "Sinc",
     "ButtonDonate": "Doar",
+    "LabelRecurringDonationCanBeCancelledHelp": "Doa\u00e7\u00f5es recorrentes podem ser canceladas a qualquer momento dentro da conta do PayPal.",
     "HeaderMyMedia": "Minha M\u00eddia",
     "TitleNotifications": "Notifica\u00e7\u00f5es",
     "ErrorLaunchingChromecast": "Ocorreu um erro ao iniciar o chromecast. Por favor verifique se seu dispositivo est\u00e1 conectado \u00e0 sua rede sem fio.",

+ 1 - 0
MediaBrowser.Server.Implementations/Localization/JavaScript/pt_PT.json → MediaBrowser.Server.Implementations/Localization/JavaScript/pt-PT.json

@@ -40,6 +40,7 @@
     "TitleLiveTV": "TV ao Vivo",
     "TitleSync": "Sync",
     "ButtonDonate": "Donate",
+    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
     "HeaderMyMedia": "My Media",
     "TitleNotifications": "Notifications",
     "ErrorLaunchingChromecast": "There was an error launching chromecast. Please ensure your device is connected to your wireless network.",

+ 11 - 10
MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json

@@ -40,6 +40,7 @@
     "TitleLiveTV": "\u0422\u0412-\u044d\u0444\u0438\u0440",
     "TitleSync": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f",
     "ButtonDonate": "\u041f\u043e\u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u0442\u044c",
+    "LabelRecurringDonationCanBeCancelledHelp": "\u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u043f\u043e\u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0447\u0435\u0440\u0435\u0437 \u0432\u0430\u0448\u0443 \u0443\u0447\u0451\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c PayPal.",
     "HeaderMyMedia": "\u041c\u043e\u0438 \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0435",
     "TitleNotifications": "\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f",
     "ErrorLaunchingChromecast": "\u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 Chromecast. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0432\u0430\u0448\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u043a \u0431\u0435\u0441\u043f\u0440\u043e\u0432\u043e\u0434\u043d\u043e\u0439 \u0441\u0435\u0442\u0438.",
@@ -303,7 +304,7 @@
     "HeaderTime": "\u0412\u0440\u0435\u043c\u044f",
     "HeaderName": "\u0418\u043c\u044f (\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435)",
     "HeaderAlbum": "\u0410\u043b\u044c\u0431\u043e\u043c",
-    "HeaderAlbumArtist": "\u0410\u043b\u044c\u0431\u043e\u043c\u043d\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c",
+    "HeaderAlbumArtist": "\u0410\u043b\u044c\u0431\u043e\u043c. \u0438\u0441\u043f-\u043b\u044c",
     "HeaderArtist": "\u0418\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c",
     "LabelAddedOnDate": "\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e {0}",
     "ButtonStart": "\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c",
@@ -433,16 +434,16 @@
     "HeaderRuntime": "\u0414\u043b\u0438\u0442.",
     "HeaderCommunityRating": "\u041e\u0431\u0449. \u043e\u0446\u0435\u043d\u043a\u0430",
     "HeaderPasswordReset": "\u0421\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u044f",
-    "HeaderParentalRating": "\u0412\u043e\u0437\u0440. \u043a\u0430\u0442-\u0438\u044f",
+    "HeaderParentalRating": "\u0412\u043e\u0437\u0440. \u043a\u0430\u0442.",
     "HeaderReleaseDate": "\u0414\u0430\u0442\u0430 \u0432\u044b\u043f.",
-    "HeaderDateAdded": "\u0414\u0430\u0442\u0430 \u0434\u043e\u0431-\u0438\u044f",
+    "HeaderDateAdded": "\u0414\u0430\u0442\u0430 \u0434\u043e\u0431.",
     "HeaderSeries": "\u0421\u0435\u0440\u0438\u0430\u043b\u044b",
     "HeaderSeason": "\u0421\u0435\u0437\u043e\u043d",
     "HeaderSeasonNumber": "\u041d\u043e\u043c\u0435\u0440 \u0441\u0435\u0437\u043e\u043d\u0430",
     "HeaderNetwork": "\u0422\u0435\u043b\u0435\u0441\u0435\u0442\u044c",
     "HeaderYear": "\u0413\u043e\u0434",
-    "HeaderGameSystem": "\u0418\u0433\u0440\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430",
-    "HeaderPlayers": "\u041f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0442\u0435\u043b\u0438",
+    "HeaderGameSystem": "\u0418\u0433\u0440. \u0441\u0438\u0441\u0442.",
+    "HeaderPlayers": "\u0418\u0433\u0440\u043e\u043a\u0438",
     "HeaderEmbeddedImage": "\u0412\u043d\u0435\u0434\u0440\u0451\u043d\u043d\u044b\u0439 \u0440\u0438\u0441\u0443\u043d\u043e\u043a",
     "HeaderTrack": "\u0414\u043e\u0440-\u043a\u0430",
     "HeaderDisc": "\u0414\u0438\u0441\u043a",
@@ -586,7 +587,7 @@
     "TooltipLike": "\u041d\u0440\u0430\u0432\u0438\u0442\u0441\u044f",
     "TooltipDislike": "\u041d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f",
     "TooltipPlayed": "\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u043e",
-    "ValueSeriesYearToPresent": "{0} - \u043d\u0430\u0441\u0442. \u0432\u0440\u0435\u043c\u044f",
+    "ValueSeriesYearToPresent": "{0} - \u041d.\u0412.",
     "ValueAwards": "\u041f\u0440\u0438\u0437\u044b: {0}",
     "ValueBudget": "\u0411\u044e\u0434\u0436\u0435\u0442: {0}",
     "ValueRevenue": "\u0412\u044b\u0440\u0443\u0447\u043a\u0430: {0}",
@@ -623,7 +624,7 @@
     "HeaderBooks": "\u041a\u043d\u0438\u0433\u0438",
     "HeaderEpisodes": "\u042d\u043f\u0438\u0437\u043e\u0434\u044b",
     "HeaderSeasons": "\u0421\u0435\u0437\u043e\u043d\u044b",
-    "HeaderTracks": "\u0414\u043e\u0440\u043e\u0436\u043a\u0438",
+    "HeaderTracks": "\u0414\u043e\u0440-\u043a\u0438",
     "HeaderItems": "\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b",
     "HeaderOtherItems": "\u0414\u0440\u0443\u0433\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b",
     "ButtonFullReview": "\u041f\u043e\u043b\u043d\u0430\u044f \u0440\u0435\u0446\u0435\u043d\u0437\u0438\u044f...",
@@ -729,7 +730,7 @@
     "ButtonLinkMyEmbyAccount": "\u0421\u0432\u044f\u0437\u0430\u0442\u044c \u043c\u043e\u044e \u0443\u0447\u0451\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c",
     "MessageConnectAccountRequiredToInviteGuest": "\u0427\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0430\u0442\u044c \u0433\u043e\u0441\u0442\u0435\u0439, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u0432\u0430\u0448\u0443 \u0443\u0447\u0451\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c Emby \u0441 \u0434\u0430\u043d\u043d\u044b\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c.",
     "ButtonSync": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c",
-    "SyncMedia": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f",
+    "SyncMedia": "\u0421\u0438\u043d\u0445\u0440-\u0438\u044f",
     "HeaderCancelSyncJob": "\u041e\u0442\u043c\u0435\u043d\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438",
     "CancelSyncJobConfirmation": "\u041e\u0442\u043c\u0435\u043d\u0430 \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438. \u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c?",
     "TabSync": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f",
@@ -763,7 +764,7 @@
     "HeaderNewServer": "\u041d\u043e\u0432\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440",
     "MyDevice": "\u041c\u043e\u0451 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e",
     "ButtonRemote": "\u041f\u0443\u043b\u044c\u0442...",
-    "TabInfo": "\u041e \u043f\u0440\u043e\u0444\u0438\u043b\u0435",
-    "TabCast": "\u0420\u043e\u043b\u0438",
+    "TabInfo": "\u0418\u043d\u0444\u043e",
+    "TabCast": "\u0423\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438",
     "TabScenes": "\u0421\u0446\u0435\u043d\u044b"
 }

+ 1 - 0
MediaBrowser.Server.Implementations/Localization/JavaScript/sl_SI.json → MediaBrowser.Server.Implementations/Localization/JavaScript/sl-SI.json

@@ -40,6 +40,7 @@
     "TitleLiveTV": "Live TV",
     "TitleSync": "Sync",
     "ButtonDonate": "Donate",
+    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
     "HeaderMyMedia": "My Media",
     "TitleNotifications": "Notifications",
     "ErrorLaunchingChromecast": "There was an error launching chromecast. Please ensure your device is connected to your wireless network.",

+ 1 - 0
MediaBrowser.Server.Implementations/Localization/JavaScript/sv.json

@@ -40,6 +40,7 @@
     "TitleLiveTV": "Live-TV",
     "TitleSync": "Sync",
     "ButtonDonate": "Donera",
+    "LabelRecurringDonationCanBeCancelledHelp": "St\u00e5ende donationer kan avbrytas n\u00e4r som helst via ditt PayPal-konto.",
     "HeaderMyMedia": "My Media",
     "TitleNotifications": "Notifications",
     "ErrorLaunchingChromecast": "Det gick inte att starta Chromecast. Kontrollera att enheten \u00e4r ansluten till det tr\u00e5dl\u00f6sa n\u00e4tverket.",

+ 1 - 0
MediaBrowser.Server.Implementations/Localization/JavaScript/tr.json

@@ -40,6 +40,7 @@
     "TitleLiveTV": "Canl\u0131 TV",
     "TitleSync": "Sync",
     "ButtonDonate": "Donate",
+    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
     "HeaderMyMedia": "My Media",
     "TitleNotifications": "Notifications",
     "ErrorLaunchingChromecast": "There was an error launching chromecast. Please ensure your device is connected to your wireless network.",

+ 1 - 0
MediaBrowser.Server.Implementations/Localization/JavaScript/uk.json

@@ -40,6 +40,7 @@
     "TitleLiveTV": "Live TV",
     "TitleSync": "Sync",
     "ButtonDonate": "Donate",
+    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
     "HeaderMyMedia": "My Media",
     "TitleNotifications": "\u041f\u043e\u0432\u0456\u0434\u043e\u043c\u043b\u0435\u043d\u043d\u044f",
     "ErrorLaunchingChromecast": "There was an error launching chromecast. Please ensure your device is connected to your wireless network.",

+ 1 - 0
MediaBrowser.Server.Implementations/Localization/JavaScript/vi.json

@@ -40,6 +40,7 @@
     "TitleLiveTV": "Live TV",
     "TitleSync": "Sync",
     "ButtonDonate": "Donate",
+    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
     "HeaderMyMedia": "My Media",
     "TitleNotifications": "Notifications",
     "ErrorLaunchingChromecast": "There was an error launching chromecast. Please ensure your device is connected to your wireless network.",

+ 1 - 0
MediaBrowser.Server.Implementations/Localization/JavaScript/zh_CN.json → MediaBrowser.Server.Implementations/Localization/JavaScript/zh-CN.json

@@ -40,6 +40,7 @@
     "TitleLiveTV": "\u7535\u89c6\u76f4\u64ad",
     "TitleSync": "\u540c\u6b65",
     "ButtonDonate": "\u6350\u8d60",
+    "LabelRecurringDonationCanBeCancelledHelp": "\u5728\u60a8\u7684PayPal\u8d26\u6237\u5185\u4efb\u4f55\u65f6\u5019\u90fd\u53ef\u4ee5\u53d6\u6d88\u7ecf\u5e38\u6027\u6350\u8d60\u3002",
     "HeaderMyMedia": "My Media",
     "TitleNotifications": "\u901a\u77e5",
     "ErrorLaunchingChromecast": "\u542f\u52a8chromecast\u9047\u5230\u9519\u8bef\uff0c\u8bf7\u786e\u8ba4\u8bbe\u5907\u5df2\u7ecf\u8fde\u63a5\u5230\u4f60\u7684\u65e0\u7ebf\u7f51\u7edc\u3002",

+ 1 - 0
MediaBrowser.Server.Implementations/Localization/JavaScript/zh_TW.json → MediaBrowser.Server.Implementations/Localization/JavaScript/zh-TW.json

@@ -40,6 +40,7 @@
     "TitleLiveTV": "\u96fb\u8996\u529f\u80fd",
     "TitleSync": "Sync",
     "ButtonDonate": "Donate",
+    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
     "HeaderMyMedia": "My Media",
     "TitleNotifications": "Notifications",
     "ErrorLaunchingChromecast": "There was an error launching chromecast. Please ensure your device is connected to your wireless network.",

+ 1 - 1
MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs

@@ -347,7 +347,7 @@ namespace MediaBrowser.Server.Implementations.Localization
 
             if (parts.Length == 2)
             {
-                culture = parts[0].ToLower() + "_" + parts[1].ToUpper();
+                culture = parts[0].ToLower() + "-" + parts[1].ToUpper();
             }
             else
             {

+ 3 - 9
MediaBrowser.Server.Implementations/Localization/Server/ar.json

@@ -1228,6 +1228,7 @@
     "OptionNoThemeVideo": "No Theme Video",
     "LabelOneTimeDonationAmount": "Donation amount:",
     "ButtonDonate": "Donate",
+    "ButtonPurchase": "Purchase",
     "OptionActor": "Actor",
     "OptionComposer": "Composer",
     "OptionDirector": "Director",
@@ -1247,7 +1248,6 @@
     "HeaderDeveloperInfo": "Developer Info",
     "HeaderRevisionHistory": "Revision History",
     "ButtonViewWebsite": "View website",
-    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
     "HeaderXmlSettings": "Xml Settings",
     "HeaderXmlDocumentAttributes": "Xml Document Attributes",
     "HeaderXmlDocumentAttribute": "Xml Document Attribute",
@@ -1409,13 +1409,6 @@
     "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.",
     "HeaderPlaylists": "Playlists",
     "HeaderSelectDate": "Select Date",
-    "HeaderWelcomeExclamation": "Welcome!",
-    "HeaderMyPreferences": "My Preferences",
-    "ButtonMyPreferencesWelcomeYes": "Yes, I'd like to set my preferences now.",
-    "ButtonMyPreferencesWelcomeNo": "No thanks, I'll do it later.",
-    "MyPreferencesWelcomeMessage1": "We've presented your library in a way we think you'll enjoy. The appearance and grouping of content can be changed anytime by adjusting your preferences. Your preferences will apply to all Emby apps.",
-    "MyPreferencesWelcomeMessage2": "Would you like to set your preferences now?",
-    "ToAccessPreferencesHelp": "To access your preferences later, click your user icon in the top right header and select My Preferences.",
     "HeaderViewStyles": "View Styles",
     "LabelSelectViewStyles": "Enable enhanced presentations for:",
     "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.",
@@ -1438,5 +1431,6 @@
     "OptionReportGrouping": "Grouping",
     "HeaderExport": "Export",
     "HeaderColumns": "Columns",
-    "ButtonReset": "Reset"
+    "ButtonReset": "Reset",
+    "OptionEnableExternalVideoPlayers": "Enable external video players"
 }

+ 3 - 9
MediaBrowser.Server.Implementations/Localization/Server/bg_BG.json → MediaBrowser.Server.Implementations/Localization/Server/bg-BG.json

@@ -1228,6 +1228,7 @@
     "OptionNoThemeVideo": "No Theme Video",
     "LabelOneTimeDonationAmount": "Donation amount:",
     "ButtonDonate": "Donate",
+    "ButtonPurchase": "Purchase",
     "OptionActor": "Actor",
     "OptionComposer": "Composer",
     "OptionDirector": "Director",
@@ -1247,7 +1248,6 @@
     "HeaderDeveloperInfo": "Developer Info",
     "HeaderRevisionHistory": "Revision History",
     "ButtonViewWebsite": "View website",
-    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
     "HeaderXmlSettings": "Xml Settings",
     "HeaderXmlDocumentAttributes": "Xml Document Attributes",
     "HeaderXmlDocumentAttribute": "Xml Document Attribute",
@@ -1409,13 +1409,6 @@
     "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.",
     "HeaderPlaylists": "Playlists",
     "HeaderSelectDate": "Select Date",
-    "HeaderWelcomeExclamation": "Welcome!",
-    "HeaderMyPreferences": "My Preferences",
-    "ButtonMyPreferencesWelcomeYes": "Yes, I'd like to set my preferences now.",
-    "ButtonMyPreferencesWelcomeNo": "No thanks, I'll do it later.",
-    "MyPreferencesWelcomeMessage1": "We've presented your library in a way we think you'll enjoy. The appearance and grouping of content can be changed anytime by adjusting your preferences. Your preferences will apply to all Emby apps.",
-    "MyPreferencesWelcomeMessage2": "Would you like to set your preferences now?",
-    "ToAccessPreferencesHelp": "To access your preferences later, click your user icon in the top right header and select My Preferences.",
     "HeaderViewStyles": "View Styles",
     "LabelSelectViewStyles": "Enable enhanced presentations for:",
     "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.",
@@ -1438,5 +1431,6 @@
     "OptionReportGrouping": "Grouping",
     "HeaderExport": "Export",
     "HeaderColumns": "Columns",
-    "ButtonReset": "Reset"
+    "ButtonReset": "Reset",
+    "OptionEnableExternalVideoPlayers": "Enable external video players"
 }

+ 3 - 9
MediaBrowser.Server.Implementations/Localization/Server/ca.json

@@ -1228,6 +1228,7 @@
     "OptionNoThemeVideo": "No Theme Video",
     "LabelOneTimeDonationAmount": "Donation amount:",
     "ButtonDonate": "Donate",
+    "ButtonPurchase": "Purchase",
     "OptionActor": "Actor",
     "OptionComposer": "Composer",
     "OptionDirector": "Director",
@@ -1247,7 +1248,6 @@
     "HeaderDeveloperInfo": "Developer Info",
     "HeaderRevisionHistory": "Revision History",
     "ButtonViewWebsite": "View website",
-    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
     "HeaderXmlSettings": "Xml Settings",
     "HeaderXmlDocumentAttributes": "Xml Document Attributes",
     "HeaderXmlDocumentAttribute": "Xml Document Attribute",
@@ -1409,13 +1409,6 @@
     "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.",
     "HeaderPlaylists": "Playlists",
     "HeaderSelectDate": "Select Date",
-    "HeaderWelcomeExclamation": "Welcome!",
-    "HeaderMyPreferences": "My Preferences",
-    "ButtonMyPreferencesWelcomeYes": "Yes, I'd like to set my preferences now.",
-    "ButtonMyPreferencesWelcomeNo": "No thanks, I'll do it later.",
-    "MyPreferencesWelcomeMessage1": "We've presented your library in a way we think you'll enjoy. The appearance and grouping of content can be changed anytime by adjusting your preferences. Your preferences will apply to all Emby apps.",
-    "MyPreferencesWelcomeMessage2": "Would you like to set your preferences now?",
-    "ToAccessPreferencesHelp": "To access your preferences later, click your user icon in the top right header and select My Preferences.",
     "HeaderViewStyles": "View Styles",
     "LabelSelectViewStyles": "Enable enhanced presentations for:",
     "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.",
@@ -1438,5 +1431,6 @@
     "OptionReportGrouping": "Grouping",
     "HeaderExport": "Export",
     "HeaderColumns": "Columns",
-    "ButtonReset": "Reset"
+    "ButtonReset": "Reset",
+    "OptionEnableExternalVideoPlayers": "Enable external video players"
 }

+ 3 - 9
MediaBrowser.Server.Implementations/Localization/Server/cs.json

@@ -1228,6 +1228,7 @@
     "OptionNoThemeVideo": "No Theme Video",
     "LabelOneTimeDonationAmount": "Donation amount:",
     "ButtonDonate": "Donate",
+    "ButtonPurchase": "Purchase",
     "OptionActor": "Actor",
     "OptionComposer": "Composer",
     "OptionDirector": "Director",
@@ -1247,7 +1248,6 @@
     "HeaderDeveloperInfo": "Developer Info",
     "HeaderRevisionHistory": "Revision History",
     "ButtonViewWebsite": "View website",
-    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
     "HeaderXmlSettings": "Xml Settings",
     "HeaderXmlDocumentAttributes": "Xml Document Attributes",
     "HeaderXmlDocumentAttribute": "Xml Document Attribute",
@@ -1409,13 +1409,6 @@
     "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.",
     "HeaderPlaylists": "Playlists",
     "HeaderSelectDate": "Select Date",
-    "HeaderWelcomeExclamation": "Welcome!",
-    "HeaderMyPreferences": "My Preferences",
-    "ButtonMyPreferencesWelcomeYes": "Yes, I'd like to set my preferences now.",
-    "ButtonMyPreferencesWelcomeNo": "No thanks, I'll do it later.",
-    "MyPreferencesWelcomeMessage1": "We've presented your library in a way we think you'll enjoy. The appearance and grouping of content can be changed anytime by adjusting your preferences. Your preferences will apply to all Emby apps.",
-    "MyPreferencesWelcomeMessage2": "Would you like to set your preferences now?",
-    "ToAccessPreferencesHelp": "To access your preferences later, click your user icon in the top right header and select My Preferences.",
     "HeaderViewStyles": "View Styles",
     "LabelSelectViewStyles": "Enable enhanced presentations for:",
     "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.",
@@ -1438,5 +1431,6 @@
     "OptionReportGrouping": "Grouping",
     "HeaderExport": "Export",
     "HeaderColumns": "Columns",
-    "ButtonReset": "Reset"
+    "ButtonReset": "Reset",
+    "OptionEnableExternalVideoPlayers": "Enable external video players"
 }

+ 59 - 65
MediaBrowser.Server.Implementations/Localization/Server/da.json

@@ -18,15 +18,15 @@
     "WelcomeToProject": "Velkommen til Emby!",
     "ThisWizardWillGuideYou": "Denne guide vil hj\u00e6lpe dig igennem ops\u00e6tningen. For at begynde, v\u00e6lg venligst dit fortrukne sprog.",
     "TellUsAboutYourself": "Fort\u00e6l os lidt om dig selv",
-    "ButtonQuickStartGuide": "Quick start guide",
+    "ButtonQuickStartGuide": "Hurtig-start guide",
     "LabelYourFirstName": "Dit fornavn",
     "MoreUsersCanBeAddedLater": "Flere brugere kan tilf\u00f8jes senere i betjeningspanelet.",
     "UserProfilesIntro": "Emby har indbygget underst\u00f8ttelse af brugerprofiler. Dette giver hver bruger sine egne indstillinger for visning, afspilningsstatus og for\u00e6ldrekontrol.",
     "LabelWindowsService": "Windows Service",
     "AWindowsServiceHasBeenInstalled": "Der er blevet installeret en Windows Service.",
-    "WindowsServiceIntro1": "Emby Server normally runs as a desktop application with a tray icon, but if you prefer to run it as a background service, it can be started from the windows services control panel instead.",
+    "WindowsServiceIntro1": "Emby Server k\u00f8rer normalt som en desktop applikation med et statusbar ikon, men hvis du \u00f8nsker at k\u00f8rer det som en baggrundsservice kan programmet startes fra windows services kontrolpanel istedet.",
     "WindowsServiceIntro2": "Hvis Windows servicen bruges skal du v\u00e6re opm\u00e6rksom p\u00e5, at servicen ikke kan k\u00f8re p\u00e5 samme tid som bakkeikonet. Det er derfor n\u00f8dvendigt at afslutte bakkeikonet f\u00f8r servicen startes. Det er n\u00f8dvendigt at konfigurere servicen til at k\u00f8re med administrative privileger, som kan g\u00f8res via Windows Service kontrolpanelet. V\u00e6r opm\u00e6rksom p\u00e5 at servicen p\u00e5 nuv\u00e6rende tidspunkt ikke er i stand til at autoopdatere, s\u00e5 opdatering vil kr\u00e6ve manuel handling.",
-    "WizardCompleted": "That's all we need for now. Emby has begun collecting information about your media library. Check out some of our apps, and then click <b>Finish<\/b> to view the <b>Server Dashboard<\/b>.",
+    "WizardCompleted": "Det er alt vi beh\u00f8ver for nu. Emby er begyndt at indsamle information omkring dit mediebibliotek. Tjek nogle af vores apps og klik derefter p\u00e5 <b>F\u00e6rdig<\/b> for at se <b>Server betjeningspanelet<\/b>.",
     "LabelConfigureSettings": "Konfigurer indstillinger",
     "LabelEnableVideoImageExtraction": "Aktiver udtr\u00e6kning af video billede",
     "VideoImageExtractionHelp": "For videoer der ikke allerede har billeder, og som vi ikke kan finde internet billeder til. Dette vil g\u00f8re den indledende biblioteksskanning l\u00e6ngere, men vil resulterer i en p\u00e6nere pr\u00e6sentation.",
@@ -34,23 +34,23 @@
     "LabelChapterImageExtractionForMoviesHelp": "Udtr\u00e6kning af kapitelbilleder lader klienter vise billeder i scenev\u00e6lgeren. Denne proces kan v\u00e6re langsom og processorbelastende, og kan kr\u00e6ve adskillige gigabytes harddiskplads. Processen k\u00f8rer som en natlig planlagt opgave, selv om dette kan \u00e6ndres i planl\u00e6ggeren. Det anbefales ikke at k\u00f8re denne proces  i tidsrum hvor der er brugere p\u00e5 systemet.",
     "LabelEnableAutomaticPortMapping": "Aktiver automatisk port kortl\u00e6gning",
     "LabelEnableAutomaticPortMappingHelp": "UPnP tillader automatisk routerkonfiguration for nem fjernadgang. Dette virker muligvis ikke med alle routere.",
-    "HeaderTermsOfService": "Emby Terms of Service",
-    "MessagePleaseAcceptTermsOfService": "Please accept the terms of service and privacy policy before continuing.",
-    "OptionIAcceptTermsOfService": "I accept the terms of service",
-    "ButtonPrivacyPolicy": "Privacy policy",
-    "ButtonTermsOfService": "Terms of Service",
-    "HeaderDeveloperOptions": "Developer Options",
-    "OptionEnableWebClientResponseCache": "Enable web client response caching",
-    "OptionDisableForDevelopmentHelp": "Configure these as needed for web client development purposes.",
-    "OptionEnableWebClientResourceMinification": "Enable web client resource minification",
-    "LabelDashboardSourcePath": "Web client source path:",
-    "LabelDashboardSourcePathHelp": "If running the server from source, specify the path to the dashboard-ui folder. All web client files will be served from this location.",
+    "HeaderTermsOfService": "Emby tjenestevilk\u00e5r",
+    "MessagePleaseAcceptTermsOfService": "Accepter venligst tjenestevilk\u00e5rene og privatlivspolitikken f\u00f8r du forts\u00e6tter.",
+    "OptionIAcceptTermsOfService": "Jeg accepterer tjenestevilk\u00e5rene",
+    "ButtonPrivacyPolicy": "Privatlivspolitik",
+    "ButtonTermsOfService": "Tjenestevilk\u00e5r",
+    "HeaderDeveloperOptions": "Indstillinger for udviklere",
+    "OptionEnableWebClientResponseCache": "Aktiver webklient svar-caching",
+    "OptionDisableForDevelopmentHelp": "Konfigurer disse som n\u00f8dvendigt for udviklingsform\u00e5l af webklienten",
+    "OptionEnableWebClientResourceMinification": "Aktiver formindskelse af webklientens forbrug af ressourcer",
+    "LabelDashboardSourcePath": "Webklient kildesti:",
+    "LabelDashboardSourcePathHelp": "Hvis serveren k\u00f8rer fra kilden, specificer da stien til dashboard-ui mappen. Alle webklient-filer vil blive leveret fra denne lokation.",
     "ButtonConvertMedia": "Konverter medie",
     "ButtonOrganize": "Organiser",
     "LinkedToEmbyConnect": "Koblet til Emby Connect",
-    "HeaderSupporterBenefits": "Supporter Benefits",
+    "HeaderSupporterBenefits": "Supporter fordele",
     "HeaderAddUser": "Tilf\u00f8j bruger",
-    "LabelAddConnectSupporterHelp": "To add a user who isn't listed, you'll need to first link their account to Emby Connect from their user profile page.",
+    "LabelAddConnectSupporterHelp": "For at tilf\u00f8je en bruger som ikke er angivet skal du f\u00f8rst sammenk\u00e6de deres konto til Emby Connect fra deres brugers profilside.",
     "LabelPinCode": "Pinkode:",
     "OptionHideWatchedContentFromLatestMedia": "Skjul sete fra seneste",
     "HeaderSync": "Sync",
@@ -59,7 +59,7 @@
     "ButtonExit": "Afslut",
     "ButtonNew": "Ny",
     "HeaderTV": "TV",
-    "HeaderAudio": "Audio",
+    "HeaderAudio": "Lyd",
     "HeaderVideo": "Video",
     "HeaderPaths": "Stier",
     "CategorySync": "Sync",
@@ -75,10 +75,10 @@
     "ButtonConfigurePinCode": "Konfigurer pinkode",
     "HeaderAdultsReadHere": "Voksne l\u00e6s her!",
     "RegisterWithPayPal": "Registrer med PayPal",
-    "HeaderSyncRequiresSupporterMembership": "Sync Requires a Supporter Membership",
+    "HeaderSyncRequiresSupporterMembership": "Sync kr\u00e6ver medlemsskab",
     "HeaderEnjoyDayTrial": "Nyd en 14-dages gratis pr\u00f8veperiode",
     "LabelSyncTempPath": "Sti for midlertidige filer:",
-    "LabelSyncTempPathHelp": "Specify a custom sync working folder. Converted media created during the sync process will be stored here.",
+    "LabelSyncTempPathHelp": "Specificer en brugerdefineret synkroniserings arbejds-mappe. Konverterede filer vil under synkroniseringsprocessen blive gemt her.",
     "LabelCustomCertificatePath": "Sti til eget certifikat:",
     "LabelCustomCertificatePathHelp": "Angiv dit eget ssl certifikat som .pfx fil. Hvis du undlader dette, danner serveren et selvsigneret certifikat.",
     "TitleNotifications": "Underretninger",
@@ -90,7 +90,7 @@
     "LabelEnableEnhancedMovies": "Aktiver udvidede filmvisninger",
     "LabelEnableEnhancedMoviesHelp": "Aktiver dette for at f\u00e5 vist film som mapper med trailere, medvirkende og andet relateret inhold.",
     "HeaderSyncJobInfo": "Sync Job",
-    "FolderTypeMixed": "Mixed content",
+    "FolderTypeMixed": "Blandet indhold",
     "FolderTypeMovies": "FIlm",
     "FolderTypeMusic": "Musik",
     "FolderTypeAdultVideos": "Voksenfilm",
@@ -110,7 +110,7 @@
     "LabelCountry": "Land:",
     "LabelLanguage": "Sprog:",
     "LabelTimeLimitHours": "Tidsgr\u00e6nse (timer):",
-    "ButtonJoinTheDevelopmentTeam": "Join the Development Team",
+    "ButtonJoinTheDevelopmentTeam": "Bliv medlem af Teamet bag Emby",
     "HeaderPreferredMetadataLanguage": "Foretrukket sprog for metadata:",
     "LabelSaveLocalMetadata": "Gem illustrationer og metadata i mediemapper",
     "LabelSaveLocalMetadataHelp": "Lagring af illustrationer og metadata i mediemapper vil placerer dem et sted hvor de nemt kan redigeres.",
@@ -214,17 +214,17 @@
     "OptionArtist": "Artist",
     "OptionAlbum": "Album",
     "OptionTrackName": "Nummerets navn",
-    "OptionCommunityRating": "Community Rating",
+    "OptionCommunityRating": "F\u00e6llesskabsvurdering",
     "OptionNameSort": "Navn",
     "OptionFolderSort": "Mapper",
     "OptionBudget": "Budget",
     "OptionRevenue": "Indt\u00e6gt",
     "OptionPoster": "Plakat",
-    "OptionPosterCard": "Poster card",
-    "OptionBackdrop": "Backdrop",
+    "OptionPosterCard": "Plakat",
+    "OptionBackdrop": "Baggrund",
     "OptionTimeline": "Tidslinje",
-    "OptionThumb": "Thumb",
-    "OptionThumbCard": "Thumb card",
+    "OptionThumb": "Miniature",
+    "OptionThumbCard": "Miniature kort",
     "OptionBanner": "Banner",
     "OptionCriticRating": "Kritikervurdering",
     "OptionVideoBitrate": "Video Bitrate",
@@ -240,7 +240,7 @@
     "HeaderLatestSongs": "Seneste sange",
     "HeaderRecentlyPlayed": "Afspillet for nyligt",
     "HeaderFrequentlyPlayed": "Ofte afspillet",
-    "DevBuildWarning": "Dev builds are the bleeding edge. Released often, these build have not been tested. The application may crash and entire features may not work at all.",
+    "DevBuildWarning": "Udviklerversionen er bleeding edge. Nye versioner bliver ofte udgivet og bliver ikke testet inden. Applikationen kan risikere at lukke ned og funktioner kan nogle gange slet ikke virke.",
     "LabelVideoType": "Video type:",
     "OptionBluray": "Bluray",
     "OptionDvd": "Dvd",
@@ -296,7 +296,7 @@
     "SearchKnowledgeBase": "S\u00f8g i vidensdatabasen",
     "VisitTheCommunity": "Bes\u00f8g f\u00e6llesskabet",
     "VisitProjectWebsite": "Bes\u00f8g Embys hjemmeside",
-    "VisitProjectWebsiteLong": "Visit the Emby Web site to catch the latest news and keep up with the developer blog.",
+    "VisitProjectWebsiteLong": "Bes\u00f8g Emby hjemmesiden for at blive opdateret p\u00e5 de seneste nyheder og holde dig opdateret med udviklernes blog.",
     "OptionHideUser": "Vis ikke denne bruger p\u00e5 loginsiden",
     "OptionHideUserFromLoginHelp": "Nyttigt for private kontoer eller skjulte administratorkontoer. Brugeren skal logge ind ved at skive sit brugernavn og adgangskode.",
     "OptionDisableUser": "Deaktiver denne bruger",
@@ -323,7 +323,7 @@
     "ButtonAddToCollection": "Tilf\u00f8j til samling",
     "PismoMessage": "Utilizing Pismo File Mount through a donated license.",
     "TangibleSoftwareMessage": "Utilizing Tangible Solutions Java\/C# converters through a donated license.",
-    "HeaderCredits": "Credits",
+    "HeaderCredits": "Anerkendelser",
     "PleaseSupportOtherProduces": "St\u00f8t venligst andre gratis produkter vi bruger:",
     "VersionNumber": "Version {0}",
     "TabPaths": "Stier",
@@ -370,8 +370,8 @@
     "ExtractChapterImagesHelp": "Udtr\u00e6kning af kapitelbilleder lader klienter vise billeder i scenev\u00e6lgeren. Denne proces kan v\u00e6re langsom og processorbelastende, og kan kr\u00e6ve adskillige gigabytes harddiskplads. Processen k\u00f8rer som en natlig planlagt opgave, selv om dette kan \u00e6ndres i planl\u00e6ggeren. Det anbefales ikke at k\u00f8re denne proces  i tidsrum hvor der er brugere p\u00e5 systemet.",
     "LabelMetadataDownloadLanguage": "Foretrukket sprog for nedhentning:",
     "ButtonAutoScroll": "Rul automatisk",
-    "LabelImageSavingConvention": "Image saving convention:",
-    "LabelImageSavingConventionHelp": "Emby recognizes images from most major media applications. Choosing your downloading convention is useful if you also use other products.",
+    "LabelImageSavingConvention": "Konvention for lagring af billeder:",
+    "LabelImageSavingConventionHelp": "Emby genkender billeder fra de fleste store medieapplikationer. Valg af konvention for hentning af billeder er nyttefuld hvis du ogs\u00e5 benytter dig af andre produkter.",
     "OptionImageSavingCompatible": "Kompatibel - Emby\/Kodi\/Plex",
     "OptionImageSavingStandard": "Standard - MB2",
     "ButtonSignIn": "Log Ind",
@@ -434,7 +434,7 @@
     "OptionDownloadDiscImage": "Disk",
     "OptionDownloadBannerImage": "Banner",
     "OptionDownloadBackImage": "Bagside",
-    "OptionDownloadArtImage": "Art",
+    "OptionDownloadArtImage": "Kunst",
     "OptionDownloadPrimaryImage": "Prim\u00e6r",
     "HeaderFetchImages": "Hent billeder:",
     "HeaderImageSettings": "Billedindstillinger",
@@ -482,10 +482,10 @@
     "HeaderAwardsAndReviews": "Priser og anmelselser",
     "HeaderSoundtracks": "Soundtracks",
     "HeaderMusicVideos": "Musikvideoer",
-    "HeaderSpecialFeatures": "Special Features",
-    "HeaderCastCrew": "Cast & Crew",
-    "HeaderAdditionalParts": "Additional Parts",
-    "ButtonSplitVersionsApart": "Split Versions Apart",
+    "HeaderSpecialFeatures": "Specielle egenskaber",
+    "HeaderCastCrew": "Medvirkende",
+    "HeaderAdditionalParts": "Andre stier:",
+    "ButtonSplitVersionsApart": "Opdel versioner",
     "ButtonPlayTrailer": "Trailer",
     "LabelMissing": "Mangler",
     "LabelOffline": "Offline",
@@ -497,7 +497,7 @@
     "LabelTo": "Til:",
     "LabelToHelp": "F. eks. \\\\MyServer\\Movies (en sti klienterne kan tilg\u00e5)",
     "ButtonAddPathSubstitution": "Tilf\u00f8j substitution",
-    "OptionSpecialEpisode": "Specials",
+    "OptionSpecialEpisode": "S\u00e6rudsendelser",
     "OptionMissingEpisode": "Manglende episoder",
     "OptionUnairedEpisode": "Ikke sendte episoder",
     "OptionEpisodeSortName": "Navn for sortering af episoder",
@@ -648,7 +648,7 @@
     "LabelSupporterKey": "Supporter n\u00f8gle (Kopier fra e-mail og inds\u00e6t)",
     "LabelSupporterKeyHelp": "Inds\u00e6t din supporter n\u00f8gle for at f\u00e5 yderligere fordele, f\u00e6llesskabet har udviklet til Emby.",
     "MessageInvalidKey": "Supporter n\u00f8glen manler eller er ugyldig.",
-    "ErrorMessageInvalidKey": "In order for any premium content to be registered, you must also be an Emby Supporter. Please donate and support the continued development of the core product. Thank you.",
+    "ErrorMessageInvalidKey": "For at registrere premium indhold skal du v\u00e6re en Emby Supporter. Doner venligst for at st\u00f8tte den l\u00f8bende udvikling af vores kerneprodukt. Mange tak.",
     "HeaderDisplaySettings": "Indstillinger for visning",
     "TabPlayTo": "Afspil til",
     "LabelEnableDlnaServer": "Aktiver DNLA server",
@@ -700,7 +700,7 @@
     "CategoryApplication": "Program",
     "CategoryPlugin": "Plugin",
     "LabelMessageTitle": "Titel p\u00e5 besked",
-    "LabelAvailableTokens": "Available tokens:",
+    "LabelAvailableTokens": "Tilg\u00e6ngelige tokens:",
     "AdditionalNotificationServices": "Kig i plugin-kataloget for at f\u00e5 yderligere uderretnings-tjenester",
     "OptionAllUsers": "Alle brugere",
     "OptionAdminUsers": "Administratore",
@@ -743,7 +743,7 @@
     "ButtonVolumeDown": "Volume -",
     "ButtonMute": "Lyd fra",
     "HeaderLatestMedia": "Seneste medier",
-    "OptionSpecialFeatures": "Special Features",
+    "OptionSpecialFeatures": "Specielle egenskaber",
     "HeaderCollections": "Samlinger",
     "LabelProfileCodecsHelp": "Adskil med komma. Kan efterlades tom for at g\u00e6lde for alle codecs.",
     "LabelProfileContainersHelp": "Adskil med komma. Kan efterlades tom for at g\u00e6lde for alle containere.",
@@ -791,8 +791,8 @@
     "LabelIconMaxWidthHelp": "Maksimumopl\u00f8sningen p\u00e5 ikoner der bliver vist med upnp:icon",
     "LabelIconMaxHeight": "Max h\u00f8jde p\u00e5 ikoner:",
     "LabelIconMaxHeightHelp": "Maksimumopl\u00f8sningen p\u00e5 ikoner der bliver vist med upnp:icon",
-    "LabelIdentificationFieldHelp": "A case-insensitive substring or regex expression.",
-    "HeaderProfileServerSettingsHelp": "These values control how Emby Server will present itself to the device.",
+    "LabelIdentificationFieldHelp": "En case-insensitive substring eller regex ekspression.",
+    "HeaderProfileServerSettingsHelp": "Disse v\u00e6rdier kontrollerer hvordan Emby pr\u00e6senterer sig til enheden.",
     "LabelMaxBitrate": "Max bitrate:",
     "LabelMaxBitrateHelp": "Angiv en maksimal bitrate i omr\u00e5der med begr\u00e6nset b\u00e5ndbredde, eller hvis enheden selv har begr\u00e6nsninger.",
     "LabelMaxStreamingBitrate": "Max streaming bitrate:",
@@ -804,8 +804,8 @@
     "LabelMusicStaticBitrateHelp": "Angiv en maksimal bitrate n\u00e5r der synkroniseres musik.",
     "LabelMusicStreamingTranscodingBitrate": "Bitrate for musiktranskodning",
     "LabelMusicStreamingTranscodingBitrateHelp": "Angiv en maksimal bitrate n\u00e5r der streames musik.",
-    "OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests",
-    "OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.",
+    "OptionIgnoreTranscodeByteRangeRequests": "Ignorer foresp\u00f8rgsler vedr\u00f8rende transcode byte interval",
+    "OptionIgnoreTranscodeByteRangeRequestsHelp": "Hvis aktiveret vil disse foresp\u00f8rgsler blive efterkommet, men byte range headeren ignoreret.",
     "LabelFriendlyName": "System venligt navn",
     "LabelManufacturer": "Producent",
     "LabelManufacturerUrl": "Producent url",
@@ -1163,7 +1163,7 @@
     "OptionLocalRefreshOnly": "Opdater kun lokalt",
     "HeaderRefreshMetadata": "Opdater metadata",
     "HeaderPersonInfo": "Personinformation",
-    "HeaderIdentifyItem": "Identify Item",
+    "HeaderIdentifyItem": "Identificer genstand",
     "HeaderIdentifyItemHelp": "Indtast et eller flere s\u00f8gekriterier.Fjern kriterier for at f\u00e5 flere s\u00f8geresultater.",
     "HeaderConfirmDeletion": "Bekr\u00e6ft sletning",
     "LabelFollowingFileWillBeDeleted": "F\u00f8lgende filer bliver slettet:",
@@ -1190,7 +1190,7 @@
     "LabelAirTime:": "Sendetid:",
     "LabelRuntimeMinutes": "Spilletid (minutter):",
     "LabelParentalRating": "Aldersgr\u00e6nse:",
-    "LabelCustomRating": "Custom rating:",
+    "LabelCustomRating": "Brugerdefineret bed\u00f8mmelse:",
     "LabelBudget": "Budget",
     "LabelRevenue": "Indt\u00e6gter ($):",
     "LabelOriginalAspectRatio": "Originalt formatforhold:",
@@ -1228,6 +1228,7 @@
     "OptionNoThemeVideo": "Ingen temavideo",
     "LabelOneTimeDonationAmount": "Donationsbel\u00f8b:",
     "ButtonDonate": "Don\u00e9r",
+    "ButtonPurchase": "K\u00f8b",
     "OptionActor": "Skuespiller",
     "OptionComposer": "Komponist",
     "OptionDirector": "Instrukt\u00f8r",
@@ -1247,7 +1248,6 @@
     "HeaderDeveloperInfo": "Information om udvikleren",
     "HeaderRevisionHistory": "Revisionshistorik",
     "ButtonViewWebsite": "Bes\u00f8g hjemmeside",
-    "LabelRecurringDonationCanBeCancelledHelp": "Tilbagevendende donationer kan afmeldes n\u00e5r som helst fra din PayPal konto.",
     "HeaderXmlSettings": "XML indstillinger",
     "HeaderXmlDocumentAttributes": "XML dokumentattributter",
     "HeaderXmlDocumentAttribute": "XML dokumentattribut",
@@ -1335,10 +1335,10 @@
     "OptionWeekends": "Weekender",
     "MessageProfileInfoSynced": "Brugerprofil synkroniseret med Emby Connect",
     "HeaderOptionalLinkEmbyAccount": "Valgfrit: Forbind din Emby konto",
-    "ButtonTrailerReel": "Trailer reel",
-    "HeaderTrailerReel": "Trailer Reel",
+    "ButtonTrailerReel": "Trailer rulle",
+    "HeaderTrailerReel": "Trailer rulle",
     "OptionPlayUnwatchedTrailersOnly": "Afspil kun ikke sete trailere",
-    "HeaderTrailerReelHelp": "Start a trailer reel to play a long running playlist of trailers.",
+    "HeaderTrailerReelHelp": "Start en trailer rulle for at afspille en lang afspilningsliste med forfilm.",
     "MessageNoTrailersFound": "Ingen trailere fundet. Installer Trailer kanalen for at tilf\u00f8je et bibliotek med trailere fra internettet.",
     "HeaderNewUsers": "Nye brugere",
     "ButtonSignUp": "Tilmeld dig",
@@ -1381,7 +1381,7 @@
     "TabJobs": "Opgaver",
     "TabSyncJobs": "Sync opgaver",
     "LabelTagFilterMode": "Tilstand:",
-    "LabelTagFilterAllowModeHelp": "If allowed tags are used as part of a deeply nested folder structure, content that is tagged will require parent folders to be tagged as well.",
+    "LabelTagFilterAllowModeHelp": "Hvis godkendte tags bliver brugt som en del af en meget forgrenet mappestruktur, kr\u00e6ver tagget indhold at parent mappen ogs\u00e5 tagges.",
     "HeaderThisUserIsCurrentlyDisabled": "Denne bruger er for \u00f8jeblikket deaktiveret.",
     "MessageReenableUser": "Se nedenfor om genaktivering",
     "LabelEnableInternetMetadataForTvPrograms": "Hent internet metadata for:",
@@ -1409,13 +1409,6 @@
     "OptionEnableFullSpeedConversionHelp": "Som standard udf\u00f8res synkronseringskonverteringer ved lav hastighed for at minimere ressourceforbrug.",
     "HeaderPlaylists": "Afspilningslister",
     "HeaderSelectDate": "V\u00e6lg dato",
-    "HeaderWelcomeExclamation": "Velkommen!",
-    "HeaderMyPreferences": "Mine indstillinger",
-    "ButtonMyPreferencesWelcomeYes": "Ja, jeg vil gerne s\u00e6tte mine indstillinger nu.",
-    "ButtonMyPreferencesWelcomeNo": "Nej tak, jeg g\u00f8r det senere.",
-    "MyPreferencesWelcomeMessage1": "Vi har sat dit bibliotek op p\u00e5 en m\u00e5de vi tror du vil nyde. Udseendet og grupperingen af indholdet kan \u00e6ndres n\u00e5r som helst i dine indstillinger. Dine indstillinger vil g\u00e6lde for alle Emby apps.",
-    "MyPreferencesWelcomeMessage2": "Vil du s\u00e6tte dine indstillinger nu?",
-    "ToAccessPreferencesHelp": "Du kan tilg\u00e5 dine indstillinger senere ved at klikke p\u00e5 brugerikonet \u00f8verst til h\u00f8jre i vinduet og v\u00e6lge 'Mine indstillinger'.",
     "HeaderViewStyles": "Visningsstiler",
     "LabelSelectViewStyles": "Aktiver udvidet pr\u00e6sentation for:",
     "LabelSelectViewStylesHelp": "Aktiver dette for at f\u00e5 visninger med kategorier som forslag, seneste, genrer, m.m. Hvis det ikke er aktiveret, bliver der vist almindelige mapper.",
@@ -1432,11 +1425,12 @@
     "LabelServerPort": "Port:",
     "HeaderNewServer": "Ny server",
     "ButtonChangeServer": "Skift server",
-    "HeaderConnectToServer": "Connect to Server",
-    "OptionReportList": "List View",
-    "OptionReportStatistics": "Statistics",
-    "OptionReportGrouping": "Grouping",
-    "HeaderExport": "Export",
-    "HeaderColumns": "Columns",
-    "ButtonReset": "Reset"
+    "HeaderConnectToServer": "Forbind til server",
+    "OptionReportList": "Liste visning",
+    "OptionReportStatistics": "Statistik",
+    "OptionReportGrouping": "Gruppering",
+    "HeaderExport": "Eksporter",
+    "HeaderColumns": "S\u00f8jler",
+    "ButtonReset": "Reset",
+    "OptionEnableExternalVideoPlayers": "Enable external video players"
 }

+ 8 - 14
MediaBrowser.Server.Implementations/Localization/Server/de.json

@@ -78,7 +78,7 @@
     "HeaderSyncRequiresSupporterMembership": "Synchronisation ben\u00f6tigt eine Supporter-Mitgliedschaft",
     "HeaderEnjoyDayTrial": "Genie\u00dfen Sie eine 14 Tage Testversion",
     "LabelSyncTempPath": "Verzeichnis f\u00fcr tempor\u00e4re Dateien",
-    "LabelSyncTempPathHelp": "Legen Sie einen eigenen Synchronisations-Arbeits Verzeichnis fest. Konvertierte Medien werden w\u00e4hrend der Synchronisation hier gespeichert.",
+    "LabelSyncTempPathHelp": "Legen Sie ein eigenes Synchronisations-Arbeits Verzeichnis fest. Konvertierte Medien werden w\u00e4hrend der Synchronisation hier gespeichert.",
     "LabelCustomCertificatePath": "Eigener Zertifikats Ordner:",
     "LabelCustomCertificatePathHelp": "F\u00fcgen Sie ihr eigenes SSL Zertifikat als .pfx Datei hinzu. Wenn ausgelassen, wird der Server ein selbst signiertes Zertifikat f\u00fcr Sie erstellen.",
     "TitleNotifications": "Benachrichtigungen",
@@ -1228,6 +1228,7 @@
     "OptionNoThemeVideo": "Kein Theme Video",
     "LabelOneTimeDonationAmount": "Spendenbetrag:",
     "ButtonDonate": "Spenden",
+    "ButtonPurchase": "Kaufen",
     "OptionActor": "Schauspieler",
     "OptionComposer": "Komponist",
     "OptionDirector": "Regisseur",
@@ -1247,7 +1248,6 @@
     "HeaderDeveloperInfo": "Entwicklerinformationen",
     "HeaderRevisionHistory": "Versionsverlauf",
     "ButtonViewWebsite": "Besuche die Website",
-    "LabelRecurringDonationCanBeCancelledHelp": "Fortlaufende Spenden k\u00f6nnen jederzeit \u00fcber deinen PayPal Account gek\u00fcndigt werden.",
     "HeaderXmlSettings": "XML Einstellungen",
     "HeaderXmlDocumentAttributes": "XML-Dokument Eigenschaften",
     "HeaderXmlDocumentAttribute": "XML-Dokument Eigenschaft",
@@ -1409,13 +1409,6 @@
     "OptionEnableFullSpeedConversionHelp": "Standardm\u00e4\u00dfig werden Synchronisations-Konvertierungen bei geringer Geschwindigkeit durchgef\u00fchrt um Ressourcen zu sparen.",
     "HeaderPlaylists": "Wiedergabeliste",
     "HeaderSelectDate": "Datum w\u00e4hlen",
-    "HeaderWelcomeExclamation": "Willkommen!",
-    "HeaderMyPreferences": "Meine Einstellungen",
-    "ButtonMyPreferencesWelcomeYes": "Ja, ich m\u00f6chte meine Einstellungen nun festlegen.",
-    "ButtonMyPreferencesWelcomeNo": "Nein danke, das mache ich sp\u00e4ter.",
-    "MyPreferencesWelcomeMessage1": "Wir pr\u00e4sentieren Ihnen Ihre Bibliothek in einer Art, wie wir denken, dass es Ihnen gefallen d\u00fcrfte. Die Darstellung und Gruppierung des Inhaltes kann jederzeit in Ihren Einstellungen angepasst werden. Ihre Einstellungen werden auf alle Empy Apps \u00fcbertragen.",
-    "MyPreferencesWelcomeMessage2": "M\u00f6chten Sie Ihre Einstellungen nun festlegen?",
-    "ToAccessPreferencesHelp": "Um Ihre Einstellungen sp\u00e4ter zu \u00e4ndern, klicken Sie ihr Benutzer-Icon im oberen rechten Bereich oder w\u00e4hlen Sie \"Meine Einstellungen\".",
     "HeaderViewStyles": "Zeige Stiele",
     "LabelSelectViewStyles": "Aktiviere erweiterte Ansichten f\u00fcr:",
     "LabelSelectViewStylesHelp": "Wenn aktiviert werden Darstellungen von Kategorien mit Medieninformationen wie Empfehlungen, k\u00fcrzlich hinzugef\u00fcgt, Genres und weitere, angereichert. Wenn deaktiviert werden diese nur als simple Verzeichnisse dargestellt.",
@@ -1433,10 +1426,11 @@
     "HeaderNewServer": "Neuer Server",
     "ButtonChangeServer": "Wechsel Server",
     "HeaderConnectToServer": "Verbinde zu Server",
-    "OptionReportList": "List View",
-    "OptionReportStatistics": "Statistics",
-    "OptionReportGrouping": "Grouping",
+    "OptionReportList": "Listenanzeige",
+    "OptionReportStatistics": "Statistik",
+    "OptionReportGrouping": "Gruppierung",
     "HeaderExport": "Export",
-    "HeaderColumns": "Columns",
-    "ButtonReset": "Reset"
+    "HeaderColumns": "Spalten",
+    "ButtonReset": "Reset",
+    "OptionEnableExternalVideoPlayers": "Aktiviere externe Videoplayer"
 }

+ 3 - 9
MediaBrowser.Server.Implementations/Localization/Server/el.json

@@ -1228,6 +1228,7 @@
     "OptionNoThemeVideo": "No Theme Video",
     "LabelOneTimeDonationAmount": "Donation amount:",
     "ButtonDonate": "Donate",
+    "ButtonPurchase": "Purchase",
     "OptionActor": "Actor",
     "OptionComposer": "Composer",
     "OptionDirector": "Director",
@@ -1247,7 +1248,6 @@
     "HeaderDeveloperInfo": "Developer Info",
     "HeaderRevisionHistory": "Revision History",
     "ButtonViewWebsite": "View website",
-    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
     "HeaderXmlSettings": "Xml Settings",
     "HeaderXmlDocumentAttributes": "Xml Document Attributes",
     "HeaderXmlDocumentAttribute": "Xml Document Attribute",
@@ -1409,13 +1409,6 @@
     "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.",
     "HeaderPlaylists": "Playlists",
     "HeaderSelectDate": "Select Date",
-    "HeaderWelcomeExclamation": "Welcome!",
-    "HeaderMyPreferences": "My Preferences",
-    "ButtonMyPreferencesWelcomeYes": "Yes, I'd like to set my preferences now.",
-    "ButtonMyPreferencesWelcomeNo": "No thanks, I'll do it later.",
-    "MyPreferencesWelcomeMessage1": "We've presented your library in a way we think you'll enjoy. The appearance and grouping of content can be changed anytime by adjusting your preferences. Your preferences will apply to all Emby apps.",
-    "MyPreferencesWelcomeMessage2": "Would you like to set your preferences now?",
-    "ToAccessPreferencesHelp": "To access your preferences later, click your user icon in the top right header and select My Preferences.",
     "HeaderViewStyles": "View Styles",
     "LabelSelectViewStyles": "Enable enhanced presentations for:",
     "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.",
@@ -1438,5 +1431,6 @@
     "OptionReportGrouping": "Grouping",
     "HeaderExport": "Export",
     "HeaderColumns": "Columns",
-    "ButtonReset": "Reset"
+    "ButtonReset": "Reset",
+    "OptionEnableExternalVideoPlayers": "Enable external video players"
 }

+ 3 - 9
MediaBrowser.Server.Implementations/Localization/Server/en_GB.json → MediaBrowser.Server.Implementations/Localization/Server/en-GB.json

@@ -1228,6 +1228,7 @@
     "OptionNoThemeVideo": "No Theme Video",
     "LabelOneTimeDonationAmount": "Donation amount:",
     "ButtonDonate": "Donate",
+    "ButtonPurchase": "Purchase",
     "OptionActor": "Actor",
     "OptionComposer": "Composer",
     "OptionDirector": "Director",
@@ -1247,7 +1248,6 @@
     "HeaderDeveloperInfo": "Developer Info",
     "HeaderRevisionHistory": "Revision History",
     "ButtonViewWebsite": "View website",
-    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
     "HeaderXmlSettings": "Xml Settings",
     "HeaderXmlDocumentAttributes": "Xml Document Attributes",
     "HeaderXmlDocumentAttribute": "Xml Document Attribute",
@@ -1409,13 +1409,6 @@
     "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.",
     "HeaderPlaylists": "Playlists",
     "HeaderSelectDate": "Select Date",
-    "HeaderWelcomeExclamation": "Welcome!",
-    "HeaderMyPreferences": "My Preferences",
-    "ButtonMyPreferencesWelcomeYes": "Yes, I'd like to set my preferences now.",
-    "ButtonMyPreferencesWelcomeNo": "No thanks, I'll do it later.",
-    "MyPreferencesWelcomeMessage1": "We've presented your library in a way we think you'll enjoy. The appearance and grouping of content can be changed anytime by adjusting your preferences. Your preferences will apply to all Emby apps.",
-    "MyPreferencesWelcomeMessage2": "Would you like to set your preferences now?",
-    "ToAccessPreferencesHelp": "To access your preferences later, click your user icon in the top right header and select My Preferences.",
     "HeaderViewStyles": "View Styles",
     "LabelSelectViewStyles": "Enable enhanced presentations for:",
     "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.",
@@ -1438,5 +1431,6 @@
     "OptionReportGrouping": "Grouping",
     "HeaderExport": "Export",
     "HeaderColumns": "Columns",
-    "ButtonReset": "Reset"
+    "ButtonReset": "Reset",
+    "OptionEnableExternalVideoPlayers": "Enable external video players"
 }

+ 3 - 9
MediaBrowser.Server.Implementations/Localization/Server/sl_SI.json → MediaBrowser.Server.Implementations/Localization/Server/en-US.json

@@ -1228,6 +1228,7 @@
     "OptionNoThemeVideo": "No Theme Video",
     "LabelOneTimeDonationAmount": "Donation amount:",
     "ButtonDonate": "Donate",
+    "ButtonPurchase": "Purchase",
     "OptionActor": "Actor",
     "OptionComposer": "Composer",
     "OptionDirector": "Director",
@@ -1247,7 +1248,6 @@
     "HeaderDeveloperInfo": "Developer Info",
     "HeaderRevisionHistory": "Revision History",
     "ButtonViewWebsite": "View website",
-    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
     "HeaderXmlSettings": "Xml Settings",
     "HeaderXmlDocumentAttributes": "Xml Document Attributes",
     "HeaderXmlDocumentAttribute": "Xml Document Attribute",
@@ -1409,13 +1409,6 @@
     "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.",
     "HeaderPlaylists": "Playlists",
     "HeaderSelectDate": "Select Date",
-    "HeaderWelcomeExclamation": "Welcome!",
-    "HeaderMyPreferences": "My Preferences",
-    "ButtonMyPreferencesWelcomeYes": "Yes, I'd like to set my preferences now.",
-    "ButtonMyPreferencesWelcomeNo": "No thanks, I'll do it later.",
-    "MyPreferencesWelcomeMessage1": "We've presented your library in a way we think you'll enjoy. The appearance and grouping of content can be changed anytime by adjusting your preferences. Your preferences will apply to all Emby apps.",
-    "MyPreferencesWelcomeMessage2": "Would you like to set your preferences now?",
-    "ToAccessPreferencesHelp": "To access your preferences later, click your user icon in the top right header and select My Preferences.",
     "HeaderViewStyles": "View Styles",
     "LabelSelectViewStyles": "Enable enhanced presentations for:",
     "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.",
@@ -1438,5 +1431,6 @@
     "OptionReportGrouping": "Grouping",
     "HeaderExport": "Export",
     "HeaderColumns": "Columns",
-    "ButtonReset": "Reset"
+    "ButtonReset": "Reset",
+    "OptionEnableExternalVideoPlayers": "Enable external video players"
 }

+ 4 - 10
MediaBrowser.Server.Implementations/Localization/Server/es_MX.json → MediaBrowser.Server.Implementations/Localization/Server/es-MX.json

@@ -1041,7 +1041,7 @@
     "LabelDateAdded": "Fecha de adici\u00f3n:",
     "HeaderFeatures": "Caracter\u00edsticas",
     "HeaderAdvanced": "Avanzado",
-    "ButtonSync": "SInc",
+    "ButtonSync": "Sinc",
     "TabScheduledTasks": "Tareas Programadas",
     "HeaderChapters": "Cap\u00edtulos",
     "HeaderResumeSettings": "Configuraci\u00f3n para Continuar",
@@ -1228,6 +1228,7 @@
     "OptionNoThemeVideo": "Sin Video del Tema",
     "LabelOneTimeDonationAmount": "Cantidad a donar:",
     "ButtonDonate": "Donar",
+    "ButtonPurchase": "Comprar",
     "OptionActor": "Actor",
     "OptionComposer": "Compositor",
     "OptionDirector": "Director",
@@ -1247,7 +1248,6 @@
     "HeaderDeveloperInfo": "Info del desarrollador",
     "HeaderRevisionHistory": "Historial de Versiones",
     "ButtonViewWebsite": "Ver sitio web",
-    "LabelRecurringDonationCanBeCancelledHelp": "Las donaciones recurrentes pueden ser canceladas en cualquier momento desde su cuenta PayPal.",
     "HeaderXmlSettings": "Configuraci\u00f3n XML",
     "HeaderXmlDocumentAttributes": "Atributos del Documento XML",
     "HeaderXmlDocumentAttribute": "Atributo del Documento XML",
@@ -1409,13 +1409,6 @@
     "OptionEnableFullSpeedConversionHelp": "Por defecto, la conversi\u00f3n es realizada a baja velocidad para minimizar el consumo de recursos.",
     "HeaderPlaylists": "Listas",
     "HeaderSelectDate": "Seleccionar fecha",
-    "HeaderWelcomeExclamation": "\u00a1Bienvenido!",
-    "HeaderMyPreferences": "Mi Configuraci\u00f3n",
-    "ButtonMyPreferencesWelcomeYes": "Si, me gustar\u00eda ajustar mi configuraci\u00f3n ahora.",
-    "ButtonMyPreferencesWelcomeNo": "No gracias, lo har\u00e9 luego.",
-    "MyPreferencesWelcomeMessage1": "Configuramos la apariencia de tu biblioteca de una forma que pensamos que te gustar\u00eda. Puedes cambiar la apariencia y agrupaci\u00f3n del contenido cuando quieras en tu configuraci\u00f3n. Tu configuraci\u00f3n se aplicar\u00e1 a todas las aplicaciones de Emby.",
-    "MyPreferencesWelcomeMessage2": "\u00bfTe gustar\u00eda ajustar tu configuraci\u00f3n ahora?",
-    "ToAccessPreferencesHelp": "Para acceder a tu configuraci\u00f3n luego, haz clic en tu icono de usuario en la esquina superior derecha y selecciona Mi Configuraci\u00f3n.",
     "HeaderViewStyles": "Ver Estilos",
     "LabelSelectViewStyles": "Abilitar presentaciones mejoradas para:",
     "LabelSelectViewStylesHelp": "Si se activa, las diferentes vistas usar\u00e1n metada para mostrar categor\u00edas como Sugerencias, \u00daltimos, G\u00e9neros, y m\u00e1s. Si est\u00e1 desactivado, se mostrar\u00e1n como carpetas comunes.",
@@ -1438,5 +1431,6 @@
     "OptionReportGrouping": "Agrupado",
     "HeaderExport": "Exportar",
     "HeaderColumns": "Columnas",
-    "ButtonReset": "Resetear"
+    "ButtonReset": "Resetear",
+    "OptionEnableExternalVideoPlayers": "Habilitar reproductores externos de video"
 }

+ 24 - 30
MediaBrowser.Server.Implementations/Localization/Server/es.json

@@ -368,7 +368,7 @@
     "LabelFanartApiKey": "Personal api key:",
     "LabelFanartApiKeyHelp": "Requests to fanart without a personal API key return results that were approved over 7 days ago. With a personal API key that drops to 48 hours and if you are also a fanart VIP member that will further drop to around 10 minutes.",
     "ExtractChapterImagesHelp": "Extracting chapter images will allow clients to display graphical scene selection menus. The process can be slow, cpu-intensive and may require several gigabytes of space. It runs when videos are discovered, and also as a nightly scheduled task. The schedule is configurable in the scheduled tasks area. It is not recommended to run this task during peak usage hours.",
-    "LabelMetadataDownloadLanguage": "Preferred download language:",
+    "LabelMetadataDownloadLanguage": "Idioma preferido visualizado",
     "ButtonAutoScroll": "Auto-desplazamiento",
     "LabelImageSavingConvention": "Sistema de guardado de im\u00e1genes:",
     "LabelImageSavingConventionHelp": "Emby recognizes images from most major media applications. Choosing your downloading convention is useful if you also use other products.",
@@ -524,7 +524,7 @@
     "HeaderCustomDlnaProfiles": "Perfiles personalizados",
     "HeaderSystemDlnaProfiles": "Perfiles del sistema",
     "CustomDlnaProfilesHelp": "Crear un perfil personalizado para un nuevo dispositivo o reemplazar un perfil del sistema.",
-    "SystemDlnaProfilesHelp": "System profiles are read-only. Changes to a system profile will be saved to a new custom profile.",
+    "SystemDlnaProfilesHelp": "El perfil del Sistema es solo lectura. Cambios al perfil del sistema seran guardados en un perfil nuevo modificado.",
     "TitleDashboard": "Panel de control",
     "TabHome": "Inicio",
     "TabInfo": "Info",
@@ -551,12 +551,12 @@
     "LabelPublicHttpsPort": "N\u00famero de puerto p\u00fablico de https:",
     "LabelPublicHttpsPortHelp": "El n\u00famero de puerto p\u00fablico que debe ser enlazado al puerto local https:",
     "LabelEnableHttps": "Reportar el https como una direccion externa",
-    "LabelEnableHttpsHelp": "If enabled, the server will report an https url to clients as it's external address.",
+    "LabelEnableHttpsHelp": "Si es habilitado, el servidor reportara un enlaze https a los clientes como una direccion externa.",
     "LabelHttpsPort": "N\u00famero de puerto local de https:",
     "LabelHttpsPortHelp": "N\u00famero de puerto al que el servidor de tcp de Emby debe de ser enlazado.",
     "LabelWebSocketPortNumber": "N\u00famero de puerto WebSocket:",
     "LabelEnableAutomaticPortMap": "Habilitar asignaci\u00f3n de puertos autom\u00e1tico",
-    "LabelEnableAutomaticPortMapHelp": "Attempt to automatically map the public port to the local port via UPnP. This may not work with some router models.",
+    "LabelEnableAutomaticPortMapHelp": "UPnP permite la configuraci\u00f3n del router para acceso externo de forma f\u00e1cil y autom\u00e1tica. Esto puede no funcionar en algunos modelos de routers.",
     "LabelExternalDDNS": "Direccion externa del WAN:",
     "LabelExternalDDNSHelp": "Ponga aqui su DNS dinamico si tiene uno. las aplicaciones de Emby lo usar\u00e1n para conectarse remotamente. Deje en blanco para detecci\u00f3n autom\u00e1tica.",
     "TabResume": "Continuar",
@@ -634,11 +634,11 @@
     "MessagePleaseRestartServerToFinishUpdating": "Reinicie el servidor para acabar de aplicar las actualizaciones.",
     "LabelDownMixAudioScale": "Audio boost when downmixing:",
     "LabelDownMixAudioScaleHelp": "Potenciador de audio. Establecer a 1 para preservar el volumen original.",
-    "ButtonLinkKeys": "Transfer Key",
+    "ButtonLinkKeys": "Transferir Clave",
     "LabelOldSupporterKey": "Antigua clave de seguidor",
     "LabelNewSupporterKey": "Nueva clave de seguidor",
-    "HeaderMultipleKeyLinking": "Transfer to New Key",
-    "MultipleKeyLinkingHelp": "If you received a new supporter key, use this form to transfer the old key's registrations to your new one.",
+    "HeaderMultipleKeyLinking": "Trasferir a una Clave Nueva",
+    "MultipleKeyLinkingHelp": "Si usted recivio una nueva clave de partidiario, use este formulario para trasferir la registracion de la clave vieja a la nueva.",
     "LabelCurrentEmailAddress": "Cuenta de correo actual",
     "LabelCurrentEmailAddressHelp": "La direcci\u00f3n de correo electr\u00f3nico actual a la que se envi\u00f3 la nueva clave.",
     "HeaderForgotKey": "Perd\u00ed mi clave",
@@ -646,13 +646,13 @@
     "LabelSupporterEmailAddress": "La direcci\u00f3n de correo que utliz\u00f3 para comprar la clave.",
     "ButtonRetrieveKey": "Recuperar clave",
     "LabelSupporterKey": "Clave de seguidor (pegar desde el correo)",
-    "LabelSupporterKeyHelp": "Enter your supporter key to start enjoying additional benefits the community has developed for Emby.",
-    "MessageInvalidKey": "Supporter key is missing or invalid.",
-    "ErrorMessageInvalidKey": "In order for any premium content to be registered, you must also be an Emby Supporter. Please donate and support the continued development of the core product. Thank you.",
+    "LabelSupporterKeyHelp": "Agregue su clave de partidiario para empezar a disfrutar beneficios adicionales que la comunidad a creado para Emby.",
+    "MessageInvalidKey": "Clave de partidiario no se encuentra o es invalido.",
+    "ErrorMessageInvalidKey": "Para que cualquier contenido premium sea registrado, usted debe ser un pardidiario de Emby. Porfavor done y ayude a continuar con el desarrollo del producto principal. Gracias.",
     "HeaderDisplaySettings": "Opciones de pantalla",
     "TabPlayTo": "Reproducir en",
     "LabelEnableDlnaServer": "Habilitar servidor Dlna",
-    "LabelEnableDlnaServerHelp": "Allows UPnP devices on your network to browse and play Emby content.",
+    "LabelEnableDlnaServerHelp": "Permite que los aparatos con tecnologia UPnP en su red local pudan acceder los contenidos en Emby.",
     "LabelEnableBlastAliveMessages": "Explotar mensajes en vivo",
     "LabelEnableBlastAliveMessagesHelp": "Active aqu\u00ed si el servidor no es detectado correctamente por otros dispositivos UPnP en su red.",
     "LabelBlastMessageInterval": "Intervalo para mensajes en vivo (segundos)",
@@ -677,9 +677,9 @@
     "NotificationOptionPluginUpdateInstalled": "Se ha instalado la actualizaci\u00f3n del plugin",
     "NotificationOptionPluginInstalled": "Plugin instalado",
     "NotificationOptionPluginUninstalled": "Plugin desinstalado",
-    "NotificationOptionVideoPlayback": "Video playback started",
-    "NotificationOptionAudioPlayback": "Audio playback started",
-    "NotificationOptionGamePlayback": "Game playback started",
+    "NotificationOptionVideoPlayback": "Reproduccion de video a iniciado",
+    "NotificationOptionAudioPlayback": "Reproduccion de audio a iniciado",
+    "NotificationOptionGamePlayback": "Reproduccion de video juego a iniciado",
     "NotificationOptionVideoPlaybackStopped": "Reproducci\u00f3n de video detenida",
     "NotificationOptionAudioPlaybackStopped": "Reproducci\u00f3n de audio detenida",
     "NotificationOptionGamePlaybackStopped": "Reproducci\u00f3n de juego detenida",
@@ -687,7 +687,7 @@
     "NotificationOptionInstallationFailed": "Fallo en la instalaci\u00f3n",
     "NotificationOptionNewLibraryContent": "Nuevo contenido a\u00f1adido",
     "NotificationOptionNewLibraryContentMultiple": "Nuevo contenido a\u00f1adido (multiple)",
-    "NotificationOptionCameraImageUploaded": "Camera image uploaded",
+    "NotificationOptionCameraImageUploaded": "Imagen de camara se a carcado",
     "NotificationOptionUserLockedOut": "User locked out",
     "HeaderSendNotificationHelp": "By default, notifications are delivered to your dashboard inbox. Browse the plugin catalog to install additional notification options.",
     "NotificationOptionServerRestartRequired": "Se requiere el reinicio del servidor",
@@ -729,13 +729,13 @@
     "ButtonFullscreen": "Toggle fullscreen",
     "ButtonScenes": "Escenas",
     "ButtonSubtitles": "Subt\u00edtulos",
-    "ButtonAudioTracks": "Audio tracks",
+    "ButtonAudioTracks": "Pistas de Audio",
     "ButtonPreviousTrack": "Pista anterior",
     "ButtonNextTrack": "Pista siguiente",
     "ButtonStop": "Detener",
     "ButtonPause": "Pausa",
-    "ButtonNext": "Next",
-    "ButtonPrevious": "Previous",
+    "ButtonNext": "Siguiente",
+    "ButtonPrevious": "Anterior",
     "LabelGroupMoviesIntoCollections": "Agrupar pel\u00edculas en colecciones",
     "LabelGroupMoviesIntoCollectionsHelp": "Cuando se muestran las listas de pel\u00edculas, las pel\u00edculas pertenecientes a una colecci\u00f3n se mostrar\u00e1n como un elemento agrupado.",
     "NotificationOptionPluginError": "Error en plugin",
@@ -773,7 +773,7 @@
     "OptionPlainVideoItemsHelp": "Si est\u00e1 habilitado, todos los v\u00eddeos est\u00e1n representados en DIDL como \"object.item.videoItem\" en lugar de un tipo m\u00e1s espec\u00edfico, como por ejemplo \"object.item.videoItem.movie\".",
     "LabelSupportedMediaTypes": "Tipos de medio soportados:",
     "TabIdentification": "Identificaci\u00f3n",
-    "HeaderIdentification": "Identification",
+    "HeaderIdentification": "Identificaci\u00f3n",
     "TabDirectPlay": "Reproducci\u00f3n directa",
     "TabContainers": "Contenedores",
     "TabCodecs": "Codecs",
@@ -795,9 +795,9 @@
     "HeaderProfileServerSettingsHelp": "These values control how Emby Server will present itself to the device.",
     "LabelMaxBitrate": "Bitrate m\u00e1ximo:",
     "LabelMaxBitrateHelp": "Especificar una tasa de bits m\u00e1xima en entornos de ancho de banda limitado, o si el dispositivo impone su propio l\u00edmite.",
-    "LabelMaxStreamingBitrate": "Max streaming bitrate:",
+    "LabelMaxStreamingBitrate": "Bitrate m\u00e1ximo:",
     "LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.",
-    "LabelMaxChromecastBitrate": "Max Chromecast bitrate:",
+    "LabelMaxChromecastBitrate": "Bitrate de reproducci\u00f3n Chromecast",
     "LabelMaxStaticBitrate": "Max sync bitrate:",
     "LabelMaxStaticBitrateHelp": "Specify a max bitrate when syncing content at high quality.",
     "LabelMusicStaticBitrate": "Music sync bitrate:",
@@ -1228,6 +1228,7 @@
     "OptionNoThemeVideo": "No Theme Video",
     "LabelOneTimeDonationAmount": "Donation amount:",
     "ButtonDonate": "Donate",
+    "ButtonPurchase": "Purchase",
     "OptionActor": "Actor",
     "OptionComposer": "Composer",
     "OptionDirector": "Director",
@@ -1247,7 +1248,6 @@
     "HeaderDeveloperInfo": "Developer Info",
     "HeaderRevisionHistory": "Revision History",
     "ButtonViewWebsite": "View website",
-    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
     "HeaderXmlSettings": "Xml Settings",
     "HeaderXmlDocumentAttributes": "Xml Document Attributes",
     "HeaderXmlDocumentAttribute": "Xml Document Attribute",
@@ -1409,13 +1409,6 @@
     "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.",
     "HeaderPlaylists": "Playlists",
     "HeaderSelectDate": "Select Date",
-    "HeaderWelcomeExclamation": "Welcome!",
-    "HeaderMyPreferences": "My Preferences",
-    "ButtonMyPreferencesWelcomeYes": "Yes, I'd like to set my preferences now.",
-    "ButtonMyPreferencesWelcomeNo": "No thanks, I'll do it later.",
-    "MyPreferencesWelcomeMessage1": "We've presented your library in a way we think you'll enjoy. The appearance and grouping of content can be changed anytime by adjusting your preferences. Your preferences will apply to all Emby apps.",
-    "MyPreferencesWelcomeMessage2": "Would you like to set your preferences now?",
-    "ToAccessPreferencesHelp": "To access your preferences later, click your user icon in the top right header and select My Preferences.",
     "HeaderViewStyles": "View Styles",
     "LabelSelectViewStyles": "Enable enhanced presentations for:",
     "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.",
@@ -1438,5 +1431,6 @@
     "OptionReportGrouping": "Grouping",
     "HeaderExport": "Export",
     "HeaderColumns": "Columns",
-    "ButtonReset": "Reset"
+    "ButtonReset": "Reset",
+    "OptionEnableExternalVideoPlayers": "Enable external video players"
 }

+ 3 - 9
MediaBrowser.Server.Implementations/Localization/Server/fi.json

@@ -1228,6 +1228,7 @@
     "OptionNoThemeVideo": "No Theme Video",
     "LabelOneTimeDonationAmount": "Donation amount:",
     "ButtonDonate": "Donate",
+    "ButtonPurchase": "Purchase",
     "OptionActor": "Actor",
     "OptionComposer": "Composer",
     "OptionDirector": "Director",
@@ -1247,7 +1248,6 @@
     "HeaderDeveloperInfo": "Developer Info",
     "HeaderRevisionHistory": "Revision History",
     "ButtonViewWebsite": "View website",
-    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
     "HeaderXmlSettings": "Xml Settings",
     "HeaderXmlDocumentAttributes": "Xml Document Attributes",
     "HeaderXmlDocumentAttribute": "Xml Document Attribute",
@@ -1409,13 +1409,6 @@
     "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.",
     "HeaderPlaylists": "Playlists",
     "HeaderSelectDate": "Select Date",
-    "HeaderWelcomeExclamation": "Welcome!",
-    "HeaderMyPreferences": "My Preferences",
-    "ButtonMyPreferencesWelcomeYes": "Yes, I'd like to set my preferences now.",
-    "ButtonMyPreferencesWelcomeNo": "No thanks, I'll do it later.",
-    "MyPreferencesWelcomeMessage1": "We've presented your library in a way we think you'll enjoy. The appearance and grouping of content can be changed anytime by adjusting your preferences. Your preferences will apply to all Emby apps.",
-    "MyPreferencesWelcomeMessage2": "Would you like to set your preferences now?",
-    "ToAccessPreferencesHelp": "To access your preferences later, click your user icon in the top right header and select My Preferences.",
     "HeaderViewStyles": "View Styles",
     "LabelSelectViewStyles": "Enable enhanced presentations for:",
     "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.",
@@ -1438,5 +1431,6 @@
     "OptionReportGrouping": "Grouping",
     "HeaderExport": "Export",
     "HeaderColumns": "Columns",
-    "ButtonReset": "Reset"
+    "ButtonReset": "Reset",
+    "OptionEnableExternalVideoPlayers": "Enable external video players"
 }

+ 3 - 9
MediaBrowser.Server.Implementations/Localization/Server/fr.json

@@ -1228,6 +1228,7 @@
     "OptionNoThemeVideo": "Pas de th\u00e8me vid\u00e9o",
     "LabelOneTimeDonationAmount": "Montant du don :",
     "ButtonDonate": "Faire un don",
+    "ButtonPurchase": "Acheter",
     "OptionActor": "Acteur(trice)",
     "OptionComposer": "Compositeur:",
     "OptionDirector": "R\u00e9alisateur:",
@@ -1247,7 +1248,6 @@
     "HeaderDeveloperInfo": "Info d\u00e9velopeur",
     "HeaderRevisionHistory": "Historique des r\u00e9visions",
     "ButtonViewWebsite": "Voir le site",
-    "LabelRecurringDonationCanBeCancelledHelp": "Des donations r\u00e9currentes peuvent \u00eatre annul\u00e9es \u00e0 tout moment depuis votre compte PayPal.",
     "HeaderXmlSettings": "R\u00e9glages Xml",
     "HeaderXmlDocumentAttributes": "Attributs des documents Xml",
     "HeaderXmlDocumentAttribute": "Attribut des documents Xml",
@@ -1409,13 +1409,6 @@
     "OptionEnableFullSpeedConversionHelp": "Par d\u00e9faut, le transcodage est r\u00e9alis\u00e9 de mani\u00e8re lente pour minimiser la consommation de ressources.",
     "HeaderPlaylists": "Listes de lecture",
     "HeaderSelectDate": "S\u00e9lectionnez la date",
-    "HeaderWelcomeExclamation": "Bienvenue !",
-    "HeaderMyPreferences": "Mes pr\u00e9f\u00e9rences",
-    "ButtonMyPreferencesWelcomeYes": "Oui, je voudrais d\u00e9finir mes pr\u00e9f\u00e9rences maintenant.",
-    "ButtonMyPreferencesWelcomeNo": "Non merci, je le ferai plus tard.",
-    "MyPreferencesWelcomeMessage1": "Nous avons pr\u00e9sent\u00e9 votre biblioth\u00e8que d'une mani\u00e8re que nous pensons agr\u00e9able. L'apparence et les regroupements de contenus peuvent \u00eatre modifi\u00e9s \u00e0 tout moment en ajustant vos pr\u00e9f\u00e9rences. Vos pr\u00e9f\u00e9rences s'appliqueront \u00e0 toutes vos applications Emby.",
-    "MyPreferencesWelcomeMessage2": "Voulez-vous d\u00e9finir vos pr\u00e9f\u00e9rences maintenant ?",
-    "ToAccessPreferencesHelp": "Pour acc\u00e9der plus tard \u00e0 vos pr\u00e9f\u00e9rences, cliquez sur l'ic\u00f4ne utilisateur dans le bandeau en haut \u00e0 droite et s\u00e9lectionnez Mes pr\u00e9f\u00e9rences.",
     "HeaderViewStyles": "Styles d'affichage",
     "LabelSelectViewStyles": "Activer les pr\u00e9sentations am\u00e9lior\u00e9es pour :",
     "LabelSelectViewStylesHelp": "Si vous activez cette option, l'affichage utilisera les m\u00e9tadonn\u00e9es pour ajouter des cat\u00e9gories telles que Suggestions, Derni\u00e8res, Genres, ... Si vous d\u00e9sactivez cette option, l'affichage sera simplement bas\u00e9 sur les dossiers.",
@@ -1438,5 +1431,6 @@
     "OptionReportGrouping": "Groupement",
     "HeaderExport": "Exporter",
     "HeaderColumns": "Colonnes",
-    "ButtonReset": "R\u00e9initialiser"
+    "ButtonReset": "R\u00e9initialiser",
+    "OptionEnableExternalVideoPlayers": "Enable external video players"
 }

+ 3 - 9
MediaBrowser.Server.Implementations/Localization/Server/he.json

@@ -1228,6 +1228,7 @@
     "OptionNoThemeVideo": "No Theme Video",
     "LabelOneTimeDonationAmount": "Donation amount:",
     "ButtonDonate": "Donate",
+    "ButtonPurchase": "Purchase",
     "OptionActor": "Actor",
     "OptionComposer": "Composer",
     "OptionDirector": "Director",
@@ -1247,7 +1248,6 @@
     "HeaderDeveloperInfo": "Developer Info",
     "HeaderRevisionHistory": "Revision History",
     "ButtonViewWebsite": "View website",
-    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
     "HeaderXmlSettings": "Xml Settings",
     "HeaderXmlDocumentAttributes": "Xml Document Attributes",
     "HeaderXmlDocumentAttribute": "Xml Document Attribute",
@@ -1409,13 +1409,6 @@
     "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.",
     "HeaderPlaylists": "Playlists",
     "HeaderSelectDate": "Select Date",
-    "HeaderWelcomeExclamation": "Welcome!",
-    "HeaderMyPreferences": "My Preferences",
-    "ButtonMyPreferencesWelcomeYes": "Yes, I'd like to set my preferences now.",
-    "ButtonMyPreferencesWelcomeNo": "No thanks, I'll do it later.",
-    "MyPreferencesWelcomeMessage1": "We've presented your library in a way we think you'll enjoy. The appearance and grouping of content can be changed anytime by adjusting your preferences. Your preferences will apply to all Emby apps.",
-    "MyPreferencesWelcomeMessage2": "Would you like to set your preferences now?",
-    "ToAccessPreferencesHelp": "To access your preferences later, click your user icon in the top right header and select My Preferences.",
     "HeaderViewStyles": "View Styles",
     "LabelSelectViewStyles": "Enable enhanced presentations for:",
     "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.",
@@ -1438,5 +1431,6 @@
     "OptionReportGrouping": "Grouping",
     "HeaderExport": "Export",
     "HeaderColumns": "Columns",
-    "ButtonReset": "Reset"
+    "ButtonReset": "Reset",
+    "OptionEnableExternalVideoPlayers": "Enable external video players"
 }

+ 3 - 9
MediaBrowser.Server.Implementations/Localization/Server/hr.json

@@ -1228,6 +1228,7 @@
     "OptionNoThemeVideo": "No Theme Video",
     "LabelOneTimeDonationAmount": "Donation amount:",
     "ButtonDonate": "Donate",
+    "ButtonPurchase": "Purchase",
     "OptionActor": "Actor",
     "OptionComposer": "Composer",
     "OptionDirector": "Director",
@@ -1247,7 +1248,6 @@
     "HeaderDeveloperInfo": "Developer Info",
     "HeaderRevisionHistory": "Revision History",
     "ButtonViewWebsite": "View website",
-    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
     "HeaderXmlSettings": "Xml Settings",
     "HeaderXmlDocumentAttributes": "Xml Document Attributes",
     "HeaderXmlDocumentAttribute": "Xml Document Attribute",
@@ -1409,13 +1409,6 @@
     "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.",
     "HeaderPlaylists": "Playlists",
     "HeaderSelectDate": "Select Date",
-    "HeaderWelcomeExclamation": "Welcome!",
-    "HeaderMyPreferences": "My Preferences",
-    "ButtonMyPreferencesWelcomeYes": "Yes, I'd like to set my preferences now.",
-    "ButtonMyPreferencesWelcomeNo": "No thanks, I'll do it later.",
-    "MyPreferencesWelcomeMessage1": "We've presented your library in a way we think you'll enjoy. The appearance and grouping of content can be changed anytime by adjusting your preferences. Your preferences will apply to all Emby apps.",
-    "MyPreferencesWelcomeMessage2": "Would you like to set your preferences now?",
-    "ToAccessPreferencesHelp": "To access your preferences later, click your user icon in the top right header and select My Preferences.",
     "HeaderViewStyles": "View Styles",
     "LabelSelectViewStyles": "Enable enhanced presentations for:",
     "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.",
@@ -1438,5 +1431,6 @@
     "OptionReportGrouping": "Grouping",
     "HeaderExport": "Export",
     "HeaderColumns": "Columns",
-    "ButtonReset": "Reset"
+    "ButtonReset": "Reset",
+    "OptionEnableExternalVideoPlayers": "Enable external video players"
 }

+ 3 - 9
MediaBrowser.Server.Implementations/Localization/Server/it.json

@@ -1228,6 +1228,7 @@
     "OptionNoThemeVideo": "No tema video",
     "LabelOneTimeDonationAmount": "Importo della donazione:",
     "ButtonDonate": "Donazione",
+    "ButtonPurchase": "Purchase",
     "OptionActor": "Attore",
     "OptionComposer": "Compositore",
     "OptionDirector": "Regista",
@@ -1247,7 +1248,6 @@
     "HeaderDeveloperInfo": "Info sviluppatore",
     "HeaderRevisionHistory": "Cronologia delle revisioni",
     "ButtonViewWebsite": "Visualizza sito web",
-    "LabelRecurringDonationCanBeCancelledHelp": "Donazioni ricorrenti possono essere cancellati in qualsiasi momento dal tuo conto PayPal.",
     "HeaderXmlSettings": "Impostazioni Xml",
     "HeaderXmlDocumentAttributes": "Attributi Documento Xml",
     "HeaderXmlDocumentAttribute": "Attributo Documento Xml",
@@ -1409,13 +1409,6 @@
     "OptionEnableFullSpeedConversionHelp": "Per default, la sincronizzazione viene eseguita a bassa velocit\u00e0 per minimizzare il consumo di risorse",
     "HeaderPlaylists": "Playlist",
     "HeaderSelectDate": "Seleziona la data",
-    "HeaderWelcomeExclamation": "Benvenuto!",
-    "HeaderMyPreferences": "Le miei preferenze",
-    "ButtonMyPreferencesWelcomeYes": "Grazie, preferisco impostare le mie preferenze adesso",
-    "ButtonMyPreferencesWelcomeNo": "No grazie, provveder\u00f2 in seguito.",
-    "MyPreferencesWelcomeMessage1": "Abbiamo presentato la tua libreria in un modo in cui pensiamo ti possa piacere. L'aspetto e il raggruppamento dei contenuti possono essere cambiati in qualsiasi momento modificando le preferenze. Le preferenze si applicano a tutte le app Emby.",
-    "MyPreferencesWelcomeMessage2": "Desideri impostare le tue preferenze ora?",
-    "ToAccessPreferencesHelp": "Per accedere alle preferenze in un secondo tempo, fare clic sull'icona utente presente in alto a destra e seleziona Le Mie Preferenze.",
     "HeaderViewStyles": "Stili Viste",
     "LabelSelectViewStyles": "Enable enhanced presentations for:",
     "LabelSelectViewStylesHelp": "Se abilitato, le viste verranno create con i metadati per offrire categorie come Suggeriti, Recenti, Generi e altro. Se disabilitato, verranno mostrate come semplici cartelle.",
@@ -1438,5 +1431,6 @@
     "OptionReportGrouping": "Grouping",
     "HeaderExport": "Export",
     "HeaderColumns": "Columns",
-    "ButtonReset": "Reset"
+    "ButtonReset": "Reset",
+    "OptionEnableExternalVideoPlayers": "Enable external video players"
 }

+ 3 - 9
MediaBrowser.Server.Implementations/Localization/Server/kk.json

@@ -1228,6 +1228,7 @@
     "OptionNoThemeVideo": "\u0422\u0430\u049b\u044b\u0440\u044b\u043f\u0442\u044b\u049b \u0431\u0435\u0439\u043d\u0435\u0441\u0456\u0437",
     "LabelOneTimeDonationAmount": "\u049a\u0430\u0439\u044b\u0440\u043c\u0430\u043b\u0434\u044b\u049b \u049b\u043e\u0440\u044b\u0442\u044b\u043d\u0434\u044b\u0441\u044b:",
     "ButtonDonate": "\u049a\u0430\u0439\u044b\u0440\u043c\u0430\u043b\u0430\u0443",
+    "ButtonPurchase": "\u0421\u0430\u0442\u044b\u043f \u0430\u043b\u0443",
     "OptionActor": "\u0410\u043a\u0442\u0435\u0440",
     "OptionComposer": "\u041a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043e\u0440",
     "OptionDirector": "\u0420\u0435\u0436\u0438\u0441\u0441\u0435\u0440",
@@ -1247,7 +1248,6 @@
     "HeaderDeveloperInfo": "\u0416\u0430\u0441\u0430\u049b\u0442\u0430\u0443\u0448\u044b\u043b\u0430\u0440 \u0442\u0443\u0440\u0430\u043b\u044b",
     "HeaderRevisionHistory": "\u04e8\u0437\u0433\u0435\u0440\u0456\u0441\u0442\u0435\u0440 \u0442\u0430\u0440\u0438\u0445\u044b",
     "ButtonViewWebsite": "\u0421\u0430\u0439\u0442\u044b\u043d\u0430",
-    "LabelRecurringDonationCanBeCancelledHelp": "\u049a\u0430\u0439\u0442\u0430\u043b\u0430\u043c\u0430 \u049b\u0430\u0439\u044b\u0440\u043c\u0430\u043b\u0434\u044b\u049b\u0442\u0430\u0440 PayPal \u0435\u0441\u0435\u043f \u0448\u043e\u0442\u044b \u0430\u0440\u049b\u044b\u043b\u044b \u04d9\u0440 \u0443\u0430\u049b\u044b\u0442\u0442\u0430 \u0434\u0430 \u0431\u043e\u043b\u0434\u044b\u0440\u044b\u043b\u043c\u0430\u0443\u044b \u043c\u04af\u043c\u043a\u0456\u043d.",
     "HeaderXmlSettings": "XML \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0456",
     "HeaderXmlDocumentAttributes": "XML-\u049b\u04b1\u0436\u0430\u0442 \u0442\u04e9\u043b\u0441\u0438\u043f\u0430\u0442\u0442\u0430\u0440\u044b",
     "HeaderXmlDocumentAttribute": "XML-\u049b\u04b1\u0436\u0430\u0442 \u0442\u04e9\u043b\u0441\u0438\u043f\u0430\u0442\u044b",
@@ -1409,13 +1409,6 @@
     "OptionEnableFullSpeedConversionHelp": "\u0420\u0435\u0441\u0443\u0440\u0441\u0442\u0430\u0440 \u0442\u04b1\u0442\u044b\u043d\u0443\u0434\u044b \u0431\u0430\u0440\u044b\u043d\u0448\u0430 \u0430\u0437\u0430\u0439\u0442\u0443 \u04af\u0448\u0456\u043d \u04af\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443\u043b\u0456\u043a \u0442\u04af\u0440\u043b\u0435\u043d\u0434\u0456\u0440\u0443 \u04d9\u0434\u0435\u043f\u043a\u0456\u0434\u0435 \u0442\u04e9\u043c\u0435\u043d \u0436\u044b\u043b\u0434\u0430\u043c\u0434\u044b\u049b\u043f\u0435\u043d \u043e\u0440\u044b\u043d\u0434\u0430\u043b\u0430\u0434\u044b.",
     "HeaderPlaylists": "\u041e\u0439\u043d\u0430\u0442\u0443 \u0442\u0456\u0437\u0456\u043c\u0434\u0435\u0440",
     "HeaderSelectDate": "\u041a\u04af\u043d\u0434\u0456 \u0442\u0430\u04a3\u0434\u0430\u0443",
-    "HeaderWelcomeExclamation": "\u049a\u043e\u0448 \u043a\u0435\u043b\u0434\u0456\u04a3\u0456\u0437!",
-    "HeaderMyPreferences": "\u041c\u0435\u043d\u0456\u04a3 \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0434\u0435\u0440\u0456\u043c",
-    "ButtonMyPreferencesWelcomeYes": "\u0418\u04d9, \u043c\u0435\u043d \u0435\u043d\u0434\u0456 \u043c\u0435\u043d\u0456\u04a3 \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0434\u0435\u0440\u0456\u043c\u0434\u0456 \u043e\u0440\u043d\u0430\u0442\u0443\u044b\u043d \u049b\u0430\u043b\u0430\u0439\u043c\u044b\u043d.",
-    "ButtonMyPreferencesWelcomeNo": "\u0416\u043e\u049b, \u0440\u0430\u0445\u043c\u0435\u0442, \u043c\u0435\u043d \u043e\u043d\u044b \u043a\u0435\u0439\u0456\u043d\u0456\u0440\u0435\u043a \u0456\u0441\u0442\u0435\u0439\u043c\u0456\u043d.",
-    "MyPreferencesWelcomeMessage1": "\u0421\u0456\u0437 \u049b\u0430\u043b\u0430\u0439 \u0442\u0430\u043c\u0430\u0448\u0430\u043b\u0430\u0439\u0442\u044b\u043d\u044b\u043d \u043e\u0439\u043b\u0430\u0441\u0442\u044b\u0440\u044b\u043f \u0441\u0456\u0437\u0434\u0456\u04a3 \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430\u04a3\u044b\u0437\u0434\u044b \u043a\u04e9\u0440\u0441\u0435\u0442\u0442\u0456\u043c\u0456\u0437. \u0422\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0434\u0435\u0440\u0456\u04a3\u0456\u0437\u0434\u0456 \u0440\u0435\u0442\u0442\u0435\u0443 \u0430\u0440\u049b\u044b\u043b\u044b \u043c\u0430\u0437\u043c\u04b1\u043d \u0431\u0435\u0437\u0435\u043d\u0434\u0456\u0440\u0443\u0456 \u043c\u0435\u043d \u0442\u043e\u043f\u0442\u0430\u0441\u0442\u044b\u0440\u0443\u044b \u043a\u0435\u0437 \u043a\u0435\u043b\u0433\u0435\u043d \u0443\u0430\u049b\u044b\u0442\u0442\u0430 \u04e9\u0437\u0433\u0435\u0440\u0442\u0456\u043b\u0443\u0456 \u043c\u04af\u043c\u043a\u0456\u043d. \u0421\u0456\u0437\u0434\u0456\u04a3 \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0434\u0435\u0440\u0456\u04a3\u0456\u0437 \u0431\u0430\u0440\u043b\u044b\u049b Emby \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u043b\u0430\u0440\u044b\u043d\u0434\u0430 \u049b\u043e\u043b\u0434\u0430\u043d\u044b\u043b\u0430\u0434\u044b.",
-    "MyPreferencesWelcomeMessage2": "\u0421\u0456\u0437 \u0435\u043d\u0434\u0456 \u04e9\u0437 \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0434\u0435\u0440\u0456\u043d\u0456\u0437\u0434\u0456 \u043e\u0440\u043d\u0430\u0442\u0443\u044b\u043d \u049b\u0430\u043b\u0430\u0439\u0441\u044b\u0437 \u0431\u0430?",
-    "ToAccessPreferencesHelp": "\u0422\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0434\u0435\u0440\u0456\u04a3\u0456\u0437\u0433\u0435 \u043a\u0435\u0439\u0456\u043d\u0456\u0440\u0435\u043a \u049b\u0430\u0442\u044b\u043d\u0430\u0443 \u04af\u0448\u0456\u043d, \u04af\u0441\u0442\u0456\u04a3\u0433\u0456 \u0434\u0435\u0440\u0435\u043a\u0442\u0435\u043c\u0435\u0441\u0456 \u043e\u04a3 \u0436\u0430\u0493\u044b\u043d\u0434\u0430\u0493\u044b \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b \u0431\u0435\u043b\u0433\u0456\u0448\u0435\u0441\u0456\u043d \u0431\u0430\u0441\u044b\u04a3\u044b\u0437 \u0436\u04d9\u043d\u0435 \u041c\u0435\u043d\u0456\u04a3 \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0434\u0435\u0440\u0456\u043c\u0434\u0456 \u0442\u0430\u04a3\u0434\u0430\u04a3\u044b\u0437.",
     "HeaderViewStyles": "\u0410\u0441\u043f\u0435\u043a\u0442 \u043c\u04d9\u043d\u0435\u0440\u043b\u0435\u0440\u0456",
     "LabelSelectViewStyles": "\u041c\u044b\u043d\u0430\u0443 \u04af\u0448\u0456\u043d \u0436\u0430\u049b\u0441\u0430\u0440\u0442\u044b\u043b\u0493\u0430\u043d \u0431\u0435\u0439\u043d\u0435\u043b\u0456\u043c\u0434\u0435\u0440\u0456\u043d \u049b\u043e\u0441\u0443:",
     "LabelSelectViewStylesHelp": "\u049a\u043e\u0441\u044b\u043b\u0441\u0430, \u043c\u04b1\u043d\u0434\u0430\u0439 \u04b0\u0441\u044b\u043d\u044b\u0441\u0442\u0430\u0440, \u0415\u04a3 \u043a\u0435\u0439\u0456\u043d\u0433\u0456, \u0416\u0430\u043d\u0440\u043b\u0430\u0440\u0434\u044b \u0436\u04d9\u043d\u0435 \u0431\u0430\u0441\u049b\u0430 \u0434\u0430 \u0441\u0430\u043d\u0430\u0442\u0442\u0430\u0440\u044b\u043d \u04b1\u0441\u044b\u043d\u0443 \u04af\u0448\u0456\u043d \u0430\u0441\u043f\u0435\u043a\u0442\u0442\u0435\u0440 \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u0430\u0440\u049b\u044b\u043b\u044b \u049b\u04b1\u0440\u044b\u043b\u0430\u0434\u044b. \u0410\u0436\u044b\u0440\u0430\u0442\u044b\u043b\u0441\u0430, \u043e\u043b\u0430\u0440 \u049b\u0430\u0440\u0430\u043f\u0430\u0439\u044b\u043c \u049b\u0430\u043b\u0442\u0430\u043b\u0430\u0440 \u0430\u0440\u049b\u044b\u043b\u044b \u043a\u04e9\u0440\u0441\u0435\u0442\u0456\u043b\u0435\u0434\u0456.",
@@ -1438,5 +1431,6 @@
     "OptionReportGrouping": "\u0422\u043e\u043f\u0442\u0430\u0443",
     "HeaderExport": "\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0442\u0430\u0443",
     "HeaderColumns": "\u0411\u0430\u0493\u0430\u043d\u0434\u0430\u0440",
-    "ButtonReset": "\u042b\u0441\u044b\u0440\u0443"
+    "ButtonReset": "\u042b\u0441\u044b\u0440\u0443",
+    "OptionEnableExternalVideoPlayers": "\u0421\u044b\u0440\u0442\u049b\u044b \u043e\u0439\u043d\u0430\u0442\u049b\u044b\u0448\u0442\u0430\u0440\u0434\u044b \u049b\u043e\u0441\u0443"
 }

+ 3 - 9
MediaBrowser.Server.Implementations/Localization/Server/ko.json

@@ -1228,6 +1228,7 @@
     "OptionNoThemeVideo": "No Theme Video",
     "LabelOneTimeDonationAmount": "Donation amount:",
     "ButtonDonate": "Donate",
+    "ButtonPurchase": "Purchase",
     "OptionActor": "Actor",
     "OptionComposer": "Composer",
     "OptionDirector": "Director",
@@ -1247,7 +1248,6 @@
     "HeaderDeveloperInfo": "Developer Info",
     "HeaderRevisionHistory": "Revision History",
     "ButtonViewWebsite": "View website",
-    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
     "HeaderXmlSettings": "Xml Settings",
     "HeaderXmlDocumentAttributes": "Xml Document Attributes",
     "HeaderXmlDocumentAttribute": "Xml Document Attribute",
@@ -1409,13 +1409,6 @@
     "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.",
     "HeaderPlaylists": "Playlists",
     "HeaderSelectDate": "Select Date",
-    "HeaderWelcomeExclamation": "Welcome!",
-    "HeaderMyPreferences": "My Preferences",
-    "ButtonMyPreferencesWelcomeYes": "Yes, I'd like to set my preferences now.",
-    "ButtonMyPreferencesWelcomeNo": "No thanks, I'll do it later.",
-    "MyPreferencesWelcomeMessage1": "We've presented your library in a way we think you'll enjoy. The appearance and grouping of content can be changed anytime by adjusting your preferences. Your preferences will apply to all Emby apps.",
-    "MyPreferencesWelcomeMessage2": "Would you like to set your preferences now?",
-    "ToAccessPreferencesHelp": "To access your preferences later, click your user icon in the top right header and select My Preferences.",
     "HeaderViewStyles": "View Styles",
     "LabelSelectViewStyles": "Enable enhanced presentations for:",
     "LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.",
@@ -1438,5 +1431,6 @@
     "OptionReportGrouping": "Grouping",
     "HeaderExport": "Export",
     "HeaderColumns": "Columns",
-    "ButtonReset": "Reset"
+    "ButtonReset": "Reset",
+    "OptionEnableExternalVideoPlayers": "Enable external video players"
 }

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác